@seams/wallet-server 0.8.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +7 -1
- package/artifact-manifest.json +196 -41
- package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/router/index.js +2 -2
- package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/signing-worker/index.js +2 -2
- package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -2
- package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
- package/cloudflare-router-ab/migrations/deriver-a/0019_wallet_object_addresses.sql +10 -0
- package/cloudflare-router-ab/migrations/deriver-b/0019_wallet_object_addresses.sql +10 -0
- package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +3 -117
- package/cloudflare-router-ab/wrangler.deriver-a.toml +0 -8
- package/cloudflare-router-ab/wrangler.deriver-b.toml +24 -8
- package/cloudflare-router-ab/wrangler.router.toml +0 -2
- package/cloudflare-router-ab/wrangler.signing-worker.toml +29 -0
- package/dist/esm/authorization/domain.js +3 -2
- package/dist/esm/authorization/ed25519WalletSessionAdmission.js +0 -0
- package/dist/esm/authorization/service.js +64 -36
- package/dist/esm/cloud-host.js +24 -19
- package/dist/esm/core/EmailOtpRecords.js +29 -6
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +2 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +10 -0
- package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +1 -0
- package/dist/esm/core/ThresholdService/validation.js +2 -2
- package/dist/esm/core/authService/nearPrivateKeySigning.js +1 -1
- package/dist/esm/core/authService/webauthn.js +1 -1
- package/dist/esm/core/d1Ed25519SignerRead.js +55 -0
- package/dist/esm/core/d1WalletStore.js +14 -11
- package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +2 -2
- package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +1 -1
- package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -2
- package/dist/esm/core/emailOtpD1Statements.js +1 -0
- package/dist/esm/core/nearRelayerAccountProvisioning.js +1 -1
- package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +4 -0
- package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +1 -1
- package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +1 -0
- package/dist/esm/hosted-wallet-gateway.js +93 -10
- package/dist/esm/localHostedWalletGatewayHandler.js +12 -9
- package/dist/esm/localIntendedYaoSigningFault.js +2 -30
- package/dist/esm/localRegistrationSetupAuthority.js +8 -1
- package/dist/esm/router/auth/commonRouterUtils.js +17 -10
- package/dist/esm/router/auth/routerApiCredentialAuth.js +26 -7
- package/dist/esm/router/auth/walletRegistrationContext.js +49 -0
- package/dist/esm/router/auth/webAuthnCredentialCodecs.js +1 -1
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +4 -3
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +2 -0
- package/dist/esm/router/cloudflare/d1/auth/d1EmailOtpRouteService.js +25 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +14 -6
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +44 -40
- package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +17 -1
- package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +35 -5
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +258 -99
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +31 -4
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +1 -1
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.js +11 -2
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +100 -10
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.js +92 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.js +77 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +14 -8
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +14 -8
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +3 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +58 -38
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +27 -20
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +1 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +1 -0
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +1 -1
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +18 -7
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +75 -14
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +1 -1
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +49 -29
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.js +28 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +11 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletExecutionAuthority.js +168 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletOperationStore.js +53 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +83 -42
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.js +33 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.js +16 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationRead.js +58 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +439 -500
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +1 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +104 -90
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +78 -44
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +11 -35
- package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +98 -39
- package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +12 -9
- package/dist/esm/router/cloudflare/d1/wallet/authorizationSnapshotLayout.js +168 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +1 -1
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +15 -6
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +3 -40
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +54 -1
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.js +157 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.js +56 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.js +238 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.js +287 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.js +295 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.js +140 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.js +170 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.js +60 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwner.js +33 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.js +74 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.js +77 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.js +37 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationSessions.js +97 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.js +133 -0
- package/dist/esm/router/cloudflare/d1/walletObjectAddresses.js +47 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +1 -1
- package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +32 -1
- package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +20 -8
- package/dist/esm/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.js +488 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +26 -6
- package/dist/esm/router/cloudflare/runtime/walletControlOps.js +3 -0
- package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletObjectAddresses.js +105 -0
- package/dist/esm/router/cloudflare/runtime/walletPlacementRoutes.js +339 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationDeriver.js +244 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationEcdsa.js +212 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationEd25519.js +172 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationOps.js +183 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationPresign.js +185 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationSource.js +221 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +30 -8
- package/dist/esm/router/cloudflare-adaptor.js +8 -8
- package/dist/esm/router/cloudflare.js +34115 -32240
- package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +35 -9
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +42 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +32 -6
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +61 -1
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +70 -3
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +59 -87
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +52 -22
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +10 -7
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +108 -78
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +19 -5
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +71 -22
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +37 -25
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +3 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +2 -1
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +24 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +4 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +20 -7
- package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +7 -1
- package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +2 -2
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +1 -1
- package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +34 -18
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +2 -2
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +16 -6
- package/dist/esm/router/domains/signingOperations/authorizedOperationWire.js +73 -0
- package/dist/esm/router/domains/signingOperations/ecdsaSigningResponse.js +31 -0
- package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +1 -1
- package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +2 -1
- package/dist/esm/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.js +31 -121
- package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +2 -93
- package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +1 -1
- package/dist/esm/router/domains/signingOperations/signingPrepareSession.js +33 -0
- package/dist/esm/router/domains/walletRegistration/registrationSessionSeal.js +121 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +4 -4
- package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +46 -157
- package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +1 -1
- package/dist/esm/router/express.js +764 -894
- package/dist/esm/router/framework/http.js +2 -1
- package/dist/esm/router/transport/fetch/createFetchRouter.js +2 -2
- package/dist/esm/router/transport/fetch/routes/auth.js +1 -1
- package/dist/esm/router/transport/fetch/routes/deviceLinking.js +3 -3
- package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +2 -2
- package/dist/esm/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.js +65 -0
- package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +13 -3
- package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +3 -3
- package/dist/esm/router/transport/fetch/routes/sessions.js +3 -2
- package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +67 -130
- package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +76 -212
- package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +18 -41
- package/dist/esm/router/transport/fetch/routes/walletRegistration.js +6 -5
- package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +1 -1
- package/dist/esm/shared-ts/src/authorization/index.js +1 -1
- package/dist/esm/shared-ts/src/authorization/walletAuthority.js +2 -2
- package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +12 -2
- package/dist/esm/shared-ts/src/device-linking/digests.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/index.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/parsers.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/wireFields.js +1 -1
- package/dist/esm/shared-ts/src/near/nearClient.js +1 -1
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +2 -2
- package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +6 -1
- package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +4 -2
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
- package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +0 -27
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +1 -1
- package/dist/esm/threshold/session/signingSessionSeal/options.js +1 -1
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +2 -1
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +10 -0
- package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +2 -1
- package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +3 -1
- package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +0 -9
- package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
- package/dist/types/wallet-server/src/authorization/domain.d.ts +17 -1
- package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +1 -0
- package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.d.ts +35 -0
- package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/service.d.ts +43 -5
- package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +2 -0
- package/dist/types/wallet-server/src/cloud-host.d.ts +7 -3
- package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +2 -1
- package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +19 -5
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +1 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +6 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +1 -0
- package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +17 -0
- package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +6 -0
- package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +1 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +5 -1
- package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +1 -0
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +14 -48
- package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +4 -3
- package/dist/types/wallet-server/src/localIntendedYaoSigningFault.d.ts +1 -16
- package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +1 -1
- package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +7 -1
- package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +11 -3
- package/dist/types/wallet-server/src/router/auth/walletRegistrationContext.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1EmailOtpRouteService.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +7 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +4 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +7 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +32 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.d.ts +3 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.d.ts +15 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +6 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +4 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpCounters.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +6 -29
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +21 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +17 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +32 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +16 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletExecutionAuthority.d.ts +41 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletOperationStore.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +6 -9
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.d.ts +17 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationRead.d.ts +43 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +24 -45
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +9 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +42 -14
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +5 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +24 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +10 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +3 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.d.ts +29 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.d.ts +31 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.d.ts +49 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.d.ts +47 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.d.ts +25 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.d.ts +88 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.d.ts +37 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.d.ts +18 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationSessions.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/walletObjectAddresses.d.ts +14 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +3 -3
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +2 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +3 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletObjectAddresses.d.ts +45 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletPlacementRoutes.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationDeriver.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEcdsa.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEd25519.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationOps.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationPresign.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationSource.d.ts +26 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +5 -0
- package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +3 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +7 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +41 -7
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +33 -2
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +12 -6
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +17 -9
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +13 -14
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +7 -3
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +1 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +6 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +11 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +12 -3
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +10 -6
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +10 -3
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +12 -5
- package/dist/types/wallet-server/src/router/domains/signingOperations/authorizedOperationWire.d.ts +97 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/ecdsaSigningResponse.d.ts +13 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +9 -206
- package/dist/types/wallet-server/src/router/domains/signingOperations/signingPrepareSession.d.ts +23 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/registrationSessionSeal.d.ts +36 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +7 -7
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +80 -6
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +15 -5
- package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +24 -0
- package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +21 -7
- package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +3 -12
- package/dist/types/wallet-server/src/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.d.ts +37 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +1 -17
- package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +1 -1
- package/migrations/d1-signer/0049_wallet_relocation_challenges.sql +16 -0
- package/migrations/d1-signer/0050_wallet_relocation_approvals.sql +14 -0
- package/migrations/d1-signer/0051_wallet_relocation_email_otp.sql +92 -0
- package/migrations/d1-signer/0052_wallet_relocation_session_fences.sql +91 -0
- package/migrations/d1-signer/0053_wallet_hosted_history_import.sql +164 -0
- package/migrations/d1-signer/0054_wallet_authorization_freeze.sql +318 -0
- package/migrations/d1-signer/0055_wallet_authorization_snapshot.sql +120 -0
- package/migrations/d1-signer/0056_wallet_authorization_history_import.sql +424 -0
- package/migrations/d1-signer/0057_wallet_authorization_intake.sql +44 -0
- package/migrations/d1-signer/0058_wallet_ceremony_activity.sql +59 -0
- package/migrations/d1-signer/0059_wallet_authorization_activation.sql +45 -0
- package/migrations/d1-signer/0060_wallet_authorization_cleanup.sql +153 -0
- package/migrations/d1-signer/0061_wallet_session_operation_settlement.sql +28 -0
- package/migrations/d1-signer/0062_wallet_step_up_operation_settlement.sql +204 -0
- package/migrations/d1-signer/0063_wallet_operation_history_transfer.sql +466 -0
- package/migrations/d1-signer/0064_wallet_execution_generations.sql +93 -0
- package/migrations/d1-signer/0065_wallet_operation_execution_generation.sql +37 -0
- package/migrations/d1-signer/0066_regional_deployment_admission.sql +59 -0
- package/migrations/d1-signer/0067_registration_completion_decision.sql +12 -0
- package/migrations/d1-signer/0068_registration_cancellation_write_fence.sql +24 -0
- package/migrations/d1-signer/0069_cancelled_registration_session_fence.sql +11 -0
- package/migrations/d1-signer/0070_wallet_passkey_relocation.sql +369 -0
- package/migrations/d1-signer/0071_regional_wallet_otp_counters.sql +98 -0
- package/migrations/d1-signer/0072_linked_device_relocation_history.sql +899 -0
- package/migrations/d1-signer/0073_wallet_recovery_relocation.sql +86 -0
- package/migrations/d1-signer/0074_email_otp_relocation.sql +158 -0
- package/migrations/d1-signer/0075_wallet_authorization_return.sql +107 -0
- package/migrations/d1-signer/0076_wallet_relocation_write_block.sql +406 -0
- package/migrations/d1-signer/0077_wallet_object_addresses.sql +24 -0
- package/package.json +1 -1
- package/src/README.md +23 -1
- package/cloudflare-router-ab/scripts/local-key-material.mjs +0 -29
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { parseRouterAbEcdsaDerivationActivationRefreshCommitRequestV1, parseRouterAbEcdsaDerivationActivationRefreshResponseV1, parseRouterAbEcdsaDerivationExplicitExportRequestV1, parseRouterAbEcdsaExplicitExportProtocolForwardedResponseV1, parseRouterAbEcdsaRegistrationActivationReceiptV1, parseRouterAbEcdsaStrictForwardedRegistrationResponseV1, projectRouterAbEcdsaDerivationExplicitExportRequestToProtocolV1 } from "../../../shared-ts/src/utils/routerAbEcdsaDerivation.js";
|
|
2
|
+
import { walletObjectIdentity, walletObjectIdentityHeaders } from "../../cloudflare/runtime/walletObjectAddresses.js";
|
|
3
|
+
import { ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1, normalizeRouterAbInternalServiceAuthSecret } from "../../../core/ThresholdService/routerAb/internalServiceHttp.js";
|
|
2
4
|
import { ROUTER_AB_TRACE_ID_HEADER_V1 } from "../../../shared-ts/src/utils/routerAbTraceContext.js";
|
|
3
5
|
//#region src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.ts
|
|
4
6
|
const STRICT_ECDSA_REGISTRATION_PATH = "/router-ab/ecdsa-derivation/register";
|
|
@@ -90,9 +92,17 @@ var StrictRegistrationForwarder = class {
|
|
|
90
92
|
message: "Strict ECDSA registration request policy is invalid",
|
|
91
93
|
retryable: false
|
|
92
94
|
};
|
|
95
|
+
const claims = ceremonyTokenClaimsForAuthority(input.authority, this.config.tokenScope, input.projectEnvironmentId, input.kind === "activation" ? pendingOwnershipGeneration(input.pendingActivation) : input.tenantRoot.ownershipGeneration);
|
|
96
|
+
const token = await this.config.tokenIssuer.issueRequest(claims, requestPolicy);
|
|
93
97
|
const headers = {
|
|
94
|
-
|
|
95
|
-
|
|
98
|
+
[ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1]: normalizeRouterAbInternalServiceAuthSecret(this.config.internalServiceAuthSecret),
|
|
99
|
+
authorization: `Bearer ${token}`,
|
|
100
|
+
"content-type": JSON_CONTENT_TYPE,
|
|
101
|
+
...walletObjectIdentityHeaders(walletObjectIdentity(claims.accountId, claims.ownershipGeneration, {
|
|
102
|
+
orgId: claims.orgId,
|
|
103
|
+
projectId: claims.projectId,
|
|
104
|
+
envId: claims.projectEnvironmentId
|
|
105
|
+
}))
|
|
96
106
|
};
|
|
97
107
|
if (input.traceContext) headers[ROUTER_AB_TRACE_ID_HEADER_V1] = input.traceContext.value;
|
|
98
108
|
const response = await this.config.router.fetch(new Request(`https://router.router-ab.internal${input.path}`, {
|
|
@@ -186,7 +196,8 @@ var StrictPostRegistrationForwarder = class {
|
|
|
186
196
|
async forwardRaw(input) {
|
|
187
197
|
const authorityFailure = validatePostRegistrationAuthorityBinding(input);
|
|
188
198
|
if (authorityFailure) return authorityFailure;
|
|
189
|
-
const
|
|
199
|
+
const claims = ceremonyTokenClaimsForAuthority(input.authority, this.config.tokenScope, input.tenantRoot.projectEnvironmentId, input.tenantRoot.ownershipGeneration);
|
|
200
|
+
const token = await this.config.tokenIssuer.issueRequest(claims, postRegistrationRequestPolicy(input.kind === "explicit_export" ? {
|
|
190
201
|
workKind: "key_export",
|
|
191
202
|
requestDigestB64u: input.requestDigestB64u
|
|
192
203
|
} : {
|
|
@@ -196,8 +207,14 @@ var StrictPostRegistrationForwarder = class {
|
|
|
196
207
|
const response = await this.config.router.fetch(new Request(`https://router.router-ab.internal${input.path}`, {
|
|
197
208
|
method: "POST",
|
|
198
209
|
headers: {
|
|
210
|
+
[ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1]: normalizeRouterAbInternalServiceAuthSecret(this.config.internalServiceAuthSecret),
|
|
199
211
|
authorization: `Bearer ${token}`,
|
|
200
|
-
"content-type": JSON_CONTENT_TYPE
|
|
212
|
+
"content-type": JSON_CONTENT_TYPE,
|
|
213
|
+
...walletObjectIdentityHeaders(walletObjectIdentity(claims.accountId, claims.ownershipGeneration, {
|
|
214
|
+
orgId: claims.orgId,
|
|
215
|
+
projectId: claims.projectId,
|
|
216
|
+
envId: claims.projectEnvironmentId
|
|
217
|
+
}))
|
|
201
218
|
},
|
|
202
219
|
body: strictPostRegistrationForwardBodyJson(input)
|
|
203
220
|
}));
|
|
@@ -297,6 +314,7 @@ function assertNeverStrictForwardBody(value) {
|
|
|
297
314
|
function canonicalPendingActivationJson(value) {
|
|
298
315
|
if (!exactObject(value, [
|
|
299
316
|
"registration",
|
|
317
|
+
"ownership_generation",
|
|
300
318
|
"tenant_root_custody_binding_digest",
|
|
301
319
|
"wallet_scope",
|
|
302
320
|
"environment_key",
|
|
@@ -305,6 +323,11 @@ function canonicalPendingActivationJson(value) {
|
|
|
305
323
|
])) throw new Error("MPCRouter pending activation has an invalid envelope");
|
|
306
324
|
return canonicalJson(value);
|
|
307
325
|
}
|
|
326
|
+
function pendingOwnershipGeneration(pending) {
|
|
327
|
+
const generation = objectValue(JSON.parse(pending.canonicalPayloadJson))?.ownership_generation;
|
|
328
|
+
if (typeof generation !== "number" || !Number.isSafeInteger(generation) || generation < 1) throw new Error("Stored ECDSA pending activation has an invalid ownership generation");
|
|
329
|
+
return generation;
|
|
330
|
+
}
|
|
308
331
|
function pendingProjectEnvironmentId(pending) {
|
|
309
332
|
const projectEnvironmentId = nonEmptyString(objectValue(objectValue(JSON.parse(pending.canonicalPayloadJson))?.wallet_scope)?.project_environment_id);
|
|
310
333
|
if (!projectEnvironmentId) throw new Error("Stored ECDSA pending activation has no canonical project environment");
|
|
@@ -313,11 +336,12 @@ function pendingProjectEnvironmentId(pending) {
|
|
|
313
336
|
function parseStoredRouterAbEcdsaPendingActivationV1(value) {
|
|
314
337
|
const record = exactObject(value, ["kind", "canonicalPayloadJson"]);
|
|
315
338
|
if (!record || record.kind !== "router_ab_ecdsa_pending_activation_v1" || typeof record.canonicalPayloadJson !== "string") throw new Error("Stored MPCRouter ECDSA pending activation is invalid");
|
|
316
|
-
const
|
|
317
|
-
if (
|
|
339
|
+
const parsed = objectValue(JSON.parse(record.canonicalPayloadJson));
|
|
340
|
+
if (!parsed || canonicalJson(parsed) !== record.canonicalPayloadJson) throw new Error("Stored MPCRouter ECDSA pending activation is not canonical");
|
|
341
|
+
if (!Object.hasOwn(parsed, "ownership_generation")) parsed.ownership_generation = 1;
|
|
318
342
|
return {
|
|
319
343
|
kind: "router_ab_ecdsa_pending_activation_v1",
|
|
320
|
-
canonicalPayloadJson
|
|
344
|
+
canonicalPayloadJson: canonicalPendingActivationJson(parsed)
|
|
321
345
|
};
|
|
322
346
|
}
|
|
323
347
|
function canonicalJson(value) {
|
|
@@ -380,8 +404,9 @@ function parseStrictRegistrationForwardingResult(raw) {
|
|
|
380
404
|
};
|
|
381
405
|
}
|
|
382
406
|
}
|
|
383
|
-
function ceremonyTokenClaimsForAuthority(authority, scope, projectEnvironmentId) {
|
|
407
|
+
function ceremonyTokenClaimsForAuthority(authority, scope, projectEnvironmentId, ownershipGeneration) {
|
|
384
408
|
return {
|
|
409
|
+
ownershipGeneration,
|
|
385
410
|
subjectId: authority.subjectId,
|
|
386
411
|
sessionId: authority.sessionId,
|
|
387
412
|
orgId: scope.orgId,
|
|
@@ -501,6 +526,7 @@ var Ed25519CeremonyTokenIssuer = class {
|
|
|
501
526
|
project_id: claims.projectId,
|
|
502
527
|
environment: claims.environment,
|
|
503
528
|
project_environment_id: claims.projectEnvironmentId,
|
|
529
|
+
ownership_generation: claims.ownershipGeneration,
|
|
504
530
|
account_id: claims.accountId,
|
|
505
531
|
...requestPolicy ? { routerAbRequestPolicy: requestPolicy } : {}
|
|
506
532
|
})}`;
|
|
@@ -659,7 +685,7 @@ function validateCeremonyTokenIssuerConfig(config) {
|
|
|
659
685
|
if (!nonEmptyString(config.issuer) || !nonEmptyString(config.audience) || !nonEmptyString(config.keyId) || config.privateJwk.kty !== "OKP" || config.privateJwk.crv !== "Ed25519" || !base64UrlString(config.privateJwk.x, 32) || !base64UrlString(config.privateJwk.d, 32)) throw new Error("Router A/B ECDSA ceremony token issuer requires an Ed25519 private JWK");
|
|
660
686
|
}
|
|
661
687
|
function validateCeremonyTokenClaims(claims) {
|
|
662
|
-
if (!nonEmptyString(claims.subjectId) || !nonEmptyString(claims.sessionId) || !nonEmptyString(claims.orgId) || !nonEmptyString(claims.projectId) || !nonEmptyString(claims.environment) || !nonEmptyString(claims.projectEnvironmentId) || !nonEmptyString(claims.accountId) || !Number.isSafeInteger(claims.expiresAtMs) || claims.expiresAtMs <= Date.now()) throw new Error("Router A/B ECDSA ceremony token claims are invalid");
|
|
688
|
+
if (!Number.isSafeInteger(claims.ownershipGeneration) || claims.ownershipGeneration < 1 || !nonEmptyString(claims.subjectId) || !nonEmptyString(claims.sessionId) || !nonEmptyString(claims.orgId) || !nonEmptyString(claims.projectId) || !nonEmptyString(claims.environment) || !nonEmptyString(claims.projectEnvironmentId) || !nonEmptyString(claims.accountId) || !Number.isSafeInteger(claims.expiresAtMs) || claims.expiresAtMs <= Date.now()) throw new Error("Router A/B ECDSA ceremony token claims are invalid");
|
|
663
689
|
}
|
|
664
690
|
function exactObject(raw, keys) {
|
|
665
691
|
const record = objectValue(raw);
|
package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { InMemoryRouterAbEd25519YaoRecoveryService, InMemoryRouterAbEd25519YaoRecoveryStateV1 } from "../recovery/routerAbEd25519YaoRecovery.js";
|
|
2
|
+
//#region src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.ts
|
|
3
|
+
/** The wallet and its initial capability become visible in the same transaction. */
|
|
4
|
+
function commitRouterAbEd25519YaoRegistrationCapability(store, installation, walletWrite) {
|
|
5
|
+
return commitCapability(store, installRegistration.bind(void 0, installation), walletWrite);
|
|
6
|
+
}
|
|
7
|
+
function rehydrateRouterAbEd25519YaoCapability(store, capability) {
|
|
8
|
+
return commitCapability(store, installPersisted.bind(void 0, capability), Promise.resolve(null));
|
|
9
|
+
}
|
|
10
|
+
async function commitCapability(store, install, preparedWrite) {
|
|
11
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
12
|
+
const [snapshot, companionWrite] = await Promise.all([store.loadCapabilities(), preparedWrite]);
|
|
13
|
+
const state = new InMemoryRouterAbEd25519YaoRecoveryStateV1();
|
|
14
|
+
for (const [key, capability] of snapshot.value.recoveryCapabilities) state.capabilities.set(key, capability);
|
|
15
|
+
for (const [key, capabilityKey] of snapshot.value.recoveryIdentityCapabilities) state.identityCapabilities.set(key, capabilityKey);
|
|
16
|
+
const result = install(new InMemoryRouterAbEd25519YaoRecoveryService({
|
|
17
|
+
admitRecovery: rejectProtocolExecution,
|
|
18
|
+
resolveRecoveryDispatchRoot: rejectProtocolExecution,
|
|
19
|
+
executeRecovery: rejectProtocolExecution,
|
|
20
|
+
activateRecovery: rejectProtocolExecution
|
|
21
|
+
}, state));
|
|
22
|
+
if (!result.ok) return result;
|
|
23
|
+
if ((await store.commitCapabilities(snapshot, {
|
|
24
|
+
capabilities: state.capabilities,
|
|
25
|
+
identityCapabilities: state.identityCapabilities
|
|
26
|
+
}, companionWrite)).kind === "stored") return result;
|
|
27
|
+
}
|
|
28
|
+
throw new Error("Capability state remained contended after one reconciliation");
|
|
29
|
+
}
|
|
30
|
+
function installRegistration(input, service) {
|
|
31
|
+
return service.installRegistrationFinalizeCapability(input);
|
|
32
|
+
}
|
|
33
|
+
function installPersisted(input, service) {
|
|
34
|
+
return service.installPersistedActiveCapability(input);
|
|
35
|
+
}
|
|
36
|
+
function rejectProtocolExecution() {
|
|
37
|
+
throw new Error("A capability commit cannot execute a protocol");
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { commitRouterAbEd25519YaoRegistrationCapability, rehydrateRouterAbEd25519YaoCapability };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=routerAbEd25519YaoCapabilityCommit.js.map
|
|
@@ -92,6 +92,23 @@ function isWalletOwnershipMap(input) {
|
|
|
92
92
|
}
|
|
93
93
|
return true;
|
|
94
94
|
}
|
|
95
|
+
function hasIntentAuthorityGeneration(input) {
|
|
96
|
+
return isPlainObject(input) && INTENT_AUTHORITY_KINDS.has(String(input.kind)) && typeof input.ownershipGeneration === "number" && Number.isSafeInteger(input.ownershipGeneration) && input.ownershipGeneration > 0;
|
|
97
|
+
}
|
|
98
|
+
function hasRecoveryOwnershipGenerations(input) {
|
|
99
|
+
if (!(input instanceof Map)) return false;
|
|
100
|
+
for (const state of input.values()) {
|
|
101
|
+
if (!isPlainObject(state) || !isPlainObject(state.context)) return false;
|
|
102
|
+
const authorization = state.context.authorization;
|
|
103
|
+
if (!isPlainObject(authorization) || typeof authorization.ownershipGeneration !== "number" || !Number.isSafeInteger(authorization.ownershipGeneration) || authorization.ownershipGeneration < 1) return false;
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
function hasExportOwnershipGenerations(input) {
|
|
108
|
+
if (!(input instanceof Map)) return false;
|
|
109
|
+
for (const state of input.values()) if (!isPlainObject(state) || typeof state.ownershipGeneration !== "number" || !Number.isSafeInteger(state.ownershipGeneration) || state.ownershipGeneration < 1) return false;
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
95
112
|
function hasProductStateCollections(input) {
|
|
96
113
|
if (!isPlainObject(input)) return false;
|
|
97
114
|
if (input.kind !== "router_ab_ed25519_yao_product_registration_state_v1") return false;
|
|
@@ -100,7 +117,7 @@ function hasProductStateCollections(input) {
|
|
|
100
117
|
const recovery = input.recovery;
|
|
101
118
|
const exportState = input.export;
|
|
102
119
|
if (!isPlainObject(registration) || !isPlainObject(authorization) || !isPlainObject(recovery) || !isPlainObject(exportState)) return false;
|
|
103
|
-
return isStringMapWithStateKinds(registration.states, REGISTRATION_STATE_KINDS) && isStringMap(registration.lifecycleSessions) && (registration.admissionClaims === void 0 || isStringMapWithStateKinds(registration.admissionClaims, REGISTRATION_ADMISSION_CLAIM_KINDS)) && isDispatchRootMap(registration.dispatchRoots) && Array.isArray(authorization.authorities) && authorization.authorities.every(
|
|
120
|
+
return isStringMapWithStateKinds(registration.states, REGISTRATION_STATE_KINDS) && isStringMap(registration.lifecycleSessions) && (registration.admissionClaims === void 0 || isStringMapWithStateKinds(registration.admissionClaims, REGISTRATION_ADMISSION_CLAIM_KINDS)) && isDispatchRootMap(registration.dispatchRoots) && Array.isArray(authorization.authorities) && authorization.authorities.every(hasIntentAuthorityGeneration) && isStringMapWithStateKinds(recovery.capabilities, CAPABILITY_STATE_KINDS) && isStringMap(recovery.identityCapabilities) && isStringMapWithStateKinds(recovery.recoveries, RECOVERY_STATE_KINDS) && hasRecoveryOwnershipGenerations(recovery.recoveries) && isStringMap(recovery.recoverySessions) && isStringMapWithStateKinds(exportState.exports, EXPORT_STATE_KINDS) && hasExportOwnershipGenerations(exportState.exports) && isWalletOwnershipMap(exportState.authorizationNonceOwners) && isWalletOwnershipMap(exportState.authorizationUncertainOwners);
|
|
104
121
|
}
|
|
105
122
|
function parseRouterAbEd25519YaoProductRegistrationStateV1(input) {
|
|
106
123
|
if (!hasProductStateCollections(input)) return {
|
|
@@ -202,17 +219,26 @@ var RouterAbEd25519YaoProductRegistrationRuntime = class {
|
|
|
202
219
|
async bindVerifiedIntent(input) {
|
|
203
220
|
return await this.input.authorization.bindVerifiedIntent(input);
|
|
204
221
|
}
|
|
222
|
+
/** The registration service of this runtime resolves the tenant root when it executes. */
|
|
223
|
+
startRegistrationDispatchRoot() {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
205
226
|
async bindAndAdmitVerifiedRegistration(input) {
|
|
206
|
-
const bound = await this.input.authorization.
|
|
227
|
+
const bound = await this.input.authorization.bindAndAuthorizeAdmission(input);
|
|
207
228
|
if (!bound.ok) return bound;
|
|
208
|
-
|
|
229
|
+
const admitted = await this.input.registrationService.admit(bound.admissionRequest);
|
|
230
|
+
if (!admitted.ok) return admitted;
|
|
231
|
+
return {
|
|
232
|
+
ok: true,
|
|
233
|
+
status: 200,
|
|
234
|
+
admissionRequest: bound.admissionRequest,
|
|
235
|
+
value: admitted.value,
|
|
236
|
+
companionWrite: "not_committed"
|
|
237
|
+
};
|
|
209
238
|
}
|
|
210
239
|
async consumeActivated(request) {
|
|
211
240
|
return await this.input.registrationService.consumeActivated(request);
|
|
212
241
|
}
|
|
213
|
-
async installRegistrationFinalizeCapability(input) {
|
|
214
|
-
return await this.input.capabilityInstaller.installRegistrationFinalizeCapability(input);
|
|
215
|
-
}
|
|
216
242
|
async installPersistedActiveCapability(input) {
|
|
217
243
|
return await this.input.capabilityInstaller.installPersistedActiveCapability(input);
|
|
218
244
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { buildRouterAbEd25519YaoRegistrationExecutionAuthorityV1 } from "../registration/routerAbEd25519YaoRegistrationExecutionRecord.js";
|
|
1
2
|
import { createRouterAbEd25519YaoProductRegistrationStateV1 } from "./routerAbEd25519YaoProductRegistration.js";
|
|
2
3
|
import { encodeRouterAbEd25519YaoProductRegistrationStateV1, parseRouterAbEd25519YaoProductRegistrationStateJsonV1 } from "./routerAbEd25519YaoProductRegistrationPersistence.js";
|
|
3
4
|
import { boundedRouterAbEd25519YaoProductRegistrationSharedStateV1, mergeRouterAbEd25519YaoProductRegistrationStatePartitionV1, partitionRouterAbEd25519YaoProductRegistrationStateV1 } from "./routerAbEd25519YaoProductRegistrationPartitioning.js";
|
|
4
|
-
import { buildRouterAbEd25519YaoRegistrationExecutionAuthorityV1 } from "../registration/routerAbEd25519YaoRegistrationExecutionRecord.js";
|
|
5
5
|
//#region src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.ts
|
|
6
6
|
const ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1 = "router-ab-ed25519-yao:shared";
|
|
7
7
|
const PARTITION_RECORD_CODEC_KIND = "router_ab_ed25519_yao_product_registration_partition_record_json_v1";
|
|
@@ -159,6 +159,66 @@ var RouterAbEd25519YaoProductRegistrationPartitionedStateStore = class {
|
|
|
159
159
|
});
|
|
160
160
|
return await this.store.putMany(encodedMutations, companion);
|
|
161
161
|
}
|
|
162
|
+
async loadCapabilities() {
|
|
163
|
+
return readSharedRecord(readManyEntry(await this.readMany([ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1]), ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1));
|
|
164
|
+
}
|
|
165
|
+
async commitCapabilities(snapshot, mutation, companionWrite) {
|
|
166
|
+
const shared = boundedRouterAbEd25519YaoProductRegistrationSharedStateV1({
|
|
167
|
+
kind: "router_ab_ed25519_yao_product_registration_shared_state_v1",
|
|
168
|
+
recoveryCapabilities: mutation.capabilities,
|
|
169
|
+
recoveryIdentityCapabilities: mutation.identityCapabilities,
|
|
170
|
+
recoverySessions: snapshot.value.recoverySessions,
|
|
171
|
+
exportAuthorizationNonceOwners: snapshot.value.exportAuthorizationNonceOwners,
|
|
172
|
+
exportAuthorizationUncertainOwners: snapshot.value.exportAuthorizationUncertainOwners
|
|
173
|
+
});
|
|
174
|
+
if (companionWrite === null && sameRouterAbEd25519YaoSharedStateCanonicalEncodingV1(encodeSharedStateCanonicalEncoding(shared), encodeSharedStateCanonicalEncoding(snapshot.value))) return {
|
|
175
|
+
kind: "stored",
|
|
176
|
+
versions: []
|
|
177
|
+
};
|
|
178
|
+
return await this.putMany([{
|
|
179
|
+
key: ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1,
|
|
180
|
+
expectedVersion: snapshot.version,
|
|
181
|
+
value: {
|
|
182
|
+
kind: SHARED_RECORD_KIND,
|
|
183
|
+
value: shared
|
|
184
|
+
}
|
|
185
|
+
}], companionWrite);
|
|
186
|
+
}
|
|
187
|
+
async loadRegistration(lifecycleId) {
|
|
188
|
+
const normalizedLifecycleId = requireLifecycleId(lifecycleId);
|
|
189
|
+
const ceremony = readCeremonyRecord(readManyEntry(await this.readMany([normalizedLifecycleId]), normalizedLifecycleId), normalizedLifecycleId);
|
|
190
|
+
const state = materializeState(readSharedRecord({ kind: "missing" }).value, ceremony.value);
|
|
191
|
+
return {
|
|
192
|
+
lifecycleId: normalizedLifecycleId,
|
|
193
|
+
state: {
|
|
194
|
+
registration: state.registration,
|
|
195
|
+
authorization: state.authorization
|
|
196
|
+
},
|
|
197
|
+
baseline: {
|
|
198
|
+
version: ceremony.version,
|
|
199
|
+
recovery: ceremony.value.recovery,
|
|
200
|
+
export: ceremony.value.export
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
async commitRegistration(snapshot, companionWrite) {
|
|
205
|
+
return await this.putMany([{
|
|
206
|
+
key: snapshot.lifecycleId,
|
|
207
|
+
expectedVersion: snapshot.baseline.version,
|
|
208
|
+
value: {
|
|
209
|
+
kind: CEREMONY_RECORD_KIND,
|
|
210
|
+
lifecycleId: snapshot.lifecycleId,
|
|
211
|
+
value: {
|
|
212
|
+
kind: "router_ab_ed25519_yao_product_registration_ceremony_state_v1",
|
|
213
|
+
lifecycleId: snapshot.lifecycleId,
|
|
214
|
+
registration: snapshot.state.registration,
|
|
215
|
+
authorization: snapshot.state.authorization,
|
|
216
|
+
recovery: snapshot.baseline.recovery,
|
|
217
|
+
export: snapshot.baseline.export
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}], companionWrite);
|
|
221
|
+
}
|
|
162
222
|
async load(lifecycleId) {
|
|
163
223
|
const normalizedLifecycleId = requireLifecycleId(lifecycleId);
|
|
164
224
|
const entries = await this.readMany([ROUTER_AB_ED25519_YAO_SHARED_STATE_RECORD_KEY_V1, normalizedLifecycleId]);
|
|
@@ -9,7 +9,10 @@ function createRouterAbEd25519YaoCeremonyStateStoreV1(store) {
|
|
|
9
9
|
put: async (key, value, expectedVersion) => await store.put(key.lifecycleId, value, expectedVersion)
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
|
-
const CODEC_KIND = "
|
|
12
|
+
const CODEC_KIND = "router_ab_ed25519_yao_product_registration_state_json_v4";
|
|
13
|
+
const RECOVERY_GENERATION_CODEC_KIND = "router_ab_ed25519_yao_product_registration_state_json_v3";
|
|
14
|
+
const REGISTRATION_GENERATION_CODEC_KIND = "router_ab_ed25519_yao_product_registration_state_json_v2";
|
|
15
|
+
const FIXED_HOME_CODEC_KIND = "router_ab_ed25519_yao_product_registration_state_json_v1";
|
|
13
16
|
const MAP_KIND = "map_v1";
|
|
14
17
|
const SET_KIND = "set_v1";
|
|
15
18
|
const BYTES_KIND = "bytes_v1";
|
|
@@ -23,12 +26,76 @@ function encodeRouterAbEd25519YaoProductRegistrationStateV1(state) {
|
|
|
23
26
|
}
|
|
24
27
|
function parseRouterAbEd25519YaoProductRegistrationStateJsonV1(input) {
|
|
25
28
|
const record = exactRouterAbEd25519YaoProductRegistrationStateEnvelopeV1(input);
|
|
26
|
-
if (record === null || record.kind !== CODEC_KIND) return null;
|
|
29
|
+
if (record === null || record.kind !== CODEC_KIND && record.kind !== FIXED_HOME_CODEC_KIND && record.kind !== REGISTRATION_GENERATION_CODEC_KIND && record.kind !== RECOVERY_GENERATION_CODEC_KIND) return null;
|
|
27
30
|
const decoded = decodeRouterAbEd25519YaoProductRegistrationStateValueV1(record.state);
|
|
28
31
|
if (!decoded.ok || !isRouterAbEd25519YaoProductRegistrationJsonObjectV1(decoded.value)) return null;
|
|
29
|
-
const
|
|
32
|
+
const state = record.kind === FIXED_HOME_CODEC_KIND ? normalizeFixedHomeAuthorities(decoded.value) : decoded.value;
|
|
33
|
+
const recoveryNormalized = record.kind === CODEC_KIND || record.kind === RECOVERY_GENERATION_CODEC_KIND ? state : normalizeFixedHomeRecoveries(state);
|
|
34
|
+
const parsed = parseRouterAbEd25519YaoProductRegistrationStateV1(record.kind === CODEC_KIND ? recoveryNormalized : normalizeFixedHomeExports(recoveryNormalized));
|
|
30
35
|
return parsed.ok ? parsed.value : null;
|
|
31
36
|
}
|
|
37
|
+
function normalizeFixedHomeAuthority(input) {
|
|
38
|
+
if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(input)) return input;
|
|
39
|
+
if (Object.prototype.hasOwnProperty.call(input, "ownershipGeneration")) return input;
|
|
40
|
+
return {
|
|
41
|
+
...input,
|
|
42
|
+
ownershipGeneration: 1
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function normalizeFixedHomeAuthorities(state) {
|
|
46
|
+
const authorization = state.authorization;
|
|
47
|
+
if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(authorization)) return state;
|
|
48
|
+
if (!Array.isArray(authorization.authorities)) return state;
|
|
49
|
+
return {
|
|
50
|
+
...state,
|
|
51
|
+
authorization: {
|
|
52
|
+
...authorization,
|
|
53
|
+
authorities: authorization.authorities.map(normalizeFixedHomeAuthority)
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function normalizeFixedHomeRecovery(input) {
|
|
58
|
+
if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(input)) return input;
|
|
59
|
+
const context = input.context;
|
|
60
|
+
if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(context)) return input;
|
|
61
|
+
return {
|
|
62
|
+
...input,
|
|
63
|
+
context: {
|
|
64
|
+
...context,
|
|
65
|
+
authorization: normalizeFixedHomeAuthority(context.authorization)
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function normalizeFixedHomeRecoveries(input) {
|
|
70
|
+
if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(input)) return input;
|
|
71
|
+
const recovery = input.recovery;
|
|
72
|
+
if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(recovery)) return input;
|
|
73
|
+
if (!(recovery.recoveries instanceof Map)) return input;
|
|
74
|
+
const recoveries = /* @__PURE__ */ new Map();
|
|
75
|
+
for (const [key, value] of recovery.recoveries) recoveries.set(key, normalizeFixedHomeRecovery(value));
|
|
76
|
+
return {
|
|
77
|
+
...input,
|
|
78
|
+
recovery: {
|
|
79
|
+
...recovery,
|
|
80
|
+
recoveries
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function normalizeFixedHomeExports(input) {
|
|
85
|
+
if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(input)) return input;
|
|
86
|
+
const exportState = input.export;
|
|
87
|
+
if (!isRouterAbEd25519YaoProductRegistrationJsonObjectV1(exportState)) return input;
|
|
88
|
+
if (!(exportState.exports instanceof Map)) return input;
|
|
89
|
+
const exports = /* @__PURE__ */ new Map();
|
|
90
|
+
for (const [key, value] of exportState.exports) exports.set(key, normalizeFixedHomeAuthority(value));
|
|
91
|
+
return {
|
|
92
|
+
...input,
|
|
93
|
+
export: {
|
|
94
|
+
...exportState,
|
|
95
|
+
exports
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
32
99
|
function parseRouterAbEd25519YaoCeremonyKeyV1(input) {
|
|
33
100
|
const record = readRouterAbEd25519YaoCeremonyKeyObjectV1(input);
|
|
34
101
|
if (record === null) return null;
|
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
import { InMemoryRouterAbEd25519YaoRegistrationService } from "../registration/routerAbEd25519YaoRegistration.js";
|
|
2
2
|
import { InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter } from "../registration/routerAbEd25519YaoRegistrationIntentAuthorization.js";
|
|
3
|
-
import { InMemoryRouterAbEd25519YaoRecoveryService } from "../recovery/routerAbEd25519YaoRecovery.js";
|
|
4
|
-
import { routerAbEd25519YaoPersistedCapabilityMatchesLookupV1 } from "./routerAbEd25519YaoProductRegistration.js";
|
|
5
|
-
import { parseRouterAbEd25519YaoRegistrationRouterAnswerV1 } from "../registration/routerAbEd25519YaoHttpRegistrationBackend.js";
|
|
6
3
|
import { pinRouterAbEd25519YaoRegistrationDispatchRootV1, routerAbEd25519YaoRegistrationExecuteRequestFromRouterRequestJsonV1, routerAbEd25519YaoRegistrationResultFromRouterAnswerV1 } from "../registration/routerAbEd25519YaoRegistrationExecutionRecord.js";
|
|
4
|
+
import { resolveRouterAbEd25519YaoActiveCapability } from "../recovery/routerAbEd25519YaoRecovery.js";
|
|
5
|
+
import { routerAbEd25519YaoRegistrationSigningRootIdV1 } from "../routerAbEd25519YaoGatewayEnvelope.js";
|
|
6
|
+
import { routerAbEd25519YaoPersistedCapabilityMatchesLookupV1 } from "./routerAbEd25519YaoProductRegistration.js";
|
|
7
7
|
import { routerAbEd25519YaoAdmittedRegistrationAuthorityV1 } from "./routerAbEd25519YaoProductRegistrationPartitionedStateStore.js";
|
|
8
|
+
import { parseRouterAbEd25519YaoRegistrationRouterAnswerV1 } from "../registration/routerAbEd25519YaoHttpRegistrationBackend.js";
|
|
9
|
+
import { rehydrateRouterAbEd25519YaoCapability } from "./routerAbEd25519YaoCapabilityCommit.js";
|
|
8
10
|
//#region src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.ts
|
|
9
|
-
const SHARED_CAPABILITY_READ_LIFECYCLE_ID = "shared-capability-read";
|
|
10
11
|
const MAX_DETERMINISTIC_COMMIT_ATTEMPTS = 2;
|
|
11
|
-
const UNUSED_BACKEND = {
|
|
12
|
-
admit: rejectUnusedBackend,
|
|
13
|
-
execute: rejectUnusedBackend,
|
|
14
|
-
admitRecovery: rejectUnusedBackend,
|
|
15
|
-
resolveRecoveryDispatchRoot: rejectUnusedBackend,
|
|
16
|
-
executeRecovery: rejectUnusedBackend,
|
|
17
|
-
activateRecovery: rejectUnusedBackend
|
|
18
|
-
};
|
|
19
12
|
/**
|
|
20
13
|
* Product-state runtime for wallet start/finalize routes. Each mutation loads
|
|
21
14
|
* fresh partitioned state and reconciles CAS conflicts by reapplying only the
|
|
@@ -33,11 +26,28 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
|
|
|
33
26
|
if (!this.signingWorkerId) throw new Error("Ed25519 Yao SigningWorker ID is required");
|
|
34
27
|
}
|
|
35
28
|
async bindVerifiedIntent(input) {
|
|
36
|
-
|
|
29
|
+
for (let attempt = 0; attempt < MAX_DETERMINISTIC_COMMIT_ATTEMPTS; attempt += 1) {
|
|
30
|
+
const loaded = await this.input.store.loadRegistration(input.admissionRequest.scope.lifecycle_id);
|
|
31
|
+
const result = await new InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter(loaded.state.authorization).bindVerifiedIntent(input);
|
|
32
|
+
if (!result.ok) return result;
|
|
33
|
+
if ((await this.input.store.commitRegistration(loaded, null)).kind !== "stored") continue;
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
throw new Error("Registration intent remained contended after one reconciliation");
|
|
37
|
+
}
|
|
38
|
+
startRegistrationDispatchRoot(signingRootId) {
|
|
39
|
+
const dispatchRoot = this.input.registrationBackend.resolveRegistrationDispatchRoot(signingRootId);
|
|
40
|
+
dispatchRoot.catch(ignoreUnobservedDispatchRoot);
|
|
41
|
+
return {
|
|
42
|
+
signingRootId,
|
|
43
|
+
dispatchRoot
|
|
44
|
+
};
|
|
37
45
|
}
|
|
38
|
-
async bindAndAdmitVerifiedRegistration(input) {
|
|
46
|
+
async bindAndAdmitVerifiedRegistration(input, companionWrite, startedDispatchRoot) {
|
|
39
47
|
return await bindAndAdmitVerifiedRegistration({
|
|
40
48
|
input,
|
|
49
|
+
companionWrite,
|
|
50
|
+
startedDispatchRoot,
|
|
41
51
|
store: this.input.store,
|
|
42
52
|
backend: this.input.registrationBackend
|
|
43
53
|
});
|
|
@@ -51,7 +61,7 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
|
|
|
51
61
|
*/
|
|
52
62
|
async consumeActivated(input) {
|
|
53
63
|
const lifecycleId = input.reference.lifecycleId;
|
|
54
|
-
const authority = routerAbEd25519YaoAdmittedRegistrationAuthorityV1((await this.input.store.
|
|
64
|
+
const authority = routerAbEd25519YaoAdmittedRegistrationAuthorityV1((await this.input.store.loadRegistration(lifecycleId)).state, lifecycleId);
|
|
55
65
|
if (!authority) return {
|
|
56
66
|
ok: false,
|
|
57
67
|
code: "unknown_registration",
|
|
@@ -59,9 +69,7 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
|
|
|
59
69
|
};
|
|
60
70
|
const backend = this.input.registrationBackend;
|
|
61
71
|
const consumed = await backend.consumeRegistration({
|
|
62
|
-
|
|
63
|
-
walletId: authority.admissionReceipt.binding.lifecycle.account_id,
|
|
64
|
-
lifecycleId,
|
|
72
|
+
authority,
|
|
65
73
|
sessionId: input.reference.sessionId,
|
|
66
74
|
consumerBinding: input.consumerBinding
|
|
67
75
|
});
|
|
@@ -91,14 +99,11 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
|
|
|
91
99
|
}
|
|
92
100
|
};
|
|
93
101
|
}
|
|
94
|
-
async installRegistrationFinalizeCapability(input) {
|
|
95
|
-
return await this.commitUntilReconciled(input.registrationAdmissionRequest.scope.lifecycle_id, installRegistrationFinalizeCapabilityMutation.bind(void 0, input));
|
|
96
|
-
}
|
|
97
102
|
async installPersistedActiveCapability(input) {
|
|
98
|
-
return await this.
|
|
103
|
+
return await rehydrateRouterAbEd25519YaoCapability(this.input.store, input);
|
|
99
104
|
}
|
|
100
105
|
async resolveActiveCapability(input) {
|
|
101
|
-
const result =
|
|
106
|
+
const result = resolveRouterAbEd25519YaoActiveCapability((await this.input.store.loadCapabilities()).value.recoveryCapabilities, input);
|
|
102
107
|
if (result.ok || result.code !== "unknown_capability" || !this.input.loadPersistedActiveCapability) return result;
|
|
103
108
|
const persisted = await this.input.loadPersistedActiveCapability(input);
|
|
104
109
|
if (!persisted || !routerAbEd25519YaoPersistedCapabilityMatchesLookupV1(persisted, input)) return result;
|
|
@@ -108,48 +113,52 @@ var RouterAbEd25519YaoProductRegistrationRequestScopedRuntime = class {
|
|
|
108
113
|
code: "capability_conflict",
|
|
109
114
|
message: installed.message
|
|
110
115
|
};
|
|
111
|
-
return
|
|
112
|
-
}
|
|
113
|
-
async commitUntilReconciled(lifecycleId, mutate) {
|
|
114
|
-
for (let attempt = 0; attempt < MAX_DETERMINISTIC_COMMIT_ATTEMPTS; attempt += 1) {
|
|
115
|
-
const loaded = await this.input.store.load(lifecycleId);
|
|
116
|
-
const mutation = await mutate(loaded.state);
|
|
117
|
-
if (mutation.kind === "reject") return mutation.value;
|
|
118
|
-
if ((await this.input.store.commit(commitInput(lifecycleId, loaded))).kind === "stored") return mutation.value;
|
|
119
|
-
}
|
|
120
|
-
throw new Error("Request-scoped product state remained contended after one reconciliation");
|
|
116
|
+
return resolveRouterAbEd25519YaoActiveCapability((await this.input.store.loadCapabilities()).value.recoveryCapabilities, input);
|
|
121
117
|
}
|
|
122
118
|
};
|
|
123
119
|
/**
|
|
124
120
|
* Binds a verified intent and admits its registration. The tenant root the
|
|
125
121
|
* registration dispatches to is resolved once, for a fresh admission, and
|
|
126
|
-
* pinned with the admission in the ceremony record.
|
|
122
|
+
* pinned with the admission in the ceremony record. A companion write commits
|
|
123
|
+
* in that record's batch.
|
|
127
124
|
*/
|
|
128
125
|
async function bindAndAdmitVerifiedRegistration(input) {
|
|
129
126
|
const lifecycleId = input.input.admissionRequest.scope.lifecycle_id;
|
|
130
127
|
let backendResult = null;
|
|
131
128
|
let dispatchRoot = null;
|
|
132
129
|
for (let attempt = 0; attempt < MAX_DETERMINISTIC_COMMIT_ATTEMPTS; attempt += 1) {
|
|
133
|
-
const loaded = await input.store.
|
|
134
|
-
const bound = await new InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter(loaded.state.authorization).
|
|
130
|
+
const loaded = await input.store.loadRegistration(lifecycleId);
|
|
131
|
+
const bound = await new InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter(loaded.state.authorization).bindAndAuthorizeAdmission(input.input);
|
|
135
132
|
if (!bound.ok) return bound;
|
|
136
133
|
const service = new InMemoryRouterAbEd25519YaoRegistrationService(input.backend, loaded.state.registration);
|
|
137
134
|
const preparation = service.prepareAdmit(bound.admissionRequest);
|
|
138
135
|
if (preparation.kind === "completed") return {
|
|
139
136
|
ok: true,
|
|
140
137
|
status: 200,
|
|
141
|
-
|
|
138
|
+
admissionRequest: bound.admissionRequest,
|
|
139
|
+
value: preparation.value,
|
|
140
|
+
companionWrite: "not_committed"
|
|
142
141
|
};
|
|
143
142
|
if (preparation.kind === "failed") return preparation.failure;
|
|
144
|
-
if (dispatchRoot === null)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
return {
|
|
143
|
+
if (dispatchRoot === null) {
|
|
144
|
+
const signingRootId = routerAbEd25519YaoRegistrationSigningRootIdV1(bound.admissionRequest);
|
|
145
|
+
const started = input.startedDispatchRoot;
|
|
146
|
+
if (started !== null && (started.signingRootId.signing_root_id !== signingRootId.signing_root_id || started.signingRootId.root_share_epoch !== signingRootId.root_share_epoch)) return {
|
|
148
147
|
ok: false,
|
|
149
148
|
status: 503,
|
|
150
149
|
code: "admission_failed",
|
|
151
|
-
message:
|
|
150
|
+
message: "registration tenant root was read for another signing root ID"
|
|
152
151
|
};
|
|
152
|
+
try {
|
|
153
|
+
dispatchRoot = await (started ? started.dispatchRoot : input.backend.resolveRegistrationDispatchRoot(signingRootId));
|
|
154
|
+
} catch (error) {
|
|
155
|
+
return {
|
|
156
|
+
ok: false,
|
|
157
|
+
status: 503,
|
|
158
|
+
code: "admission_failed",
|
|
159
|
+
message: `registration tenant root is unavailable: ${error instanceof Error ? error.message : String(error)}`
|
|
160
|
+
};
|
|
161
|
+
}
|
|
153
162
|
}
|
|
154
163
|
if (backendResult === null) try {
|
|
155
164
|
backendResult = await input.backend.admit(bound.admissionRequest);
|
|
@@ -171,7 +180,13 @@ async function bindAndAdmitVerifiedRegistration(input) {
|
|
|
171
180
|
});
|
|
172
181
|
if (!admitted.ok) return admitted;
|
|
173
182
|
pinRouterAbEd25519YaoRegistrationDispatchRootV1(loaded.state.registration, lifecycleId, dispatchRoot);
|
|
174
|
-
if ((await input.store.
|
|
183
|
+
if ((await input.store.commitRegistration(loaded, input.companionWrite?.(bound.admissionRequest) ?? null)).kind === "stored") return {
|
|
184
|
+
ok: true,
|
|
185
|
+
status: 200,
|
|
186
|
+
admissionRequest: bound.admissionRequest,
|
|
187
|
+
value: admitted.value,
|
|
188
|
+
companionWrite: input.companionWrite ? "committed" : "not_committed"
|
|
189
|
+
};
|
|
175
190
|
}
|
|
176
191
|
return {
|
|
177
192
|
ok: false,
|
|
@@ -180,50 +195,7 @@ async function bindAndAdmitVerifiedRegistration(input) {
|
|
|
180
195
|
message: "Yao verified registration admission remained contended after one reconciliation"
|
|
181
196
|
};
|
|
182
197
|
}
|
|
183
|
-
|
|
184
|
-
const result = await new InMemoryRouterAbEd25519YaoRegistrationIntentAuthorizationAdapter(state.authorization).bindVerifiedIntent(input);
|
|
185
|
-
return result.ok ? {
|
|
186
|
-
kind: "commit",
|
|
187
|
-
value: result
|
|
188
|
-
} : {
|
|
189
|
-
kind: "reject",
|
|
190
|
-
value: result
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
async function installRegistrationFinalizeCapabilityMutation(input, state) {
|
|
194
|
-
const result = recoveryService(state).installRegistrationFinalizeCapability(input);
|
|
195
|
-
return result.ok ? {
|
|
196
|
-
kind: "commit",
|
|
197
|
-
value: result
|
|
198
|
-
} : {
|
|
199
|
-
kind: "reject",
|
|
200
|
-
value: result
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
async function installPersistedActiveCapabilityMutation(input, state) {
|
|
204
|
-
const result = recoveryService(state).installPersistedActiveCapability(input);
|
|
205
|
-
return result.ok ? {
|
|
206
|
-
kind: "commit",
|
|
207
|
-
value: result
|
|
208
|
-
} : {
|
|
209
|
-
kind: "reject",
|
|
210
|
-
value: result
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
function recoveryService(state) {
|
|
214
|
-
return new InMemoryRouterAbEd25519YaoRecoveryService(UNUSED_BACKEND, state.recovery);
|
|
215
|
-
}
|
|
216
|
-
function commitInput(lifecycleId, loaded) {
|
|
217
|
-
return {
|
|
218
|
-
lifecycleId,
|
|
219
|
-
state: loaded.state,
|
|
220
|
-
baseline: loaded.baseline,
|
|
221
|
-
companionWrite: null
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
async function rejectUnusedBackend() {
|
|
225
|
-
throw new Error("Request-scoped product runtime invoked an unavailable protocol backend");
|
|
226
|
-
}
|
|
198
|
+
function ignoreUnobservedDispatchRoot() {}
|
|
227
199
|
//#endregion
|
|
228
200
|
export { createRouterAbEd25519YaoProductRegistrationRequestScopedRuntimeV1 };
|
|
229
201
|
|