@comapeo/map-server 1.0.0-pre.0
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/README.md +610 -0
- package/dist/context.d.ts +46 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +181 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +112 -0
- package/dist/lib/constants.d.ts +7 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +6 -0
- package/dist/lib/download-request.d.ts +17 -0
- package/dist/lib/download-request.d.ts.map +1 -0
- package/dist/lib/download-request.js +113 -0
- package/dist/lib/errors.d.ts +88 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +158 -0
- package/dist/lib/event-stream-response.d.ts +17 -0
- package/dist/lib/event-stream-response.d.ts.map +1 -0
- package/dist/lib/event-stream-response.js +39 -0
- package/dist/lib/event-target.d.ts +9 -0
- package/dist/lib/event-target.d.ts.map +1 -0
- package/dist/lib/event-target.js +4 -0
- package/dist/lib/fetch-api.d.ts +3 -0
- package/dist/lib/fetch-api.d.ts.map +1 -0
- package/dist/lib/fetch-api.js +16 -0
- package/dist/lib/map-share.d.ts +52 -0
- package/dist/lib/map-share.d.ts.map +1 -0
- package/dist/lib/map-share.js +142 -0
- package/dist/lib/secret-stream-fetch.d.ts +7 -0
- package/dist/lib/secret-stream-fetch.d.ts.map +1 -0
- package/dist/lib/secret-stream-fetch.js +34 -0
- package/dist/lib/self-evicting-map.d.ts +16 -0
- package/dist/lib/self-evicting-map.d.ts.map +1 -0
- package/dist/lib/self-evicting-map.js +29 -0
- package/dist/lib/state-update-event.d.ts +8 -0
- package/dist/lib/state-update-event.d.ts.map +1 -0
- package/dist/lib/state-update-event.js +10 -0
- package/dist/lib/utils.d.ts +32 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +96 -0
- package/dist/middlewares/localhost-only.d.ts +11 -0
- package/dist/middlewares/localhost-only.d.ts.map +1 -0
- package/dist/middlewares/localhost-only.js +10 -0
- package/dist/middlewares/parse-request.d.ts +11 -0
- package/dist/middlewares/parse-request.d.ts.map +1 -0
- package/dist/middlewares/parse-request.js +25 -0
- package/dist/routes/downloads.d.ts +15 -0
- package/dist/routes/downloads.d.ts.map +1 -0
- package/dist/routes/downloads.js +60 -0
- package/dist/routes/map-shares.d.ts +19 -0
- package/dist/routes/map-shares.d.ts.map +1 -0
- package/dist/routes/map-shares.js +192 -0
- package/dist/routes/maps.d.ts +6 -0
- package/dist/routes/maps.d.ts.map +1 -0
- package/dist/routes/maps.js +118 -0
- package/dist/routes/root.d.ts +6 -0
- package/dist/routes/root.d.ts.map +1 -0
- package/dist/routes/root.js +29 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +96 -0
- package/node_modules/@envelop/instrumentation/LICENSE +21 -0
- package/node_modules/@envelop/instrumentation/README.md +30 -0
- package/node_modules/@envelop/instrumentation/cjs/index.js +5 -0
- package/node_modules/@envelop/instrumentation/cjs/instrumentation.js +89 -0
- package/node_modules/@envelop/instrumentation/cjs/package.json +1 -0
- package/node_modules/@envelop/instrumentation/esm/index.js +2 -0
- package/node_modules/@envelop/instrumentation/esm/instrumentation.js +82 -0
- package/node_modules/@envelop/instrumentation/package.json +57 -0
- package/node_modules/@envelop/instrumentation/typings/index.d.cts +1 -0
- package/node_modules/@envelop/instrumentation/typings/index.d.ts +1 -0
- package/node_modules/@envelop/instrumentation/typings/instrumentation.d.cts +44 -0
- package/node_modules/@envelop/instrumentation/typings/instrumentation.d.ts +44 -0
- package/node_modules/@whatwg-node/disposablestack/cjs/AsyncDisposableStack.js +73 -0
- package/node_modules/@whatwg-node/disposablestack/cjs/DisposableStack.js +62 -0
- package/node_modules/@whatwg-node/disposablestack/cjs/SupressedError.js +16 -0
- package/node_modules/@whatwg-node/disposablestack/cjs/index.js +11 -0
- package/node_modules/@whatwg-node/disposablestack/cjs/package.json +1 -0
- package/node_modules/@whatwg-node/disposablestack/cjs/symbols.js +20 -0
- package/node_modules/@whatwg-node/disposablestack/cjs/utils.js +11 -0
- package/node_modules/@whatwg-node/disposablestack/esm/AsyncDisposableStack.js +69 -0
- package/node_modules/@whatwg-node/disposablestack/esm/DisposableStack.js +58 -0
- package/node_modules/@whatwg-node/disposablestack/esm/SupressedError.js +12 -0
- package/node_modules/@whatwg-node/disposablestack/esm/index.js +7 -0
- package/node_modules/@whatwg-node/disposablestack/esm/symbols.js +16 -0
- package/node_modules/@whatwg-node/disposablestack/esm/utils.js +7 -0
- package/node_modules/@whatwg-node/disposablestack/package.json +44 -0
- package/node_modules/@whatwg-node/disposablestack/typings/AsyncDisposableStack.d.cts +15 -0
- package/node_modules/@whatwg-node/disposablestack/typings/AsyncDisposableStack.d.ts +15 -0
- package/node_modules/@whatwg-node/disposablestack/typings/DisposableStack.d.cts +14 -0
- package/node_modules/@whatwg-node/disposablestack/typings/DisposableStack.d.ts +14 -0
- package/node_modules/@whatwg-node/disposablestack/typings/SupressedError.d.cts +5 -0
- package/node_modules/@whatwg-node/disposablestack/typings/SupressedError.d.ts +5 -0
- package/node_modules/@whatwg-node/disposablestack/typings/index.d.cts +4 -0
- package/node_modules/@whatwg-node/disposablestack/typings/index.d.ts +4 -0
- package/node_modules/@whatwg-node/disposablestack/typings/symbols.d.cts +5 -0
- package/node_modules/@whatwg-node/disposablestack/typings/symbols.d.ts +5 -0
- package/node_modules/@whatwg-node/disposablestack/typings/utils.d.cts +2 -0
- package/node_modules/@whatwg-node/disposablestack/typings/utils.d.ts +2 -0
- package/node_modules/@whatwg-node/promise-helpers/cjs/index.js +270 -0
- package/node_modules/@whatwg-node/promise-helpers/cjs/package.json +1 -0
- package/node_modules/@whatwg-node/promise-helpers/esm/index.js +257 -0
- package/node_modules/@whatwg-node/promise-helpers/package.json +43 -0
- package/node_modules/@whatwg-node/promise-helpers/typings/index.d.cts +31 -0
- package/node_modules/@whatwg-node/promise-helpers/typings/index.d.ts +31 -0
- package/node_modules/@whatwg-node/server/README.md +590 -0
- package/node_modules/@whatwg-node/server/cjs/createServerAdapter.js +368 -0
- package/node_modules/@whatwg-node/server/cjs/index.js +17 -0
- package/node_modules/@whatwg-node/server/cjs/package.json +1 -0
- package/node_modules/@whatwg-node/server/cjs/plugins/types.js +0 -0
- package/node_modules/@whatwg-node/server/cjs/plugins/useContentEncoding.js +73 -0
- package/node_modules/@whatwg-node/server/cjs/plugins/useCors.js +124 -0
- package/node_modules/@whatwg-node/server/cjs/plugins/useErrorHandling.js +52 -0
- package/node_modules/@whatwg-node/server/cjs/types.js +0 -0
- package/node_modules/@whatwg-node/server/cjs/utils.js +599 -0
- package/node_modules/@whatwg-node/server/cjs/uwebsockets.js +241 -0
- package/node_modules/@whatwg-node/server/esm/createServerAdapter.js +365 -0
- package/node_modules/@whatwg-node/server/esm/index.js +11 -0
- package/node_modules/@whatwg-node/server/esm/plugins/types.js +0 -0
- package/node_modules/@whatwg-node/server/esm/plugins/useContentEncoding.js +70 -0
- package/node_modules/@whatwg-node/server/esm/plugins/useCors.js +120 -0
- package/node_modules/@whatwg-node/server/esm/plugins/useErrorHandling.js +46 -0
- package/node_modules/@whatwg-node/server/esm/types.js +0 -0
- package/node_modules/@whatwg-node/server/esm/utils.js +588 -0
- package/node_modules/@whatwg-node/server/esm/uwebsockets.js +234 -0
- package/node_modules/@whatwg-node/server/package.json +46 -0
- package/node_modules/@whatwg-node/server/typings/createServerAdapter.d.cts +19 -0
- package/node_modules/@whatwg-node/server/typings/createServerAdapter.d.ts +19 -0
- package/node_modules/@whatwg-node/server/typings/index.d.cts +11 -0
- package/node_modules/@whatwg-node/server/typings/index.d.ts +11 -0
- package/node_modules/@whatwg-node/server/typings/plugins/types.d.cts +76 -0
- package/node_modules/@whatwg-node/server/typings/plugins/types.d.ts +76 -0
- package/node_modules/@whatwg-node/server/typings/plugins/useContentEncoding.d.cts +2 -0
- package/node_modules/@whatwg-node/server/typings/plugins/useContentEncoding.d.ts +2 -0
- package/node_modules/@whatwg-node/server/typings/plugins/useCors.d.cts +14 -0
- package/node_modules/@whatwg-node/server/typings/plugins/useCors.d.ts +14 -0
- package/node_modules/@whatwg-node/server/typings/plugins/useErrorHandling.d.cts +13 -0
- package/node_modules/@whatwg-node/server/typings/plugins/useErrorHandling.d.ts +13 -0
- package/node_modules/@whatwg-node/server/typings/types.d.cts +100 -0
- package/node_modules/@whatwg-node/server/typings/types.d.ts +100 -0
- package/node_modules/@whatwg-node/server/typings/utils.d.cts +42 -0
- package/node_modules/@whatwg-node/server/typings/utils.d.ts +42 -0
- package/node_modules/@whatwg-node/server/typings/uwebsockets.d.cts +32 -0
- package/node_modules/@whatwg-node/server/typings/uwebsockets.d.ts +32 -0
- package/node_modules/tslib/CopyrightNotice.txt +15 -0
- package/node_modules/tslib/LICENSE.txt +12 -0
- package/node_modules/tslib/README.md +164 -0
- package/node_modules/tslib/SECURITY.md +41 -0
- package/node_modules/tslib/modules/index.d.ts +38 -0
- package/node_modules/tslib/modules/index.js +70 -0
- package/node_modules/tslib/modules/package.json +3 -0
- package/node_modules/tslib/package.json +47 -0
- package/node_modules/tslib/tslib.d.ts +460 -0
- package/node_modules/tslib/tslib.es6.html +1 -0
- package/node_modules/tslib/tslib.es6.js +402 -0
- package/node_modules/tslib/tslib.es6.mjs +401 -0
- package/node_modules/tslib/tslib.html +1 -0
- package/node_modules/tslib/tslib.js +484 -0
- package/package.json +87 -0
- package/src/context.ts +203 -0
- package/src/index.ts +193 -0
- package/src/lib/constants.ts +6 -0
- package/src/lib/download-request.ts +142 -0
- package/src/lib/errors.ts +187 -0
- package/src/lib/event-stream-response.ts +57 -0
- package/src/lib/event-target.ts +11 -0
- package/src/lib/fetch-api.ts +18 -0
- package/src/lib/map-share.ts +185 -0
- package/src/lib/secret-stream-fetch.ts +42 -0
- package/src/lib/self-evicting-map.ts +35 -0
- package/src/lib/state-update-event.ts +14 -0
- package/src/lib/utils.ts +110 -0
- package/src/middlewares/localhost-only.ts +16 -0
- package/src/middlewares/parse-request.ts +34 -0
- package/src/routes/downloads.ts +92 -0
- package/src/routes/map-shares.ts +246 -0
- package/src/routes/maps.ts +146 -0
- package/src/routes/root.ts +37 -0
- package/src/types.ts +152 -0
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decompressedResponseMap = exports.iterateAsyncVoid = exports.createDeferredPromise = exports.isPromise = void 0;
|
|
4
|
+
exports.isAsyncIterable = isAsyncIterable;
|
|
5
|
+
exports.normalizeNodeRequest = normalizeNodeRequest;
|
|
6
|
+
exports.isReadable = isReadable;
|
|
7
|
+
exports.isNodeRequest = isNodeRequest;
|
|
8
|
+
exports.isServerResponse = isServerResponse;
|
|
9
|
+
exports.isReadableStream = isReadableStream;
|
|
10
|
+
exports.isFetchEvent = isFetchEvent;
|
|
11
|
+
exports.sendNodeResponse = sendNodeResponse;
|
|
12
|
+
exports.isRequestInit = isRequestInit;
|
|
13
|
+
exports.completeAssign = completeAssign;
|
|
14
|
+
exports.handleErrorFromRequestHandler = handleErrorFromRequestHandler;
|
|
15
|
+
exports.isolateObject = isolateObject;
|
|
16
|
+
exports.handleAbortSignalAndPromiseResponse = handleAbortSignalAndPromiseResponse;
|
|
17
|
+
exports.getSupportedEncodings = getSupportedEncodings;
|
|
18
|
+
exports.handleResponseDecompression = handleResponseDecompression;
|
|
19
|
+
exports.ensureDisposableStackRegisteredForTerminateEvents = ensureDisposableStackRegisteredForTerminateEvents;
|
|
20
|
+
exports.createCustomAbortControllerSignal = createCustomAbortControllerSignal;
|
|
21
|
+
const promise_helpers_1 = require("@whatwg-node/promise-helpers");
|
|
22
|
+
Object.defineProperty(exports, "createDeferredPromise", { enumerable: true, get: function () { return promise_helpers_1.createDeferredPromise; } });
|
|
23
|
+
Object.defineProperty(exports, "isPromise", { enumerable: true, get: function () { return promise_helpers_1.isPromise; } });
|
|
24
|
+
function isAsyncIterable(body) {
|
|
25
|
+
return (body != null && typeof body === 'object' && typeof body[Symbol.asyncIterator] === 'function');
|
|
26
|
+
}
|
|
27
|
+
function getPort(nodeRequest) {
|
|
28
|
+
if (nodeRequest.socket?.localPort) {
|
|
29
|
+
return nodeRequest.socket?.localPort;
|
|
30
|
+
}
|
|
31
|
+
const hostInHeader = nodeRequest.headers?.[':authority'] || nodeRequest.headers?.host;
|
|
32
|
+
const portInHeader = hostInHeader?.split(':')?.[1];
|
|
33
|
+
if (portInHeader) {
|
|
34
|
+
return portInHeader;
|
|
35
|
+
}
|
|
36
|
+
return 80;
|
|
37
|
+
}
|
|
38
|
+
function getHostnameWithPort(nodeRequest) {
|
|
39
|
+
if (nodeRequest.headers?.[':authority']) {
|
|
40
|
+
return nodeRequest.headers?.[':authority'];
|
|
41
|
+
}
|
|
42
|
+
if (nodeRequest.headers?.host) {
|
|
43
|
+
return nodeRequest.headers?.host;
|
|
44
|
+
}
|
|
45
|
+
const port = getPort(nodeRequest);
|
|
46
|
+
if (nodeRequest.hostname) {
|
|
47
|
+
return nodeRequest.hostname + ':' + port;
|
|
48
|
+
}
|
|
49
|
+
const localIp = nodeRequest.socket?.localAddress;
|
|
50
|
+
if (localIp && !localIp?.includes('::') && !localIp?.includes('ffff')) {
|
|
51
|
+
return `${localIp}:${port}`;
|
|
52
|
+
}
|
|
53
|
+
return 'localhost';
|
|
54
|
+
}
|
|
55
|
+
function buildFullUrl(nodeRequest) {
|
|
56
|
+
const hostnameWithPort = getHostnameWithPort(nodeRequest);
|
|
57
|
+
const protocol = nodeRequest.protocol || (nodeRequest.socket?.encrypted ? 'https' : 'http');
|
|
58
|
+
const endpoint = nodeRequest.originalUrl || nodeRequest.url || '/graphql';
|
|
59
|
+
return `${protocol}://${hostnameWithPort}${endpoint}`;
|
|
60
|
+
}
|
|
61
|
+
function isRequestBody(body) {
|
|
62
|
+
const stringTag = body[Symbol.toStringTag];
|
|
63
|
+
if (typeof body === 'string' ||
|
|
64
|
+
stringTag === 'Uint8Array' ||
|
|
65
|
+
stringTag === 'Blob' ||
|
|
66
|
+
stringTag === 'FormData' ||
|
|
67
|
+
stringTag === 'URLSearchParams' ||
|
|
68
|
+
isAsyncIterable(body)) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
function normalizeNodeRequest(nodeRequest, fetchAPI, nodeResponse, __useCustomAbortCtrl) {
|
|
74
|
+
const rawRequest = nodeRequest.raw || nodeRequest.req || nodeRequest;
|
|
75
|
+
let fullUrl = buildFullUrl(rawRequest);
|
|
76
|
+
if (nodeRequest.query) {
|
|
77
|
+
const url = new fetchAPI.URL(fullUrl);
|
|
78
|
+
for (const key in nodeRequest.query) {
|
|
79
|
+
url.searchParams.set(key, nodeRequest.query[key]);
|
|
80
|
+
}
|
|
81
|
+
fullUrl = url.toString();
|
|
82
|
+
}
|
|
83
|
+
let normalizedHeaders = nodeRequest.headers;
|
|
84
|
+
if (nodeRequest.headers?.[':method']) {
|
|
85
|
+
normalizedHeaders = {};
|
|
86
|
+
for (const key in nodeRequest.headers) {
|
|
87
|
+
if (!key.startsWith(':')) {
|
|
88
|
+
normalizedHeaders[key] = nodeRequest.headers[key];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const controller = __useCustomAbortCtrl
|
|
93
|
+
? createCustomAbortControllerSignal()
|
|
94
|
+
: new AbortController();
|
|
95
|
+
if (nodeResponse?.once) {
|
|
96
|
+
const closeEventListener = () => {
|
|
97
|
+
if (!controller.signal.aborted) {
|
|
98
|
+
Object.defineProperty(rawRequest, 'aborted', { value: true });
|
|
99
|
+
controller.abort(nodeResponse.errored ?? undefined);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
nodeResponse.once('error', closeEventListener);
|
|
103
|
+
nodeResponse.once('close', closeEventListener);
|
|
104
|
+
nodeResponse.once('finish', () => {
|
|
105
|
+
nodeResponse.removeListener('close', closeEventListener);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (nodeRequest.method === 'GET' || nodeRequest.method === 'HEAD') {
|
|
109
|
+
return new fetchAPI.Request(fullUrl, {
|
|
110
|
+
method: nodeRequest.method,
|
|
111
|
+
headers: normalizedHeaders,
|
|
112
|
+
signal: controller.signal,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Some Node server frameworks like Serverless Express sends a dummy object with body but as a Buffer not string
|
|
117
|
+
* so we do those checks to see is there something we can use directly as BodyInit
|
|
118
|
+
* because the presence of body means the request stream is already consumed and,
|
|
119
|
+
* rawRequest cannot be used as BodyInit/ReadableStream by Fetch API in this case.
|
|
120
|
+
*/
|
|
121
|
+
const maybeParsedBody = nodeRequest.body;
|
|
122
|
+
if (maybeParsedBody != null && Object.keys(maybeParsedBody).length > 0) {
|
|
123
|
+
if (isRequestBody(maybeParsedBody)) {
|
|
124
|
+
return new fetchAPI.Request(fullUrl, {
|
|
125
|
+
method: nodeRequest.method || 'GET',
|
|
126
|
+
headers: normalizedHeaders,
|
|
127
|
+
body: maybeParsedBody,
|
|
128
|
+
signal: controller.signal,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const request = new fetchAPI.Request(fullUrl, {
|
|
132
|
+
method: nodeRequest.method || 'GET',
|
|
133
|
+
headers: normalizedHeaders,
|
|
134
|
+
signal: controller.signal,
|
|
135
|
+
});
|
|
136
|
+
if (!request.headers.get('content-type')?.includes('json')) {
|
|
137
|
+
request.headers.set('content-type', 'application/json; charset=utf-8');
|
|
138
|
+
}
|
|
139
|
+
return new Proxy(request, {
|
|
140
|
+
get: (target, prop, receiver) => {
|
|
141
|
+
switch (prop) {
|
|
142
|
+
case 'json':
|
|
143
|
+
return () => (0, promise_helpers_1.fakePromise)(maybeParsedBody);
|
|
144
|
+
case 'text':
|
|
145
|
+
return () => (0, promise_helpers_1.fakePromise)(JSON.stringify(maybeParsedBody));
|
|
146
|
+
default:
|
|
147
|
+
if (globalThis.Bun) {
|
|
148
|
+
// workaround for https://github.com/oven-sh/bun/issues/12368
|
|
149
|
+
// Proxy.get doesn't seem to get `receiver` correctly
|
|
150
|
+
return Reflect.get(target, prop);
|
|
151
|
+
}
|
|
152
|
+
return Reflect.get(target, prop, receiver);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// perf: instead of spreading the object, we can just pass it as is and it performs better
|
|
158
|
+
return new fetchAPI.Request(fullUrl, {
|
|
159
|
+
method: nodeRequest.method,
|
|
160
|
+
headers: normalizedHeaders,
|
|
161
|
+
signal: controller.signal,
|
|
162
|
+
// @ts-expect-error - AsyncIterable is supported as body
|
|
163
|
+
body: rawRequest,
|
|
164
|
+
duplex: 'half',
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function isReadable(stream) {
|
|
168
|
+
return stream.read != null;
|
|
169
|
+
}
|
|
170
|
+
function isNodeRequest(request) {
|
|
171
|
+
return isReadable(request);
|
|
172
|
+
}
|
|
173
|
+
function isServerResponse(stream) {
|
|
174
|
+
// Check all used functions are defined
|
|
175
|
+
return (stream != null &&
|
|
176
|
+
stream.setHeader != null &&
|
|
177
|
+
stream.end != null &&
|
|
178
|
+
stream.once != null &&
|
|
179
|
+
stream.write != null);
|
|
180
|
+
}
|
|
181
|
+
function isReadableStream(stream) {
|
|
182
|
+
return stream != null && stream.getReader != null;
|
|
183
|
+
}
|
|
184
|
+
function isFetchEvent(event) {
|
|
185
|
+
return event != null && event.request != null && event.respondWith != null;
|
|
186
|
+
}
|
|
187
|
+
function configureSocket(rawRequest) {
|
|
188
|
+
rawRequest?.socket?.setTimeout?.(0);
|
|
189
|
+
rawRequest?.socket?.setNoDelay?.(true);
|
|
190
|
+
rawRequest?.socket?.setKeepAlive?.(true);
|
|
191
|
+
}
|
|
192
|
+
function endResponse(serverResponse) {
|
|
193
|
+
// @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
|
|
194
|
+
serverResponse.end(null, null, null);
|
|
195
|
+
}
|
|
196
|
+
function sendAsyncIterable(serverResponse, asyncIterable) {
|
|
197
|
+
let closed = false;
|
|
198
|
+
const closeEventListener = () => {
|
|
199
|
+
closed = true;
|
|
200
|
+
};
|
|
201
|
+
serverResponse.once('error', closeEventListener);
|
|
202
|
+
serverResponse.once('close', closeEventListener);
|
|
203
|
+
serverResponse.once('finish', () => {
|
|
204
|
+
serverResponse.removeListener('close', closeEventListener);
|
|
205
|
+
serverResponse.removeListener('error', closeEventListener);
|
|
206
|
+
});
|
|
207
|
+
const iterator = asyncIterable[Symbol.asyncIterator]();
|
|
208
|
+
const pump = () => iterator.next().then(({ done, value }) => {
|
|
209
|
+
if (closed || done) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
return (0, promise_helpers_1.handleMaybePromise)(() => safeWrite(value, serverResponse), () => (closed ? endResponse(serverResponse) : pump()));
|
|
213
|
+
});
|
|
214
|
+
return pump();
|
|
215
|
+
}
|
|
216
|
+
function safeWrite(chunk, serverResponse) {
|
|
217
|
+
// @ts-expect-error http and http2 writes are actually compatible
|
|
218
|
+
const result = serverResponse.write(chunk);
|
|
219
|
+
if (!result) {
|
|
220
|
+
return new Promise(resolve => serverResponse.once('drain', resolve));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const isNode1x = globalThis.process?.versions?.node?.startsWith('1');
|
|
224
|
+
function sendNodeResponse(fetchResponse, serverResponse, nodeRequest, __useSingleWriteHead) {
|
|
225
|
+
if (serverResponse.closed || serverResponse.destroyed || serverResponse.writableEnded) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (!fetchResponse) {
|
|
229
|
+
serverResponse.statusCode = 404;
|
|
230
|
+
endResponse(serverResponse);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (__useSingleWriteHead &&
|
|
234
|
+
// @ts-expect-error - headersInit is a private property
|
|
235
|
+
fetchResponse.headers?.headersInit &&
|
|
236
|
+
// @ts-expect-error - headersInit is a private property
|
|
237
|
+
!Array.isArray(fetchResponse.headers.headersInit) &&
|
|
238
|
+
// @ts-expect-error - headersInit is a private property
|
|
239
|
+
!fetchResponse.headers.headersInit.get &&
|
|
240
|
+
// @ts-expect-error - map is a private property
|
|
241
|
+
!fetchResponse.headers._map &&
|
|
242
|
+
// @ts-expect-error - _setCookies is a private property
|
|
243
|
+
!fetchResponse.headers._setCookies?.length) {
|
|
244
|
+
// @ts-expect-error - writeHead accepts headers object
|
|
245
|
+
serverResponse.writeHead(fetchResponse.status, fetchResponse.statusText,
|
|
246
|
+
// @ts-expect-error - headersInit is a private property
|
|
247
|
+
fetchResponse.headers.headersInit);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// Avoid using `setHeaders` on Node.js 18 as it is broken with multiple headers with the same name
|
|
251
|
+
// @ts-expect-error - setHeaders exist
|
|
252
|
+
if (serverResponse.setHeaders && !isNode1x) {
|
|
253
|
+
// @ts-expect-error - writeHead bad typings
|
|
254
|
+
serverResponse.setHeaders(fetchResponse.headers);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
let setCookiesSet = false;
|
|
258
|
+
fetchResponse.headers.forEach((value, key) => {
|
|
259
|
+
if (key === 'set-cookie') {
|
|
260
|
+
if (setCookiesSet) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
setCookiesSet = true;
|
|
264
|
+
const setCookies = fetchResponse.headers.getSetCookie?.();
|
|
265
|
+
if (setCookies) {
|
|
266
|
+
serverResponse.setHeader('set-cookie', setCookies);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
serverResponse.setHeader(key, value);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
// @ts-expect-error - writeHead bad typings
|
|
274
|
+
serverResponse.writeHead(fetchResponse.status, fetchResponse.statusText);
|
|
275
|
+
}
|
|
276
|
+
// @ts-expect-error - Handle the case where the response is a string
|
|
277
|
+
if (fetchResponse['bodyType'] === 'String') {
|
|
278
|
+
return (0, promise_helpers_1.handleMaybePromise)(
|
|
279
|
+
// @ts-expect-error - bodyInit is a private property
|
|
280
|
+
() => safeWrite(fetchResponse.bodyInit, serverResponse), () => endResponse(serverResponse));
|
|
281
|
+
}
|
|
282
|
+
// Optimizations for node-fetch
|
|
283
|
+
const bufOfRes =
|
|
284
|
+
// @ts-expect-error - _buffer is a private property
|
|
285
|
+
fetchResponse._buffer;
|
|
286
|
+
if (bufOfRes) {
|
|
287
|
+
return (0, promise_helpers_1.handleMaybePromise)(() => safeWrite(bufOfRes, serverResponse), () => endResponse(serverResponse));
|
|
288
|
+
}
|
|
289
|
+
// Other fetch implementations
|
|
290
|
+
const fetchBody = fetchResponse.body;
|
|
291
|
+
if (fetchBody == null) {
|
|
292
|
+
endResponse(serverResponse);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
if (
|
|
296
|
+
// @ts-expect-error - Uint8Array is a valid body type
|
|
297
|
+
fetchBody[Symbol.toStringTag] === 'Uint8Array') {
|
|
298
|
+
return (0, promise_helpers_1.handleMaybePromise)(() => safeWrite(fetchBody, serverResponse), () => endResponse(serverResponse));
|
|
299
|
+
}
|
|
300
|
+
configureSocket(nodeRequest);
|
|
301
|
+
if (isReadable(fetchBody)) {
|
|
302
|
+
serverResponse.once('close', () => {
|
|
303
|
+
fetchBody.destroy();
|
|
304
|
+
});
|
|
305
|
+
fetchBody.pipe(serverResponse, {
|
|
306
|
+
end: true,
|
|
307
|
+
});
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
if (isReadableStream(fetchBody)) {
|
|
311
|
+
return sendReadableStream(nodeRequest, serverResponse, fetchBody);
|
|
312
|
+
}
|
|
313
|
+
if (isAsyncIterable(fetchBody)) {
|
|
314
|
+
return sendAsyncIterable(serverResponse, fetchBody);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
function sendReadableStream(nodeRequest, serverResponse, readableStream) {
|
|
318
|
+
const reader = readableStream.getReader();
|
|
319
|
+
nodeRequest?.once?.('error', err => {
|
|
320
|
+
reader.cancel(err);
|
|
321
|
+
});
|
|
322
|
+
function pump() {
|
|
323
|
+
return reader
|
|
324
|
+
.read()
|
|
325
|
+
.then(({ done, value }) => done
|
|
326
|
+
? endResponse(serverResponse)
|
|
327
|
+
: (0, promise_helpers_1.handleMaybePromise)(() => safeWrite(value, serverResponse), pump));
|
|
328
|
+
}
|
|
329
|
+
return pump();
|
|
330
|
+
}
|
|
331
|
+
function isRequestInit(val) {
|
|
332
|
+
return (val != null &&
|
|
333
|
+
typeof val === 'object' &&
|
|
334
|
+
('body' in val ||
|
|
335
|
+
'cache' in val ||
|
|
336
|
+
'credentials' in val ||
|
|
337
|
+
'headers' in val ||
|
|
338
|
+
'integrity' in val ||
|
|
339
|
+
'keepalive' in val ||
|
|
340
|
+
'method' in val ||
|
|
341
|
+
'mode' in val ||
|
|
342
|
+
'redirect' in val ||
|
|
343
|
+
'referrer' in val ||
|
|
344
|
+
'referrerPolicy' in val ||
|
|
345
|
+
'signal' in val ||
|
|
346
|
+
'window' in val));
|
|
347
|
+
}
|
|
348
|
+
// from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#copying_accessors
|
|
349
|
+
function completeAssign(...args) {
|
|
350
|
+
const [target, ...sources] = args.filter(arg => arg != null && typeof arg === 'object');
|
|
351
|
+
sources.forEach(source => {
|
|
352
|
+
// modified Object.keys to Object.getOwnPropertyNames
|
|
353
|
+
// because Object.keys only returns enumerable properties
|
|
354
|
+
const descriptors = Object.getOwnPropertyNames(source).reduce((descriptors, key) => {
|
|
355
|
+
const descriptor = Object.getOwnPropertyDescriptor(source, key);
|
|
356
|
+
if (descriptor) {
|
|
357
|
+
descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
|
|
358
|
+
}
|
|
359
|
+
return descriptors;
|
|
360
|
+
}, {});
|
|
361
|
+
// By default, Object.assign copies enumerable Symbols, too
|
|
362
|
+
Object.getOwnPropertySymbols(source).forEach(sym => {
|
|
363
|
+
const descriptor = Object.getOwnPropertyDescriptor(source, sym);
|
|
364
|
+
if (descriptor?.enumerable) {
|
|
365
|
+
descriptors[sym] = descriptor;
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
Object.defineProperties(target, descriptors);
|
|
369
|
+
});
|
|
370
|
+
return target;
|
|
371
|
+
}
|
|
372
|
+
var promise_helpers_2 = require("@whatwg-node/promise-helpers");
|
|
373
|
+
Object.defineProperty(exports, "iterateAsyncVoid", { enumerable: true, get: function () { return promise_helpers_2.iterateAsyncVoid; } });
|
|
374
|
+
function handleErrorFromRequestHandler(error, ResponseCtor) {
|
|
375
|
+
return new ResponseCtor(error.stack || error.message || error.toString(), {
|
|
376
|
+
status: error.status || 500,
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
function isolateObject(originalCtx, waitUntilFn) {
|
|
380
|
+
if (originalCtx == null) {
|
|
381
|
+
if (waitUntilFn == null) {
|
|
382
|
+
return {};
|
|
383
|
+
}
|
|
384
|
+
return {
|
|
385
|
+
waitUntil: waitUntilFn,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
return completeAssign(Object.create(originalCtx), {
|
|
389
|
+
waitUntil: waitUntilFn,
|
|
390
|
+
}, originalCtx);
|
|
391
|
+
}
|
|
392
|
+
function handleAbortSignalAndPromiseResponse(response$, abortSignal) {
|
|
393
|
+
if (abortSignal?.aborted) {
|
|
394
|
+
throw abortSignal.reason;
|
|
395
|
+
}
|
|
396
|
+
if ((0, promise_helpers_1.isPromise)(response$) && abortSignal) {
|
|
397
|
+
const deferred$ = (0, promise_helpers_1.createDeferredPromise)();
|
|
398
|
+
function abortSignalFetchErrorHandler() {
|
|
399
|
+
deferred$.reject(abortSignal.reason);
|
|
400
|
+
}
|
|
401
|
+
abortSignal.addEventListener('abort', abortSignalFetchErrorHandler, { once: true });
|
|
402
|
+
response$
|
|
403
|
+
.then(function fetchSuccessHandler(res) {
|
|
404
|
+
deferred$.resolve(res);
|
|
405
|
+
})
|
|
406
|
+
.catch(function fetchErrorHandler(err) {
|
|
407
|
+
deferred$.reject(err);
|
|
408
|
+
})
|
|
409
|
+
.finally(() => {
|
|
410
|
+
abortSignal.removeEventListener('abort', abortSignalFetchErrorHandler);
|
|
411
|
+
});
|
|
412
|
+
return deferred$.promise;
|
|
413
|
+
}
|
|
414
|
+
return response$;
|
|
415
|
+
}
|
|
416
|
+
exports.decompressedResponseMap = new WeakMap();
|
|
417
|
+
const supportedEncodingsByFetchAPI = new WeakMap();
|
|
418
|
+
function getSupportedEncodings(fetchAPI) {
|
|
419
|
+
let supportedEncodings = supportedEncodingsByFetchAPI.get(fetchAPI);
|
|
420
|
+
if (!supportedEncodings) {
|
|
421
|
+
const possibleEncodings = [
|
|
422
|
+
'deflate',
|
|
423
|
+
'gzip',
|
|
424
|
+
'deflate-raw',
|
|
425
|
+
'br',
|
|
426
|
+
'zstd',
|
|
427
|
+
];
|
|
428
|
+
if (fetchAPI.DecompressionStream?.['supportedFormats']) {
|
|
429
|
+
supportedEncodings = fetchAPI.DecompressionStream['supportedFormats'];
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
supportedEncodings = possibleEncodings.filter(encoding => {
|
|
433
|
+
// deflate-raw is not supported in Node.js >v20
|
|
434
|
+
if (globalThis.process?.version?.startsWith('v2') &&
|
|
435
|
+
fetchAPI.DecompressionStream === globalThis.DecompressionStream &&
|
|
436
|
+
encoding === 'deflate-raw') {
|
|
437
|
+
return false;
|
|
438
|
+
}
|
|
439
|
+
try {
|
|
440
|
+
// eslint-disable-next-line no-new
|
|
441
|
+
new fetchAPI.DecompressionStream(encoding);
|
|
442
|
+
return true;
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
supportedEncodingsByFetchAPI.set(fetchAPI, supportedEncodings);
|
|
450
|
+
}
|
|
451
|
+
return supportedEncodings;
|
|
452
|
+
}
|
|
453
|
+
function handleResponseDecompression(response, fetchAPI) {
|
|
454
|
+
const contentEncodingHeader = response?.headers.get('content-encoding');
|
|
455
|
+
if (!contentEncodingHeader || contentEncodingHeader === 'none') {
|
|
456
|
+
return response;
|
|
457
|
+
}
|
|
458
|
+
if (!response?.body) {
|
|
459
|
+
return response;
|
|
460
|
+
}
|
|
461
|
+
let decompressedResponse = exports.decompressedResponseMap.get(response);
|
|
462
|
+
if (!decompressedResponse || decompressedResponse.bodyUsed) {
|
|
463
|
+
let decompressedBody = response.body;
|
|
464
|
+
const contentEncodings = contentEncodingHeader.split(',');
|
|
465
|
+
if (!contentEncodings.every(encoding => getSupportedEncodings(fetchAPI).includes(encoding))) {
|
|
466
|
+
return new fetchAPI.Response(`Unsupported 'Content-Encoding': ${contentEncodingHeader}`, {
|
|
467
|
+
status: 415,
|
|
468
|
+
statusText: 'Unsupported Media Type',
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
for (const contentEncoding of contentEncodings) {
|
|
472
|
+
decompressedBody = decompressedBody.pipeThrough(new fetchAPI.DecompressionStream(contentEncoding));
|
|
473
|
+
}
|
|
474
|
+
decompressedResponse = new fetchAPI.Response(decompressedBody, response);
|
|
475
|
+
exports.decompressedResponseMap.set(response, decompressedResponse);
|
|
476
|
+
}
|
|
477
|
+
return decompressedResponse;
|
|
478
|
+
}
|
|
479
|
+
const terminateEvents = ['SIGINT', 'exit', 'SIGTERM'];
|
|
480
|
+
const disposableStacks = new Set();
|
|
481
|
+
let eventListenerRegistered = false;
|
|
482
|
+
function ensureEventListenerForDisposableStacks() {
|
|
483
|
+
if (eventListenerRegistered) {
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
eventListenerRegistered = true;
|
|
487
|
+
for (const event of terminateEvents) {
|
|
488
|
+
globalThis.process.once(event, function terminateHandler() {
|
|
489
|
+
return Promise.allSettled([...disposableStacks].map(stack => !stack.disposed && stack.disposeAsync()));
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
function ensureDisposableStackRegisteredForTerminateEvents(disposableStack) {
|
|
494
|
+
if (globalThis.process) {
|
|
495
|
+
ensureEventListenerForDisposableStacks();
|
|
496
|
+
if (!disposableStacks.has(disposableStack)) {
|
|
497
|
+
disposableStacks.add(disposableStack);
|
|
498
|
+
disposableStack.defer(() => {
|
|
499
|
+
disposableStacks.delete(disposableStack);
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
class CustomAbortControllerSignal extends EventTarget {
|
|
505
|
+
aborted = false;
|
|
506
|
+
_onabort = null;
|
|
507
|
+
_reason;
|
|
508
|
+
constructor() {
|
|
509
|
+
super();
|
|
510
|
+
const nodeEvents = globalThis.process?.getBuiltinModule?.('node:events');
|
|
511
|
+
// @ts-expect-error - We know kMaxEventTargetListeners is available in node:events
|
|
512
|
+
if (nodeEvents?.kMaxEventTargetListeners) {
|
|
513
|
+
// @ts-expect-error - See https://github.com/nodejs/node/pull/55816/files#diff-03bd4f07a1006cb0daaddced702858751b20f5ab7681cb0719c1b1d80d6ca05cR31
|
|
514
|
+
this[nodeEvents.kMaxEventTargetListeners] = 0;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
throwIfAborted() {
|
|
518
|
+
if (this._nativeCtrl?.signal?.throwIfAborted) {
|
|
519
|
+
return this._nativeCtrl.signal.throwIfAborted();
|
|
520
|
+
}
|
|
521
|
+
if (this.aborted) {
|
|
522
|
+
throw this._reason;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
_nativeCtrl;
|
|
526
|
+
ensureNativeCtrl() {
|
|
527
|
+
if (!this._nativeCtrl) {
|
|
528
|
+
const isAborted = this.aborted;
|
|
529
|
+
this._nativeCtrl = new AbortController();
|
|
530
|
+
if (isAborted) {
|
|
531
|
+
this._nativeCtrl.abort(this._reason);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return this._nativeCtrl;
|
|
535
|
+
}
|
|
536
|
+
abort(reason) {
|
|
537
|
+
if (this._nativeCtrl?.abort) {
|
|
538
|
+
return this._nativeCtrl?.abort(reason);
|
|
539
|
+
}
|
|
540
|
+
this._reason = reason || new DOMException('This operation was aborted', 'AbortError');
|
|
541
|
+
this.aborted = true;
|
|
542
|
+
this.dispatchEvent(new Event('abort'));
|
|
543
|
+
}
|
|
544
|
+
get signal() {
|
|
545
|
+
if (this._nativeCtrl?.signal) {
|
|
546
|
+
return this._nativeCtrl.signal;
|
|
547
|
+
}
|
|
548
|
+
return this;
|
|
549
|
+
}
|
|
550
|
+
get reason() {
|
|
551
|
+
if (this._nativeCtrl?.signal) {
|
|
552
|
+
return this._nativeCtrl.signal.reason;
|
|
553
|
+
}
|
|
554
|
+
return this._reason;
|
|
555
|
+
}
|
|
556
|
+
get onabort() {
|
|
557
|
+
if (this._onabort) {
|
|
558
|
+
return this._onabort;
|
|
559
|
+
}
|
|
560
|
+
return this._onabort;
|
|
561
|
+
}
|
|
562
|
+
set onabort(value) {
|
|
563
|
+
if (this._nativeCtrl?.signal) {
|
|
564
|
+
this._nativeCtrl.signal.onabort = value;
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
if (this._onabort) {
|
|
568
|
+
this.removeEventListener('abort', this._onabort);
|
|
569
|
+
}
|
|
570
|
+
this._onabort = value;
|
|
571
|
+
if (value) {
|
|
572
|
+
this.addEventListener('abort', value);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
function createCustomAbortControllerSignal() {
|
|
577
|
+
if (globalThis.Bun || globalThis.Deno) {
|
|
578
|
+
return new AbortController();
|
|
579
|
+
}
|
|
580
|
+
return new Proxy(new CustomAbortControllerSignal(), {
|
|
581
|
+
get(target, prop, receiver) {
|
|
582
|
+
if (prop.toString().includes('kDependantSignals')) {
|
|
583
|
+
const nativeCtrl = target.ensureNativeCtrl();
|
|
584
|
+
return Reflect.get(nativeCtrl.signal, prop, nativeCtrl.signal);
|
|
585
|
+
}
|
|
586
|
+
return Reflect.get(target, prop, receiver);
|
|
587
|
+
},
|
|
588
|
+
set(target, prop, value, receiver) {
|
|
589
|
+
if (prop.toString().includes('kDependantSignals')) {
|
|
590
|
+
const nativeCtrl = target.ensureNativeCtrl();
|
|
591
|
+
return Reflect.set(nativeCtrl.signal, prop, value, nativeCtrl.signal);
|
|
592
|
+
}
|
|
593
|
+
return Reflect.set(target, prop, value, receiver);
|
|
594
|
+
},
|
|
595
|
+
getPrototypeOf() {
|
|
596
|
+
return AbortSignal.prototype;
|
|
597
|
+
},
|
|
598
|
+
});
|
|
599
|
+
}
|