h3 0.5.5 → 0.6.0

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"
@@ -134,7 +165,10 @@ function useCookie(event, name) {
134
165
  return useCookies(event)[name];
135
166
  }
136
167
  function setCookie(event, name, value, serializeOptions) {
137
- const cookieStr = cookieEs.serialize(name, value, serializeOptions);
168
+ const cookieStr = cookieEs.serialize(name, value, {
169
+ path: "/",
170
+ ...serializeOptions
171
+ });
138
172
  appendHeader(event, "Set-Cookie", cookieStr);
139
173
  }
140
174
  function deleteCookie(event, name, serializeOptions) {
@@ -250,12 +284,12 @@ function useBase(base, handler) {
250
284
  };
251
285
  }
252
286
 
253
- function eventHandler(handler) {
287
+ function defineEventHandler(handler) {
254
288
  handler.__is_handler__ = true;
255
289
  return handler;
256
290
  }
257
- const defineEventHandler = eventHandler;
258
- function lazyEventHandler(factory) {
291
+ const eventHandler = defineEventHandler;
292
+ function defineLazyEventHandler(factory) {
259
293
  let _promise;
260
294
  let _resolved;
261
295
  const resolveHandler = () => {
@@ -281,7 +315,7 @@ function lazyEventHandler(factory) {
281
315
  return resolveHandler().then((handler) => handler(event));
282
316
  });
283
317
  }
284
- const defineLazyEventHandler = lazyEventHandler;
318
+ const lazyEventHandler = defineLazyEventHandler;
285
319
  function dynamicEventHandler(initial) {
286
320
  let current = initial;
287
321
  const wrapper = eventHandler((event) => {
@@ -494,6 +528,7 @@ exports.defineMiddleware = defineMiddleware;
494
528
  exports.deleteCookie = deleteCookie;
495
529
  exports.dynamicEventHandler = dynamicEventHandler;
496
530
  exports.eventHandler = eventHandler;
531
+ exports.handleCacheHeaders = handleCacheHeaders;
497
532
  exports.isError = isError;
498
533
  exports.isEvent = isEvent;
499
534
  exports.isEventHandler = isEventHandler;
package/dist/index.d.ts CHANGED
@@ -7,12 +7,10 @@ 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
- declare type CompatibilityEvent = H3Event | IncomingMessage | ServerResponse;
13
+ declare type CompatibilityEvent = H3Event | IncomingMessage;
16
14
  declare type _JSONValue<T = string | number | boolean> = T | T[] | Record<string, T>;
17
15
  declare type JSONValue = _JSONValue<_JSONValue>;
18
16
  declare type H3Response = void | JSONValue | Buffer;
@@ -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"
@@ -126,7 +157,10 @@ function useCookie(event, name) {
126
157
  return useCookies(event)[name];
127
158
  }
128
159
  function setCookie(event, name, value, serializeOptions) {
129
- const cookieStr = serialize(name, value, serializeOptions);
160
+ const cookieStr = serialize(name, value, {
161
+ path: "/",
162
+ ...serializeOptions
163
+ });
130
164
  appendHeader(event, "Set-Cookie", cookieStr);
131
165
  }
132
166
  function deleteCookie(event, name, serializeOptions) {
@@ -242,12 +276,12 @@ function useBase(base, handler) {
242
276
  };
243
277
  }
244
278
 
245
- function eventHandler(handler) {
279
+ function defineEventHandler(handler) {
246
280
  handler.__is_handler__ = true;
247
281
  return handler;
248
282
  }
249
- const defineEventHandler = eventHandler;
250
- function lazyEventHandler(factory) {
283
+ const eventHandler = defineEventHandler;
284
+ function defineLazyEventHandler(factory) {
251
285
  let _promise;
252
286
  let _resolved;
253
287
  const resolveHandler = () => {
@@ -273,7 +307,7 @@ function lazyEventHandler(factory) {
273
307
  return resolveHandler().then((handler) => handler(event));
274
308
  });
275
309
  }
276
- const defineLazyEventHandler = lazyEventHandler;
310
+ const lazyEventHandler = defineLazyEventHandler;
277
311
  function dynamicEventHandler(initial) {
278
312
  let current = initial;
279
313
  const wrapper = eventHandler((event) => {
@@ -466,4 +500,4 @@ function createRouter() {
466
500
  return router;
467
501
  }
468
502
 
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 };
503
+ 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.6.0",
4
4
  "description": "Tiny JavaScript Server",
5
5
  "repository": "unjs/h3",
6
6
  "license": "MIT",