@seams/wallet-server 0.7.1 → 0.7.3
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 +1 -105
- package/artifact-manifest.json +21 -21
- package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
- 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_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_bg.wasm +0 -0
- package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
- 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_bg.wasm +0 -0
- package/dist/esm/authorization/service.js +8 -0
- package/dist/esm/authorization/vaultProxyUse.js +2 -6
- package/dist/esm/cloud-host.js +4 -4
- package/dist/esm/core/IdentityStore.js +23 -110
- package/dist/esm/core/SessionService.js +7 -30
- package/dist/esm/core/ThresholdService/routerAbNormalSigningPolicy.js +3 -10
- package/dist/esm/core/ThresholdService/stores/WalletSessionStore.js +21 -97
- package/dist/esm/core/ThresholdService/stores/exportReplayGuard.js +7 -0
- package/dist/esm/core/WalletStore.js +4 -6
- package/dist/esm/core/authService/bytes.js +1 -4
- package/dist/esm/core/authService/emailOtpChallengeOperations.js +2 -5
- package/dist/esm/core/authService/emailOtpChallengeProof.js +9 -40
- package/dist/esm/core/authService/emailOtpChallengeVerification.js +19 -90
- package/dist/esm/core/authService/emailOtpChallenges.js +10 -45
- package/dist/esm/core/authService/emailOtpDelivery.js +10 -45
- package/dist/esm/core/authService/emailOtpEnrollment.js +9 -40
- package/dist/esm/core/authService/emailOtpGrant.js +9 -40
- package/dist/esm/core/authService/emailOtpRegistrationEnrollment.js +9 -40
- package/dist/esm/core/authService/emailOtpSeal.js +5 -20
- package/dist/esm/core/authService/emailOtpUnlock.js +20 -110
- package/dist/esm/core/authService/googleEmailOtpRegistration.js +28 -115
- package/dist/esm/core/authService/identity.js +5 -20
- package/dist/esm/core/authService/nearPublicKeyMetadata.js +6 -25
- package/dist/esm/core/authService/oidcVerification.js +22 -34
- package/dist/esm/core/authService/rateLimits.js +2 -5
- package/dist/esm/core/authService/thresholdEcdsaKeyInventory.js +2 -1
- package/dist/esm/core/authService/webauthn.js +37 -191
- package/dist/esm/core/authService/webauthnVerificationOutcomes.js +5 -24
- package/dist/esm/core/d1EcdsaSignerRead.js +76 -0
- package/dist/esm/core/d1IdentityStore.js +16 -75
- package/dist/esm/core/d1TenantStore.js +1 -1
- package/dist/esm/core/d1WalletStore.js +15 -25
- package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +1 -5
- package/dist/esm/core/deviceLinking/linkedDeviceSessionApproval.js +1 -3
- package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -8
- package/dist/esm/core/deviceLinking/requestProof.js +13 -4
- package/dist/esm/core/ecdsaMaterialReadSnapshot.js +85 -0
- package/dist/esm/core/nearRelayerAccountProvisioning.js +2 -5
- package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +3 -6
- package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +2 -5
- package/dist/esm/core/storeBackends.js +1 -1
- package/dist/esm/core/thresholdEcdsaChainTarget.js +1 -3
- package/dist/esm/hosted-wallet-gateway.js +2 -2
- package/dist/esm/localHostedWalletGatewayHandler.js +13 -0
- package/dist/esm/localIntendedMaterialAdmissionFault.js +176 -0
- package/dist/esm/localIntendedPresignCancellation.js +44 -0
- package/dist/esm/router/auth/commonRouterUtils.js +24 -10
- package/dist/esm/router/auth/walletSessionFailure.js +2 -5
- package/dist/esm/router/auth/webAuthnCredentialCodecs.js +4 -15
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +1 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.js +2 -6
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +5 -27
- package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +76 -0
- package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +28 -21
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +209 -44
- package/dist/esm/router/cloudflare/d1/authorization/d1VaultProxyStore.js +8 -12
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +50 -8
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/index.js +3 -3
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +12 -55
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeService.js +17 -80
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpDeliveryRuntime.js +6 -25
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +12 -47
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +24 -85
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRegistrationEnrollmentFinalizer.js +7 -30
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.js +5 -20
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +23 -110
- package/dist/esm/router/cloudflare/d1/identity/d1IdentityService.js +9 -40
- package/dist/esm/router/cloudflare/d1/near/d1NearPublicKeyStore.js +3 -10
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +18 -91
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcVerificationService.js +6 -30
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1PasskeyCustodyRouteService.js +4 -15
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +2 -7
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpRecords.js +9 -13
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletRecoveryGoogleEmailOtpService.js +11 -50
- package/dist/esm/router/cloudflare/d1/registration/d1EvmFamilyEcdsaRegistrationBranch.js +5 -20
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +4 -7
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +2 -1
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationIntentService.js +7 -30
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +32 -22
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +1 -4
- package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +119 -25
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +31 -168
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnRecords.js +6 -9
- package/dist/esm/router/cloudflare/durableObjects/thresholdStore.js +59 -66
- package/dist/esm/router/cloudflare/runtime/routerAbPrewarm.js +2 -2
- package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +5 -20
- package/dist/esm/router/cloudflare/runtime/tenantRootCreationGrant.js +2 -9
- package/dist/esm/router/cloudflare/runtime/walletControlOps.js +2 -1
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneCurveExecution.js +2 -1
- package/dist/esm/router/cloudflare/signingLanes/cloudflareLaneProtocolCommitter.js +2 -2
- package/dist/esm/router/cloudflare.js +2146 -1802
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +5 -8
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +3 -6
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +6 -25
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +39 -55
- package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +15 -62
- package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +83 -74
- package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +1 -0
- package/dist/esm/router/domains/signingOperations/routerAbOperationStepUp.js +1 -0
- package/dist/esm/router/domains/signingOperations/walletExecutionAdmission.js +1 -4
- package/dist/esm/router/domains/tenantRoot/tenantRootIdentityResolution.js +7 -13
- package/dist/esm/router/domains/walletUnlock/walletUnlockRouteHandlers.js +41 -200
- package/dist/esm/router/express.js +317 -699
- package/dist/esm/router/framework/http.js +5 -1
- package/dist/esm/router/framework/runtimeSnapshotConsumer.js +8 -35
- package/dist/esm/router/transport/fetch/createFetchRouter.js +3 -6
- package/dist/esm/router/transport/fetch/routes/auth.js +9 -41
- package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +5 -22
- package/dist/esm/router/transport/fetch/routes/nearPublicKeys.js +4 -16
- package/dist/esm/router/transport/fetch/routes/sessions.js +1 -0
- package/dist/esm/router/transport/fetch/routes/syncAccount.js +8 -36
- package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +27 -79
- package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +4 -1
- package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +4 -16
- package/dist/esm/shared-ts/src/authorization/walletSignerActivationEquality.js +12 -0
- package/dist/esm/shared-ts/src/device-linking/committedSignerPackages.js +2 -5
- package/dist/esm/shared-ts/src/device-linking/delegatedActivationPlan.js +1 -5
- package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +12 -16
- package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +5 -8
- package/dist/esm/shared-ts/src/passkey-custody/primitives.js +5 -1
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +4 -8
- package/dist/esm/shared-ts/src/tenant-root/tenantRootIdentifier.js +12 -0
- package/dist/esm/shared-ts/src/tenant-root/tenantRootIdentity.js +2 -9
- package/dist/esm/shared-ts/src/tenant-root/tenantRootOperationRecord.js +1 -4
- package/dist/esm/shared-ts/src/utils/ecdsaKeyFactsInventory.js +2 -4
- package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +0 -1
- package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +3 -1
- package/dist/esm/shared-ts/src/utils/exactKeys.js +17 -0
- package/dist/esm/shared-ts/src/utils/failure.js +20 -0
- package/dist/esm/shared-ts/src/utils/registrationIntent.js +3 -12
- package/dist/esm/shared-ts/src/utils/registrationSignerPlan.js +2 -5
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
- package/dist/esm/shared-ts/src/utils/routerAbEd25519Yao.js +1 -1
- package/dist/esm/shared-ts/src/utils/thresholdEcdsaChainTarget.js +9 -0
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryCommittedProjection.js +1 -4
- package/dist/esm/threshold/session/signingSessionSeal/crypto/cipher.js +10 -32
- package/dist/esm/threshold/session/signingSessionSeal/idempotencyBackends.js +3 -3
- package/dist/esm/threshold/session/signingSessionSeal/idempotencyRecords.js +3 -9
- package/dist/esm/threshold/session/signingSessionSeal/service.js +8 -35
- package/dist/esm/threshold/session/signingSessionSeal/transport/express.js +18 -94
- package/dist/esm/threshold/session/signingSessionSeal/transport/fetch.js +6 -30
- package/dist/esm/threshold/session/signingSessionSeal/transport/shared.js +5 -20
- package/dist/esm/wasm/evm_crypto/pkg/evm_crypto_bg.wasm +0 -0
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/types/shared-ts/src/authorization/delegatedAuthority.d.ts +2 -1
- package/dist/types/shared-ts/src/authorization/walletSessionIssuance.d.ts +9 -2
- package/dist/types/shared-ts/src/authorization/walletSignerActivationEquality.d.ts +4 -0
- package/dist/types/shared-ts/src/device-linking/committedSignerPackages.d.ts +3 -4
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +5 -63
- package/dist/types/shared-ts/src/device-linking/sourceContribution.d.ts +2 -0
- package/dist/types/shared-ts/src/passkey-custody/custodyEnvelope.d.ts +5 -12
- package/dist/types/shared-ts/src/passkey-custody/primitives.d.ts +9 -0
- package/dist/types/shared-ts/src/signing-lanes/execution.d.ts +11 -1
- package/dist/types/shared-ts/src/signing-lanes/ids.d.ts +1 -10
- package/dist/types/shared-ts/src/signing-lanes/rotation.d.ts +3 -5
- package/dist/types/shared-ts/src/tenant-root/tenantRootIdentifier.d.ts +3 -0
- package/dist/types/shared-ts/src/tenant-root/tenantRootOperationRecord.d.ts +2 -1
- package/dist/types/shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.d.ts +6 -0
- package/dist/types/shared-ts/src/threshold/signingRootScope.d.ts +1 -0
- package/dist/types/shared-ts/src/utils/ecdsaKeyFactsInventory.d.ts +2 -11
- package/dist/types/shared-ts/src/utils/eip1559TxWasmJson.d.ts +16 -0
- package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/exactKeys.d.ts +11 -0
- package/dist/types/shared-ts/src/utils/failure.d.ts +12 -0
- package/dist/types/shared-ts/src/utils/jsonRpc.d.ts +3 -4
- package/dist/types/shared-ts/src/utils/nearRpcResults.d.ts +1 -0
- package/dist/types/shared-ts/src/utils/registrationAuthMethodInput.d.ts +3 -8
- package/dist/types/shared-ts/src/utils/registrationSignerPlan.d.ts +7 -19
- package/dist/types/shared-ts/src/utils/routerAbEcdsaDerivation.d.ts +3 -1
- package/dist/types/shared-ts/src/utils/routerAbEd25519Yao.d.ts +1 -0
- package/dist/types/shared-ts/src/utils/routerAbEd25519YaoDigests.d.ts +3 -4
- package/dist/types/shared-ts/src/utils/routerAbNormalSigningIdentity.d.ts +30 -8
- package/dist/types/shared-ts/src/utils/routerApiKeyAuth.d.ts +2 -0
- package/dist/types/shared-ts/src/utils/signingSessionSeal.d.ts +10 -11
- package/dist/types/shared-ts/src/utils/thresholdEcdsaChainTarget.d.ts +25 -0
- package/dist/types/shared-ts/src/utils/variant.d.ts +18 -0
- package/dist/types/shared-ts/src/utils/walletAuthMethodRecord.d.ts +3 -6
- package/dist/types/shared-ts/src/utils/webauthnDeviceInfo.d.ts +4 -2
- package/dist/types/shared-ts/src/wallet-recovery/recoveryEnvelopes.d.ts +3 -16
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryPreparation.d.ts +15 -0
- package/dist/types/shared-ts/src/wallet-recovery/walletRecoveryTarget.d.ts +3 -4
- package/dist/types/wallet-server/src/authorization/domain.d.ts +13 -2
- package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +27 -3
- package/dist/types/wallet-server/src/authorization/service.d.ts +19 -0
- package/dist/types/wallet-server/src/core/ThresholdService/stores/SessionStore.d.ts +2 -2
- package/dist/types/wallet-server/src/core/ThresholdService/stores/WalletSessionStore.d.ts +1 -1
- package/dist/types/wallet-server/src/core/ThresholdService/stores/exportReplayGuard.d.ts +3 -0
- package/dist/types/wallet-server/src/core/ThresholdService/validation.d.ts +8 -101
- package/dist/types/wallet-server/src/core/WebAuthnAuthenticatorStore.d.ts +8 -0
- package/dist/types/wallet-server/src/core/authService/bytes.d.ts +0 -1
- package/dist/types/wallet-server/src/core/authService/emailOtpChallenges.d.ts +2 -10
- package/dist/types/wallet-server/src/core/authService/emailOtpSeal.d.ts +1 -1
- package/dist/types/wallet-server/src/core/authService/emailOtpUnlock.d.ts +3 -10
- package/dist/types/wallet-server/src/core/d1EcdsaSignerRead.d.ts +39 -0
- package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +10 -0
- package/dist/types/wallet-server/src/core/deviceLinking/linkedDeviceSessionRecord.d.ts +3 -4
- package/dist/types/wallet-server/src/core/ecdsaMaterialReadSnapshot.d.ts +19 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbNormalSigningRuntime.d.ts +3 -5
- package/dist/types/wallet-server/src/core/rpcClients/near/NearClient.d.ts +1 -2
- package/dist/types/wallet-server/src/core/signingLanes/WalletExecutionLaneProjection.d.ts +2 -11
- package/dist/types/wallet-server/src/core/signingLanes/signingWorkerLaneMaterialIdentity.d.ts +2 -19
- package/dist/types/wallet-server/src/core/thresholdEcdsaChainTarget.d.ts +3 -11
- package/dist/types/wallet-server/src/core/types.d.ts +2 -6
- package/dist/types/wallet-server/src/localIntendedMaterialAdmissionFault.d.ts +38 -0
- package/dist/types/wallet-server/src/localIntendedPresignCancellation.d.ts +4 -0
- package/dist/types/wallet-server/src/router/auth/authRequestValidation.d.ts +4 -9
- package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +15 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.d.ts +0 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +9 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/authorizedOperationStatements.d.ts +4 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +10 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +19 -2
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionStore.d.ts +2 -6
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.d.ts +5 -8
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpEnrollmentStore.d.ts +2 -8
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +2 -9
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +5 -5
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpServerSealRuntime.d.ts +4 -14
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +2 -6
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +8 -6
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +14 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/webauthn/d1WebAuthnRecords.d.ts +10 -39
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +8 -34
- package/dist/types/wallet-server/src/router/domains/ecdsa/thresholdEcdsaRequestValidation.d.ts +3 -15
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/session/routerAbEd25519YaoWalletSession.d.ts +9 -50
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletRecoveryKeyManifest.d.ts +1 -13
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.d.ts +8 -9
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +13 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbOperationStepUp.d.ts +3 -4
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbPrivateSigningWorker.d.ts +7 -16
- package/dist/types/wallet-server/src/router/domains/syncAccount/syncAccountRequestValidation.d.ts +2 -7
- package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +3 -1
- package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +25 -4
- package/dist/types/wallet-server/src/router/framework/http.d.ts +1 -0
- package/dist/types/wallet-server/src/router/framework/ror/normalize.d.ts +1 -9
- package/dist/types/wallet-server/src/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.d.ts +3 -6
- package/dist/types/wallet-server/src/router/transport/fetch/routes/syncAccountBootstrap.d.ts +3 -5
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +0 -1
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/idempotencyRecords.d.ts +1 -2
- package/dist/types/wallet-server/src/threshold/session/signingSessionSeal/signingSessionSeal.types.d.ts +6 -8
- package/package.json +1 -1
- package/dist/esm/wasm/router_ab_ecdsa_signing_worker/pkg/router_ab_ecdsa_signing_worker_bg.wasm +0 -0
|
@@ -2,7 +2,9 @@ import "./shared-ts/src/utils/routerAbEd25519Yao.js";
|
|
|
2
2
|
import { WALLET_CONSOLE_OP_PATHS_V1 } from "./router/cloudflare/runtime/walletConsoleOps.js";
|
|
3
3
|
import { createStaticWalletConsoleBindingV1, parseStaticWalletConsoleBindingConfigV1 } from "./router/cloudflare/runtime/staticWalletConsoleBinding.js";
|
|
4
4
|
import { handleSplitGatewayRequest } from "./hosted-wallet-gateway.js";
|
|
5
|
+
import { localPresignCancellationProbe } from "./localIntendedPresignCancellation.js";
|
|
5
6
|
import { LOCAL_INTENDED_YAO_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoFaultControllerV1, parseLocalIntendedYaoFaultModeV1, parseLocalIntendedYaoFaultTokenV1, requestWithoutLocalIntendedYaoFaultHeadersV1, responseWithLocalIntendedYaoFaultOutcomeV1 } from "./localIntendedYaoFault.js";
|
|
7
|
+
import { localMaterialAdmissionFault } from "./localIntendedMaterialAdmissionFault.js";
|
|
6
8
|
import { LOCAL_INTENDED_ECDSA_FINALIZE_FAULT_HEADER_V1, LOCAL_INTENDED_ECDSA_FINALIZE_FAULT_TOKEN_HEADER_V1, LocalIntendedEcdsaFinalizeFaultControllerV1, parseLocalIntendedEcdsaFinalizeFaultModeV1, parseLocalIntendedEcdsaFinalizeFaultTokenV1, requestWithoutLocalIntendedEcdsaFinalizeFaultHeadersV1, responseWithLocalIntendedEcdsaFinalizeFaultOutcomeV1 } from "./localIntendedEcdsaFinalizeFault.js";
|
|
7
9
|
import { LOCAL_INTENDED_YAO_FINALIZE_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_FINALIZE_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoFinalizeFaultDatabaseV1, parseLocalIntendedYaoFinalizeFaultModeV1, parseLocalIntendedYaoFinalizeFaultTokenV1, requestWithoutLocalIntendedYaoFinalizeFaultHeadersV1, responseWithLocalIntendedYaoFinalizeFaultOutcomeV1 } from "./localIntendedYaoFinalizeFault.js";
|
|
8
10
|
import { LOCAL_INTENDED_YAO_RECOVERY_FAULT_HEADER_V1, LOCAL_INTENDED_YAO_RECOVERY_FAULT_TOKEN_HEADER_V1, LocalIntendedYaoRecoveryFaultControllerV1, parseLocalIntendedYaoRecoveryFaultModeV1, parseLocalIntendedYaoRecoveryFaultTokenV1, releaseLocalIntendedYaoRecoveryExecuteV1, requestWithoutLocalIntendedYaoRecoveryFaultHeadersV1, responseWithLocalIntendedYaoRecoveryFaultOutcomeV1 } from "./localIntendedYaoRecoveryFault.js";
|
|
@@ -104,6 +106,8 @@ async function handleLocalHostedWalletGatewayRequestV1(request, env, ctx, depend
|
|
|
104
106
|
...env,
|
|
105
107
|
WALLET_CONSOLE: createStaticWalletConsoleBindingV1(config)
|
|
106
108
|
};
|
|
109
|
+
const canceledPresign = await localPresignCancellationProbe(request, gatewayEnv, ctx, dependencies);
|
|
110
|
+
if (canceledPresign) return canceledPresign;
|
|
107
111
|
const ecdsaFault = request.headers.get(ECDSA_RESPOND_FAULT_HEADER);
|
|
108
112
|
if (ecdsaFault !== null) return await handleEcdsaRespondFault(request, gatewayEnv, ctx, dependencies, ecdsaFault, config.deployment.environmentKey, config.deployment.environmentId);
|
|
109
113
|
const ecdsaFinalizeMode = request.headers.get(LOCAL_INTENDED_ECDSA_FINALIZE_FAULT_HEADER_V1);
|
|
@@ -127,6 +131,15 @@ async function handleLocalHostedWalletGatewayRequestV1(request, env, ctx, depend
|
|
|
127
131
|
const revokeMode = request.headers.get(LOCAL_INTENDED_REVOKE_FAULT_HEADER_V1);
|
|
128
132
|
const revokeToken = request.headers.get(LOCAL_INTENDED_REVOKE_FAULT_TOKEN_HEADER_V1);
|
|
129
133
|
if (revokeMode !== null || revokeToken !== null) return await handleRevokeFault(request, gatewayEnv, ctx, dependencies, revokeMode, revokeToken);
|
|
134
|
+
const materialFault = localMaterialAdmissionFault(request, gatewayEnv.SIGNER_DB);
|
|
135
|
+
if (materialFault instanceof Response) return materialFault;
|
|
136
|
+
if (materialFault) {
|
|
137
|
+
const response = await handleSplitGatewayRequest(materialFault.request, {
|
|
138
|
+
...gatewayEnv,
|
|
139
|
+
SIGNER_DB: materialFault.database
|
|
140
|
+
}, ctx, dependencies);
|
|
141
|
+
return materialFault.database.response(response, materialFault.token);
|
|
142
|
+
}
|
|
130
143
|
const admissionMode = request.headers.get(LOCAL_INTENDED_SESSION_ADMISSION_FAULT_HEADER_V1);
|
|
131
144
|
const admissionToken = request.headers.get(LOCAL_INTENDED_SESSION_ADMISSION_FAULT_TOKEN_HEADER_V1);
|
|
132
145
|
if (admissionMode !== null || admissionToken !== null) return await handleSessionAdmissionFault(request, gatewayEnv, ctx, dependencies, admissionMode, admissionToken);
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { isPlainObject } from "./shared-ts/src/utils/validation.js";
|
|
2
|
+
import { isLocalIntendedYaoFaultTokenV1 } from "./localIntendedYaoFault.js";
|
|
3
|
+
//#region src/localIntendedMaterialAdmissionFault.ts
|
|
4
|
+
const MODE_HEADER = "x-seams-intended-material-admission-fault-v1";
|
|
5
|
+
const TOKEN_HEADER = "x-seams-intended-material-admission-token-v1";
|
|
6
|
+
const PROOF_HEADER = "x-seams-intended-material-admission-proof-v1";
|
|
7
|
+
const SCOPE_PREDICATE = "namespace = ? AND org_id = ? AND project_id = ? AND env_id = ? AND wallet_id = ?";
|
|
8
|
+
function localMaterialAdmissionFault(request, database) {
|
|
9
|
+
const raw = request.headers.get(MODE_HEADER);
|
|
10
|
+
const token = request.headers.get(TOKEN_HEADER);
|
|
11
|
+
if (raw === null && token === null) return null;
|
|
12
|
+
const url = new URL(request.url);
|
|
13
|
+
if (url.protocol !== "http:" || url.hostname !== "127.0.0.1" || request.method !== "POST" || !["/router-ab/ecdsa-derivation/sign/prepare", "/router-ab/ecdsa-derivation/sign"].includes(url.pathname) || !isLocalIntendedYaoFaultTokenV1(token) || raw !== "canonical_claim" && raw !== "canonical_existing" && raw !== "linked_claim" && raw !== "linked_existing") return Response.json({ code: "invalid_intended_material_admission_fault" }, { status: 400 });
|
|
14
|
+
const headers = new Headers(request.headers);
|
|
15
|
+
headers.delete(MODE_HEADER);
|
|
16
|
+
headers.delete(TOKEN_HEADER);
|
|
17
|
+
return {
|
|
18
|
+
database: new LocalMaterialAdmissionFaultDatabase(database, raw),
|
|
19
|
+
request: new Request(request, { headers }),
|
|
20
|
+
token
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Retire material after resolution and before one admission statement, then restore it. */
|
|
24
|
+
var LocalMaterialAdmissionFaultDatabase = class {
|
|
25
|
+
constructor(base, mode) {
|
|
26
|
+
this.base = base;
|
|
27
|
+
this.mode = mode;
|
|
28
|
+
this.scope = null;
|
|
29
|
+
this.state = { kind: "armed" };
|
|
30
|
+
}
|
|
31
|
+
prepare(query) {
|
|
32
|
+
const inner = this.base.prepare(query);
|
|
33
|
+
if (/^\s*INSERT INTO authorized_operations/.test(query)) return new FaultStatement(this, inner, "claim");
|
|
34
|
+
if (query.includes("AS material_snapshot_active")) return new FaultStatement(this, inner, "existing");
|
|
35
|
+
if (query.includes("AS ecdsa_material_records_json")) return new FaultStatement(this, inner, "material");
|
|
36
|
+
return inner;
|
|
37
|
+
}
|
|
38
|
+
captureScope(values) {
|
|
39
|
+
const scope = values.slice(0, 5);
|
|
40
|
+
const strings = [];
|
|
41
|
+
for (const value of scope) {
|
|
42
|
+
if (typeof value !== "string" || value.length === 0) throw new Error("Invalid material fault scope");
|
|
43
|
+
strings.push(value);
|
|
44
|
+
}
|
|
45
|
+
if (strings.length !== 5) throw new Error("Material fault did not observe a scoped material read");
|
|
46
|
+
this.scope = strings;
|
|
47
|
+
}
|
|
48
|
+
async batch(statements) {
|
|
49
|
+
const roles = statements.filter(isFaultStatement).map(statementRole);
|
|
50
|
+
const boundary = this.mode.endsWith("_claim") ? "claim" : "existing";
|
|
51
|
+
return this.execute(statements.map(unwrap), roles.includes(boundary) ? boundary : "material");
|
|
52
|
+
}
|
|
53
|
+
exec(query) {
|
|
54
|
+
return this.base.exec(query);
|
|
55
|
+
}
|
|
56
|
+
async first(statement, columnName) {
|
|
57
|
+
if (statement.role === "material") {
|
|
58
|
+
const row = await statement.inner.first(columnName);
|
|
59
|
+
if (isPlainObject(row)) this.captureScope([
|
|
60
|
+
row.session_namespace,
|
|
61
|
+
row.session_org_id,
|
|
62
|
+
row.session_project_id,
|
|
63
|
+
row.session_env_id,
|
|
64
|
+
row.session_wallet_id
|
|
65
|
+
]);
|
|
66
|
+
return row;
|
|
67
|
+
}
|
|
68
|
+
if (!this.shouldRetire(statement.role)) return statement.inner.first(columnName);
|
|
69
|
+
if (columnName !== void 0) throw new Error("Material admission reads must return a row");
|
|
70
|
+
const [result] = await this.execute([statement.inner], statement.role);
|
|
71
|
+
return result?.results?.[0] ?? null;
|
|
72
|
+
}
|
|
73
|
+
shouldRetire(role) {
|
|
74
|
+
return role === (this.mode.endsWith("_claim") ? "claim" : "existing") && this.state.kind === "armed";
|
|
75
|
+
}
|
|
76
|
+
async execute(statements, role) {
|
|
77
|
+
if (!this.shouldRetire(role)) return this.base.batch(statements);
|
|
78
|
+
if (!this.scope) throw new Error("Material fault has no scoped read");
|
|
79
|
+
const { table, key, column } = this.target();
|
|
80
|
+
const predicate = this.mode.startsWith("canonical") ? `${SCOPE_PREDICATE} AND signer_family = 'ecdsa'` : SCOPE_PREDICATE;
|
|
81
|
+
const result = await this.base.prepare(`SELECT ${key} AS record_key, ${column} AS record_value FROM ${table} WHERE ${predicate}`).bind(...this.scope).all();
|
|
82
|
+
const records = [];
|
|
83
|
+
for (const row of result.results ?? []) {
|
|
84
|
+
const value = row.record_value;
|
|
85
|
+
if (typeof row.record_key !== "string" || value !== null && typeof value !== "number" && typeof value !== "string") throw new Error("Invalid material fault backup");
|
|
86
|
+
records.push({
|
|
87
|
+
key: row.record_key,
|
|
88
|
+
value
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (records.length === 0) throw new Error("Material fault did not find custody records");
|
|
92
|
+
const replacement = this.mode.startsWith("canonical") ? "json_set(record_json, '$.walletKey.publicCapability.material_activation.lifecycle_binding', 'retired-by-intended-test')" : "NULL";
|
|
93
|
+
const retire = this.base.prepare(`UPDATE ${table} SET ${column} = ${replacement} WHERE ${predicate}`).bind(...this.scope);
|
|
94
|
+
const restore = [];
|
|
95
|
+
for (const record of records) restore.push(this.base.prepare(`UPDATE ${table} SET ${column} = ? WHERE ${predicate} AND ${key} = ?`).bind(record.value, ...this.scope, record.key));
|
|
96
|
+
const quota = this.base.prepare(`SELECT COALESCE(SUM(quota.remaining_uses), 0) AS remaining
|
|
97
|
+
FROM authorization_wallet_session_quotas AS quota
|
|
98
|
+
JOIN wallet_session_authorizations_v2 AS session
|
|
99
|
+
ON session.namespace = quota.namespace AND session.tenant_id = quota.tenant_id
|
|
100
|
+
AND session.quota_id = quota.quota_id
|
|
101
|
+
WHERE session.namespace = ? AND session.org_id = ? AND session.project_id = ?
|
|
102
|
+
AND session.env_id = ? AND session.wallet_id = ?`).bind(...this.scope);
|
|
103
|
+
const results = await this.base.batch([
|
|
104
|
+
quota,
|
|
105
|
+
retire,
|
|
106
|
+
...statements,
|
|
107
|
+
...restore,
|
|
108
|
+
quota
|
|
109
|
+
]);
|
|
110
|
+
this.state = {
|
|
111
|
+
kind: "restored",
|
|
112
|
+
rows: records.length,
|
|
113
|
+
quotaBefore: quotaTotal(results[0]),
|
|
114
|
+
quotaAfter: quotaTotal(results.at(-1))
|
|
115
|
+
};
|
|
116
|
+
return results.slice(2, 2 + statements.length);
|
|
117
|
+
}
|
|
118
|
+
response(response, token) {
|
|
119
|
+
const headers = new Headers(response.headers);
|
|
120
|
+
headers.set(PROOF_HEADER, this.state.kind === "restored" ? `${token}:${this.mode}:${this.state.rows}:${this.state.quotaBefore}:${this.state.quotaAfter}` : `${token}:not_observed`);
|
|
121
|
+
return new Response(response.body, {
|
|
122
|
+
status: response.status,
|
|
123
|
+
statusText: response.statusText,
|
|
124
|
+
headers
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
target() {
|
|
128
|
+
return this.mode.startsWith("canonical") ? {
|
|
129
|
+
table: "wallet_signers",
|
|
130
|
+
key: "signer_id",
|
|
131
|
+
column: "record_json"
|
|
132
|
+
} : {
|
|
133
|
+
table: "linked_device_authority_installations",
|
|
134
|
+
key: "link_session_id",
|
|
135
|
+
column: "activated_at_ms"
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
var FaultStatement = class FaultStatement {
|
|
140
|
+
constructor(database, inner, role) {
|
|
141
|
+
this.database = database;
|
|
142
|
+
this.inner = inner;
|
|
143
|
+
this.role = role;
|
|
144
|
+
}
|
|
145
|
+
bind(...values) {
|
|
146
|
+
return new FaultStatement(this.database, this.inner.bind(...values), this.role);
|
|
147
|
+
}
|
|
148
|
+
async first(columnName) {
|
|
149
|
+
return this.database.first(this, columnName);
|
|
150
|
+
}
|
|
151
|
+
all() {
|
|
152
|
+
return this.inner.all();
|
|
153
|
+
}
|
|
154
|
+
run() {
|
|
155
|
+
return this.inner.run();
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
function unwrap(statement) {
|
|
159
|
+
return statement instanceof FaultStatement ? statement.inner : statement;
|
|
160
|
+
}
|
|
161
|
+
function isFaultStatement(statement) {
|
|
162
|
+
return statement instanceof FaultStatement;
|
|
163
|
+
}
|
|
164
|
+
function statementRole(statement) {
|
|
165
|
+
return statement.role;
|
|
166
|
+
}
|
|
167
|
+
function quotaTotal(result) {
|
|
168
|
+
if (!isPlainObject(result) || !Array.isArray(result.results)) throw new Error("Material fault quota result is unavailable");
|
|
169
|
+
const row = result.results[0];
|
|
170
|
+
if (!isPlainObject(row) || typeof row.remaining !== "number" || !Number.isSafeInteger(row.remaining)) throw new Error("Material fault quota total is invalid");
|
|
171
|
+
return row.remaining;
|
|
172
|
+
}
|
|
173
|
+
//#endregion
|
|
174
|
+
export { localMaterialAdmissionFault };
|
|
175
|
+
|
|
176
|
+
//# sourceMappingURL=localIntendedMaterialAdmissionFault.js.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { handleSplitGatewayRequest } from "./hosted-wallet-gateway.js";
|
|
2
|
+
//#region src/localIntendedPresignCancellation.ts
|
|
3
|
+
const held = /* @__PURE__ */ new Set();
|
|
4
|
+
const header = "x-seams-intended-presign-cancellation";
|
|
5
|
+
const initPath = "/router-ab/ecdsa-derivation/presignature-pool/fill/init";
|
|
6
|
+
var HeldPresignProxy = class {
|
|
7
|
+
constructor(token) {
|
|
8
|
+
this.token = token;
|
|
9
|
+
}
|
|
10
|
+
async fetch() {
|
|
11
|
+
held.add(this.token);
|
|
12
|
+
await new Promise(resolveHeldPresign);
|
|
13
|
+
held.delete(this.token);
|
|
14
|
+
return Response.json({
|
|
15
|
+
ok: false,
|
|
16
|
+
code: "temporarily_unavailable"
|
|
17
|
+
}, { status: 503 });
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
function resolveHeldPresign(resolve) {
|
|
21
|
+
setTimeout(resolve, 3e4);
|
|
22
|
+
}
|
|
23
|
+
async function localPresignCancellationProbe(request, env, ctx, dependencies) {
|
|
24
|
+
const token = request.headers.get(header);
|
|
25
|
+
if (token === null) return null;
|
|
26
|
+
const url = new URL(request.url);
|
|
27
|
+
if (url.protocol !== "http:" || url.hostname !== "127.0.0.1" || url.pathname !== initPath || !/^[0-9a-f-]{36}$/u.test(token)) return Response.json({ code: "invalid_presign_cancellation_probe" }, { status: 400 });
|
|
28
|
+
if (request.method === "GET") return Response.json({ held: held.has(token) });
|
|
29
|
+
if (request.method === "DELETE") {
|
|
30
|
+
held.delete(token);
|
|
31
|
+
return new Response(null, { status: 204 });
|
|
32
|
+
}
|
|
33
|
+
if (request.method !== "POST") return new Response(null, { status: 405 });
|
|
34
|
+
const headers = new Headers(request.headers);
|
|
35
|
+
headers.delete(header);
|
|
36
|
+
return handleSplitGatewayRequest(new Request(request, { headers }), {
|
|
37
|
+
...env,
|
|
38
|
+
SIGNING_WORKER: new HeldPresignProxy(token)
|
|
39
|
+
}, ctx, dependencies);
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { localPresignCancellationProbe };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=localIntendedPresignCancellation.js.map
|
|
@@ -191,32 +191,46 @@ async function validateRouterAbEcdsaDerivationWalletSessionInputs(input) {
|
|
|
191
191
|
const token = extractBearerCredential(input.headers);
|
|
192
192
|
if (!token) return walletSessionFailure("wallet_session_missing");
|
|
193
193
|
const nowMs = input.nowMs || Date.now;
|
|
194
|
-
let
|
|
194
|
+
let candidate;
|
|
195
195
|
try {
|
|
196
|
-
|
|
197
|
-
authorizationSessions,
|
|
196
|
+
candidate = await authorizationSessions.readWalletSessionSigningCandidateByOperationCredential({
|
|
197
|
+
tenantId: authorizationSessions.tenantId,
|
|
198
198
|
token,
|
|
199
199
|
nowMs: nowMs(),
|
|
200
|
-
|
|
201
|
-
keyFamily: "ecdsa_secp256k1",
|
|
202
|
-
operationKind: input.operationKind
|
|
203
|
-
}
|
|
200
|
+
materialActivation: input.materialActivation
|
|
204
201
|
});
|
|
205
202
|
} catch {
|
|
206
203
|
return walletSessionFailure("wallet_session_unavailable");
|
|
207
204
|
}
|
|
208
|
-
if (
|
|
209
|
-
if (resolution.kind === "not_found") return {
|
|
205
|
+
if (!candidate) return {
|
|
210
206
|
ok: false,
|
|
211
207
|
code: "wallet_session_invalid",
|
|
212
208
|
message: walletSessionFailureMessage("wallet_session_invalid")
|
|
213
209
|
};
|
|
210
|
+
if (candidate.kind === "exhausted") return {
|
|
211
|
+
ok: true,
|
|
212
|
+
kind: "wallet_session_operation_credential_exhausted_candidate_v1",
|
|
213
|
+
candidate: candidate.candidate,
|
|
214
|
+
materialRead: candidate.materialRead,
|
|
215
|
+
policyRead: candidate.policyRead
|
|
216
|
+
};
|
|
217
|
+
const resolution = resolveWalletSessionOperationCredentialAdmissionFromContext({
|
|
218
|
+
context: candidate.context,
|
|
219
|
+
nowMs: nowMs(),
|
|
220
|
+
operation: {
|
|
221
|
+
keyFamily: "ecdsa_secp256k1",
|
|
222
|
+
operationKind: input.operationKind
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
if (resolution.kind === "rejected") return walletSessionFailure("wallet_session_scope_mismatch");
|
|
214
226
|
if (resolution.admission.curve !== "ecdsa") return walletSessionFailure("wallet_session_scope_mismatch");
|
|
215
227
|
return {
|
|
216
228
|
ok: true,
|
|
217
229
|
kind: "wallet_session_operation_credential_v1",
|
|
218
230
|
admission: resolution.admission,
|
|
219
|
-
context: resolution.admission.context
|
|
231
|
+
context: resolution.admission.context,
|
|
232
|
+
materialRead: candidate.materialRead,
|
|
233
|
+
policyRead: candidate.policyRead
|
|
220
234
|
};
|
|
221
235
|
}
|
|
222
236
|
async function resolveThresholdRuntimePolicyScope(input) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { failure } from "../../shared-ts/src/utils/failure.js";
|
|
1
2
|
//#region src/router/auth/walletSessionFailure.ts
|
|
2
3
|
function walletSessionFailureMessage(code) {
|
|
3
4
|
switch (code) {
|
|
@@ -24,11 +25,7 @@ function walletSessionFailureStatus(code) {
|
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
27
|
function walletSessionFailure(code) {
|
|
27
|
-
return
|
|
28
|
-
ok: false,
|
|
29
|
-
code,
|
|
30
|
-
message: walletSessionFailureMessage(code)
|
|
31
|
-
};
|
|
28
|
+
return failure(code, walletSessionFailureMessage(code));
|
|
32
29
|
}
|
|
33
30
|
//#endregion
|
|
34
31
|
export { walletSessionFailure, walletSessionFailureMessage, walletSessionFailureStatus };
|
|
@@ -2,6 +2,7 @@ import { base64Decode, base64UrlDecode, base64UrlEncode } from "../../shared-ts/
|
|
|
2
2
|
import "../../shared-ts/src/utils/encoders.js";
|
|
3
3
|
import { normalizeOptionalTrimmedString } from "../../shared-ts/src/utils/normalize.js";
|
|
4
4
|
import "../../shared-ts/src/utils/validation.js";
|
|
5
|
+
import { failure } from "../../shared-ts/src/utils/failure.js";
|
|
5
6
|
import { errorMessage } from "../../shared-ts/src/utils/errors.js";
|
|
6
7
|
//#region src/router/auth/webAuthnCredentialCodecs.ts
|
|
7
8
|
function decodeWebAuthnBase64UrlOrBase64(input, fieldName) {
|
|
@@ -45,30 +46,18 @@ function webAuthnOriginHostnameOrEmpty(origin) {
|
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
function webAuthnCredentialIdB64uFromCredential(input) {
|
|
48
|
-
if (input === null || typeof input !== "object" || Array.isArray(input)) return
|
|
49
|
-
ok: false,
|
|
50
|
-
code: "invalid_body",
|
|
51
|
-
message: "Missing webauthn_authentication.id/rawId"
|
|
52
|
-
};
|
|
49
|
+
if (input === null || typeof input !== "object" || Array.isArray(input)) return failure("invalid_body", "Missing webauthn_authentication.id/rawId");
|
|
53
50
|
const rawId = normalizeOptionalTrimmedString(Reflect.get(input, "rawId"));
|
|
54
51
|
const id = normalizeOptionalTrimmedString(Reflect.get(input, "id"));
|
|
55
52
|
const selected = rawId || id;
|
|
56
|
-
if (!selected) return
|
|
57
|
-
ok: false,
|
|
58
|
-
code: "invalid_body",
|
|
59
|
-
message: "Missing webauthn_authentication.id/rawId"
|
|
60
|
-
};
|
|
53
|
+
if (!selected) return failure("invalid_body", "Missing webauthn_authentication.id/rawId");
|
|
61
54
|
try {
|
|
62
55
|
return {
|
|
63
56
|
ok: true,
|
|
64
57
|
credentialIdB64u: base64UrlEncode(decodeWebAuthnBase64UrlOrBase64(selected, "webauthn_authentication.rawId"))
|
|
65
58
|
};
|
|
66
59
|
} catch (error) {
|
|
67
|
-
return
|
|
68
|
-
ok: false,
|
|
69
|
-
code: "invalid_body",
|
|
70
|
-
message: errorMessage(error) || "Invalid credential rawId"
|
|
71
|
-
};
|
|
60
|
+
return failure("invalid_body", errorMessage(error) || "Invalid credential rawId");
|
|
72
61
|
}
|
|
73
62
|
}
|
|
74
63
|
function parseWebAuthnAuthenticationCredential(input) {
|
|
@@ -5,6 +5,7 @@ function createD1AuthorizedOperationRouteService(assembly) {
|
|
|
5
5
|
if (!tenantId.ok) throw new Error(`orgId cannot identify an authorization tenant: ${tenantId.error.message}`);
|
|
6
6
|
return {
|
|
7
7
|
tenantId: tenantId.value,
|
|
8
|
+
resolveEcdsaWalletSessionOperation: assembly.authorizationStore.resolveEcdsaWalletSessionOperation.bind(assembly.authorizationStore),
|
|
8
9
|
admitEcdsaWalletSessionOperation: assembly.authorizationStore.admitEcdsaWalletSessionOperation.bind(assembly.authorizationStore),
|
|
9
10
|
readPinnedOwnerWalletScope: assembly.authorizationStore.readPinnedOwnerWalletScope.bind(assembly.authorizationStore),
|
|
10
11
|
buildVerifiedOwnerProof: assembly.authorizationService.buildVerifiedOwnerProof.bind(assembly.authorizationService),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { hasWhitespaceOrControlCharacters, parseWalletId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
+
import { toArrayBufferCopy } from "../../../../core/authService/portableCrypto.js";
|
|
2
3
|
//#region src/router/cloudflare/d1/auth/d1RouterApiAuthBoundary.ts
|
|
3
4
|
function parseD1BoundaryWalletIdResult(raw) {
|
|
4
5
|
const parsed = parseWalletId(raw);
|
|
@@ -64,11 +65,6 @@ function d1MutationChanges(result) {
|
|
|
64
65
|
const meta = result.meta;
|
|
65
66
|
return parseD1NonNegativeCount(meta?.changes ?? meta?.rows_written);
|
|
66
67
|
}
|
|
67
|
-
function toArrayBufferCopy(bytes) {
|
|
68
|
-
const out = new ArrayBuffer(bytes.byteLength);
|
|
69
|
-
new Uint8Array(out).set(bytes);
|
|
70
|
-
return out;
|
|
71
|
-
}
|
|
72
68
|
async function sha256BytesPortable(input) {
|
|
73
69
|
const subtle = globalThis.crypto?.subtle;
|
|
74
70
|
if (subtle && typeof subtle.digest === "function") return new Uint8Array(await subtle.digest("SHA-256", toArrayBufferCopy(input)));
|
|
@@ -79,6 +75,6 @@ async function sha256BytesPortable(input) {
|
|
|
79
75
|
throw new Error("SHA-256 digest is unavailable in this runtime");
|
|
80
76
|
}
|
|
81
77
|
//#endregion
|
|
82
|
-
export { d1MutationChanges, isB64uString, nonNegativeSafeInteger, optionalNonNegativeInteger, parseD1BoundaryWalletId, parseD1BoundaryWalletIdResult, parseD1NonNegativeCount, parseJsonObject, positiveInteger, positiveSafeInteger, sha256BytesPortable,
|
|
78
|
+
export { d1MutationChanges, isB64uString, nonNegativeSafeInteger, optionalNonNegativeInteger, parseD1BoundaryWalletId, parseD1BoundaryWalletIdResult, parseD1NonNegativeCount, parseJsonObject, positiveInteger, positiveSafeInteger, sha256BytesPortable, toRecordValue };
|
|
83
79
|
|
|
84
80
|
//# sourceMappingURL=d1RouterApiAuthBoundary.js.map
|
|
@@ -19,12 +19,14 @@ import { sha256BytesPortable, toRecordValue } from "./d1RouterApiAuthBoundary.js
|
|
|
19
19
|
import { CloudflareD1WebAuthnStore } from "../webauthn/d1WebAuthnStore.js";
|
|
20
20
|
import { verifyD1LinkedDeviceFreshRevokeProofV1 } from "../wallet/d1WalletAuthMethodBoundary.js";
|
|
21
21
|
import { CloudflareD1WebAuthnAuthService } from "../webauthn/d1WebAuthnAuthService.js";
|
|
22
|
+
import { D1LinkedDeviceAuthorityInstallServiceV1 } from "../deviceLinking/d1LinkedDeviceAuthorityInstallService.js";
|
|
22
23
|
import { D1WalletAuthorityStore } from "../wallet/d1WalletAuthorityStore.js";
|
|
23
24
|
import { CloudflareD1AuthorizationStore } from "../authorization/d1AuthorizationStore.js";
|
|
24
25
|
import { createCloudflareD1VersionedJsonRecordStore } from "../versionedJson/d1VersionedJsonRecordStore.js";
|
|
25
26
|
import { parseRouterAbEd25519YaoRegistrationSideEffectRecordV2, runRouterAbEd25519YaoRegistrationSideEffectV1 } from "../../../domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js";
|
|
26
27
|
import { createCloudflareOrdinaryInactiveSignerMaterialActivationPortV1, createCloudflareOrdinaryInactiveSignerMaterialDeactivationPortV1, createCloudflareOrdinaryInactiveSignerMaterialReservationServiceV1 } from "../../signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js";
|
|
27
28
|
import { normalizeD1RouterApiAuthOptions } from "./d1RouterApiAuthConfig.js";
|
|
29
|
+
import { readActiveWalletSessionCredential, readExhaustedWalletSessionCredential, readWalletSessionSigningCandidate } from "./walletSessionCredentialReaders.js";
|
|
28
30
|
import { createD1AuthorizedOperationRouteService } from "./d1AuthorizedOperationRouteService.js";
|
|
29
31
|
import { parseRegistrationEstablishedSessionProjectionV2 } from "../../../../shared-ts/src/utils/registrationEstablishedSession.js";
|
|
30
32
|
import { D1IdentityStore } from "../../../../core/d1IdentityStore.js";
|
|
@@ -68,7 +70,6 @@ import { createD1LinkedDeviceSessionServiceV1 } from "../deviceLinking/d1LinkedD
|
|
|
68
70
|
import { D1LinkedDeviceSessionStoreV1 } from "../deviceLinking/d1LinkedDeviceSessionStore.js";
|
|
69
71
|
import { createD1LinkedDeviceRouteServiceV1 } from "../deviceLinking/d1LinkedDeviceRouteService.js";
|
|
70
72
|
import { D1LinkedDeviceEmailOtpGrantStoreV1 } from "../deviceLinking/d1LinkedDeviceEmailOtpGrantStore.js";
|
|
71
|
-
import { D1LinkedDeviceAuthorityInstallServiceV1 } from "../deviceLinking/d1LinkedDeviceAuthorityInstallService.js";
|
|
72
73
|
import { createD1LinkedDeviceManagementServiceV1 } from "../deviceLinking/d1LinkedDeviceManagementService.js";
|
|
73
74
|
import { createD1LinkedDeviceRevocationV1 } from "../deviceLinking/d1LinkedDeviceRevocation.js";
|
|
74
75
|
import { createD1LinkedDeviceVerifiedLinkSourceReaderV1 } from "../deviceLinking/d1LinkedDeviceVerifiedLinkSourceReader.js";
|
|
@@ -1490,39 +1491,16 @@ function createD1IdentityRouteService(assembly) {
|
|
|
1490
1491
|
verifyGithubOAuthCode: assembly.oidcVerification.verifyGithubOAuthCode.bind(assembly.oidcVerification)
|
|
1491
1492
|
};
|
|
1492
1493
|
}
|
|
1493
|
-
function isExhaustedWalletSessionStatus(status) {
|
|
1494
|
-
return status.kind === "exhausted";
|
|
1495
|
-
}
|
|
1496
1494
|
function createD1AuthorizationSessionRouteService(assembly) {
|
|
1497
1495
|
const tenantId = parseTenantId(assembly.options.orgId);
|
|
1498
1496
|
if (!tenantId.ok) throw new Error(`orgId cannot identify an authorization tenant: ${tenantId.error.message}`);
|
|
1499
1497
|
return {
|
|
1500
1498
|
tenantId: tenantId.value,
|
|
1501
1499
|
issueDirectWalletSessionAuthorizationV2: assembly.authorizationService.issueDirectWalletSessionAuthorizationV2.bind(assembly.authorizationService),
|
|
1502
|
-
readWalletSessionAuthorizationV2ByOperationCredential:
|
|
1503
|
-
|
|
1504
|
-
if (!snapshot) return null;
|
|
1505
|
-
const { authorization, authority, authMethod } = snapshot;
|
|
1506
|
-
if (!authority || authority.state !== "active" || !authMethod || authMethod.status !== "active") return null;
|
|
1507
|
-
return {
|
|
1508
|
-
authorization,
|
|
1509
|
-
authority,
|
|
1510
|
-
authMethod,
|
|
1511
|
-
retiredAtMs: null
|
|
1512
|
-
};
|
|
1513
|
-
},
|
|
1500
|
+
readWalletSessionAuthorizationV2ByOperationCredential: readActiveWalletSessionCredential.bind(null, assembly.authorizationService),
|
|
1501
|
+
readWalletSessionSigningCandidateByOperationCredential: readWalletSessionSigningCandidate.bind(null, assembly.authorizationService),
|
|
1514
1502
|
readWalletSessionExactOperationContextByCredential: assembly.authorizationService.readWalletSessionExactOperationContextByCredential.bind(assembly.authorizationService),
|
|
1515
|
-
readExhaustedWalletSessionAuthorizationV2CandidateByOperationCredential:
|
|
1516
|
-
const { status, authority, authMethod } = await assembly.authorizationService.readExactWalletSessionStatusSnapshotByOperationCredential(input);
|
|
1517
|
-
if (!isExhaustedWalletSessionStatus(status)) return null;
|
|
1518
|
-
if (!authority || authority.state !== "active" || !authMethod || authMethod.status !== "active" || authority.walletId !== status.session.walletId || authority.authorityDigestB64u !== status.session.authorityDigestB64u || authority.revocationEpoch !== status.session.authorityRevocationEpoch || authMethod.walletId !== status.session.walletId || authMethod.walletAuthorityId !== status.session.authorityId || authMethod.walletAuthMethodId !== status.session.walletAuthMethodId) return null;
|
|
1519
|
-
return {
|
|
1520
|
-
status,
|
|
1521
|
-
authority,
|
|
1522
|
-
authMethod,
|
|
1523
|
-
retiredAtMs: null
|
|
1524
|
-
};
|
|
1525
|
-
},
|
|
1503
|
+
readExhaustedWalletSessionAuthorizationV2CandidateByOperationCredential: readExhaustedWalletSessionCredential.bind(null, assembly.authorizationService),
|
|
1526
1504
|
readExactWalletSessionStatusByOperationCredential: assembly.authorizationService.readExactWalletSessionStatusByOperationCredential.bind(assembly.authorizationService),
|
|
1527
1505
|
mintHostedWalletSeamsSessionExchange: assembly.authorizationService.mintHostedWalletSeamsSessionExchange.bind(assembly.authorizationService),
|
|
1528
1506
|
redeemHostedWalletSeamsSessionExchange: assembly.authorizationService.redeemHostedWalletSeamsSessionExchange.bind(assembly.authorizationService),
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
//#region src/router/cloudflare/d1/auth/walletSessionCredentialReaders.ts
|
|
2
|
+
function activeContext(snapshot) {
|
|
3
|
+
const { authorization, authority, authMethod } = snapshot;
|
|
4
|
+
if (!authority || authority.state !== "active" || !authMethod || authMethod.status !== "active") return null;
|
|
5
|
+
return {
|
|
6
|
+
authorization,
|
|
7
|
+
authority,
|
|
8
|
+
authMethod,
|
|
9
|
+
retiredAtMs: null
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function exhaustedContext(snapshot) {
|
|
13
|
+
const { session, quota, authority, authMethod } = snapshot;
|
|
14
|
+
if (!authority || authority.state !== "active" || !authMethod || authMethod.status !== "active" || authority.walletId !== session.walletId || authority.authorityDigestB64u !== session.authorityDigestB64u || authority.revocationEpoch !== session.authorityRevocationEpoch || authMethod.walletId !== session.walletId || authMethod.walletAuthorityId !== session.authorityId || authMethod.walletAuthMethodId !== session.walletAuthMethodId) return null;
|
|
15
|
+
return {
|
|
16
|
+
status: {
|
|
17
|
+
kind: "exhausted",
|
|
18
|
+
session,
|
|
19
|
+
quota
|
|
20
|
+
},
|
|
21
|
+
authority,
|
|
22
|
+
authMethod,
|
|
23
|
+
retiredAtMs: null
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async function readActiveWalletSessionCredential(service, input) {
|
|
27
|
+
const snapshot = await service.readWalletSessionAdmissionSnapshotByOperationCredential(input);
|
|
28
|
+
if (!snapshot) return null;
|
|
29
|
+
if (snapshot.kind === "exhausted") throw new Error("Stored V2 Wallet Session quota is no longer active");
|
|
30
|
+
return activeContext(snapshot);
|
|
31
|
+
}
|
|
32
|
+
async function readWalletSessionSigningCandidate(service, input) {
|
|
33
|
+
const read = await service.readEcdsaWalletSessionAdmissionSnapshotByOperationCredential(input);
|
|
34
|
+
if (!read) return null;
|
|
35
|
+
const { snapshot, materialRead, policyRead } = read;
|
|
36
|
+
switch (snapshot.kind) {
|
|
37
|
+
case "active": {
|
|
38
|
+
const context = activeContext(snapshot);
|
|
39
|
+
return context ? {
|
|
40
|
+
kind: "active",
|
|
41
|
+
context,
|
|
42
|
+
materialRead,
|
|
43
|
+
policyRead
|
|
44
|
+
} : null;
|
|
45
|
+
}
|
|
46
|
+
case "exhausted": {
|
|
47
|
+
const candidate = exhaustedContext(snapshot);
|
|
48
|
+
if (!candidate) throw new Error("Exhausted Wallet Session authority is unavailable");
|
|
49
|
+
return {
|
|
50
|
+
kind: "exhausted",
|
|
51
|
+
candidate,
|
|
52
|
+
materialRead,
|
|
53
|
+
policyRead
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
default: {
|
|
57
|
+
const unexpected = snapshot;
|
|
58
|
+
throw new Error(`Unsupported Wallet Session snapshot: ${unexpected}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function readExhaustedWalletSessionCredential(service, input) {
|
|
63
|
+
const { status, authority, authMethod } = await service.readExactWalletSessionStatusSnapshotByOperationCredential(input);
|
|
64
|
+
if (status.kind !== "exhausted") return null;
|
|
65
|
+
return exhaustedContext({
|
|
66
|
+
kind: "exhausted",
|
|
67
|
+
session: status.session,
|
|
68
|
+
quota: status.quota,
|
|
69
|
+
authority,
|
|
70
|
+
authMethod
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { readActiveWalletSessionCredential, readExhaustedWalletSessionCredential, readWalletSessionSigningCandidate };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=walletSessionCredentialReaders.js.map
|
|
@@ -61,7 +61,11 @@ function prepareAuthorizedOperationRead(database, namespace, input) {
|
|
|
61
61
|
LIMIT 1`).bind(namespace, input.tenantId, input.operationFingerprintDigest);
|
|
62
62
|
}
|
|
63
63
|
function prepareAuthorizedOperationAdmissionRead(input) {
|
|
64
|
-
|
|
64
|
+
const material = input.materialSnapshot?.condition(input.walletSignerScope) ?? {
|
|
65
|
+
sql: "1",
|
|
66
|
+
bindings: []
|
|
67
|
+
};
|
|
68
|
+
return input.database.prepare(`SELECT operation.*, ${PINNED_OWNER_WALLET}, (${material.sql}) AS material_snapshot_active,
|
|
65
69
|
CASE operation.authorization_source_kind
|
|
66
70
|
WHEN 'authorization_grant' THEN EXISTS (
|
|
67
71
|
SELECT 1
|
|
@@ -117,7 +121,7 @@ function prepareAuthorizedOperationAdmissionRead(input) {
|
|
|
117
121
|
FROM authorized_operations AS operation
|
|
118
122
|
WHERE operation.namespace = ? AND operation.tenant_id = ?
|
|
119
123
|
AND operation.operation_fingerprint_digest = ?
|
|
120
|
-
LIMIT 1`).bind(input.walletSignerScope.orgId, input.walletSignerScope.projectId, input.walletSignerScope.envId, input.nowMs, input.nowMs, input.namespace, input.tenantId, input.operationFingerprintDigest);
|
|
124
|
+
LIMIT 1`).bind(...material.bindings, input.walletSignerScope.orgId, input.walletSignerScope.projectId, input.walletSignerScope.envId, input.nowMs, input.nowMs, input.namespace, input.tenantId, input.operationFingerprintDigest);
|
|
121
125
|
}
|
|
122
126
|
function prepareAuthorizedOperationInsert(input) {
|
|
123
127
|
const { database, namespace, walletSignerScope, operation, material } = input;
|
|
@@ -165,7 +169,27 @@ function prepareAuthorizedOperationInsert(input) {
|
|
|
165
169
|
source.kind === "authorization_grant" ? walletSignerScope.projectId : null,
|
|
166
170
|
source.kind === "authorization_grant" ? walletSignerScope.envId : null
|
|
167
171
|
];
|
|
168
|
-
|
|
172
|
+
let condition = input.materialSnapshot?.condition(walletSignerScope) ?? null;
|
|
173
|
+
if (condition === null) condition = material?.kind === "ecdsa_material_activation" ? {
|
|
174
|
+
sql: ECDSA_SIGNER_MATCH,
|
|
175
|
+
bindings: ecdsaSignerMatchBindings(walletSignerScope, material)
|
|
176
|
+
} : {
|
|
177
|
+
sql: "1",
|
|
178
|
+
bindings: []
|
|
179
|
+
};
|
|
180
|
+
const absence = input.existingOperation === "preserve" ? {
|
|
181
|
+
sql: `NOT EXISTS (SELECT 1 FROM authorized_operations
|
|
182
|
+
WHERE namespace = ? AND tenant_id = ? AND operation_fingerprint_digest = ?)`,
|
|
183
|
+
bindings: [
|
|
184
|
+
namespace,
|
|
185
|
+
operation.tenantId,
|
|
186
|
+
operation.operationFingerprintDigest
|
|
187
|
+
]
|
|
188
|
+
} : {
|
|
189
|
+
sql: "1",
|
|
190
|
+
bindings: []
|
|
191
|
+
};
|
|
192
|
+
return database.prepare(`INSERT INTO authorized_operations (
|
|
169
193
|
namespace, tenant_id, authorized_operation_id, audit_event_id,
|
|
170
194
|
principal_id, capability_id, capability_kind, operation_kind, operation_id,
|
|
171
195
|
operation_fingerprint_digest, lane_digest, intent_digest, display_digest,
|
|
@@ -183,24 +207,7 @@ function prepareAuthorizedOperationInsert(input) {
|
|
|
183
207
|
) SELECT ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
184
208
|
'claimed', 'pending', NULL, NULL, NULL, NULL, ?, NULL, ?,
|
|
185
209
|
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
|
|
186
|
-
WHERE ${
|
|
187
|
-
namespace, tenant_id, authorized_operation_id, audit_event_id,
|
|
188
|
-
principal_id, capability_id, capability_kind, operation_kind, operation_id,
|
|
189
|
-
operation_fingerprint_digest, lane_digest, intent_digest, display_digest,
|
|
190
|
-
authorization_source_kind, authorization_id, evidence_set_digest,
|
|
191
|
-
quota_id, quota_kind, authorization_grant_kind, lifecycle_kind, result_kind,
|
|
192
|
-
result_digest, result_status, result_content_type, result_body_text,
|
|
193
|
-
claimed_at_ms, completed_at_ms,
|
|
194
|
-
material_activation_id, material_activation_capability,
|
|
195
|
-
material_activation_owner, material_activation_key_binding,
|
|
196
|
-
material_activation_lifecycle_binding, material_activation_signing_worker,
|
|
197
|
-
linked_wallet_id, linked_enrollment_id, linked_device_id,
|
|
198
|
-
linked_wallet_key_id, linked_lane_id, linked_lane_share_epoch,
|
|
199
|
-
linked_revocation_epoch, linked_scope_org_id, linked_scope_project_id,
|
|
200
|
-
linked_scope_env_id
|
|
201
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
202
|
-
'claimed', 'pending', NULL, NULL, NULL, NULL, ?, NULL, ?,
|
|
203
|
-
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).bind(...values);
|
|
210
|
+
WHERE (${condition.sql}) AND (${absence.sql})`).bind(...values, ...condition.bindings, ...absence.bindings);
|
|
204
211
|
}
|
|
205
212
|
//#endregion
|
|
206
213
|
export { prepareAuthorizedOperationAdmissionRead, prepareAuthorizedOperationCommittedRead, prepareAuthorizedOperationInsert, prepareAuthorizedOperationRead };
|