@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.
Files changed (179) hide show
  1. package/README.md +610 -0
  2. package/dist/context.d.ts +46 -0
  3. package/dist/context.d.ts.map +1 -0
  4. package/dist/context.js +181 -0
  5. package/dist/index.d.ts +25 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +112 -0
  8. package/dist/lib/constants.d.ts +7 -0
  9. package/dist/lib/constants.d.ts.map +1 -0
  10. package/dist/lib/constants.js +6 -0
  11. package/dist/lib/download-request.d.ts +17 -0
  12. package/dist/lib/download-request.d.ts.map +1 -0
  13. package/dist/lib/download-request.js +113 -0
  14. package/dist/lib/errors.d.ts +88 -0
  15. package/dist/lib/errors.d.ts.map +1 -0
  16. package/dist/lib/errors.js +158 -0
  17. package/dist/lib/event-stream-response.d.ts +17 -0
  18. package/dist/lib/event-stream-response.d.ts.map +1 -0
  19. package/dist/lib/event-stream-response.js +39 -0
  20. package/dist/lib/event-target.d.ts +9 -0
  21. package/dist/lib/event-target.d.ts.map +1 -0
  22. package/dist/lib/event-target.js +4 -0
  23. package/dist/lib/fetch-api.d.ts +3 -0
  24. package/dist/lib/fetch-api.d.ts.map +1 -0
  25. package/dist/lib/fetch-api.js +16 -0
  26. package/dist/lib/map-share.d.ts +52 -0
  27. package/dist/lib/map-share.d.ts.map +1 -0
  28. package/dist/lib/map-share.js +142 -0
  29. package/dist/lib/secret-stream-fetch.d.ts +7 -0
  30. package/dist/lib/secret-stream-fetch.d.ts.map +1 -0
  31. package/dist/lib/secret-stream-fetch.js +34 -0
  32. package/dist/lib/self-evicting-map.d.ts +16 -0
  33. package/dist/lib/self-evicting-map.d.ts.map +1 -0
  34. package/dist/lib/self-evicting-map.js +29 -0
  35. package/dist/lib/state-update-event.d.ts +8 -0
  36. package/dist/lib/state-update-event.d.ts.map +1 -0
  37. package/dist/lib/state-update-event.js +10 -0
  38. package/dist/lib/utils.d.ts +32 -0
  39. package/dist/lib/utils.d.ts.map +1 -0
  40. package/dist/lib/utils.js +96 -0
  41. package/dist/middlewares/localhost-only.d.ts +11 -0
  42. package/dist/middlewares/localhost-only.d.ts.map +1 -0
  43. package/dist/middlewares/localhost-only.js +10 -0
  44. package/dist/middlewares/parse-request.d.ts +11 -0
  45. package/dist/middlewares/parse-request.d.ts.map +1 -0
  46. package/dist/middlewares/parse-request.js +25 -0
  47. package/dist/routes/downloads.d.ts +15 -0
  48. package/dist/routes/downloads.d.ts.map +1 -0
  49. package/dist/routes/downloads.js +60 -0
  50. package/dist/routes/map-shares.d.ts +19 -0
  51. package/dist/routes/map-shares.d.ts.map +1 -0
  52. package/dist/routes/map-shares.js +192 -0
  53. package/dist/routes/maps.d.ts +6 -0
  54. package/dist/routes/maps.d.ts.map +1 -0
  55. package/dist/routes/maps.js +118 -0
  56. package/dist/routes/root.d.ts +6 -0
  57. package/dist/routes/root.d.ts.map +1 -0
  58. package/dist/routes/root.js +29 -0
  59. package/dist/types.d.ts +110 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +96 -0
  62. package/node_modules/@envelop/instrumentation/LICENSE +21 -0
  63. package/node_modules/@envelop/instrumentation/README.md +30 -0
  64. package/node_modules/@envelop/instrumentation/cjs/index.js +5 -0
  65. package/node_modules/@envelop/instrumentation/cjs/instrumentation.js +89 -0
  66. package/node_modules/@envelop/instrumentation/cjs/package.json +1 -0
  67. package/node_modules/@envelop/instrumentation/esm/index.js +2 -0
  68. package/node_modules/@envelop/instrumentation/esm/instrumentation.js +82 -0
  69. package/node_modules/@envelop/instrumentation/package.json +57 -0
  70. package/node_modules/@envelop/instrumentation/typings/index.d.cts +1 -0
  71. package/node_modules/@envelop/instrumentation/typings/index.d.ts +1 -0
  72. package/node_modules/@envelop/instrumentation/typings/instrumentation.d.cts +44 -0
  73. package/node_modules/@envelop/instrumentation/typings/instrumentation.d.ts +44 -0
  74. package/node_modules/@whatwg-node/disposablestack/cjs/AsyncDisposableStack.js +73 -0
  75. package/node_modules/@whatwg-node/disposablestack/cjs/DisposableStack.js +62 -0
  76. package/node_modules/@whatwg-node/disposablestack/cjs/SupressedError.js +16 -0
  77. package/node_modules/@whatwg-node/disposablestack/cjs/index.js +11 -0
  78. package/node_modules/@whatwg-node/disposablestack/cjs/package.json +1 -0
  79. package/node_modules/@whatwg-node/disposablestack/cjs/symbols.js +20 -0
  80. package/node_modules/@whatwg-node/disposablestack/cjs/utils.js +11 -0
  81. package/node_modules/@whatwg-node/disposablestack/esm/AsyncDisposableStack.js +69 -0
  82. package/node_modules/@whatwg-node/disposablestack/esm/DisposableStack.js +58 -0
  83. package/node_modules/@whatwg-node/disposablestack/esm/SupressedError.js +12 -0
  84. package/node_modules/@whatwg-node/disposablestack/esm/index.js +7 -0
  85. package/node_modules/@whatwg-node/disposablestack/esm/symbols.js +16 -0
  86. package/node_modules/@whatwg-node/disposablestack/esm/utils.js +7 -0
  87. package/node_modules/@whatwg-node/disposablestack/package.json +44 -0
  88. package/node_modules/@whatwg-node/disposablestack/typings/AsyncDisposableStack.d.cts +15 -0
  89. package/node_modules/@whatwg-node/disposablestack/typings/AsyncDisposableStack.d.ts +15 -0
  90. package/node_modules/@whatwg-node/disposablestack/typings/DisposableStack.d.cts +14 -0
  91. package/node_modules/@whatwg-node/disposablestack/typings/DisposableStack.d.ts +14 -0
  92. package/node_modules/@whatwg-node/disposablestack/typings/SupressedError.d.cts +5 -0
  93. package/node_modules/@whatwg-node/disposablestack/typings/SupressedError.d.ts +5 -0
  94. package/node_modules/@whatwg-node/disposablestack/typings/index.d.cts +4 -0
  95. package/node_modules/@whatwg-node/disposablestack/typings/index.d.ts +4 -0
  96. package/node_modules/@whatwg-node/disposablestack/typings/symbols.d.cts +5 -0
  97. package/node_modules/@whatwg-node/disposablestack/typings/symbols.d.ts +5 -0
  98. package/node_modules/@whatwg-node/disposablestack/typings/utils.d.cts +2 -0
  99. package/node_modules/@whatwg-node/disposablestack/typings/utils.d.ts +2 -0
  100. package/node_modules/@whatwg-node/promise-helpers/cjs/index.js +270 -0
  101. package/node_modules/@whatwg-node/promise-helpers/cjs/package.json +1 -0
  102. package/node_modules/@whatwg-node/promise-helpers/esm/index.js +257 -0
  103. package/node_modules/@whatwg-node/promise-helpers/package.json +43 -0
  104. package/node_modules/@whatwg-node/promise-helpers/typings/index.d.cts +31 -0
  105. package/node_modules/@whatwg-node/promise-helpers/typings/index.d.ts +31 -0
  106. package/node_modules/@whatwg-node/server/README.md +590 -0
  107. package/node_modules/@whatwg-node/server/cjs/createServerAdapter.js +368 -0
  108. package/node_modules/@whatwg-node/server/cjs/index.js +17 -0
  109. package/node_modules/@whatwg-node/server/cjs/package.json +1 -0
  110. package/node_modules/@whatwg-node/server/cjs/plugins/types.js +0 -0
  111. package/node_modules/@whatwg-node/server/cjs/plugins/useContentEncoding.js +73 -0
  112. package/node_modules/@whatwg-node/server/cjs/plugins/useCors.js +124 -0
  113. package/node_modules/@whatwg-node/server/cjs/plugins/useErrorHandling.js +52 -0
  114. package/node_modules/@whatwg-node/server/cjs/types.js +0 -0
  115. package/node_modules/@whatwg-node/server/cjs/utils.js +599 -0
  116. package/node_modules/@whatwg-node/server/cjs/uwebsockets.js +241 -0
  117. package/node_modules/@whatwg-node/server/esm/createServerAdapter.js +365 -0
  118. package/node_modules/@whatwg-node/server/esm/index.js +11 -0
  119. package/node_modules/@whatwg-node/server/esm/plugins/types.js +0 -0
  120. package/node_modules/@whatwg-node/server/esm/plugins/useContentEncoding.js +70 -0
  121. package/node_modules/@whatwg-node/server/esm/plugins/useCors.js +120 -0
  122. package/node_modules/@whatwg-node/server/esm/plugins/useErrorHandling.js +46 -0
  123. package/node_modules/@whatwg-node/server/esm/types.js +0 -0
  124. package/node_modules/@whatwg-node/server/esm/utils.js +588 -0
  125. package/node_modules/@whatwg-node/server/esm/uwebsockets.js +234 -0
  126. package/node_modules/@whatwg-node/server/package.json +46 -0
  127. package/node_modules/@whatwg-node/server/typings/createServerAdapter.d.cts +19 -0
  128. package/node_modules/@whatwg-node/server/typings/createServerAdapter.d.ts +19 -0
  129. package/node_modules/@whatwg-node/server/typings/index.d.cts +11 -0
  130. package/node_modules/@whatwg-node/server/typings/index.d.ts +11 -0
  131. package/node_modules/@whatwg-node/server/typings/plugins/types.d.cts +76 -0
  132. package/node_modules/@whatwg-node/server/typings/plugins/types.d.ts +76 -0
  133. package/node_modules/@whatwg-node/server/typings/plugins/useContentEncoding.d.cts +2 -0
  134. package/node_modules/@whatwg-node/server/typings/plugins/useContentEncoding.d.ts +2 -0
  135. package/node_modules/@whatwg-node/server/typings/plugins/useCors.d.cts +14 -0
  136. package/node_modules/@whatwg-node/server/typings/plugins/useCors.d.ts +14 -0
  137. package/node_modules/@whatwg-node/server/typings/plugins/useErrorHandling.d.cts +13 -0
  138. package/node_modules/@whatwg-node/server/typings/plugins/useErrorHandling.d.ts +13 -0
  139. package/node_modules/@whatwg-node/server/typings/types.d.cts +100 -0
  140. package/node_modules/@whatwg-node/server/typings/types.d.ts +100 -0
  141. package/node_modules/@whatwg-node/server/typings/utils.d.cts +42 -0
  142. package/node_modules/@whatwg-node/server/typings/utils.d.ts +42 -0
  143. package/node_modules/@whatwg-node/server/typings/uwebsockets.d.cts +32 -0
  144. package/node_modules/@whatwg-node/server/typings/uwebsockets.d.ts +32 -0
  145. package/node_modules/tslib/CopyrightNotice.txt +15 -0
  146. package/node_modules/tslib/LICENSE.txt +12 -0
  147. package/node_modules/tslib/README.md +164 -0
  148. package/node_modules/tslib/SECURITY.md +41 -0
  149. package/node_modules/tslib/modules/index.d.ts +38 -0
  150. package/node_modules/tslib/modules/index.js +70 -0
  151. package/node_modules/tslib/modules/package.json +3 -0
  152. package/node_modules/tslib/package.json +47 -0
  153. package/node_modules/tslib/tslib.d.ts +460 -0
  154. package/node_modules/tslib/tslib.es6.html +1 -0
  155. package/node_modules/tslib/tslib.es6.js +402 -0
  156. package/node_modules/tslib/tslib.es6.mjs +401 -0
  157. package/node_modules/tslib/tslib.html +1 -0
  158. package/node_modules/tslib/tslib.js +484 -0
  159. package/package.json +87 -0
  160. package/src/context.ts +203 -0
  161. package/src/index.ts +193 -0
  162. package/src/lib/constants.ts +6 -0
  163. package/src/lib/download-request.ts +142 -0
  164. package/src/lib/errors.ts +187 -0
  165. package/src/lib/event-stream-response.ts +57 -0
  166. package/src/lib/event-target.ts +11 -0
  167. package/src/lib/fetch-api.ts +18 -0
  168. package/src/lib/map-share.ts +185 -0
  169. package/src/lib/secret-stream-fetch.ts +42 -0
  170. package/src/lib/self-evicting-map.ts +35 -0
  171. package/src/lib/state-update-event.ts +14 -0
  172. package/src/lib/utils.ts +110 -0
  173. package/src/middlewares/localhost-only.ts +16 -0
  174. package/src/middlewares/parse-request.ts +34 -0
  175. package/src/routes/downloads.ts +92 -0
  176. package/src/routes/map-shares.ts +246 -0
  177. package/src/routes/maps.ts +146 -0
  178. package/src/routes/root.ts +37 -0
  179. 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
+ }