@adcp/sdk 15.9.0 → 16.0.0-beta.1

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 (295) hide show
  1. package/bin/adcp-identity.js +74 -0
  2. package/bin/adcp.js +2 -0
  3. package/dist/lib/adapters/keyed-account-backend.d.mts +37 -0
  4. package/dist/lib/adapters/keyed-account-backend.d.ts +37 -0
  5. package/dist/lib/adapters/keyed-account-backend.js +121 -0
  6. package/dist/lib/adapters/keyed-account-backend.mjs +94 -0
  7. package/dist/lib/adapters/keyed-account-store.d.mts +28 -0
  8. package/dist/lib/adapters/keyed-account-store.d.ts +28 -0
  9. package/dist/lib/adapters/keyed-account-store.js +227 -0
  10. package/dist/lib/adapters/keyed-account-store.mjs +203 -0
  11. package/dist/lib/core/SingleAgentClient.d.mts +16 -2
  12. package/dist/lib/core/SingleAgentClient.d.ts +16 -2
  13. package/dist/lib/core/SingleAgentClient.js +259 -62
  14. package/dist/lib/core/SingleAgentClient.mjs +261 -57
  15. package/dist/lib/core/TaskExecutor.d.mts +6 -0
  16. package/dist/lib/core/TaskExecutor.d.ts +6 -0
  17. package/dist/lib/core/TaskExecutor.js +66 -5
  18. package/dist/lib/core/TaskExecutor.mjs +71 -5
  19. package/dist/lib/core/postgres-webhook-registration-store.js +32 -5
  20. package/dist/lib/core/postgres-webhook-registration-store.mjs +32 -5
  21. package/dist/lib/core/redis-webhook-registration-store.js +23 -1
  22. package/dist/lib/core/redis-webhook-registration-store.mjs +23 -1
  23. package/dist/lib/core/webhook-registration.d.mts +7 -1
  24. package/dist/lib/core/webhook-registration.d.ts +7 -1
  25. package/dist/lib/core/webhook-registration.js +24 -2
  26. package/dist/lib/core/webhook-registration.mjs +23 -2
  27. package/dist/lib/identity-3.3/index.d.mts +10 -0
  28. package/dist/lib/identity-3.3/index.d.ts +10 -0
  29. package/dist/lib/identity-3.3/index.js +75 -0
  30. package/dist/lib/identity-3.3/index.mjs +46 -0
  31. package/dist/lib/identity-3.3/lifecycle.d.mts +113 -0
  32. package/dist/lib/identity-3.3/lifecycle.d.ts +113 -0
  33. package/dist/lib/identity-3.3/lifecycle.js +267 -0
  34. package/dist/lib/identity-3.3/lifecycle.mjs +240 -0
  35. package/dist/lib/identity-3.3/revocation.d.mts +50 -0
  36. package/dist/lib/identity-3.3/revocation.d.ts +50 -0
  37. package/dist/lib/identity-3.3/revocation.js +238 -0
  38. package/dist/lib/identity-3.3/revocation.mjs +216 -0
  39. package/dist/lib/identity-3.3/schemas.draft.d.mts +2472 -0
  40. package/dist/lib/identity-3.3/schemas.draft.d.ts +2472 -0
  41. package/dist/lib/identity-3.3/schemas.draft.js +1448 -0
  42. package/dist/lib/identity-3.3/schemas.draft.mjs +1428 -0
  43. package/dist/lib/identity-3.3/server.d.mts +34 -0
  44. package/dist/lib/identity-3.3/server.d.ts +34 -0
  45. package/dist/lib/identity-3.3/server.js +219 -0
  46. package/dist/lib/identity-3.3/server.mjs +194 -0
  47. package/dist/lib/identity-3.3/store.d.mts +24 -0
  48. package/dist/lib/identity-3.3/store.d.ts +24 -0
  49. package/dist/lib/identity-3.3/store.js +191 -0
  50. package/dist/lib/identity-3.3/store.mjs +169 -0
  51. package/dist/lib/identity-3.3/trust.d.mts +94 -0
  52. package/dist/lib/identity-3.3/trust.d.ts +94 -0
  53. package/dist/lib/identity-3.3/trust.js +278 -0
  54. package/dist/lib/identity-3.3/trust.mjs +239 -0
  55. package/dist/lib/identity-3.3/types.d.mts +127 -0
  56. package/dist/lib/identity-3.3/types.d.ts +127 -0
  57. package/dist/lib/identity-3.3/types.js +16 -0
  58. package/dist/lib/identity-3.3/types.mjs +0 -0
  59. package/dist/lib/identity-3.3/validation.d.mts +2 -0
  60. package/dist/lib/identity-3.3/validation.d.ts +2 -0
  61. package/dist/lib/identity-3.3/validation.js +125 -0
  62. package/dist/lib/identity-3.3/validation.mjs +91 -0
  63. package/dist/lib/index.d.mts +1 -1
  64. package/dist/lib/index.d.ts +1 -1
  65. package/dist/lib/reporting/azure/index.d.mts +5 -0
  66. package/dist/lib/reporting/azure/index.d.ts +5 -0
  67. package/dist/lib/reporting/azure/index.js +26 -7
  68. package/dist/lib/reporting/azure/index.mjs +26 -7
  69. package/dist/lib/reporting/bigquery/index.d.mts +80 -25
  70. package/dist/lib/reporting/bigquery/index.d.ts +80 -25
  71. package/dist/lib/reporting/bigquery/index.js +184 -81
  72. package/dist/lib/reporting/bigquery/index.mjs +182 -80
  73. package/dist/lib/reporting/gcs/adapter.d.mts +8 -1
  74. package/dist/lib/reporting/gcs/adapter.d.ts +8 -1
  75. package/dist/lib/reporting/gcs/errors.d.mts +6 -0
  76. package/dist/lib/reporting/gcs/errors.d.ts +6 -0
  77. package/dist/lib/reporting/gcs/fence.d.mts +5 -0
  78. package/dist/lib/reporting/gcs/fence.d.ts +5 -0
  79. package/dist/lib/reporting/gcs/index.d.mts +9 -0
  80. package/dist/lib/reporting/gcs/index.d.ts +9 -0
  81. package/dist/lib/reporting/gcs/reader.d.mts +27 -3
  82. package/dist/lib/reporting/gcs/reader.d.ts +27 -3
  83. package/dist/lib/reporting/gcs/row-provider.d.mts +7 -0
  84. package/dist/lib/reporting/gcs/row-provider.d.ts +7 -0
  85. package/dist/lib/reporting/gcs/row-provider.js +34 -14
  86. package/dist/lib/reporting/gcs/row-provider.mjs +34 -14
  87. package/dist/lib/reporting/ledger/change-feed.d.mts +22 -1
  88. package/dist/lib/reporting/ledger/change-feed.d.ts +22 -1
  89. package/dist/lib/reporting/ledger/index.d.mts +11 -0
  90. package/dist/lib/reporting/ledger/index.d.ts +11 -0
  91. package/dist/lib/reporting/ledger/managed-postgres.d.mts +8 -0
  92. package/dist/lib/reporting/ledger/managed-postgres.d.ts +8 -0
  93. package/dist/lib/reporting/ledger/managed-router.d.mts +27 -2
  94. package/dist/lib/reporting/ledger/managed-router.d.ts +27 -2
  95. package/dist/lib/reporting/ledger/managed.d.mts +86 -6
  96. package/dist/lib/reporting/ledger/managed.d.ts +86 -6
  97. package/dist/lib/reporting/ledger/notification-activity.d.mts +65 -3
  98. package/dist/lib/reporting/ledger/notification-activity.d.ts +65 -3
  99. package/dist/lib/reporting/ledger/object-writes.d.mts +64 -5
  100. package/dist/lib/reporting/ledger/object-writes.d.ts +64 -5
  101. package/dist/lib/reporting/ledger/postgres.d.mts +43 -9
  102. package/dist/lib/reporting/ledger/postgres.d.ts +43 -9
  103. package/dist/lib/reporting/ledger/postgres.js +43 -27
  104. package/dist/lib/reporting/ledger/postgres.mjs +43 -27
  105. package/dist/lib/reporting/ledger/row-encoding.d.mts +92 -6
  106. package/dist/lib/reporting/ledger/row-encoding.d.ts +92 -6
  107. package/dist/lib/reporting/ledger/row-encoding.js +8 -4
  108. package/dist/lib/reporting/ledger/row-encoding.mjs +6 -3
  109. package/dist/lib/reporting/ledger/row-storage-errors.d.mts +11 -1
  110. package/dist/lib/reporting/ledger/row-storage-errors.d.ts +11 -1
  111. package/dist/lib/reporting/ledger/row-storage-migration.d.mts +19 -1
  112. package/dist/lib/reporting/ledger/row-storage-migration.d.ts +19 -1
  113. package/dist/lib/reporting/ledger/row-storage-migration.js +133 -18
  114. package/dist/lib/reporting/ledger/row-storage-migration.mjs +133 -18
  115. package/dist/lib/reporting/ledger/row-storage-object.d.mts +103 -12
  116. package/dist/lib/reporting/ledger/row-storage-object.d.ts +103 -12
  117. package/dist/lib/reporting/ledger/row-storage-object.js +106 -31
  118. package/dist/lib/reporting/ledger/row-storage-object.mjs +104 -31
  119. package/dist/lib/reporting/ledger/row-storage.d.mts +87 -20
  120. package/dist/lib/reporting/ledger/row-storage.d.ts +87 -20
  121. package/dist/lib/reporting/ledger/row-storage.js +126 -66
  122. package/dist/lib/reporting/ledger/row-storage.mjs +129 -67
  123. package/dist/lib/reporting/ledger/schedule.d.mts +13 -0
  124. package/dist/lib/reporting/ledger/schedule.d.ts +13 -0
  125. package/dist/lib/reporting/ledger/schedule.js +24 -0
  126. package/dist/lib/reporting/ledger/schedule.mjs +23 -0
  127. package/dist/lib/reporting/ledger/types.d.mts +23 -1
  128. package/dist/lib/reporting/ledger/types.d.ts +23 -1
  129. package/dist/lib/reporting/s3/index.d.mts +5 -0
  130. package/dist/lib/reporting/s3/index.d.ts +5 -0
  131. package/dist/lib/reporting/s3/index.js +37 -14
  132. package/dist/lib/reporting/s3/index.mjs +37 -14
  133. package/dist/lib/reporting/service/index.d.mts +10 -0
  134. package/dist/lib/reporting/service/index.d.ts +10 -0
  135. package/dist/lib/reporting/service/maintenance.d.mts +28 -2
  136. package/dist/lib/reporting/service/maintenance.d.ts +28 -2
  137. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  138. package/dist/lib/server/account-sync-contract.d.mts +14 -0
  139. package/dist/lib/server/account-sync-contract.d.ts +14 -0
  140. package/dist/lib/server/account-sync-contract.js +225 -0
  141. package/dist/lib/server/account-sync-contract.mjs +197 -0
  142. package/dist/lib/server/adcp-server.js +5 -0
  143. package/dist/lib/server/adcp-server.mjs +10 -0
  144. package/dist/lib/server/auth-signature.d.mts +10 -0
  145. package/dist/lib/server/auth-signature.d.ts +10 -0
  146. package/dist/lib/server/auth-signature.js +61 -2
  147. package/dist/lib/server/auth-signature.mjs +65 -2
  148. package/dist/lib/server/auth.d.mts +6 -0
  149. package/dist/lib/server/auth.d.ts +6 -0
  150. package/dist/lib/server/auth.js +6 -0
  151. package/dist/lib/server/auth.mjs +6 -0
  152. package/dist/lib/server/create-adcp-server.d.mts +19 -5
  153. package/dist/lib/server/create-adcp-server.d.ts +19 -5
  154. package/dist/lib/server/create-adcp-server.js +238 -19
  155. package/dist/lib/server/create-adcp-server.mjs +240 -10
  156. package/dist/lib/server/decisioning/account.d.mts +24 -1
  157. package/dist/lib/server/decisioning/account.d.ts +24 -1
  158. package/dist/lib/server/decisioning/index.d.mts +1 -1
  159. package/dist/lib/server/decisioning/index.d.ts +1 -1
  160. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +0 -50
  161. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +0 -50
  162. package/dist/lib/server/decisioning/runtime/from-platform.js +61 -11
  163. package/dist/lib/server/decisioning/runtime/from-platform.mjs +65 -12
  164. package/dist/lib/server/index.d.mts +2 -0
  165. package/dist/lib/server/index.d.ts +2 -0
  166. package/dist/lib/server/index.js +12 -0
  167. package/dist/lib/server/index.mjs +12 -0
  168. package/dist/lib/server/notification-subscriptions/runtime.js +9 -1
  169. package/dist/lib/server/notification-subscriptions/runtime.mjs +9 -1
  170. package/dist/lib/server/notification-subscriptions/types.d.mts +5 -0
  171. package/dist/lib/server/notification-subscriptions/types.d.ts +5 -0
  172. package/dist/lib/server/principal/types.d.mts +1 -1
  173. package/dist/lib/server/principal/types.d.ts +1 -1
  174. package/dist/lib/server/serve.js +5 -0
  175. package/dist/lib/server/serve.mjs +5 -0
  176. package/dist/lib/server/webhook-delivery/recovery.d.mts +1 -0
  177. package/dist/lib/server/webhook-delivery/recovery.d.ts +1 -0
  178. package/dist/lib/server/webhook-delivery/recovery.js +4 -0
  179. package/dist/lib/server/webhook-delivery/recovery.mjs +4 -0
  180. package/dist/lib/server/webhook-emitter.d.mts +10 -0
  181. package/dist/lib/server/webhook-emitter.d.ts +10 -0
  182. package/dist/lib/server/webhook-emitter.js +22 -0
  183. package/dist/lib/server/webhook-emitter.mjs +22 -0
  184. package/dist/lib/signing/agent-context.d.mts +0 -5
  185. package/dist/lib/signing/agent-context.d.ts +0 -5
  186. package/dist/lib/signing/agent-context.js +9 -1
  187. package/dist/lib/signing/agent-context.mjs +9 -1
  188. package/dist/lib/signing/agent-fetch.js +27 -2
  189. package/dist/lib/signing/agent-fetch.mjs +32 -2
  190. package/dist/lib/signing/agent-resolver/canonicalize.d.mts +10 -15
  191. package/dist/lib/signing/agent-resolver/canonicalize.d.ts +10 -15
  192. package/dist/lib/signing/agent-resolver/canonicalize.js +17 -5
  193. package/dist/lib/signing/agent-resolver/canonicalize.mjs +16 -5
  194. package/dist/lib/signing/agent-resolver/index.d.mts +1 -0
  195. package/dist/lib/signing/agent-resolver/index.d.ts +1 -0
  196. package/dist/lib/signing/agent-resolver/index.js +5 -0
  197. package/dist/lib/signing/agent-resolver/index.mjs +3 -0
  198. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.mts +3 -2
  199. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.ts +3 -2
  200. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.js +30 -3
  201. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.mjs +30 -3
  202. package/dist/lib/signing/agent-resolver/strict-json.d.mts +2 -2
  203. package/dist/lib/signing/agent-resolver/strict-json.d.ts +2 -2
  204. package/dist/lib/signing/agent-resolver/strict-json.js +5 -3
  205. package/dist/lib/signing/agent-resolver/strict-json.mjs +5 -3
  206. package/dist/lib/signing/brand-jwks.d.mts +2 -2
  207. package/dist/lib/signing/brand-jwks.d.ts +2 -2
  208. package/dist/lib/signing/brand-jwks.js +4 -4
  209. package/dist/lib/signing/brand-jwks.mjs +4 -4
  210. package/dist/lib/signing/client.d.mts +1 -0
  211. package/dist/lib/signing/client.d.ts +1 -0
  212. package/dist/lib/signing/client.js +5 -0
  213. package/dist/lib/signing/client.mjs +3 -0
  214. package/dist/lib/signing/jwks-https.d.mts +1 -1
  215. package/dist/lib/signing/jwks-https.d.ts +1 -1
  216. package/dist/lib/signing/jwks-https.js +1 -1
  217. package/dist/lib/signing/jwks-https.mjs +1 -1
  218. package/dist/lib/signing/jwks.d.mts +11 -3
  219. package/dist/lib/signing/jwks.d.ts +11 -3
  220. package/dist/lib/signing/jwks.js +1 -1
  221. package/dist/lib/signing/jwks.mjs +1 -1
  222. package/dist/lib/signing/parser.d.mts +1 -1
  223. package/dist/lib/signing/parser.d.ts +1 -1
  224. package/dist/lib/signing/parser.js +5 -3
  225. package/dist/lib/signing/parser.mjs +6 -4
  226. package/dist/lib/signing/revocation.d.mts +4 -1
  227. package/dist/lib/signing/revocation.d.ts +4 -1
  228. package/dist/lib/signing/revocation.js +33 -3
  229. package/dist/lib/signing/revocation.mjs +31 -2
  230. package/dist/lib/signing/server.d.mts +1 -1
  231. package/dist/lib/signing/server.d.ts +1 -1
  232. package/dist/lib/signing/server.js +4 -0
  233. package/dist/lib/signing/server.mjs +4 -0
  234. package/dist/lib/signing/types.d.mts +3 -0
  235. package/dist/lib/signing/types.d.ts +3 -0
  236. package/dist/lib/signing/web-bot-auth.d.mts +117 -0
  237. package/dist/lib/signing/web-bot-auth.d.ts +117 -0
  238. package/dist/lib/signing/web-bot-auth.js +660 -0
  239. package/dist/lib/signing/web-bot-auth.mjs +624 -0
  240. package/dist/lib/testing/client.d.mts +1 -4
  241. package/dist/lib/testing/client.d.ts +1 -4
  242. package/dist/lib/testing/client.js +141 -20
  243. package/dist/lib/testing/client.mjs +137 -19
  244. package/dist/lib/testing/compliance/comply.js +29 -10
  245. package/dist/lib/testing/compliance/comply.mjs +37 -11
  246. package/dist/lib/testing/storyboard/account-sync-contract.d.mts +3 -0
  247. package/dist/lib/testing/storyboard/account-sync-contract.d.ts +3 -0
  248. package/dist/lib/testing/storyboard/account-sync-contract.js +79 -0
  249. package/dist/lib/testing/storyboard/account-sync-contract.mjs +55 -0
  250. package/dist/lib/testing/storyboard/default-invariants.js +2 -0
  251. package/dist/lib/testing/storyboard/default-invariants.mjs +2 -0
  252. package/dist/lib/testing/storyboard/runner.js +23 -8
  253. package/dist/lib/testing/storyboard/runner.mjs +24 -8
  254. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  255. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  256. package/dist/lib/types/adcp.d.mts +4 -0
  257. package/dist/lib/types/adcp.d.ts +4 -0
  258. package/dist/lib/types/schemas.generated.d.ts +6 -6
  259. package/dist/lib/utils/capabilities.d.mts +1 -0
  260. package/dist/lib/utils/capabilities.d.ts +1 -0
  261. package/dist/lib/utils/capabilities.js +5 -0
  262. package/dist/lib/utils/capabilities.mjs +5 -0
  263. package/dist/lib/v2/projection/creative-delivery.d.mts +3 -1
  264. package/dist/lib/v2/projection/creative-delivery.d.ts +3 -1
  265. package/dist/lib/v2/projection/creative-delivery.js +26 -10
  266. package/dist/lib/v2/projection/creative-delivery.mjs +26 -10
  267. package/dist/lib/v2/projection/index.d.mts +1 -1
  268. package/dist/lib/v2/projection/index.d.ts +1 -1
  269. package/dist/lib/v2/projection/legacy-routes.d.mts +24 -2
  270. package/dist/lib/v2/projection/legacy-routes.d.ts +24 -2
  271. package/dist/lib/v2/projection/legacy-routes.js +28 -2
  272. package/dist/lib/v2/projection/legacy-routes.mjs +26 -2
  273. package/dist/lib/validation/schema-loader.d.mts +2 -0
  274. package/dist/lib/validation/schema-loader.d.ts +2 -0
  275. package/dist/lib/validation/schema-loader.js +43 -4
  276. package/dist/lib/validation/schema-loader.mjs +39 -3
  277. package/dist/lib/version.d.mts +3 -3
  278. package/dist/lib/version.d.ts +3 -3
  279. package/dist/lib/version.js +3 -3
  280. package/dist/lib/version.mjs +3 -3
  281. package/docs/TYPE-SUMMARY.md +2 -2
  282. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +4 -0
  283. package/docs/guides/REPORTING-LEDGER-CUTOVER.md +1 -1
  284. package/docs/guides/REPORTING-LEDGER.md +132 -46
  285. package/docs/guides/REPORTING-OPERATIONS.md +25 -4
  286. package/docs/guides/REPORTING-STABILITY.md +76 -0
  287. package/docs/guides/account-resolution.md +101 -0
  288. package/docs/llms.txt +3 -2
  289. package/docs/migration-12-to-13.md +7 -0
  290. package/docs/migration-14.x-rc-worksheet.md +4 -4
  291. package/docs/migration-agent-identity-3.3.md +355 -0
  292. package/docs/migration-agent-resolution-3.3.md +5 -0
  293. package/docs/migration-reporting-row-storage-alignment.md +137 -0
  294. package/examples/storyboards/account-sync-contract.yaml +57 -0
  295. package/package.json +15 -1
@@ -0,0 +1,660 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var web_bot_auth_exports = {};
20
+ __export(web_bot_auth_exports, {
21
+ SIGNATURE_DIRECTORY_MEDIA_TYPE: () => SIGNATURE_DIRECTORY_MEDIA_TYPE,
22
+ SIGNATURE_DIRECTORY_PATH: () => SIGNATURE_DIRECTORY_PATH,
23
+ SignatureDirectoryResolver: () => SignatureDirectoryResolver,
24
+ WEB_BOT_AUTH_DRAFT_REVISION: () => WEB_BOT_AUTH_DRAFT_REVISION,
25
+ WEB_BOT_AUTH_PROFILE: () => WEB_BOT_AUTH_PROFILE,
26
+ WebBotAuthError: () => WebBotAuthError,
27
+ buildWebBotAuthSignatureBase: () => buildWebBotAuthSignatureBase,
28
+ createSignedSignatureDirectory: () => createSignedSignatureDirectory,
29
+ createWebBotAuthAuthorizationFailure: () => createWebBotAuthAuthorizationFailure,
30
+ createWebBotAuthFetch: () => createWebBotAuthFetch,
31
+ getWebBotAuthAuthorizationFailure: () => getWebBotAuthAuthorizationFailure,
32
+ getWebBotAuthLegacyOriginGate: () => getWebBotAuthLegacyOriginGate,
33
+ isVerifiedWebBotSigner: () => isVerifiedWebBotSigner,
34
+ jwkThumbprint: () => jwkThumbprint,
35
+ receivedAgentOrigin: () => receivedAgentOrigin,
36
+ registerWebBotAuthLegacyOriginGate: () => registerWebBotAuthLegacyOriginGate,
37
+ selectSignatureProfile: () => selectSignatureProfile,
38
+ signWebBotAuth: () => signWebBotAuth,
39
+ verifySignatureDirectory: () => verifySignatureDirectory,
40
+ verifyWebBotAuth: () => verifyWebBotAuth,
41
+ webBotAuthToolFailure: () => webBotAuthToolFailure
42
+ });
43
+ module.exports = __toCommonJS(web_bot_auth_exports);
44
+ var import_version = require('../version.js');
45
+ var import_crypto = require("crypto");
46
+ var import_structured_headers = require("structured-headers");
47
+ var import_net = require('../net/index.js');
48
+ var import_etld = require('./agent-resolver/etld.js');
49
+ var import_canonicalize = require('./agent-resolver/canonicalize.js');
50
+ var import_select_agent = require('./agent-resolver/select-agent.js');
51
+ var import_strict_json = require('./agent-resolver/strict-json.js');
52
+ var import_canonicalize2 = require('./canonicalize.js');
53
+ var import_content_digest = require('./content-digest.js');
54
+ var import_crypto2 = require('./crypto.js');
55
+ var import_parser = require('./parser.js');
56
+ const WEB_BOT_AUTH_PROFILE = "web-bot-auth";
57
+ const WEB_BOT_AUTH_DRAFT_REVISION = "draft-ietf-webbotauth-httpsig-protocol-00";
58
+ const SIGNATURE_DIRECTORY_PATH = "/.well-known/http-message-signatures-directory";
59
+ const SIGNATURE_DIRECTORY_MEDIA_TYPE = "application/http-message-signatures-directory+json";
60
+ const DIRECTORY_TAG = "http-message-signatures-directory";
61
+ const TEST_KIDS = /* @__PURE__ */ new Set([
62
+ "6WsKMCObba49V3uN0vIENnk1BKAk7c9zjBJcWKyQ9_I",
63
+ "hHurKlVBnPJ4AGiPyl6HWMhxgkIcRBzaC8qWwEtnuVI",
64
+ "ZtaFf5jj-EzorJmZn6mX3YnmK_QyZKVLbbinzIQKOjQ",
65
+ "1XlJ3EIte7bPOEqKQtKrKNTNy5hywTyrwFXWrMbXKqE"
66
+ ]);
67
+ class WebBotAuthError extends Error {
68
+ constructor(status, reason) {
69
+ super(
70
+ status === 400 ? "Malformed Web Bot Auth message" : status === 429 ? "Web Bot Auth rate limit" : "Web Bot Auth verification failed"
71
+ );
72
+ this.status = status;
73
+ this.reason = reason;
74
+ this.name = "WebBotAuthError";
75
+ this.headers = status === 403 && ![
76
+ "key_revoked",
77
+ "identity_not_bound",
78
+ "revocation_unavailable",
79
+ "revocation_persistence_failed",
80
+ "profile_disabled"
81
+ ].includes(reason) ? {
82
+ "Accept-Signature": 'sig1=("@method" "@target-uri" "@authority" "content-type" "content-digest" "signature-agent";key="sig1");created;expires;nonce;keyid;tag="web-bot-auth"'
83
+ } : status === 429 ? { "Retry-After": "60" } : {};
84
+ }
85
+ status;
86
+ reason;
87
+ headers;
88
+ get body() {
89
+ if (["key_revoked", "identity_not_bound", "revocation_unavailable", "revocation_persistence_failed"].includes(
90
+ this.reason
91
+ ))
92
+ return {
93
+ adcp_error: {
94
+ code: this.reason.startsWith("revocation_") ? "SERVICE_UNAVAILABLE" : "PERMISSION_DENIED",
95
+ message: this.message,
96
+ recovery: this.reason.startsWith("revocation_") ? "transient" : "correctable"
97
+ }
98
+ };
99
+ return { error: this.message };
100
+ }
101
+ }
102
+ function bad(reason) {
103
+ throw new WebBotAuthError(400, reason);
104
+ }
105
+ function denied(reason) {
106
+ throw new WebBotAuthError(403, reason);
107
+ }
108
+ function dictionary(value, field) {
109
+ if (!value || value.length > 64 * 1024) return bad("headers");
110
+ try {
111
+ (0, import_parser.rejectDuplicateDictionaryKeys)(value, field);
112
+ return (0, import_structured_headers.parseDictionary)(value);
113
+ } catch {
114
+ return bad("structured_field");
115
+ }
116
+ }
117
+ function selectSignatureProfile(request) {
118
+ if ((0, import_canonicalize2.getHeaderValue)(request.headers, "signature-agent") !== void 0) return WEB_BOT_AUTH_PROFILE;
119
+ const input = (0, import_canonicalize2.getHeaderValue)(request.headers, "signature-input");
120
+ if (input && /;\s*tag\s*=\s*"web-bot-auth"/.test(input)) return WEB_BOT_AUTH_PROFILE;
121
+ return "rfc9421";
122
+ }
123
+ function jwkThumbprint(jwk) {
124
+ let fields;
125
+ if (jwk.kty === "OKP" && typeof jwk.crv === "string" && typeof jwk.x === "string")
126
+ fields = { crv: jwk.crv, kty: jwk.kty, x: jwk.x };
127
+ else if (jwk.kty === "EC" && typeof jwk.crv === "string" && typeof jwk.x === "string" && typeof jwk.y === "string")
128
+ fields = { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y };
129
+ else return denied("unsupported_key");
130
+ return (0, import_crypto.createHash)("sha256").update(JSON.stringify(fields)).digest("base64url");
131
+ }
132
+ function algorithm(jwk) {
133
+ if (jwk.kty === "OKP" && jwk.crv === "Ed25519") return "ed25519";
134
+ if (jwk.kty === "EC" && jwk.crv === "P-256") return "ecdsa-p256-sha256";
135
+ return denied("unsupported_key");
136
+ }
137
+ function inputs(headers) {
138
+ const value = (0, import_canonicalize2.getHeaderValue)(headers, "signature-input");
139
+ return [...dictionary(value, "Signature-Input").keys()].map((label) => {
140
+ try {
141
+ return (0, import_parser.parseSignatureInput)(value, label);
142
+ } catch {
143
+ return bad("signature_input");
144
+ }
145
+ });
146
+ }
147
+ function receivedAgentOrigin(value) {
148
+ try {
149
+ (0, import_select_agent.canonicalAgentUrl)(value);
150
+ const origin = (0, import_canonicalize.canonicalAgentOrigin)(value);
151
+ if (value !== origin || /[^\x21-\x7e]/.test(value) || value.includes("%")) return bad("agent_origin");
152
+ return origin;
153
+ } catch {
154
+ return bad("agent_origin");
155
+ }
156
+ }
157
+ function buildWebBotAuthSignatureBase(input, request, response) {
158
+ const lines = input.components.map((component) => {
159
+ const bare = component.split(";", 1)[0];
160
+ let identifier;
161
+ try {
162
+ identifier = (0, import_structured_headers.parseItem)(`"${bare}"${component.slice(bare.length)}`);
163
+ } catch {
164
+ return bad("component");
165
+ }
166
+ const params = identifier[1];
167
+ for (const [key, value2] of params) {
168
+ if (key !== "key" && key !== "req" || key === "key" && typeof value2 !== "string" || key === "req" && value2 !== true)
169
+ return bad("component_parameter");
170
+ }
171
+ if (params.has("req") && !response) return bad("request_bound_component");
172
+ let value;
173
+ const source = response && !params.has("req") ? response.headers : request.headers;
174
+ if (bare.startsWith("@")) {
175
+ if (params.has("key")) return bad("derived_dictionary");
176
+ if (response && bare !== "@status" && !params.has("req")) return bad("response_component");
177
+ if (bare === "@method") value = request.method.toUpperCase();
178
+ else if (bare === "@target-uri") value = (0, import_canonicalize2.canonicalTargetUri)(request.url, "3.2");
179
+ else if (bare === "@authority") value = (0, import_canonicalize2.canonicalAuthority)(request.url, "3.2");
180
+ else if (bare === "@status" && response && !params.has("req")) value = String(response.status);
181
+ else return bad("derived_component");
182
+ } else {
183
+ value = (0, import_canonicalize2.getHeaderValue)(source, bare);
184
+ if (params.has("key")) {
185
+ const member = dictionary(value, bare).get(params.get("key"));
186
+ if (!member) return denied("missing_member");
187
+ if (Array.isArray(member[0])) {
188
+ const selected = (0, import_parser.parseSignatureInput)(value, params.get("key"));
189
+ value = selected.signatureParamsValue;
190
+ } else value = (0, import_structured_headers.serializeItem)(member);
191
+ }
192
+ }
193
+ if (value === void 0) return denied("missing_component");
194
+ if (/[\r\n]/.test(value)) return bad("component_value");
195
+ return `${(0, import_structured_headers.serializeItem)(identifier)}: ${value}`;
196
+ });
197
+ return [...lines, `"@signature-params": ${input.signatureParamsValue}`].join("\n");
198
+ }
199
+ function assertDigest(headers, body) {
200
+ const digest = (0, import_canonicalize2.getHeaderValue)(headers, "content-digest");
201
+ if (!digest || !(0, import_content_digest.contentDigestUsesEncoding)(digest, "rfc8941-base64") || !(0, import_content_digest.contentDigestMatches)(digest, body))
202
+ denied("content_digest");
203
+ }
204
+ function verifyBytes(input, request, jwk, response) {
205
+ const alg = algorithm(jwk);
206
+ if (input.params.alg !== void 0 && input.params.alg !== alg) denied("algorithm");
207
+ const signature = (0, import_canonicalize2.getHeaderValue)(response?.headers ?? request.headers, "signature");
208
+ let bytes;
209
+ try {
210
+ bytes = (0, import_parser.parseSignature)(signature ?? "", input.label, "rfc8941-base64").bytes;
211
+ } catch {
212
+ return bad("signature");
213
+ }
214
+ let valid = false;
215
+ try {
216
+ valid = (0, import_crypto2.verifySignature)(
217
+ alg,
218
+ (0, import_crypto2.jwkToPublicKey)(jwk),
219
+ Buffer.from(buildWebBotAuthSignatureBase(input, request, response)),
220
+ bytes
221
+ );
222
+ } catch (error) {
223
+ if (error instanceof WebBotAuthError) throw error;
224
+ }
225
+ if (!valid) denied("signature_invalid");
226
+ }
227
+ const legacyOriginGates = /* @__PURE__ */ new WeakMap();
228
+ function registerWebBotAuthLegacyOriginGate(resolver, gate) {
229
+ legacyOriginGates.set(resolver, gate);
230
+ }
231
+ function getWebBotAuthLegacyOriginGate(resolver) {
232
+ return resolver && legacyOriginGates.get(resolver);
233
+ }
234
+ const authorizationFailures = /* @__PURE__ */ new WeakSet();
235
+ function createWebBotAuthAuthorizationFailure(reason) {
236
+ const failure = Object.freeze({
237
+ code: reason === "revocation_unavailable" ? "SERVICE_UNAVAILABLE" : "PERMISSION_DENIED",
238
+ message: reason === "revocation_unavailable" ? "Identity revocation information is unavailable" : reason === "key_revoked" ? "Agent identity key is revoked" : "Agent identity is not onboarded for this operation",
239
+ recovery: reason === "revocation_unavailable" ? "transient" : "correctable"
240
+ });
241
+ authorizationFailures.add(failure);
242
+ return failure;
243
+ }
244
+ function getWebBotAuthAuthorizationFailure(extra) {
245
+ for (const value of [extra?.webBotAuthAuthorization, extra?.identity33]) {
246
+ const claim = value;
247
+ if (claim && isVerifiedWebBotSigner(claim.signer) && claim.authorizationFailure && authorizationFailures.has(claim.authorizationFailure))
248
+ return claim.authorizationFailure;
249
+ }
250
+ return void 0;
251
+ }
252
+ function webBotAuthToolFailure(failure, version) {
253
+ return {
254
+ isError: true,
255
+ content: [
256
+ {
257
+ type: "text",
258
+ text: JSON.stringify({
259
+ adcp_error: failure,
260
+ status: "failed",
261
+ ...version && { adcp_version: (0, import_version.toReleasePrecisionVersion)(version) }
262
+ })
263
+ }
264
+ ]
265
+ };
266
+ }
267
+ const verifiedSigners = /* @__PURE__ */ new WeakSet();
268
+ function isVerifiedWebBotSigner(value) {
269
+ return typeof value === "object" && value !== null && verifiedSigners.has(value);
270
+ }
271
+ async function verifyWebBotAuth(request, options) {
272
+ try {
273
+ if (!(options.directory instanceof SignatureDirectoryResolver)) denied("directory_unverified");
274
+ const now = Math.floor((options.now ?? (() => Date.now() / 1e3))());
275
+ if (!Number.isFinite(now)) denied("verification_unavailable");
276
+ const all = inputs(request.headers);
277
+ const candidates = all.filter((input) => input.params.tag === WEB_BOT_AUTH_PROFILE);
278
+ const selected = [];
279
+ const remaining = [...candidates];
280
+ while (remaining.length) {
281
+ const index = remaining.findIndex(
282
+ (input) => candidates.every(
283
+ (other) => !input.components.some(
284
+ (c) => c === `signature-input;key="${other.label}"` || c === `signature;key="${other.label}"`
285
+ ) || selected.some((done) => done.label === other.label)
286
+ )
287
+ );
288
+ if (index < 0) denied("relay_cycle");
289
+ selected.push(remaining.splice(index, 1)[0]);
290
+ }
291
+ if (!selected.length || selected.length > 8) denied("profile");
292
+ const agents = dictionary((0, import_canonicalize2.getHeaderValue)(request.headers, "signature-agent"), "Signature-Agent");
293
+ const verified = [];
294
+ const nonces = /* @__PURE__ */ new Set();
295
+ for (const input of selected) {
296
+ const { created, expires, nonce, keyid } = input.params;
297
+ if ([created, expires, nonce, keyid].some((value) => value === void 0)) denied("parameters_missing");
298
+ if (!Number.isInteger(created) || !Number.isInteger(expires) || typeof nonce !== "string" || !/^[A-Za-z0-9_+\/-]{22,256}={0,2}$/.test(nonce) || typeof keyid !== "string" || !/^[A-Za-z0-9_-]{43}$/.test(keyid))
299
+ bad("parameters");
300
+ if (expires <= created || expires - created > 300 || created > now + 60 || expires < now - 60) denied("window");
301
+ const agentComponents = input.components.filter(
302
+ (c) => c.startsWith("signature-agent;key=") && !verified.some((s) => selected.find((i) => i.label === s.label).components.includes(c))
303
+ );
304
+ if (agentComponents.length !== 1) denied("agent_not_covered");
305
+ const component = (0, import_structured_headers.parseItem)(`"${agentComponents[0].replace("signature-agent;", 'signature-agent";')}`);
306
+ const memberKey = component[1].get("key");
307
+ if (typeof memberKey !== "string" || memberKey !== input.label) bad("agent_member");
308
+ const member = agents.get(memberKey);
309
+ if (!member || typeof member[0] !== "string") bad("signature_agent");
310
+ const type = member[1].get("type");
311
+ if (type !== void 0 && type !== "directory") denied("agent_type");
312
+ const origin = receivedAgentOrigin(member[0]);
313
+ for (const earlier of verified) {
314
+ const inner = selected.find((i) => i.label === earlier.label);
315
+ const required = [
316
+ ...inner.components,
317
+ `signature-input;key="${inner.label}"`,
318
+ `signature;key="${inner.label}"`
319
+ ];
320
+ if (required.some((c) => !input.components.includes(c))) denied("relay_coverage");
321
+ }
322
+ if (new Set(input.components).size !== input.components.length || ["@method", "@target-uri", "@authority"].some((c) => !input.components.includes(c)))
323
+ denied("coverage");
324
+ if (request.body !== void 0 && request.body !== "") {
325
+ if (["content-type", "content-digest"].some((c) => !input.components.includes(c))) denied("body_coverage");
326
+ assertDigest(request.headers, request.body);
327
+ }
328
+ await options.directory.resolve(keyid, origin);
329
+ const proof = options.directory.getAuditProof(origin);
330
+ if (!proof || new URL(proof.request.url).origin !== origin) denied("directory_origin");
331
+ const checkedDirectory = verifySignatureDirectory(
332
+ proof,
333
+ now,
334
+ options.allowTestKeys ?? options.directory.allowsTestKeys
335
+ );
336
+ const key = checkedDirectory.keys.find((key2) => key2.kid === keyid);
337
+ if (!key || jwkThumbprint(key) !== keyid) denied("key");
338
+ verifyBytes(input, request, key);
339
+ let authorizationFailure;
340
+ try {
341
+ if (await options.isRevoked(origin, keyid)) denied("key_revoked");
342
+ } catch (error) {
343
+ if (options.requireFreshRevocation === false && error instanceof WebBotAuthError && error.reason === "revocation_unavailable") {
344
+ } else if (options.deferAuthorizationErrors && error instanceof WebBotAuthError && ["key_revoked", "revocation_unavailable", "revocation_persistence_failed"].includes(error.reason))
345
+ authorizationFailure = createWebBotAuthAuthorizationFailure(
346
+ error.reason === "revocation_persistence_failed" ? "revocation_unavailable" : error.reason
347
+ );
348
+ else throw error;
349
+ }
350
+ const nonceTuple = JSON.stringify([origin, nonce]);
351
+ if (nonces.has(nonceTuple)) throw new WebBotAuthError(options.replayStatus ?? 429, "nonce_replayed");
352
+ nonces.add(nonceTuple);
353
+ const signer = Object.freeze({
354
+ profile: WEB_BOT_AUTH_PROFILE,
355
+ origin,
356
+ keyid,
357
+ label: input.label,
358
+ verified_at: now,
359
+ ...authorizationFailure && { authorizationFailure }
360
+ });
361
+ verified.push(signer);
362
+ }
363
+ for (const signer of verified) {
364
+ const input = selected.find((i) => i.label === signer.label);
365
+ const result = await options.replayStore.insert(
366
+ signer.origin,
367
+ WEB_BOT_AUTH_PROFILE,
368
+ input.params.nonce,
369
+ Math.max(1, input.params.expires + 60 - now),
370
+ now
371
+ );
372
+ if (result !== "ok")
373
+ throw new WebBotAuthError(result === "replayed" ? options.replayStatus ?? 429 : 429, result);
374
+ }
375
+ for (const signer of verified) verifiedSigners.add(signer);
376
+ return verified;
377
+ } catch (error) {
378
+ if (error instanceof WebBotAuthError) {
379
+ if (error.headers["Accept-Signature"]) {
380
+ const label = inputs(request.headers)[0]?.label ?? "sig1";
381
+ const bodyComponents = request.body ? '"content-type" "content-digest" ' : "";
382
+ error.headers["Accept-Signature"] = `${label}=("@method" "@target-uri" "@authority" ${bodyComponents}"signature-agent";key="${label}");created;expires;nonce;keyid;tag="web-bot-auth"`;
383
+ }
384
+ throw error;
385
+ }
386
+ return denied("verification_unavailable");
387
+ }
388
+ }
389
+ function verifySignatureDirectory(response, now = Date.now() / 1e3, allowTestKeys = false) {
390
+ try {
391
+ if (!Number.isFinite(now)) denied("directory_invalid");
392
+ const origin = (0, import_canonicalize.canonicalAgentOrigin)(response.request.url);
393
+ if (response.request.url !== origin + SIGNATURE_DIRECTORY_PATH || response.status !== 200 || (0, import_canonicalize2.getHeaderValue)(response.headers, "content-type")?.split(";")[0]?.trim().toLowerCase() !== SIGNATURE_DIRECTORY_MEDIA_TYPE)
394
+ denied("directory_response");
395
+ const body = response.body ?? "";
396
+ if (Buffer.byteLength(body) > 256 * 1024) denied("directory_size");
397
+ assertDigest(response.headers, body);
398
+ const document = (0, import_strict_json.parseStrictJson)(body, 32);
399
+ if (!Array.isArray(document.keys) || !document.keys.length || document.keys.length > 64) denied("directory_keys");
400
+ const signatures = inputs(response.headers);
401
+ const keys = /* @__PURE__ */ new Set();
402
+ let expires = Infinity;
403
+ for (const key of document.keys) {
404
+ if (!key || typeof key !== "object" || typeof key.kid !== "string" || key.kid !== jwkThumbprint(key) || keys.has(key.kid) || key.d !== void 0 || Object.keys(key).some((k) => k.startsWith("_private")) || key.adcp_use !== void 0 || (!allowTestKeys || !["test", "development"].includes(process.env.NODE_ENV ?? "")) && TEST_KIDS.has(key.kid))
405
+ denied("directory_key");
406
+ keys.add(key.kid);
407
+ const proof = signatures.find((input) => input.params.keyid === key.kid && input.params.tag === DIRECTORY_TAG);
408
+ if (!proof || !proof.components.includes("@authority;req") || !proof.components.includes("content-digest") || !Number.isInteger(proof.params.created) || !Number.isInteger(proof.params.expires) || proof.params.created > now || proof.params.expires <= now || proof.params.expires <= proof.params.created)
409
+ denied("directory_proof");
410
+ verifyBytes(proof, { ...response.request, headers: response.request.headers ?? {} }, key, response);
411
+ expires = Math.min(expires, proof.params.expires);
412
+ }
413
+ return { keys: document.keys, expires, proof: response };
414
+ } catch (error) {
415
+ if (error instanceof WebBotAuthError) throw error;
416
+ return denied("directory_invalid");
417
+ }
418
+ }
419
+ class SignatureDirectoryResolver {
420
+ constructor(options = {}) {
421
+ this.options = options;
422
+ }
423
+ options;
424
+ cache = /* @__PURE__ */ new Map();
425
+ failures = /* @__PURE__ */ new Map();
426
+ keyMissCooldown = /* @__PURE__ */ new Map();
427
+ pending = /* @__PURE__ */ new Map();
428
+ async resolve(keyid, signerOrigin) {
429
+ if (!signerOrigin) return denied("origin_required");
430
+ const origin = receivedAgentOrigin(signerOrigin);
431
+ const now = (this.options.now ?? (() => Date.now() / 1e3))();
432
+ const cached = this.cache.get(origin);
433
+ if (cached && cached.freshUntil > now && cached.directory.expires > now) {
434
+ const key = cached.directory.keys.find((k) => k.kid === keyid);
435
+ if (key || (this.keyMissCooldown.get(origin) ?? 0) > now) return key ?? null;
436
+ this.keyMissCooldown.set(origin, now + 60);
437
+ }
438
+ if ((this.failures.get(origin) ?? 0) > now) {
439
+ if (cached && cached.directory.expires > now) return cached.directory.keys.find((k) => k.kid === keyid) ?? null;
440
+ return denied("directory_unavailable");
441
+ }
442
+ let pending = this.pending.get(origin);
443
+ if (!pending) {
444
+ if ([...this.pending.keys()].filter((pendingOrigin) => (0, import_etld.eTldPlusOne)(pendingOrigin) === (0, import_etld.eTldPlusOne)(origin)).length >= 2 || this.pending.size >= (this.options.maxConcurrentFetches ?? 16)) {
445
+ if (cached && cached.directory.expires > now) return cached.directory.keys.find((k) => k.kid === keyid) ?? null;
446
+ throw new WebBotAuthError(429, "directory_fetch_limit");
447
+ }
448
+ pending = this.fetch(origin, now);
449
+ this.pending.set(origin, pending);
450
+ }
451
+ try {
452
+ return (await pending).keys.find((k) => k.kid === keyid) ?? null;
453
+ } catch (error) {
454
+ if (cached && cached.directory.expires > now) return cached.directory.keys.find((k) => k.kid === keyid) ?? null;
455
+ throw error;
456
+ } finally {
457
+ if (this.pending.get(origin) === pending) this.pending.delete(origin);
458
+ }
459
+ }
460
+ async fetch(origin, now) {
461
+ try {
462
+ const url = origin + SIGNATURE_DIRECTORY_PATH;
463
+ const result = await (0, import_net.ssrfSafeFetch)(url, {
464
+ ...this.options.fetchOptions,
465
+ headers: { accept: SIGNATURE_DIRECTORY_MEDIA_TYPE },
466
+ timeoutMs: 1e4,
467
+ maxBodyBytes: 256 * 1024
468
+ });
469
+ const body = new TextDecoder("utf-8", { fatal: true }).decode(result.body);
470
+ const directory = verifySignatureDirectory(
471
+ { status: result.status, headers: result.headers, body, request: { method: "GET", url } },
472
+ now,
473
+ this.options.allowTestKeys
474
+ );
475
+ const cacheControl = result.headers["cache-control"] ?? "";
476
+ const maxAge = /(?:^|,)\s*(?:no-cache|no-store)(?:,|$)/i.test(cacheControl) ? 0 : Number(cacheControl.match(/(?:^|,)\s*max-age=(\d+)/i)?.[1] ?? 300);
477
+ const age = Number(result.headers.age ?? 0);
478
+ if (!Number.isFinite(age) || age < 0) denied("directory_invalid");
479
+ if (this.cache.size >= (this.options.maxOrigins ?? 1e3) && !this.cache.has(origin)) {
480
+ const oldest = this.cache.keys().next().value;
481
+ this.cache.delete(oldest);
482
+ this.keyMissCooldown.delete(oldest);
483
+ }
484
+ this.cache.set(origin, {
485
+ directory,
486
+ freshUntil: Math.min(directory.expires, now + Math.max(0, Math.min(maxAge - age, 300)))
487
+ });
488
+ this.failures.delete(origin);
489
+ return directory;
490
+ } catch (error) {
491
+ if (this.failures.size >= (this.options.maxOrigins ?? 1e3))
492
+ this.failures.delete(this.failures.keys().next().value);
493
+ this.failures.set(origin, now + 60);
494
+ throw error instanceof WebBotAuthError ? error : new WebBotAuthError(403, "directory_unavailable");
495
+ }
496
+ }
497
+ get allowsTestKeys() {
498
+ return this.options.allowTestKeys === true && ["test", "development"].includes(process.env.NODE_ENV ?? "");
499
+ }
500
+ getAuditProof(origin) {
501
+ return this.cache.get(receivedAgentOrigin(origin))?.directory.proof;
502
+ }
503
+ }
504
+ async function signBase(base, key) {
505
+ const jwk = "privateKey" in key ? key.privateKey : key.publicKey;
506
+ const alg = algorithm(jwk);
507
+ if (!["test", "development"].includes(process.env.NODE_ENV ?? "") && TEST_KIDS.has(jwkThumbprint(jwk)))
508
+ throw new TypeError("Published Web Bot Auth test keys cannot sign in production");
509
+ if ("provider" in key) {
510
+ if (key.provider.keyid !== jwkThumbprint(jwk) || key.provider.algorithm !== alg)
511
+ throw new TypeError("Web Bot Auth provider identity does not match its public key");
512
+ return key.provider.sign(Buffer.from(base));
513
+ }
514
+ const privateKey = (0, import_crypto.createPrivateKey)({ key: jwk, format: "jwk" });
515
+ return alg === "ed25519" ? (0, import_crypto.sign)(null, Buffer.from(base), privateKey) : (0, import_crypto.sign)("sha256", Buffer.from(base), { key: privateKey, dsaEncoding: "ieee-p1363" });
516
+ }
517
+ async function signWebBotAuth(request, key, options) {
518
+ const origin = (0, import_canonicalize.canonicalAgentOrigin)(options.origin);
519
+ const label = options.label ?? "sig1";
520
+ if (!/^[a-z][a-z0-9_.*-]*$/.test(label)) throw new TypeError("Invalid signature label");
521
+ const jwk = "privateKey" in key ? key.privateKey : key.publicKey;
522
+ const now = Math.floor((options.now ?? (() => Date.now() / 1e3))());
523
+ const window = options.windowSeconds ?? 300;
524
+ const nonce = options.nonce ?? (0, import_crypto.randomBytes)(32).toString("base64url");
525
+ if (!Number.isInteger(window) || window < 1 || window > 300 || !/^[A-Za-z0-9_+\/-]{22,256}={0,2}$/.test(nonce))
526
+ throw new TypeError("Invalid Web Bot Auth lifetime or nonce");
527
+ const headers = {};
528
+ for (const [name, value] of Object.entries(request.headers))
529
+ if (value !== void 0 && !["signature", "signature-input", "signature-agent", "content-digest"].includes(name.toLowerCase()))
530
+ headers[name.toLowerCase()] = Array.isArray(value) ? value.join(", ") : value;
531
+ const components = ['"@method"', '"@target-uri"', '"@authority"'];
532
+ if (request.body !== void 0 && request.body !== "") {
533
+ if (!(0, import_canonicalize2.getHeaderValue)(headers, "content-type"))
534
+ throw new TypeError("Body-bearing Web Bot Auth requests need Content-Type");
535
+ headers["content-digest"] = (0, import_content_digest.computeContentDigest)(request.body, "rfc8941-base64");
536
+ components.push('"content-type"', '"content-digest"');
537
+ }
538
+ const earlier = options.relay ? inputs(request.headers) : [];
539
+ if (earlier.some((input2) => input2.label === label || input2.params.tag !== WEB_BOT_AUTH_PROFILE))
540
+ throw new TypeError("Relay requires existing Web Bot Auth signatures and a fresh label");
541
+ const priorAgent = options.relay ? (0, import_canonicalize2.getHeaderValue)(request.headers, "signature-agent") : void 0;
542
+ if (priorAgent) dictionary(priorAgent, "Signature-Agent");
543
+ headers["signature-agent"] = `${priorAgent ? priorAgent + ", " : ""}${label}="${origin}"`;
544
+ components.push(`"signature-agent";key="${label}"`);
545
+ for (const inner of earlier) {
546
+ for (const component of inner.components) {
547
+ const bare = component.split(";", 1)[0];
548
+ const encoded = `"${bare}"${component.slice(bare.length)}`;
549
+ if (!components.includes(encoded)) components.push(encoded);
550
+ }
551
+ components.push(`"signature-input";key="${inner.label}"`, `"signature";key="${inner.label}"`);
552
+ }
553
+ const priorInput = options.relay ? (0, import_canonicalize2.getHeaderValue)(request.headers, "signature-input") : void 0;
554
+ const priorSignature = options.relay ? (0, import_canonicalize2.getHeaderValue)(request.headers, "signature") : void 0;
555
+ if (options.relay && (!priorInput || !priorSignature || !priorAgent))
556
+ throw new TypeError("Relay requires the existing signature fields");
557
+ headers["signature-input"] = `${priorInput ? priorInput + ", " : ""}${label}=(${components.join(" ")});created=${now};expires=${now + window};nonce="${nonce}";keyid="${jwkThumbprint(jwk)}";alg="${algorithm(jwk)}";tag="web-bot-auth"`;
558
+ const input = (0, import_parser.parseSignatureInput)(headers["signature-input"], label);
559
+ if (priorSignature) headers.signature = priorSignature;
560
+ const bytes = await signBase(buildWebBotAuthSignatureBase(input, { ...request, headers }), key);
561
+ headers.signature = `${priorSignature ? priorSignature + ", " : ""}${label}=:${Buffer.from(bytes).toString("base64")}:`;
562
+ return headers;
563
+ }
564
+ async function createSignedSignatureDirectory(originUrl, signingKeys, options = {}) {
565
+ const origin = (0, import_canonicalize.canonicalAgentOrigin)(originUrl);
566
+ const now = Math.floor((options.now ?? (() => Date.now() / 1e3))());
567
+ const lifetime = options.lifetimeSeconds ?? 86400;
568
+ if (!Number.isFinite(now) || !Number.isSafeInteger(lifetime) || lifetime < 1 || !Number.isSafeInteger(now + lifetime))
569
+ throw new TypeError("Invalid directory proof clock or lifetime");
570
+ if (!signingKeys.length || signingKeys.length > 64 || !Number.isInteger(lifetime) || lifetime < 1)
571
+ throw new TypeError("Invalid directory keys or lifetime");
572
+ const keys = signingKeys.map((key) => {
573
+ const jwk = "privateKey" in key ? key.privateKey : key.publicKey;
574
+ return {
575
+ kty: jwk.kty,
576
+ crv: jwk.crv,
577
+ x: jwk.x,
578
+ ...jwk.y ? { y: jwk.y } : {},
579
+ kid: jwkThumbprint(jwk),
580
+ use: "sig"
581
+ };
582
+ });
583
+ if (new Set(keys.map((k) => k.kid)).size !== keys.length) throw new TypeError("Duplicate directory key");
584
+ const body = JSON.stringify({ keys });
585
+ const response = {
586
+ status: 200,
587
+ body,
588
+ request: { method: "GET", url: origin + SIGNATURE_DIRECTORY_PATH },
589
+ headers: {
590
+ "content-type": SIGNATURE_DIRECTORY_MEDIA_TYPE,
591
+ "content-digest": (0, import_content_digest.computeContentDigest)(body, "rfc8941-base64"),
592
+ "cache-control": `max-age=${Math.min(lifetime, 300)}`
593
+ }
594
+ };
595
+ const signatureInputs = [], signatures = [];
596
+ for (let i = 0; i < keys.length; i++) {
597
+ const label = `key${i + 1}`;
598
+ const value = `${label}=("@authority";req "content-digest");created=${now};expires=${now + lifetime};keyid="${keys[i].kid}";alg="${algorithm(keys[i])}";tag="${DIRECTORY_TAG}"`;
599
+ const input = (0, import_parser.parseSignatureInput)(value, label);
600
+ const bytes = await signBase(
601
+ buildWebBotAuthSignatureBase(input, { method: "GET", url: response.request.url, headers: {} }, response),
602
+ signingKeys[i]
603
+ );
604
+ signatureInputs.push(value);
605
+ signatures.push(`${label}=:${Buffer.from(bytes).toString("base64")}:`);
606
+ }
607
+ response.headers["signature-input"] = signatureInputs.join(", ");
608
+ response.headers.signature = signatures.join(", ");
609
+ return response;
610
+ }
611
+ function createWebBotAuthFetch(upstream, key, options) {
612
+ return async (input, init) => {
613
+ const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
614
+ if (options.shouldSign && !options.shouldSign(url, init)) return upstream(input, init);
615
+ if (input instanceof Request)
616
+ throw new TypeError("Pass a URL and init to Web Bot Auth fetch so the exact body can be signed");
617
+ const parsed = new URL(url);
618
+ if (parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.hash)
619
+ throw new TypeError("Signed targets must be HTTPS without credentials or fragments");
620
+ let body;
621
+ if (init?.body != null) {
622
+ if (typeof init.body === "string") body = init.body;
623
+ else if (init.body instanceof Uint8Array || init.body instanceof ArrayBuffer)
624
+ body = new TextDecoder("utf-8", { fatal: true }).decode(init.body);
625
+ else throw new TypeError("Web Bot Auth fetch requires a UTF-8 string or byte body");
626
+ }
627
+ const headers = {};
628
+ new Headers(init?.headers).forEach((value, name) => {
629
+ headers[name] = value;
630
+ });
631
+ if (body !== void 0 && !headers["content-type"]) headers["content-type"] = "application/json";
632
+ const method = init?.method ?? "GET";
633
+ const signed = await signWebBotAuth({ method, url, headers, body }, key, options);
634
+ return upstream(url, { ...init, method, body, headers: signed, redirect: "manual" });
635
+ };
636
+ }
637
+ // Annotate the CommonJS export names for ESM import in node:
638
+ 0 && (module.exports = {
639
+ SIGNATURE_DIRECTORY_MEDIA_TYPE,
640
+ SIGNATURE_DIRECTORY_PATH,
641
+ SignatureDirectoryResolver,
642
+ WEB_BOT_AUTH_DRAFT_REVISION,
643
+ WEB_BOT_AUTH_PROFILE,
644
+ WebBotAuthError,
645
+ buildWebBotAuthSignatureBase,
646
+ createSignedSignatureDirectory,
647
+ createWebBotAuthAuthorizationFailure,
648
+ createWebBotAuthFetch,
649
+ getWebBotAuthAuthorizationFailure,
650
+ getWebBotAuthLegacyOriginGate,
651
+ isVerifiedWebBotSigner,
652
+ jwkThumbprint,
653
+ receivedAgentOrigin,
654
+ registerWebBotAuthLegacyOriginGate,
655
+ selectSignatureProfile,
656
+ signWebBotAuth,
657
+ verifySignatureDirectory,
658
+ verifyWebBotAuth,
659
+ webBotAuthToolFailure
660
+ });