@whatwg-node/node-fetch 0.4.12 → 0.4.13-alpha-20230821124424-6f3a2b1
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/cjs/Blob.js +5 -11
- package/cjs/Body.js +27 -49
- package/cjs/ReadableStream.js +9 -3
- package/cjs/Request.js +4 -1
- package/cjs/URLSearchParams.js +4 -1
- package/cjs/fetch.js +4 -1
- package/cjs/fetchCurl.js +15 -6
- package/cjs/fetchNodeHttp.js +1 -1
- package/cjs/utils.js +17 -6
- package/esm/Blob.js +6 -12
- package/esm/Body.js +28 -50
- package/esm/ReadableStream.js +9 -3
- package/esm/Request.js +4 -1
- package/esm/URLSearchParams.js +4 -1
- package/esm/fetch.js +4 -1
- package/esm/fetchCurl.js +16 -7
- package/esm/fetchNodeHttp.js +2 -2
- package/esm/utils.js +14 -4
- package/package.json +1 -1
- package/typings/Blob.d.cts +1 -1
- package/typings/Blob.d.ts +1 -1
- package/typings/Body.d.cts +1 -0
- package/typings/Body.d.ts +1 -0
- package/typings/utils.d.cts +4 -1
- package/typings/utils.d.ts +4 -1
package/cjs/Blob.js
CHANGED
@@ -11,10 +11,7 @@ function getBlobPartAsBuffer(blobPart) {
|
|
11
11
|
else if (Buffer.isBuffer(blobPart)) {
|
12
12
|
return blobPart;
|
13
13
|
}
|
14
|
-
else if (
|
15
|
-
return Buffer.from(blobPart);
|
16
|
-
}
|
17
|
-
else if ('buffer' in blobPart) {
|
14
|
+
else if ((0, utils_js_1.isArrayBufferView)(blobPart)) {
|
18
15
|
return Buffer.from(blobPart.buffer, blobPart.byteOffset, blobPart.byteLength);
|
19
16
|
}
|
20
17
|
else {
|
@@ -22,7 +19,7 @@ function getBlobPartAsBuffer(blobPart) {
|
|
22
19
|
}
|
23
20
|
}
|
24
21
|
function isBlob(obj) {
|
25
|
-
return obj != null &&
|
22
|
+
return obj != null && obj.arrayBuffer != null;
|
26
23
|
}
|
27
24
|
// Will be removed after v14 reaches EOL
|
28
25
|
// Needed because v14 doesn't have .stream() implemented
|
@@ -48,7 +45,7 @@ class PonyfillBlob {
|
|
48
45
|
return Buffer.concat(bufferChunks);
|
49
46
|
}
|
50
47
|
arrayBuffer() {
|
51
|
-
return this.buffer().then(
|
48
|
+
return this.buffer().then(buf => buf.buffer);
|
52
49
|
}
|
53
50
|
async text() {
|
54
51
|
let text = '';
|
@@ -56,7 +53,7 @@ class PonyfillBlob {
|
|
56
53
|
if (typeof blobPart === 'string') {
|
57
54
|
text += blobPart;
|
58
55
|
}
|
59
|
-
else if (
|
56
|
+
else if (isBlob(blobPart)) {
|
60
57
|
text += await blobPart.text();
|
61
58
|
}
|
62
59
|
else {
|
@@ -75,10 +72,7 @@ class PonyfillBlob {
|
|
75
72
|
else if (isBlob(blobPart)) {
|
76
73
|
size += blobPart.size;
|
77
74
|
}
|
78
|
-
else if (
|
79
|
-
size += blobPart.length;
|
80
|
-
}
|
81
|
-
else if ('byteLength' in blobPart) {
|
75
|
+
else if ((0, utils_js_1.isArrayBufferView)(blobPart)) {
|
82
76
|
size += blobPart.byteLength;
|
83
77
|
}
|
84
78
|
}
|
package/cjs/Body.js
CHANGED
@@ -29,11 +29,12 @@ class PonyfillBody {
|
|
29
29
|
this.contentLength = null;
|
30
30
|
this._bodyFactory = () => null;
|
31
31
|
this._generatedBody = null;
|
32
|
-
const { bodyFactory, contentType, contentLength, bodyType } = processBodyInit(bodyInit);
|
32
|
+
const { bodyFactory, contentType, contentLength, bodyType, buffer } = processBodyInit(bodyInit);
|
33
33
|
this._bodyFactory = bodyFactory;
|
34
34
|
this.contentType = contentType;
|
35
35
|
this.contentLength = contentLength;
|
36
36
|
this.bodyType = bodyType;
|
37
|
+
this._buffer = buffer;
|
37
38
|
}
|
38
39
|
generateBody() {
|
39
40
|
if (this._generatedBody) {
|
@@ -73,13 +74,8 @@ class PonyfillBody {
|
|
73
74
|
if (this.bodyType === BodyInitType.ArrayBuffer) {
|
74
75
|
return (0, utils_js_1.fakePromise)(this.bodyInit);
|
75
76
|
}
|
76
|
-
if (this.
|
77
|
-
|
78
|
-
return (0, utils_js_1.fakePromise)((0, utils_js_1.uint8ArrayToArrayBuffer)(typedBodyInit));
|
79
|
-
}
|
80
|
-
if (this.bodyType === BodyInitType.String) {
|
81
|
-
const buffer = Buffer.from(this.bodyInit);
|
82
|
-
return (0, utils_js_1.fakePromise)(buffer.buffer);
|
77
|
+
if (this._buffer) {
|
78
|
+
return (0, utils_js_1.fakePromise)(this._buffer.buffer);
|
83
79
|
}
|
84
80
|
if (this.bodyType === BodyInitType.Blob) {
|
85
81
|
const blob = this.bodyInit;
|
@@ -111,19 +107,8 @@ class PonyfillBody {
|
|
111
107
|
if (this.bodyType === BodyInitType.Blob) {
|
112
108
|
return (0, utils_js_1.fakePromise)(this.bodyInit);
|
113
109
|
}
|
114
|
-
if (this.
|
115
|
-
|
116
|
-
this.bodyType === BodyInitType.Uint8Array) {
|
117
|
-
const bodyInitTyped = this.bodyInit;
|
118
|
-
const blob = new Blob_js_1.PonyfillBlob([bodyInitTyped], {
|
119
|
-
type: this.contentType || '',
|
120
|
-
});
|
121
|
-
return (0, utils_js_1.fakePromise)(blob);
|
122
|
-
}
|
123
|
-
if (this.bodyType === BodyInitType.ArrayBuffer) {
|
124
|
-
const bodyInitTyped = this.bodyInit;
|
125
|
-
const buf = Buffer.from(bodyInitTyped, undefined, bodyInitTyped.byteLength);
|
126
|
-
const blob = new Blob_js_1.PonyfillBlob([buf], {
|
110
|
+
if (this._buffer) {
|
111
|
+
const blob = new Blob_js_1.PonyfillBlob([this._buffer], {
|
127
112
|
type: this.contentType || '',
|
128
113
|
});
|
129
114
|
return (0, utils_js_1.fakePromise)(blob);
|
@@ -199,16 +184,8 @@ class PonyfillBody {
|
|
199
184
|
});
|
200
185
|
}
|
201
186
|
buffer() {
|
202
|
-
if (this.
|
203
|
-
return (0, utils_js_1.fakePromise)(this.
|
204
|
-
}
|
205
|
-
if (this.bodyType === BodyInitType.String) {
|
206
|
-
return (0, utils_js_1.fakePromise)(Buffer.from(this.bodyInit));
|
207
|
-
}
|
208
|
-
if (this.bodyType === BodyInitType.Uint8Array || this.bodyType === BodyInitType.ArrayBuffer) {
|
209
|
-
const bodyInitTyped = this.bodyInit;
|
210
|
-
const buffer = Buffer.from(bodyInitTyped, 'byteOffset' in bodyInitTyped ? bodyInitTyped.byteOffset : undefined, bodyInitTyped.byteLength);
|
211
|
-
return (0, utils_js_1.fakePromise)(buffer);
|
187
|
+
if (this._buffer) {
|
188
|
+
return (0, utils_js_1.fakePromise)(Buffer.from(this._buffer.buffer, this._buffer.byteOffset, this._buffer.byteLength));
|
212
189
|
}
|
213
190
|
if (this.bodyType === BodyInitType.Blob) {
|
214
191
|
if (this.bodyInit instanceof Blob_js_1.PonyfillBlob) {
|
@@ -247,6 +224,7 @@ function processBodyInit(bodyInit) {
|
|
247
224
|
bodyType: BodyInitType.String,
|
248
225
|
contentType: 'text/plain;charset=UTF-8',
|
249
226
|
contentLength,
|
227
|
+
buffer,
|
250
228
|
bodyFactory() {
|
251
229
|
const readable = stream_1.Readable.from(buffer);
|
252
230
|
return new ReadableStream_js_1.PonyfillReadableStream(readable);
|
@@ -259,6 +237,7 @@ function processBodyInit(bodyInit) {
|
|
259
237
|
bodyType: BodyInitType.Buffer,
|
260
238
|
contentLength,
|
261
239
|
contentType: null,
|
240
|
+
buffer: bodyInit,
|
262
241
|
bodyFactory() {
|
263
242
|
const readable = stream_1.Readable.from(bodyInit);
|
264
243
|
const body = new ReadableStream_js_1.PonyfillReadableStream(readable);
|
@@ -284,26 +263,15 @@ function processBodyInit(bodyInit) {
|
|
284
263
|
},
|
285
264
|
};
|
286
265
|
}
|
287
|
-
if (
|
266
|
+
if ((0, utils_js_1.isArrayBufferView)(bodyInit)) {
|
288
267
|
const contentLength = bodyInit.byteLength;
|
268
|
+
const buffer = Buffer.from(bodyInit.buffer, bodyInit.byteOffset, bodyInit.byteLength);
|
289
269
|
return {
|
290
270
|
bodyType: BodyInitType.Uint8Array,
|
271
|
+
buffer,
|
291
272
|
contentLength,
|
292
273
|
contentType: null,
|
293
274
|
bodyFactory() {
|
294
|
-
const readable = stream_1.Readable.from(bodyInit);
|
295
|
-
const body = new ReadableStream_js_1.PonyfillReadableStream(readable);
|
296
|
-
return body;
|
297
|
-
},
|
298
|
-
};
|
299
|
-
}
|
300
|
-
if ('buffer' in bodyInit) {
|
301
|
-
const contentLength = bodyInit.byteLength;
|
302
|
-
return {
|
303
|
-
contentLength,
|
304
|
-
contentType: null,
|
305
|
-
bodyFactory() {
|
306
|
-
const buffer = Buffer.from(bodyInit);
|
307
275
|
const readable = stream_1.Readable.from(buffer);
|
308
276
|
const body = new ReadableStream_js_1.PonyfillReadableStream(readable);
|
309
277
|
return body;
|
@@ -312,12 +280,13 @@ function processBodyInit(bodyInit) {
|
|
312
280
|
}
|
313
281
|
if (bodyInit instanceof ArrayBuffer) {
|
314
282
|
const contentLength = bodyInit.byteLength;
|
283
|
+
const buffer = Buffer.from(bodyInit, undefined, bodyInit.byteLength);
|
315
284
|
return {
|
316
285
|
bodyType: BodyInitType.ArrayBuffer,
|
317
286
|
contentType: null,
|
318
287
|
contentLength,
|
288
|
+
buffer,
|
319
289
|
bodyFactory() {
|
320
|
-
const buffer = Buffer.from(bodyInit, undefined, bodyInit.byteLength);
|
321
290
|
const readable = stream_1.Readable.from(buffer);
|
322
291
|
const body = new ReadableStream_js_1.PonyfillReadableStream(readable);
|
323
292
|
return body;
|
@@ -335,7 +304,7 @@ function processBodyInit(bodyInit) {
|
|
335
304
|
},
|
336
305
|
};
|
337
306
|
}
|
338
|
-
if (
|
307
|
+
if (isBlob(bodyInit)) {
|
339
308
|
return {
|
340
309
|
contentType: bodyInit.type,
|
341
310
|
contentLength: bodyInit.size,
|
@@ -346,7 +315,7 @@ function processBodyInit(bodyInit) {
|
|
346
315
|
},
|
347
316
|
};
|
348
317
|
}
|
349
|
-
if (
|
318
|
+
if (isURLSearchParams(bodyInit)) {
|
350
319
|
const contentType = 'application/x-www-form-urlencoded;charset=UTF-8';
|
351
320
|
return {
|
352
321
|
bodyType: BodyInitType.String,
|
@@ -358,7 +327,7 @@ function processBodyInit(bodyInit) {
|
|
358
327
|
},
|
359
328
|
};
|
360
329
|
}
|
361
|
-
if (
|
330
|
+
if (isFormData(bodyInit)) {
|
362
331
|
const boundary = Math.random().toString(36).substr(2);
|
363
332
|
const contentType = `multipart/form-data; boundary=${boundary}`;
|
364
333
|
return {
|
@@ -381,3 +350,12 @@ function processBodyInit(bodyInit) {
|
|
381
350
|
}
|
382
351
|
throw new Error('Unknown body type');
|
383
352
|
}
|
353
|
+
function isFormData(value) {
|
354
|
+
return value?.forEach != null;
|
355
|
+
}
|
356
|
+
function isBlob(value) {
|
357
|
+
return value?.stream != null;
|
358
|
+
}
|
359
|
+
function isURLSearchParams(value) {
|
360
|
+
return value?.sort != null;
|
361
|
+
}
|
package/cjs/ReadableStream.js
CHANGED
@@ -43,16 +43,22 @@ function createController(desiredSize, readable) {
|
|
43
43
|
},
|
44
44
|
};
|
45
45
|
}
|
46
|
+
function isNodeReadable(obj) {
|
47
|
+
return obj?.read != null;
|
48
|
+
}
|
49
|
+
function isReadableStream(obj) {
|
50
|
+
return obj?.getReader != null;
|
51
|
+
}
|
46
52
|
class PonyfillReadableStream {
|
47
53
|
constructor(underlyingSource) {
|
48
54
|
this.locked = false;
|
49
55
|
if (underlyingSource instanceof PonyfillReadableStream) {
|
50
56
|
this.readable = underlyingSource.readable;
|
51
57
|
}
|
52
|
-
else if (underlyingSource
|
58
|
+
else if (isNodeReadable(underlyingSource)) {
|
53
59
|
this.readable = underlyingSource;
|
54
60
|
}
|
55
|
-
else if (underlyingSource
|
61
|
+
else if (isReadableStream(underlyingSource)) {
|
56
62
|
let reader;
|
57
63
|
let started = false;
|
58
64
|
this.readable = new stream_1.Readable({
|
@@ -162,7 +168,7 @@ class PonyfillReadableStream {
|
|
162
168
|
return readable;
|
163
169
|
}
|
164
170
|
static [Symbol.hasInstance](instance) {
|
165
|
-
return instance
|
171
|
+
return isReadableStream(instance);
|
166
172
|
}
|
167
173
|
}
|
168
174
|
exports.PonyfillReadableStream = PonyfillReadableStream;
|
package/cjs/Request.js
CHANGED
@@ -6,6 +6,9 @@ const Headers_js_1 = require("./Headers.js");
|
|
6
6
|
function isRequest(input) {
|
7
7
|
return input[Symbol.toStringTag] === 'Request';
|
8
8
|
}
|
9
|
+
function isURL(obj) {
|
10
|
+
return obj?.href != null;
|
11
|
+
}
|
9
12
|
class PonyfillRequest extends Body_js_1.PonyfillBody {
|
10
13
|
constructor(input, options) {
|
11
14
|
let url;
|
@@ -14,7 +17,7 @@ class PonyfillRequest extends Body_js_1.PonyfillBody {
|
|
14
17
|
if (typeof input === 'string') {
|
15
18
|
url = input;
|
16
19
|
}
|
17
|
-
else if (
|
20
|
+
else if (isURL(input)) {
|
18
21
|
url = input.toString();
|
19
22
|
}
|
20
23
|
else if (isRequest(input)) {
|
package/cjs/URLSearchParams.js
CHANGED
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PonyfillURLSearchParams = void 0;
|
4
4
|
const tslib_1 = require("tslib");
|
5
5
|
const fast_querystring_1 = tslib_1.__importDefault(require("fast-querystring"));
|
6
|
+
function isURLSearchParams(value) {
|
7
|
+
return value?.entries != null;
|
8
|
+
}
|
6
9
|
class PonyfillURLSearchParams {
|
7
10
|
constructor(init) {
|
8
11
|
if (init) {
|
@@ -15,7 +18,7 @@ class PonyfillURLSearchParams {
|
|
15
18
|
this.params[key] = value;
|
16
19
|
}
|
17
20
|
}
|
18
|
-
else if (
|
21
|
+
else if (isURLSearchParams(init)) {
|
19
22
|
this.params = {};
|
20
23
|
for (const [key, value] of init.entries()) {
|
21
24
|
this.params[key] = value;
|
package/cjs/fetch.js
CHANGED
@@ -35,8 +35,11 @@ function getResponseForDataUri(url) {
|
|
35
35
|
},
|
36
36
|
});
|
37
37
|
}
|
38
|
+
function isURL(obj) {
|
39
|
+
return obj != null && obj.href != null;
|
40
|
+
}
|
38
41
|
function fetchPonyfill(info, init) {
|
39
|
-
if (typeof info === 'string' ||
|
42
|
+
if (typeof info === 'string' || isURL(info)) {
|
40
43
|
const ponyfillRequest = new Request_js_1.PonyfillRequest(info, init);
|
41
44
|
return fetchPonyfill(ponyfillRequest);
|
42
45
|
}
|
package/cjs/fetchCurl.js
CHANGED
@@ -2,16 +2,12 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.fetchCurl = void 0;
|
4
4
|
const node_stream_1 = require("node:stream");
|
5
|
+
const AbortError_js_1 = require("./AbortError.js");
|
5
6
|
const Response_js_1 = require("./Response.js");
|
6
7
|
const utils_js_1 = require("./utils.js");
|
7
8
|
function fetchCurl(fetchRequest) {
|
8
9
|
const { Curl, CurlCode, CurlFeature, CurlPause, CurlProgressFunc } = globalThis['libcurl'];
|
9
10
|
const curlHandle = new Curl();
|
10
|
-
if (fetchRequest['_signal']) {
|
11
|
-
fetchRequest['_signal'].onabort = () => {
|
12
|
-
curlHandle.pause(CurlPause.Recv);
|
13
|
-
};
|
14
|
-
}
|
15
11
|
curlHandle.enable(CurlFeature.NoDataParsing);
|
16
12
|
curlHandle.setOpt('URL', fetchRequest.url);
|
17
13
|
curlHandle.setOpt('SSL_VERIFYPEER', false);
|
@@ -28,7 +24,7 @@ function fetchCurl(fetchRequest) {
|
|
28
24
|
}
|
29
25
|
else {
|
30
26
|
const nodeReadable = (fetchRequest.body != null
|
31
|
-
?
|
27
|
+
? (0, utils_js_1.isNodeReadable)(fetchRequest.body)
|
32
28
|
? fetchRequest.body
|
33
29
|
: node_stream_1.Readable.from(fetchRequest.body)
|
34
30
|
: null);
|
@@ -57,6 +53,18 @@ function fetchCurl(fetchRequest) {
|
|
57
53
|
curlHandle.setOpt('HTTPHEADER', curlHeaders);
|
58
54
|
curlHandle.enable(CurlFeature.NoHeaderParsing);
|
59
55
|
return new Promise(function promiseResolver(resolve, reject) {
|
56
|
+
let streamResolved = false;
|
57
|
+
if (fetchRequest['_signal']) {
|
58
|
+
fetchRequest['_signal'].onabort = () => {
|
59
|
+
if (streamResolved) {
|
60
|
+
curlHandle.pause(CurlPause.Recv);
|
61
|
+
}
|
62
|
+
else {
|
63
|
+
reject(new AbortError_js_1.PonyfillAbortError());
|
64
|
+
curlHandle.close();
|
65
|
+
}
|
66
|
+
};
|
67
|
+
}
|
60
68
|
curlHandle.once('end', function endListener() {
|
61
69
|
curlHandle.close();
|
62
70
|
});
|
@@ -90,6 +98,7 @@ function fetchCurl(fetchRequest) {
|
|
90
98
|
headers: headersInit,
|
91
99
|
url: fetchRequest.url,
|
92
100
|
}));
|
101
|
+
streamResolved = true;
|
93
102
|
});
|
94
103
|
curlHandle.perform();
|
95
104
|
});
|
package/cjs/fetchNodeHttp.js
CHANGED
@@ -24,7 +24,7 @@ function fetchNodeHttp(fetchRequest) {
|
|
24
24
|
try {
|
25
25
|
const requestFn = getRequestFnForProtocol(fetchRequest.url);
|
26
26
|
const nodeReadable = (fetchRequest.body != null
|
27
|
-
?
|
27
|
+
? (0, utils_js_1.isNodeReadable)(fetchRequest.body)
|
28
28
|
? fetchRequest.body
|
29
29
|
: stream_1.Readable.from(fetchRequest.body)
|
30
30
|
: null);
|
package/cjs/utils.js
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.isNodeReadable = exports.isArrayBufferView = exports.fakePromise = exports.defaultHeadersSerializer = exports.getHeadersObj = void 0;
|
4
|
+
function isHeadersInstance(obj) {
|
5
|
+
return obj?.forEach != null;
|
6
|
+
}
|
4
7
|
function getHeadersObj(headers) {
|
5
|
-
if (headers == null || !(
|
8
|
+
if (headers == null || !isHeadersInstance(headers)) {
|
6
9
|
return headers;
|
7
10
|
}
|
8
11
|
const obj = {};
|
@@ -12,10 +15,6 @@ function getHeadersObj(headers) {
|
|
12
15
|
return obj;
|
13
16
|
}
|
14
17
|
exports.getHeadersObj = getHeadersObj;
|
15
|
-
function uint8ArrayToArrayBuffer(uint8array) {
|
16
|
-
return uint8array.buffer.slice(uint8array.byteOffset, uint8array.byteOffset + uint8array.byteLength);
|
17
|
-
}
|
18
|
-
exports.uint8ArrayToArrayBuffer = uint8ArrayToArrayBuffer;
|
19
18
|
function defaultHeadersSerializer(headers, onContentLength) {
|
20
19
|
const headerArray = [];
|
21
20
|
headers.forEach((value, key) => {
|
@@ -61,3 +60,15 @@ function fakePromise(value) {
|
|
61
60
|
};
|
62
61
|
}
|
63
62
|
exports.fakePromise = fakePromise;
|
63
|
+
function isArrayBufferView(obj) {
|
64
|
+
return (obj != null &&
|
65
|
+
typeof obj === 'object' &&
|
66
|
+
obj.buffer != null &&
|
67
|
+
obj.byteLength != null &&
|
68
|
+
obj.byteOffset != null);
|
69
|
+
}
|
70
|
+
exports.isArrayBufferView = isArrayBufferView;
|
71
|
+
function isNodeReadable(obj) {
|
72
|
+
return obj != null && obj.pipe != null;
|
73
|
+
}
|
74
|
+
exports.isNodeReadable = isNodeReadable;
|
package/esm/Blob.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */
|
2
2
|
import { PonyfillReadableStream } from './ReadableStream.js';
|
3
|
-
import {
|
3
|
+
import { isArrayBufferView } from './utils.js';
|
4
4
|
function getBlobPartAsBuffer(blobPart) {
|
5
5
|
if (typeof blobPart === 'string') {
|
6
6
|
return Buffer.from(blobPart);
|
@@ -8,10 +8,7 @@ function getBlobPartAsBuffer(blobPart) {
|
|
8
8
|
else if (Buffer.isBuffer(blobPart)) {
|
9
9
|
return blobPart;
|
10
10
|
}
|
11
|
-
else if (blobPart
|
12
|
-
return Buffer.from(blobPart);
|
13
|
-
}
|
14
|
-
else if ('buffer' in blobPart) {
|
11
|
+
else if (isArrayBufferView(blobPart)) {
|
15
12
|
return Buffer.from(blobPart.buffer, blobPart.byteOffset, blobPart.byteLength);
|
16
13
|
}
|
17
14
|
else {
|
@@ -19,7 +16,7 @@ function getBlobPartAsBuffer(blobPart) {
|
|
19
16
|
}
|
20
17
|
}
|
21
18
|
function isBlob(obj) {
|
22
|
-
return obj != null &&
|
19
|
+
return obj != null && obj.arrayBuffer != null;
|
23
20
|
}
|
24
21
|
// Will be removed after v14 reaches EOL
|
25
22
|
// Needed because v14 doesn't have .stream() implemented
|
@@ -45,7 +42,7 @@ export class PonyfillBlob {
|
|
45
42
|
return Buffer.concat(bufferChunks);
|
46
43
|
}
|
47
44
|
arrayBuffer() {
|
48
|
-
return this.buffer().then(
|
45
|
+
return this.buffer().then(buf => buf.buffer);
|
49
46
|
}
|
50
47
|
async text() {
|
51
48
|
let text = '';
|
@@ -53,7 +50,7 @@ export class PonyfillBlob {
|
|
53
50
|
if (typeof blobPart === 'string') {
|
54
51
|
text += blobPart;
|
55
52
|
}
|
56
|
-
else if (
|
53
|
+
else if (isBlob(blobPart)) {
|
57
54
|
text += await blobPart.text();
|
58
55
|
}
|
59
56
|
else {
|
@@ -72,10 +69,7 @@ export class PonyfillBlob {
|
|
72
69
|
else if (isBlob(blobPart)) {
|
73
70
|
size += blobPart.size;
|
74
71
|
}
|
75
|
-
else if (
|
76
|
-
size += blobPart.length;
|
77
|
-
}
|
78
|
-
else if ('byteLength' in blobPart) {
|
72
|
+
else if (isArrayBufferView(blobPart)) {
|
79
73
|
size += blobPart.byteLength;
|
80
74
|
}
|
81
75
|
}
|
package/esm/Body.js
CHANGED
@@ -4,7 +4,7 @@ import { PonyfillBlob } from './Blob.js';
|
|
4
4
|
import { PonyfillFile } from './File.js';
|
5
5
|
import { getStreamFromFormData, PonyfillFormData } from './FormData.js';
|
6
6
|
import { PonyfillReadableStream } from './ReadableStream.js';
|
7
|
-
import { fakePromise,
|
7
|
+
import { fakePromise, isArrayBufferView } from './utils.js';
|
8
8
|
var BodyInitType;
|
9
9
|
(function (BodyInitType) {
|
10
10
|
BodyInitType["ReadableStream"] = "ReadableStream";
|
@@ -25,11 +25,12 @@ export class PonyfillBody {
|
|
25
25
|
this.contentLength = null;
|
26
26
|
this._bodyFactory = () => null;
|
27
27
|
this._generatedBody = null;
|
28
|
-
const { bodyFactory, contentType, contentLength, bodyType } = processBodyInit(bodyInit);
|
28
|
+
const { bodyFactory, contentType, contentLength, bodyType, buffer } = processBodyInit(bodyInit);
|
29
29
|
this._bodyFactory = bodyFactory;
|
30
30
|
this.contentType = contentType;
|
31
31
|
this.contentLength = contentLength;
|
32
32
|
this.bodyType = bodyType;
|
33
|
+
this._buffer = buffer;
|
33
34
|
}
|
34
35
|
generateBody() {
|
35
36
|
if (this._generatedBody) {
|
@@ -69,13 +70,8 @@ export class PonyfillBody {
|
|
69
70
|
if (this.bodyType === BodyInitType.ArrayBuffer) {
|
70
71
|
return fakePromise(this.bodyInit);
|
71
72
|
}
|
72
|
-
if (this.
|
73
|
-
|
74
|
-
return fakePromise(uint8ArrayToArrayBuffer(typedBodyInit));
|
75
|
-
}
|
76
|
-
if (this.bodyType === BodyInitType.String) {
|
77
|
-
const buffer = Buffer.from(this.bodyInit);
|
78
|
-
return fakePromise(buffer.buffer);
|
73
|
+
if (this._buffer) {
|
74
|
+
return fakePromise(this._buffer.buffer);
|
79
75
|
}
|
80
76
|
if (this.bodyType === BodyInitType.Blob) {
|
81
77
|
const blob = this.bodyInit;
|
@@ -107,19 +103,8 @@ export class PonyfillBody {
|
|
107
103
|
if (this.bodyType === BodyInitType.Blob) {
|
108
104
|
return fakePromise(this.bodyInit);
|
109
105
|
}
|
110
|
-
if (this.
|
111
|
-
|
112
|
-
this.bodyType === BodyInitType.Uint8Array) {
|
113
|
-
const bodyInitTyped = this.bodyInit;
|
114
|
-
const blob = new PonyfillBlob([bodyInitTyped], {
|
115
|
-
type: this.contentType || '',
|
116
|
-
});
|
117
|
-
return fakePromise(blob);
|
118
|
-
}
|
119
|
-
if (this.bodyType === BodyInitType.ArrayBuffer) {
|
120
|
-
const bodyInitTyped = this.bodyInit;
|
121
|
-
const buf = Buffer.from(bodyInitTyped, undefined, bodyInitTyped.byteLength);
|
122
|
-
const blob = new PonyfillBlob([buf], {
|
106
|
+
if (this._buffer) {
|
107
|
+
const blob = new PonyfillBlob([this._buffer], {
|
123
108
|
type: this.contentType || '',
|
124
109
|
});
|
125
110
|
return fakePromise(blob);
|
@@ -195,16 +180,8 @@ export class PonyfillBody {
|
|
195
180
|
});
|
196
181
|
}
|
197
182
|
buffer() {
|
198
|
-
if (this.
|
199
|
-
return fakePromise(this.
|
200
|
-
}
|
201
|
-
if (this.bodyType === BodyInitType.String) {
|
202
|
-
return fakePromise(Buffer.from(this.bodyInit));
|
203
|
-
}
|
204
|
-
if (this.bodyType === BodyInitType.Uint8Array || this.bodyType === BodyInitType.ArrayBuffer) {
|
205
|
-
const bodyInitTyped = this.bodyInit;
|
206
|
-
const buffer = Buffer.from(bodyInitTyped, 'byteOffset' in bodyInitTyped ? bodyInitTyped.byteOffset : undefined, bodyInitTyped.byteLength);
|
207
|
-
return fakePromise(buffer);
|
183
|
+
if (this._buffer) {
|
184
|
+
return fakePromise(Buffer.from(this._buffer.buffer, this._buffer.byteOffset, this._buffer.byteLength));
|
208
185
|
}
|
209
186
|
if (this.bodyType === BodyInitType.Blob) {
|
210
187
|
if (this.bodyInit instanceof PonyfillBlob) {
|
@@ -242,6 +219,7 @@ function processBodyInit(bodyInit) {
|
|
242
219
|
bodyType: BodyInitType.String,
|
243
220
|
contentType: 'text/plain;charset=UTF-8',
|
244
221
|
contentLength,
|
222
|
+
buffer,
|
245
223
|
bodyFactory() {
|
246
224
|
const readable = Readable.from(buffer);
|
247
225
|
return new PonyfillReadableStream(readable);
|
@@ -254,6 +232,7 @@ function processBodyInit(bodyInit) {
|
|
254
232
|
bodyType: BodyInitType.Buffer,
|
255
233
|
contentLength,
|
256
234
|
contentType: null,
|
235
|
+
buffer: bodyInit,
|
257
236
|
bodyFactory() {
|
258
237
|
const readable = Readable.from(bodyInit);
|
259
238
|
const body = new PonyfillReadableStream(readable);
|
@@ -279,26 +258,15 @@ function processBodyInit(bodyInit) {
|
|
279
258
|
},
|
280
259
|
};
|
281
260
|
}
|
282
|
-
if (bodyInit
|
261
|
+
if (isArrayBufferView(bodyInit)) {
|
283
262
|
const contentLength = bodyInit.byteLength;
|
263
|
+
const buffer = Buffer.from(bodyInit.buffer, bodyInit.byteOffset, bodyInit.byteLength);
|
284
264
|
return {
|
285
265
|
bodyType: BodyInitType.Uint8Array,
|
266
|
+
buffer,
|
286
267
|
contentLength,
|
287
268
|
contentType: null,
|
288
269
|
bodyFactory() {
|
289
|
-
const readable = Readable.from(bodyInit);
|
290
|
-
const body = new PonyfillReadableStream(readable);
|
291
|
-
return body;
|
292
|
-
},
|
293
|
-
};
|
294
|
-
}
|
295
|
-
if ('buffer' in bodyInit) {
|
296
|
-
const contentLength = bodyInit.byteLength;
|
297
|
-
return {
|
298
|
-
contentLength,
|
299
|
-
contentType: null,
|
300
|
-
bodyFactory() {
|
301
|
-
const buffer = Buffer.from(bodyInit);
|
302
270
|
const readable = Readable.from(buffer);
|
303
271
|
const body = new PonyfillReadableStream(readable);
|
304
272
|
return body;
|
@@ -307,12 +275,13 @@ function processBodyInit(bodyInit) {
|
|
307
275
|
}
|
308
276
|
if (bodyInit instanceof ArrayBuffer) {
|
309
277
|
const contentLength = bodyInit.byteLength;
|
278
|
+
const buffer = Buffer.from(bodyInit, undefined, bodyInit.byteLength);
|
310
279
|
return {
|
311
280
|
bodyType: BodyInitType.ArrayBuffer,
|
312
281
|
contentType: null,
|
313
282
|
contentLength,
|
283
|
+
buffer,
|
314
284
|
bodyFactory() {
|
315
|
-
const buffer = Buffer.from(bodyInit, undefined, bodyInit.byteLength);
|
316
285
|
const readable = Readable.from(buffer);
|
317
286
|
const body = new PonyfillReadableStream(readable);
|
318
287
|
return body;
|
@@ -330,7 +299,7 @@ function processBodyInit(bodyInit) {
|
|
330
299
|
},
|
331
300
|
};
|
332
301
|
}
|
333
|
-
if (
|
302
|
+
if (isBlob(bodyInit)) {
|
334
303
|
return {
|
335
304
|
contentType: bodyInit.type,
|
336
305
|
contentLength: bodyInit.size,
|
@@ -341,7 +310,7 @@ function processBodyInit(bodyInit) {
|
|
341
310
|
},
|
342
311
|
};
|
343
312
|
}
|
344
|
-
if (
|
313
|
+
if (isURLSearchParams(bodyInit)) {
|
345
314
|
const contentType = 'application/x-www-form-urlencoded;charset=UTF-8';
|
346
315
|
return {
|
347
316
|
bodyType: BodyInitType.String,
|
@@ -353,7 +322,7 @@ function processBodyInit(bodyInit) {
|
|
353
322
|
},
|
354
323
|
};
|
355
324
|
}
|
356
|
-
if (
|
325
|
+
if (isFormData(bodyInit)) {
|
357
326
|
const boundary = Math.random().toString(36).substr(2);
|
358
327
|
const contentType = `multipart/form-data; boundary=${boundary}`;
|
359
328
|
return {
|
@@ -376,3 +345,12 @@ function processBodyInit(bodyInit) {
|
|
376
345
|
}
|
377
346
|
throw new Error('Unknown body type');
|
378
347
|
}
|
348
|
+
function isFormData(value) {
|
349
|
+
return value?.forEach != null;
|
350
|
+
}
|
351
|
+
function isBlob(value) {
|
352
|
+
return value?.stream != null;
|
353
|
+
}
|
354
|
+
function isURLSearchParams(value) {
|
355
|
+
return value?.sort != null;
|
356
|
+
}
|
package/esm/ReadableStream.js
CHANGED
@@ -40,16 +40,22 @@ function createController(desiredSize, readable) {
|
|
40
40
|
},
|
41
41
|
};
|
42
42
|
}
|
43
|
+
function isNodeReadable(obj) {
|
44
|
+
return obj?.read != null;
|
45
|
+
}
|
46
|
+
function isReadableStream(obj) {
|
47
|
+
return obj?.getReader != null;
|
48
|
+
}
|
43
49
|
export class PonyfillReadableStream {
|
44
50
|
constructor(underlyingSource) {
|
45
51
|
this.locked = false;
|
46
52
|
if (underlyingSource instanceof PonyfillReadableStream) {
|
47
53
|
this.readable = underlyingSource.readable;
|
48
54
|
}
|
49
|
-
else if (underlyingSource
|
55
|
+
else if (isNodeReadable(underlyingSource)) {
|
50
56
|
this.readable = underlyingSource;
|
51
57
|
}
|
52
|
-
else if (underlyingSource
|
58
|
+
else if (isReadableStream(underlyingSource)) {
|
53
59
|
let reader;
|
54
60
|
let started = false;
|
55
61
|
this.readable = new Readable({
|
@@ -159,6 +165,6 @@ export class PonyfillReadableStream {
|
|
159
165
|
return readable;
|
160
166
|
}
|
161
167
|
static [Symbol.hasInstance](instance) {
|
162
|
-
return instance
|
168
|
+
return isReadableStream(instance);
|
163
169
|
}
|
164
170
|
}
|
package/esm/Request.js
CHANGED
@@ -3,6 +3,9 @@ import { isHeadersLike, PonyfillHeaders } from './Headers.js';
|
|
3
3
|
function isRequest(input) {
|
4
4
|
return input[Symbol.toStringTag] === 'Request';
|
5
5
|
}
|
6
|
+
function isURL(obj) {
|
7
|
+
return obj?.href != null;
|
8
|
+
}
|
6
9
|
export class PonyfillRequest extends PonyfillBody {
|
7
10
|
constructor(input, options) {
|
8
11
|
let url;
|
@@ -11,7 +14,7 @@ export class PonyfillRequest extends PonyfillBody {
|
|
11
14
|
if (typeof input === 'string') {
|
12
15
|
url = input;
|
13
16
|
}
|
14
|
-
else if (
|
17
|
+
else if (isURL(input)) {
|
15
18
|
url = input.toString();
|
16
19
|
}
|
17
20
|
else if (isRequest(input)) {
|
package/esm/URLSearchParams.js
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
import FastQuerystring from 'fast-querystring';
|
2
|
+
function isURLSearchParams(value) {
|
3
|
+
return value?.entries != null;
|
4
|
+
}
|
2
5
|
export class PonyfillURLSearchParams {
|
3
6
|
constructor(init) {
|
4
7
|
if (init) {
|
@@ -11,7 +14,7 @@ export class PonyfillURLSearchParams {
|
|
11
14
|
this.params[key] = value;
|
12
15
|
}
|
13
16
|
}
|
14
|
-
else if (
|
17
|
+
else if (isURLSearchParams(init)) {
|
15
18
|
this.params = {};
|
16
19
|
for (const [key, value] of init.entries()) {
|
17
20
|
this.params[key] = value;
|
package/esm/fetch.js
CHANGED
@@ -32,8 +32,11 @@ function getResponseForDataUri(url) {
|
|
32
32
|
},
|
33
33
|
});
|
34
34
|
}
|
35
|
+
function isURL(obj) {
|
36
|
+
return obj != null && obj.href != null;
|
37
|
+
}
|
35
38
|
export function fetchPonyfill(info, init) {
|
36
|
-
if (typeof info === 'string' ||
|
39
|
+
if (typeof info === 'string' || isURL(info)) {
|
37
40
|
const ponyfillRequest = new PonyfillRequest(info, init);
|
38
41
|
return fetchPonyfill(ponyfillRequest);
|
39
42
|
}
|
package/esm/fetchCurl.js
CHANGED
@@ -1,14 +1,10 @@
|
|
1
1
|
import { Readable } from 'node:stream';
|
2
|
+
import { PonyfillAbortError } from './AbortError.js';
|
2
3
|
import { PonyfillResponse } from './Response.js';
|
3
|
-
import { defaultHeadersSerializer } from './utils.js';
|
4
|
+
import { defaultHeadersSerializer, isNodeReadable } from './utils.js';
|
4
5
|
export function fetchCurl(fetchRequest) {
|
5
6
|
const { Curl, CurlCode, CurlFeature, CurlPause, CurlProgressFunc } = globalThis['libcurl'];
|
6
7
|
const curlHandle = new Curl();
|
7
|
-
if (fetchRequest['_signal']) {
|
8
|
-
fetchRequest['_signal'].onabort = () => {
|
9
|
-
curlHandle.pause(CurlPause.Recv);
|
10
|
-
};
|
11
|
-
}
|
12
8
|
curlHandle.enable(CurlFeature.NoDataParsing);
|
13
9
|
curlHandle.setOpt('URL', fetchRequest.url);
|
14
10
|
curlHandle.setOpt('SSL_VERIFYPEER', false);
|
@@ -25,7 +21,7 @@ export function fetchCurl(fetchRequest) {
|
|
25
21
|
}
|
26
22
|
else {
|
27
23
|
const nodeReadable = (fetchRequest.body != null
|
28
|
-
?
|
24
|
+
? isNodeReadable(fetchRequest.body)
|
29
25
|
? fetchRequest.body
|
30
26
|
: Readable.from(fetchRequest.body)
|
31
27
|
: null);
|
@@ -54,6 +50,18 @@ export function fetchCurl(fetchRequest) {
|
|
54
50
|
curlHandle.setOpt('HTTPHEADER', curlHeaders);
|
55
51
|
curlHandle.enable(CurlFeature.NoHeaderParsing);
|
56
52
|
return new Promise(function promiseResolver(resolve, reject) {
|
53
|
+
let streamResolved = false;
|
54
|
+
if (fetchRequest['_signal']) {
|
55
|
+
fetchRequest['_signal'].onabort = () => {
|
56
|
+
if (streamResolved) {
|
57
|
+
curlHandle.pause(CurlPause.Recv);
|
58
|
+
}
|
59
|
+
else {
|
60
|
+
reject(new PonyfillAbortError());
|
61
|
+
curlHandle.close();
|
62
|
+
}
|
63
|
+
};
|
64
|
+
}
|
57
65
|
curlHandle.once('end', function endListener() {
|
58
66
|
curlHandle.close();
|
59
67
|
});
|
@@ -87,6 +95,7 @@ export function fetchCurl(fetchRequest) {
|
|
87
95
|
headers: headersInit,
|
88
96
|
url: fetchRequest.url,
|
89
97
|
}));
|
98
|
+
streamResolved = true;
|
90
99
|
});
|
91
100
|
curlHandle.perform();
|
92
101
|
});
|
package/esm/fetchNodeHttp.js
CHANGED
@@ -6,7 +6,7 @@ import { PonyfillAbortError } from './AbortError.js';
|
|
6
6
|
import { PonyfillRequest } from './Request.js';
|
7
7
|
import { PonyfillResponse } from './Response.js';
|
8
8
|
import { PonyfillURL } from './URL.js';
|
9
|
-
import { getHeadersObj } from './utils.js';
|
9
|
+
import { getHeadersObj, isNodeReadable } from './utils.js';
|
10
10
|
function getRequestFnForProtocol(url) {
|
11
11
|
if (url.startsWith('http:')) {
|
12
12
|
return httpRequest;
|
@@ -21,7 +21,7 @@ export function fetchNodeHttp(fetchRequest) {
|
|
21
21
|
try {
|
22
22
|
const requestFn = getRequestFnForProtocol(fetchRequest.url);
|
23
23
|
const nodeReadable = (fetchRequest.body != null
|
24
|
-
?
|
24
|
+
? isNodeReadable(fetchRequest.body)
|
25
25
|
? fetchRequest.body
|
26
26
|
: Readable.from(fetchRequest.body)
|
27
27
|
: null);
|
package/esm/utils.js
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
function isHeadersInstance(obj) {
|
2
|
+
return obj?.forEach != null;
|
3
|
+
}
|
1
4
|
export function getHeadersObj(headers) {
|
2
|
-
if (headers == null || !(
|
5
|
+
if (headers == null || !isHeadersInstance(headers)) {
|
3
6
|
return headers;
|
4
7
|
}
|
5
8
|
const obj = {};
|
@@ -8,9 +11,6 @@ export function getHeadersObj(headers) {
|
|
8
11
|
});
|
9
12
|
return obj;
|
10
13
|
}
|
11
|
-
export function uint8ArrayToArrayBuffer(uint8array) {
|
12
|
-
return uint8array.buffer.slice(uint8array.byteOffset, uint8array.byteOffset + uint8array.byteLength);
|
13
|
-
}
|
14
14
|
export function defaultHeadersSerializer(headers, onContentLength) {
|
15
15
|
const headerArray = [];
|
16
16
|
headers.forEach((value, key) => {
|
@@ -54,3 +54,13 @@ export function fakePromise(value) {
|
|
54
54
|
[Symbol.toStringTag]: 'Promise',
|
55
55
|
};
|
56
56
|
}
|
57
|
+
export function isArrayBufferView(obj) {
|
58
|
+
return (obj != null &&
|
59
|
+
typeof obj === 'object' &&
|
60
|
+
obj.buffer != null &&
|
61
|
+
obj.byteLength != null &&
|
62
|
+
obj.byteOffset != null);
|
63
|
+
}
|
64
|
+
export function isNodeReadable(obj) {
|
65
|
+
return obj != null && obj.pipe != null;
|
66
|
+
}
|
package/package.json
CHANGED
package/typings/Blob.d.cts
CHANGED
@@ -17,7 +17,7 @@ export declare class PonyfillBlob implements Blob {
|
|
17
17
|
private encoding;
|
18
18
|
constructor(blobParts: BlobPart[], options?: BlobOptions);
|
19
19
|
buffer(): Promise<Buffer>;
|
20
|
-
arrayBuffer(): Promise<ArrayBuffer>;
|
20
|
+
arrayBuffer(): Promise<ArrayBuffer | SharedArrayBuffer>;
|
21
21
|
text(): Promise<string>;
|
22
22
|
get size(): number;
|
23
23
|
stream(): any;
|
package/typings/Blob.d.ts
CHANGED
@@ -17,7 +17,7 @@ export declare class PonyfillBlob implements Blob {
|
|
17
17
|
private encoding;
|
18
18
|
constructor(blobParts: BlobPart[], options?: BlobOptions);
|
19
19
|
buffer(): Promise<Buffer>;
|
20
|
-
arrayBuffer(): Promise<ArrayBuffer>;
|
20
|
+
arrayBuffer(): Promise<ArrayBuffer | SharedArrayBuffer>;
|
21
21
|
text(): Promise<string>;
|
22
22
|
get size(): number;
|
23
23
|
stream(): any;
|
package/typings/Body.d.cts
CHANGED
@@ -27,6 +27,7 @@ export declare class PonyfillBody<TJSON = any> implements Body {
|
|
27
27
|
private bodyType?;
|
28
28
|
private _bodyFactory;
|
29
29
|
private _generatedBody;
|
30
|
+
private _buffer?;
|
30
31
|
private generateBody;
|
31
32
|
get body(): PonyfillReadableStream<Uint8Array> | null;
|
32
33
|
arrayBuffer(): Promise<ArrayBuffer>;
|
package/typings/Body.d.ts
CHANGED
@@ -27,6 +27,7 @@ export declare class PonyfillBody<TJSON = any> implements Body {
|
|
27
27
|
private bodyType?;
|
28
28
|
private _bodyFactory;
|
29
29
|
private _generatedBody;
|
30
|
+
private _buffer?;
|
30
31
|
private generateBody;
|
31
32
|
get body(): PonyfillReadableStream<Uint8Array> | null;
|
32
33
|
arrayBuffer(): Promise<ArrayBuffer>;
|
package/typings/utils.d.cts
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import { Readable } from 'node:stream';
|
1
3
|
export declare function getHeadersObj(headers: Headers): Record<string, string>;
|
2
|
-
export declare function uint8ArrayToArrayBuffer(uint8array: Uint8Array): ArrayBuffer;
|
3
4
|
export declare function defaultHeadersSerializer(headers: Headers, onContentLength?: (value: string) => void): string[];
|
4
5
|
export declare function fakePromise<T>(value: T): Promise<T>;
|
6
|
+
export declare function isArrayBufferView(obj: any): obj is ArrayBufferView;
|
7
|
+
export declare function isNodeReadable(obj: any): obj is Readable;
|
package/typings/utils.d.ts
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
/// <reference types="node" />
|
2
|
+
import { Readable } from 'node:stream';
|
1
3
|
export declare function getHeadersObj(headers: Headers): Record<string, string>;
|
2
|
-
export declare function uint8ArrayToArrayBuffer(uint8array: Uint8Array): ArrayBuffer;
|
3
4
|
export declare function defaultHeadersSerializer(headers: Headers, onContentLength?: (value: string) => void): string[];
|
4
5
|
export declare function fakePromise<T>(value: T): Promise<T>;
|
6
|
+
export declare function isArrayBufferView(obj: any): obj is ArrayBufferView;
|
7
|
+
export declare function isNodeReadable(obj: any): obj is Readable;
|