@opensyber/tokenforge 1.0.0 → 1.1.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 (162) hide show
  1. package/README.md +130 -11
  2. package/dist/adapters/astro.d.ts +9 -0
  3. package/dist/adapters/astro.d.ts.map +1 -1
  4. package/dist/adapters/astro.js +13 -0
  5. package/dist/adapters/astro.js.map +1 -1
  6. package/dist/adapters/cloud-v2-bridge.d.ts +8 -0
  7. package/dist/adapters/cloud-v2-bridge.d.ts.map +1 -0
  8. package/dist/adapters/cloud-v2-bridge.js +24 -0
  9. package/dist/adapters/cloud-v2-bridge.js.map +1 -0
  10. package/dist/adapters/express.d.ts +15 -2
  11. package/dist/adapters/express.d.ts.map +1 -1
  12. package/dist/adapters/express.js +38 -0
  13. package/dist/adapters/express.js.map +1 -1
  14. package/dist/adapters/fastify.d.ts +15 -6
  15. package/dist/adapters/fastify.d.ts.map +1 -1
  16. package/dist/adapters/fastify.js +38 -0
  17. package/dist/adapters/fastify.js.map +1 -1
  18. package/dist/adapters/hono.d.ts +12 -0
  19. package/dist/adapters/hono.d.ts.map +1 -1
  20. package/dist/adapters/hono.js +13 -0
  21. package/dist/adapters/hono.js.map +1 -1
  22. package/dist/adapters/index.d.ts.map +1 -1
  23. package/dist/adapters/index.js.map +1 -1
  24. package/dist/adapters/nextjs.d.ts +15 -0
  25. package/dist/adapters/nextjs.d.ts.map +1 -1
  26. package/dist/adapters/nextjs.js +57 -30
  27. package/dist/adapters/nextjs.js.map +1 -1
  28. package/dist/adapters/sveltekit.d.ts +9 -0
  29. package/dist/adapters/sveltekit.d.ts.map +1 -1
  30. package/dist/adapters/sveltekit.js +13 -0
  31. package/dist/adapters/sveltekit.js.map +1 -1
  32. package/dist/client/action-signer.d.ts.map +1 -1
  33. package/dist/client/action-signer.js.map +1 -1
  34. package/dist/client/binding.d.ts.map +1 -1
  35. package/dist/client/binding.js.map +1 -1
  36. package/dist/client/cloud-device.d.ts +54 -0
  37. package/dist/client/cloud-device.d.ts.map +1 -0
  38. package/dist/client/cloud-device.js +301 -0
  39. package/dist/client/cloud-device.js.map +1 -0
  40. package/dist/client/crypto.d.ts.map +1 -1
  41. package/dist/client/crypto.js.map +1 -1
  42. package/dist/client/index.d.ts +1 -0
  43. package/dist/client/index.d.ts.map +1 -1
  44. package/dist/client/index.js +3 -1
  45. package/dist/client/index.js.map +1 -1
  46. package/dist/client/interceptor.d.ts.map +1 -1
  47. package/dist/client/interceptor.js +27 -3
  48. package/dist/client/interceptor.js.map +1 -1
  49. package/dist/client/signer.d.ts +23 -3
  50. package/dist/client/signer.d.ts.map +1 -1
  51. package/dist/client/signer.js +33 -5
  52. package/dist/client/signer.js.map +1 -1
  53. package/dist/client/storage.d.ts.map +1 -1
  54. package/dist/client/storage.js.map +1 -1
  55. package/dist/client/webauthn.d.ts.map +1 -1
  56. package/dist/client/webauthn.js.map +1 -1
  57. package/dist/protocol/v2.d.ts +23 -0
  58. package/dist/protocol/v2.d.ts.map +1 -0
  59. package/dist/protocol/v2.js +157 -0
  60. package/dist/protocol/v2.js.map +1 -0
  61. package/dist/react/index.d.ts.map +1 -1
  62. package/dist/react/index.js.map +1 -1
  63. package/dist/react/provider.d.ts.map +1 -1
  64. package/dist/react/provider.js.map +1 -1
  65. package/dist/server/action-verify.d.ts.map +1 -1
  66. package/dist/server/action-verify.js +1 -1
  67. package/dist/server/action-verify.js.map +1 -1
  68. package/dist/server/activity-histogram.d.ts +47 -0
  69. package/dist/server/activity-histogram.d.ts.map +1 -0
  70. package/dist/server/activity-histogram.js +76 -0
  71. package/dist/server/activity-histogram.js.map +1 -0
  72. package/dist/server/aitm-heuristics.d.ts.map +1 -1
  73. package/dist/server/aitm-heuristics.js.map +1 -1
  74. package/dist/server/bind-with-id-token.d.ts +55 -0
  75. package/dist/server/bind-with-id-token.d.ts.map +1 -0
  76. package/dist/server/bind-with-id-token.js +70 -0
  77. package/dist/server/bind-with-id-token.js.map +1 -0
  78. package/dist/server/bound-cookie.d.ts.map +1 -1
  79. package/dist/server/bound-cookie.js.map +1 -1
  80. package/dist/server/cbor.d.ts.map +1 -1
  81. package/dist/server/cbor.js.map +1 -1
  82. package/dist/server/cloud-bind.d.ts +42 -0
  83. package/dist/server/cloud-bind.d.ts.map +1 -0
  84. package/dist/server/cloud-bind.js +387 -0
  85. package/dist/server/cloud-bind.js.map +1 -0
  86. package/dist/server/cloud-middleware.d.ts +46 -0
  87. package/dist/server/cloud-middleware.d.ts.map +1 -0
  88. package/dist/server/cloud-middleware.js +344 -0
  89. package/dist/server/cloud-middleware.js.map +1 -0
  90. package/dist/server/cloud-verify.d.ts +30 -0
  91. package/dist/server/cloud-verify.d.ts.map +1 -0
  92. package/dist/server/cloud-verify.js +206 -0
  93. package/dist/server/cloud-verify.js.map +1 -0
  94. package/dist/server/dbsc-challenge.d.ts.map +1 -1
  95. package/dist/server/dbsc-challenge.js.map +1 -1
  96. package/dist/server/dbsc-endpoint.d.ts +20 -0
  97. package/dist/server/dbsc-endpoint.d.ts.map +1 -0
  98. package/dist/server/dbsc-endpoint.js +85 -0
  99. package/dist/server/dbsc-endpoint.js.map +1 -0
  100. package/dist/server/dbsc-verify.d.ts +32 -0
  101. package/dist/server/dbsc-verify.d.ts.map +1 -0
  102. package/dist/server/dbsc-verify.js +65 -0
  103. package/dist/server/dbsc-verify.js.map +1 -0
  104. package/dist/server/identity-profile.d.ts +18 -0
  105. package/dist/server/identity-profile.d.ts.map +1 -0
  106. package/dist/server/identity-profile.js +113 -0
  107. package/dist/server/identity-profile.js.map +1 -0
  108. package/dist/server/index.d.ts +10 -0
  109. package/dist/server/index.d.ts.map +1 -1
  110. package/dist/server/index.js +5 -0
  111. package/dist/server/index.js.map +1 -1
  112. package/dist/server/jws-verify.d.ts.map +1 -1
  113. package/dist/server/jws-verify.js.map +1 -1
  114. package/dist/server/middleware.d.ts +9 -0
  115. package/dist/server/middleware.d.ts.map +1 -1
  116. package/dist/server/middleware.js +60 -20
  117. package/dist/server/middleware.js.map +1 -1
  118. package/dist/server/oidc-verify.d.ts +16 -1
  119. package/dist/server/oidc-verify.d.ts.map +1 -1
  120. package/dist/server/oidc-verify.js +9 -1
  121. package/dist/server/oidc-verify.js.map +1 -1
  122. package/dist/server/policy.d.ts.map +1 -1
  123. package/dist/server/policy.js.map +1 -1
  124. package/dist/server/step-up-policy.d.ts.map +1 -1
  125. package/dist/server/step-up-policy.js.map +1 -1
  126. package/dist/server/storage/index.d.ts +3 -0
  127. package/dist/server/storage/index.d.ts.map +1 -0
  128. package/dist/server/storage/index.js +2 -0
  129. package/dist/server/storage/index.js.map +1 -0
  130. package/dist/server/storage/interface.d.ts +73 -0
  131. package/dist/server/storage/interface.d.ts.map +1 -0
  132. package/dist/server/storage/interface.js +2 -0
  133. package/dist/server/storage/interface.js.map +1 -0
  134. package/dist/server/storage/memory.d.ts +50 -0
  135. package/dist/server/storage/memory.d.ts.map +1 -0
  136. package/dist/server/storage/memory.js +121 -0
  137. package/dist/server/storage/memory.js.map +1 -0
  138. package/dist/server/webauthn-verify.d.ts.map +1 -1
  139. package/dist/server/webauthn-verify.js.map +1 -1
  140. package/dist/server/webhooks.d.ts.map +1 -1
  141. package/dist/server/webhooks.js.map +1 -1
  142. package/dist/shared/action-hash.d.ts.map +1 -1
  143. package/dist/shared/action-hash.js.map +1 -1
  144. package/dist/shared/identity.d.ts +45 -0
  145. package/dist/shared/identity.d.ts.map +1 -0
  146. package/dist/shared/identity.js +176 -0
  147. package/dist/shared/identity.js.map +1 -0
  148. package/dist/shared/types-internal.d.ts.map +1 -1
  149. package/dist/shared/types-internal.js.map +1 -1
  150. package/dist/shared/types.d.ts +47 -2
  151. package/dist/shared/types.d.ts.map +1 -1
  152. package/dist/shared/types.js +1 -0
  153. package/dist/shared/types.js.map +1 -1
  154. package/package.json +9 -47
  155. package/dist/server/trust-score-fixtures.d.ts +0 -9
  156. package/dist/server/trust-score-fixtures.d.ts.map +0 -1
  157. package/dist/server/trust-score-fixtures.js +0 -23
  158. package/dist/server/trust-score-fixtures.js.map +0 -1
  159. package/dist/server/webauthn-verify.test-helpers.d.ts +0 -8
  160. package/dist/server/webauthn-verify.test-helpers.d.ts.map +0 -1
  161. package/dist/server/webauthn-verify.test-helpers.js +0 -39
  162. package/dist/server/webauthn-verify.test-helpers.js.map +0 -1
package/README.md CHANGED
@@ -3,6 +3,119 @@
3
3
  [![npm](https://img.shields.io/npm/v/@opensyber/tokenforge.svg)](https://www.npmjs.com/package/@opensyber/tokenforge)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE.md)
5
5
 
6
+ ## TokenForge Cloud v2 integration kit
7
+
8
+ The `1.1.0` Cloud path keeps the TokenForge bearer credential on the
9
+ application server. The browser creates a non-extractable P-256 key, binds only
10
+ through an authenticated application endpoint, and signs the exact v2 request
11
+ contract.
12
+
13
+ ```ts
14
+ import { TokenForgeDevice } from '@opensyber/tokenforge/client';
15
+
16
+ const device = await TokenForgeDevice.open({
17
+ bindEndpoint: '/api/v1/auth/device/bind',
18
+ fetch: authenticatedFetch,
19
+ });
20
+ await device.bindAuthenticatedSession();
21
+ export const secureFetch = device.wrapFetch(authenticatedFetch);
22
+ ```
23
+
24
+ The server adapter is responsible for session resolution, the server-only
25
+ credential, local/cloud decision composition, circuit breaking, and telemetry.
26
+ Set `TOKENFORGE_CLOUD_MODE` to `off`, `monitor`, or `enforce`; default/unknown
27
+ values are `off`. In `monitor`, a locally valid request stays available while
28
+ cloud failures and would-block outcomes are reported. In `enforce`, definitive
29
+ cloud rejection or cloud unavailability rejects the request.
30
+
31
+ See `@opensyber/tokenforge-protocol@2.0.0-rc.1` for the normative binary
32
+ contract, schemas, migration guide, and cross-language vectors.
33
+
34
+ ### Cloud v2 server boundary
35
+
36
+ Cloud v2 intentionally separates application authentication from TokenForge
37
+ device proof. The application owns the authenticated bind route and resolves
38
+ the current session on the server. Only that route may add a
39
+ `TokenForgeIdentity` envelope before delegating to the generic bind handler.
40
+ The browser never supplies trusted profile or subject fields.
41
+
42
+ ```ts
43
+ import {
44
+ createTokenForgeCloudBindHandler,
45
+ createTokenForgeCloudMiddleware,
46
+ } from '@opensyber/tokenforge/server';
47
+ import type { TokenForgeIdentity } from '@opensyber/tokenforge/identity';
48
+
49
+ // Configure these once in server-only application code. The generated types
50
+ // describe the required session resolver, replay store, cloud client, mode,
51
+ // telemetry, and circuit-breaker dependencies.
52
+ export const bindDevice = createTokenForgeCloudBindHandler(bindOptions);
53
+ export const protectRequest = createTokenForgeCloudMiddleware(verifyOptions);
54
+
55
+ // Your authenticated route resolves identity from its own session or IdP,
56
+ // then passes the standard Request to bindDevice. Never forward identity data
57
+ // accepted from the browser.
58
+ const identity: TokenForgeIdentity = await resolveIdentityFromSession(request);
59
+ ```
60
+
61
+ Framework adapters expose the same verification contract without duplicating
62
+ cryptography or authorization logic:
63
+
64
+ | Framework | Cloud v2 entry point | Request bridge |
65
+ |---|---|---|
66
+ | Next.js | `withTokenForgeCloudV2` / `tokenForgeCloudV2Check` | Native `Request` |
67
+ | Hono | `tokenForgeCloudV2Middleware` | `context.req.raw` |
68
+ | SvelteKit | `tokenForgeCloudV2Handle` | `event.request` |
69
+ | Astro | `tokenForgeCloudV2Middleware` | `context.request` |
70
+ | Express | `tokenForgeCloudV2Middleware` | Explicit `toRequest` required |
71
+ | Fastify | `tokenForgeCloudV2Plugin` | Explicit `toRequest` required |
72
+
73
+ Express and Fastify require an application-owned `toRequest` converter because
74
+ the SDK must not guess the external origin, proxy trust, or request-body
75
+ semantics. Conversion failure is rejected rather than silently bypassing
76
+ TokenForge.
77
+
78
+ The same named bind adapter is available from every framework entry point:
79
+
80
+ ```ts
81
+ import { createTokenForgeCloudBindHandler } from '@opensyber/tokenforge/server';
82
+ import { tokenForgeCloudV2BindRoute } from '@opensyber/tokenforge/nextjs';
83
+
84
+ const bindDevice = createTokenForgeCloudBindHandler(bindOptions);
85
+ export const POST = tokenForgeCloudV2BindRoute(bindDevice);
86
+ ```
87
+
88
+ For Hono, SvelteKit, and Astro, pass the same generic handler to
89
+ `tokenForgeCloudV2BindRoute`. Express and Fastify take a second argument with
90
+ the same explicit `toRequest` converter used by their verification adapter:
91
+
92
+ ```ts
93
+ app.post(
94
+ '/api/v1/auth/device/bind',
95
+ tokenForgeCloudV2BindRoute(bindDevice, { toRequest }),
96
+ );
97
+ ```
98
+
99
+ Mount this route only after the application's authentication middleware. The
100
+ generic bind handler must resolve the session and identity from trusted
101
+ server-side state; never copy subject or profile fields from the request body.
102
+
103
+ Recommended adoption order:
104
+
105
+ 1. Mount the authenticated bind route and verify identity correlation in
106
+ `off` mode.
107
+ 2. Enable `monitor` and inspect local denials, cloud would-block decisions,
108
+ outages, and replay telemetry without changing application availability.
109
+ 3. Resolve all unexplained monitor findings and switch selected protected paths
110
+ to `enforce`.
111
+ 4. Keep public health, callback, and webhook paths in the exact `skipPaths`
112
+ allowlist; do not use substring matching.
113
+
114
+ The older `tokenForgeMiddleware`, `tokenForgePlugin`, `withTokenForge`, and
115
+ `tokenForgeHandle` examples below use the legacy v1 fail-open cloud behavior.
116
+ They remain exported for staged migration but should not be selected for a new
117
+ Cloud v2 integration.
118
+
6
119
  **Device-bound session security for the post-AiTM era.** W3C [DBSC](https://w3c.github.io/webappsec-dbsc/)–aligned, ECDSA P-256 + WebAuthn, drop-in for Auth0 / Okta / Clerk / Microsoft Entra ID. Every request after login is cryptographically signed with a device key that never leaves the browser. A stolen cookie without the device key is useless.
7
120
 
8
121
  ## Why this matters in 2026
@@ -14,16 +127,22 @@
14
127
 
15
128
  ## Quick Start
16
129
 
17
- ### 1. Add the script tag (zero-code path)
130
+ ### 1. Initialize after authenticated login
131
+
132
+ ```ts
133
+ import { TokenForgeDevice } from '@opensyber/tokenforge/client';
18
134
 
19
- ```html
20
- <script
21
- src="https://tokenforge-api.opensyber.cloud/sdk.js"
22
- data-api-key="tf_your_api_key"
23
- ></script>
135
+ const device = await TokenForgeDevice.open({
136
+ bindEndpoint: '/api/v1/auth/device/bind',
137
+ fetch: authenticatedFetch,
138
+ });
139
+ await device.bindAuthenticatedSession();
140
+ const secureFetch = device.wrapFetch(authenticatedFetch);
24
141
  ```
25
142
 
26
- The script auto-generates ECDSA P-256 device keys (non-extractable, IndexedDB-stored), binds the session, and signs every `fetch()` request with `X-TF-Signature`, `X-TF-Nonce`, `X-TF-Timestamp` headers. On Chrome 146+ Windows it transparently uses the browser's native DBSC; on other browsers it polyfills via Web Crypto.
143
+ The browser receives no TokenForge API key. It generates a non-extractable
144
+ ECDSA P-256 device key, sends only the public JWK through the authenticated
145
+ application bind endpoint, and signs the exact request-bound v2 contract.
27
146
 
28
147
  ### 2. Add server middleware
29
148
 
@@ -32,20 +151,20 @@ npm install @opensyber/tokenforge
32
151
  ```
33
152
 
34
153
  ```ts
35
- // Express
154
+ // Legacy v1 Express migration path
36
155
  import { tokenForgeMiddleware } from '@opensyber/tokenforge/express';
37
156
  app.use(tokenForgeMiddleware({ apiKey: process.env.TOKENFORGE_API_KEY! }));
38
157
  // req.tf.bound, req.tf.trustScore, req.tf.deviceId
39
158
 
40
- // Next.js (App Router)
159
+ // Legacy v1 Next.js migration path
41
160
  import { withTokenForge } from '@opensyber/tokenforge/nextjs';
42
161
  export const GET = withTokenForge(handler, { apiKey: process.env.TOKENFORGE_API_KEY! });
43
162
 
44
- // Fastify
163
+ // Legacy v1 Fastify migration path
45
164
  import { tokenForgePlugin } from '@opensyber/tokenforge/fastify';
46
165
  fastify.register(tokenForgePlugin, { apiKey: process.env.TOKENFORGE_API_KEY! });
47
166
 
48
- // Hono
167
+ // Legacy v1 Hono migration path
49
168
  import { tokenForgeMiddleware } from '@opensyber/tokenforge/hono';
50
169
  app.use('/api/*', tokenForgeMiddleware({ apiKey: env.TOKENFORGE_API_KEY }));
51
170
  ```
@@ -1,3 +1,4 @@
1
+ import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
1
2
  /** TokenForge context attached to context.locals.tf */
2
3
  export interface TfContext {
3
4
  bound: boolean;
@@ -51,5 +52,13 @@ export declare function requireFreshSig(locals: {
51
52
  }, opts?: {
52
53
  minTrustScore?: number;
53
54
  }): Response | null;
55
+ export type TokenForgeAstroCloudV2Options = TokenForgeCloudV2AdapterOptions;
56
+ /** Astro middleware backed by the shared fail-closed Cloud v2 contract. */
57
+ export declare function tokenForgeCloudV2Middleware(options: TokenForgeAstroCloudV2Options): MiddlewareHandler;
58
+ export interface TokenForgeAstroCloudV2RouteContext {
59
+ request: Request;
60
+ }
61
+ /** Adapt the generic Cloud v2 bind handler to an Astro API route. */
62
+ export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler): (context: TokenForgeAstroCloudV2RouteContext) => Promise<Response>;
54
63
  export {};
55
64
  //# sourceMappingURL=astro.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"astro.d.ts","sourceRoot":"","sources":["../../src/adapters/astro.ts"],"names":[],"mappings":"AAEA,uDAAuD;AACvD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wCAAwC;AACxC,MAAM,WAAW,sBAAsB;IACrC,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,sEAAsE;AACtE,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE;QAAE,EAAE,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,KAAK,cAAc,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9C,KAAK,iBAAiB,GAAG,CACvB,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,cAAc,KACjB,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CAoEnB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,SAAS,CAAA;CAAE,EAC1B,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,QAAQ,GAAG,IAAI,CAcjB"}
1
+ {"version":3,"file":"astro.d.ts","sourceRoot":"../src/","sources":["adapters/astro.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACrC,MAAM,sBAAsB,CAAC;AAI9B,uDAAuD;AACvD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wCAAwC;AACxC,MAAM,WAAW,sBAAsB;IACrC,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,sEAAsE;AACtE,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE;QAAE,EAAE,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,KAAK,cAAc,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9C,KAAK,iBAAiB,GAAG,CACvB,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,cAAc,KACjB,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CAoEnB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,SAAS,CAAA;CAAE,EAC1B,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,QAAQ,GAAG,IAAI,CAcjB;AASD,MAAM,MAAM,6BAA6B,GAAG,+BAA+B,CAAC;AAE5E,2EAA2E;AAC3E,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,6BAA6B,GACrC,iBAAiB,CAOnB;AAED,MAAM,WAAW,kCAAkC;IACjD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qEAAqE;AACrE,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,+BAA+B,IAGtC,SAAS,kCAAkC,KAC1C,OAAO,CAAC,QAAQ,CAAC,CACrB"}
@@ -1,3 +1,4 @@
1
+ import { createTokenForgeCloudV2Gate, } from './cloud-v2-bridge.js';
1
2
  const DEFAULT_API_BASE = 'https://tokenforge-api.opensyber.cloud';
2
3
  /**
3
4
  * Astro middleware for TokenForge verification via the cloud API.
@@ -88,4 +89,16 @@ function shouldSkip(path, skipPaths) {
88
89
  return false;
89
90
  return skipPaths.some((p) => p.endsWith('*') ? path.startsWith(p.slice(0, -1)) : path === p);
90
91
  }
92
+ /** Astro middleware backed by the shared fail-closed Cloud v2 contract. */
93
+ export function tokenForgeCloudV2Middleware(options) {
94
+ const gate = createTokenForgeCloudV2Gate(options);
95
+ return async (context, next) => {
96
+ const rejection = await gate(context.request);
97
+ return rejection ?? next();
98
+ };
99
+ }
100
+ /** Adapt the generic Cloud v2 bind handler to an Astro API route. */
101
+ export function tokenForgeCloudV2BindRoute(handler) {
102
+ return async (context) => handler(context.request);
103
+ }
91
104
  //# sourceMappingURL=astro.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"astro.js","sourceRoot":"","sources":["../../src/adapters/astro.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"astro.js","sourceRoot":"../src/","sources":["adapters/astro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type TokenForgeCloudMiddlewareOptions } from '../server/cloud-middleware.js';
2
+ export type TokenForgeCloudV2AdapterOptions = TokenForgeCloudMiddlewareOptions;
3
+ export type TokenForgeCloudV2RequestHandler = (request: Request) => Response | Promise<Response>;
4
+ /** Convert the shared Fetch middleware into a framework-friendly allow/deny gate. */
5
+ export declare function createTokenForgeCloudV2Gate(options: TokenForgeCloudMiddlewareOptions): (request: Request) => Promise<Response | null>;
6
+ /** Preserve structured Cloud v2 denials when adapting Fetch responses. */
7
+ export declare function tokenForgeCloudV2ResponseBody(response: Response): Promise<unknown>;
8
+ //# sourceMappingURL=cloud-v2-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-v2-bridge.d.ts","sourceRoot":"../src/","sources":["adapters/cloud-v2-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,+BAA+B,GAAG,gCAAgC,CAAC;AAC/E,MAAM,MAAM,+BAA+B,GAAG,CAC5C,OAAO,EAAE,OAAO,KACb,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAElC,qFAAqF;AACrF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,gCAAgC,GACxC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQhD;AAED,0EAA0E;AAC1E,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
@@ -0,0 +1,24 @@
1
+ import { createTokenForgeCloudMiddleware, } from '../server/cloud-middleware.js';
2
+ /** Convert the shared Fetch middleware into a framework-friendly allow/deny gate. */
3
+ export function createTokenForgeCloudV2Gate(options) {
4
+ const middleware = createTokenForgeCloudMiddleware(options);
5
+ return async (request) => {
6
+ const allowed = new Response(null, { status: 204 });
7
+ const result = await middleware(() => allowed)(request);
8
+ return result === allowed ? null : result;
9
+ };
10
+ }
11
+ /** Preserve structured Cloud v2 denials when adapting Fetch responses. */
12
+ export async function tokenForgeCloudV2ResponseBody(response) {
13
+ try {
14
+ if (response.headers.get('content-type')?.includes('application/json')) {
15
+ return await response.json();
16
+ }
17
+ const body = await response.text();
18
+ return body || null;
19
+ }
20
+ catch {
21
+ return { error: 'tokenforge_request_rejected' };
22
+ }
23
+ }
24
+ //# sourceMappingURL=cloud-v2-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-v2-bridge.js","sourceRoot":"../src/","sources":["adapters/cloud-v2-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,GAEhC,MAAM,+BAA+B,CAAC;AAOvC,qFAAqF;AACrF,MAAM,UAAU,2BAA2B,CACzC,OAAyC;IAEzC,MAAM,UAAU,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;IAE5D,OAAO,KAAK,EAAE,OAAgB,EAA4B,EAAE;QAC1D,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,QAAkB;IAElB,IAAI,CAAC;QACH,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACvE,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,IAAI,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;IAClD,CAAC;AACH,CAAC"}
@@ -1,5 +1,6 @@
1
+ import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
1
2
  /** Express request (minimal interface). */
2
- interface ExpressRequest {
3
+ export interface ExpressRequest {
3
4
  path: string;
4
5
  method: string;
5
6
  headers: Record<string, string | string[] | undefined>;
@@ -7,7 +8,7 @@ interface ExpressRequest {
7
8
  tf?: TfContext;
8
9
  [key: string]: unknown;
9
10
  }
10
- interface ExpressResponse {
11
+ export interface ExpressResponse {
11
12
  status(code: number): ExpressResponse;
12
13
  json(body: unknown): void;
13
14
  }
@@ -44,6 +45,18 @@ export interface TokenForgeExpressOptions {
44
45
  * - `deviceId: string | null` — device identifier
45
46
  */
46
47
  export declare function tokenForgeMiddleware(options: TokenForgeExpressOptions): (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => Promise<void>;
48
+ export interface TokenForgeExpressCloudV2Options extends TokenForgeCloudV2AdapterOptions {
49
+ /** Convert the framework request without guessing its origin or body semantics. */
50
+ toRequest(request: ExpressRequest): Request;
51
+ }
52
+ /** Express middleware backed by the shared fail-closed Cloud v2 contract. */
53
+ export declare function tokenForgeCloudV2Middleware(options: TokenForgeExpressCloudV2Options): (request: ExpressRequest, response: ExpressResponse & {
54
+ setHeader?: (name: string, value: string) => void;
55
+ }, next: NextFunction) => Promise<void>;
56
+ /** Adapt the generic Cloud v2 bind handler to an authenticated Express route. */
57
+ export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler, options: Pick<TokenForgeExpressCloudV2Options, 'toRequest'>): (request: ExpressRequest, response: ExpressResponse & {
58
+ setHeader?: (name: string, value: string) => void;
59
+ }) => Promise<void>;
47
60
  /**
48
61
  * Per-route step-up gate. Use after `tokenForgeMiddleware` ran globally,
49
62
  * mounted on the routes that need elevated trust.
@@ -1 +1 @@
1
- {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/adapters/express.ts"],"names":[],"mappings":"AAEA,2CAA2C;AAC3C,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,eAAe;IACvB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B;AAED,4CAA4C;AAC5C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAE5C,0CAA0C;AAC1C,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,IAGtD,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAwD5F;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,IAE3D,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,KAAG,IAAI,CAY7E"}
1
+ {"version":3,"file":"express.d.ts","sourceRoot":"../src/","sources":["adapters/express.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACrC,MAAM,sBAAsB,CAAC;AAI9B,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B;AAED,4CAA4C;AAC5C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAE5C,0CAA0C;AAC1C,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,IAGtD,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAwD5F;AAOD,MAAM,WAAW,+BACf,SAAQ,+BAA+B;IACvC,mFAAmF;IACnF,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;CAC7C;AAED,6EAA6E;AAC7E,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,+BAA+B,IAKtC,SAAS,cAAc,EACvB,UAAU,eAAe,GAAG;IAC1B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,EACD,MAAM,YAAY,KACjB,OAAO,CAAC,IAAI,CAAC,CAoBjB;AAED,iFAAiF;AACjF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,+BAA+B,EACxC,OAAO,EAAE,IAAI,CAAC,+BAA+B,EAAE,WAAW,CAAC,IAGzD,SAAS,cAAc,EACvB,UAAU,eAAe,GAAG;IAC1B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,KACA,OAAO,CAAC,IAAI,CAAC,CAejB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,IAE3D,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,KAAG,IAAI,CAY7E"}
@@ -1,3 +1,4 @@
1
+ import { createTokenForgeCloudV2Gate, tokenForgeCloudV2ResponseBody, } from './cloud-v2-bridge.js';
1
2
  const DEFAULT_API_BASE = 'https://tokenforge-api.opensyber.cloud';
2
3
  /**
3
4
  * Express middleware for TokenForge verification via the cloud API.
@@ -70,6 +71,43 @@ function shouldSkip(path, skipPaths) {
70
71
  return false;
71
72
  return skipPaths.some((p) => p.endsWith('*') ? path.startsWith(p.slice(0, -1)) : path === p);
72
73
  }
74
+ /** Express middleware backed by the shared fail-closed Cloud v2 contract. */
75
+ export function tokenForgeCloudV2Middleware(options) {
76
+ const gate = createTokenForgeCloudV2Gate(options);
77
+ return async (request, response, next) => {
78
+ let fetchRequest;
79
+ try {
80
+ fetchRequest = options.toRequest(request);
81
+ }
82
+ catch {
83
+ response.status(500).json({ error: 'tokenforge_adapter_invalid_request' });
84
+ return;
85
+ }
86
+ const rejection = await gate(fetchRequest);
87
+ if (!rejection) {
88
+ next();
89
+ return;
90
+ }
91
+ rejection.headers.forEach((value, name) => response.setHeader?.(name, value));
92
+ response.status(rejection.status).json(await tokenForgeCloudV2ResponseBody(rejection));
93
+ };
94
+ }
95
+ /** Adapt the generic Cloud v2 bind handler to an authenticated Express route. */
96
+ export function tokenForgeCloudV2BindRoute(handler, options) {
97
+ return async (request, response) => {
98
+ let fetchRequest;
99
+ try {
100
+ fetchRequest = options.toRequest(request);
101
+ }
102
+ catch {
103
+ response.status(500).json({ error: 'tokenforge_adapter_invalid_request' });
104
+ return;
105
+ }
106
+ const result = await handler(fetchRequest);
107
+ result.headers.forEach((value, name) => response.setHeader?.(name, value));
108
+ response.status(result.status).json(await tokenForgeCloudV2ResponseBody(result));
109
+ };
110
+ }
73
111
  /**
74
112
  * Per-route step-up gate. Use after `tokenForgeMiddleware` ran globally,
75
113
  * mounted on the routes that need elevated trust.
@@ -1 +1 @@
1
- {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/adapters/express.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express.js","sourceRoot":"../src/","sources":["adapters/express.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
1
2
  /** TokenForge context attached to request.tf */
2
3
  export interface TfContext {
3
4
  bound: boolean;
@@ -13,19 +14,20 @@ export interface TokenForgeFastifyOptions {
13
14
  /** Paths to skip verification. */
14
15
  skipPaths?: string[];
15
16
  }
16
- interface FastifyRequest {
17
+ export interface FastifyRequest {
17
18
  url: string;
18
19
  method: string;
19
20
  headers: Record<string, string | string[] | undefined>;
20
21
  ip?: string;
21
22
  tf?: TfContext;
22
23
  }
23
- interface FastifyReply {
24
+ export interface FastifyReply {
24
25
  code(statusCode: number): FastifyReply;
25
- send(payload: unknown): void;
26
+ header?(name: string, value: string): FastifyReply;
27
+ send(payload: unknown): FastifyReply;
26
28
  }
27
- interface FastifyInstance {
28
- addHook(name: 'preHandler', handler: (req: FastifyRequest, reply: FastifyReply) => Promise<void>): void;
29
+ export interface FastifyInstance {
30
+ addHook(name: 'preHandler', handler: (req: FastifyRequest, reply: FastifyReply) => Promise<void | FastifyReply>): void;
29
31
  decorateRequest(name: string, value: unknown): void;
30
32
  }
31
33
  /**
@@ -40,6 +42,14 @@ interface FastifyInstance {
40
42
  * ```
41
43
  */
42
44
  export declare function tokenForgePlugin(fastify: FastifyInstance, options: TokenForgeFastifyOptions, done: (err?: Error) => void): void;
45
+ export interface TokenForgeFastifyCloudV2Options extends TokenForgeCloudV2AdapterOptions {
46
+ /** Convert the framework request without guessing its origin or body semantics. */
47
+ toRequest(request: FastifyRequest): Request;
48
+ }
49
+ /** Register fail-closed Cloud v2 verification as a Fastify pre-handler. */
50
+ export declare function tokenForgeCloudV2Plugin(fastify: FastifyInstance, options: TokenForgeFastifyCloudV2Options): Promise<void>;
51
+ /** Adapt the generic Cloud v2 bind handler to an authenticated Fastify route. */
52
+ export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler, options: Pick<TokenForgeFastifyCloudV2Options, 'toRequest'>): (request: FastifyRequest, reply: FastifyReply) => Promise<FastifyReply>;
43
53
  /**
44
54
  * Per-route step-up gate. Register after `tokenForgePlugin` ran globally,
45
55
  * scoped to a route that needs elevated trust.
@@ -57,5 +67,4 @@ export declare function tokenForgePlugin(fastify: FastifyInstance, options: Toke
57
67
  export declare function requireFreshSig(opts?: {
58
68
  minTrustScore?: number;
59
69
  }): (req: FastifyRequest, reply: FastifyReply) => Promise<void>;
60
- export {};
61
70
  //# sourceMappingURL=fastify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../../src/adapters/fastify.ts"],"names":[],"mappings":"AAEA,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B;AAED,UAAU,eAAe;IACvB,OAAO,CACL,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GACnE,IAAI,CAAC;IACR,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAC1B,IAAI,CA6DN;AAOD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,IAErD,KAAK,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAUvE"}
1
+ {"version":3,"file":"fastify.d.ts","sourceRoot":"../src/","sources":["adapters/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACrC,MAAM,sBAAsB,CAAC;AAI9B,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC;IACvC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CACL,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,CACP,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,YAAY,KAChB,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC,GAChC,IAAI,CAAC;IACR,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAC1B,IAAI,CA6DN;AAOD,MAAM,WAAW,+BACf,SAAQ,+BAA+B;IACvC,mFAAmF;IACnF,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;CAC7C;AAED,2EAA2E;AAC3E,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,iFAAiF;AACjF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,+BAA+B,EACxC,OAAO,EAAE,IAAI,CAAC,+BAA+B,EAAE,WAAW,CAAC,IAGzD,SAAS,cAAc,EACvB,OAAO,YAAY,KAClB,OAAO,CAAC,YAAY,CAAC,CAgBzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,IAErD,KAAK,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAUvE"}
@@ -1,3 +1,4 @@
1
+ import { createTokenForgeCloudV2Gate, tokenForgeCloudV2ResponseBody, } from './cloud-v2-bridge.js';
1
2
  const DEFAULT_API_BASE = 'https://tokenforge-api.opensyber.cloud';
2
3
  /**
3
4
  * Fastify plugin for TokenForge verification via the cloud API.
@@ -66,6 +67,43 @@ function shouldSkip(path, skipPaths) {
66
67
  return false;
67
68
  return skipPaths.some((p) => p.endsWith('*') ? path.startsWith(p.slice(0, -1)) : path === p);
68
69
  }
70
+ /** Register fail-closed Cloud v2 verification as a Fastify pre-handler. */
71
+ export async function tokenForgeCloudV2Plugin(fastify, options) {
72
+ const gate = createTokenForgeCloudV2Gate(options);
73
+ fastify.addHook('preHandler', async (request, reply) => {
74
+ let fetchRequest;
75
+ try {
76
+ fetchRequest = options.toRequest(request);
77
+ }
78
+ catch {
79
+ return reply.code(500).send({
80
+ error: 'tokenforge_adapter_invalid_request',
81
+ });
82
+ }
83
+ const rejection = await gate(fetchRequest);
84
+ if (!rejection)
85
+ return;
86
+ rejection.headers.forEach((value, name) => reply.header?.(name, value));
87
+ return reply.code(rejection.status).send(await tokenForgeCloudV2ResponseBody(rejection));
88
+ });
89
+ }
90
+ /** Adapt the generic Cloud v2 bind handler to an authenticated Fastify route. */
91
+ export function tokenForgeCloudV2BindRoute(handler, options) {
92
+ return async (request, reply) => {
93
+ let fetchRequest;
94
+ try {
95
+ fetchRequest = options.toRequest(request);
96
+ }
97
+ catch {
98
+ return reply.code(500).send({
99
+ error: 'tokenforge_adapter_invalid_request',
100
+ });
101
+ }
102
+ const result = await handler(fetchRequest);
103
+ result.headers.forEach((value, name) => reply.header?.(name, value));
104
+ return reply.code(result.status).send(await tokenForgeCloudV2ResponseBody(result));
105
+ };
106
+ }
69
107
  /**
70
108
  * Per-route step-up gate. Register after `tokenForgePlugin` ran globally,
71
109
  * scoped to a route that needs elevated trust.
@@ -1 +1 @@
1
- {"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../src/adapters/fastify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fastify.js","sourceRoot":"../src/","sources":["adapters/fastify.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,18 @@
7
7
  * published tarball. Self-hosting customers should use the source repo
8
8
  * directly instead of the npm package.
9
9
  */
10
+ import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
10
11
  export { tokenForgeMiddleware, requireFreshSig } from '../server/middleware.js';
11
12
  export type { TokenForgeOptions } from '../server/middleware.js';
13
+ export interface HonoCloudV2Context {
14
+ req: {
15
+ raw: Request;
16
+ };
17
+ }
18
+ type HonoCloudV2Next = () => Promise<void | Response>;
19
+ export type TokenForgeHonoCloudV2Options = TokenForgeCloudV2AdapterOptions;
20
+ /** Hono middleware backed by the shared fail-closed Cloud v2 contract. */
21
+ export declare function tokenForgeCloudV2Middleware(options: TokenForgeHonoCloudV2Options): (context: HonoCloudV2Context, next: HonoCloudV2Next) => Promise<void | Response>;
22
+ /** Adapt the generic Cloud v2 bind handler to an authenticated Hono route. */
23
+ export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler): (context: HonoCloudV2Context) => Response | Promise<Response>;
12
24
  //# sourceMappingURL=hono.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/adapters/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAChF,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"hono.d.ts","sourceRoot":"../src/","sources":["adapters/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACrC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAChF,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE;QAAE,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;CACvB;AAED,KAAK,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AAEtD,MAAM,MAAM,4BAA4B,GAAG,+BAA+B,CAAC;AAE3E,0EAA0E;AAC1E,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,IAKnC,SAAS,kBAAkB,EAC3B,MAAM,eAAe,KACpB,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAI5B;AAED,8EAA8E;AAC9E,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,+BAA+B,IAEhC,SAAS,kBAAkB,KAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAEnE"}
@@ -7,5 +7,18 @@
7
7
  * published tarball. Self-hosting customers should use the source repo
8
8
  * directly instead of the npm package.
9
9
  */
10
+ import { createTokenForgeCloudV2Gate, } from './cloud-v2-bridge.js';
10
11
  export { tokenForgeMiddleware, requireFreshSig } from '../server/middleware.js';
12
+ /** Hono middleware backed by the shared fail-closed Cloud v2 contract. */
13
+ export function tokenForgeCloudV2Middleware(options) {
14
+ const gate = createTokenForgeCloudV2Gate(options);
15
+ return async (context, next) => {
16
+ const rejection = await gate(context.req.raw);
17
+ return rejection ?? next();
18
+ };
19
+ }
20
+ /** Adapt the generic Cloud v2 bind handler to an authenticated Hono route. */
21
+ export function tokenForgeCloudV2BindRoute(handler) {
22
+ return (context) => handler(context.req.raw);
23
+ }
11
24
  //# sourceMappingURL=hono.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/adapters/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"hono.js","sourceRoot":"../src/","sources":["adapters/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,2BAA2B,GAG5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAWhF,0EAA0E;AAC1E,MAAM,UAAU,2BAA2B,CACzC,OAAqC;IAErC,MAAM,IAAI,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAElD,OAAO,KAAK,EACV,OAA2B,EAC3B,IAAqB,EACK,EAAE;QAC5B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,SAAS,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,0BAA0B,CACxC,OAAwC;IAExC,OAAO,CAAC,OAA2B,EAAgC,EAAE,CACnE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3G,OAAO,EAAE,oBAAoB,IAAI,iBAAiB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,IAAI,eAAe,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"../src/","sources":["adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3G,OAAO,EAAE,oBAAoB,IAAI,iBAAiB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,IAAI,eAAe,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3G,OAAO,EAAE,oBAAoB,IAAI,iBAAiB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,IAAI,eAAe,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"../src/","sources":["adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3G,OAAO,EAAE,oBAAoB,IAAI,iBAAiB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,IAAI,eAAe,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
1
2
  type NextRequest = Request & {
2
3
  nextUrl?: {
3
4
  pathname: string;
@@ -63,5 +64,19 @@ export declare function tokenForgeCheck(req: NextRequest, options: TokenForgeNex
63
64
  export declare function withFreshSig(handler: (req: NextRequest, tf: TfContext) => Promise<Response>, opts?: {
64
65
  minTrustScore?: number;
65
66
  }): (req: NextRequest, tf: TfContext) => Promise<Response>;
67
+ /**
68
+ * Cross-adapter alias for {@link withFreshSig}. The 5 non-Next.js adapters
69
+ * (astro / express / fastify / hono / sveltekit) all export `requireFreshSig`;
70
+ * exposing the same name here keeps the per-adapter docs uniform so the
71
+ * Sprint 39 step-up snippet doesn't fork by framework.
72
+ */
73
+ export declare const requireFreshSig: typeof withFreshSig;
74
+ export type TokenForgeNextCloudV2Options = TokenForgeCloudV2AdapterOptions;
75
+ /** Wrap a Next.js route handler with the Cloud v2 local and remote gates. */
76
+ export declare function withTokenForgeCloudV2<TRequest extends Request = NextRequest>(handler: (request: TRequest) => Response | Promise<Response>, options: TokenForgeNextCloudV2Options): (request: TRequest) => Promise<Response>;
77
+ /** Run only the Cloud v2 authorization decision for middleware composition. */
78
+ export declare function tokenForgeCloudV2Check(options: TokenForgeNextCloudV2Options): (request: Request) => Promise<Response | null>;
79
+ /** Expose the generic Cloud v2 bind handler as a Next.js route handler. */
80
+ export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler): TokenForgeCloudV2RequestHandler;
66
81
  export {};
67
82
  //# sourceMappingURL=nextjs.d.ts.map