tapimo 0.0.2 → 0.2.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.
Files changed (517) hide show
  1. package/README.md +38 -16
  2. package/dist/ApiKey.d.ts +14 -11
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +11 -12
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +207 -0
  7. package/dist/ApiKeys.d.ts.map +1 -0
  8. package/dist/ApiKeys.js +282 -0
  9. package/dist/ApiKeys.js.map +1 -0
  10. package/dist/App.d.ts +6771 -3819
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +145 -317
  13. package/dist/App.js.map +1 -1
  14. package/dist/Handler.d.ts +86 -0
  15. package/dist/Handler.d.ts.map +1 -0
  16. package/dist/Handler.js +83 -0
  17. package/dist/Handler.js.map +1 -0
  18. package/dist/Scope.d.ts +14 -4
  19. package/dist/Scope.d.ts.map +1 -1
  20. package/dist/Scope.js +16 -4
  21. package/dist/Scope.js.map +1 -1
  22. package/dist/Webhooks.d.ts +5 -7
  23. package/dist/Webhooks.d.ts.map +1 -1
  24. package/dist/Webhooks.js +11 -4
  25. package/dist/Webhooks.js.map +1 -1
  26. package/dist/admin/Access.d.ts +1 -3
  27. package/dist/admin/Access.d.ts.map +1 -1
  28. package/dist/admin/Access.js +1 -3
  29. package/dist/admin/Access.js.map +1 -1
  30. package/dist/admin/App.d.ts +167 -205
  31. package/dist/admin/App.d.ts.map +1 -1
  32. package/dist/admin/App.js +2 -4
  33. package/dist/admin/App.js.map +1 -1
  34. package/dist/admin/apps/api-keys.d.ts +105 -5
  35. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  36. package/dist/admin/apps/api-keys.js +75 -9
  37. package/dist/admin/apps/api-keys.js.map +1 -1
  38. package/dist/admin/apps/scopes.d.ts +6 -0
  39. package/dist/admin/apps/scopes.d.ts.map +1 -1
  40. package/dist/admin/apps/verified-tokens.d.ts +35 -149
  41. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  42. package/dist/admin/apps/verified-tokens.js +18 -39
  43. package/dist/admin/apps/verified-tokens.js.map +1 -1
  44. package/dist/admin/ui.generated.d.ts +1 -1
  45. package/dist/admin/ui.generated.js +1 -1
  46. package/dist/apps/data/App.d.ts +19176 -0
  47. package/dist/apps/data/App.d.ts.map +1 -0
  48. package/dist/apps/data/App.js +236 -0
  49. package/dist/apps/data/App.js.map +1 -0
  50. package/dist/apps/data/index.d.ts +3 -0
  51. package/dist/apps/data/index.d.ts.map +1 -0
  52. package/dist/apps/data/index.js +3 -0
  53. package/dist/apps/data/index.js.map +1 -0
  54. package/dist/apps/{activities.d.ts → data/routes/activities.d.ts} +32 -32
  55. package/dist/apps/{activities.d.ts.map → data/routes/activities.d.ts.map} +1 -1
  56. package/dist/apps/{activities.js → data/routes/activities.js} +13 -13
  57. package/dist/apps/data/routes/activities.js.map +1 -0
  58. package/dist/apps/{addresses.d.ts → data/routes/addresses.d.ts} +22 -22
  59. package/dist/apps/{addresses.d.ts.map → data/routes/addresses.d.ts.map} +1 -1
  60. package/dist/apps/{addresses.js → data/routes/addresses.js} +5 -5
  61. package/dist/apps/data/routes/addresses.js.map +1 -0
  62. package/dist/apps/{balances.d.ts → data/routes/balances.d.ts} +49 -49
  63. package/dist/apps/data/routes/balances.d.ts.map +1 -0
  64. package/dist/apps/{balances.js → data/routes/balances.js} +42 -11
  65. package/dist/apps/data/routes/balances.js.map +1 -0
  66. package/dist/apps/{blocks.d.ts → data/routes/blocks.d.ts} +47 -47
  67. package/dist/apps/data/routes/blocks.d.ts.map +1 -0
  68. package/dist/apps/{blocks.js → data/routes/blocks.js} +13 -13
  69. package/dist/apps/data/routes/blocks.js.map +1 -0
  70. package/dist/apps/{coingecko.d.ts → data/routes/coingecko.d.ts} +183 -183
  71. package/dist/apps/data/routes/coingecko.d.ts.map +1 -0
  72. package/dist/apps/{coingecko.js → data/routes/coingecko.js} +13 -13
  73. package/dist/apps/data/routes/coingecko.js.map +1 -0
  74. package/dist/apps/{exchanges.d.ts → data/routes/exchanges.d.ts} +460 -460
  75. package/dist/apps/data/routes/exchanges.d.ts.map +1 -0
  76. package/dist/apps/{exchanges.js → data/routes/exchanges.js} +19 -19
  77. package/dist/apps/data/routes/exchanges.js.map +1 -0
  78. package/dist/apps/{fee-amm.d.ts → data/routes/fee-amm.d.ts} +94 -94
  79. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -0
  80. package/dist/apps/{fee-amm.js → data/routes/fee-amm.js} +17 -17
  81. package/dist/apps/data/routes/fee-amm.js.map +1 -0
  82. package/dist/apps/{indexer.d.ts → data/routes/indexer.d.ts} +4 -4
  83. package/dist/apps/data/routes/indexer.d.ts.map +1 -0
  84. package/dist/apps/{indexer.js → data/routes/indexer.js} +13 -9
  85. package/dist/apps/data/routes/indexer.js.map +1 -0
  86. package/dist/apps/{receipts.d.ts → data/routes/receipts.d.ts} +6 -6
  87. package/dist/apps/data/routes/receipts.d.ts.map +1 -0
  88. package/dist/apps/{receipts.js → data/routes/receipts.js} +12 -12
  89. package/dist/apps/data/routes/receipts.js.map +1 -0
  90. package/dist/apps/{rpc.d.ts → data/routes/rpc.d.ts} +4 -4
  91. package/dist/apps/data/routes/rpc.d.ts.map +1 -0
  92. package/dist/apps/{rpc.js → data/routes/rpc.js} +6 -6
  93. package/dist/apps/data/routes/rpc.js.map +1 -0
  94. package/dist/apps/{tokenlist.d.ts → data/routes/tokenlist.d.ts} +4 -4
  95. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -0
  96. package/dist/apps/{tokenlist.js → data/routes/tokenlist.js} +8 -8
  97. package/dist/apps/data/routes/tokenlist.js.map +1 -0
  98. package/dist/apps/{tokens.d.ts → data/routes/tokens.d.ts} +11 -11
  99. package/dist/apps/data/routes/tokens.d.ts.map +1 -0
  100. package/dist/apps/{tokens.js → data/routes/tokens.js} +19 -19
  101. package/dist/apps/data/routes/tokens.js.map +1 -0
  102. package/dist/apps/{transactions.d.ts → data/routes/transactions.d.ts} +288 -288
  103. package/dist/apps/data/routes/transactions.d.ts.map +1 -0
  104. package/dist/apps/{transactions.js → data/routes/transactions.js} +13 -13
  105. package/dist/apps/data/routes/transactions.js.map +1 -0
  106. package/dist/apps/{transfers.d.ts → data/routes/transfers.d.ts} +35 -35
  107. package/dist/apps/data/routes/transfers.d.ts.map +1 -0
  108. package/dist/apps/{transfers.js → data/routes/transfers.js} +13 -13
  109. package/dist/apps/data/routes/transfers.js.map +1 -0
  110. package/dist/apps/{verified-tokens.d.ts → data/routes/verified-tokens.d.ts} +42 -42
  111. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -0
  112. package/dist/apps/{verified-tokens.js → data/routes/verified-tokens.js} +9 -9
  113. package/dist/apps/data/routes/verified-tokens.js.map +1 -0
  114. package/dist/apps/{webhooks.d.ts → data/routes/webhooks.d.ts} +66 -63
  115. package/dist/apps/{webhooks.d.ts.map → data/routes/webhooks.d.ts.map} +1 -1
  116. package/dist/apps/{webhooks.js → data/routes/webhooks.js} +67 -59
  117. package/dist/apps/data/routes/webhooks.js.map +1 -0
  118. package/dist/apps/docs/App.d.ts +27 -0
  119. package/dist/apps/docs/App.d.ts.map +1 -0
  120. package/dist/apps/docs/App.js +122 -0
  121. package/dist/apps/docs/App.js.map +1 -0
  122. package/dist/{internal/OpenApi.fonts.d.ts → apps/docs/fonts.d.ts} +1 -1
  123. package/dist/apps/docs/fonts.d.ts.map +1 -0
  124. package/dist/{internal/OpenApi.fonts.js → apps/docs/fonts.js} +1 -1
  125. package/dist/apps/docs/fonts.js.map +1 -0
  126. package/dist/apps/docs/index.d.ts +2 -0
  127. package/dist/apps/docs/index.d.ts.map +1 -0
  128. package/dist/apps/docs/index.js +2 -0
  129. package/dist/apps/docs/index.js.map +1 -0
  130. package/dist/{internal/OpenApi.logo.d.ts → apps/docs/logo.d.ts} +1 -1
  131. package/dist/apps/docs/logo.d.ts.map +1 -0
  132. package/dist/{internal/OpenApi.logo.js → apps/docs/logo.js} +1 -1
  133. package/dist/apps/docs/logo.js.map +1 -0
  134. package/dist/apps/index.d.ts +4 -0
  135. package/dist/apps/index.d.ts.map +1 -0
  136. package/dist/apps/index.js +4 -0
  137. package/dist/apps/index.js.map +1 -0
  138. package/dist/apps/metadata.d.ts +7 -0
  139. package/dist/apps/metadata.d.ts.map +1 -0
  140. package/dist/apps/metadata.js +15 -0
  141. package/dist/apps/metadata.js.map +1 -0
  142. package/dist/apps/platform/App.d.ts +2985 -0
  143. package/dist/apps/platform/App.d.ts.map +1 -0
  144. package/dist/apps/platform/App.js +74 -0
  145. package/dist/apps/platform/App.js.map +1 -0
  146. package/dist/apps/platform/index.d.ts +2 -0
  147. package/dist/apps/platform/index.d.ts.map +1 -0
  148. package/dist/apps/platform/index.js +2 -0
  149. package/dist/apps/platform/index.js.map +1 -0
  150. package/dist/apps/platform/routes/api-keys.d.ts +681 -0
  151. package/dist/apps/platform/routes/api-keys.d.ts.map +1 -0
  152. package/dist/apps/platform/routes/api-keys.js +328 -0
  153. package/dist/apps/platform/routes/api-keys.js.map +1 -0
  154. package/dist/apps/platform/routes/invitations.d.ts +733 -0
  155. package/dist/apps/platform/routes/invitations.d.ts.map +1 -0
  156. package/dist/apps/platform/routes/invitations.js +413 -0
  157. package/dist/apps/platform/routes/invitations.js.map +1 -0
  158. package/dist/apps/platform/routes/me.d.ts +95 -0
  159. package/dist/apps/platform/routes/me.d.ts.map +1 -0
  160. package/dist/apps/platform/routes/me.js +81 -0
  161. package/dist/apps/platform/routes/me.js.map +1 -0
  162. package/dist/apps/platform/routes/members.d.ts +554 -0
  163. package/dist/apps/platform/routes/members.d.ts.map +1 -0
  164. package/dist/apps/platform/routes/members.js +251 -0
  165. package/dist/apps/platform/routes/members.js.map +1 -0
  166. package/dist/apps/platform/routes/orgs.d.ts +582 -0
  167. package/dist/apps/platform/routes/orgs.d.ts.map +1 -0
  168. package/dist/apps/platform/routes/orgs.js +265 -0
  169. package/dist/apps/platform/routes/orgs.js.map +1 -0
  170. package/dist/apps/platform/routes/projects.d.ts +740 -0
  171. package/dist/apps/platform/routes/projects.d.ts.map +1 -0
  172. package/dist/apps/platform/routes/projects.js +286 -0
  173. package/dist/apps/platform/routes/projects.js.map +1 -0
  174. package/dist/apps/relay/App.d.ts +41 -0
  175. package/dist/apps/relay/App.d.ts.map +1 -0
  176. package/dist/apps/relay/App.js +103 -0
  177. package/dist/apps/relay/App.js.map +1 -0
  178. package/dist/apps/relay/Sponsorships.d.ts +107 -0
  179. package/dist/apps/relay/Sponsorships.d.ts.map +1 -0
  180. package/dist/apps/relay/Sponsorships.js +193 -0
  181. package/dist/apps/relay/Sponsorships.js.map +1 -0
  182. package/dist/apps/relay/index.d.ts +3 -0
  183. package/dist/apps/relay/index.d.ts.map +1 -0
  184. package/dist/apps/relay/index.js +3 -0
  185. package/dist/apps/relay/index.js.map +1 -0
  186. package/dist/{Cli.d.ts → cli/Cli.d.ts} +13 -2
  187. package/dist/cli/Cli.d.ts.map +1 -0
  188. package/dist/cli/Cli.js +19 -0
  189. package/dist/cli/Cli.js.map +1 -0
  190. package/dist/cli/bin.d.ts +3 -0
  191. package/dist/cli/bin.d.ts.map +1 -0
  192. package/dist/cli/bin.js +4 -0
  193. package/dist/cli/bin.js.map +1 -0
  194. package/dist/cli/commands/admin.d.ts +15 -0
  195. package/dist/cli/commands/admin.d.ts.map +1 -0
  196. package/dist/cli/commands/admin.js +60 -0
  197. package/dist/cli/commands/admin.js.map +1 -0
  198. package/dist/cloudflare.d.ts +7 -0
  199. package/dist/cloudflare.d.ts.map +1 -1
  200. package/dist/cloudflare.js +9 -0
  201. package/dist/cloudflare.js.map +1 -1
  202. package/dist/db/Db.d.ts +113 -0
  203. package/dist/db/Db.d.ts.map +1 -0
  204. package/dist/db/Db.js +402 -0
  205. package/dist/db/Db.js.map +1 -0
  206. package/dist/db/Schema.d.ts +168 -0
  207. package/dist/db/Schema.d.ts.map +1 -0
  208. package/dist/db/Schema.js +229 -0
  209. package/dist/db/Schema.js.map +1 -0
  210. package/dist/db/tables/invitations.d.ts +84 -0
  211. package/dist/db/tables/invitations.d.ts.map +1 -0
  212. package/dist/db/tables/invitations.js +165 -0
  213. package/dist/db/tables/invitations.js.map +1 -0
  214. package/dist/db/tables/memberships.d.ts +108 -0
  215. package/dist/db/tables/memberships.d.ts.map +1 -0
  216. package/dist/db/tables/memberships.js +153 -0
  217. package/dist/db/tables/memberships.js.map +1 -0
  218. package/dist/db/tables/organizations.d.ts +123 -0
  219. package/dist/db/tables/organizations.d.ts.map +1 -0
  220. package/dist/db/tables/organizations.js +170 -0
  221. package/dist/db/tables/organizations.js.map +1 -0
  222. package/dist/db/tables/projects.d.ts +65 -0
  223. package/dist/db/tables/projects.d.ts.map +1 -0
  224. package/dist/db/tables/projects.js +75 -0
  225. package/dist/db/tables/projects.js.map +1 -0
  226. package/dist/db/tables/sponsoredTransactions.d.ts +120 -0
  227. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -0
  228. package/dist/db/tables/sponsoredTransactions.js +161 -0
  229. package/dist/db/tables/sponsoredTransactions.js.map +1 -0
  230. package/dist/db/tables/users.d.ts +48 -0
  231. package/dist/db/tables/users.d.ts.map +1 -0
  232. package/dist/db/tables/users.js +65 -0
  233. package/dist/db/tables/users.js.map +1 -0
  234. package/dist/db/tables/verifiedTokens.d.ts +53 -0
  235. package/dist/db/tables/verifiedTokens.d.ts.map +1 -0
  236. package/dist/db/tables/verifiedTokens.js +74 -0
  237. package/dist/db/tables/verifiedTokens.js.map +1 -0
  238. package/dist/db/tables/webhookDeliveries.d.ts +71 -0
  239. package/dist/db/tables/webhookDeliveries.d.ts.map +1 -0
  240. package/dist/db/tables/webhookDeliveries.js +119 -0
  241. package/dist/db/tables/webhookDeliveries.js.map +1 -0
  242. package/dist/db/tables/webhookSubscriptions.d.ts +158 -0
  243. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -0
  244. package/dist/db/tables/webhookSubscriptions.js +272 -0
  245. package/dist/db/tables/webhookSubscriptions.js.map +1 -0
  246. package/dist/handlers/internal/executionError.d.ts +25 -0
  247. package/dist/handlers/internal/executionError.d.ts.map +1 -0
  248. package/dist/handlers/internal/executionError.js +186 -0
  249. package/dist/handlers/internal/executionError.js.map +1 -0
  250. package/dist/handlers/internal/multisig.d.ts +233 -0
  251. package/dist/handlers/internal/multisig.d.ts.map +1 -0
  252. package/dist/handlers/internal/multisig.js +542 -0
  253. package/dist/handlers/internal/multisig.js.map +1 -0
  254. package/dist/handlers/internal/requestListener.d.ts +124 -0
  255. package/dist/handlers/internal/requestListener.d.ts.map +1 -0
  256. package/dist/handlers/internal/requestListener.js +173 -0
  257. package/dist/handlers/internal/requestListener.js.map +1 -0
  258. package/dist/handlers/internal/sponsorship.d.ts +113 -0
  259. package/dist/handlers/internal/sponsorship.d.ts.map +1 -0
  260. package/dist/handlers/internal/sponsorship.js +128 -0
  261. package/dist/handlers/internal/sponsorship.js.map +1 -0
  262. package/dist/handlers/internal/types.d.ts +284 -0
  263. package/dist/handlers/internal/types.d.ts.map +1 -0
  264. package/dist/handlers/internal/types.js +2 -0
  265. package/dist/handlers/internal/types.js.map +1 -0
  266. package/dist/handlers/internal/utils.d.ts +34 -0
  267. package/dist/handlers/internal/utils.d.ts.map +1 -0
  268. package/dist/handlers/internal/utils.js +131 -0
  269. package/dist/handlers/internal/utils.js.map +1 -0
  270. package/dist/handlers/relay.d.ts +123 -0
  271. package/dist/handlers/relay.d.ts.map +1 -0
  272. package/dist/handlers/relay.js +1278 -0
  273. package/dist/handlers/relay.js.map +1 -0
  274. package/dist/index.d.ts +4 -2
  275. package/dist/index.d.ts.map +1 -1
  276. package/dist/index.js +4 -2
  277. package/dist/index.js.map +1 -1
  278. package/dist/internal/Auth.d.ts +224 -16
  279. package/dist/internal/Auth.d.ts.map +1 -1
  280. package/dist/internal/Auth.js +572 -33
  281. package/dist/internal/Auth.js.map +1 -1
  282. package/dist/internal/Log.d.ts +7 -3
  283. package/dist/internal/Log.d.ts.map +1 -1
  284. package/dist/internal/Log.js +4 -0
  285. package/dist/internal/Log.js.map +1 -1
  286. package/dist/internal/OpenApi.d.ts +0 -19
  287. package/dist/internal/OpenApi.d.ts.map +1 -1
  288. package/dist/internal/OpenApi.js +0 -57
  289. package/dist/internal/OpenApi.js.map +1 -1
  290. package/dist/internal/RpcSchema.d.ts +10 -0
  291. package/dist/internal/RpcSchema.d.ts.map +1 -0
  292. package/dist/internal/RpcSchema.js +2 -0
  293. package/dist/internal/RpcSchema.js.map +1 -0
  294. package/dist/internal/Store.d.ts +49 -4
  295. package/dist/internal/Store.d.ts.map +1 -1
  296. package/dist/internal/Store.js +81 -5
  297. package/dist/internal/Store.js.map +1 -1
  298. package/dist/internal/VerifiedTokens.d.ts +15 -34
  299. package/dist/internal/VerifiedTokens.d.ts.map +1 -1
  300. package/dist/internal/VerifiedTokens.js +115 -159
  301. package/dist/internal/VerifiedTokens.js.map +1 -1
  302. package/dist/internal/Viem.d.ts +84 -0
  303. package/dist/internal/Viem.d.ts.map +1 -1
  304. package/dist/internal/Webhooks.d.ts +50 -36
  305. package/dist/internal/Webhooks.d.ts.map +1 -1
  306. package/dist/internal/Webhooks.js +92 -205
  307. package/dist/internal/Webhooks.js.map +1 -1
  308. package/package.json +37 -6
  309. package/src/ApiKey.test.ts +3 -3
  310. package/src/ApiKey.ts +11 -12
  311. package/src/ApiKeys.test.ts +278 -0
  312. package/src/ApiKeys.ts +358 -0
  313. package/src/App.test-d.ts +1 -1
  314. package/src/App.test.ts +40508 -19083
  315. package/src/App.ts +239 -416
  316. package/src/Client.test-d.ts +307 -16
  317. package/src/Handler.ts +154 -0
  318. package/src/Scope.ts +17 -4
  319. package/src/Webhooks.test.ts +8 -7
  320. package/src/Webhooks.ts +13 -7
  321. package/src/admin/Access.ts +1 -3
  322. package/src/admin/App.ts +19 -24
  323. package/src/admin/apps/api-keys.test.ts +70 -18
  324. package/src/admin/apps/api-keys.ts +92 -9
  325. package/src/admin/apps/scopes.test.ts +8 -0
  326. package/src/admin/apps/verified-tokens.test.ts +3 -30
  327. package/src/admin/apps/verified-tokens.ts +18 -37
  328. package/src/admin/ui.generated.ts +1 -1
  329. package/src/apps/composition.test.ts +66 -0
  330. package/src/apps/data/App.ts +295 -0
  331. package/src/apps/data/index.ts +2 -0
  332. package/src/apps/{activities.test.ts → data/routes/activities.test.ts} +3 -3
  333. package/src/apps/{activities.ts → data/routes/activities.ts} +15 -15
  334. package/src/apps/{addresses.ts → data/routes/addresses.ts} +6 -6
  335. package/src/apps/{balances.test.ts → data/routes/balances.test.ts} +6 -5
  336. package/src/apps/{balances.ts → data/routes/balances.ts} +46 -12
  337. package/src/apps/{blocks.test.ts → data/routes/blocks.test.ts} +4 -4
  338. package/src/apps/{blocks.ts → data/routes/blocks.ts} +14 -14
  339. package/src/apps/{coingecko.test.ts → data/routes/coingecko.test.ts} +2 -2
  340. package/src/apps/{coingecko.ts → data/routes/coingecko.ts} +14 -14
  341. package/src/apps/{exchanges.test.ts → data/routes/exchanges.test.ts} +2 -2
  342. package/src/apps/{exchanges.ts → data/routes/exchanges.ts} +20 -20
  343. package/src/apps/{fee-amm.test.ts → data/routes/fee-amm.test.ts} +3 -3
  344. package/src/apps/{fee-amm.ts → data/routes/fee-amm.ts} +18 -18
  345. package/src/apps/{indexer.test.ts → data/routes/indexer.test.ts} +27 -6
  346. package/src/apps/{indexer.ts → data/routes/indexer.ts} +13 -10
  347. package/src/apps/{receipts.test.ts → data/routes/receipts.test.ts} +4 -4
  348. package/src/apps/{receipts.ts → data/routes/receipts.ts} +13 -13
  349. package/src/apps/{rpc.test.ts → data/routes/rpc.test.ts} +142 -13
  350. package/src/apps/{rpc.ts → data/routes/rpc.ts} +7 -7
  351. package/src/apps/{tokenlist.test.ts → data/routes/tokenlist.test.ts} +8 -10
  352. package/src/apps/{tokenlist.ts → data/routes/tokenlist.ts} +9 -9
  353. package/src/apps/{tokens.test.ts → data/routes/tokens.test.ts} +6 -5
  354. package/src/apps/{tokens.ts → data/routes/tokens.ts} +20 -20
  355. package/src/apps/{transactions.test.ts → data/routes/transactions.test.ts} +4 -4
  356. package/src/apps/{transactions.ts → data/routes/transactions.ts} +15 -15
  357. package/src/apps/{transfers.test.ts → data/routes/transfers.test.ts} +3 -3
  358. package/src/apps/{transfers.ts → data/routes/transfers.ts} +15 -15
  359. package/src/apps/{verified-tokens.test.ts → data/routes/verified-tokens.test.ts} +27 -15
  360. package/src/apps/{verified-tokens.ts → data/routes/verified-tokens.ts} +10 -10
  361. package/src/apps/{webhooks.test.ts → data/routes/webhooks.test.ts} +137 -150
  362. package/src/apps/{webhooks.ts → data/routes/webhooks.ts} +83 -81
  363. package/src/apps/docs/App.ts +136 -0
  364. package/src/apps/docs/index.ts +1 -0
  365. package/src/apps/index.ts +3 -0
  366. package/src/apps/metadata.ts +23 -0
  367. package/src/apps/platform/App.ts +130 -0
  368. package/src/apps/platform/index.ts +1 -0
  369. package/src/apps/platform/routes/api-keys.test.ts +330 -0
  370. package/src/apps/platform/routes/api-keys.ts +427 -0
  371. package/src/apps/platform/routes/invitations.test.ts +361 -0
  372. package/src/apps/platform/routes/invitations.ts +519 -0
  373. package/src/apps/platform/routes/me.test.ts +121 -0
  374. package/src/apps/platform/routes/me.ts +106 -0
  375. package/src/apps/platform/routes/members.test.ts +195 -0
  376. package/src/apps/platform/routes/members.ts +313 -0
  377. package/src/apps/platform/routes/orgs.test.ts +313 -0
  378. package/src/apps/platform/routes/orgs.ts +343 -0
  379. package/src/apps/platform/routes/projects.test.ts +181 -0
  380. package/src/apps/platform/routes/projects.ts +367 -0
  381. package/src/apps/relay/App.test.ts +484 -0
  382. package/src/apps/relay/App.ts +128 -0
  383. package/src/apps/relay/Sponsorships.test.ts +375 -0
  384. package/src/apps/relay/Sponsorships.ts +305 -0
  385. package/src/apps/relay/index.ts +2 -0
  386. package/src/{Cli.test.ts → cli/Cli.test.ts} +10 -9
  387. package/src/{Cli.ts → cli/Cli.ts} +16 -9
  388. package/src/cli/bin.ts +4 -0
  389. package/src/cli/commands/admin.test.ts +71 -0
  390. package/src/cli/commands/admin.ts +60 -0
  391. package/src/cloudflare.ts +10 -0
  392. package/src/db/Db.test.ts +84 -0
  393. package/src/db/Db.ts +542 -0
  394. package/src/db/Schema.ts +301 -0
  395. package/src/db/tables/invitations.ts +198 -0
  396. package/src/db/tables/memberships.ts +208 -0
  397. package/src/db/tables/organizations.test.ts +160 -0
  398. package/src/db/tables/organizations.ts +232 -0
  399. package/src/db/tables/projects.ts +107 -0
  400. package/src/db/tables/sponsoredTransactions.test.ts +218 -0
  401. package/src/db/tables/sponsoredTransactions.ts +236 -0
  402. package/src/db/tables/users.ts +85 -0
  403. package/src/db/tables/verifiedTokens.ts +111 -0
  404. package/src/db/tables/webhookDeliveries.ts +159 -0
  405. package/src/db/tables/webhookSubscriptions.ts +358 -0
  406. package/src/handlers/internal/executionError.ts +207 -0
  407. package/src/handlers/internal/multisig.test.ts +818 -0
  408. package/src/handlers/internal/multisig.ts +823 -0
  409. package/src/handlers/internal/requestListener.ts +273 -0
  410. package/src/handlers/internal/sponsorship.ts +245 -0
  411. package/src/handlers/internal/types.ts +378 -0
  412. package/src/handlers/internal/utils.ts +153 -0
  413. package/src/handlers/relay.test.ts +2035 -0
  414. package/src/handlers/relay.ts +1623 -0
  415. package/src/index.ts +4 -2
  416. package/src/internal/Auth.test.ts +337 -21
  417. package/src/internal/Auth.ts +783 -44
  418. package/src/internal/Cursor.test.ts +3 -2
  419. package/src/internal/Log.test.ts +1 -1
  420. package/src/internal/Log.ts +11 -3
  421. package/src/internal/MetricSink.ts +1 -1
  422. package/src/internal/OpenApi.ts +0 -59
  423. package/src/internal/RateLimit.test.ts +1 -1
  424. package/src/internal/RpcSchema.ts +10 -0
  425. package/src/internal/Store.test.ts +150 -10
  426. package/src/internal/Store.ts +136 -11
  427. package/src/internal/Tidx.local.test.ts +1 -1
  428. package/src/internal/VerifiedTokens.test.ts +99 -115
  429. package/src/internal/VerifiedTokens.ts +123 -175
  430. package/src/internal/WebhookDestination.test.ts +1 -1
  431. package/src/internal/Webhooks.test.ts +111 -111
  432. package/src/internal/Webhooks.ts +103 -221
  433. package/dist/ApiKeySource.d.ts +0 -166
  434. package/dist/ApiKeySource.d.ts.map +0 -1
  435. package/dist/ApiKeySource.js +0 -234
  436. package/dist/ApiKeySource.js.map +0 -1
  437. package/dist/Cli.d.ts.map +0 -1
  438. package/dist/Cli.js +0 -13
  439. package/dist/Cli.js.map +0 -1
  440. package/dist/apps/activities.js.map +0 -1
  441. package/dist/apps/addresses.js.map +0 -1
  442. package/dist/apps/balances.d.ts.map +0 -1
  443. package/dist/apps/balances.js.map +0 -1
  444. package/dist/apps/blocks.d.ts.map +0 -1
  445. package/dist/apps/blocks.js.map +0 -1
  446. package/dist/apps/coingecko.d.ts.map +0 -1
  447. package/dist/apps/coingecko.js.map +0 -1
  448. package/dist/apps/exchanges.d.ts.map +0 -1
  449. package/dist/apps/exchanges.js.map +0 -1
  450. package/dist/apps/fee-amm.d.ts.map +0 -1
  451. package/dist/apps/fee-amm.js.map +0 -1
  452. package/dist/apps/indexer.d.ts.map +0 -1
  453. package/dist/apps/indexer.js.map +0 -1
  454. package/dist/apps/receipts.d.ts.map +0 -1
  455. package/dist/apps/receipts.js.map +0 -1
  456. package/dist/apps/rpc.d.ts.map +0 -1
  457. package/dist/apps/rpc.js.map +0 -1
  458. package/dist/apps/tokenlist.d.ts.map +0 -1
  459. package/dist/apps/tokenlist.js.map +0 -1
  460. package/dist/apps/tokens.d.ts.map +0 -1
  461. package/dist/apps/tokens.js.map +0 -1
  462. package/dist/apps/transactions.d.ts.map +0 -1
  463. package/dist/apps/transactions.js.map +0 -1
  464. package/dist/apps/transfers.d.ts.map +0 -1
  465. package/dist/apps/transfers.js.map +0 -1
  466. package/dist/apps/verified-tokens.d.ts.map +0 -1
  467. package/dist/apps/verified-tokens.js.map +0 -1
  468. package/dist/apps/webhooks.js.map +0 -1
  469. package/dist/internal/OpenApi.fonts.d.ts.map +0 -1
  470. package/dist/internal/OpenApi.fonts.js.map +0 -1
  471. package/dist/internal/OpenApi.logo.d.ts.map +0 -1
  472. package/dist/internal/OpenApi.logo.js.map +0 -1
  473. package/seeds/31318/icons/0x20c0000000000000000000000000000000000000.svg +0 -1
  474. package/seeds/31318/icons/0x20c0000000000000000000000000000000000001.svg +0 -1
  475. package/seeds/31318/icons/0x20c0000000000000000000000000000000000002.svg +0 -1
  476. package/seeds/31318/icons/0x20c0000000000000000000000000000000000003.svg +0 -1
  477. package/seeds/31318/verified-tokens.json +0 -30
  478. package/seeds/4217/icons/0x20c0000000000000000000000000000000000000.svg +0 -25
  479. package/seeds/4217/icons/0x20c000000000000000000000048c8f36df1c9a4a.svg +0 -1
  480. package/seeds/4217/icons/0x20c0000000000000000000000520792dcccccccc.svg +0 -1
  481. package/seeds/4217/icons/0x20c0000000000000000000000a6da882d075a4c3.svg +0 -4
  482. package/seeds/4217/icons/0x20c000000000000000000000111111111e910f0f.svg +0 -30
  483. package/seeds/4217/icons/0x20c00000000000000000000014f22ca97301eb73.svg +0 -1
  484. package/seeds/4217/icons/0x20c0000000000000000000001621e21f71cf12fb.svg +0 -1
  485. package/seeds/4217/icons/0x20c0000000000000000000002f52d5cc21a3207b.svg +0 -1
  486. package/seeds/4217/icons/0x20c0000000000000000000003158081efd85bfc2.svg +0 -11
  487. package/seeds/4217/icons/0x20c0000000000000000000003554d28269e0f3c2.svg +0 -1
  488. package/seeds/4217/icons/0x20c000000000000000000000383a23bacb546ab9.svg +0 -1
  489. package/seeds/4217/icons/0x20c00000000000000000000042109aef2f8b28e1.png +0 -0
  490. package/seeds/4217/icons/0x20c0000000000000000000005c0bac7cef389a11.svg +0 -1
  491. package/seeds/4217/icons/0x20c0000000000000000000006fd9a167923ba194.png +0 -0
  492. package/seeds/4217/icons/0x20c0000000000000000000007f7ba549dd0251b9.svg +0 -1
  493. package/seeds/4217/icons/0x20c0000000000000000000008191667423f70e67.svg +0 -5
  494. package/seeds/4217/icons/0x20c0000000000000000000008ee4fcff88888888.svg +0 -1
  495. package/seeds/4217/icons/0x20c0000000000000000000009a4a4b17e0dc6651.svg +0 -1
  496. package/seeds/4217/icons/0x20c000000000000000000000ab02d39df30bd17e.svg +0 -1
  497. package/seeds/4217/icons/0x20c000000000000000000000ae247a1130450f09.svg +0 -1
  498. package/seeds/4217/icons/0x20c000000000000000000000aeed2ec36a54d0e5.svg +0 -1
  499. package/seeds/4217/icons/0x20c000000000000000000000b9537d11c60e8b50.svg +0 -1
  500. package/seeds/4217/icons/0x20c000000000000000000000bd95bfb69fbe6ce3.svg +0 -1
  501. package/seeds/4217/icons/0x20c000000000000000000000c412ec89d0c08be5.svg +0 -1
  502. package/seeds/4217/icons/0x20c000000000000000000000f047dd7018e50367.png +0 -0
  503. package/seeds/4217/verified-tokens.json +0 -177
  504. package/seeds/42431/icons/0x20c0000000000000000000000000000000000000.svg +0 -25
  505. package/seeds/42431/icons/0x20c0000000000000000000000000000000000001.svg +0 -1
  506. package/seeds/42431/icons/0x20c0000000000000000000000000000000000002.svg +0 -1
  507. package/seeds/42431/icons/0x20c0000000000000000000000000000000000003.svg +0 -1
  508. package/seeds/42431/icons/0x20c0000000000000000000009e8d7eb59b783726.svg +0 -1
  509. package/seeds/42431/icons/0x20c000000000000000000000d72572838bbee59c.svg +0 -1
  510. package/seeds/42431/verified-tokens.json +0 -44
  511. package/seeds/openrpc/README.md +0 -27
  512. package/seeds/openrpc/execution-apis.json +0 -8989
  513. package/src/ApiKeySource.test-d.ts +0 -11
  514. package/src/ApiKeySource.test.ts +0 -295
  515. package/src/ApiKeySource.ts +0 -303
  516. /package/src/{internal/OpenApi.fonts.ts → apps/docs/fonts.ts} +0 -0
  517. /package/src/{internal/OpenApi.logo.ts → apps/docs/logo.ts} +0 -0
package/src/index.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  export * as ApiKey from './ApiKey.js'
2
- export * as ApiKeySource from './ApiKeySource.js'
2
+ export * as ApiKeys from './ApiKeys.js'
3
3
  export * as App from './App.js'
4
4
  export * as Assets from './Assets.js'
5
5
  export * as Auth from './Auth.js'
6
- export * as Cli from './Cli.js'
6
+ export * as Cli from './cli/Cli.js'
7
7
  export * as Client from './Client.js'
8
+ export * as Db from './db/Db.js'
9
+ export * as Handler from './Handler.js'
8
10
  export * as Log from './internal/Log.js'
9
11
  export * as Metrics from './Metrics.js'
10
12
  export * as RateLimit from './internal/RateLimit.js'
@@ -1,7 +1,7 @@
1
1
  import { Hono } from 'hono'
2
2
  import { requestId } from 'hono/request-id'
3
3
  import { Mppx, tempo } from 'mppx/hono'
4
- import { RateLimit } from 'cadent'
4
+ import { RateLimit } from 'tapimo'
5
5
  import * as ApiKey from '../ApiKey.js'
6
6
  import * as Auth from './Auth.js'
7
7
  import * as Log from './Log.js'
@@ -96,7 +96,7 @@ describe('require', () => {
96
96
  // the downstream validator rejects it as `query_invalid` and the legacy
97
97
  // `?key=...` lane breaks on every strict-query endpoint.
98
98
  const auth = {
99
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
99
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
100
100
  rateLimit: RateLimit.memory(),
101
101
  }
102
102
  const app = new Hono<Auth.Environment>()
@@ -241,7 +241,7 @@ describe('require', () => {
241
241
  const app = createApp({
242
242
  auth: {
243
243
  apiKey: {
244
- source: TestApp.source({
244
+ resolve: TestApp.resolver({
245
245
  keys: [{ ...key, scopes: [Scope.wildcard], token }],
246
246
  }),
247
247
  },
@@ -267,13 +267,242 @@ describe('require', () => {
267
267
  })
268
268
  })
269
269
 
270
+ describe('session', () => {
271
+ const sessionPrincipal = {
272
+ id: 'usr_test',
273
+ identity: { provider: 'wallet', subject: '0x0000000000000000000000000000000000000001' },
274
+ type: 'session',
275
+ } as const satisfies Auth.SessionPrincipal
276
+
277
+ /** Harness with the session capability installed on the auth context. */
278
+ function createSessionApp(
279
+ options: {
280
+ policy?: Auth.require.Policy | undefined
281
+ resolve?: Auth.Session['resolve'] | undefined
282
+ } = {},
283
+ ) {
284
+ const auth = {
285
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
286
+ rateLimit: RateLimit.memory(),
287
+ ...(options.resolve ? { session: { resolve: options.resolve } } : {}),
288
+ }
289
+ const app = new Hono<Auth.Environment>()
290
+ app.use('*', async (c, next) => {
291
+ c.set('auth', auth)
292
+ await next()
293
+ })
294
+ app.use('/protected', Auth.require(options.policy ?? { session: true }))
295
+ app.get('/protected', (c) => c.json(serializePrincipal(Auth.getPrincipal(c))))
296
+ return app
297
+ }
298
+
299
+ test('resolves cookie sessions for session-lane routes', async () => {
300
+ const app = createSessionApp({ resolve: async () => sessionPrincipal })
301
+ const response = await app.request('/protected')
302
+ const body = await response.json()
303
+
304
+ expect(response.status).toMatchInlineSnapshot(`200`)
305
+ expect(body).toMatchInlineSnapshot(`
306
+ {
307
+ "id": "usr_test",
308
+ "type": "session",
309
+ }
310
+ `)
311
+ })
312
+
313
+ test('falls through to the session lane on invalid bearer tokens', async () => {
314
+ const app = createSessionApp({ resolve: async () => sessionPrincipal })
315
+ const response = await app.request('/protected', {
316
+ headers: { authorization: 'Bearer not-an-api-key' },
317
+ })
318
+
319
+ expect(response.status).toMatchInlineSnapshot(`200`)
320
+ })
321
+
322
+ test('rejects anonymous requests without a session', async () => {
323
+ const app = createSessionApp({ resolve: async () => null })
324
+ const response = await app.request('/protected')
325
+
326
+ expect(response.status).toMatchInlineSnapshot(`401`)
327
+ })
328
+
329
+ test('stays closed without the app session capability', async () => {
330
+ const app = createSessionApp()
331
+ const response = await app.request('/protected')
332
+
333
+ expect(response.status).toMatchInlineSnapshot(`401`)
334
+ })
335
+
336
+ test('valid API keys win over sessions', async () => {
337
+ const app = createSessionApp({
338
+ policy: { apiKey: { scopes: ['data:read'] }, session: true },
339
+ resolve: async () => sessionPrincipal,
340
+ })
341
+ const response = await app.request('/protected', {
342
+ headers: { 'tempo-api-key': token },
343
+ })
344
+ const body = await response.json()
345
+
346
+ expect(response.status).toMatchInlineSnapshot(`200`)
347
+ expect(body).toMatchInlineSnapshot(`
348
+ {
349
+ "id": "key_test",
350
+ "orgId": "org_test",
351
+ "type": "api_key",
352
+ }
353
+ `)
354
+ })
355
+
356
+ test('is not consulted on lane-less routes', async () => {
357
+ const app = createSessionApp({
358
+ policy: {},
359
+ resolve: async () => sessionPrincipal,
360
+ })
361
+ const response = await app.request('/protected')
362
+
363
+ expect(response.status).toMatchInlineSnapshot(`401`)
364
+ })
365
+ })
366
+
367
+ describe('superAdmin', () => {
368
+ const secret = 'tempo:sk:a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0'
369
+
370
+ /** Auth context with the super admin secret configured alongside the test key. */
371
+ function withSuperAdmin(): Auth.Context {
372
+ return {
373
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
374
+ rateLimit: RateLimit.memory(),
375
+ superAdmin: { tokenHash: ApiKey.hash(secret) },
376
+ }
377
+ }
378
+
379
+ test('resolves the super admin secret before key lookup', async () => {
380
+ const app = createApp({ auth: withSuperAdmin() })
381
+ const response = await app.request('/protected', {
382
+ headers: { 'tempo-api-key': secret },
383
+ })
384
+ const body = await response.json()
385
+
386
+ expect(response.status).toMatchInlineSnapshot(`200`)
387
+ expect(body).toMatchInlineSnapshot(`
388
+ {
389
+ "actor": "super_admin",
390
+ "id": "super_admin",
391
+ "type": "super_admin",
392
+ }
393
+ `)
394
+ })
395
+
396
+ test('accepts the super admin secret as a bearer token', async () => {
397
+ const app = createApp({ auth: withSuperAdmin() })
398
+ const response = await app.request('/protected', {
399
+ headers: { authorization: `Bearer ${secret}` },
400
+ })
401
+
402
+ expect(response.status).toMatchInlineSnapshot(`200`)
403
+ })
404
+
405
+ test('bypasses scope checks', async () => {
406
+ const app = createApp({
407
+ auth: withSuperAdmin(),
408
+ policy: { apiKey: { scopes: [Scope.wildcard] } },
409
+ })
410
+ const response = await app.request('/protected', {
411
+ headers: { 'tempo-api-key': secret },
412
+ })
413
+
414
+ expect(response.status).toMatchInlineSnapshot(`200`)
415
+ })
416
+
417
+ test('non-matching tokens fall through to key lookup', async () => {
418
+ const app = createApp({ auth: withSuperAdmin() })
419
+ const response = await app.request('/protected', {
420
+ headers: { 'tempo-api-key': token },
421
+ })
422
+ const body = await response.json()
423
+
424
+ expect(response.status).toMatchInlineSnapshot(`200`)
425
+ expect(body).toMatchInlineSnapshot(`
426
+ {
427
+ "id": "key_test",
428
+ "orgId": "org_test",
429
+ "type": "api_key",
430
+ }
431
+ `)
432
+ })
433
+
434
+ test('is disabled when unconfigured', async () => {
435
+ const app = createApp()
436
+ const response = await app.request('/protected', {
437
+ headers: { 'tempo-api-key': secret },
438
+ })
439
+ const body = await response.json()
440
+
441
+ expect(response.status).toMatchInlineSnapshot(`401`)
442
+ expect(body).toMatchInlineSnapshot(`
443
+ {
444
+ "error": {
445
+ "code": "api_key_invalid",
446
+ "message": "Invalid API key",
447
+ },
448
+ }
449
+ `)
450
+ })
451
+
452
+ test('is the only principal for lane-less routes', async () => {
453
+ const app = createApp({ auth: withSuperAdmin(), policy: {} })
454
+
455
+ const superAdmin = await app.request('/protected', {
456
+ headers: { 'tempo-api-key': secret },
457
+ })
458
+ expect(superAdmin.status).toMatchInlineSnapshot(`200`)
459
+
460
+ const keyed = await app.request('/protected', {
461
+ headers: { 'tempo-api-key': token },
462
+ })
463
+ const body = await keyed.json()
464
+ expect(keyed.status).toMatchInlineSnapshot(`403`)
465
+ expect(body).toMatchInlineSnapshot(`
466
+ {
467
+ "error": {
468
+ "code": "forbidden",
469
+ "message": "API key not permitted for this route",
470
+ },
471
+ }
472
+ `)
473
+
474
+ const anonymous = await app.request('/protected')
475
+ expect(anonymous.status).toMatchInlineSnapshot(`401`)
476
+ })
477
+
478
+ test('logs the principal actor, never the secret', async () => {
479
+ const entries: Log.Entry[] = []
480
+ const app = createApp({
481
+ auth: withSuperAdmin(),
482
+ logger: (entry) => {
483
+ entries.push(entry)
484
+ },
485
+ })
486
+ await app.request('/protected', { headers: { 'tempo-api-key': secret } })
487
+
488
+ expect(entries[0]?.principal).toMatchInlineSnapshot(`
489
+ {
490
+ "actor": "super_admin",
491
+ "id": "super_admin",
492
+ "type": "super_admin",
493
+ }
494
+ `)
495
+ expect(JSON.stringify(entries)).not.toContain(secret)
496
+ })
497
+ })
498
+
270
499
  describe('environment', () => {
271
500
  const sandboxToken = 'secret_sandbox'
272
501
 
273
502
  function createChainApp(options: { public?: boolean } = {}) {
274
503
  const auth: Auth.Context = {
275
504
  apiKey: {
276
- source: TestApp.source({
505
+ resolve: TestApp.resolver({
277
506
  keys: [
278
507
  { ...key, scopes: [Scope.wildcard], token },
279
508
  {
@@ -399,7 +628,7 @@ describe('require', () => {
399
628
  const mpp = createMppServer()
400
629
  const app = createApp({
401
630
  auth: {
402
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
631
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
403
632
  mpp,
404
633
  rateLimit: overQuota(),
405
634
  },
@@ -420,7 +649,7 @@ describe('require', () => {
420
649
  const mpp = createMppServer()
421
650
  const app = createApp({
422
651
  auth: {
423
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
652
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
424
653
  mpp,
425
654
  rateLimit: overQuotaOnce(),
426
655
  },
@@ -451,7 +680,7 @@ describe('require', () => {
451
680
  const mpp = createMppServer()
452
681
  const app = createApp({
453
682
  auth: {
454
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
683
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
455
684
  mpp,
456
685
  rateLimit: overQuota(),
457
686
  },
@@ -477,7 +706,7 @@ describe('require', () => {
477
706
  const mpp = createMppServer()
478
707
  const app = createApp({
479
708
  auth: {
480
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
709
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
481
710
  mpp,
482
711
  rateLimit: overQuotaOnce(),
483
712
  },
@@ -537,7 +766,7 @@ describe('require', () => {
537
766
  test('returns rate-limit error without payment context', async () => {
538
767
  const app = createApp({
539
768
  auth: {
540
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
769
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
541
770
  rateLimit: overQuota(),
542
771
  },
543
772
  policy: { public: { rateLimit: { perMinute: 1 } } },
@@ -561,7 +790,7 @@ describe('require', () => {
561
790
  try {
562
791
  const app = createApp({
563
792
  auth: {
564
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
793
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
565
794
  rateLimit: {
566
795
  async consume() {
567
796
  throw new Error('Network connection lost.')
@@ -594,7 +823,7 @@ describe('require', () => {
594
823
  try {
595
824
  const app = createApp({
596
825
  auth: {
597
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
826
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
598
827
  rateLimit: {
599
828
  async consume() {
600
829
  throw new Error('Network connection lost.')
@@ -613,6 +842,85 @@ describe('require', () => {
613
842
  error.mockRestore()
614
843
  }
615
844
  })
845
+
846
+ test('fails open (at warn) when the rate-limit store stalls past the timeout', async () => {
847
+ const error = vi.spyOn(console, 'error').mockImplementation(() => {})
848
+ const warn = vi.spyOn(console, 'warn').mockImplementation(() => {})
849
+ vi.useFakeTimers()
850
+ try {
851
+ const app = createApp({
852
+ auth: {
853
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
854
+ // A hot Durable Object under a storage-latency blip never returns;
855
+ // the consume must not block the request indefinitely.
856
+ rateLimit: { consume: () => new Promise<never>(() => {}) },
857
+ },
858
+ policy: { public: { rateLimit: { perMinute: 1 } } },
859
+ })
860
+ const pending = app.request('/protected', {
861
+ headers: { 'x-forwarded-for': '203.0.113.10' },
862
+ })
863
+ // Advance past the 300ms consume timeout so it fails open.
864
+ await vi.advanceTimersByTimeAsync(300)
865
+ const response = await pending
866
+ const body = await response.json()
867
+
868
+ expect(response.status).toMatchInlineSnapshot(`200`)
869
+ expect(response.headers.has('ratelimit-limit')).toMatchInlineSnapshot(`false`)
870
+ expect(body).toMatchInlineSnapshot(`
871
+ {
872
+ "id": "203.0.113.10",
873
+ "type": "public",
874
+ }
875
+ `)
876
+ // A timeout is an expected degradation: warn, never error.
877
+ expect(warn.mock.calls.length).toMatchInlineSnapshot(`1`)
878
+ expect(error.mock.calls.length).toMatchInlineSnapshot(`0`)
879
+ } finally {
880
+ vi.useRealTimers()
881
+ warn.mockRestore()
882
+ error.mockRestore()
883
+ }
884
+ })
885
+
886
+ test('fails open (at warn) when the rate-limit Durable Object is overloaded', async () => {
887
+ const error = vi.spyOn(console, 'error').mockImplementation(() => {})
888
+ const warn = vi.spyOn(console, 'warn').mockImplementation(() => {})
889
+ try {
890
+ const app = createApp({
891
+ auth: {
892
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
893
+ rateLimit: {
894
+ async consume() {
895
+ throw Object.assign(
896
+ new Error('Durable Object is overloaded. Requests queued for too long.'),
897
+ { overloaded: true },
898
+ )
899
+ },
900
+ },
901
+ },
902
+ policy: { public: { rateLimit: { perMinute: 1 } } },
903
+ })
904
+ const response = await app.request('/protected', {
905
+ headers: { 'x-forwarded-for': '203.0.113.10' },
906
+ })
907
+ const body = await response.json()
908
+
909
+ expect(response.status).toMatchInlineSnapshot(`200`)
910
+ expect(response.headers.has('ratelimit-limit')).toMatchInlineSnapshot(`false`)
911
+ expect(body).toMatchInlineSnapshot(`
912
+ {
913
+ "id": "203.0.113.10",
914
+ "type": "public",
915
+ }
916
+ `)
917
+ expect(warn.mock.calls.length).toMatchInlineSnapshot(`1`)
918
+ expect(error.mock.calls.length).toMatchInlineSnapshot(`0`)
919
+ } finally {
920
+ warn.mockRestore()
921
+ error.mockRestore()
922
+ }
923
+ })
616
924
  })
617
925
 
618
926
  describe('rateLimit per-scope', () => {
@@ -632,7 +940,7 @@ describe('require', () => {
632
940
  const auth = {
633
941
  apiKey: {
634
942
  rateLimits: { 'data:read': { perMinute: 1 }, 'webhooks:write': { perMinute: 1 } },
635
- source: TestApp.source({
943
+ resolve: TestApp.resolver({
636
944
  keys: [{ ...key, scopes: [Scope.wildcard], token }],
637
945
  }),
638
946
  },
@@ -686,7 +994,7 @@ describe('require', () => {
686
994
  const auth = {
687
995
  apiKey: {
688
996
  rateLimits: { 'data:read': { perMinute: 1_000 } },
689
- source: TestApp.source({
997
+ resolve: TestApp.resolver({
690
998
  keys: [{ ...key, scopes: [Scope.wildcard], token }],
691
999
  }),
692
1000
  },
@@ -710,7 +1018,7 @@ describe('require', () => {
710
1018
  })
711
1019
 
712
1020
  test('per-key default overrides config default but not a route cap', async () => {
713
- const source = TestApp.source({
1021
+ const resolve = TestApp.resolver({
714
1022
  keys: [
715
1023
  {
716
1024
  ...key,
@@ -723,7 +1031,7 @@ describe('require', () => {
723
1031
 
724
1032
  const open = createScopedApp({
725
1033
  auth: {
726
- apiKey: { rateLimits: { '*': { perMinute: 1_000 } }, source },
1034
+ apiKey: { rateLimits: { '*': { perMinute: 1_000 } }, resolve },
727
1035
  rateLimit: RateLimit.memory(),
728
1036
  },
729
1037
  routes: [{ path: '/protected', policy: { apiKey: { scopes: ['data:read'] } } }],
@@ -734,7 +1042,7 @@ describe('require', () => {
734
1042
 
735
1043
  const capped = createScopedApp({
736
1044
  auth: {
737
- apiKey: { rateLimits: { '*': { perMinute: 1_000 } }, source },
1045
+ apiKey: { rateLimits: { '*': { perMinute: 1_000 } }, resolve },
738
1046
  rateLimit: RateLimit.memory(),
739
1047
  },
740
1048
  routes: [
@@ -757,7 +1065,7 @@ describe('require', () => {
757
1065
  test('per-key per-scope overrides everything including a route cap', async () => {
758
1066
  const auth = {
759
1067
  apiKey: {
760
- source: TestApp.source({
1068
+ resolve: TestApp.resolver({
761
1069
  keys: [
762
1070
  {
763
1071
  ...key,
@@ -790,7 +1098,7 @@ describe('require', () => {
790
1098
  const entries: Log.Entry[] = []
791
1099
  const app = createApp({
792
1100
  auth: {
793
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
1101
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
794
1102
  rateLimit: overQuota(),
795
1103
  },
796
1104
  logger: (entry) => void entries.push(entry),
@@ -817,7 +1125,7 @@ describe('require', () => {
817
1125
  const mpp = createMppServer()
818
1126
  const app = createApp({
819
1127
  auth: {
820
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
1128
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
821
1129
  mpp,
822
1130
  rateLimit: overQuota(),
823
1131
  },
@@ -846,7 +1154,7 @@ function createScopedApp(options: {
846
1154
  }) {
847
1155
  const auth = options.auth ?? {
848
1156
  apiKey: {
849
- source: TestApp.source({ keys: [{ ...key, scopes: [Scope.wildcard], token }] }),
1157
+ resolve: TestApp.resolver({ keys: [{ ...key, scopes: [Scope.wildcard], token }] }),
850
1158
  },
851
1159
  rateLimit: RateLimit.memory(),
852
1160
  }
@@ -872,7 +1180,7 @@ type Options = {
872
1180
 
873
1181
  function createApp(options: Options = {}) {
874
1182
  const auth = options.auth ?? {
875
- apiKey: { source: TestApp.source({ keys: [{ ...key, token }] }) },
1183
+ apiKey: { resolve: TestApp.resolver({ keys: [{ ...key, token }] }) },
876
1184
  rateLimit: RateLimit.memory(),
877
1185
  }
878
1186
  const app = new Hono<Auth.Environment>()
@@ -948,6 +1256,14 @@ function serializePrincipal(principal: Auth.Principal | null) {
948
1256
  type: principal.type,
949
1257
  }
950
1258
 
1259
+ if (principal.type === 'super_admin')
1260
+ return {
1261
+ actor: principal.actor,
1262
+ id: principal.id,
1263
+ ...payment,
1264
+ type: principal.type,
1265
+ }
1266
+
951
1267
  return {
952
1268
  id: principal.id,
953
1269
  ...payment,