@whatwg-node/server 0.2.0 → 0.3.0-alpha-20220912131329-1c53d82

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
@@ -47,4 +47,5 @@ export declare type ServerAdapter<TServerContext, TBaseObject> = TBaseObject & R
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,7 @@ 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) {
196
213
  var _a;
197
214
  if ('process' in globalThis && ((_a = process.versions) === null || _a === void 0 ? void 0 : _a['bun']) != null) {
198
215
  // This is required for bun
@@ -213,6 +230,24 @@ function createServerAdapter({ Request: RequestCtor = fetch.Request, handleReque
213
230
  }
214
231
  // Or is it Request itself?
215
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
+ }
216
251
  return handleRequest(input, ctx);
217
252
  }
218
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,7 @@ 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) {
192
209
  var _a;
193
210
  if ('process' in globalThis && ((_a = process.versions) === null || _a === void 0 ? void 0 : _a['bun']) != null) {
194
211
  // This is required for bun
@@ -209,6 +226,24 @@ function createServerAdapter({ Request: RequestCtor = Request, handleRequest, ba
209
226
  }
210
227
  // Or is it Request itself?
211
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
+ }
212
247
  return handleRequest(input, ctx);
213
248
  }
214
249
  return new Proxy(genericRequestHandler, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.2.0",
3
+ "version": "0.3.0-alpha-20220912131329-1c53d82",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
@@ -13,7 +13,7 @@
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",