@whatwg-node/server 0.7.4 → 0.7.5-alpha-20230320123631-3fc1dd7
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/README.md +1 -1
- package/cjs/createServerAdapter.js +251 -0
- package/cjs/index.js +12 -0
- package/cjs/package.json +1 -0
- package/cjs/plugins/types.js +0 -0
- package/cjs/plugins/useCors.js +124 -0
- package/cjs/plugins/useErrorHandling.js +44 -0
- package/cjs/types.js +0 -0
- package/cjs/utils.js +248 -0
- package/esm/createServerAdapter.js +247 -0
- package/esm/index.js +7 -0
- package/esm/plugins/types.js +0 -0
- package/esm/plugins/useCors.js +119 -0
- package/esm/plugins/useErrorHandling.js +38 -0
- package/esm/types.js +0 -0
- package/esm/utils.js +235 -0
- package/package.json +20 -13
- package/typings/createServerAdapter.d.cts +9 -0
- package/{createServerAdapter.d.ts → typings/createServerAdapter.d.ts} +2 -2
- package/typings/index.d.cts +7 -0
- package/typings/index.d.ts +7 -0
- package/typings/plugins/types.d.cts +21 -0
- package/{plugins → typings/plugins}/types.d.ts +1 -1
- package/typings/plugins/useCors.d.cts +13 -0
- package/typings/plugins/useErrorHandling.d.cts +11 -0
- package/{plugins → typings/plugins}/useErrorHandling.d.ts +1 -1
- package/typings/types.d.cts +56 -0
- package/{types.d.ts → typings/types.d.ts} +1 -1
- package/typings/utils.d.cts +33 -0
- package/{utils.d.ts → typings/utils.d.ts} +1 -1
- package/index.d.ts +0 -7
- package/index.js +0 -666
- package/index.mjs +0 -643
- /package/{plugins → typings/plugins}/useCors.d.ts +0 -0
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
|
+
export function getHeadersObj(headers) {
|
|
143
|
+
return new Proxy({}, {
|
|
144
|
+
get(_target, prop) {
|
|
145
|
+
return headers.get(prop) || undefined;
|
|
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.7.
|
|
3
|
+
"version": "0.7.5-alpha-20230320123631-3fc1dd7",
|
|
4
4
|
"description": "Fetch API compliant HTTP Server adapter",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@whatwg-node/fetch": "
|
|
7
|
+
"@whatwg-node/fetch": "0.8.3-alpha-20230320123631-3fc1dd7",
|
|
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.
|
|
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":
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
"
|
|
30
|
-
|
|
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,9 @@
|
|
|
1
|
+
import { ServerAdapterPlugin } from './plugins/types.cjs';
|
|
2
|
+
import { FetchAPI, ServerAdapter, ServerAdapterBaseObject, ServerAdapterRequestHandler } from './types.cjs';
|
|
3
|
+
export interface ServerAdapterOptions<TServerContext> {
|
|
4
|
+
plugins?: ServerAdapterPlugin<TServerContext>[];
|
|
5
|
+
fetchAPI?: Partial<FetchAPI>;
|
|
6
|
+
}
|
|
7
|
+
declare function createServerAdapter<TServerContext = {}, THandleRequest extends ServerAdapterRequestHandler<TServerContext> = ServerAdapterRequestHandler<TServerContext>>(serverAdapterRequestHandler: THandleRequest, options?: ServerAdapterOptions<TServerContext>): ServerAdapter<TServerContext, ServerAdapterBaseObject<TServerContext, THandleRequest>>;
|
|
8
|
+
declare function createServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>>(serverAdapterBaseObject: TBaseObject, options?: ServerAdapterOptions<TServerContext>): ServerAdapter<TServerContext, TBaseObject>;
|
|
9
|
+
export { createServerAdapter };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ServerAdapterPlugin } from './plugins/types';
|
|
2
|
-
import { FetchAPI, ServerAdapter, ServerAdapterBaseObject, ServerAdapterRequestHandler } from './types';
|
|
1
|
+
import { ServerAdapterPlugin } from './plugins/types.js';
|
|
2
|
+
import { FetchAPI, ServerAdapter, ServerAdapterBaseObject, ServerAdapterRequestHandler } from './types.js';
|
|
3
3
|
export interface ServerAdapterOptions<TServerContext> {
|
|
4
4
|
plugins?: ServerAdapterPlugin<TServerContext>[];
|
|
5
5
|
fetchAPI?: Partial<FetchAPI>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './createServerAdapter.cjs';
|
|
2
|
+
export * from './types.cjs';
|
|
3
|
+
export * from './utils.cjs';
|
|
4
|
+
export * from './plugins/types.cjs';
|
|
5
|
+
export * from './plugins/useCors.cjs';
|
|
6
|
+
export * from './plugins/useErrorHandling.cjs';
|
|
7
|
+
export { Response } from '@whatwg-node/fetch';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './createServerAdapter.js';
|
|
2
|
+
export * from './types.js';
|
|
3
|
+
export * from './utils.js';
|
|
4
|
+
export * from './plugins/types.js';
|
|
5
|
+
export * from './plugins/useCors.js';
|
|
6
|
+
export * from './plugins/useErrorHandling.js';
|
|
7
|
+
export { Response } from '@whatwg-node/fetch';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FetchAPI, ServerAdapterRequestHandler } from '../types.cjs';
|
|
2
|
+
export interface ServerAdapterPlugin<TServerContext = {}> {
|
|
3
|
+
onRequest?: OnRequestHook<TServerContext>;
|
|
4
|
+
onResponse?: OnResponseHook<TServerContext>;
|
|
5
|
+
}
|
|
6
|
+
export type OnRequestHook<TServerContext> = (payload: OnRequestEventPayload<TServerContext>) => Promise<void> | void;
|
|
7
|
+
export interface OnRequestEventPayload<TServerContext> {
|
|
8
|
+
request: Request;
|
|
9
|
+
serverContext: TServerContext | undefined;
|
|
10
|
+
fetchAPI: FetchAPI;
|
|
11
|
+
requestHandler: ServerAdapterRequestHandler<TServerContext>;
|
|
12
|
+
setRequestHandler(newRequestHandler: ServerAdapterRequestHandler<TServerContext>): void;
|
|
13
|
+
endResponse(response: Response): void;
|
|
14
|
+
url: URL;
|
|
15
|
+
}
|
|
16
|
+
export type OnResponseHook<TServerContext> = (payload: OnResponseEventPayload<TServerContext>) => Promise<void> | void;
|
|
17
|
+
export interface OnResponseEventPayload<TServerContext> {
|
|
18
|
+
request: Request;
|
|
19
|
+
serverContext: TServerContext | undefined;
|
|
20
|
+
response: Response;
|
|
21
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FetchAPI, ServerAdapterRequestHandler } from '../types';
|
|
1
|
+
import { FetchAPI, ServerAdapterRequestHandler } from '../types.js';
|
|
2
2
|
export interface ServerAdapterPlugin<TServerContext = {}> {
|
|
3
3
|
onRequest?: OnRequestHook<TServerContext>;
|
|
4
4
|
onResponse?: OnResponseHook<TServerContext>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ServerAdapterPlugin } from './types.cjs';
|
|
2
|
+
export type CORSOptions = {
|
|
3
|
+
origin?: string[] | string;
|
|
4
|
+
methods?: string[];
|
|
5
|
+
allowedHeaders?: string[];
|
|
6
|
+
exposedHeaders?: string[];
|
|
7
|
+
credentials?: boolean;
|
|
8
|
+
maxAge?: number;
|
|
9
|
+
} | false;
|
|
10
|
+
export type CORSPluginOptions<TServerContext> = CORSOptionsFactory<TServerContext> | CORSOptions | boolean;
|
|
11
|
+
export type CORSOptionsFactory<TServerContext> = (request: Request, ...args: {} extends TServerContext ? [serverContext?: TServerContext | undefined] : [serverContext: TServerContext]) => CORSOptions | Promise<CORSOptions>;
|
|
12
|
+
export declare function getCORSHeadersByRequestAndOptions(request: Request, corsOptions: CORSOptions): Record<string, string> | null;
|
|
13
|
+
export declare function useCORS<TServerContext>(options?: CORSPluginOptions<TServerContext>): ServerAdapterPlugin<TServerContext>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ServerAdapterPlugin } from './types.cjs';
|
|
2
|
+
export declare function createDefaultErrorHandler<TServerContext = {}>(ResponseCtor?: typeof Response): ErrorHandler<TServerContext>;
|
|
3
|
+
export declare class HTTPError extends Error {
|
|
4
|
+
status: number;
|
|
5
|
+
message: string;
|
|
6
|
+
headers: HeadersInit;
|
|
7
|
+
details?: any;
|
|
8
|
+
constructor(status: number, message: string, headers?: HeadersInit, details?: any);
|
|
9
|
+
}
|
|
10
|
+
export type ErrorHandler<TServerContext> = (e: any, request: Request, ctx: TServerContext) => Response | Promise<Response>;
|
|
11
|
+
export declare function useErrorHandling<TServerContext>(onError?: ErrorHandler<TServerContext>): ServerAdapterPlugin<TServerContext>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ServerAdapterPlugin } from './types';
|
|
1
|
+
import { ServerAdapterPlugin } from './types.js';
|
|
2
2
|
export declare function createDefaultErrorHandler<TServerContext = {}>(ResponseCtor?: typeof Response): ErrorHandler<TServerContext>;
|
|
3
3
|
export declare class HTTPError extends Error {
|
|
4
4
|
status: number;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { RequestListener } from 'node:http';
|
|
3
|
+
import type { NodeRequest, NodeResponse } from './utils.cjs';
|
|
4
|
+
export interface FetchEvent extends Event {
|
|
5
|
+
waitUntil(f: Promise<void> | void): void;
|
|
6
|
+
request: Request;
|
|
7
|
+
respondWith(r: Response | PromiseLike<Response>): void;
|
|
8
|
+
}
|
|
9
|
+
export interface ServerAdapterBaseObject<TServerContext, THandleRequest extends ServerAdapterRequestHandler<TServerContext> = ServerAdapterRequestHandler<TServerContext>> {
|
|
10
|
+
/**
|
|
11
|
+
* An async function that takes `Request` and the server context and returns a `Response`.
|
|
12
|
+
* If you use `requestListener`, the server context is `{ req: IncomingMessage, res: ServerResponse }`.
|
|
13
|
+
*/
|
|
14
|
+
handle: THandleRequest;
|
|
15
|
+
}
|
|
16
|
+
export interface ServerAdapterObject<TServerContext> extends EventListenerObject {
|
|
17
|
+
/**
|
|
18
|
+
* A basic request listener that takes a `Request` with the server context and returns a `Response`.
|
|
19
|
+
*/
|
|
20
|
+
handleRequest: (request: Request, ctx: TServerContext) => Promise<Response>;
|
|
21
|
+
/**
|
|
22
|
+
* WHATWG Fetch spec compliant `fetch` function that can be used for testing purposes.
|
|
23
|
+
*/
|
|
24
|
+
fetch(request: Request, ctx: TServerContext): Promise<Response> | Response;
|
|
25
|
+
fetch(request: Request, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
26
|
+
fetch(urlStr: string, ctx: TServerContext): Promise<Response> | Response;
|
|
27
|
+
fetch(urlStr: string, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
28
|
+
fetch(urlStr: string, init: RequestInit, ctx: TServerContext): Promise<Response> | Response;
|
|
29
|
+
fetch(urlStr: string, init: RequestInit, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
30
|
+
fetch(url: URL, ctx: TServerContext): Promise<Response> | Response;
|
|
31
|
+
fetch(url: URL, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
32
|
+
fetch(url: URL, init: RequestInit, ctx: TServerContext): Promise<Response> | Response;
|
|
33
|
+
fetch(url: URL, init: RequestInit, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
34
|
+
/**
|
|
35
|
+
* This function takes Node's request object and returns a WHATWG Fetch spec compliant `Response` object.
|
|
36
|
+
**/
|
|
37
|
+
handleNodeRequest(nodeRequest: NodeRequest, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
38
|
+
/**
|
|
39
|
+
* A request listener function that can be used with any Node server variation.
|
|
40
|
+
*/
|
|
41
|
+
requestListener: RequestListener;
|
|
42
|
+
handle(req: NodeRequest, res: NodeResponse, ...ctx: Partial<TServerContext>[]): Promise<void>;
|
|
43
|
+
handle(request: Request, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
44
|
+
handle(fetchEvent: FetchEvent & Partial<TServerContext>, ...ctx: Partial<TServerContext>[]): void;
|
|
45
|
+
handle(container: {
|
|
46
|
+
request: Request;
|
|
47
|
+
} & Partial<TServerContext>, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
48
|
+
}
|
|
49
|
+
export type ServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>> = TBaseObject & ServerAdapterObject<TServerContext>['handle'] & ServerAdapterObject<TServerContext>;
|
|
50
|
+
export type ServerAdapterRequestHandler<TServerContext> = (request: Request, ctx: TServerContext) => Promise<Response> | Response;
|
|
51
|
+
export type ServerAdapterNodeContext = {
|
|
52
|
+
req: NodeRequest;
|
|
53
|
+
res: NodeResponse;
|
|
54
|
+
};
|
|
55
|
+
export type WaitUntilFn = (promise: Promise<void> | void) => void;
|
|
56
|
+
export type FetchAPI = ReturnType<typeof import('@whatwg-node/fetch').createFetch>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import type { RequestListener } from 'node:http';
|
|
3
|
-
import type { NodeRequest, NodeResponse } from './utils';
|
|
3
|
+
import type { NodeRequest, NodeResponse } from './utils.js';
|
|
4
4
|
export interface FetchEvent extends Event {
|
|
5
5
|
waitUntil(f: Promise<void> | void): void;
|
|
6
6
|
request: Request;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
/// <reference types="node" />
|
|
5
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
6
|
+
import type { Http2ServerRequest, Http2ServerResponse, OutgoingHttpHeaders } from 'node:http2';
|
|
7
|
+
import type { Socket } from 'node:net';
|
|
8
|
+
import type { Readable } from 'node:stream';
|
|
9
|
+
import { FetchEvent } from './types.cjs';
|
|
10
|
+
export declare function isAsyncIterable(body: any): body is AsyncIterable<any>;
|
|
11
|
+
export interface NodeRequest {
|
|
12
|
+
protocol?: string;
|
|
13
|
+
hostname?: string;
|
|
14
|
+
body?: any;
|
|
15
|
+
url?: string;
|
|
16
|
+
originalUrl?: string;
|
|
17
|
+
method?: string;
|
|
18
|
+
headers?: any;
|
|
19
|
+
req?: IncomingMessage | Http2ServerRequest;
|
|
20
|
+
raw?: IncomingMessage | Http2ServerRequest;
|
|
21
|
+
socket?: Socket;
|
|
22
|
+
query?: any;
|
|
23
|
+
}
|
|
24
|
+
export type NodeResponse = ServerResponse | Http2ServerResponse;
|
|
25
|
+
export declare function normalizeNodeRequest(nodeRequest: NodeRequest, RequestCtor: typeof Request): Request;
|
|
26
|
+
export declare function isReadable(stream: any): stream is Readable;
|
|
27
|
+
export declare function isNodeRequest(request: any): request is NodeRequest;
|
|
28
|
+
export declare function isServerResponse(stream: any): stream is NodeResponse;
|
|
29
|
+
export declare function isReadableStream(stream: any): stream is ReadableStream;
|
|
30
|
+
export declare function isFetchEvent(event: any): event is FetchEvent;
|
|
31
|
+
export declare function getHeadersObj(headers: Headers): OutgoingHttpHeaders;
|
|
32
|
+
export declare function sendNodeResponse(fetchResponse: Response, serverResponse: NodeResponse, nodeRequest: NodeRequest): Promise<void>;
|
|
33
|
+
export declare function isRequestInit(val: unknown): val is RequestInit;
|
|
@@ -6,7 +6,7 @@ import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
|
6
6
|
import type { Http2ServerRequest, Http2ServerResponse, OutgoingHttpHeaders } from 'node:http2';
|
|
7
7
|
import type { Socket } from 'node:net';
|
|
8
8
|
import type { Readable } from 'node:stream';
|
|
9
|
-
import { FetchEvent } from './types';
|
|
9
|
+
import { FetchEvent } from './types.js';
|
|
10
10
|
export declare function isAsyncIterable(body: any): body is AsyncIterable<any>;
|
|
11
11
|
export interface NodeRequest {
|
|
12
12
|
protocol?: string;
|
package/index.d.ts
DELETED