h3 0.5.1 → 0.5.4
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/dist/index.cjs +143 -120
- package/dist/index.d.ts +2 -1
- package/dist/index.mjs +144 -122
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -11,114 +11,6 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
|
|
|
11
11
|
|
|
12
12
|
const destr__default = /*#__PURE__*/_interopDefaultLegacy(destr);
|
|
13
13
|
|
|
14
|
-
const defineHandler = (handler) => handler;
|
|
15
|
-
const defineHandle = defineHandler;
|
|
16
|
-
const defineMiddleware = (middleware) => middleware;
|
|
17
|
-
function promisifyHandler(handler) {
|
|
18
|
-
return function(req, res) {
|
|
19
|
-
return callHandler(handler, req, res);
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
const promisifyHandle = promisifyHandler;
|
|
23
|
-
function callHandler(handler, req, res) {
|
|
24
|
-
return new Promise((resolve, reject) => {
|
|
25
|
-
const next = (err) => err ? reject(err) : resolve(void 0);
|
|
26
|
-
try {
|
|
27
|
-
return resolve(handler(req, res, next));
|
|
28
|
-
} catch (err) {
|
|
29
|
-
next(err);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
function defineLazyHandler(handler, promisify) {
|
|
34
|
-
let _promise;
|
|
35
|
-
const resolve = () => {
|
|
36
|
-
if (!_promise) {
|
|
37
|
-
_promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
|
|
38
|
-
}
|
|
39
|
-
return _promise;
|
|
40
|
-
};
|
|
41
|
-
return function(req, res) {
|
|
42
|
-
return resolve().then((h) => h(req, res));
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
const lazyHandle = defineLazyHandler;
|
|
46
|
-
function useBase(base, handler) {
|
|
47
|
-
base = ufo.withoutTrailingSlash(base);
|
|
48
|
-
if (!base) {
|
|
49
|
-
return handler;
|
|
50
|
-
}
|
|
51
|
-
return function(req, res) {
|
|
52
|
-
req.originalUrl = req.originalUrl || req.url || "/";
|
|
53
|
-
req.url = ufo.withoutBase(req.url || "/", base);
|
|
54
|
-
return handler(req, res);
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function defineEventHandler(handler) {
|
|
59
|
-
handler.__is_handler__ = true;
|
|
60
|
-
return handler;
|
|
61
|
-
}
|
|
62
|
-
function defineLazyEventHandler(factory) {
|
|
63
|
-
let _promise;
|
|
64
|
-
let _resolved;
|
|
65
|
-
const resolveHandler = () => {
|
|
66
|
-
if (_resolved) {
|
|
67
|
-
return Promise.resolve(_resolved);
|
|
68
|
-
}
|
|
69
|
-
if (!_promise) {
|
|
70
|
-
_promise = Promise.resolve(factory()).then((r) => {
|
|
71
|
-
const handler = r.default || r;
|
|
72
|
-
if (typeof handler !== "function") {
|
|
73
|
-
throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
|
|
74
|
-
}
|
|
75
|
-
_resolved = toEventHandler(r.default || r);
|
|
76
|
-
return _resolved;
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
return _promise;
|
|
80
|
-
};
|
|
81
|
-
return defineEventHandler((event) => {
|
|
82
|
-
if (_resolved) {
|
|
83
|
-
return _resolved(event);
|
|
84
|
-
}
|
|
85
|
-
return resolveHandler().then((handler) => handler(event));
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
function isEventHandler(input) {
|
|
89
|
-
return "__is_handler__" in input;
|
|
90
|
-
}
|
|
91
|
-
function toEventHandler(handler) {
|
|
92
|
-
if (isEventHandler(handler)) {
|
|
93
|
-
return handler;
|
|
94
|
-
}
|
|
95
|
-
if (typeof handler !== "function") {
|
|
96
|
-
throw new TypeError("Invalid handler. It should be a function:", handler);
|
|
97
|
-
}
|
|
98
|
-
return defineEventHandler((event) => {
|
|
99
|
-
return callHandler(handler, event.req, event.res);
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
function createEvent(req, res) {
|
|
103
|
-
const event = {
|
|
104
|
-
__is_event__: true,
|
|
105
|
-
req,
|
|
106
|
-
res
|
|
107
|
-
};
|
|
108
|
-
event.event = event;
|
|
109
|
-
req.event = event;
|
|
110
|
-
req.req = req;
|
|
111
|
-
req.res = res;
|
|
112
|
-
res.event = event;
|
|
113
|
-
res.res = res;
|
|
114
|
-
res.req.res = res;
|
|
115
|
-
res.req.req = req;
|
|
116
|
-
return event;
|
|
117
|
-
}
|
|
118
|
-
function isEvent(input) {
|
|
119
|
-
return "__is_event__" in input;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
14
|
function useQuery(event) {
|
|
123
15
|
return ufo.getQuery(event.req.url || "");
|
|
124
16
|
}
|
|
@@ -177,6 +69,10 @@ async function useBody(event) {
|
|
|
177
69
|
return event.req[ParsedBodySymbol];
|
|
178
70
|
}
|
|
179
71
|
const body = await useRawBody(event);
|
|
72
|
+
if (event.req.headers["content-type"] === "application/x-www-form-urlencoded") {
|
|
73
|
+
const parsedForm = Object.fromEntries(new URLSearchParams(body));
|
|
74
|
+
return parsedForm;
|
|
75
|
+
}
|
|
180
76
|
const json = destr__default(body);
|
|
181
77
|
event.req[ParsedBodySymbol] = json;
|
|
182
78
|
return json;
|
|
@@ -272,30 +168,152 @@ function createError(input) {
|
|
|
272
168
|
return err;
|
|
273
169
|
}
|
|
274
170
|
function sendError(event, error, debug) {
|
|
275
|
-
let h3Error;
|
|
276
|
-
if (error instanceof H3Error) {
|
|
277
|
-
h3Error = error;
|
|
278
|
-
} else {
|
|
279
|
-
console.error(error);
|
|
280
|
-
h3Error = createError(error);
|
|
281
|
-
}
|
|
282
171
|
if (event.res.writableEnded) {
|
|
283
172
|
return;
|
|
284
173
|
}
|
|
285
|
-
|
|
286
|
-
event.res.statusMessage = h3Error.statusMessage;
|
|
174
|
+
const h3Error = isError(error) ? error : createError(error);
|
|
287
175
|
const responseBody = {
|
|
288
|
-
statusCode:
|
|
289
|
-
statusMessage:
|
|
176
|
+
statusCode: h3Error.statusCode,
|
|
177
|
+
statusMessage: h3Error.statusMessage,
|
|
290
178
|
stack: [],
|
|
291
179
|
data: h3Error.data
|
|
292
180
|
};
|
|
293
181
|
if (debug) {
|
|
294
182
|
responseBody.stack = (h3Error.stack || "").split("\n").map((l) => l.trim());
|
|
295
183
|
}
|
|
184
|
+
if (event.res.writableEnded) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
event.res.statusCode = h3Error.statusCode;
|
|
188
|
+
event.res.statusMessage = h3Error.statusMessage;
|
|
296
189
|
event.res.setHeader("Content-Type", MIMES.json);
|
|
297
190
|
event.res.end(JSON.stringify(responseBody, null, 2));
|
|
298
191
|
}
|
|
192
|
+
function isError(input) {
|
|
193
|
+
return input instanceof H3Error;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const defineHandler = (handler) => handler;
|
|
197
|
+
const defineHandle = defineHandler;
|
|
198
|
+
const defineMiddleware = (middleware) => middleware;
|
|
199
|
+
function promisifyHandler(handler) {
|
|
200
|
+
return function(req, res) {
|
|
201
|
+
return callHandler(handler, req, res);
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
const promisifyHandle = promisifyHandler;
|
|
205
|
+
function callHandler(handler, req, res) {
|
|
206
|
+
const isMiddleware = handler.length > 2;
|
|
207
|
+
return new Promise((resolve, reject) => {
|
|
208
|
+
const next = (err) => {
|
|
209
|
+
if (isMiddleware) {
|
|
210
|
+
res.off("close", next);
|
|
211
|
+
res.off("error", next);
|
|
212
|
+
}
|
|
213
|
+
return err ? reject(createError(err)) : resolve(void 0);
|
|
214
|
+
};
|
|
215
|
+
try {
|
|
216
|
+
const returned = handler(req, res, next);
|
|
217
|
+
if (isMiddleware && returned === void 0) {
|
|
218
|
+
res.once("close", next);
|
|
219
|
+
res.once("error", next);
|
|
220
|
+
} else {
|
|
221
|
+
resolve(returned);
|
|
222
|
+
}
|
|
223
|
+
} catch (err) {
|
|
224
|
+
next(err);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function defineLazyHandler(handler, promisify) {
|
|
229
|
+
let _promise;
|
|
230
|
+
const resolve = () => {
|
|
231
|
+
if (!_promise) {
|
|
232
|
+
_promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
|
|
233
|
+
}
|
|
234
|
+
return _promise;
|
|
235
|
+
};
|
|
236
|
+
return function(req, res) {
|
|
237
|
+
return resolve().then((h) => h(req, res));
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const lazyHandle = defineLazyHandler;
|
|
241
|
+
function useBase(base, handler) {
|
|
242
|
+
base = ufo.withoutTrailingSlash(base);
|
|
243
|
+
if (!base) {
|
|
244
|
+
return handler;
|
|
245
|
+
}
|
|
246
|
+
return function(req, res) {
|
|
247
|
+
req.originalUrl = req.originalUrl || req.url || "/";
|
|
248
|
+
req.url = ufo.withoutBase(req.url || "/", base);
|
|
249
|
+
return handler(req, res);
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function defineEventHandler(handler) {
|
|
254
|
+
handler.__is_handler__ = true;
|
|
255
|
+
return handler;
|
|
256
|
+
}
|
|
257
|
+
function defineLazyEventHandler(factory) {
|
|
258
|
+
let _promise;
|
|
259
|
+
let _resolved;
|
|
260
|
+
const resolveHandler = () => {
|
|
261
|
+
if (_resolved) {
|
|
262
|
+
return Promise.resolve(_resolved);
|
|
263
|
+
}
|
|
264
|
+
if (!_promise) {
|
|
265
|
+
_promise = Promise.resolve(factory()).then((r) => {
|
|
266
|
+
const handler = r.default || r;
|
|
267
|
+
if (typeof handler !== "function") {
|
|
268
|
+
throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
|
|
269
|
+
}
|
|
270
|
+
_resolved = toEventHandler(r.default || r);
|
|
271
|
+
return _resolved;
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
return _promise;
|
|
275
|
+
};
|
|
276
|
+
return defineEventHandler((event) => {
|
|
277
|
+
if (_resolved) {
|
|
278
|
+
return _resolved(event);
|
|
279
|
+
}
|
|
280
|
+
return resolveHandler().then((handler) => handler(event));
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
function isEventHandler(input) {
|
|
284
|
+
return "__is_handler__" in input;
|
|
285
|
+
}
|
|
286
|
+
function toEventHandler(handler) {
|
|
287
|
+
if (isEventHandler(handler)) {
|
|
288
|
+
return handler;
|
|
289
|
+
}
|
|
290
|
+
if (typeof handler !== "function") {
|
|
291
|
+
throw new TypeError("Invalid handler. It should be a function:", handler);
|
|
292
|
+
}
|
|
293
|
+
return defineEventHandler((event) => {
|
|
294
|
+
return callHandler(handler, event.req, event.res);
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
function createEvent(req, res) {
|
|
298
|
+
const event = {
|
|
299
|
+
__is_event__: true,
|
|
300
|
+
req,
|
|
301
|
+
res
|
|
302
|
+
};
|
|
303
|
+
event.event = event;
|
|
304
|
+
req.event = event;
|
|
305
|
+
req.req = req;
|
|
306
|
+
req.res = res;
|
|
307
|
+
res.event = event;
|
|
308
|
+
res.res = res;
|
|
309
|
+
res.req = res.req || {};
|
|
310
|
+
res.req.res = res;
|
|
311
|
+
res.req.req = req;
|
|
312
|
+
return event;
|
|
313
|
+
}
|
|
314
|
+
function isEvent(input) {
|
|
315
|
+
return "__is_event__" in input;
|
|
316
|
+
}
|
|
299
317
|
|
|
300
318
|
function createApp(options = {}) {
|
|
301
319
|
const stack = [];
|
|
@@ -307,8 +325,12 @@ function createApp(options = {}) {
|
|
|
307
325
|
} catch (err) {
|
|
308
326
|
if (options.onError) {
|
|
309
327
|
await options.onError(err, event);
|
|
328
|
+
} else {
|
|
329
|
+
if (!isError(err)) {
|
|
330
|
+
console.error("[h3]", err);
|
|
331
|
+
}
|
|
332
|
+
await sendError(event, err, !!options.debug);
|
|
310
333
|
}
|
|
311
|
-
await sendError(event, err, !!options.debug);
|
|
312
334
|
}
|
|
313
335
|
};
|
|
314
336
|
const app = nodeHandler;
|
|
@@ -456,6 +478,7 @@ exports.defineLazyEventHandler = defineLazyEventHandler;
|
|
|
456
478
|
exports.defineLazyHandler = defineLazyHandler;
|
|
457
479
|
exports.defineMiddleware = defineMiddleware;
|
|
458
480
|
exports.deleteCookie = deleteCookie;
|
|
481
|
+
exports.isError = isError;
|
|
459
482
|
exports.isEvent = isEvent;
|
|
460
483
|
exports.isEventHandler = isEventHandler;
|
|
461
484
|
exports.isMethod = isMethod;
|
package/dist/index.d.ts
CHANGED
|
@@ -121,6 +121,7 @@ declare function createError(input: Partial<H3Error>): H3Error;
|
|
|
121
121
|
* In the debug mode the stack trace of errors will be return in response.
|
|
122
122
|
*/
|
|
123
123
|
declare function sendError(event: CompatibilityEvent, error: Error | H3Error, debug?: boolean): void;
|
|
124
|
+
declare function isError(input: any): input is H3Error;
|
|
124
125
|
|
|
125
126
|
declare const defineHandler: <T>(handler: Handler<T, {}>) => Handler<T, {}>;
|
|
126
127
|
/** @deprecated Use defineHandler */
|
|
@@ -224,4 +225,4 @@ interface Router extends AddRouteShortcuts {
|
|
|
224
225
|
}
|
|
225
226
|
declare function createRouter(): Router;
|
|
226
227
|
|
|
227
|
-
export { AddRouteShortcuts, App, AppOptions, AppUse, CompatibilityEvent, CompatibilityEventHandler, Encoding, EventHandler, H3Error, H3Event, H3Response, HTTPMethod, Handler, IncomingMessage, InputLayer, InputStack, JSONValue, Layer, LazyEventHandler, LazyHandler, MIMES, Matcher, Middleware, NodeHandler, PromisifiedHandler, Router, RouterMethod, RouterUse, ServerResponse, Stack, _JSONValue, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, isEvent, isEventHandler, isMethod, isStream, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
|
|
228
|
+
export { AddRouteShortcuts, App, AppOptions, AppUse, CompatibilityEvent, CompatibilityEventHandler, Encoding, EventHandler, H3Error, H3Event, H3Response, HTTPMethod, Handler, IncomingMessage, InputLayer, InputStack, JSONValue, Layer, LazyEventHandler, LazyHandler, MIMES, Matcher, Middleware, NodeHandler, PromisifiedHandler, Router, RouterMethod, RouterUse, ServerResponse, Stack, _JSONValue, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, isError, isEvent, isEventHandler, isMethod, isStream, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
|
package/dist/index.mjs
CHANGED
|
@@ -1,116 +1,8 @@
|
|
|
1
|
-
import { withoutTrailingSlash, withoutBase
|
|
1
|
+
import { getQuery, withoutTrailingSlash, withoutBase } from 'ufo';
|
|
2
2
|
import { createRouter as createRouter$1 } from 'radix3';
|
|
3
3
|
import destr from 'destr';
|
|
4
4
|
import { parse, serialize } from 'cookie-es';
|
|
5
5
|
|
|
6
|
-
const defineHandler = (handler) => handler;
|
|
7
|
-
const defineHandle = defineHandler;
|
|
8
|
-
const defineMiddleware = (middleware) => middleware;
|
|
9
|
-
function promisifyHandler(handler) {
|
|
10
|
-
return function(req, res) {
|
|
11
|
-
return callHandler(handler, req, res);
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
const promisifyHandle = promisifyHandler;
|
|
15
|
-
function callHandler(handler, req, res) {
|
|
16
|
-
return new Promise((resolve, reject) => {
|
|
17
|
-
const next = (err) => err ? reject(err) : resolve(void 0);
|
|
18
|
-
try {
|
|
19
|
-
return resolve(handler(req, res, next));
|
|
20
|
-
} catch (err) {
|
|
21
|
-
next(err);
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
function defineLazyHandler(handler, promisify) {
|
|
26
|
-
let _promise;
|
|
27
|
-
const resolve = () => {
|
|
28
|
-
if (!_promise) {
|
|
29
|
-
_promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
|
|
30
|
-
}
|
|
31
|
-
return _promise;
|
|
32
|
-
};
|
|
33
|
-
return function(req, res) {
|
|
34
|
-
return resolve().then((h) => h(req, res));
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
const lazyHandle = defineLazyHandler;
|
|
38
|
-
function useBase(base, handler) {
|
|
39
|
-
base = withoutTrailingSlash(base);
|
|
40
|
-
if (!base) {
|
|
41
|
-
return handler;
|
|
42
|
-
}
|
|
43
|
-
return function(req, res) {
|
|
44
|
-
req.originalUrl = req.originalUrl || req.url || "/";
|
|
45
|
-
req.url = withoutBase(req.url || "/", base);
|
|
46
|
-
return handler(req, res);
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function defineEventHandler(handler) {
|
|
51
|
-
handler.__is_handler__ = true;
|
|
52
|
-
return handler;
|
|
53
|
-
}
|
|
54
|
-
function defineLazyEventHandler(factory) {
|
|
55
|
-
let _promise;
|
|
56
|
-
let _resolved;
|
|
57
|
-
const resolveHandler = () => {
|
|
58
|
-
if (_resolved) {
|
|
59
|
-
return Promise.resolve(_resolved);
|
|
60
|
-
}
|
|
61
|
-
if (!_promise) {
|
|
62
|
-
_promise = Promise.resolve(factory()).then((r) => {
|
|
63
|
-
const handler = r.default || r;
|
|
64
|
-
if (typeof handler !== "function") {
|
|
65
|
-
throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
|
|
66
|
-
}
|
|
67
|
-
_resolved = toEventHandler(r.default || r);
|
|
68
|
-
return _resolved;
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
return _promise;
|
|
72
|
-
};
|
|
73
|
-
return defineEventHandler((event) => {
|
|
74
|
-
if (_resolved) {
|
|
75
|
-
return _resolved(event);
|
|
76
|
-
}
|
|
77
|
-
return resolveHandler().then((handler) => handler(event));
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
function isEventHandler(input) {
|
|
81
|
-
return "__is_handler__" in input;
|
|
82
|
-
}
|
|
83
|
-
function toEventHandler(handler) {
|
|
84
|
-
if (isEventHandler(handler)) {
|
|
85
|
-
return handler;
|
|
86
|
-
}
|
|
87
|
-
if (typeof handler !== "function") {
|
|
88
|
-
throw new TypeError("Invalid handler. It should be a function:", handler);
|
|
89
|
-
}
|
|
90
|
-
return defineEventHandler((event) => {
|
|
91
|
-
return callHandler(handler, event.req, event.res);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
function createEvent(req, res) {
|
|
95
|
-
const event = {
|
|
96
|
-
__is_event__: true,
|
|
97
|
-
req,
|
|
98
|
-
res
|
|
99
|
-
};
|
|
100
|
-
event.event = event;
|
|
101
|
-
req.event = event;
|
|
102
|
-
req.req = req;
|
|
103
|
-
req.res = res;
|
|
104
|
-
res.event = event;
|
|
105
|
-
res.res = res;
|
|
106
|
-
res.req.res = res;
|
|
107
|
-
res.req.req = req;
|
|
108
|
-
return event;
|
|
109
|
-
}
|
|
110
|
-
function isEvent(input) {
|
|
111
|
-
return "__is_event__" in input;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
6
|
function useQuery(event) {
|
|
115
7
|
return getQuery(event.req.url || "");
|
|
116
8
|
}
|
|
@@ -169,6 +61,10 @@ async function useBody(event) {
|
|
|
169
61
|
return event.req[ParsedBodySymbol];
|
|
170
62
|
}
|
|
171
63
|
const body = await useRawBody(event);
|
|
64
|
+
if (event.req.headers["content-type"] === "application/x-www-form-urlencoded") {
|
|
65
|
+
const parsedForm = Object.fromEntries(new URLSearchParams(body));
|
|
66
|
+
return parsedForm;
|
|
67
|
+
}
|
|
172
68
|
const json = destr(body);
|
|
173
69
|
event.req[ParsedBodySymbol] = json;
|
|
174
70
|
return json;
|
|
@@ -264,30 +160,152 @@ function createError(input) {
|
|
|
264
160
|
return err;
|
|
265
161
|
}
|
|
266
162
|
function sendError(event, error, debug) {
|
|
267
|
-
let h3Error;
|
|
268
|
-
if (error instanceof H3Error) {
|
|
269
|
-
h3Error = error;
|
|
270
|
-
} else {
|
|
271
|
-
console.error(error);
|
|
272
|
-
h3Error = createError(error);
|
|
273
|
-
}
|
|
274
163
|
if (event.res.writableEnded) {
|
|
275
164
|
return;
|
|
276
165
|
}
|
|
277
|
-
|
|
278
|
-
event.res.statusMessage = h3Error.statusMessage;
|
|
166
|
+
const h3Error = isError(error) ? error : createError(error);
|
|
279
167
|
const responseBody = {
|
|
280
|
-
statusCode:
|
|
281
|
-
statusMessage:
|
|
168
|
+
statusCode: h3Error.statusCode,
|
|
169
|
+
statusMessage: h3Error.statusMessage,
|
|
282
170
|
stack: [],
|
|
283
171
|
data: h3Error.data
|
|
284
172
|
};
|
|
285
173
|
if (debug) {
|
|
286
174
|
responseBody.stack = (h3Error.stack || "").split("\n").map((l) => l.trim());
|
|
287
175
|
}
|
|
176
|
+
if (event.res.writableEnded) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
event.res.statusCode = h3Error.statusCode;
|
|
180
|
+
event.res.statusMessage = h3Error.statusMessage;
|
|
288
181
|
event.res.setHeader("Content-Type", MIMES.json);
|
|
289
182
|
event.res.end(JSON.stringify(responseBody, null, 2));
|
|
290
183
|
}
|
|
184
|
+
function isError(input) {
|
|
185
|
+
return input instanceof H3Error;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const defineHandler = (handler) => handler;
|
|
189
|
+
const defineHandle = defineHandler;
|
|
190
|
+
const defineMiddleware = (middleware) => middleware;
|
|
191
|
+
function promisifyHandler(handler) {
|
|
192
|
+
return function(req, res) {
|
|
193
|
+
return callHandler(handler, req, res);
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
const promisifyHandle = promisifyHandler;
|
|
197
|
+
function callHandler(handler, req, res) {
|
|
198
|
+
const isMiddleware = handler.length > 2;
|
|
199
|
+
return new Promise((resolve, reject) => {
|
|
200
|
+
const next = (err) => {
|
|
201
|
+
if (isMiddleware) {
|
|
202
|
+
res.off("close", next);
|
|
203
|
+
res.off("error", next);
|
|
204
|
+
}
|
|
205
|
+
return err ? reject(createError(err)) : resolve(void 0);
|
|
206
|
+
};
|
|
207
|
+
try {
|
|
208
|
+
const returned = handler(req, res, next);
|
|
209
|
+
if (isMiddleware && returned === void 0) {
|
|
210
|
+
res.once("close", next);
|
|
211
|
+
res.once("error", next);
|
|
212
|
+
} else {
|
|
213
|
+
resolve(returned);
|
|
214
|
+
}
|
|
215
|
+
} catch (err) {
|
|
216
|
+
next(err);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
function defineLazyHandler(handler, promisify) {
|
|
221
|
+
let _promise;
|
|
222
|
+
const resolve = () => {
|
|
223
|
+
if (!_promise) {
|
|
224
|
+
_promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
|
|
225
|
+
}
|
|
226
|
+
return _promise;
|
|
227
|
+
};
|
|
228
|
+
return function(req, res) {
|
|
229
|
+
return resolve().then((h) => h(req, res));
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
const lazyHandle = defineLazyHandler;
|
|
233
|
+
function useBase(base, handler) {
|
|
234
|
+
base = withoutTrailingSlash(base);
|
|
235
|
+
if (!base) {
|
|
236
|
+
return handler;
|
|
237
|
+
}
|
|
238
|
+
return function(req, res) {
|
|
239
|
+
req.originalUrl = req.originalUrl || req.url || "/";
|
|
240
|
+
req.url = withoutBase(req.url || "/", base);
|
|
241
|
+
return handler(req, res);
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function defineEventHandler(handler) {
|
|
246
|
+
handler.__is_handler__ = true;
|
|
247
|
+
return handler;
|
|
248
|
+
}
|
|
249
|
+
function defineLazyEventHandler(factory) {
|
|
250
|
+
let _promise;
|
|
251
|
+
let _resolved;
|
|
252
|
+
const resolveHandler = () => {
|
|
253
|
+
if (_resolved) {
|
|
254
|
+
return Promise.resolve(_resolved);
|
|
255
|
+
}
|
|
256
|
+
if (!_promise) {
|
|
257
|
+
_promise = Promise.resolve(factory()).then((r) => {
|
|
258
|
+
const handler = r.default || r;
|
|
259
|
+
if (typeof handler !== "function") {
|
|
260
|
+
throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
|
|
261
|
+
}
|
|
262
|
+
_resolved = toEventHandler(r.default || r);
|
|
263
|
+
return _resolved;
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
return _promise;
|
|
267
|
+
};
|
|
268
|
+
return defineEventHandler((event) => {
|
|
269
|
+
if (_resolved) {
|
|
270
|
+
return _resolved(event);
|
|
271
|
+
}
|
|
272
|
+
return resolveHandler().then((handler) => handler(event));
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
function isEventHandler(input) {
|
|
276
|
+
return "__is_handler__" in input;
|
|
277
|
+
}
|
|
278
|
+
function toEventHandler(handler) {
|
|
279
|
+
if (isEventHandler(handler)) {
|
|
280
|
+
return handler;
|
|
281
|
+
}
|
|
282
|
+
if (typeof handler !== "function") {
|
|
283
|
+
throw new TypeError("Invalid handler. It should be a function:", handler);
|
|
284
|
+
}
|
|
285
|
+
return defineEventHandler((event) => {
|
|
286
|
+
return callHandler(handler, event.req, event.res);
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
function createEvent(req, res) {
|
|
290
|
+
const event = {
|
|
291
|
+
__is_event__: true,
|
|
292
|
+
req,
|
|
293
|
+
res
|
|
294
|
+
};
|
|
295
|
+
event.event = event;
|
|
296
|
+
req.event = event;
|
|
297
|
+
req.req = req;
|
|
298
|
+
req.res = res;
|
|
299
|
+
res.event = event;
|
|
300
|
+
res.res = res;
|
|
301
|
+
res.req = res.req || {};
|
|
302
|
+
res.req.res = res;
|
|
303
|
+
res.req.req = req;
|
|
304
|
+
return event;
|
|
305
|
+
}
|
|
306
|
+
function isEvent(input) {
|
|
307
|
+
return "__is_event__" in input;
|
|
308
|
+
}
|
|
291
309
|
|
|
292
310
|
function createApp(options = {}) {
|
|
293
311
|
const stack = [];
|
|
@@ -299,8 +317,12 @@ function createApp(options = {}) {
|
|
|
299
317
|
} catch (err) {
|
|
300
318
|
if (options.onError) {
|
|
301
319
|
await options.onError(err, event);
|
|
320
|
+
} else {
|
|
321
|
+
if (!isError(err)) {
|
|
322
|
+
console.error("[h3]", err);
|
|
323
|
+
}
|
|
324
|
+
await sendError(event, err, !!options.debug);
|
|
302
325
|
}
|
|
303
|
-
await sendError(event, err, !!options.debug);
|
|
304
326
|
}
|
|
305
327
|
};
|
|
306
328
|
const app = nodeHandler;
|
|
@@ -430,4 +452,4 @@ function createRouter() {
|
|
|
430
452
|
return router;
|
|
431
453
|
}
|
|
432
454
|
|
|
433
|
-
export { H3Error, MIMES, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, isEvent, isEventHandler, isMethod, isStream, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
|
|
455
|
+
export { H3Error, MIMES, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, isError, isEvent, isEventHandler, isMethod, isStream, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
|