tapimo 0.0.0 → 0.0.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/LICENSE +21 -0
- package/README.md +119 -0
- package/dist/ApiKey.d.ts +65 -0
- package/dist/ApiKey.d.ts.map +1 -0
- package/dist/ApiKey.js +105 -0
- package/dist/ApiKey.js.map +1 -0
- package/dist/ApiKeySource.d.ts +166 -0
- package/dist/ApiKeySource.d.ts.map +1 -0
- package/dist/ApiKeySource.js +234 -0
- package/dist/ApiKeySource.js.map +1 -0
- package/dist/App.d.ts +19317 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +612 -0
- package/dist/App.js.map +1 -0
- package/dist/Assets.d.ts +44 -0
- package/dist/Assets.d.ts.map +1 -0
- package/dist/Assets.js +23 -0
- package/dist/Assets.js.map +1 -0
- package/dist/Auth.d.ts +2 -0
- package/dist/Auth.d.ts.map +1 -0
- package/dist/Auth.js +2 -0
- package/dist/Auth.js.map +1 -0
- package/dist/Cli.d.ts +21 -0
- package/dist/Cli.d.ts.map +1 -0
- package/dist/Cli.js +13 -0
- package/dist/Cli.js.map +1 -0
- package/dist/Client.d.ts +20 -0
- package/dist/Client.d.ts.map +1 -0
- package/dist/Client.js +24 -0
- package/dist/Client.js.map +1 -0
- package/dist/Metrics.d.ts +70 -0
- package/dist/Metrics.d.ts.map +1 -0
- package/dist/Metrics.js +91 -0
- package/dist/Metrics.js.map +1 -0
- package/dist/Scope.d.ts +35 -0
- package/dist/Scope.d.ts.map +1 -0
- package/dist/Scope.js +38 -0
- package/dist/Scope.js.map +1 -0
- package/dist/Webhooks.d.ts +79 -0
- package/dist/Webhooks.d.ts.map +1 -0
- package/dist/Webhooks.js +107 -0
- package/dist/Webhooks.js.map +1 -0
- package/dist/admin/Access.d.ts +41 -0
- package/dist/admin/Access.d.ts.map +1 -0
- package/dist/admin/Access.js +75 -0
- package/dist/admin/Access.js.map +1 -0
- package/dist/admin/App.d.ts +1221 -0
- package/dist/admin/App.d.ts.map +1 -0
- package/dist/admin/App.js +113 -0
- package/dist/admin/App.js.map +1 -0
- package/dist/admin/apps/api-keys.d.ts +209 -0
- package/dist/admin/apps/api-keys.d.ts.map +1 -0
- package/dist/admin/apps/api-keys.js +129 -0
- package/dist/admin/apps/api-keys.js.map +1 -0
- package/dist/admin/apps/scopes.d.ts +46 -0
- package/dist/admin/apps/scopes.d.ts.map +1 -0
- package/dist/admin/apps/scopes.js +41 -0
- package/dist/admin/apps/scopes.js.map +1 -0
- package/dist/admin/apps/verified-tokens.d.ts +1206 -0
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -0
- package/dist/admin/apps/verified-tokens.js +485 -0
- package/dist/admin/apps/verified-tokens.js.map +1 -0
- package/dist/admin/index.d.ts +3 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +3 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/ui.generated.d.ts +11 -0
- package/dist/admin/ui.generated.d.ts.map +1 -0
- package/dist/admin/ui.generated.js +43 -0
- package/dist/admin/ui.generated.js.map +1 -0
- package/dist/apps/activities.d.ts +18725 -0
- package/dist/apps/activities.d.ts.map +1 -0
- package/dist/apps/activities.js +3138 -0
- package/dist/apps/activities.js.map +1 -0
- package/dist/apps/addresses.d.ts +3662 -0
- package/dist/apps/addresses.d.ts.map +1 -0
- package/dist/apps/addresses.js +22 -0
- package/dist/apps/addresses.js.map +1 -0
- package/dist/apps/balances.d.ts +342 -0
- package/dist/apps/balances.d.ts.map +1 -0
- package/dist/apps/balances.js +393 -0
- package/dist/apps/balances.js.map +1 -0
- package/dist/apps/blocks.d.ts +931 -0
- package/dist/apps/blocks.d.ts.map +1 -0
- package/dist/apps/blocks.js +689 -0
- package/dist/apps/blocks.js.map +1 -0
- package/dist/apps/coingecko.d.ts +1053 -0
- package/dist/apps/coingecko.d.ts.map +1 -0
- package/dist/apps/coingecko.js +1015 -0
- package/dist/apps/coingecko.js.map +1 -0
- package/dist/apps/exchanges.d.ts +3000 -0
- package/dist/apps/exchanges.d.ts.map +1 -0
- package/dist/apps/exchanges.js +3570 -0
- package/dist/apps/exchanges.js.map +1 -0
- package/dist/apps/fee-amm.d.ts +640 -0
- package/dist/apps/fee-amm.d.ts.map +1 -0
- package/dist/apps/fee-amm.js +815 -0
- package/dist/apps/fee-amm.js.map +1 -0
- package/dist/apps/indexer.d.ts +116 -0
- package/dist/apps/indexer.d.ts.map +1 -0
- package/dist/apps/indexer.js +270 -0
- package/dist/apps/indexer.js.map +1 -0
- package/dist/apps/receipts.d.ts +1438 -0
- package/dist/apps/receipts.d.ts.map +1 -0
- package/dist/apps/receipts.js +874 -0
- package/dist/apps/receipts.js.map +1 -0
- package/dist/apps/rpc.d.ts +173 -0
- package/dist/apps/rpc.d.ts.map +1 -0
- package/dist/apps/rpc.js +191 -0
- package/dist/apps/rpc.js.map +1 -0
- package/dist/apps/tokenlist.d.ts +192 -0
- package/dist/apps/tokenlist.d.ts.map +1 -0
- package/dist/apps/tokenlist.js +153 -0
- package/dist/apps/tokenlist.js.map +1 -0
- package/dist/apps/tokens.d.ts +2246 -0
- package/dist/apps/tokens.d.ts.map +1 -0
- package/dist/apps/tokens.js +1789 -0
- package/dist/apps/tokens.js.map +1 -0
- package/dist/apps/transactions.d.ts +2327 -0
- package/dist/apps/transactions.d.ts.map +1 -0
- package/dist/apps/transactions.js +975 -0
- package/dist/apps/transactions.js.map +1 -0
- package/dist/apps/transfers.d.ts +589 -0
- package/dist/apps/transfers.d.ts.map +1 -0
- package/dist/apps/transfers.js +769 -0
- package/dist/apps/transfers.js.map +1 -0
- package/dist/apps/verified-tokens.d.ts +544 -0
- package/dist/apps/verified-tokens.d.ts.map +1 -0
- package/dist/apps/verified-tokens.js +234 -0
- package/dist/apps/verified-tokens.js.map +1 -0
- package/dist/apps/webhooks.d.ts +7684 -0
- package/dist/apps/webhooks.d.ts.map +1 -0
- package/dist/apps/webhooks.js +2112 -0
- package/dist/apps/webhooks.js.map +1 -0
- package/dist/cloudflare.d.ts +32 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +45 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/Auth.d.ts +298 -0
- package/dist/internal/Auth.d.ts.map +1 -0
- package/dist/internal/Auth.js +618 -0
- package/dist/internal/Auth.js.map +1 -0
- package/dist/internal/Cache.d.ts +74 -0
- package/dist/internal/Cache.d.ts.map +1 -0
- package/dist/internal/Cache.js +215 -0
- package/dist/internal/Cache.js.map +1 -0
- package/dist/internal/Cursor.d.ts +79 -0
- package/dist/internal/Cursor.d.ts.map +1 -0
- package/dist/internal/Cursor.js +116 -0
- package/dist/internal/Cursor.js.map +1 -0
- package/dist/internal/EdgeCache.d.ts +59 -0
- package/dist/internal/EdgeCache.d.ts.map +1 -0
- package/dist/internal/EdgeCache.js +174 -0
- package/dist/internal/EdgeCache.js.map +1 -0
- package/dist/internal/Log.d.ts +104 -0
- package/dist/internal/Log.d.ts.map +1 -0
- package/dist/internal/Log.js +118 -0
- package/dist/internal/Log.js.map +1 -0
- package/dist/internal/MetricSink.d.ts +65 -0
- package/dist/internal/MetricSink.d.ts.map +1 -0
- package/dist/internal/MetricSink.js +146 -0
- package/dist/internal/MetricSink.js.map +1 -0
- package/dist/internal/Mpp.d.ts +71 -0
- package/dist/internal/Mpp.d.ts.map +1 -0
- package/dist/internal/Mpp.js +105 -0
- package/dist/internal/Mpp.js.map +1 -0
- package/dist/internal/OpenApi.d.ts +313 -0
- package/dist/internal/OpenApi.d.ts.map +1 -0
- package/dist/internal/OpenApi.fonts.d.ts +2 -0
- package/dist/internal/OpenApi.fonts.d.ts.map +1 -0
- package/dist/internal/OpenApi.fonts.js +39 -0
- package/dist/internal/OpenApi.fonts.js.map +1 -0
- package/dist/internal/OpenApi.js +335 -0
- package/dist/internal/OpenApi.js.map +1 -0
- package/dist/internal/OpenApi.logo.d.ts +6 -0
- package/dist/internal/OpenApi.logo.d.ts.map +1 -0
- package/dist/internal/OpenApi.logo.js +19 -0
- package/dist/internal/OpenApi.logo.js.map +1 -0
- package/dist/internal/Path.d.ts +5 -0
- package/dist/internal/Path.d.ts.map +1 -0
- package/dist/internal/Path.js +16 -0
- package/dist/internal/Path.js.map +1 -0
- package/dist/internal/RateLimit.d.ts +60 -0
- package/dist/internal/RateLimit.d.ts.map +1 -0
- package/dist/internal/RateLimit.js +48 -0
- package/dist/internal/RateLimit.js.map +1 -0
- package/dist/internal/Response.d.ts +132 -0
- package/dist/internal/Response.d.ts.map +1 -0
- package/dist/internal/Response.js +72 -0
- package/dist/internal/Response.js.map +1 -0
- package/dist/internal/Schema.d.ts +257 -0
- package/dist/internal/Schema.d.ts.map +1 -0
- package/dist/internal/Schema.js +360 -0
- package/dist/internal/Schema.js.map +1 -0
- package/dist/internal/Store.d.ts +204 -0
- package/dist/internal/Store.d.ts.map +1 -0
- package/dist/internal/Store.js +291 -0
- package/dist/internal/Store.js.map +1 -0
- package/dist/internal/Tidx.d.ts +120 -0
- package/dist/internal/Tidx.d.ts.map +1 -0
- package/dist/internal/Tidx.js +156 -0
- package/dist/internal/Tidx.js.map +1 -0
- package/dist/internal/Timing.d.ts +22 -0
- package/dist/internal/Timing.d.ts.map +1 -0
- package/dist/internal/Timing.js +32 -0
- package/dist/internal/Timing.js.map +1 -0
- package/dist/internal/Ttl.d.ts +25 -0
- package/dist/internal/Ttl.d.ts.map +1 -0
- package/dist/internal/Ttl.js +49 -0
- package/dist/internal/Ttl.js.map +1 -0
- package/dist/internal/Value.d.ts +47 -0
- package/dist/internal/Value.d.ts.map +1 -0
- package/dist/internal/Value.js +122 -0
- package/dist/internal/Value.js.map +1 -0
- package/dist/internal/VerifiedTokens.d.ts +228 -0
- package/dist/internal/VerifiedTokens.d.ts.map +1 -0
- package/dist/internal/VerifiedTokens.js +450 -0
- package/dist/internal/VerifiedTokens.js.map +1 -0
- package/dist/internal/Viem.d.ts +2082 -0
- package/dist/internal/Viem.d.ts.map +1 -0
- package/dist/internal/Viem.js +63 -0
- package/dist/internal/Viem.js.map +1 -0
- package/dist/internal/WebhookDestination.d.ts +198 -0
- package/dist/internal/WebhookDestination.d.ts.map +1 -0
- package/dist/internal/WebhookDestination.js +170 -0
- package/dist/internal/WebhookDestination.js.map +1 -0
- package/dist/internal/Webhooks.d.ts +433 -0
- package/dist/internal/Webhooks.d.ts.map +1 -0
- package/dist/internal/Webhooks.js +489 -0
- package/dist/internal/Webhooks.js.map +1 -0
- package/dist/internal/webhookDestinations/betterStack.d.ts +26 -0
- package/dist/internal/webhookDestinations/betterStack.d.ts.map +1 -0
- package/dist/internal/webhookDestinations/betterStack.js +76 -0
- package/dist/internal/webhookDestinations/betterStack.js.map +1 -0
- package/dist/internal/webhookDestinations/slack.d.ts +59 -0
- package/dist/internal/webhookDestinations/slack.d.ts.map +1 -0
- package/dist/internal/webhookDestinations/slack.js +422 -0
- package/dist/internal/webhookDestinations/slack.js.map +1 -0
- package/dist/internal/webhookDestinations/url.d.ts +17 -0
- package/dist/internal/webhookDestinations/url.d.ts.map +1 -0
- package/dist/internal/webhookDestinations/url.js +130 -0
- package/dist/internal/webhookDestinations/url.js.map +1 -0
- package/dist/openrpc.json +5302 -0
- package/package.json +46 -4
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000000.svg +1 -0
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000001.svg +1 -0
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000002.svg +1 -0
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000003.svg +1 -0
- package/seeds/31318/verified-tokens.json +30 -0
- package/seeds/4217/icons/0x20c0000000000000000000000000000000000000.svg +25 -0
- package/seeds/4217/icons/0x20c000000000000000000000048c8f36df1c9a4a.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000000520792dcccccccc.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000000a6da882d075a4c3.svg +4 -0
- package/seeds/4217/icons/0x20c000000000000000000000111111111e910f0f.svg +30 -0
- package/seeds/4217/icons/0x20c00000000000000000000014f22ca97301eb73.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000001621e21f71cf12fb.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000002f52d5cc21a3207b.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000003158081efd85bfc2.svg +11 -0
- package/seeds/4217/icons/0x20c0000000000000000000003554d28269e0f3c2.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000383a23bacb546ab9.svg +1 -0
- package/seeds/4217/icons/0x20c00000000000000000000042109aef2f8b28e1.png +0 -0
- package/seeds/4217/icons/0x20c0000000000000000000005c0bac7cef389a11.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000006fd9a167923ba194.png +0 -0
- package/seeds/4217/icons/0x20c0000000000000000000007f7ba549dd0251b9.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000008191667423f70e67.svg +5 -0
- package/seeds/4217/icons/0x20c0000000000000000000008ee4fcff88888888.svg +1 -0
- package/seeds/4217/icons/0x20c0000000000000000000009a4a4b17e0dc6651.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000ab02d39df30bd17e.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000ae247a1130450f09.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000aeed2ec36a54d0e5.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000b9537d11c60e8b50.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000bd95bfb69fbe6ce3.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000c412ec89d0c08be5.svg +1 -0
- package/seeds/4217/icons/0x20c000000000000000000000f047dd7018e50367.png +0 -0
- package/seeds/4217/verified-tokens.json +177 -0
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000000.svg +25 -0
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000001.svg +1 -0
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000002.svg +1 -0
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000003.svg +1 -0
- package/seeds/42431/icons/0x20c0000000000000000000009e8d7eb59b783726.svg +1 -0
- package/seeds/42431/icons/0x20c000000000000000000000d72572838bbee59c.svg +1 -0
- package/seeds/42431/verified-tokens.json +44 -0
- package/seeds/openrpc/README.md +27 -0
- package/seeds/openrpc/execution-apis.json +8989 -0
- package/src/ApiKey.test.ts +91 -0
- package/src/ApiKey.ts +122 -0
- package/src/ApiKeySource.test-d.ts +11 -0
- package/src/ApiKeySource.test.ts +295 -0
- package/src/ApiKeySource.ts +303 -0
- package/src/App.test-d.ts +38 -0
- package/src/App.test.ts +65927 -0
- package/src/App.ts +855 -0
- package/src/Assets.ts +58 -0
- package/src/Auth.ts +1 -0
- package/src/Cli.test.ts +81 -0
- package/src/Cli.ts +38 -0
- package/src/Client.test-d.ts +1438 -0
- package/src/Client.test.ts +134 -0
- package/src/Client.ts +45 -0
- package/src/Metrics.ts +154 -0
- package/src/Scope.ts +50 -0
- package/src/Webhooks.test.ts +49 -0
- package/src/Webhooks.ts +172 -0
- package/src/admin/Access.test.ts +130 -0
- package/src/admin/Access.ts +87 -0
- package/src/admin/App.test.ts +225 -0
- package/src/admin/App.ts +216 -0
- package/src/admin/apps/api-keys.test.ts +156 -0
- package/src/admin/apps/api-keys.ts +157 -0
- package/src/admin/apps/scopes.test.ts +52 -0
- package/src/admin/apps/scopes.ts +47 -0
- package/src/admin/apps/verified-tokens.test.ts +415 -0
- package/src/admin/apps/verified-tokens.ts +566 -0
- package/src/admin/index.ts +2 -0
- package/src/admin/ui/plugin.ts +135 -0
- package/src/admin/ui/src/components/Checkbox.tsx +22 -0
- package/src/admin/ui/src/components/Dialog.tsx +32 -0
- package/src/admin/ui/src/components/MobileProfile.tsx +31 -0
- package/src/admin/ui/src/components/Page.tsx +53 -0
- package/src/admin/ui/src/components/TempoLogo.tsx +37 -0
- package/src/admin/ui/src/fonts/Pilat-Demi.woff2 +0 -0
- package/src/admin/ui/src/fonts/Pilat-Regular.woff2 +0 -0
- package/src/admin/ui/src/lib/api-keys.ts +63 -0
- package/src/admin/ui/src/lib/client.ts +15 -0
- package/src/admin/ui/src/lib/config.ts +57 -0
- package/src/admin/ui/src/lib/query-client.ts +26 -0
- package/src/admin/ui/src/lib/scopes.ts +25 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +89 -0
- package/src/admin/ui/src/lib/wagmi.ts +18 -0
- package/src/admin/ui/src/routeTree.gen.ts +104 -0
- package/src/admin/ui/src/router.tsx +25 -0
- package/src/admin/ui/src/routes/__root.tsx +219 -0
- package/src/admin/ui/src/routes/api-keys.tsx +329 -0
- package/src/admin/ui/src/routes/index.tsx +7 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +331 -0
- package/src/admin/ui/src/styles.css +20 -0
- package/src/admin/ui/tsconfig.json +16 -0
- package/src/admin/ui/vite.config.ts +29 -0
- package/src/admin/ui.generated.ts +60 -0
- package/src/apps/activities.test.ts +1020 -0
- package/src/apps/activities.ts +3934 -0
- package/src/apps/addresses.ts +24 -0
- package/src/apps/balances.test.ts +274 -0
- package/src/apps/balances.ts +533 -0
- package/src/apps/blocks.test.ts +385 -0
- package/src/apps/blocks.ts +896 -0
- package/src/apps/coingecko.test.ts +218 -0
- package/src/apps/coingecko.ts +1383 -0
- package/src/apps/exchanges.test.ts +958 -0
- package/src/apps/exchanges.ts +4773 -0
- package/src/apps/fee-amm.test.ts +321 -0
- package/src/apps/fee-amm.ts +1121 -0
- package/src/apps/indexer.test.ts +153 -0
- package/src/apps/indexer.ts +330 -0
- package/src/apps/receipts.test.ts +285 -0
- package/src/apps/receipts.ts +1193 -0
- package/src/apps/rpc.test.ts +302 -0
- package/src/apps/rpc.ts +222 -0
- package/src/apps/tokenlist.test.ts +80 -0
- package/src/apps/tokenlist.ts +207 -0
- package/src/apps/tokens.test.ts +1062 -0
- package/src/apps/tokens.ts +2292 -0
- package/src/apps/transactions.test.ts +408 -0
- package/src/apps/transactions.ts +1363 -0
- package/src/apps/transfers.test.ts +371 -0
- package/src/apps/transfers.ts +1116 -0
- package/src/apps/verified-tokens.test.ts +114 -0
- package/src/apps/verified-tokens.ts +295 -0
- package/src/apps/webhooks.test.ts +1937 -0
- package/src/apps/webhooks.ts +2926 -0
- package/src/cloudflare.ts +55 -0
- package/src/index.ts +15 -0
- package/src/internal/Auth.test.ts +980 -0
- package/src/internal/Auth.ts +1012 -0
- package/src/internal/Cache.test.ts +240 -0
- package/src/internal/Cache.ts +262 -0
- package/src/internal/Cursor.test.ts +100 -0
- package/src/internal/Cursor.ts +149 -0
- package/src/internal/EdgeCache.test.ts +234 -0
- package/src/internal/EdgeCache.ts +224 -0
- package/src/internal/Errors.ts +14 -0
- package/src/internal/Log.test.ts +244 -0
- package/src/internal/Log.ts +216 -0
- package/src/internal/MetricSink.ts +220 -0
- package/src/internal/Mpp.test.ts +64 -0
- package/src/internal/Mpp.ts +141 -0
- package/src/internal/OpenApi.fonts.ts +38 -0
- package/src/internal/OpenApi.logo.ts +18 -0
- package/src/internal/OpenApi.ts +488 -0
- package/src/internal/Path.test.ts +14 -0
- package/src/internal/Path.ts +15 -0
- package/src/internal/RateLimit.test.ts +93 -0
- package/src/internal/RateLimit.ts +93 -0
- package/src/internal/Response.ts +131 -0
- package/src/internal/Schema.test.ts +34 -0
- package/src/internal/Schema.ts +523 -0
- package/src/internal/Store.test.ts +545 -0
- package/src/internal/Store.ts +526 -0
- package/src/internal/Tidx.local.test.ts +33 -0
- package/src/internal/Tidx.test.ts +294 -0
- package/src/internal/Tidx.ts +238 -0
- package/src/internal/Timing.test.ts +22 -0
- package/src/internal/Timing.ts +62 -0
- package/src/internal/Ttl.test.ts +18 -0
- package/src/internal/Ttl.ts +59 -0
- package/src/internal/Value.ts +114 -0
- package/src/internal/VerifiedTokens.test.ts +333 -0
- package/src/internal/VerifiedTokens.ts +645 -0
- package/src/internal/Viem.test.ts +115 -0
- package/src/internal/Viem.ts +165 -0
- package/src/internal/WebhookDestination.test.ts +648 -0
- package/src/internal/WebhookDestination.ts +331 -0
- package/src/internal/Webhooks.test.ts +668 -0
- package/src/internal/Webhooks.ts +940 -0
- package/src/internal/webhookDestinations/betterStack.ts +91 -0
- package/src/internal/webhookDestinations/slack.ts +496 -0
- package/src/internal/webhookDestinations/url.ts +128 -0
- package/src/openrpc.json +5302 -0
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
import { createMiddleware } from 'hono/factory';
|
|
2
|
+
import { matchedRoutes } from 'hono/route';
|
|
3
|
+
import { findTargetHandler } from 'hono/utils/handler';
|
|
4
|
+
import { Credential } from 'mppx';
|
|
5
|
+
import { Mppx, tempo } from 'mppx/hono';
|
|
6
|
+
import * as ApiKeySource from '../ApiKeySource.js';
|
|
7
|
+
import * as ApiKey from '../ApiKey.js';
|
|
8
|
+
import * as OpenApi from './OpenApi.js';
|
|
9
|
+
import * as RateLimit from './RateLimit.js';
|
|
10
|
+
import * as Response from './Response.js';
|
|
11
|
+
import * as Schema from './Schema.js';
|
|
12
|
+
import * as Scope from '../Scope.js';
|
|
13
|
+
import * as Viem from './Viem.js';
|
|
14
|
+
const policySymbol = Symbol('tempo-api.auth.policy');
|
|
15
|
+
/** Reads the authenticated principal from a Hono context. */
|
|
16
|
+
export function getPrincipal(c) {
|
|
17
|
+
return c.get('principal') ?? null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Always false at runtime, but typed as `boolean` so handlers can include a
|
|
21
|
+
* never-reached access-error branch in Hono's inferred response union.
|
|
22
|
+
*/
|
|
23
|
+
export const narrowAccess = false;
|
|
24
|
+
/** Typed auth/payment error response for Hono client inference. Never reached at runtime. */
|
|
25
|
+
export function accessError(c) {
|
|
26
|
+
const status = Number(c.req.header('tempo-narrow-access-status'));
|
|
27
|
+
if (status === 400)
|
|
28
|
+
return Response.error(c, {
|
|
29
|
+
code: 'api_key_malformed',
|
|
30
|
+
message: 'Malformed API key',
|
|
31
|
+
status: 400,
|
|
32
|
+
});
|
|
33
|
+
if (status === 401) {
|
|
34
|
+
const code = c.req.header('tempo-narrow-access-code') === 'api_key_missing'
|
|
35
|
+
? 'api_key_missing'
|
|
36
|
+
: 'api_key_invalid';
|
|
37
|
+
return Response.error(c, {
|
|
38
|
+
code,
|
|
39
|
+
message: 'Missing or invalid API key',
|
|
40
|
+
status: 401,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (status === 403)
|
|
44
|
+
return Response.error(c, {
|
|
45
|
+
code: 'api_key_forbidden',
|
|
46
|
+
message: 'API key missing required scope',
|
|
47
|
+
status: 403,
|
|
48
|
+
});
|
|
49
|
+
const code = c.req.header('tempo-narrow-access-code') === 'rate_limit_exceeded'
|
|
50
|
+
? 'rate_limit_exceeded'
|
|
51
|
+
: 'payment_required';
|
|
52
|
+
return Response.error(c, {
|
|
53
|
+
code,
|
|
54
|
+
message: 'Payment required or rate limit exceeded',
|
|
55
|
+
status: 429,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** Typed auth/payment error response for Hono client inference. Never reached at runtime. */
|
|
59
|
+
export function paidAccessError(c) {
|
|
60
|
+
const status = Number(c.req.header('tempo-narrow-access-status'));
|
|
61
|
+
if (status !== 402)
|
|
62
|
+
return accessError(c);
|
|
63
|
+
// MPP owns the 402 challenge body and headers; it is intentionally not the
|
|
64
|
+
// API's JSON error envelope.
|
|
65
|
+
return c.body(null, 402);
|
|
66
|
+
}
|
|
67
|
+
/** Creates auth middleware for protected OpenAPI routes. */
|
|
68
|
+
export function middleware(options) {
|
|
69
|
+
const { charge = {}, ...mpp } = options.mpp === false ? {} : (options.mpp ?? {});
|
|
70
|
+
const defaults = laneDefaults(options);
|
|
71
|
+
const base = basePolicy(options, defaults);
|
|
72
|
+
// Resolution is cached per isolate by default (positive 60s / negative 10s,
|
|
73
|
+
// keyed by token sha256 — see `ApiKeySource.cached`) so hot keys skip the
|
|
74
|
+
// backend read on the auth path of every request. Pass `apiKey.cache: false`
|
|
75
|
+
// when instant revocation matters more than the per-request read.
|
|
76
|
+
const source = (() => {
|
|
77
|
+
if (options.apiKey === false || !options.apiKey?.source)
|
|
78
|
+
return ApiKeySource.noop;
|
|
79
|
+
if (options.apiKey.cache === false)
|
|
80
|
+
return options.apiKey.source;
|
|
81
|
+
return ApiKeySource.cached(options.apiKey.source, options.apiKey.cache);
|
|
82
|
+
})();
|
|
83
|
+
const auth = {
|
|
84
|
+
...(options.apiKey === false
|
|
85
|
+
? {}
|
|
86
|
+
: {
|
|
87
|
+
apiKey: {
|
|
88
|
+
...(options.apiKey?.rateLimits ? { rateLimits: options.apiKey.rateLimits } : {}),
|
|
89
|
+
source,
|
|
90
|
+
},
|
|
91
|
+
}),
|
|
92
|
+
...(options.mpp === false
|
|
93
|
+
? {}
|
|
94
|
+
: {
|
|
95
|
+
mpp: Mppx.create({
|
|
96
|
+
...mpp,
|
|
97
|
+
methods: [tempo.charge({ amount: '0.001', ...charge })],
|
|
98
|
+
secretKey: mpp.secretKey ?? crypto.randomUUID(),
|
|
99
|
+
}),
|
|
100
|
+
}),
|
|
101
|
+
rateLimit: RateLimit.memory(options.rateLimit),
|
|
102
|
+
};
|
|
103
|
+
return createMiddleware((c, next) => {
|
|
104
|
+
const route = openApiRoute(c);
|
|
105
|
+
if (!route)
|
|
106
|
+
return next();
|
|
107
|
+
const { key, description } = route;
|
|
108
|
+
const overrides = options.overrides;
|
|
109
|
+
const endpointPolicy = resolvePolicy(base, defaults, [...policies(c), overrides?.[key]], description);
|
|
110
|
+
if (!endpointPolicy)
|
|
111
|
+
return next();
|
|
112
|
+
c.set('auth', auth);
|
|
113
|
+
return require(endpointPolicy)(c, next);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/** Creates route middleware that contributes an auth policy override. */
|
|
117
|
+
export function policy(options) {
|
|
118
|
+
const middleware = createMiddleware((_, next) => next());
|
|
119
|
+
middleware[policySymbol] = options;
|
|
120
|
+
return middleware;
|
|
121
|
+
}
|
|
122
|
+
function laneDefaults(options) {
|
|
123
|
+
const apiKey = options.apiKey === false ? undefined : options.apiKey;
|
|
124
|
+
const public_ = options.public === false ? undefined : options.public;
|
|
125
|
+
return {
|
|
126
|
+
apiKey: {
|
|
127
|
+
// `rateLimit` is intentionally omitted: `policy.apiKey.rateLimit` means an
|
|
128
|
+
// explicit per-route cap (precedence tier 2), not the config default. The
|
|
129
|
+
// config default (tier 5) lives on `auth.apiKey.rateLimits['*']` and is
|
|
130
|
+
// applied by `resolveApiKeyLimit` at consume time.
|
|
131
|
+
//
|
|
132
|
+
// Default-closed to a full-access key: a route that declares no scopes
|
|
133
|
+
// requires the `'*'` wildcard, so a narrowly-scoped key only reaches
|
|
134
|
+
// routes that explicitly grant its scope. Routes opt into specific
|
|
135
|
+
// catalog scopes via `Auth.policy`.
|
|
136
|
+
scopes: apiKey?.scopes ?? [Scope.wildcard],
|
|
137
|
+
},
|
|
138
|
+
mpp: { charge: {} },
|
|
139
|
+
public: { rateLimit: public_?.rateLimit ?? { perMinute: 60 } },
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Base policy before route overrides. Default-closed except the API-key lane:
|
|
144
|
+
* a route that declares nothing is API-key-only, and must opt into the public
|
|
145
|
+
* and paid lanes explicitly. This makes a partial override fail safe — omitting
|
|
146
|
+
* a lane leaves it closed rather than silently inheriting open access.
|
|
147
|
+
*/
|
|
148
|
+
function basePolicy(options, defaults) {
|
|
149
|
+
return options.apiKey === false ? {} : { apiKey: defaults.apiKey };
|
|
150
|
+
}
|
|
151
|
+
function resolvePolicy(base, defaults, overrides, description) {
|
|
152
|
+
let apiKey = base.apiKey;
|
|
153
|
+
let mpp = base.mpp;
|
|
154
|
+
let public_ = base.public;
|
|
155
|
+
for (const override of overrides) {
|
|
156
|
+
if (override === false)
|
|
157
|
+
return undefined;
|
|
158
|
+
if (!override)
|
|
159
|
+
continue;
|
|
160
|
+
apiKey = resolveApiKeyLane(apiKey, override.apiKey, defaults.apiKey);
|
|
161
|
+
mpp = resolveMppLane(mpp, override.mpp, defaults.mpp);
|
|
162
|
+
public_ = resolvePublicLane(public_, override.public, defaults.public);
|
|
163
|
+
}
|
|
164
|
+
// The OpenAPI summary/description rides along as the payment-challenge
|
|
165
|
+
// description. It is metadata, not a policy override, so it only applies when
|
|
166
|
+
// the paid lane is actually enabled and has no explicit description already.
|
|
167
|
+
if (mpp && description !== undefined && mpp.charge.description === undefined)
|
|
168
|
+
mpp = { charge: { ...mpp.charge, description } };
|
|
169
|
+
if (!apiKey && !mpp && !public_)
|
|
170
|
+
return undefined;
|
|
171
|
+
return {
|
|
172
|
+
...(apiKey ? { apiKey } : {}),
|
|
173
|
+
...(mpp ? { mpp } : {}),
|
|
174
|
+
...(public_ ? { public: public_ } : {}),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function resolveApiKeyLane(current, override, default_) {
|
|
178
|
+
if (override === undefined)
|
|
179
|
+
return current;
|
|
180
|
+
if (override === false)
|
|
181
|
+
return undefined;
|
|
182
|
+
if (override === true)
|
|
183
|
+
return current ?? default_;
|
|
184
|
+
const base = current ?? default_;
|
|
185
|
+
return {
|
|
186
|
+
rateLimit: override.rateLimit ?? base.rateLimit,
|
|
187
|
+
scopes: override.scopes ?? base.scopes,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function resolveMppLane(current, override, default_) {
|
|
191
|
+
if (override === undefined)
|
|
192
|
+
return current;
|
|
193
|
+
if (override === false)
|
|
194
|
+
return undefined;
|
|
195
|
+
if (override === true)
|
|
196
|
+
return current ?? default_;
|
|
197
|
+
const base = current ?? default_;
|
|
198
|
+
return { charge: { ...base.charge, ...override.charge } };
|
|
199
|
+
}
|
|
200
|
+
function resolvePublicLane(current, override, default_) {
|
|
201
|
+
if (override === undefined)
|
|
202
|
+
return current;
|
|
203
|
+
if (override === false)
|
|
204
|
+
return undefined;
|
|
205
|
+
if (override === true)
|
|
206
|
+
return current ?? default_;
|
|
207
|
+
const base = current ?? default_;
|
|
208
|
+
return { rateLimit: override.rateLimit ?? base.rateLimit };
|
|
209
|
+
}
|
|
210
|
+
function openApiRoute(c) {
|
|
211
|
+
const route = matchedRoutes(c)
|
|
212
|
+
.slice(c.req.routeIndex + 1)
|
|
213
|
+
.find((route) => !!openApiSpec(route));
|
|
214
|
+
if (!route)
|
|
215
|
+
return undefined;
|
|
216
|
+
const spec = openApiSpec(route);
|
|
217
|
+
if (!spec)
|
|
218
|
+
return undefined;
|
|
219
|
+
const description = typeof spec.summary === 'string' ? spec.summary : spec.description;
|
|
220
|
+
return {
|
|
221
|
+
key: endpointKey(c, route),
|
|
222
|
+
description: typeof description === 'string' ? description : undefined,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function policies(c) {
|
|
226
|
+
return matchedRoutes(c)
|
|
227
|
+
.slice(c.req.routeIndex + 1)
|
|
228
|
+
.map(policyFromRoute)
|
|
229
|
+
.filter((policy) => policy !== undefined);
|
|
230
|
+
}
|
|
231
|
+
function openApiSpec(route) {
|
|
232
|
+
const handler = findTargetHandler(route.handler);
|
|
233
|
+
const metadata = handler[OpenApi.uniqueSymbol];
|
|
234
|
+
if (!metadata || !('spec' in metadata))
|
|
235
|
+
return undefined;
|
|
236
|
+
return metadata.spec;
|
|
237
|
+
}
|
|
238
|
+
function policyFromRoute(route) {
|
|
239
|
+
const handler = findTargetHandler(route.handler);
|
|
240
|
+
return handler[policySymbol];
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Maps each documented operation id to its resolved access lanes by reading the
|
|
244
|
+
* `policy` overrides co-located on the app's routes. This is the single source
|
|
245
|
+
* of truth for per-operation `security` and the `402` response in the generated
|
|
246
|
+
* OpenAPI document (see `App.create`): the API-key lane is default-on, and the
|
|
247
|
+
* public/MPP lanes apply only where a route opts in via {@link policy}.
|
|
248
|
+
*/
|
|
249
|
+
export function describeAccess(app) {
|
|
250
|
+
const groups = new Map();
|
|
251
|
+
for (const route of app.routes) {
|
|
252
|
+
const key = `${route.method} ${route.path}`;
|
|
253
|
+
const group = groups.get(key) ?? { overrides: [] };
|
|
254
|
+
const spec = openApiSpec(route);
|
|
255
|
+
if (typeof spec?.operationId === 'string')
|
|
256
|
+
group.operationId = spec.operationId;
|
|
257
|
+
const override = policyFromRoute(route);
|
|
258
|
+
if (override)
|
|
259
|
+
group.overrides.push(override);
|
|
260
|
+
groups.set(key, group);
|
|
261
|
+
}
|
|
262
|
+
const access = {};
|
|
263
|
+
for (const { operationId, overrides } of groups.values()) {
|
|
264
|
+
if (!operationId)
|
|
265
|
+
continue;
|
|
266
|
+
let apiKey = true;
|
|
267
|
+
let scopes = [];
|
|
268
|
+
let public_ = false;
|
|
269
|
+
let mpp = false;
|
|
270
|
+
for (const override of overrides) {
|
|
271
|
+
if (override.apiKey !== undefined)
|
|
272
|
+
apiKey = override.apiKey !== false;
|
|
273
|
+
if (override.apiKey && override.apiKey !== true && override.apiKey.scopes)
|
|
274
|
+
scopes = override.apiKey.scopes;
|
|
275
|
+
if (override.public !== undefined)
|
|
276
|
+
public_ = override.public !== false;
|
|
277
|
+
if (override.mpp !== undefined)
|
|
278
|
+
mpp = override.mpp !== false;
|
|
279
|
+
}
|
|
280
|
+
access[operationId] = { mpp, public: public_, scopes: apiKey ? scopes : [] };
|
|
281
|
+
}
|
|
282
|
+
return access;
|
|
283
|
+
}
|
|
284
|
+
function endpointKey(c, route) {
|
|
285
|
+
return `${route.method.toUpperCase()} ${stripBasePath(normalizeRoutePath(route.path), basePath(c))}`;
|
|
286
|
+
}
|
|
287
|
+
function normalizeRoutePath(path) {
|
|
288
|
+
// Hono stores regex-constrained params as `:name{...}`. Auth overrides use
|
|
289
|
+
// the stable public route shape, e.g. `GET /tokens/:symbol`.
|
|
290
|
+
return path
|
|
291
|
+
.split('/')
|
|
292
|
+
.map((segment) => {
|
|
293
|
+
if (!segment.startsWith(':'))
|
|
294
|
+
return segment;
|
|
295
|
+
const pattern = segment.indexOf('{');
|
|
296
|
+
return pattern === -1 ? segment : segment.slice(0, pattern);
|
|
297
|
+
})
|
|
298
|
+
.join('/');
|
|
299
|
+
}
|
|
300
|
+
function stripBasePath(path, basePath) {
|
|
301
|
+
if (!basePath || basePath === '/')
|
|
302
|
+
return path;
|
|
303
|
+
if (path === basePath)
|
|
304
|
+
return '/';
|
|
305
|
+
if (path.startsWith(`${basePath}/`))
|
|
306
|
+
return path.slice(basePath.length);
|
|
307
|
+
return path;
|
|
308
|
+
}
|
|
309
|
+
function basePath(c) {
|
|
310
|
+
const variables = c.var;
|
|
311
|
+
return typeof variables['basePath'] === 'string' ? variables['basePath'] : undefined;
|
|
312
|
+
}
|
|
313
|
+
/** Requires route access through API key, public quota, or MPP payment. */
|
|
314
|
+
export function require(policy) {
|
|
315
|
+
return createMiddleware(async (c, next) => {
|
|
316
|
+
const auth = c.get('auth');
|
|
317
|
+
const credential = getApiKeyCredential(c);
|
|
318
|
+
// The deprecated `key` query param has now been consumed for auth. Strip it
|
|
319
|
+
// from the request URL so it never reaches a route's query validator —
|
|
320
|
+
// endpoint query schemas are `z.strictObject`, so an unexpected `key`
|
|
321
|
+
// param would otherwise fail validation with `query_invalid`, breaking the
|
|
322
|
+
// legacy `?key=...` lane on every strict-query endpoint.
|
|
323
|
+
stripLegacyAuthQuery(c);
|
|
324
|
+
if (credential === false)
|
|
325
|
+
return jsonError(c, {
|
|
326
|
+
code: 'api_key_malformed',
|
|
327
|
+
message: 'Malformed API key',
|
|
328
|
+
status: 400,
|
|
329
|
+
});
|
|
330
|
+
const hasPayment = hasPaymentCredential(c) && isPaymentEnabled(auth, policy);
|
|
331
|
+
if (credential) {
|
|
332
|
+
const apiKey = await auth.apiKey?.source.resolve(credential.token);
|
|
333
|
+
if (!apiKey)
|
|
334
|
+
return jsonError(c, {
|
|
335
|
+
code: 'api_key_invalid',
|
|
336
|
+
message: 'Invalid API key',
|
|
337
|
+
status: 401,
|
|
338
|
+
});
|
|
339
|
+
// Sandbox keys are restricted to non-mainnet chains. An explicit
|
|
340
|
+
// `chainId` of mainnet makes the key unusable for this request, so it is
|
|
341
|
+
// ignored and the request falls through to the public policy below (as if
|
|
342
|
+
// no key were presented). A request that omits `chainId` is steered to
|
|
343
|
+
// testnet so a sandbox key still "just works" without passing `?chainId`.
|
|
344
|
+
const explicitChain = explicitChainId(c);
|
|
345
|
+
const sandboxOnMainnet = apiKey.environment === 'sandbox' &&
|
|
346
|
+
explicitChain !== undefined &&
|
|
347
|
+
Viem.isMainnet(explicitChain);
|
|
348
|
+
if (!sandboxOnMainnet) {
|
|
349
|
+
if (apiKey.environment === 'sandbox' &&
|
|
350
|
+
explicitChain === undefined &&
|
|
351
|
+
Viem.isMainnet(c.get('chainId') ?? Viem.defaultChainId))
|
|
352
|
+
// `chainId` lives on the app's `Variables`, not the narrower auth
|
|
353
|
+
// contract, so it is read/written through an untyped cast.
|
|
354
|
+
c.set('chainId', Viem.chainId.testnet);
|
|
355
|
+
const principal = principalFromApiKey(apiKey);
|
|
356
|
+
c.set('principal', principal);
|
|
357
|
+
const missing = apiKey.scopes.includes(Scope.wildcard)
|
|
358
|
+
? []
|
|
359
|
+
: (policy.apiKey?.scopes.filter((scope) => !apiKey.scopes.includes(scope)) ?? []);
|
|
360
|
+
if (missing.length > 0)
|
|
361
|
+
return jsonError(c, {
|
|
362
|
+
code: 'api_key_forbidden',
|
|
363
|
+
message: 'API key missing required scope',
|
|
364
|
+
status: 403,
|
|
365
|
+
});
|
|
366
|
+
if (hasPayment)
|
|
367
|
+
return requirePayment(c, next, {
|
|
368
|
+
auth,
|
|
369
|
+
payment: { reason: 'api_key_over_quota', type: 'mpp' },
|
|
370
|
+
policy,
|
|
371
|
+
principal,
|
|
372
|
+
});
|
|
373
|
+
if (policy.apiKey) {
|
|
374
|
+
// A route consumes exactly one quota bucket: its single required scope,
|
|
375
|
+
// else `'*'` (zero scopes). Routes today require at most one scope; a
|
|
376
|
+
// future multi-scope route buckets against its first scope.
|
|
377
|
+
const scope = policy.apiKey.scopes[0] ?? Scope.wildcard;
|
|
378
|
+
const limit = resolveApiKeyLimit({ apiKey, auth, policy: policy.apiKey, scope });
|
|
379
|
+
const result = await consumeRateLimit(auth, {
|
|
380
|
+
key: `api_key:${apiKey.id}:scope:${scope}`,
|
|
381
|
+
limit,
|
|
382
|
+
});
|
|
383
|
+
if (result) {
|
|
384
|
+
setRateLimitHeaders(c, result);
|
|
385
|
+
// Surface the bucket so callers can correlate a 429 with the exhausted
|
|
386
|
+
// quota. Set before the over-quota branch so it rides the 429 (an MPP
|
|
387
|
+
// 402 challenge is owned by mppx and drops these headers — by design).
|
|
388
|
+
c.header('RateLimit-Scope', scope);
|
|
389
|
+
}
|
|
390
|
+
if (result && !result.allowed)
|
|
391
|
+
return requirePaymentOrRateLimit(c, next, {
|
|
392
|
+
auth,
|
|
393
|
+
payment: { reason: 'api_key_over_quota', type: 'mpp' },
|
|
394
|
+
policy,
|
|
395
|
+
principal,
|
|
396
|
+
rateLimit: result,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
return next();
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
const publicPrincipal = principalFromPublic(c);
|
|
403
|
+
if (hasPayment) {
|
|
404
|
+
c.set('principal', publicPrincipal);
|
|
405
|
+
return requirePayment(c, next, {
|
|
406
|
+
auth,
|
|
407
|
+
payment: { reason: 'public_over_quota', type: 'mpp' },
|
|
408
|
+
policy,
|
|
409
|
+
principal: publicPrincipal,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
const limit = policy.public?.rateLimit;
|
|
413
|
+
if (limit) {
|
|
414
|
+
const result = await consumeRateLimit(auth, {
|
|
415
|
+
key: `public:${publicPrincipal.id}`,
|
|
416
|
+
limit,
|
|
417
|
+
});
|
|
418
|
+
if (result)
|
|
419
|
+
setRateLimitHeaders(c, result);
|
|
420
|
+
if (!result || result.allowed) {
|
|
421
|
+
c.set('principal', publicPrincipal);
|
|
422
|
+
return next();
|
|
423
|
+
}
|
|
424
|
+
c.set('principal', publicPrincipal);
|
|
425
|
+
return requirePaymentOrRateLimit(c, next, {
|
|
426
|
+
auth,
|
|
427
|
+
payment: { reason: 'public_over_quota', type: 'mpp' },
|
|
428
|
+
policy,
|
|
429
|
+
principal: publicPrincipal,
|
|
430
|
+
rateLimit: result,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
if (isPaymentEnabled(auth, policy)) {
|
|
434
|
+
c.set('principal', publicPrincipal);
|
|
435
|
+
return requirePayment(c, next, {
|
|
436
|
+
auth,
|
|
437
|
+
payment: { reason: 'public_over_quota', type: 'mpp' },
|
|
438
|
+
policy,
|
|
439
|
+
principal: publicPrincipal,
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
return jsonError(c, {
|
|
443
|
+
code: 'api_key_missing',
|
|
444
|
+
message: 'Missing API key',
|
|
445
|
+
status: 401,
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
function consumeRateLimit(auth, options) {
|
|
450
|
+
if (!auth.rateLimit)
|
|
451
|
+
return Promise.resolve(null);
|
|
452
|
+
// Fail open: a rate-limit store error (e.g. a lost Durable Object
|
|
453
|
+
// connection) degrades to unenforced quota instead of failing the request.
|
|
454
|
+
return auth.rateLimit.consume(options).catch((error) => {
|
|
455
|
+
console.error('[auth] rate-limit consume failed; failing open', error);
|
|
456
|
+
return null;
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Resolves the rate limit for an API-key request against a quota bucket.
|
|
461
|
+
* Most-specific wins: a per-key per-scope grant is the only thing that pierces a
|
|
462
|
+
* route's protective cap; the per-key `'*'` default does not (so a premium key
|
|
463
|
+
* can't silently blow past an expensive endpoint's ceiling). Per-key values live
|
|
464
|
+
* in the optional {@link ApiKey.ApiKey.rateLimits} map and stay `undefined` until a
|
|
465
|
+
* record source populates them, so until then only tiers 2/4/5/6 apply.
|
|
466
|
+
*/
|
|
467
|
+
function resolveApiKeyLimit(options) {
|
|
468
|
+
const { apiKey, auth, policy, scope } = options;
|
|
469
|
+
return (apiKey.rateLimits?.[scope] ?? // 1. per-key, per-scope
|
|
470
|
+
policy?.rateLimit ?? // 2. route override (protective cap)
|
|
471
|
+
apiKey.rateLimits?.[Scope.wildcard] ?? // 3. per-key default
|
|
472
|
+
auth.apiKey?.rateLimits?.[scope] ?? // 4. config per-scope
|
|
473
|
+
auth.apiKey?.rateLimits?.[Scope.wildcard] ?? { perMinute: 100 } // 5. config default // 6. hardcoded fallback
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
function getApiKeyCredential(c) {
|
|
477
|
+
const header = c.req.header('tempo-api-key');
|
|
478
|
+
if (header)
|
|
479
|
+
return { token: header };
|
|
480
|
+
// `Authorization: Bearer` compatibility fallback. Must not consume or reject
|
|
481
|
+
// `Authorization: Payment` (MPP), which is a distinct credential — a request
|
|
482
|
+
// carrying only a payment scheme falls through to the deprecated lanes below
|
|
483
|
+
// (which find nothing) and resolves to no API-key credential.
|
|
484
|
+
const authorization = c.req.header('authorization');
|
|
485
|
+
if (authorization && !Credential.extractPaymentScheme(authorization)) {
|
|
486
|
+
const match = /^Bearer\s+(.+)$/i.exec(authorization);
|
|
487
|
+
if (!match?.[1])
|
|
488
|
+
return false;
|
|
489
|
+
return { token: match[1] };
|
|
490
|
+
}
|
|
491
|
+
// Deprecated fallbacks carried over from the v1 API so existing integrations
|
|
492
|
+
// keep authenticating: the `x-api-key` header and the `key` query parameter.
|
|
493
|
+
const legacyHeader = c.req.header('x-api-key');
|
|
494
|
+
if (legacyHeader)
|
|
495
|
+
return { token: legacyHeader };
|
|
496
|
+
const legacyQuery = c.req.query('key');
|
|
497
|
+
if (legacyQuery)
|
|
498
|
+
return { token: legacyQuery };
|
|
499
|
+
return null;
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Remove the deprecated `key` auth query param from the request URL once it has
|
|
503
|
+
* been read for authentication. Route query schemas are strict
|
|
504
|
+
* (`z.strictObject`), so leaving `key` in the query string would make the
|
|
505
|
+
* downstream validator reject the request as `query_invalid`. Stripping it
|
|
506
|
+
* keeps the legacy `?key=...` auth lane working on strict-query endpoints
|
|
507
|
+
* (e.g. `GET /v1/tokens`).
|
|
508
|
+
*/
|
|
509
|
+
function stripLegacyAuthQuery(c) {
|
|
510
|
+
const url = new URL(c.req.url);
|
|
511
|
+
if (!url.searchParams.has('key'))
|
|
512
|
+
return;
|
|
513
|
+
url.searchParams.delete('key');
|
|
514
|
+
c.req.raw = new Request(url, c.req.raw);
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Reads an explicit `chainId`/`chain_id` query parameter, normalized to a
|
|
518
|
+
* numeric chain id. Returns `undefined` when absent or malformed (a malformed
|
|
519
|
+
* value falls through to the route's own validation). Mirrors the resolution in
|
|
520
|
+
* `App.create`'s unsupported-chain guard.
|
|
521
|
+
*/
|
|
522
|
+
function explicitChainId(c) {
|
|
523
|
+
const raw = c.req.query('chainId') ?? c.req.query('chain_id');
|
|
524
|
+
if (raw === undefined)
|
|
525
|
+
return undefined;
|
|
526
|
+
const parsed = Schema.ChainId.safeParse(raw);
|
|
527
|
+
return parsed.success ? parsed.data : undefined;
|
|
528
|
+
}
|
|
529
|
+
function getRequestId(c) {
|
|
530
|
+
const variables = c.var;
|
|
531
|
+
return typeof variables['requestId'] === 'string' ? variables['requestId'] : undefined;
|
|
532
|
+
}
|
|
533
|
+
function hasPaymentCredential(c) {
|
|
534
|
+
const authorization = c.req.header('authorization');
|
|
535
|
+
if (!authorization)
|
|
536
|
+
return false;
|
|
537
|
+
return !!Credential.extractPaymentScheme(authorization);
|
|
538
|
+
}
|
|
539
|
+
function isPaymentEnabled(auth, policy) {
|
|
540
|
+
return !!auth.mpp && !!policy.mpp;
|
|
541
|
+
}
|
|
542
|
+
function jsonError(c, options) {
|
|
543
|
+
const requestId = getRequestId(c);
|
|
544
|
+
// Auth error envelopes embed per-request state and must not be cached.
|
|
545
|
+
c.header('Cache-Control', 'no-store');
|
|
546
|
+
c.set('errorCode', options.code);
|
|
547
|
+
return c.json({
|
|
548
|
+
error: {
|
|
549
|
+
code: options.code,
|
|
550
|
+
message: options.message,
|
|
551
|
+
},
|
|
552
|
+
...(requestId === undefined ? {} : { requestId }),
|
|
553
|
+
}, options.status);
|
|
554
|
+
}
|
|
555
|
+
function payer(c) {
|
|
556
|
+
try {
|
|
557
|
+
return Credential.fromRequest(c.req.raw).source;
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
return undefined;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
function principalFromApiKey(apiKey) {
|
|
564
|
+
return {
|
|
565
|
+
apiKey,
|
|
566
|
+
environment: apiKey.environment,
|
|
567
|
+
id: apiKey.id,
|
|
568
|
+
orgId: apiKey.orgId,
|
|
569
|
+
type: 'api_key',
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
function principalFromPublic(c) {
|
|
573
|
+
const forwarded = c.req.header('x-forwarded-for')?.split(',')[0]?.trim();
|
|
574
|
+
return {
|
|
575
|
+
id: c.req.header('cf-connecting-ip') ??
|
|
576
|
+
c.req.header('x-real-ip') ??
|
|
577
|
+
forwarded ??
|
|
578
|
+
c.req.header('x-test-client-ip') ??
|
|
579
|
+
'anonymous',
|
|
580
|
+
type: 'public',
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
async function requirePayment(c, next, options) {
|
|
584
|
+
const middleware = options.auth.mpp?.charge(options.policy.mpp?.charge ?? {});
|
|
585
|
+
if (!middleware)
|
|
586
|
+
return jsonError(c, {
|
|
587
|
+
code: 'payment_required',
|
|
588
|
+
message: 'Payment required',
|
|
589
|
+
status: 429,
|
|
590
|
+
});
|
|
591
|
+
return middleware(c, async () => {
|
|
592
|
+
const payer_ = payer(c);
|
|
593
|
+
c.set('principal', {
|
|
594
|
+
...options.principal,
|
|
595
|
+
payment: {
|
|
596
|
+
...options.payment,
|
|
597
|
+
...(payer_ === undefined ? {} : { payer: payer_ }),
|
|
598
|
+
},
|
|
599
|
+
});
|
|
600
|
+
await next();
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
function requirePaymentOrRateLimit(c, next, options) {
|
|
604
|
+
if (isPaymentEnabled(options.auth, options.policy))
|
|
605
|
+
return requirePayment(c, next, options);
|
|
606
|
+
c.header('Retry-After', String(Math.max(options.rateLimit.reset - Math.ceil(Date.now() / 1_000), 1)));
|
|
607
|
+
return jsonError(c, {
|
|
608
|
+
code: 'rate_limit_exceeded',
|
|
609
|
+
message: 'Rate limit exceeded',
|
|
610
|
+
status: 429,
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
function setRateLimitHeaders(c, result) {
|
|
614
|
+
c.header('RateLimit-Limit', String(result.limit));
|
|
615
|
+
c.header('RateLimit-Remaining', String(result.remaining));
|
|
616
|
+
c.header('RateLimit-Reset', String(result.reset));
|
|
617
|
+
}
|
|
618
|
+
//# sourceMappingURL=Auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../src/internal/Auth.ts"],"names":[],"mappings":"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"}
|