@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
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { parseWalletId } from "../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
+
import { isPlainObject, requireRecord } from "../../../shared-ts/src/utils/validation.js";
|
|
3
|
+
import { sha256HexUtf8 } from "../../../shared-ts/src/utils/digests.js";
|
|
4
|
+
import { D1WalletCeremonyActivity } from "../d1/ed25519Yao/d1WalletCeremonyActivity.js";
|
|
5
|
+
import { D1WalletRelocationApprovals } from "../d1/wallet/d1WalletRelocationApprovals.js";
|
|
6
|
+
import { AuthorizationSnapshotLayout } from "../d1/wallet/authorizationSnapshotLayout.js";
|
|
7
|
+
import { D1WalletAuthorizationHistory } from "../d1/wallet/d1WalletAuthorizationHistory.js";
|
|
8
|
+
import { D1WalletAuthorizationSnapshot } from "../d1/wallet/d1WalletAuthorizationSnapshot.js";
|
|
9
|
+
import { D1WalletAuthorizationIntake } from "../d1/wallet/d1WalletAuthorizationIntake.js";
|
|
10
|
+
import { D1WalletAuthorizationCleanup } from "../d1/wallet/d1WalletAuthorizationCleanup.js";
|
|
11
|
+
import { D1WalletRelocationSessions, WalletRelocationSessionSource } from "../d1/wallet/d1WalletRelocationSessions.js";
|
|
12
|
+
import { D1WalletRelocationWriteBlock } from "../d1/wallet/d1WalletRelocationWriteBlock.js";
|
|
13
|
+
//#region src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.ts
|
|
14
|
+
const BASE_PATH = "/internal/wallet-relocation/v1/authorization";
|
|
15
|
+
const ORIGIN = "https://wallet-relocation.internal";
|
|
16
|
+
var WalletAuthorizationRelocationRoutes = class {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.options = options;
|
|
19
|
+
this.kind = "fetch_route_extension";
|
|
20
|
+
this.id = "wallet_authorization_relocation";
|
|
21
|
+
this.routes = [
|
|
22
|
+
{
|
|
23
|
+
id: "wallet_authorization_block",
|
|
24
|
+
surface: "relay",
|
|
25
|
+
method: "POST",
|
|
26
|
+
path: `${BASE_PATH}/block`,
|
|
27
|
+
auth: {
|
|
28
|
+
plane: "public",
|
|
29
|
+
rationale: "The private Console binding holds a wallet-local capacity block after destination preparation."
|
|
30
|
+
},
|
|
31
|
+
metering: { kind: "none" },
|
|
32
|
+
summary: "Reserve source snapshot capacity"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "wallet_authorization_release",
|
|
36
|
+
surface: "relay",
|
|
37
|
+
method: "POST",
|
|
38
|
+
path: `${BASE_PATH}/release`,
|
|
39
|
+
auth: {
|
|
40
|
+
plane: "public",
|
|
41
|
+
rationale: "Console durably rejects admission before releasing the source block."
|
|
42
|
+
},
|
|
43
|
+
metering: { kind: "none" },
|
|
44
|
+
summary: "Release an unadmitted source block"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "wallet_authorization_schema",
|
|
48
|
+
surface: "relay",
|
|
49
|
+
method: "POST",
|
|
50
|
+
path: `${BASE_PATH}/schema`,
|
|
51
|
+
auth: {
|
|
52
|
+
plane: "public",
|
|
53
|
+
rationale: "The private Console binding checks source schema before relocation preparation."
|
|
54
|
+
},
|
|
55
|
+
metering: { kind: "none" },
|
|
56
|
+
summary: "Read authorization transfer schema identity"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "wallet_authorization_reserve",
|
|
60
|
+
surface: "relay",
|
|
61
|
+
method: "POST",
|
|
62
|
+
path: `${BASE_PATH}/reserve`,
|
|
63
|
+
auth: {
|
|
64
|
+
plane: "public",
|
|
65
|
+
rationale: "The private Console binding prepares an empty destination before source pause."
|
|
66
|
+
},
|
|
67
|
+
metering: { kind: "none" },
|
|
68
|
+
summary: "Reserve inactive authorization destination"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "wallet_relocation_owner_approval",
|
|
72
|
+
surface: "relay",
|
|
73
|
+
method: "POST",
|
|
74
|
+
path: `${BASE_PATH}/owner-approval`,
|
|
75
|
+
auth: {
|
|
76
|
+
plane: "public",
|
|
77
|
+
rationale: "The internal binding reads fresh durable owner approval for Console admission."
|
|
78
|
+
},
|
|
79
|
+
metering: { kind: "none" },
|
|
80
|
+
summary: "Read fresh owner approval for relocation admission"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: "wallet_authorization_cleanup",
|
|
84
|
+
surface: "relay",
|
|
85
|
+
method: "POST",
|
|
86
|
+
path: `${BASE_PATH}/cleanup`,
|
|
87
|
+
auth: {
|
|
88
|
+
plane: "public",
|
|
89
|
+
rationale: "Console must authorize cleanup after destination activation with the pinned authorization manifest."
|
|
90
|
+
},
|
|
91
|
+
metering: { kind: "none" },
|
|
92
|
+
summary: "Delete one bounded batch of obsolete source authorization state"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: "wallet_authorization_activate",
|
|
96
|
+
surface: "relay",
|
|
97
|
+
method: "POST",
|
|
98
|
+
path: `${BASE_PATH}/activate`,
|
|
99
|
+
auth: {
|
|
100
|
+
plane: "public",
|
|
101
|
+
rationale: "Console must authorize activation after cutover with the pinned authorization manifest."
|
|
102
|
+
},
|
|
103
|
+
metering: { kind: "none" },
|
|
104
|
+
summary: "Activate the verified authorization destination"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: "wallet_authorization_freeze",
|
|
108
|
+
surface: "relay",
|
|
109
|
+
method: "POST",
|
|
110
|
+
path: `${BASE_PATH}/freeze`,
|
|
111
|
+
auth: {
|
|
112
|
+
plane: "public",
|
|
113
|
+
rationale: "The handler requires an internal origin and a live Console-authorized gateway freeze command."
|
|
114
|
+
},
|
|
115
|
+
metering: { kind: "none" },
|
|
116
|
+
summary: "Freeze and capture admitted authorization history"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "wallet_authorization_export",
|
|
120
|
+
surface: "relay",
|
|
121
|
+
method: "POST",
|
|
122
|
+
path: `${BASE_PATH}/export`,
|
|
123
|
+
auth: {
|
|
124
|
+
plane: "public",
|
|
125
|
+
rationale: "The handler requires an internal origin and a live Console-authorized source export command."
|
|
126
|
+
},
|
|
127
|
+
metering: { kind: "none" },
|
|
128
|
+
summary: "Export the sealed authorization snapshot"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: "wallet_authorization_import",
|
|
132
|
+
surface: "relay",
|
|
133
|
+
method: "POST",
|
|
134
|
+
path: `${BASE_PATH}/import`,
|
|
135
|
+
auth: {
|
|
136
|
+
plane: "public",
|
|
137
|
+
rationale: "Console authorizes an atomic import of the pinned snapshot."
|
|
138
|
+
},
|
|
139
|
+
metering: { kind: "none" },
|
|
140
|
+
summary: "Import and verify the complete authorization snapshot"
|
|
141
|
+
}
|
|
142
|
+
];
|
|
143
|
+
}
|
|
144
|
+
async ownerApproval(body) {
|
|
145
|
+
const walletId = parseWalletId(body.walletId);
|
|
146
|
+
if (Object.keys(body).length !== 5 || !walletId.ok || typeof body.moveId !== "string" || !/^wmove_[A-Za-z0-9_-]{43}$/u.test(body.moveId) || typeof body.requestDigest !== "string" || !/^[a-f0-9]{64}$/u.test(body.requestDigest) || typeof body.authorityId !== "string" || typeof body.sourceGeneration !== "number" || !Number.isSafeInteger(body.sourceGeneration) || body.sourceGeneration < 1) return failure("invalid_input", 400);
|
|
147
|
+
const approvals = new D1WalletRelocationApprovals(this.options.database, this.options.scope);
|
|
148
|
+
const stored = await approvals.find(walletId.value, body.moveId);
|
|
149
|
+
if (!stored || stored.binding.requestDigestHex !== body.requestDigest || stored.binding.authorityId !== body.authorityId || stored.binding.sourceGeneration !== body.sourceGeneration) return Response.json({ kind: "denied" }, { headers: { "Cache-Control": "no-store" } });
|
|
150
|
+
const approval = await approvals.readForAdmission(stored.binding, Date.now());
|
|
151
|
+
if (!approval) return Response.json({ kind: "denied" }, { headers: { "Cache-Control": "no-store" } });
|
|
152
|
+
return Response.json({
|
|
153
|
+
kind: "approved",
|
|
154
|
+
requestDigest: approval.binding.requestDigestHex,
|
|
155
|
+
authorityId: approval.binding.authorityId,
|
|
156
|
+
sourceGeneration: approval.binding.sourceGeneration,
|
|
157
|
+
approvedAtMs: approval.approvedAtMs,
|
|
158
|
+
expiresAtMs: approval.expiresAtMs
|
|
159
|
+
}, { headers: { "Cache-Control": "no-store" } });
|
|
160
|
+
}
|
|
161
|
+
async prepareDestination(body, reserve) {
|
|
162
|
+
let source = null;
|
|
163
|
+
try {
|
|
164
|
+
if (reserve) {
|
|
165
|
+
if (Object.keys(body).length !== 2 || typeof body.schemaDigestHex !== "string" || !/^[a-f0-9]{64}$/u.test(body.schemaDigestHex)) return failure("invalid_input", 400);
|
|
166
|
+
source = WalletRelocationSessionSource.parse(body.source);
|
|
167
|
+
} else if (Object.keys(body).length !== 1 || !parseWalletId(body.walletId).ok) return failure("invalid_input", 400);
|
|
168
|
+
} catch {
|
|
169
|
+
return failure("invalid_input", 400);
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const layout = await AuthorizationSnapshotLayout.read(this.options.database);
|
|
173
|
+
const schemaDigestHex = await sha256HexUtf8(JSON.stringify(layout));
|
|
174
|
+
if (source) {
|
|
175
|
+
if (schemaDigestHex !== body.schemaDigestHex) return failure("authorization_schema_conflict", 409);
|
|
176
|
+
await new D1WalletAuthorizationHistory(this.options.database, this.options.scope).prepare(source);
|
|
177
|
+
return Response.json({
|
|
178
|
+
kind: "authorization_reserved",
|
|
179
|
+
source,
|
|
180
|
+
schemaDigestHex
|
|
181
|
+
}, { headers: { "Cache-Control": "no-store" } });
|
|
182
|
+
}
|
|
183
|
+
const walletId = parseWalletId(body.walletId);
|
|
184
|
+
if (!walletId.ok) return failure("invalid_input", 400);
|
|
185
|
+
await new D1WalletAuthorizationSnapshot(this.options.database, this.options.scope).assertCapacity(walletId.value);
|
|
186
|
+
return Response.json({
|
|
187
|
+
kind: "authorization_schema",
|
|
188
|
+
schemaDigestHex
|
|
189
|
+
}, { headers: { "Cache-Control": "no-store" } });
|
|
190
|
+
} catch {
|
|
191
|
+
return failure("authorization_preparation_unavailable", 503);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
handleFetchRoute(input) {
|
|
195
|
+
return this.handle(input.request);
|
|
196
|
+
}
|
|
197
|
+
async capacityBlock(body, release) {
|
|
198
|
+
let source;
|
|
199
|
+
try {
|
|
200
|
+
if (Object.keys(body).length !== 1) return failure("invalid_input", 400);
|
|
201
|
+
source = WalletRelocationSessionSource.parse(body.source);
|
|
202
|
+
} catch {
|
|
203
|
+
return failure("invalid_input", 400);
|
|
204
|
+
}
|
|
205
|
+
const block = new D1WalletRelocationWriteBlock(this.options.database, this.options.scope);
|
|
206
|
+
try {
|
|
207
|
+
if (release) {
|
|
208
|
+
await block.release(source, Date.now());
|
|
209
|
+
return Response.json({ kind: "authorization_released" });
|
|
210
|
+
}
|
|
211
|
+
const state = await block.check(source, Date.now());
|
|
212
|
+
return Response.json({ kind: state === "ready" ? "authorization_blocked" : "authorization_draining" }, { status: state === "ready" ? 200 : 202 });
|
|
213
|
+
} catch {
|
|
214
|
+
return failure("authorization_capacity_unavailable", 409);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async handle(request) {
|
|
218
|
+
const url = new URL(request.url);
|
|
219
|
+
if (url.origin !== ORIGIN || !this.routes.some(matchesAuthorizationPath.bind(null, url.pathname))) return failure("not_found", 404);
|
|
220
|
+
if (request.method !== "POST") return failure("method_not_allowed", 405);
|
|
221
|
+
let body;
|
|
222
|
+
try {
|
|
223
|
+
body = await request.json();
|
|
224
|
+
} catch {
|
|
225
|
+
return failure("invalid_input", 400);
|
|
226
|
+
}
|
|
227
|
+
if (!isPlainObject(body)) return failure("invalid_input", 400);
|
|
228
|
+
if (url.pathname === `${BASE_PATH}/block` || url.pathname === `${BASE_PATH}/release`) return this.capacityBlock(body, url.pathname === `${BASE_PATH}/release`);
|
|
229
|
+
if (url.pathname === `${BASE_PATH}/schema`) return this.prepareDestination(body, false);
|
|
230
|
+
if (url.pathname === `${BASE_PATH}/reserve`) return this.prepareDestination(body, true);
|
|
231
|
+
if (url.pathname === `${BASE_PATH}/owner-approval`) return this.ownerApproval(body);
|
|
232
|
+
let requested;
|
|
233
|
+
try {
|
|
234
|
+
requested = parseAuthorizationOperation(url.pathname, body);
|
|
235
|
+
} catch {
|
|
236
|
+
return failure("invalid_input", 400);
|
|
237
|
+
}
|
|
238
|
+
const commandKind = authorizationCommandKind(requested.kind);
|
|
239
|
+
const walletId = parseWalletId(body.walletId);
|
|
240
|
+
if (!walletId.ok || !isPlainObject(body.attempt)) return failure("invalid_input", 400);
|
|
241
|
+
const wallet = {
|
|
242
|
+
namespace: this.options.scope.namespace,
|
|
243
|
+
organizationId: this.options.scope.orgId,
|
|
244
|
+
projectId: this.options.scope.projectId,
|
|
245
|
+
environmentId: this.options.scope.envId,
|
|
246
|
+
walletId: walletId.value
|
|
247
|
+
};
|
|
248
|
+
let authorized;
|
|
249
|
+
try {
|
|
250
|
+
authorized = await this.options.directory.fetch(new Request("https://wallet-placement.internal/internal/wallet-placement/v1/relocation-command", {
|
|
251
|
+
method: "POST",
|
|
252
|
+
headers: { "Content-Type": "application/json" },
|
|
253
|
+
body: JSON.stringify({
|
|
254
|
+
wallet,
|
|
255
|
+
attempt: body.attempt,
|
|
256
|
+
kind: commandKind
|
|
257
|
+
})
|
|
258
|
+
}));
|
|
259
|
+
} catch {
|
|
260
|
+
return failure("relocation_authority_unavailable", 503);
|
|
261
|
+
}
|
|
262
|
+
if (!authorized.ok) return failure("relocation_command_denied", authorized.status >= 500 ? 503 : 403);
|
|
263
|
+
let source;
|
|
264
|
+
let commandDigest;
|
|
265
|
+
let pinnedManifest;
|
|
266
|
+
try {
|
|
267
|
+
const response = requireRecord(await authorized.json(), "source authorization");
|
|
268
|
+
const command = requireRecord(response.command, "source command");
|
|
269
|
+
const identity = requireRecord(command.wallet, "source wallet");
|
|
270
|
+
const operation = requireRecord(command.operation, "source operation");
|
|
271
|
+
if (response.ok !== true || Object.keys(command).length !== 9 || Object.keys(identity).length !== 5 || command.moveId !== body.attempt.moveId || body.attempt.phase !== authorizationCommandPhase(commandKind) || command.participant !== "gateway" || operation.kind !== commandKind || Object.keys(operation).length !== authorizationCommandFields(commandKind) || command.id !== `${command.moveId}/gateway/${commandKind}`) throw new Error("Source command identity conflicts");
|
|
272
|
+
for (const [key, value] of Object.entries(wallet)) if (identity[key] !== value) throw new Error("Source wallet scope conflicts");
|
|
273
|
+
let sourceGeneration = command.generation;
|
|
274
|
+
if (commandKind !== "freeze") {
|
|
275
|
+
const receipt = requireRecord(operation.receipt, "source-fence receipt");
|
|
276
|
+
const receiptWallet = requireRecord(receipt.wallet, "source-fence wallet");
|
|
277
|
+
if (receipt.kind !== authorizationReceiptKind(commandKind) || receipt.moveId !== command.moveId || typeof receipt.generation !== "number" || command.generation !== receipt.generation + authorizationGenerationOffset(commandKind)) throw new Error("Source export receipt conflicts");
|
|
278
|
+
sourceGeneration = receipt.generation - (commandKind === "activate" || commandKind === "cleanup" ? 1 : 0);
|
|
279
|
+
for (const [key, value] of Object.entries(wallet)) if (receiptWallet[key] !== value) throw new Error("Source export receipt scope conflicts");
|
|
280
|
+
}
|
|
281
|
+
if (commandKind === "import_authorization" || commandKind === "activate") {
|
|
282
|
+
if (typeof operation.physicalResource !== "string" || operation.physicalResource.length === 0) throw new Error("Destination resource is absent");
|
|
283
|
+
pinnedManifest = operation.manifest;
|
|
284
|
+
}
|
|
285
|
+
if (commandKind === "cleanup") pinnedManifest = operation.manifest;
|
|
286
|
+
source = WalletRelocationSessionSource.parse({
|
|
287
|
+
walletId: identity.walletId,
|
|
288
|
+
moveId: command.moveId,
|
|
289
|
+
requestDigestHex: command.requestDigest,
|
|
290
|
+
sourceGeneration
|
|
291
|
+
});
|
|
292
|
+
commandDigest = await sha256HexUtf8(JSON.stringify([
|
|
293
|
+
"seams/wallet-d1-relocation-command/v1",
|
|
294
|
+
command.wallet,
|
|
295
|
+
command.moveId,
|
|
296
|
+
command.requestDigest,
|
|
297
|
+
command.participant,
|
|
298
|
+
command.versionId,
|
|
299
|
+
command.home,
|
|
300
|
+
command.generation,
|
|
301
|
+
command.operation
|
|
302
|
+
]));
|
|
303
|
+
if (response.digest !== commandDigest) throw new Error("Source command digest conflicts");
|
|
304
|
+
} catch {
|
|
305
|
+
return failure("relocation_command_invalid", 502);
|
|
306
|
+
}
|
|
307
|
+
if (requested.kind === "cleanup") try {
|
|
308
|
+
const progress = await new D1WalletAuthorizationCleanup(this.options.database, this.options.scope).advance(source, pinnedManifest, commandDigest, Date.now());
|
|
309
|
+
return Response.json({
|
|
310
|
+
kind: "authorization_cleanup",
|
|
311
|
+
commandDigest,
|
|
312
|
+
progress
|
|
313
|
+
}, {
|
|
314
|
+
status: progress.state === "cleaned" ? 200 : 202,
|
|
315
|
+
headers: { "Cache-Control": "no-store" }
|
|
316
|
+
});
|
|
317
|
+
} catch {
|
|
318
|
+
return failure("authorization_cleanup_incomplete", 503);
|
|
319
|
+
}
|
|
320
|
+
if (requested.kind === "activate") try {
|
|
321
|
+
const activated = await new D1WalletAuthorizationIntake(this.options.database, this.options.scope).activate(source, pinnedManifest, commandDigest, Date.now());
|
|
322
|
+
return Response.json({
|
|
323
|
+
kind: "authorization_activated",
|
|
324
|
+
commandDigest,
|
|
325
|
+
digestHex: activated.digestHex,
|
|
326
|
+
activatedAtMs: activated.activatedAtMs
|
|
327
|
+
}, { headers: { "Cache-Control": "no-store" } });
|
|
328
|
+
} catch {
|
|
329
|
+
return failure("authorization_activation_incomplete", 503);
|
|
330
|
+
}
|
|
331
|
+
if (requested.kind === "import") try {
|
|
332
|
+
const intake = new D1WalletAuthorizationIntake(this.options.database, this.options.scope);
|
|
333
|
+
await intake.prepare(source, pinnedManifest);
|
|
334
|
+
const digestHex = await intake.acceptSnapshot(source, requested.snapshot);
|
|
335
|
+
return Response.json({
|
|
336
|
+
kind: "authorization_verified",
|
|
337
|
+
commandDigest,
|
|
338
|
+
digestHex
|
|
339
|
+
}, { headers: { "Cache-Control": "no-store" } });
|
|
340
|
+
} catch {
|
|
341
|
+
return failure("authorization_import_incomplete", 503);
|
|
342
|
+
}
|
|
343
|
+
if (requested.kind === "export") try {
|
|
344
|
+
const snapshot = await new D1WalletAuthorizationSnapshot(this.options.database, this.options.scope).exportSnapshot(source);
|
|
345
|
+
return Response.json({
|
|
346
|
+
kind: "authorization_snapshot",
|
|
347
|
+
commandDigest,
|
|
348
|
+
snapshot
|
|
349
|
+
}, { headers: { "Cache-Control": "no-store" } });
|
|
350
|
+
} catch {
|
|
351
|
+
return failure("authorization_export_unavailable", 503);
|
|
352
|
+
}
|
|
353
|
+
const activity = new D1WalletCeremonyActivity(this.options.database, this.options.scope);
|
|
354
|
+
const sessions = new D1WalletRelocationSessions(this.options.database, this.options.scope);
|
|
355
|
+
try {
|
|
356
|
+
if (await activity.hasPending(source.walletId)) return pendingAuthorization(commandDigest, "ceremonies_unsettled");
|
|
357
|
+
if (await sessions.hasPendingOperations(source.walletId)) return pendingAuthorization(commandDigest, "operations_unsettled");
|
|
358
|
+
const { retiredAtMs, frozenAtMs } = await new D1WalletRelocationWriteBlock(this.options.database, this.options.scope).freeze(source, Date.now());
|
|
359
|
+
const manifest = await new D1WalletAuthorizationSnapshot(this.options.database, this.options.scope).seal(source);
|
|
360
|
+
const publication = await this.options.directory.fetch(new Request("https://wallet-placement.internal/internal/wallet-placement/v1/relocation-authorization-manifest", {
|
|
361
|
+
method: "POST",
|
|
362
|
+
headers: { "Content-Type": "application/json" },
|
|
363
|
+
body: JSON.stringify({
|
|
364
|
+
wallet,
|
|
365
|
+
attempt: body.attempt,
|
|
366
|
+
manifest
|
|
367
|
+
})
|
|
368
|
+
}));
|
|
369
|
+
if (!publication.ok) return failure("authorization_manifest_unavailable", 503);
|
|
370
|
+
const published = requireRecord(await publication.json(), "published authorization manifest");
|
|
371
|
+
const savedManifest = requireRecord(published.manifest, "pinned authorization manifest");
|
|
372
|
+
if (published.ok !== true || Object.keys(savedManifest).length !== 4) return failure("authorization_manifest_conflict", 502);
|
|
373
|
+
for (const [key, value] of Object.entries(manifest)) if (savedManifest[key] !== value) return failure("authorization_manifest_conflict", 502);
|
|
374
|
+
return Response.json({
|
|
375
|
+
kind: "authorization_frozen",
|
|
376
|
+
commandDigest,
|
|
377
|
+
retiredAtMs,
|
|
378
|
+
frozenAtMs,
|
|
379
|
+
manifest
|
|
380
|
+
}, { headers: { "Cache-Control": "no-store" } });
|
|
381
|
+
} catch {
|
|
382
|
+
if (await activity.hasPending(source.walletId)) return pendingAuthorization(commandDigest, "ceremonies_unsettled");
|
|
383
|
+
if (await sessions.hasPendingOperations(source.walletId)) return pendingAuthorization(commandDigest, "operations_unsettled");
|
|
384
|
+
return failure("authorization_freeze_incomplete", 503);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
function failure(code, status) {
|
|
389
|
+
return Response.json({
|
|
390
|
+
ok: false,
|
|
391
|
+
code
|
|
392
|
+
}, {
|
|
393
|
+
status,
|
|
394
|
+
headers: { "Cache-Control": "no-store" }
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
function matchesAuthorizationPath(pathname, route) {
|
|
398
|
+
return route.path === pathname;
|
|
399
|
+
}
|
|
400
|
+
function parseAuthorizationOperation(pathname, body) {
|
|
401
|
+
const fields = Object.keys(body).length;
|
|
402
|
+
switch (pathname) {
|
|
403
|
+
case `${BASE_PATH}/freeze`:
|
|
404
|
+
if (fields === 2) return { kind: "freeze" };
|
|
405
|
+
break;
|
|
406
|
+
case `${BASE_PATH}/export`:
|
|
407
|
+
if (fields === 2) return { kind: "export" };
|
|
408
|
+
break;
|
|
409
|
+
case `${BASE_PATH}/import`:
|
|
410
|
+
if (fields === 3 && "snapshot" in body) return {
|
|
411
|
+
kind: "import",
|
|
412
|
+
snapshot: body.snapshot
|
|
413
|
+
};
|
|
414
|
+
break;
|
|
415
|
+
case `${BASE_PATH}/activate`:
|
|
416
|
+
if (fields === 2) return { kind: "activate" };
|
|
417
|
+
break;
|
|
418
|
+
case `${BASE_PATH}/cleanup`:
|
|
419
|
+
if (fields === 2) return { kind: "cleanup" };
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
throw new Error("Authorization transfer operation is invalid");
|
|
423
|
+
}
|
|
424
|
+
function authorizationCommandKind(kind) {
|
|
425
|
+
switch (kind) {
|
|
426
|
+
case "freeze":
|
|
427
|
+
case "export":
|
|
428
|
+
case "activate":
|
|
429
|
+
case "cleanup": return kind;
|
|
430
|
+
case "import": return "import_authorization";
|
|
431
|
+
default: return assertNever(kind);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
function authorizationCommandPhase(kind) {
|
|
435
|
+
switch (kind) {
|
|
436
|
+
case "freeze": return "freezing";
|
|
437
|
+
case "export":
|
|
438
|
+
case "import_authorization": return "copying";
|
|
439
|
+
case "activate":
|
|
440
|
+
case "cleanup": return "cutover";
|
|
441
|
+
default: return assertNever(kind);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
function authorizationReceiptKind(kind) {
|
|
445
|
+
switch (kind) {
|
|
446
|
+
case "export":
|
|
447
|
+
case "import_authorization": return "source_fence";
|
|
448
|
+
case "activate": return "destination_verification";
|
|
449
|
+
case "cleanup": return "destination_activation";
|
|
450
|
+
default: return assertNever(kind);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
function authorizationGenerationOffset(kind) {
|
|
454
|
+
switch (kind) {
|
|
455
|
+
case "import_authorization": return 1;
|
|
456
|
+
case "cleanup": return -1;
|
|
457
|
+
case "activate":
|
|
458
|
+
case "export": return 0;
|
|
459
|
+
default: return assertNever(kind);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
function authorizationCommandFields(kind) {
|
|
463
|
+
switch (kind) {
|
|
464
|
+
case "freeze": return 1;
|
|
465
|
+
case "export": return 2;
|
|
466
|
+
case "cleanup": return 3;
|
|
467
|
+
case "activate":
|
|
468
|
+
case "import_authorization": return 4;
|
|
469
|
+
default: return assertNever(kind);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
function assertNever(value) {
|
|
473
|
+
throw new Error(`Unexpected authorization operation: ${String(value)}`);
|
|
474
|
+
}
|
|
475
|
+
function pendingAuthorization(commandDigest, reason) {
|
|
476
|
+
return Response.json({
|
|
477
|
+
kind: "authorization_pending",
|
|
478
|
+
commandDigest,
|
|
479
|
+
reason
|
|
480
|
+
}, {
|
|
481
|
+
status: 202,
|
|
482
|
+
headers: { "Cache-Control": "no-store" }
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
//#endregion
|
|
486
|
+
export { WalletAuthorizationRelocationRoutes };
|
|
487
|
+
|
|
488
|
+
//# sourceMappingURL=walletAuthorizationRelocationRoutes.js.map
|
|
@@ -6,8 +6,8 @@ const WALLET_CONSOLE_SERVICE_ORIGIN_V1 = "https://wallet-console.internal";
|
|
|
6
6
|
const WALLET_CONSOLE_OP_PATHS_V1 = {
|
|
7
7
|
secretKeyAuth: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/secret-key-auth`,
|
|
8
8
|
publishableKeyAuth: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/publishable-key-auth`,
|
|
9
|
+
registrationContext: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/registration-context`,
|
|
9
10
|
usageEvents: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/usage-events`,
|
|
10
|
-
walletProjection: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/wallet-projections`,
|
|
11
11
|
projectEnvironments: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/project-environments`,
|
|
12
12
|
tenantRootActiveLineage: `${WALLET_CONSOLE_OPS_BASE_PATH_V1}/tenant-root/active-lineage`
|
|
13
13
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ROUTER_API_CREDENTIAL_SCOPES } from "../../framework/apiCredentialPorts.js";
|
|
2
|
+
import { unavailableRegistrationContext, walletRegistrationContext } from "../../auth/walletRegistrationContext.js";
|
|
2
3
|
import { WALLET_CONSOLE_OP_PATHS_V1, WALLET_CONSOLE_SERVICE_ORIGIN_V1, decodeWalletConsoleTenantRootActiveLineageResponseV1 } from "./walletConsoleOps.js";
|
|
3
4
|
//#region src/router/cloudflare/runtime/walletConsoleOpsClient.ts
|
|
4
5
|
async function postJson(service, path, body) {
|
|
@@ -157,6 +158,29 @@ function parseProjectEnvironmentsResponse(value) {
|
|
|
157
158
|
}
|
|
158
159
|
return environments;
|
|
159
160
|
}
|
|
161
|
+
async function resolveRegistrationContext(service, input) {
|
|
162
|
+
try {
|
|
163
|
+
const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.registrationContext, input);
|
|
164
|
+
return parseWalletRegistrationContextResponse(input, status, body);
|
|
165
|
+
} catch {
|
|
166
|
+
return unavailableRegistrationContext();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function parseWalletRegistrationContextResponse(input, status, body) {
|
|
170
|
+
if (status === 401 || status === 403) {
|
|
171
|
+
const failure = parsePublishableKeyAuthResponse(body, status);
|
|
172
|
+
return failure && !failure.ok ? failure : unavailableRegistrationContext();
|
|
173
|
+
}
|
|
174
|
+
if (status !== 200 || typeof body !== "object" || body === null || Array.isArray(body)) return unavailableRegistrationContext();
|
|
175
|
+
const record = body;
|
|
176
|
+
if (record.ok !== true || Object.keys(record).some(unexpectedRegistrationContextField)) return unavailableRegistrationContext();
|
|
177
|
+
const principal = parseRouterApiKeyPrincipal(record.principal);
|
|
178
|
+
const environment = parseProjectEnvironment(record.environment);
|
|
179
|
+
return principal && environment ? walletRegistrationContext(input, principal, environment) : unavailableRegistrationContext();
|
|
180
|
+
}
|
|
181
|
+
function unexpectedRegistrationContextField(field) {
|
|
182
|
+
return field !== "ok" && field !== "principal" && field !== "environment";
|
|
183
|
+
}
|
|
160
184
|
function isUsageEventsSuccessResponse(value) {
|
|
161
185
|
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
162
186
|
const record = value;
|
|
@@ -193,6 +217,7 @@ function createWalletConsoleOpsClient(service) {
|
|
|
193
217
|
const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.publishableKeyAuth, input);
|
|
194
218
|
return parsePublishableKeyAuthResponse(body, status) ?? malformedPublishableKeyAuthResult(status);
|
|
195
219
|
} },
|
|
220
|
+
registrationContext: { resolve: resolveRegistrationContext.bind(void 0, service) },
|
|
196
221
|
projectEnvironments: { async listEnvironments(context, filters) {
|
|
197
222
|
const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.projectEnvironments, {
|
|
198
223
|
context,
|
|
@@ -215,18 +240,13 @@ function createWalletConsoleOpsClient(service) {
|
|
|
215
240
|
custodyLineageB64u: decoded.value.custodyLineageB64u
|
|
216
241
|
};
|
|
217
242
|
} },
|
|
218
|
-
walletProjection: { recordCreatedWallet: recordCreatedWallet.bind(void 0, service) },
|
|
219
243
|
usageMeter: { async recordEvent(input) {
|
|
220
244
|
const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.usageEvents, input);
|
|
221
245
|
if (!isUsageEventsSuccessResponse(body)) throw new Error(`Wallet Console usage ingestion failed (HTTP ${status}): invalid response`);
|
|
222
246
|
} }
|
|
223
247
|
};
|
|
224
248
|
}
|
|
225
|
-
async function recordCreatedWallet(service, input) {
|
|
226
|
-
const { status, body } = await postJson(service, WALLET_CONSOLE_OP_PATHS_V1.walletProjection, input);
|
|
227
|
-
if (status !== 200 || !isUsageEventsSuccessResponse(body)) throw new Error(`Wallet Console projection failed (HTTP ${status})`);
|
|
228
|
-
}
|
|
229
249
|
//#endregion
|
|
230
|
-
export { createWalletConsoleOpsClient };
|
|
250
|
+
export { createWalletConsoleOpsClient, parseWalletRegistrationContextResponse };
|
|
231
251
|
|
|
232
252
|
//# sourceMappingURL=walletConsoleOpsClient.js.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ROUTER_AB_INTERNAL_SERVICE_AUTH_HEADER_V1 } from "../../../core/ThresholdService/routerAb/internalServiceHttp.js";
|
|
2
|
+
import { handleWalletRelocationRequest } from "./walletRelocationOps.js";
|
|
2
3
|
//#region src/router/cloudflare/runtime/walletControlOps.ts
|
|
3
4
|
const WALLET_CONTROL_SERVICE_ORIGIN_V1 = "https://wallet-runtime.internal";
|
|
4
5
|
const WALLET_CONTROL_BASE_PATH_V1 = "/internal/wallet-runtime/v1/tenant-root-control";
|
|
@@ -59,6 +60,8 @@ function createClientFetcher(binding, target) {
|
|
|
59
60
|
} };
|
|
60
61
|
}
|
|
61
62
|
async function handleWalletControlRequest(request, env) {
|
|
63
|
+
const relocation = await handleWalletRelocationRequest(request, env);
|
|
64
|
+
if (relocation) return relocation;
|
|
62
65
|
const url = new URL(request.url);
|
|
63
66
|
if (!url.pathname.startsWith(`/internal/wallet-runtime/v1/tenant-root-control/`)) return null;
|
|
64
67
|
if (url.origin !== "https://wallet-runtime.internal") return null;
|
|
@@ -136,8 +136,8 @@ function createCloudflareWalletGatewayRouterV1(input) {
|
|
|
136
136
|
...input.router,
|
|
137
137
|
apiKeyAuth: consoleOps.apiKeyAuth,
|
|
138
138
|
publishableKeyAuth: consoleOps.publishableKeyAuth,
|
|
139
|
+
registrationContext: input.registrationContext ?? consoleOps.registrationContext,
|
|
139
140
|
apiKeyUsageMeter: consoleOps.usageMeter,
|
|
140
|
-
walletProjection: consoleOps.walletProjection,
|
|
141
141
|
orgProjectEnv: consoleOps.projectEnvironments,
|
|
142
142
|
routerAbNormalSigningAdmission: createRouterAbNormalSigningAdmissionAdapter(admissionStore),
|
|
143
143
|
routeExtensions: [createWalletConsoleRelayProxyExtensionV1(input.walletConsole), ...input.routeExtensions ?? []]
|