@whatwg-node/server 0.1.2 → 0.3.0-alpha-20220912131745-0b53401

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/index.d.ts CHANGED
@@ -43,8 +43,9 @@ export interface ServerAdapterObject<TServerContext> extends EventListenerObject
43
43
  */
44
44
  handle: RequestListener;
45
45
  }
46
- export declare type ServerAdapter<TServerContext, TBaseObject> = TBaseObject & RequestListener & ServerAdapterObject<TServerContext>;
46
+ export declare type ServerAdapter<TServerContext, TBaseObject> = TBaseObject & RequestListener & ServerAdapterObject<TServerContext>['fetch'] & ServerAdapterObject<TServerContext>;
47
47
  export declare function createServerAdapter<TServerContext = {
48
48
  req: NodeRequest;
49
49
  res: ServerResponse;
50
+ waitUntil(promise: Promise<unknown>): void;
50
51
  }, TBaseObject = unknown>({ Request: RequestCtor, handleRequest, baseObject, }: CreateServerAdapterOptions<TServerContext, TBaseObject>): ServerAdapter<TServerContext, TBaseObject>;
package/index.js CHANGED
@@ -156,6 +156,13 @@ async function sendNodeResponse({ headers, status, statusText, body }, serverRes
156
156
  }
157
157
 
158
158
  /// <reference lib="webworker" />
159
+ function handleWaitUntils(waitUntilPromises) {
160
+ return Promise.allSettled(waitUntilPromises).then(waitUntils => waitUntils.forEach(waitUntil => {
161
+ if (waitUntil.status === 'rejected') {
162
+ console.error(waitUntil.reason);
163
+ }
164
+ }));
165
+ }
159
166
  function createServerAdapter({ Request: RequestCtor = fetch.Request, handleRequest, baseObject, }) {
160
167
  function fetchFn(input, init, ...ctx) {
161
168
  if (typeof input === 'string' || input instanceof URL) {
@@ -168,14 +175,24 @@ function createServerAdapter({ Request: RequestCtor = fetch.Request, handleReque
168
175
  return handleRequest(request, serverContext);
169
176
  }
170
177
  async function requestListener(nodeRequest, serverResponse) {
178
+ const waitUntilPromises = [];
171
179
  const response = await handleNodeRequest(nodeRequest, {
172
180
  req: nodeRequest,
173
181
  res: serverResponse,
174
182
  waitUntil(p) {
175
- p.catch(err => console.error(err));
183
+ waitUntilPromises.push(p);
176
184
  },
177
185
  });
178
- return sendNodeResponse(response, serverResponse);
186
+ if (response) {
187
+ await sendNodeResponse(response, serverResponse);
188
+ }
189
+ else {
190
+ await new Promise(resolve => {
191
+ serverResponse.statusCode = 404;
192
+ serverResponse.end(resolve);
193
+ });
194
+ }
195
+ await handleWaitUntils(waitUntilPromises);
179
196
  }
180
197
  function handleEvent(event) {
181
198
  if (!event.respondWith || !event.request) {
@@ -192,7 +209,12 @@ function createServerAdapter({ Request: RequestCtor = fetch.Request, handleReque
192
209
  handleEvent,
193
210
  handle: requestListener,
194
211
  };
195
- function genericRequestHandler(input, ctx) {
212
+ function genericRequestHandler(input, ctx, ...rest) {
213
+ var _a;
214
+ if ('process' in globalThis && ((_a = process.versions) === null || _a === void 0 ? void 0 : _a['bun']) != null) {
215
+ // This is required for bun
216
+ input.text();
217
+ }
196
218
  // If it is a Node request
197
219
  if (isReadable(input) && ctx != null && isServerResponse(ctx)) {
198
220
  return requestListener(input, ctx);
@@ -208,6 +230,24 @@ function createServerAdapter({ Request: RequestCtor = fetch.Request, handleReque
208
230
  }
209
231
  // Or is it Request itself?
210
232
  // Then ctx is present and it is the context
233
+ if ((rest === null || rest === void 0 ? void 0 : rest.length) > 0) {
234
+ ctx = Object.assign({}, ctx, ...rest);
235
+ }
236
+ if (!ctx.waitUntil) {
237
+ const waitUntilPromises = [];
238
+ ctx.waitUntil = (p) => {
239
+ waitUntilPromises.push(p);
240
+ };
241
+ const response$ = handleRequest(input, {
242
+ ...ctx,
243
+ waitUntil(p) {
244
+ waitUntilPromises.push(p);
245
+ }
246
+ });
247
+ if (waitUntilPromises.length > 0) {
248
+ return handleWaitUntils(waitUntilPromises).then(() => response$);
249
+ }
250
+ }
211
251
  return handleRequest(input, ctx);
212
252
  }
213
253
  return new Proxy(genericRequestHandler, {
package/index.mjs CHANGED
@@ -152,6 +152,13 @@ async function sendNodeResponse({ headers, status, statusText, body }, serverRes
152
152
  }
153
153
 
154
154
  /// <reference lib="webworker" />
155
+ function handleWaitUntils(waitUntilPromises) {
156
+ return Promise.allSettled(waitUntilPromises).then(waitUntils => waitUntils.forEach(waitUntil => {
157
+ if (waitUntil.status === 'rejected') {
158
+ console.error(waitUntil.reason);
159
+ }
160
+ }));
161
+ }
155
162
  function createServerAdapter({ Request: RequestCtor = Request, handleRequest, baseObject, }) {
156
163
  function fetchFn(input, init, ...ctx) {
157
164
  if (typeof input === 'string' || input instanceof URL) {
@@ -164,14 +171,24 @@ function createServerAdapter({ Request: RequestCtor = Request, handleRequest, ba
164
171
  return handleRequest(request, serverContext);
165
172
  }
166
173
  async function requestListener(nodeRequest, serverResponse) {
174
+ const waitUntilPromises = [];
167
175
  const response = await handleNodeRequest(nodeRequest, {
168
176
  req: nodeRequest,
169
177
  res: serverResponse,
170
178
  waitUntil(p) {
171
- p.catch(err => console.error(err));
179
+ waitUntilPromises.push(p);
172
180
  },
173
181
  });
174
- return sendNodeResponse(response, serverResponse);
182
+ if (response) {
183
+ await sendNodeResponse(response, serverResponse);
184
+ }
185
+ else {
186
+ await new Promise(resolve => {
187
+ serverResponse.statusCode = 404;
188
+ serverResponse.end(resolve);
189
+ });
190
+ }
191
+ await handleWaitUntils(waitUntilPromises);
175
192
  }
176
193
  function handleEvent(event) {
177
194
  if (!event.respondWith || !event.request) {
@@ -188,7 +205,12 @@ function createServerAdapter({ Request: RequestCtor = Request, handleRequest, ba
188
205
  handleEvent,
189
206
  handle: requestListener,
190
207
  };
191
- function genericRequestHandler(input, ctx) {
208
+ function genericRequestHandler(input, ctx, ...rest) {
209
+ var _a;
210
+ if ('process' in globalThis && ((_a = process.versions) === null || _a === void 0 ? void 0 : _a['bun']) != null) {
211
+ // This is required for bun
212
+ input.text();
213
+ }
192
214
  // If it is a Node request
193
215
  if (isReadable(input) && ctx != null && isServerResponse(ctx)) {
194
216
  return requestListener(input, ctx);
@@ -204,6 +226,24 @@ function createServerAdapter({ Request: RequestCtor = Request, handleRequest, ba
204
226
  }
205
227
  // Or is it Request itself?
206
228
  // Then ctx is present and it is the context
229
+ if ((rest === null || rest === void 0 ? void 0 : rest.length) > 0) {
230
+ ctx = Object.assign({}, ctx, ...rest);
231
+ }
232
+ if (!ctx.waitUntil) {
233
+ const waitUntilPromises = [];
234
+ ctx.waitUntil = (p) => {
235
+ waitUntilPromises.push(p);
236
+ };
237
+ const response$ = handleRequest(input, {
238
+ ...ctx,
239
+ waitUntil(p) {
240
+ waitUntilPromises.push(p);
241
+ }
242
+ });
243
+ if (waitUntilPromises.length > 0) {
244
+ return handleWaitUntils(waitUntilPromises).then(() => response$);
245
+ }
246
+ }
207
247
  return handleRequest(input, ctx);
208
248
  }
209
249
  return new Proxy(genericRequestHandler, {
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.1.2",
3
+ "version": "0.3.0-alpha-20220912131745-0b53401",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
7
7
  "@types/node": "^18.0.6"
8
8
  },
9
9
  "dependencies": {
10
- "@whatwg-node/fetch": "^0.3.0",
10
+ "@whatwg-node/fetch": "^0.4.0",
11
11
  "tslib": "^2.3.1"
12
12
  },
13
13
  "repository": {
14
14
  "type": "git",
15
15
  "url": "ardatan/whatwg-node",
16
- "directory": "packages/whatwg-server"
16
+ "directory": "packages/server"
17
17
  },
18
18
  "author": "Arda TANRIKULU <ardatanrikulu@gmail.com>",
19
19
  "license": "MIT",