@seanhogg/builderforce-webcontainers 2026.10.2 → 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 (93) hide show
  1. package/README.md +6 -1
  2. package/dist/assets.d.ts +2 -0
  3. package/dist/assets.js +4 -2
  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 +39 -3
  26. package/dist/host.d.ts.map +1 -1
  27. package/dist/host.js +22 -7
  28. package/dist/host.js.map +1 -1
  29. package/dist/index.d.ts +9 -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 +9 -0
  56. package/dist/protocol.d.ts.map +1 -1
  57. package/dist/protocol.js +7 -0
  58. package/dist/protocol.js.map +1 -1
  59. package/dist/relay.html +1 -1
  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 +26 -4
  68. package/dist/swRouter.js.map +1 -1
  69. package/dist/transport.d.ts +7 -0
  70. package/dist/transport.d.ts.map +1 -1
  71. package/dist/transport.js +7 -1
  72. package/dist/transport.js.map +1 -1
  73. package/package.json +12 -3
  74. package/src/check/cachedFetch.ts +47 -0
  75. package/src/check/index.ts +98 -0
  76. package/src/check/protocol.ts +34 -0
  77. package/src/check/worker.ts +49 -0
  78. package/src/componentCompilers.ts +66 -0
  79. package/src/esbuildWasm.ts +19 -7
  80. package/src/host.ts +64 -9
  81. package/src/index.ts +17 -4
  82. package/src/node/index.ts +69 -0
  83. package/src/node/processHost.ts +307 -0
  84. package/src/node/protocol.ts +63 -0
  85. package/src/node/worker.ts +46 -0
  86. package/src/node/workerProcess.ts +219 -0
  87. package/src/packageCache.ts +28 -0
  88. package/src/protocol.ts +13 -0
  89. package/src/relay.ts +5 -1
  90. package/src/relayWorker.ts +53 -0
  91. package/src/sw.ts +25 -6
  92. package/src/swRouter.ts +33 -4
  93. package/src/transport.ts +14 -0
@@ -0,0 +1,22 @@
1
+ /**
2
+ * The worker side of one process: mirror the file system, build a `System`
3
+ * whose spawn/listen/loopback are relayed to the page, run the program, and
4
+ * stream its output back. No worker globals in here — `post` and the message
5
+ * feed are injected — so the same code runs in a real Worker (worker.ts) and
6
+ * in-thread in tests.
7
+ */
8
+ import { type PackageCache, type System } from '@seanhogg/builderforce-webcontainers-core';
9
+ import type { HostToWorker, WorkerToHost } from './protocol.js';
10
+ export interface WorkerProcessDeps {
11
+ post(message: WorkerToHost): void;
12
+ fetch: System['fetch'];
13
+ packageCache?: () => PackageCache | undefined;
14
+ /** Register for the realm's uncaught errors (a real worker's `error`/`unhandledrejection`). */
15
+ trapUncaught?(handler: (error: unknown) => void): () => void;
16
+ /** This process has the realm to itself (true in a real Worker). */
17
+ ownsRealm?: boolean;
18
+ }
19
+ export declare function createWorkerProcess(deps: WorkerProcessDeps): {
20
+ receive(message: HostToWorker): void;
21
+ };
22
+ //# sourceMappingURL=workerProcess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerProcess.d.ts","sourceRoot":"","sources":["../../src/node/workerProcess.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAUL,KAAK,YAAY,EACjB,KAAK,MAAM,EACZ,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAQ,YAAY,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAGpF,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;IAC9C,+FAA+F;IAC/F,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC7D,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG;IAAE,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,CAuLrG"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * The worker side of one process: mirror the file system, build a `System`
3
+ * whose spawn/listen/loopback are relayed to the page, run the program, and
4
+ * stream its output back. No worker globals in here — `post` and the message
5
+ * feed are injected — so the same code runs in a real Worker (worker.ts) and
6
+ * in-thread in tests.
7
+ */
8
+ import { VirtualFileSystem, commandNotFound, defaultPrograms, resolveCommand, runProgram, } from '@seanhogg/builderforce-webcontainers-core';
9
+ import { portPath } from './protocol.js';
10
+ const EPHEMERAL = 49152;
11
+ export function createWorkerProcess(deps) {
12
+ const fs = new VirtualFileSystem();
13
+ const handlers = new Map();
14
+ const knownPorts = new Set();
15
+ const children = new Map();
16
+ const loopbacks = new Map();
17
+ let nextChild = 1;
18
+ let nextReq = 1;
19
+ let applying = false;
20
+ let pending = [];
21
+ let flushScheduled = false;
22
+ let process;
23
+ const programs = defaultPrograms();
24
+ const flush = () => {
25
+ flushScheduled = false;
26
+ if (!pending.length)
27
+ return;
28
+ const ops = pending;
29
+ pending = [];
30
+ deps.post({ type: 'fs', ops });
31
+ };
32
+ fs.watch((change) => {
33
+ if (applying)
34
+ return;
35
+ if (change.type === 'write')
36
+ pending.push({ op: 'write', path: change.path, content: fs.readFile(change.path) });
37
+ else
38
+ pending.push({ op: change.type, path: change.path });
39
+ if (!flushScheduled) {
40
+ flushScheduled = true;
41
+ queueMicrotask(flush);
42
+ }
43
+ });
44
+ const apply = (ops) => {
45
+ applying = true;
46
+ try {
47
+ for (const op of ops) {
48
+ if (op.op === 'write')
49
+ fs.writeFile(op.path, op.content);
50
+ else if (op.op === 'mkdir')
51
+ fs.mkdir(op.path);
52
+ else
53
+ fs.rm(op.path);
54
+ }
55
+ }
56
+ finally {
57
+ applying = false;
58
+ }
59
+ };
60
+ function remoteChild(command, args, options = {}) {
61
+ flush(); // the child must see every write made so far
62
+ const childId = nextChild++;
63
+ const stdout = new Set();
64
+ const stderr = new Set();
65
+ let resolveExit;
66
+ const exit = new Promise((resolve) => (resolveExit = resolve));
67
+ children.set(childId, { stdout, stderr, exit: resolveExit });
68
+ deps.post({ type: 'spawn', childId, command, args, cwd: options.cwd, env: options.env, terminal: options.terminal });
69
+ return {
70
+ pid: childId,
71
+ onStdout: (l) => (stdout.add(l), () => stdout.delete(l)),
72
+ onStderr: (l) => (stderr.add(l), () => stderr.delete(l)),
73
+ write: (data) => deps.post({ type: 'child-stdin', childId, data }),
74
+ closeStdin: () => deps.post({ type: 'child-stdin', childId, data: null }),
75
+ kill: (signal = 'SIGTERM') => deps.post({ type: 'child-kill', childId, signal }),
76
+ resize: (cols, rows) => deps.post({ type: 'child-resize', childId, cols, rows }),
77
+ exit,
78
+ };
79
+ }
80
+ function start(message) {
81
+ applying = true;
82
+ for (const dir of message.dirs)
83
+ fs.mkdir(dir);
84
+ for (const [path, content] of message.files)
85
+ fs.writeFile(path, content);
86
+ applying = false;
87
+ for (const port of message.ports)
88
+ knownPorts.add(port);
89
+ const system = {
90
+ fs,
91
+ fetch: deps.fetch,
92
+ spawn(command, args, options = {}) {
93
+ // Resolve here, against the mirror, so a missing command fails synchronously
94
+ // with ENOENT exactly as it does in-process.
95
+ const cwd = options.cwd ?? message.cwd;
96
+ const env = { ...message.env, ...options.env };
97
+ if (!resolveCommand(fs, programs, command, args, cwd, env))
98
+ throw commandNotFound(command);
99
+ return remoteChild(command, args, { ...options, cwd, env });
100
+ },
101
+ listen(port, handler) {
102
+ let actual = port;
103
+ if (!actual)
104
+ for (actual = EPHEMERAL + (message.pid % 1000) * 8; knownPorts.has(actual); actual++)
105
+ ;
106
+ if (knownPorts.has(actual))
107
+ throw Object.assign(new Error(`listen EADDRINUSE: address already in use :::${actual}`), { code: 'EADDRINUSE', errno: -98, syscall: 'listen', port: actual });
108
+ knownPorts.add(actual);
109
+ handlers.set(actual, handler);
110
+ deps.post({ type: 'listen', port: actual });
111
+ return {
112
+ port: actual,
113
+ close() {
114
+ if (handlers.get(actual) !== handler)
115
+ return;
116
+ handlers.delete(actual);
117
+ knownPorts.delete(actual);
118
+ deps.post({ type: 'unlisten', port: actual });
119
+ },
120
+ };
121
+ },
122
+ loopback(port, request) {
123
+ const local = handlers.get(port);
124
+ if (local)
125
+ return local(request);
126
+ const reqId = nextReq++;
127
+ return new Promise((resolve) => {
128
+ loopbacks.set(reqId, resolve);
129
+ deps.post({ type: 'loopback', reqId, port, request });
130
+ });
131
+ },
132
+ serverUrl: (port) => new URL(portPath(message.previewBase, port), message.previewOrigin).href,
133
+ announceServer: (port, url) => deps.post({ type: 'server-ready', port, url }),
134
+ previewUrl: message.previewUrl,
135
+ registry: message.registry,
136
+ packageCache: message.packageCache ? deps.packageCache?.() : undefined,
137
+ ownsRealm: deps.ownsRealm,
138
+ trapUncaught: deps.trapUncaught,
139
+ };
140
+ const resolved = resolveCommand(fs, programs, message.command, message.args, message.cwd, message.env);
141
+ if (!resolved) {
142
+ deps.post({ type: 'stderr', data: `jsh: command not found: ${message.command}\n` });
143
+ deps.post({ type: 'exit', code: 127 });
144
+ return;
145
+ }
146
+ process = runProgram({ program: resolved.program, args: resolved.args, system, cwd: message.cwd, env: message.env, terminal: message.terminal, pid: message.pid });
147
+ process.onStdout((data) => deps.post({ type: 'stdout', data }));
148
+ process.onStderr((data) => deps.post({ type: 'stderr', data }));
149
+ void process.exit.then((code) => {
150
+ flush();
151
+ deps.post({ type: 'exit', code });
152
+ });
153
+ }
154
+ return {
155
+ receive(message) {
156
+ switch (message.type) {
157
+ case 'start':
158
+ return start(message);
159
+ case 'stdin':
160
+ if (message.data === null)
161
+ process?.closeStdin();
162
+ else
163
+ process?.write(message.data);
164
+ return;
165
+ case 'kill':
166
+ return process?.kill(message.signal);
167
+ case 'resize':
168
+ return process?.resize?.(message.cols, message.rows);
169
+ case 'fs':
170
+ return apply(message.ops);
171
+ case 'ports':
172
+ for (const port of message.open)
173
+ knownPorts.add(port);
174
+ for (const port of message.closed)
175
+ if (!handlers.has(port))
176
+ knownPorts.delete(port);
177
+ return;
178
+ case 'child-out':
179
+ for (const l of children.get(message.childId)?.[message.stream] ?? [])
180
+ l(message.data);
181
+ return;
182
+ case 'child-exit':
183
+ children.get(message.childId)?.exit(message.code);
184
+ children.delete(message.childId);
185
+ return;
186
+ case 'child-error': {
187
+ const child = children.get(message.childId);
188
+ for (const l of child?.stderr ?? [])
189
+ l(`${message.message}\n`);
190
+ child?.exit(message.code === 'ENOENT' ? 127 : 1);
191
+ children.delete(message.childId);
192
+ return;
193
+ }
194
+ case 'http-request': {
195
+ const handler = handlers.get(message.port);
196
+ const respond = (response) => deps.post({ type: 'http-response', reqId: message.reqId, response });
197
+ if (!handler)
198
+ return respond({ status: 502, headers: { 'content-type': 'text/plain' }, body: new TextEncoder().encode(`Nothing is listening on port ${message.port}.`) });
199
+ void handler(message.request).then(respond, (error) => respond({ status: 500, headers: { 'content-type': 'text/plain' }, body: new TextEncoder().encode(String(error instanceof Error ? error.stack : error)) }));
200
+ return;
201
+ }
202
+ case 'loopback-response':
203
+ loopbacks.get(message.reqId)?.(message.response ?? undefined);
204
+ loopbacks.delete(message.reqId);
205
+ return;
206
+ }
207
+ },
208
+ };
209
+ }
210
+ //# sourceMappingURL=workerProcess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerProcess.js","sourceRoot":"","sources":["../../src/node/workerProcess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { PackageCache } from '@seanhogg/builderforce-webcontainers-core';
2
+ /**
3
+ * The installer's cache backed by Cache Storage, so a second `npm install` (or a
4
+ * reload) reuses tarballs instead of downloading them again. Cache Storage keys
5
+ * must be http(s) requests, so each key is folded into a URL on a reserved
6
+ * `.invalid` host that can never be fetched for real.
7
+ *
8
+ * Falls back to a no-op cache where Cache Storage is unavailable (an insecure
9
+ * context, or a browser that blocks it in private mode).
10
+ */
11
+ export declare function createCacheStoragePackageCache(name?: string): PackageCache;
12
+ //# sourceMappingURL=packageCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageCache.d.ts","sourceRoot":"","sources":["../src/packageCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAE9E;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,SAAkB,GAAG,YAAY,CAgBnF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The installer's cache backed by Cache Storage, so a second `npm install` (or a
3
+ * reload) reuses tarballs instead of downloading them again. Cache Storage keys
4
+ * must be http(s) requests, so each key is folded into a URL on a reserved
5
+ * `.invalid` host that can never be fetched for real.
6
+ *
7
+ * Falls back to a no-op cache where Cache Storage is unavailable (an insecure
8
+ * context, or a browser that blocks it in private mode).
9
+ */
10
+ export function createCacheStoragePackageCache(name = 'bfwc-packages') {
11
+ const storage = globalThis.caches;
12
+ if (!storage)
13
+ return { get: async () => undefined, put: async () => undefined };
14
+ let opened;
15
+ const open = () => (opened ??= storage.open(name).catch(() => undefined));
16
+ const keyUrl = (key) => `https://bfwc-cache.invalid/${encodeURIComponent(key)}`;
17
+ return {
18
+ async get(key) {
19
+ const response = await (await open())?.match(keyUrl(key)).catch(() => undefined);
20
+ return response ? new Uint8Array(await response.arrayBuffer()) : undefined;
21
+ },
22
+ async put(key, data) {
23
+ const body = data.slice().buffer;
24
+ await (await open())?.put(keyUrl(key), new Response(body)).catch(() => undefined); // quota errors just skip caching
25
+ },
26
+ };
27
+ }
28
+ //# sourceMappingURL=packageCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageCache.js","sourceRoot":"","sources":["../src/packageCache.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,8BAA8B,CAAC,IAAI,GAAG,eAAe;IACnE,MAAM,OAAO,GAAI,UAAwC,CAAC,MAAM,CAAC;IACjE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;IAChF,IAAI,MAA8C,CAAC;IACnD,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,8BAA8B,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;IACxF,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,GAAG;YACX,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACjF,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAqB,CAAC;YAChD,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,iCAAiC;QACtH,CAAC;KACF,CAAC;AACJ,CAAC"}