@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 +2 -1
- package/index.js +45 -3
- package/index.mjs +45 -3
- package/package.json +3 -3
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
|
-
|
|
183
|
+
waitUntilPromises.push(p);
|
|
174
184
|
},
|
|
175
185
|
});
|
|
176
|
-
|
|
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
|
-
|
|
179
|
+
waitUntilPromises.push(p);
|
|
170
180
|
},
|
|
171
181
|
});
|
|
172
|
-
|
|
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.
|
|
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.
|
|
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/
|
|
16
|
+
"directory": "packages/server"
|
|
17
17
|
},
|
|
18
18
|
"author": "Arda TANRIKULU <ardatanrikulu@gmail.com>",
|
|
19
19
|
"license": "MIT",
|