tapimo 0.15.1 → 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 +893 -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 +70 -70
- 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 +529 -76
- 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 +157 -157
- 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 +205 -201
- 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 +357 -357
- 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/blocks.d.ts +125 -125
- 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 +109 -127
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +83 -54
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +43 -43
- package/dist/apps/data/routes/receipts.d.ts +235 -235
- package/dist/apps/data/routes/rpc.d.ts +30 -30
- 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 +77 -77
- package/dist/apps/data/routes/valuation.d.ts +32 -32
- package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +1 -1
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +31 -31
- package/dist/apps/management/App.d.ts +2909 -2064
- 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 +257 -245
- 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 +138 -138
- package/dist/apps/management/routes/invite-links.d.ts +172 -172
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +104 -104
- 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 +125 -125
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
- package/dist/apps/management/routes/webhooks.d.ts +485 -485
- package/dist/apps/mpp/App.d.ts +44 -44
- 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/chains.d.ts +25 -25
- 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 +171 -81
- 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 +532 -480
- 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 +413 -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/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 +57 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +182 -78
- 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 +3 -0
- package/dist/internal/routes/providers/relay.d.ts.map +1 -1
- package/dist/internal/routes/providers/relay.js +352 -41
- 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/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/routeTree.gen.ts +21 -0
- 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 +1 -0
- 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 +1 -0
- package/src/admin/ui.generated.ts +258 -202
- 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/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 +134 -2
- package/src/apps/data/routes/fee-amm.ts +122 -60
- package/src/apps/data/routes/receipts.test.ts +21 -18
- package/src/apps/data/routes/rpc.test.ts +2 -2
- 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.test.ts +12 -3
- package/src/apps/data/routes/webhooks.ts +2 -1
- 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/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 +498 -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 +66 -5
- 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/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 +291 -8
- package/src/internal/Auth.ts +227 -96
- 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 +1263 -41
- package/src/internal/routes/providers/relay.ts +423 -38
- 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';
|
|
@@ -41,6 +41,8 @@ const defaultIdentitySessionTtl = 24 * 60 * 60;
|
|
|
41
41
|
const defaultMppRateLimit = { limit: 100, period: 'minute' };
|
|
42
42
|
const defaultPublicRateLimit = { limit: 60, period: 'minute' };
|
|
43
43
|
const identityCookieName = 'tempo_identity';
|
|
44
|
+
const privacyUrl = 'https://tempo.xyz/privacy-policy/';
|
|
45
|
+
const termsUrl = 'https://console.tempo.xyz/legal/terms';
|
|
44
46
|
const walletIdentityIssuer = 'https://wallet.tempo.xyz/api/oidc';
|
|
45
47
|
function isIdentityTokenError(error) {
|
|
46
48
|
return (error instanceof jose.errors.JOSEAlgNotAllowed ||
|
|
@@ -361,13 +363,15 @@ function createAuthMiddleware(options, resolve) {
|
|
|
361
363
|
...(sessionChainIds ? { sessionChainIds: new Set(sessionChainIds) } : {}),
|
|
362
364
|
},
|
|
363
365
|
}),
|
|
364
|
-
rateLimit:
|
|
366
|
+
rateLimit: rateLimitStore(options.rateLimit),
|
|
365
367
|
...(options.session ? { session: options.session } : {}),
|
|
366
368
|
...(options.superAdmin?.secret
|
|
367
369
|
? { superAdmin: { tokenHash: ApiKey.hash(options.superAdmin.secret) } }
|
|
368
370
|
: {}),
|
|
369
371
|
};
|
|
370
372
|
return createMiddleware((c, next) => {
|
|
373
|
+
// Every route records its credential, including unprotected and unmatched paths.
|
|
374
|
+
recordCredential(c, getApiKeyCredential(c));
|
|
371
375
|
const resolved = resolveRequestPolicy(c, { base, defaults, options });
|
|
372
376
|
if (!resolved)
|
|
373
377
|
return next();
|
|
@@ -406,15 +410,28 @@ function resolveRequestPolicy(c, options) {
|
|
|
406
410
|
}
|
|
407
411
|
function createApiKeyResolver(options) {
|
|
408
412
|
const requests = new WeakMap();
|
|
409
|
-
|
|
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) => {
|
|
410
417
|
const kv = contextKv(c);
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
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;
|
|
414
423
|
};
|
|
415
424
|
const cache = options.apiKey === false || options.apiKey?.cache === false
|
|
416
425
|
? { invalidate: () => { }, peek: () => undefined, resolve: uncached }
|
|
417
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
|
+
};
|
|
418
435
|
return {
|
|
419
436
|
peek: (c, token) => {
|
|
420
437
|
const tokenHash = ApiKey.hash(token);
|
|
@@ -423,18 +440,17 @@ function createApiKeyResolver(options) {
|
|
|
423
440
|
return existing.apiKey;
|
|
424
441
|
return cache.peek(token);
|
|
425
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
|
+
},
|
|
426
447
|
resolve: async (c, token) => {
|
|
427
448
|
const tokenHash = ApiKey.hash(token);
|
|
428
449
|
const existing = requests.get(c);
|
|
429
450
|
if (existing?.tokenHash === tokenHash)
|
|
430
451
|
return existing.apiKey;
|
|
431
452
|
const cached = await cache.resolve(c, token);
|
|
432
|
-
const
|
|
433
|
-
const apiKey = cached &&
|
|
434
|
-
((kv && (await ApiKeys.isOwnerDeleted(kv.store, cached))) ||
|
|
435
|
-
!(await apiKeyOwnerExists(cached, options.db)))
|
|
436
|
-
? null
|
|
437
|
-
: cached;
|
|
453
|
+
const apiKey = await active(c, token, cached);
|
|
438
454
|
if (cached && !apiKey)
|
|
439
455
|
cache.invalidate(token);
|
|
440
456
|
requests.set(c, { apiKey, tokenHash });
|
|
@@ -442,17 +458,6 @@ function createApiKeyResolver(options) {
|
|
|
442
458
|
},
|
|
443
459
|
};
|
|
444
460
|
}
|
|
445
|
-
/** Rejects attributed keys fenced by a committed owner deletion. */
|
|
446
|
-
async function apiKeyOwnerExists(apiKey, source) {
|
|
447
|
-
if (!source)
|
|
448
|
-
return true;
|
|
449
|
-
const db = Db.get(source);
|
|
450
|
-
if (!(await ApiKeyAdmissions.matches(db, apiKey)))
|
|
451
|
-
return false;
|
|
452
|
-
if (await ApiKeyOwnerTombstones.isDeleted(db, apiKey))
|
|
453
|
-
return false;
|
|
454
|
-
return true;
|
|
455
|
-
}
|
|
456
461
|
/** Zod schemas documenting the session sign-in surface. */
|
|
457
462
|
var schema;
|
|
458
463
|
(function (schema) {
|
|
@@ -546,7 +551,7 @@ export function install(options) {
|
|
|
546
551
|
get email() {
|
|
547
552
|
return options.email();
|
|
548
553
|
},
|
|
549
|
-
rateLimit:
|
|
554
|
+
rateLimit: rateLimitStore(options_middleware.rateLimit),
|
|
550
555
|
secret: options_session.secret,
|
|
551
556
|
...(options_session.google ? { google: options_session.google } : {}),
|
|
552
557
|
...(options_session.trustedOrigins
|
|
@@ -591,7 +596,10 @@ export function install(options) {
|
|
|
591
596
|
return value === null ? undefined : JSON.parse(value);
|
|
592
597
|
},
|
|
593
598
|
async set(key, value, options) {
|
|
594
|
-
|
|
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 } : {});
|
|
595
603
|
},
|
|
596
604
|
},
|
|
597
605
|
...(ttl ? { ttl } : {}),
|
|
@@ -628,8 +636,51 @@ export function install(options) {
|
|
|
628
636
|
return { email: verifiedEmail ?? user.email ?? undefined, user };
|
|
629
637
|
});
|
|
630
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
|
+
};
|
|
631
679
|
const session = {
|
|
632
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);
|
|
633
684
|
const [betterAuth, identitySession, wallet] = await Promise.all([
|
|
634
685
|
(async () => {
|
|
635
686
|
const auth = BetterAuth.fromContext(c, options_betterAuth);
|
|
@@ -663,7 +714,7 @@ export function install(options) {
|
|
|
663
714
|
const payload = JSON.parse(value);
|
|
664
715
|
if (payload.expiresAt <= Math.floor(Date.now() / 1_000))
|
|
665
716
|
return null;
|
|
666
|
-
const user = await
|
|
717
|
+
const user = await resolveWalletSession(payload);
|
|
667
718
|
if (!user)
|
|
668
719
|
return null;
|
|
669
720
|
return {
|
|
@@ -677,7 +728,7 @@ export function install(options) {
|
|
|
677
728
|
const payload = await handler.getSession(c.req.raw);
|
|
678
729
|
if (!payload)
|
|
679
730
|
return null;
|
|
680
|
-
const user = await
|
|
731
|
+
const user = await resolveWalletSession(payload);
|
|
681
732
|
if (!user)
|
|
682
733
|
return null;
|
|
683
734
|
return {
|
|
@@ -700,6 +751,11 @@ export function install(options) {
|
|
|
700
751
|
const policy_public = policy({ public: true });
|
|
701
752
|
const describe = OpenApi.describeRoute({ hide: true });
|
|
702
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
|
+
})
|
|
703
759
|
.use('/v1/auth/siwe', policy_public, describe)
|
|
704
760
|
.use('/v1/auth/siwe/*', policy_public, describe);
|
|
705
761
|
// Documented operations: pre-routes carrying the OpenAPI metadata and the
|
|
@@ -794,11 +850,12 @@ export function install(options) {
|
|
|
794
850
|
});
|
|
795
851
|
const address = Address.checksum(claims.subject);
|
|
796
852
|
await Users.upsertByAddress(Db.get(db), { address });
|
|
853
|
+
const binding = await bindWalletSession({ address, email: claims.email });
|
|
797
854
|
const issuedAt = Math.floor(Date.now() / 1_000);
|
|
798
855
|
const token = Hex.fromBytes(crypto.getRandomValues(new Uint8Array(32))).slice(2);
|
|
799
856
|
await kv.store.put(identitySessionKey(token), JSON.stringify({
|
|
800
857
|
address,
|
|
801
|
-
...
|
|
858
|
+
...binding,
|
|
802
859
|
expiresAt: issuedAt + identitySessionTtl,
|
|
803
860
|
issuedAt,
|
|
804
861
|
}), { ttl: identitySessionTtl * 1_000 });
|
|
@@ -814,10 +871,12 @@ export function install(options) {
|
|
|
814
871
|
app.post('/v1/auth/logout', policy(false), createMiddleware(async (c, next) => {
|
|
815
872
|
const auth = c.get('auth');
|
|
816
873
|
const principal = principalFromPublic(c, auth);
|
|
817
|
-
const result = await consumeRateLimit(auth, {
|
|
874
|
+
const result = await Timing.time(c, 'rate_limit', () => consumeRateLimit(auth, {
|
|
818
875
|
key: `public:${principal.id}`,
|
|
819
876
|
limit: auth.publicRateLimit ?? defaultPublicRateLimit,
|
|
820
|
-
|
|
877
|
+
principal: `public:${principal.id}`,
|
|
878
|
+
waitUntil: ExecutionContext.waitUntil(c),
|
|
879
|
+
}));
|
|
821
880
|
if (result) {
|
|
822
881
|
setRateLimitHeaders(c, result);
|
|
823
882
|
if (!result.allowed)
|
|
@@ -827,7 +886,7 @@ export function install(options) {
|
|
|
827
886
|
await next();
|
|
828
887
|
return undefined;
|
|
829
888
|
}), OpenApi.describeRoute({
|
|
830
|
-
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.',
|
|
831
890
|
hide: false,
|
|
832
891
|
operationId: 'logout',
|
|
833
892
|
responses: {
|
|
@@ -838,6 +897,22 @@ export function install(options) {
|
|
|
838
897
|
summary: 'Sign out',
|
|
839
898
|
tags: ['Authentication'],
|
|
840
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
|
+
}
|
|
841
916
|
const walletHeaders = (() => {
|
|
842
917
|
const authorization = c.req.header('authorization');
|
|
843
918
|
const cookie = c.req.header('cookie');
|
|
@@ -918,7 +993,7 @@ export function install(options) {
|
|
|
918
993
|
Metadata.attach(app, {
|
|
919
994
|
securitySchemes: {
|
|
920
995
|
session: {
|
|
921
|
-
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
|
|
922
997
|
in: 'header',
|
|
923
998
|
name: 'Cookie',
|
|
924
999
|
type: 'apiKey',
|
|
@@ -929,7 +1004,6 @@ export function install(options) {
|
|
|
929
1004
|
})();
|
|
930
1005
|
const resolve = createApiKeyResolver({
|
|
931
1006
|
apiKey: options_middleware.apiKey,
|
|
932
|
-
db: options.db,
|
|
933
1007
|
scopeCatalog,
|
|
934
1008
|
});
|
|
935
1009
|
const defaults = laneDefaults(options_middleware);
|
|
@@ -942,12 +1016,15 @@ export function install(options) {
|
|
|
942
1016
|
: undefined;
|
|
943
1017
|
return createMiddleware(async (c, next) => {
|
|
944
1018
|
const credential = getApiKeyCredential(c);
|
|
1019
|
+
recordCredential(c, credential);
|
|
945
1020
|
const resolved = resolveRequestPolicy(c, { base, defaults, options: options_middleware });
|
|
946
1021
|
const isSuperAdmin = credential &&
|
|
947
1022
|
superAdminTokenHash !== undefined &&
|
|
948
1023
|
ApiKey.hash(credential.token) === superAdminTokenHash;
|
|
1024
|
+
// CLI session tokens are never API keys, so they skip key resolution here too.
|
|
949
1025
|
const canUseApiKeyQuota = credential &&
|
|
950
1026
|
!isSuperAdmin &&
|
|
1027
|
+
!CliAuth.isToken(credential.token) &&
|
|
951
1028
|
!hasPaymentCredential(c) &&
|
|
952
1029
|
options_middleware.apiKey !== false &&
|
|
953
1030
|
resolved?.policy?.apiKey &&
|
|
@@ -955,11 +1032,20 @@ export function install(options) {
|
|
|
955
1032
|
const cached = canUseApiKeyQuota ? resolve.peek(c, credential.token) : undefined;
|
|
956
1033
|
if (cached)
|
|
957
1034
|
return next();
|
|
958
|
-
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
|
+
: {}));
|
|
959
1044
|
if (response)
|
|
960
1045
|
return response;
|
|
1046
|
+
// Cold keys resolve here, ahead of the auth lane, so time both under one name.
|
|
961
1047
|
if (canUseApiKeyQuota && cached === undefined)
|
|
962
|
-
await resolve.resolve(c, credential.token);
|
|
1048
|
+
await Timing.sum(c, 'auth_key', () => resolve.resolve(c, credential.token));
|
|
963
1049
|
return next();
|
|
964
1050
|
});
|
|
965
1051
|
})();
|
|
@@ -1292,6 +1378,7 @@ export function require(policy) {
|
|
|
1292
1378
|
return createMiddleware(async (c, next) => {
|
|
1293
1379
|
const auth = c.get('auth');
|
|
1294
1380
|
const credential = getApiKeyCredential(c);
|
|
1381
|
+
recordCredential(c, credential);
|
|
1295
1382
|
const hasQueryApiKey = new URL(c.req.url).searchParams.has('key');
|
|
1296
1383
|
// Auth owns `key`; strict route schemas must not validate it.
|
|
1297
1384
|
stripApiKeyQuery(c);
|
|
@@ -1331,7 +1418,11 @@ export function require(policy) {
|
|
|
1331
1418
|
c.set('principal', { actor: 'super_admin', id: 'super_admin', type: 'super_admin' });
|
|
1332
1419
|
return proceed();
|
|
1333
1420
|
}
|
|
1334
|
-
|
|
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));
|
|
1335
1426
|
if (!apiKey_resolved) {
|
|
1336
1427
|
if (unsupportedChain)
|
|
1337
1428
|
return Response.unsupportedChainId(c, unsupportedChain.chainId, unsupportedChain.supportedChainIds);
|
|
@@ -1345,6 +1436,18 @@ export function require(policy) {
|
|
|
1345
1436
|
return proceed();
|
|
1346
1437
|
}
|
|
1347
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
|
+
});
|
|
1348
1451
|
return jsonError(c, {
|
|
1349
1452
|
code: 'api_key_invalid',
|
|
1350
1453
|
message: 'Invalid API key',
|
|
@@ -1379,12 +1482,15 @@ export function require(policy) {
|
|
|
1379
1482
|
? (policy.public?.rateLimit ?? auth.publicRateLimit ?? { limit: 60, period: 'minute' })
|
|
1380
1483
|
: resolveApiKeyLimit({ apiKey, auth, policy: policy.apiKey, scope });
|
|
1381
1484
|
const paid = hasPayment && !throttled;
|
|
1485
|
+
const bucket = policy.apiKey.bucket;
|
|
1382
1486
|
const result = paid
|
|
1383
1487
|
? null
|
|
1384
|
-
: await consumeRateLimit(auth, {
|
|
1385
|
-
key: rateLimitKey(`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),
|
|
1386
1490
|
limit,
|
|
1387
|
-
|
|
1491
|
+
principal: `api_key:${apiKey.id}`,
|
|
1492
|
+
waitUntil: ExecutionContext.waitUntil(c),
|
|
1493
|
+
}));
|
|
1388
1494
|
if (result) {
|
|
1389
1495
|
setRateLimitHeaders(c, result);
|
|
1390
1496
|
// Surface the bucket so callers can correlate a 429 with the exhausted
|
|
@@ -1417,7 +1523,7 @@ export function require(policy) {
|
|
|
1417
1523
|
if (missing.length > 0)
|
|
1418
1524
|
return jsonError(c, {
|
|
1419
1525
|
code: 'api_key_forbidden',
|
|
1420
|
-
message:
|
|
1526
|
+
message: `API key is missing required permissions: ${missing.join(', ')}. Use an API key with these scopes.`,
|
|
1421
1527
|
status: 403,
|
|
1422
1528
|
});
|
|
1423
1529
|
if (paid)
|
|
@@ -1464,10 +1570,12 @@ export function require(policy) {
|
|
|
1464
1570
|
}
|
|
1465
1571
|
const limit = policy.public?.rateLimit;
|
|
1466
1572
|
if (limit) {
|
|
1467
|
-
const result = await consumeRateLimit(auth, {
|
|
1573
|
+
const result = await Timing.time(c, 'rate_limit', () => consumeRateLimit(auth, {
|
|
1468
1574
|
key: rateLimitKey(`public:${publicPrincipal.id}`, policy.public?.bucket),
|
|
1469
1575
|
limit,
|
|
1470
|
-
|
|
1576
|
+
principal: `public:${publicPrincipal.id}`,
|
|
1577
|
+
waitUntil: ExecutionContext.waitUntil(c),
|
|
1578
|
+
}));
|
|
1471
1579
|
if (result)
|
|
1472
1580
|
setRateLimitHeaders(c, result);
|
|
1473
1581
|
if (!result || result.allowed) {
|
|
@@ -1508,6 +1616,10 @@ export function require(policy) {
|
|
|
1508
1616
|
* server-side — we just stop waiting for it.
|
|
1509
1617
|
*/
|
|
1510
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
|
+
}
|
|
1511
1623
|
/** Consumes one quota and returns null when its counter is unavailable, allowing callers to fail open. */
|
|
1512
1624
|
export function consumeRateLimit(auth, options) {
|
|
1513
1625
|
if (!auth.rateLimit)
|
|
@@ -1591,6 +1703,14 @@ function getApiKeyCredential(c) {
|
|
|
1591
1703
|
return { token: apiKey };
|
|
1592
1704
|
return null;
|
|
1593
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
|
+
}
|
|
1594
1714
|
function clientIp(c, auth) {
|
|
1595
1715
|
return (trustedClientIps.get(c.req.raw) ??
|
|
1596
1716
|
(auth.publicClientIp ? auth.publicClientIp(c.req.raw) : c.req.header('cf-connecting-ip')));
|
|
@@ -1717,10 +1837,12 @@ function principalFromPublic(c, auth) {
|
|
|
1717
1837
|
}
|
|
1718
1838
|
async function requirePayment(c, next, options) {
|
|
1719
1839
|
if (hasPaymentCredential(c)) {
|
|
1720
|
-
const result = await consumeRateLimit(options.auth, {
|
|
1840
|
+
const result = await Timing.time(c, 'rate_limit', () => consumeRateLimit(options.auth, {
|
|
1721
1841
|
key: rateLimitKey(`mpp:${options.principal.type}:${options.principal.id}`, options.policy.mpp?.bucket),
|
|
1722
1842
|
limit: options.policy.mpp?.rateLimit ?? options.auth.mpp?.rateLimit ?? defaultMppRateLimit,
|
|
1723
|
-
|
|
1843
|
+
principal: `mpp:${options.principal.type}:${options.principal.id}`,
|
|
1844
|
+
waitUntil: ExecutionContext.waitUntil(c),
|
|
1845
|
+
}));
|
|
1724
1846
|
if (result) {
|
|
1725
1847
|
setRateLimitHeaders(c, result);
|
|
1726
1848
|
c.header('RateLimit-Scope', 'mpp');
|
|
@@ -1801,18 +1923,12 @@ async function resolveSession(c, auth) {
|
|
|
1801
1923
|
/** Maximum resolve-cache entries held per isolate before eviction. */
|
|
1802
1924
|
const cachedMaxEntries = 10_000;
|
|
1803
1925
|
/**
|
|
1804
|
-
*
|
|
1805
|
-
*
|
|
1806
|
-
* (default 60s), negative for `negativeTtl` (default 10s) so a freshly minted
|
|
1807
|
-
* key is usable quickly; concurrent misses for one token are single-flighted.
|
|
1808
|
-
* Entries are keyed by the token's sha256 (`ApiKey.hash`) — never the
|
|
1809
|
-
* plaintext. Key updates may remain stale for up to `ttl`, the accepted
|
|
1810
|
-
* 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.
|
|
1811
1928
|
*/
|
|
1812
|
-
function cachedResolve(resolve, options) {
|
|
1929
|
+
export function cachedResolve(resolve, options) {
|
|
1813
1930
|
const { negativeTtl = 10_000, now = Date.now, ttl = 60_000 } = options;
|
|
1814
1931
|
const cells = new Map();
|
|
1815
|
-
const flights = new Map();
|
|
1816
1932
|
return {
|
|
1817
1933
|
invalidate(token) {
|
|
1818
1934
|
cells.delete(`v1:${ApiKey.hash(token)}`);
|
|
@@ -1835,31 +1951,19 @@ function cachedResolve(resolve, options) {
|
|
|
1835
1951
|
return cell.value;
|
|
1836
1952
|
if (cell)
|
|
1837
1953
|
cells.delete(key);
|
|
1838
|
-
const
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
const
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
if (entry.expiresAt <= time)
|
|
1849
|
-
cells.delete(name);
|
|
1850
|
-
while (cells.size >= cachedMaxEntries)
|
|
1851
|
-
cells.delete(cells.keys().next().value);
|
|
1852
|
-
}
|
|
1853
|
-
cells.set(key, { expiresAt: now() + (value ? ttl : negativeTtl), value });
|
|
1854
|
-
return value;
|
|
1855
|
-
})();
|
|
1856
|
-
flights.set(key, flight);
|
|
1857
|
-
try {
|
|
1858
|
-
return await flight;
|
|
1859
|
-
}
|
|
1860
|
-
finally {
|
|
1861
|
-
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);
|
|
1862
1964
|
}
|
|
1965
|
+
cells.set(key, { expiresAt: now() + (value ? ttl : negativeTtl), value });
|
|
1966
|
+
return value;
|
|
1863
1967
|
},
|
|
1864
1968
|
};
|
|
1865
1969
|
}
|