tapimo 0.10.2 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts +4896 -2166
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +2 -2
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +15 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +7 -0
- package/dist/Assets.js.map +1 -1
- package/dist/Webhooks.d.ts +0 -75
- package/dist/Webhooks.d.ts.map +1 -1
- package/dist/Webhooks.js +1 -143
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/App.d.ts +127 -78
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +115 -1
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +59 -6
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +3 -3
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +4 -2
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +83 -83
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +151 -151
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/apps/data/App.d.ts +5924 -4310
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +61 -9
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/ZoneSelection.d.ts +62 -0
- package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
- package/dist/apps/data/ZoneSelection.js +44 -0
- package/dist/apps/data/ZoneSelection.js.map +1 -0
- package/dist/apps/data/routes/activities.d.ts +2368 -5
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +423 -114
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +131 -0
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.d.ts +25 -25
- package/dist/apps/data/routes/balances.js +1 -1
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +1 -1
- package/dist/apps/data/routes/blocks.js +1 -1
- package/dist/apps/data/routes/blocks.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +135 -10
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +157 -25
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts +829 -123
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +16 -13
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +26 -26
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +9 -11
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +54 -54
- package/dist/apps/data/routes/receipts.js +1 -1
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.js +24 -10
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +12 -12
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +16 -15
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +17 -3
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +34 -15
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +1 -1
- package/dist/apps/data/routes/transactions.js +1 -1
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +13 -13
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +7 -9
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +21 -21
- package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
- package/dist/apps/data/routes/webhooks.d.ts +1011 -151
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +126 -739
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +15 -15
- package/dist/apps/funding/App.d.ts +27 -27
- package/dist/apps/funding/routes/chains.d.ts.map +1 -1
- package/dist/apps/funding/routes/chains.js +5 -4
- package/dist/apps/funding/routes/chains.js.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.d.ts +18 -18
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.js +8 -8
- package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/funding/routes/providers.d.ts.map +1 -1
- package/dist/apps/funding/routes/providers.js +3 -2
- package/dist/apps/funding/routes/providers.js.map +1 -1
- package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
- package/dist/apps/funding/routes/quotes.js +2 -2
- package/dist/apps/funding/routes/quotes.js.map +1 -1
- package/dist/apps/funding/routes/transfers.d.ts +33 -33
- package/dist/apps/management/App.d.ts +1433 -322
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +19 -6
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +154 -94
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +76 -30
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +103 -30
- package/dist/apps/management/routes/billing.d.ts.map +1 -1
- package/dist/apps/management/routes/billing.js +91 -32
- package/dist/apps/management/routes/billing.js.map +1 -1
- package/dist/apps/management/routes/faucet.d.ts +12 -12
- package/dist/apps/management/routes/faucet.d.ts.map +1 -1
- package/dist/apps/management/routes/faucet.js +23 -12
- package/dist/apps/management/routes/faucet.js.map +1 -1
- package/dist/apps/management/routes/invitations.d.ts +46 -13
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +79 -29
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +128 -83
- package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
- package/dist/apps/management/routes/invite-links.js +100 -41
- package/dist/apps/management/routes/invite-links.js.map +1 -1
- package/dist/apps/management/routes/me.d.ts +5 -5
- package/dist/apps/management/routes/me.d.ts.map +1 -1
- package/dist/apps/management/routes/me.js +14 -10
- package/dist/apps/management/routes/me.js.map +1 -1
- package/dist/apps/management/routes/members.d.ts +68 -47
- package/dist/apps/management/routes/members.d.ts.map +1 -1
- package/dist/apps/management/routes/members.js +37 -18
- package/dist/apps/management/routes/members.js.map +1 -1
- package/dist/apps/management/routes/orgs.d.ts +48 -8
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +48 -19
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +130 -68
- package/dist/apps/management/routes/projects.d.ts.map +1 -1
- package/dist/apps/management/routes/projects.js +72 -21
- package/dist/apps/management/routes/projects.js.map +1 -1
- package/dist/apps/management/routes/scopes.d.ts.map +1 -1
- package/dist/apps/management/routes/scopes.js +8 -5
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +38 -38
- package/dist/apps/management/routes/usage.d.ts.map +1 -1
- package/dist/apps/management/routes/usage.js +41 -31
- package/dist/apps/management/routes/usage.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +34 -6
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +36 -17
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +1186 -197
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +106 -38
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Adapter.js +12 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -1
- package/dist/db/Db.d.ts +2 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +61 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +30 -2
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +28 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +5 -0
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
- package/dist/db/tables/webhookDeliveries.js +10 -0
- package/dist/db/tables/webhookDeliveries.js.map +1 -1
- package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
- package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
- package/dist/db/tables/webhookQueueCompletions.js +32 -0
- package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
- package/dist/db/tables/webhookQueueEvents.d.ts +16 -20
- package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
- package/dist/db/tables/webhookQueueEvents.js +68 -43
- package/dist/db/tables/webhookQueueEvents.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +47 -72
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +92 -105
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/internal/Auth.d.ts +8 -1
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +13 -3
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +11 -7
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +41 -2
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +167 -0
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/MetricSink.d.ts +35 -125
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +50 -121
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +26 -22
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +128 -39
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Response.d.ts +13 -8
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Response.js +16 -5
- package/dist/internal/Response.js.map +1 -1
- package/dist/internal/Schema.d.ts +8 -8
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +10 -9
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +15 -6
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +45 -15
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +2 -0
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +16 -4
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/WebhookTransfer.d.ts +1 -55
- package/dist/internal/WebhookTransfer.d.ts.map +1 -1
- package/dist/internal/WebhookTransfer.js +1 -239
- package/dist/internal/WebhookTransfer.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +112 -56
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +124 -93
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/funding/Deposit.d.ts +2 -2
- package/dist/internal/funding/Deposit.d.ts.map +1 -1
- package/dist/internal/funding/Deposit.js +9 -8
- package/dist/internal/funding/Deposit.js.map +1 -1
- package/dist/internal/funding/DepositAddress.d.ts +4 -4
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
- package/dist/internal/funding/DepositAddress.js +9 -8
- package/dist/internal/funding/DepositAddress.js.map +1 -1
- package/dist/internal/funding/DepositWebhook.d.ts +25 -0
- package/dist/internal/funding/DepositWebhook.d.ts.map +1 -0
- package/dist/internal/funding/DepositWebhook.js +74 -0
- package/dist/internal/funding/DepositWebhook.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -1
- package/dist/internal/funding/Provider.js +13 -12
- package/dist/internal/funding/Provider.js.map +1 -1
- package/dist/internal/funding/Reconciliation.d.ts +6 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -1
- package/dist/internal/funding/Reconciliation.js +42 -10
- package/dist/internal/funding/Reconciliation.js.map +1 -1
- package/dist/internal/funding/index.d.ts +1 -0
- package/dist/internal/funding/index.d.ts.map +1 -1
- package/dist/internal/funding/index.js +1 -0
- package/dist/internal/funding/index.js.map +1 -1
- package/dist/internal/funding/providers/stargate.d.ts +19 -0
- package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
- package/dist/internal/funding/providers/stargate.js +143 -0
- package/dist/internal/funding/providers/stargate.js.map +1 -0
- package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
- package/dist/internal/webhookDestinations/slack.js +16 -0
- package/dist/internal/webhookDestinations/slack.js.map +1 -1
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +2 -2
- package/src/App.test.ts +48 -0
- package/src/App.ts +7 -2
- package/src/Assets.test.ts +18 -0
- package/src/Assets.ts +22 -0
- package/src/Client.test-d.ts +287 -17
- package/src/Webhooks.ts +1 -220
- package/src/admin/apps/earn-vaults.test.ts +143 -0
- package/src/admin/apps/earn-vaults.ts +83 -6
- package/src/admin/apps/organizations.ts +6 -2
- package/src/admin/ui/src/routes/api-keys.tsx +36 -0
- package/src/admin/ui.generated.ts +151 -189
- package/src/apps/data/App.test.ts +31 -0
- package/src/apps/data/App.ts +64 -10
- package/src/apps/data/ZoneSelection.test.ts +196 -0
- package/src/apps/data/ZoneSelection.ts +108 -0
- package/src/apps/data/routes/activities.test.ts +435 -12
- package/src/apps/data/routes/activities.ts +562 -125
- package/src/apps/data/routes/balances.ts +1 -1
- package/src/apps/data/routes/blocks.ts +1 -1
- package/src/apps/data/routes/earn.test.ts +183 -23
- package/src/apps/data/routes/earn.ts +225 -29
- package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
- package/src/apps/data/routes/exchanges.test.ts +31 -1
- package/src/apps/data/routes/exchanges.ts +19 -15
- package/src/apps/data/routes/fee-amm.ts +18 -11
- package/src/apps/data/routes/receipts.ts +1 -1
- package/src/apps/data/routes/rpc.test.ts +75 -0
- package/src/apps/data/routes/rpc.ts +23 -9
- package/src/apps/data/routes/tokenlist.ts +21 -18
- package/src/apps/data/routes/tokens.test.ts +29 -0
- package/src/apps/data/routes/tokens.ts +38 -15
- package/src/apps/data/routes/transactions.ts +1 -1
- package/src/apps/data/routes/transfers.test.ts +3 -3
- package/src/apps/data/routes/transfers.ts +12 -9
- package/src/apps/data/routes/webhooks.test.ts +179 -1497
- package/src/apps/data/routes/webhooks.ts +156 -976
- package/src/apps/data/routes/zones.test.ts +19 -13
- package/src/apps/funding/routes/chains.test.ts +211 -7
- package/src/apps/funding/routes/chains.ts +19 -12
- package/src/apps/funding/routes/deposit-addresses.test.ts +394 -0
- package/src/apps/funding/routes/deposit-addresses.ts +84 -72
- package/src/apps/funding/routes/providers.ts +9 -5
- package/src/apps/funding/routes/quotes.test.ts +46 -0
- package/src/apps/funding/routes/quotes.ts +8 -5
- package/src/apps/funding/routes/transfers.test.ts +35 -32
- package/src/apps/management/Billing.test.ts +26 -0
- package/src/apps/management/Billing.ts +24 -7
- package/src/apps/management/routes/api-keys.test.ts +178 -0
- package/src/apps/management/routes/api-keys.ts +203 -144
- package/src/apps/management/routes/billing.test.ts +209 -0
- package/src/apps/management/routes/billing.ts +254 -177
- package/src/apps/management/routes/faucet.test.ts +39 -0
- package/src/apps/management/routes/faucet.ts +75 -41
- package/src/apps/management/routes/invitations.test.ts +216 -0
- package/src/apps/management/routes/invitations.ts +186 -109
- package/src/apps/management/routes/invite-links.test.ts +263 -1
- package/src/apps/management/routes/invite-links.ts +295 -214
- package/src/apps/management/routes/me.test.ts +49 -0
- package/src/apps/management/routes/me.ts +42 -32
- package/src/apps/management/routes/members.test.ts +124 -1
- package/src/apps/management/routes/members.ts +81 -51
- package/src/apps/management/routes/orgs.test.ts +176 -0
- package/src/apps/management/routes/orgs.ts +101 -59
- package/src/apps/management/routes/projects.test.ts +183 -0
- package/src/apps/management/routes/projects.ts +124 -60
- package/src/apps/management/routes/scopes.test.ts +44 -0
- package/src/apps/management/routes/scopes.ts +37 -28
- package/src/apps/management/routes/usage.test.ts +92 -0
- package/src/apps/management/routes/usage.ts +186 -151
- package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
- package/src/apps/management/routes/verified-token-requests.ts +166 -133
- package/src/apps/management/routes/webhooks.test.ts +313 -1
- package/src/apps/management/routes/webhooks.ts +220 -71
- package/src/apps/mpp/internal/Adapter.ts +13 -1
- package/src/db/Db.test.ts +42 -5
- package/src/db/Db.ts +85 -0
- package/src/db/Schema.ts +41 -3
- package/src/db/tables/earnVaults.test.ts +22 -0
- package/src/db/tables/earnVaults.ts +11 -1
- package/src/db/tables/organizations.test.ts +5 -2
- package/src/db/tables/webhookDeliveries.ts +13 -0
- package/src/db/tables/webhookQueueCompletions.ts +55 -0
- package/src/db/tables/webhookQueueEvents.ts +97 -57
- package/src/db/tables/webhookSubscriptions.ts +134 -144
- package/src/internal/Auth.ts +23 -5
- package/src/internal/Cache.ts +14 -7
- package/src/internal/EarnVaults.capabilities.test.ts +33 -0
- package/src/internal/EarnVaults.test.ts +79 -0
- package/src/internal/EarnVaults.ts +277 -0
- package/src/internal/MetricSink.test.ts +41 -373
- package/src/internal/MetricSink.ts +92 -273
- package/src/internal/OpenApi.ts +165 -49
- package/src/internal/Response.test.ts +95 -0
- package/src/internal/Response.ts +40 -2
- package/src/internal/Schema.test.ts +34 -0
- package/src/internal/Schema.ts +20 -9
- package/src/internal/Store.test.ts +186 -0
- package/src/internal/Store.ts +57 -17
- package/src/internal/Tidx.test.ts +19 -0
- package/src/internal/Tidx.ts +16 -4
- package/src/internal/WebhookTransfer.ts +1 -351
- package/src/internal/Webhooks.test.ts +222 -145
- package/src/internal/Webhooks.ts +234 -135
- package/src/internal/funding/Deposit.ts +71 -64
- package/src/internal/funding/DepositAddress.ts +50 -43
- package/src/internal/funding/DepositWebhook.test.ts +131 -0
- package/src/internal/funding/DepositWebhook.ts +101 -0
- package/src/internal/funding/Provider.ts +164 -142
- package/src/internal/funding/Reconciliation.test.ts +14 -0
- package/src/internal/funding/Reconciliation.ts +161 -86
- package/src/internal/funding/index.test.ts +1 -0
- package/src/internal/funding/index.ts +1 -0
- package/src/internal/funding/providers/index.test.ts +185 -0
- package/src/internal/funding/providers/stargate.ts +184 -0
- package/src/internal/webhookDestinations/slack.ts +15 -0
- package/src/providers/index.test.ts +1 -0
- package/src/providers/index.ts +9 -0
- package/src/Webhooks.bench.ts +0 -714
- package/src/Webhooks.memory.bench.ts +0 -250
- package/src/Webhooks.test.ts +0 -146
|
@@ -9,48 +9,22 @@ export type EventType = Webhooks.Envelope['type']
|
|
|
9
9
|
/** Where a delivery attempt originated. */
|
|
10
10
|
export type Trigger = 'manual_retry' | 'ping' | 'queue'
|
|
11
11
|
|
|
12
|
-
/** Bounded
|
|
13
|
-
export type
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
chainId?: number | undefined
|
|
22
|
-
/** Wall-clock duration of the tick in ms. */
|
|
23
|
-
durationMs: number
|
|
24
|
-
/** Whether the tick completed. */
|
|
25
|
-
outcome: 'error' | 'ok'
|
|
26
|
-
}
|
|
12
|
+
/** Bounded step names inside one block-fanout scan, used by `webhook:scan-step`. */
|
|
13
|
+
export type ScanStep =
|
|
14
|
+
| 'block_rpc'
|
|
15
|
+
| 'enrich'
|
|
16
|
+
| 'finalized_rpc'
|
|
17
|
+
| 'logs_rpc'
|
|
18
|
+
| 'match'
|
|
19
|
+
| 'stage'
|
|
20
|
+
| 'subscription_read'
|
|
27
21
|
|
|
28
22
|
/**
|
|
29
|
-
* A webhook metric event, recorded by the {@link webhooks} sink. The
|
|
30
|
-
*
|
|
23
|
+
* A webhook metric event, recorded by the {@link webhooks} sink. The
|
|
24
|
+
* block-fanout scan path emits head and scan measurements; the delivery path
|
|
31
25
|
* emits `webhook:delivery`.
|
|
32
26
|
*/
|
|
33
27
|
export type WebhookEvent =
|
|
34
|
-
| {
|
|
35
|
-
/** Tempo chain whose poll cycle completed. */
|
|
36
|
-
chainId: number
|
|
37
|
-
/** Whether the poll cycle completed without scan or dispatch failures. */
|
|
38
|
-
outcome: 'error' | 'ok'
|
|
39
|
-
/** Requested boundary movement since the preceding successful poll, in blocks. */
|
|
40
|
-
requestedBoundaryAdvanceBlocks?: number | undefined
|
|
41
|
-
/** Execution path that acquired this poll claim. */
|
|
42
|
-
trigger: 'alarm' | 'cron' | 'direct' | 'queue'
|
|
43
|
-
/** Identifies a transport-neutral poll-cycle measurement. */
|
|
44
|
-
type: 'webhook:poll-cycle'
|
|
45
|
-
}
|
|
46
|
-
| {
|
|
47
|
-
/** Tempo chain whose durable progress was read. */
|
|
48
|
-
chainId: number
|
|
49
|
-
/** Blocks between the desired and fully drained boundaries. */
|
|
50
|
-
lagBlocks: number
|
|
51
|
-
/** Identifies durable coordinator progress. */
|
|
52
|
-
type: 'webhook:head-progress'
|
|
53
|
-
}
|
|
54
28
|
| {
|
|
55
29
|
/** Tempo chain whose listener was checked. */
|
|
56
30
|
chainId: number
|
|
@@ -61,114 +35,35 @@ export type WebhookEvent =
|
|
|
61
35
|
}
|
|
62
36
|
| {
|
|
63
37
|
chainId: number
|
|
64
|
-
/**
|
|
65
|
-
|
|
66
|
-
/** Identifies the out-of-band listener head probe. */
|
|
67
|
-
type: 'webhook:listener-head-lag'
|
|
68
|
-
}
|
|
69
|
-
| {
|
|
70
|
-
/** Tempo chain whose recovery poke was dequeued. */
|
|
71
|
-
chainId: number
|
|
72
|
-
/** When the recovery poke was dequeued, as epoch milliseconds. */
|
|
73
|
-
dequeuedAt: number
|
|
74
|
-
/** When the recovery poke was enqueued, as epoch milliseconds. */
|
|
75
|
-
enqueuedAt: number
|
|
76
|
-
/** Recovery source carried through the Queue handoff. */
|
|
77
|
-
trigger: 'alarm' | 'queue'
|
|
78
|
-
/** Identifies recovery Queue latency, not observed head volume. */
|
|
79
|
-
type: 'webhook:head-recovery'
|
|
80
|
-
}
|
|
81
|
-
| {
|
|
82
|
-
/** Tempo chain whose poll claim was acquired. */
|
|
83
|
-
chainId: number
|
|
84
|
-
/** Delay from observing the desired boundary to acquiring the claim. */
|
|
85
|
-
delayMs?: number | undefined
|
|
86
|
-
/** Execution path that acquired the claim. */
|
|
87
|
-
trigger: 'alarm' | 'cron' | 'direct' | 'queue'
|
|
88
|
-
/** Identifies a poll beginning, before scan work runs. */
|
|
89
|
-
type: 'webhook:poll-start'
|
|
90
|
-
}
|
|
91
|
-
| {
|
|
92
|
-
/** Tempo chain whose poll failed. */
|
|
93
|
-
chainId: number
|
|
94
|
-
/** Bounded class of the thrown failure. */
|
|
95
|
-
failure: PollFailure
|
|
96
|
-
/** Operation boundary that rejected the poll. */
|
|
97
|
-
stage: 'claim' | 'continuation_enqueue' | 'finish' | 'scan'
|
|
98
|
-
/** Execution path that failed before recovery. */
|
|
99
|
-
trigger: 'alarm' | 'cron' | 'direct' | 'queue'
|
|
100
|
-
/** Identifies a transport-neutral poll failure. */
|
|
101
|
-
type: 'webhook:poll-failure'
|
|
102
|
-
}
|
|
103
|
-
| {
|
|
104
|
-
chainId: number
|
|
105
|
-
durationMs: number
|
|
106
|
-
eventType?: EventType | undefined
|
|
107
|
-
outcome: 'error' | 'ok'
|
|
108
|
-
stage: PollStage
|
|
109
|
-
type: 'webhook:poll'
|
|
110
|
-
}
|
|
111
|
-
| {
|
|
112
|
-
/** Tempo chain whose eligible subscription count was read. */
|
|
113
|
-
chainId: number
|
|
114
|
-
/** Active, unexpired subscriptions selected for the poll. */
|
|
115
|
-
count: number
|
|
116
|
-
/** Identifies a pre-scan subscription eligibility measurement. */
|
|
117
|
-
type: 'webhook:poll-subscriptions'
|
|
118
|
-
}
|
|
119
|
-
| {
|
|
120
|
-
/** Chain scanned by this poll batch. */
|
|
121
|
-
chainId: number
|
|
122
|
-
/** Shared upper bound for concurrent upstream scans. */
|
|
123
|
-
concurrency: number
|
|
124
|
-
/** Scan duration, present only after completion. */
|
|
125
|
-
durationMs?: number | undefined
|
|
126
|
-
/** Subscription event type scanned by this batch. */
|
|
127
|
-
eventType: EventType
|
|
128
|
-
/** Subscriptions whose scan rejected, present only after completion. */
|
|
129
|
-
failedSubscriptions?: number | undefined
|
|
130
|
-
/** Matching rows retained by completed pages, present only after completion. */
|
|
131
|
-
matchedItems?: number | undefined
|
|
132
|
-
/** Largest block window requested by one subscription. */
|
|
133
|
-
maxWindowBlocks: number
|
|
134
|
-
/** Whether the checkpoint precedes allocation or follows scan completion. */
|
|
135
|
-
phase: 'complete' | 'start'
|
|
136
|
-
/** Outcome of the completed RPC-backed scan. */
|
|
137
|
-
outcome?: 'empty' | 'error' | 'missing' | 'ok' | undefined
|
|
138
|
-
/** JSON-RPC method used by this event type's scanner. */
|
|
139
|
-
rpcMethod: 'eth_getBlockByNumber' | 'eth_getLogs'
|
|
140
|
-
/** Subscriptions retained in this scan batch. */
|
|
141
|
-
subscriptionCount: number
|
|
142
|
-
/** Maximum subscriptions retained by this event-type batch. */
|
|
143
|
-
subscriptionLimit: number
|
|
144
|
-
/** Sum of subscription block windows in this scan batch. */
|
|
145
|
-
totalWindowBlocks: number
|
|
146
|
-
/** Identifies a memory-attribution scan boundary. */
|
|
147
|
-
type: 'webhook:poll-scan'
|
|
148
|
-
}
|
|
149
|
-
| {
|
|
150
|
-
cursorLagBlocks?: number | undefined
|
|
151
|
-
meta: TickMeta
|
|
152
|
-
result: Webhooks.createPoller.Result | undefined
|
|
153
|
-
type: 'webhook:tick'
|
|
154
|
-
}
|
|
155
|
-
| {
|
|
156
|
-
chainId: number
|
|
157
|
-
durationMs: number
|
|
158
|
-
eventType: EventType
|
|
159
|
-
ok: boolean
|
|
160
|
-
type: 'webhook:enqueue'
|
|
161
|
-
}
|
|
162
|
-
| {
|
|
163
|
-
chainId: number
|
|
38
|
+
/** True once finality has deferred this block at least one round. */
|
|
39
|
+
deferred: boolean
|
|
164
40
|
/** Rows matched when dispatched; zero otherwise. */
|
|
165
41
|
matches: number
|
|
42
|
+
/** Block timestamp to scan completion; absent when the block was not read. */
|
|
43
|
+
scanLagMs?: number | undefined
|
|
44
|
+
/** Block timestamp to head observation; absent without a fresh stamp. */
|
|
45
|
+
observationLagMs?: number | undefined
|
|
166
46
|
/** How the head that enqueued this block was observed. */
|
|
167
47
|
origin: string
|
|
168
48
|
/** One scanned block's outcome. */
|
|
169
49
|
outcome: 'deferred' | 'dispatched' | 'empty'
|
|
50
|
+
/** Head observation to this scan attempt starting; absent without a stamp. */
|
|
51
|
+
queueWaitMs?: number | undefined
|
|
170
52
|
/** Identifies one block-fanout scan. */
|
|
171
53
|
type: 'webhook:scan-block'
|
|
54
|
+
/** Wall-clock work inside this scan attempt. */
|
|
55
|
+
workMs: number
|
|
56
|
+
}
|
|
57
|
+
| {
|
|
58
|
+
chainId: number
|
|
59
|
+
/** Times this step ran across the batch, so the total can be normalized. */
|
|
60
|
+
count: number
|
|
61
|
+
/** Wall-clock duration of this step summed across the batch. */
|
|
62
|
+
durationMs: number
|
|
63
|
+
/** Bounded step name. */
|
|
64
|
+
step: ScanStep
|
|
65
|
+
/** Identifies per-step scan attribution. */
|
|
66
|
+
type: 'webhook:scan-step'
|
|
172
67
|
}
|
|
173
68
|
| {
|
|
174
69
|
chainId: number
|
|
@@ -178,6 +73,8 @@ export type WebhookEvent =
|
|
|
178
73
|
pendingCount: number
|
|
179
74
|
/** Identifies the coordinator's tracked-scan backlog. */
|
|
180
75
|
type: 'webhook:scan-backlog'
|
|
76
|
+
/** Blocks between the chain head and the enqueue watermark. */
|
|
77
|
+
watermarkLagBlocks?: number | undefined
|
|
181
78
|
}
|
|
182
79
|
| {
|
|
183
80
|
chainId: number
|
|
@@ -212,9 +109,17 @@ export type WebhookEvent =
|
|
|
212
109
|
deliveryLogMs?: number | undefined
|
|
213
110
|
envelopeToQueueMs?: number | undefined
|
|
214
111
|
endToEndMs?: number | undefined
|
|
112
|
+
/** Block timestamp to the attempt leaving; the total latency SLI. */
|
|
113
|
+
eventToAttemptMs?: number | undefined
|
|
215
114
|
eventToEnvelopeMs?: number | undefined
|
|
115
|
+
/** Head observation to the attempt leaving; the controllable SLI. */
|
|
116
|
+
observedToAttemptMs?: number | undefined
|
|
117
|
+
/** Dequeue to the attempt leaving: claim, reads, signing. */
|
|
118
|
+
preflightMs?: number | undefined
|
|
216
119
|
processingMs?: number | undefined
|
|
217
120
|
queueWaitMs?: number | undefined
|
|
121
|
+
/** Response headers to bookkeeping complete; occupancy, not latency. */
|
|
122
|
+
settleMs?: number | undefined
|
|
218
123
|
stateWriteMs?: number | undefined
|
|
219
124
|
subscriptionReadMs?: number | undefined
|
|
220
125
|
}
|
|
@@ -227,7 +132,7 @@ export type RequestSink = (entry: Log.Entry) => void
|
|
|
227
132
|
|
|
228
133
|
/** Records webhook reliability metrics. Built by {@link webhooks}. */
|
|
229
134
|
export type WebhookSink = {
|
|
230
|
-
/** Ships buffered metrics (call once per
|
|
135
|
+
/** Ships buffered metrics (call once per scan batch / delivery). */
|
|
231
136
|
flush(): void
|
|
232
137
|
/** Records one webhook event. */
|
|
233
138
|
record(event: WebhookEvent): void
|
|
@@ -386,161 +291,56 @@ export function webhooks(backend: Metrics): WebhookSink {
|
|
|
386
291
|
},
|
|
387
292
|
record(event) {
|
|
388
293
|
switch (event.type) {
|
|
389
|
-
case 'webhook:head-recovery': {
|
|
390
|
-
const tags = { chain_id: String(event.chainId), trigger: event.trigger }
|
|
391
|
-
backend.count('webhook_head_recovery_queue_count', 1, tags)
|
|
392
|
-
backend.histogram(
|
|
393
|
-
'webhook_head_recovery_queue_wait_ms',
|
|
394
|
-
Math.max(0, event.dequeuedAt - event.enqueuedAt),
|
|
395
|
-
tags,
|
|
396
|
-
)
|
|
397
|
-
return
|
|
398
|
-
}
|
|
399
|
-
case 'webhook:head-progress':
|
|
400
|
-
backend.gauge('webhook_head_progress_lag_blocks', event.lagBlocks, {
|
|
401
|
-
chain_id: String(event.chainId),
|
|
402
|
-
})
|
|
403
|
-
return
|
|
404
294
|
case 'webhook:head-skipped':
|
|
405
295
|
backend.gauge('webhook_head_skipped_count', event.skippedHeads, {
|
|
406
296
|
chain_id: String(event.chainId),
|
|
407
297
|
})
|
|
408
298
|
return
|
|
409
|
-
case 'webhook:
|
|
410
|
-
backend.gauge('webhook_listener_head_lag_blocks', event.lagBlocks, {
|
|
411
|
-
chain_id: String(event.chainId),
|
|
412
|
-
})
|
|
413
|
-
return
|
|
414
|
-
case 'webhook:poll-failure':
|
|
415
|
-
backend.count('webhook_poll_failure_count', 1, {
|
|
416
|
-
chain_id: String(event.chainId),
|
|
417
|
-
failure: event.failure,
|
|
418
|
-
stage: event.stage,
|
|
419
|
-
trigger: event.trigger,
|
|
420
|
-
})
|
|
421
|
-
return
|
|
422
|
-
case 'webhook:poll': {
|
|
299
|
+
case 'webhook:scan-block': {
|
|
423
300
|
const tags = {
|
|
424
301
|
chain_id: String(event.chainId),
|
|
425
|
-
|
|
302
|
+
origin: event.origin,
|
|
426
303
|
outcome: event.outcome,
|
|
427
|
-
stage: event.stage,
|
|
428
|
-
}
|
|
429
|
-
backend.histogram('webhook_poller_stage_duration_ms', event.durationMs, tags)
|
|
430
|
-
return
|
|
431
|
-
}
|
|
432
|
-
case 'webhook:poll-scan': {
|
|
433
|
-
const tags = {
|
|
434
|
-
chain_id: String(event.chainId),
|
|
435
|
-
event_type: event.eventType,
|
|
436
|
-
phase: event.phase,
|
|
437
304
|
}
|
|
438
|
-
backend.count('
|
|
439
|
-
backend.
|
|
440
|
-
backend.histogram('
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
'
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
if (event.
|
|
449
|
-
backend.histogram('
|
|
450
|
-
if (event.failedSubscriptions !== undefined)
|
|
451
|
-
backend.count(
|
|
452
|
-
'webhook_poller_scan_failed_subscription_count',
|
|
453
|
-
event.failedSubscriptions,
|
|
454
|
-
tags,
|
|
455
|
-
)
|
|
456
|
-
if (event.matchedItems !== undefined)
|
|
457
|
-
backend.count('webhook_poller_scan_matched_item_count', event.matchedItems, tags)
|
|
458
|
-
if (event.outcome !== undefined)
|
|
459
|
-
backend.count('webhook_poller_rpc_scan_count', 1, {
|
|
305
|
+
backend.count('webhook_scan_block_count', 1, tags)
|
|
306
|
+
if (event.matches > 0) backend.count('webhook_scan_match_count', event.matches, tags)
|
|
307
|
+
backend.histogram('webhook_scan_work_ms', event.workMs, tags)
|
|
308
|
+
// Deferred rounds are chain finality, not queue depth, so the wait
|
|
309
|
+
// carries the distinction rather than silently averaging the two.
|
|
310
|
+
if (event.queueWaitMs !== undefined)
|
|
311
|
+
backend.histogram('webhook_scan_queue_wait_ms', event.queueWaitMs, {
|
|
312
|
+
...tags,
|
|
313
|
+
deferred: String(event.deferred),
|
|
314
|
+
})
|
|
315
|
+
if (event.observationLagMs !== undefined)
|
|
316
|
+
backend.histogram('webhook_scan_observation_lag_ms', event.observationLagMs, {
|
|
460
317
|
chain_id: String(event.chainId),
|
|
461
|
-
|
|
462
|
-
outcome: event.outcome,
|
|
463
|
-
rpc_method: event.rpcMethod,
|
|
318
|
+
origin: event.origin,
|
|
464
319
|
})
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
return
|
|
472
|
-
case 'webhook:poll-cycle': {
|
|
473
|
-
const tags = {
|
|
474
|
-
chain_id: String(event.chainId),
|
|
475
|
-
outcome: event.outcome,
|
|
476
|
-
trigger: event.trigger,
|
|
477
|
-
}
|
|
478
|
-
backend.count('webhook_poll_cycle_count', 1, tags)
|
|
479
|
-
if (event.requestedBoundaryAdvanceBlocks !== undefined)
|
|
480
|
-
backend.histogram(
|
|
481
|
-
'webhook_poll_requested_boundary_advance_blocks',
|
|
482
|
-
event.requestedBoundaryAdvanceBlocks,
|
|
483
|
-
tags,
|
|
484
|
-
)
|
|
485
|
-
return
|
|
486
|
-
}
|
|
487
|
-
case 'webhook:poll-start': {
|
|
488
|
-
const tags = { chain_id: String(event.chainId), trigger: event.trigger }
|
|
489
|
-
backend.count('webhook_poll_start_count', 1, tags)
|
|
490
|
-
if (event.delayMs !== undefined)
|
|
491
|
-
backend.histogram('webhook_poll_start_delay_ms', event.delayMs, tags)
|
|
492
|
-
return
|
|
493
|
-
}
|
|
494
|
-
case 'webhook:tick': {
|
|
495
|
-
const { meta, result } = event
|
|
496
|
-
const chain_id = String(result?.chainId ?? meta.chainId ?? 'unknown')
|
|
497
|
-
backend.count('webhook_poller_tick_count', 1, { chain_id, outcome: meta.outcome })
|
|
498
|
-
backend.histogram('webhook_poller_tick_duration_ms', meta.durationMs, {
|
|
499
|
-
chain_id,
|
|
500
|
-
outcome: meta.outcome,
|
|
501
|
-
})
|
|
502
|
-
if (event.cursorLagBlocks !== undefined)
|
|
503
|
-
backend.gauge('webhook_subscription_cursor_lag_blocks', event.cursorLagBlocks, {
|
|
504
|
-
chain_id,
|
|
320
|
+
// Block timestamp to scan completion: how far behind the chain the
|
|
321
|
+
// scanner is, reported by every scanned block rather than only by
|
|
322
|
+
// blocks that produce a delivery.
|
|
323
|
+
if (event.scanLagMs !== undefined)
|
|
324
|
+
backend.histogram('webhook_scan_lag_ms', event.scanLagMs, {
|
|
325
|
+
chain_id: String(event.chainId),
|
|
505
326
|
})
|
|
506
|
-
if (!result) return
|
|
507
|
-
backend.histogram('webhook_poller_subscription_count', result.subscriptions, { chain_id })
|
|
508
|
-
backend.count('webhook_poller_scanned_count', result.scanned, { chain_id })
|
|
509
|
-
backend.gauge('webhook_poller_safe_block', result.safeBlock, { chain_id })
|
|
510
|
-
backend.count('webhook_poller_dispatch_count', result.dispatched, {
|
|
511
|
-
chain_id,
|
|
512
|
-
outcome: 'dispatched',
|
|
513
|
-
})
|
|
514
|
-
backend.count('webhook_poller_dispatch_count', result.failed, {
|
|
515
|
-
chain_id,
|
|
516
|
-
outcome: 'failed',
|
|
517
|
-
})
|
|
518
327
|
return
|
|
519
328
|
}
|
|
520
|
-
case 'webhook:
|
|
521
|
-
const tags = { chain_id: String(event.chainId),
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
})
|
|
528
|
-
return
|
|
529
|
-
}
|
|
530
|
-
case 'webhook:scan-block': {
|
|
531
|
-
const tags = {
|
|
532
|
-
chain_id: String(event.chainId),
|
|
533
|
-
origin: event.origin,
|
|
534
|
-
outcome: event.outcome,
|
|
535
|
-
}
|
|
536
|
-
backend.count('webhook_scan_block_count', 1, tags)
|
|
537
|
-
if (event.matches > 0) backend.count('webhook_scan_match_count', event.matches, tags)
|
|
329
|
+
case 'webhook:scan-step': {
|
|
330
|
+
const tags = { chain_id: String(event.chainId), step: event.step }
|
|
331
|
+
// Batch totals, so the count is required to read a per-invocation
|
|
332
|
+
// mean: a ten-block batch otherwise reports ten times a one-block
|
|
333
|
+
// batch at identical per-call latency.
|
|
334
|
+
backend.histogram('webhook_scan_step_duration_ms', event.durationMs, tags)
|
|
335
|
+
backend.count('webhook_scan_step_count', event.count, tags)
|
|
538
336
|
return
|
|
539
337
|
}
|
|
540
338
|
case 'webhook:scan-backlog': {
|
|
541
339
|
const tags = { chain_id: String(event.chainId) }
|
|
542
340
|
backend.gauge('webhook_scan_pending_count', event.pendingCount, tags)
|
|
543
341
|
backend.gauge('webhook_scan_oldest_pending_age_ms', event.oldestPendingAgeMs ?? 0, tags)
|
|
342
|
+
if (event.watermarkLagBlocks !== undefined)
|
|
343
|
+
backend.gauge('webhook_scan_watermark_lag_blocks', event.watermarkLagBlocks, tags)
|
|
544
344
|
return
|
|
545
345
|
}
|
|
546
346
|
case 'webhook:scan-finality': {
|
|
@@ -593,6 +393,25 @@ export function webhooks(backend: Metrics): WebhookSink {
|
|
|
593
393
|
})
|
|
594
394
|
if (timings?.deliveryLogMs !== undefined)
|
|
595
395
|
backend.histogram('webhook_delivery_log_write_ms', timings.deliveryLogMs, tags)
|
|
396
|
+
if (timings?.preflightMs !== undefined)
|
|
397
|
+
backend.histogram('webhook_delivery_preflight_ms', timings.preflightMs, tags)
|
|
398
|
+
if (timings?.settleMs !== undefined)
|
|
399
|
+
backend.histogram('webhook_delivery_settle_ms', timings.settleMs, tags)
|
|
400
|
+
// The two headline latency SLIs, both ending when the attempt leaves
|
|
401
|
+
// rather than when bookkeeping finishes. Attempt-bucketed for the
|
|
402
|
+
// same reason as end-to-end: retries carry designed backoff.
|
|
403
|
+
if (timings?.eventToAttemptMs !== undefined)
|
|
404
|
+
backend.histogram('webhook_event_to_attempt_ms', timings.eventToAttemptMs, {
|
|
405
|
+
...tags,
|
|
406
|
+
attempt_bucket: attemptBucket(event.attempt),
|
|
407
|
+
outcome,
|
|
408
|
+
})
|
|
409
|
+
if (timings?.observedToAttemptMs !== undefined)
|
|
410
|
+
backend.histogram('webhook_observed_to_attempt_ms', timings.observedToAttemptMs, {
|
|
411
|
+
...tags,
|
|
412
|
+
attempt_bucket: attemptBucket(event.attempt),
|
|
413
|
+
outcome,
|
|
414
|
+
})
|
|
596
415
|
if (timings?.envelopeToQueueMs !== undefined)
|
|
597
416
|
backend.histogram(
|
|
598
417
|
'webhook_delivery_envelope_to_queue_ms',
|