Home / File/ server-worker-runner.spec.ts — vite Source File

server-worker-runner.spec.ts — vite Source File

Architecture documentation for server-worker-runner.spec.ts, a typescript file in the vite codebase. 6 imports, 0 dependents.

File typescript ViteCore ConfigEngine 6 imports 1 functions

Entity Profile

Dependency Diagram

graph LR
  8cd46fdb_679a_7d1f_531c_774b779345ea["server-worker-runner.spec.ts"]
  8377ae20_ffba_2f9c_bded_58742b7f1c3b["index.ts"]
  8cd46fdb_679a_7d1f_531c_774b779345ea --> 8377ae20_ffba_2f9c_bded_58742b7f1c3b
  a423a1ed_f7d8_0eb5_9b8f_ddfa7fa8147e["index.ts"]
  8cd46fdb_679a_7d1f_531c_774b779345ea --> a423a1ed_f7d8_0eb5_9b8f_ddfa7fa8147e
  19009191_26ac_2526_d048_41ac02638e55["createServer"]
  8cd46fdb_679a_7d1f_531c_774b779345ea --> 19009191_26ac_2526_d048_41ac02638e55
  6dfa768a_efc1_54e5_b2de_25126290d891["node:worker_threads"]
  8cd46fdb_679a_7d1f_531c_774b779345ea --> 6dfa768a_efc1_54e5_b2de_25126290d891
  a340ba46_b2b7_3048_3bb3_6907a74c8464["vitest"]
  8cd46fdb_679a_7d1f_531c_774b779345ea --> a340ba46_b2b7_3048_3bb3_6907a74c8464
  54c37fea_4fe7_2693_71cb_1276b77f55f9["vite"]
  8cd46fdb_679a_7d1f_531c_774b779345ea --> 54c37fea_4fe7_2693_71cb_1276b77f55f9
  style 8cd46fdb_679a_7d1f_531c_774b779345ea fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { BroadcastChannel, Worker } from 'node:worker_threads'
import { describe, expect, it, onTestFinished } from 'vitest'
import type { HotChannel, HotChannelListener, HotPayload } from 'vite'
import { DevEnvironment } from '../../..'
import { createServer } from '../../../server'

const createWorkerTransport = (worker: Worker): HotChannel => {
  const handlerToWorkerListener = new WeakMap<
    HotChannelListener,
    (value: HotPayload) => void
  >()
  const client = {
    send(payload: HotPayload) {
      worker.postMessage(payload)
    },
  }

  return {
    send: (data) => worker.postMessage(data),
    on: (event: string, handler: HotChannelListener) => {
      // client is already connected
      if (event === 'vite:client:connect') return
      if (event === 'vite:client:disconnect') {
        const listener = () => {
          handler(undefined, client)
        }
        handlerToWorkerListener.set(handler, listener)
        worker.on('exit', listener)
        return
      }

      const listener = (value: HotPayload) => {
        if (value.type === 'custom' && value.event === event) {
          handler(value.data, client)
        }
      }
      handlerToWorkerListener.set(handler, listener)
      worker.on('message', listener)
    },
    off: (event, handler: HotChannelListener) => {
      if (event === 'vite:client:connect') return
      if (event === 'vite:client:disconnect') {
        const listener = handlerToWorkerListener.get(handler)
        if (listener) {
          worker.off('exit', listener)
          handlerToWorkerListener.delete(handler)
        }
        return
      }

      const listener = handlerToWorkerListener.get(handler)
      if (listener) {
        worker.off('message', listener)
        handlerToWorkerListener.delete(handler)
      }
    },
  }
}

describe('running module runner inside a worker', () => {
  it('correctly runs ssr code', async () => {
    expect.assertions(1)
    const worker = new Worker(
      new URL('./fixtures/worker.mjs', import.meta.url),
      {
        stdout: true,
      },
    )
    await new Promise<void>((resolve, reject) => {
      worker.on('message', () => resolve())
      worker.on('error', reject)
    })
    const server = await createServer({
      root: import.meta.dirname,
      logLevel: 'error',
      server: {
        middlewareMode: true,
        watch: null,
        hmr: {
          port: 9609,
        },
      },
      environments: {
        worker: {
          dev: {
            createEnvironment: (name, config) => {
              return new DevEnvironment(name, config, {
                hot: false,
                transport: createWorkerTransport(worker),
              })
            },
          },
        },
      },
    })
    onTestFinished(async () => {
      await Promise.allSettled([server.close(), worker.terminate()])
    })
    const channel = new BroadcastChannel('vite-worker')
    return new Promise<void>((resolve, reject) => {
      channel.onmessage = (event) => {
        try {
          expect(event.data).toEqual({
            result: 'hello world',
          })
        } catch (e) {
          reject(e)
        } finally {
          resolve()
        }
      }
      channel.postMessage({ id: './fixtures/default-string.ts' })
    })
  })
})

Domain

Subdomains

Dependencies

Frequently Asked Questions

What does server-worker-runner.spec.ts do?
server-worker-runner.spec.ts is a source file in the vite codebase, written in typescript. It belongs to the ViteCore domain, ConfigEngine subdomain.
What functions are defined in server-worker-runner.spec.ts?
server-worker-runner.spec.ts defines 1 function(s): createWorkerTransport.
What does server-worker-runner.spec.ts depend on?
server-worker-runner.spec.ts imports 6 module(s): createServer, index.ts, index.ts, node:worker_threads, vite, vitest.
Where is server-worker-runner.spec.ts in the architecture?
server-worker-runner.spec.ts is located at packages/vite/src/node/ssr/runtime/__tests__/server-worker-runner.spec.ts (domain: ViteCore, subdomain: ConfigEngine, directory: packages/vite/src/node/ssr/runtime/__tests__).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free