@adcp/sdk 15.9.1 → 16.0.0-beta.2

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 (321) 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 +25 -2
  12. package/dist/lib/core/SingleAgentClient.d.ts +25 -2
  13. package/dist/lib/core/SingleAgentClient.js +280 -62
  14. package/dist/lib/core/SingleAgentClient.mjs +282 -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/generated-compat.d.mts +34 -0
  28. package/dist/lib/identity-3.3/generated-compat.d.ts +34 -0
  29. package/dist/lib/identity-3.3/generated-compat.js +16 -0
  30. package/dist/lib/identity-3.3/generated-compat.mjs +0 -0
  31. package/dist/lib/identity-3.3/index.d.mts +10 -0
  32. package/dist/lib/identity-3.3/index.d.ts +10 -0
  33. package/dist/lib/identity-3.3/index.js +79 -0
  34. package/dist/lib/identity-3.3/index.mjs +50 -0
  35. package/dist/lib/identity-3.3/lifecycle.d.mts +125 -0
  36. package/dist/lib/identity-3.3/lifecycle.d.ts +125 -0
  37. package/dist/lib/identity-3.3/lifecycle.js +294 -0
  38. package/dist/lib/identity-3.3/lifecycle.mjs +272 -0
  39. package/dist/lib/identity-3.3/revocation.d.mts +86 -0
  40. package/dist/lib/identity-3.3/revocation.d.ts +86 -0
  41. package/dist/lib/identity-3.3/revocation.js +308 -0
  42. package/dist/lib/identity-3.3/revocation.mjs +286 -0
  43. package/dist/lib/identity-3.3/schemas.draft.d.mts +2472 -0
  44. package/dist/lib/identity-3.3/schemas.draft.d.ts +2472 -0
  45. package/dist/lib/identity-3.3/schemas.draft.js +1448 -0
  46. package/dist/lib/identity-3.3/schemas.draft.mjs +1428 -0
  47. package/dist/lib/identity-3.3/server.d.mts +46 -0
  48. package/dist/lib/identity-3.3/server.d.ts +46 -0
  49. package/dist/lib/identity-3.3/server.js +279 -0
  50. package/dist/lib/identity-3.3/server.mjs +260 -0
  51. package/dist/lib/identity-3.3/store.d.mts +24 -0
  52. package/dist/lib/identity-3.3/store.d.ts +24 -0
  53. package/dist/lib/identity-3.3/store.js +191 -0
  54. package/dist/lib/identity-3.3/store.mjs +169 -0
  55. package/dist/lib/identity-3.3/trust.d.mts +155 -0
  56. package/dist/lib/identity-3.3/trust.d.ts +155 -0
  57. package/dist/lib/identity-3.3/trust.js +383 -0
  58. package/dist/lib/identity-3.3/trust.mjs +342 -0
  59. package/dist/lib/identity-3.3/types.d.mts +155 -0
  60. package/dist/lib/identity-3.3/types.d.ts +155 -0
  61. package/dist/lib/identity-3.3/types.js +16 -0
  62. package/dist/lib/identity-3.3/types.mjs +0 -0
  63. package/dist/lib/identity-3.3/validation.d.mts +2 -0
  64. package/dist/lib/identity-3.3/validation.d.ts +2 -0
  65. package/dist/lib/identity-3.3/validation.js +125 -0
  66. package/dist/lib/identity-3.3/validation.mjs +91 -0
  67. package/dist/lib/index.d.mts +1 -1
  68. package/dist/lib/index.d.ts +1 -1
  69. package/dist/lib/index.js +2 -0
  70. package/dist/lib/index.mjs +2 -0
  71. package/dist/lib/protocols/index.d.mts +1 -1
  72. package/dist/lib/protocols/index.d.ts +1 -1
  73. package/dist/lib/protocols/index.js +2 -2
  74. package/dist/lib/protocols/index.mjs +2 -2
  75. package/dist/lib/reporting/azure/index.d.mts +5 -0
  76. package/dist/lib/reporting/azure/index.d.ts +5 -0
  77. package/dist/lib/reporting/azure/index.js +26 -7
  78. package/dist/lib/reporting/azure/index.mjs +26 -7
  79. package/dist/lib/reporting/bigquery/index.d.mts +39 -5
  80. package/dist/lib/reporting/bigquery/index.d.ts +39 -5
  81. package/dist/lib/reporting/bigquery/index.js +26 -20
  82. package/dist/lib/reporting/bigquery/index.mjs +26 -20
  83. package/dist/lib/reporting/gcs/adapter.d.mts +8 -1
  84. package/dist/lib/reporting/gcs/adapter.d.ts +8 -1
  85. package/dist/lib/reporting/gcs/errors.d.mts +6 -0
  86. package/dist/lib/reporting/gcs/errors.d.ts +6 -0
  87. package/dist/lib/reporting/gcs/fence.d.mts +5 -0
  88. package/dist/lib/reporting/gcs/fence.d.ts +5 -0
  89. package/dist/lib/reporting/gcs/index.d.mts +9 -0
  90. package/dist/lib/reporting/gcs/index.d.ts +9 -0
  91. package/dist/lib/reporting/gcs/reader.d.mts +27 -3
  92. package/dist/lib/reporting/gcs/reader.d.ts +27 -3
  93. package/dist/lib/reporting/gcs/row-provider.d.mts +7 -0
  94. package/dist/lib/reporting/gcs/row-provider.d.ts +7 -0
  95. package/dist/lib/reporting/gcs/row-provider.js +34 -14
  96. package/dist/lib/reporting/gcs/row-provider.mjs +34 -14
  97. package/dist/lib/reporting/ledger/change-feed.d.mts +22 -1
  98. package/dist/lib/reporting/ledger/change-feed.d.ts +22 -1
  99. package/dist/lib/reporting/ledger/index.d.mts +11 -0
  100. package/dist/lib/reporting/ledger/index.d.ts +11 -0
  101. package/dist/lib/reporting/ledger/managed-postgres.d.mts +8 -0
  102. package/dist/lib/reporting/ledger/managed-postgres.d.ts +8 -0
  103. package/dist/lib/reporting/ledger/managed-router.d.mts +27 -2
  104. package/dist/lib/reporting/ledger/managed-router.d.ts +27 -2
  105. package/dist/lib/reporting/ledger/managed.d.mts +86 -6
  106. package/dist/lib/reporting/ledger/managed.d.ts +86 -6
  107. package/dist/lib/reporting/ledger/notification-activity.d.mts +65 -3
  108. package/dist/lib/reporting/ledger/notification-activity.d.ts +65 -3
  109. package/dist/lib/reporting/ledger/object-writes.d.mts +64 -5
  110. package/dist/lib/reporting/ledger/object-writes.d.ts +64 -5
  111. package/dist/lib/reporting/ledger/postgres.d.mts +43 -9
  112. package/dist/lib/reporting/ledger/postgres.d.ts +43 -9
  113. package/dist/lib/reporting/ledger/postgres.js +43 -27
  114. package/dist/lib/reporting/ledger/postgres.mjs +43 -27
  115. package/dist/lib/reporting/ledger/row-encoding.d.mts +92 -6
  116. package/dist/lib/reporting/ledger/row-encoding.d.ts +92 -6
  117. package/dist/lib/reporting/ledger/row-encoding.js +8 -4
  118. package/dist/lib/reporting/ledger/row-encoding.mjs +6 -3
  119. package/dist/lib/reporting/ledger/row-storage-errors.d.mts +11 -1
  120. package/dist/lib/reporting/ledger/row-storage-errors.d.ts +11 -1
  121. package/dist/lib/reporting/ledger/row-storage-migration.d.mts +19 -1
  122. package/dist/lib/reporting/ledger/row-storage-migration.d.ts +19 -1
  123. package/dist/lib/reporting/ledger/row-storage-migration.js +133 -18
  124. package/dist/lib/reporting/ledger/row-storage-migration.mjs +133 -18
  125. package/dist/lib/reporting/ledger/row-storage-object.d.mts +103 -12
  126. package/dist/lib/reporting/ledger/row-storage-object.d.ts +103 -12
  127. package/dist/lib/reporting/ledger/row-storage-object.js +106 -31
  128. package/dist/lib/reporting/ledger/row-storage-object.mjs +104 -31
  129. package/dist/lib/reporting/ledger/row-storage.d.mts +87 -20
  130. package/dist/lib/reporting/ledger/row-storage.d.ts +87 -20
  131. package/dist/lib/reporting/ledger/row-storage.js +126 -66
  132. package/dist/lib/reporting/ledger/row-storage.mjs +129 -67
  133. package/dist/lib/reporting/ledger/schedule.d.mts +13 -0
  134. package/dist/lib/reporting/ledger/schedule.d.ts +13 -0
  135. package/dist/lib/reporting/ledger/schedule.js +24 -0
  136. package/dist/lib/reporting/ledger/schedule.mjs +23 -0
  137. package/dist/lib/reporting/ledger/types.d.mts +23 -1
  138. package/dist/lib/reporting/ledger/types.d.ts +23 -1
  139. package/dist/lib/reporting/s3/index.d.mts +5 -0
  140. package/dist/lib/reporting/s3/index.d.ts +5 -0
  141. package/dist/lib/reporting/s3/index.js +37 -14
  142. package/dist/lib/reporting/s3/index.mjs +37 -14
  143. package/dist/lib/reporting/service/index.d.mts +10 -0
  144. package/dist/lib/reporting/service/index.d.ts +10 -0
  145. package/dist/lib/reporting/service/maintenance.d.mts +28 -2
  146. package/dist/lib/reporting/service/maintenance.d.ts +28 -2
  147. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  148. package/dist/lib/server/account-sync-contract.d.mts +14 -0
  149. package/dist/lib/server/account-sync-contract.d.ts +14 -0
  150. package/dist/lib/server/account-sync-contract.js +225 -0
  151. package/dist/lib/server/account-sync-contract.mjs +197 -0
  152. package/dist/lib/server/adcp-server.js +5 -0
  153. package/dist/lib/server/adcp-server.mjs +10 -0
  154. package/dist/lib/server/auth-signature.d.mts +15 -0
  155. package/dist/lib/server/auth-signature.d.ts +15 -0
  156. package/dist/lib/server/auth-signature.js +72 -2
  157. package/dist/lib/server/auth-signature.mjs +81 -2
  158. package/dist/lib/server/auth.d.mts +6 -0
  159. package/dist/lib/server/auth.d.ts +6 -0
  160. package/dist/lib/server/auth.js +6 -0
  161. package/dist/lib/server/auth.mjs +6 -0
  162. package/dist/lib/server/create-adcp-server.d.mts +19 -5
  163. package/dist/lib/server/create-adcp-server.d.ts +19 -5
  164. package/dist/lib/server/create-adcp-server.js +259 -19
  165. package/dist/lib/server/create-adcp-server.mjs +266 -10
  166. package/dist/lib/server/decisioning/account.d.mts +24 -1
  167. package/dist/lib/server/decisioning/account.d.ts +24 -1
  168. package/dist/lib/server/decisioning/index.d.mts +1 -1
  169. package/dist/lib/server/decisioning/index.d.ts +1 -1
  170. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +0 -50
  171. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +0 -50
  172. package/dist/lib/server/decisioning/runtime/from-platform.js +61 -11
  173. package/dist/lib/server/decisioning/runtime/from-platform.mjs +65 -12
  174. package/dist/lib/server/index.d.mts +2 -0
  175. package/dist/lib/server/index.d.ts +2 -0
  176. package/dist/lib/server/index.js +12 -0
  177. package/dist/lib/server/index.mjs +12 -0
  178. package/dist/lib/server/notification-subscriptions/runtime.js +9 -1
  179. package/dist/lib/server/notification-subscriptions/runtime.mjs +9 -1
  180. package/dist/lib/server/notification-subscriptions/types.d.mts +5 -0
  181. package/dist/lib/server/notification-subscriptions/types.d.ts +5 -0
  182. package/dist/lib/server/principal/types.d.mts +1 -1
  183. package/dist/lib/server/principal/types.d.ts +1 -1
  184. package/dist/lib/server/serve.js +5 -0
  185. package/dist/lib/server/serve.mjs +5 -0
  186. package/dist/lib/server/webhook-delivery/recovery.d.mts +1 -0
  187. package/dist/lib/server/webhook-delivery/recovery.d.ts +1 -0
  188. package/dist/lib/server/webhook-delivery/recovery.js +4 -0
  189. package/dist/lib/server/webhook-delivery/recovery.mjs +4 -0
  190. package/dist/lib/server/webhook-emitter.d.mts +10 -0
  191. package/dist/lib/server/webhook-emitter.d.ts +10 -0
  192. package/dist/lib/server/webhook-emitter.js +22 -0
  193. package/dist/lib/server/webhook-emitter.mjs +22 -0
  194. package/dist/lib/signing/agent-context.d.mts +0 -5
  195. package/dist/lib/signing/agent-context.d.ts +0 -5
  196. package/dist/lib/signing/agent-context.js +9 -1
  197. package/dist/lib/signing/agent-context.mjs +9 -1
  198. package/dist/lib/signing/agent-fetch.js +27 -2
  199. package/dist/lib/signing/agent-fetch.mjs +32 -2
  200. package/dist/lib/signing/agent-resolver/canonicalize.d.mts +10 -15
  201. package/dist/lib/signing/agent-resolver/canonicalize.d.ts +10 -15
  202. package/dist/lib/signing/agent-resolver/canonicalize.js +17 -5
  203. package/dist/lib/signing/agent-resolver/canonicalize.mjs +16 -5
  204. package/dist/lib/signing/agent-resolver/index.d.mts +1 -0
  205. package/dist/lib/signing/agent-resolver/index.d.ts +1 -0
  206. package/dist/lib/signing/agent-resolver/index.js +5 -0
  207. package/dist/lib/signing/agent-resolver/index.mjs +3 -0
  208. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.mts +3 -2
  209. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.d.ts +3 -2
  210. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.js +30 -3
  211. package/dist/lib/signing/agent-resolver/resolved-agent-jwks.mjs +30 -3
  212. package/dist/lib/signing/agent-resolver/strict-json.d.mts +2 -2
  213. package/dist/lib/signing/agent-resolver/strict-json.d.ts +2 -2
  214. package/dist/lib/signing/agent-resolver/strict-json.js +5 -3
  215. package/dist/lib/signing/agent-resolver/strict-json.mjs +5 -3
  216. package/dist/lib/signing/brand-jwks.d.mts +2 -2
  217. package/dist/lib/signing/brand-jwks.d.ts +2 -2
  218. package/dist/lib/signing/brand-jwks.js +4 -4
  219. package/dist/lib/signing/brand-jwks.mjs +4 -4
  220. package/dist/lib/signing/client.d.mts +1 -0
  221. package/dist/lib/signing/client.d.ts +1 -0
  222. package/dist/lib/signing/client.js +5 -0
  223. package/dist/lib/signing/client.mjs +3 -0
  224. package/dist/lib/signing/crypto.js +8 -0
  225. package/dist/lib/signing/crypto.mjs +9 -1
  226. package/dist/lib/signing/fetch-async.js +1 -1
  227. package/dist/lib/signing/fetch-async.mjs +1 -1
  228. package/dist/lib/signing/fetch.js +1 -1
  229. package/dist/lib/signing/fetch.mjs +1 -1
  230. package/dist/lib/signing/jwks-https.d.mts +1 -1
  231. package/dist/lib/signing/jwks-https.d.ts +1 -1
  232. package/dist/lib/signing/jwks-https.js +1 -1
  233. package/dist/lib/signing/jwks-https.mjs +1 -1
  234. package/dist/lib/signing/jwks.d.mts +11 -3
  235. package/dist/lib/signing/jwks.d.ts +11 -3
  236. package/dist/lib/signing/jwks.js +1 -1
  237. package/dist/lib/signing/jwks.mjs +1 -1
  238. package/dist/lib/signing/middleware.js +9 -0
  239. package/dist/lib/signing/middleware.mjs +14 -0
  240. package/dist/lib/signing/parser.d.mts +9 -6
  241. package/dist/lib/signing/parser.d.ts +9 -6
  242. package/dist/lib/signing/parser.js +82 -64
  243. package/dist/lib/signing/parser.mjs +83 -65
  244. package/dist/lib/signing/revocation.d.mts +4 -1
  245. package/dist/lib/signing/revocation.d.ts +4 -1
  246. package/dist/lib/signing/revocation.js +36 -3
  247. package/dist/lib/signing/revocation.mjs +34 -2
  248. package/dist/lib/signing/server.d.mts +1 -1
  249. package/dist/lib/signing/server.d.ts +1 -1
  250. package/dist/lib/signing/server.js +4 -0
  251. package/dist/lib/signing/server.mjs +4 -0
  252. package/dist/lib/signing/types.d.mts +3 -0
  253. package/dist/lib/signing/types.d.ts +3 -0
  254. package/dist/lib/signing/verifier.js +1 -1
  255. package/dist/lib/signing/verifier.mjs +1 -1
  256. package/dist/lib/signing/web-bot-auth.d.mts +191 -0
  257. package/dist/lib/signing/web-bot-auth.d.ts +191 -0
  258. package/dist/lib/signing/web-bot-auth.js +837 -0
  259. package/dist/lib/signing/web-bot-auth.mjs +796 -0
  260. package/dist/lib/signing/webhook-verifier.js +1 -1
  261. package/dist/lib/signing/webhook-verifier.mjs +1 -1
  262. package/dist/lib/testing/client.d.mts +1 -4
  263. package/dist/lib/testing/client.d.ts +1 -4
  264. package/dist/lib/testing/client.js +141 -20
  265. package/dist/lib/testing/client.mjs +137 -19
  266. package/dist/lib/testing/compliance/comply.js +29 -10
  267. package/dist/lib/testing/compliance/comply.mjs +37 -11
  268. package/dist/lib/testing/storyboard/account-sync-contract.d.mts +3 -0
  269. package/dist/lib/testing/storyboard/account-sync-contract.d.ts +3 -0
  270. package/dist/lib/testing/storyboard/account-sync-contract.js +79 -0
  271. package/dist/lib/testing/storyboard/account-sync-contract.mjs +55 -0
  272. package/dist/lib/testing/storyboard/default-invariants.js +2 -0
  273. package/dist/lib/testing/storyboard/default-invariants.mjs +2 -0
  274. package/dist/lib/testing/storyboard/runner.js +23 -8
  275. package/dist/lib/testing/storyboard/runner.mjs +24 -8
  276. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  277. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  278. package/dist/lib/types/adcp.d.mts +4 -0
  279. package/dist/lib/types/adcp.d.ts +4 -0
  280. package/dist/lib/types/schemas.generated.d.ts +6 -6
  281. package/dist/lib/utils/capabilities.d.mts +1 -0
  282. package/dist/lib/utils/capabilities.d.ts +1 -0
  283. package/dist/lib/utils/capabilities.js +5 -0
  284. package/dist/lib/utils/capabilities.mjs +5 -0
  285. package/dist/lib/v2/projection/catalog-snapshot.js +3 -1
  286. package/dist/lib/v2/projection/catalog-snapshot.mjs +3 -1
  287. package/dist/lib/v2/projection/creative-delivery.d.mts +34 -10
  288. package/dist/lib/v2/projection/creative-delivery.d.ts +34 -10
  289. package/dist/lib/v2/projection/creative-delivery.js +26 -10
  290. package/dist/lib/v2/projection/creative-delivery.mjs +26 -10
  291. package/dist/lib/v2/projection/index.d.mts +1 -1
  292. package/dist/lib/v2/projection/index.d.ts +1 -1
  293. package/dist/lib/v2/projection/index.js +2 -0
  294. package/dist/lib/v2/projection/index.mjs +2 -0
  295. package/dist/lib/v2/projection/legacy-routes.d.mts +34 -2
  296. package/dist/lib/v2/projection/legacy-routes.d.ts +34 -2
  297. package/dist/lib/v2/projection/legacy-routes.js +35 -2
  298. package/dist/lib/v2/projection/legacy-routes.mjs +32 -2
  299. package/dist/lib/validation/schema-loader.d.mts +2 -0
  300. package/dist/lib/validation/schema-loader.d.ts +2 -0
  301. package/dist/lib/validation/schema-loader.js +43 -4
  302. package/dist/lib/validation/schema-loader.mjs +39 -3
  303. package/dist/lib/version.d.mts +3 -3
  304. package/dist/lib/version.d.ts +3 -3
  305. package/dist/lib/version.js +3 -3
  306. package/dist/lib/version.mjs +3 -3
  307. package/docs/TYPE-SUMMARY.md +2 -2
  308. package/docs/guides/DISCOVERY-CACHE-AND-SESSION-REUSE.md +4 -0
  309. package/docs/guides/REPORTING-LEDGER-CUTOVER.md +1 -1
  310. package/docs/guides/REPORTING-LEDGER.md +99 -29
  311. package/docs/guides/REPORTING-OPERATIONS.md +29 -13
  312. package/docs/guides/REPORTING-STABILITY.md +76 -0
  313. package/docs/guides/account-resolution.md +101 -0
  314. package/docs/llms.txt +3 -2
  315. package/docs/migration-12-to-13.md +15 -0
  316. package/docs/migration-14.x-rc-worksheet.md +4 -4
  317. package/docs/migration-agent-identity-3.3.md +494 -0
  318. package/docs/migration-agent-resolution-3.3.md +5 -0
  319. package/docs/migration-reporting-row-storage-alignment.md +137 -0
  320. package/examples/storyboards/account-sync-contract.yaml +57 -0
  321. package/package.json +17 -1
@@ -0,0 +1,155 @@
1
+ import { type SsrfFetchOptions } from '../net';
2
+ import type { TrustRecord, TrustAgent, AgentGrantDeniedDetails } from './types';
3
+ export declare function validateIdentity33Schema(id: string, value: unknown): boolean;
4
+ export declare class IdentityAuthorizationError extends Error {
5
+ readonly code = "PERMISSION_DENIED";
6
+ readonly details: AgentGrantDeniedDetails | undefined;
7
+ constructor(reason?: 'authorization_failed' | 'grant_absent');
8
+ }
9
+ /**
10
+ * The trust record could not be read (transport error, outage, capacity,
11
+ * invalid content). A fetch failure is never absence or delisting: spend
12
+ * fails closed with a retryable SERVICE_UNAVAILABLE, other calls continue
13
+ * under an existing binding.
14
+ */
15
+ export declare class TrustRecordUnavailableError extends IdentityAuthorizationError {
16
+ readonly transient: true;
17
+ /**
18
+ * Set by `match()`: the last record read for this operator listed the origin
19
+ * with the role and is still within the seller's outage bound
20
+ * (`maxOutageContinuationSeconds` past its freshness). Only then may non-spend
21
+ * calls continue under a binding.
22
+ */
23
+ lastKnownListed: boolean;
24
+ constructor();
25
+ }
26
+ /**
27
+ * The operator's last record read does not list the origin with the required
28
+ * role (`unlisted`; operators retire agents by publishing an empty `agents[]`),
29
+ * or the operator has never published one (`absent`).
30
+ */
31
+ export declare class TrustMembershipError extends IdentityAuthorizationError {
32
+ readonly membership: 'unlisted' | 'absent';
33
+ constructor(membership?: 'unlisted' | 'absent');
34
+ }
35
+ /** Schema plus semantic checks; publication never includes identity keys. */
36
+ export declare function validateTrustRecord(value: unknown): asserts value is TrustRecord;
37
+ export declare function createTrustRecord(record: TrustRecord): TrustRecord;
38
+ export type TrustFetchResult = {
39
+ status: 'present';
40
+ operator: string;
41
+ record: TrustRecord;
42
+ checkedAt: number;
43
+ freshUntil: number;
44
+ } | {
45
+ status: 'absent';
46
+ operator: string;
47
+ checkedAt: number;
48
+ freshUntil: number;
49
+ };
50
+ export interface TrustEvaluatorOptions {
51
+ /** Matches configured revocation polling: one minute through thirty minutes. */
52
+ pollingIntervalSeconds?: number;
53
+ /**
54
+ * Seller policy: how long past the last listing record's freshness a bound
55
+ * origin's non-spend calls may continue while its operator's record cannot
56
+ * be read. Spend never continues on an outage. Default four polling
57
+ * intervals.
58
+ */
59
+ maxOutageContinuationSeconds?: number;
60
+ now?: () => number;
61
+ fetchOptions?: Pick<SsrfFetchOptions, 'lookup' | 'trustedFetchFn'>;
62
+ maxEntries?: number;
63
+ /**
64
+ * Process-local authority history only: operators remembered per hosting
65
+ * provider, i.e. per ICANN registrable domain of a PSL PRIVATE-section name
66
+ * (every `*.vercel.app`, `*.s3.<region>.amazonaws.com` or
67
+ * `*.<project>.platformsh.site` operator shares one budget). ICANN
68
+ * registrable domains each count once. Default 32.
69
+ */
70
+ maxAuthoritativeOperatorsPerPrivateSuffix?: number;
71
+ /**
72
+ * Process-local authority history only: total slots all PRIVATE-section
73
+ * operators may hold together, so registrants of ICANN domains always keep
74
+ * headroom. Default half of `maxEntries`.
75
+ */
76
+ maxPrivateAuthoritativeOperators?: number;
77
+ maxConcurrentFetches?: number;
78
+ /** Share authoritative-history across restarts/replicas when legacy fallback is enabled. */
79
+ authorityHistory?: {
80
+ has(operator: string): Promise<boolean>;
81
+ mark(operator: string): Promise<void>;
82
+ };
83
+ }
84
+ /** Used by binding/grants/onboarding, never by cryptographic verification. */
85
+ export declare class TrustEvaluator {
86
+ private readonly options;
87
+ private readonly cache;
88
+ private readonly negative;
89
+ private readonly pending;
90
+ private readonly urlRequests;
91
+ /** Keyed by (operator, host): one operator's authoritative_location hops never spend another's budget. */
92
+ private readonly hostRates;
93
+ private readonly authoritativeOperators;
94
+ /** Remembered authoritative operators per budget group (see authorityGroup). */
95
+ private readonly authorityGroups;
96
+ private privateAuthorityOperators;
97
+ readonly pollingIntervalSeconds: number;
98
+ readonly maxOutageContinuationSeconds: number;
99
+ constructor(options?: TrustEvaluatorOptions);
100
+ get(domainOrOrigin: string, force?: boolean): Promise<TrustFetchResult>;
101
+ match(origin: string, role: string, countries?: readonly string[]): Promise<{
102
+ operator: string;
103
+ agent: TrustAgent;
104
+ record: TrustRecord;
105
+ freshUntil: number;
106
+ }>;
107
+ invalidate(domain: string): void;
108
+ /**
109
+ * Record that `operator` served a trust record. With durable history the
110
+ * in-memory set is only a cache and may evict; without it, nothing is
111
+ * evicted and an operator over its group budget or the total is refused.
112
+ */
113
+ private rememberAuthority;
114
+ /**
115
+ * Process-local view only. With durable `authorityHistory` this set is a
116
+ * cache and may have evicted an operator that durable history still records.
117
+ */
118
+ hasAuthoritativeRecord(domain: string): boolean;
119
+ private now;
120
+ private request;
121
+ private fetch;
122
+ }
123
+ export interface DemandGrantClaim {
124
+ /** Only pass identity from an actual verifier. */
125
+ signerOrigin: string;
126
+ brand: {
127
+ domain: string;
128
+ brand_id?: string;
129
+ countries?: readonly string[];
130
+ };
131
+ accountOperator: string;
132
+ scope: string;
133
+ }
134
+ export interface DemandGrantAuthorization {
135
+ source: 'implicit' | 'trust' | 'seller' | 'legacy';
136
+ operator: string;
137
+ expiresAt?: number;
138
+ checkedAt: number;
139
+ chain: string[];
140
+ }
141
+ export interface DemandGrantOptions {
142
+ evaluator: TrustEvaluator;
143
+ now?: () => number;
144
+ /** Only evaluated for nonexclusive uncovered claims, never fetch failures. */
145
+ sellerAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
146
+ /** Only for authoritative absence; never after a 200 or an exclusive record. */
147
+ legacyAuthorization?: (claim: DemandGrantClaim) => Promise<boolean>;
148
+ /** Seller-verified brand identity resolution, including the house's child-brand ID. Never accept a buyer-selected authorizer. */
149
+ resolveBrandHouse?: (brand: DemandGrantClaim['brand']) => Promise<{
150
+ domain: string;
151
+ brand_id: string;
152
+ } | undefined>;
153
+ }
154
+ /** Always invoke before sync_accounts side effects and before spend. No account mutation. */
155
+ export declare function authorizeDemandGrant(claim: DemandGrantClaim, options: DemandGrantOptions): Promise<DemandGrantAuthorization>;
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var trust_exports = {};
30
+ __export(trust_exports, {
31
+ IdentityAuthorizationError: () => IdentityAuthorizationError,
32
+ TrustEvaluator: () => TrustEvaluator,
33
+ TrustMembershipError: () => TrustMembershipError,
34
+ TrustRecordUnavailableError: () => TrustRecordUnavailableError,
35
+ authorizeDemandGrant: () => authorizeDemandGrant,
36
+ createTrustRecord: () => createTrustRecord,
37
+ validateIdentity33Schema: () => validateIdentity33Schema,
38
+ validateTrustRecord: () => validateTrustRecord
39
+ });
40
+ module.exports = __toCommonJS(trust_exports);
41
+ var import_ajv = __toESM(require("ajv"));
42
+ var import_ajv_formats = __toESM(require("ajv-formats"));
43
+ var import_net = require('../net/index.js');
44
+ var import_canonicalize = require('../signing/agent-resolver/canonicalize.js');
45
+ var import_etld = require('../signing/agent-resolver/etld.js');
46
+ var import_strict_json = require('../signing/agent-resolver/strict-json.js');
47
+ var import_tldts = require("tldts");
48
+ var import_schemas = __toESM(require('./schemas.draft.js'));
49
+ const ajv = new import_ajv.default({ strict: false, allErrors: false });
50
+ (0, import_ajv_formats.default)(ajv);
51
+ for (const schema of import_schemas.default) ajv.addSchema(schema);
52
+ function validateIdentity33Schema(id, value) {
53
+ return ajv.getSchema(`/schemas/${id}.json`)?.(value) === true;
54
+ }
55
+ class IdentityAuthorizationError extends Error {
56
+ code = "PERMISSION_DENIED";
57
+ details;
58
+ constructor(reason = "authorization_failed") {
59
+ super(reason === "grant_absent" ? "Agent authority is not granted" : "Agent authorization failed");
60
+ this.name = "IdentityAuthorizationError";
61
+ this.details = reason === "grant_absent" ? { scope: "agent", reason } : void 0;
62
+ }
63
+ }
64
+ class TrustRecordUnavailableError extends IdentityAuthorizationError {
65
+ transient = true;
66
+ /**
67
+ * Set by `match()`: the last record read for this operator listed the origin
68
+ * with the role and is still within the seller's outage bound
69
+ * (`maxOutageContinuationSeconds` past its freshness). Only then may non-spend
70
+ * calls continue under a binding.
71
+ */
72
+ lastKnownListed = false;
73
+ constructor() {
74
+ super();
75
+ this.name = "TrustRecordUnavailableError";
76
+ this.message = "Agent trust record is temporarily unavailable";
77
+ }
78
+ }
79
+ class TrustMembershipError extends IdentityAuthorizationError {
80
+ constructor(membership = "unlisted") {
81
+ super();
82
+ this.membership = membership;
83
+ this.name = "TrustMembershipError";
84
+ }
85
+ membership;
86
+ }
87
+ function unavailable(cause) {
88
+ const error = new TrustRecordUnavailableError();
89
+ if (cause !== void 0) Object.defineProperty(error, "cause", { value: cause });
90
+ throw error;
91
+ }
92
+ class TrustHostCapacityError extends Error {
93
+ }
94
+ const FOREIGN_HOST_BUDGET = "\0foreign";
95
+ const OWN_HOST_REQUESTS_PER_MINUTE = 10;
96
+ const FOREIGN_HOST_REQUESTS_PER_MINUTE = 30;
97
+ function failure(cause) {
98
+ const error = new IdentityAuthorizationError();
99
+ if (cause !== void 0) Object.defineProperty(error, "cause", { value: cause });
100
+ throw error;
101
+ }
102
+ function validateTrustRecord(value) {
103
+ if (!validateIdentity33Schema("trust/v1/trust", value)) failure();
104
+ const record = value;
105
+ const origins = /* @__PURE__ */ new Set();
106
+ for (const agent of record.agents ?? []) {
107
+ if (agent.jwks_uri !== void 0) failure();
108
+ const origin = (0, import_canonicalize.canonicalAgentOrigin)(agent.url);
109
+ if (origins.has(origin)) failure();
110
+ origins.add(origin);
111
+ }
112
+ }
113
+ function createTrustRecord(record) {
114
+ validateTrustRecord(record);
115
+ return structuredClone(record);
116
+ }
117
+ class TrustEvaluator {
118
+ constructor(options = {}) {
119
+ this.options = options;
120
+ this.pollingIntervalSeconds = options.pollingIntervalSeconds ?? 300;
121
+ this.maxOutageContinuationSeconds = options.maxOutageContinuationSeconds ?? 4 * this.pollingIntervalSeconds;
122
+ if (!Number.isFinite(this.maxOutageContinuationSeconds) || this.maxOutageContinuationSeconds < 0)
123
+ throw new TypeError("maxOutageContinuationSeconds must be a finite, non-negative number");
124
+ if (!Number.isFinite(this.pollingIntervalSeconds) || this.pollingIntervalSeconds < 60 || this.pollingIntervalSeconds > 1800)
125
+ throw new TypeError("Trust polling interval must be 60\u20131800 seconds");
126
+ }
127
+ options;
128
+ cache = /* @__PURE__ */ new Map();
129
+ negative = /* @__PURE__ */ new Map();
130
+ pending = /* @__PURE__ */ new Map();
131
+ urlRequests = /* @__PURE__ */ new Map();
132
+ /** Keyed by (operator, host): one operator's authoritative_location hops never spend another's budget. */
133
+ hostRates = /* @__PURE__ */ new Map();
134
+ authoritativeOperators = /* @__PURE__ */ new Set();
135
+ /** Remembered authoritative operators per budget group (see authorityGroup). */
136
+ authorityGroups = /* @__PURE__ */ new Map();
137
+ privateAuthorityOperators = 0;
138
+ pollingIntervalSeconds;
139
+ maxOutageContinuationSeconds;
140
+ async get(domainOrOrigin, force = false) {
141
+ let operator;
142
+ try {
143
+ operator = (0, import_etld.eTldPlusOne)(domainOrOrigin);
144
+ } catch {
145
+ return failure();
146
+ }
147
+ const now = this.now();
148
+ const cached = this.cache.get(operator);
149
+ if (!force && cached && cached.freshUntil > now) return cached;
150
+ if ((this.negative.get(operator) ?? 0) > now) unavailable();
151
+ let pending = this.pending.get(operator);
152
+ if (!pending) {
153
+ if (this.pending.size >= (this.options.maxConcurrentFetches ?? 16)) unavailable();
154
+ pending = this.fetch(operator, now);
155
+ this.pending.set(operator, pending);
156
+ }
157
+ try {
158
+ return await pending;
159
+ } finally {
160
+ if (this.pending.get(operator) === pending) this.pending.delete(operator);
161
+ }
162
+ }
163
+ async match(origin, role, countries) {
164
+ const canonical = (0, import_canonicalize.canonicalAgentOrigin)(origin);
165
+ let result;
166
+ try {
167
+ result = await this.get(canonical);
168
+ } catch (error) {
169
+ if (!(error instanceof TrustRecordUnavailableError)) throw error;
170
+ const last = this.cache.get((0, import_etld.eTldPlusOne)(canonical));
171
+ if (last && !listedAgent(last, canonical, role))
172
+ throw new TrustMembershipError(last.status === "present" ? "unlisted" : "absent");
173
+ error.lastKnownListed = !!last && this.now() <= last.freshUntil + this.maxOutageContinuationSeconds;
174
+ throw error;
175
+ }
176
+ const agent = listedAgent(result, canonical, role);
177
+ if (result.status !== "present") throw new TrustMembershipError("absent");
178
+ if (!agent) throw new TrustMembershipError();
179
+ if (agent.countries && countries?.length && countries.some((country) => !agent.countries.includes(country)))
180
+ failure();
181
+ return { operator: result.operator, agent, record: result.record, freshUntil: result.freshUntil };
182
+ }
183
+ invalidate(domain) {
184
+ this.cache.delete((0, import_etld.eTldPlusOne)(domain));
185
+ }
186
+ /**
187
+ * Record that `operator` served a trust record. With durable history the
188
+ * in-memory set is only a cache and may evict; without it, nothing is
189
+ * evicted and an operator over its group budget or the total is refused.
190
+ */
191
+ rememberAuthority(operator, durable) {
192
+ if (this.authoritativeOperators.has(operator)) return true;
193
+ const max = this.options.maxEntries ?? 1e3;
194
+ if (durable) {
195
+ if (this.authoritativeOperators.size >= max)
196
+ this.authoritativeOperators.delete(this.authoritativeOperators.values().next().value);
197
+ this.authoritativeOperators.add(operator);
198
+ return true;
199
+ }
200
+ const group = authorityGroup(operator);
201
+ const hosted = group !== operator;
202
+ if (this.authoritativeOperators.size >= max || hosted && (this.privateAuthorityOperators >= (this.options.maxPrivateAuthoritativeOperators ?? Math.floor(max / 2)) || (this.authorityGroups.get(group) ?? 0) >= (this.options.maxAuthoritativeOperatorsPerPrivateSuffix ?? 32)))
203
+ return false;
204
+ this.authoritativeOperators.add(operator);
205
+ if (hosted) {
206
+ this.privateAuthorityOperators++;
207
+ this.authorityGroups.set(group, (this.authorityGroups.get(group) ?? 0) + 1);
208
+ }
209
+ return true;
210
+ }
211
+ /**
212
+ * Process-local view only. With durable `authorityHistory` this set is a
213
+ * cache and may have evicted an operator that durable history still records.
214
+ */
215
+ hasAuthoritativeRecord(domain) {
216
+ return this.authoritativeOperators.has((0, import_etld.eTldPlusOne)(domain));
217
+ }
218
+ now() {
219
+ return (this.options.now ?? (() => Date.now() / 1e3))();
220
+ }
221
+ async request(url, operator) {
222
+ const parsed = new URL(url);
223
+ if (parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.hash) failure();
224
+ let own = false;
225
+ try {
226
+ own = (0, import_etld.eTldPlusOne)(parsed.hostname) === operator;
227
+ } catch {
228
+ }
229
+ const host = JSON.stringify([own ? operator : FOREIGN_HOST_BUDGET, parsed.hostname]);
230
+ const limit = own ? OWN_HOST_REQUESTS_PER_MINUTE : FOREIGN_HOST_REQUESTS_PER_MINUTE;
231
+ const pending = this.urlRequests.get(url);
232
+ if (pending) return pending;
233
+ const now = this.now(), rate = this.hostRates.get(host);
234
+ if (rate && now - rate.started < 60 && rate.count >= limit) throw new TrustHostCapacityError();
235
+ if (!rate && this.hostRates.size >= (this.options.maxEntries ?? 1e3))
236
+ this.hostRates.delete(this.hostRates.keys().next().value);
237
+ this.hostRates.set(
238
+ host,
239
+ rate && now - rate.started < 60 ? { ...rate, count: rate.count + 1 } : { started: now, count: 1 }
240
+ );
241
+ const request = (0, import_net.ssrfSafeFetch)(url, {
242
+ ...this.options.fetchOptions,
243
+ maxBodyBytes: 2 * 1024 * 1024,
244
+ timeoutMs: 1e4,
245
+ headers: { accept: "application/json" }
246
+ });
247
+ this.urlRequests.set(url, request);
248
+ try {
249
+ return await request;
250
+ } finally {
251
+ if (this.urlRequests.get(url) === request) this.urlRequests.delete(url);
252
+ }
253
+ }
254
+ async fetch(operator, now) {
255
+ try {
256
+ let response = await this.request(`https://${operator}/.well-known/trust.json`, operator);
257
+ let result;
258
+ if (response.status === 404 || response.status === 410) {
259
+ if (this.authoritativeOperators.has(operator) || await this.options.authorityHistory?.has(operator))
260
+ failure();
261
+ result = { status: "absent", operator, checkedAt: now, freshUntil: now + 60 };
262
+ } else {
263
+ if (response.status !== 200) failure();
264
+ if (this.options.authorityHistory) {
265
+ await this.options.authorityHistory.mark(operator);
266
+ this.rememberAuthority(operator, true);
267
+ } else if (!this.rememberAuthority(operator, false)) {
268
+ failure();
269
+ }
270
+ let record = (0, import_strict_json.parseStrictJson)(new TextDecoder("utf-8", { fatal: true }).decode(response.body), 32);
271
+ validateTrustRecord(record);
272
+ if (record.authoritative_location) {
273
+ response = await this.request(record.authoritative_location, operator);
274
+ if (response.status !== 200) failure();
275
+ record = (0, import_strict_json.parseStrictJson)(new TextDecoder("utf-8", { fatal: true }).decode(response.body), 32);
276
+ validateTrustRecord(record);
277
+ if (record.authoritative_location) failure();
278
+ }
279
+ result = {
280
+ status: "present",
281
+ operator,
282
+ record,
283
+ checkedAt: now,
284
+ freshUntil: now + this.pollingIntervalSeconds
285
+ };
286
+ }
287
+ const max = this.options.maxEntries ?? 1e3;
288
+ if (this.cache.size >= max && !this.cache.has(operator)) this.cache.delete(this.cache.keys().next().value);
289
+ this.cache.set(operator, result);
290
+ this.negative.delete(operator);
291
+ return result;
292
+ } catch (cause) {
293
+ if (cause instanceof TrustHostCapacityError) return unavailable(cause);
294
+ if (this.negative.size >= (this.options.maxEntries ?? 1e3))
295
+ this.negative.delete(this.negative.keys().next().value);
296
+ this.negative.set(operator, now + 60);
297
+ return unavailable(cause);
298
+ }
299
+ }
300
+ }
301
+ function listedAgent(result, origin, role) {
302
+ if (result.status !== "present") return void 0;
303
+ const entries = (result.record.agents ?? []).filter((agent) => (0, import_canonicalize.canonicalAgentOrigin)(agent.url) === origin);
304
+ return entries.length === 1 && entries[0].roles.includes(role) ? entries[0] : void 0;
305
+ }
306
+ function authorityGroup(operator) {
307
+ if (!(0, import_tldts.parse)(operator, { allowPrivateDomains: true }).isPrivate) return operator;
308
+ const provider = (0, import_tldts.parse)(operator).domain;
309
+ return `private:${provider ?? operator}`;
310
+ }
311
+ function grantMatches(grant, target, claim, now) {
312
+ if ((0, import_etld.eTldPlusOne)(grant.grantee) !== target) return false;
313
+ if (!grant.scopes.some(
314
+ (scope) => scope === "*" || scope === claim.scope || scope === "adcp:all" && claim.scope.startsWith("adcp:")
315
+ ))
316
+ return false;
317
+ if (grant.agents && !grant.agents.some((agent) => (0, import_canonicalize.canonicalAgentOrigin)(agent.url) === (0, import_canonicalize.canonicalAgentOrigin)(claim.signerOrigin)))
318
+ return false;
319
+ const brands = grant.profiles?.adcp?.brands;
320
+ if (brands && !brands.includes("*") && (!claim.brand.brand_id || !brands.includes(claim.brand.brand_id)))
321
+ return false;
322
+ if (grant.countries && (!claim.brand.countries?.length || claim.brand.countries.some((country) => !grant.countries.includes(country))))
323
+ return false;
324
+ if (grant.valid_from && Date.parse(grant.valid_from) / 1e3 > now) return false;
325
+ if (grant.valid_until && Date.parse(grant.valid_until) / 1e3 <= now) return false;
326
+ return true;
327
+ }
328
+ async function authorizeDemandGrant(claim, options) {
329
+ const now = (options.now ?? (() => Date.now() / 1e3))();
330
+ const signer = await options.evaluator.match(claim.signerOrigin, "adcp:buying", claim.brand.countries);
331
+ if (signer.agent.countries && !claim.brand.countries?.length) failure();
332
+ const brand = (0, import_etld.eTldPlusOne)(claim.brand.domain), account = (0, import_etld.eTldPlusOne)(claim.accountOperator), operator = signer.operator;
333
+ const result = (source, chain, grants = []) => ({
334
+ source,
335
+ chain,
336
+ operator,
337
+ checkedAt: now,
338
+ ...grants.some((g) => g.valid_until) ? { expiresAt: Math.min(...grants.map((g) => g.valid_until ? Date.parse(g.valid_until) / 1e3 : Infinity)) } : {}
339
+ });
340
+ if (brand === operator && account === operator) return result("implicit", [brand]);
341
+ if (brand === operator && account !== operator) throw new IdentityAuthorizationError("grant_absent");
342
+ const house = await options.resolveBrandHouse?.(claim.brand);
343
+ const authoritativeBrand = house ? (0, import_etld.eTldPlusOne)(house.domain) : brand;
344
+ const grantClaim = house ? { ...claim, brand: { ...claim.brand, brand_id: house.brand_id } } : claim;
345
+ const record = await options.evaluator.get(authoritativeBrand);
346
+ if (record.status === "absent") {
347
+ if (await options.legacyAuthorization?.(claim)) return result("legacy", [brand, account, operator]);
348
+ throw new IdentityAuthorizationError("grant_absent");
349
+ }
350
+ const first = (record.record.grants ?? []).filter((g) => grantMatches(g, account, grantClaim, now));
351
+ if (account === operator && first.length) return result("trust", [brand, operator], [first[0]]);
352
+ const selfOperated = account === brand || account === authoritativeBrand;
353
+ if (selfOperated && account !== operator) {
354
+ const direct = (record.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
355
+ if (direct) return result("trust", [brand, operator], [direct]);
356
+ }
357
+ if (account !== operator && account !== brand && first.length) {
358
+ const intermediary = await options.evaluator.get(account);
359
+ if (intermediary.status === "present") {
360
+ const second = (intermediary.record.grants ?? []).find((g) => grantMatches(g, operator, grantClaim, now));
361
+ if (second) return result("trust", [brand, account, operator], [first[0], second]);
362
+ }
363
+ }
364
+ const covered = (record.record.grants ?? []).some(
365
+ (g) => ((0, import_etld.eTldPlusOne)(g.grantee) === account || selfOperated && (0, import_etld.eTldPlusOne)(g.grantee) === operator) && g.scopes.some(
366
+ (scope) => scope === "*" || scope === claim.scope || scope === "adcp:all" && claim.scope.startsWith("adcp:")
367
+ )
368
+ );
369
+ if (!covered && !record.record.exclusive_grants && await options.sellerAuthorization?.(claim))
370
+ return result("seller", [brand, account, operator]);
371
+ throw new IdentityAuthorizationError("grant_absent");
372
+ }
373
+ // Annotate the CommonJS export names for ESM import in node:
374
+ 0 && (module.exports = {
375
+ IdentityAuthorizationError,
376
+ TrustEvaluator,
377
+ TrustMembershipError,
378
+ TrustRecordUnavailableError,
379
+ authorizeDemandGrant,
380
+ createTrustRecord,
381
+ validateIdentity33Schema,
382
+ validateTrustRecord
383
+ });