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.
Files changed (422) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/dist/ApiKey.d.ts +65 -0
  4. package/dist/ApiKey.d.ts.map +1 -0
  5. package/dist/ApiKey.js +105 -0
  6. package/dist/ApiKey.js.map +1 -0
  7. package/dist/ApiKeySource.d.ts +166 -0
  8. package/dist/ApiKeySource.d.ts.map +1 -0
  9. package/dist/ApiKeySource.js +234 -0
  10. package/dist/ApiKeySource.js.map +1 -0
  11. package/dist/App.d.ts +19317 -0
  12. package/dist/App.d.ts.map +1 -0
  13. package/dist/App.js +612 -0
  14. package/dist/App.js.map +1 -0
  15. package/dist/Assets.d.ts +44 -0
  16. package/dist/Assets.d.ts.map +1 -0
  17. package/dist/Assets.js +23 -0
  18. package/dist/Assets.js.map +1 -0
  19. package/dist/Auth.d.ts +2 -0
  20. package/dist/Auth.d.ts.map +1 -0
  21. package/dist/Auth.js +2 -0
  22. package/dist/Auth.js.map +1 -0
  23. package/dist/Cli.d.ts +21 -0
  24. package/dist/Cli.d.ts.map +1 -0
  25. package/dist/Cli.js +13 -0
  26. package/dist/Cli.js.map +1 -0
  27. package/dist/Client.d.ts +20 -0
  28. package/dist/Client.d.ts.map +1 -0
  29. package/dist/Client.js +24 -0
  30. package/dist/Client.js.map +1 -0
  31. package/dist/Metrics.d.ts +70 -0
  32. package/dist/Metrics.d.ts.map +1 -0
  33. package/dist/Metrics.js +91 -0
  34. package/dist/Metrics.js.map +1 -0
  35. package/dist/Scope.d.ts +35 -0
  36. package/dist/Scope.d.ts.map +1 -0
  37. package/dist/Scope.js +38 -0
  38. package/dist/Scope.js.map +1 -0
  39. package/dist/Webhooks.d.ts +79 -0
  40. package/dist/Webhooks.d.ts.map +1 -0
  41. package/dist/Webhooks.js +107 -0
  42. package/dist/Webhooks.js.map +1 -0
  43. package/dist/admin/Access.d.ts +41 -0
  44. package/dist/admin/Access.d.ts.map +1 -0
  45. package/dist/admin/Access.js +75 -0
  46. package/dist/admin/Access.js.map +1 -0
  47. package/dist/admin/App.d.ts +1221 -0
  48. package/dist/admin/App.d.ts.map +1 -0
  49. package/dist/admin/App.js +113 -0
  50. package/dist/admin/App.js.map +1 -0
  51. package/dist/admin/apps/api-keys.d.ts +209 -0
  52. package/dist/admin/apps/api-keys.d.ts.map +1 -0
  53. package/dist/admin/apps/api-keys.js +129 -0
  54. package/dist/admin/apps/api-keys.js.map +1 -0
  55. package/dist/admin/apps/scopes.d.ts +46 -0
  56. package/dist/admin/apps/scopes.d.ts.map +1 -0
  57. package/dist/admin/apps/scopes.js +41 -0
  58. package/dist/admin/apps/scopes.js.map +1 -0
  59. package/dist/admin/apps/verified-tokens.d.ts +1206 -0
  60. package/dist/admin/apps/verified-tokens.d.ts.map +1 -0
  61. package/dist/admin/apps/verified-tokens.js +485 -0
  62. package/dist/admin/apps/verified-tokens.js.map +1 -0
  63. package/dist/admin/index.d.ts +3 -0
  64. package/dist/admin/index.d.ts.map +1 -0
  65. package/dist/admin/index.js +3 -0
  66. package/dist/admin/index.js.map +1 -0
  67. package/dist/admin/ui.generated.d.ts +11 -0
  68. package/dist/admin/ui.generated.d.ts.map +1 -0
  69. package/dist/admin/ui.generated.js +43 -0
  70. package/dist/admin/ui.generated.js.map +1 -0
  71. package/dist/apps/activities.d.ts +18725 -0
  72. package/dist/apps/activities.d.ts.map +1 -0
  73. package/dist/apps/activities.js +3138 -0
  74. package/dist/apps/activities.js.map +1 -0
  75. package/dist/apps/addresses.d.ts +3662 -0
  76. package/dist/apps/addresses.d.ts.map +1 -0
  77. package/dist/apps/addresses.js +22 -0
  78. package/dist/apps/addresses.js.map +1 -0
  79. package/dist/apps/balances.d.ts +342 -0
  80. package/dist/apps/balances.d.ts.map +1 -0
  81. package/dist/apps/balances.js +393 -0
  82. package/dist/apps/balances.js.map +1 -0
  83. package/dist/apps/blocks.d.ts +931 -0
  84. package/dist/apps/blocks.d.ts.map +1 -0
  85. package/dist/apps/blocks.js +689 -0
  86. package/dist/apps/blocks.js.map +1 -0
  87. package/dist/apps/coingecko.d.ts +1053 -0
  88. package/dist/apps/coingecko.d.ts.map +1 -0
  89. package/dist/apps/coingecko.js +1015 -0
  90. package/dist/apps/coingecko.js.map +1 -0
  91. package/dist/apps/exchanges.d.ts +3000 -0
  92. package/dist/apps/exchanges.d.ts.map +1 -0
  93. package/dist/apps/exchanges.js +3570 -0
  94. package/dist/apps/exchanges.js.map +1 -0
  95. package/dist/apps/fee-amm.d.ts +640 -0
  96. package/dist/apps/fee-amm.d.ts.map +1 -0
  97. package/dist/apps/fee-amm.js +815 -0
  98. package/dist/apps/fee-amm.js.map +1 -0
  99. package/dist/apps/indexer.d.ts +116 -0
  100. package/dist/apps/indexer.d.ts.map +1 -0
  101. package/dist/apps/indexer.js +270 -0
  102. package/dist/apps/indexer.js.map +1 -0
  103. package/dist/apps/receipts.d.ts +1438 -0
  104. package/dist/apps/receipts.d.ts.map +1 -0
  105. package/dist/apps/receipts.js +874 -0
  106. package/dist/apps/receipts.js.map +1 -0
  107. package/dist/apps/rpc.d.ts +173 -0
  108. package/dist/apps/rpc.d.ts.map +1 -0
  109. package/dist/apps/rpc.js +191 -0
  110. package/dist/apps/rpc.js.map +1 -0
  111. package/dist/apps/tokenlist.d.ts +192 -0
  112. package/dist/apps/tokenlist.d.ts.map +1 -0
  113. package/dist/apps/tokenlist.js +153 -0
  114. package/dist/apps/tokenlist.js.map +1 -0
  115. package/dist/apps/tokens.d.ts +2246 -0
  116. package/dist/apps/tokens.d.ts.map +1 -0
  117. package/dist/apps/tokens.js +1789 -0
  118. package/dist/apps/tokens.js.map +1 -0
  119. package/dist/apps/transactions.d.ts +2327 -0
  120. package/dist/apps/transactions.d.ts.map +1 -0
  121. package/dist/apps/transactions.js +975 -0
  122. package/dist/apps/transactions.js.map +1 -0
  123. package/dist/apps/transfers.d.ts +589 -0
  124. package/dist/apps/transfers.d.ts.map +1 -0
  125. package/dist/apps/transfers.js +769 -0
  126. package/dist/apps/transfers.js.map +1 -0
  127. package/dist/apps/verified-tokens.d.ts +544 -0
  128. package/dist/apps/verified-tokens.d.ts.map +1 -0
  129. package/dist/apps/verified-tokens.js +234 -0
  130. package/dist/apps/verified-tokens.js.map +1 -0
  131. package/dist/apps/webhooks.d.ts +7684 -0
  132. package/dist/apps/webhooks.d.ts.map +1 -0
  133. package/dist/apps/webhooks.js +2112 -0
  134. package/dist/apps/webhooks.js.map +1 -0
  135. package/dist/cloudflare.d.ts +32 -0
  136. package/dist/cloudflare.d.ts.map +1 -0
  137. package/dist/cloudflare.js +45 -0
  138. package/dist/cloudflare.js.map +1 -0
  139. package/dist/index.d.ts +16 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +16 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/internal/Auth.d.ts +298 -0
  144. package/dist/internal/Auth.d.ts.map +1 -0
  145. package/dist/internal/Auth.js +618 -0
  146. package/dist/internal/Auth.js.map +1 -0
  147. package/dist/internal/Cache.d.ts +74 -0
  148. package/dist/internal/Cache.d.ts.map +1 -0
  149. package/dist/internal/Cache.js +215 -0
  150. package/dist/internal/Cache.js.map +1 -0
  151. package/dist/internal/Cursor.d.ts +79 -0
  152. package/dist/internal/Cursor.d.ts.map +1 -0
  153. package/dist/internal/Cursor.js +116 -0
  154. package/dist/internal/Cursor.js.map +1 -0
  155. package/dist/internal/EdgeCache.d.ts +59 -0
  156. package/dist/internal/EdgeCache.d.ts.map +1 -0
  157. package/dist/internal/EdgeCache.js +174 -0
  158. package/dist/internal/EdgeCache.js.map +1 -0
  159. package/dist/internal/Log.d.ts +104 -0
  160. package/dist/internal/Log.d.ts.map +1 -0
  161. package/dist/internal/Log.js +118 -0
  162. package/dist/internal/Log.js.map +1 -0
  163. package/dist/internal/MetricSink.d.ts +65 -0
  164. package/dist/internal/MetricSink.d.ts.map +1 -0
  165. package/dist/internal/MetricSink.js +146 -0
  166. package/dist/internal/MetricSink.js.map +1 -0
  167. package/dist/internal/Mpp.d.ts +71 -0
  168. package/dist/internal/Mpp.d.ts.map +1 -0
  169. package/dist/internal/Mpp.js +105 -0
  170. package/dist/internal/Mpp.js.map +1 -0
  171. package/dist/internal/OpenApi.d.ts +313 -0
  172. package/dist/internal/OpenApi.d.ts.map +1 -0
  173. package/dist/internal/OpenApi.fonts.d.ts +2 -0
  174. package/dist/internal/OpenApi.fonts.d.ts.map +1 -0
  175. package/dist/internal/OpenApi.fonts.js +39 -0
  176. package/dist/internal/OpenApi.fonts.js.map +1 -0
  177. package/dist/internal/OpenApi.js +335 -0
  178. package/dist/internal/OpenApi.js.map +1 -0
  179. package/dist/internal/OpenApi.logo.d.ts +6 -0
  180. package/dist/internal/OpenApi.logo.d.ts.map +1 -0
  181. package/dist/internal/OpenApi.logo.js +19 -0
  182. package/dist/internal/OpenApi.logo.js.map +1 -0
  183. package/dist/internal/Path.d.ts +5 -0
  184. package/dist/internal/Path.d.ts.map +1 -0
  185. package/dist/internal/Path.js +16 -0
  186. package/dist/internal/Path.js.map +1 -0
  187. package/dist/internal/RateLimit.d.ts +60 -0
  188. package/dist/internal/RateLimit.d.ts.map +1 -0
  189. package/dist/internal/RateLimit.js +48 -0
  190. package/dist/internal/RateLimit.js.map +1 -0
  191. package/dist/internal/Response.d.ts +132 -0
  192. package/dist/internal/Response.d.ts.map +1 -0
  193. package/dist/internal/Response.js +72 -0
  194. package/dist/internal/Response.js.map +1 -0
  195. package/dist/internal/Schema.d.ts +257 -0
  196. package/dist/internal/Schema.d.ts.map +1 -0
  197. package/dist/internal/Schema.js +360 -0
  198. package/dist/internal/Schema.js.map +1 -0
  199. package/dist/internal/Store.d.ts +204 -0
  200. package/dist/internal/Store.d.ts.map +1 -0
  201. package/dist/internal/Store.js +291 -0
  202. package/dist/internal/Store.js.map +1 -0
  203. package/dist/internal/Tidx.d.ts +120 -0
  204. package/dist/internal/Tidx.d.ts.map +1 -0
  205. package/dist/internal/Tidx.js +156 -0
  206. package/dist/internal/Tidx.js.map +1 -0
  207. package/dist/internal/Timing.d.ts +22 -0
  208. package/dist/internal/Timing.d.ts.map +1 -0
  209. package/dist/internal/Timing.js +32 -0
  210. package/dist/internal/Timing.js.map +1 -0
  211. package/dist/internal/Ttl.d.ts +25 -0
  212. package/dist/internal/Ttl.d.ts.map +1 -0
  213. package/dist/internal/Ttl.js +49 -0
  214. package/dist/internal/Ttl.js.map +1 -0
  215. package/dist/internal/Value.d.ts +47 -0
  216. package/dist/internal/Value.d.ts.map +1 -0
  217. package/dist/internal/Value.js +122 -0
  218. package/dist/internal/Value.js.map +1 -0
  219. package/dist/internal/VerifiedTokens.d.ts +228 -0
  220. package/dist/internal/VerifiedTokens.d.ts.map +1 -0
  221. package/dist/internal/VerifiedTokens.js +450 -0
  222. package/dist/internal/VerifiedTokens.js.map +1 -0
  223. package/dist/internal/Viem.d.ts +2082 -0
  224. package/dist/internal/Viem.d.ts.map +1 -0
  225. package/dist/internal/Viem.js +63 -0
  226. package/dist/internal/Viem.js.map +1 -0
  227. package/dist/internal/WebhookDestination.d.ts +198 -0
  228. package/dist/internal/WebhookDestination.d.ts.map +1 -0
  229. package/dist/internal/WebhookDestination.js +170 -0
  230. package/dist/internal/WebhookDestination.js.map +1 -0
  231. package/dist/internal/Webhooks.d.ts +433 -0
  232. package/dist/internal/Webhooks.d.ts.map +1 -0
  233. package/dist/internal/Webhooks.js +489 -0
  234. package/dist/internal/Webhooks.js.map +1 -0
  235. package/dist/internal/webhookDestinations/betterStack.d.ts +26 -0
  236. package/dist/internal/webhookDestinations/betterStack.d.ts.map +1 -0
  237. package/dist/internal/webhookDestinations/betterStack.js +76 -0
  238. package/dist/internal/webhookDestinations/betterStack.js.map +1 -0
  239. package/dist/internal/webhookDestinations/slack.d.ts +59 -0
  240. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -0
  241. package/dist/internal/webhookDestinations/slack.js +422 -0
  242. package/dist/internal/webhookDestinations/slack.js.map +1 -0
  243. package/dist/internal/webhookDestinations/url.d.ts +17 -0
  244. package/dist/internal/webhookDestinations/url.d.ts.map +1 -0
  245. package/dist/internal/webhookDestinations/url.js +130 -0
  246. package/dist/internal/webhookDestinations/url.js.map +1 -0
  247. package/dist/openrpc.json +5302 -0
  248. package/package.json +46 -4
  249. package/seeds/31318/icons/0x20c0000000000000000000000000000000000000.svg +1 -0
  250. package/seeds/31318/icons/0x20c0000000000000000000000000000000000001.svg +1 -0
  251. package/seeds/31318/icons/0x20c0000000000000000000000000000000000002.svg +1 -0
  252. package/seeds/31318/icons/0x20c0000000000000000000000000000000000003.svg +1 -0
  253. package/seeds/31318/verified-tokens.json +30 -0
  254. package/seeds/4217/icons/0x20c0000000000000000000000000000000000000.svg +25 -0
  255. package/seeds/4217/icons/0x20c000000000000000000000048c8f36df1c9a4a.svg +1 -0
  256. package/seeds/4217/icons/0x20c0000000000000000000000520792dcccccccc.svg +1 -0
  257. package/seeds/4217/icons/0x20c0000000000000000000000a6da882d075a4c3.svg +4 -0
  258. package/seeds/4217/icons/0x20c000000000000000000000111111111e910f0f.svg +30 -0
  259. package/seeds/4217/icons/0x20c00000000000000000000014f22ca97301eb73.svg +1 -0
  260. package/seeds/4217/icons/0x20c0000000000000000000001621e21f71cf12fb.svg +1 -0
  261. package/seeds/4217/icons/0x20c0000000000000000000002f52d5cc21a3207b.svg +1 -0
  262. package/seeds/4217/icons/0x20c0000000000000000000003158081efd85bfc2.svg +11 -0
  263. package/seeds/4217/icons/0x20c0000000000000000000003554d28269e0f3c2.svg +1 -0
  264. package/seeds/4217/icons/0x20c000000000000000000000383a23bacb546ab9.svg +1 -0
  265. package/seeds/4217/icons/0x20c00000000000000000000042109aef2f8b28e1.png +0 -0
  266. package/seeds/4217/icons/0x20c0000000000000000000005c0bac7cef389a11.svg +1 -0
  267. package/seeds/4217/icons/0x20c0000000000000000000006fd9a167923ba194.png +0 -0
  268. package/seeds/4217/icons/0x20c0000000000000000000007f7ba549dd0251b9.svg +1 -0
  269. package/seeds/4217/icons/0x20c0000000000000000000008191667423f70e67.svg +5 -0
  270. package/seeds/4217/icons/0x20c0000000000000000000008ee4fcff88888888.svg +1 -0
  271. package/seeds/4217/icons/0x20c0000000000000000000009a4a4b17e0dc6651.svg +1 -0
  272. package/seeds/4217/icons/0x20c000000000000000000000ab02d39df30bd17e.svg +1 -0
  273. package/seeds/4217/icons/0x20c000000000000000000000ae247a1130450f09.svg +1 -0
  274. package/seeds/4217/icons/0x20c000000000000000000000aeed2ec36a54d0e5.svg +1 -0
  275. package/seeds/4217/icons/0x20c000000000000000000000b9537d11c60e8b50.svg +1 -0
  276. package/seeds/4217/icons/0x20c000000000000000000000bd95bfb69fbe6ce3.svg +1 -0
  277. package/seeds/4217/icons/0x20c000000000000000000000c412ec89d0c08be5.svg +1 -0
  278. package/seeds/4217/icons/0x20c000000000000000000000f047dd7018e50367.png +0 -0
  279. package/seeds/4217/verified-tokens.json +177 -0
  280. package/seeds/42431/icons/0x20c0000000000000000000000000000000000000.svg +25 -0
  281. package/seeds/42431/icons/0x20c0000000000000000000000000000000000001.svg +1 -0
  282. package/seeds/42431/icons/0x20c0000000000000000000000000000000000002.svg +1 -0
  283. package/seeds/42431/icons/0x20c0000000000000000000000000000000000003.svg +1 -0
  284. package/seeds/42431/icons/0x20c0000000000000000000009e8d7eb59b783726.svg +1 -0
  285. package/seeds/42431/icons/0x20c000000000000000000000d72572838bbee59c.svg +1 -0
  286. package/seeds/42431/verified-tokens.json +44 -0
  287. package/seeds/openrpc/README.md +27 -0
  288. package/seeds/openrpc/execution-apis.json +8989 -0
  289. package/src/ApiKey.test.ts +91 -0
  290. package/src/ApiKey.ts +122 -0
  291. package/src/ApiKeySource.test-d.ts +11 -0
  292. package/src/ApiKeySource.test.ts +295 -0
  293. package/src/ApiKeySource.ts +303 -0
  294. package/src/App.test-d.ts +38 -0
  295. package/src/App.test.ts +65927 -0
  296. package/src/App.ts +855 -0
  297. package/src/Assets.ts +58 -0
  298. package/src/Auth.ts +1 -0
  299. package/src/Cli.test.ts +81 -0
  300. package/src/Cli.ts +38 -0
  301. package/src/Client.test-d.ts +1438 -0
  302. package/src/Client.test.ts +134 -0
  303. package/src/Client.ts +45 -0
  304. package/src/Metrics.ts +154 -0
  305. package/src/Scope.ts +50 -0
  306. package/src/Webhooks.test.ts +49 -0
  307. package/src/Webhooks.ts +172 -0
  308. package/src/admin/Access.test.ts +130 -0
  309. package/src/admin/Access.ts +87 -0
  310. package/src/admin/App.test.ts +225 -0
  311. package/src/admin/App.ts +216 -0
  312. package/src/admin/apps/api-keys.test.ts +156 -0
  313. package/src/admin/apps/api-keys.ts +157 -0
  314. package/src/admin/apps/scopes.test.ts +52 -0
  315. package/src/admin/apps/scopes.ts +47 -0
  316. package/src/admin/apps/verified-tokens.test.ts +415 -0
  317. package/src/admin/apps/verified-tokens.ts +566 -0
  318. package/src/admin/index.ts +2 -0
  319. package/src/admin/ui/plugin.ts +135 -0
  320. package/src/admin/ui/src/components/Checkbox.tsx +22 -0
  321. package/src/admin/ui/src/components/Dialog.tsx +32 -0
  322. package/src/admin/ui/src/components/MobileProfile.tsx +31 -0
  323. package/src/admin/ui/src/components/Page.tsx +53 -0
  324. package/src/admin/ui/src/components/TempoLogo.tsx +37 -0
  325. package/src/admin/ui/src/fonts/Pilat-Demi.woff2 +0 -0
  326. package/src/admin/ui/src/fonts/Pilat-Regular.woff2 +0 -0
  327. package/src/admin/ui/src/lib/api-keys.ts +63 -0
  328. package/src/admin/ui/src/lib/client.ts +15 -0
  329. package/src/admin/ui/src/lib/config.ts +57 -0
  330. package/src/admin/ui/src/lib/query-client.ts +26 -0
  331. package/src/admin/ui/src/lib/scopes.ts +25 -0
  332. package/src/admin/ui/src/lib/verified-tokens.ts +89 -0
  333. package/src/admin/ui/src/lib/wagmi.ts +18 -0
  334. package/src/admin/ui/src/routeTree.gen.ts +104 -0
  335. package/src/admin/ui/src/router.tsx +25 -0
  336. package/src/admin/ui/src/routes/__root.tsx +219 -0
  337. package/src/admin/ui/src/routes/api-keys.tsx +329 -0
  338. package/src/admin/ui/src/routes/index.tsx +7 -0
  339. package/src/admin/ui/src/routes/verified-tokens.tsx +331 -0
  340. package/src/admin/ui/src/styles.css +20 -0
  341. package/src/admin/ui/tsconfig.json +16 -0
  342. package/src/admin/ui/vite.config.ts +29 -0
  343. package/src/admin/ui.generated.ts +60 -0
  344. package/src/apps/activities.test.ts +1020 -0
  345. package/src/apps/activities.ts +3934 -0
  346. package/src/apps/addresses.ts +24 -0
  347. package/src/apps/balances.test.ts +274 -0
  348. package/src/apps/balances.ts +533 -0
  349. package/src/apps/blocks.test.ts +385 -0
  350. package/src/apps/blocks.ts +896 -0
  351. package/src/apps/coingecko.test.ts +218 -0
  352. package/src/apps/coingecko.ts +1383 -0
  353. package/src/apps/exchanges.test.ts +958 -0
  354. package/src/apps/exchanges.ts +4773 -0
  355. package/src/apps/fee-amm.test.ts +321 -0
  356. package/src/apps/fee-amm.ts +1121 -0
  357. package/src/apps/indexer.test.ts +153 -0
  358. package/src/apps/indexer.ts +330 -0
  359. package/src/apps/receipts.test.ts +285 -0
  360. package/src/apps/receipts.ts +1193 -0
  361. package/src/apps/rpc.test.ts +302 -0
  362. package/src/apps/rpc.ts +222 -0
  363. package/src/apps/tokenlist.test.ts +80 -0
  364. package/src/apps/tokenlist.ts +207 -0
  365. package/src/apps/tokens.test.ts +1062 -0
  366. package/src/apps/tokens.ts +2292 -0
  367. package/src/apps/transactions.test.ts +408 -0
  368. package/src/apps/transactions.ts +1363 -0
  369. package/src/apps/transfers.test.ts +371 -0
  370. package/src/apps/transfers.ts +1116 -0
  371. package/src/apps/verified-tokens.test.ts +114 -0
  372. package/src/apps/verified-tokens.ts +295 -0
  373. package/src/apps/webhooks.test.ts +1937 -0
  374. package/src/apps/webhooks.ts +2926 -0
  375. package/src/cloudflare.ts +55 -0
  376. package/src/index.ts +15 -0
  377. package/src/internal/Auth.test.ts +980 -0
  378. package/src/internal/Auth.ts +1012 -0
  379. package/src/internal/Cache.test.ts +240 -0
  380. package/src/internal/Cache.ts +262 -0
  381. package/src/internal/Cursor.test.ts +100 -0
  382. package/src/internal/Cursor.ts +149 -0
  383. package/src/internal/EdgeCache.test.ts +234 -0
  384. package/src/internal/EdgeCache.ts +224 -0
  385. package/src/internal/Errors.ts +14 -0
  386. package/src/internal/Log.test.ts +244 -0
  387. package/src/internal/Log.ts +216 -0
  388. package/src/internal/MetricSink.ts +220 -0
  389. package/src/internal/Mpp.test.ts +64 -0
  390. package/src/internal/Mpp.ts +141 -0
  391. package/src/internal/OpenApi.fonts.ts +38 -0
  392. package/src/internal/OpenApi.logo.ts +18 -0
  393. package/src/internal/OpenApi.ts +488 -0
  394. package/src/internal/Path.test.ts +14 -0
  395. package/src/internal/Path.ts +15 -0
  396. package/src/internal/RateLimit.test.ts +93 -0
  397. package/src/internal/RateLimit.ts +93 -0
  398. package/src/internal/Response.ts +131 -0
  399. package/src/internal/Schema.test.ts +34 -0
  400. package/src/internal/Schema.ts +523 -0
  401. package/src/internal/Store.test.ts +545 -0
  402. package/src/internal/Store.ts +526 -0
  403. package/src/internal/Tidx.local.test.ts +33 -0
  404. package/src/internal/Tidx.test.ts +294 -0
  405. package/src/internal/Tidx.ts +238 -0
  406. package/src/internal/Timing.test.ts +22 -0
  407. package/src/internal/Timing.ts +62 -0
  408. package/src/internal/Ttl.test.ts +18 -0
  409. package/src/internal/Ttl.ts +59 -0
  410. package/src/internal/Value.ts +114 -0
  411. package/src/internal/VerifiedTokens.test.ts +333 -0
  412. package/src/internal/VerifiedTokens.ts +645 -0
  413. package/src/internal/Viem.test.ts +115 -0
  414. package/src/internal/Viem.ts +165 -0
  415. package/src/internal/WebhookDestination.test.ts +648 -0
  416. package/src/internal/WebhookDestination.ts +331 -0
  417. package/src/internal/Webhooks.test.ts +668 -0
  418. package/src/internal/Webhooks.ts +940 -0
  419. package/src/internal/webhookDestinations/betterStack.ts +91 -0
  420. package/src/internal/webhookDestinations/slack.ts +496 -0
  421. package/src/internal/webhookDestinations/url.ts +128 -0
  422. 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"}