@ricsam/isolate-fetch 0.1.10 → 0.1.12

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.
@@ -423,77 +423,79 @@ var hostBackedStreamCode = `
423
423
  (function() {
424
424
  const _streamIds = new WeakMap();
425
425
 
426
- class HostBackedReadableStream {
426
+ // Polyfill values() on ReadableStream if not available (older V8 versions)
427
+ if (typeof ReadableStream.prototype.values !== 'function') {
428
+ ReadableStream.prototype.values = function(options) {
429
+ const reader = this.getReader();
430
+ return {
431
+ async next() {
432
+ const { value, done } = await reader.read();
433
+ if (done) {
434
+ reader.releaseLock();
435
+ return { value: undefined, done: true };
436
+ }
437
+ return { value, done: false };
438
+ },
439
+ async return(value) {
440
+ reader.releaseLock();
441
+ return { value, done: true };
442
+ },
443
+ [Symbol.asyncIterator]() {
444
+ return this;
445
+ }
446
+ };
447
+ };
448
+ }
449
+
450
+ // Create a proper ReadableStream subclass that reports as "ReadableStream"
451
+ class HostBackedReadableStream extends ReadableStream {
427
452
  constructor(streamId) {
428
453
  if (streamId === undefined) {
429
454
  streamId = __Stream_create();
430
455
  }
431
- _streamIds.set(this, streamId);
432
- }
433
456
 
434
- _getStreamId() {
435
- return _streamIds.get(this);
436
- }
457
+ let closed = false;
437
458
 
438
- getReader() {
439
- const streamId = this._getStreamId();
440
- let released = false;
459
+ super({
460
+ async pull(controller) {
461
+ if (closed) return;
441
462
 
442
- return {
443
- read: async () => {
444
- if (released) {
445
- throw new TypeError("Reader has been released");
446
- }
447
463
  const resultJson = __Stream_pull_ref.applySyncPromise(undefined, [streamId]);
448
464
  const result = JSON.parse(resultJson);
449
465
 
450
466
  if (result.done) {
451
- return { done: true, value: undefined };
467
+ closed = true;
468
+ controller.close();
469
+ return;
452
470
  }
453
- return { done: false, value: new Uint8Array(result.value) };
471
+ controller.enqueue(new Uint8Array(result.value));
454
472
  },
455
-
456
- releaseLock: () => {
457
- released = true;
458
- },
459
-
460
- get closed() {
461
- return new Promise(() => {});
462
- },
463
-
464
- cancel: async (reason) => {
473
+ cancel(reason) {
474
+ closed = true;
465
475
  __Stream_error(streamId, String(reason || "cancelled"));
466
476
  }
467
- };
468
- }
477
+ });
469
478
 
470
- async cancel(reason) {
471
- __Stream_error(this._getStreamId(), String(reason || "cancelled"));
479
+ _streamIds.set(this, streamId);
472
480
  }
473
481
 
474
- get locked() {
475
- return false;
482
+ // Override to report as ReadableStream for spec compliance
483
+ get [Symbol.toStringTag]() {
484
+ return 'ReadableStream';
476
485
  }
477
486
 
478
- async *[Symbol.asyncIterator]() {
479
- const reader = this.getReader();
480
- try {
481
- while (true) {
482
- const { value, done } = await reader.read();
483
- if (done) return;
484
- yield value;
485
- }
486
- } finally {
487
- reader.releaseLock();
488
- }
487
+ _getStreamId() {
488
+ return _streamIds.get(this);
489
489
  }
490
490
 
491
- // Static method to create from existing stream ID
492
491
  static _fromStreamId(streamId) {
493
492
  return new HostBackedReadableStream(streamId);
494
493
  }
495
494
  }
496
495
 
496
+ // Make constructor.name return 'ReadableStream' for spec compliance
497
+ Object.defineProperty(HostBackedReadableStream, 'name', { value: 'ReadableStream' });
498
+
497
499
  globalThis.HostBackedReadableStream = HostBackedReadableStream;
498
500
  })();
499
501
  `;
@@ -673,6 +675,7 @@ function setupResponse(context, stateMap) {
673
675
  #headers;
674
676
  #streamId = null;
675
677
  #blobInitPromise = null; // For async Blob body initialization
678
+ #cachedBody = null; // Memoized body stream for spec compliance
676
679
 
677
680
  constructor(body, init = {}) {
678
681
  // Handle internal construction from instance ID
@@ -835,9 +838,15 @@ function setupResponse(context, stateMap) {
835
838
  }
836
839
 
837
840
  get body() {
841
+ // Return cached body if available (WHATWG spec requires same object on repeated access)
842
+ if (this.#cachedBody !== null) {
843
+ return this.#cachedBody;
844
+ }
845
+
838
846
  const streamId = __Response_getStreamId(this.#instanceId);
839
847
  if (streamId !== null) {
840
- return HostBackedReadableStream._fromStreamId(streamId);
848
+ this.#cachedBody = HostBackedReadableStream._fromStreamId(streamId);
849
+ return this.#cachedBody;
841
850
  }
842
851
 
843
852
  // Fallback: create host-backed stream from buffered body
@@ -850,7 +859,8 @@ function setupResponse(context, stateMap) {
850
859
  }
851
860
  __Stream_close(newStreamId);
852
861
 
853
- return HostBackedReadableStream._fromStreamId(newStreamId);
862
+ this.#cachedBody = HostBackedReadableStream._fromStreamId(newStreamId);
863
+ return this.#cachedBody;
854
864
  }
855
865
 
856
866
  async text() {
@@ -1726,6 +1736,12 @@ async function setupFetch(context, options) {
1726
1736
  const request = Request._fromInstanceId(${requestInstanceId});
1727
1737
  const server = new __Server__();
1728
1738
  const response = await Promise.resolve(__serveOptions__.fetch(request, server));
1739
+ if (response == null) {
1740
+ throw new TypeError("fetch handler did not return a Response object (got " + (response === null ? "null" : "undefined") + ")");
1741
+ }
1742
+ if (typeof response._getInstanceId !== 'function') {
1743
+ throw new TypeError("fetch handler must return a Response object (got " + (typeof response) + ")");
1744
+ }
1729
1745
  return response._getInstanceId();
1730
1746
  })()
1731
1747
  `, { promise: true });
@@ -1810,12 +1826,17 @@ async function setupFetch(context, options) {
1810
1826
  response._originalStatus = responseState.status;
1811
1827
  return response;
1812
1828
  } finally {
1829
+ if (requestStreamId !== null) {
1830
+ const startTime = Date.now();
1831
+ let streamState = streamRegistry.get(requestStreamId);
1832
+ while (streamState && !streamState.closed && !streamState.errored && Date.now() - startTime < 100) {
1833
+ await new Promise((resolve) => setTimeout(resolve, 5));
1834
+ streamState = streamRegistry.get(requestStreamId);
1835
+ }
1836
+ }
1813
1837
  if (streamCleanup) {
1814
1838
  await streamCleanup();
1815
1839
  }
1816
- if (requestStreamId !== null) {
1817
- streamRegistry.delete(requestStreamId);
1818
- }
1819
1840
  }
1820
1841
  },
1821
1842
  getUpgradeRequest() {
@@ -1930,4 +1951,4 @@ async function setupFetch(context, options) {
1930
1951
  };
1931
1952
  }
1932
1953
 
1933
- //# debugId=D2829934F58098A764756E2164756E21
1954
+ //# debugId=B1E0412945057BF364756E2164756E21