@ricsam/isolate-fetch 0.1.10 → 0.1.11

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.
@@ -379,77 +379,79 @@ var hostBackedStreamCode = `
379
379
  (function() {
380
380
  const _streamIds = new WeakMap();
381
381
 
382
- class HostBackedReadableStream {
382
+ // Polyfill values() on ReadableStream if not available (older V8 versions)
383
+ if (typeof ReadableStream.prototype.values !== 'function') {
384
+ ReadableStream.prototype.values = function(options) {
385
+ const reader = this.getReader();
386
+ return {
387
+ async next() {
388
+ const { value, done } = await reader.read();
389
+ if (done) {
390
+ reader.releaseLock();
391
+ return { value: undefined, done: true };
392
+ }
393
+ return { value, done: false };
394
+ },
395
+ async return(value) {
396
+ reader.releaseLock();
397
+ return { value, done: true };
398
+ },
399
+ [Symbol.asyncIterator]() {
400
+ return this;
401
+ }
402
+ };
403
+ };
404
+ }
405
+
406
+ // Create a proper ReadableStream subclass that reports as "ReadableStream"
407
+ class HostBackedReadableStream extends ReadableStream {
383
408
  constructor(streamId) {
384
409
  if (streamId === undefined) {
385
410
  streamId = __Stream_create();
386
411
  }
387
- _streamIds.set(this, streamId);
388
- }
389
412
 
390
- _getStreamId() {
391
- return _streamIds.get(this);
392
- }
413
+ let closed = false;
393
414
 
394
- getReader() {
395
- const streamId = this._getStreamId();
396
- let released = false;
415
+ super({
416
+ async pull(controller) {
417
+ if (closed) return;
397
418
 
398
- return {
399
- read: async () => {
400
- if (released) {
401
- throw new TypeError("Reader has been released");
402
- }
403
419
  const resultJson = __Stream_pull_ref.applySyncPromise(undefined, [streamId]);
404
420
  const result = JSON.parse(resultJson);
405
421
 
406
422
  if (result.done) {
407
- return { done: true, value: undefined };
423
+ closed = true;
424
+ controller.close();
425
+ return;
408
426
  }
409
- return { done: false, value: new Uint8Array(result.value) };
427
+ controller.enqueue(new Uint8Array(result.value));
410
428
  },
411
-
412
- releaseLock: () => {
413
- released = true;
414
- },
415
-
416
- get closed() {
417
- return new Promise(() => {});
418
- },
419
-
420
- cancel: async (reason) => {
429
+ cancel(reason) {
430
+ closed = true;
421
431
  __Stream_error(streamId, String(reason || "cancelled"));
422
432
  }
423
- };
424
- }
433
+ });
425
434
 
426
- async cancel(reason) {
427
- __Stream_error(this._getStreamId(), String(reason || "cancelled"));
435
+ _streamIds.set(this, streamId);
428
436
  }
429
437
 
430
- get locked() {
431
- return false;
438
+ // Override to report as ReadableStream for spec compliance
439
+ get [Symbol.toStringTag]() {
440
+ return 'ReadableStream';
432
441
  }
433
442
 
434
- async *[Symbol.asyncIterator]() {
435
- const reader = this.getReader();
436
- try {
437
- while (true) {
438
- const { value, done } = await reader.read();
439
- if (done) return;
440
- yield value;
441
- }
442
- } finally {
443
- reader.releaseLock();
444
- }
443
+ _getStreamId() {
444
+ return _streamIds.get(this);
445
445
  }
446
446
 
447
- // Static method to create from existing stream ID
448
447
  static _fromStreamId(streamId) {
449
448
  return new HostBackedReadableStream(streamId);
450
449
  }
451
450
  }
452
451
 
452
+ // Make constructor.name return 'ReadableStream' for spec compliance
453
+ Object.defineProperty(HostBackedReadableStream, 'name', { value: 'ReadableStream' });
454
+
453
455
  globalThis.HostBackedReadableStream = HostBackedReadableStream;
454
456
  })();
455
457
  `;
@@ -629,6 +631,7 @@ function setupResponse(context, stateMap) {
629
631
  #headers;
630
632
  #streamId = null;
631
633
  #blobInitPromise = null; // For async Blob body initialization
634
+ #cachedBody = null; // Memoized body stream for spec compliance
632
635
 
633
636
  constructor(body, init = {}) {
634
637
  // Handle internal construction from instance ID
@@ -791,9 +794,15 @@ function setupResponse(context, stateMap) {
791
794
  }
792
795
 
793
796
  get body() {
797
+ // Return cached body if available (WHATWG spec requires same object on repeated access)
798
+ if (this.#cachedBody !== null) {
799
+ return this.#cachedBody;
800
+ }
801
+
794
802
  const streamId = __Response_getStreamId(this.#instanceId);
795
803
  if (streamId !== null) {
796
- return HostBackedReadableStream._fromStreamId(streamId);
804
+ this.#cachedBody = HostBackedReadableStream._fromStreamId(streamId);
805
+ return this.#cachedBody;
797
806
  }
798
807
 
799
808
  // Fallback: create host-backed stream from buffered body
@@ -806,7 +815,8 @@ function setupResponse(context, stateMap) {
806
815
  }
807
816
  __Stream_close(newStreamId);
808
817
 
809
- return HostBackedReadableStream._fromStreamId(newStreamId);
818
+ this.#cachedBody = HostBackedReadableStream._fromStreamId(newStreamId);
819
+ return this.#cachedBody;
810
820
  }
811
821
 
812
822
  async text() {
@@ -1682,6 +1692,12 @@ async function setupFetch(context, options) {
1682
1692
  const request = Request._fromInstanceId(${requestInstanceId});
1683
1693
  const server = new __Server__();
1684
1694
  const response = await Promise.resolve(__serveOptions__.fetch(request, server));
1695
+ if (response == null) {
1696
+ throw new TypeError("fetch handler did not return a Response object (got " + (response === null ? "null" : "undefined") + ")");
1697
+ }
1698
+ if (typeof response._getInstanceId !== 'function') {
1699
+ throw new TypeError("fetch handler must return a Response object (got " + (typeof response) + ")");
1700
+ }
1685
1701
  return response._getInstanceId();
1686
1702
  })()
1687
1703
  `, { promise: true });
@@ -1766,12 +1782,17 @@ async function setupFetch(context, options) {
1766
1782
  response._originalStatus = responseState.status;
1767
1783
  return response;
1768
1784
  } finally {
1785
+ if (requestStreamId !== null) {
1786
+ const startTime = Date.now();
1787
+ let streamState = streamRegistry.get(requestStreamId);
1788
+ while (streamState && !streamState.closed && !streamState.errored && Date.now() - startTime < 100) {
1789
+ await new Promise((resolve) => setTimeout(resolve, 5));
1790
+ streamState = streamRegistry.get(requestStreamId);
1791
+ }
1792
+ }
1769
1793
  if (streamCleanup) {
1770
1794
  await streamCleanup();
1771
1795
  }
1772
- if (requestStreamId !== null) {
1773
- streamRegistry.delete(requestStreamId);
1774
- }
1775
1796
  }
1776
1797
  },
1777
1798
  getUpgradeRequest() {
@@ -1890,4 +1911,4 @@ export {
1890
1911
  clearAllInstanceState
1891
1912
  };
1892
1913
 
1893
- //# debugId=DA9402429BBB147864756E2164756E21
1914
+ //# debugId=5C3C175E215A892A64756E2164756E21