@ricsam/isolate-client 0.1.5 → 0.1.6
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/README.md +89 -0
- package/dist/cjs/connection.cjs +78 -22
- package/dist/cjs/connection.cjs.map +3 -3
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/connection.mjs +78 -22
- package/dist/mjs/connection.mjs.map +3 -3
- package/dist/mjs/index.mjs.map +1 -1
- package/dist/mjs/package.json +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/types.d.ts +14 -0
- package/package.json +1 -1
package/dist/mjs/connection.mjs
CHANGED
|
@@ -24,7 +24,8 @@ async function connect(options = {}) {
|
|
|
24
24
|
nextStreamId: 1,
|
|
25
25
|
connected: true,
|
|
26
26
|
streamResponses: new Map,
|
|
27
|
-
uploadStreams: new Map
|
|
27
|
+
uploadStreams: new Map,
|
|
28
|
+
moduleSourceCache: new Map
|
|
28
29
|
};
|
|
29
30
|
const parser = createFrameParser();
|
|
30
31
|
socket.on("data", (data) => {
|
|
@@ -39,15 +40,38 @@ async function connect(options = {}) {
|
|
|
39
40
|
socket.on("close", () => {
|
|
40
41
|
state.connected = false;
|
|
41
42
|
for (const [, pending] of state.pendingRequests) {
|
|
43
|
+
if (pending.timeoutId) {
|
|
44
|
+
clearTimeout(pending.timeoutId);
|
|
45
|
+
}
|
|
42
46
|
pending.reject(new Error("Connection closed"));
|
|
43
47
|
}
|
|
44
48
|
state.pendingRequests.clear();
|
|
49
|
+
for (const [, receiver] of state.streamResponses) {
|
|
50
|
+
receiver.state = "errored";
|
|
51
|
+
receiver.error = new Error("Connection closed");
|
|
52
|
+
const resolvers = receiver.pullResolvers.splice(0);
|
|
53
|
+
for (const resolver of resolvers) {
|
|
54
|
+
resolver();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
state.streamResponses.clear();
|
|
58
|
+
for (const [, session] of state.uploadStreams) {
|
|
59
|
+
session.state = "closed";
|
|
60
|
+
if (session.creditResolver) {
|
|
61
|
+
session.creditResolver();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
state.uploadStreams.clear();
|
|
45
65
|
});
|
|
46
66
|
socket.on("error", (err) => {
|
|
47
67
|
console.error("Socket error:", err);
|
|
48
68
|
});
|
|
49
69
|
return {
|
|
50
70
|
createRuntime: (runtimeOptions) => createRuntime(state, runtimeOptions),
|
|
71
|
+
createNamespace: (id) => ({
|
|
72
|
+
id,
|
|
73
|
+
createRuntime: (runtimeOptions) => createRuntime(state, runtimeOptions, id)
|
|
74
|
+
}),
|
|
51
75
|
close: async () => {
|
|
52
76
|
state.connected = false;
|
|
53
77
|
socket.destroy();
|
|
@@ -150,23 +174,35 @@ function handleMessage(message, state) {
|
|
|
150
174
|
metadata: msg.metadata,
|
|
151
175
|
controller: null,
|
|
152
176
|
state: "active",
|
|
153
|
-
pendingChunks: []
|
|
177
|
+
pendingChunks: [],
|
|
178
|
+
pullResolvers: [],
|
|
179
|
+
controllerFinalized: false
|
|
154
180
|
};
|
|
155
181
|
const readableStream = new ReadableStream({
|
|
156
182
|
start(controller) {
|
|
157
183
|
receiver.controller = controller;
|
|
158
184
|
},
|
|
159
185
|
pull(_controller) {
|
|
186
|
+
if (receiver.controllerFinalized) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
160
189
|
while (receiver.pendingChunks.length > 0) {
|
|
161
190
|
const chunk = receiver.pendingChunks.shift();
|
|
162
191
|
receiver.controller.enqueue(chunk);
|
|
163
192
|
}
|
|
164
193
|
if (receiver.state === "closed") {
|
|
165
|
-
receiver.
|
|
166
|
-
|
|
194
|
+
if (!receiver.controllerFinalized) {
|
|
195
|
+
receiver.controllerFinalized = true;
|
|
196
|
+
receiver.controller.close();
|
|
197
|
+
}
|
|
198
|
+
return Promise.resolve();
|
|
167
199
|
}
|
|
168
200
|
if (receiver.state === "errored") {
|
|
169
|
-
|
|
201
|
+
if (!receiver.controllerFinalized && receiver.error) {
|
|
202
|
+
receiver.controllerFinalized = true;
|
|
203
|
+
receiver.controller.error(receiver.error);
|
|
204
|
+
}
|
|
205
|
+
return Promise.resolve();
|
|
170
206
|
}
|
|
171
207
|
sendMessage(state.socket, {
|
|
172
208
|
type: MessageType.STREAM_PULL,
|
|
@@ -174,17 +210,23 @@ function handleMessage(message, state) {
|
|
|
174
210
|
maxBytes: STREAM_DEFAULT_CREDIT
|
|
175
211
|
});
|
|
176
212
|
return new Promise((resolve) => {
|
|
177
|
-
receiver.
|
|
213
|
+
receiver.pullResolvers.push(resolve);
|
|
178
214
|
});
|
|
179
215
|
},
|
|
180
216
|
cancel(_reason) {
|
|
181
|
-
receiver.state = "
|
|
217
|
+
receiver.state = "closed";
|
|
218
|
+
receiver.controllerFinalized = true;
|
|
219
|
+
const resolvers = receiver.pullResolvers.splice(0);
|
|
220
|
+
for (const resolver of resolvers) {
|
|
221
|
+
resolver();
|
|
222
|
+
}
|
|
182
223
|
sendMessage(state.socket, {
|
|
183
224
|
type: MessageType.STREAM_ERROR,
|
|
184
225
|
streamId: msg.streamId,
|
|
185
226
|
error: "Stream cancelled by consumer"
|
|
186
227
|
});
|
|
187
228
|
state.streamResponses.delete(msg.streamId);
|
|
229
|
+
return new Promise((resolve) => setTimeout(resolve, 0));
|
|
188
230
|
}
|
|
189
231
|
});
|
|
190
232
|
state.streamResponses.set(msg.streamId, receiver);
|
|
@@ -211,10 +253,9 @@ function handleMessage(message, state) {
|
|
|
211
253
|
const msg = message;
|
|
212
254
|
const receiver = state.streamResponses.get(msg.streamId);
|
|
213
255
|
if (receiver && receiver.state === "active") {
|
|
214
|
-
if (receiver.
|
|
256
|
+
if (receiver.pullResolvers.length > 0) {
|
|
215
257
|
receiver.controller.enqueue(msg.chunk);
|
|
216
|
-
const resolver = receiver.
|
|
217
|
-
receiver.pullResolver = undefined;
|
|
258
|
+
const resolver = receiver.pullResolvers.shift();
|
|
218
259
|
resolver();
|
|
219
260
|
} else {
|
|
220
261
|
receiver.pendingChunks.push(msg.chunk);
|
|
@@ -231,10 +272,12 @@ function handleMessage(message, state) {
|
|
|
231
272
|
const chunk = receiver.pendingChunks.shift();
|
|
232
273
|
receiver.controller.enqueue(chunk);
|
|
233
274
|
}
|
|
234
|
-
receiver.
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
275
|
+
if (!receiver.controllerFinalized) {
|
|
276
|
+
receiver.controllerFinalized = true;
|
|
277
|
+
receiver.controller.close();
|
|
278
|
+
}
|
|
279
|
+
const resolvers = receiver.pullResolvers.splice(0);
|
|
280
|
+
for (const resolver of resolvers) {
|
|
238
281
|
resolver();
|
|
239
282
|
}
|
|
240
283
|
state.streamResponses.delete(msg.streamId);
|
|
@@ -263,10 +306,13 @@ function handleMessage(message, state) {
|
|
|
263
306
|
const receiver = state.streamResponses.get(msg.streamId);
|
|
264
307
|
if (receiver) {
|
|
265
308
|
receiver.state = "errored";
|
|
266
|
-
receiver.
|
|
267
|
-
|
|
268
|
-
const
|
|
269
|
-
receiver.
|
|
309
|
+
receiver.error = new Error(msg.error);
|
|
310
|
+
while (receiver.pendingChunks.length > 0) {
|
|
311
|
+
const chunk = receiver.pendingChunks.shift();
|
|
312
|
+
receiver.controller.enqueue(chunk);
|
|
313
|
+
}
|
|
314
|
+
const resolvers = receiver.pullResolvers.splice(0);
|
|
315
|
+
for (const resolver of resolvers) {
|
|
270
316
|
resolver();
|
|
271
317
|
}
|
|
272
318
|
state.streamResponses.delete(msg.streamId);
|
|
@@ -326,7 +372,7 @@ function sendRequest(state, message, timeout = DEFAULT_TIMEOUT) {
|
|
|
326
372
|
sendMessage(state.socket, message);
|
|
327
373
|
});
|
|
328
374
|
}
|
|
329
|
-
async function createRuntime(state, options = {}) {
|
|
375
|
+
async function createRuntime(state, options = {}, namespaceId) {
|
|
330
376
|
const callbacks = {};
|
|
331
377
|
if (options.console) {
|
|
332
378
|
callbacks.console = registerConsoleCallbacks(state, options.console);
|
|
@@ -449,11 +495,13 @@ async function createRuntime(state, options = {}) {
|
|
|
449
495
|
memoryLimitMB: options.memoryLimitMB,
|
|
450
496
|
cwd: options.cwd,
|
|
451
497
|
callbacks,
|
|
452
|
-
testEnvironment: testEnvironmentOption
|
|
498
|
+
testEnvironment: testEnvironmentOption,
|
|
499
|
+
namespaceId
|
|
453
500
|
}
|
|
454
501
|
};
|
|
455
502
|
const result = await sendRequest(state, request);
|
|
456
503
|
const isolateId = result.isolateId;
|
|
504
|
+
const reused = result.reused ?? false;
|
|
457
505
|
const wsCommandCallbacks = new Set;
|
|
458
506
|
isolateWsCallbacks.set(isolateId, wsCommandCallbacks);
|
|
459
507
|
const fetchHandle = {
|
|
@@ -697,6 +745,7 @@ async function createRuntime(state, options = {}) {
|
|
|
697
745
|
return {
|
|
698
746
|
id: isolateId,
|
|
699
747
|
isolateId,
|
|
748
|
+
reused,
|
|
700
749
|
fetch: fetchHandle,
|
|
701
750
|
timers: timersHandle,
|
|
702
751
|
console: consoleHandle,
|
|
@@ -830,7 +879,14 @@ function registerFsCallbacks(state, callbacks) {
|
|
|
830
879
|
function registerModuleLoaderCallback(state, callback) {
|
|
831
880
|
const callbackId = state.nextCallbackId++;
|
|
832
881
|
state.callbacks.set(callbackId, async (moduleName) => {
|
|
833
|
-
|
|
882
|
+
const specifier = moduleName;
|
|
883
|
+
const cached = state.moduleSourceCache.get(specifier);
|
|
884
|
+
if (cached !== undefined) {
|
|
885
|
+
return cached;
|
|
886
|
+
}
|
|
887
|
+
const source = await callback(specifier);
|
|
888
|
+
state.moduleSourceCache.set(specifier, source);
|
|
889
|
+
return source;
|
|
834
890
|
});
|
|
835
891
|
return { callbackId, name: "moduleLoader", type: "async" };
|
|
836
892
|
}
|
|
@@ -1159,4 +1215,4 @@ export {
|
|
|
1159
1215
|
connect
|
|
1160
1216
|
};
|
|
1161
1217
|
|
|
1162
|
-
//# debugId=
|
|
1218
|
+
//# debugId=B4800C212010D2AD64756E2164756E21
|