@whatwg-node/node-fetch 0.8.0-alpha-20241212154840-0a0effe808a6614e0a3afd853126a38641485756 → 0.8.0-alpha-20250917012053-36c9ccdc3e94ee8d0961f17398a9053fa55df37b

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.
Files changed (73) hide show
  1. package/cjs/AbortError.js +5 -3
  2. package/cjs/Blob.js +21 -19
  3. package/cjs/Body.js +146 -76
  4. package/cjs/FormData.js +54 -41
  5. package/cjs/Headers.js +54 -15
  6. package/cjs/ReadableStream.js +62 -26
  7. package/cjs/Request.js +9 -16
  8. package/cjs/Response.js +56 -10
  9. package/cjs/TextEncoderDecoder.js +6 -5
  10. package/cjs/TextEncoderDecoderStream.js +2 -6
  11. package/cjs/TransformStream.js +2 -1
  12. package/cjs/URL.js +10 -66
  13. package/cjs/URLSearchParams.js +1 -117
  14. package/cjs/WritableStream.js +35 -111
  15. package/cjs/fetch.js +37 -8
  16. package/cjs/fetchCurl.js +30 -61
  17. package/cjs/fetchNodeHttp.js +60 -64
  18. package/cjs/index.js +1 -7
  19. package/cjs/utils.js +76 -55
  20. package/esm/AbortError.js +5 -3
  21. package/esm/Blob.js +6 -4
  22. package/esm/Body.js +134 -63
  23. package/esm/FormData.js +54 -41
  24. package/esm/Headers.js +54 -15
  25. package/esm/ReadableStream.js +57 -21
  26. package/esm/Request.js +7 -14
  27. package/esm/Response.js +55 -9
  28. package/esm/TextEncoderDecoder.js +1 -0
  29. package/esm/TextEncoderDecoderStream.js +2 -6
  30. package/esm/TransformStream.js +2 -1
  31. package/esm/URL.js +9 -64
  32. package/esm/URLSearchParams.js +1 -115
  33. package/esm/WritableStream.js +33 -109
  34. package/esm/fetch.js +35 -6
  35. package/esm/fetchCurl.js +28 -59
  36. package/esm/fetchNodeHttp.js +55 -59
  37. package/esm/index.js +0 -3
  38. package/esm/utils.js +70 -53
  39. package/package.json +4 -5
  40. package/typings/AbortError.d.cts +1 -1
  41. package/typings/AbortError.d.ts +1 -1
  42. package/typings/Blob.d.cts +5 -4
  43. package/typings/Blob.d.ts +5 -4
  44. package/typings/Body.d.cts +11 -6
  45. package/typings/Body.d.ts +11 -6
  46. package/typings/Headers.d.cts +1 -1
  47. package/typings/Headers.d.ts +1 -1
  48. package/typings/ReadableStream.d.cts +8 -2
  49. package/typings/ReadableStream.d.ts +8 -2
  50. package/typings/Request.d.cts +9 -10
  51. package/typings/Request.d.ts +9 -10
  52. package/typings/Response.d.cts +6 -5
  53. package/typings/Response.d.ts +6 -5
  54. package/typings/TextEncoderDecoder.d.cts +2 -1
  55. package/typings/TextEncoderDecoder.d.ts +2 -1
  56. package/typings/URL.d.cts +12 -16
  57. package/typings/URL.d.ts +12 -16
  58. package/typings/URLSearchParams.d.cts +4 -21
  59. package/typings/URLSearchParams.d.ts +4 -21
  60. package/typings/WritableStream.d.cts +1 -1
  61. package/typings/WritableStream.d.ts +1 -1
  62. package/typings/index.d.cts +0 -3
  63. package/typings/index.d.ts +0 -3
  64. package/typings/utils.d.cts +13 -8
  65. package/typings/utils.d.ts +13 -8
  66. package/cjs/AbortController.js +0 -18
  67. package/cjs/AbortSignal.js +0 -85
  68. package/esm/AbortController.js +0 -14
  69. package/esm/AbortSignal.js +0 -81
  70. package/typings/AbortController.d.cts +0 -8
  71. package/typings/AbortController.d.ts +0 -8
  72. package/typings/AbortSignal.d.cts +0 -15
  73. package/typings/AbortSignal.d.ts +0 -15
@@ -1,20 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fetchNodeHttp = fetchNodeHttp;
4
- const http_1 = require("http");
5
- const https_1 = require("https");
6
- const stream_1 = require("stream");
7
- const zlib_1 = require("zlib");
4
+ const node_http_1 = require("node:http");
5
+ const node_https_1 = require("node:https");
6
+ const node_stream_1 = require("node:stream");
7
+ const node_zlib_1 = require("node:zlib");
8
+ const promise_helpers_1 = require("@whatwg-node/promise-helpers");
8
9
  const Request_js_1 = require("./Request.js");
9
10
  const Response_js_1 = require("./Response.js");
10
11
  const URL_js_1 = require("./URL.js");
11
12
  const utils_js_1 = require("./utils.js");
12
13
  function getRequestFnForProtocol(url) {
13
14
  if (url.startsWith('http:')) {
14
- return http_1.request;
15
+ return node_http_1.request;
15
16
  }
16
17
  else if (url.startsWith('https:')) {
17
- return https_1.request;
18
+ return node_https_1.request;
18
19
  }
19
20
  throw new Error(`Unsupported protocol: ${url.split(':')[0] || url}`);
20
21
  }
@@ -22,30 +23,24 @@ function fetchNodeHttp(fetchRequest) {
22
23
  return new Promise((resolve, reject) => {
23
24
  try {
24
25
  const requestFn = getRequestFnForProtocol(fetchRequest.parsedUrl?.protocol || fetchRequest.url);
25
- const nodeReadable = (fetchRequest.body != null
26
- ? (0, utils_js_1.isNodeReadable)(fetchRequest.body)
27
- ? fetchRequest.body
28
- : stream_1.Readable.from(fetchRequest.body)
29
- : null);
30
26
  const headersSerializer = fetchRequest.headersSerializer || utils_js_1.getHeadersObj;
31
27
  const nodeHeaders = headersSerializer(fetchRequest.headers);
32
- if (nodeHeaders['accept-encoding'] == null) {
33
- nodeHeaders['accept-encoding'] = 'gzip, deflate, br';
28
+ nodeHeaders['accept-encoding'] ||= 'gzip, deflate, br';
29
+ nodeHeaders['user-agent'] ||= 'node';
30
+ let signal;
31
+ if (fetchRequest._signal == null) {
32
+ signal = undefined;
33
+ }
34
+ else if (fetchRequest._signal) {
35
+ signal = fetchRequest._signal;
34
36
  }
35
37
  let nodeRequest;
36
- // Skip using parsed URL if it's an IPv6 address (starting with brackets)
37
- if (fetchRequest.parsedUrl && !fetchRequest.parsedUrl.hostname?.startsWith('[')) {
38
- nodeRequest = requestFn({
39
- auth: fetchRequest.parsedUrl.username
40
- ? `${fetchRequest.parsedUrl.username}:${fetchRequest.parsedUrl.password}`
41
- : undefined,
42
- hostname: fetchRequest.parsedUrl.hostname,
38
+ // If it is our ponyfilled Request, it should have `parsedUrl` which is a `URL` object
39
+ if (fetchRequest.parsedUrl) {
40
+ nodeRequest = requestFn(fetchRequest.parsedUrl, {
43
41
  method: fetchRequest.method,
44
- path: fetchRequest.parsedUrl.pathname + (fetchRequest.parsedUrl.search || ''),
45
- port: fetchRequest.parsedUrl.port,
46
- protocol: fetchRequest.parsedUrl.protocol,
47
42
  headers: nodeHeaders,
48
- signal: fetchRequest['_signal'] ?? undefined,
43
+ signal,
49
44
  agent: fetchRequest.agent,
50
45
  });
51
46
  }
@@ -53,33 +48,32 @@ function fetchNodeHttp(fetchRequest) {
53
48
  nodeRequest = requestFn(fetchRequest.url, {
54
49
  method: fetchRequest.method,
55
50
  headers: nodeHeaders,
56
- signal: fetchRequest['_signal'] ?? undefined,
51
+ signal,
57
52
  agent: fetchRequest.agent,
58
53
  });
59
54
  }
55
+ nodeRequest.once('error', reject);
60
56
  nodeRequest.once('response', nodeResponse => {
61
57
  let outputStream;
62
58
  const contentEncoding = nodeResponse.headers['content-encoding'];
63
59
  switch (contentEncoding) {
64
60
  case 'x-gzip':
65
61
  case 'gzip':
66
- outputStream = (0, zlib_1.createGunzip)();
62
+ outputStream = (0, node_zlib_1.createGunzip)();
67
63
  break;
68
64
  case 'x-deflate':
69
65
  case 'deflate':
70
- outputStream = (0, zlib_1.createInflate)();
66
+ outputStream = (0, node_zlib_1.createInflate)();
71
67
  break;
72
68
  case 'x-deflate-raw':
73
69
  case 'deflate-raw':
74
- outputStream = (0, zlib_1.createInflateRaw)();
70
+ outputStream = (0, node_zlib_1.createInflateRaw)();
75
71
  break;
76
72
  case 'br':
77
- outputStream = (0, zlib_1.createBrotliDecompress)();
73
+ outputStream = (0, node_zlib_1.createBrotliDecompress)();
78
74
  break;
79
- default:
80
- outputStream = new stream_1.PassThrough();
81
75
  }
82
- if (nodeResponse.headers.location) {
76
+ if (nodeResponse.headers.location && (0, utils_js_1.shouldRedirect)(nodeResponse.statusCode)) {
83
77
  if (fetchRequest.redirect === 'error') {
84
78
  const redirectError = new Error('Redirects are not allowed');
85
79
  reject(redirectError);
@@ -97,48 +91,50 @@ function fetchNodeHttp(fetchRequest) {
97
91
  return;
98
92
  }
99
93
  }
100
- stream_1.promises
101
- .pipeline(nodeResponse, outputStream, {
102
- signal: fetchRequest['_signal'] ?? undefined,
103
- end: true,
104
- })
105
- .then(() => {
106
- if (!nodeResponse.destroyed) {
107
- nodeResponse.resume();
108
- }
109
- })
110
- .catch(reject);
111
- if (fetchRequest['_signal']) {
112
- outputStream.once('error', () => {
113
- if (!fetchRequest['_signal']?.aborted) {
114
- fetchRequest['_signal']?.sendAbort?.();
115
- }
116
- });
117
- outputStream.once('close', () => {
118
- if (!fetchRequest['_signal']?.aborted) {
119
- fetchRequest['_signal']?.sendAbort?.();
94
+ outputStream ||= new node_stream_1.PassThrough();
95
+ (0, utils_js_1.pipeThrough)({
96
+ src: nodeResponse,
97
+ dest: outputStream,
98
+ signal,
99
+ onError: e => {
100
+ if (!nodeResponse.destroyed) {
101
+ nodeResponse.destroy(e);
120
102
  }
121
- });
122
- outputStream.once('destroy', () => {
123
- if (!fetchRequest['_signal']?.aborted) {
124
- fetchRequest['_signal']?.sendAbort?.();
103
+ if (!outputStream.destroyed) {
104
+ outputStream.destroy(e);
125
105
  }
126
- });
106
+ reject(e);
107
+ },
108
+ });
109
+ const statusCode = nodeResponse.statusCode || 200;
110
+ let statusText = nodeResponse.statusMessage || node_http_1.STATUS_CODES[statusCode];
111
+ if (statusText == null) {
112
+ statusText = '';
127
113
  }
128
- const ponyfillResponse = new Response_js_1.PonyfillResponse(outputStream, {
129
- status: nodeResponse.statusCode,
130
- statusText: nodeResponse.statusMessage,
114
+ const ponyfillResponse = new Response_js_1.PonyfillResponse(outputStream || nodeResponse, {
115
+ status: statusCode,
116
+ statusText,
131
117
  headers: nodeResponse.headers,
132
118
  url: fetchRequest.url,
119
+ signal,
133
120
  });
134
121
  resolve(ponyfillResponse);
135
122
  });
136
- nodeRequest.once('error', reject);
137
- if (nodeReadable) {
138
- nodeReadable.pipe(nodeRequest);
123
+ if (fetchRequest['_buffer'] != null) {
124
+ (0, promise_helpers_1.handleMaybePromise)(() => (0, utils_js_1.safeWrite)(fetchRequest['_buffer'], nodeRequest), () => (0, utils_js_1.endStream)(nodeRequest), reject);
139
125
  }
140
126
  else {
141
- nodeRequest.end();
127
+ const nodeReadable = (fetchRequest.body != null
128
+ ? (0, utils_js_1.isNodeReadable)(fetchRequest.body)
129
+ ? fetchRequest.body
130
+ : node_stream_1.Readable.from(fetchRequest.body)
131
+ : null);
132
+ if (nodeReadable) {
133
+ nodeReadable.pipe(nodeRequest);
134
+ }
135
+ else {
136
+ (0, utils_js_1.endStream)(nodeRequest);
137
+ }
142
138
  }
143
139
  }
144
140
  catch (e) {
package/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AbortError = exports.AbortSignal = exports.AbortController = exports.TextEncoderStream = exports.TextDecoderStream = exports.IteratorObject = exports.DecompressionStream = exports.CompressionStream = exports.TransformStream = exports.WritableStream = exports.URLSearchParams = exports.URL = exports.btoa = exports.TextDecoder = exports.TextEncoder = exports.Blob = exports.FormData = exports.File = exports.ReadableStream = exports.Response = exports.Request = exports.Body = exports.Headers = exports.fetch = void 0;
3
+ exports.TextEncoderStream = exports.TextDecoderStream = exports.IteratorObject = exports.DecompressionStream = exports.CompressionStream = exports.TransformStream = exports.WritableStream = exports.URLSearchParams = exports.URL = exports.btoa = exports.TextDecoder = exports.TextEncoder = exports.Blob = exports.FormData = exports.File = exports.ReadableStream = exports.Response = exports.Request = exports.Body = exports.Headers = exports.fetch = void 0;
4
4
  var fetch_js_1 = require("./fetch.js");
5
5
  Object.defineProperty(exports, "fetch", { enumerable: true, get: function () { return fetch_js_1.fetchPonyfill; } });
6
6
  var Headers_js_1 = require("./Headers.js");
@@ -40,9 +40,3 @@ Object.defineProperty(exports, "IteratorObject", { enumerable: true, get: functi
40
40
  var TextEncoderDecoderStream_js_1 = require("./TextEncoderDecoderStream.js");
41
41
  Object.defineProperty(exports, "TextDecoderStream", { enumerable: true, get: function () { return TextEncoderDecoderStream_js_1.PonyfillTextDecoderStream; } });
42
42
  Object.defineProperty(exports, "TextEncoderStream", { enumerable: true, get: function () { return TextEncoderDecoderStream_js_1.PonyfillTextEncoderStream; } });
43
- var AbortController_js_1 = require("./AbortController.js");
44
- Object.defineProperty(exports, "AbortController", { enumerable: true, get: function () { return AbortController_js_1.PonyfillAbortController; } });
45
- var AbortSignal_js_1 = require("./AbortSignal.js");
46
- Object.defineProperty(exports, "AbortSignal", { enumerable: true, get: function () { return AbortSignal_js_1.PonyfillAbortSignal; } });
47
- var AbortError_js_1 = require("./AbortError.js");
48
- Object.defineProperty(exports, "AbortError", { enumerable: true, get: function () { return AbortError_js_1.PonyfillAbortError; } });
package/cjs/utils.js CHANGED
@@ -1,12 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fakePromise = void 0;
3
4
  exports.getHeadersObj = getHeadersObj;
4
5
  exports.defaultHeadersSerializer = defaultHeadersSerializer;
5
- exports.fakePromise = fakePromise;
6
6
  exports.isArrayBufferView = isArrayBufferView;
7
7
  exports.isNodeReadable = isNodeReadable;
8
- exports.createDeferredPromise = createDeferredPromise;
9
8
  exports.isIterable = isIterable;
9
+ exports.shouldRedirect = shouldRedirect;
10
+ exports.pipeThrough = pipeThrough;
11
+ exports.endStream = endStream;
12
+ exports.safeWrite = safeWrite;
13
+ const node_events_1 = require("node:events");
10
14
  function isHeadersInstance(obj) {
11
15
  return obj?.forEach != null;
12
16
  }
@@ -14,6 +18,11 @@ function getHeadersObj(headers) {
14
18
  if (headers == null || !isHeadersInstance(headers)) {
15
19
  return headers;
16
20
  }
21
+ // @ts-expect-error - `headersInit` is not a public property
22
+ if (headers.headersInit && !headers._map && !isHeadersInstance(headers.headersInit)) {
23
+ // @ts-expect-error - `headersInit` is not a public property
24
+ return headers.headersInit;
25
+ }
17
26
  return Object.fromEntries(headers.entries());
18
27
  }
19
28
  function defaultHeadersSerializer(headers, onContentLength) {
@@ -26,65 +35,77 @@ function defaultHeadersSerializer(headers, onContentLength) {
26
35
  });
27
36
  return headerArray;
28
37
  }
29
- function isPromise(val) {
30
- return val?.then != null;
31
- }
32
- function fakePromise(value) {
33
- if (isPromise(value)) {
34
- return value;
35
- }
36
- // Write a fake promise to avoid the promise constructor
37
- // being called with `new Promise` in the browser.
38
- return {
39
- then(resolve) {
40
- if (resolve) {
41
- const callbackResult = resolve(value);
42
- if (isPromise(callbackResult)) {
43
- return callbackResult;
44
- }
45
- return fakePromise(callbackResult);
46
- }
47
- return this;
48
- },
49
- catch() {
50
- return this;
51
- },
52
- finally(cb) {
53
- if (cb) {
54
- const callbackResult = cb();
55
- if (isPromise(callbackResult)) {
56
- return callbackResult.then(() => value);
57
- }
58
- return fakePromise(value);
59
- }
60
- return this;
61
- },
62
- [Symbol.toStringTag]: 'Promise',
63
- };
64
- }
38
+ var promise_helpers_1 = require("@whatwg-node/promise-helpers");
39
+ Object.defineProperty(exports, "fakePromise", { enumerable: true, get: function () { return promise_helpers_1.fakePromise; } });
65
40
  function isArrayBufferView(obj) {
66
41
  return obj != null && obj.buffer != null && obj.byteLength != null && obj.byteOffset != null;
67
42
  }
68
43
  function isNodeReadable(obj) {
69
44
  return obj != null && obj.pipe != null;
70
45
  }
71
- function createDeferredPromise() {
72
- let resolveFn;
73
- let rejectFn;
74
- const promise = new Promise(function deferredPromiseExecutor(resolve, reject) {
75
- resolveFn = resolve;
76
- rejectFn = reject;
77
- });
78
- return {
79
- promise,
80
- get resolve() {
81
- return resolveFn;
82
- },
83
- get reject() {
84
- return rejectFn;
85
- },
86
- };
87
- }
88
46
  function isIterable(value) {
89
47
  return value?.[Symbol.iterator] != null;
90
48
  }
49
+ function shouldRedirect(status) {
50
+ return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
51
+ }
52
+ function pipeThrough({ src, dest, signal, onError, }) {
53
+ if (onError) {
54
+ // listen for errors on the destination stream if necessary. if the readable
55
+ // stream (src) emits an error, the writable destination (dest) will be
56
+ // destroyed with that error (see below)
57
+ dest.once('error', onError);
58
+ }
59
+ src.once('error', (e) => {
60
+ // if the readable stream (src) emits an error during pipe, the writable
61
+ // destination (dest) is not closed automatically. that needs to be
62
+ // done manually. the readable stream is closed when error is emitted,
63
+ // so only the writable destination needs to be destroyed
64
+ dest.destroy(e);
65
+ });
66
+ dest.once('close', () => {
67
+ // if the writable destination (dest) is closed, the readable stream (src)
68
+ // is not closed automatically. that needs to be done manually
69
+ if (!src.destroyed) {
70
+ src.destroy();
71
+ }
72
+ });
73
+ if (signal) {
74
+ // this is faster than `import('node:signal').addAbortSignal(signal, src)`
75
+ const srcRef = new WeakRef(src);
76
+ const signalRef = new WeakRef(signal);
77
+ function cleanup() {
78
+ signalRef.deref()?.removeEventListener('abort', onAbort);
79
+ srcRef.deref()?.removeListener('end', cleanup);
80
+ srcRef.deref()?.removeListener('error', cleanup);
81
+ srcRef.deref()?.removeListener('close', cleanup);
82
+ }
83
+ function onAbort() {
84
+ srcRef.deref()?.destroy(new AbortError());
85
+ cleanup();
86
+ }
87
+ signal.addEventListener('abort', onAbort, { once: true });
88
+ // this is faster than `import('node:signal').finished(src, cleanup)`
89
+ src.once('end', cleanup);
90
+ src.once('error', cleanup);
91
+ src.once('close', cleanup);
92
+ }
93
+ src.pipe(dest, { end: true /* already default */ });
94
+ }
95
+ function endStream(stream) {
96
+ // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
97
+ return stream.end(null, null, null);
98
+ }
99
+ function safeWrite(chunk, stream) {
100
+ const result = stream.write(chunk);
101
+ if (!result) {
102
+ return (0, node_events_1.once)(stream, 'drain');
103
+ }
104
+ }
105
+ // https://github.com/nodejs/node/blob/f692878dec6354c0a82241f224906981861bc840/lib/internal/errors.js#L961-L973
106
+ class AbortError extends Error {
107
+ constructor(message = 'The operation was aborted', options = undefined) {
108
+ super(message, options);
109
+ this.name = 'AbortError';
110
+ }
111
+ }
package/esm/AbortError.js CHANGED
@@ -1,11 +1,13 @@
1
- export class PonyfillAbortError extends DOMException {
1
+ export class PonyfillAbortError extends Error {
2
2
  constructor(reason) {
3
3
  let message = 'The operation was aborted';
4
4
  if (reason) {
5
5
  message += ` reason: ${reason}`;
6
6
  }
7
- super(message, 'AbortError');
8
- this.cause = reason;
7
+ super(message, {
8
+ cause: reason,
9
+ });
10
+ this.name = 'AbortError';
9
11
  }
10
12
  get reason() {
11
13
  return this.cause;
package/esm/Blob.js CHANGED
@@ -1,4 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
2
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
3
+ import { Buffer } from 'node:buffer';
2
4
  import { PonyfillReadableStream } from './ReadableStream.js';
3
5
  import { fakePromise, isArrayBufferView } from './utils.js';
4
6
  function getBlobPartAsBuffer(blobPart) {
@@ -114,7 +116,7 @@ export class PonyfillBlob {
114
116
  }
115
117
  arrayBuffer() {
116
118
  if (this._buffer) {
117
- // @ts-expect-error - `Buffer` and `ArrayBuffer` are compatible
119
+ // @ts-ignore - Mismatch between Buffer and ArrayBuffer
118
120
  return fakePromise(this._buffer);
119
121
  }
120
122
  if (this.blobParts.length === 1) {
@@ -125,7 +127,7 @@ export class PonyfillBlob {
125
127
  return this.blobParts[0].arrayBuffer();
126
128
  }
127
129
  }
128
- // @ts-expect-error - `Buffer` and `ArrayBuffer` are compatible
130
+ // @ts-ignore - Mismatch between Buffer and ArrayBuffer
129
131
  return this.buffer();
130
132
  }
131
133
  bytes() {
@@ -135,11 +137,11 @@ export class PonyfillBlob {
135
137
  if (this.blobParts.length === 1) {
136
138
  if (Buffer.isBuffer(this.blobParts[0])) {
137
139
  this._buffer = this.blobParts[0];
138
- return fakePromise(this.blobParts[0]);
140
+ return fakePromise(this._buffer);
139
141
  }
140
142
  if (this.blobParts[0] instanceof Uint8Array) {
141
143
  this._buffer = Buffer.from(this.blobParts[0]);
142
- return fakePromise(this.blobParts[0]);
144
+ return fakePromise(this._buffer);
143
145
  }
144
146
  if (hasBytesMethod(this.blobParts[0])) {
145
147
  return this.blobParts[0].bytes();