Comparing version 3.12.5 to 3.12.6
@@ -48,2 +48,6 @@ "use strict"; | ||
const TEXT_PLAIN = "text/plain; charset=UTF-8"; | ||
const setHeaders = (headers, map = {}) => { | ||
Object.entries(map).forEach(([key, value]) => headers.set(key, value)); | ||
return headers; | ||
}; | ||
class Context { | ||
@@ -120,10 +124,12 @@ constructor(req, options) { | ||
if (arg && typeof arg !== "number") { | ||
this.res = new Response(data, arg); | ||
const headers2 = setHeaders(new Headers(arg.headers), __privateGet(this, _preparedHeaders)); | ||
return new Response(data, { | ||
headers: headers2, | ||
status: arg.status | ||
}); | ||
} | ||
const status = typeof arg === "number" ? arg : arg ? arg.status : __privateGet(this, _status); | ||
const status = typeof arg === "number" ? arg : __privateGet(this, _status); | ||
__privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {}); | ||
__privateGet(this, _headers) ?? __privateSet(this, _headers, new Headers()); | ||
for (const [k, v] of Object.entries(__privateGet(this, _preparedHeaders))) { | ||
__privateGet(this, _headers).set(k, v); | ||
} | ||
setHeaders(__privateGet(this, _headers), __privateGet(this, _preparedHeaders)); | ||
if (__privateGet(this, _res)) { | ||
@@ -133,5 +139,3 @@ __privateGet(this, _res).headers.forEach((v, k) => { | ||
}); | ||
for (const [k, v] of Object.entries(__privateGet(this, _preparedHeaders))) { | ||
__privateGet(this, _headers).set(k, v); | ||
} | ||
setHeaders(__privateGet(this, _headers), __privateGet(this, _preparedHeaders)); | ||
} | ||
@@ -138,0 +142,0 @@ headers ?? (headers = {}); |
@@ -57,12 +57,6 @@ "use strict"; | ||
for (const user of users) { | ||
const usernameEqual = await (0, import_buffer.timingSafeEqual)( | ||
user.username, | ||
requestUser.username, | ||
options.hashFunction | ||
); | ||
const passwordEqual = await (0, import_buffer.timingSafeEqual)( | ||
user.password, | ||
requestUser.password, | ||
options.hashFunction | ||
); | ||
const [usernameEqual, passwordEqual] = await Promise.all([ | ||
(0, import_buffer.timingSafeEqual)(user.username, requestUser.username, options.hashFunction), | ||
(0, import_buffer.timingSafeEqual)(user.password, requestUser.password, options.hashFunction) | ||
]); | ||
if (usernameEqual && passwordEqual) { | ||
@@ -69,0 +63,0 @@ await next(); |
@@ -45,17 +45,16 @@ "use strict"; | ||
const response = await cache3.match(key); | ||
if (!response) { | ||
await next(); | ||
if (!c.res.ok) { | ||
return; | ||
} | ||
addHeader(c); | ||
const response2 = c.res.clone(); | ||
if (options.wait) { | ||
await cache3.put(key, response2); | ||
} else { | ||
c.executionCtx.waitUntil(cache3.put(key, response2)); | ||
} | ||
} else { | ||
if (response) { | ||
return new Response(response.body, response); | ||
} | ||
await next(); | ||
if (!c.res.ok) { | ||
return; | ||
} | ||
addHeader(c); | ||
const res = c.res.clone(); | ||
if (options.wait) { | ||
await cache3.put(key, res); | ||
} else { | ||
c.executionCtx.waitUntil(cache3.put(key, res)); | ||
} | ||
}; | ||
@@ -62,0 +61,0 @@ }; |
@@ -61,5 +61,3 @@ "use strict"; | ||
} | ||
if (c.req.method !== "OPTIONS") { | ||
await next(); | ||
} else { | ||
if (c.req.method === "OPTIONS") { | ||
if (opts.maxAge != null) { | ||
@@ -90,2 +88,3 @@ set("Access-Control-Max-Age", opts.maxAge.toString()); | ||
} | ||
await next(); | ||
}; | ||
@@ -92,0 +91,0 @@ }; |
@@ -43,9 +43,9 @@ "use strict"; | ||
if (parts.length !== 2) { | ||
const res = new Response("Unauthorized", { | ||
status: 401, | ||
headers: { | ||
"WWW-Authenticate": `Bearer realm="${ctx.req.url}",error="invalid_request",error_description="invalid credentials structure"` | ||
} | ||
throw new import_http_exception.HTTPException(401, { | ||
res: unauthorizedResponse({ | ||
ctx, | ||
error: "invalid_request", | ||
errDescription: "invalid credentials structure" | ||
}) | ||
}); | ||
throw new import_http_exception.HTTPException(401, { res }); | ||
} else { | ||
@@ -58,9 +58,9 @@ token = parts[1]; | ||
if (!token) { | ||
const res = new Response("Unauthorized", { | ||
status: 401, | ||
headers: { | ||
"WWW-Authenticate": `Bearer realm="${ctx.req.url}",error="invalid_request",error_description="no authorization included in request"` | ||
} | ||
throw new import_http_exception.HTTPException(401, { | ||
res: unauthorizedResponse({ | ||
ctx, | ||
error: "invalid_request", | ||
errDescription: "no authorization included in request" | ||
}) | ||
}); | ||
throw new import_http_exception.HTTPException(401, { res }); | ||
} | ||
@@ -75,10 +75,10 @@ let payload; | ||
if (!payload) { | ||
const res = new Response("Unauthorized", { | ||
status: 401, | ||
statusText: msg, | ||
headers: { | ||
"WWW-Authenticate": `Bearer realm="${ctx.req.url}",error="invalid_token",error_description="token verification failure"` | ||
} | ||
throw new import_http_exception.HTTPException(401, { | ||
res: unauthorizedResponse({ | ||
ctx, | ||
error: "invalid_token", | ||
statusText: msg, | ||
errDescription: "token verification failure" | ||
}) | ||
}); | ||
throw new import_http_exception.HTTPException(401, { res }); | ||
} | ||
@@ -89,2 +89,11 @@ ctx.set("jwtPayload", payload); | ||
}; | ||
function unauthorizedResponse(opts) { | ||
return new Response("Unauthorized", { | ||
status: 401, | ||
statusText: opts.statusText, | ||
headers: { | ||
"WWW-Authenticate": `Bearer realm="${opts.ctx.req.url}",error="${opts.error}",error_description="${opts.errDescription}"` | ||
} | ||
}); | ||
} | ||
const verify = import_jwt.Jwt.verify; | ||
@@ -91,0 +100,0 @@ const decode = import_jwt.Jwt.decode; |
@@ -25,2 +25,6 @@ var __accessCheck = (obj, member, msg) => { | ||
var TEXT_PLAIN = "text/plain; charset=UTF-8"; | ||
var setHeaders = (headers, map = {}) => { | ||
Object.entries(map).forEach(([key, value]) => headers.set(key, value)); | ||
return headers; | ||
}; | ||
var _status, _executionCtx, _headers, _preparedHeaders, _res, _isFresh; | ||
@@ -98,10 +102,12 @@ var Context = class { | ||
if (arg && typeof arg !== "number") { | ||
this.res = new Response(data, arg); | ||
const headers2 = setHeaders(new Headers(arg.headers), __privateGet(this, _preparedHeaders)); | ||
return new Response(data, { | ||
headers: headers2, | ||
status: arg.status | ||
}); | ||
} | ||
const status = typeof arg === "number" ? arg : arg ? arg.status : __privateGet(this, _status); | ||
const status = typeof arg === "number" ? arg : __privateGet(this, _status); | ||
__privateGet(this, _preparedHeaders) ?? __privateSet(this, _preparedHeaders, {}); | ||
__privateGet(this, _headers) ?? __privateSet(this, _headers, new Headers()); | ||
for (const [k, v] of Object.entries(__privateGet(this, _preparedHeaders))) { | ||
__privateGet(this, _headers).set(k, v); | ||
} | ||
setHeaders(__privateGet(this, _headers), __privateGet(this, _preparedHeaders)); | ||
if (__privateGet(this, _res)) { | ||
@@ -111,5 +117,3 @@ __privateGet(this, _res).headers.forEach((v, k) => { | ||
}); | ||
for (const [k, v] of Object.entries(__privateGet(this, _preparedHeaders))) { | ||
__privateGet(this, _headers).set(k, v); | ||
} | ||
setHeaders(__privateGet(this, _headers), __privateGet(this, _preparedHeaders)); | ||
} | ||
@@ -116,0 +120,0 @@ headers ?? (headers = {}); |
@@ -35,12 +35,6 @@ // src/middleware/basic-auth/index.ts | ||
for (const user of users) { | ||
const usernameEqual = await timingSafeEqual( | ||
user.username, | ||
requestUser.username, | ||
options.hashFunction | ||
); | ||
const passwordEqual = await timingSafeEqual( | ||
user.password, | ||
requestUser.password, | ||
options.hashFunction | ||
); | ||
const [usernameEqual, passwordEqual] = await Promise.all([ | ||
timingSafeEqual(user.username, requestUser.username, options.hashFunction), | ||
timingSafeEqual(user.password, requestUser.password, options.hashFunction) | ||
]); | ||
if (usernameEqual && passwordEqual) { | ||
@@ -47,0 +41,0 @@ await next(); |
@@ -23,17 +23,16 @@ // src/middleware/cache/index.ts | ||
const response = await cache3.match(key); | ||
if (!response) { | ||
await next(); | ||
if (!c.res.ok) { | ||
return; | ||
} | ||
addHeader(c); | ||
const response2 = c.res.clone(); | ||
if (options.wait) { | ||
await cache3.put(key, response2); | ||
} else { | ||
c.executionCtx.waitUntil(cache3.put(key, response2)); | ||
} | ||
} else { | ||
if (response) { | ||
return new Response(response.body, response); | ||
} | ||
await next(); | ||
if (!c.res.ok) { | ||
return; | ||
} | ||
addHeader(c); | ||
const res = c.res.clone(); | ||
if (options.wait) { | ||
await cache3.put(key, res); | ||
} else { | ||
c.executionCtx.waitUntil(cache3.put(key, res)); | ||
} | ||
}; | ||
@@ -40,0 +39,0 @@ }; |
@@ -39,5 +39,3 @@ // src/middleware/cors/index.ts | ||
} | ||
if (c.req.method !== "OPTIONS") { | ||
await next(); | ||
} else { | ||
if (c.req.method === "OPTIONS") { | ||
if (opts.maxAge != null) { | ||
@@ -68,2 +66,3 @@ set("Access-Control-Max-Age", opts.maxAge.toString()); | ||
} | ||
await next(); | ||
}; | ||
@@ -70,0 +69,0 @@ }; |
@@ -18,9 +18,9 @@ // src/middleware/jwt/index.ts | ||
if (parts.length !== 2) { | ||
const res = new Response("Unauthorized", { | ||
status: 401, | ||
headers: { | ||
"WWW-Authenticate": `Bearer realm="${ctx.req.url}",error="invalid_request",error_description="invalid credentials structure"` | ||
} | ||
throw new HTTPException(401, { | ||
res: unauthorizedResponse({ | ||
ctx, | ||
error: "invalid_request", | ||
errDescription: "invalid credentials structure" | ||
}) | ||
}); | ||
throw new HTTPException(401, { res }); | ||
} else { | ||
@@ -33,9 +33,9 @@ token = parts[1]; | ||
if (!token) { | ||
const res = new Response("Unauthorized", { | ||
status: 401, | ||
headers: { | ||
"WWW-Authenticate": `Bearer realm="${ctx.req.url}",error="invalid_request",error_description="no authorization included in request"` | ||
} | ||
throw new HTTPException(401, { | ||
res: unauthorizedResponse({ | ||
ctx, | ||
error: "invalid_request", | ||
errDescription: "no authorization included in request" | ||
}) | ||
}); | ||
throw new HTTPException(401, { res }); | ||
} | ||
@@ -50,10 +50,10 @@ let payload; | ||
if (!payload) { | ||
const res = new Response("Unauthorized", { | ||
status: 401, | ||
statusText: msg, | ||
headers: { | ||
"WWW-Authenticate": `Bearer realm="${ctx.req.url}",error="invalid_token",error_description="token verification failure"` | ||
} | ||
throw new HTTPException(401, { | ||
res: unauthorizedResponse({ | ||
ctx, | ||
error: "invalid_token", | ||
statusText: msg, | ||
errDescription: "token verification failure" | ||
}) | ||
}); | ||
throw new HTTPException(401, { res }); | ||
} | ||
@@ -64,2 +64,11 @@ ctx.set("jwtPayload", payload); | ||
}; | ||
function unauthorizedResponse(opts) { | ||
return new Response("Unauthorized", { | ||
status: 401, | ||
statusText: opts.statusText, | ||
headers: { | ||
"WWW-Authenticate": `Bearer realm="${opts.ctx.req.url}",error="${opts.error}",error_description="${opts.errDescription}"` | ||
} | ||
}); | ||
} | ||
var verify = Jwt.verify; | ||
@@ -66,0 +75,0 @@ var decode = Jwt.decode; |
@@ -19,2 +19,16 @@ import type { Hono } from '../../hono'; | ||
} | ||
interface CloudFrontS3Origin { | ||
authMethod: 'origin-access-identity' | 'none'; | ||
customHeaders: CloudFrontHeaders; | ||
domainName: string; | ||
path: string; | ||
region: string; | ||
} | ||
type CloudFrontOrigin = { | ||
s3: CloudFrontS3Origin; | ||
custom?: never; | ||
} | { | ||
custom: CloudFrontCustomOrigin; | ||
s3?: never; | ||
}; | ||
export interface CloudFrontRequest { | ||
@@ -32,5 +46,3 @@ clientIp: string; | ||
}; | ||
origin?: { | ||
custom: CloudFrontCustomOrigin; | ||
}; | ||
origin?: CloudFrontOrigin; | ||
} | ||
@@ -37,0 +49,0 @@ export interface CloudFrontResponse { |
@@ -155,3 +155,69 @@ import type { Context } from './context'; | ||
export interface MiddlewareHandlerInterface<E extends Env = Env, S extends Schema = {}, BasePath extends string = '/'> { | ||
<E2 extends Env = E>(...handlers: MiddlewareHandler<E2, MergePath<BasePath, ExtractKey<S>>>[]): Hono<E, S, BasePath>; | ||
<E2 extends Env = E>(...handlers: MiddlewareHandler<E2, MergePath<BasePath, ExtractKey<S>>>[]): Hono<IntersectNonAnyTypes<[E, E2]>, S, BasePath>; | ||
<E2 extends Env = E>(handler: MiddlewareHandler<E2, MergePath<BasePath, ExtractKey<S>>>): Hono<IntersectNonAnyTypes<[E, E2]>, S, BasePath>; | ||
<E2 extends Env = E, E3 extends Env = IntersectNonAnyTypes<[E, E2]>, P extends string = MergePath<BasePath, ExtractKey<S>>>(...handlers: [MiddlewareHandler<E2, P>, MiddlewareHandler<E3, P>]): Hono<IntersectNonAnyTypes<[E, E2, E3]>, S, BasePath>; | ||
<E2 extends Env = E, E3 extends Env = E, E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>, P extends string = MergePath<BasePath, ExtractKey<S>>>(...handlers: [MiddlewareHandler<E2, P>, MiddlewareHandler<E3, P>, MiddlewareHandler<E4, P>]): Hono<IntersectNonAnyTypes<[E, E2, E3, E4]>, S, BasePath>; | ||
<E2 extends Env = E, E3 extends Env = E, E4 extends Env = E, E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>, P extends string = MergePath<BasePath, ExtractKey<S>>>(...handlers: [ | ||
MiddlewareHandler<E2, P>, | ||
MiddlewareHandler<E3, P>, | ||
MiddlewareHandler<E4, P>, | ||
MiddlewareHandler<E5, P> | ||
]): Hono<IntersectNonAnyTypes<[E, E2, E3, E4, E5]>, S, BasePath>; | ||
<E2 extends Env = E, E3 extends Env = E, E4 extends Env = E, E5 extends Env = E, E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>, P extends string = MergePath<BasePath, ExtractKey<S>>>(...handlers: [ | ||
MiddlewareHandler<E2, P>, | ||
MiddlewareHandler<E3, P>, | ||
MiddlewareHandler<E4, P>, | ||
MiddlewareHandler<E5, P>, | ||
MiddlewareHandler<E6, P> | ||
]): Hono<IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>, S, BasePath>; | ||
<E2 extends Env = E, E3 extends Env = E, E4 extends Env = E, E5 extends Env = E, E6 extends Env = E, E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>, P extends string = MergePath<BasePath, ExtractKey<S>>>(...handlers: [ | ||
MiddlewareHandler<E2, P>, | ||
MiddlewareHandler<E3, P>, | ||
MiddlewareHandler<E4, P>, | ||
MiddlewareHandler<E5, P>, | ||
MiddlewareHandler<E6, P>, | ||
MiddlewareHandler<E7, P> | ||
]): Hono<IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>, S, BasePath>; | ||
<E2 extends Env = E, E3 extends Env = E, E4 extends Env = E, E5 extends Env = E, E6 extends Env = E, E7 extends Env = E, E8 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>, P extends string = MergePath<BasePath, ExtractKey<S>>>(...handlers: [ | ||
MiddlewareHandler<E2, P>, | ||
MiddlewareHandler<E3, P>, | ||
MiddlewareHandler<E4, P>, | ||
MiddlewareHandler<E5, P>, | ||
MiddlewareHandler<E6, P>, | ||
MiddlewareHandler<E7, P>, | ||
MiddlewareHandler<E8, P> | ||
]): Hono<IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8]>, S, BasePath>; | ||
<E2 extends Env = E, E3 extends Env = E, E4 extends Env = E, E5 extends Env = E, E6 extends Env = E, E7 extends Env = E, E8 extends Env = E, E9 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8]>, P extends string = MergePath<BasePath, ExtractKey<S>>>(...handlers: [ | ||
MiddlewareHandler<E2, P>, | ||
MiddlewareHandler<E3, P>, | ||
MiddlewareHandler<E4, P>, | ||
MiddlewareHandler<E5, P>, | ||
MiddlewareHandler<E6, P>, | ||
MiddlewareHandler<E7, P>, | ||
MiddlewareHandler<E8, P>, | ||
MiddlewareHandler<E9, P> | ||
]): Hono<IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9]>, S, BasePath>; | ||
<E2 extends Env = E, E3 extends Env = E, E4 extends Env = E, E5 extends Env = E, E6 extends Env = E, E7 extends Env = E, E8 extends Env = E, E9 extends Env = E, E10 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9]>, P extends string = MergePath<BasePath, ExtractKey<S>>>(...handlers: [ | ||
MiddlewareHandler<E2, P>, | ||
MiddlewareHandler<E3, P>, | ||
MiddlewareHandler<E4, P>, | ||
MiddlewareHandler<E5, P>, | ||
MiddlewareHandler<E6, P>, | ||
MiddlewareHandler<E7, P>, | ||
MiddlewareHandler<E8, P>, | ||
MiddlewareHandler<E9, P>, | ||
MiddlewareHandler<E10, P> | ||
]): Hono<IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9, E10]>, S, BasePath>; | ||
<E2 extends Env = E, E3 extends Env = E, E4 extends Env = E, E5 extends Env = E, E6 extends Env = E, E7 extends Env = E, E8 extends Env = E, E9 extends Env = E, E10 extends Env = E, E11 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9, E10]>, P extends string = MergePath<BasePath, ExtractKey<S>>>(...handlers: [ | ||
MiddlewareHandler<E2, P>, | ||
MiddlewareHandler<E3, P>, | ||
MiddlewareHandler<E4, P>, | ||
MiddlewareHandler<E5, P>, | ||
MiddlewareHandler<E6, P>, | ||
MiddlewareHandler<E7, P>, | ||
MiddlewareHandler<E8, P>, | ||
MiddlewareHandler<E9, P>, | ||
MiddlewareHandler<E10, P>, | ||
MiddlewareHandler<E11, P> | ||
]): Hono<IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11]>, S, BasePath>; | ||
<P extends string, E2 extends Env = E>(path: P, ...handlers: MiddlewareHandler<E2, MergePath<BasePath, P>>[]): Hono<E, S, BasePath>; | ||
@@ -158,0 +224,0 @@ } |
{ | ||
"name": "hono", | ||
"version": "3.12.5", | ||
"version": "3.12.6", | ||
"description": "Ultrafast web framework for the Edges", | ||
@@ -14,2 +14,3 @@ "main": "dist/cjs/index.js", | ||
"test": "tsc --noEmit && vitest --run", | ||
"test:watch": "vitest --watch", | ||
"test:deno": "env NAME=Deno deno test --allow-read --allow-env runtime_tests/deno && deno test --no-lock -c runtime_tests/deno-jsx/deno.precompile.json runtime_tests/deno-jsx && deno test --no-lock -c runtime_tests/deno-jsx/deno.react-jsx.json runtime_tests/deno-jsx", | ||
@@ -16,0 +17,0 @@ "test:bun": "env NAME=Bun bun test --jsx-import-source ../../src/jsx runtime_tests/bun/index.test.tsx", |
561737
14995