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,489 @@
|
|
|
1
|
+
import { nanoid } from 'nanoid';
|
|
2
|
+
import { Hash, Hex } from 'ox';
|
|
3
|
+
import * as MetricSink from './MetricSink.js';
|
|
4
|
+
import * as Store from './Store.js';
|
|
5
|
+
import * as WebhookDestination from './WebhookDestination.js';
|
|
6
|
+
export { InvalidUrlError, sign, signatureHeader, verify } from './WebhookDestination.js';
|
|
7
|
+
/**
|
|
8
|
+
* Creates a subscription, validating its URL and (optionally) enforcing a
|
|
9
|
+
* per-owner cap, then persists it and indexes it for the poller.
|
|
10
|
+
*/
|
|
11
|
+
export async function createSubscription(store, input, options = {}) {
|
|
12
|
+
WebhookDestination.assertDestination(input.destination);
|
|
13
|
+
if (options.maxPerOwner !== undefined) {
|
|
14
|
+
const existing = await listSubscriptions(store, input.owner);
|
|
15
|
+
if (existing.length >= options.maxPerOwner)
|
|
16
|
+
throw new LimitExceededError(options.maxPerOwner);
|
|
17
|
+
}
|
|
18
|
+
const now = (options.now ?? (() => new Date()))();
|
|
19
|
+
const iso = now.toISOString();
|
|
20
|
+
const subscription = {
|
|
21
|
+
chainId: input.chainId,
|
|
22
|
+
...(input.context === undefined ? {} : { context: input.context }),
|
|
23
|
+
createdAt: iso,
|
|
24
|
+
destination: input.destination,
|
|
25
|
+
eventType: input.eventType,
|
|
26
|
+
failureCount: 0,
|
|
27
|
+
filters: input.filters ?? {},
|
|
28
|
+
id: generateId(now),
|
|
29
|
+
owner: input.owner,
|
|
30
|
+
secret: generateSecret(),
|
|
31
|
+
status: 'active',
|
|
32
|
+
updatedAt: iso,
|
|
33
|
+
...(input.ttl === undefined
|
|
34
|
+
? {}
|
|
35
|
+
: { expiresAt: new Date(now.getTime() + input.ttl).toISOString() }),
|
|
36
|
+
};
|
|
37
|
+
await writeSubscription(store, subscription);
|
|
38
|
+
return subscription;
|
|
39
|
+
}
|
|
40
|
+
/** Reads a single subscription scoped to its owner. Returns null when absent. */
|
|
41
|
+
export async function getSubscription(store, owner, id) {
|
|
42
|
+
return readSubscription(store, subscriptionKey(owner, id));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Lists an owner's subscriptions, newest first, with optional keyset paging.
|
|
46
|
+
* Subscription ids embed a timestamp, so lexical key order is chronological.
|
|
47
|
+
*/
|
|
48
|
+
export async function listSubscriptions(store, owner, options = {}) {
|
|
49
|
+
const prefix = subscriptionPrefix(owner);
|
|
50
|
+
const { keys } = await store.list({ prefix });
|
|
51
|
+
// Newest first: ids sort chronologically ascending, so reverse for descending.
|
|
52
|
+
let names = keys
|
|
53
|
+
.map((key) => key.name)
|
|
54
|
+
.sort()
|
|
55
|
+
.reverse();
|
|
56
|
+
if (options.cursor)
|
|
57
|
+
names = names.filter((name) => name < `${prefix}${options.cursor}`);
|
|
58
|
+
if (options.offset)
|
|
59
|
+
names = names.slice(options.offset);
|
|
60
|
+
if (options.limit !== undefined)
|
|
61
|
+
names = names.slice(0, options.limit);
|
|
62
|
+
// Hydrate the page in parallel: the reads are independent, and a serial
|
|
63
|
+
// loop costs one store round trip per row (an N+1 against the production
|
|
64
|
+
// Durable Object).
|
|
65
|
+
const subscriptions = await Promise.all(names.map((name) => readSubscription(store, name)));
|
|
66
|
+
return subscriptions.filter((subscription) => subscription !== null);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Counts an owner's subscriptions. Reads only the key set under the owner
|
|
70
|
+
* prefix (no row hydration), so it's a single store `list` — exact and cheap,
|
|
71
|
+
* since the per-owner set is bounded by `maxPerOwner`. Feeds the opt-in
|
|
72
|
+
* `meta.totalCount` on `GET /webhooks`.
|
|
73
|
+
*/
|
|
74
|
+
export async function countSubscriptions(store, owner) {
|
|
75
|
+
const { keys } = await store.list({ prefix: subscriptionPrefix(owner) });
|
|
76
|
+
return keys.length;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Patches an owner's subscription, re-validating the URL when changed and
|
|
80
|
+
* re-indexing for the poller when the status changes. Returns null when absent.
|
|
81
|
+
*/
|
|
82
|
+
export async function updateSubscription(store, owner, id, patch, options = {}) {
|
|
83
|
+
const current = await getSubscription(store, owner, id);
|
|
84
|
+
if (!current)
|
|
85
|
+
return null;
|
|
86
|
+
if (patch.destination !== undefined)
|
|
87
|
+
WebhookDestination.assertDestination(patch.destination);
|
|
88
|
+
const now = (options.now ?? (() => new Date()))();
|
|
89
|
+
const next = {
|
|
90
|
+
...current,
|
|
91
|
+
// `context: null` clears it (stored as undefined; drops from JSON + reads).
|
|
92
|
+
...(patch.context === undefined
|
|
93
|
+
? {}
|
|
94
|
+
: { context: patch.context === null ? undefined : patch.context }),
|
|
95
|
+
...(patch.destination === undefined ? {} : { destination: patch.destination }),
|
|
96
|
+
...(patch.filters === undefined ? {} : { filters: patch.filters }),
|
|
97
|
+
...(patch.status === undefined ? {} : { status: patch.status }),
|
|
98
|
+
updatedAt: now.toISOString(),
|
|
99
|
+
};
|
|
100
|
+
await writeSubscription(store, next);
|
|
101
|
+
return next;
|
|
102
|
+
}
|
|
103
|
+
/** Deletes an owner's subscription and its index/cursor keys. */
|
|
104
|
+
export async function deleteSubscription(store, owner, id) {
|
|
105
|
+
const current = await getSubscription(store, owner, id);
|
|
106
|
+
if (!current)
|
|
107
|
+
return false;
|
|
108
|
+
await store.delete(subscriptionKey(owner, id));
|
|
109
|
+
await store.delete(activeKey(current.chainId, current.eventType, id));
|
|
110
|
+
await store.delete(cursorKey(id));
|
|
111
|
+
// Drop the delivery log so a deleted subscription leaves no orphaned rows.
|
|
112
|
+
const { keys } = await store.list({ prefix: deliveryPrefix(id) });
|
|
113
|
+
for (const { name } of keys)
|
|
114
|
+
await store.delete(name);
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Lists active subscriptions for a `(chainId, eventType)` stream. Used by the
|
|
119
|
+
* poller; reads the secondary index, then hydrates each subscription.
|
|
120
|
+
*/
|
|
121
|
+
export async function listActive(store, chainId, eventType) {
|
|
122
|
+
const { keys } = await store.list({ prefix: activePrefix(chainId, eventType) });
|
|
123
|
+
const subscriptions = [];
|
|
124
|
+
for (const { name } of keys) {
|
|
125
|
+
const subKey = await store.get(name);
|
|
126
|
+
if (!subKey)
|
|
127
|
+
continue;
|
|
128
|
+
const subscription = await readSubscription(store, subKey);
|
|
129
|
+
if (subscription)
|
|
130
|
+
subscriptions.push(subscription);
|
|
131
|
+
}
|
|
132
|
+
return subscriptions;
|
|
133
|
+
}
|
|
134
|
+
/** Reads a subscription's keyset cursor. Returns null when unset. */
|
|
135
|
+
export async function getCursor(store, subscriptionId) {
|
|
136
|
+
return store.get(cursorKey(subscriptionId));
|
|
137
|
+
}
|
|
138
|
+
/** Writes a subscription's keyset cursor. */
|
|
139
|
+
export async function setCursor(store, subscriptionId, cursor) {
|
|
140
|
+
await store.put(cursorKey(subscriptionId), cursor);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Default delivery-log retention. Rows are written with this TTL so a busy
|
|
144
|
+
* subscription's log doesn't grow unbounded; tune per deployment.
|
|
145
|
+
*/
|
|
146
|
+
export const deliveryRetentionMs = 7 * 24 * 60 * 60 * 1_000;
|
|
147
|
+
/** Records one delivery-log row (stateful, owner-agnostic; scoped per subscription). */
|
|
148
|
+
export async function recordDelivery(store, delivery, options = {}) {
|
|
149
|
+
const ttl = options.ttl ?? deliveryRetentionMs;
|
|
150
|
+
await store.put(deliveryKey(delivery.subscriptionId, delivery.id), JSON.stringify(delivery), {
|
|
151
|
+
ttl,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Lists a subscription's delivery log, newest first, with optional keyset
|
|
156
|
+
* paging. Delivery ids embed a timestamp, so lexical key order is chronological.
|
|
157
|
+
*/
|
|
158
|
+
export async function listDeliveries(store, subscriptionId, options = {}) {
|
|
159
|
+
const prefix = deliveryPrefix(subscriptionId);
|
|
160
|
+
const { keys } = await store.list({ prefix });
|
|
161
|
+
// Newest first: ids sort chronologically ascending, so reverse for descending.
|
|
162
|
+
let names = keys
|
|
163
|
+
.map((key) => key.name)
|
|
164
|
+
.sort()
|
|
165
|
+
.reverse();
|
|
166
|
+
if (options.cursor)
|
|
167
|
+
names = names.filter((name) => name < `${prefix}${options.cursor}`);
|
|
168
|
+
if (options.offset)
|
|
169
|
+
names = names.slice(options.offset);
|
|
170
|
+
if (options.limit !== undefined)
|
|
171
|
+
names = names.slice(0, options.limit);
|
|
172
|
+
// Hydrate the page in parallel: the reads are independent, and a serial
|
|
173
|
+
// loop costs one store round trip per row (an N+1 against the production
|
|
174
|
+
// Durable Object).
|
|
175
|
+
const deliveries = await Promise.all(names.map((name) => readDelivery(store, name)));
|
|
176
|
+
return deliveries.filter((delivery) => delivery !== null);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Counts a subscription's delivery-log entries. Reads only the key set under
|
|
180
|
+
* the delivery prefix (no row hydration), so it's a single store `list` —
|
|
181
|
+
* exact, and bounded by the delivery retention TTL. Feeds the opt-in
|
|
182
|
+
* `meta.totalCount` on `GET /webhooks/:id/deliveries`.
|
|
183
|
+
*/
|
|
184
|
+
export async function countDeliveries(store, subscriptionId) {
|
|
185
|
+
const { keys } = await store.list({ prefix: deliveryPrefix(subscriptionId) });
|
|
186
|
+
return keys.length;
|
|
187
|
+
}
|
|
188
|
+
/** Loads a single delivery-log row (`null` when absent), scoped to its subscription. */
|
|
189
|
+
export async function getDelivery(store, subscriptionId, deliveryId) {
|
|
190
|
+
return readDelivery(store, deliveryKey(subscriptionId, deliveryId));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Default number of consecutive delivery failures after which a subscription
|
|
194
|
+
* auto-disables (and is dropped from the poller's active index).
|
|
195
|
+
*/
|
|
196
|
+
export const maxFailures = 10;
|
|
197
|
+
/**
|
|
198
|
+
* Records a successful delivery: resets the consecutive-failure counter and
|
|
199
|
+
* stamps `lastDeliveryAt`. Returns the updated subscription (re-persisted so the
|
|
200
|
+
* poller's active index and TTL stay correct).
|
|
201
|
+
*/
|
|
202
|
+
export async function recordSuccess(store, subscription, options = {}) {
|
|
203
|
+
const now = (options.now ?? (() => new Date()))();
|
|
204
|
+
const next = {
|
|
205
|
+
...subscription,
|
|
206
|
+
failureCount: 0,
|
|
207
|
+
lastDeliveryAt: now.toISOString(),
|
|
208
|
+
updatedAt: now.toISOString(),
|
|
209
|
+
};
|
|
210
|
+
await writeSubscription(store, next);
|
|
211
|
+
return next;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Records a failed delivery: increments the consecutive-failure counter and,
|
|
215
|
+
* once it reaches `maxFailures`, sets `status: 'disabled'` so the subscription
|
|
216
|
+
* drops out of the poller's active index (surfaced via the API). Returns the
|
|
217
|
+
* updated subscription.
|
|
218
|
+
*/
|
|
219
|
+
export async function recordFailure(store, subscription, options = {}) {
|
|
220
|
+
const now = (options.now ?? (() => new Date()))();
|
|
221
|
+
const failureCount = subscription.failureCount + 1;
|
|
222
|
+
const disabled = failureCount >= (options.maxFailures ?? maxFailures);
|
|
223
|
+
const next = {
|
|
224
|
+
...subscription,
|
|
225
|
+
failureCount,
|
|
226
|
+
...(disabled ? { status: 'disabled' } : {}),
|
|
227
|
+
updatedAt: now.toISOString(),
|
|
228
|
+
};
|
|
229
|
+
await writeSubscription(store, next);
|
|
230
|
+
return next;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Delivers an envelope to its subscription and records the outcome: success
|
|
234
|
+
* resets the failure counter and stamps `lastDeliveryAt`; failure increments it
|
|
235
|
+
* and auto-disables after {@link maxFailures}. This is the single delivery entry
|
|
236
|
+
* point shared by the Cloudflare Queue consumer and the self-host inline path.
|
|
237
|
+
*/
|
|
238
|
+
export async function deliverAndRecord(store, subscription, envelope, options = {}) {
|
|
239
|
+
// Snapshot the attempt before recordSuccess/recordFailure mutate the counter.
|
|
240
|
+
const attempt = subscription.failureCount + 1;
|
|
241
|
+
const result = await WebhookDestination.from(subscription.destination).deliver({
|
|
242
|
+
envelope,
|
|
243
|
+
secret: subscription.secret,
|
|
244
|
+
...(options.fetch === undefined ? {} : { fetch: options.fetch }),
|
|
245
|
+
...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
|
|
246
|
+
});
|
|
247
|
+
if (result.ok)
|
|
248
|
+
await recordSuccess(store, subscription, options);
|
|
249
|
+
else
|
|
250
|
+
await recordFailure(store, subscription, options);
|
|
251
|
+
// Emit a `webhook:delivery` metric. recordSuccess/recordFailure are immutable
|
|
252
|
+
// (they spread into a new record), so `subscription.failureCount` here is still
|
|
253
|
+
// the pre-mutation snapshot the sink needs to derive the attempt bucket.
|
|
254
|
+
// Best-effort, like delivery logging.
|
|
255
|
+
const metrics = options.metrics ? MetricSink.webhooks(options.metrics) : undefined;
|
|
256
|
+
if (metrics) {
|
|
257
|
+
metrics.record({
|
|
258
|
+
envelope,
|
|
259
|
+
result,
|
|
260
|
+
subscription,
|
|
261
|
+
trigger: options.trigger ?? 'queue',
|
|
262
|
+
type: 'webhook:delivery',
|
|
263
|
+
});
|
|
264
|
+
metrics.flush();
|
|
265
|
+
}
|
|
266
|
+
// Append a delivery-log row. Best-effort: a logging failure must never change
|
|
267
|
+
// the delivery outcome the caller (Queue consumer / inline path) acts on.
|
|
268
|
+
try {
|
|
269
|
+
await recordDelivery(store, buildDelivery({ attempt, envelope, result, subscription }, options), options.deliveryRetentionMs === undefined ? {} : { ttl: options.deliveryRetentionMs });
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// delivery logging is best-effort
|
|
273
|
+
}
|
|
274
|
+
return result;
|
|
275
|
+
}
|
|
276
|
+
/** Builds a delivery-log row from an attempt's envelope and classified result. */
|
|
277
|
+
function buildDelivery(input, options = {}) {
|
|
278
|
+
const { attempt, envelope, result, subscription } = input;
|
|
279
|
+
const now = (options.now ?? (() => new Date()))();
|
|
280
|
+
return {
|
|
281
|
+
attempt,
|
|
282
|
+
createdAt: now.toISOString(),
|
|
283
|
+
envelope,
|
|
284
|
+
eventId: envelope.id,
|
|
285
|
+
id: generateDeliveryId(now),
|
|
286
|
+
requestUrl: WebhookDestination.destinationLabel(subscription.destination),
|
|
287
|
+
status: result.ok ? 'succeeded' : 'failed',
|
|
288
|
+
subscriptionId: subscription.id,
|
|
289
|
+
...(result.error === undefined ? {} : { error: result.error }),
|
|
290
|
+
...(result.durationMs === undefined ? {} : { responseMs: result.durationMs }),
|
|
291
|
+
...(result.status === undefined ? {} : { responseStatus: result.status }),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Computes a stable, idempotent event id from its on-chain coordinates so
|
|
296
|
+
* re-deliveries are dedupable by the receiver.
|
|
297
|
+
*/
|
|
298
|
+
export function eventId(options) {
|
|
299
|
+
const input = `${options.chainId}:${options.eventType}:${options.blockNumber}:${options.logIndex}`;
|
|
300
|
+
return `evt_${Hash.sha256(Hex.fromString(input)).slice(2)}`;
|
|
301
|
+
}
|
|
302
|
+
/** Builds a delivery envelope for an event matched against a subscription. */
|
|
303
|
+
export function buildEnvelope(options) {
|
|
304
|
+
const { subscription } = options;
|
|
305
|
+
return {
|
|
306
|
+
chainId: subscription.chainId,
|
|
307
|
+
...(subscription.context === undefined ? {} : { context: subscription.context }),
|
|
308
|
+
createdAt: (options.createdAt ?? new Date()).toISOString(),
|
|
309
|
+
data: options.data,
|
|
310
|
+
id: eventId({
|
|
311
|
+
blockNumber: options.blockNumber,
|
|
312
|
+
chainId: subscription.chainId,
|
|
313
|
+
eventType: subscription.eventType,
|
|
314
|
+
logIndex: options.logIndex,
|
|
315
|
+
}),
|
|
316
|
+
subscriptionId: subscription.id,
|
|
317
|
+
type: subscription.eventType,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Builds a synthetic `ping` envelope so an owner can test a subscription's
|
|
322
|
+
* endpoint (connectivity, TLS, signature verification) without waiting for a real
|
|
323
|
+
* on-chain event. The id is randomized per call so repeated pings are never
|
|
324
|
+
* deduped by the receiver; `type` is `ping` and `data` is a recognizable
|
|
325
|
+
* `{ ping: true }` marker rather than an event row, so receivers can tell a test
|
|
326
|
+
* delivery apart from a real event.
|
|
327
|
+
*/
|
|
328
|
+
export function buildPingEnvelope(subscription, options = {}) {
|
|
329
|
+
const now = options.createdAt ?? new Date();
|
|
330
|
+
const nonce = options.nonce ?? Hex.random(16).slice(2);
|
|
331
|
+
return {
|
|
332
|
+
chainId: subscription.chainId,
|
|
333
|
+
...(subscription.context === undefined ? {} : { context: subscription.context }),
|
|
334
|
+
createdAt: now.toISOString(),
|
|
335
|
+
data: { ping: true },
|
|
336
|
+
id: `evt_${Hash.sha256(Hex.fromString(`ping:${subscription.id}:${nonce}`)).slice(2)}`,
|
|
337
|
+
subscriptionId: subscription.id,
|
|
338
|
+
type: 'ping',
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Delivers a synthetic {@link buildPingEnvelope} to a subscription's endpoint and
|
|
343
|
+
* logs the attempt. Unlike {@link deliverAndRecord} it deliberately does NOT
|
|
344
|
+
* touch the subscription's `failureCount`/`status`: a test ping must never
|
|
345
|
+
* auto-disable a healthy subscription or reset a real failure streak. The
|
|
346
|
+
* delivery row is still appended (best-effort) so the ping is observable via the
|
|
347
|
+
* delivery log.
|
|
348
|
+
*/
|
|
349
|
+
export async function ping(store, subscription, options = {}) {
|
|
350
|
+
const now = options.now ?? (() => new Date());
|
|
351
|
+
const envelope = buildPingEnvelope(subscription, {
|
|
352
|
+
createdAt: now(),
|
|
353
|
+
...(options.nonce === undefined ? {} : { nonce: options.nonce }),
|
|
354
|
+
});
|
|
355
|
+
const result = await WebhookDestination.from(subscription.destination).deliver({
|
|
356
|
+
envelope,
|
|
357
|
+
secret: subscription.secret,
|
|
358
|
+
...(options.fetch === undefined ? {} : { fetch: options.fetch }),
|
|
359
|
+
...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
|
|
360
|
+
});
|
|
361
|
+
// Best-effort: a logging failure must never change the result the caller sees.
|
|
362
|
+
const delivery = buildDelivery({ attempt: 1, envelope, result, subscription }, { now });
|
|
363
|
+
try {
|
|
364
|
+
await recordDelivery(store, delivery, options.deliveryRetentionMs === undefined ? {} : { ttl: options.deliveryRetentionMs });
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
// delivery logging is best-effort
|
|
368
|
+
}
|
|
369
|
+
return { delivery, envelope, result };
|
|
370
|
+
}
|
|
371
|
+
function ownerKey(owner) {
|
|
372
|
+
return owner.type === 'api_key'
|
|
373
|
+
? `api_key:${encodeURIComponent(owner.orgId)}`
|
|
374
|
+
: `mpp:${encodeURIComponent(owner.payer)}`;
|
|
375
|
+
}
|
|
376
|
+
function subscriptionPrefix(owner) {
|
|
377
|
+
return `webhook:sub:${ownerKey(owner)}:`;
|
|
378
|
+
}
|
|
379
|
+
function subscriptionKey(owner, id) {
|
|
380
|
+
return `${subscriptionPrefix(owner)}${id}`;
|
|
381
|
+
}
|
|
382
|
+
function cursorKey(subscriptionId) {
|
|
383
|
+
return `webhook:cursor:${subscriptionId}`;
|
|
384
|
+
}
|
|
385
|
+
function deliveryPrefix(subscriptionId) {
|
|
386
|
+
return `webhook:delivery:${subscriptionId}:`;
|
|
387
|
+
}
|
|
388
|
+
function deliveryKey(subscriptionId, deliveryId) {
|
|
389
|
+
return `${deliveryPrefix(subscriptionId)}${deliveryId}`;
|
|
390
|
+
}
|
|
391
|
+
function activePrefix(chainId, eventType) {
|
|
392
|
+
return `webhook:active:${chainId}:${eventType}:`;
|
|
393
|
+
}
|
|
394
|
+
function activeKey(chainId, eventType, id) {
|
|
395
|
+
return `${activePrefix(chainId, eventType)}${id}`;
|
|
396
|
+
}
|
|
397
|
+
async function readSubscription(store, key) {
|
|
398
|
+
const raw = await store.get(key);
|
|
399
|
+
if (!raw)
|
|
400
|
+
return null;
|
|
401
|
+
try {
|
|
402
|
+
return JSON.parse(raw);
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
// Corrupt entries are treated as absent.
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
async function readDelivery(store, key) {
|
|
410
|
+
const raw = await store.get(key);
|
|
411
|
+
if (!raw)
|
|
412
|
+
return null;
|
|
413
|
+
try {
|
|
414
|
+
return JSON.parse(raw);
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
// Corrupt entries are treated as absent.
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
async function writeSubscription(store, subscription) {
|
|
422
|
+
const ttl = ttlFor(subscription);
|
|
423
|
+
const key = subscriptionKey(subscription.owner, subscription.id);
|
|
424
|
+
await store.put(key, JSON.stringify(subscription), { ttl });
|
|
425
|
+
// Mirror status into the poller's secondary index: only `active`
|
|
426
|
+
// subscriptions are polled. The index value is the subscription's storage key
|
|
427
|
+
// so the poller can hydrate without knowing the owner.
|
|
428
|
+
const indexKey = activeKey(subscription.chainId, subscription.eventType, subscription.id);
|
|
429
|
+
if (subscription.status === 'active')
|
|
430
|
+
await store.put(indexKey, key, { ttl });
|
|
431
|
+
else
|
|
432
|
+
await store.delete(indexKey);
|
|
433
|
+
}
|
|
434
|
+
function ttlFor(subscription) {
|
|
435
|
+
if (!subscription.expiresAt)
|
|
436
|
+
return undefined;
|
|
437
|
+
return Math.max(1, new Date(subscription.expiresAt).getTime() - Date.now());
|
|
438
|
+
}
|
|
439
|
+
function generateId(now) {
|
|
440
|
+
// Zero-pad the epoch-ms so ids sort chronologically by string comparison
|
|
441
|
+
// (mirroring delivery ids), letting listSubscriptions page newest-first; 15
|
|
442
|
+
// digits leaves headroom well past the year 5138.
|
|
443
|
+
const timestamp = now.getTime().toString().padStart(15, '0');
|
|
444
|
+
return `wh_${timestamp}_${nanoid()}`;
|
|
445
|
+
}
|
|
446
|
+
function generateDeliveryId(now) {
|
|
447
|
+
// Zero-pad the epoch-ms so ids sort chronologically by string comparison; 15
|
|
448
|
+
// digits leaves headroom well past the year 5138.
|
|
449
|
+
const timestamp = now.getTime().toString().padStart(15, '0');
|
|
450
|
+
return `whd_${timestamp}_${nanoid()}`;
|
|
451
|
+
}
|
|
452
|
+
function generateSecret() {
|
|
453
|
+
return `whsec_${Hex.random(32).slice(2)}`;
|
|
454
|
+
}
|
|
455
|
+
export class LimitExceededError extends Error {
|
|
456
|
+
/** The cap that was reached. */
|
|
457
|
+
limit;
|
|
458
|
+
constructor(limit) {
|
|
459
|
+
super(`Webhook subscription limit reached (${limit}).`);
|
|
460
|
+
this.name = 'Webhooks.LimitExceededError';
|
|
461
|
+
this.limit = limit;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Thrown when a subscription's `filters` fail to validate against the schema for
|
|
466
|
+
* its `eventType`. The detection path treats stored filters as **fail-closed**:
|
|
467
|
+
* an invalid filter never degrades to a firehose, so the API rejects bad filters
|
|
468
|
+
* at create/patch time rather than silently widening the match set later.
|
|
469
|
+
*/
|
|
470
|
+
export class InvalidFilterError extends Error {
|
|
471
|
+
/** Event type whose filters failed validation. */
|
|
472
|
+
eventType;
|
|
473
|
+
/** Per-field validation issues, suitable for an API error `details` array. */
|
|
474
|
+
details;
|
|
475
|
+
constructor(eventType, details = []) {
|
|
476
|
+
super(`Invalid filters for "${eventType}" webhook subscription.`);
|
|
477
|
+
this.name = 'Webhooks.InvalidFilterError';
|
|
478
|
+
this.eventType = eventType;
|
|
479
|
+
this.details = details;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
/** Thrown when webhook operations run without a configured state store. */
|
|
483
|
+
export class UnconfiguredError extends Error {
|
|
484
|
+
constructor() {
|
|
485
|
+
super('Webhooks are not configured for this deployment.');
|
|
486
|
+
this.name = 'Webhooks.UnconfiguredError';
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=Webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Webhooks.js","sourceRoot":"","sources":["../../src/internal/Webhooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as WebhookDestination from '../WebhookDestination.js';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a `betterstack` destination. Its `deliver` formats the envelope into a
|
|
4
|
+
* structured log event and POSTs it to the Better Stack ingest URL authenticated
|
|
5
|
+
* with the source token (`Authorization: Bearer …`; host-locked to
|
|
6
|
+
* `*.betterstackdata.com`). Deliver with `.deliver({ envelope })`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function betterStack(options: betterStack.Options): WebhookDestination.Instance<WebhookDestination.BetterStack>;
|
|
9
|
+
export declare namespace betterStack {
|
|
10
|
+
/** Options for {@link betterStack}. */
|
|
11
|
+
type Options = {
|
|
12
|
+
/** Better Stack source token, sent as `Authorization: Bearer …`. */
|
|
13
|
+
token: string;
|
|
14
|
+
/** Better Stack ingest host URL (`https://<host>.betterstackdata.com`). */
|
|
15
|
+
url: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Validates a `betterstack` destination's ingest URL: must be `https` and hosted
|
|
20
|
+
* under {@link betterstackHostSuffix} (`s95.eu-nbg-2.betterstackdata.com` etc.).
|
|
21
|
+
* As with Slack, the host lock keeps `betterstack` from becoming a generic
|
|
22
|
+
* "POST anywhere with a bearer token" primitive — the source token is attached
|
|
23
|
+
* server-side, so the request must only ever reach Better Stack.
|
|
24
|
+
*/
|
|
25
|
+
export declare function assertBetterstackUrl(input: string): URL;
|
|
26
|
+
//# sourceMappingURL=betterStack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"betterStack.d.ts","sourceRoot":"","sources":["../../../src/internal/webhookDestinations/betterStack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAA;AAE9D;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,CAAC,OAAO,GAC3B,kBAAkB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,WAAW,CAAC,CA2C7D;AAED,MAAM,CAAC,OAAO,WAAW,WAAW,CAAC;IACnC,uCAAuC;IACvC,KAAK,OAAO,GAAG;QACb,oEAAoE;QACpE,KAAK,EAAE,MAAM,CAAA;QACb,2EAA2E;QAC3E,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;CACF;AAKD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAevD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as WebhookDestination from '../WebhookDestination.js';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a `betterstack` destination. Its `deliver` formats the envelope into a
|
|
4
|
+
* structured log event and POSTs it to the Better Stack ingest URL authenticated
|
|
5
|
+
* with the source token (`Authorization: Bearer …`; host-locked to
|
|
6
|
+
* `*.betterstackdata.com`). Deliver with `.deliver({ envelope })`.
|
|
7
|
+
*/
|
|
8
|
+
export function betterStack(options) {
|
|
9
|
+
const { token, url } = options;
|
|
10
|
+
assertBetterstackUrl(url);
|
|
11
|
+
return {
|
|
12
|
+
deliver(deliverOptions) {
|
|
13
|
+
const { envelope } = deliverOptions;
|
|
14
|
+
return WebhookDestination.send({
|
|
15
|
+
// A structured log event: a human-readable `message`, a `dt` timestamp
|
|
16
|
+
// (Better Stack indexes this as the event time), and the raw event
|
|
17
|
+
// fields flattened alongside for querying.
|
|
18
|
+
body: JSON.stringify({
|
|
19
|
+
chainId: envelope.chainId,
|
|
20
|
+
data: envelope.data,
|
|
21
|
+
...(envelope.context?.description === undefined
|
|
22
|
+
? {}
|
|
23
|
+
: { description: envelope.context.description }),
|
|
24
|
+
dt: envelope.createdAt,
|
|
25
|
+
event: envelope.type,
|
|
26
|
+
eventId: envelope.id,
|
|
27
|
+
// The subscription's `context.title` (what the webhook is for) becomes
|
|
28
|
+
// the log `message` when set; otherwise fall back to the event identity.
|
|
29
|
+
message: envelope.context?.title ??
|
|
30
|
+
(envelope.type === 'ping'
|
|
31
|
+
? 'Tempo webhook test ping'
|
|
32
|
+
: `Tempo event: ${envelope.type}`),
|
|
33
|
+
...(envelope.context?.metadata === undefined
|
|
34
|
+
? {}
|
|
35
|
+
: { metadata: envelope.context.metadata }),
|
|
36
|
+
subscriptionId: envelope.subscriptionId,
|
|
37
|
+
}),
|
|
38
|
+
errorPrefix: 'betterstack ',
|
|
39
|
+
fetch: deliverOptions.fetch,
|
|
40
|
+
headers: { authorization: `Bearer ${token}` },
|
|
41
|
+
now: deliverOptions.now,
|
|
42
|
+
timeoutMs: deliverOptions.timeoutMs,
|
|
43
|
+
url,
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
token,
|
|
47
|
+
type: 'betterstack',
|
|
48
|
+
url,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Host suffix that Better Stack ingest URLs must use. */
|
|
52
|
+
const betterstackHostSuffix = '.betterstackdata.com';
|
|
53
|
+
/**
|
|
54
|
+
* Validates a `betterstack` destination's ingest URL: must be `https` and hosted
|
|
55
|
+
* under {@link betterstackHostSuffix} (`s95.eu-nbg-2.betterstackdata.com` etc.).
|
|
56
|
+
* As with Slack, the host lock keeps `betterstack` from becoming a generic
|
|
57
|
+
* "POST anywhere with a bearer token" primitive — the source token is attached
|
|
58
|
+
* server-side, so the request must only ever reach Better Stack.
|
|
59
|
+
*/
|
|
60
|
+
export function assertBetterstackUrl(input) {
|
|
61
|
+
let url;
|
|
62
|
+
try {
|
|
63
|
+
url = new URL(input);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new WebhookDestination.InvalidUrlError('malformed', input);
|
|
67
|
+
}
|
|
68
|
+
if (url.protocol !== 'https:')
|
|
69
|
+
throw new WebhookDestination.InvalidUrlError('protocol', input);
|
|
70
|
+
if (url.username || url.password)
|
|
71
|
+
throw new WebhookDestination.InvalidUrlError('credentials', input);
|
|
72
|
+
if (!url.hostname.endsWith(betterstackHostSuffix))
|
|
73
|
+
throw new WebhookDestination.InvalidUrlError('betterstack_host', input);
|
|
74
|
+
return url;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=betterStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"betterStack.js","sourceRoot":"","sources":["../../../src/internal/webhookDestinations/betterStack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,kBAAkB,MAAM,0BAA0B,CAAA;AAE9D;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,OAA4B;IAE5B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;IAC9B,oBAAoB,CAAC,GAAG,CAAC,CAAA;IACzB,OAAO;QACL,OAAO,CAAC,cAAc;YACpB,MAAM,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAA;YACnC,OAAO,kBAAkB,CAAC,IAAI,CAAC;gBAC7B,uEAAuE;gBACvE,mEAAmE;gBACnE,2CAA2C;gBAC3C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS;wBAC7C,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;oBAClD,EAAE,EAAE,QAAQ,CAAC,SAAS;oBACtB,KAAK,EAAE,QAAQ,CAAC,IAAI;oBACpB,OAAO,EAAE,QAAQ,CAAC,EAAE;oBACpB,uEAAuE;oBACvE,yEAAyE;oBACzE,OAAO,EACL,QAAQ,CAAC,OAAO,EAAE,KAAK;wBACvB,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM;4BACvB,CAAC,CAAC,yBAAyB;4BAC3B,CAAC,CAAC,gBAAgB,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACtC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,KAAK,SAAS;wBAC1C,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC5C,cAAc,EAAE,QAAQ,CAAC,cAAc;iBACxC,CAAC;gBACF,WAAW,EAAE,cAAc;gBAC3B,KAAK,EAAE,cAAc,CAAC,KAAK;gBAC3B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;gBAC7C,GAAG,EAAE,cAAc,CAAC,GAAG;gBACvB,SAAS,EAAE,cAAc,CAAC,SAAS;gBACnC,GAAG;aACJ,CAAC,CAAA;QACJ,CAAC;QACD,KAAK;QACL,IAAI,EAAE,aAAa;QACnB,GAAG;KACJ,CAAA;AACH,CAAC;AAYD,0DAA0D;AAC1D,MAAM,qBAAqB,GAAG,sBAAsB,CAAA;AAEpD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,GAAQ,CAAA;IACZ,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IAClE,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC9F,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ;QAC9B,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;IACpE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC/C,MAAM,IAAI,kBAAkB,CAAC,eAAe,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;IAEzE,OAAO,GAAG,CAAA;AACZ,CAAC"}
|