tapimo 0.7.0 → 0.7.2
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/dist/ApiKeys.d.ts +24 -7
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +17 -5
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +12104 -7861
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +191 -128
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +10 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +17 -4
- package/dist/Assets.js.map +1 -1
- package/dist/Scope.d.ts +19 -8
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +25 -9
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +1 -1
- package/dist/admin/App.d.ts +601 -20
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +12 -2
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +94 -11
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +141 -32
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +1069 -0
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
- package/dist/admin/apps/earn-vaults.js +409 -0
- package/dist/admin/apps/earn-vaults.js.map +1 -0
- package/dist/admin/apps/verified-tokens.d.ts +166 -166
- 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 +151 -95
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +2 -0
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +18 -2
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +22 -1
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +59 -39
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/Zones.d.ts +8335 -0
- package/dist/apps/Zones.d.ts.map +1 -0
- package/dist/apps/Zones.js +38 -0
- package/dist/apps/Zones.js.map +1 -0
- package/dist/apps/data/App.d.ts +14377 -10165
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +91 -19
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/FxOracle.d.ts +1 -1
- package/dist/apps/data/FxOracle.d.ts.map +1 -1
- package/dist/apps/data/index.d.ts +0 -1
- package/dist/apps/data/index.d.ts.map +1 -1
- package/dist/apps/data/index.js +0 -1
- package/dist/apps/data/index.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +32 -32
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +130 -65
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +312 -312
- package/dist/apps/data/routes/balances.d.ts +18 -18
- package/dist/apps/data/routes/balances.js +5 -5
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +176 -176
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
- package/dist/apps/data/routes/coingecko.js +62 -35
- package/dist/apps/data/routes/coingecko.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +2144 -0
- package/dist/apps/data/routes/earn.d.ts.map +1 -0
- package/dist/apps/data/routes/earn.js +947 -0
- package/dist/apps/data/routes/earn.js.map +1 -0
- package/dist/apps/data/routes/exchanges.d.ts +1231 -324
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +656 -193
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +59 -8
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/funding.d.ts +4092 -387
- package/dist/apps/data/routes/funding.d.ts.map +1 -1
- package/dist/apps/data/routes/funding.js +1403 -256
- package/dist/apps/data/routes/funding.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +5 -5
- package/dist/apps/data/routes/indexer.d.ts.map +1 -1
- package/dist/apps/data/routes/indexer.js +19 -2
- package/dist/apps/data/routes/indexer.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +265 -265
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +11 -11
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.d.ts +5 -5
- package/dist/apps/data/routes/rpc.d.ts.map +1 -1
- package/dist/apps/data/routes/rpc.js +211 -22
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +36 -36
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +49 -9
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +116 -88
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +198 -91
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +55 -55
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +78 -39
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +78 -29
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +165 -67
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +10 -10
- package/dist/apps/data/routes/valuation.js +2 -2
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/verified-tokens.js +34 -9
- package/dist/apps/data/routes/verified-tokens.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +5 -3
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +175 -65
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +281 -0
- package/dist/apps/data/routes/zones.d.ts.map +1 -0
- package/dist/apps/data/routes/zones.js +252 -0
- package/dist/apps/data/routes/zones.js.map +1 -0
- package/dist/apps/docs/reference.js +6 -5
- package/dist/apps/docs/reference.js.map +1 -1
- package/dist/apps/index.d.ts +2 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +2 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +670 -670
- package/dist/apps/management/Billing.d.ts +8 -0
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +12 -0
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/Error.d.ts +12 -0
- package/dist/apps/management/Error.d.ts.map +1 -0
- package/dist/apps/management/Error.js +10 -0
- package/dist/apps/management/Error.js.map +1 -0
- package/dist/apps/management/routes/api-keys.d.ts +5 -5
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +2 -8
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +119 -119
- package/dist/apps/management/routes/faucet.d.ts +35 -35
- package/dist/apps/management/routes/invitations.d.ts +62 -62
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +4 -10
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +30 -30
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +78 -78
- package/dist/apps/management/routes/orgs.d.ts +48 -48
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +2 -8
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +9 -9
- package/dist/apps/management/routes/scopes.js +2 -2
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +80 -80
- package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
- package/dist/apps/management/routes/webhooks.d.ts +50 -50
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +15 -3
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mpp/App.d.ts +55 -56
- package/dist/apps/mpp/App.d.ts.map +1 -1
- package/dist/apps/mpp/App.js +192 -27
- package/dist/apps/mpp/App.js.map +1 -1
- package/dist/apps/mpp/Mpp.d.ts +0 -20
- package/dist/apps/mpp/Mpp.d.ts.map +1 -1
- package/dist/apps/mpp/Mpp.js +0 -24
- package/dist/apps/mpp/Mpp.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Adapter.js +66 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -0
- package/dist/apps/mpp/internal/Error.d.ts +4 -0
- package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Error.js +41 -0
- package/dist/apps/mpp/internal/Error.js.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
- package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Idempotency.js +28 -0
- package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
- package/dist/apps/mpp/internal/Policy.d.ts +46 -0
- package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Policy.js +57 -0
- package/dist/apps/mpp/internal/Policy.js.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
- package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
- package/dist/apps/mpp/internal/ScreenManager.js +18 -0
- package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
- package/dist/apps/mpp/internal/Screening.d.ts +35 -0
- package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Screening.js +20 -0
- package/dist/apps/mpp/internal/Screening.js.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
- package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Sponsorship.js +103 -0
- package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
- package/dist/apps/mpp/internal/Utils.d.ts +7 -0
- package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
- package/dist/apps/mpp/internal/Utils.js +24 -0
- package/dist/apps/mpp/internal/Utils.js.map +1 -0
- package/dist/apps/relay/App.js +184 -24
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts +4 -0
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +16 -7
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/db/Db.d.ts +20 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +342 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +921 -1
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +269 -1
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +68 -0
- package/dist/db/tables/earnVaults.d.ts.map +1 -0
- package/dist/db/tables/earnVaults.js +72 -0
- package/dist/db/tables/earnVaults.js.map +1 -0
- package/dist/db/tables/fundingCatalog.d.ts +56 -0
- package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
- package/dist/db/tables/fundingCatalog.js +85 -0
- package/dist/db/tables/fundingCatalog.js.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
- package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
- package/dist/db/tables/fundingDepositAddresses.js +206 -0
- package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
- package/dist/db/tables/fundingDeposits.d.ts +115 -0
- package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
- package/dist/db/tables/fundingDeposits.js +100 -0
- package/dist/db/tables/fundingDeposits.js.map +1 -0
- package/dist/db/tables/fundingIdempotency.d.ts +91 -0
- package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
- package/dist/db/tables/fundingIdempotency.js +103 -0
- package/dist/db/tables/fundingIdempotency.js.map +1 -0
- package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
- package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferEvents.js +18 -0
- package/dist/db/tables/fundingTransferEvents.js.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
- package/dist/db/tables/fundingTransferTransactions.js +27 -0
- package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
- package/dist/db/tables/fundingTransfers.d.ts +82 -0
- package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
- package/dist/db/tables/fundingTransfers.js +89 -0
- package/dist/db/tables/fundingTransfers.js.map +1 -0
- package/dist/db/tables/organizations.d.ts +8 -0
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +35 -0
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +8 -0
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +16 -0
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/requestUsage.d.ts +13 -0
- package/dist/db/tables/requestUsage.d.ts.map +1 -1
- package/dist/db/tables/requestUsage.js +16 -0
- package/dist/db/tables/requestUsage.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +14 -4
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/users.d.ts +8 -0
- package/dist/db/tables/users.d.ts.map +1 -1
- package/dist/db/tables/users.js +16 -0
- package/dist/db/tables/users.js.map +1 -1
- package/dist/db/tables/verifiedTokens.d.ts +14 -7
- package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
- package/dist/db/tables/verifiedTokens.js +9 -7
- package/dist/db/tables/verifiedTokens.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +24 -3
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/relay.js +108 -108
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +26 -0
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +35 -2
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +16 -10
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/Cursor.js +1 -1
- package/dist/internal/Cursor.js.map +1 -1
- package/dist/internal/EarnRates.d.ts +89 -0
- package/dist/internal/EarnRates.d.ts.map +1 -0
- package/dist/internal/EarnRates.js +266 -0
- package/dist/internal/EarnRates.js.map +1 -0
- package/dist/internal/EarnVaults.d.ts +171 -0
- package/dist/internal/EarnVaults.d.ts.map +1 -0
- package/dist/internal/EarnVaults.js +547 -0
- package/dist/internal/EarnVaults.js.map +1 -0
- package/dist/internal/EdgeCache.d.ts +9 -2
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +36 -9
- package/dist/internal/EdgeCache.js.map +1 -1
- package/dist/internal/Id.d.ts +11 -0
- package/dist/internal/Id.d.ts.map +1 -1
- package/dist/internal/Id.js +13 -0
- package/dist/internal/Id.js.map +1 -1
- package/dist/internal/Idempotency.d.ts +83 -0
- package/dist/internal/Idempotency.d.ts.map +1 -0
- package/dist/internal/Idempotency.js +113 -0
- package/dist/internal/Idempotency.js.map +1 -0
- package/dist/internal/Log.d.ts +64 -9
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +29 -7
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +47 -1
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +1 -1
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +3 -0
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Provider.d.ts +14 -0
- package/dist/internal/Provider.d.ts.map +1 -0
- package/dist/internal/Provider.js +5 -0
- package/dist/internal/Provider.js.map +1 -0
- package/dist/internal/Schema.d.ts +8 -3
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +24 -13
- package/dist/internal/Schema.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 +35 -0
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +43 -24
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +79 -11
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Viem.d.ts +82 -65
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +83 -12
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/WebhookDestination.d.ts.map +1 -1
- package/dist/internal/WebhookDestination.js +34 -28
- package/dist/internal/WebhookDestination.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +9 -0
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +15 -10
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/exchange/Provider.d.ts +219 -0
- package/dist/internal/exchange/Provider.d.ts.map +1 -0
- package/dist/internal/exchange/Provider.js +117 -0
- package/dist/internal/exchange/Provider.js.map +1 -0
- package/dist/internal/exchange/index.d.ts +2 -0
- package/dist/internal/exchange/index.d.ts.map +1 -0
- package/dist/internal/exchange/index.js +2 -0
- package/dist/internal/exchange/index.js.map +1 -0
- package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
- package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
- package/dist/internal/exchange/providers/uniswap.js +553 -0
- package/dist/internal/exchange/providers/uniswap.js.map +1 -0
- package/dist/internal/funding/Action.d.ts +55 -0
- package/dist/internal/funding/Action.d.ts.map +1 -0
- package/dist/internal/funding/Action.js +74 -0
- package/dist/internal/funding/Action.js.map +1 -0
- package/dist/internal/funding/Catalog.d.ts +107 -0
- package/dist/internal/funding/Catalog.d.ts.map +1 -0
- package/dist/internal/funding/Catalog.js +270 -0
- package/dist/internal/funding/Catalog.js.map +1 -0
- package/dist/internal/funding/Chain.d.ts +76 -0
- package/dist/internal/funding/Chain.d.ts.map +1 -0
- package/dist/internal/funding/Chain.js +38 -0
- package/dist/internal/funding/Chain.js.map +1 -0
- package/dist/internal/funding/Deposit.d.ts +366 -0
- package/dist/internal/funding/Deposit.d.ts.map +1 -0
- package/dist/internal/funding/Deposit.js +286 -0
- package/dist/internal/funding/Deposit.js.map +1 -0
- package/dist/internal/funding/DepositAddress.d.ts +345 -0
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
- package/dist/internal/funding/DepositAddress.js +189 -0
- package/dist/internal/funding/DepositAddress.js.map +1 -0
- package/dist/internal/funding/Evidence.d.ts +52 -0
- package/dist/internal/funding/Evidence.d.ts.map +1 -0
- package/dist/internal/funding/Evidence.js +314 -0
- package/dist/internal/funding/Evidence.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts +1186 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -0
- package/dist/internal/funding/Provider.js +1081 -0
- package/dist/internal/funding/Provider.js.map +1 -0
- package/dist/internal/funding/Reconciliation.d.ts +113 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
- package/dist/internal/funding/Reconciliation.js +676 -0
- package/dist/internal/funding/Reconciliation.js.map +1 -0
- package/dist/internal/funding/Route.d.ts +21 -0
- package/dist/internal/funding/Route.d.ts.map +1 -0
- package/dist/internal/funding/Route.js +5 -0
- package/dist/internal/funding/Route.js.map +1 -0
- package/dist/internal/funding/Subsidy.d.ts +113 -0
- package/dist/internal/funding/Subsidy.d.ts.map +1 -0
- package/dist/internal/funding/Subsidy.js +138 -0
- package/dist/internal/funding/Subsidy.js.map +1 -0
- package/dist/internal/funding/Token.d.ts +41 -0
- package/dist/internal/funding/Token.d.ts.map +1 -0
- package/dist/internal/funding/Token.js +22 -0
- package/dist/internal/funding/Token.js.map +1 -0
- package/dist/internal/funding/Transfer.d.ts +643 -0
- package/dist/internal/funding/Transfer.d.ts.map +1 -0
- package/dist/internal/funding/Transfer.js +332 -0
- package/dist/internal/funding/Transfer.js.map +1 -0
- package/dist/internal/funding/index.d.ts +13 -0
- package/dist/internal/funding/index.d.ts.map +1 -0
- package/dist/internal/funding/index.js +13 -0
- package/dist/internal/funding/index.js.map +1 -0
- package/dist/internal/funding/providers/across.d.ts +21 -0
- package/dist/internal/funding/providers/across.d.ts.map +1 -0
- package/dist/internal/funding/providers/across.js +117 -0
- package/dist/internal/funding/providers/across.js.map +1 -0
- package/dist/internal/funding/providers/relay.d.ts +46 -0
- package/dist/internal/funding/providers/relay.d.ts.map +1 -0
- package/dist/internal/funding/providers/relay.js +464 -0
- package/dist/internal/funding/providers/relay.js.map +1 -0
- package/dist/internal/funding/providers/rhino.d.ts +15 -0
- package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
- package/dist/internal/funding/providers/rhino.js +116 -0
- package/dist/internal/funding/providers/rhino.js.map +1 -0
- package/dist/internal/funding/providers/squid.d.ts +19 -0
- package/dist/internal/funding/providers/squid.d.ts.map +1 -0
- package/dist/internal/funding/providers/squid.js +120 -0
- package/dist/internal/funding/providers/squid.js.map +1 -0
- package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
- package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
- package/dist/internal/funding/providers/symbiosis.js +176 -0
- package/dist/internal/funding/providers/symbiosis.js.map +1 -0
- package/dist/internal/index.d.ts +5 -1
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +5 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/webhookDestinations/url.js +61 -57
- package/dist/internal/webhookDestinations/url.js.map +1 -1
- package/dist/providers/index.d.ts +43 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/package.json +9 -4
- package/src/ApiKeys.test.ts +11 -7
- package/src/ApiKeys.ts +37 -9
- package/src/App.test.ts +85 -10
- package/src/App.ts +224 -137
- package/src/Assets.ts +29 -4
- package/src/Client.test-d.ts +650 -30
- package/src/Scope.test.ts +19 -0
- package/src/Scope.ts +28 -11
- package/src/Webhooks.test.ts +25 -0
- package/src/Webhooks.ts +1 -1
- package/src/admin/App.test.ts +9 -2
- package/src/admin/App.ts +32 -9
- package/src/admin/apps/api-keys.test.ts +167 -23
- package/src/admin/apps/api-keys.ts +166 -28
- package/src/admin/apps/earn-vaults.test.ts +338 -0
- package/src/admin/apps/earn-vaults.ts +572 -0
- package/src/admin/apps/scopes.test.ts +16 -1
- package/src/admin/ui/plugin.ts +2 -2
- package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
- package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
- package/src/admin/ui/src/components/Page.tsx +1 -1
- package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
- package/src/admin/ui/src/lib/api-keys.ts +37 -7
- package/src/admin/ui/src/lib/client.ts +1 -1
- package/src/admin/ui/src/lib/config.ts +1 -1
- package/src/admin/ui/src/lib/early-access.ts +8 -9
- package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
- package/src/admin/ui/src/lib/format.ts +13 -0
- package/src/admin/ui/src/lib/organizations.test.ts +14 -4
- package/src/admin/ui/src/lib/organizations.ts +7 -1
- package/src/admin/ui/src/lib/response.ts +22 -0
- package/src/admin/ui/src/lib/scopes.test.ts +19 -11
- package/src/admin/ui/src/lib/scopes.ts +28 -7
- package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
- package/src/admin/ui/src/routeTree.gen.ts +70 -7
- package/src/admin/ui/src/router.tsx +2 -2
- package/src/admin/ui/src/routes/__root.tsx +9 -8
- package/src/admin/ui/src/routes/api-keys.tsx +475 -64
- package/src/admin/ui/src/routes/early-access.tsx +5 -12
- package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
- package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
- package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
- package/src/admin/ui/src/routes/organizations.tsx +4 -7
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
- package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
- package/src/admin/ui/vite.config.ts +4 -1
- package/src/admin/ui.generated.ts +189 -95
- package/src/analytics/Analytics.test.ts +69 -10
- package/src/analytics/Analytics.ts +20 -1
- package/src/analytics/tables/requestEvents.ts +79 -37
- package/src/apps/Zones.test.ts +33 -0
- package/src/apps/Zones.ts +40 -0
- package/src/apps/composition.test.ts +84 -1
- package/src/apps/data/App.test.ts +38 -9
- package/src/apps/data/App.ts +96 -33
- package/src/apps/data/FxOracle.ts +1 -1
- package/src/apps/data/index.ts +0 -1
- package/src/apps/data/routes/activities.test.ts +82 -6
- package/src/apps/data/routes/activities.ts +131 -71
- package/src/apps/data/routes/balances.test.ts +50 -37
- package/src/apps/data/routes/balances.ts +5 -5
- package/src/apps/data/routes/blocks.test.ts +2 -0
- package/src/apps/data/routes/coingecko.test.ts +22 -0
- package/src/apps/data/routes/coingecko.ts +84 -48
- package/src/apps/data/routes/earn.test.ts +1108 -0
- package/src/apps/data/routes/earn.ts +1391 -0
- package/src/apps/data/routes/exchanges.test.ts +82 -33
- package/src/apps/data/routes/exchanges.ts +842 -227
- package/src/apps/data/routes/fee-amm.test.ts +4 -6
- package/src/apps/data/routes/fee-amm.ts +69 -12
- package/src/apps/data/routes/funding.test.ts +2712 -221
- package/src/apps/data/routes/funding.ts +1604 -387
- package/src/apps/data/routes/indexer.test.ts +43 -34
- package/src/apps/data/routes/indexer.ts +19 -2
- package/src/apps/data/routes/receipts.test.ts +5 -3
- package/src/apps/data/routes/receipts.ts +13 -11
- package/src/apps/data/routes/rpc.test.ts +446 -28
- package/src/apps/data/routes/rpc.ts +243 -25
- package/src/apps/data/routes/tokenlist.test.ts +15 -0
- package/src/apps/data/routes/tokenlist.ts +88 -22
- package/src/apps/data/routes/tokens.ts +262 -86
- package/src/apps/data/routes/transactions.test.ts +2 -0
- package/src/apps/data/routes/transactions.ts +77 -42
- package/src/apps/data/routes/transfers.test.ts +166 -4
- package/src/apps/data/routes/transfers.ts +216 -78
- package/src/apps/data/routes/valuation.test.ts +62 -9
- package/src/apps/data/routes/valuation.ts +2 -2
- package/src/apps/data/routes/verified-tokens.test.ts +51 -0
- package/src/apps/data/routes/verified-tokens.ts +52 -15
- package/src/apps/data/routes/webhooks.test.ts +432 -33
- package/src/apps/data/routes/webhooks.ts +189 -79
- package/src/apps/data/routes/zones.test.ts +473 -0
- package/src/apps/data/routes/zones.ts +338 -0
- package/src/apps/docs/reference.ts +8 -6
- package/src/apps/index.ts +2 -1
- package/src/apps/management/Billing.test.ts +29 -0
- package/src/apps/management/Billing.ts +23 -0
- package/src/apps/management/Error.ts +12 -0
- package/src/apps/management/routes/api-keys.test.ts +5 -3
- package/src/apps/management/routes/api-keys.ts +2 -9
- package/src/apps/management/routes/invitations.ts +4 -11
- package/src/apps/management/routes/orgs.ts +2 -9
- package/src/apps/management/routes/scopes.test.ts +7 -2
- package/src/apps/management/routes/scopes.ts +2 -2
- package/src/apps/management/routes/webhooks.test.ts +6 -1
- package/src/apps/management/routes/webhooks.ts +15 -3
- package/src/apps/mpp/App.ts +276 -29
- package/src/apps/mpp/Mpp.test.ts +631 -26
- package/src/apps/mpp/Mpp.ts +0 -42
- package/src/apps/mpp/internal/Adapter.ts +108 -3
- package/src/apps/mpp/internal/Error.test.ts +33 -0
- package/src/apps/mpp/internal/Error.ts +44 -6
- package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
- package/src/apps/mpp/internal/Idempotency.ts +59 -5
- package/src/apps/mpp/internal/Policy.test.ts +122 -0
- package/src/apps/mpp/internal/Policy.ts +98 -0
- package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
- package/src/apps/mpp/internal/ScreenManager.ts +41 -0
- package/src/apps/mpp/internal/Screening.ts +40 -3
- package/src/apps/mpp/internal/Sponsorship.ts +144 -0
- package/src/apps/mpp/internal/Utils.ts +30 -0
- package/src/apps/relay/App.test.ts +495 -64
- package/src/apps/relay/App.ts +234 -24
- package/src/apps/relay/Sponsorships.test.ts +51 -0
- package/src/apps/relay/Sponsorships.ts +19 -7
- package/src/db/Db.ts +439 -0
- package/src/db/Schema.ts +325 -2
- package/src/db/tables/earnVaults.test.ts +185 -0
- package/src/db/tables/earnVaults.ts +151 -0
- package/src/db/tables/fundingCatalog.test.ts +108 -0
- package/src/db/tables/fundingCatalog.ts +157 -0
- package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
- package/src/db/tables/fundingDepositAddresses.ts +376 -0
- package/src/db/tables/fundingDeposits.test.ts +261 -0
- package/src/db/tables/fundingDeposits.ts +229 -0
- package/src/db/tables/fundingIdempotency.test.ts +182 -0
- package/src/db/tables/fundingIdempotency.ts +180 -0
- package/src/db/tables/fundingTransferEvents.ts +28 -0
- package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
- package/src/db/tables/fundingTransferTransactions.ts +37 -0
- package/src/db/tables/fundingTransfers.test.ts +89 -0
- package/src/db/tables/fundingTransfers.ts +153 -0
- package/src/db/tables/organizations.test.ts +88 -0
- package/src/db/tables/organizations.ts +42 -1
- package/src/db/tables/projects.ts +16 -0
- package/src/db/tables/requestUsage.ts +23 -0
- package/src/db/tables/sponsoredTransactions.test.ts +52 -2
- package/src/db/tables/sponsoredTransactions.ts +18 -6
- package/src/db/tables/users.ts +16 -0
- package/src/db/tables/verifiedTokens.ts +19 -14
- package/src/db/tables/webhookSubscriptions.ts +58 -3
- package/src/handlers/relay.test.ts +2 -0
- package/src/handlers/relay.ts +95 -99
- package/src/internal/Auth.test.ts +48 -0
- package/src/internal/Auth.ts +61 -2
- package/src/internal/Cache.ts +13 -9
- package/src/internal/Cursor.test.ts +2 -2
- package/src/internal/Cursor.ts +1 -1
- package/src/internal/EarnRates.test.ts +125 -0
- package/src/internal/EarnRates.ts +409 -0
- package/src/internal/EarnVaults.test.ts +195 -0
- package/src/internal/EarnVaults.ts +876 -0
- package/src/internal/EdgeCache.test.ts +37 -5
- package/src/internal/EdgeCache.ts +39 -7
- package/src/internal/Id.ts +14 -0
- package/src/internal/Idempotency.test.ts +109 -0
- package/src/internal/Idempotency.ts +237 -0
- package/src/internal/Log.test-d.ts +41 -8
- package/src/internal/Log.test.ts +189 -8
- package/src/internal/Log.ts +124 -17
- package/src/internal/MetricSink.test.ts +244 -4
- package/src/internal/MetricSink.ts +51 -1
- package/src/internal/OpenApi.ts +3 -0
- package/src/internal/Provider.test.ts +17 -0
- package/src/internal/Provider.ts +17 -0
- package/src/internal/Schema.test.ts +13 -0
- package/src/internal/Schema.ts +41 -24
- package/src/internal/Store.test.ts +25 -0
- package/src/internal/Store.ts +46 -0
- package/src/internal/Tidx.local.test.ts +78 -3
- package/src/internal/Tidx.test.ts +212 -18
- package/src/internal/Tidx.ts +112 -32
- package/src/internal/VerifiedTokens.test.ts +15 -0
- package/src/internal/Viem.test.ts +170 -17
- package/src/internal/Viem.ts +111 -28
- package/src/internal/WebhookDestination.ts +25 -23
- package/src/internal/Webhooks.test.ts +59 -0
- package/src/internal/Webhooks.ts +34 -10
- package/src/internal/exchange/Provider.test.ts +216 -0
- package/src/internal/exchange/Provider.ts +326 -0
- package/src/internal/exchange/index.test.ts +6 -0
- package/src/internal/exchange/index.ts +1 -0
- package/src/internal/exchange/providers/uniswap.test.ts +122 -0
- package/src/internal/exchange/providers/uniswap.ts +682 -0
- package/src/internal/funding/Action.test.ts +138 -0
- package/src/internal/funding/Action.ts +117 -0
- package/src/internal/funding/Catalog.test.ts +311 -0
- package/src/internal/funding/Catalog.ts +347 -0
- package/src/internal/funding/Chain.test.ts +79 -0
- package/src/internal/funding/Chain.ts +120 -0
- package/src/internal/funding/Deposit.test.ts +26 -0
- package/src/internal/funding/Deposit.ts +453 -0
- package/src/internal/funding/DepositAddress.test.ts +18 -0
- package/src/internal/funding/DepositAddress.ts +312 -0
- package/src/internal/funding/Evidence.test.ts +297 -0
- package/src/internal/funding/Evidence.ts +430 -0
- package/src/internal/funding/Provider.test.ts +1328 -0
- package/src/internal/funding/Provider.ts +1796 -0
- package/src/internal/funding/Reconciliation.local.test.ts +504 -0
- package/src/internal/funding/Reconciliation.test.ts +2020 -0
- package/src/internal/funding/Reconciliation.ts +930 -0
- package/src/internal/funding/Route.test.ts +66 -0
- package/src/internal/funding/Route.ts +29 -0
- package/src/internal/funding/Subsidy.local.test.ts +152 -0
- package/src/internal/funding/Subsidy.test.ts +75 -0
- package/src/internal/funding/Subsidy.ts +260 -0
- package/src/internal/funding/Token.test.ts +47 -0
- package/src/internal/funding/Token.ts +59 -0
- package/src/internal/funding/Transfer.test.ts +369 -0
- package/src/internal/funding/Transfer.ts +522 -0
- package/src/internal/funding/index.test.ts +20 -0
- package/src/internal/funding/index.ts +12 -0
- package/src/internal/funding/providers/across.ts +149 -0
- package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
- package/src/internal/funding/providers/relay.test.ts +474 -0
- package/src/internal/funding/providers/relay.ts +559 -0
- package/src/internal/funding/providers/rhino.ts +139 -0
- package/src/internal/funding/providers/squid.ts +151 -0
- package/src/internal/funding/providers/symbiosis.ts +221 -0
- package/src/internal/index.test.ts +5 -1
- package/src/internal/index.ts +5 -1
- package/src/internal/webhookDestinations/url.ts +49 -45
- package/src/providers/index.test.ts +14 -0
- package/src/providers/index.ts +54 -0
- package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
- package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
- package/dist/apps/data/FundingQuoteProviders.js +0 -775
- package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
- package/dist/internal/FundingQuotes.d.ts +0 -864
- package/dist/internal/FundingQuotes.d.ts.map +0 -1
- package/dist/internal/FundingQuotes.js +0 -672
- package/dist/internal/FundingQuotes.js.map +0 -1
- package/src/apps/data/FundingQuoteProviders.ts +0 -1043
- package/src/internal/FundingQuotes.test.ts +0 -456
- package/src/internal/FundingQuotes.ts +0 -944
|
@@ -179,6 +179,23 @@ describe('middleware', () => {
|
|
|
179
179
|
expect(store.gets).toMatchInlineSnapshot(`1`)
|
|
180
180
|
})
|
|
181
181
|
|
|
182
|
+
test('bypasses the cache when its route key cannot be generated', async () => {
|
|
183
|
+
const { app, store, downstreamCalls } = createApp({
|
|
184
|
+
key: () => {
|
|
185
|
+
throw new Error('invalid query')
|
|
186
|
+
},
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
const first = await app.request('/cached')
|
|
190
|
+
const second = await app.request('/cached')
|
|
191
|
+
|
|
192
|
+
expect(first.status).toMatchInlineSnapshot(`200`)
|
|
193
|
+
expect(second.status).toMatchInlineSnapshot(`200`)
|
|
194
|
+
expect(downstreamCalls()).toMatchInlineSnapshot(`2`)
|
|
195
|
+
expect(store.gets).toMatchInlineSnapshot(`0`)
|
|
196
|
+
expect(store.size).toMatchInlineSnapshot(`0`)
|
|
197
|
+
})
|
|
198
|
+
|
|
182
199
|
test('answers conditional requests from a cached ETag with 304', async () => {
|
|
183
200
|
const { app } = createApp()
|
|
184
201
|
|
|
@@ -219,7 +236,7 @@ describe('middleware', () => {
|
|
|
219
236
|
|
|
220
237
|
test('rechecks route eligibility before every cache lookup', async () => {
|
|
221
238
|
let eligible = true
|
|
222
|
-
const { app, downstreamCalls, store } = createApp({ eligibility: () => eligible })
|
|
239
|
+
const { app, downstreamCalls, store } = createApp({ eligibility: [() => eligible] })
|
|
223
240
|
|
|
224
241
|
await app.request('/cached')
|
|
225
242
|
eligible = false
|
|
@@ -229,6 +246,19 @@ describe('middleware', () => {
|
|
|
229
246
|
expect(store.gets).toBe(1)
|
|
230
247
|
expect(store.size).toBe(1)
|
|
231
248
|
})
|
|
249
|
+
|
|
250
|
+
test('requires every route eligibility predicate to permit caching', async () => {
|
|
251
|
+
const { app, downstreamCalls, store } = createApp({
|
|
252
|
+
eligibility: [() => true, () => false],
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
await app.request('/cached')
|
|
256
|
+
await app.request('/cached')
|
|
257
|
+
|
|
258
|
+
expect(downstreamCalls()).toBe(2)
|
|
259
|
+
expect(store.gets).toBe(0)
|
|
260
|
+
expect(store.size).toBe(0)
|
|
261
|
+
})
|
|
232
262
|
})
|
|
233
263
|
|
|
234
264
|
type Environment = { Variables: EdgeCache.Variables }
|
|
@@ -263,7 +293,8 @@ function memoryStore() {
|
|
|
263
293
|
|
|
264
294
|
function createApp(
|
|
265
295
|
options: {
|
|
266
|
-
eligibility?: ((c: Context<Environment>) => boolean) | undefined
|
|
296
|
+
eligibility?: readonly ((c: Context<Environment>) => boolean)[] | undefined
|
|
297
|
+
key?: ((c: Context<Environment>) => Promise<string> | string) | undefined
|
|
267
298
|
store?: Store.Store | undefined
|
|
268
299
|
} = {},
|
|
269
300
|
) {
|
|
@@ -281,10 +312,11 @@ function createApp(
|
|
|
281
312
|
// routes do; unmarked routes must skip the lookup entirely.
|
|
282
313
|
const cacheable_marked = EdgeCache.markCacheable(
|
|
283
314
|
createMiddleware<Environment>(async (_c, next) => next()),
|
|
315
|
+
{ key: options.key as (c: Context) => Promise<string> | string },
|
|
284
316
|
)
|
|
285
|
-
const
|
|
286
|
-
|
|
287
|
-
|
|
317
|
+
for (const predicate of options.eligibility ?? [])
|
|
318
|
+
EdgeCache.setEligibility(cacheable_marked, predicate)
|
|
319
|
+
const cacheable = cacheable_marked
|
|
288
320
|
app.get('/cached', cacheable, (c) => {
|
|
289
321
|
c.set('edgeCache', { maxAge: 30, staleWhileRevalidate: 300 })
|
|
290
322
|
c.header('Age', '123')
|
|
@@ -87,7 +87,13 @@ export function middleware<environment extends Env>(
|
|
|
87
87
|
// Query credentials must reach auth and never enter cache keys.
|
|
88
88
|
!new URL(c.req.url).searchParams.has('key') &&
|
|
89
89
|
isCacheableRoute(c)
|
|
90
|
-
const key = eligible
|
|
90
|
+
const key = eligible
|
|
91
|
+
? await routeCacheKey(c).catch(() => {
|
|
92
|
+
// Key generators may parse request input before route validation runs.
|
|
93
|
+
// Bypass caching so the validation middleware can return its response.
|
|
94
|
+
return undefined
|
|
95
|
+
})
|
|
96
|
+
: undefined
|
|
91
97
|
|
|
92
98
|
// Honor the standard request `Cache-Control` directives so a caller can
|
|
93
99
|
// refresh a stale entry on the colo serving them without any out-of-band
|
|
@@ -142,6 +148,7 @@ export function middleware<environment extends Env>(
|
|
|
142
148
|
// pays the store lookup only when a matched handler carries it.
|
|
143
149
|
const cacheableSymbol = Symbol('tempoApi.edgeCacheable')
|
|
144
150
|
const eligibility = new WeakMap<object, (c: Context) => boolean>()
|
|
151
|
+
const keys = new WeakMap<object, (c: Context) => Promise<string> | string>()
|
|
145
152
|
|
|
146
153
|
/**
|
|
147
154
|
* Marks a route handler/middleware as publishing an edge-cache policy, so
|
|
@@ -150,16 +157,28 @@ const eligibility = new WeakMap<object, (c: Context) => boolean>()
|
|
|
150
157
|
*/
|
|
151
158
|
export function markCacheable<const handler extends (...args: never[]) => unknown>(
|
|
152
159
|
handler: handler,
|
|
160
|
+
options: markCacheable.Options = {},
|
|
153
161
|
): handler {
|
|
162
|
+
if (options.key) keys.set(handler, options.key)
|
|
154
163
|
return Object.assign(handler, { [cacheableSymbol]: true })
|
|
155
164
|
}
|
|
156
165
|
|
|
157
|
-
|
|
166
|
+
export declare namespace markCacheable {
|
|
167
|
+
/** Options for marking a route as edge-cacheable. */
|
|
168
|
+
type Options = {
|
|
169
|
+
/** Cache key generator. Defaults to the request URL. */
|
|
170
|
+
key?: ((c: Context) => Promise<string> | string) | undefined
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Adds a request eligibility check; every check must permit caching. */
|
|
158
175
|
export function setEligibility<const handler extends (...args: never[]) => unknown>(
|
|
159
176
|
handler: handler,
|
|
160
177
|
predicate: (c: Context) => boolean,
|
|
161
178
|
): handler {
|
|
162
|
-
|
|
179
|
+
const existing = eligibility.get(handler)
|
|
180
|
+
if (cacheableSymbol in handler)
|
|
181
|
+
eligibility.set(handler, existing ? (c) => existing(c) && predicate(c) : predicate)
|
|
163
182
|
return handler
|
|
164
183
|
}
|
|
165
184
|
|
|
@@ -174,6 +193,16 @@ function isCacheableRoute(c: Context): boolean {
|
|
|
174
193
|
return cacheable
|
|
175
194
|
}
|
|
176
195
|
|
|
196
|
+
async function routeCacheKey(c: Context) {
|
|
197
|
+
let requestUrl = c.req.url
|
|
198
|
+
for (const route of matchedRoutes(c)) {
|
|
199
|
+
if (!(cacheableSymbol in route.handler)) continue
|
|
200
|
+
const key = keys.get(route.handler)
|
|
201
|
+
if (key) requestUrl = await key(c)
|
|
202
|
+
}
|
|
203
|
+
return cacheKey(requestUrl)
|
|
204
|
+
}
|
|
205
|
+
|
|
177
206
|
export declare namespace middleware {
|
|
178
207
|
/** Options for the edge-cache middleware. */
|
|
179
208
|
type Options = {
|
|
@@ -220,7 +249,7 @@ function serveHit(ifNoneMatch: string | undefined, value: string): Response {
|
|
|
220
249
|
const { body, encoding, headers, status } = JSON.parse(value) as Stored
|
|
221
250
|
const responseHeaders = new Headers(headers)
|
|
222
251
|
const etag = responseHeaders.get('etag')
|
|
223
|
-
if (
|
|
252
|
+
if (Etag.matches(etag, ifNoneMatch)) {
|
|
224
253
|
const notModified = new Headers()
|
|
225
254
|
for (const name of ['Cache-Control', 'ETag', 'Vary']) {
|
|
226
255
|
const header = responseHeaders.get(name)
|
|
@@ -269,9 +298,12 @@ function getWaitUntil(c: { executionCtx?: { waitUntil(promise: Promise<unknown>)
|
|
|
269
298
|
}
|
|
270
299
|
}
|
|
271
300
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
301
|
+
namespace Etag {
|
|
302
|
+
export function matches(etag: string | null, ifNoneMatch: string | undefined) {
|
|
303
|
+
if (!etag || !ifNoneMatch) return false
|
|
304
|
+
const strip = (tag: string) => tag.trim().replace(/^W\//, '')
|
|
305
|
+
return ifNoneMatch.split(',').some((tag) => strip(tag) === strip(etag))
|
|
306
|
+
}
|
|
275
307
|
}
|
|
276
308
|
|
|
277
309
|
/**
|
package/src/internal/Id.ts
CHANGED
|
@@ -22,3 +22,17 @@ export function generate(prefix: string): string {
|
|
|
22
22
|
export function random(): string {
|
|
23
23
|
return segment()
|
|
24
24
|
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Generates a time-prefixed resource id (`{prefix}_{epoch ms}_{24 base62
|
|
28
|
+
* chars}`). The epoch-ms is zero-padded to 15 digits (headroom past the year
|
|
29
|
+
* 5138) so lexical id order is chronological, letting newest-first lists page
|
|
30
|
+
* by keyset on the id alone.
|
|
31
|
+
*
|
|
32
|
+
* @param prefix - The resource-type prefix (e.g. `wh`, `ftr`).
|
|
33
|
+
* @param now - The timestamp to embed.
|
|
34
|
+
* @returns The generated id.
|
|
35
|
+
*/
|
|
36
|
+
export function generateSortable(prefix: string, now: Date = new Date()): string {
|
|
37
|
+
return `${prefix}_${now.getTime().toString().padStart(15, '0')}_${random()}`
|
|
38
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Hash, Hex } from 'ox'
|
|
2
|
+
|
|
3
|
+
import * as Idempotency from './Idempotency.js'
|
|
4
|
+
import * as Store from './Store.js'
|
|
5
|
+
import * as Ttl from './Ttl.js'
|
|
6
|
+
|
|
7
|
+
const identity = {
|
|
8
|
+
apiKeyId: 'key_test',
|
|
9
|
+
idempotencyKey: 'req_01j3j1k2l3m4n5p6q7r8s9t0u',
|
|
10
|
+
inputHash: `0x${'11'.repeat(32)}`,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function coordinator(namespace = 'test:v1') {
|
|
14
|
+
return Idempotency.create<{ id: string }>({
|
|
15
|
+
namespace,
|
|
16
|
+
pendingTtl: Ttl.minutes(1),
|
|
17
|
+
receiptTtl: Ttl.days(1),
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe('inputHash', () => {
|
|
22
|
+
test('binds semantic content instead of JSON property order', () => {
|
|
23
|
+
expect(Idempotency.inputHash({ a: 1, b: [{ d: 2, c: 3 }] })).toBe(
|
|
24
|
+
Idempotency.inputHash({ b: [{ c: 3, d: 2 }], a: 1 }),
|
|
25
|
+
)
|
|
26
|
+
expect(Idempotency.inputHash({ a: 1 })).not.toBe(Idempotency.inputHash({ a: 2 }))
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test('rejects values JSON cannot represent', () => {
|
|
30
|
+
expect(() => Idempotency.inputHash({ callback: () => {} })).toThrowErrorMatchingInlineSnapshot(
|
|
31
|
+
`[Error: Idempotency inputs must be JSON values.]`,
|
|
32
|
+
)
|
|
33
|
+
expect(() =>
|
|
34
|
+
Idempotency.inputHash({ values: [Number.NaN, Number.POSITIVE_INFINITY] }),
|
|
35
|
+
).toThrowErrorMatchingInlineSnapshot(`[Error: Idempotency inputs must be JSON values.]`)
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
describe('create', () => {
|
|
40
|
+
test('claims, blocks parallel requests, and replays the completed response', async () => {
|
|
41
|
+
const state = Store.memory()
|
|
42
|
+
const requests = coordinator()
|
|
43
|
+
|
|
44
|
+
const claimed = await requests.claim({ identity, state })
|
|
45
|
+
expect(claimed.type).toBe('claimed')
|
|
46
|
+
if (claimed.type !== 'claimed') return
|
|
47
|
+
await expect(requests.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
|
|
48
|
+
await expect(
|
|
49
|
+
requests.claim({ identity: { ...identity, inputHash: `0x${'22'.repeat(32)}` }, state }),
|
|
50
|
+
).resolves.toEqual({ type: 'mismatch' })
|
|
51
|
+
|
|
52
|
+
await requests.complete({ identity, response: { id: 'ftr_test' }, state, token: claimed.token })
|
|
53
|
+
await expect(requests.claim({ identity, state })).resolves.toEqual({
|
|
54
|
+
response: { id: 'ftr_test' },
|
|
55
|
+
type: 'replay',
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
test('fences completion and release by claim token', async () => {
|
|
60
|
+
const state = Store.memory()
|
|
61
|
+
const requests = coordinator()
|
|
62
|
+
const claimed = await requests.claim({ identity, state })
|
|
63
|
+
if (claimed.type !== 'claimed') throw new Error('Expected a claimed request.')
|
|
64
|
+
|
|
65
|
+
// A stale token can neither complete nor release the live claim.
|
|
66
|
+
await requests.complete({ identity, response: { id: 'stale' }, state, token: 'stale-token' })
|
|
67
|
+
await requests.release({ identity, state, token: 'stale-token' })
|
|
68
|
+
await expect(requests.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
|
|
69
|
+
|
|
70
|
+
await requests.release({ identity, state, token: claimed.token })
|
|
71
|
+
await expect(requests.claim({ identity, state })).resolves.toMatchObject({ type: 'claimed' })
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
test('rejects responses JSON cannot represent before completing', async () => {
|
|
75
|
+
const state = Store.memory()
|
|
76
|
+
const requests = Idempotency.create<void>({
|
|
77
|
+
namespace: 'test:v1',
|
|
78
|
+
pendingTtl: Ttl.minutes(1),
|
|
79
|
+
receiptTtl: Ttl.days(1),
|
|
80
|
+
})
|
|
81
|
+
const claimed = await requests.claim({ identity, state })
|
|
82
|
+
if (claimed.type !== 'claimed') throw new Error('Expected a claimed request.')
|
|
83
|
+
|
|
84
|
+
await expect(
|
|
85
|
+
requests.complete({ identity, response: undefined, state, token: claimed.token }),
|
|
86
|
+
).rejects.toThrowErrorMatchingInlineSnapshot(
|
|
87
|
+
`[Error: Idempotency responses must be JSON values.]`,
|
|
88
|
+
)
|
|
89
|
+
await expect(requests.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
test('isolates coordinators by namespace over one store', async () => {
|
|
93
|
+
const state = Store.memory()
|
|
94
|
+
const first = coordinator('first:v1')
|
|
95
|
+
const second = coordinator('second:v1')
|
|
96
|
+
|
|
97
|
+
await expect(first.claim({ identity, state })).resolves.toMatchObject({ type: 'claimed' })
|
|
98
|
+
await expect(second.claim({ identity, state })).resolves.toMatchObject({ type: 'claimed' })
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
test('preserves the durable key format consumers already stored', async () => {
|
|
102
|
+
const state = Store.memory()
|
|
103
|
+
await coordinator('mpp:relay:v1').claim({ identity, state })
|
|
104
|
+
const digest = Hash.sha256(Hex.fromString(identity.idempotencyKey)).slice(2)
|
|
105
|
+
expect((await state.list()).keys.map((key) => key.name)).toEqual([
|
|
106
|
+
`mpp:relay:v1:${identity.apiKeyId}:${digest}`,
|
|
107
|
+
])
|
|
108
|
+
})
|
|
109
|
+
})
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { Hash, Hex } from 'ox'
|
|
2
|
+
|
|
3
|
+
import * as Store from './Store.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* API-level retry coordination for idempotent write endpoints, letting a
|
|
7
|
+
* caller recover a successful response after a transport timeout.
|
|
8
|
+
*
|
|
9
|
+
* A key moves from missing to pending to complete. Only the claim token may
|
|
10
|
+
* finish or release pending state, preventing an older request from
|
|
11
|
+
* overwriting a newer owner.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** Identity for one caller-supplied idempotent request. */
|
|
15
|
+
export type Identity = {
|
|
16
|
+
/** API key that submitted the request. */
|
|
17
|
+
apiKeyId: string
|
|
18
|
+
/** Opaque caller-supplied idempotency key. */
|
|
19
|
+
idempotencyKey: string
|
|
20
|
+
/** Hash of the request content bound to this idempotency key. */
|
|
21
|
+
inputHash: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Returns a stable digest without retaining request contents in durable state. */
|
|
25
|
+
export function inputHash(input: unknown): string {
|
|
26
|
+
return Hash.sha256(Hex.fromString(canonicalJson(input)))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Creates an idempotency coordinator over one durable-store key namespace. */
|
|
30
|
+
export function create<response>(options: create.Options) {
|
|
31
|
+
const { namespace, pendingTtl, receiptTtl } = options
|
|
32
|
+
|
|
33
|
+
function keyFor(identity: Identity) {
|
|
34
|
+
// Scope keys to the authenticated API key so different tenants can reuse
|
|
35
|
+
// the same client-generated value. Hashing keeps that opaque value out of
|
|
36
|
+
// durable-store key names and enumeration output.
|
|
37
|
+
const digest = Hash.sha256(Hex.fromString(identity.idempotencyKey)).slice(2)
|
|
38
|
+
return `${namespace}:${identity.apiKeyId}:${digest}`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Claims a request or returns its current outcome. */
|
|
42
|
+
async function claim(options: claim.Options): Promise<claim.Result<response>> {
|
|
43
|
+
const { identity, state } = options
|
|
44
|
+
const token = crypto.randomUUID()
|
|
45
|
+
|
|
46
|
+
return Store.change<claim.Result<response>>(
|
|
47
|
+
state,
|
|
48
|
+
keyFor(identity),
|
|
49
|
+
(current) => {
|
|
50
|
+
const currentRecord = record<response>(current)
|
|
51
|
+
// A completed request is the only cacheable terminal outcome. Failed
|
|
52
|
+
// attempts must be retried with the same input. Legacy records lack
|
|
53
|
+
// an input hash, so cannot be safely replayed.
|
|
54
|
+
if (currentRecord && currentRecord.inputHash !== identity.inputHash)
|
|
55
|
+
return { op: 'noop', result: { type: 'mismatch' } }
|
|
56
|
+
if (currentRecord?.type === 'complete')
|
|
57
|
+
return { op: 'noop', result: { response: currentRecord.response, type: 'replay' } }
|
|
58
|
+
// A parallel request must not settle the same caller operation while
|
|
59
|
+
// the first request still owns its pending claim.
|
|
60
|
+
if (currentRecord?.type === 'pending') return { op: 'noop', result: { type: 'pending' } }
|
|
61
|
+
return {
|
|
62
|
+
op: 'set',
|
|
63
|
+
result: { token, type: 'claimed' },
|
|
64
|
+
value: encode({ inputHash: identity.inputHash, token, type: 'pending' }),
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
{ ttl: pendingTtl },
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Persists a successful response for an owned request claim. */
|
|
72
|
+
async function complete(options: complete.Options<response>): Promise<void> {
|
|
73
|
+
const { identity, response, state, token } = options
|
|
74
|
+
|
|
75
|
+
await Store.change(
|
|
76
|
+
state,
|
|
77
|
+
keyFor(identity),
|
|
78
|
+
(current) => {
|
|
79
|
+
const currentRecord = record<response>(current)
|
|
80
|
+
// Claim tokens fence delayed requests: a request cannot complete a
|
|
81
|
+
// claim it no longer owns after expiry or a later retry.
|
|
82
|
+
if (
|
|
83
|
+
currentRecord?.type !== 'pending' ||
|
|
84
|
+
currentRecord.inputHash !== identity.inputHash ||
|
|
85
|
+
currentRecord.token !== token
|
|
86
|
+
)
|
|
87
|
+
return { op: 'noop', result: undefined }
|
|
88
|
+
canonicalJson(response, 'Idempotency responses must be JSON values.')
|
|
89
|
+
return {
|
|
90
|
+
op: 'set',
|
|
91
|
+
result: undefined,
|
|
92
|
+
value: encode({ inputHash: identity.inputHash, response, type: 'complete' }),
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
{ ttl: receiptTtl },
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Releases an owned retryable request claim. */
|
|
100
|
+
async function release(options: release.Options): Promise<void> {
|
|
101
|
+
const { identity, state, token } = options
|
|
102
|
+
|
|
103
|
+
await Store.change(state, keyFor(identity), (current) => {
|
|
104
|
+
const currentRecord = record<response>(current)
|
|
105
|
+
// Never delete a newer pending claim after this request has lost
|
|
106
|
+
// ownership through expiry and another caller has retried.
|
|
107
|
+
if (
|
|
108
|
+
currentRecord?.type !== 'pending' ||
|
|
109
|
+
currentRecord.inputHash !== identity.inputHash ||
|
|
110
|
+
currentRecord.token !== token
|
|
111
|
+
)
|
|
112
|
+
return { op: 'noop', result: undefined }
|
|
113
|
+
return { op: 'delete', result: undefined }
|
|
114
|
+
})
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return { claim, complete, release }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export declare namespace create {
|
|
121
|
+
/** Coordinator configuration bound at creation. */
|
|
122
|
+
type Options = {
|
|
123
|
+
/** Durable-store key namespace (e.g. `mpp:relay:v1`). */
|
|
124
|
+
namespace: string
|
|
125
|
+
/** How long a pending claim blocks equivalent requests, in milliseconds. */
|
|
126
|
+
pendingTtl: number
|
|
127
|
+
/** How long a completed response replays, in milliseconds. */
|
|
128
|
+
receiptTtl: number
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export declare namespace claim {
|
|
133
|
+
/** Dependencies for claiming one idempotency key. */
|
|
134
|
+
type Options = {
|
|
135
|
+
/** API-key-scoped idempotency identity. */
|
|
136
|
+
identity: Identity
|
|
137
|
+
/** Authoritative state with atomic compare-and-swap, normally a Durable Object. */
|
|
138
|
+
state: Store.State
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Outcome from attempting to claim an idempotency key. */
|
|
142
|
+
type Result<response> =
|
|
143
|
+
| { token: string; type: 'claimed' }
|
|
144
|
+
| { type: 'mismatch' }
|
|
145
|
+
| { response: response; type: 'replay' }
|
|
146
|
+
| { type: 'pending' }
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export declare namespace complete {
|
|
150
|
+
/** Dependencies for persisting one terminal response. */
|
|
151
|
+
type Options<response> = {
|
|
152
|
+
/** API-key-scoped idempotency identity. */
|
|
153
|
+
identity: Identity
|
|
154
|
+
/** Terminal successful response to replay. */
|
|
155
|
+
response: response
|
|
156
|
+
/** Authoritative state with atomic compare-and-swap, normally a Durable Object. */
|
|
157
|
+
state: Store.State
|
|
158
|
+
/** Token returned by the successful claim. */
|
|
159
|
+
token: string
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export declare namespace release {
|
|
164
|
+
/** Dependencies for releasing one idempotency claim. */
|
|
165
|
+
type Options = {
|
|
166
|
+
/** API-key-scoped idempotency identity. */
|
|
167
|
+
identity: Identity
|
|
168
|
+
/** Authoritative state with atomic compare-and-swap, normally a Durable Object. */
|
|
169
|
+
state: Store.State
|
|
170
|
+
/** Token returned by the successful claim. */
|
|
171
|
+
token: string
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** A completed request whose response may be replayed until expiry. */
|
|
176
|
+
type CompleteRecord<response> = {
|
|
177
|
+
inputHash?: string
|
|
178
|
+
response: response
|
|
179
|
+
type: 'complete'
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** An in-flight request owned by the opaque claim token. */
|
|
183
|
+
type PendingRecord = {
|
|
184
|
+
inputHash?: string
|
|
185
|
+
token: string
|
|
186
|
+
type: 'pending'
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
type ParsedRecord = {
|
|
190
|
+
inputHash?: unknown
|
|
191
|
+
response?: unknown
|
|
192
|
+
token?: unknown
|
|
193
|
+
type?: unknown
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
type JsonRecord = { [key: string]: unknown }
|
|
197
|
+
|
|
198
|
+
function encode(record: CompleteRecord<unknown> | PendingRecord) {
|
|
199
|
+
return JSON.stringify(record)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function canonicalJson(
|
|
203
|
+
value: unknown,
|
|
204
|
+
errorMessage = 'Idempotency inputs must be JSON values.',
|
|
205
|
+
): string {
|
|
206
|
+
if (value === null) return 'null'
|
|
207
|
+
if (typeof value === 'number' && !Number.isFinite(value)) throw new Error(errorMessage)
|
|
208
|
+
if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string')
|
|
209
|
+
return JSON.stringify(value)
|
|
210
|
+
if (Array.isArray(value))
|
|
211
|
+
return `[${value.map((item) => canonicalJson(item, errorMessage)).join(',')}]`
|
|
212
|
+
if (typeof value === 'object') {
|
|
213
|
+
const record = value as JsonRecord
|
|
214
|
+
return `{${Object.keys(record)
|
|
215
|
+
.sort()
|
|
216
|
+
.map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key], errorMessage)}`)
|
|
217
|
+
.join(',')}}`
|
|
218
|
+
}
|
|
219
|
+
throw new Error(errorMessage)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function record<response>(
|
|
223
|
+
value: null | string,
|
|
224
|
+
): CompleteRecord<response> | PendingRecord | undefined {
|
|
225
|
+
if (value === null) return undefined
|
|
226
|
+
|
|
227
|
+
try {
|
|
228
|
+
const parsed: unknown = JSON.parse(value)
|
|
229
|
+
if (!parsed || typeof parsed !== 'object') return undefined
|
|
230
|
+
const candidate = parsed as ParsedRecord
|
|
231
|
+
if (candidate.type === 'pending' && typeof candidate.token === 'string')
|
|
232
|
+
return candidate as PendingRecord
|
|
233
|
+
if (candidate.type === 'complete' && candidate.response !== undefined)
|
|
234
|
+
return candidate as CompleteRecord<response>
|
|
235
|
+
} catch {}
|
|
236
|
+
return undefined
|
|
237
|
+
}
|
|
@@ -1,21 +1,54 @@
|
|
|
1
|
-
import type * as
|
|
1
|
+
import type * as FundingProvider from './funding/Provider.js'
|
|
2
2
|
import type * as Log from './Log.js'
|
|
3
3
|
|
|
4
|
-
test('
|
|
5
|
-
const provider = null as never as
|
|
4
|
+
test('accepts deployment-supplied funding provider identifiers', () => {
|
|
5
|
+
const provider = null as never as FundingProvider.ProviderId
|
|
6
6
|
const id: Log.FundingProviderAttempt['id'] = provider
|
|
7
|
-
const provider_roundTrip:
|
|
7
|
+
const provider_roundTrip: FundingProvider.ProviderId = id
|
|
8
8
|
void provider_roundTrip
|
|
9
9
|
|
|
10
10
|
const attempt = {
|
|
11
11
|
durationMs: 1,
|
|
12
12
|
id: 'relay',
|
|
13
|
-
operation: '
|
|
13
|
+
operation: 'getQuote',
|
|
14
14
|
outcome: 'available',
|
|
15
15
|
} satisfies Log.FundingProviderAttempt
|
|
16
16
|
void attempt
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const custom: Log.FundingProviderAttempt['id'] = 'custom-bridge'
|
|
19
|
+
void custom
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
test('bounds sponsorship diagnostics', () => {
|
|
23
|
+
const reasons = [
|
|
24
|
+
'api_key_forbidden',
|
|
25
|
+
'api_key_required',
|
|
26
|
+
'billing_past_due',
|
|
27
|
+
'billing_required',
|
|
28
|
+
'chain_id_unsupported',
|
|
29
|
+
'fee_token_unsupported',
|
|
30
|
+
'internal_error',
|
|
31
|
+
'production_api_key_required',
|
|
32
|
+
'spend_limit_exceeded',
|
|
33
|
+
'tx_fee_limit_exceeded',
|
|
34
|
+
] as const satisfies readonly Log.SponsorshipReason[]
|
|
35
|
+
expectTypeOf<(typeof reasons)[number]>().toEqualTypeOf<Log.SponsorshipReason>()
|
|
36
|
+
|
|
37
|
+
const sponsorship = {
|
|
38
|
+
chainId: 4217,
|
|
39
|
+
method: 'eth_signRawTransaction',
|
|
40
|
+
outcome: 'rejected',
|
|
41
|
+
payloadHash: `0x${'aa'.repeat(32)}`,
|
|
42
|
+
reason: 'production_api_key_required',
|
|
43
|
+
rejections: 1,
|
|
44
|
+
} satisfies Log.Sponsorship
|
|
45
|
+
void sponsorship
|
|
46
|
+
|
|
47
|
+
// @ts-expect-error arbitrary method names would create unbounded log values
|
|
48
|
+
const method: Log.SponsorshipMethod = 'wallet_userControlled'
|
|
49
|
+
void method
|
|
50
|
+
|
|
51
|
+
// @ts-expect-error arbitrary reasons would create unbounded log values
|
|
52
|
+
const reason: Log.SponsorshipReason = 'user_controlled_reason'
|
|
53
|
+
void reason
|
|
21
54
|
})
|