dbsc-toolkit 2.14.0 → 2.15.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.
Files changed (174) hide show
  1. package/dist/client/index.d.ts +3 -0
  2. package/dist/client/index.d.ts.map +1 -1
  3. package/dist/client/index.js +33 -15
  4. package/dist/client/index.js.map +1 -1
  5. package/dist/client/installFetchInterceptor.d.ts +2 -0
  6. package/dist/client/installFetchInterceptor.d.ts.map +1 -1
  7. package/dist/client/installFetchInterceptor.js +1 -0
  8. package/dist/client/installFetchInterceptor.js.map +1 -1
  9. package/dist/client/wrapFetch.d.ts +7 -0
  10. package/dist/client/wrapFetch.d.ts.map +1 -1
  11. package/dist/client/wrapFetch.js +4 -2
  12. package/dist/client/wrapFetch.js.map +1 -1
  13. package/dist/core/bound/proof.d.ts +7 -0
  14. package/dist/core/bound/proof.d.ts.map +1 -1
  15. package/dist/core/bound/proof.js +29 -3
  16. package/dist/core/bound/proof.js.map +1 -1
  17. package/dist/core/bound/registration.d.ts +8 -1
  18. package/dist/core/bound/registration.d.ts.map +1 -1
  19. package/dist/core/bound/registration.js +30 -11
  20. package/dist/core/bound/registration.js.map +1 -1
  21. package/dist/core/bound/verify.d.ts.map +1 -1
  22. package/dist/core/bound/verify.js +3 -0
  23. package/dist/core/bound/verify.js.map +1 -1
  24. package/dist/core/crypto/jwk.d.ts.map +1 -1
  25. package/dist/core/crypto/jwk.js +9 -0
  26. package/dist/core/crypto/jwk.js.map +1 -1
  27. package/dist/core/dpop/guard.d.ts +9 -0
  28. package/dist/core/dpop/guard.d.ts.map +1 -1
  29. package/dist/core/dpop/guard.js +18 -2
  30. package/dist/core/dpop/guard.js.map +1 -1
  31. package/dist/core/errors.d.ts +2 -0
  32. package/dist/core/errors.d.ts.map +1 -1
  33. package/dist/core/errors.js +6 -0
  34. package/dist/core/errors.js.map +1 -1
  35. package/dist/core/index.d.ts +6 -5
  36. package/dist/core/index.d.ts.map +1 -1
  37. package/dist/core/index.js +4 -3
  38. package/dist/core/index.js.map +1 -1
  39. package/dist/core/protect-policy.d.ts +30 -28
  40. package/dist/core/protect-policy.d.ts.map +1 -1
  41. package/dist/core/protect-policy.js +25 -0
  42. package/dist/core/protect-policy.js.map +1 -1
  43. package/dist/core/protocol/body.d.ts +9 -0
  44. package/dist/core/protocol/body.d.ts.map +1 -0
  45. package/dist/core/protocol/body.js +44 -0
  46. package/dist/core/protocol/body.js.map +1 -0
  47. package/dist/core/protocol/registration.d.ts.map +1 -1
  48. package/dist/core/protocol/registration.js +7 -5
  49. package/dist/core/protocol/registration.js.map +1 -1
  50. package/dist/core/protocol/start-binding.d.ts +16 -0
  51. package/dist/core/protocol/start-binding.d.ts.map +1 -0
  52. package/dist/core/protocol/start-binding.js +21 -0
  53. package/dist/core/protocol/start-binding.js.map +1 -0
  54. package/dist/core/types.d.ts +17 -0
  55. package/dist/core/types.d.ts.map +1 -1
  56. package/dist/electron/index.d.ts +7 -0
  57. package/dist/electron/index.d.ts.map +1 -1
  58. package/dist/electron/index.js +13 -2
  59. package/dist/electron/index.js.map +1 -1
  60. package/dist/express/create-dbsc.d.ts +1 -1
  61. package/dist/express/create-dbsc.d.ts.map +1 -1
  62. package/dist/express/index.d.ts +0 -7
  63. package/dist/express/index.d.ts.map +1 -1
  64. package/dist/express/index.js +20 -23
  65. package/dist/express/index.js.map +1 -1
  66. package/dist/express/proof.d.ts +2 -0
  67. package/dist/express/proof.d.ts.map +1 -1
  68. package/dist/express/proof.js +8 -14
  69. package/dist/express/proof.js.map +1 -1
  70. package/dist/express/require-dpop.js +2 -1
  71. package/dist/express/require-dpop.js.map +1 -1
  72. package/dist/express/require-proof.d.ts +2 -2
  73. package/dist/express/require-proof.d.ts.map +1 -1
  74. package/dist/express/require-proof.js +8 -62
  75. package/dist/express/require-proof.js.map +1 -1
  76. package/dist/fastify/create-dbsc.d.ts +1 -1
  77. package/dist/fastify/create-dbsc.d.ts.map +1 -1
  78. package/dist/fastify/index.d.ts +0 -3
  79. package/dist/fastify/index.d.ts.map +1 -1
  80. package/dist/fastify/index.js +18 -23
  81. package/dist/fastify/index.js.map +1 -1
  82. package/dist/fastify/proof.d.ts +2 -0
  83. package/dist/fastify/proof.d.ts.map +1 -1
  84. package/dist/fastify/proof.js +6 -14
  85. package/dist/fastify/proof.js.map +1 -1
  86. package/dist/fastify/require-dpop.d.ts.map +1 -1
  87. package/dist/fastify/require-dpop.js +1 -0
  88. package/dist/fastify/require-dpop.js.map +1 -1
  89. package/dist/fastify/require-proof.d.ts +2 -2
  90. package/dist/fastify/require-proof.d.ts.map +1 -1
  91. package/dist/fastify/require-proof.js +4 -43
  92. package/dist/fastify/require-proof.js.map +1 -1
  93. package/dist/hono/create-dbsc.d.ts +1 -1
  94. package/dist/hono/create-dbsc.d.ts.map +1 -1
  95. package/dist/hono/index.d.ts +0 -3
  96. package/dist/hono/index.d.ts.map +1 -1
  97. package/dist/hono/index.js +31 -29
  98. package/dist/hono/index.js.map +1 -1
  99. package/dist/hono/proof.d.ts +2 -0
  100. package/dist/hono/proof.d.ts.map +1 -1
  101. package/dist/hono/proof.js +2 -2
  102. package/dist/hono/proof.js.map +1 -1
  103. package/dist/hono/require-dpop.d.ts.map +1 -1
  104. package/dist/hono/require-dpop.js +1 -0
  105. package/dist/hono/require-dpop.js.map +1 -1
  106. package/dist/hono/require-proof.d.ts +2 -2
  107. package/dist/hono/require-proof.d.ts.map +1 -1
  108. package/dist/hono/require-proof.js +4 -42
  109. package/dist/hono/require-proof.js.map +1 -1
  110. package/dist/koa/create-dbsc.d.ts +1 -1
  111. package/dist/koa/create-dbsc.d.ts.map +1 -1
  112. package/dist/koa/require-proof.d.ts +4 -2
  113. package/dist/koa/require-proof.d.ts.map +1 -1
  114. package/dist/koa/require-proof.js +21 -48
  115. package/dist/koa/require-proof.js.map +1 -1
  116. package/dist/nestjs/index.d.ts +1 -1
  117. package/dist/nestjs/index.d.ts.map +1 -1
  118. package/dist/nestjs/index.js +12 -50
  119. package/dist/nestjs/index.js.map +1 -1
  120. package/dist/nextjs/index.d.ts.map +1 -1
  121. package/dist/nextjs/index.js +37 -26
  122. package/dist/nextjs/index.js.map +1 -1
  123. package/dist/nextjs/proof.d.ts +2 -0
  124. package/dist/nextjs/proof.d.ts.map +1 -1
  125. package/dist/nextjs/proof.js +2 -2
  126. package/dist/nextjs/proof.js.map +1 -1
  127. package/dist/nextjs/require-dpop.d.ts.map +1 -1
  128. package/dist/nextjs/require-dpop.js +1 -0
  129. package/dist/nextjs/require-dpop.js.map +1 -1
  130. package/dist/nextjs/require-proof.d.ts +1 -1
  131. package/dist/nextjs/require-proof.d.ts.map +1 -1
  132. package/dist/nextjs/require-proof.js +12 -43
  133. package/dist/nextjs/require-proof.js.map +1 -1
  134. package/dist/node/create-dbsc.d.ts +1 -1
  135. package/dist/node/create-dbsc.d.ts.map +1 -1
  136. package/dist/node/index.d.ts +13 -4
  137. package/dist/node/index.d.ts.map +1 -1
  138. package/dist/node/index.js +45 -30
  139. package/dist/node/index.js.map +1 -1
  140. package/dist/node/require-dpop.d.ts.map +1 -1
  141. package/dist/node/require-dpop.js +1 -0
  142. package/dist/node/require-dpop.js.map +1 -1
  143. package/dist/node/require-proof.d.ts +3 -1
  144. package/dist/node/require-proof.d.ts.map +1 -1
  145. package/dist/node/require-proof.js +25 -58
  146. package/dist/node/require-proof.js.map +1 -1
  147. package/dist/storage/memory/index.d.ts +1 -1
  148. package/dist/storage/memory/index.d.ts.map +1 -1
  149. package/dist/storage/memory/index.js +7 -3
  150. package/dist/storage/memory/index.js.map +1 -1
  151. package/dist/storage/postgres/index.d.ts +7 -0
  152. package/dist/storage/postgres/index.d.ts.map +1 -1
  153. package/dist/storage/postgres/index.js +17 -1
  154. package/dist/storage/postgres/index.js.map +1 -1
  155. package/dist/storage/redis/index.d.ts +3 -0
  156. package/dist/storage/redis/index.d.ts.map +1 -1
  157. package/dist/storage/redis/index.js +31 -2
  158. package/dist/storage/redis/index.js.map +1 -1
  159. package/dist/sveltekit/index.d.ts +0 -3
  160. package/dist/sveltekit/index.d.ts.map +1 -1
  161. package/dist/sveltekit/index.js +31 -24
  162. package/dist/sveltekit/index.js.map +1 -1
  163. package/dist/sveltekit/require-dpop.d.ts.map +1 -1
  164. package/dist/sveltekit/require-dpop.js +1 -0
  165. package/dist/sveltekit/require-dpop.js.map +1 -1
  166. package/dist/sveltekit/require-proof.d.ts +3 -8
  167. package/dist/sveltekit/require-proof.d.ts.map +1 -1
  168. package/dist/sveltekit/require-proof.js +6 -62
  169. package/dist/sveltekit/require-proof.js.map +1 -1
  170. package/package.json +1 -1
  171. package/dist/core/protocol/native-proof-guard.d.ts +0 -58
  172. package/dist/core/protocol/native-proof-guard.d.ts.map +0 -1
  173. package/dist/core/protocol/native-proof-guard.js +0 -60
  174. package/dist/core/protocol/native-proof-guard.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { DbscVerificationError } from "../errors.js";
1
+ import { DbscVerificationError, ErrorCodes } from "../errors.js";
2
2
  import { verifyDpopProof } from "./verify.js";
3
3
  /** Parse a `DPoP <token>` Authorization header. Returns the token or undefined. */
4
4
  export function parseDpopAuthorization(authorization) {
@@ -12,12 +12,28 @@ export function parseDpopAuthorization(authorization) {
12
12
  * fields, calls this, then writes its own 401 + WWW-Authenticate on failure.
13
13
  */
14
14
  export async function runDpopGuard(input) {
15
+ // A bearer token on a DPoP-guarded route is a downgrade: a stolen DPoP-bound
16
+ // token sent as Bearer with the thief's own proof would skip ath/jkt checks.
17
+ if (input.opts.requireTokenBinding !== false && /^bearer\s/i.test(input.authorization?.trim() ?? "")) {
18
+ return {
19
+ ok: false,
20
+ error: {
21
+ code: ErrorCodes.DPOP_TOKEN_BINDING_REQUIRED,
22
+ message: "bearer token presented on a DPoP-guarded route; use the DPoP scheme",
23
+ },
24
+ };
25
+ }
15
26
  const accessToken = parseDpopAuthorization(input.authorization);
27
+ let url = input.url;
28
+ if (input.opts.origin) {
29
+ const actual = new URL(input.url, "http://x");
30
+ url = new URL(actual.pathname + actual.search, input.opts.origin).href;
31
+ }
16
32
  try {
17
33
  const { jkt } = await verifyDpopProof({
18
34
  proof: input.proof,
19
35
  method: input.method,
20
- url: input.url,
36
+ url,
21
37
  ...(accessToken !== undefined && { accessToken }),
22
38
  ...(input.boundJkt !== undefined && { boundJkt: input.boundJkt }),
23
39
  ...(input.opts.requireTokenBinding !== undefined && {
@@ -1 +1 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../src/core/dpop/guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA2C9C,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CAAC,aAAiC;IACtE,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAqB;IACtD,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,eAAe,CAAC;YACpC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,SAAS,IAAI;gBAClD,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB;aACpD,CAAC;YACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpF,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;SAC3E,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,qBAAqB,EAAE,CAAC;YACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAG,iCAAiC,CAAC"}
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../src/core/dpop/guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAmD9C,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CAAC,aAAiC;IACtE,IAAI,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAqB;IACtD,6EAA6E;IAC7E,6EAA6E;IAC7E,IAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACrG,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,UAAU,CAAC,2BAA2B;gBAC5C,OAAO,EAAE,qEAAqE;aAC/E;SACF,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChE,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACpB,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IACzE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,eAAe,CAAC;YACpC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG;YACH,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,SAAS,IAAI;gBAClD,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB;aACpD,CAAC;YACF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpF,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;SAC3E,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,qBAAqB,EAAE,CAAC;YACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAG,iCAAiC,CAAC"}
@@ -25,10 +25,12 @@ export declare const ErrorCodes: {
25
25
  readonly KEY_NOT_FOUND_BOUND: "KEY_NOT_FOUND_BOUND";
26
26
  readonly SESSION_NOT_FOUND: "SESSION_NOT_FOUND";
27
27
  readonly SESSION_ALREADY_REGISTERED: "SESSION_ALREADY_REGISTERED";
28
+ readonly REGISTRATION_WINDOW_CLOSED: "REGISTRATION_WINDOW_CLOSED";
28
29
  readonly RATE_LIMITED: "RATE_LIMITED";
29
30
  readonly MISSING_PROOF: "MISSING_PROOF";
30
31
  readonly MALFORMED_PROOF: "MALFORMED_PROOF";
31
32
  readonly PROOF_REPLAY: "PROOF_REPLAY";
33
+ readonly SESSION_MISMATCH: "SESSION_MISMATCH";
32
34
  readonly DPOP_PROOF_MISSING: "DPOP_PROOF_MISSING";
33
35
  readonly DPOP_PROOF_MALFORMED: "DPOP_PROOF_MALFORMED";
34
36
  readonly DPOP_INVALID_TYP: "DPOP_INVALID_TYP";
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCb,CAAC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Cb,CAAC"}
@@ -41,10 +41,16 @@ export const ErrorCodes = {
41
41
  KEY_NOT_FOUND_BOUND: "KEY_NOT_FOUND_BOUND",
42
42
  SESSION_NOT_FOUND: "SESSION_NOT_FOUND",
43
43
  SESSION_ALREADY_REGISTERED: "SESSION_ALREADY_REGISTERED",
44
+ // A polyfill key arrived after the registration window closed (see
45
+ // DbscOptions.boundRegistrationWindowMs). The user has to sign in again.
46
+ REGISTRATION_WINDOW_CLOSED: "REGISTRATION_WINDOW_CLOSED",
44
47
  RATE_LIMITED: "RATE_LIMITED",
45
48
  MISSING_PROOF: "MISSING_PROOF",
46
49
  MALFORMED_PROOF: "MALFORMED_PROOF",
47
50
  PROOF_REPLAY: "PROOF_REPLAY",
51
+ // The DBSC session presented with the request is not the one bound to the
52
+ // app's own login (expectSessionId / expectUserId).
53
+ SESSION_MISMATCH: "SESSION_MISMATCH",
48
54
  // DPoP (RFC 9449). Optional layer, reached only via the dbsc-toolkit/dpop
49
55
  // subpath. A failed DPoP check maps to HTTP 401 + WWW-Authenticate: DPoP
50
56
  // (resource-server semantics) — not the 403 the DBSC per-request proof uses.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,uBAAuB,EAAE,yBAAyB;IAClD,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,aAAa,EAAE,eAAe;IAC9B,wEAAwE;IACxE,0EAA0E;IAC1E,wEAAwE;IACxE,gBAAgB;IAChB,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,0BAA0B,EAAE,4BAA4B;IACxD,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,cAAc;IAC5B,0EAA0E;IAC1E,yEAAyE;IACzE,6EAA6E;IAC7E,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,sBAAsB,EAAE,wBAAwB;IAChD,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,sBAAsB,EAAE,wBAAwB;IAChD,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,2BAA2B,EAAE,6BAA6B;CAClD,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,uBAAuB,EAAE,yBAAyB;IAClD,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,mBAAmB;IACtC,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,YAAY,EAAE,cAAc;IAC5B,iBAAiB,EAAE,mBAAmB;IACtC,aAAa,EAAE,eAAe;IAC9B,wEAAwE;IACxE,0EAA0E;IAC1E,wEAAwE;IACxE,gBAAgB;IAChB,oBAAoB,EAAE,sBAAsB;IAC5C,mBAAmB,EAAE,qBAAqB;IAC1C,iBAAiB,EAAE,mBAAmB;IACtC,0BAA0B,EAAE,4BAA4B;IACxD,mEAAmE;IACnE,yEAAyE;IACzE,0BAA0B,EAAE,4BAA4B;IACxD,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,cAAc;IAC5B,0EAA0E;IAC1E,oDAAoD;IACpD,gBAAgB,EAAE,kBAAkB;IACpC,0EAA0E;IAC1E,yEAAyE;IACzE,6EAA6E;IAC7E,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,sBAAsB,EAAE,wBAAwB;IAChD,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,sBAAsB,EAAE,wBAAwB;IAChD,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,2BAA2B,EAAE,6BAA6B;CAClD,CAAC"}
@@ -7,12 +7,12 @@ export { buildRegistrationHeader, buildChallengeHeader, parseSessionResponseHead
7
7
  export type { SkippedEntry, SkippedReason } from "./protocol/headers.js";
8
8
  export { handleRegistration } from "./protocol/registration.js";
9
9
  export { handleRefresh } from "./protocol/refresh.js";
10
- export { guardNativeProof, freshProofActive, challengeCookieName, FRESH_PROOF_CHALLENGE_TTL_MS, } from "./protocol/native-proof-guard.js";
11
- export type { NativeProofGuardRequest, NativeProofGuardResult, FreshProofScope, } from "./protocol/native-proof-guard.js";
10
+ export { startBinding } from "./protocol/start-binding.js";
11
+ export type { StartBindingInput } from "./protocol/start-binding.js";
12
12
  export { handleBoundRegistration } from "./bound/registration.js";
13
13
  export { handleBoundRefresh } from "./bound/refresh.js";
14
14
  export { verifyP256Signature } from "./bound/verify.js";
15
- export { verifyBoundProof, parseProofHeader, BOUND_PROOF_HEADER } from "./bound/proof.js";
15
+ export { verifyBoundProof, parseProofHeader, proofBodyBytes, BOUND_PROOF_HEADER } from "./bound/proof.js";
16
16
  export type { VerifyBoundProofRequest } from "./bound/proof.js";
17
17
  export { NoopRateLimiter } from "./ratelimit/interface.js";
18
18
  export { NoopReplayCache } from "./replay/interface.js";
@@ -20,9 +20,10 @@ export { emit } from "./telemetry/hooks.js";
20
20
  export { maybeEmitPolyfillMissing, POLYFILL_MISSING_GRACE_MS } from "./telemetry/polyfill-missing.js";
21
21
  export { deriveSessionId } from "./derive-session-id.js";
22
22
  export type { DeriveSessionIdInput } from "./derive-session-id.js";
23
- export { noBindingReason } from "./protect-policy.js";
24
- export type { RequireProofOptions } from "./protect-policy.js";
23
+ export { noBindingReason, sessionBindingMatches, proofTarget, SESSION_MISMATCH_MESSAGE } from "./protect-policy.js";
24
+ export type { RequireProofOptions, SessionBindingHook } from "./protect-policy.js";
25
25
  export { parseCookieHeader } from "./protocol/cookies.js";
26
+ export { readJsonObject, MAX_PROTOCOL_BODY_BYTES } from "./protocol/body.js";
26
27
  export { resolveCookieScope, cookieNames as resolveCookieNames, deviceCookieName, cookieAttributesString, } from "./cookies/options.js";
27
28
  export type { CookieScope, CookieScopeOptions, CookieScopeResolved } from "./cookies/options.js";
28
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,uBAAuB,EACvB,sBAAsB,EACtB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1F,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEtG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EACL,kBAAkB,EAClB,WAAW,IAAI,kBAAkB,EACjC,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1G,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEtG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACpH,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,EACL,kBAAkB,EAClB,WAAW,IAAI,kBAAkB,EACjC,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -5,17 +5,18 @@ export { generateJti, issueChallenge } from "./protocol/challenge.js";
5
5
  export { buildRegistrationHeader, buildChallengeHeader, parseSessionResponseHeader, parseSessionSkippedHeader, buildSessionIdCookie, readSessionResponseHeader, REGISTRATION_HEADER, RESPONSE_HEADER, CHALLENGE_HEADER, SKIPPED_HEADER, LEGACY_REGISTRATION_HEADER, LEGACY_RESPONSE_HEADER, LEGACY_CHALLENGE_HEADER, LEGACY_SKIPPED_HEADER, } from "./protocol/headers.js";
6
6
  export { handleRegistration } from "./protocol/registration.js";
7
7
  export { handleRefresh } from "./protocol/refresh.js";
8
- export { guardNativeProof, freshProofActive, challengeCookieName, FRESH_PROOF_CHALLENGE_TTL_MS, } from "./protocol/native-proof-guard.js";
8
+ export { startBinding } from "./protocol/start-binding.js";
9
9
  export { handleBoundRegistration } from "./bound/registration.js";
10
10
  export { handleBoundRefresh } from "./bound/refresh.js";
11
11
  export { verifyP256Signature } from "./bound/verify.js";
12
- export { verifyBoundProof, parseProofHeader, BOUND_PROOF_HEADER } from "./bound/proof.js";
12
+ export { verifyBoundProof, parseProofHeader, proofBodyBytes, BOUND_PROOF_HEADER } from "./bound/proof.js";
13
13
  export { NoopRateLimiter } from "./ratelimit/interface.js";
14
14
  export { NoopReplayCache } from "./replay/interface.js";
15
15
  export { emit } from "./telemetry/hooks.js";
16
16
  export { maybeEmitPolyfillMissing, POLYFILL_MISSING_GRACE_MS } from "./telemetry/polyfill-missing.js";
17
17
  export { deriveSessionId } from "./derive-session-id.js";
18
- export { noBindingReason } from "./protect-policy.js";
18
+ export { noBindingReason, sessionBindingMatches, proofTarget, SESSION_MISMATCH_MESSAGE } from "./protect-policy.js";
19
19
  export { parseCookieHeader } from "./protocol/cookies.js";
20
+ export { readJsonObject, MAX_PROTOCOL_BODY_BYTES } from "./protocol/body.js";
20
21
  export { resolveCookieScope, cookieNames as resolveCookieNames, deviceCookieName, cookieAttributesString, } from "./cookies/options.js";
21
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAO1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG1F,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEtG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EACL,kBAAkB,EAClB,WAAW,IAAI,kBAAkB,EACjC,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG1G,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEtG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAGpH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,EACL,kBAAkB,EAClB,WAAW,IAAI,kBAAkB,EACjC,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import type { ProofReplayCache, StorageAdapter } from "./types.js";
2
2
  import type { SkippedEntry } from "./protocol/headers.js";
3
- import type { CookieScope } from "./cookies/options.js";
4
3
  /**
5
4
  * Options for `requireProof()`. All optional — `requireProof()` with no
6
5
  * arguments is the normal call. `requireProof()` always means: the request
@@ -8,7 +7,9 @@ import type { CookieScope } from "./cookies/options.js";
8
7
  * As of v2.7 Chromium sessions register a polyfill key alongside the TPM
9
8
  * key, so the per-request signature works the same way on every tier.
10
9
  */
11
- export interface RequireProofOptions {
10
+ /** Returns the app's own value for this request, or nothing when there is no login. */
11
+ export type SessionBindingHook<Req> = (req: Req) => string | null | undefined | Promise<string | null | undefined>;
12
+ export interface RequireProofOptions<Req = unknown> {
12
13
  /**
13
14
  * Skip the per-request proof header on `tier: "dbsc"`. **Default `false`
14
15
  * as of v2.7.** v2.6 and earlier defaulted to `true`, which left a
@@ -39,37 +40,38 @@ export interface RequireProofOptions {
39
40
  */
40
41
  bound?: boolean;
41
42
  /**
42
- * Demand a fresh hardware proof per request on a `tier: "dbsc"` session via
43
- * the native 403-challenge handshake, instead of trusting the rotated cookie.
44
- * The guard answers a proofless request with `403` + `Secure-Session-Challenge`;
45
- * Chrome signs the challenge with the TPM/Secure Enclave key and retries the
46
- * same URL with `Secure-Session-Response`, which the guard verifies against the
47
- * stored native key. A stolen cookie has no hardware key, so it is rejected per
48
- * request — closing the refresh-cycle replay window without the polyfill.
43
+ * Ties the device-bound session to the app's own login. Return the session
44
+ * id you passed to `bind()` for the user this request is authenticated as.
45
+ * The guard rejects with 403 `SESSION_MISMATCH` when it differs from the
46
+ * DBSC session on the request, or when it returns nothing.
49
47
  *
50
- * Default: **on when the polyfill is off** (`bound: false`). With the polyfill
51
- * on, the co-registered bound key already proves every request, so the native
52
- * handshake is skipped unless you set this `true` explicitly (a hardware
53
- * roundtrip on every request — slower; reserve it for the most sensitive
54
- * routes). Set `false` to restore the old behavior of trusting a `dbsc` cookie
55
- * without a per-request check.
56
- *
57
- * Verifies key *possession*, not body integrity — for body-hash binding use the
58
- * polyfill `bound` tier (`signBody`). `allowDbscWithoutProof` still wins if set.
48
+ * Without this (or `expectUserId`) the guard only proves the request came
49
+ * from *some* bound device: an attacker can pair a stolen app cookie with
50
+ * their own bound DBSC session and pass. Set one of the two on every route
51
+ * where the app identifies the user from a separate cookie or token.
52
+ */
53
+ expectSessionId?: SessionBindingHook<Req>;
54
+ /**
55
+ * Like `expectSessionId`, but compares against the `userId` passed to
56
+ * `bind()`. Use it when the app has no stable session id (JWT mode).
59
57
  */
60
- freshProof?: boolean;
58
+ expectUserId?: SessionBindingHook<Req>;
61
59
  /**
62
- * Cookie scope for the `freshProof` challenge cookie, so it matches the
63
- * binding cookies' name + attributes. The Express / Fastify / Hono / Koa /
64
- * node / SvelteKit guards read this from the middleware context automatically;
65
- * the Next.js `requireProof` takes it here (and `secure`) because it has no
66
- * shared context. Defaults to the secure `__Host-` scope.
60
+ * Verify the query string as part of the signed path (`/path?a=1`). Must
61
+ * match the client's `wrapFetch({ signQuery: true })`. Off by default: the
62
+ * proof then covers method, path and body but not the query, so a captured
63
+ * proof can be replayed with different query parameters inside the window.
67
64
  */
68
- cookieScope?: CookieScope;
69
- cookieDomain?: string;
70
- /** Secure flag for the `freshProof` challenge cookie (Next.js only — others read context). Default true. */
71
- secure?: boolean;
65
+ signQuery?: boolean;
72
66
  }
67
+ /** The path string a proof signs: the pathname, plus the query when `signQuery` is on. */
68
+ export declare function proofTarget(pathname: string, search: string, signQuery: boolean | undefined): string;
69
+ export declare const SESSION_MISMATCH_MESSAGE = "device-bound session does not belong to this login";
70
+ /**
71
+ * Runs the `expectSessionId` / `expectUserId` hooks. Returns `true` when the
72
+ * DBSC session on the request belongs to the app's login (or no hook is set).
73
+ */
74
+ export declare function sessionBindingMatches<Req>(opts: RequireProofOptions<Req>, req: Req, sessionId: string, storage: StorageAdapter): Promise<boolean>;
73
75
  /** Human-readable reason for a `tier: "none"` rejection — quota-aware. */
74
76
  export declare function noBindingReason(skipped?: SkippedEntry[]): string;
75
77
  //# sourceMappingURL=protect-policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"protect-policy.d.ts","sourceRoot":"","sources":["../../src/core/protect-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;OAQG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4GAA4G;IAC5G,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,OAAO,GAAE,YAAY,EAAO,GAAG,MAAM,CAKpE"}
1
+ {"version":3,"file":"protect-policy.d.ts","sourceRoot":"","sources":["../../src/core/protect-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;GAMG;AACH,uFAAuF;AACvF,MAAM,MAAM,kBAAkB,CAAC,GAAG,IAAI,CACpC,GAAG,EAAE,GAAG,KACL,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAEpE,MAAM,WAAW,mBAAmB,CAAC,GAAG,GAAG,OAAO;IAChD;;;;;;;;OAQG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC1C;;;OAGG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAEpG;AAED,eAAO,MAAM,wBAAwB,uDAAuD,CAAC;AAE7F;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAC7C,IAAI,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAC9B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,OAAO,GAAE,YAAY,EAAO,GAAG,MAAM,CAKpE"}
@@ -1,3 +1,28 @@
1
+ /** The path string a proof signs: the pathname, plus the query when `signQuery` is on. */
2
+ export function proofTarget(pathname, search, signQuery) {
3
+ return signQuery ? pathname + search : pathname;
4
+ }
5
+ export const SESSION_MISMATCH_MESSAGE = "device-bound session does not belong to this login";
6
+ /**
7
+ * Runs the `expectSessionId` / `expectUserId` hooks. Returns `true` when the
8
+ * DBSC session on the request belongs to the app's login (or no hook is set).
9
+ */
10
+ export async function sessionBindingMatches(opts, req, sessionId, storage) {
11
+ if (opts.expectSessionId) {
12
+ const want = await opts.expectSessionId(req);
13
+ if (!want || want !== sessionId)
14
+ return false;
15
+ }
16
+ if (opts.expectUserId) {
17
+ const want = await opts.expectUserId(req);
18
+ if (!want)
19
+ return false;
20
+ const sess = await storage.getSession(sessionId);
21
+ if (!sess || sess.userId !== want)
22
+ return false;
23
+ }
24
+ return true;
25
+ }
1
26
  /** Human-readable reason for a `tier: "none"` rejection — quota-aware. */
2
27
  export function noBindingReason(skipped = []) {
3
28
  if (skipped.some((s) => s.reason === "quota_exceeded")) {
@@ -1 +1 @@
1
- {"version":3,"file":"protect-policy.js","sourceRoot":"","sources":["../../src/core/protect-policy.ts"],"names":[],"mappings":"AA0EA,0EAA0E;AAC1E,MAAM,UAAU,eAAe,CAAC,UAA0B,EAAE;IAC1D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,EAAE,CAAC;QACvD,OAAO,yIAAyI,CAAC;IACnJ,CAAC;IACD,OAAO,oFAAoF,CAAC;AAC9F,CAAC"}
1
+ {"version":3,"file":"protect-policy.js","sourceRoot":"","sources":["../../src/core/protect-policy.ts"],"names":[],"mappings":"AAuEA,0FAA0F;AAC1F,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAc,EAAE,SAA8B;IAC1F,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,oDAAoD,CAAC;AAE7F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAA8B,EAC9B,GAAQ,EACR,SAAiB,EACjB,OAAuB;IAEvB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,eAAe,CAAC,UAA0B,EAAE;IAC1D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,EAAE,CAAC;QACvD,OAAO,yIAAyI,CAAC;IACnJ,CAAC;IACD,OAAO,oFAAoF,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** Protocol request bodies are a key and a signature; anything larger is refused. */
2
+ export declare const MAX_PROTOCOL_BODY_BYTES: number;
3
+ /**
4
+ * Reads a Web `Request` body as a JSON object, stopping after `limit` bytes.
5
+ * Returns `{}` for an empty, oversized, invalid, or non-object body, so route
6
+ * code can read fields without guarding against `null` or arrays.
7
+ */
8
+ export declare function readJsonObject(request: Request, limit?: number): Promise<Record<string, unknown>>;
9
+ //# sourceMappingURL=body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../../src/core/protocol/body.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAEjD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,MAAgC,GACtC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+BlC"}
@@ -0,0 +1,44 @@
1
+ /** Protocol request bodies are a key and a signature; anything larger is refused. */
2
+ export const MAX_PROTOCOL_BODY_BYTES = 16 * 1024;
3
+ /**
4
+ * Reads a Web `Request` body as a JSON object, stopping after `limit` bytes.
5
+ * Returns `{}` for an empty, oversized, invalid, or non-object body, so route
6
+ * code can read fields without guarding against `null` or arrays.
7
+ */
8
+ export async function readJsonObject(request, limit = MAX_PROTOCOL_BODY_BYTES) {
9
+ const declared = Number(request.headers.get("content-length"));
10
+ if (Number.isFinite(declared) && declared > limit)
11
+ return {};
12
+ if (!request.body)
13
+ return {};
14
+ const reader = request.body.getReader();
15
+ const chunks = [];
16
+ let size = 0;
17
+ for (;;) {
18
+ const { done, value } = await reader.read();
19
+ if (done)
20
+ break;
21
+ size += value.byteLength;
22
+ if (size > limit) {
23
+ await reader.cancel().catch(() => { });
24
+ return {};
25
+ }
26
+ chunks.push(value);
27
+ }
28
+ const bytes = new Uint8Array(size);
29
+ let off = 0;
30
+ for (const c of chunks) {
31
+ bytes.set(c, off);
32
+ off += c.byteLength;
33
+ }
34
+ try {
35
+ const parsed = JSON.parse(new TextDecoder().decode(bytes));
36
+ return parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)
37
+ ? parsed
38
+ : {};
39
+ }
40
+ catch {
41
+ return {};
42
+ }
43
+ }
44
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../../../src/core/protocol/body.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,QAAgB,uBAAuB;IAEvC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,KAAK;QAAE,OAAO,EAAE,CAAC;IAC7D,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACxC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;QACzB,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClB,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC;IACtB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5E,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../src/core/protocol/registration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,mBAAmB,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,kBAAkB,CAAC,CA6D7B"}
1
+ {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../src/core/protocol/registration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5D,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,mBAAmB,EACxB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,kBAAkB,CAAC,CA+D7B"}
@@ -1,5 +1,6 @@
1
1
  import { parseRegistrationJws } from "../crypto/jws.js";
2
2
  import { DbscProtocolError, DbscVerificationError, ErrorCodes } from "../errors.js";
3
+ import { storeKeyOnce } from "../bound/registration.js";
3
4
  export async function handleRegistration(req, storage) {
4
5
  if (!req.secSessionResponseHeader) {
5
6
  throw new DbscProtocolError(ErrorCodes.MISSING_RESPONSE_HEADER, "Secure-Session-Response header is required");
@@ -22,6 +23,10 @@ export async function handleRegistration(req, storage) {
22
23
  if (challenge.sessionId !== req.sessionId) {
23
24
  throw new DbscVerificationError(ErrorCodes.JTI_MISMATCH, "challenge does not belong to this session");
24
25
  }
26
+ const session = await storage.getSession(req.sessionId);
27
+ if (!session) {
28
+ throw new DbscVerificationError(ErrorCodes.SESSION_NOT_FOUND, "session not found");
29
+ }
25
30
  const existingKey = await storage.getBoundKey(req.sessionId, "native");
26
31
  if (existingKey) {
27
32
  throw new DbscVerificationError(ErrorCodes.SESSION_ALREADY_REGISTERED, "session already has a native bound key; cannot register again");
@@ -38,11 +43,8 @@ export async function handleRegistration(req, storage) {
38
43
  createdAt: now,
39
44
  algorithm,
40
45
  };
41
- await storage.setBoundKey(boundKey);
42
- const session = await storage.getSession(req.sessionId);
43
- if (session) {
44
- await storage.setSession({ ...session, tier: "dbsc", lastRefreshAt: now });
45
- }
46
+ await storeKeyOnce(storage, boundKey);
47
+ await storage.setSession({ ...session, tier: "dbsc", lastRefreshAt: now });
46
48
  return { boundKey };
47
49
  }
48
50
  //# sourceMappingURL=registration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../../src/core/protocol/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAapF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAwB,EACxB,OAAuB;IAEvB,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;QAClC,MAAM,IAAI,iBAAiB,CACzB,UAAU,CAAC,uBAAuB,EAClC,4CAA4C,CAC7C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,YAAY,EAAE,8BAA8B,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,SAAS,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,IAAI,qBAAqB,CAC7B,UAAU,CAAC,YAAY,EACvB,2CAA2C,CAC5C,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,qBAAqB,CAC7B,UAAU,CAAC,0BAA0B,EACrC,+DAA+D,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAa;QACzB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,IAAI,EAAE,QAAQ;QACd,GAAG;QACH,SAAS,EAAE,GAAG;QACd,SAAS;KACV,CAAC;IAEF,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../../src/core/protocol/registration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { StorageAdapter } from "../types.js";
2
+ export interface StartBindingInput {
3
+ sessionId: string;
4
+ userId: string;
5
+ sessionTtlMs: number;
6
+ }
7
+ /**
8
+ * Starts a fresh binding for a login: drops any keys left on this session id
9
+ * and resets the session row, so the registration window starts now and a new
10
+ * device key can register. Called by every adapter's `bindSession()`.
11
+ *
12
+ * Reusing an old row kept its keys, so a re-login on a deterministic session
13
+ * id (JWT mode) could never register the browser's new key.
14
+ */
15
+ export declare function startBinding(storage: StorageAdapter, input: StartBindingInput): Promise<void>;
16
+ //# sourceMappingURL=start-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-binding.d.ts","sourceRoot":"","sources":["../../../src/core/protocol/start-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnG"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Starts a fresh binding for a login: drops any keys left on this session id
3
+ * and resets the session row, so the registration window starts now and a new
4
+ * device key can register. Called by every adapter's `bindSession()`.
5
+ *
6
+ * Reusing an old row kept its keys, so a re-login on a deterministic session
7
+ * id (JWT mode) could never register the browser's new key.
8
+ */
9
+ export async function startBinding(storage, input) {
10
+ const now = Date.now();
11
+ await storage.deleteBoundKey(input.sessionId);
12
+ await storage.setSession({
13
+ id: input.sessionId,
14
+ userId: input.userId,
15
+ tier: "none",
16
+ createdAt: now,
17
+ expiresAt: now + input.sessionTtlMs,
18
+ lastRefreshAt: 0,
19
+ });
20
+ }
21
+ //# sourceMappingURL=start-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-binding.js","sourceRoot":"","sources":["../../../src/core/protocol/start-binding.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAuB,EAAE,KAAwB;IAClF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,OAAO,CAAC,UAAU,CAAC;QACvB,EAAE,EAAE,KAAK,CAAC,SAAS;QACnB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG,GAAG,KAAK,CAAC,YAAY;QACnC,aAAa,EAAE,CAAC;KACjB,CAAC,CAAC;AACL,CAAC"}
@@ -59,6 +59,13 @@ export interface StorageAdapter {
59
59
  */
60
60
  getBoundKey(sessionId: string, kind?: BoundKeyKind): Promise<BoundKey | null>;
61
61
  setBoundKey(key: BoundKey): Promise<void>;
62
+ /**
63
+ * Optional. Store `key` only if no key of the same kind exists for the
64
+ * session; return `false` when one already does. Registration uses it so two
65
+ * racing registrations cannot overwrite each other. Adapters without it fall
66
+ * back to a read-then-write.
67
+ */
68
+ setBoundKeyIfAbsent?(key: BoundKey): Promise<boolean>;
62
69
  /**
63
70
  * Delete the bound key(s) for a session. Pass `kind` to remove just one
64
71
  * slot; without `kind` both slots are removed.
@@ -155,6 +162,16 @@ export interface DbscOptions {
155
162
  * Firefox / Safari then get no binding and `requireProof()` 403s them.
156
163
  */
157
164
  bound?: boolean;
165
+ /**
166
+ * How long after the binding starts a polyfill (`bound`) key may still be
167
+ * registered, in ms. Default 300000 (5 min). The window starts when the
168
+ * native key registered (Chromium) or when `bind()` ran (other browsers).
169
+ *
170
+ * Without a window, anyone holding the session cookie could register their
171
+ * own polyfill key on a session that had none yet and pass `requireProof()`.
172
+ * A session that misses the window stays unbound until the next sign-in.
173
+ */
174
+ boundRegistrationWindowMs?: number;
158
175
  boundCookieTtl?: number;
159
176
  registrationCookieTtl?: number;
160
177
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAChD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC;;;;;;OAMG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC9E,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACrD,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,IAAI,EAAE,sBAAsB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,IAAI,EAAE,gBAAgB,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,cAAc,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,IAAI,EAAE,kBAAkB,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,iBAAiB,GACzB,iBAAiB,GACjB,YAAY,GACZ,wBAAwB,GACxB,kBAAkB,GAClB,eAAe,GACf,oBAAoB,CAAC;AAEzB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC;CACjF;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
1
2
  import { type DbscNodeHandler, type DbscNodeSession } from "../node/index.js";
2
3
  export { dbsc, bindSession, getDbscSession, readJsonBody, createDbsc, DBSC_INTERNAL, } from "../node/index.js";
3
4
  export type { DbscNodeHandler, DbscNodeSession, DbscNodeOptions, DbscInternal, BindSessionOptions, } from "../node/index.js";
@@ -19,6 +20,12 @@ export { createElectronDbsc, type ElectronDbscKit } from "./create-dbsc.js";
19
20
  export interface DbscProtocolResult {
20
21
  handled: boolean;
21
22
  response: Response;
23
+ /**
24
+ * Runs a node guard (`kit.requireProof()`, `kit.requireDpop()`) against this
25
+ * request. Resolves `null` when the guard lets the request through, or the
26
+ * guard's error `Response` to return instead.
27
+ */
28
+ guard(g: (req: IncomingMessage, res: ServerResponse) => Promise<boolean>): Promise<Response | null>;
22
29
  session: DbscNodeSession | undefined;
23
30
  }
24
31
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/electron/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKpG,OAAO,EACL,IAAI,EACJ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,UAAU,EACV,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,eAAe,GAAG,SAAS,CAAC;CACtC;AAkFD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAM7B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/electron/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAwB,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKpG,OAAO,EACL,IAAI,EACJ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,UAAU,EACV,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACpG,OAAO,EAAE,eAAe,GAAG,SAAS,CAAC;CACtC;AAkFD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAiB7B"}
@@ -86,10 +86,21 @@ function makeRes() {
86
86
  * primitive if you need the resolved session or to chain a guard.
87
87
  */
88
88
  export async function handleDbscProtocol(request, handler) {
89
- const raw = new Uint8Array(await request.clone().arrayBuffer());
89
+ // Only buffer a body that can exist; GET/HEAD requests on the custom scheme
90
+ // (pages, assets) are not copied into memory.
91
+ const hasBody = request.method !== "GET" && request.method !== "HEAD";
92
+ const raw = hasBody ? new Uint8Array(await request.clone().arrayBuffer()) : new Uint8Array(0);
90
93
  const req = makeReq(request, raw);
91
94
  const { res, toResponse } = makeRes();
92
95
  const handled = await handler(req, res);
93
- return { handled, response: toResponse(), session: getDbscSession(req) };
96
+ return {
97
+ handled,
98
+ response: toResponse(),
99
+ session: getDbscSession(req),
100
+ guard: async (g) => {
101
+ const out = makeRes();
102
+ return (await g(req, out.res)) ? null : out.toResponse();
103
+ },
104
+ };
94
105
  }
95
106
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/electron/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/electron/index.ts"],"names":[],"mappings":"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"}