@whatwg-node/node-fetch 0.5.0-alpha-20230525151657-9630c93 → 0.5.0-alpha-20230529145853-8db501a

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.
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchLegacy = void 0;
4
+ const http_1 = require("http");
5
+ const https_1 = require("https");
6
+ const stream_1 = require("stream");
7
+ const zlib_1 = require("zlib");
8
+ const AbortError_js_1 = require("./AbortError.js");
9
+ const non_http_fetch_js_1 = require("./non-http-fetch.js");
10
+ const Request_js_1 = require("./Request.js");
11
+ const Response_js_1 = require("./Response.js");
12
+ const URL_js_1 = require("./URL.js");
13
+ const utils_js_1 = require("./utils.js");
14
+ function getRequestFnForProtocol(protocol) {
15
+ switch (protocol) {
16
+ case 'http:':
17
+ return http_1.request;
18
+ case 'https:':
19
+ return https_1.request;
20
+ }
21
+ throw new Error(`Unsupported protocol: ${protocol}`);
22
+ }
23
+ function fetchLegacy(info, init) {
24
+ if (typeof info === 'string' || 'href' in info) {
25
+ const ponyfillRequest = new Request_js_1.PonyfillRequest(info, init);
26
+ return fetchLegacy(ponyfillRequest);
27
+ }
28
+ const fetchRequest = info;
29
+ return new Promise((resolve, reject) => {
30
+ try {
31
+ const url = new URL_js_1.PonyfillURL(fetchRequest.url, 'http://localhost');
32
+ if (url.protocol === 'data:') {
33
+ const response = (0, non_http_fetch_js_1.getResponseForDataUri)(url);
34
+ resolve(response);
35
+ return;
36
+ }
37
+ if (url.protocol === 'file:') {
38
+ const response = (0, non_http_fetch_js_1.getResponseForFile)(fetchRequest.url);
39
+ resolve(response);
40
+ return;
41
+ }
42
+ const requestFn = getRequestFnForProtocol(url.protocol);
43
+ const nodeReadable = (fetchRequest.body != null
44
+ ? 'pipe' in fetchRequest.body
45
+ ? fetchRequest.body
46
+ : stream_1.Readable.from(fetchRequest.body)
47
+ : null);
48
+ const headersSerializer = fetchRequest.headersSerializer || utils_js_1.getHeadersObj;
49
+ const nodeHeaders = headersSerializer(fetchRequest.headers);
50
+ const nodeRequest = requestFn(fetchRequest.url, {
51
+ method: fetchRequest.method,
52
+ headers: nodeHeaders,
53
+ signal: fetchRequest.signal,
54
+ });
55
+ // TODO: will be removed after v16 reaches EOL
56
+ fetchRequest.signal?.addEventListener('abort', () => {
57
+ if (!nodeRequest.aborted) {
58
+ nodeRequest.abort();
59
+ }
60
+ });
61
+ // TODO: will be removed after v16 reaches EOL
62
+ nodeRequest.once('abort', (reason) => {
63
+ reject(new AbortError_js_1.PonyfillAbortError(reason));
64
+ });
65
+ nodeRequest.once('response', nodeResponse => {
66
+ let responseBody = nodeResponse;
67
+ const contentEncoding = nodeResponse.headers['content-encoding'];
68
+ switch (contentEncoding) {
69
+ case 'x-gzip':
70
+ case 'gzip':
71
+ responseBody = nodeResponse.pipe((0, zlib_1.createGunzip)());
72
+ break;
73
+ case 'x-deflate':
74
+ case 'deflate':
75
+ responseBody = nodeResponse.pipe((0, zlib_1.createInflate)());
76
+ break;
77
+ case 'br':
78
+ responseBody = nodeResponse.pipe((0, zlib_1.createBrotliDecompress)());
79
+ break;
80
+ }
81
+ if (nodeResponse.headers.location) {
82
+ if (fetchRequest.redirect === 'error') {
83
+ const redirectError = new Error('Redirects are not allowed');
84
+ reject(redirectError);
85
+ nodeResponse.resume();
86
+ return;
87
+ }
88
+ if (fetchRequest.redirect === 'follow') {
89
+ const redirectedUrl = new URL_js_1.PonyfillURL(nodeResponse.headers.location, url);
90
+ const redirectResponse$ = fetchLegacy(redirectedUrl, info);
91
+ resolve(redirectResponse$.then(redirectResponse => {
92
+ redirectResponse.redirected = true;
93
+ return redirectResponse;
94
+ }));
95
+ nodeResponse.resume();
96
+ return;
97
+ }
98
+ }
99
+ const responseHeaders = nodeResponse.headers;
100
+ const ponyfillResponse = new Response_js_1.PonyfillResponse(responseBody, {
101
+ status: nodeResponse.statusCode,
102
+ statusText: nodeResponse.statusMessage,
103
+ headers: responseHeaders,
104
+ url: info.url,
105
+ });
106
+ resolve(ponyfillResponse);
107
+ });
108
+ nodeRequest.once('error', reject);
109
+ if (nodeReadable) {
110
+ nodeReadable.pipe(nodeRequest);
111
+ }
112
+ else {
113
+ nodeRequest.end();
114
+ }
115
+ }
116
+ catch (e) {
117
+ reject(e);
118
+ }
119
+ });
120
+ }
121
+ exports.fetchLegacy = fetchLegacy;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchViaUndici = void 0;
4
+ const stream_1 = require("stream");
5
+ const zlib_1 = require("zlib");
6
+ const undici_1 = require("undici");
7
+ const non_http_fetch_js_1 = require("./non-http-fetch.js");
8
+ const Request_js_1 = require("./Request.js");
9
+ const Response_js_1 = require("./Response.js");
10
+ const URL_js_1 = require("./URL.js");
11
+ const utils_js_1 = require("./utils.js");
12
+ async function fetchViaUndici(info, init) {
13
+ if (typeof info === 'string' || 'href' in info) {
14
+ const ponyfillRequest = new Request_js_1.PonyfillRequest(info, init);
15
+ return fetchViaUndici(ponyfillRequest);
16
+ }
17
+ const fetchRequest = info;
18
+ const url = new URL_js_1.PonyfillURL(fetchRequest.url, 'http://localhost');
19
+ if (url.protocol === 'data:') {
20
+ const response = (0, non_http_fetch_js_1.getResponseForDataUri)(url);
21
+ return response;
22
+ }
23
+ if (url.protocol === 'file:') {
24
+ const response = (0, non_http_fetch_js_1.getResponseForFile)(fetchRequest.url);
25
+ return response;
26
+ }
27
+ const requestBody = (fetchRequest['bodyInit'] != null
28
+ ? fetchRequest['bodyInit']
29
+ : fetchRequest.body != null
30
+ ? 'pipe' in fetchRequest.body
31
+ ? fetchRequest.body
32
+ : stream_1.Readable.from(fetchRequest.body)
33
+ : null);
34
+ const headersSerializer = fetchRequest.headersSerializer || utils_js_1.getHeadersObj;
35
+ const nodeHeaders = headersSerializer(fetchRequest.headers);
36
+ if (requestBody?.[Symbol.toStringTag] === 'FormData') {
37
+ delete nodeHeaders['content-type'];
38
+ }
39
+ const undiciData = await (0, undici_1.request)(fetchRequest.url, {
40
+ method: fetchRequest.method,
41
+ headers: nodeHeaders,
42
+ body: requestBody,
43
+ signal: fetchRequest.signal,
44
+ maxRedirections: fetchRequest.redirect === 'follow' ? 20 : 0,
45
+ });
46
+ if (fetchRequest.redirect === 'error' && undiciData.headers.location) {
47
+ const redirectError = new Error('Redirects are not allowed');
48
+ throw redirectError;
49
+ }
50
+ let responseBody = undiciData.body;
51
+ const contentEncoding = undiciData.headers['content-encoding'];
52
+ switch (contentEncoding) {
53
+ case 'x-gzip':
54
+ case 'gzip':
55
+ responseBody = responseBody.pipe((0, zlib_1.createGunzip)());
56
+ break;
57
+ case 'x-deflate':
58
+ case 'deflate':
59
+ responseBody = responseBody.pipe((0, zlib_1.createInflate)());
60
+ break;
61
+ case 'br':
62
+ responseBody = responseBody.pipe((0, zlib_1.createBrotliDecompress)());
63
+ break;
64
+ }
65
+ const ponyfillResponse = new Response_js_1.PonyfillResponse(responseBody, {
66
+ status: undiciData.statusCode,
67
+ headers: undiciData.headers,
68
+ url: fetchRequest.url,
69
+ });
70
+ return ponyfillResponse;
71
+ }
72
+ exports.fetchViaUndici = fetchViaUndici;
package/cjs/fetch.js CHANGED
@@ -1,100 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fetchPonyfill = void 0;
4
- const fs_1 = require("fs");
5
- const stream_1 = require("stream");
6
- const url_1 = require("url");
7
- const zlib_1 = require("zlib");
8
- const undici_1 = require("undici");
9
- const Blob_js_1 = require("./Blob.js");
10
- const Request_js_1 = require("./Request.js");
11
- const Response_js_1 = require("./Response.js");
12
- const URL_js_1 = require("./URL.js");
13
- const utils_js_1 = require("./utils.js");
14
- function getResponseForFile(url) {
15
- const path = (0, url_1.fileURLToPath)(url);
16
- const readable = (0, fs_1.createReadStream)(path);
17
- return new Response_js_1.PonyfillResponse(readable);
4
+ const fetch_legacy_js_1 = require("./fetch-legacy.js");
5
+ const fetch_undici_js_1 = require("./fetch-undici.js");
6
+ function getNodeMajorVersion() {
7
+ const version = process.version;
8
+ const match = version.match(/^v(\d+)/);
9
+ if (!match) {
10
+ throw new Error(`Unable to parse Node.js version: ${version}`);
11
+ }
12
+ return parseInt(match[1]);
18
13
  }
19
- function getResponseForDataUri(url) {
20
- const [mimeType = 'text/plain', ...datas] = url.pathname.split(',');
21
- const data = decodeURIComponent(datas.join(','));
22
- if (mimeType.endsWith(BASE64_SUFFIX)) {
23
- const buffer = Buffer.from(data, 'base64url');
24
- const realMimeType = mimeType.slice(0, -BASE64_SUFFIX.length);
25
- const file = new Blob_js_1.PonyfillBlob([buffer], { type: realMimeType });
26
- return new Response_js_1.PonyfillResponse(file, {
27
- status: 200,
28
- statusText: 'OK',
29
- });
30
- }
31
- return new Response_js_1.PonyfillResponse(data, {
32
- status: 200,
33
- statusText: 'OK',
34
- headers: {
35
- 'content-type': mimeType,
36
- },
37
- });
38
- }
39
- const BASE64_SUFFIX = ';base64';
40
- async function fetchPonyfill(info, init) {
41
- if (typeof info === 'string' || 'href' in info) {
42
- const ponyfillRequest = new Request_js_1.PonyfillRequest(info, init);
43
- return fetchPonyfill(ponyfillRequest);
44
- }
45
- const fetchRequest = info;
46
- const url = new URL_js_1.PonyfillURL(fetchRequest.url, 'http://localhost');
47
- if (url.protocol === 'data:') {
48
- const response = getResponseForDataUri(url);
49
- return response;
50
- }
51
- if (url.protocol === 'file:') {
52
- const response = getResponseForFile(fetchRequest.url);
53
- return response;
54
- }
55
- const requestBody = (fetchRequest['bodyInit'] != null
56
- ? fetchRequest['bodyInit']
57
- : fetchRequest.body != null
58
- ? 'pipe' in fetchRequest.body
59
- ? fetchRequest.body
60
- : stream_1.Readable.from(fetchRequest.body)
61
- : null);
62
- const headersSerializer = fetchRequest.headersSerializer || utils_js_1.getHeadersObj;
63
- const nodeHeaders = headersSerializer(fetchRequest.headers);
64
- if (requestBody?.[Symbol.toStringTag] === 'FormData') {
65
- delete nodeHeaders['content-type'];
66
- }
67
- const undiciData = await (0, undici_1.request)(fetchRequest.url, {
68
- method: fetchRequest.method,
69
- headers: nodeHeaders,
70
- body: requestBody,
71
- signal: fetchRequest.signal,
72
- maxRedirections: fetchRequest.redirect === 'follow' ? 20 : 0,
73
- });
74
- if (fetchRequest.redirect === 'error' && undiciData.headers.location) {
75
- const redirectError = new Error('Redirects are not allowed');
76
- throw redirectError;
77
- }
78
- let responseBody = undiciData.body;
79
- const contentEncoding = undiciData.headers['content-encoding'];
80
- switch (contentEncoding) {
81
- case 'x-gzip':
82
- case 'gzip':
83
- responseBody = responseBody.pipe((0, zlib_1.createGunzip)());
84
- break;
85
- case 'x-deflate':
86
- case 'deflate':
87
- responseBody = responseBody.pipe((0, zlib_1.createInflate)());
88
- break;
89
- case 'br':
90
- responseBody = responseBody.pipe((0, zlib_1.createBrotliDecompress)());
91
- break;
92
- }
93
- const ponyfillResponse = new Response_js_1.PonyfillResponse(responseBody, {
94
- status: undiciData.statusCode,
95
- headers: undiciData.headers,
96
- url: fetchRequest.url,
97
- });
98
- return ponyfillResponse;
99
- }
100
- exports.fetchPonyfill = fetchPonyfill;
14
+ exports.fetchPonyfill = getNodeMajorVersion() >= 19 ? fetch_undici_js_1.fetchViaUndici : fetch_legacy_js_1.fetchLegacy;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getResponseForDataUri = exports.getResponseForFile = void 0;
4
+ const fs_1 = require("fs");
5
+ const url_1 = require("url");
6
+ const Blob_1 = require("./Blob");
7
+ const Response_1 = require("./Response");
8
+ function getResponseForFile(url) {
9
+ const path = (0, url_1.fileURLToPath)(url);
10
+ const readable = (0, fs_1.createReadStream)(path);
11
+ return new Response_1.PonyfillResponse(readable);
12
+ }
13
+ exports.getResponseForFile = getResponseForFile;
14
+ const BASE64_SUFFIX = ';base64';
15
+ function getResponseForDataUri(url) {
16
+ const [mimeType = 'text/plain', ...datas] = url.pathname.split(',');
17
+ const data = decodeURIComponent(datas.join(','));
18
+ if (mimeType.endsWith(BASE64_SUFFIX)) {
19
+ const buffer = Buffer.from(data, 'base64url');
20
+ const realMimeType = mimeType.slice(0, -BASE64_SUFFIX.length);
21
+ const blob = new Blob_1.PonyfillBlob([buffer], { type: realMimeType });
22
+ return new Response_1.PonyfillResponse(blob, {
23
+ status: 200,
24
+ statusText: 'OK',
25
+ });
26
+ }
27
+ return new Response_1.PonyfillResponse(data, {
28
+ status: 200,
29
+ statusText: 'OK',
30
+ headers: {
31
+ 'content-type': mimeType,
32
+ },
33
+ });
34
+ }
35
+ exports.getResponseForDataUri = getResponseForDataUri;
@@ -0,0 +1,117 @@
1
+ import { request as httpRequest } from 'http';
2
+ import { request as httpsRequest } from 'https';
3
+ import { Readable } from 'stream';
4
+ import { createBrotliDecompress, createGunzip, createInflate } from 'zlib';
5
+ import { PonyfillAbortError } from './AbortError.js';
6
+ import { getResponseForDataUri, getResponseForFile } from './non-http-fetch.js';
7
+ import { PonyfillRequest } from './Request.js';
8
+ import { PonyfillResponse } from './Response.js';
9
+ import { PonyfillURL } from './URL.js';
10
+ import { getHeadersObj } from './utils.js';
11
+ function getRequestFnForProtocol(protocol) {
12
+ switch (protocol) {
13
+ case 'http:':
14
+ return httpRequest;
15
+ case 'https:':
16
+ return httpsRequest;
17
+ }
18
+ throw new Error(`Unsupported protocol: ${protocol}`);
19
+ }
20
+ export function fetchLegacy(info, init) {
21
+ if (typeof info === 'string' || 'href' in info) {
22
+ const ponyfillRequest = new PonyfillRequest(info, init);
23
+ return fetchLegacy(ponyfillRequest);
24
+ }
25
+ const fetchRequest = info;
26
+ return new Promise((resolve, reject) => {
27
+ try {
28
+ const url = new PonyfillURL(fetchRequest.url, 'http://localhost');
29
+ if (url.protocol === 'data:') {
30
+ const response = getResponseForDataUri(url);
31
+ resolve(response);
32
+ return;
33
+ }
34
+ if (url.protocol === 'file:') {
35
+ const response = getResponseForFile(fetchRequest.url);
36
+ resolve(response);
37
+ return;
38
+ }
39
+ const requestFn = getRequestFnForProtocol(url.protocol);
40
+ const nodeReadable = (fetchRequest.body != null
41
+ ? 'pipe' in fetchRequest.body
42
+ ? fetchRequest.body
43
+ : Readable.from(fetchRequest.body)
44
+ : null);
45
+ const headersSerializer = fetchRequest.headersSerializer || getHeadersObj;
46
+ const nodeHeaders = headersSerializer(fetchRequest.headers);
47
+ const nodeRequest = requestFn(fetchRequest.url, {
48
+ method: fetchRequest.method,
49
+ headers: nodeHeaders,
50
+ signal: fetchRequest.signal,
51
+ });
52
+ // TODO: will be removed after v16 reaches EOL
53
+ fetchRequest.signal?.addEventListener('abort', () => {
54
+ if (!nodeRequest.aborted) {
55
+ nodeRequest.abort();
56
+ }
57
+ });
58
+ // TODO: will be removed after v16 reaches EOL
59
+ nodeRequest.once('abort', (reason) => {
60
+ reject(new PonyfillAbortError(reason));
61
+ });
62
+ nodeRequest.once('response', nodeResponse => {
63
+ let responseBody = nodeResponse;
64
+ const contentEncoding = nodeResponse.headers['content-encoding'];
65
+ switch (contentEncoding) {
66
+ case 'x-gzip':
67
+ case 'gzip':
68
+ responseBody = nodeResponse.pipe(createGunzip());
69
+ break;
70
+ case 'x-deflate':
71
+ case 'deflate':
72
+ responseBody = nodeResponse.pipe(createInflate());
73
+ break;
74
+ case 'br':
75
+ responseBody = nodeResponse.pipe(createBrotliDecompress());
76
+ break;
77
+ }
78
+ if (nodeResponse.headers.location) {
79
+ if (fetchRequest.redirect === 'error') {
80
+ const redirectError = new Error('Redirects are not allowed');
81
+ reject(redirectError);
82
+ nodeResponse.resume();
83
+ return;
84
+ }
85
+ if (fetchRequest.redirect === 'follow') {
86
+ const redirectedUrl = new PonyfillURL(nodeResponse.headers.location, url);
87
+ const redirectResponse$ = fetchLegacy(redirectedUrl, info);
88
+ resolve(redirectResponse$.then(redirectResponse => {
89
+ redirectResponse.redirected = true;
90
+ return redirectResponse;
91
+ }));
92
+ nodeResponse.resume();
93
+ return;
94
+ }
95
+ }
96
+ const responseHeaders = nodeResponse.headers;
97
+ const ponyfillResponse = new PonyfillResponse(responseBody, {
98
+ status: nodeResponse.statusCode,
99
+ statusText: nodeResponse.statusMessage,
100
+ headers: responseHeaders,
101
+ url: info.url,
102
+ });
103
+ resolve(ponyfillResponse);
104
+ });
105
+ nodeRequest.once('error', reject);
106
+ if (nodeReadable) {
107
+ nodeReadable.pipe(nodeRequest);
108
+ }
109
+ else {
110
+ nodeRequest.end();
111
+ }
112
+ }
113
+ catch (e) {
114
+ reject(e);
115
+ }
116
+ });
117
+ }
@@ -0,0 +1,68 @@
1
+ import { Readable } from 'stream';
2
+ import { createBrotliDecompress, createGunzip, createInflate } from 'zlib';
3
+ import { request } from 'undici';
4
+ import { getResponseForDataUri, getResponseForFile } from './non-http-fetch.js';
5
+ import { PonyfillRequest } from './Request.js';
6
+ import { PonyfillResponse } from './Response.js';
7
+ import { PonyfillURL } from './URL.js';
8
+ import { getHeadersObj } from './utils.js';
9
+ export async function fetchViaUndici(info, init) {
10
+ if (typeof info === 'string' || 'href' in info) {
11
+ const ponyfillRequest = new PonyfillRequest(info, init);
12
+ return fetchViaUndici(ponyfillRequest);
13
+ }
14
+ const fetchRequest = info;
15
+ const url = new PonyfillURL(fetchRequest.url, 'http://localhost');
16
+ if (url.protocol === 'data:') {
17
+ const response = getResponseForDataUri(url);
18
+ return response;
19
+ }
20
+ if (url.protocol === 'file:') {
21
+ const response = getResponseForFile(fetchRequest.url);
22
+ return response;
23
+ }
24
+ const requestBody = (fetchRequest['bodyInit'] != null
25
+ ? fetchRequest['bodyInit']
26
+ : fetchRequest.body != null
27
+ ? 'pipe' in fetchRequest.body
28
+ ? fetchRequest.body
29
+ : Readable.from(fetchRequest.body)
30
+ : null);
31
+ const headersSerializer = fetchRequest.headersSerializer || getHeadersObj;
32
+ const nodeHeaders = headersSerializer(fetchRequest.headers);
33
+ if (requestBody?.[Symbol.toStringTag] === 'FormData') {
34
+ delete nodeHeaders['content-type'];
35
+ }
36
+ const undiciData = await request(fetchRequest.url, {
37
+ method: fetchRequest.method,
38
+ headers: nodeHeaders,
39
+ body: requestBody,
40
+ signal: fetchRequest.signal,
41
+ maxRedirections: fetchRequest.redirect === 'follow' ? 20 : 0,
42
+ });
43
+ if (fetchRequest.redirect === 'error' && undiciData.headers.location) {
44
+ const redirectError = new Error('Redirects are not allowed');
45
+ throw redirectError;
46
+ }
47
+ let responseBody = undiciData.body;
48
+ const contentEncoding = undiciData.headers['content-encoding'];
49
+ switch (contentEncoding) {
50
+ case 'x-gzip':
51
+ case 'gzip':
52
+ responseBody = responseBody.pipe(createGunzip());
53
+ break;
54
+ case 'x-deflate':
55
+ case 'deflate':
56
+ responseBody = responseBody.pipe(createInflate());
57
+ break;
58
+ case 'br':
59
+ responseBody = responseBody.pipe(createBrotliDecompress());
60
+ break;
61
+ }
62
+ const ponyfillResponse = new PonyfillResponse(responseBody, {
63
+ status: undiciData.statusCode,
64
+ headers: undiciData.headers,
65
+ url: fetchRequest.url,
66
+ });
67
+ return ponyfillResponse;
68
+ }
package/esm/fetch.js CHANGED
@@ -1,96 +1,11 @@
1
- import { createReadStream } from 'fs';
2
- import { Readable } from 'stream';
3
- import { fileURLToPath } from 'url';
4
- import { createBrotliDecompress, createGunzip, createInflate } from 'zlib';
5
- import { request } from 'undici';
6
- import { PonyfillBlob } from './Blob.js';
7
- import { PonyfillRequest } from './Request.js';
8
- import { PonyfillResponse } from './Response.js';
9
- import { PonyfillURL } from './URL.js';
10
- import { getHeadersObj } from './utils.js';
11
- function getResponseForFile(url) {
12
- const path = fileURLToPath(url);
13
- const readable = createReadStream(path);
14
- return new PonyfillResponse(readable);
15
- }
16
- function getResponseForDataUri(url) {
17
- const [mimeType = 'text/plain', ...datas] = url.pathname.split(',');
18
- const data = decodeURIComponent(datas.join(','));
19
- if (mimeType.endsWith(BASE64_SUFFIX)) {
20
- const buffer = Buffer.from(data, 'base64url');
21
- const realMimeType = mimeType.slice(0, -BASE64_SUFFIX.length);
22
- const file = new PonyfillBlob([buffer], { type: realMimeType });
23
- return new PonyfillResponse(file, {
24
- status: 200,
25
- statusText: 'OK',
26
- });
27
- }
28
- return new PonyfillResponse(data, {
29
- status: 200,
30
- statusText: 'OK',
31
- headers: {
32
- 'content-type': mimeType,
33
- },
34
- });
35
- }
36
- const BASE64_SUFFIX = ';base64';
37
- export async function fetchPonyfill(info, init) {
38
- if (typeof info === 'string' || 'href' in info) {
39
- const ponyfillRequest = new PonyfillRequest(info, init);
40
- return fetchPonyfill(ponyfillRequest);
41
- }
42
- const fetchRequest = info;
43
- const url = new PonyfillURL(fetchRequest.url, 'http://localhost');
44
- if (url.protocol === 'data:') {
45
- const response = getResponseForDataUri(url);
46
- return response;
47
- }
48
- if (url.protocol === 'file:') {
49
- const response = getResponseForFile(fetchRequest.url);
50
- return response;
51
- }
52
- const requestBody = (fetchRequest['bodyInit'] != null
53
- ? fetchRequest['bodyInit']
54
- : fetchRequest.body != null
55
- ? 'pipe' in fetchRequest.body
56
- ? fetchRequest.body
57
- : Readable.from(fetchRequest.body)
58
- : null);
59
- const headersSerializer = fetchRequest.headersSerializer || getHeadersObj;
60
- const nodeHeaders = headersSerializer(fetchRequest.headers);
61
- if (requestBody?.[Symbol.toStringTag] === 'FormData') {
62
- delete nodeHeaders['content-type'];
63
- }
64
- const undiciData = await request(fetchRequest.url, {
65
- method: fetchRequest.method,
66
- headers: nodeHeaders,
67
- body: requestBody,
68
- signal: fetchRequest.signal,
69
- maxRedirections: fetchRequest.redirect === 'follow' ? 20 : 0,
70
- });
71
- if (fetchRequest.redirect === 'error' && undiciData.headers.location) {
72
- const redirectError = new Error('Redirects are not allowed');
73
- throw redirectError;
74
- }
75
- let responseBody = undiciData.body;
76
- const contentEncoding = undiciData.headers['content-encoding'];
77
- switch (contentEncoding) {
78
- case 'x-gzip':
79
- case 'gzip':
80
- responseBody = responseBody.pipe(createGunzip());
81
- break;
82
- case 'x-deflate':
83
- case 'deflate':
84
- responseBody = responseBody.pipe(createInflate());
85
- break;
86
- case 'br':
87
- responseBody = responseBody.pipe(createBrotliDecompress());
88
- break;
89
- }
90
- const ponyfillResponse = new PonyfillResponse(responseBody, {
91
- status: undiciData.statusCode,
92
- headers: undiciData.headers,
93
- url: fetchRequest.url,
94
- });
95
- return ponyfillResponse;
1
+ import { fetchLegacy } from './fetch-legacy.js';
2
+ import { fetchViaUndici } from './fetch-undici.js';
3
+ function getNodeMajorVersion() {
4
+ const version = process.version;
5
+ const match = version.match(/^v(\d+)/);
6
+ if (!match) {
7
+ throw new Error(`Unable to parse Node.js version: ${version}`);
8
+ }
9
+ return parseInt(match[1]);
96
10
  }
11
+ export const fetchPonyfill = getNodeMajorVersion() >= 19 ? fetchViaUndici : fetchLegacy;
@@ -0,0 +1,30 @@
1
+ import { createReadStream } from 'fs';
2
+ import { fileURLToPath } from 'url';
3
+ import { PonyfillBlob } from './Blob';
4
+ import { PonyfillResponse } from './Response';
5
+ export function getResponseForFile(url) {
6
+ const path = fileURLToPath(url);
7
+ const readable = createReadStream(path);
8
+ return new PonyfillResponse(readable);
9
+ }
10
+ const BASE64_SUFFIX = ';base64';
11
+ export function getResponseForDataUri(url) {
12
+ const [mimeType = 'text/plain', ...datas] = url.pathname.split(',');
13
+ const data = decodeURIComponent(datas.join(','));
14
+ if (mimeType.endsWith(BASE64_SUFFIX)) {
15
+ const buffer = Buffer.from(data, 'base64url');
16
+ const realMimeType = mimeType.slice(0, -BASE64_SUFFIX.length);
17
+ const blob = new PonyfillBlob([buffer], { type: realMimeType });
18
+ return new PonyfillResponse(blob, {
19
+ status: 200,
20
+ statusText: 'OK',
21
+ });
22
+ }
23
+ return new PonyfillResponse(data, {
24
+ status: 200,
25
+ statusText: 'OK',
26
+ headers: {
27
+ 'content-type': mimeType,
28
+ },
29
+ });
30
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whatwg-node/node-fetch",
3
- "version": "0.5.0-alpha-20230525151657-9630c93",
3
+ "version": "0.5.0-alpha-20230529145853-8db501a",
4
4
  "description": "Fetch API implementation for Node",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
@@ -0,0 +1,3 @@
1
+ import { PonyfillRequest, RequestPonyfillInit } from './Request.cjs';
2
+ import { PonyfillResponse } from './Response.cjs';
3
+ export declare function fetchLegacy<TResponseJSON = any, TRequestJSON = any>(info: string | PonyfillRequest<TRequestJSON> | URL, init?: RequestPonyfillInit): Promise<PonyfillResponse<TResponseJSON>>;
@@ -0,0 +1,3 @@
1
+ import { PonyfillRequest, RequestPonyfillInit } from './Request.js';
2
+ import { PonyfillResponse } from './Response.js';
3
+ export declare function fetchLegacy<TResponseJSON = any, TRequestJSON = any>(info: string | PonyfillRequest<TRequestJSON> | URL, init?: RequestPonyfillInit): Promise<PonyfillResponse<TResponseJSON>>;
@@ -0,0 +1,3 @@
1
+ import { PonyfillRequest, RequestPonyfillInit } from './Request.cjs';
2
+ import { PonyfillResponse } from './Response.cjs';
3
+ export declare function fetchViaUndici<TResponseJSON = any, TRequestJSON = any>(info: string | PonyfillRequest<TRequestJSON> | URL, init?: RequestPonyfillInit): Promise<PonyfillResponse<TResponseJSON>>;
@@ -0,0 +1,3 @@
1
+ import { PonyfillRequest, RequestPonyfillInit } from './Request.js';
2
+ import { PonyfillResponse } from './Response.js';
3
+ export declare function fetchViaUndici<TResponseJSON = any, TRequestJSON = any>(info: string | PonyfillRequest<TRequestJSON> | URL, init?: RequestPonyfillInit): Promise<PonyfillResponse<TResponseJSON>>;
@@ -1,3 +1,3 @@
1
- import { PonyfillRequest, RequestPonyfillInit } from './Request.cjs';
2
- import { PonyfillResponse } from './Response.cjs';
3
- export declare function fetchPonyfill<TResponseJSON = any, TRequestJSON = any>(info: string | PonyfillRequest<TRequestJSON> | URL, init?: RequestPonyfillInit): Promise<PonyfillResponse<TResponseJSON>>;
1
+ import { fetchLegacy } from './fetch-legacy.cjs';
2
+ import { fetchViaUndici } from './fetch-undici.cjs';
3
+ export declare const fetchPonyfill: typeof fetchLegacy | typeof fetchViaUndici;
@@ -1,3 +1,3 @@
1
- import { PonyfillRequest, RequestPonyfillInit } from './Request.js';
2
- import { PonyfillResponse } from './Response.js';
3
- export declare function fetchPonyfill<TResponseJSON = any, TRequestJSON = any>(info: string | PonyfillRequest<TRequestJSON> | URL, init?: RequestPonyfillInit): Promise<PonyfillResponse<TResponseJSON>>;
1
+ import { fetchLegacy } from './fetch-legacy.js';
2
+ import { fetchViaUndici } from './fetch-undici.js';
3
+ export declare const fetchPonyfill: typeof fetchLegacy | typeof fetchViaUndici;
@@ -0,0 +1,3 @@
1
+ import { PonyfillResponse } from './Response';
2
+ export declare function getResponseForFile(url: string): PonyfillResponse<any>;
3
+ export declare function getResponseForDataUri(url: URL): PonyfillResponse<any>;
@@ -0,0 +1,3 @@
1
+ import { PonyfillResponse } from './Response';
2
+ export declare function getResponseForFile(url: string): PonyfillResponse<any>;
3
+ export declare function getResponseForDataUri(url: URL): PonyfillResponse<any>;