@seanhogg/builderforce-webcontainers 2026.10.1 → 2026.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +11 -0
  2. package/dist/assets.d.ts +6 -0
  3. package/dist/assets.js +6 -0
  4. package/dist/check/cachedFetch.d.ts +3 -0
  5. package/dist/check/cachedFetch.d.ts.map +1 -0
  6. package/dist/check/cachedFetch.js +39 -0
  7. package/dist/check/cachedFetch.js.map +1 -0
  8. package/dist/check/index.d.ts +41 -0
  9. package/dist/check/index.d.ts.map +1 -0
  10. package/dist/check/index.js +74 -0
  11. package/dist/check/index.js.map +1 -0
  12. package/dist/check/protocol.d.ts +29 -0
  13. package/dist/check/protocol.d.ts.map +1 -0
  14. package/dist/check/protocol.js +13 -0
  15. package/dist/check/protocol.js.map +1 -0
  16. package/dist/check/worker.js +20 -0
  17. package/dist/componentCompilers.d.ts +21 -0
  18. package/dist/componentCompilers.d.ts.map +1 -0
  19. package/dist/componentCompilers.js +35 -0
  20. package/dist/componentCompilers.js.map +1 -0
  21. package/dist/esbuildWasm.d.ts +10 -4
  22. package/dist/esbuildWasm.d.ts.map +1 -1
  23. package/dist/esbuildWasm.js +14 -6
  24. package/dist/esbuildWasm.js.map +1 -1
  25. package/dist/host.d.ts +61 -6
  26. package/dist/host.d.ts.map +1 -1
  27. package/dist/host.js +61 -42
  28. package/dist/host.js.map +1 -1
  29. package/dist/index.d.ts +10 -4
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +5 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/node/index.d.ts +42 -0
  34. package/dist/node/index.d.ts.map +1 -0
  35. package/dist/node/index.js +45 -0
  36. package/dist/node/index.js.map +1 -0
  37. package/dist/node/processHost.d.ts +65 -0
  38. package/dist/node/processHost.d.ts.map +1 -0
  39. package/dist/node/processHost.js +269 -0
  40. package/dist/node/processHost.js.map +1 -0
  41. package/dist/node/protocol.d.ts +139 -0
  42. package/dist/node/protocol.d.ts.map +1 -0
  43. package/dist/node/protocol.js +5 -0
  44. package/dist/node/protocol.js.map +1 -0
  45. package/dist/node/worker.js +197 -0
  46. package/dist/node/workerProcess.d.ts +22 -0
  47. package/dist/node/workerProcess.d.ts.map +1 -0
  48. package/dist/node/workerProcess.js +210 -0
  49. package/dist/node/workerProcess.js.map +1 -0
  50. package/dist/packageCache.d.ts +12 -0
  51. package/dist/packageCache.d.ts.map +1 -0
  52. package/dist/packageCache.js +28 -0
  53. package/dist/packageCache.js.map +1 -0
  54. package/dist/process-worker.js +197 -0
  55. package/dist/protocol.d.ts +27 -0
  56. package/dist/protocol.d.ts.map +1 -1
  57. package/dist/protocol.js +25 -0
  58. package/dist/protocol.js.map +1 -1
  59. package/dist/relay.html +2 -0
  60. package/dist/relayWorker.d.ts +19 -0
  61. package/dist/relayWorker.d.ts.map +1 -0
  62. package/dist/relayWorker.js +39 -0
  63. package/dist/relayWorker.js.map +1 -0
  64. package/dist/sw.js +1 -1
  65. package/dist/swRouter.d.ts +9 -1
  66. package/dist/swRouter.d.ts.map +1 -1
  67. package/dist/swRouter.js +29 -5
  68. package/dist/swRouter.js.map +1 -1
  69. package/dist/transport.d.ts +23 -0
  70. package/dist/transport.d.ts.map +1 -0
  71. package/dist/transport.js +112 -0
  72. package/dist/transport.js.map +1 -0
  73. package/dist/worker.d.ts +5 -0
  74. package/dist/worker.d.ts.map +1 -0
  75. package/dist/worker.js +29 -0
  76. package/dist/worker.js.map +1 -0
  77. package/package.json +17 -3
  78. package/src/check/cachedFetch.ts +47 -0
  79. package/src/check/index.ts +98 -0
  80. package/src/check/protocol.ts +34 -0
  81. package/src/check/worker.ts +49 -0
  82. package/src/componentCompilers.ts +66 -0
  83. package/src/esbuildWasm.ts +19 -7
  84. package/src/host.ts +125 -42
  85. package/src/index.ts +18 -4
  86. package/src/node/index.ts +69 -0
  87. package/src/node/processHost.ts +307 -0
  88. package/src/node/protocol.ts +63 -0
  89. package/src/node/worker.ts +46 -0
  90. package/src/node/workerProcess.ts +219 -0
  91. package/src/packageCache.ts +28 -0
  92. package/src/protocol.ts +33 -0
  93. package/src/relay.ts +44 -0
  94. package/src/relayWorker.ts +53 -0
  95. package/src/sw.ts +25 -6
  96. package/src/swRouter.ts +36 -5
  97. package/src/transport.ts +141 -0
  98. package/src/worker.ts +25 -0
package/dist/host.js CHANGED
@@ -1,25 +1,15 @@
1
- import { DevServer, ERROR_MESSAGE_TYPE, VirtualFileSystem, } from '@seanhogg/builderforce-webcontainers-core';
2
- import { ATTACH, REATTACH, isWireRequest, previewBase } from './protocol.js';
3
- import { createEsbuildWasmTransformer } from './esbuildWasm.js';
4
- function waitForActive(registration) {
5
- if (registration.active)
6
- return Promise.resolve(registration.active);
7
- const installing = registration.installing ?? registration.waiting;
8
- if (!installing)
9
- return Promise.reject(new Error('The preview service worker did not install.'));
10
- return new Promise((resolve, reject) => {
11
- installing.addEventListener('statechange', () => {
12
- if (installing.state === 'activated' && registration.active)
13
- resolve(registration.active);
14
- if (installing.state === 'redundant')
15
- reject(new Error('The preview service worker failed to install.'));
16
- });
17
- });
18
- }
1
+ import { DevServer, ERROR_MESSAGE_TYPE, VirtualFileSystem, buildProject, } from '@seanhogg/builderforce-webcontainers-core';
2
+ import { PREVIEW_ID, isPortPath, isWireRequest, previewBase } from './protocol.js';
3
+ import { createProcessHost, servePortRequest } from './node/index.js';
4
+ import { relayTransport, sameOriginTransport } from './transport.js';
5
+ import { createEsbuildWasmBundler, createEsbuildWasmTransformer } from './esbuildWasm.js';
6
+ import { createCdnComponentCompilers } from './componentCompilers.js';
7
+ /** Edits arrive in bursts (a save, an agent writing several files): reload once per burst. */
8
+ const RELOAD_DEBOUNCE_MS = 120;
19
9
  function randomId() {
20
10
  return globalThis.crypto?.randomUUID?.().replace(/-/g, '').slice(0, 16) ?? Math.random().toString(36).slice(2, 18);
21
11
  }
22
- function toWire(reqId, served) {
12
+ export function toWire(reqId, served) {
23
13
  if (typeof served.body === 'string') {
24
14
  return { message: { type: 'response', reqId, status: served.status, headers: served.headers, body: served.body }, transfer: [] };
25
15
  }
@@ -31,43 +21,62 @@ function toWire(reqId, served) {
31
21
  * it, and a service worker that routes the preview iframe's requests back here.
32
22
  *
33
23
  * Needs a secure context (https or localhost) for the service worker — and
34
- * nothing else: no cross-origin isolation headers, no SharedArrayBuffer.
24
+ * nothing else: no cross-origin isolation headers, no SharedArrayBuffer. Pass
25
+ * `relayUrl` to serve the preview from its own origin (see `RelayOptions`).
35
26
  */
36
27
  export async function bootPreviewRuntime(options) {
37
- const container = navigator.serviceWorker;
38
- if (!container)
39
- throw new Error('Service workers are unavailable here (a secure context — https or localhost — is required).');
40
- const scriptUrl = new URL(options.serviceWorkerUrl, location.href);
41
- const scope = new URL(options.scope ?? './', scriptUrl).pathname;
42
- const registration = await container.register(scriptUrl.href, { scope });
43
- await waitForActive(registration);
44
28
  const id = options.id ?? randomId();
45
- const base = previewBase(scope, id);
29
+ if (!PREVIEW_ID.test(id))
30
+ throw new Error(`Preview id "${id}" may only contain letters, digits, "_" and "-".`);
31
+ const transport = options.relayUrl
32
+ ? await relayTransport(options.relayUrl)
33
+ : await sameOriginTransport(options.serviceWorkerUrl, options.scope);
34
+ const base = previewBase(transport.scope, id);
46
35
  const fs = new VirtualFileSystem();
47
- const transformer = options.transformer ?? (await createEsbuildWasmTransformer());
48
- const server = new DevServer({ fs, transformer, base, cdn: options.cdn, attribution: options.attribution });
49
- const attach = (worker) => {
36
+ const components = options.components ?? createCdnComponentCompilers();
37
+ let server;
38
+ try {
39
+ const transformer = options.transformer ?? (await createEsbuildWasmTransformer());
40
+ server = new DevServer({ fs, transformer, base, cdn: options.cdn, components, attribution: options.attribution });
41
+ }
42
+ catch (error) {
43
+ transport.dispose();
44
+ throw error;
45
+ }
46
+ const previewUrl = new URL(base, transport.origin).href;
47
+ // In relay mode processes run on the preview origin (the relay starts them), never the host's.
48
+ const node = { ...options.node, createWorker: options.node?.createWorker ?? transport.createWorker?.bind(transport) };
49
+ const processes = createProcessHost({ fs, base, origin: transport.origin, previewUrl, options: node });
50
+ const answer = async (request) => isPortPath(request.path) ? servePortRequest(processes, request) : toWire(request.reqId, await server.handle(request.path, request.search));
51
+ const attach = () => {
50
52
  const channel = new MessageChannel();
51
53
  channel.port1.onmessage = async (event) => {
52
54
  if (!isWireRequest(event.data))
53
55
  return;
54
- const { message, transfer } = toWire(event.data.reqId, await server.handle(event.data.path, event.data.search));
56
+ const { message, transfer } = await answer(event.data);
55
57
  channel.port1.postMessage(message, transfer);
56
58
  };
57
- worker.postMessage({ type: ATTACH, id }, [channel.port2]);
59
+ transport.attach(id, channel.port2);
58
60
  };
59
- attach(registration.active);
60
- const onWorkerMessage = (event) => {
61
- if (event.data?.type === REATTACH && event.data.id === id && registration.active)
62
- attach(registration.active);
63
- };
64
- container.addEventListener('message', onWorkerMessage);
61
+ attach();
62
+ const stopReattach = transport.onReattach((wanted) => {
63
+ if (wanted === id)
64
+ attach();
65
+ });
66
+ // Live reload: any change to the files reloads every frame showing this preview.
67
+ let reloadTimer;
68
+ const stopWatching = options.liveReload === false
69
+ ? undefined
70
+ : fs.watch(() => {
71
+ clearTimeout(reloadTimer);
72
+ reloadTimer = setTimeout(() => transport.reload(base), RELOAD_DEBOUNCE_MS);
73
+ });
65
74
  const errorListeners = new Set();
66
75
  const onWindowMessage = (event) => {
67
76
  const data = event.data;
68
77
  if (data?.type !== ERROR_MESSAGE_TYPE || typeof data.href !== 'string')
69
78
  return;
70
- if (!new URL(data.href).pathname.startsWith(base))
79
+ if (event.origin !== transport.origin || !new URL(data.href).pathname.startsWith(base))
71
80
  return; // another runtime's preview
72
81
  const error = { message: String(data.message ?? ''), stack: data.stack, href: data.href };
73
82
  for (const listener of errorListeners)
@@ -76,19 +85,29 @@ export async function bootPreviewRuntime(options) {
76
85
  window.addEventListener('message', onWindowMessage);
77
86
  return {
78
87
  id,
79
- url: new URL(base, location.origin).href,
88
+ url: previewUrl,
80
89
  fs,
81
90
  server,
82
91
  mount: (files) => fs.mount(files),
83
92
  profile: () => server.profile(),
93
+ async build(buildOptions = {}) {
94
+ const bundler = options.bundler ?? (await createEsbuildWasmBundler());
95
+ return buildProject({ files: fs, bundler, cdn: options.cdn, components, base: buildOptions.base, minify: buildOptions.minify });
96
+ },
84
97
  onError(listener) {
85
98
  errorListeners.add(listener);
86
99
  return () => errorListeners.delete(listener);
87
100
  },
101
+ spawn: (command, args, spawnOptions) => processes.spawn(command, args, spawnOptions),
102
+ on: ((event, listener) => processes.on(event, listener)),
88
103
  dispose() {
89
- container.removeEventListener('message', onWorkerMessage);
104
+ processes.dispose();
90
105
  window.removeEventListener('message', onWindowMessage);
91
106
  errorListeners.clear();
107
+ clearTimeout(reloadTimer);
108
+ stopWatching?.();
109
+ stopReattach();
110
+ transport.dispose();
92
111
  server.dispose();
93
112
  },
94
113
  };
package/dist/host.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,15 @@
1
1
  export { bootPreviewRuntime } from './host.js';
2
- export type { BootOptions, PreviewRuntime, PreviewError } from './host.js';
3
- export { createEsbuildWasmTransformer } from './esbuildWasm.js';
2
+ export type { BootOptions, SameOriginOptions, RelayOptions, CommonBootOptions, PreviewRuntime, PreviewError, RuntimeBuildOptions, } from './host.js';
3
+ export type { PreviewTransport } from './transport.js';
4
+ export { createEsbuildWasmTransformer, createEsbuildWasmBundler, loadEsbuildWasm } from './esbuildWasm.js';
4
5
  export type { EsbuildWasmOptions } from './esbuildWasm.js';
6
+ export { createCdnComponentCompilers, defaultVueCompilerUrl, defaultSvelteCompilerUrl } from './componentCompilers.js';
7
+ export type { CdnComponentCompilerOptions } from './componentCompilers.js';
8
+ export { createCacheStoragePackageCache } from './packageCache.js';
9
+ export { ProcessHost, createWorkerProcess } from './node/index.js';
10
+ export type { NodeRuntimeOptions, ProcessHostOptions, WorkerLike } from './node/index.js';
5
11
  export { createSwRouter } from './swRouter.js';
6
- export type { SwRouter, SwRouterOptions, PortLike, PreviewTarget, RoutedResponse } from './swRouter.js';
7
- export { previewBase, previewPrefix, PREVIEW_SEGMENT } from './protocol.js';
12
+ export type { SwRouter, SwRouterOptions, PortLike, PreviewTarget, RoutedResponse, RequestDetails } from './swRouter.js';
13
+ export { previewBase, previewPrefix, PREVIEW_SEGMENT, PREVIEW_ID, PORT_SEGMENT, isPortPath } from './protocol.js';
8
14
  export * from '@seanhogg/builderforce-webcontainers-core';
9
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5E,cAAc,2CAA2C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3G,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACvH,YAAY,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACxH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClH,cAAc,2CAA2C,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  export { bootPreviewRuntime } from './host.js';
2
- export { createEsbuildWasmTransformer } from './esbuildWasm.js';
2
+ export { createEsbuildWasmTransformer, createEsbuildWasmBundler, loadEsbuildWasm } from './esbuildWasm.js';
3
+ export { createCdnComponentCompilers, defaultVueCompilerUrl, defaultSvelteCompilerUrl } from './componentCompilers.js';
4
+ export { createCacheStoragePackageCache } from './packageCache.js';
5
+ export { ProcessHost, createWorkerProcess } from './node/index.js';
3
6
  export { createSwRouter } from './swRouter.js';
4
- export { previewBase, previewPrefix, PREVIEW_SEGMENT } from './protocol.js';
7
+ export { previewBase, previewPrefix, PREVIEW_SEGMENT, PREVIEW_ID, PORT_SEGMENT, isPortPath } from './protocol.js';
5
8
  export * from '@seanhogg/builderforce-webcontainers-core';
6
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5E,cAAc,2CAA2C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAW/C,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE3G,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEvH,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClH,cAAc,2CAA2C,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Glue between the preview runtime and the Node process host: options, the
3
+ * default Worker, and answering `/__port/<n>/…` preview requests from the
4
+ * virtual server listening on that port.
5
+ */
6
+ import { type VirtualFileSystem } from '@seanhogg/builderforce-webcontainers-core';
7
+ import type { WireRequest, WireResponse } from '../protocol.js';
8
+ import { ProcessHost, type WorkerLike } from './processHost.js';
9
+ export { ProcessHost } from './processHost.js';
10
+ export type { ProcessHostOptions, WorkerLike } from './processHost.js';
11
+ export { createWorkerProcess } from './workerProcess.js';
12
+ export interface NodeRuntimeOptions {
13
+ /**
14
+ * Where this package's `dist/node/worker.js` is served. Default: resolved
15
+ * beside this module (`new URL('./worker.js', import.meta.url)`), which
16
+ * bundlers that understand `new Worker(new URL(…))` handle automatically.
17
+ */
18
+ workerUrl?: string | URL;
19
+ /** Build each process Worker yourself (CSP, a test double). Wins over `workerUrl`. */
20
+ createWorker?: () => WorkerLike;
21
+ /** npm registry. Default https://registry.npmjs.org (it sends CORS headers). */
22
+ registry?: string;
23
+ /** Cache npm tarballs in Cache Storage. Default true. */
24
+ packageCache?: boolean;
25
+ /** Extra environment for every process. */
26
+ env?: Record<string, string>;
27
+ /** Grace period before a killed process's worker is terminated. Default 2000ms. */
28
+ killGraceMs?: number;
29
+ }
30
+ export declare function createProcessHost(args: {
31
+ fs: VirtualFileSystem;
32
+ base: string;
33
+ origin: string;
34
+ previewUrl: string;
35
+ options?: NodeRuntimeOptions;
36
+ }): ProcessHost;
37
+ /** Answer a preview request addressed to a virtual server. */
38
+ export declare function servePortRequest(host: ProcessHost, request: WireRequest): Promise<{
39
+ message: WireResponse;
40
+ transfer: Transferable[];
41
+ }>;
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACzB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,UAAU,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,EAAE,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAAG,WAAW,CAgB9J;AAID,8DAA8D;AAC9D,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAe5I"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Glue between the preview runtime and the Node process host: options, the
3
+ * default Worker, and answering `/__port/<n>/…` preview requests from the
4
+ * virtual server listening on that port.
5
+ */
6
+ import { parsePortPath } from '@seanhogg/builderforce-webcontainers-core';
7
+ import { ProcessHost } from './processHost.js';
8
+ export { ProcessHost } from './processHost.js';
9
+ export { createWorkerProcess } from './workerProcess.js';
10
+ export function createProcessHost(args) {
11
+ const { options = {} } = args;
12
+ const createWorker = options.createWorker ??
13
+ (() => new Worker(options.workerUrl ?? new URL('./worker.js', import.meta.url), { name: 'bfwc-process' }));
14
+ return new ProcessHost({
15
+ fs: args.fs,
16
+ createWorker,
17
+ previewOrigin: args.origin,
18
+ previewBase: args.base,
19
+ previewUrl: args.previewUrl,
20
+ registry: options.registry,
21
+ packageCache: options.packageCache,
22
+ env: options.env,
23
+ killGraceMs: options.killGraceMs,
24
+ });
25
+ }
26
+ const TEXT = { 'content-type': 'text/plain; charset=utf-8', 'cache-control': 'no-store' };
27
+ /** Answer a preview request addressed to a virtual server. */
28
+ export async function servePortRequest(host, request) {
29
+ const target = parsePortPath(request.path);
30
+ const response = await host.request(target.port, {
31
+ method: request.method ?? 'GET',
32
+ url: target.path + request.search,
33
+ headers: request.headers ?? {},
34
+ body: request.body ? new Uint8Array(request.body) : null,
35
+ });
36
+ if (!response) {
37
+ return { message: { type: 'response', reqId: request.reqId, status: 502, headers: TEXT, body: `Nothing is listening on port ${target.port}. Start a server (node server.js) first.` }, transfer: [] };
38
+ }
39
+ const headers = {};
40
+ for (const [key, value] of Object.entries(response.headers))
41
+ headers[key] = Array.isArray(value) ? value.join(', ') : String(value);
42
+ const body = response.body.slice().buffer;
43
+ return { message: { type: 'response', reqId: request.reqId, status: response.status, headers, body }, transfer: [body] };
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAA0B,MAAM,2CAA2C,CAAC;AAElG,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAqBzD,MAAM,UAAU,iBAAiB,CAAC,IAA+G;IAC/I,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IAC9B,MAAM,YAAY,GAChB,OAAO,CAAC,YAAY;QACpB,CAAC,GAAG,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAA0B,CAAC,CAAC;IACtI,OAAO,IAAI,WAAW,CAAC;QACrB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,YAAY;QACZ,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,WAAW,EAAE,IAAI,CAAC,IAAI;QACtB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,IAAI,GAAG,EAAE,cAAc,EAAE,2BAA2B,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;AAE1F,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAiB,EAAE,OAAoB;IAC5E,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;QAC/C,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,GAAG,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM;QACjC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;KACzD,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,gCAAgC,MAAM,CAAC,IAAI,0CAA0C,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACxM,CAAC;IACD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpI,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAqB,CAAC;IACzD,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3H,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The page side of the Node runtime: one Web Worker per process. The page owns
3
+ * the master file system and the port table; each worker gets a snapshot of
4
+ * the files at start, and writes flow both ways as batched ops (a worker's
5
+ * write reaches the page, then every other worker). Children a worker spawns
6
+ * (the shell running `node`, `child_process`) are started here too, so every
7
+ * process — however deep — can be killed by terminating its worker.
8
+ */
9
+ import { PortRegistry, type ChildHandle, type HttpRequestData, type HttpResponseData, type SpawnOptions, type VirtualFileSystem, type WebContainerProcess } from '@seanhogg/builderforce-webcontainers-core';
10
+ /** The part of `Worker` the host uses — a real Worker, or an in-thread fake in tests. */
11
+ export interface WorkerLike {
12
+ postMessage(message: unknown): void;
13
+ onmessage: ((event: {
14
+ data: unknown;
15
+ }) => void) | null;
16
+ onerror?: ((event: {
17
+ message?: string;
18
+ }) => void) | null;
19
+ terminate(): void;
20
+ }
21
+ export interface ProcessHostOptions {
22
+ fs: VirtualFileSystem;
23
+ createWorker(): WorkerLike;
24
+ /** Origin and base path previews are served under (`/__bfwc/<id>/`). */
25
+ previewOrigin: string;
26
+ previewBase: string;
27
+ /** The dev server's preview URL, for the `vite`/`react-scripts start` handoff. */
28
+ previewUrl?: string;
29
+ registry?: string;
30
+ /** Cache npm tarballs in Cache Storage. Default true. */
31
+ packageCache?: boolean;
32
+ env?: Record<string, string>;
33
+ /** How long a killed process may take to exit before its worker is terminated. Default 2000ms. */
34
+ killGraceMs?: number;
35
+ }
36
+ export declare class ProcessHost {
37
+ private readonly options;
38
+ readonly ports: PortRegistry;
39
+ private readonly procs;
40
+ private readonly serverReady;
41
+ private readonly portListeners;
42
+ private applyingFrom?;
43
+ private flushScheduled;
44
+ private nextReq;
45
+ private readonly unwatch;
46
+ private readonly stopPorts;
47
+ constructor(options: ProcessHostOptions);
48
+ serverUrl(port: number): string;
49
+ /** Same shape as `WebContainer#spawn`. */
50
+ spawn(command: string, args?: string[] | SpawnOptions, options?: SpawnOptions): WebContainerProcess;
51
+ spawnChild(command: string, args?: string[], options?: SpawnOptions): ChildHandle;
52
+ /** Dispatch an HTTP request to the server on `port` (the preview service worker's `/__port/<port>/` path). */
53
+ request(port: number, request: HttpRequestData): Promise<HttpResponseData | undefined>;
54
+ on(event: 'server-ready', listener: (port: number, url: string) => void): () => void;
55
+ on(event: 'port', listener: (port: number, type: 'open' | 'close', url: string) => void): () => void;
56
+ dispose(): void;
57
+ private kill;
58
+ private cleanup;
59
+ private post;
60
+ private onFsChange;
61
+ private flushOutboxes;
62
+ private onWorkerMessage;
63
+ private forward;
64
+ }
65
+ //# sourceMappingURL=processHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processHost.d.ts","sourceRoot":"","sources":["../../src/node/processHost.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAEL,YAAY,EAGZ,KAAK,WAAW,EAEhB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,2CAA2C,CAAC;AAInD,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACvD,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACzD,SAAS,IAAI,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,iBAAiB,CAAC;IACtB,YAAY,IAAI,UAAU,CAAC;IAC3B,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,kGAAkG;IAClG,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAiBD,qBAAa,WAAW;IAWV,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,QAAQ,CAAC,KAAK,eAAsB;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkD;IAC9E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0E;IACxG,OAAO,CAAC,YAAY,CAAC,CAAO;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;gBAEV,OAAO,EAAE,kBAAkB;IAUxD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI/B,0CAA0C;IAC1C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAE,GAAG,YAAiB,EAAE,OAAO,GAAE,YAAiB,GAAG,mBAAmB;IAK3G,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW;IA2DzF,8GAA8G;IAC9G,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAItF,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IACpF,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAOpG,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,IAAI;IAgBZ,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IA6EvB,OAAO,CAAC,OAAO;CAOhB"}