h3 0.5.3 → 0.5.6

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 CHANGED
@@ -11,128 +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
- const isMiddleware = handler.length > 2;
25
- return new Promise((resolve, reject) => {
26
- const next = (err) => {
27
- if (isMiddleware) {
28
- res.off("close", next);
29
- res.off("error", next);
30
- }
31
- return err ? reject(err) : resolve(void 0);
32
- };
33
- try {
34
- const returned = handler(req, res, next);
35
- if (isMiddleware && returned === void 0) {
36
- res.once("close", next);
37
- res.once("error", next);
38
- } else {
39
- resolve(returned);
40
- }
41
- } catch (err) {
42
- next(err);
43
- }
44
- });
45
- }
46
- function defineLazyHandler(handler, promisify) {
47
- let _promise;
48
- const resolve = () => {
49
- if (!_promise) {
50
- _promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
51
- }
52
- return _promise;
53
- };
54
- return function(req, res) {
55
- return resolve().then((h) => h(req, res));
56
- };
57
- }
58
- const lazyHandle = defineLazyHandler;
59
- function useBase(base, handler) {
60
- base = ufo.withoutTrailingSlash(base);
61
- if (!base) {
62
- return handler;
63
- }
64
- return function(req, res) {
65
- req.originalUrl = req.originalUrl || req.url || "/";
66
- req.url = ufo.withoutBase(req.url || "/", base);
67
- return handler(req, res);
68
- };
69
- }
70
-
71
- function defineEventHandler(handler) {
72
- handler.__is_handler__ = true;
73
- return handler;
74
- }
75
- function defineLazyEventHandler(factory) {
76
- let _promise;
77
- let _resolved;
78
- const resolveHandler = () => {
79
- if (_resolved) {
80
- return Promise.resolve(_resolved);
81
- }
82
- if (!_promise) {
83
- _promise = Promise.resolve(factory()).then((r) => {
84
- const handler = r.default || r;
85
- if (typeof handler !== "function") {
86
- throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
87
- }
88
- _resolved = toEventHandler(r.default || r);
89
- return _resolved;
90
- });
91
- }
92
- return _promise;
93
- };
94
- return defineEventHandler((event) => {
95
- if (_resolved) {
96
- return _resolved(event);
97
- }
98
- return resolveHandler().then((handler) => handler(event));
99
- });
100
- }
101
- function isEventHandler(input) {
102
- return "__is_handler__" in input;
103
- }
104
- function toEventHandler(handler) {
105
- if (isEventHandler(handler)) {
106
- return handler;
107
- }
108
- if (typeof handler !== "function") {
109
- throw new TypeError("Invalid handler. It should be a function:", handler);
110
- }
111
- return defineEventHandler((event) => {
112
- return callHandler(handler, event.req, event.res);
113
- });
114
- }
115
- function createEvent(req, res) {
116
- const event = {
117
- __is_event__: true,
118
- req,
119
- res
120
- };
121
- event.event = event;
122
- req.event = event;
123
- req.req = req;
124
- req.res = res;
125
- res.event = event;
126
- res.res = res;
127
- res.req = res.req || {};
128
- res.req.res = res;
129
- res.req.req = req;
130
- return event;
131
- }
132
- function isEvent(input) {
133
- return "__is_event__" in input;
134
- }
135
-
136
14
  function useQuery(event) {
137
15
  return ufo.getQuery(event.req.url || "");
138
16
  }
@@ -200,6 +78,37 @@ async function useBody(event) {
200
78
  return json;
201
79
  }
202
80
 
81
+ function handleCacheHeaders(event, opts) {
82
+ const cacheControls = ["public"].concat(opts.cacheControls || []);
83
+ let cacheMatched = false;
84
+ if (opts.maxAge !== void 0) {
85
+ opts.cacheControls?.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
86
+ }
87
+ if (opts.modifiedTime) {
88
+ const ifModifiedSince = event.req.headers["if-modified-since"];
89
+ event.res.setHeader("Last-Modified", +opts.modifiedTime + "");
90
+ if (ifModifiedSince) {
91
+ if (new Date(ifModifiedSince) >= opts.modifiedTime) {
92
+ cacheMatched = true;
93
+ }
94
+ }
95
+ }
96
+ if (opts.etag) {
97
+ event.res.setHeader("Etag", opts.etag);
98
+ const ifNonMatch = event.req.headers["if-none-match"];
99
+ if (ifNonMatch === opts.etag) {
100
+ cacheMatched = true;
101
+ }
102
+ }
103
+ event.res.setHeader("Cache-Control", cacheControls.join(", "));
104
+ if (cacheMatched) {
105
+ event.res.statusCode = 304;
106
+ event.res.end("");
107
+ return true;
108
+ }
109
+ return false;
110
+ }
111
+
203
112
  const MIMES = {
204
113
  html: "text/html",
205
114
  json: "application/json"
@@ -315,6 +224,142 @@ function isError(input) {
315
224
  return input instanceof H3Error;
316
225
  }
317
226
 
227
+ const defineHandler = (handler) => handler;
228
+ const defineHandle = defineHandler;
229
+ const defineMiddleware = (middleware) => middleware;
230
+ function promisifyHandler(handler) {
231
+ return function(req, res) {
232
+ return callHandler(handler, req, res);
233
+ };
234
+ }
235
+ const promisifyHandle = promisifyHandler;
236
+ function callHandler(handler, req, res) {
237
+ const isMiddleware = handler.length > 2;
238
+ return new Promise((resolve, reject) => {
239
+ const next = (err) => {
240
+ if (isMiddleware) {
241
+ res.off("close", next);
242
+ res.off("error", next);
243
+ }
244
+ return err ? reject(createError(err)) : resolve(void 0);
245
+ };
246
+ try {
247
+ const returned = handler(req, res, next);
248
+ if (isMiddleware && returned === void 0) {
249
+ res.once("close", next);
250
+ res.once("error", next);
251
+ } else {
252
+ resolve(returned);
253
+ }
254
+ } catch (err) {
255
+ next(err);
256
+ }
257
+ });
258
+ }
259
+ function defineLazyHandler(handler, promisify) {
260
+ let _promise;
261
+ const resolve = () => {
262
+ if (!_promise) {
263
+ _promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
264
+ }
265
+ return _promise;
266
+ };
267
+ return function(req, res) {
268
+ return resolve().then((h) => h(req, res));
269
+ };
270
+ }
271
+ const lazyHandle = defineLazyHandler;
272
+ function useBase(base, handler) {
273
+ base = ufo.withoutTrailingSlash(base);
274
+ if (!base) {
275
+ return handler;
276
+ }
277
+ return function(req, res) {
278
+ req.originalUrl = req.originalUrl || req.url || "/";
279
+ req.url = ufo.withoutBase(req.url || "/", base);
280
+ return handler(req, res);
281
+ };
282
+ }
283
+
284
+ function defineEventHandler(handler) {
285
+ handler.__is_handler__ = true;
286
+ return handler;
287
+ }
288
+ const eventHandler = defineEventHandler;
289
+ function defineLazyEventHandler(factory) {
290
+ let _promise;
291
+ let _resolved;
292
+ const resolveHandler = () => {
293
+ if (_resolved) {
294
+ return Promise.resolve(_resolved);
295
+ }
296
+ if (!_promise) {
297
+ _promise = Promise.resolve(factory()).then((r) => {
298
+ const handler = r.default || r;
299
+ if (typeof handler !== "function") {
300
+ throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
301
+ }
302
+ _resolved = toEventHandler(r.default || r);
303
+ return _resolved;
304
+ });
305
+ }
306
+ return _promise;
307
+ };
308
+ return eventHandler((event) => {
309
+ if (_resolved) {
310
+ return _resolved(event);
311
+ }
312
+ return resolveHandler().then((handler) => handler(event));
313
+ });
314
+ }
315
+ const lazyEventHandler = defineLazyEventHandler;
316
+ function dynamicEventHandler(initial) {
317
+ let current = initial;
318
+ const wrapper = eventHandler((event) => {
319
+ if (current) {
320
+ return current(event);
321
+ }
322
+ });
323
+ wrapper.set = (handler) => {
324
+ current = handler;
325
+ };
326
+ return wrapper;
327
+ }
328
+ function isEventHandler(input) {
329
+ return "__is_handler__" in input;
330
+ }
331
+ function toEventHandler(handler) {
332
+ if (isEventHandler(handler)) {
333
+ return handler;
334
+ }
335
+ if (typeof handler !== "function") {
336
+ throw new TypeError("Invalid handler. It should be a function:", handler);
337
+ }
338
+ return eventHandler((event) => {
339
+ return callHandler(handler, event.req, event.res);
340
+ });
341
+ }
342
+ function createEvent(req, res) {
343
+ const event = {
344
+ __is_event__: true,
345
+ req,
346
+ res
347
+ };
348
+ event.event = event;
349
+ req.event = event;
350
+ req.req = req;
351
+ req.res = res;
352
+ res.event = event;
353
+ res.res = res;
354
+ res.req = res.req || {};
355
+ res.req.res = res;
356
+ res.req.req = req;
357
+ return event;
358
+ }
359
+ function isEvent(input) {
360
+ return "__is_event__" in input;
361
+ }
362
+
318
363
  function createApp(options = {}) {
319
364
  const stack = [];
320
365
  const handler = createAppEventHandler(stack, options);
@@ -356,7 +401,7 @@ function use(app, arg1, arg2, arg3) {
356
401
  }
357
402
  function createAppEventHandler(stack, options) {
358
403
  const spacing = options.debug ? 2 : void 0;
359
- return defineEventHandler(async (event) => {
404
+ return eventHandler(async (event) => {
360
405
  event.req.originalUrl = event.req.originalUrl || event.req.url || "/";
361
406
  const reqUrl = event.req.url || "/";
362
407
  for (const layer of stack) {
@@ -401,7 +446,7 @@ function normalizeLayer(input) {
401
446
  handler = handler.handler;
402
447
  }
403
448
  if (input.lazy) {
404
- handler = defineLazyEventHandler(handler);
449
+ handler = lazyEventHandler(handler);
405
450
  } else if (!isEventHandler(handler)) {
406
451
  handler = toEventHandler(handler);
407
452
  }
@@ -430,7 +475,7 @@ function createRouter() {
430
475
  for (const method of RouterMethods) {
431
476
  router[method] = (path, handle) => router.add(path, handle, method);
432
477
  }
433
- router.handler = defineEventHandler((event) => {
478
+ router.handler = eventHandler((event) => {
434
479
  let path = event.req.url || "/";
435
480
  const queryUrlIndex = path.lastIndexOf("?");
436
481
  if (queryUrlIndex > -1) {
@@ -478,11 +523,15 @@ exports.defineLazyEventHandler = defineLazyEventHandler;
478
523
  exports.defineLazyHandler = defineLazyHandler;
479
524
  exports.defineMiddleware = defineMiddleware;
480
525
  exports.deleteCookie = deleteCookie;
526
+ exports.dynamicEventHandler = dynamicEventHandler;
527
+ exports.eventHandler = eventHandler;
528
+ exports.handleCacheHeaders = handleCacheHeaders;
481
529
  exports.isError = isError;
482
530
  exports.isEvent = isEvent;
483
531
  exports.isEventHandler = isEventHandler;
484
532
  exports.isMethod = isMethod;
485
533
  exports.isStream = isStream;
534
+ exports.lazyEventHandler = lazyEventHandler;
486
535
  exports.lazyHandle = lazyHandle;
487
536
  exports.promisifyHandle = promisifyHandle;
488
537
  exports.promisifyHandler = promisifyHandler;
package/dist/index.d.ts CHANGED
@@ -7,9 +7,7 @@ interface H3Event {
7
7
  event: H3Event;
8
8
  req: IncomingMessage;
9
9
  res: ServerResponse;
10
- /**
11
- * Request params only filled with h3 Router handlers
12
- */
10
+ /** Request params only filled with h3 Router handlers */
13
11
  params?: Record<string, any>;
14
12
  }
15
13
  declare type CompatibilityEvent = H3Event | IncomingMessage | ServerResponse;
@@ -21,27 +19,35 @@ interface EventHandler {
21
19
  (event: CompatibilityEvent): H3Response | Promise<H3Response>;
22
20
  }
23
21
  declare function defineEventHandler(handler: EventHandler): EventHandler;
22
+ declare const eventHandler: typeof defineEventHandler;
24
23
  declare type LazyEventHandler = () => EventHandler | Promise<EventHandler>;
25
24
  declare function defineLazyEventHandler(factory: LazyEventHandler): EventHandler;
25
+ declare const lazyEventHandler: typeof defineLazyEventHandler;
26
+ interface DynamicEventHandler extends EventHandler {
27
+ set: (handler: EventHandler) => void;
28
+ }
29
+ declare function dynamicEventHandler(initial?: EventHandler): DynamicEventHandler;
26
30
  declare function isEventHandler(input: any): input is EventHandler;
27
31
  declare type CompatibilityEventHandler = EventHandler | Handler | Middleware;
28
32
  declare function toEventHandler(handler: CompatibilityEventHandler): EventHandler;
29
33
  declare function createEvent(req: http.IncomingMessage, res: http.ServerResponse): CompatibilityEvent;
30
34
  declare function isEvent(input: any): input is H3Event;
31
35
 
32
- interface IncomingMessage extends http.IncomingMessage {
33
- originalUrl?: string;
36
+ interface CompatibilityRequestProps {
34
37
  event: H3Event;
38
+ /** Only available with connect and press */
39
+ originalUrl?: string;
40
+ /** Request params only filled with h3 Router handlers */
41
+ params?: Record<string, any>;
42
+ }
43
+ interface IncomingMessage extends http.IncomingMessage, CompatibilityRequestProps {
35
44
  req: H3Event['req'];
36
45
  res: H3Event['res'];
37
46
  }
38
47
  interface ServerResponse extends http.ServerResponse {
39
48
  event: H3Event;
40
49
  res: H3Event['res'];
41
- req: http.ServerResponse['req'] & {
42
- event: H3Event;
43
- originalUrl?: string;
44
- };
50
+ req: http.ServerResponse['req'] & CompatibilityRequestProps;
45
51
  }
46
52
  declare type Handler<T = any, ReqT = {}> = (req: IncomingMessage & ReqT, res: ServerResponse) => T;
47
53
  declare type PromisifiedHandler = Handler<Promise<any>>;
@@ -157,6 +163,19 @@ declare function useRawBody(event: CompatibilityEvent, encoding?: Encoding): Enc
157
163
  */
158
164
  declare function useBody<T = any>(event: CompatibilityEvent): Promise<T>;
159
165
 
166
+ interface CacheConditions {
167
+ modifiedTime?: Date;
168
+ maxAge?: number;
169
+ etag?: string;
170
+ cacheControls?: string[];
171
+ }
172
+ /**
173
+ * Check request caching headers (`If-Modified-Since`) and add caching headers (Last-Modified, Cache-Control)
174
+ * Note: `public` cache control will be added by default
175
+ * @returns `true` when cache headers are matching. When `true` is returned, no reponse should be sent anymore
176
+ */
177
+ declare function handleCacheHeaders(event: CompatibilityEvent, opts: CacheConditions): boolean;
178
+
160
179
  declare const MIMES: {
161
180
  html: string;
162
181
  json: string;
@@ -225,4 +244,4 @@ interface Router extends AddRouteShortcuts {
225
244
  }
226
245
  declare function createRouter(): Router;
227
246
 
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 };
247
+ export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CompatibilityEvent, CompatibilityEventHandler, DynamicEventHandler, 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, dynamicEventHandler, eventHandler, handleCacheHeaders, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
package/dist/index.mjs CHANGED
@@ -1,130 +1,8 @@
1
- import { withoutTrailingSlash, withoutBase, getQuery } from 'ufo';
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
- const isMiddleware = handler.length > 2;
17
- return new Promise((resolve, reject) => {
18
- const next = (err) => {
19
- if (isMiddleware) {
20
- res.off("close", next);
21
- res.off("error", next);
22
- }
23
- return err ? reject(err) : resolve(void 0);
24
- };
25
- try {
26
- const returned = handler(req, res, next);
27
- if (isMiddleware && returned === void 0) {
28
- res.once("close", next);
29
- res.once("error", next);
30
- } else {
31
- resolve(returned);
32
- }
33
- } catch (err) {
34
- next(err);
35
- }
36
- });
37
- }
38
- function defineLazyHandler(handler, promisify) {
39
- let _promise;
40
- const resolve = () => {
41
- if (!_promise) {
42
- _promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
43
- }
44
- return _promise;
45
- };
46
- return function(req, res) {
47
- return resolve().then((h) => h(req, res));
48
- };
49
- }
50
- const lazyHandle = defineLazyHandler;
51
- function useBase(base, handler) {
52
- base = withoutTrailingSlash(base);
53
- if (!base) {
54
- return handler;
55
- }
56
- return function(req, res) {
57
- req.originalUrl = req.originalUrl || req.url || "/";
58
- req.url = withoutBase(req.url || "/", base);
59
- return handler(req, res);
60
- };
61
- }
62
-
63
- function defineEventHandler(handler) {
64
- handler.__is_handler__ = true;
65
- return handler;
66
- }
67
- function defineLazyEventHandler(factory) {
68
- let _promise;
69
- let _resolved;
70
- const resolveHandler = () => {
71
- if (_resolved) {
72
- return Promise.resolve(_resolved);
73
- }
74
- if (!_promise) {
75
- _promise = Promise.resolve(factory()).then((r) => {
76
- const handler = r.default || r;
77
- if (typeof handler !== "function") {
78
- throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
79
- }
80
- _resolved = toEventHandler(r.default || r);
81
- return _resolved;
82
- });
83
- }
84
- return _promise;
85
- };
86
- return defineEventHandler((event) => {
87
- if (_resolved) {
88
- return _resolved(event);
89
- }
90
- return resolveHandler().then((handler) => handler(event));
91
- });
92
- }
93
- function isEventHandler(input) {
94
- return "__is_handler__" in input;
95
- }
96
- function toEventHandler(handler) {
97
- if (isEventHandler(handler)) {
98
- return handler;
99
- }
100
- if (typeof handler !== "function") {
101
- throw new TypeError("Invalid handler. It should be a function:", handler);
102
- }
103
- return defineEventHandler((event) => {
104
- return callHandler(handler, event.req, event.res);
105
- });
106
- }
107
- function createEvent(req, res) {
108
- const event = {
109
- __is_event__: true,
110
- req,
111
- res
112
- };
113
- event.event = event;
114
- req.event = event;
115
- req.req = req;
116
- req.res = res;
117
- res.event = event;
118
- res.res = res;
119
- res.req = res.req || {};
120
- res.req.res = res;
121
- res.req.req = req;
122
- return event;
123
- }
124
- function isEvent(input) {
125
- return "__is_event__" in input;
126
- }
127
-
128
6
  function useQuery(event) {
129
7
  return getQuery(event.req.url || "");
130
8
  }
@@ -192,6 +70,37 @@ async function useBody(event) {
192
70
  return json;
193
71
  }
194
72
 
73
+ function handleCacheHeaders(event, opts) {
74
+ const cacheControls = ["public"].concat(opts.cacheControls || []);
75
+ let cacheMatched = false;
76
+ if (opts.maxAge !== void 0) {
77
+ opts.cacheControls?.push(`max-age=${+opts.maxAge}`, `s-maxage=${+opts.maxAge}`);
78
+ }
79
+ if (opts.modifiedTime) {
80
+ const ifModifiedSince = event.req.headers["if-modified-since"];
81
+ event.res.setHeader("Last-Modified", +opts.modifiedTime + "");
82
+ if (ifModifiedSince) {
83
+ if (new Date(ifModifiedSince) >= opts.modifiedTime) {
84
+ cacheMatched = true;
85
+ }
86
+ }
87
+ }
88
+ if (opts.etag) {
89
+ event.res.setHeader("Etag", opts.etag);
90
+ const ifNonMatch = event.req.headers["if-none-match"];
91
+ if (ifNonMatch === opts.etag) {
92
+ cacheMatched = true;
93
+ }
94
+ }
95
+ event.res.setHeader("Cache-Control", cacheControls.join(", "));
96
+ if (cacheMatched) {
97
+ event.res.statusCode = 304;
98
+ event.res.end("");
99
+ return true;
100
+ }
101
+ return false;
102
+ }
103
+
195
104
  const MIMES = {
196
105
  html: "text/html",
197
106
  json: "application/json"
@@ -307,6 +216,142 @@ function isError(input) {
307
216
  return input instanceof H3Error;
308
217
  }
309
218
 
219
+ const defineHandler = (handler) => handler;
220
+ const defineHandle = defineHandler;
221
+ const defineMiddleware = (middleware) => middleware;
222
+ function promisifyHandler(handler) {
223
+ return function(req, res) {
224
+ return callHandler(handler, req, res);
225
+ };
226
+ }
227
+ const promisifyHandle = promisifyHandler;
228
+ function callHandler(handler, req, res) {
229
+ const isMiddleware = handler.length > 2;
230
+ return new Promise((resolve, reject) => {
231
+ const next = (err) => {
232
+ if (isMiddleware) {
233
+ res.off("close", next);
234
+ res.off("error", next);
235
+ }
236
+ return err ? reject(createError(err)) : resolve(void 0);
237
+ };
238
+ try {
239
+ const returned = handler(req, res, next);
240
+ if (isMiddleware && returned === void 0) {
241
+ res.once("close", next);
242
+ res.once("error", next);
243
+ } else {
244
+ resolve(returned);
245
+ }
246
+ } catch (err) {
247
+ next(err);
248
+ }
249
+ });
250
+ }
251
+ function defineLazyHandler(handler, promisify) {
252
+ let _promise;
253
+ const resolve = () => {
254
+ if (!_promise) {
255
+ _promise = Promise.resolve(handler()).then((r) => promisify ? promisifyHandler(r.default || r) : r.default || r);
256
+ }
257
+ return _promise;
258
+ };
259
+ return function(req, res) {
260
+ return resolve().then((h) => h(req, res));
261
+ };
262
+ }
263
+ const lazyHandle = defineLazyHandler;
264
+ function useBase(base, handler) {
265
+ base = withoutTrailingSlash(base);
266
+ if (!base) {
267
+ return handler;
268
+ }
269
+ return function(req, res) {
270
+ req.originalUrl = req.originalUrl || req.url || "/";
271
+ req.url = withoutBase(req.url || "/", base);
272
+ return handler(req, res);
273
+ };
274
+ }
275
+
276
+ function defineEventHandler(handler) {
277
+ handler.__is_handler__ = true;
278
+ return handler;
279
+ }
280
+ const eventHandler = defineEventHandler;
281
+ function defineLazyEventHandler(factory) {
282
+ let _promise;
283
+ let _resolved;
284
+ const resolveHandler = () => {
285
+ if (_resolved) {
286
+ return Promise.resolve(_resolved);
287
+ }
288
+ if (!_promise) {
289
+ _promise = Promise.resolve(factory()).then((r) => {
290
+ const handler = r.default || r;
291
+ if (typeof handler !== "function") {
292
+ throw new TypeError("Invalid lazy handler result. It should be a function:", handler);
293
+ }
294
+ _resolved = toEventHandler(r.default || r);
295
+ return _resolved;
296
+ });
297
+ }
298
+ return _promise;
299
+ };
300
+ return eventHandler((event) => {
301
+ if (_resolved) {
302
+ return _resolved(event);
303
+ }
304
+ return resolveHandler().then((handler) => handler(event));
305
+ });
306
+ }
307
+ const lazyEventHandler = defineLazyEventHandler;
308
+ function dynamicEventHandler(initial) {
309
+ let current = initial;
310
+ const wrapper = eventHandler((event) => {
311
+ if (current) {
312
+ return current(event);
313
+ }
314
+ });
315
+ wrapper.set = (handler) => {
316
+ current = handler;
317
+ };
318
+ return wrapper;
319
+ }
320
+ function isEventHandler(input) {
321
+ return "__is_handler__" in input;
322
+ }
323
+ function toEventHandler(handler) {
324
+ if (isEventHandler(handler)) {
325
+ return handler;
326
+ }
327
+ if (typeof handler !== "function") {
328
+ throw new TypeError("Invalid handler. It should be a function:", handler);
329
+ }
330
+ return eventHandler((event) => {
331
+ return callHandler(handler, event.req, event.res);
332
+ });
333
+ }
334
+ function createEvent(req, res) {
335
+ const event = {
336
+ __is_event__: true,
337
+ req,
338
+ res
339
+ };
340
+ event.event = event;
341
+ req.event = event;
342
+ req.req = req;
343
+ req.res = res;
344
+ res.event = event;
345
+ res.res = res;
346
+ res.req = res.req || {};
347
+ res.req.res = res;
348
+ res.req.req = req;
349
+ return event;
350
+ }
351
+ function isEvent(input) {
352
+ return "__is_event__" in input;
353
+ }
354
+
310
355
  function createApp(options = {}) {
311
356
  const stack = [];
312
357
  const handler = createAppEventHandler(stack, options);
@@ -348,7 +393,7 @@ function use(app, arg1, arg2, arg3) {
348
393
  }
349
394
  function createAppEventHandler(stack, options) {
350
395
  const spacing = options.debug ? 2 : void 0;
351
- return defineEventHandler(async (event) => {
396
+ return eventHandler(async (event) => {
352
397
  event.req.originalUrl = event.req.originalUrl || event.req.url || "/";
353
398
  const reqUrl = event.req.url || "/";
354
399
  for (const layer of stack) {
@@ -393,7 +438,7 @@ function normalizeLayer(input) {
393
438
  handler = handler.handler;
394
439
  }
395
440
  if (input.lazy) {
396
- handler = defineLazyEventHandler(handler);
441
+ handler = lazyEventHandler(handler);
397
442
  } else if (!isEventHandler(handler)) {
398
443
  handler = toEventHandler(handler);
399
444
  }
@@ -422,7 +467,7 @@ function createRouter() {
422
467
  for (const method of RouterMethods) {
423
468
  router[method] = (path, handle) => router.add(path, handle, method);
424
469
  }
425
- router.handler = defineEventHandler((event) => {
470
+ router.handler = eventHandler((event) => {
426
471
  let path = event.req.url || "/";
427
472
  const queryUrlIndex = path.lastIndexOf("?");
428
473
  if (queryUrlIndex > -1) {
@@ -452,4 +497,4 @@ function createRouter() {
452
497
  return router;
453
498
  }
454
499
 
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 };
500
+ export { H3Error, MIMES, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, dynamicEventHandler, eventHandler, handleCacheHeaders, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, lazyHandle, promisifyHandle, promisifyHandler, send, sendError, sendRedirect, sendStream, setCookie, toEventHandler, use, useBase, useBody, useCookie, useCookies, useMethod, useQuery, useRawBody };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "h3",
3
- "version": "0.5.3",
3
+ "version": "0.5.6",
4
4
  "description": "Tiny JavaScript Server",
5
5
  "repository": "unjs/h3",
6
6
  "license": "MIT",