@seanhogg/builderforce-webcontainers-core 2026.10.7 → 2026.10.8
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.
- package/dist/archive.d.ts +2 -0
- package/dist/archive.d.ts.map +1 -1
- package/dist/archive.js +6 -4
- package/dist/archive.js.map +1 -1
- package/dist/html.d.ts +2 -0
- package/dist/html.d.ts.map +1 -1
- package/dist/html.js +5 -3
- package/dist/html.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/node/http/client.d.ts +3 -1
- package/dist/node/http/client.d.ts.map +1 -1
- package/dist/node/http/client.js +74 -5
- package/dist/node/http/client.js.map +1 -1
- package/dist/node/http/index.d.ts.map +1 -1
- package/dist/node/http/index.js +2 -1
- package/dist/node/http/index.js.map +1 -1
- package/dist/node/http/messages.d.ts +87 -0
- package/dist/node/http/messages.d.ts.map +1 -0
- package/dist/node/http/messages.js +146 -0
- package/dist/node/http/messages.js.map +1 -0
- package/dist/node/http/server.d.ts +13 -98
- package/dist/node/http/server.d.ts.map +1 -1
- package/dist/node/http/server.js +34 -202
- package/dist/node/http/server.js.map +1 -1
- package/dist/node/http/serverResponse.d.ts +42 -0
- package/dist/node/http/serverResponse.d.ts.map +1 -0
- package/dist/node/http/serverResponse.js +89 -0
- package/dist/node/http/serverResponse.js.map +1 -0
- package/dist/node/http/upgradeSocket.d.ts +34 -0
- package/dist/node/http/upgradeSocket.d.ts.map +1 -0
- package/dist/node/http/upgradeSocket.js +73 -0
- package/dist/node/http/upgradeSocket.js.map +1 -0
- package/dist/node/runtime.js +2 -2
- package/dist/node/runtime.js.map +1 -1
- package/dist/previewBridge.d.ts +42 -0
- package/dist/previewBridge.d.ts.map +1 -0
- package/dist/previewBridge.js +192 -0
- package/dist/previewBridge.js.map +1 -0
- package/dist/shell/ast.d.ts +101 -0
- package/dist/shell/ast.d.ts.map +1 -0
- package/dist/shell/ast.js +7 -0
- package/dist/shell/ast.js.map +1 -0
- package/dist/shell/builtins.d.ts +14 -0
- package/dist/shell/builtins.d.ts.map +1 -1
- package/dist/shell/builtins.js +87 -7
- package/dist/shell/builtins.js.map +1 -1
- package/dist/shell/compound.d.ts +30 -0
- package/dist/shell/compound.d.ts.map +1 -0
- package/dist/shell/compound.js +73 -0
- package/dist/shell/compound.js.map +1 -0
- package/dist/shell/exec.d.ts +27 -6
- package/dist/shell/exec.d.ts.map +1 -1
- package/dist/shell/exec.js +127 -41
- package/dist/shell/exec.js.map +1 -1
- package/dist/shell/expand.d.ts +5 -1
- package/dist/shell/expand.d.ts.map +1 -1
- package/dist/shell/expand.js +7 -5
- package/dist/shell/expand.js.map +1 -1
- package/dist/shell/lineReader.d.ts +9 -0
- package/dist/shell/lineReader.d.ts.map +1 -0
- package/dist/shell/lineReader.js +42 -0
- package/dist/shell/lineReader.js.map +1 -0
- package/dist/shell/packageManagers.d.ts +20 -0
- package/dist/shell/packageManagers.d.ts.map +1 -0
- package/dist/shell/packageManagers.js +74 -0
- package/dist/shell/packageManagers.js.map +1 -0
- package/dist/shell/parse.d.ts +16 -66
- package/dist/shell/parse.d.ts.map +1 -1
- package/dist/shell/parse.js +244 -243
- package/dist/shell/parse.js.map +1 -1
- package/dist/shell/program.d.ts.map +1 -1
- package/dist/shell/program.js +2 -1
- package/dist/shell/program.js.map +1 -1
- package/dist/shell/testCommand.d.ts +9 -0
- package/dist/shell/testCommand.d.ts.map +1 -0
- package/dist/shell/testCommand.js +105 -0
- package/dist/shell/testCommand.js.map +1 -0
- package/dist/shell/tokenize.d.ts +25 -0
- package/dist/shell/tokenize.d.ts.map +1 -0
- package/dist/shell/tokenize.js +279 -0
- package/dist/shell/tokenize.js.map +1 -0
- package/dist/system/cookieJar.d.ts +59 -0
- package/dist/system/cookieJar.d.ts.map +1 -0
- package/dist/system/cookieJar.js +187 -0
- package/dist/system/cookieJar.js.map +1 -0
- package/dist/system/httpStream.d.ts +40 -0
- package/dist/system/httpStream.d.ts.map +1 -0
- package/dist/system/httpStream.js +156 -0
- package/dist/system/httpStream.js.map +1 -0
- package/dist/system/index.d.ts +9 -1
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js +4 -0
- package/dist/system/index.js.map +1 -1
- package/dist/system/kernel.d.ts +10 -2
- package/dist/system/kernel.d.ts.map +1 -1
- package/dist/system/kernel.js +12 -3
- package/dist/system/kernel.js.map +1 -1
- package/dist/system/ports.d.ts +9 -4
- package/dist/system/ports.d.ts.map +1 -1
- package/dist/system/ports.js +21 -2
- package/dist/system/ports.js.map +1 -1
- package/dist/system/programs.d.ts +1 -1
- package/dist/system/programs.d.ts.map +1 -1
- package/dist/system/programs.js +2 -0
- package/dist/system/programs.js.map +1 -1
- package/dist/system/types.d.ts +36 -6
- package/dist/system/types.d.ts.map +1 -1
- package/dist/system/webSocketClient.d.ts +37 -0
- package/dist/system/webSocketClient.d.ts.map +1 -0
- package/dist/system/webSocketClient.js +152 -0
- package/dist/system/webSocketClient.js.map +1 -0
- package/dist/system/webSocketFrames.d.ts +39 -0
- package/dist/system/webSocketFrames.d.ts.map +1 -0
- package/dist/system/webSocketFrames.js +117 -0
- package/dist/system/webSocketFrames.js.map +1 -0
- package/package.json +1 -1
- package/src/archive.ts +8 -4
- package/src/html.ts +5 -3
- package/src/index.ts +2 -1
- package/src/node/http/client.ts +69 -6
- package/src/node/http/index.ts +2 -1
- package/src/node/http/messages.ts +150 -0
- package/src/node/http/server.ts +37 -202
- package/src/node/http/serverResponse.ts +98 -0
- package/src/node/http/upgradeSocket.ts +79 -0
- package/src/node/runtime.ts +2 -2
- package/src/previewBridge.ts +194 -0
- package/src/shell/ast.ts +85 -0
- package/src/shell/builtins.ts +97 -7
- package/src/shell/compound.ts +89 -0
- package/src/shell/exec.ts +128 -40
- package/src/shell/expand.ts +8 -6
- package/src/shell/lineReader.ts +46 -0
- package/src/shell/packageManagers.ts +75 -0
- package/src/shell/parse.ts +233 -236
- package/src/shell/program.ts +2 -1
- package/src/shell/testCommand.ts +105 -0
- package/src/shell/tokenize.ts +257 -0
- package/src/system/cookieJar.ts +187 -0
- package/src/system/httpStream.ts +168 -0
- package/src/system/index.ts +24 -1
- package/src/system/kernel.ts +16 -4
- package/src/system/ports.ts +23 -4
- package/src/system/programs.ts +3 -1
- package/src/system/types.ts +40 -6
- package/src/system/webSocketClient.ts +177 -0
- package/src/system/webSocketFrames.ts +118 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookies for virtual servers. A service worker cannot hand `Set-Cookie` to
|
|
3
|
+
* the browser (it is a forbidden header on a synthesized response), so the
|
|
4
|
+
* host keeps the jar itself: it stores what a server sets and sends it back as
|
|
5
|
+
* the `Cookie` header on later requests — per preview and per port, which is
|
|
6
|
+
* the origin a server would have had. Paths, `Max-Age`/`Expires` and deletion
|
|
7
|
+
* follow RFC 6265; `HttpOnly` cookies are stored and sent but never shown to
|
|
8
|
+
* page script; `Domain`, `Secure` and `SameSite` have nothing to choose between
|
|
9
|
+
* (every request goes to the one server) and are kept only as metadata.
|
|
10
|
+
*/
|
|
11
|
+
/** RFC 6265 §5.1.4: the directory of the request path. */
|
|
12
|
+
export function defaultCookiePath(requestPath) {
|
|
13
|
+
const path = requestPath.split('?')[0] ?? '/';
|
|
14
|
+
if (!path.startsWith('/'))
|
|
15
|
+
return '/';
|
|
16
|
+
const slash = path.lastIndexOf('/');
|
|
17
|
+
return slash <= 0 ? '/' : path.slice(0, slash);
|
|
18
|
+
}
|
|
19
|
+
/** RFC 6265 §5.1.4 path-match. */
|
|
20
|
+
export function cookiePathMatches(cookiePath, requestPath) {
|
|
21
|
+
const path = requestPath.split('?')[0] || '/';
|
|
22
|
+
if (path === cookiePath)
|
|
23
|
+
return true;
|
|
24
|
+
if (!path.startsWith(cookiePath))
|
|
25
|
+
return false;
|
|
26
|
+
return cookiePath.endsWith('/') || path[cookiePath.length] === '/';
|
|
27
|
+
}
|
|
28
|
+
/** Parse one `Set-Cookie` value; undefined when malformed. `deleted` marks an already-expired cookie (a deletion). */
|
|
29
|
+
export function parseSetCookie(header, requestPath, now = Date.now()) {
|
|
30
|
+
const [pair = '', ...attributes] = header.split(';');
|
|
31
|
+
const eq = pair.indexOf('=');
|
|
32
|
+
if (eq < 0)
|
|
33
|
+
return undefined;
|
|
34
|
+
const name = pair.slice(0, eq).trim();
|
|
35
|
+
if (!name)
|
|
36
|
+
return undefined;
|
|
37
|
+
const cookie = { name, value: pair.slice(eq + 1).trim(), path: defaultCookiePath(requestPath), httpOnly: false, secure: false, deleted: false };
|
|
38
|
+
let maxAge;
|
|
39
|
+
let expires;
|
|
40
|
+
for (const attribute of attributes) {
|
|
41
|
+
const i = attribute.indexOf('=');
|
|
42
|
+
const key = (i < 0 ? attribute : attribute.slice(0, i)).trim().toLowerCase();
|
|
43
|
+
const value = i < 0 ? '' : attribute.slice(i + 1).trim();
|
|
44
|
+
if (key === 'path' && value.startsWith('/'))
|
|
45
|
+
cookie.path = value;
|
|
46
|
+
else if (key === 'max-age' && /^-?\d+$/.test(value))
|
|
47
|
+
maxAge = Number(value);
|
|
48
|
+
else if (key === 'expires') {
|
|
49
|
+
const at = Date.parse(value);
|
|
50
|
+
if (!Number.isNaN(at))
|
|
51
|
+
expires = at;
|
|
52
|
+
}
|
|
53
|
+
else if (key === 'httponly')
|
|
54
|
+
cookie.httpOnly = true;
|
|
55
|
+
else if (key === 'secure')
|
|
56
|
+
cookie.secure = true;
|
|
57
|
+
else if (key === 'samesite')
|
|
58
|
+
cookie.sameSite = value;
|
|
59
|
+
}
|
|
60
|
+
// Max-Age wins over Expires (§5.3 step 3).
|
|
61
|
+
if (maxAge !== undefined)
|
|
62
|
+
cookie.expires = maxAge <= 0 ? 0 : now + maxAge * 1000;
|
|
63
|
+
else if (expires !== undefined)
|
|
64
|
+
cookie.expires = expires;
|
|
65
|
+
cookie.deleted = cookie.expires !== undefined && cookie.expires <= now;
|
|
66
|
+
return cookie;
|
|
67
|
+
}
|
|
68
|
+
export class CookieJar {
|
|
69
|
+
cookies = [];
|
|
70
|
+
listeners = new Set();
|
|
71
|
+
/** Store `Set-Cookie` values from a response to `requestPath`; returns whether anything changed. */
|
|
72
|
+
store(setCookie, requestPath, now = Date.now()) {
|
|
73
|
+
if (!setCookie)
|
|
74
|
+
return false;
|
|
75
|
+
let changed = false;
|
|
76
|
+
for (const header of typeof setCookie === 'string' ? [setCookie] : setCookie) {
|
|
77
|
+
const cookie = parseSetCookie(header, requestPath, now);
|
|
78
|
+
if (cookie)
|
|
79
|
+
changed = this.put(cookie, now, true) || changed;
|
|
80
|
+
}
|
|
81
|
+
if (changed)
|
|
82
|
+
this.notify();
|
|
83
|
+
return changed;
|
|
84
|
+
}
|
|
85
|
+
/** A `document.cookie = '…'` assignment from a page at `pagePath`. Script cannot create or replace an `HttpOnly` cookie. */
|
|
86
|
+
setFromDocument(assignment, pagePath, now = Date.now()) {
|
|
87
|
+
const cookie = parseSetCookie(assignment, pagePath, now);
|
|
88
|
+
if (!cookie || cookie.httpOnly)
|
|
89
|
+
return false;
|
|
90
|
+
const changed = this.put(cookie, now, false);
|
|
91
|
+
if (changed)
|
|
92
|
+
this.notify();
|
|
93
|
+
return changed;
|
|
94
|
+
}
|
|
95
|
+
/** The `Cookie` header for a request to `path`; undefined when no cookie applies. Longer paths first. */
|
|
96
|
+
header(path, now = Date.now()) {
|
|
97
|
+
const text = this.matching(path, now, true);
|
|
98
|
+
return text || undefined;
|
|
99
|
+
}
|
|
100
|
+
/** What `document.cookie` reads on a page at `path`: the same cookies, minus `HttpOnly` ones. */
|
|
101
|
+
documentCookie(path, now = Date.now()) {
|
|
102
|
+
return this.matching(path, now, false);
|
|
103
|
+
}
|
|
104
|
+
/** Every live cookie. */
|
|
105
|
+
list(now = Date.now()) {
|
|
106
|
+
this.expire(now);
|
|
107
|
+
return this.cookies.map((c) => ({ ...c }));
|
|
108
|
+
}
|
|
109
|
+
clear() {
|
|
110
|
+
if (!this.cookies.length)
|
|
111
|
+
return;
|
|
112
|
+
this.cookies = [];
|
|
113
|
+
this.notify();
|
|
114
|
+
}
|
|
115
|
+
/** The jar changed (a server or a page set or deleted a cookie). */
|
|
116
|
+
onChange(listener) {
|
|
117
|
+
this.listeners.add(listener);
|
|
118
|
+
return () => this.listeners.delete(listener);
|
|
119
|
+
}
|
|
120
|
+
put(cookie, now, fromHttp) {
|
|
121
|
+
this.expire(now);
|
|
122
|
+
const index = this.cookies.findIndex((c) => c.name === cookie.name && c.path === cookie.path);
|
|
123
|
+
const existing = index < 0 ? undefined : this.cookies[index];
|
|
124
|
+
if (existing?.httpOnly && !fromHttp)
|
|
125
|
+
return false;
|
|
126
|
+
const { deleted, ...stored } = cookie;
|
|
127
|
+
if (deleted) {
|
|
128
|
+
if (index < 0)
|
|
129
|
+
return false;
|
|
130
|
+
this.cookies.splice(index, 1);
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
if (existing && existing.value === stored.value && existing.expires === stored.expires && existing.httpOnly === stored.httpOnly)
|
|
134
|
+
return false;
|
|
135
|
+
if (index < 0)
|
|
136
|
+
this.cookies.push(stored);
|
|
137
|
+
else
|
|
138
|
+
this.cookies[index] = stored;
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
matching(path, now, includeHttpOnly) {
|
|
142
|
+
this.expire(now);
|
|
143
|
+
return this.cookies
|
|
144
|
+
.filter((c) => (includeHttpOnly || !c.httpOnly) && cookiePathMatches(c.path, path))
|
|
145
|
+
.sort((a, b) => b.path.length - a.path.length)
|
|
146
|
+
.map((c) => `${c.name}=${c.value}`)
|
|
147
|
+
.join('; ');
|
|
148
|
+
}
|
|
149
|
+
expire(now) {
|
|
150
|
+
const live = this.cookies.filter((c) => c.expires === undefined || c.expires > now);
|
|
151
|
+
if (live.length === this.cookies.length)
|
|
152
|
+
return;
|
|
153
|
+
this.cookies = live;
|
|
154
|
+
this.notify();
|
|
155
|
+
}
|
|
156
|
+
notify() {
|
|
157
|
+
for (const listener of this.listeners)
|
|
158
|
+
listener();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** One jar per virtual server port — what the preview host keeps for its runtime. */
|
|
162
|
+
export class PortCookieJars {
|
|
163
|
+
jars = new Map();
|
|
164
|
+
listeners = new Set();
|
|
165
|
+
jar(port) {
|
|
166
|
+
let jar = this.jars.get(port);
|
|
167
|
+
if (!jar) {
|
|
168
|
+
jar = new CookieJar();
|
|
169
|
+
jar.onChange(() => {
|
|
170
|
+
for (const listener of this.listeners)
|
|
171
|
+
listener(port);
|
|
172
|
+
});
|
|
173
|
+
this.jars.set(port, jar);
|
|
174
|
+
}
|
|
175
|
+
return jar;
|
|
176
|
+
}
|
|
177
|
+
/** Some port's jar changed. */
|
|
178
|
+
onChange(listener) {
|
|
179
|
+
this.listeners.add(listener);
|
|
180
|
+
return () => this.listeners.delete(listener);
|
|
181
|
+
}
|
|
182
|
+
clear() {
|
|
183
|
+
for (const jar of this.jars.values())
|
|
184
|
+
jar.clear();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=cookieJar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookieJar.js","sourceRoot":"","sources":["../../src/system/cookieJar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Building blocks for streamed HTTP between programs and hosts: a body stream
|
|
3
|
+
* fed by pushes (a server's `res.write`, chunks arriving over postMessage),
|
|
4
|
+
* buffering helpers for callers that want the whole response, and the in-memory
|
|
5
|
+
* byte pipe an upgraded connection runs over.
|
|
6
|
+
*/
|
|
7
|
+
import type { ByteChannel, HttpResponseData, HttpResponseHead, HttpStreamResponse } from './types.js';
|
|
8
|
+
export interface PushStream {
|
|
9
|
+
readonly stream: ReadableStream<Uint8Array>;
|
|
10
|
+
/** Queue a chunk; ignored once the stream is closed or cancelled. */
|
|
11
|
+
push(chunk: Uint8Array): void;
|
|
12
|
+
end(): void;
|
|
13
|
+
/** End with an error: the reader sees a failed read (a truncated response). */
|
|
14
|
+
fail(error: unknown): void;
|
|
15
|
+
/** True once ended, failed or cancelled. */
|
|
16
|
+
readonly done: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** A body stream fed from outside. `onCancel` runs when the reader hangs up before the end. */
|
|
19
|
+
export declare function pushStream(onCancel?: (reason: unknown) => void): PushStream;
|
|
20
|
+
/** A stream holding exactly `bytes`. */
|
|
21
|
+
export declare function bytesStream(bytes: Uint8Array): ReadableStream<Uint8Array>;
|
|
22
|
+
/** A complete plain-text response (errors: nothing listening, the server exited). */
|
|
23
|
+
export declare function textResponse(status: number, text: string): HttpStreamResponse;
|
|
24
|
+
/** Read a body stream to the end. */
|
|
25
|
+
export declare function readBody(stream: ReadableStream<Uint8Array>): Promise<Uint8Array>;
|
|
26
|
+
/** Wait for a streamed response's whole body. */
|
|
27
|
+
export declare function bufferResponse(response: HttpStreamResponse): Promise<HttpResponseData>;
|
|
28
|
+
/** The status line and headers alone (plain data, safe to post). */
|
|
29
|
+
export declare function headOf(response: HttpResponseHead): HttpResponseHead;
|
|
30
|
+
/**
|
|
31
|
+
* Feed a body stream to `sink` chunk by chunk. Returns a cancel that hangs up
|
|
32
|
+
* on the producer; `sink.end` gets the error message when the stream failed.
|
|
33
|
+
*/
|
|
34
|
+
export declare function drainBody(stream: ReadableStream<Uint8Array>, sink: {
|
|
35
|
+
chunk(data: Uint8Array): void;
|
|
36
|
+
end(error?: string): void;
|
|
37
|
+
}): () => void;
|
|
38
|
+
/** Two connected ends: bytes sent on one arrive (asynchronously, in order) on the other. */
|
|
39
|
+
export declare function createChannelPair(): [ByteChannel, ByteChannel];
|
|
40
|
+
//# sourceMappingURL=httpStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpStream.d.ts","sourceRoot":"","sources":["../../src/system/httpStream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtG,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5C,qEAAqE;IACrE,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,GAAG,IAAI,IAAI,CAAC;IACZ,+EAA+E;IAC/E,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,UAAU,CA8B3E;AAED,wCAAwC;AACxC,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAOzE;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAE7E;AAED,qCAAqC;AACrC,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAkBtF;AAED,iDAAiD;AACjD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAE5F;AAED,oEAAoE;AACpE,wBAAgB,MAAM,CAAC,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB,CAEnE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE;IAAE,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,IAAI,CAoB5I;AAsCD,4FAA4F;AAC5F,wBAAgB,iBAAiB,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAM9D"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/** A body stream fed from outside. `onCancel` runs when the reader hangs up before the end. */
|
|
2
|
+
export function pushStream(onCancel) {
|
|
3
|
+
let controller;
|
|
4
|
+
let done = false;
|
|
5
|
+
const stream = new ReadableStream({
|
|
6
|
+
start: (c) => void (controller = c),
|
|
7
|
+
cancel: (reason) => {
|
|
8
|
+
if (done)
|
|
9
|
+
return;
|
|
10
|
+
done = true;
|
|
11
|
+
onCancel?.(reason);
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
stream,
|
|
16
|
+
push(chunk) {
|
|
17
|
+
if (!done && chunk.byteLength)
|
|
18
|
+
controller.enqueue(chunk);
|
|
19
|
+
},
|
|
20
|
+
end() {
|
|
21
|
+
if (done)
|
|
22
|
+
return;
|
|
23
|
+
done = true;
|
|
24
|
+
controller.close();
|
|
25
|
+
},
|
|
26
|
+
fail(error) {
|
|
27
|
+
if (done)
|
|
28
|
+
return;
|
|
29
|
+
done = true;
|
|
30
|
+
controller.error(error);
|
|
31
|
+
},
|
|
32
|
+
get done() {
|
|
33
|
+
return done;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** A stream holding exactly `bytes`. */
|
|
38
|
+
export function bytesStream(bytes) {
|
|
39
|
+
return new ReadableStream({
|
|
40
|
+
start(controller) {
|
|
41
|
+
if (bytes.byteLength)
|
|
42
|
+
controller.enqueue(bytes);
|
|
43
|
+
controller.close();
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** A complete plain-text response (errors: nothing listening, the server exited). */
|
|
48
|
+
export function textResponse(status, text) {
|
|
49
|
+
return { status, headers: { 'content-type': 'text/plain; charset=utf-8' }, body: bytesStream(new TextEncoder().encode(text)) };
|
|
50
|
+
}
|
|
51
|
+
/** Read a body stream to the end. */
|
|
52
|
+
export async function readBody(stream) {
|
|
53
|
+
const chunks = [];
|
|
54
|
+
let length = 0;
|
|
55
|
+
const reader = stream.getReader();
|
|
56
|
+
for (;;) {
|
|
57
|
+
const { value, done } = await reader.read();
|
|
58
|
+
if (done)
|
|
59
|
+
break;
|
|
60
|
+
chunks.push(value);
|
|
61
|
+
length += value.byteLength;
|
|
62
|
+
}
|
|
63
|
+
if (chunks.length === 1)
|
|
64
|
+
return chunks[0];
|
|
65
|
+
const out = new Uint8Array(length);
|
|
66
|
+
let offset = 0;
|
|
67
|
+
for (const chunk of chunks) {
|
|
68
|
+
out.set(chunk, offset);
|
|
69
|
+
offset += chunk.byteLength;
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
/** Wait for a streamed response's whole body. */
|
|
74
|
+
export async function bufferResponse(response) {
|
|
75
|
+
return { ...headOf(response), body: await readBody(response.body) };
|
|
76
|
+
}
|
|
77
|
+
/** The status line and headers alone (plain data, safe to post). */
|
|
78
|
+
export function headOf(response) {
|
|
79
|
+
return { status: response.status, statusText: response.statusText, headers: response.headers };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Feed a body stream to `sink` chunk by chunk. Returns a cancel that hangs up
|
|
83
|
+
* on the producer; `sink.end` gets the error message when the stream failed.
|
|
84
|
+
*/
|
|
85
|
+
export function drainBody(stream, sink) {
|
|
86
|
+
const reader = stream.getReader();
|
|
87
|
+
let cancelled = false;
|
|
88
|
+
void (async () => {
|
|
89
|
+
try {
|
|
90
|
+
for (;;) {
|
|
91
|
+
const { value, done } = await reader.read();
|
|
92
|
+
if (done || cancelled)
|
|
93
|
+
break;
|
|
94
|
+
sink.chunk(value);
|
|
95
|
+
}
|
|
96
|
+
if (!cancelled)
|
|
97
|
+
sink.end();
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (!cancelled)
|
|
101
|
+
sink.end(error instanceof Error ? error.message : String(error));
|
|
102
|
+
}
|
|
103
|
+
})();
|
|
104
|
+
return () => {
|
|
105
|
+
if (cancelled)
|
|
106
|
+
return;
|
|
107
|
+
cancelled = true;
|
|
108
|
+
void reader.cancel().catch(() => undefined);
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
class ChannelEnd {
|
|
112
|
+
peer;
|
|
113
|
+
closed = false;
|
|
114
|
+
data = new Set();
|
|
115
|
+
closes = new Set();
|
|
116
|
+
send(data) {
|
|
117
|
+
if (this.closed)
|
|
118
|
+
return;
|
|
119
|
+
const copy = new Uint8Array(data); // a copy (a Buffer's slice would be a view)
|
|
120
|
+
queueMicrotask(() => {
|
|
121
|
+
if (!this.peer.closed)
|
|
122
|
+
for (const listener of this.peer.data)
|
|
123
|
+
listener(copy);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
close() {
|
|
127
|
+
if (this.closed)
|
|
128
|
+
return;
|
|
129
|
+
this.closed = true;
|
|
130
|
+
// Delivered after any data already sent, like a FIN after the last segment.
|
|
131
|
+
queueMicrotask(() => {
|
|
132
|
+
if (this.peer.closed)
|
|
133
|
+
return; // both hung up at once: neither needs telling
|
|
134
|
+
this.peer.closed = true;
|
|
135
|
+
for (const listener of this.peer.closes)
|
|
136
|
+
listener();
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
onData(listener) {
|
|
140
|
+
this.data.add(listener);
|
|
141
|
+
return () => this.data.delete(listener);
|
|
142
|
+
}
|
|
143
|
+
onClose(listener) {
|
|
144
|
+
this.closes.add(listener);
|
|
145
|
+
return () => this.closes.delete(listener);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/** Two connected ends: bytes sent on one arrive (asynchronously, in order) on the other. */
|
|
149
|
+
export function createChannelPair() {
|
|
150
|
+
const a = new ChannelEnd();
|
|
151
|
+
const b = new ChannelEnd();
|
|
152
|
+
a.peer = b;
|
|
153
|
+
b.peer = a;
|
|
154
|
+
return [a, b];
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=httpStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpStream.js","sourceRoot":"","sources":["../../src/system/httpStream.ts"],"names":[],"mappings":"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"}
|
package/dist/system/index.d.ts
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
export { Kernel, DEFAULT_ENV } from './kernel.js';
|
|
2
2
|
export type { KernelOptions } from './kernel.js';
|
|
3
|
-
export type { System, Program, ProgramContext, ProgramIO, TerminalPort, ProcessOptions, ChildHandle, HttpRequestData, HttpResponseData, HttpHandler } from './types.js';
|
|
3
|
+
export type { System, Program, ProgramContext, ProgramIO, TerminalPort, ProcessOptions, ChildHandle, HttpRequestData, HttpResponseHead, HttpResponseData, HttpStreamResponse, HttpHandler, ByteChannel, UpgradeHandler, } from './types.js';
|
|
4
4
|
export { PortRegistry, parsePortPath } from './ports.js';
|
|
5
|
+
export { pushStream, bytesStream, textResponse, readBody, bufferResponse, headOf, drainBody, createChannelPair } from './httpStream.js';
|
|
6
|
+
export type { PushStream } from './httpStream.js';
|
|
7
|
+
export { connectWebSocket } from './webSocketClient.js';
|
|
8
|
+
export type { WebSocketConnection, WebSocketConnectOptions, WebSocketCloseInfo } from './webSocketClient.js';
|
|
9
|
+
export { FrameDecoder, Opcode, encodeFrame, encodeClosePayload, decodeClosePayload, webSocketAccept, webSocketKey, WEBSOCKET_GUID } from './webSocketFrames.js';
|
|
10
|
+
export type { WebSocketFrame } from './webSocketFrames.js';
|
|
11
|
+
export { CookieJar, PortCookieJars, parseSetCookie, defaultCookiePath, cookiePathMatches } from './cookieJar.js';
|
|
12
|
+
export type { StoredCookie } from './cookieJar.js';
|
|
5
13
|
export type { PortEvent } from './ports.js';
|
|
6
14
|
export { runProgram, runArguments, toRuntimeProcess, allocatePid } from './process.js';
|
|
7
15
|
export type { RuntimeProcess, RunProgramOptions } from './process.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/system/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/system/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EACV,MAAM,EACN,OAAO,EACP,cAAc,EACd,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACxI,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAChK,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACjH,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACvF,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChH,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/system/index.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export { Kernel, DEFAULT_ENV } from './kernel.js';
|
|
2
2
|
export { PortRegistry, parsePortPath } from './ports.js';
|
|
3
|
+
export { pushStream, bytesStream, textResponse, readBody, bufferResponse, headOf, drainBody, createChannelPair } from './httpStream.js';
|
|
4
|
+
export { connectWebSocket } from './webSocketClient.js';
|
|
5
|
+
export { FrameDecoder, Opcode, encodeFrame, encodeClosePayload, decodeClosePayload, webSocketAccept, webSocketKey, WEBSOCKET_GUID } from './webSocketFrames.js';
|
|
6
|
+
export { CookieJar, PortCookieJars, parseSetCookie, defaultCookiePath, cookiePathMatches } from './cookieJar.js';
|
|
3
7
|
export { runProgram, runArguments, toRuntimeProcess, allocatePid } from './process.js';
|
|
4
8
|
export { ServerEvents } from './serverEvents.js';
|
|
5
9
|
export { resolveCommand, findExecutable, binDirectories, interpreterFor, commandNotFound } from './commands.js';
|
package/dist/system/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/system/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/system/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkBlD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAExI,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhK,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGjH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/system/kernel.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { VirtualFileSystem } from '../vfs.js';
|
|
9
9
|
import type { PackageCache } from '../installer/registry.js';
|
|
10
|
-
import type { ChildHandle, HttpRequestData, HttpResponseData, Program, ProcessOptions, System } from './types.js';
|
|
10
|
+
import type { ByteChannel, ChildHandle, HttpRequestData, HttpResponseData, HttpStreamResponse, Program, ProcessOptions, System } from './types.js';
|
|
11
11
|
import { PortRegistry } from './ports.js';
|
|
12
12
|
import { ServerEvents } from './serverEvents.js';
|
|
13
13
|
import { type RuntimeProcess } from './process.js';
|
|
@@ -39,9 +39,17 @@ export declare class Kernel {
|
|
|
39
39
|
run(command: string, options?: ProcessOptions): RuntimeProcess;
|
|
40
40
|
/** A child as a program's parent sees it — what `System.spawn` returns. */
|
|
41
41
|
spawnChild(command: string, args?: string[], options?: ProcessOptions): ChildHandle;
|
|
42
|
-
/** Send an HTTP request to a virtual server (what the preview service worker does in the browser). */
|
|
42
|
+
/** Send an HTTP request to a virtual server (what the preview service worker does in the browser); resolves with the whole response. */
|
|
43
43
|
request(port: number, request: Partial<HttpRequestData> & {
|
|
44
44
|
url: string;
|
|
45
45
|
}): Promise<HttpResponseData | undefined>;
|
|
46
|
+
/** {@link request}, resolving at the head with the body streaming (Server-Sent Events, chunked progress). */
|
|
47
|
+
requestStream(port: number, request: Partial<HttpRequestData> & {
|
|
48
|
+
url: string;
|
|
49
|
+
}): Promise<HttpStreamResponse | undefined>;
|
|
50
|
+
/** Open an upgraded connection (a WebSocket, via `connectWebSocket`); undefined when nothing on `port` takes upgrades. */
|
|
51
|
+
upgrade(port: number, request: Partial<HttpRequestData> & {
|
|
52
|
+
url: string;
|
|
53
|
+
}): ByteChannel | undefined;
|
|
46
54
|
}
|
|
47
55
|
//# sourceMappingURL=kernel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../src/system/kernel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../src/system/kernel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACnJ,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAA8C,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/F,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,iBAAiB,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,sFAAsF;IACtF,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAS9C,CAAC;AAEF,qBAAa,MAAM;IAQL,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,CAAC,KAAK,eAAsB;IACpC,oDAAoD;IACpD,QAAQ,CAAC,OAAO,eAAsB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEH,OAAO,EAAE,aAAa;IAmBnD,2HAA2H;IAC3H,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc;IAC/E,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc;IAM9D,2EAA2E;IAC3E,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,cAAmB,GAAG,WAAW;IAQ3F,wIAAwI;IACxI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAIjH,6GAA6G;IAC7G,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAIzH,0HAA0H;IAC1H,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,GAAG,SAAS;CAGpG"}
|
package/dist/system/kernel.js
CHANGED
|
@@ -38,7 +38,7 @@ export class Kernel {
|
|
|
38
38
|
fs: this.fs,
|
|
39
39
|
fetch: options.fetch ?? ((input, init) => globalThis.fetch(input, init)),
|
|
40
40
|
spawn: (command, args, spawnOptions) => this.spawnChild(command, args, spawnOptions),
|
|
41
|
-
listen: (port, handler) => this.ports.listen(port, handler),
|
|
41
|
+
listen: (port, handler, upgrade) => this.ports.listen(port, handler, upgrade),
|
|
42
42
|
loopback: (port, request) => this.ports.request(port, request),
|
|
43
43
|
serverUrl,
|
|
44
44
|
announceServer: (port, url) => this.servers.announce({ port, url }),
|
|
@@ -60,9 +60,18 @@ export class Kernel {
|
|
|
60
60
|
throw commandNotFound(command);
|
|
61
61
|
return runProgram({ program: resolved.program, args: resolved.args, system: this.system, cwd, env, terminal: options.terminal });
|
|
62
62
|
}
|
|
63
|
-
/** Send an HTTP request to a virtual server (what the preview service worker does in the browser). */
|
|
63
|
+
/** Send an HTTP request to a virtual server (what the preview service worker does in the browser); resolves with the whole response. */
|
|
64
64
|
request(port, request) {
|
|
65
|
-
return this.ports.
|
|
65
|
+
return this.ports.requestBuffered(port, withDefaults(request));
|
|
66
|
+
}
|
|
67
|
+
/** {@link request}, resolving at the head with the body streaming (Server-Sent Events, chunked progress). */
|
|
68
|
+
requestStream(port, request) {
|
|
69
|
+
return this.ports.request(port, withDefaults(request));
|
|
70
|
+
}
|
|
71
|
+
/** Open an upgraded connection (a WebSocket, via `connectWebSocket`); undefined when nothing on `port` takes upgrades. */
|
|
72
|
+
upgrade(port, request) {
|
|
73
|
+
return this.ports.upgrade(port, withDefaults(request));
|
|
66
74
|
}
|
|
67
75
|
}
|
|
76
|
+
const withDefaults = (request) => ({ method: 'GET', headers: {}, body: null, ...request });
|
|
68
77
|
//# sourceMappingURL=kernel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kernel.js","sourceRoot":"","sources":["../../src/system/kernel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAuB,MAAM,cAAc,CAAC;AAgB/F,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,IAAI,EAAE,8BAA8B;IACpC,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,gBAAgB;IACtB,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,aAAa;CACxB,CAAC;AAEF,MAAM,OAAO,MAAM;IAQY;IAPpB,EAAE,CAAoB;IACtB,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,oDAAoD;IAC3C,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAC7B,GAAG,CAAyB;IACpB,MAAM,CAAS;IAEhC,YAA6B,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QACjD,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,iBAAiB,EAAE,CAAC;QAChD,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,oBAAoB,IAAI,GAAG,CAAC;QAC7F,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,MAAM,GAAG;YACZ,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACxE,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC;YACpF,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"kernel.js","sourceRoot":"","sources":["../../src/system/kernel.ts"],"names":[],"mappings":"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"}
|
package/dist/system/ports.d.ts
CHANGED
|
@@ -4,23 +4,28 @@
|
|
|
4
4
|
* in one process is reachable from another (`fetch('http://localhost:3000')`)
|
|
5
5
|
* and from the preview service worker (`/__bfwc/<id>/__port/3000/`).
|
|
6
6
|
*/
|
|
7
|
-
import type { HttpHandler, HttpRequestData, HttpResponseData } from './types.js';
|
|
7
|
+
import type { ByteChannel, HttpHandler, HttpRequestData, HttpResponseData, HttpStreamResponse, UpgradeHandler } from './types.js';
|
|
8
8
|
export interface PortEvent {
|
|
9
9
|
type: 'open' | 'close';
|
|
10
10
|
port: number;
|
|
11
11
|
}
|
|
12
12
|
export declare class PortRegistry {
|
|
13
13
|
private readonly handlers;
|
|
14
|
+
private readonly upgrades;
|
|
14
15
|
private readonly listeners;
|
|
15
16
|
private nextEphemeral;
|
|
16
|
-
listen(port: number, handler: HttpHandler): {
|
|
17
|
+
listen(port: number, handler: HttpHandler, upgrade?: UpgradeHandler): {
|
|
17
18
|
port: number;
|
|
18
19
|
close(): void;
|
|
19
20
|
};
|
|
20
21
|
has(port: number): boolean;
|
|
21
22
|
ports(): number[];
|
|
22
|
-
/** Dispatch to the server on `port`;
|
|
23
|
-
request(port: number, request: HttpRequestData): Promise<
|
|
23
|
+
/** Dispatch to the server on `port`; resolves with the head as soon as it is written, the body streaming. Undefined when nothing listens there. */
|
|
24
|
+
request(port: number, request: HttpRequestData): Promise<HttpStreamResponse | undefined>;
|
|
25
|
+
/** {@link request}, waiting for the whole body. */
|
|
26
|
+
requestBuffered(port: number, request: HttpRequestData): Promise<HttpResponseData | undefined>;
|
|
27
|
+
/** Open an upgraded connection to the server on `port`; returns the client end, or undefined when nothing there takes upgrades. */
|
|
28
|
+
upgrade(port: number, request: HttpRequestData): ByteChannel | undefined;
|
|
24
29
|
watch(listener: (event: PortEvent) => void): () => void;
|
|
25
30
|
private emit;
|
|
26
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/system/ports.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/system/ports.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGlI,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,OAAO,CAAC,aAAa,CAAmB;IAExC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,IAAI,IAAI,CAAA;KAAE;IAyBrG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,KAAK,IAAI,MAAM,EAAE;IAIjB,mJAAmJ;IAC7I,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAK9F,mDAAmD;IAC7C,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAKpG,mIAAmI;IACnI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,WAAW,GAAG,SAAS;IAQxE,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAKvD,OAAO,CAAC,IAAI;CAGb;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAItF"}
|