@seams/wallet-server 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/THIRD_PARTY_NOTICES.md +1 -9
  2. package/artifact-manifest.json +78 -33
  3. package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
  4. package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
  5. package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
  6. package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
  7. package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
  8. package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
  9. package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
  10. package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
  11. package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
  12. package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
  13. package/cloudflare-router-ab/build/router/index.js +2 -2
  14. package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
  15. package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
  16. package/cloudflare-router-ab/build/signing-worker/index.js +2 -2
  17. package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
  18. package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
  19. package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -2
  20. package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
  21. package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +0 -2
  22. package/cloudflare-router-ab/scripts/start-local-role-workers.mjs +77 -20
  23. package/dist/esm/authorization/lifecycleRouting.js +62 -0
  24. package/dist/esm/authorization/service.js +35 -12
  25. package/dist/esm/cloud-host.js +20 -22
  26. package/dist/esm/core/EmailOtpRecords.js +1 -217
  27. package/dist/esm/core/EmailOtpStores.js +0 -859
  28. package/dist/esm/core/IdentityStore.js +2 -339
  29. package/dist/esm/core/ThresholdService/config.js +1 -9
  30. package/dist/esm/core/ThresholdService/index.js +0 -4
  31. package/dist/esm/core/ThresholdService/kv.js +1 -66
  32. package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +1 -13
  33. package/dist/esm/core/ThresholdService/routerAbNormalSigningPolicy.js +1 -11
  34. package/dist/esm/core/ThresholdService/stores/WalletSessionStore.js +0 -541
  35. package/dist/esm/core/ThresholdService/validation.js +2 -346
  36. package/dist/esm/core/WalletAuthMethodStore.js +2 -123
  37. package/dist/esm/core/WalletStore.js +3 -209
  38. package/dist/esm/core/WebAuthnAuthenticatorStore.js +0 -202
  39. package/dist/esm/core/WebAuthnCredentialBindingStore.js +2 -182
  40. package/dist/esm/core/WebAuthnLoginChallengeStore.js +0 -52
  41. package/dist/esm/core/WebAuthnSyncChallengeStore.js +0 -54
  42. package/dist/esm/core/authService/emailOtpConfig.js +1 -195
  43. package/dist/esm/core/authService/emailOtpEnrollment.js +0 -110
  44. package/dist/esm/core/authService/emailOtpSeal.js +0 -63
  45. package/dist/esm/core/authService/nearTransactions.js +3 -98
  46. package/dist/esm/core/authService/rateLimits.js +0 -84
  47. package/dist/esm/core/authService/webauthn.js +2 -298
  48. package/dist/esm/core/authService/webauthnOidcHelpers.js +1 -24
  49. package/dist/esm/core/authService/webauthnWalletBinding.js +0 -37
  50. package/dist/esm/core/config.js +1 -95
  51. package/dist/esm/core/d1EcdsaSignerRead.js +1 -1
  52. package/dist/esm/core/d1IdentityStore.js +1 -2
  53. package/dist/esm/core/d1TenantStore.js +1 -24
  54. package/dist/esm/core/d1WalletAuthMethodStore.js +2 -5
  55. package/dist/esm/core/d1WalletStore.js +2 -2
  56. package/dist/esm/core/deviceLinking/linkedDeviceBootstrap.js +13 -0
  57. package/dist/esm/core/deviceLinking/linkedDeviceSession.js +20 -14
  58. package/dist/esm/core/deviceLinking/requestProof.js +9 -6
  59. package/dist/esm/core/emailOtpD1Statements.js +107 -94
  60. package/dist/esm/core/keyMaterialBrands.js +2 -12
  61. package/dist/esm/core/nearKeys.js +0 -1
  62. package/dist/esm/core/nearRelayerAccountProvisioning.js +6 -9
  63. package/dist/esm/core/passkeyCredentialClaims.js +8 -0
  64. package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +2 -6
  65. package/dist/esm/core/routerAbSigning/RouterAbNormalSigningRuntime.js +2 -30
  66. package/dist/esm/core/thresholdEcdsaChainTarget.js +1 -4
  67. package/dist/esm/hosted-wallet-gateway.js +66 -43
  68. package/dist/esm/index.js +6 -19
  69. package/dist/esm/localHostedWalletGatewayHandler.js +12 -0
  70. package/dist/esm/localRegistrationSetupAuthority.js +89 -0
  71. package/dist/esm/router/auth/authRequestValidation.js +8 -16
  72. package/dist/esm/router/auth/webAuthnCredentialCodecs.js +0 -1
  73. package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +87 -0
  74. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +12 -2
  75. package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +32 -281
  76. package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +24 -22
  77. package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +8 -6
  78. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +12 -13
  79. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEd25519ExportRootStore.js +6 -1
  80. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.js +12 -2
  81. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpTargetFactor.js +4 -4
  82. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
  83. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +3 -9
  84. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.js +2 -1
  85. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.js +89 -7
  86. package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +23 -14
  87. package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoCapabilityPersistence.js +9 -6
  88. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +0 -1
  89. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.js +0 -1
  90. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +1 -1
  91. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +0 -1
  92. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.js +1 -1
  93. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.js +1 -7
  94. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +19 -13
  95. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +0 -1
  96. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +0 -1
  97. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.js +2 -2
  98. package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.js +0 -1
  99. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.js +44 -12
  100. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.js +1 -49
  101. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +19 -31
  102. package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleRegistrationCompletion.js +85 -0
  103. package/dist/esm/router/cloudflare/d1/identity/d1IdentityRecords.js +0 -1
  104. package/dist/esm/router/cloudflare/d1/identity/d1IdentityService.js +0 -48
  105. package/dist/esm/router/cloudflare/d1/near/d1SponsoredNearAccount.js +242 -0
  106. package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +0 -1
  107. package/dist/esm/router/cloudflare/d1/oidc/d1OidcVerificationService.js +2 -29
  108. package/dist/esm/router/cloudflare/d1/oidc/googleOidcToken.js +41 -0
  109. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.js +5 -0
  110. package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +34 -0
  111. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +9 -3
  112. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +7 -13
  113. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +25 -13
  114. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationIntentService.js +0 -1
  115. package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +74 -0
  116. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +7 -1
  117. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +69 -238
  118. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +12 -56
  119. package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +155 -0
  120. package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +1 -3
  121. package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +12 -6
  122. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +68 -0
  123. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +7 -54
  124. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +9 -8
  125. package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +2 -142
  126. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +25 -4
  127. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +4 -70
  128. package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnStore.js +23 -7
  129. package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +1 -0
  130. package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -0
  131. package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +5 -0
  132. package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
  133. package/dist/esm/router/cloudflare/runtime/walletRuntimeOps.js +16 -4
  134. package/dist/esm/router/cloudflare-adaptor.js +1 -2
  135. package/dist/esm/router/cloudflare.js +1342 -1733
  136. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +11 -8
  137. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +3 -2
  138. package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.js +6 -6
  139. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +6 -6
  140. package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +3 -0
  141. package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +8 -0
  142. package/dist/esm/router/domains/emailOtp/emailOtpRequestValidation.js +0 -1
  143. package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +2 -8
  144. package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +2 -8
  145. package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +5 -19
  146. package/dist/esm/router/domains/signingOperations/walletExecutionAdmission.js +2 -3
  147. package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +70 -0
  148. package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +10 -11
  149. package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +2 -3
  150. package/dist/esm/router/domains/walletUnlock/walletUnlockRouteHandlers.js +14 -0
  151. package/dist/esm/router/express.js +574 -479
  152. package/dist/esm/router/framework/http.js +2 -0
  153. package/dist/esm/router/framework/registrationSetupDispatch.js +14 -0
  154. package/dist/esm/router/framework/ror/normalize.js +0 -1
  155. package/dist/esm/router/framework/ror/options.js +0 -1
  156. package/dist/esm/router/framework/ror/provider.js +0 -1
  157. package/dist/esm/router/framework/ror/staticProvider.js +0 -1
  158. package/dist/esm/router/framework/routeDefinitions.js +1 -2
  159. package/dist/esm/router/framework/routerApiWebhooks.js +0 -1
  160. package/dist/esm/router/ror.js +0 -1
  161. package/dist/esm/router/transport/fetch/createFetchRouter.js +0 -2
  162. package/dist/esm/router/transport/fetch/routes/auth.js +2 -0
  163. package/dist/esm/router/transport/fetch/routes/deviceLinking.js +36 -147
  164. package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +3 -2
  165. package/dist/esm/router/transport/fetch/routes/deviceLinkingResponses.js +130 -0
  166. package/dist/esm/router/transport/fetch/routes/ecdsaOperationStepUpFactor.js +171 -0
  167. package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +1 -0
  168. package/dist/esm/router/transport/fetch/routes/syncAccount.js +7 -2
  169. package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +19 -115
  170. package/dist/esm/router/transport/fetch/routes/walletRegistration.js +3 -1
  171. package/dist/esm/shared-ts/src/authorization/walletSessionIssuance.js +0 -1
  172. package/dist/esm/shared-ts/src/device-linking/authorityActivation.js +0 -2
  173. package/dist/esm/shared-ts/src/device-linking/contracts.js +16 -1
  174. package/dist/esm/shared-ts/src/device-linking/digests.js +1 -8
  175. package/dist/esm/shared-ts/src/near/actions.js +0 -1
  176. package/dist/esm/shared-ts/src/near/nearClient.js +0 -2
  177. package/dist/esm/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.js +1 -1
  178. package/dist/esm/shared-ts/src/signing-lanes/index.js +1 -6
  179. package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +1 -1
  180. package/dist/esm/shared-ts/src/signing-lanes/participantDigest.js +2 -81
  181. package/dist/esm/shared-ts/src/signing-lanes/participants.js +1 -219
  182. package/dist/esm/shared-ts/src/signing-lanes/recordParsers.js +0 -3
  183. package/dist/esm/shared-ts/src/tenant-root/tenantRootOperationRecord.js +1 -2
  184. package/dist/esm/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js +0 -1
  185. package/dist/esm/shared-ts/src/threshold/keyMaterialBrands.js +1 -22
  186. package/dist/esm/shared-ts/src/threshold/participants.js +0 -1
  187. package/dist/esm/shared-ts/src/threshold/signingRootScope.js +0 -1
  188. package/dist/esm/shared-ts/src/utils/addWalletAuthMethod.js +4 -13
  189. package/dist/esm/shared-ts/src/utils/canonicalPrimitives.js +1 -7
  190. package/dist/esm/shared-ts/src/utils/domainIds.js +1 -16
  191. package/dist/esm/shared-ts/src/utils/ecdsaCapabilityActivation.js +1 -11
  192. package/dist/esm/shared-ts/src/utils/ecdsaKeyFactsInventory.js +0 -1
  193. package/dist/esm/shared-ts/src/utils/errors.js +1 -19
  194. package/dist/esm/shared-ts/src/utils/near.js +1 -1
  195. package/dist/esm/shared-ts/src/utils/registrationEstablishedSession.js +1 -1
  196. package/dist/esm/shared-ts/src/utils/registrationIds.js +1 -5
  197. package/dist/esm/shared-ts/src/utils/registrationIntent.js +0 -1
  198. package/dist/esm/shared-ts/src/utils/registrationSetupOperation.js +8 -0
  199. package/dist/esm/shared-ts/src/utils/registrationSignerPlan.js +1 -1
  200. package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +0 -1
  201. package/dist/esm/shared-ts/src/utils/validation.js +1 -5
  202. package/dist/esm/shared-ts/src/utils/walletAuthAuthority.js +0 -1
  203. package/dist/esm/shared-ts/src/utils/walletManagementProtocol.js +6 -0
  204. package/dist/esm/shared-ts/src/utils/wireSchema.js +2 -13
  205. package/dist/esm/shared-ts/src/wallet-recovery/backupAcknowledgement.js +6 -24
  206. package/dist/esm/shared-ts/src/wallet-recovery/recoveryCodeLocator.js +0 -1
  207. package/dist/esm/shared-ts/src/wallet-recovery/recoveryKeyId.js +5 -6
  208. package/dist/esm/storage/d1Sql.js +1 -7
  209. package/dist/esm/threshold/session/signingSessionSeal/crypto/cipher.js +0 -1
  210. package/dist/esm/threshold/session/signingSessionSeal/guards/backends.js +1 -2
  211. package/dist/esm/threshold/session/signingSessionSeal/idempotencyBackends.js +0 -1
  212. package/dist/esm/threshold/session/signingSessionSeal/idempotencyRecords.js +0 -1
  213. package/dist/esm/threshold/session/signingSessionSeal/options.js +0 -1
  214. package/dist/esm/wasm/evm_crypto/pkg/evm_crypto_bg.wasm +0 -0
  215. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker.js +0 -611
  216. package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
  217. package/dist/esm/wasm/shamir3pass_runtime/pkg/shamir3pass_runtime_bg.wasm +0 -0
  218. package/dist/types/shared-ts/src/authorization/capabilityKinds.d.ts +0 -4
  219. package/dist/types/shared-ts/src/device-linking/contracts.d.ts +1 -0
  220. package/dist/types/shared-ts/src/signing-lanes/evmFamilySigningKeySlotId.d.ts +0 -2
  221. package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +0 -11
  222. package/dist/types/shared-ts/src/signing-lanes/ids.d.ts +2 -7
  223. package/dist/types/shared-ts/src/signing-lanes/index.d.ts +0 -4
  224. package/dist/types/shared-ts/src/signing-lanes/ownerContinuity.d.ts +0 -1
  225. package/dist/types/shared-ts/src/signing-lanes/participantDigest.d.ts +0 -18
  226. package/dist/types/shared-ts/src/signing-lanes/participants.d.ts +6 -35
  227. package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +6 -843
  228. package/dist/types/shared-ts/src/threshold/keyMaterialBrands.d.ts +0 -10
  229. package/dist/types/shared-ts/src/threshold/participants.d.ts +1 -1
  230. package/dist/types/shared-ts/src/utils/addWalletAuthMethod.d.ts +1 -133
  231. package/dist/types/shared-ts/src/utils/addWalletAuthMethod.typecheck.d.ts +4 -18
  232. package/dist/types/shared-ts/src/utils/domainIds.d.ts +0 -12
  233. package/dist/types/shared-ts/src/utils/errors.d.ts +0 -4
  234. package/dist/types/shared-ts/src/utils/near.d.ts +0 -20
  235. package/dist/types/shared-ts/src/utils/normalize.d.ts +0 -2
  236. package/dist/types/shared-ts/src/utils/registrationSetupOperation.d.ts +3 -0
  237. package/dist/types/shared-ts/src/utils/validation.d.ts +1 -3
  238. package/dist/types/shared-ts/src/utils/walletCapabilityBindings.d.ts +0 -1
  239. package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +3 -0
  240. package/dist/types/shared-ts/src/utils/wireSchema.d.ts +0 -2
  241. package/dist/types/shared-ts/src/wallet-recovery/backupAcknowledgement.d.ts +0 -1
  242. package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeReservation.d.ts +1 -10
  243. package/dist/types/shared-ts/src/wallet-recovery/recoveryCodes.d.ts +1 -3
  244. package/dist/types/shared-ts/src/wallet-recovery/recoveryKeyId.d.ts +5 -21
  245. package/dist/types/wallet-server/src/authorization/lifecycleRouting.d.ts +32 -0
  246. package/dist/types/wallet-server/src/authorization/lifecycleRouting.typecheck.d.ts +2 -0
  247. package/dist/types/wallet-server/src/authorization/recoveryRouting.d.ts +22 -0
  248. package/dist/types/wallet-server/src/authorization/recoveryRouting.typecheck.d.ts +2 -0
  249. package/dist/types/wallet-server/src/authorization/service.d.ts +8 -1
  250. package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +20 -0
  251. package/dist/types/wallet-server/src/authorization/sessionRouting.typecheck.d.ts +2 -0
  252. package/dist/types/wallet-server/src/cloud-host.d.ts +31 -9
  253. package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +1 -22
  254. package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +1 -79
  255. package/dist/types/wallet-server/src/core/IdentityStore.d.ts +0 -10
  256. package/dist/types/wallet-server/src/core/RegistrationCeremonyStore.d.ts +0 -1
  257. package/dist/types/wallet-server/src/core/ThresholdService/config.d.ts +0 -2
  258. package/dist/types/wallet-server/src/core/ThresholdService/index.d.ts +1 -3
  259. package/dist/types/wallet-server/src/core/ThresholdService/kv.d.ts +0 -7
  260. package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +0 -3
  261. package/dist/types/wallet-server/src/core/ThresholdService/routerAbNormalSigningPolicy.d.ts +0 -1
  262. package/dist/types/wallet-server/src/core/ThresholdService/stores/WalletSessionStore.d.ts +7 -19
  263. package/dist/types/wallet-server/src/core/ThresholdService/validation.d.ts +0 -34
  264. package/dist/types/wallet-server/src/core/WalletAuthMethodStore.d.ts +1 -5
  265. package/dist/types/wallet-server/src/core/WalletStore.d.ts +0 -3
  266. package/dist/types/wallet-server/src/core/WebAuthnAuthenticatorStore.d.ts +0 -20
  267. package/dist/types/wallet-server/src/core/WebAuthnCredentialBindingStore.d.ts +1 -27
  268. package/dist/types/wallet-server/src/core/WebAuthnLoginChallengeStore.d.ts +2 -16
  269. package/dist/types/wallet-server/src/core/WebAuthnSyncChallengeStore.d.ts +22 -14
  270. package/dist/types/wallet-server/src/core/authService/emailOtpConfig.d.ts +0 -24
  271. package/dist/types/wallet-server/src/core/authService/emailOtpEnrollment.d.ts +1 -70
  272. package/dist/types/wallet-server/src/core/authService/emailOtpSeal.d.ts +0 -13
  273. package/dist/types/wallet-server/src/core/authService/githubOAuth.d.ts +2 -1
  274. package/dist/types/wallet-server/src/core/authService/nearTransactions.d.ts +1 -39
  275. package/dist/types/wallet-server/src/core/authService/rateLimits.d.ts +0 -17
  276. package/dist/types/wallet-server/src/core/authService/webauthn.d.ts +0 -125
  277. package/dist/types/wallet-server/src/core/authService/webauthnOidcHelpers.d.ts +0 -3
  278. package/dist/types/wallet-server/src/core/authService/webauthnVerificationOutcomes.d.ts +1 -1
  279. package/dist/types/wallet-server/src/core/authService/webauthnWalletBinding.d.ts +0 -12
  280. package/dist/types/wallet-server/src/core/config.d.ts +0 -10
  281. package/dist/types/wallet-server/src/core/d1IdentityStore.d.ts +0 -2
  282. package/dist/types/wallet-server/src/core/d1TenantStore.d.ts +0 -7
  283. package/dist/types/wallet-server/src/core/d1WalletAuthMethodStore.d.ts +0 -1
  284. package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceBootstrap.d.ts +19 -0
  285. package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSession.d.ts +8 -6
  286. package/dist/types/wallet-server/src/core/deviceLinking/requestProof.d.ts +2 -5
  287. package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +10 -7
  288. package/dist/types/wallet-server/src/core/keyMaterialBrands.d.ts +1 -5
  289. package/dist/types/wallet-server/src/core/nearRelayerAccountProvisioning.d.ts +0 -1
  290. package/dist/types/wallet-server/src/core/passkeyCredentialClaims.d.ts +9 -0
  291. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +0 -2
  292. package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbNormalSigningRuntime.d.ts +0 -2
  293. package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +1 -92
  294. package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.typecheck.d.ts +4 -52
  295. package/dist/types/wallet-server/src/core/thresholdEcdsaChainTarget.d.ts +0 -1
  296. package/dist/types/wallet-server/src/core/types.d.ts +0 -299
  297. package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +15 -3
  298. package/dist/types/wallet-server/src/index.d.ts +8 -13
  299. package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +13 -0
  300. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +23 -0
  301. package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +25 -3
  302. package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +1 -1
  303. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +3 -1
  304. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.d.ts +7 -1
  305. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.d.ts +1 -10
  306. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.d.ts +4 -0
  307. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.d.ts +6 -0
  308. package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.d.ts +1 -13
  309. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.d.ts +2 -2
  310. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -1
  311. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.d.ts +0 -2
  312. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +18 -2
  313. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationAttemptStore.d.ts +29 -1
  314. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpRegistrationRecords.d.ts +3 -16
  315. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.d.ts +7 -2
  316. package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1GoogleRegistrationCompletion.d.ts +23 -0
  317. package/dist/types/wallet-server/src/router/cloudflare/d1/identity/d1IdentityService.d.ts +0 -12
  318. package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1SponsoredNearAccount.d.ts +24 -0
  319. package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1SponsoredNearAccount.typecheck.d.ts +2 -0
  320. package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/d1OidcVerificationService.d.ts +0 -1
  321. package/dist/types/wallet-server/src/router/cloudflare/d1/oidc/googleOidcToken.d.ts +4 -0
  322. package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.d.ts +5 -0
  323. package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +9 -0
  324. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +1 -1
  325. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.d.ts +10 -11
  326. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +3 -2
  327. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +51 -0
  328. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +3 -0
  329. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +30 -47
  330. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetup.d.ts +3 -30
  331. package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +11 -0
  332. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.d.ts +27 -0
  333. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +1 -10
  334. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +2 -2
  335. package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +0 -4
  336. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.d.ts +3 -0
  337. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnRecords.d.ts +0 -13
  338. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnStore.d.ts +23 -10
  339. package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnStore.typecheck.d.ts +2 -0
  340. package/dist/types/wallet-server/src/router/cloudflare/runtime/cloudflare.types.d.ts +0 -2
  341. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -0
  342. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +2 -0
  343. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +1 -1
  344. package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRuntimeOps.d.ts +3 -0
  345. package/dist/types/wallet-server/src/router/cloudflare-adaptor.d.ts +0 -1
  346. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +1 -1
  347. package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitioning.d.ts +2 -2
  348. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +2 -2
  349. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.typecheck.d.ts +2 -0
  350. package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.d.ts +2 -0
  351. package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.d.ts +2 -0
  352. package/dist/types/wallet-server/src/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.d.ts +0 -2
  353. package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +0 -3
  354. package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbPrivateSigningWorker.d.ts +0 -17
  355. package/dist/types/wallet-server/src/router/domains/signingOperations/walletExecutionAdmission.d.ts +1 -2
  356. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +1 -0
  357. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +51 -0
  358. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +2 -10
  359. package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationSetupPayload.d.ts +2 -2
  360. package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +14 -34
  361. package/dist/types/wallet-server/src/router/framework/googleLoginResolution.typecheck.d.ts +2 -0
  362. package/dist/types/wallet-server/src/router/framework/registrationSetupDispatch.d.ts +13 -0
  363. package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinking.d.ts +1 -1
  364. package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinkingResponses.d.ts +17 -0
  365. package/dist/types/wallet-server/src/router/transport/fetch/routes/ecdsaOperationStepUpFactor.d.ts +37 -0
  366. package/dist/types/wallet-server/src/storage/d1Sql.d.ts +0 -1
  367. package/migrations/d1-signer/0040_namespace_home_challenges.sql +16 -0
  368. package/migrations/d1-signer/0041_step_up_admission_expiry.sql +28 -0
  369. package/migrations/d1-signer/0042_deployment_resource_challenges.sql +4 -0
  370. package/migrations/d1-signer/0043_google_registration_candidate_claim.sql +2 -0
  371. package/migrations/d1-signer/0044_linked_device_bootstrap_imports.sql +6 -0
  372. package/migrations/d1-signer/0045_wallet_owned_capability_receipts.sql +29 -0
  373. package/migrations/d1-signer/0046_wallet_owned_signing_abuse.sql +41 -0
  374. package/migrations/d1-signer/0047_remove_unused_near_public_keys.sql +2 -0
  375. package/migrations/d1-signer/0048_operation_owner_scope.sql +45 -0
  376. package/package.json +2 -3
  377. package/src/README.md +11 -3
  378. package/dist/esm/core/AuthService.js +0 -2
  379. package/dist/esm/core/NearPublicKeyStore.js +0 -200
  380. package/dist/esm/core/ThresholdService/stores/CloudflareDurableObjectStore.js +0 -397
  381. package/dist/esm/core/ThresholdService/stores/KeyStore.js +0 -140
  382. package/dist/esm/core/ThresholdService/stores/SessionStore.js +0 -361
  383. package/dist/esm/core/ThresholdService/stores/StoreConfig.js +0 -13
  384. package/dist/esm/core/ThresholdService/stores/exportReplayGuard.js +0 -7
  385. package/dist/esm/core/authService/AuthService.js +0 -594
  386. package/dist/esm/core/authService/bytes.js +0 -19
  387. package/dist/esm/core/authService/configValues.js +0 -15
  388. package/dist/esm/core/authService/emailOtpChallengeOperations.js +0 -123
  389. package/dist/esm/core/authService/emailOtpChallengeProof.js +0 -183
  390. package/dist/esm/core/authService/emailOtpChallengeVerification.js +0 -264
  391. package/dist/esm/core/authService/emailOtpChallenges.js +0 -225
  392. package/dist/esm/core/authService/emailOtpDelivery.js +0 -134
  393. package/dist/esm/core/authService/emailOtpGrant.js +0 -43
  394. package/dist/esm/core/authService/emailOtpRegistrationEnrollment.js +0 -144
  395. package/dist/esm/core/authService/emailOtpUnlock.js +0 -174
  396. package/dist/esm/core/authService/googleEmailOtpOperations.js +0 -141
  397. package/dist/esm/core/authService/googleEmailOtpRegistration.js +0 -587
  398. package/dist/esm/core/authService/identity.js +0 -42
  399. package/dist/esm/core/authService/identityOperations.js +0 -32
  400. package/dist/esm/core/authService/nearAccountOperations.js +0 -229
  401. package/dist/esm/core/authService/nearPublicKeyMetadata.js +0 -108
  402. package/dist/esm/core/authService/oidcVerification.js +0 -249
  403. package/dist/esm/core/authService/registrationThresholdHelpers.js +0 -30
  404. package/dist/esm/core/authService/runtime.js +0 -45
  405. package/dist/esm/core/authService/storeRegistry.js +0 -102
  406. package/dist/esm/core/authService/thresholdStoreSummary.js +0 -32
  407. package/dist/esm/core/authService/webauthnAuthority.js +0 -17
  408. package/dist/esm/core/defaultConfigsServer.js +0 -9
  409. package/dist/esm/core/hostedAccountIds.js +0 -225
  410. package/dist/esm/core/routerAbSigning/createRouterAbSigningRuntimes.js +0 -84
  411. package/dist/esm/core/signingLanes/LaneAggregateRevocationApplicationService.js +0 -86
  412. package/dist/esm/core/signingLanes/LaneEnrollmentActivation.js +0 -324
  413. package/dist/esm/core/signingLanes/LaneEnrollmentRevocation.js +0 -173
  414. package/dist/esm/core/signingLanes/LaneLifecycleApplicationService.js +0 -198
  415. package/dist/esm/core/signingLanes/ecdsaServerRetirement.js +0 -73
  416. package/dist/esm/core/signingLanes/ed25519ServerRetirement.js +0 -68
  417. package/dist/esm/core/signingLanes/signingWorkerLaneMaterialIdentity.js +0 -0
  418. package/dist/esm/core/storeBackends.js +0 -208
  419. package/dist/esm/core/utils.js +0 -14
  420. package/dist/esm/core/webAuthnStoreBackends.js +0 -198
  421. package/dist/esm/router/cloudflare/d1/near/d1NearPublicKeyStore.js +0 -49
  422. package/dist/esm/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.js +0 -10
  423. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.js +0 -22
  424. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.js +0 -166
  425. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.js +0 -38
  426. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.js +0 -20
  427. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.js +0 -1459
  428. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneLockStore.js +0 -114
  429. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.js +0 -16
  430. package/dist/esm/router/cloudflare/d1/signingLanes/d1LaneRecords.js +0 -171
  431. package/dist/esm/router/cloudflare/d1/signingLanes/index.js +0 -10
  432. package/dist/esm/router/cloudflare/durableObjects/thresholdStore.js +0 -397
  433. package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.js +0 -597
  434. package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.js +0 -273
  435. package/dist/esm/router/cloudflare/signingLanes/index.js +0 -4
  436. package/dist/esm/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.js +0 -32
  437. package/dist/esm/router/transport/fetch/routes/nearPublicKeys.js +0 -27
  438. package/dist/esm/shared-ts/src/signing-lanes/rotation.js +0 -8
  439. package/dist/esm/shared-ts/src/signing-lanes/rotationDigests.js +0 -358
  440. package/dist/esm/shared-ts/src/signing-lanes/rotationLifecycle.js +0 -313
  441. package/dist/esm/shared-ts/src/signing-lanes/rotationParsers.js +0 -532
  442. package/dist/esm/shared-ts/src/signing-lanes/rotationProtocolParsers.js +0 -323
  443. package/dist/esm/shared-ts/src/signing-lanes/rotationWireFields.js +0 -59
  444. package/dist/types/shared-ts/src/signing-lanes/participantDigest.typecheck.d.ts +0 -2
  445. package/dist/types/shared-ts/src/signing-lanes/rotation.typecheck.d.ts +0 -2
  446. package/dist/types/shared-ts/src/signing-lanes/rotationDigests.d.ts +0 -13
  447. package/dist/types/shared-ts/src/signing-lanes/rotationLifecycle.d.ts +0 -78
  448. package/dist/types/shared-ts/src/signing-lanes/rotationParsers.d.ts +0 -27
  449. package/dist/types/shared-ts/src/signing-lanes/rotationProtocolParsers.d.ts +0 -6
  450. package/dist/types/shared-ts/src/signing-lanes/rotationWireFields.d.ts +0 -20
  451. package/dist/types/shared-ts/src/wallet-recovery/recoveryCodeAttempt.d.ts +0 -59
  452. package/dist/types/wallet-server/src/core/AuthService.d.ts +0 -3
  453. package/dist/types/wallet-server/src/core/NearPublicKeyStore.d.ts +0 -48
  454. package/dist/types/wallet-server/src/core/ThresholdService/stores/CloudflareDurableObjectStore.d.ts +0 -21
  455. package/dist/types/wallet-server/src/core/ThresholdService/stores/KeyStore.d.ts +0 -40
  456. package/dist/types/wallet-server/src/core/ThresholdService/stores/SessionStore.d.ts +0 -98
  457. package/dist/types/wallet-server/src/core/ThresholdService/stores/StoreConfig.d.ts +0 -4
  458. package/dist/types/wallet-server/src/core/ThresholdService/stores/ThresholdStoreConfig.typecheck.d.ts +0 -2
  459. package/dist/types/wallet-server/src/core/ThresholdService/stores/exportReplayGuard.d.ts +0 -3
  460. package/dist/types/wallet-server/src/core/authService/AuthService.d.ts +0 -490
  461. package/dist/types/wallet-server/src/core/authService/bytes.d.ts +0 -3
  462. package/dist/types/wallet-server/src/core/authService/configValues.d.ts +0 -7
  463. package/dist/types/wallet-server/src/core/authService/emailOtpChallengeOperations.d.ts +0 -109
  464. package/dist/types/wallet-server/src/core/authService/emailOtpChallengeProof.d.ts +0 -169
  465. package/dist/types/wallet-server/src/core/authService/emailOtpChallengeVerification.d.ts +0 -47
  466. package/dist/types/wallet-server/src/core/authService/emailOtpChallenges.d.ts +0 -86
  467. package/dist/types/wallet-server/src/core/authService/emailOtpDelivery.d.ts +0 -66
  468. package/dist/types/wallet-server/src/core/authService/emailOtpGrant.d.ts +0 -43
  469. package/dist/types/wallet-server/src/core/authService/emailOtpRegistrationEnrollment.d.ts +0 -49
  470. package/dist/types/wallet-server/src/core/authService/emailOtpUnlock.d.ts +0 -64
  471. package/dist/types/wallet-server/src/core/authService/googleEmailOtpOperations.d.ts +0 -126
  472. package/dist/types/wallet-server/src/core/authService/googleEmailOtpRegistration.d.ts +0 -169
  473. package/dist/types/wallet-server/src/core/authService/identity.d.ts +0 -25
  474. package/dist/types/wallet-server/src/core/authService/identityOperations.d.ts +0 -19
  475. package/dist/types/wallet-server/src/core/authService/nearAccountOperations.d.ts +0 -55
  476. package/dist/types/wallet-server/src/core/authService/nearPublicKeyMetadata.d.ts +0 -44
  477. package/dist/types/wallet-server/src/core/authService/oidcVerification.d.ts +0 -66
  478. package/dist/types/wallet-server/src/core/authService/registrationThresholdHelpers.d.ts +0 -11
  479. package/dist/types/wallet-server/src/core/authService/runtime.d.ts +0 -20
  480. package/dist/types/wallet-server/src/core/authService/storeRegistry.d.ts +0 -53
  481. package/dist/types/wallet-server/src/core/authService/thresholdStoreSummary.d.ts +0 -3
  482. package/dist/types/wallet-server/src/core/authService/webauthnAuthority.d.ts +0 -5
  483. package/dist/types/wallet-server/src/core/defaultConfigsServer.d.ts +0 -5
  484. package/dist/types/wallet-server/src/core/hostedAccountIds.d.ts +0 -16
  485. package/dist/types/wallet-server/src/core/routerAbSigning/createRouterAbSigningRuntimes.d.ts +0 -16
  486. package/dist/types/wallet-server/src/core/signingLanes/LaneAggregateRevocationApplicationService.d.ts +0 -36
  487. package/dist/types/wallet-server/src/core/signingLanes/LaneEffectJournalStore.d.ts +0 -62
  488. package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentActivation.d.ts +0 -13
  489. package/dist/types/wallet-server/src/core/signingLanes/LaneEnrollmentRevocation.d.ts +0 -24
  490. package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleApplicationService.d.ts +0 -141
  491. package/dist/types/wallet-server/src/core/signingLanes/LaneLifecycleStore.d.ts +0 -228
  492. package/dist/types/wallet-server/src/core/signingLanes/ecdsaServerRetirement.d.ts +0 -58
  493. package/dist/types/wallet-server/src/core/signingLanes/ed25519ServerRetirement.d.ts +0 -30
  494. package/dist/types/wallet-server/src/core/signingLanes/signingWorkerLaneMaterialIdentity.d.ts +0 -4
  495. package/dist/types/wallet-server/src/core/storeBackends.d.ts +0 -83
  496. package/dist/types/wallet-server/src/core/utils.d.ts +0 -3
  497. package/dist/types/wallet-server/src/core/webAuthnStoreBackends.d.ts +0 -96
  498. package/dist/types/wallet-server/src/router/cloudflare/d1/near/d1NearPublicKeyStore.d.ts +0 -29
  499. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1EcdsaLanePrivateBindingResolver.d.ts +0 -4
  500. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneAggregateRevocationApplicationService.d.ts +0 -4
  501. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEffectJournalStore.d.ts +0 -24
  502. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneEnrollmentGateway.d.ts +0 -20
  503. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleApplicationService.d.ts +0 -13
  504. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLifecycleStore.d.ts +0 -51
  505. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneLockStore.d.ts +0 -28
  506. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneProtocolCommitter.d.ts +0 -5
  507. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/d1LaneRecords.d.ts +0 -107
  508. package/dist/types/wallet-server/src/router/cloudflare/d1/signingLanes/index.d.ts +0 -10
  509. package/dist/types/wallet-server/src/router/cloudflare/durableObjects/thresholdStore.d.ts +0 -18
  510. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.d.ts +0 -217
  511. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.d.ts +0 -73
  512. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/index.d.ts +0 -4
  513. package/dist/types/wallet-server/src/router/cloudflare/signingLanes/linkedDeviceEd25519CeremonyBinding.d.ts +0 -6
  514. package/dist/types/wallet-server/src/router/transport/fetch/routes/nearPublicKeys.d.ts +0 -3
  515. /package/dist/esm/{core/signingLanes/LaneEffectJournalStore.js → authorization/recoveryRouting.js} +0 -0
  516. /package/dist/esm/{core/signingLanes/LaneLifecycleStore.js → authorization/sessionRouting.js} +0 -0
@@ -14,14 +14,15 @@ import { computeCommittedSignerPackageSetDigestB64u, parseCommittedAuthorityPack
14
14
  import { unknownWebAuthnAuthenticatorDeviceInfo } from "../../../../shared-ts/src/utils/webauthnDeviceInfo.js";
15
15
  import { assertLinkedDeviceWalletSessionCredentialDeliveryIntegrityV1, buildLinkedDeviceWalletSessionCredentialDeliveryBindingV1, computeLinkedDeviceActivationCleanupReceiptDigestB64u, computeLinkedDeviceWalletSessionCredentialDeliveryAadDigestB64u, computeLinkedDeviceWalletSessionCredentialEnvelopeDigestB64u, encodeLinkedDeviceWalletSessionCredentialDeliveryAadV1, parseLinkedDeviceActivationCleanupReceiptV1, parseLinkedDeviceWalletSessionCredentialDeliveryV1 } from "../../../../shared-ts/src/device-linking/walletSessionCredentialDelivery.js";
16
16
  import { parseLocalAuthorityActivationFinalAckV1 } from "../../../../shared-ts/src/device-linking/authorityActivation.js";
17
- import { computeWalletSessionInstallationReceiptDigestB64u, computeWalletSessionOperationCredentialDigestB64u } from "../../../../shared-ts/src/device-linking/digests.js";
17
+ import { computeWalletSessionInstallationReceiptDigestB64u } from "../../../../shared-ts/src/device-linking/digests.js";
18
18
  import { computeLinkedDevicePublicKeyDigestV1 } from "../../../../shared-ts/src/device-linking/requestProof.js";
19
- import { buildPersistedActiveWalletSessionAuthorizationV2, walletSessionAuthorizationV2RecordsEqual } from "../../../../authorization/domain.js";
19
+ import { walletSessionAuthorizationV2RecordsEqual } from "../../../../authorization/domain.js";
20
20
  import { secureRandomBase64Url } from "../../../../shared-ts/src/utils/secureRandomId.js";
21
21
  import { EcdsaMaterialReadSnapshot } from "../../../../core/ecdsaMaterialReadSnapshot.js";
22
22
  import { parseD1JsonColumn } from "../../../../storage/d1Sql.js";
23
23
  import { parseWalletEcdsaSignerRows, prepareWalletEcdsaSignersRead } from "../../../../core/d1EcdsaSignerRead.js";
24
24
  import "../../../../core/deviceLinking/requestProof.js";
25
+ import { reservePasskeyCredential } from "../../../../core/passkeyCredentialClaims.js";
25
26
  import { prepareD1WebAuthnCredentialBindingInsertStatement } from "../../../../core/WebAuthnCredentialBindingStore.js";
26
27
  import { prepareD1WebAuthnAuthenticatorInsertStatement } from "../webauthn/d1WebAuthnStore.js";
27
28
  import { findInstalledEcdsaAuthority, installedEcdsaAuthorityChain, projectInstalledEcdsaAuthority } from "./installedEcdsaAuthority.js";
@@ -257,6 +258,7 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
257
258
  const activeAuthority = await buildActiveAuthority(authority, receipt.installedAtMs);
258
259
  const activeAuthMethod = buildActiveAuthMethod(authMethod, receipt.installedAtMs);
259
260
  const passkeyCredentialStatements = await buildPasskeyCredentialPromotionStatements({
261
+ credentialClaims: this.options.credentialClaims,
260
262
  database: this.options.database,
261
263
  scope: this.options.scope,
262
264
  listWalletEd25519Signers: this.options.listWalletEd25519Signers,
@@ -279,17 +281,9 @@ var D1LinkedDeviceAuthorityInstallServiceV1 = class {
279
281
  nowMs
280
282
  });
281
283
  const preparedWalletSession = await this.options.authorizationService.prepareWalletSessionAuthorizationV2(this.buildWalletSessionAuthorizationInput(activeAuthority, activeAuthMethod, receipt.installedAtMs));
282
- const operationCredential = {
283
- kind: "opaque_wallet_session_operation_credential_v1",
284
- token: `wst_${secureRandomBase64Url(32, "linked-device Wallet Session operation credential")}`,
285
- walletSessionId: preparedWalletSession.session.walletSessionId
286
- };
287
- const credentialDigestB64u = await computeWalletSessionOperationCredentialDigestB64u(operationCredential);
288
- const walletSessionStatements = this.options.authorizationStore.prepareDirectWalletSessionAuthorizationV2Statements(buildPersistedActiveWalletSessionAuthorizationV2({
289
- session: preparedWalletSession.session,
290
- quota: preparedWalletSession.quota,
291
- primaryOperationCredentialDigestB64u: credentialDigestB64u
292
- }));
284
+ const { operationCredential, persisted } = await this.options.authorizationService.prepareDirectWalletSessionCredential(preparedWalletSession);
285
+ const credentialDigestB64u = persisted.primaryOperationCredentialDigestB64u;
286
+ const walletSessionStatements = this.options.authorizationStore.prepareDirectWalletSessionAuthorizationV2Statements(persisted);
293
287
  const installationReceiptDigestB64u = await computeWalletSessionInstallationReceiptDigestB64u(receipt);
294
288
  const sealedDelivery = await sealLinkedDeviceWalletSessionCredentialV1({
295
289
  scope: this.options.scope,
@@ -1413,6 +1407,11 @@ function buildActiveAuthMethod(pending, activatedAtMs) {
1413
1407
  }
1414
1408
  async function buildPasskeyCredentialPromotionStatements(input) {
1415
1409
  if (input.authMethod.kind !== "passkey") return [];
1410
+ await reservePasskeyCredential(input.credentialClaims, {
1411
+ walletId: input.authMethod.walletId,
1412
+ rpId: input.authMethod.rpId,
1413
+ credentialIdB64u: input.authMethod.credentialIdB64u
1414
+ });
1416
1415
  const signer = await resolveLinkedDeviceEd25519Signer({
1417
1416
  authority: input.authority,
1418
1417
  listWalletEd25519Signers: input.listWalletEd25519Signers
@@ -13,7 +13,12 @@ var D1LinkedDeviceEd25519ExportRootStoreV1 = class {
13
13
  namespace, org_id, project_id, env_id, link_session_id,
14
14
  wallet_id, enrollment_id, device_id, state, transfer_alg,
15
15
  recipient_public_key_b64u, recipient_json, registered_at_ms
16
- ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 'recipient_registered', ?9, ?10, ?11, ?12)`).bind(...scopeValues(this.scope), String(recipient.linkSessionId), String(recipient.walletId), String(recipient.enrollmentId), String(recipient.deviceId), "x25519-hkdf-sha256-chacha20poly1305-v1", String(recipient.recipientPublicKeyB64u), JSON.stringify(recipient), recipient.registeredAtMs).run()) === 1) return { outcome: "applied" };
16
+ ) SELECT ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 'recipient_registered', ?9, ?10, ?11, ?12
17
+ FROM linked_device_sessions
18
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
19
+ AND link_session_id = ?5
20
+ AND state IN ('awaiting_target_factor', 'awaiting_source_contribution',
21
+ 'provisioning', 'authority_pending_local_install', 'active')`).bind(...scopeValues(this.scope), String(recipient.linkSessionId), String(recipient.walletId), String(recipient.enrollmentId), String(recipient.deviceId), "x25519-hkdf-sha256-chacha20poly1305-v1", String(recipient.recipientPublicKeyB64u), JSON.stringify(recipient), recipient.registeredAtMs).run()) === 1) return { outcome: "applied" };
17
22
  const existing = await this.readRowV1(String(recipient.linkSessionId));
18
23
  if (!existing) return {
19
24
  outcome: "conflict",
@@ -1,3 +1,4 @@
1
+ import { d1ChangedRows } from "../../../../storage/d1Sql.js";
1
2
  import { SESSION_CAS_GUARD_SQL } from "./d1LinkedDeviceSessionStore.js";
2
3
  import { parseLinkedDeviceEmailOtpGrantRecordV1 } from "../../../../core/deviceLinking/linkedDeviceEmailOtpGrant.js";
3
4
  //#region src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceEmailOtpGrantStore.ts
@@ -18,7 +19,7 @@ var D1LinkedDeviceEmailOtpGrantStoreV1 = class {
18
19
  async issueV1(record) {
19
20
  const parsed = parseLinkedDeviceEmailOtpGrantRecordV1(record);
20
21
  if (parsed.state.kind !== "issued") throw new Error("a linked-device email OTP grant is only ever inserted as issued");
21
- await this.database.prepare(`INSERT INTO ${GRANT_TABLE} (
22
+ if (d1ChangedRows(await this.database.prepare(`INSERT INTO ${GRANT_TABLE} (
22
23
  namespace, org_id, project_id, env_id, grant_id,
23
24
  grant_token_digest_b64u, wallet_id, link_session_id, enrollment_id,
24
25
  device_id, target_factor, target_preparation_digest_b64u,
@@ -27,7 +28,16 @@ var D1LinkedDeviceEmailOtpGrantStoreV1 = class {
27
28
  base_wallet_auth_method_id, linked_owner_auth_method_id,
28
29
  authority_digest_b64u, challenge_id, state, record_json,
29
30
  issued_at_ms, expires_at_ms, consumed_at_ms
30
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'email_otp', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'issued', ?, ?, ?, NULL)`).bind(...scopeValues(this.scope), parsed.grantId, parsed.grantTokenDigestB64u, String(parsed.walletId), String(parsed.linkSessionId), String(parsed.enrollmentId), String(parsed.deviceId), parsed.targetPreparationDigestB64u, parsed.targetEmail, parsed.enrollment.kind, parsed.emailHashHex, parsed.registrationAuthorityId, parsed.providerUserId, parsed.baseWalletAuthMethodId ?? null, String(parsed.walletAuthMethodId), parsed.authorityDigestB64u, parsed.challengeId, serializeGrantForD1(parsed), parsed.issuedAtMs, parsed.expiresAtMs).run();
31
+ ) SELECT ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, 'email_otp',
32
+ ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, 'issued', ?21, ?22, ?23, NULL
33
+ FROM linked_device_sessions
34
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
35
+ AND link_session_id = ?8 AND state = 'awaiting_target_factor'`).bind(...scopeValues(this.scope), parsed.grantId, parsed.grantTokenDigestB64u, String(parsed.walletId), String(parsed.linkSessionId), String(parsed.enrollmentId), String(parsed.deviceId), parsed.targetPreparationDigestB64u, parsed.targetEmail, parsed.enrollment.kind, parsed.emailHashHex, parsed.registrationAuthorityId, parsed.providerUserId, parsed.baseWalletAuthMethodId ?? null, String(parsed.walletAuthMethodId), parsed.authorityDigestB64u, parsed.challengeId, serializeGrantForD1(parsed), parsed.issuedAtMs, parsed.expiresAtMs).run()) === 1) return { kind: "issued" };
36
+ return {
37
+ kind: "refused",
38
+ code: "link_session_inactive",
39
+ message: "linked-device session no longer accepts Email OTP grants"
40
+ };
31
41
  }
32
42
  async readByIdV1(grantId) {
33
43
  const row = await this.database.prepare(`SELECT json_set(
@@ -177,7 +177,8 @@ var D1LinkedDeviceEmailOtpTargetFactorV1 = class {
177
177
  code: sealed.code,
178
178
  message: sealed.message
179
179
  };
180
- await this.options.grants.issueV1(grantRecord);
180
+ const issued = await this.options.grants.issueV1(grantRecord);
181
+ if (issued.kind === "refused") return issued;
181
182
  return {
182
183
  kind: "verified",
183
184
  grant: {
@@ -264,7 +265,8 @@ var D1LinkedDeviceEmailOtpTargetFactorV1 = class {
264
265
  issuedAtMs,
265
266
  expiresAtMs
266
267
  });
267
- await this.options.grants.issueV1(grantRecord);
268
+ const issued = await this.options.grants.issueV1(grantRecord);
269
+ if (issued.kind === "refused") return issued;
268
270
  return {
269
271
  kind: "verified",
270
272
  grant: {
@@ -409,7 +411,6 @@ var D1LinkedDeviceEmailOtpTargetFactorV1 = class {
409
411
  kind: "existing_enrollment",
410
412
  resolved,
411
413
  targetEmail,
412
- enrollment: { kind: "existing_enrollment" },
413
414
  targetPreparationDigestB64u,
414
415
  walletAuthMethodId,
415
416
  authorityDigestB64u: await computeLinkedDeviceEmailOtpAuthorityDigestV1({
@@ -448,7 +449,6 @@ var D1LinkedDeviceEmailOtpTargetFactorV1 = class {
448
449
  return {
449
450
  kind: "new_enrollment",
450
451
  targetEmail,
451
- enrollment: { kind: "new_enrollment" },
452
452
  targetPreparationDigestB64u,
453
453
  walletAuthMethodId,
454
454
  authorityDigestB64u: await computeLinkedDeviceEmailOtpAuthorityDigestV1({
@@ -11,9 +11,9 @@ import { buildEmailOtpWalletAuthAuthority, buildPasskeyWalletAuthAuthority, wall
11
11
  import { walletAuthorityDigestsMatchV1 } from "../../../../shared-ts/src/authorization/walletAuthority.js";
12
12
  import { buildWalletSessionLinkedDeviceOwnerAuthorizationV1, parseQrLinkedDeviceSessionPayloadV5 } from "../../../../shared-ts/src/device-linking/parsers.js";
13
13
  import { computeLinkedDevicePublicKeyDigestV1 } from "../../../../shared-ts/src/device-linking/requestProof.js";
14
- import { thresholdEd25519AuthorityScopeFromWalletAuthAuthority } from "../../../../core/ThresholdService/validation.js";
15
14
  import { resolveActiveOwnerWalletExecutionLane, resolveWalletAuthMethodIdForAuthority } from "../../../../core/signingLanes/WalletExecutionLaneProjection.js";
16
15
  import "../../../../core/deviceLinking/requestProof.js";
16
+ import { thresholdEd25519AuthorityScopeFromWalletAuthAuthority } from "../../../../core/ThresholdService/validation.js";
17
17
  import { sourceKeyManifestDigestForFamilyV1 } from "../../../../core/deviceLinking/linkedDeviceSessionRecord.js";
18
18
  import { LinkedDeviceSourceFamilyUnavailableErrorV1 } from "./d1LinkedDeviceVerifiedLinkSourceReader.js";
19
19
  import { linkedDeviceSignerManifestsEqualV1 } from "./d1LinkedDeviceVerifiedLinkBuilder.js";
@@ -1,7 +1,7 @@
1
1
  import { parseLinkDeviceSessionId } from "../../../../shared-ts/src/utils/domainIds.js";
2
2
  import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
3
3
  import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
4
- import { requireCanonicalString } from "../../../../shared-ts/src/utils/validation.js";
4
+ import { isObject, requireCanonicalString } from "../../../../shared-ts/src/utils/validation.js";
5
5
  import { d1ChangedRows } from "../../../../storage/d1Sql.js";
6
6
  //#region src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.ts
7
7
  const NONCE_TABLE = "linked_device_request_proof_nonces";
@@ -12,14 +12,7 @@ var D1LinkedDeviceRequestProofNonceStoreV1 = class {
12
12
  this.scope = normalizeScope(options.scope);
13
13
  }
14
14
  async consumeRequestProofNonceV1(input) {
15
- const normalized = parseNonceRecord({
16
- linkSessionId: input.linkSessionId,
17
- requestNonceB64u: input.requestNonceB64u,
18
- proofDigestB64u: input.proofDigestB64u,
19
- issuedAtMs: input.issuedAtMs,
20
- expiresAtMs: input.expiresAtMs,
21
- consumedAtMs: input.consumedAtMs
22
- });
15
+ const normalized = parseNonceRecord(input);
23
16
  await this.pruneExpiredNoncesV1(normalized.consumedAtMs);
24
17
  try {
25
18
  if (d1ChangedRows(await this.database.prepare(`INSERT INTO ${NONCE_TABLE} (
@@ -60,6 +53,7 @@ var D1LinkedDeviceRequestProofNonceStoreV1 = class {
60
53
  }
61
54
  };
62
55
  function parseNonceRecord(raw) {
56
+ if (!isObject(raw)) throw new Error("Invalid device request nonce");
63
57
  const linkSessionId = parseSessionId(raw.linkSessionId);
64
58
  const requestNonceB64u = parseFixedB64u(raw.requestNonceB64u, "requestNonceB64u");
65
59
  const proofDigestB64u = parseDigest(raw.proofDigestB64u, "proofDigestB64u");
@@ -8,12 +8,13 @@ import { D1LinkedDeviceSessionStoreV1 } from "./d1LinkedDeviceSessionStore.js";
8
8
  //#region src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRouteService.ts
9
9
  function createD1LinkedDeviceRouteServiceV1(options) {
10
10
  const nowV1 = options.nowV1 ?? Date.now;
11
- const proofVerifier = new LinkedDeviceRequestProofVerifierV1({ nonceStore: new D1LinkedDeviceRequestProofNonceStoreV1({
11
+ const proofVerifier = new LinkedDeviceRequestProofVerifierV1({ nonceStore: options.proofNonces ?? new D1LinkedDeviceRequestProofNonceStoreV1({
12
12
  database: options.database,
13
13
  scope: options.scope
14
14
  }) });
15
15
  const { sessionService } = createD1LinkedDeviceSessionServiceV1({
16
16
  sessionStore: new D1LinkedDeviceSessionStoreV1({
17
+ bootstrap: options.bootstrap,
17
18
  database: options.database,
18
19
  scope: options.scope,
19
20
  now: nowV1
@@ -3,6 +3,7 @@ import { assertNeverLinkSessionStateV1 } from "../../../../shared-ts/src/device-
3
3
  import { parseLinkedDeviceApprovalV1, parseLinkedDeviceSessionClaimV1 } from "../../../../shared-ts/src/device-linking/parsers.js";
4
4
  import { computeLinkedDeviceApprovalDigestV1, computeLinkedDeviceSessionClaimDigestV1 } from "../../../../shared-ts/src/device-linking/digests.js";
5
5
  import { d1ChangedRows, queryD1All } from "../../../../storage/d1Sql.js";
6
+ import { requireLinkedDeviceBootstrapRecord } from "../../../../core/deviceLinking/linkedDeviceBootstrap.js";
6
7
  import { LinkedDeviceRetiredSessionShapeErrorV1, approvalTranscriptMatchesDigest, claimTranscriptMatchesDigest, conflictResult, integrityResult, invalidStateResult, isPrecommitState, linkedDeviceEmailOtpChallengesEqualV1, linkedDeviceQrPayloadsEqualV1, parseLinkedDeviceSessionRecordV1, sessionExpiryMsV1, sourceContributionTranscriptMatchesDigest } from "../../../../core/deviceLinking/linkedDeviceSessionRecord.js";
7
8
  import { parseD1LinkedDeviceSessionRowV1, parseD1LinkedDeviceSessionTranscriptRowV1 } from "./d1LinkedDeviceSessionRecords.js";
8
9
  //#region src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.ts
@@ -29,21 +30,33 @@ const PRECOMMIT_STATES = [
29
30
  ];
30
31
  var D1LinkedDeviceSessionStoreV1 = class {
31
32
  constructor(options) {
33
+ this.bootstrap = options.bootstrap;
32
34
  this.database = options.database;
33
35
  this.scope = normalizeScope(options.scope);
34
36
  }
35
37
  async createUnclaimedSessionV1(record) {
36
38
  const normalized = parseLinkedDeviceSessionRecordV1(record);
37
39
  if (normalized.state.state !== "displaying_qr" || normalized.revision !== 1) return invalidStateResult(normalized);
40
+ if (this.bootstrap) {
41
+ const existing = requireLinkedDeviceBootstrapRecord(await this.bootstrap.create(normalized));
42
+ if (!existing) throw new Error("Bootstrap creation returned no session");
43
+ if (!linkedDeviceQrPayloadsEqualV1(existing.qrPayload, normalized.qrPayload)) return conflictResult(1, existing);
44
+ if (existing.state.state === "claimed") {
45
+ const current = await this.getSessionV1(normalized.linkSessionId);
46
+ if (!current) return conflictResult(1, null);
47
+ return {
48
+ outcome: "replayed",
49
+ record: current
50
+ };
51
+ }
52
+ return {
53
+ outcome: "applied",
54
+ record: existing
55
+ };
56
+ }
38
57
  let insertError;
39
58
  try {
40
- if (d1ChangedRows(await this.database.prepare(`INSERT INTO ${SESSION_TABLE} (
41
- namespace, org_id, project_id, env_id, link_session_id,
42
- link_public_key_b64u, device_public_key_b64u, state, record_json,
43
- revision, expires_at_ms, claim_expires_at_ms, claim_digest_b64u,
44
- approval_digest_b64u, authority_id, package_set_digest_b64u,
45
- created_at_ms, updated_at_ms
46
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).bind(...scopeValues(this.scope), ...sessionColumnValues(normalized)).run()) === 1) return {
59
+ if (d1ChangedRows(await this.sessionInsertStatement(normalized).run()) === 1) return {
47
60
  outcome: "applied",
48
61
  record: normalized
49
62
  };
@@ -62,6 +75,44 @@ var D1LinkedDeviceSessionStoreV1 = class {
62
75
  return conflictResult(1, existing);
63
76
  }
64
77
  async getSessionV1(linkSessionId) {
78
+ const local = await this.readLocalSession(linkSessionId);
79
+ if (local || !this.bootstrap) return local;
80
+ if (await this.database.prepare(`SELECT 1 AS imported FROM linked_device_bootstrap_imports
81
+ WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ? AND link_session_id = ?`).bind(...scopeValues(this.scope), String(linkSessionId)).first()) return null;
82
+ const record = requireLinkedDeviceBootstrapRecord(await this.bootstrap.read(linkSessionId));
83
+ if (!record || record.state.state !== "claimed") return record;
84
+ return this.importClaimedSession(record);
85
+ }
86
+ sessionInsertStatement(normalized) {
87
+ return this.database.prepare(`INSERT INTO ${SESSION_TABLE} (
88
+ namespace, org_id, project_id, env_id, link_session_id,
89
+ link_public_key_b64u, device_public_key_b64u, state, record_json,
90
+ revision, expires_at_ms, claim_expires_at_ms, claim_digest_b64u,
91
+ approval_digest_b64u, authority_id, package_set_digest_b64u,
92
+ created_at_ms, updated_at_ms
93
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).bind(...scopeValues(this.scope), ...sessionColumnValues(normalized));
94
+ }
95
+ async importClaimedSession(record) {
96
+ if (record.state.state !== "claimed" || !record.claimTranscript || record.revision !== 2) throw new Error("Invalid bootstrap claim");
97
+ const transcript = record.claimTranscript;
98
+ if (await computeLinkedDeviceSessionClaimDigestV1(transcript.value) !== transcript.digestB64u) throw new Error("Invalid bootstrap claim digest");
99
+ try {
100
+ await this.database.batch([
101
+ this.sessionInsertStatement(record),
102
+ this.database.prepare(`INSERT INTO linked_device_session_transcripts
103
+ (namespace, org_id, project_id, env_id, link_session_id, transcript_kind, digest_b64u, transcript_json, created_at_ms)
104
+ VALUES (?, ?, ?, ?, ?, 'claim', ?, ?, ?)`).bind(...scopeValues(this.scope), record.linkSessionId, transcript.digestB64u, JSON.stringify(transcript.value), record.updatedAtMs),
105
+ this.database.prepare(`INSERT INTO linked_device_bootstrap_imports
106
+ (namespace, org_id, project_id, env_id, link_session_id) VALUES (?, ?, ?, ?, ?)`).bind(...scopeValues(this.scope), record.linkSessionId)
107
+ ]);
108
+ } catch (error) {
109
+ const raced = await this.readLocalSession(record.linkSessionId);
110
+ if (raced && claimTranscriptMatchesDigest(raced, transcript.digestB64u)) return raced;
111
+ throw Object.assign(new Error("Linked-device claim import is unavailable", { cause: error }), { code: "home_unavailable" });
112
+ }
113
+ return record;
114
+ }
115
+ async readLocalSession(linkSessionId) {
65
116
  const row = await this.database.prepare(`SELECT link_session_id, link_public_key_b64u, device_public_key_b64u,
66
117
  state, record_json, revision, expires_at_ms, claim_expires_at_ms,
67
118
  claim_digest_b64u, approval_digest_b64u, authority_id,
@@ -157,6 +208,21 @@ var D1LinkedDeviceSessionStoreV1 = class {
157
208
  };
158
209
  }
159
210
  async claimSessionV1(input) {
211
+ if (this.bootstrap) {
212
+ const selected = requireLinkedDeviceBootstrapRecord(await this.bootstrap.claim(input.nextRecord));
213
+ if (selected?.state.state !== "claimed" || !selected.claimTranscript) throw Object.assign(/* @__PURE__ */ new Error("Bootstrap claim returned invalid state"), { code: "home_unavailable" });
214
+ const current = await this.readLocalSession(input.linkSessionId);
215
+ if (current) return claimTranscriptMatchesDigest(current, selected.claimTranscript.digestB64u) ? {
216
+ outcome: "replayed",
217
+ record: current
218
+ } : conflictResult(input.expectedRevision, current);
219
+ const imported = await this.getSessionV1(input.linkSessionId);
220
+ if (!imported) return conflictResult(input.expectedRevision, null);
221
+ return {
222
+ outcome: "applied",
223
+ record: imported
224
+ };
225
+ }
160
226
  const current = await this.getSessionV1(input.linkSessionId);
161
227
  if (!current) return conflictResult(input.expectedRevision, null);
162
228
  if (claimTranscriptMatchesDigest(current, input.claimDigestB64u)) return {
@@ -293,6 +359,14 @@ var D1LinkedDeviceSessionStoreV1 = class {
293
359
  });
294
360
  }
295
361
  async cancelSessionV1(input) {
362
+ if (this.bootstrap && !await this.readLocalSession(input.linkSessionId)) {
363
+ const record = requireLinkedDeviceBootstrapRecord(await this.bootstrap.finish(input.nextRecord));
364
+ if (!record) return conflictResult(input.expectedRevision, null);
365
+ return {
366
+ outcome: "applied",
367
+ record
368
+ };
369
+ }
296
370
  return this.applyTerminalStateCas({
297
371
  ...sessionMutationFieldsV1(input),
298
372
  expectedStates: PRECOMMIT_STATES,
@@ -301,6 +375,14 @@ var D1LinkedDeviceSessionStoreV1 = class {
301
375
  });
302
376
  }
303
377
  async expireSessionV1(input) {
378
+ if (this.bootstrap && !await this.readLocalSession(input.linkSessionId)) {
379
+ const record = requireLinkedDeviceBootstrapRecord(await this.bootstrap.finish(input.nextRecord));
380
+ if (!record) return conflictResult(input.expectedRevision, null);
381
+ return {
382
+ outcome: "applied",
383
+ record
384
+ };
385
+ }
304
386
  const current = await this.getSessionV1(input.linkSessionId);
305
387
  if (!current) return conflictResult(input.expectedRevision, null);
306
388
  if (current.state.state === "expired") return {
@@ -128,14 +128,7 @@ var D1LinkedDeviceTargetCredentialProviderV1 = class {
128
128
  }
129
129
  async getTargetPreparationV1(input) {
130
130
  const persisted = await this.readV1(input.session.linkSessionId);
131
- if (persisted) {
132
- assertPreparationMatchesSession(persisted.preparation, input.session, input.approval);
133
- if (input.access === "create_or_replay" && input.deliveryRecipientPublicKey65B64u !== persisted.preparation.deliveryRecipientPublicKey65B64u) return {
134
- kind: "conflict",
135
- message: "linked-device target preparation recipient conflicts with its durable replay"
136
- };
137
- return persisted.preparation;
138
- }
131
+ if (persisted) return replayTargetPreparation(persisted.preparation, input);
139
132
  if (input.session.state.state !== "awaiting_target_factor") throw new Error("linked-device target preparation is unavailable in this session state");
140
133
  if (input.access === "replay_only") throw new Error("linked-device target preparation has not been created");
141
134
  const preparation = parseLinkedDeviceTargetPreparationV1(await this.planner.createTargetPreparationV1(input));
@@ -146,11 +139,16 @@ var D1LinkedDeviceTargetCredentialProviderV1 = class {
146
139
  namespace, org_id, project_id, env_id, link_session_id,
147
140
  wallet_id, enrollment_id, device_id, state, target_factor,
148
141
  preparation_digest_b64u, preparation_json, prepared_at_ms, expires_at_ms
149
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'prepared', ?, ?, ?, ?, ?)`).bind(...scopeValues(this.scope), String(preparation.linkSessionId), String(preparation.walletId), String(preparation.enrollmentId), String(preparation.deviceId), preparation.targetFactor.kind, preparationDigestB64u, JSON.stringify(preparation), preparation.issuedAtMs, preparation.expiresAtMs).run();
142
+ ) SELECT ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 'prepared', ?9, ?10, ?11, ?12, ?13
143
+ FROM linked_device_sessions
144
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
145
+ AND link_session_id = ?5 AND state = 'awaiting_target_factor'`).bind(...scopeValues(this.scope), String(preparation.linkSessionId), String(preparation.walletId), String(preparation.enrollmentId), String(preparation.deviceId), preparation.targetFactor.kind, preparationDigestB64u, JSON.stringify(preparation), preparation.issuedAtMs, preparation.expiresAtMs).run();
150
146
  const stored = await this.readV1(input.session.linkSessionId);
151
- if (!stored) throw new Error("linked-device target preparation did not persist");
152
- if (stored.preparationDigestB64u !== preparationDigestB64u) throw new Error("linked-device target preparation conflicts with its durable replay");
153
- return stored.preparation;
147
+ if (!stored) return {
148
+ kind: "conflict",
149
+ message: "linked-device session no longer accepts target preparation"
150
+ };
151
+ return replayTargetPreparation(stored.preparation, input);
154
152
  }
155
153
  async registerTargetCredentialV1(input) {
156
154
  try {
@@ -441,9 +439,12 @@ var D1LinkedDeviceTargetCredentialProviderV1 = class {
441
439
  if (d1ChangedRows(await this.database.prepare(`INSERT OR IGNORE INTO ${TARGET_COMMIT_RESERVATION_TABLE} (
442
440
  namespace, org_id, project_id, env_id, link_session_id,
443
441
  registration_digest_b64u, state, reserved_at_ms
444
- ) VALUES (?, ?, ?, ?, ?, ?, 'reserved', ?)`).bind(...scopeValues(this.scope), input.linkSessionId, input.registrationDigestB64u, input.nowMs).run()) === 1) return { outcome: "acquired" };
442
+ ) SELECT ?1, ?2, ?3, ?4, ?5, ?6, 'reserved', ?7
443
+ FROM linked_device_sessions
444
+ WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4
445
+ AND link_session_id = ?5 AND state = 'awaiting_target_factor'`).bind(...scopeValues(this.scope), input.linkSessionId, input.registrationDigestB64u, input.nowMs).run()) === 1) return { outcome: "acquired" };
445
446
  const row = await this.readCommitReservationV1(input.linkSessionId);
446
- if (!row) return await this.reserveCommitV1(input);
447
+ if (!row) throw new Error("linked-device session no longer accepts target credential registration");
447
448
  if (row.registrationDigestB64u !== input.registrationDigestB64u) throw new Error("linked-device target credential conflicts with its durable commit reservation");
448
449
  if (row.state === "committed") return {
449
450
  outcome: "replayed",
@@ -560,6 +561,14 @@ async function assertRegistrationReplay(persisted, registration, keyManifestDige
560
561
  if (!persisted.registration || persisted.registration.keyManifestDigestB64u !== keyManifestDigestB64u) throw new Error("linked-device target credential conflicts with its durable record");
561
562
  await assertRegistrationValueReplay(persisted.registration.value, registration);
562
563
  }
564
+ function replayTargetPreparation(preparation, input) {
565
+ assertPreparationMatchesSession(preparation, input.session, input.approval);
566
+ if (input.access === "create_or_replay" && input.deliveryRecipientPublicKey65B64u !== preparation.deliveryRecipientPublicKey65B64u) return {
567
+ kind: "conflict",
568
+ message: "linked-device target preparation recipient conflicts with its durable replay"
569
+ };
570
+ return preparation;
571
+ }
563
572
  function assertPreparationMatchesSession(preparation, session, approval) {
564
573
  const sourceSignerManifest = session.approvalTranscript?.sourceSignerManifest;
565
574
  if (!sourceSignerManifest) throw new Error("linked-device verified source signer manifest is unavailable");
@@ -13,6 +13,7 @@ const CAPABILITY_REPLACEMENT_SCHEMA_SQL = `
13
13
  org_id TEXT NOT NULL,
14
14
  project_id TEXT NOT NULL,
15
15
  env_id TEXT NOT NULL,
16
+ wallet_id TEXT NOT NULL CHECK (length(wallet_id) > 0),
16
17
  operation_id TEXT NOT NULL,
17
18
  operation_fingerprint TEXT NOT NULL,
18
19
  previous_capability_binding_json TEXT NOT NULL,
@@ -76,6 +77,10 @@ var CloudflareD1RouterAbEd25519YaoCapabilityPersistence = class {
76
77
  async prepareActiveCapabilityReplacement(input) {
77
78
  const operation = validateReplacementOperation(input.operation);
78
79
  if (!operation.ok) return operation.failure;
80
+ const application = activeCapabilityApplication(input.next);
81
+ const walletId = parseWalletId(application.wallet_id);
82
+ if (!walletId.ok) return persistenceFailure("invalid_wallet", "promoted Yao capability wallet ID is invalid");
83
+ if (activeCapabilityApplication(input.previous).wallet_id !== walletId.value) return persistenceFailure("identity_mismatch", "capability replacement crosses wallet ownership");
79
84
  await this.ensureSchema();
80
85
  const receiptMatch = matchReceipt(await this.readReceipt(operation.value.operationId), operation.value, input);
81
86
  if (receiptMatch === "match") return {
@@ -83,9 +88,6 @@ var CloudflareD1RouterAbEd25519YaoCapabilityPersistence = class {
83
88
  disposition: "exact_retry"
84
89
  };
85
90
  if (receiptMatch === "conflict") return persistenceFailure("operation_conflict", "capability replacement operation belongs to a different activation");
86
- const application = activeCapabilityApplication(input.next);
87
- const walletId = parseWalletId(application.wallet_id);
88
- if (!walletId.ok) return persistenceFailure("invalid_wallet", "promoted Yao capability wallet ID is invalid");
89
91
  const signer = await this.walletStore.getEd25519SignerBySlot({
90
92
  walletId: walletId.value,
91
93
  signerSlot: application.key_creation_signer_slot
@@ -127,13 +129,14 @@ var CloudflareD1RouterAbEd25519YaoCapabilityPersistence = class {
127
129
  org_id,
128
130
  project_id,
129
131
  env_id,
132
+ wallet_id,
130
133
  operation_id,
131
134
  operation_fingerprint,
132
135
  previous_capability_binding_json,
133
136
  next_capability_binding_json,
134
137
  created_at_ms
135
138
  )
136
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, operation.value.operationId, operation.value.operationFingerprint, previousBindingJson, nextBindingJson, now));
139
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, walletId.value, operation.value.operationId, operation.value.operationFingerprint, previousBindingJson, nextBindingJson, now));
137
140
  for (const authorityReplacement of authorityReplacements) {
138
141
  statements.push(this.prepareAuthorityReplacementStatement(authorityReplacement));
139
142
  statements.push(this.database.prepare(D1_BATCH_CAS_GUARD_SQL));
@@ -243,7 +246,7 @@ var CloudflareD1RouterAbEd25519YaoCapabilityPersistence = class {
243
246
  AND retired_at_ms IS NULL`).bind(String(next.authorityDigestB64u), JSON.stringify(next.capabilitySubjects), JSON.stringify(next), this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, String(next.authorizationId), String(next.authorityId), String(input.previous.authorityDigestB64u), input.previous.authorityRevocationEpoch);
244
247
  }
245
248
  async readReceipt(operationId) {
246
- return await this.database.prepare(`SELECT operation_fingerprint,
249
+ return await this.database.prepare(`SELECT wallet_id, operation_fingerprint,
247
250
  previous_capability_binding_json,
248
251
  next_capability_binding_json
249
252
  FROM ${ROUTER_AB_ED25519_YAO_CAPABILITY_REPLACEMENT_TABLE_V1}
@@ -274,7 +277,7 @@ function validateReplacementOperation(operation) {
274
277
  }
275
278
  function matchReceipt(receipt, operation, input) {
276
279
  if (!receipt) return "missing";
277
- return receipt.operation_fingerprint === operation.operationFingerprint && receipt.previous_capability_binding_json === JSON.stringify(input.previous.activeCapabilityBinding) && receipt.next_capability_binding_json === JSON.stringify(input.next.activeCapabilityBinding) ? "match" : "conflict";
280
+ return receipt.wallet_id === activeCapabilityApplication(input.next).wallet_id && receipt.operation_fingerprint === operation.operationFingerprint && receipt.previous_capability_binding_json === JSON.stringify(input.previous.activeCapabilityBinding) && receipt.next_capability_binding_json === JSON.stringify(input.next.activeCapabilityBinding) ? "match" : "conflict";
278
281
  }
279
282
  //#endregion
280
283
  export { CloudflareD1RouterAbEd25519YaoCapabilityPersistence, ROUTER_AB_ED25519_YAO_CAPABILITY_REPLACEMENT_TABLE_V1 };
@@ -1,5 +1,4 @@
1
1
  import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
2
- import "../../../../shared-ts/src/utils/validation.js";
3
2
  import { secureRandomBase64Url } from "../../../../shared-ts/src/utils/secureRandomId.js";
4
3
  import { failure } from "../../../../shared-ts/src/utils/failure.js";
5
4
  import { EMAIL_OTP_CHANNEL, WALLET_EMAIL_OTP_ACTIONS } from "../../../../shared-ts/src/utils/emailOtpDomain.js";
@@ -1,5 +1,4 @@
1
1
  import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
2
- import "../../../../shared-ts/src/utils/validation.js";
3
2
  import { secureRandomBase64Url } from "../../../../shared-ts/src/utils/secureRandomId.js";
4
3
  import { failure } from "../../../../shared-ts/src/utils/failure.js";
5
4
  import { EMAIL_OTP_CHANNEL, WALLET_EMAIL_OTP_ACTIONS, WALLET_EMAIL_OTP_REGISTRATION_OPERATION, WALLET_EMAIL_OTP_UNLOCK_OPERATION } from "../../../../shared-ts/src/utils/emailOtpDomain.js";
@@ -1,7 +1,7 @@
1
1
  import { D1_BATCH_CAS_GUARD_SQL } from "../../../../storage/d1Sql.js";
2
2
  import { parseD1NonNegativeCount } from "../auth/d1RouterApiAuthBoundary.js";
3
- import { emailOtpChallengeRows, emailOtpUnlockChallengeRows } from "../../../../core/emailOtpD1Statements.js";
4
3
  import { emailOtpChallengeContextValues, emailOtpChallengeWithAttemptCount, parseEmailOtpChallengeRow, parseEmailOtpRegistrationVerificationReceiptV1, parseEmailOtpUnlockChallengeRow } from "./d1EmailOtpRecords.js";
4
+ import { emailOtpChallengeRows, emailOtpUnlockChallengeRows } from "../../../../core/emailOtpD1Statements.js";
5
5
  //#region src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.ts
6
6
  const REGISTRATION_VERIFICATION_RECEIPT_SCOPE = "email-otp-registration-verification-v1";
7
7
  const REGISTRATION_CEREMONY_CAS_GUARD_SQL = `INSERT INTO registration_ceremony_cas_guard (guard_id)
@@ -2,7 +2,6 @@ import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
2
2
  import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
3
3
  import "../../../../shared-ts/src/utils/encoders.js";
4
4
  import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
5
- import "../../../../shared-ts/src/utils/validation.js";
6
5
  import { EMAIL_OTP_CHANNEL, WALLET_EMAIL_OTP_ACTIONS, WALLET_EMAIL_OTP_REGISTRATION_OPERATION } from "../../../../shared-ts/src/utils/emailOtpDomain.js";
7
6
  import { emailOtpChallengeBindingMismatchCode, emailOtpChallengeInvalidOrExpired, emailOtpRegistrationChallengeBindingMismatchCode } from "./d1EmailOtpRecords.js";
8
7
  //#region src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.ts
@@ -1,5 +1,5 @@
1
- import { emailOtpAuthStateRows, emailOtpWalletEnrollmentRows } from "../../../../core/emailOtpD1Statements.js";
2
1
  import { emailOtpAuthStateRecord, parseEmailOtpAuthStateRow, parseEmailOtpWalletEnrollmentRow } from "./d1EmailOtpRecords.js";
2
+ import { emailOtpAuthStateRows, emailOtpWalletEnrollmentRows } from "../../../../core/emailOtpD1Statements.js";
3
3
  //#region src/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.ts
4
4
  var CloudflareD1EmailOtpEnrollmentStore = class {
5
5
  constructor(input) {
@@ -1,5 +1,5 @@
1
- import { emailOtpGrantRows } from "../../../../core/emailOtpD1Statements.js";
2
1
  import { parseEmailOtpGrantRow } from "./d1EmailOtpRecords.js";
2
+ import { emailOtpGrantRows } from "../../../../core/emailOtpD1Statements.js";
3
3
  //#region src/router/cloudflare/d1/emailOtp/d1EmailOtpGrantStore.ts
4
4
  var CloudflareD1EmailOtpGrantStore = class {
5
5
  constructor(input) {
@@ -11,12 +11,6 @@ var CloudflareD1EmailOtpGrantStore = class {
11
11
  async consume(grantToken) {
12
12
  return parseEmailOtpGrantRow(await emailOtpGrantRows.consume(this.prepare, grantToken).first());
13
13
  }
14
- async read(grantToken) {
15
- return parseEmailOtpGrantRow(await emailOtpGrantRows.select(this.prepare, grantToken).first());
16
- }
17
- async delete(grantToken) {
18
- await emailOtpGrantRows.delete(this.prepare, grantToken).run();
19
- }
20
14
  };
21
15
  //#endregion
22
16
  export { CloudflareD1EmailOtpGrantStore };
@@ -2,8 +2,8 @@ import { emailOtpRateLimitExceeded, emailOtpRateLimitKeys } from "./d1EmailOtpRe
2
2
  //#region src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.ts
3
3
  var CloudflareD1EmailOtpRateLimitStore = class {
4
4
  constructor(input) {
5
- this.prepare = input.prepare;
6
5
  this.rateLimits = input.rateLimits;
6
+ this.counter = input.counter ?? new D1EmailOtpRateLimitCounter(input.prepare);
7
7
  }
8
8
  async consume(input) {
9
9
  const policy = this.rateLimits[input.scope];
@@ -12,17 +12,23 @@ var CloudflareD1EmailOtpRateLimitStore = class {
12
12
  policy
13
13
  });
14
14
  for (const key of keys) {
15
- const consumed = await this.consumeKey({
15
+ const consumed = await this.counter.consume({
16
16
  key,
17
- policy,
18
- nowMs: Date.now()
17
+ limit: policy.limit,
18
+ windowMs: policy.windowMs
19
19
  });
20
20
  if (!consumed.ok) return consumed;
21
21
  }
22
22
  return { ok: true };
23
23
  }
24
- async consumeKey(input) {
25
- const resetAtMs = input.nowMs + input.policy.windowMs;
24
+ };
25
+ var D1EmailOtpRateLimitCounter = class {
26
+ constructor(prepare) {
27
+ this.prepare = prepare;
28
+ }
29
+ async consume(input) {
30
+ const nowMs = Date.now();
31
+ const resetAtMs = nowMs + input.windowMs;
26
32
  if (await this.prepare(`INSERT INTO email_otp_rate_limits (
27
33
  namespace,
28
34
  org_id,
@@ -52,13 +58,13 @@ var CloudflareD1EmailOtpRateLimitStore = class {
52
58
  RETURNING consumed_count, reset_at_ms`, [
53
59
  input.key,
54
60
  resetAtMs,
55
- input.nowMs,
56
- input.nowMs,
57
- input.nowMs,
61
+ nowMs,
62
+ nowMs,
63
+ nowMs,
58
64
  resetAtMs,
59
- input.nowMs,
60
- input.nowMs,
61
- input.policy.limit
65
+ nowMs,
66
+ nowMs,
67
+ input.limit
62
68
  ]).first()) return { ok: true };
63
69
  return emailOtpRateLimitExceeded(await this.prepare(`SELECT consumed_count, reset_at_ms
64
70
  FROM email_otp_rate_limits
@@ -71,6 +77,6 @@ var CloudflareD1EmailOtpRateLimitStore = class {
71
77
  }
72
78
  };
73
79
  //#endregion
74
- export { CloudflareD1EmailOtpRateLimitStore };
80
+ export { CloudflareD1EmailOtpRateLimitStore, D1EmailOtpRateLimitCounter };
75
81
 
76
82
  //# sourceMappingURL=d1EmailOtpRateLimitStore.js.map
@@ -1,7 +1,6 @@
1
1
  import { base64UrlDecode } from "../../../../shared-ts/src/utils/base64.js";
2
2
  import "../../../../shared-ts/src/utils/encoders.js";
3
3
  import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
4
- import "../../../../shared-ts/src/utils/validation.js";
5
4
  import { hasExactKeys } from "../../../../shared-ts/src/utils/exactKeys.js";
6
5
  import { failure } from "../../../../shared-ts/src/utils/failure.js";
7
6
  import { EMAIL_OTP_CHANNEL, WALLET_EMAIL_OTP_ACTIONS, WALLET_EMAIL_OTP_DEVICE_LINK_OPERATION, WALLET_EMAIL_OTP_REGISTRATION_OPERATION, WALLET_EMAIL_OTP_UNLOCK_OPERATION, isWalletEmailOtpLoginOperation } from "../../../../shared-ts/src/utils/emailOtpDomain.js";