h3 0.5.5 → 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
@@ -78,6 +78,37 @@ async function useBody(event) {
78
78
  return json;
79
79
  }
80
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
+
81
112
  const MIMES = {
82
113
  html: "text/html",
83
114
  json: "application/json"
@@ -250,12 +281,12 @@ function useBase(base, handler) {
250
281
  };
251
282
  }
252
283
 
253
- function eventHandler(handler) {
284
+ function defineEventHandler(handler) {
254
285
  handler.__is_handler__ = true;
255
286
  return handler;
256
287
  }
257
- const defineEventHandler = eventHandler;
258
- function lazyEventHandler(factory) {
288
+ const eventHandler = defineEventHandler;
289
+ function defineLazyEventHandler(factory) {
259
290
  let _promise;
260
291
  let _resolved;
261
292
  const resolveHandler = () => {
@@ -281,7 +312,7 @@ function lazyEventHandler(factory) {
281
312
  return resolveHandler().then((handler) => handler(event));
282
313
  });
283
314
  }
284
- const defineLazyEventHandler = lazyEventHandler;
315
+ const lazyEventHandler = defineLazyEventHandler;
285
316
  function dynamicEventHandler(initial) {
286
317
  let current = initial;
287
318
  const wrapper = eventHandler((event) => {
@@ -494,6 +525,7 @@ exports.defineMiddleware = defineMiddleware;
494
525
  exports.deleteCookie = deleteCookie;
495
526
  exports.dynamicEventHandler = dynamicEventHandler;
496
527
  exports.eventHandler = eventHandler;
528
+ exports.handleCacheHeaders = handleCacheHeaders;
497
529
  exports.isError = isError;
498
530
  exports.isEvent = isEvent;
499
531
  exports.isEventHandler = isEventHandler;
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;
@@ -20,13 +18,11 @@ interface EventHandler {
20
18
  '__is_handler__'?: true;
21
19
  (event: CompatibilityEvent): H3Response | Promise<H3Response>;
22
20
  }
23
- declare function eventHandler(handler: EventHandler): EventHandler;
24
- /** @deprecated Use eventHandler() */
25
- declare const defineEventHandler: typeof eventHandler;
21
+ declare function defineEventHandler(handler: EventHandler): EventHandler;
22
+ declare const eventHandler: typeof defineEventHandler;
26
23
  declare type LazyEventHandler = () => EventHandler | Promise<EventHandler>;
27
- declare function lazyEventHandler(factory: LazyEventHandler): EventHandler;
28
- /** @deprecated use lazyEventHandler() */
29
- declare const defineLazyEventHandler: typeof lazyEventHandler;
24
+ declare function defineLazyEventHandler(factory: LazyEventHandler): EventHandler;
25
+ declare const lazyEventHandler: typeof defineLazyEventHandler;
30
26
  interface DynamicEventHandler extends EventHandler {
31
27
  set: (handler: EventHandler) => void;
32
28
  }
@@ -37,19 +33,21 @@ declare function toEventHandler(handler: CompatibilityEventHandler): EventHandle
37
33
  declare function createEvent(req: http.IncomingMessage, res: http.ServerResponse): CompatibilityEvent;
38
34
  declare function isEvent(input: any): input is H3Event;
39
35
 
40
- interface IncomingMessage extends http.IncomingMessage {
41
- originalUrl?: string;
36
+ interface CompatibilityRequestProps {
42
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 {
43
44
  req: H3Event['req'];
44
45
  res: H3Event['res'];
45
46
  }
46
47
  interface ServerResponse extends http.ServerResponse {
47
48
  event: H3Event;
48
49
  res: H3Event['res'];
49
- req: http.ServerResponse['req'] & {
50
- event: H3Event;
51
- originalUrl?: string;
52
- };
50
+ req: http.ServerResponse['req'] & CompatibilityRequestProps;
53
51
  }
54
52
  declare type Handler<T = any, ReqT = {}> = (req: IncomingMessage & ReqT, res: ServerResponse) => T;
55
53
  declare type PromisifiedHandler = Handler<Promise<any>>;
@@ -165,6 +163,19 @@ declare function useRawBody(event: CompatibilityEvent, encoding?: Encoding): Enc
165
163
  */
166
164
  declare function useBody<T = any>(event: CompatibilityEvent): Promise<T>;
167
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
+
168
179
  declare const MIMES: {
169
180
  html: string;
170
181
  json: string;
@@ -233,4 +244,4 @@ interface Router extends AddRouteShortcuts {
233
244
  }
234
245
  declare function createRouter(): Router;
235
246
 
236
- export { AddRouteShortcuts, App, AppOptions, AppUse, 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, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, 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
@@ -70,6 +70,37 @@ async function useBody(event) {
70
70
  return json;
71
71
  }
72
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
+
73
104
  const MIMES = {
74
105
  html: "text/html",
75
106
  json: "application/json"
@@ -242,12 +273,12 @@ function useBase(base, handler) {
242
273
  };
243
274
  }
244
275
 
245
- function eventHandler(handler) {
276
+ function defineEventHandler(handler) {
246
277
  handler.__is_handler__ = true;
247
278
  return handler;
248
279
  }
249
- const defineEventHandler = eventHandler;
250
- function lazyEventHandler(factory) {
280
+ const eventHandler = defineEventHandler;
281
+ function defineLazyEventHandler(factory) {
251
282
  let _promise;
252
283
  let _resolved;
253
284
  const resolveHandler = () => {
@@ -273,7 +304,7 @@ function lazyEventHandler(factory) {
273
304
  return resolveHandler().then((handler) => handler(event));
274
305
  });
275
306
  }
276
- const defineLazyEventHandler = lazyEventHandler;
307
+ const lazyEventHandler = defineLazyEventHandler;
277
308
  function dynamicEventHandler(initial) {
278
309
  let current = initial;
279
310
  const wrapper = eventHandler((event) => {
@@ -466,4 +497,4 @@ function createRouter() {
466
497
  return router;
467
498
  }
468
499
 
469
- export { H3Error, MIMES, appendHeader, assertMethod, callHandler, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineHandle, defineHandler, defineLazyEventHandler, defineLazyHandler, defineMiddleware, deleteCookie, dynamicEventHandler, eventHandler, isError, isEvent, isEventHandler, isMethod, isStream, lazyEventHandler, 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.5",
3
+ "version": "0.5.6",
4
4
  "description": "Tiny JavaScript Server",
5
5
  "repository": "unjs/h3",
6
6
  "license": "MIT",