@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.
@@ -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.controller.close();
166
- return;
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
- return;
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.pullResolver = resolve;
213
+ receiver.pullResolvers.push(resolve);
178
214
  });
179
215
  },
180
216
  cancel(_reason) {
181
- receiver.state = "errored";
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.pullResolver) {
256
+ if (receiver.pullResolvers.length > 0) {
215
257
  receiver.controller.enqueue(msg.chunk);
216
- const resolver = receiver.pullResolver;
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.controller.close();
235
- if (receiver.pullResolver) {
236
- const resolver = receiver.pullResolver;
237
- receiver.pullResolver = undefined;
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.controller.error(new Error(msg.error));
267
- if (receiver.pullResolver) {
268
- const resolver = receiver.pullResolver;
269
- receiver.pullResolver = undefined;
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
- return callback(moduleName);
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=2BAB1C12EE66984164756E2164756E21
1218
+ //# debugId=B4800C212010D2AD64756E2164756E21