@whatwg-node/server 0.1.1 → 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
@@ -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
@@ -102,6 +102,8 @@ function normalizeNodeRequest(nodeRequest, RequestCtor) {
102
102
  switch (prop) {
103
103
  case 'json':
104
104
  return async () => maybeParsedBody;
105
+ case 'text':
106
+ return async () => JSON.stringify(maybeParsedBody);
105
107
  default:
106
108
  return Reflect.get(target, prop, receiver);
107
109
  }
@@ -154,6 +156,13 @@ async function sendNodeResponse({ headers, status, statusText, body }, serverRes
154
156
  }
155
157
 
156
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
+ }
157
166
  function createServerAdapter({ Request: RequestCtor = fetch.Request, handleRequest, baseObject, }) {
158
167
  function fetchFn(input, init, ...ctx) {
159
168
  if (typeof input === 'string' || input instanceof URL) {
@@ -166,14 +175,24 @@ function createServerAdapter({ Request: RequestCtor = fetch.Request, handleReque
166
175
  return handleRequest(request, serverContext);
167
176
  }
168
177
  async function requestListener(nodeRequest, serverResponse) {
178
+ const waitUntilPromises = [];
169
179
  const response = await handleNodeRequest(nodeRequest, {
170
180
  req: nodeRequest,
171
181
  res: serverResponse,
172
182
  waitUntil(p) {
173
- p.catch(err => console.error(err));
183
+ waitUntilPromises.push(p);
174
184
  },
175
185
  });
176
- 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);
177
196
  }
178
197
  function handleEvent(event) {
179
198
  if (!event.respondWith || !event.request) {
@@ -190,7 +209,12 @@ function createServerAdapter({ Request: RequestCtor = fetch.Request, handleReque
190
209
  handleEvent,
191
210
  handle: requestListener,
192
211
  };
193
- 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
+ }
194
218
  // If it is a Node request
195
219
  if (isReadable(input) && ctx != null && isServerResponse(ctx)) {
196
220
  return requestListener(input, ctx);
@@ -206,6 +230,24 @@ function createServerAdapter({ Request: RequestCtor = fetch.Request, handleReque
206
230
  }
207
231
  // Or is it Request itself?
208
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
+ }
209
251
  return handleRequest(input, ctx);
210
252
  }
211
253
  return new Proxy(genericRequestHandler, {
package/index.mjs CHANGED
@@ -98,6 +98,8 @@ function normalizeNodeRequest(nodeRequest, RequestCtor) {
98
98
  switch (prop) {
99
99
  case 'json':
100
100
  return async () => maybeParsedBody;
101
+ case 'text':
102
+ return async () => JSON.stringify(maybeParsedBody);
101
103
  default:
102
104
  return Reflect.get(target, prop, receiver);
103
105
  }
@@ -150,6 +152,13 @@ async function sendNodeResponse({ headers, status, statusText, body }, serverRes
150
152
  }
151
153
 
152
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
+ }
153
162
  function createServerAdapter({ Request: RequestCtor = Request, handleRequest, baseObject, }) {
154
163
  function fetchFn(input, init, ...ctx) {
155
164
  if (typeof input === 'string' || input instanceof URL) {
@@ -162,14 +171,24 @@ function createServerAdapter({ Request: RequestCtor = Request, handleRequest, ba
162
171
  return handleRequest(request, serverContext);
163
172
  }
164
173
  async function requestListener(nodeRequest, serverResponse) {
174
+ const waitUntilPromises = [];
165
175
  const response = await handleNodeRequest(nodeRequest, {
166
176
  req: nodeRequest,
167
177
  res: serverResponse,
168
178
  waitUntil(p) {
169
- p.catch(err => console.error(err));
179
+ waitUntilPromises.push(p);
170
180
  },
171
181
  });
172
- 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);
173
192
  }
174
193
  function handleEvent(event) {
175
194
  if (!event.respondWith || !event.request) {
@@ -186,7 +205,12 @@ function createServerAdapter({ Request: RequestCtor = Request, handleRequest, ba
186
205
  handleEvent,
187
206
  handle: requestListener,
188
207
  };
189
- 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
+ }
190
214
  // If it is a Node request
191
215
  if (isReadable(input) && ctx != null && isServerResponse(ctx)) {
192
216
  return requestListener(input, ctx);
@@ -202,6 +226,24 @@ function createServerAdapter({ Request: RequestCtor = Request, handleRequest, ba
202
226
  }
203
227
  // Or is it Request itself?
204
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
+ }
205
247
  return handleRequest(input, ctx);
206
248
  }
207
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.1",
3
+ "version": "0.3.0-alpha-20220912131329-1c53d82",
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.2.9",
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",