tapimo 0.15.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/ApiKey.d.ts +1 -0
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +4 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +37 -11
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +163 -10
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +13085 -11974
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +46 -15
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +1 -1
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +896 -191
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +5 -1
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +33 -33
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +8 -3
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +66 -27
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +36 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +25 -25
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +5 -4
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/route-policies.d.ts +632 -0
- package/dist/admin/apps/route-policies.d.ts.map +1 -0
- package/dist/admin/apps/route-policies.js +257 -0
- package/dist/admin/apps/route-policies.js.map +1 -0
- package/dist/admin/apps/routes-support.js +39 -3
- package/dist/admin/apps/routes-support.js.map +1 -1
- package/dist/admin/apps/routes.d.ts +454 -1
- package/dist/admin/apps/routes.d.ts.map +1 -1
- package/dist/admin/apps/routes.js +82 -1
- package/dist/admin/apps/routes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +10 -4
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +24 -4
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- package/dist/admin/index.d.ts +0 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +0 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +99 -103
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +65 -1
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +1 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +58 -59
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +2709 -2670
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +5 -5
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +50 -0
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +248 -248
- package/dist/apps/data/routes/balances.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +5 -7
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/earn.d.ts +103 -12
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +456 -220
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +267 -97
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +1 -19
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +93 -56
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +10 -10
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- package/dist/apps/data/routes/rpc.js +45 -11
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +11 -6
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +2 -0
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +30 -22
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +12 -12
- package/dist/apps/data/routes/valuation.d.ts +30 -30
- package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
- package/dist/apps/data/routes/webhooks.d.ts +1 -1
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +18 -11
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +3 -3
- package/dist/apps/management/App.d.ts +3043 -2198
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +2 -0
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/Billing.d.ts +2 -4
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +65 -26
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +16 -4
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +70 -11
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +84 -84
- package/dist/apps/management/routes/cli.d.ts +912 -0
- package/dist/apps/management/routes/cli.d.ts.map +1 -0
- package/dist/apps/management/routes/cli.js +416 -0
- package/dist/apps/management/routes/cli.js.map +1 -0
- package/dist/apps/management/routes/faucet.d.ts +8 -8
- package/dist/apps/management/routes/invitations.d.ts +24 -24
- package/dist/apps/management/routes/invite-links.d.ts +66 -66
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +20 -20
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +8 -2
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +76 -76
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +7 -9
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +119 -119
- package/dist/apps/mcp.d.ts.map +1 -1
- package/dist/apps/mcp.js +16 -3
- package/dist/apps/mcp.js.map +1 -1
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Policy.js +4 -2
- package/dist/apps/mpp/internal/Policy.js.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Sponsorship.js +6 -4
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
- package/dist/apps/relay/App.d.ts +8 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +16 -4
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -6
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +71 -60
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/apps/routes/Access.d.ts +53 -0
- package/dist/apps/routes/Access.d.ts.map +1 -1
- package/dist/apps/routes/Access.js +121 -0
- package/dist/apps/routes/Access.js.map +1 -1
- package/dist/apps/routes/App.d.ts +397 -158
- package/dist/apps/routes/App.d.ts.map +1 -1
- package/dist/apps/routes/App.js.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
- package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/routes/routes/deposit-addresses.js +217 -32
- package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/routes/routes/quotes.d.ts +90 -0
- package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
- package/dist/apps/routes/routes/quotes.js +101 -27
- package/dist/apps/routes/routes/quotes.js.map +1 -1
- package/dist/apps/routes/routes/transfers.d.ts +187 -135
- package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
- package/dist/apps/routes/routes/transfers.js +182 -37
- package/dist/apps/routes/routes/transfers.js.map +1 -1
- package/dist/cli/ApiKeys.d.ts +120 -0
- package/dist/cli/ApiKeys.d.ts.map +1 -0
- package/dist/cli/ApiKeys.js +138 -0
- package/dist/cli/ApiKeys.js.map +1 -0
- package/dist/cli/Cli.d.ts +92 -34
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +188 -11
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/Credentials.d.ts +95 -0
- package/dist/cli/Credentials.d.ts.map +1 -0
- package/dist/cli/Credentials.js +110 -0
- package/dist/cli/Credentials.js.map +1 -0
- package/dist/cli/Spec.d.ts +59 -0
- package/dist/cli/Spec.d.ts.map +1 -0
- package/dist/cli/Spec.js +77 -0
- package/dist/cli/Spec.js.map +1 -0
- package/dist/cli/bin.js +5 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -5
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/auth.d.ts +73 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +204 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/keys.d.ts +17 -0
- package/dist/cli/commands/keys.d.ts.map +1 -0
- package/dist/cli/commands/keys.js +109 -0
- package/dist/cli/commands/keys.js.map +1 -0
- package/dist/cloudflare.d.ts +27 -2
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +144 -17
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +23 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +418 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +44 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
- package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
- package/dist/db/tables/apiKeyAdmissions.js +65 -9
- package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
- package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
- package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
- package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
- package/dist/db/tables/authAccounts.d.ts.map +1 -1
- package/dist/db/tables/authAccounts.js +1 -0
- package/dist/db/tables/authAccounts.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +12 -1
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +4 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +8 -34
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +5 -1
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +10 -2
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
- package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
- package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
- package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
- package/dist/db/tables/rewardRuns.d.ts.map +1 -1
- package/dist/db/tables/rewardRuns.js +4 -0
- package/dist/db/tables/rewardRuns.js.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
- package/dist/db/tables/rewardTransactionAttempts.js +2 -0
- package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
- package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
- package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
- package/dist/db/tables/routesDepositAddresses.js +84 -31
- package/dist/db/tables/routesDepositAddresses.js.map +1 -1
- package/dist/db/tables/routesDeposits.d.ts.map +1 -1
- package/dist/db/tables/routesDeposits.js +31 -21
- package/dist/db/tables/routesDeposits.js.map +1 -1
- package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
- package/dist/db/tables/routesIdempotency.js +2 -0
- package/dist/db/tables/routesIdempotency.js.map +1 -1
- package/dist/db/tables/routesPolicies.d.ts +58 -0
- package/dist/db/tables/routesPolicies.d.ts.map +1 -0
- package/dist/db/tables/routesPolicies.js +198 -0
- package/dist/db/tables/routesPolicies.js.map +1 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
- package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidies.js +41 -0
- package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
- package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
- package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
- package/dist/db/tables/routesTransfers.d.ts +26 -1
- package/dist/db/tables/routesTransfers.d.ts.map +1 -1
- package/dist/db/tables/routesTransfers.js +36 -6
- package/dist/db/tables/routesTransfers.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +144 -33
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +2 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +11 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
- package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.js +65 -44
- package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +1 -1
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +3 -2
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/relay.d.ts +2 -0
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +34 -15
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +73 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +212 -85
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/BetterAuth.d.ts +22 -0
- package/dist/internal/BetterAuth.d.ts.map +1 -1
- package/dist/internal/BetterAuth.js +17 -14
- package/dist/internal/BetterAuth.js.map +1 -1
- package/dist/internal/Cache.d.ts +5 -0
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +3 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/CliAuth.d.ts +243 -0
- package/dist/internal/CliAuth.d.ts.map +1 -0
- package/dist/internal/CliAuth.js +249 -0
- package/dist/internal/CliAuth.js.map +1 -0
- package/dist/internal/EarnSharePrices.d.ts +1 -1
- package/dist/internal/EarnSharePrices.d.ts.map +1 -1
- package/dist/internal/EarnSharePrices.js +7 -3
- package/dist/internal/EarnSharePrices.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +47 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +188 -4
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/EarnWithdrawals.d.ts +73 -0
- package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
- package/dist/internal/EarnWithdrawals.js +189 -0
- package/dist/internal/EarnWithdrawals.js.map +1 -0
- package/dist/internal/ExecutionContext.d.ts +21 -0
- package/dist/internal/ExecutionContext.d.ts.map +1 -0
- package/dist/internal/ExecutionContext.js +16 -0
- package/dist/internal/ExecutionContext.js.map +1 -0
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +163 -130
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +26 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +67 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +174 -27
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Store.d.ts +6 -0
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +4 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Timing.d.ts +6 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +21 -1
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Tron.d.ts +124 -0
- package/dist/internal/Tron.d.ts.map +1 -0
- package/dist/internal/Tron.js +202 -0
- package/dist/internal/Tron.js.map +1 -0
- package/dist/internal/Viem.d.ts +4 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +25 -6
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/rewards/Read.d.ts +2 -2
- package/dist/internal/rewards/Read.d.ts.map +1 -1
- package/dist/internal/rewards/Read.js +11 -2
- package/dist/internal/rewards/Read.js.map +1 -1
- package/dist/internal/routes/Action.d.ts +27 -0
- package/dist/internal/routes/Action.d.ts.map +1 -1
- package/dist/internal/routes/Action.js +49 -1
- package/dist/internal/routes/Action.js.map +1 -1
- package/dist/internal/routes/Chain.d.ts +2 -0
- package/dist/internal/routes/Chain.d.ts.map +1 -1
- package/dist/internal/routes/Chain.js +4 -0
- package/dist/internal/routes/Chain.js.map +1 -1
- package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
- package/dist/internal/routes/DepositAddress.js +5 -0
- package/dist/internal/routes/DepositAddress.js.map +1 -1
- package/dist/internal/routes/Evidence.d.ts.map +1 -1
- package/dist/internal/routes/Evidence.js +6 -2
- package/dist/internal/routes/Evidence.js.map +1 -1
- package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
- package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/EvmTransferSettlement.js +196 -0
- package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
- package/dist/internal/routes/Policy.d.ts +161 -0
- package/dist/internal/routes/Policy.d.ts.map +1 -0
- package/dist/internal/routes/Policy.js +249 -0
- package/dist/internal/routes/Policy.js.map +1 -0
- package/dist/internal/routes/Provider.d.ts +66 -3
- package/dist/internal/routes/Provider.d.ts.map +1 -1
- package/dist/internal/routes/Provider.js +106 -27
- package/dist/internal/routes/Provider.js.map +1 -1
- package/dist/internal/routes/Quota.d.ts +57 -0
- package/dist/internal/routes/Quota.d.ts.map +1 -0
- package/dist/internal/routes/Quota.js +144 -0
- package/dist/internal/routes/Quota.js.map +1 -0
- package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
- package/dist/internal/routes/Reconciliation.js +163 -47
- package/dist/internal/routes/Reconciliation.js.map +1 -1
- package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
- package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
- package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
- package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/Subsidy.d.ts +2 -2
- package/dist/internal/routes/Subsidy.d.ts.map +1 -1
- package/dist/internal/routes/Subsidy.js +2 -2
- package/dist/internal/routes/Subsidy.js.map +1 -1
- package/dist/internal/routes/Transfer.d.ts +229 -1
- package/dist/internal/routes/Transfer.d.ts.map +1 -1
- package/dist/internal/routes/Transfer.js +644 -7
- package/dist/internal/routes/Transfer.js.map +1 -1
- package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
- package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
- package/dist/internal/routes/TransferReconciliation.js +83 -159
- package/dist/internal/routes/TransferReconciliation.js.map +1 -1
- package/dist/internal/routes/TransferSettlement.d.ts +45 -0
- package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TransferSettlement.js +2 -0
- package/dist/internal/routes/TransferSettlement.js.map +1 -0
- package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
- package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
- package/dist/internal/routes/TransferSubsidy.js +64 -5
- package/dist/internal/routes/TransferSubsidy.js.map +1 -1
- package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
- package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSettlement.js +201 -0
- package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
- package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
- package/dist/internal/routes/TronTransferSubsidy.js +439 -0
- package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
- package/dist/internal/routes/index.d.ts +3 -0
- package/dist/internal/routes/index.d.ts.map +1 -1
- package/dist/internal/routes/index.js +3 -0
- package/dist/internal/routes/index.js.map +1 -1
- package/dist/internal/routes/providers/across.d.ts +3 -0
- package/dist/internal/routes/providers/across.d.ts.map +1 -1
- package/dist/internal/routes/providers/across.js +11 -0
- package/dist/internal/routes/providers/across.js.map +1 -1
- package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
- package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMesh.js +474 -0
- package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
- package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
- package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
- package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
- package/dist/internal/routes/providers/propAmm.d.ts +70 -0
- package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
- package/dist/internal/routes/providers/propAmm.js +524 -0
- package/dist/internal/routes/providers/propAmm.js.map +1 -0
- package/dist/internal/routes/providers/relay.d.ts +4 -1
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +353 -42
- package/dist/internal/routes/providers/relay.js.map +1 -1
- package/dist/internal/routes/providers/rhino.d.ts +3 -0
- package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
- package/dist/internal/routes/providers/rhino.js +11 -0
- package/dist/internal/routes/providers/rhino.js.map +1 -1
- package/dist/internal/routes/providers/squid.d.ts +3 -0
- package/dist/internal/routes/providers/squid.d.ts.map +1 -1
- package/dist/internal/routes/providers/squid.js +19 -0
- package/dist/internal/routes/providers/squid.js.map +1 -1
- package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
- package/dist/internal/routes/providers/stargate.js +22 -9
- package/dist/internal/routes/providers/stargate.js.map +1 -1
- package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
- package/dist/internal/routes/providers/symbiosis.js +13 -17
- package/dist/internal/routes/providers/symbiosis.js.map +1 -1
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +16 -6
- package/src/ApiKey.ts +7 -3
- package/src/ApiKeys.test.ts +652 -8
- package/src/ApiKeys.ts +191 -11
- package/src/App.test.ts +405 -18
- package/src/App.ts +51 -15
- package/src/Client.test-d.ts +157 -10
- package/src/Client.test.ts +4 -4
- package/src/Scope.ts +1 -2
- package/src/admin/App.ts +11 -5
- package/src/admin/apps/api-keys.test.ts +98 -2
- package/src/admin/apps/api-keys.ts +21 -12
- package/src/admin/apps/earn-vaults.test.ts +76 -7
- package/src/admin/apps/earn-vaults.ts +47 -8
- package/src/admin/apps/organizations.test.ts +147 -31
- package/src/admin/apps/organizations.ts +5 -4
- package/src/admin/apps/route-policies.test.ts +220 -0
- package/src/admin/apps/route-policies.ts +322 -0
- package/src/admin/apps/routes-support.test.ts +107 -2
- package/src/admin/apps/routes-support.ts +43 -3
- package/src/admin/apps/routes.test.ts +150 -0
- package/src/admin/apps/routes.ts +97 -1
- package/src/admin/apps/scopes.test.ts +1 -1
- package/src/admin/apps/verified-tokens.test.ts +32 -0
- package/src/admin/apps/verified-tokens.ts +30 -4
- package/src/admin/index.ts +0 -1
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/components/Dialog.tsx +1 -1
- package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
- package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
- package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
- package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
- package/src/admin/ui/src/lib/route-policies.ts +232 -0
- package/src/admin/ui/src/lib/routes.ts +34 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
- package/src/admin/ui/src/routeTree.gen.ts +21 -0
- package/src/admin/ui/src/routes/__root.tsx +1 -1
- package/src/admin/ui/src/routes/api-keys.tsx +21 -2
- package/src/admin/ui/src/routes/early-access.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
- package/src/admin/ui/src/routes/organizations.tsx +35 -4
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
- package/src/admin/ui/src/routes/route-policies.tsx +678 -0
- package/src/admin/ui/src/routes/routes.tsx +85 -2
- package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
- package/src/admin/ui/src/routes/subsidies.tsx +1 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
- package/src/admin/ui.generated.ts +99 -104
- package/src/analytics/Analytics.test.ts +4 -50
- package/src/analytics/Analytics.ts +65 -1
- package/src/analytics/tables/requestEvents.test.ts +402 -1
- package/src/analytics/tables/requestEvents.ts +62 -93
- package/src/apps/data/App.test.ts +26 -0
- package/src/apps/data/routes/activities.test.ts +315 -14
- package/src/apps/data/routes/activities.ts +60 -0
- package/src/apps/data/routes/balances.ts +5 -7
- package/src/apps/data/routes/earn.bench.ts +18 -0
- package/src/apps/data/routes/earn.local.test.ts +507 -0
- package/src/apps/data/routes/earn.test.ts +405 -127
- package/src/apps/data/routes/earn.ts +660 -270
- package/src/apps/data/routes/exchanges.bench.ts +3 -1
- package/src/apps/data/routes/exchanges.test.ts +166 -2
- package/src/apps/data/routes/exchanges.ts +308 -101
- package/src/apps/data/routes/fee-amm.test.ts +153 -2
- package/src/apps/data/routes/fee-amm.ts +132 -62
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +34 -2
- package/src/apps/data/routes/rpc.ts +47 -10
- package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
- package/src/apps/data/routes/tokens.test.ts +4 -4
- package/src/apps/data/routes/tokens.ts +11 -6
- package/src/apps/data/routes/transactions.test.ts +29 -0
- package/src/apps/data/routes/transactions.ts +33 -22
- package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
- package/src/apps/data/routes/webhooks.test.ts +18 -3
- package/src/apps/data/routes/webhooks.ts +27 -13
- package/src/apps/management/App.ts +4 -0
- package/src/apps/management/Billing.test.ts +253 -27
- package/src/apps/management/Billing.ts +83 -29
- package/src/apps/management/routes/api-keys.test.ts +1 -1
- package/src/apps/management/routes/api-keys.ts +85 -11
- package/src/apps/management/routes/billing.test.ts +68 -4
- package/src/apps/management/routes/cli.test.ts +370 -0
- package/src/apps/management/routes/cli.ts +533 -0
- package/src/apps/management/routes/me.test.ts +14 -4
- package/src/apps/management/routes/orgs.test.ts +108 -4
- package/src/apps/management/routes/orgs.ts +7 -2
- package/src/apps/management/routes/usage.test.ts +2 -2
- package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
- package/src/apps/management/routes/verified-token-requests.ts +7 -10
- package/src/apps/mcp.test.ts +108 -25
- package/src/apps/mcp.ts +15 -3
- package/src/apps/mpp/internal/Policy.test.ts +51 -4
- package/src/apps/mpp/internal/Policy.ts +6 -2
- package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
- package/src/apps/mpp/internal/Sponsorship.ts +6 -4
- package/src/apps/relay/App.test.ts +85 -1
- package/src/apps/relay/App.ts +28 -4
- package/src/apps/relay/Sponsorships.test.ts +97 -1
- package/src/apps/relay/Sponsorships.ts +77 -66
- package/src/apps/routes/Access.test.ts +319 -0
- package/src/apps/routes/Access.ts +147 -0
- package/src/apps/routes/App.ts +10 -0
- package/src/apps/routes/routes/chains.test.ts +3 -2
- package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
- package/src/apps/routes/routes/deposit-addresses.ts +243 -32
- package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
- package/src/apps/routes/routes/quotes.test.ts +81 -8
- package/src/apps/routes/routes/quotes.ts +109 -27
- package/src/apps/routes/routes/transfers.test.ts +252 -15
- package/src/apps/routes/routes/transfers.ts +212 -33
- package/src/cli/ApiKeys.test.ts +265 -0
- package/src/cli/ApiKeys.ts +189 -0
- package/src/cli/Cli.test.ts +188 -0
- package/src/cli/Cli.ts +280 -12
- package/src/cli/Credentials.test.ts +122 -0
- package/src/cli/Credentials.ts +144 -0
- package/src/cli/Spec.test.ts +133 -0
- package/src/cli/Spec.ts +132 -0
- package/src/cli/bin.test.ts +49 -0
- package/src/cli/bin.ts +5 -1
- package/src/cli/commands/auth.test.ts +138 -0
- package/src/cli/commands/auth.ts +254 -0
- package/src/cli/commands/keys.test.ts +68 -0
- package/src/cli/commands/keys.ts +125 -0
- package/src/cloudflare.ts +184 -36
- package/src/db/Db.test.ts +877 -0
- package/src/db/Db.ts +507 -1
- package/src/db/Schema.ts +75 -4
- package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
- package/src/db/tables/apiKeyAdmissions.ts +101 -11
- package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
- package/src/db/tables/authAccounts.test.ts +30 -0
- package/src/db/tables/authAccounts.ts +1 -0
- package/src/db/tables/earnVaults.test.ts +34 -0
- package/src/db/tables/earnVaults.ts +17 -2
- package/src/db/tables/organizations.test.ts +148 -84
- package/src/db/tables/organizations.ts +11 -43
- package/src/db/tables/requestUsage.ts +13 -2
- package/src/db/tables/rewardCampaigns.test.ts +163 -0
- package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
- package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
- package/src/db/tables/rewardRuns.ts +4 -0
- package/src/db/tables/rewardTransactionAttempts.ts +2 -0
- package/src/db/tables/routesDepositAddresses.test.ts +263 -0
- package/src/db/tables/routesDepositAddresses.ts +118 -34
- package/src/db/tables/routesDeposits.test.ts +133 -0
- package/src/db/tables/routesDeposits.ts +47 -26
- package/src/db/tables/routesIdempotency.test.ts +80 -0
- package/src/db/tables/routesIdempotency.ts +2 -0
- package/src/db/tables/routesPolicies.test.ts +143 -0
- package/src/db/tables/routesPolicies.ts +251 -0
- package/src/db/tables/routesTransferSubsidies.ts +64 -0
- package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
- package/src/db/tables/routesTransfers.test.ts +183 -2
- package/src/db/tables/routesTransfers.ts +65 -6
- package/src/db/tables/sponsoredTransactions.test.ts +351 -76
- package/src/db/tables/sponsoredTransactions.ts +182 -38
- package/src/db/tables/users.test.ts +51 -0
- package/src/db/tables/users.ts +12 -0
- package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
- package/src/db/tables/verifiedTokenRequests.ts +80 -44
- package/src/handlers/internal/multisig.store.test.ts +120 -0
- package/src/handlers/internal/multisig.test.ts +389 -0
- package/src/handlers/internal/multisig.ts +13 -10
- package/src/handlers/relay.test.ts +259 -83
- package/src/handlers/relay.ts +36 -17
- package/src/internal/Auth.test.ts +383 -8
- package/src/internal/Auth.ts +272 -99
- package/src/internal/BetterAuth.test.ts +58 -22
- package/src/internal/BetterAuth.ts +23 -17
- package/src/internal/Cache.ts +3 -1
- package/src/internal/CliAuth.test.ts +279 -0
- package/src/internal/CliAuth.ts +319 -0
- package/src/internal/EarnSharePrices.test.ts +25 -0
- package/src/internal/EarnSharePrices.ts +9 -2
- package/src/internal/EarnVaults.test.ts +67 -0
- package/src/internal/EarnVaults.ts +299 -4
- package/src/internal/EarnWithdrawals.test.ts +315 -0
- package/src/internal/EarnWithdrawals.ts +266 -0
- package/src/internal/ExecutionContext.ts +31 -0
- package/src/internal/Log.test.ts +210 -0
- package/src/internal/Log.ts +180 -142
- package/src/internal/MetricSink.test.ts +190 -15
- package/src/internal/MetricSink.ts +27 -1
- package/src/internal/RateLimit.test.ts +144 -8
- package/src/internal/RateLimit.ts +254 -26
- package/src/internal/Store.ts +4 -5
- package/src/internal/Timing.test.ts +32 -0
- package/src/internal/Timing.ts +20 -1
- package/src/internal/Tron.test-d.ts +22 -0
- package/src/internal/Tron.test.ts +94 -0
- package/src/internal/Tron.ts +289 -0
- package/src/internal/Viem.rpc.test.ts +76 -0
- package/src/internal/Viem.ts +29 -6
- package/src/internal/rewards/Read.test.ts +109 -0
- package/src/internal/rewards/Read.ts +13 -4
- package/src/internal/routes/Action.test.ts +70 -0
- package/src/internal/routes/Action.ts +76 -1
- package/src/internal/routes/Chain.test.ts +18 -0
- package/src/internal/routes/Chain.ts +5 -0
- package/src/internal/routes/DepositAddress.ts +5 -0
- package/src/internal/routes/Evidence.test.ts +64 -0
- package/src/internal/routes/Evidence.ts +11 -3
- package/src/internal/routes/EvmTransferSettlement.ts +213 -0
- package/src/internal/routes/Policy.test.ts +316 -0
- package/src/internal/routes/Policy.ts +399 -0
- package/src/internal/routes/Provider.test.ts +103 -2
- package/src/internal/routes/Provider.ts +149 -27
- package/src/internal/routes/Quota.test.ts +149 -0
- package/src/internal/routes/Quota.ts +226 -0
- package/src/internal/routes/Reconciliation.local.test.ts +285 -0
- package/src/internal/routes/Reconciliation.test.ts +371 -13
- package/src/internal/routes/Reconciliation.ts +193 -42
- package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
- package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
- package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
- package/src/internal/routes/SourceObservation.test.ts +221 -0
- package/src/internal/routes/Subsidy.local.test.ts +46 -0
- package/src/internal/routes/Subsidy.ts +4 -2
- package/src/internal/routes/Transfer.solana.test.ts +389 -0
- package/src/internal/routes/Transfer.test.ts +130 -1
- package/src/internal/routes/Transfer.tron.test.ts +172 -0
- package/src/internal/routes/Transfer.ts +866 -8
- package/src/internal/routes/TransferReconciliation.test.ts +26 -4
- package/src/internal/routes/TransferReconciliation.ts +91 -166
- package/src/internal/routes/TransferSettlement.ts +48 -0
- package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
- package/src/internal/routes/TransferSubsidy.test.ts +34 -4
- package/src/internal/routes/TransferSubsidy.ts +87 -12
- package/src/internal/routes/TronTransferSettlement.ts +212 -0
- package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
- package/src/internal/routes/TronTransferSubsidy.ts +619 -0
- package/src/internal/routes/index.test.ts +3 -0
- package/src/internal/routes/index.ts +3 -0
- package/src/internal/routes/providers/across.ts +13 -0
- package/src/internal/routes/providers/index.test.ts +141 -0
- package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
- package/src/internal/routes/providers/legacyMesh.ts +633 -0
- package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
- package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
- package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
- package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
- package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
- package/src/internal/routes/providers/propAmm.ts +640 -0
- package/src/internal/routes/providers/relay.test.ts +1299 -18
- package/src/internal/routes/providers/relay.ts +424 -39
- package/src/internal/routes/providers/rhino.ts +14 -1
- package/src/internal/routes/providers/squid.ts +21 -0
- package/src/internal/routes/providers/stargate.test.ts +105 -1
- package/src/internal/routes/providers/stargate.ts +22 -9
- package/src/internal/routes/providers/symbiosis.ts +13 -47
- package/src/providers/index.test.ts +2 -0
- package/src/providers/index.ts +18 -0
- package/dist/admin/Access.d.ts +0 -39
- package/dist/admin/Access.d.ts.map +0 -1
- package/dist/admin/Access.js +0 -73
- package/dist/admin/Access.js.map +0 -1
- package/src/admin/Access.test.ts +0 -130
- package/src/admin/Access.ts +0 -85
package/dist/internal/Auth.js
CHANGED
|
@@ -15,11 +15,11 @@ import { tempoMainnet } from 'viem/tempo/chains';
|
|
|
15
15
|
import * as z from 'zod/mini';
|
|
16
16
|
import * as ApiKey from '../ApiKey.js';
|
|
17
17
|
import * as ApiKeys from '../ApiKeys.js';
|
|
18
|
-
import * as ApiKeyAdmissions from '../db/tables/apiKeyAdmissions.js';
|
|
19
|
-
import * as ApiKeyOwnerTombstones from '../db/tables/apiKeyOwnerTombstones.js';
|
|
20
18
|
import * as AuthAccounts from '../db/tables/authAccounts.js';
|
|
21
19
|
import * as BetterAuth from './BetterAuth.js';
|
|
20
|
+
import * as CliAuth from './CliAuth.js';
|
|
22
21
|
import * as Db from '../db/Db.js';
|
|
22
|
+
import * as ExecutionContext from './ExecutionContext.js';
|
|
23
23
|
import * as Memberships from '../db/tables/memberships.js';
|
|
24
24
|
import * as IpAllowlist from './IpAllowlist.js';
|
|
25
25
|
import * as Metadata from '../apps/metadata.js';
|
|
@@ -35,11 +35,14 @@ import * as Timing from './Timing.js';
|
|
|
35
35
|
import * as Users from '../db/tables/users.js';
|
|
36
36
|
const policySymbol = Symbol('tempo-api.auth.policy');
|
|
37
37
|
const mppManagementSymbol = Symbol('tempo-api.auth.mpp-management');
|
|
38
|
+
const trustedClientIps = new WeakMap();
|
|
38
39
|
const defaultApiKeyRateLimit = { limit: 10_000, period: 'minute' };
|
|
39
40
|
const defaultIdentitySessionTtl = 24 * 60 * 60;
|
|
40
41
|
const defaultMppRateLimit = { limit: 100, period: 'minute' };
|
|
41
42
|
const defaultPublicRateLimit = { limit: 60, period: 'minute' };
|
|
42
43
|
const identityCookieName = 'tempo_identity';
|
|
44
|
+
const privacyUrl = 'https://tempo.xyz/privacy-policy/';
|
|
45
|
+
const termsUrl = 'https://console.tempo.xyz/legal/terms';
|
|
43
46
|
const walletIdentityIssuer = 'https://wallet.tempo.xyz/api/oidc';
|
|
44
47
|
function isIdentityTokenError(error) {
|
|
45
48
|
return (error instanceof jose.errors.JOSEAlgNotAllowed ||
|
|
@@ -56,6 +59,15 @@ function isIdentityTokenError(error) {
|
|
|
56
59
|
export function getPrincipal(c) {
|
|
57
60
|
return c.get('principal') ?? null;
|
|
58
61
|
}
|
|
62
|
+
/** Resolves the caller IP from configured trusted metadata. */
|
|
63
|
+
export function getTrustedClientIp(c) {
|
|
64
|
+
const auth = c.get('auth');
|
|
65
|
+
return auth ? trustedClientIp(c, auth) : resolveTrustedClientIp(c.req.raw, undefined);
|
|
66
|
+
}
|
|
67
|
+
/** Marks a synthesized in-process request with its trusted caller IP address. */
|
|
68
|
+
export function trustClientIp(request, address) {
|
|
69
|
+
trustedClientIps.set(request, address);
|
|
70
|
+
}
|
|
59
71
|
/**
|
|
60
72
|
* Guards `:orgId` routes and resolves the organization. Sessions require membership, API keys require ownership, and the super admin bypasses ownership.
|
|
61
73
|
*/
|
|
@@ -351,13 +363,15 @@ function createAuthMiddleware(options, resolve) {
|
|
|
351
363
|
...(sessionChainIds ? { sessionChainIds: new Set(sessionChainIds) } : {}),
|
|
352
364
|
},
|
|
353
365
|
}),
|
|
354
|
-
rateLimit:
|
|
366
|
+
rateLimit: rateLimitStore(options.rateLimit),
|
|
355
367
|
...(options.session ? { session: options.session } : {}),
|
|
356
368
|
...(options.superAdmin?.secret
|
|
357
369
|
? { superAdmin: { tokenHash: ApiKey.hash(options.superAdmin.secret) } }
|
|
358
370
|
: {}),
|
|
359
371
|
};
|
|
360
372
|
return createMiddleware((c, next) => {
|
|
373
|
+
// Every route records its credential, including unprotected and unmatched paths.
|
|
374
|
+
recordCredential(c, getApiKeyCredential(c));
|
|
361
375
|
const resolved = resolveRequestPolicy(c, { base, defaults, options });
|
|
362
376
|
if (!resolved)
|
|
363
377
|
return next();
|
|
@@ -386,7 +400,9 @@ function resolveRequestPolicy(c, options) {
|
|
|
386
400
|
const inheritedKey = `${inheritedMethod.toUpperCase()} ${key.slice(key.indexOf(' ') + 1)}`;
|
|
387
401
|
return overrides?.[inheritedKey];
|
|
388
402
|
})();
|
|
389
|
-
|
|
403
|
+
// Generated management routes already materialize the GET's MPP contract.
|
|
404
|
+
// Reapplying its override would also copy GET-only quota controls.
|
|
405
|
+
const routeOverride = management ? undefined : configuredOverride;
|
|
390
406
|
return {
|
|
391
407
|
management,
|
|
392
408
|
policy: bindMppScope(resolvePolicy(options.base, options.defaults, [...routePolicies, routeOverride], description), scope),
|
|
@@ -394,15 +410,28 @@ function resolveRequestPolicy(c, options) {
|
|
|
394
410
|
}
|
|
395
411
|
function createApiKeyResolver(options) {
|
|
396
412
|
const requests = new WeakMap();
|
|
397
|
-
|
|
413
|
+
// Requests whose key came from KV in this request: `ApiKeys.resolve` already
|
|
414
|
+
// read the fences, so reading them again adds a round trip and nothing else.
|
|
415
|
+
const fenced = new WeakMap();
|
|
416
|
+
const uncached = async (c, token) => {
|
|
398
417
|
const kv = contextKv(c);
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
418
|
+
if (!kv)
|
|
419
|
+
return null;
|
|
420
|
+
const apiKey = await ApiKeys.resolve(kv.store, token, { scopeCatalog: options.scopeCatalog });
|
|
421
|
+
fenced.set(c, ApiKey.hash(token));
|
|
422
|
+
return apiKey;
|
|
402
423
|
};
|
|
403
424
|
const cache = options.apiKey === false || options.apiKey?.cache === false
|
|
404
425
|
? { invalidate: () => { }, peek: () => undefined, resolve: uncached }
|
|
405
426
|
: cachedResolve(uncached, options.apiKey?.cache ?? {});
|
|
427
|
+
// A cached record still checks its fences every request, so revocation and
|
|
428
|
+
// owner deletion never wait for the isolate cache to expire.
|
|
429
|
+
const active = async (c, token, apiKey) => {
|
|
430
|
+
const kv = contextKv(c);
|
|
431
|
+
if (!apiKey || !kv || fenced.get(c) === ApiKey.hash(token))
|
|
432
|
+
return apiKey;
|
|
433
|
+
return (await ApiKeys.isFenced(kv.store, apiKey)) ? null : apiKey;
|
|
434
|
+
};
|
|
406
435
|
return {
|
|
407
436
|
peek: (c, token) => {
|
|
408
437
|
const tokenHash = ApiKey.hash(token);
|
|
@@ -411,18 +440,17 @@ function createApiKeyResolver(options) {
|
|
|
411
440
|
return existing.apiKey;
|
|
412
441
|
return cache.peek(token);
|
|
413
442
|
},
|
|
443
|
+
probe: async (c, token) => {
|
|
444
|
+
// Probes must not warm the resolution cache before rate-limit admission.
|
|
445
|
+
return active(c, token, await uncached(c, token));
|
|
446
|
+
},
|
|
414
447
|
resolve: async (c, token) => {
|
|
415
448
|
const tokenHash = ApiKey.hash(token);
|
|
416
449
|
const existing = requests.get(c);
|
|
417
450
|
if (existing?.tokenHash === tokenHash)
|
|
418
451
|
return existing.apiKey;
|
|
419
452
|
const cached = await cache.resolve(c, token);
|
|
420
|
-
const
|
|
421
|
-
const apiKey = cached &&
|
|
422
|
-
((kv && (await ApiKeys.isOwnerDeleted(kv.store, cached))) ||
|
|
423
|
-
!(await apiKeyOwnerExists(cached, options.db)))
|
|
424
|
-
? null
|
|
425
|
-
: cached;
|
|
453
|
+
const apiKey = await active(c, token, cached);
|
|
426
454
|
if (cached && !apiKey)
|
|
427
455
|
cache.invalidate(token);
|
|
428
456
|
requests.set(c, { apiKey, tokenHash });
|
|
@@ -430,17 +458,6 @@ function createApiKeyResolver(options) {
|
|
|
430
458
|
},
|
|
431
459
|
};
|
|
432
460
|
}
|
|
433
|
-
/** Rejects attributed keys fenced by a committed owner deletion. */
|
|
434
|
-
async function apiKeyOwnerExists(apiKey, source) {
|
|
435
|
-
if (!source)
|
|
436
|
-
return true;
|
|
437
|
-
const db = Db.get(source);
|
|
438
|
-
if (!(await ApiKeyAdmissions.matches(db, apiKey)))
|
|
439
|
-
return false;
|
|
440
|
-
if (await ApiKeyOwnerTombstones.isDeleted(db, apiKey))
|
|
441
|
-
return false;
|
|
442
|
-
return true;
|
|
443
|
-
}
|
|
444
461
|
/** Zod schemas documenting the session sign-in surface. */
|
|
445
462
|
var schema;
|
|
446
463
|
(function (schema) {
|
|
@@ -534,7 +551,7 @@ export function install(options) {
|
|
|
534
551
|
get email() {
|
|
535
552
|
return options.email();
|
|
536
553
|
},
|
|
537
|
-
rateLimit:
|
|
554
|
+
rateLimit: rateLimitStore(options_middleware.rateLimit),
|
|
538
555
|
secret: options_session.secret,
|
|
539
556
|
...(options_session.google ? { google: options_session.google } : {}),
|
|
540
557
|
...(options_session.trustedOrigins
|
|
@@ -579,7 +596,10 @@ export function install(options) {
|
|
|
579
596
|
return value === null ? undefined : JSON.parse(value);
|
|
580
597
|
},
|
|
581
598
|
async set(key, value, options) {
|
|
582
|
-
|
|
599
|
+
const payload = key.startsWith('session:')
|
|
600
|
+
? { ...value, ...(await bindWalletSession(value)) }
|
|
601
|
+
: value;
|
|
602
|
+
await kv.store.put(`auth:${key}`, JSON.stringify(payload), options?.ttl ? { ttl: options.ttl * 1_000 } : {});
|
|
583
603
|
},
|
|
584
604
|
},
|
|
585
605
|
...(ttl ? { ttl } : {}),
|
|
@@ -616,8 +636,51 @@ export function install(options) {
|
|
|
616
636
|
return { email: verifiedEmail ?? user.email ?? undefined, user };
|
|
617
637
|
});
|
|
618
638
|
}
|
|
639
|
+
async function bindWalletSession(payload) {
|
|
640
|
+
const user = await resolveWallet(payload);
|
|
641
|
+
if (!user)
|
|
642
|
+
throw new Error('Authenticated wallet user was not found');
|
|
643
|
+
if (!user.user.termsSharedAt)
|
|
644
|
+
await Users.recordTermsShared(Db.get(db), user.user.id);
|
|
645
|
+
return { email: user.email, userId: user.user.id };
|
|
646
|
+
}
|
|
647
|
+
async function resolveWalletSession(payload) {
|
|
648
|
+
// Legacy sessions cannot be safely rebound after an email or wallet reassignment.
|
|
649
|
+
if (!payload.userId)
|
|
650
|
+
return null;
|
|
651
|
+
const database = Db.get(db);
|
|
652
|
+
const [user, linkedUserId] = await Promise.all([
|
|
653
|
+
Users.get(database, payload.userId),
|
|
654
|
+
AuthAccounts.getWalletUserId(database, payload.address),
|
|
655
|
+
]);
|
|
656
|
+
if (!user || linkedUserId !== payload.userId)
|
|
657
|
+
return null;
|
|
658
|
+
if (payload.email && (user.email !== payload.email || !user.emailVerified))
|
|
659
|
+
return null;
|
|
660
|
+
return { email: user.emailVerified ? user.email : undefined, user };
|
|
661
|
+
}
|
|
662
|
+
// CLI sessions act as the approving user; the principal's identity names the
|
|
663
|
+
// CLI session so handlers never mistake it for a wallet sign-in.
|
|
664
|
+
const resolveCli = async (token) => {
|
|
665
|
+
const record = await CliAuth.resolve(kv.store, token);
|
|
666
|
+
if (!record)
|
|
667
|
+
return null;
|
|
668
|
+
const user = await Users.get(Db.get(db), record.userId);
|
|
669
|
+
if (!user)
|
|
670
|
+
return null;
|
|
671
|
+
return {
|
|
672
|
+
cli: { expiresAt: record.expiresAt, scopes: record.scopes ?? [] },
|
|
673
|
+
...(user.emailVerified && user.email ? { email: user.email } : {}),
|
|
674
|
+
id: user.id,
|
|
675
|
+
identity: { provider: 'cli', subject: record.id },
|
|
676
|
+
type: 'session',
|
|
677
|
+
};
|
|
678
|
+
};
|
|
619
679
|
const session = {
|
|
620
680
|
resolve: async (c) => {
|
|
681
|
+
const bearer = /^Bearer\s+(.+)$/i.exec(c.req.header('authorization') ?? '')?.[1];
|
|
682
|
+
if (bearer && CliAuth.isToken(bearer))
|
|
683
|
+
return resolveCli(bearer);
|
|
621
684
|
const [betterAuth, identitySession, wallet] = await Promise.all([
|
|
622
685
|
(async () => {
|
|
623
686
|
const auth = BetterAuth.fromContext(c, options_betterAuth);
|
|
@@ -651,7 +714,7 @@ export function install(options) {
|
|
|
651
714
|
const payload = JSON.parse(value);
|
|
652
715
|
if (payload.expiresAt <= Math.floor(Date.now() / 1_000))
|
|
653
716
|
return null;
|
|
654
|
-
const user = await
|
|
717
|
+
const user = await resolveWalletSession(payload);
|
|
655
718
|
if (!user)
|
|
656
719
|
return null;
|
|
657
720
|
return {
|
|
@@ -665,7 +728,7 @@ export function install(options) {
|
|
|
665
728
|
const payload = await handler.getSession(c.req.raw);
|
|
666
729
|
if (!payload)
|
|
667
730
|
return null;
|
|
668
|
-
const user = await
|
|
731
|
+
const user = await resolveWalletSession(payload);
|
|
669
732
|
if (!user)
|
|
670
733
|
return null;
|
|
671
734
|
return {
|
|
@@ -688,6 +751,11 @@ export function install(options) {
|
|
|
688
751
|
const policy_public = policy({ public: true });
|
|
689
752
|
const describe = OpenApi.describeRoute({ hide: true });
|
|
690
753
|
const app = new Hono()
|
|
754
|
+
.use('*', async (c, next) => {
|
|
755
|
+
await next();
|
|
756
|
+
c.header('Tempo-Terms-URL', termsUrl);
|
|
757
|
+
c.header('Tempo-Privacy-URL', privacyUrl);
|
|
758
|
+
})
|
|
691
759
|
.use('/v1/auth/siwe', policy_public, describe)
|
|
692
760
|
.use('/v1/auth/siwe/*', policy_public, describe);
|
|
693
761
|
// Documented operations: pre-routes carrying the OpenAPI metadata and the
|
|
@@ -782,11 +850,12 @@ export function install(options) {
|
|
|
782
850
|
});
|
|
783
851
|
const address = Address.checksum(claims.subject);
|
|
784
852
|
await Users.upsertByAddress(Db.get(db), { address });
|
|
853
|
+
const binding = await bindWalletSession({ address, email: claims.email });
|
|
785
854
|
const issuedAt = Math.floor(Date.now() / 1_000);
|
|
786
855
|
const token = Hex.fromBytes(crypto.getRandomValues(new Uint8Array(32))).slice(2);
|
|
787
856
|
await kv.store.put(identitySessionKey(token), JSON.stringify({
|
|
788
857
|
address,
|
|
789
|
-
...
|
|
858
|
+
...binding,
|
|
790
859
|
expiresAt: issuedAt + identitySessionTtl,
|
|
791
860
|
issuedAt,
|
|
792
861
|
}), { ttl: identitySessionTtl * 1_000 });
|
|
@@ -802,10 +871,12 @@ export function install(options) {
|
|
|
802
871
|
app.post('/v1/auth/logout', policy(false), createMiddleware(async (c, next) => {
|
|
803
872
|
const auth = c.get('auth');
|
|
804
873
|
const principal = principalFromPublic(c, auth);
|
|
805
|
-
const result = await consumeRateLimit(auth, {
|
|
874
|
+
const result = await Timing.time(c, 'rate_limit', () => consumeRateLimit(auth, {
|
|
806
875
|
key: `public:${principal.id}`,
|
|
807
876
|
limit: auth.publicRateLimit ?? defaultPublicRateLimit,
|
|
808
|
-
|
|
877
|
+
principal: `public:${principal.id}`,
|
|
878
|
+
waitUntil: ExecutionContext.waitUntil(c),
|
|
879
|
+
}));
|
|
809
880
|
if (result) {
|
|
810
881
|
setRateLimitHeaders(c, result);
|
|
811
882
|
if (!result.allowed)
|
|
@@ -815,7 +886,7 @@ export function install(options) {
|
|
|
815
886
|
await next();
|
|
816
887
|
return undefined;
|
|
817
888
|
}), OpenApi.describeRoute({
|
|
818
|
-
description: 'Revokes auth sessions and clears their cookies.',
|
|
889
|
+
description: 'Revokes auth sessions and clears their cookies. A CLI session sent as `Authorization: Bearer` is revoked on its own.',
|
|
819
890
|
hide: false,
|
|
820
891
|
operationId: 'logout',
|
|
821
892
|
responses: {
|
|
@@ -826,6 +897,22 @@ export function install(options) {
|
|
|
826
897
|
summary: 'Sign out',
|
|
827
898
|
tags: ['Authentication'],
|
|
828
899
|
}), async (c) => {
|
|
900
|
+
// A CLI session carries only its bearer token; revoke it and leave browser sessions alone.
|
|
901
|
+
const bearer = /^Bearer\s+(.+)$/i.exec(c.req.header('authorization') ?? '')?.[1];
|
|
902
|
+
if (bearer && CliAuth.isToken(bearer)) {
|
|
903
|
+
try {
|
|
904
|
+
await CliAuth.revoke(kv.store, bearer);
|
|
905
|
+
}
|
|
906
|
+
catch (cause) {
|
|
907
|
+
c.error = cause instanceof Error ? cause : new Error('CLI logout failed', { cause });
|
|
908
|
+
return Response.error(c, {
|
|
909
|
+
code: 'session_logout_failed',
|
|
910
|
+
message: 'Session logout failed',
|
|
911
|
+
status: 500,
|
|
912
|
+
});
|
|
913
|
+
}
|
|
914
|
+
return c.body(null, 204);
|
|
915
|
+
}
|
|
829
916
|
const walletHeaders = (() => {
|
|
830
917
|
const authorization = c.req.header('authorization');
|
|
831
918
|
const cookie = c.req.header('cookie');
|
|
@@ -906,7 +993,7 @@ export function install(options) {
|
|
|
906
993
|
Metadata.attach(app, {
|
|
907
994
|
securitySchemes: {
|
|
908
995
|
session: {
|
|
909
|
-
description: 'Session cookie established by email OTP, Wallet identity, or SIWE sign-in. Browsers send `tempo_auth.session_token`, `tempo_identity`, or `accounts_auth`; Accounts sessions may also use `Authorization: Bearer <token
|
|
996
|
+
description: 'Session cookie established by email OTP, Wallet identity, or SIWE sign-in. Browsers send `tempo_auth.session_token`, `tempo_identity`, or `accounts_auth`; Accounts sessions may also use `Authorization: Bearer <token>`, and CLI sessions always use `Authorization: Bearer tempo:cli:…`.', // prettier-ignore
|
|
910
997
|
in: 'header',
|
|
911
998
|
name: 'Cookie',
|
|
912
999
|
type: 'apiKey',
|
|
@@ -917,7 +1004,6 @@ export function install(options) {
|
|
|
917
1004
|
})();
|
|
918
1005
|
const resolve = createApiKeyResolver({
|
|
919
1006
|
apiKey: options_middleware.apiKey,
|
|
920
|
-
db: options.db,
|
|
921
1007
|
scopeCatalog,
|
|
922
1008
|
});
|
|
923
1009
|
const defaults = laneDefaults(options_middleware);
|
|
@@ -930,12 +1016,15 @@ export function install(options) {
|
|
|
930
1016
|
: undefined;
|
|
931
1017
|
return createMiddleware(async (c, next) => {
|
|
932
1018
|
const credential = getApiKeyCredential(c);
|
|
1019
|
+
recordCredential(c, credential);
|
|
933
1020
|
const resolved = resolveRequestPolicy(c, { base, defaults, options: options_middleware });
|
|
934
1021
|
const isSuperAdmin = credential &&
|
|
935
1022
|
superAdminTokenHash !== undefined &&
|
|
936
1023
|
ApiKey.hash(credential.token) === superAdminTokenHash;
|
|
1024
|
+
// CLI session tokens are never API keys, so they skip key resolution here too.
|
|
937
1025
|
const canUseApiKeyQuota = credential &&
|
|
938
1026
|
!isSuperAdmin &&
|
|
1027
|
+
!CliAuth.isToken(credential.token) &&
|
|
939
1028
|
!hasPaymentCredential(c) &&
|
|
940
1029
|
options_middleware.apiKey !== false &&
|
|
941
1030
|
resolved?.policy?.apiKey &&
|
|
@@ -943,11 +1032,20 @@ export function install(options) {
|
|
|
943
1032
|
const cached = canUseApiKeyQuota ? resolve.peek(c, credential.token) : undefined;
|
|
944
1033
|
if (cached)
|
|
945
1034
|
return next();
|
|
946
|
-
const response = await Timing.time(c, 'edge_rate_limit', () => options_edgeRateLimit(c.req.raw
|
|
1035
|
+
const response = await Timing.time(c, 'edge_rate_limit', () => options_edgeRateLimit(c.req.raw, canUseApiKeyQuota
|
|
1036
|
+
? {
|
|
1037
|
+
resolvePartition: async () => {
|
|
1038
|
+
const apiKey = cached === undefined ? await resolve.probe(c, credential.token) : cached;
|
|
1039
|
+
// Rotating invalid credentials stays in the anonymous transport bucket.
|
|
1040
|
+
return apiKey ? `api-key:${ApiKey.hash(credential.token)}` : undefined;
|
|
1041
|
+
},
|
|
1042
|
+
}
|
|
1043
|
+
: {}));
|
|
947
1044
|
if (response)
|
|
948
1045
|
return response;
|
|
1046
|
+
// Cold keys resolve here, ahead of the auth lane, so time both under one name.
|
|
949
1047
|
if (canUseApiKeyQuota && cached === undefined)
|
|
950
|
-
await resolve.resolve(c, credential.token);
|
|
1048
|
+
await Timing.sum(c, 'auth_key', () => resolve.resolve(c, credential.token));
|
|
951
1049
|
return next();
|
|
952
1050
|
});
|
|
953
1051
|
})();
|
|
@@ -1026,7 +1124,9 @@ export function installMppManagementRoutes(app, options = {}) {
|
|
|
1026
1124
|
continue;
|
|
1027
1125
|
if (postPaths.has(target.path))
|
|
1028
1126
|
throw new Error(`MPP management POST conflicts with an existing route: ${target.path}`);
|
|
1029
|
-
const management = policy({
|
|
1127
|
+
const management = policy({
|
|
1128
|
+
mpp: { session: mpp.session },
|
|
1129
|
+
});
|
|
1030
1130
|
management[mppManagementSymbol] = { description: target.description };
|
|
1031
1131
|
app.post(stripBasePath(target.path, options.basePath), management, OpenApi.describeRoute({ hide: true }));
|
|
1032
1132
|
}
|
|
@@ -1101,6 +1201,7 @@ function resolveApiKeyLane(current, override, default_) {
|
|
|
1101
1201
|
return current ?? default_;
|
|
1102
1202
|
const base = current ?? default_;
|
|
1103
1203
|
return {
|
|
1204
|
+
bucket: override.bucket ?? base.bucket,
|
|
1104
1205
|
rateLimit: override.rateLimit ?? base.rateLimit,
|
|
1105
1206
|
scopes: override.scopes ?? base.scopes,
|
|
1106
1207
|
};
|
|
@@ -1114,6 +1215,7 @@ function resolveMppLane(current, override, default_) {
|
|
|
1114
1215
|
return current ?? default_;
|
|
1115
1216
|
const base = current ?? default_;
|
|
1116
1217
|
return {
|
|
1218
|
+
bucket: override.bucket ?? base.bucket,
|
|
1117
1219
|
rateLimit: override.rateLimit ?? base.rateLimit,
|
|
1118
1220
|
session: { ...base.session, ...override.session },
|
|
1119
1221
|
};
|
|
@@ -1126,7 +1228,10 @@ function resolvePublicLane(current, override, default_) {
|
|
|
1126
1228
|
if (override === true)
|
|
1127
1229
|
return current ?? default_;
|
|
1128
1230
|
const base = current ?? default_;
|
|
1129
|
-
return {
|
|
1231
|
+
return {
|
|
1232
|
+
bucket: override.bucket ?? base.bucket,
|
|
1233
|
+
rateLimit: override.rateLimit ?? base.rateLimit,
|
|
1234
|
+
};
|
|
1130
1235
|
}
|
|
1131
1236
|
function resolveSessionLane(current, override, default_) {
|
|
1132
1237
|
if (override === undefined)
|
|
@@ -1273,6 +1378,7 @@ export function require(policy) {
|
|
|
1273
1378
|
return createMiddleware(async (c, next) => {
|
|
1274
1379
|
const auth = c.get('auth');
|
|
1275
1380
|
const credential = getApiKeyCredential(c);
|
|
1381
|
+
recordCredential(c, credential);
|
|
1276
1382
|
const hasQueryApiKey = new URL(c.req.url).searchParams.has('key');
|
|
1277
1383
|
// Auth owns `key`; strict route schemas must not validate it.
|
|
1278
1384
|
stripApiKeyQuery(c);
|
|
@@ -1312,7 +1418,11 @@ export function require(policy) {
|
|
|
1312
1418
|
c.set('principal', { actor: 'super_admin', id: 'super_admin', type: 'super_admin' });
|
|
1313
1419
|
return proceed();
|
|
1314
1420
|
}
|
|
1315
|
-
|
|
1421
|
+
// CLI session tokens are prefixed, so they skip the API-key lookup.
|
|
1422
|
+
const cliToken = CliAuth.isToken(credential.token);
|
|
1423
|
+
const apiKey_resolved = cliToken
|
|
1424
|
+
? null
|
|
1425
|
+
: await Timing.sum(c, 'auth_key', () => auth.apiKey?.resolve(c, credential.token));
|
|
1316
1426
|
if (!apiKey_resolved) {
|
|
1317
1427
|
if (unsupportedChain)
|
|
1318
1428
|
return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
|
|
@@ -1326,6 +1436,18 @@ export function require(policy) {
|
|
|
1326
1436
|
return proceed();
|
|
1327
1437
|
}
|
|
1328
1438
|
}
|
|
1439
|
+
if (cliToken)
|
|
1440
|
+
return jsonError(c, policy.session
|
|
1441
|
+
? {
|
|
1442
|
+
code: 'session_invalid',
|
|
1443
|
+
message: 'CLI session is invalid or expired. Sign in again.',
|
|
1444
|
+
status: 401,
|
|
1445
|
+
}
|
|
1446
|
+
: {
|
|
1447
|
+
code: 'forbidden',
|
|
1448
|
+
message: 'CLI sessions cannot call this route. Use an API key.',
|
|
1449
|
+
status: 403,
|
|
1450
|
+
});
|
|
1329
1451
|
return jsonError(c, {
|
|
1330
1452
|
code: 'api_key_invalid',
|
|
1331
1453
|
message: 'Invalid API key',
|
|
@@ -1360,12 +1482,15 @@ export function require(policy) {
|
|
|
1360
1482
|
? (policy.public?.rateLimit ?? auth.publicRateLimit ?? { limit: 60, period: 'minute' })
|
|
1361
1483
|
: resolveApiKeyLimit({ apiKey, auth, policy: policy.apiKey, scope });
|
|
1362
1484
|
const paid = hasPayment && !throttled;
|
|
1485
|
+
const bucket = policy.apiKey.bucket;
|
|
1363
1486
|
const result = paid
|
|
1364
1487
|
? null
|
|
1365
|
-
: await consumeRateLimit(auth, {
|
|
1366
|
-
key: `api_key:${apiKey.id}:scope:${scope}`,
|
|
1488
|
+
: await Timing.time(c, 'rate_limit', () => consumeRateLimit(auth, {
|
|
1489
|
+
key: rateLimitKey(`api_key:${apiKey.id}:scope:${scope}`, bucket),
|
|
1367
1490
|
limit,
|
|
1368
|
-
|
|
1491
|
+
principal: `api_key:${apiKey.id}`,
|
|
1492
|
+
waitUntil: ExecutionContext.waitUntil(c),
|
|
1493
|
+
}));
|
|
1369
1494
|
if (result) {
|
|
1370
1495
|
setRateLimitHeaders(c, result);
|
|
1371
1496
|
// Surface the bucket so callers can correlate a 429 with the exhausted
|
|
@@ -1398,7 +1523,7 @@ export function require(policy) {
|
|
|
1398
1523
|
if (missing.length > 0)
|
|
1399
1524
|
return jsonError(c, {
|
|
1400
1525
|
code: 'api_key_forbidden',
|
|
1401
|
-
message:
|
|
1526
|
+
message: `API key is missing required permissions: ${missing.join(', ')}. Use an API key with these scopes.`,
|
|
1402
1527
|
status: 403,
|
|
1403
1528
|
});
|
|
1404
1529
|
if (paid)
|
|
@@ -1445,10 +1570,12 @@ export function require(policy) {
|
|
|
1445
1570
|
}
|
|
1446
1571
|
const limit = policy.public?.rateLimit;
|
|
1447
1572
|
if (limit) {
|
|
1448
|
-
const result = await consumeRateLimit(auth, {
|
|
1449
|
-
key: `public:${publicPrincipal.id}`,
|
|
1573
|
+
const result = await Timing.time(c, 'rate_limit', () => consumeRateLimit(auth, {
|
|
1574
|
+
key: rateLimitKey(`public:${publicPrincipal.id}`, policy.public?.bucket),
|
|
1450
1575
|
limit,
|
|
1451
|
-
|
|
1576
|
+
principal: `public:${publicPrincipal.id}`,
|
|
1577
|
+
waitUntil: ExecutionContext.waitUntil(c),
|
|
1578
|
+
}));
|
|
1452
1579
|
if (result)
|
|
1453
1580
|
setRateLimitHeaders(c, result);
|
|
1454
1581
|
if (!result || result.allowed) {
|
|
@@ -1489,6 +1616,10 @@ export function require(policy) {
|
|
|
1489
1616
|
* server-side — we just stop waiting for it.
|
|
1490
1617
|
*/
|
|
1491
1618
|
const rateLimitConsumeTimeout = 300;
|
|
1619
|
+
/** Accepts a ready store or builds the counter-backed default from its options. */
|
|
1620
|
+
function rateLimitStore(options) {
|
|
1621
|
+
return options && 'consume' in options ? options : RateLimit.memory(options);
|
|
1622
|
+
}
|
|
1492
1623
|
/** Consumes one quota and returns null when its counter is unavailable, allowing callers to fail open. */
|
|
1493
1624
|
export function consumeRateLimit(auth, options) {
|
|
1494
1625
|
if (!auth.rateLimit)
|
|
@@ -1572,11 +1703,20 @@ function getApiKeyCredential(c) {
|
|
|
1572
1703
|
return { token: apiKey };
|
|
1573
1704
|
return null;
|
|
1574
1705
|
}
|
|
1706
|
+
// Recorded before any lookup: requests that stall or are canceled during
|
|
1707
|
+
// resolution never receive a principal, but still need caller attribution.
|
|
1708
|
+
function recordCredential(c, credential) {
|
|
1709
|
+
if (credential)
|
|
1710
|
+
c.set('credential', 'api_key');
|
|
1711
|
+
else if (hasPaymentCredential(c))
|
|
1712
|
+
c.set('credential', 'payment');
|
|
1713
|
+
}
|
|
1575
1714
|
function clientIp(c, auth) {
|
|
1576
|
-
return
|
|
1715
|
+
return (trustedClientIps.get(c.req.raw) ??
|
|
1716
|
+
(auth.publicClientIp ? auth.publicClientIp(c.req.raw) : c.req.header('cf-connecting-ip')));
|
|
1577
1717
|
}
|
|
1578
1718
|
function trustedClientIp(c, auth) {
|
|
1579
|
-
return resolveTrustedClientIp(c.req.raw, auth.publicClientIp);
|
|
1719
|
+
return trustedClientIps.get(c.req.raw) ?? resolveTrustedClientIp(c.req.raw, auth.publicClientIp);
|
|
1580
1720
|
}
|
|
1581
1721
|
function resolveTrustedClientIp(request, resolve) {
|
|
1582
1722
|
if (resolve)
|
|
@@ -1697,10 +1837,12 @@ function principalFromPublic(c, auth) {
|
|
|
1697
1837
|
}
|
|
1698
1838
|
async function requirePayment(c, next, options) {
|
|
1699
1839
|
if (hasPaymentCredential(c)) {
|
|
1700
|
-
const result = await consumeRateLimit(options.auth, {
|
|
1701
|
-
key: `mpp:${options.principal.type}:${options.principal.id}`,
|
|
1840
|
+
const result = await Timing.time(c, 'rate_limit', () => consumeRateLimit(options.auth, {
|
|
1841
|
+
key: rateLimitKey(`mpp:${options.principal.type}:${options.principal.id}`, options.policy.mpp?.bucket),
|
|
1702
1842
|
limit: options.policy.mpp?.rateLimit ?? options.auth.mpp?.rateLimit ?? defaultMppRateLimit,
|
|
1703
|
-
|
|
1843
|
+
principal: `mpp:${options.principal.type}:${options.principal.id}`,
|
|
1844
|
+
waitUntil: ExecutionContext.waitUntil(c),
|
|
1845
|
+
}));
|
|
1704
1846
|
if (result) {
|
|
1705
1847
|
setRateLimitHeaders(c, result);
|
|
1706
1848
|
c.header('RateLimit-Scope', 'mpp');
|
|
@@ -1748,6 +1890,9 @@ function requirePaymentOrRateLimit(c, next, options) {
|
|
|
1748
1890
|
return requirePayment(c, next, options);
|
|
1749
1891
|
return rateLimitExceeded(c, options.rateLimit);
|
|
1750
1892
|
}
|
|
1893
|
+
function rateLimitKey(key, bucket) {
|
|
1894
|
+
return bucket === undefined ? key : `${key}:bucket:${bucket}`;
|
|
1895
|
+
}
|
|
1751
1896
|
/** Emits a `429` with a `Retry-After` derived from the window reset. */
|
|
1752
1897
|
function rateLimitExceeded(c, result) {
|
|
1753
1898
|
c.header('Retry-After', String(Math.max(result.reset - Math.ceil(Date.now() / 1_000), 1)));
|
|
@@ -1778,18 +1923,12 @@ async function resolveSession(c, auth) {
|
|
|
1778
1923
|
/** Maximum resolve-cache entries held per isolate before eviction. */
|
|
1779
1924
|
const cachedMaxEntries = 10_000;
|
|
1780
1925
|
/**
|
|
1781
|
-
*
|
|
1782
|
-
*
|
|
1783
|
-
* (default 60s), negative for `negativeTtl` (default 10s) so a freshly minted
|
|
1784
|
-
* key is usable quickly; concurrent misses for one token are single-flighted.
|
|
1785
|
-
* Entries are keyed by the token's sha256 (`ApiKey.hash`) — never the
|
|
1786
|
-
* plaintext. Key updates may remain stale for up to `ttl`, the accepted
|
|
1787
|
-
* trade-off for removing a backend read from the auth path.
|
|
1926
|
+
* Caches completed resolutions per isolate by token hash, with positive and negative TTLs.
|
|
1927
|
+
* Each miss resolves independently so callers never await another request's pending I/O.
|
|
1788
1928
|
*/
|
|
1789
|
-
function cachedResolve(resolve, options) {
|
|
1929
|
+
export function cachedResolve(resolve, options) {
|
|
1790
1930
|
const { negativeTtl = 10_000, now = Date.now, ttl = 60_000 } = options;
|
|
1791
1931
|
const cells = new Map();
|
|
1792
|
-
const flights = new Map();
|
|
1793
1932
|
return {
|
|
1794
1933
|
invalidate(token) {
|
|
1795
1934
|
cells.delete(`v1:${ApiKey.hash(token)}`);
|
|
@@ -1812,31 +1951,19 @@ function cachedResolve(resolve, options) {
|
|
|
1812
1951
|
return cell.value;
|
|
1813
1952
|
if (cell)
|
|
1814
1953
|
cells.delete(key);
|
|
1815
|
-
const
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
const
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
if (entry.expiresAt <= time)
|
|
1826
|
-
cells.delete(name);
|
|
1827
|
-
while (cells.size >= cachedMaxEntries)
|
|
1828
|
-
cells.delete(cells.keys().next().value);
|
|
1829
|
-
}
|
|
1830
|
-
cells.set(key, { expiresAt: now() + (value ? ttl : negativeTtl), value });
|
|
1831
|
-
return value;
|
|
1832
|
-
})();
|
|
1833
|
-
flights.set(key, flight);
|
|
1834
|
-
try {
|
|
1835
|
-
return await flight;
|
|
1836
|
-
}
|
|
1837
|
-
finally {
|
|
1838
|
-
flights.delete(key);
|
|
1954
|
+
const value = await resolve(c, token);
|
|
1955
|
+
// Bound the cache: random invalid tokens each add a (negative) entry,
|
|
1956
|
+
// so sweep expired cells at the cap and then drop the oldest.
|
|
1957
|
+
if (cells.size >= cachedMaxEntries) {
|
|
1958
|
+
const time = now();
|
|
1959
|
+
for (const [name, entry] of cells)
|
|
1960
|
+
if (entry.expiresAt <= time)
|
|
1961
|
+
cells.delete(name);
|
|
1962
|
+
while (cells.size >= cachedMaxEntries)
|
|
1963
|
+
cells.delete(cells.keys().next().value);
|
|
1839
1964
|
}
|
|
1965
|
+
cells.set(key, { expiresAt: now() + (value ? ttl : negativeTtl), value });
|
|
1966
|
+
return value;
|
|
1840
1967
|
},
|
|
1841
1968
|
};
|
|
1842
1969
|
}
|