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 @@
|
|
|
1
|
+
{"version":3,"file":"Viem.d.ts","sourceRoot":"","sources":["../../src/internal/Viem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createClient, http, publicActions } from 'viem';
|
|
2
|
+
import { tempoActions } from 'viem/tempo';
|
|
3
|
+
import { tempoMainnet, tempoTestnet } from 'viem/tempo/chains';
|
|
4
|
+
/** Known Tempo chains keyed by id, for metadata lookups. */
|
|
5
|
+
export const chains = [tempoMainnet, tempoTestnet];
|
|
6
|
+
/** Tempo chain ids keyed by network. */
|
|
7
|
+
export const chainId = {
|
|
8
|
+
mainnet: tempoMainnet.id,
|
|
9
|
+
testnet: tempoTestnet.id,
|
|
10
|
+
};
|
|
11
|
+
/** Default Tempo chain id. */
|
|
12
|
+
export const defaultChainId = chainId.mainnet;
|
|
13
|
+
/** Whether a chain id is Tempo mainnet. */
|
|
14
|
+
export function isMainnet(id) {
|
|
15
|
+
return id === chainId.mainnet;
|
|
16
|
+
}
|
|
17
|
+
/** Default Tempo RPC URLs keyed by chain id. */
|
|
18
|
+
export const url = {
|
|
19
|
+
[chainId.mainnet]: 'https://rpc.tempo.xyz',
|
|
20
|
+
[chainId.testnet]: 'https://rpc.testnet.tempo.xyz',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Resolves the effective RPC config for a single request.
|
|
24
|
+
*
|
|
25
|
+
* Accepts either a static config object or a per-request resolver function. The
|
|
26
|
+
* resolver receives a {@link resolve.Context} (`chainId` plus the request
|
|
27
|
+
* `principal`), so callers can route traffic per caller — e.g. send anonymous
|
|
28
|
+
* (`principal.type === 'public'`) traffic to a separate, no-auth upstream. A
|
|
29
|
+
* `null` principal denotes a trusted, non-request caller (the scheduled
|
|
30
|
+
* webhook poller). A missing `url` falls back to the built-in public host map
|
|
31
|
+
* ({@link url}); a missing `basicAuth` means no Basic auth is sent.
|
|
32
|
+
*
|
|
33
|
+
* Memoization is keyed on the resolved output (see `App.create` and
|
|
34
|
+
* {@link Tidx.createGetClient}), not the context, so a resolver may branch on
|
|
35
|
+
* any principal field without unbounded client cardinality: callers that
|
|
36
|
+
* resolve to the same upstream share a client. Pass the result to
|
|
37
|
+
* {@link getClient} (or let `getClient` resolve for you) to build a client.
|
|
38
|
+
*/
|
|
39
|
+
export function resolve(rpc, context) {
|
|
40
|
+
const config = typeof rpc === 'function' ? rpc(context) : rpc;
|
|
41
|
+
return {
|
|
42
|
+
basicAuth: config?.basicAuth,
|
|
43
|
+
url: (typeof config?.url === 'function' ? config.url(context.chainId) : config?.url) ??
|
|
44
|
+
url[context.chainId],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function getClient(options) {
|
|
48
|
+
const { chainId = defaultChainId, principal = null, rpc } = options;
|
|
49
|
+
const { basicAuth, url: rpcUrl } = resolve(rpc, { chainId, principal });
|
|
50
|
+
return createClient({
|
|
51
|
+
// Auto-batch `eth_call`s within the same macrotask into a single
|
|
52
|
+
// deployless multicall. Lets call sites issue `Promise.all` of N reads
|
|
53
|
+
// (e.g. `balanceOf` across many tokens) and pay one RPC round-trip.
|
|
54
|
+
// Deployless mode bytecode-injects multicall3 so Tempo, which doesn't
|
|
55
|
+
// configure a deployed multicall3, can still serve the aggregated call.
|
|
56
|
+
batch: { multicall: { deployless: true } },
|
|
57
|
+
chain: { ...tempoMainnet, id: chainId },
|
|
58
|
+
transport: http(rpcUrl, basicAuth ? { fetchOptions: { headers: { Authorization: `Basic ${btoa(basicAuth)}` } } } : {}),
|
|
59
|
+
})
|
|
60
|
+
.extend(publicActions)
|
|
61
|
+
.extend(tempoActions());
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=Viem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Viem.js","sourceRoot":"","sources":["../../src/internal/Viem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAM9D,4DAA4D;AAC5D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;AAElD,wCAAwC;AACxC,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,OAAO,EAAE,YAAY,CAAC,EAAE;IACxB,OAAO,EAAE,YAAY,CAAC,EAAE;CAChB,CAAA;AAEV,8BAA8B;AAC9B,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAA;AAE7C,2CAA2C;AAC3C,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAA;AAC/B,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,MAAM,GAAG,GAA2B;IACzC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,uBAAuB;IAC1C,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,+BAA+B;CACnD,CAAA;AAiBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,OAAO,CACrB,GAA8B,EAC9B,OAAwB;IAExB,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IAC7D,OAAO;QACL,SAAS,EAAE,MAAM,EAAE,SAAS;QAC5B,GAAG,EACD,CAAC,OAAO,MAAM,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC;YAC/E,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;KACvB,CAAA;AACH,CAAC;AA4BD,MAAM,UAAU,SAAS,CAAC,OAA0B;IAClD,MAAM,EAAE,OAAO,GAAG,cAAc,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IACnE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;IAEvE,OAAO,YAAY,CAAC;QAClB,iEAAiE;QACjE,uEAAuE;QACvE,oEAAoE;QACpE,sEAAsE;QACtE,wEAAwE;QACxE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;QAC1C,KAAK,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE;QACvC,SAAS,EAAE,IAAI,CACb,MAAM,EACN,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAC9F;KACF,CAAC;SACC,MAAM,CAAC,aAAa,CAAC;SACrB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import type * as Webhooks from './Webhooks.js';
|
|
2
|
+
export { assertBetterstackUrl, betterStack } from './webhookDestinations/betterStack.js';
|
|
3
|
+
export { assertSlackUrl, redactSlackUrl, slack } from './webhookDestinations/slack.js';
|
|
4
|
+
export { assertDeliverableUrl, url } from './webhookDestinations/url.js';
|
|
5
|
+
/**
|
|
6
|
+
* Where a subscription's matched events are delivered.
|
|
7
|
+
*
|
|
8
|
+
* - `url` — a subscriber HTTPS endpoint; the signed envelope is POSTed verbatim
|
|
9
|
+
* (HMAC in `tempo-signature`).
|
|
10
|
+
* - `slack` — a subscriber-supplied Slack incoming-webhook URL (`hooks.slack.com`).
|
|
11
|
+
* The envelope is formatted into a Slack Block Kit message and POSTed there
|
|
12
|
+
* with no signature (the URL is itself the shared secret). No OAuth.
|
|
13
|
+
* - `betterstack` — a Better Stack Telemetry source: an ingest host URL
|
|
14
|
+
* (`*.betterstackdata.com`) plus a source token. The envelope is POSTed as a
|
|
15
|
+
* structured log event authenticated with `Authorization: Bearer <token>`.
|
|
16
|
+
*
|
|
17
|
+
* A `Destination` is plain, serializable data — it is what a `Subscription`
|
|
18
|
+
* persists. The builders (`from`, `url`, `slack`, `betterStack`) return an
|
|
19
|
+
* {@link Instance}: the same data plus a bound {@link Instance.deliver}. `deliver`
|
|
20
|
+
* is a function property, so an instance serializes and structurally compares as
|
|
21
|
+
* the plain destination it is.
|
|
22
|
+
*/
|
|
23
|
+
export type Destination = BetterStack | Slack | Url;
|
|
24
|
+
/** A `url` delivery destination (a signed event POST to an HTTPS endpoint). */
|
|
25
|
+
export type Url = {
|
|
26
|
+
/** Destination kind. */
|
|
27
|
+
type: 'url';
|
|
28
|
+
/** Subscriber callback URL (validated `https`). */
|
|
29
|
+
url: string;
|
|
30
|
+
};
|
|
31
|
+
/** A `slack` delivery destination (a formatted message to an incoming webhook). */
|
|
32
|
+
export type Slack = {
|
|
33
|
+
/** Destination kind. */
|
|
34
|
+
type: 'slack';
|
|
35
|
+
/** Slack incoming-webhook URL (`https://hooks.slack.com/services/…`). */
|
|
36
|
+
url: string;
|
|
37
|
+
};
|
|
38
|
+
/** A `betterstack` delivery destination (a log event to a Better Stack source). */
|
|
39
|
+
export type BetterStack = {
|
|
40
|
+
/** Better Stack source token, sent as `Authorization: Bearer …`. */
|
|
41
|
+
token: string;
|
|
42
|
+
/** Destination kind. */
|
|
43
|
+
type: 'betterstack';
|
|
44
|
+
/** Better Stack ingest host URL (`https://<host>.betterstackdata.com`). */
|
|
45
|
+
url: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* A built destination: the plain {@link Destination} data plus a `deliver`
|
|
49
|
+
* method that owns this transport's delivery logic (formatting, headers,
|
|
50
|
+
* signing, redirect policy). `deliver` is a function property, so it drops out of
|
|
51
|
+
* `JSON.stringify` — an instance serializes to just its data.
|
|
52
|
+
*
|
|
53
|
+
* There is no central delivery router: each provider carries its own transport.
|
|
54
|
+
* To deliver a persisted (plain) `Subscription.destination`, rebuild an instance
|
|
55
|
+
* with {@link from} and call `.deliver(...)`.
|
|
56
|
+
*/
|
|
57
|
+
export type Instance<destination extends Destination = Destination> = destination & {
|
|
58
|
+
/** Delivers an envelope to this destination using its own transport. */
|
|
59
|
+
deliver: (options: deliver.Options) => Promise<Result>;
|
|
60
|
+
};
|
|
61
|
+
export declare namespace deliver {
|
|
62
|
+
/** Options for {@link Instance.deliver}. */
|
|
63
|
+
type Options = {
|
|
64
|
+
/** The envelope to deliver. */
|
|
65
|
+
envelope: Webhooks.Envelope;
|
|
66
|
+
/** `fetch` implementation; defaults to the global. Injectable for tests. */
|
|
67
|
+
fetch?: typeof globalThis.fetch | undefined;
|
|
68
|
+
/** Monotonic clock in ms; defaults to `Date.now`. Injectable for tests. */
|
|
69
|
+
now?: (() => number) | undefined;
|
|
70
|
+
/** Signing secret; required by the `url` transport, ignored by others. */
|
|
71
|
+
secret?: string | undefined;
|
|
72
|
+
/** Abort the request after this many ms (default 10000). */
|
|
73
|
+
timeoutMs?: number | undefined;
|
|
74
|
+
/** Unix timestamp (seconds) embedded in the signature; defaults to now. */
|
|
75
|
+
timestamp?: number | undefined;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Outcome of a single delivery attempt, shared by every transport. */
|
|
79
|
+
export type Result = {
|
|
80
|
+
/** Wall-clock duration of the attempt in ms, when the request was made. */
|
|
81
|
+
durationMs?: number | undefined;
|
|
82
|
+
/** Failure reason when `ok` is false. */
|
|
83
|
+
error?: string | undefined;
|
|
84
|
+
/** Whether the destination accepted the delivery (2xx). */
|
|
85
|
+
ok: boolean;
|
|
86
|
+
/** HTTP response status, when a response was received. */
|
|
87
|
+
status?: number | undefined;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Canonical constructor: normalizes a value into a validated {@link Instance} by
|
|
91
|
+
* delegating to the matching builder (`url`, `slack`, `betterStack`), each of
|
|
92
|
+
* which owns its own transport. This is also how you deliver a persisted (plain)
|
|
93
|
+
* destination: `from(subscription.destination).deliver(...)`.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* WebhookDestination.from('https://example.com/hook')
|
|
98
|
+
* WebhookDestination.from({ type: 'slack', url: 'https://hooks.slack.com/…' })
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export declare function from(value: from.Value): Instance;
|
|
102
|
+
export declare namespace from {
|
|
103
|
+
/** A destination object, or a bare HTTPS URL string (shorthand for `url`). */
|
|
104
|
+
type Value = Destination | string;
|
|
105
|
+
}
|
|
106
|
+
/** Validates a destination's URL according to its transport-specific rules. */
|
|
107
|
+
export declare function assertDestination(destination: Destination): void;
|
|
108
|
+
/**
|
|
109
|
+
* A non-secret label for a destination, used in delivery-log `requestUrl`. Slack
|
|
110
|
+
* incoming-webhook URLs are bearer secrets, so `slack` destinations log a
|
|
111
|
+
* token-redacted form (see {@link core_slack.redactSlackUrl}) rather than the raw
|
|
112
|
+
* URL. Better Stack keeps its secret in a separate `token`, so its ingest URL
|
|
113
|
+
* logs verbatim.
|
|
114
|
+
*/
|
|
115
|
+
export declare function destinationLabel(destination: Destination): string;
|
|
116
|
+
/**
|
|
117
|
+
* Low-level HTTP send shared by every transport: POSTs a prebuilt body/headers
|
|
118
|
+
* with a timeout and classifies the response into a {@link Result}. This is the
|
|
119
|
+
* network mechanic only — each provider owns its own body formatting, headers,
|
|
120
|
+
* signing, and redirect policy. Never throws.
|
|
121
|
+
*/
|
|
122
|
+
export declare function send(options: send.Options): Promise<Result>;
|
|
123
|
+
export declare namespace send {
|
|
124
|
+
/** Options for {@link send}. */
|
|
125
|
+
type Options = {
|
|
126
|
+
/** Serialized request body. */
|
|
127
|
+
body: string;
|
|
128
|
+
/** Prefix for the non-2xx error message (e.g. `slack `). */
|
|
129
|
+
errorPrefix?: string | undefined;
|
|
130
|
+
/** `fetch` implementation; defaults to the global. */
|
|
131
|
+
fetch?: typeof globalThis.fetch | undefined;
|
|
132
|
+
/** Extra request headers merged over `content-type: application/json`. */
|
|
133
|
+
headers?: Record<string, string> | undefined;
|
|
134
|
+
/** Monotonic clock in ms; defaults to `Date.now`. */
|
|
135
|
+
now?: (() => number) | undefined;
|
|
136
|
+
/** Treat any 3xx/opaque redirect as a failed delivery (SSRF guard). */
|
|
137
|
+
rejectRedirects?: boolean | undefined;
|
|
138
|
+
/** Abort the request after this many ms (default 10000). */
|
|
139
|
+
timeoutMs?: number | undefined;
|
|
140
|
+
/** Destination URL. */
|
|
141
|
+
url: string;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/** Header carrying the HMAC signature (`t=…,v1=…`). */
|
|
145
|
+
export declare const signatureHeader = "tempo-signature";
|
|
146
|
+
/** Header carrying the idempotent event id (`evt_…`). */
|
|
147
|
+
export declare const eventIdHeader = "tempo-event-id";
|
|
148
|
+
/** Header carrying the event type. */
|
|
149
|
+
export declare const eventTypeHeader = "tempo-event-type";
|
|
150
|
+
/**
|
|
151
|
+
* Signs a delivery body with a per-subscription secret. Returns a Stripe-style
|
|
152
|
+
* header value `t=<unix>,v1=<hex>` where the timestamp guards against replay.
|
|
153
|
+
*/
|
|
154
|
+
export declare function sign(options: sign.Options): string;
|
|
155
|
+
export declare namespace sign {
|
|
156
|
+
/** Options for {@link sign}. */
|
|
157
|
+
type Options = {
|
|
158
|
+
/** Raw request body to sign. */
|
|
159
|
+
body: string;
|
|
160
|
+
/** Per-subscription signing secret. */
|
|
161
|
+
secret: string;
|
|
162
|
+
/** Unix timestamp (seconds) to embed; defaults to now. */
|
|
163
|
+
timestamp?: number | undefined;
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Verifies a signature produced by {@link sign}: recomputes the HMAC and
|
|
168
|
+
* rejects signatures older than `tolerance` seconds (default 300).
|
|
169
|
+
*/
|
|
170
|
+
export declare function verify(options: verify.Options): boolean;
|
|
171
|
+
export declare namespace verify {
|
|
172
|
+
/** Options for {@link verify}. */
|
|
173
|
+
type Options = {
|
|
174
|
+
/** Raw request body that was signed. */
|
|
175
|
+
body: string;
|
|
176
|
+
/** Current Unix timestamp (seconds); injectable for tests. */
|
|
177
|
+
now?: number | undefined;
|
|
178
|
+
/** Per-subscription signing secret. */
|
|
179
|
+
secret: string;
|
|
180
|
+
/** Signature header value (`t=…,v1=…`). */
|
|
181
|
+
signature: string;
|
|
182
|
+
/** Maximum age in seconds before a signature is rejected. */
|
|
183
|
+
tolerance?: number | undefined;
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/** Thrown when a subscriber URL fails SSRF/format validation. */
|
|
187
|
+
export declare class InvalidUrlError extends Error {
|
|
188
|
+
/** Why the URL was rejected. */
|
|
189
|
+
reason: InvalidUrlError.Reason;
|
|
190
|
+
/** The rejected URL. */
|
|
191
|
+
url: string;
|
|
192
|
+
constructor(reason: InvalidUrlError.Reason, url: string);
|
|
193
|
+
}
|
|
194
|
+
export declare namespace InvalidUrlError {
|
|
195
|
+
/** Reason a URL was rejected. */
|
|
196
|
+
type Reason = 'betterstack_host' | 'blocked_host' | 'credentials' | 'malformed' | 'protocol' | 'slack_host';
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=WebhookDestination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebhookDestination.d.ts","sourceRoot":"","sources":["../../src/internal/WebhookDestination.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,QAAQ,MAAM,eAAe,CAAA;AAK9C,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAA;AACxF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAA;AACtF,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAA;AAExE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,GAAG,CAAA;AAEnD,+EAA+E;AAC/E,MAAM,MAAM,GAAG,GAAG;IAChB,wBAAwB;IACxB,IAAI,EAAE,KAAK,CAAA;IACX,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,mFAAmF;AACnF,MAAM,MAAM,KAAK,GAAG;IAClB,wBAAwB;IACxB,IAAI,EAAE,OAAO,CAAA;IACb,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG;IACxB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,wBAAwB;IACxB,IAAI,EAAE,aAAa,CAAA;IACnB,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,QAAQ,CAAC,WAAW,SAAS,WAAW,GAAG,WAAW,IAAI,WAAW,GAAG;IAClF,wEAAwE;IACxE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACvD,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,OAAO,CAAC;IAC/B,4CAA4C;IAC5C,KAAK,OAAO,GAAG;QACb,+BAA+B;QAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAA;QAC3B,4EAA4E;QAC5E,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,SAAS,CAAA;QAC3C,2EAA2E;QAC3E,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAA;QAChC,0EAA0E;QAC1E,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,4DAA4D;QAC5D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC9B,2EAA2E;QAC3E,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC/B,CAAA;CACF;AAED,uEAAuE;AACvE,MAAM,MAAM,MAAM,GAAG;IACnB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,2DAA2D;IAC3D,EAAE,EAAE,OAAO,CAAA;IACX,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAKhD;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,8EAA8E;IAC9E,KAAK,KAAK,GAAG,WAAW,GAAG,MAAM,CAAA;CAClC;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAIhE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAEjE;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA+CjE;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,gCAAgC;IAChC,KAAK,OAAO,GAAG;QACb,+BAA+B;QAC/B,IAAI,EAAE,MAAM,CAAA;QACZ,4DAA4D;QAC5D,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAChC,sDAAsD;QACtD,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,SAAS,CAAA;QAC3C,0EAA0E;QAC1E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;QAC5C,qDAAqD;QACrD,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAA;QAChC,uEAAuE;QACvE,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QACrC,4DAA4D;QAC5D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC9B,uBAAuB;QACvB,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;CACF;AAED,uDAAuD;AACvD,eAAO,MAAM,eAAe,oBAAoB,CAAA;AAChD,yDAAyD;AACzD,eAAO,MAAM,aAAa,mBAAmB,CAAA;AAC7C,sCAAsC;AACtC,eAAO,MAAM,eAAe,qBAAqB,CAAA;AAEjD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAIlD;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,gCAAgC;IAChC,KAAK,OAAO,GAAG;QACb,gCAAgC;QAChC,IAAI,EAAE,MAAM,CAAA;QACZ,uCAAuC;QACvC,MAAM,EAAE,MAAM,CAAA;QACd,0DAA0D;QAC1D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC/B,CAAA;CACF;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAUvD;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,kCAAkC;IAClC,KAAK,OAAO,GAAG;QACb,wCAAwC;QACxC,IAAI,EAAE,MAAM,CAAA;QACZ,8DAA8D;QAC9D,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACxB,uCAAuC;QACvC,MAAM,EAAE,MAAM,CAAA;QACd,2CAA2C;QAC3C,SAAS,EAAE,MAAM,CAAA;QACjB,6DAA6D;QAC7D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC/B,CAAA;CACF;AA0BD,iEAAiE;AACjE,qBAAa,eAAgB,SAAQ,KAAK;IACxC,gCAAgC;IAChC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAA;IAC9B,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAA;IAEX,YAAY,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAKtD;CACF;AAED,MAAM,CAAC,OAAO,WAAW,eAAe,CAAC;IACvC,iCAAiC;IACjC,KAAK,MAAM,GACP,kBAAkB,GAClB,cAAc,GACd,aAAa,GACb,WAAW,GACX,UAAU,GACV,YAAY,CAAA;CACjB"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { Hash, Hex } from 'ox';
|
|
2
|
+
import * as core_betterStack from './webhookDestinations/betterStack.js';
|
|
3
|
+
import * as core_slack from './webhookDestinations/slack.js';
|
|
4
|
+
import * as core_url from './webhookDestinations/url.js';
|
|
5
|
+
export { assertBetterstackUrl, betterStack } from './webhookDestinations/betterStack.js';
|
|
6
|
+
export { assertSlackUrl, redactSlackUrl, slack } from './webhookDestinations/slack.js';
|
|
7
|
+
export { assertDeliverableUrl, url } from './webhookDestinations/url.js';
|
|
8
|
+
/**
|
|
9
|
+
* Canonical constructor: normalizes a value into a validated {@link Instance} by
|
|
10
|
+
* delegating to the matching builder (`url`, `slack`, `betterStack`), each of
|
|
11
|
+
* which owns its own transport. This is also how you deliver a persisted (plain)
|
|
12
|
+
* destination: `from(subscription.destination).deliver(...)`.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* WebhookDestination.from('https://example.com/hook')
|
|
17
|
+
* WebhookDestination.from({ type: 'slack', url: 'https://hooks.slack.com/…' })
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function from(value) {
|
|
21
|
+
if (typeof value === 'string')
|
|
22
|
+
return core_url.url(value);
|
|
23
|
+
if (value.type === 'slack')
|
|
24
|
+
return core_slack.slack(value.url);
|
|
25
|
+
if (value.type === 'betterstack')
|
|
26
|
+
return core_betterStack.betterStack(value);
|
|
27
|
+
return core_url.url(value.url);
|
|
28
|
+
}
|
|
29
|
+
/** Validates a destination's URL according to its transport-specific rules. */
|
|
30
|
+
export function assertDestination(destination) {
|
|
31
|
+
if (destination.type === 'url')
|
|
32
|
+
core_url.assertDeliverableUrl(destination.url);
|
|
33
|
+
else if (destination.type === 'slack')
|
|
34
|
+
core_slack.assertSlackUrl(destination.url);
|
|
35
|
+
else
|
|
36
|
+
core_betterStack.assertBetterstackUrl(destination.url);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A non-secret label for a destination, used in delivery-log `requestUrl`. Slack
|
|
40
|
+
* incoming-webhook URLs are bearer secrets, so `slack` destinations log a
|
|
41
|
+
* token-redacted form (see {@link core_slack.redactSlackUrl}) rather than the raw
|
|
42
|
+
* URL. Better Stack keeps its secret in a separate `token`, so its ingest URL
|
|
43
|
+
* logs verbatim.
|
|
44
|
+
*/
|
|
45
|
+
export function destinationLabel(destination) {
|
|
46
|
+
return destination.type === 'slack' ? core_slack.redactSlackUrl(destination.url) : destination.url;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Low-level HTTP send shared by every transport: POSTs a prebuilt body/headers
|
|
50
|
+
* with a timeout and classifies the response into a {@link Result}. This is the
|
|
51
|
+
* network mechanic only — each provider owns its own body formatting, headers,
|
|
52
|
+
* signing, and redirect policy. Never throws.
|
|
53
|
+
*/
|
|
54
|
+
export async function send(options) {
|
|
55
|
+
const fetch_ = options.fetch ?? globalThis.fetch;
|
|
56
|
+
const clock = options.now ?? (() => Date.now());
|
|
57
|
+
const timeoutMs = options.timeoutMs ?? 10_000;
|
|
58
|
+
const controller = new AbortController();
|
|
59
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
60
|
+
const start = clock();
|
|
61
|
+
try {
|
|
62
|
+
const response = await fetch_(options.url, {
|
|
63
|
+
body: options.body,
|
|
64
|
+
headers: { 'content-type': 'application/json', ...options.headers },
|
|
65
|
+
method: 'POST',
|
|
66
|
+
// `manual` yields an opaque redirect (status 0) in Workers/browsers, or the
|
|
67
|
+
// raw 3xx status in Node — both are treated as a failed delivery.
|
|
68
|
+
redirect: 'manual',
|
|
69
|
+
signal: controller.signal,
|
|
70
|
+
});
|
|
71
|
+
const durationMs = clock() - start;
|
|
72
|
+
if (options.rejectRedirects &&
|
|
73
|
+
(response.status === 0 || (response.status >= 300 && response.status < 400)))
|
|
74
|
+
return {
|
|
75
|
+
durationMs,
|
|
76
|
+
error: `redirect rejected (${response.status})`,
|
|
77
|
+
ok: false,
|
|
78
|
+
status: response.status || undefined,
|
|
79
|
+
};
|
|
80
|
+
if (response.status >= 200 && response.status < 300)
|
|
81
|
+
return { durationMs, ok: true, status: response.status };
|
|
82
|
+
return {
|
|
83
|
+
durationMs,
|
|
84
|
+
error: `${options.errorPrefix ?? ''}non-2xx response (${response.status})`,
|
|
85
|
+
ok: false,
|
|
86
|
+
status: response.status || undefined,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (cause) {
|
|
90
|
+
const durationMs = clock() - start;
|
|
91
|
+
const timedOut = cause instanceof Error && cause.name === 'AbortError';
|
|
92
|
+
return {
|
|
93
|
+
durationMs,
|
|
94
|
+
error: timedOut ? `timed out after ${timeoutMs}ms` : String(cause),
|
|
95
|
+
ok: false,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Header carrying the HMAC signature (`t=…,v1=…`). */
|
|
103
|
+
export const signatureHeader = 'tempo-signature';
|
|
104
|
+
/** Header carrying the idempotent event id (`evt_…`). */
|
|
105
|
+
export const eventIdHeader = 'tempo-event-id';
|
|
106
|
+
/** Header carrying the event type. */
|
|
107
|
+
export const eventTypeHeader = 'tempo-event-type';
|
|
108
|
+
/**
|
|
109
|
+
* Signs a delivery body with a per-subscription secret. Returns a Stripe-style
|
|
110
|
+
* header value `t=<unix>,v1=<hex>` where the timestamp guards against replay.
|
|
111
|
+
*/
|
|
112
|
+
export function sign(options) {
|
|
113
|
+
const timestamp = options.timestamp ?? Math.floor(Date.now() / 1_000);
|
|
114
|
+
const v1 = hmac(options.secret, `${timestamp}.${options.body}`);
|
|
115
|
+
return `t=${timestamp},v1=${v1}`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Verifies a signature produced by {@link sign}: recomputes the HMAC and
|
|
119
|
+
* rejects signatures older than `tolerance` seconds (default 300).
|
|
120
|
+
*/
|
|
121
|
+
export function verify(options) {
|
|
122
|
+
const parsed = parseSignature(options.signature);
|
|
123
|
+
if (!parsed)
|
|
124
|
+
return false;
|
|
125
|
+
const tolerance = options.tolerance ?? 300;
|
|
126
|
+
const now = options.now ?? Math.floor(Date.now() / 1_000);
|
|
127
|
+
if (Math.abs(now - parsed.timestamp) > tolerance)
|
|
128
|
+
return false;
|
|
129
|
+
const expected = hmac(options.secret, `${parsed.timestamp}.${options.body}`);
|
|
130
|
+
return timingSafeEqual(expected, parsed.v1);
|
|
131
|
+
}
|
|
132
|
+
function hmac(secret, message) {
|
|
133
|
+
return Hash.hmac256(Hex.fromString(secret), Hex.fromString(message)).slice(2);
|
|
134
|
+
}
|
|
135
|
+
function parseSignature(signature) {
|
|
136
|
+
let timestamp;
|
|
137
|
+
let v1;
|
|
138
|
+
for (const part of signature.split(',')) {
|
|
139
|
+
const [key, value] = part.split('=', 2);
|
|
140
|
+
if (key === 't' && value)
|
|
141
|
+
timestamp = Number(value);
|
|
142
|
+
else if (key === 'v1' && value)
|
|
143
|
+
v1 = value;
|
|
144
|
+
}
|
|
145
|
+
if (timestamp === undefined || Number.isNaN(timestamp) || !v1)
|
|
146
|
+
return null;
|
|
147
|
+
return { timestamp, v1 };
|
|
148
|
+
}
|
|
149
|
+
function timingSafeEqual(a, b) {
|
|
150
|
+
if (a.length !== b.length)
|
|
151
|
+
return false;
|
|
152
|
+
let mismatch = 0;
|
|
153
|
+
for (let index = 0; index < a.length; index++)
|
|
154
|
+
mismatch |= a.charCodeAt(index) ^ b.charCodeAt(index);
|
|
155
|
+
return mismatch === 0;
|
|
156
|
+
}
|
|
157
|
+
/** Thrown when a subscriber URL fails SSRF/format validation. */
|
|
158
|
+
export class InvalidUrlError extends Error {
|
|
159
|
+
/** Why the URL was rejected. */
|
|
160
|
+
reason;
|
|
161
|
+
/** The rejected URL. */
|
|
162
|
+
url;
|
|
163
|
+
constructor(reason, url) {
|
|
164
|
+
super(`Webhook URL rejected (${reason}): ${url}`);
|
|
165
|
+
this.name = 'Webhooks.InvalidUrlError';
|
|
166
|
+
this.reason = reason;
|
|
167
|
+
this.url = url;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=WebhookDestination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebhookDestination.js","sourceRoot":"","sources":["../../src/internal/WebhookDestination.ts"],"names":[],"mappings":"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"}
|