@whatwg-node/server 0.6.7 → 0.7.0-alpha-20230215085143-56e6bef

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,180 @@
1
+ /* eslint-disable @typescript-eslint/ban-types */
2
+ import { Request as PonyfillRequestCtor } from '@whatwg-node/fetch';
3
+ import { isFetchEvent, isNodeRequest, isRequestInit, isServerResponse, normalizeNodeRequest, sendNodeResponse, } from './utils.js';
4
+ async function handleWaitUntils(waitUntilPromises) {
5
+ const waitUntils = await Promise.allSettled(waitUntilPromises);
6
+ waitUntils.forEach(waitUntil => {
7
+ if (waitUntil.status === 'rejected') {
8
+ console.error(waitUntil.reason);
9
+ }
10
+ });
11
+ }
12
+ function createServerAdapter(serverAdapterBaseObject,
13
+ /**
14
+ * WHATWG Fetch spec compliant `Request` constructor.
15
+ */
16
+ RequestCtor = PonyfillRequestCtor) {
17
+ const handleRequest = typeof serverAdapterBaseObject === 'function'
18
+ ? serverAdapterBaseObject
19
+ : serverAdapterBaseObject.handle;
20
+ function handleNodeRequest(nodeRequest, ...ctx) {
21
+ const serverContext = ctx.length > 1 ? completeAssign({}, ...ctx) : ctx[0];
22
+ const request = normalizeNodeRequest(nodeRequest, RequestCtor);
23
+ return handleRequest(request, serverContext);
24
+ }
25
+ async function requestListener(nodeRequest, serverResponse, ...ctx) {
26
+ const waitUntilPromises = [];
27
+ const defaultServerContext = {
28
+ req: nodeRequest,
29
+ res: serverResponse,
30
+ waitUntil(promise) {
31
+ if (promise != null) {
32
+ waitUntilPromises.push(promise);
33
+ }
34
+ },
35
+ };
36
+ const response = await handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
37
+ if (response) {
38
+ await sendNodeResponse(response, serverResponse, nodeRequest);
39
+ }
40
+ else {
41
+ await new Promise(resolve => {
42
+ serverResponse.statusCode = 404;
43
+ serverResponse.once('end', resolve);
44
+ serverResponse.end();
45
+ });
46
+ }
47
+ if (waitUntilPromises.length > 0) {
48
+ await handleWaitUntils(waitUntilPromises);
49
+ }
50
+ }
51
+ function handleEvent(event, ...ctx) {
52
+ if (!event.respondWith || !event.request) {
53
+ throw new TypeError(`Expected FetchEvent, got ${event}`);
54
+ }
55
+ const serverContext = ctx.length > 0 ? Object.assign({}, event, ...ctx) : event;
56
+ const response$ = handleRequest(event.request, serverContext);
57
+ event.respondWith(response$);
58
+ }
59
+ function handleRequestWithWaitUntil(request, ...ctx) {
60
+ const serverContext = ctx.length > 1 ? completeAssign({}, ...ctx) : ctx[0] || {};
61
+ if (!('waitUntil' in serverContext)) {
62
+ const waitUntilPromises = [];
63
+ const response$ = handleRequest(request, {
64
+ ...serverContext,
65
+ waitUntil(promise) {
66
+ if (promise != null) {
67
+ waitUntilPromises.push(promise);
68
+ }
69
+ },
70
+ });
71
+ if (waitUntilPromises.length > 0) {
72
+ return handleWaitUntils(waitUntilPromises).then(() => response$);
73
+ }
74
+ return response$;
75
+ }
76
+ return handleRequest(request, serverContext);
77
+ }
78
+ const fetchFn = (input, ...maybeCtx) => {
79
+ if (typeof input === 'string' || 'href' in input) {
80
+ const [initOrCtx, ...restOfCtx] = maybeCtx;
81
+ if (isRequestInit(initOrCtx)) {
82
+ return handleRequestWithWaitUntil(new RequestCtor(input, initOrCtx), ...restOfCtx);
83
+ }
84
+ return handleRequestWithWaitUntil(new RequestCtor(input), ...maybeCtx);
85
+ }
86
+ return handleRequestWithWaitUntil(input, ...maybeCtx);
87
+ };
88
+ const genericRequestHandler = (input, ...maybeCtx) => {
89
+ // If it is a Node request
90
+ const [initOrCtxOrRes, ...restOfCtx] = maybeCtx;
91
+ if (isNodeRequest(input)) {
92
+ if (!isServerResponse(initOrCtxOrRes)) {
93
+ throw new TypeError(`Expected ServerResponse, got ${initOrCtxOrRes}`);
94
+ }
95
+ return requestListener(input, initOrCtxOrRes, ...restOfCtx);
96
+ }
97
+ if (isServerResponse(initOrCtxOrRes)) {
98
+ throw new TypeError('Got Node response without Node request');
99
+ }
100
+ // Is input a container object over Request?
101
+ if (typeof input === 'object' && 'request' in input) {
102
+ // Is it FetchEvent?
103
+ if (isFetchEvent(input)) {
104
+ return handleEvent(input, ...maybeCtx);
105
+ }
106
+ // In this input is also the context
107
+ return handleRequestWithWaitUntil(input.request, input, ...maybeCtx);
108
+ }
109
+ // Or is it Request itself?
110
+ // Then ctx is present and it is the context
111
+ return fetchFn(input, ...maybeCtx);
112
+ };
113
+ const adapterObj = {
114
+ handleRequest,
115
+ fetch: fetchFn,
116
+ handleNodeRequest,
117
+ requestListener,
118
+ handleEvent,
119
+ handle: genericRequestHandler,
120
+ };
121
+ return new Proxy(genericRequestHandler, {
122
+ // It should have all the attributes of the handler function and the server instance
123
+ has: (_, prop) => {
124
+ return (prop in adapterObj ||
125
+ prop in genericRequestHandler ||
126
+ (serverAdapterBaseObject && prop in serverAdapterBaseObject));
127
+ },
128
+ get: (_, prop) => {
129
+ const adapterProp = adapterObj[prop];
130
+ if (adapterProp) {
131
+ if (adapterProp.bind) {
132
+ return adapterProp.bind(adapterObj);
133
+ }
134
+ return adapterProp;
135
+ }
136
+ const handleProp = genericRequestHandler[prop];
137
+ if (handleProp) {
138
+ if (handleProp.bind) {
139
+ return handleProp.bind(genericRequestHandler);
140
+ }
141
+ return handleProp;
142
+ }
143
+ if (serverAdapterBaseObject) {
144
+ const serverAdapterBaseObjectProp = serverAdapterBaseObject[prop];
145
+ if (serverAdapterBaseObjectProp) {
146
+ if (serverAdapterBaseObjectProp.bind) {
147
+ return serverAdapterBaseObjectProp.bind(serverAdapterBaseObject);
148
+ }
149
+ return serverAdapterBaseObjectProp;
150
+ }
151
+ }
152
+ },
153
+ apply(_, __, args) {
154
+ return genericRequestHandler(...args);
155
+ },
156
+ }); // 😡
157
+ }
158
+ export { createServerAdapter };
159
+ // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#copying_accessors
160
+ function completeAssign(target, ...sources) {
161
+ sources.forEach(source => {
162
+ if (source != null && typeof source === 'object') {
163
+ // modified Object.keys to Object.getOwnPropertyNames
164
+ // because Object.keys only returns enumerable properties
165
+ const descriptors = Object.getOwnPropertyNames(source).reduce((descriptors, key) => {
166
+ descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
167
+ return descriptors;
168
+ }, {});
169
+ // By default, Object.assign copies enumerable Symbols, too
170
+ Object.getOwnPropertySymbols(source).forEach(sym => {
171
+ const descriptor = Object.getOwnPropertyDescriptor(source, sym);
172
+ if (descriptor.enumerable) {
173
+ descriptors[sym] = descriptor;
174
+ }
175
+ });
176
+ Object.defineProperties(target, descriptors);
177
+ }
178
+ });
179
+ return target;
180
+ }
package/esm/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from './createServerAdapter.js';
2
+ export * from './types.js';
3
+ export * from './utils.js';
4
+ export * from './middlewares/withCors.js';
5
+ export * from './middlewares/withErrorHandling.js';
6
+ export { Response } from '@whatwg-node/fetch';
@@ -0,0 +1,131 @@
1
+ /* eslint-disable @typescript-eslint/ban-types */
2
+ import { Response as DefaultResponseCtor } from '@whatwg-node/fetch';
3
+ export function getCORSHeadersByRequestAndOptions(request, corsOptions) {
4
+ var _a, _b;
5
+ const headers = {};
6
+ if (corsOptions === false) {
7
+ return headers;
8
+ }
9
+ // If defined origins have '*' or undefined by any means, we should allow all origins
10
+ if (corsOptions.origin == null ||
11
+ corsOptions.origin.length === 0 ||
12
+ corsOptions.origin.includes('*')) {
13
+ const currentOrigin = request.headers.get('origin');
14
+ // If origin is available in the headers, use it
15
+ if (currentOrigin != null) {
16
+ headers['Access-Control-Allow-Origin'] = currentOrigin;
17
+ // Vary by origin because there are multiple origins
18
+ headers['Vary'] = 'Origin';
19
+ }
20
+ else {
21
+ headers['Access-Control-Allow-Origin'] = '*';
22
+ }
23
+ }
24
+ else if (typeof corsOptions.origin === 'string') {
25
+ // If there is one specific origin is specified, use it directly
26
+ headers['Access-Control-Allow-Origin'] = corsOptions.origin;
27
+ }
28
+ else if (Array.isArray(corsOptions.origin)) {
29
+ // If there is only one origin defined in the array, consider it as a single one
30
+ if (corsOptions.origin.length === 1) {
31
+ headers['Access-Control-Allow-Origin'] = corsOptions.origin[0];
32
+ }
33
+ else {
34
+ const currentOrigin = request.headers.get('origin');
35
+ if (currentOrigin != null && corsOptions.origin.includes(currentOrigin)) {
36
+ // If origin is available in the headers, use it
37
+ headers['Access-Control-Allow-Origin'] = currentOrigin;
38
+ // Vary by origin because there are multiple origins
39
+ headers['Vary'] = 'Origin';
40
+ }
41
+ else {
42
+ // There is no origin found in the headers, so we should return null
43
+ headers['Access-Control-Allow-Origin'] = 'null';
44
+ }
45
+ }
46
+ }
47
+ if ((_a = corsOptions.methods) === null || _a === void 0 ? void 0 : _a.length) {
48
+ headers['Access-Control-Allow-Methods'] = corsOptions.methods.join(', ');
49
+ }
50
+ else {
51
+ const requestMethod = request.headers.get('access-control-request-method');
52
+ if (requestMethod) {
53
+ headers['Access-Control-Allow-Methods'] = requestMethod;
54
+ }
55
+ }
56
+ if ((_b = corsOptions.allowedHeaders) === null || _b === void 0 ? void 0 : _b.length) {
57
+ headers['Access-Control-Allow-Headers'] = corsOptions.allowedHeaders.join(', ');
58
+ }
59
+ else {
60
+ const requestHeaders = request.headers.get('access-control-request-headers');
61
+ if (requestHeaders) {
62
+ headers['Access-Control-Allow-Headers'] = requestHeaders;
63
+ if (headers['Vary']) {
64
+ headers['Vary'] += ', Access-Control-Request-Headers';
65
+ }
66
+ headers['Vary'] = 'Access-Control-Request-Headers';
67
+ }
68
+ }
69
+ if (corsOptions.credentials != null) {
70
+ if (corsOptions.credentials === true) {
71
+ headers['Access-Control-Allow-Credentials'] = 'true';
72
+ }
73
+ }
74
+ else if (headers['Access-Control-Allow-Origin'] !== '*') {
75
+ headers['Access-Control-Allow-Credentials'] = 'true';
76
+ }
77
+ if (corsOptions.exposedHeaders) {
78
+ headers['Access-Control-Expose-Headers'] = corsOptions.exposedHeaders.join(', ');
79
+ }
80
+ if (corsOptions.maxAge) {
81
+ headers['Access-Control-Max-Age'] = corsOptions.maxAge.toString();
82
+ }
83
+ return headers;
84
+ }
85
+ async function getCORSResponseHeaders(request, corsOptionsFactory, serverContext) {
86
+ const corsOptions = await corsOptionsFactory(request, serverContext);
87
+ return getCORSHeadersByRequestAndOptions(request, corsOptions);
88
+ }
89
+ export function withCORS(obj, options, ResponseCtor = DefaultResponseCtor) {
90
+ let corsOptionsFactory = () => ({});
91
+ if (options != null) {
92
+ if (typeof options === 'function') {
93
+ corsOptionsFactory = options;
94
+ }
95
+ else if (typeof options === 'object') {
96
+ const corsOptions = {
97
+ ...options,
98
+ };
99
+ corsOptionsFactory = () => corsOptions;
100
+ }
101
+ else if (options === false) {
102
+ corsOptionsFactory = () => false;
103
+ }
104
+ }
105
+ async function handleWithCORS(request, serverContext) {
106
+ let response;
107
+ if (request.method.toUpperCase() === 'OPTIONS') {
108
+ response = new ResponseCtor(null, {
109
+ status: 204,
110
+ });
111
+ }
112
+ else {
113
+ response = await obj.handle(request, serverContext);
114
+ }
115
+ if (response != null) {
116
+ const headers = await getCORSResponseHeaders(request, corsOptionsFactory, serverContext);
117
+ for (const headerName in headers) {
118
+ response.headers.set(headerName, headers[headerName]);
119
+ }
120
+ return response;
121
+ }
122
+ }
123
+ return new Proxy(obj, {
124
+ get(_, prop, receiver) {
125
+ if (prop === 'handle') {
126
+ return handleWithCORS;
127
+ }
128
+ return Reflect.get(obj, prop, receiver);
129
+ },
130
+ });
131
+ }
@@ -0,0 +1,29 @@
1
+ /* eslint-disable @typescript-eslint/ban-types */
2
+ import { Response as DefaultResponseCtor } from '@whatwg-node/fetch';
3
+ export function createDefaultErrorHandler(ResponseCtor = DefaultResponseCtor) {
4
+ return function defaultErrorHandler(e) {
5
+ return new ResponseCtor(e.stack || e.message || e.toString(), {
6
+ status: e.statusCode || e.status || 500,
7
+ statusText: e.statusText || 'Internal Server Error',
8
+ });
9
+ };
10
+ }
11
+ export function withErrorHandling(obj, onError = createDefaultErrorHandler()) {
12
+ async function handleWithErrorHandling(request, ctx) {
13
+ try {
14
+ const res = await obj.handle(request, ctx);
15
+ return res;
16
+ }
17
+ catch (e) {
18
+ return onError(e, request, ctx);
19
+ }
20
+ }
21
+ return new Proxy(obj, {
22
+ get(obj, prop, receiver) {
23
+ if (prop === 'handle') {
24
+ return handleWithErrorHandling;
25
+ }
26
+ return Reflect.get(obj, prop, receiver);
27
+ },
28
+ });
29
+ }
package/esm/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/esm/utils.js ADDED
@@ -0,0 +1,235 @@
1
+ import { URL } from '@whatwg-node/fetch';
2
+ export function isAsyncIterable(body) {
3
+ return (body != null && typeof body === 'object' && typeof body[Symbol.asyncIterator] === 'function');
4
+ }
5
+ function getPort(nodeRequest) {
6
+ var _a, _b, _c, _d, _e;
7
+ if ((_a = nodeRequest.socket) === null || _a === void 0 ? void 0 : _a.localPort) {
8
+ return (_b = nodeRequest.socket) === null || _b === void 0 ? void 0 : _b.localPort;
9
+ }
10
+ const hostInHeader = ((_c = nodeRequest.headers) === null || _c === void 0 ? void 0 : _c[':authority']) || ((_d = nodeRequest.headers) === null || _d === void 0 ? void 0 : _d.host);
11
+ const portInHeader = (_e = hostInHeader === null || hostInHeader === void 0 ? void 0 : hostInHeader.split(':')) === null || _e === void 0 ? void 0 : _e[1];
12
+ if (portInHeader) {
13
+ return portInHeader;
14
+ }
15
+ return 80;
16
+ }
17
+ function getHostnameWithPort(nodeRequest) {
18
+ var _a, _b, _c, _d, _e;
19
+ if ((_a = nodeRequest.headers) === null || _a === void 0 ? void 0 : _a[':authority']) {
20
+ return (_b = nodeRequest.headers) === null || _b === void 0 ? void 0 : _b[':authority'];
21
+ }
22
+ if ((_c = nodeRequest.headers) === null || _c === void 0 ? void 0 : _c.host) {
23
+ return (_d = nodeRequest.headers) === null || _d === void 0 ? void 0 : _d.host;
24
+ }
25
+ const port = getPort(nodeRequest);
26
+ if (nodeRequest.hostname) {
27
+ return nodeRequest.hostname + ':' + port;
28
+ }
29
+ const localIp = (_e = nodeRequest.socket) === null || _e === void 0 ? void 0 : _e.localAddress;
30
+ if (localIp && !(localIp === null || localIp === void 0 ? void 0 : localIp.includes('::')) && !(localIp === null || localIp === void 0 ? void 0 : localIp.includes('ffff'))) {
31
+ return `${localIp}:${port}`;
32
+ }
33
+ return 'localhost';
34
+ }
35
+ function buildFullUrl(nodeRequest) {
36
+ const hostnameWithPort = getHostnameWithPort(nodeRequest);
37
+ const protocol = nodeRequest.protocol || 'http';
38
+ const endpoint = nodeRequest.originalUrl || nodeRequest.url || '/graphql';
39
+ return `${protocol}://${hostnameWithPort}${endpoint}`;
40
+ }
41
+ function isRequestBody(body) {
42
+ const stringTag = body[Symbol.toStringTag];
43
+ if (typeof body === 'string' ||
44
+ stringTag === 'Uint8Array' ||
45
+ stringTag === 'Blob' ||
46
+ stringTag === 'FormData' ||
47
+ stringTag === 'URLSearchParams' ||
48
+ isAsyncIterable(body)) {
49
+ return true;
50
+ }
51
+ return false;
52
+ }
53
+ export function normalizeNodeRequest(nodeRequest, RequestCtor) {
54
+ var _a;
55
+ const rawRequest = nodeRequest.raw || nodeRequest.req || nodeRequest;
56
+ let fullUrl = buildFullUrl(rawRequest);
57
+ if (nodeRequest.query) {
58
+ const url = new URL(fullUrl);
59
+ for (const key in nodeRequest.query) {
60
+ url.searchParams.set(key, nodeRequest.query[key]);
61
+ }
62
+ fullUrl = url.toString();
63
+ }
64
+ if (nodeRequest.method === 'GET' || nodeRequest.method === 'HEAD') {
65
+ return new RequestCtor(fullUrl, {
66
+ method: nodeRequest.method,
67
+ headers: nodeRequest.headers,
68
+ });
69
+ }
70
+ /**
71
+ * Some Node server frameworks like Serverless Express sends a dummy object with body but as a Buffer not string
72
+ * so we do those checks to see is there something we can use directly as BodyInit
73
+ * because the presence of body means the request stream is already consumed and,
74
+ * rawRequest cannot be used as BodyInit/ReadableStream by Fetch API in this case.
75
+ */
76
+ const maybeParsedBody = nodeRequest.body;
77
+ if (maybeParsedBody != null && Object.keys(maybeParsedBody).length > 0) {
78
+ if (isRequestBody(maybeParsedBody)) {
79
+ return new RequestCtor(fullUrl, {
80
+ method: nodeRequest.method,
81
+ headers: nodeRequest.headers,
82
+ body: maybeParsedBody,
83
+ });
84
+ }
85
+ const request = new RequestCtor(fullUrl, {
86
+ method: nodeRequest.method,
87
+ headers: nodeRequest.headers,
88
+ });
89
+ if (!((_a = request.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.includes('json'))) {
90
+ request.headers.set('content-type', 'application/json');
91
+ }
92
+ return new Proxy(request, {
93
+ get: (target, prop, receiver) => {
94
+ switch (prop) {
95
+ case 'json':
96
+ return async () => maybeParsedBody;
97
+ case 'text':
98
+ return async () => JSON.stringify(maybeParsedBody);
99
+ default:
100
+ return Reflect.get(target, prop, receiver);
101
+ }
102
+ },
103
+ });
104
+ }
105
+ // perf: instead of spreading the object, we can just pass it as is and it performs better
106
+ return new RequestCtor(fullUrl, {
107
+ method: nodeRequest.method,
108
+ headers: nodeRequest.headers,
109
+ body: rawRequest,
110
+ });
111
+ }
112
+ export function isReadable(stream) {
113
+ return stream.read != null;
114
+ }
115
+ export function isNodeRequest(request) {
116
+ return isReadable(request);
117
+ }
118
+ export function isServerResponse(stream) {
119
+ // Check all used functions are defined
120
+ return (stream != null &&
121
+ stream.setHeader != null &&
122
+ stream.end != null &&
123
+ stream.once != null &&
124
+ stream.write != null);
125
+ }
126
+ export function isReadableStream(stream) {
127
+ return stream != null && stream.getReader != null;
128
+ }
129
+ export function isFetchEvent(event) {
130
+ return event != null && event.request != null && event.respondWith != null;
131
+ }
132
+ function configureSocket(rawRequest) {
133
+ var _a, _b, _c, _d, _e, _f;
134
+ (_b = (_a = rawRequest === null || rawRequest === void 0 ? void 0 : rawRequest.socket) === null || _a === void 0 ? void 0 : _a.setTimeout) === null || _b === void 0 ? void 0 : _b.call(_a, 0);
135
+ (_d = (_c = rawRequest === null || rawRequest === void 0 ? void 0 : rawRequest.socket) === null || _c === void 0 ? void 0 : _c.setNoDelay) === null || _d === void 0 ? void 0 : _d.call(_c, true);
136
+ (_f = (_e = rawRequest === null || rawRequest === void 0 ? void 0 : rawRequest.socket) === null || _e === void 0 ? void 0 : _e.setKeepAlive) === null || _f === void 0 ? void 0 : _f.call(_e, true);
137
+ }
138
+ function endResponse(serverResponse) {
139
+ // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
140
+ serverResponse.end(null, null, null);
141
+ }
142
+ function getHeadersObj(headers) {
143
+ return new Proxy({}, {
144
+ get(_target, prop) {
145
+ return headers.get(prop);
146
+ },
147
+ set(_target, prop, value) {
148
+ headers.set(prop, value);
149
+ return true;
150
+ },
151
+ has(_target, prop) {
152
+ return headers.has(prop);
153
+ },
154
+ deleteProperty(_target, prop) {
155
+ headers.delete(prop);
156
+ return true;
157
+ },
158
+ ownKeys() {
159
+ const keys = [];
160
+ headers.forEach((_, key) => keys.push(key));
161
+ return keys;
162
+ },
163
+ getOwnPropertyDescriptor() {
164
+ return {
165
+ enumerable: true,
166
+ configurable: true,
167
+ };
168
+ },
169
+ });
170
+ }
171
+ export async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
172
+ const headersObj = getHeadersObj(fetchResponse.headers);
173
+ serverResponse.writeHead(fetchResponse.status, fetchResponse.statusText, headersObj);
174
+ // eslint-disable-next-line no-async-promise-executor
175
+ return new Promise(async (resolve) => {
176
+ serverResponse.once('close', resolve);
177
+ // Our Node-fetch enhancements
178
+ if ('bodyType' in fetchResponse &&
179
+ fetchResponse.bodyType != null &&
180
+ (fetchResponse.bodyType === 'String' || fetchResponse.bodyType === 'Uint8Array')) {
181
+ // @ts-expect-error http and http2 writes are actually compatible
182
+ serverResponse.write(fetchResponse.bodyInit);
183
+ endResponse(serverResponse);
184
+ return;
185
+ }
186
+ // Other fetch implementations
187
+ const fetchBody = fetchResponse.body;
188
+ if (fetchBody == null) {
189
+ endResponse(serverResponse);
190
+ return;
191
+ }
192
+ if (fetchBody[Symbol.toStringTag] === 'Uint8Array') {
193
+ serverResponse
194
+ // @ts-expect-error http and http2 writes are actually compatible
195
+ .write(fetchBody);
196
+ endResponse(serverResponse);
197
+ return;
198
+ }
199
+ configureSocket(nodeRequest);
200
+ if (isReadable(fetchBody)) {
201
+ serverResponse.once('close', () => {
202
+ fetchBody.destroy();
203
+ });
204
+ fetchBody.pipe(serverResponse);
205
+ return;
206
+ }
207
+ if (isAsyncIterable(fetchBody)) {
208
+ for await (const chunk of fetchBody) {
209
+ if (!serverResponse
210
+ // @ts-expect-error http and http2 writes are actually compatible
211
+ .write(chunk)) {
212
+ break;
213
+ }
214
+ }
215
+ endResponse(serverResponse);
216
+ }
217
+ });
218
+ }
219
+ export function isRequestInit(val) {
220
+ return (val != null &&
221
+ typeof val === 'object' &&
222
+ ('body' in val ||
223
+ 'cache' in val ||
224
+ 'credentials' in val ||
225
+ 'headers' in val ||
226
+ 'integrity' in val ||
227
+ 'keepalive' in val ||
228
+ 'method' in val ||
229
+ 'mode' in val ||
230
+ 'redirect' in val ||
231
+ 'referrer' in val ||
232
+ 'referrerPolicy' in val ||
233
+ 'signal' in val ||
234
+ 'window' in val));
235
+ }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.6.7",
3
+ "version": "0.7.0-alpha-20230215085143-56e6bef",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
7
- "@whatwg-node/fetch": "^0.8.1",
7
+ "@whatwg-node/fetch": "0.8.2-alpha-20230215085143-56e6bef",
8
8
  "tslib": "^2.3.1"
9
9
  },
10
10
  "repository": {
@@ -14,21 +14,28 @@
14
14
  },
15
15
  "author": "Arda TANRIKULU <ardatanrikulu@gmail.com>",
16
16
  "license": "MIT",
17
- "main": "index.js",
18
- "module": "index.mjs",
19
- "typings": "index.d.ts",
17
+ "main": "cjs/index.js",
18
+ "module": "esm/index.js",
19
+ "typings": "typings/index.d.ts",
20
20
  "typescript": {
21
- "definition": "index.d.ts"
21
+ "definition": "typings/index.d.ts"
22
22
  },
23
+ "type": "module",
23
24
  "exports": {
24
25
  ".": {
25
- "require": "./index.js",
26
- "import": "./index.mjs"
27
- },
28
- "./*": {
29
- "require": "./*.js",
30
- "import": "./*.mjs"
26
+ "require": {
27
+ "types": "./typings/index.d.cts",
28
+ "default": "./cjs/index.js"
29
+ },
30
+ "import": {
31
+ "types": "./typings/index.d.ts",
32
+ "default": "./esm/index.js"
33
+ },
34
+ "default": {
35
+ "types": "./typings/index.d.ts",
36
+ "default": "./esm/index.js"
37
+ }
31
38
  },
32
39
  "./package.json": "./package.json"
33
40
  }
34
- }
41
+ }
@@ -0,0 +1,4 @@
1
+ import { ServerAdapter, ServerAdapterBaseObject, ServerAdapterRequestHandler } from './types.cjs';
2
+ declare function createServerAdapter<TServerContext = {}, THandleRequest extends ServerAdapterRequestHandler<TServerContext> = ServerAdapterRequestHandler<TServerContext>>(serverAdapterRequestHandler: THandleRequest, RequestCtor?: typeof Request): ServerAdapter<TServerContext, ServerAdapterBaseObject<TServerContext, THandleRequest>>;
3
+ declare function createServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>>(serverAdapterBaseObject: TBaseObject, RequestCtor?: typeof Request): ServerAdapter<TServerContext, TBaseObject>;
4
+ export { createServerAdapter };
@@ -1,4 +1,4 @@
1
- import { ServerAdapter, ServerAdapterBaseObject, ServerAdapterRequestHandler } from './types';
1
+ import { ServerAdapter, ServerAdapterBaseObject, ServerAdapterRequestHandler } from './types.js';
2
2
  declare function createServerAdapter<TServerContext = {}, THandleRequest extends ServerAdapterRequestHandler<TServerContext> = ServerAdapterRequestHandler<TServerContext>>(serverAdapterRequestHandler: THandleRequest, RequestCtor?: typeof Request): ServerAdapter<TServerContext, ServerAdapterBaseObject<TServerContext, THandleRequest>>;
3
3
  declare function createServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>>(serverAdapterBaseObject: TBaseObject, RequestCtor?: typeof Request): ServerAdapter<TServerContext, TBaseObject>;
4
4
  export { createServerAdapter };
@@ -0,0 +1,6 @@
1
+ export * from './createServerAdapter.cjs';
2
+ export * from './types.cjs';
3
+ export * from './utils.cjs';
4
+ export * from './middlewares/withCors.cjs';
5
+ export * from './middlewares/withErrorHandling.cjs';
6
+ export { Response } from '@whatwg-node/fetch';
@@ -0,0 +1,6 @@
1
+ export * from './createServerAdapter.js';
2
+ export * from './types.js';
3
+ export * from './utils.js';
4
+ export * from './middlewares/withCors.js';
5
+ export * from './middlewares/withErrorHandling.js';
6
+ export { Response } from '@whatwg-node/fetch';