ponder 0.9.4-debug.1 → 0.9.5-debug.1

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 (476) hide show
  1. package/CHANGELOG.md +2201 -0
  2. package/dist/esm/bin/commands/codegen.js +37 -0
  3. package/dist/esm/bin/commands/codegen.js.map +1 -0
  4. package/dist/esm/bin/commands/dev.js +242 -0
  5. package/dist/esm/bin/commands/dev.js.map +1 -0
  6. package/dist/esm/bin/commands/list.js +103 -0
  7. package/dist/esm/bin/commands/list.js.map +1 -0
  8. package/dist/esm/bin/commands/serve.js +123 -0
  9. package/dist/esm/bin/commands/serve.js.map +1 -0
  10. package/dist/esm/bin/commands/start.js +136 -0
  11. package/dist/esm/bin/commands/start.js.map +1 -0
  12. package/dist/esm/bin/ponder.js +118 -0
  13. package/dist/esm/bin/ponder.js.map +1 -0
  14. package/dist/esm/bin/utils/codegen.js +26 -0
  15. package/dist/esm/bin/utils/codegen.js.map +1 -0
  16. package/dist/esm/bin/utils/exit.js +69 -0
  17. package/dist/esm/bin/utils/exit.js.map +1 -0
  18. package/dist/esm/bin/utils/run.js +247 -0
  19. package/dist/esm/bin/utils/run.js.map +1 -0
  20. package/dist/esm/bin/utils/runServer.js +8 -0
  21. package/dist/esm/bin/utils/runServer.js.map +1 -0
  22. package/dist/esm/build/configAndIndexingFunctions.js +654 -0
  23. package/dist/esm/build/configAndIndexingFunctions.js.map +1 -0
  24. package/dist/esm/build/factory.js +43 -0
  25. package/dist/esm/build/factory.js.map +1 -0
  26. package/dist/esm/build/index.js +431 -0
  27. package/dist/esm/build/index.js.map +1 -0
  28. package/dist/esm/build/plugin.js +43 -0
  29. package/dist/esm/build/plugin.js.map +1 -0
  30. package/dist/esm/build/pre.js +112 -0
  31. package/dist/esm/build/pre.js.map +1 -0
  32. package/dist/esm/build/schema.js +89 -0
  33. package/dist/esm/build/schema.js.map +1 -0
  34. package/dist/esm/build/stacktrace.js +137 -0
  35. package/dist/esm/build/stacktrace.js.map +1 -0
  36. package/dist/esm/client/index.js +124 -0
  37. package/dist/esm/client/index.js.map +1 -0
  38. package/dist/esm/client/validate.js +1151 -0
  39. package/dist/esm/client/validate.js.map +1 -0
  40. package/dist/esm/config/address.js +2 -0
  41. package/dist/esm/config/address.js.map +1 -0
  42. package/dist/esm/config/eventFilter.js +2 -0
  43. package/dist/esm/config/eventFilter.js.map +1 -0
  44. package/dist/esm/config/index.js +2 -0
  45. package/dist/esm/config/index.js.map +1 -0
  46. package/dist/esm/config/networks.js +120 -0
  47. package/dist/esm/config/networks.js.map +1 -0
  48. package/dist/esm/config/utilityTypes.js +2 -0
  49. package/dist/esm/config/utilityTypes.js.map +1 -0
  50. package/dist/esm/database/index.js +914 -0
  51. package/dist/esm/database/index.js.map +1 -0
  52. package/dist/esm/drizzle/bigint.js +36 -0
  53. package/dist/esm/drizzle/bigint.js.map +1 -0
  54. package/dist/esm/drizzle/hex.js +38 -0
  55. package/dist/esm/drizzle/hex.js.map +1 -0
  56. package/dist/esm/drizzle/index.js +43 -0
  57. package/dist/esm/drizzle/index.js.map +1 -0
  58. package/dist/esm/drizzle/kit/index.js +658 -0
  59. package/dist/esm/drizzle/kit/index.js.map +1 -0
  60. package/dist/esm/drizzle/onchain.js +102 -0
  61. package/dist/esm/drizzle/onchain.js.map +1 -0
  62. package/dist/esm/graphql/index.js +704 -0
  63. package/dist/esm/graphql/index.js.map +1 -0
  64. package/dist/esm/graphql/json.js +42 -0
  65. package/dist/esm/graphql/json.js.map +1 -0
  66. package/dist/esm/graphql/middleware.js +80 -0
  67. package/dist/esm/graphql/middleware.js.map +1 -0
  68. package/dist/esm/index.js +9 -0
  69. package/dist/esm/index.js.map +1 -0
  70. package/dist/esm/indexing/addStackTrace.js +54 -0
  71. package/dist/esm/indexing/addStackTrace.js.map +1 -0
  72. package/dist/esm/indexing/index.js +10 -0
  73. package/dist/esm/indexing/index.js.map +1 -0
  74. package/dist/esm/indexing/ponderActions.js +60 -0
  75. package/dist/esm/indexing/ponderActions.js.map +1 -0
  76. package/dist/esm/indexing/service.js +312 -0
  77. package/dist/esm/indexing/service.js.map +1 -0
  78. package/dist/esm/indexing-store/historical.js +591 -0
  79. package/dist/esm/indexing-store/historical.js.map +1 -0
  80. package/dist/esm/indexing-store/index.js +19 -0
  81. package/dist/esm/indexing-store/index.js.map +1 -0
  82. package/dist/esm/indexing-store/metadata.js +46 -0
  83. package/dist/esm/indexing-store/metadata.js.map +1 -0
  84. package/dist/esm/indexing-store/realtime.js +295 -0
  85. package/dist/esm/indexing-store/realtime.js.map +1 -0
  86. package/dist/esm/internal/common.js +2 -0
  87. package/dist/esm/internal/common.js.map +1 -0
  88. package/dist/esm/internal/errors.js +175 -0
  89. package/dist/esm/internal/errors.js.map +1 -0
  90. package/dist/esm/internal/logger.js +96 -0
  91. package/dist/esm/internal/logger.js.map +1 -0
  92. package/dist/esm/internal/metrics.js +569 -0
  93. package/dist/esm/internal/metrics.js.map +1 -0
  94. package/dist/esm/internal/options.js +69 -0
  95. package/dist/esm/internal/options.js.map +1 -0
  96. package/dist/esm/internal/shutdown.js +18 -0
  97. package/dist/esm/internal/shutdown.js.map +1 -0
  98. package/dist/esm/internal/telemetry.js +199 -0
  99. package/dist/esm/internal/telemetry.js.map +1 -0
  100. package/dist/esm/internal/types.js +2 -0
  101. package/dist/esm/internal/types.js.map +1 -0
  102. package/dist/esm/server/error.js +55 -0
  103. package/dist/esm/server/error.js.map +1 -0
  104. package/dist/esm/server/index.js +107 -0
  105. package/dist/esm/server/index.js.map +1 -0
  106. package/dist/esm/sync/abi.js +67 -0
  107. package/dist/esm/sync/abi.js.map +1 -0
  108. package/dist/esm/sync/events.js +607 -0
  109. package/dist/esm/sync/events.js.map +1 -0
  110. package/dist/esm/sync/filter.js +356 -0
  111. package/dist/esm/sync/filter.js.map +1 -0
  112. package/dist/esm/sync/fragments.js +300 -0
  113. package/dist/esm/sync/fragments.js.map +1 -0
  114. package/dist/esm/sync/index.js +1001 -0
  115. package/dist/esm/sync/index.js.map +1 -0
  116. package/dist/esm/sync/transport.js +94 -0
  117. package/dist/esm/sync/transport.js.map +1 -0
  118. package/dist/esm/sync-historical/index.js +590 -0
  119. package/dist/esm/sync-historical/index.js.map +1 -0
  120. package/dist/esm/sync-realtime/bloom.js +75 -0
  121. package/dist/esm/sync-realtime/bloom.js.map +1 -0
  122. package/dist/esm/sync-realtime/index.js +794 -0
  123. package/dist/esm/sync-realtime/index.js.map +1 -0
  124. package/dist/esm/sync-store/encoding.js +157 -0
  125. package/dist/esm/sync-store/encoding.js.map +1 -0
  126. package/dist/esm/sync-store/index.js +727 -0
  127. package/dist/esm/sync-store/index.js.map +1 -0
  128. package/dist/esm/sync-store/migrations.js +1186 -0
  129. package/dist/esm/sync-store/migrations.js.map +1 -0
  130. package/dist/esm/types/db.js +2 -0
  131. package/dist/esm/types/db.js.map +1 -0
  132. package/dist/esm/types/eth.js +2 -0
  133. package/dist/esm/types/eth.js.map +1 -0
  134. package/dist/esm/types/sync.js +2 -0
  135. package/dist/esm/types/sync.js.map +1 -0
  136. package/dist/esm/types/utils.js +2 -0
  137. package/dist/esm/types/utils.js.map +1 -0
  138. package/dist/esm/types/virtual.js +2 -0
  139. package/dist/esm/types/virtual.js.map +1 -0
  140. package/dist/esm/ui/ProgressBar.js +11 -0
  141. package/dist/esm/ui/ProgressBar.js.map +1 -0
  142. package/dist/esm/ui/Table.js +50 -0
  143. package/dist/esm/ui/Table.js.map +1 -0
  144. package/dist/esm/ui/app.js +113 -0
  145. package/dist/esm/ui/app.js.map +1 -0
  146. package/dist/esm/ui/graphiql.html.js +59 -0
  147. package/dist/esm/ui/graphiql.html.js.map +1 -0
  148. package/dist/esm/ui/index.js +21 -0
  149. package/dist/esm/ui/index.js.map +1 -0
  150. package/dist/esm/utils/bigint.js +37 -0
  151. package/dist/esm/utils/bigint.js.map +1 -0
  152. package/dist/esm/utils/chains.js +3 -0
  153. package/dist/esm/utils/chains.js.map +1 -0
  154. package/dist/esm/utils/checkpoint.js +114 -0
  155. package/dist/esm/utils/checkpoint.js.map +1 -0
  156. package/dist/esm/utils/chunk.js +8 -0
  157. package/dist/esm/utils/chunk.js.map +1 -0
  158. package/dist/esm/utils/date.js +27 -0
  159. package/dist/esm/utils/date.js.map +1 -0
  160. package/dist/esm/utils/debug.js +2 -0
  161. package/dist/esm/utils/debug.js.map +1 -0
  162. package/dist/esm/utils/dedupe.js +33 -0
  163. package/dist/esm/utils/dedupe.js.map +1 -0
  164. package/dist/esm/utils/duplicates.js +19 -0
  165. package/dist/esm/utils/duplicates.js.map +1 -0
  166. package/dist/esm/utils/estimate.js +6 -0
  167. package/dist/esm/utils/estimate.js.map +1 -0
  168. package/dist/esm/utils/extend.js +28 -0
  169. package/dist/esm/utils/extend.js.map +1 -0
  170. package/dist/esm/utils/format.js +20 -0
  171. package/dist/esm/utils/format.js.map +1 -0
  172. package/dist/esm/utils/generators.js +77 -0
  173. package/dist/esm/utils/generators.js.map +1 -0
  174. package/dist/esm/utils/hash.js +11 -0
  175. package/dist/esm/utils/hash.js.map +1 -0
  176. package/dist/esm/utils/interval.js +171 -0
  177. package/dist/esm/utils/interval.js.map +1 -0
  178. package/dist/esm/utils/lowercase.js +7 -0
  179. package/dist/esm/utils/lowercase.js.map +1 -0
  180. package/dist/esm/utils/mutex.js +25 -0
  181. package/dist/esm/utils/mutex.js.map +1 -0
  182. package/dist/esm/utils/never.js +4 -0
  183. package/dist/esm/utils/never.js.map +1 -0
  184. package/dist/esm/utils/offset.js +73 -0
  185. package/dist/esm/utils/offset.js.map +1 -0
  186. package/dist/esm/utils/order.js +18 -0
  187. package/dist/esm/utils/order.js.map +1 -0
  188. package/dist/esm/utils/partition.js +37 -0
  189. package/dist/esm/utils/partition.js.map +1 -0
  190. package/dist/esm/utils/pg.js +126 -0
  191. package/dist/esm/utils/pg.js.map +1 -0
  192. package/dist/esm/utils/pglite.js +80 -0
  193. package/dist/esm/utils/pglite.js.map +1 -0
  194. package/dist/esm/utils/port.js +30 -0
  195. package/dist/esm/utils/port.js.map +1 -0
  196. package/dist/esm/utils/print.js +23 -0
  197. package/dist/esm/utils/print.js.map +1 -0
  198. package/dist/esm/utils/promiseWithResolvers.js +13 -0
  199. package/dist/esm/utils/promiseWithResolvers.js.map +1 -0
  200. package/dist/esm/utils/queue.js +145 -0
  201. package/dist/esm/utils/queue.js.map +1 -0
  202. package/dist/esm/utils/range.js +8 -0
  203. package/dist/esm/utils/range.js.map +1 -0
  204. package/dist/esm/utils/requestQueue.js +127 -0
  205. package/dist/esm/utils/requestQueue.js.map +1 -0
  206. package/dist/esm/utils/result.js +10 -0
  207. package/dist/esm/utils/result.js.map +1 -0
  208. package/dist/esm/utils/rpc.js +202 -0
  209. package/dist/esm/utils/rpc.js.map +1 -0
  210. package/dist/esm/utils/serialize.js +23 -0
  211. package/dist/esm/utils/serialize.js.map +1 -0
  212. package/dist/esm/utils/timer.js +17 -0
  213. package/dist/esm/utils/timer.js.map +1 -0
  214. package/dist/esm/utils/wait.js +8 -0
  215. package/dist/esm/utils/wait.js.map +1 -0
  216. package/dist/esm/utils/zipper.js +67 -0
  217. package/dist/esm/utils/zipper.js.map +1 -0
  218. package/dist/types/bin/commands/codegen.d.ts +5 -0
  219. package/dist/types/bin/commands/codegen.d.ts.map +1 -0
  220. package/dist/types/bin/commands/dev.d.ts +5 -0
  221. package/dist/types/bin/commands/dev.d.ts.map +1 -0
  222. package/dist/types/bin/commands/list.d.ts +5 -0
  223. package/dist/types/bin/commands/list.d.ts.map +1 -0
  224. package/dist/types/bin/commands/serve.d.ts +5 -0
  225. package/dist/types/bin/commands/serve.d.ts.map +1 -0
  226. package/dist/types/bin/commands/start.d.ts +5 -0
  227. package/dist/types/bin/commands/start.d.ts.map +1 -0
  228. package/dist/{bin → types/bin}/ponder.d.ts +5 -6
  229. package/dist/types/bin/ponder.d.ts.map +1 -0
  230. package/dist/types/bin/utils/codegen.d.ts +6 -0
  231. package/dist/types/bin/utils/codegen.d.ts.map +1 -0
  232. package/dist/types/bin/utils/exit.d.ts +9 -0
  233. package/dist/types/bin/utils/exit.d.ts.map +1 -0
  234. package/dist/types/bin/utils/run.d.ts +14 -0
  235. package/dist/types/bin/utils/run.d.ts.map +1 -0
  236. package/dist/types/bin/utils/runServer.d.ts +12 -0
  237. package/dist/types/bin/utils/runServer.d.ts.map +1 -0
  238. package/dist/types/build/configAndIndexingFunctions.d.ts +37 -0
  239. package/dist/types/build/configAndIndexingFunctions.d.ts.map +1 -0
  240. package/dist/types/build/factory.d.ts +10 -0
  241. package/dist/types/build/factory.d.ts.map +1 -0
  242. package/dist/types/build/index.d.ts +70 -0
  243. package/dist/types/build/index.d.ts.map +1 -0
  244. package/dist/types/build/plugin.d.ts +4 -0
  245. package/dist/types/build/plugin.d.ts.map +1 -0
  246. package/dist/types/build/pre.d.ts +35 -0
  247. package/dist/types/build/pre.d.ts.map +1 -0
  248. package/dist/types/build/schema.d.ts +18 -0
  249. package/dist/types/build/schema.d.ts.map +1 -0
  250. package/dist/types/build/stacktrace.d.ts +13 -0
  251. package/dist/types/build/stacktrace.d.ts.map +1 -0
  252. package/dist/types/client/index.d.ts +27 -0
  253. package/dist/types/client/index.d.ts.map +1 -0
  254. package/dist/types/client/validate.d.ts +2 -0
  255. package/dist/types/client/validate.d.ts.map +1 -0
  256. package/dist/types/config/address.d.ts +14 -0
  257. package/dist/types/config/address.d.ts.map +1 -0
  258. package/dist/types/config/eventFilter.d.ts +18 -0
  259. package/dist/types/config/eventFilter.d.ts.map +1 -0
  260. package/dist/types/config/index.d.ts +143 -0
  261. package/dist/types/config/index.d.ts.map +1 -0
  262. package/dist/types/config/networks.d.ts +30 -0
  263. package/dist/types/config/networks.d.ts.map +1 -0
  264. package/dist/types/config/utilityTypes.d.ts +43 -0
  265. package/dist/types/config/utilityTypes.d.ts.map +1 -0
  266. package/dist/types/database/index.d.ts +91 -0
  267. package/dist/types/database/index.d.ts.map +1 -0
  268. package/dist/types/drizzle/bigint.d.ts +25 -0
  269. package/dist/types/drizzle/bigint.d.ts.map +1 -0
  270. package/dist/types/drizzle/hex.d.ts +25 -0
  271. package/dist/types/drizzle/hex.d.ts.map +1 -0
  272. package/dist/types/drizzle/index.d.ts +14 -0
  273. package/dist/types/drizzle/index.d.ts.map +1 -0
  274. package/dist/types/drizzle/kit/index.d.ts +49 -0
  275. package/dist/types/drizzle/kit/index.d.ts.map +1 -0
  276. package/dist/{drizzle → types/drizzle}/onchain.d.ts +49 -96
  277. package/dist/types/drizzle/onchain.d.ts.map +1 -0
  278. package/dist/types/graphql/index.d.ts +14 -0
  279. package/dist/types/graphql/index.d.ts.map +1 -0
  280. package/dist/types/graphql/json.d.ts +3 -0
  281. package/dist/types/graphql/json.d.ts.map +1 -0
  282. package/dist/types/graphql/middleware.d.ts +29 -0
  283. package/dist/types/graphql/middleware.d.ts.map +1 -0
  284. package/dist/types/index.d.ts +18 -0
  285. package/dist/types/index.d.ts.map +1 -0
  286. package/dist/types/indexing/addStackTrace.d.ts +3 -0
  287. package/dist/types/indexing/addStackTrace.d.ts.map +1 -0
  288. package/dist/types/indexing/index.d.ts +575 -0
  289. package/dist/types/indexing/index.d.ts.map +1 -0
  290. package/dist/types/indexing/ponderActions.d.ts +47 -0
  291. package/dist/types/indexing/ponderActions.d.ts.map +1 -0
  292. package/dist/types/indexing/service.d.ts +73 -0
  293. package/dist/types/indexing/service.d.ts.map +1 -0
  294. package/dist/types/indexing-store/historical.d.ts +19 -0
  295. package/dist/types/indexing-store/historical.d.ts.map +1 -0
  296. package/dist/types/indexing-store/index.d.ts +10 -0
  297. package/dist/types/indexing-store/index.d.ts.map +1 -0
  298. package/dist/types/indexing-store/metadata.d.ts +10 -0
  299. package/dist/types/indexing-store/metadata.d.ts.map +1 -0
  300. package/dist/types/indexing-store/realtime.d.ts +10 -0
  301. package/dist/types/indexing-store/realtime.d.ts.map +1 -0
  302. package/dist/types/internal/common.d.ts +13 -0
  303. package/dist/types/internal/common.d.ts.map +1 -0
  304. package/dist/types/internal/errors.d.ts +55 -0
  305. package/dist/types/internal/errors.d.ts.map +1 -0
  306. package/dist/types/internal/logger.d.ts +26 -0
  307. package/dist/types/internal/logger.d.ts.map +1 -0
  308. package/dist/types/internal/metrics.d.ts +77 -0
  309. package/dist/types/internal/metrics.d.ts.map +1 -0
  310. package/dist/types/internal/options.d.ts +59 -0
  311. package/dist/types/internal/options.d.ts.map +1 -0
  312. package/dist/types/internal/shutdown.d.ts +8 -0
  313. package/dist/types/internal/shutdown.d.ts.map +1 -0
  314. package/dist/types/internal/telemetry.d.ts +43 -0
  315. package/dist/types/internal/telemetry.d.ts.map +1 -0
  316. package/dist/types/internal/types.d.ts +328 -0
  317. package/dist/types/internal/types.d.ts.map +1 -0
  318. package/dist/types/server/error.d.ts +5 -0
  319. package/dist/types/server/error.d.ts.map +1 -0
  320. package/dist/types/server/index.d.ts +13 -0
  321. package/dist/types/server/index.d.ts.map +1 -0
  322. package/dist/types/sync/abi.d.ts +54 -0
  323. package/dist/types/sync/abi.d.ts.map +1 -0
  324. package/dist/types/sync/events.d.ts +24 -0
  325. package/dist/types/sync/events.d.ts.map +1 -0
  326. package/dist/types/sync/filter.d.ts +71 -0
  327. package/dist/types/sync/filter.d.ts.map +1 -0
  328. package/dist/types/sync/fragments.d.ts +21 -0
  329. package/dist/types/sync/fragments.d.ts.map +1 -0
  330. package/dist/types/sync/index.d.ts +112 -0
  331. package/dist/types/sync/index.d.ts.map +1 -0
  332. package/dist/types/sync/transport.d.ts +8 -0
  333. package/dist/types/sync/transport.d.ts.map +1 -0
  334. package/dist/types/sync-historical/index.d.ts +28 -0
  335. package/dist/types/sync-historical/index.d.ts.map +1 -0
  336. package/dist/types/sync-realtime/bloom.d.ts +19 -0
  337. package/dist/types/sync-realtime/bloom.d.ts.map +1 -0
  338. package/dist/types/sync-realtime/index.d.ts +48 -0
  339. package/dist/types/sync-realtime/index.d.ts.map +1 -0
  340. package/dist/types/sync-store/encoding.d.ts +151 -0
  341. package/dist/types/sync-store/encoding.d.ts.map +1 -0
  342. package/dist/types/sync-store/index.d.ts +104 -0
  343. package/dist/types/sync-store/index.d.ts.map +1 -0
  344. package/dist/types/sync-store/migrations.d.ts +13 -0
  345. package/dist/types/sync-store/migrations.d.ts.map +1 -0
  346. package/dist/types/types/db.d.ts +213 -0
  347. package/dist/types/types/db.d.ts.map +1 -0
  348. package/dist/types/types/eth.d.ts +196 -0
  349. package/dist/types/types/eth.d.ts.map +1 -0
  350. package/dist/types/types/sync.d.ts +15 -0
  351. package/dist/types/types/sync.d.ts.map +1 -0
  352. package/dist/types/types/utils.d.ts +22 -0
  353. package/dist/types/types/utils.d.ts.map +1 -0
  354. package/dist/types/types/virtual.d.ts +95 -0
  355. package/dist/types/types/virtual.d.ts.map +1 -0
  356. package/dist/types/ui/ProgressBar.d.ts +7 -0
  357. package/dist/types/ui/ProgressBar.d.ts.map +1 -0
  358. package/dist/types/ui/Table.d.ts +24 -0
  359. package/dist/types/ui/Table.d.ts.map +1 -0
  360. package/dist/types/ui/app.d.ts +14 -0
  361. package/dist/types/ui/app.d.ts.map +1 -0
  362. package/dist/types/ui/graphiql.html.d.ts +2 -0
  363. package/dist/types/ui/graphiql.html.d.ts.map +1 -0
  364. package/dist/types/ui/index.d.ts +5 -0
  365. package/dist/types/ui/index.d.ts.map +1 -0
  366. package/dist/types/utils/bigint.d.ts +15 -0
  367. package/dist/types/utils/bigint.d.ts.map +1 -0
  368. package/dist/types/utils/chains.d.ts +3 -0
  369. package/dist/types/utils/chains.d.ts.map +1 -0
  370. package/dist/types/utils/checkpoint.d.ts +40 -0
  371. package/dist/types/utils/checkpoint.d.ts.map +1 -0
  372. package/dist/types/utils/chunk.d.ts +2 -0
  373. package/dist/types/utils/chunk.d.ts.map +1 -0
  374. package/dist/types/utils/date.d.ts +7 -0
  375. package/dist/types/utils/date.d.ts.map +1 -0
  376. package/dist/types/utils/debug.d.ts +105 -0
  377. package/dist/types/utils/debug.d.ts.map +1 -0
  378. package/dist/types/utils/dedupe.d.ts +20 -0
  379. package/dist/types/utils/dedupe.d.ts.map +1 -0
  380. package/dist/types/utils/duplicates.d.ts +7 -0
  381. package/dist/types/utils/duplicates.d.ts.map +1 -0
  382. package/dist/types/utils/estimate.d.ts +11 -0
  383. package/dist/types/utils/estimate.d.ts.map +1 -0
  384. package/dist/types/utils/extend.d.ts +13 -0
  385. package/dist/types/utils/extend.d.ts.map +1 -0
  386. package/dist/types/utils/format.d.ts +3 -0
  387. package/dist/types/utils/format.d.ts.map +1 -0
  388. package/dist/types/utils/generators.d.ts +23 -0
  389. package/dist/types/utils/generators.d.ts.map +1 -0
  390. package/dist/types/utils/hash.d.ts +11 -0
  391. package/dist/types/utils/hash.d.ts.map +1 -0
  392. package/dist/types/utils/interval.d.ts +53 -0
  393. package/dist/types/utils/interval.d.ts.map +1 -0
  394. package/dist/types/utils/lowercase.d.ts +5 -0
  395. package/dist/types/utils/lowercase.d.ts.map +1 -0
  396. package/dist/types/utils/mutex.d.ts +8 -0
  397. package/dist/types/utils/mutex.d.ts.map +1 -0
  398. package/dist/types/utils/never.d.ts +2 -0
  399. package/dist/types/utils/never.d.ts.map +1 -0
  400. package/dist/types/utils/offset.d.ts +3 -0
  401. package/dist/types/utils/offset.d.ts.map +1 -0
  402. package/dist/types/utils/order.d.ts +2 -0
  403. package/dist/types/utils/order.d.ts.map +1 -0
  404. package/dist/types/utils/partition.d.ts +22 -0
  405. package/dist/types/utils/partition.d.ts.map +1 -0
  406. package/dist/types/utils/pg.d.ts +5 -0
  407. package/dist/types/utils/pg.d.ts.map +1 -0
  408. package/dist/types/utils/pglite.d.ts +25 -0
  409. package/dist/types/utils/pglite.d.ts.map +1 -0
  410. package/dist/types/utils/port.d.ts +5 -0
  411. package/dist/types/utils/port.d.ts.map +1 -0
  412. package/dist/types/utils/print.d.ts +2 -0
  413. package/dist/types/utils/print.d.ts.map +1 -0
  414. package/dist/types/utils/promiseWithResolvers.d.ts +10 -0
  415. package/dist/types/utils/promiseWithResolvers.d.ts.map +1 -0
  416. package/dist/types/utils/queue.d.ts +33 -0
  417. package/dist/types/utils/queue.d.ts.map +1 -0
  418. package/dist/types/utils/range.d.ts +8 -0
  419. package/dist/types/utils/range.d.ts.map +1 -0
  420. package/dist/types/utils/requestQueue.d.ts +21 -0
  421. package/dist/types/utils/requestQueue.d.ts.map +1 -0
  422. package/dist/types/utils/result.d.ts +17 -0
  423. package/dist/types/utils/result.d.ts.map +1 -0
  424. package/dist/types/utils/rpc.d.ts +57 -0
  425. package/dist/types/utils/rpc.d.ts.map +1 -0
  426. package/dist/types/utils/serialize.d.ts +19 -0
  427. package/dist/types/utils/serialize.d.ts.map +1 -0
  428. package/dist/types/utils/timer.d.ts +11 -0
  429. package/dist/types/utils/timer.d.ts.map +1 -0
  430. package/dist/types/utils/wait.d.ts +6 -0
  431. package/dist/types/utils/wait.d.ts.map +1 -0
  432. package/dist/types/utils/zipper.d.ts +36 -0
  433. package/dist/types/utils/zipper.d.ts.map +1 -0
  434. package/package.json +17 -21
  435. package/src/bin/commands/dev.ts +1 -1
  436. package/src/bin/ponder.ts +1 -1
  437. package/src/bin/utils/run.ts +7 -18
  438. package/src/build/configAndIndexingFunctions.ts +1 -1
  439. package/src/build/factory.ts +1 -1
  440. package/src/build/index.ts +0 -2
  441. package/src/client/index.ts +1 -1
  442. package/src/graphql/index.ts +1 -1
  443. package/src/indexing-store/historical.ts +1 -1
  444. package/src/indexing-store/realtime.ts +1 -1
  445. package/src/internal/telemetry.ts +1 -1
  446. package/src/sync/fragments.ts +1 -1
  447. package/src/sync/index.ts +60 -20
  448. package/src/sync-historical/index.ts +26 -26
  449. package/src/sync-realtime/index.ts +1 -1
  450. package/src/utils/dedupe.ts +40 -0
  451. package/src/utils/generators.ts +1 -1
  452. package/src/utils/mutex.ts +1 -1
  453. package/src/utils/promiseWithResolvers.ts +20 -0
  454. package/src/utils/queue.ts +250 -0
  455. package/src/utils/requestQueue.ts +1 -1
  456. package/dist/bin/ponder.js +0 -11243
  457. package/dist/bin/ponder.js.map +0 -1
  458. package/dist/chunk-6AOFLZJ4.js +0 -1692
  459. package/dist/chunk-6AOFLZJ4.js.map +0 -1
  460. package/dist/chunk-DZFRP3KH.js +0 -70
  461. package/dist/chunk-DZFRP3KH.js.map +0 -1
  462. package/dist/chunk-K2TLRLX3.js +0 -163
  463. package/dist/chunk-K2TLRLX3.js.map +0 -1
  464. package/dist/chunk-MJKRYIBO.js +0 -190
  465. package/dist/chunk-MJKRYIBO.js.map +0 -1
  466. package/dist/db-in86nyw7.d.ts +0 -625
  467. package/dist/drizzle/onchain.js +0 -19
  468. package/dist/drizzle/onchain.js.map +0 -1
  469. package/dist/experimental_unsafe_stores.d.ts +0 -375
  470. package/dist/experimental_unsafe_stores.js +0 -11
  471. package/dist/experimental_unsafe_stores.js.map +0 -1
  472. package/dist/index.d.ts +0 -404
  473. package/dist/index.js +0 -2219
  474. package/dist/index.js.map +0 -1
  475. package/dist/utils-ceNucOJb.d.ts +0 -14
  476. package/src/experimental_unsafe_stores.ts +0 -4
@@ -0,0 +1,914 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { getPrimaryKeyColumns, getTableNames } from '../drizzle/index.js';
3
+ import { getColumnCasing } from '../drizzle/kit/index.js';
4
+ import { NonRetryableError, ShutdownError } from '../internal/errors.js';
5
+ import { moveLegacyTables, migrationProvider as postgresMigrationProvider, } from '../sync-store/migrations.js';
6
+ import { MAX_CHECKPOINT_STRING, ZERO_CHECKPOINT_STRING, decodeCheckpoint, } from '../utils/checkpoint.js';
7
+ import { formatEta } from '../utils/format.js';
8
+ import { createPool, createReadonlyPool } from '../utils/pg.js';
9
+ import { createPglite, createPgliteKyselyDialect } from '../utils/pglite.js';
10
+ import { startClock } from '../utils/timer.js';
11
+ import { wait } from '../utils/wait.js';
12
+ import { getTableColumns } from "drizzle-orm";
13
+ import { drizzle as drizzleNodePg } from "drizzle-orm/node-postgres";
14
+ import { drizzle as drizzlePglite } from "drizzle-orm/pglite";
15
+ import { Kysely, Migrator, PostgresDialect, WithSchemaPlugin, sql, } from "kysely";
16
+ import prometheus from "prom-client";
17
+ const VERSION = "1";
18
+ export const createDatabase = async ({ common, namespace, preBuild, schemaBuild, }) => {
19
+ let heartbeatInterval;
20
+ ////////
21
+ // Create schema, drivers, roles, and query builders
22
+ ////////
23
+ let driver;
24
+ let qb;
25
+ const dialect = preBuild.databaseConfig.kind;
26
+ common.logger.info({
27
+ service: "database",
28
+ msg: `Using database schema '${namespace}'`,
29
+ });
30
+ if (dialect === "pglite" || dialect === "pglite_test") {
31
+ driver = {
32
+ instance: dialect === "pglite"
33
+ ? createPglite(preBuild.databaseConfig.options)
34
+ : preBuild.databaseConfig.instance,
35
+ };
36
+ common.shutdown.add(async () => {
37
+ clearInterval(heartbeatInterval);
38
+ await qb.internal
39
+ .updateTable("_ponder_meta")
40
+ .where("key", "=", "app")
41
+ .set({
42
+ value: sql `jsonb_set(value, '{is_locked}', to_jsonb(0))`,
43
+ })
44
+ .execute();
45
+ if (dialect === "pglite") {
46
+ await driver.instance.close();
47
+ }
48
+ });
49
+ const kyselyDialect = createPgliteKyselyDialect(driver.instance);
50
+ await driver.instance.query(`CREATE SCHEMA IF NOT EXISTS "${namespace}"`);
51
+ await driver.instance.query(`SET search_path TO "${namespace}"`);
52
+ qb = {
53
+ internal: new Kysely({
54
+ dialect: kyselyDialect,
55
+ log(event) {
56
+ if (event.level === "query") {
57
+ common.metrics.ponder_postgres_query_total.inc({
58
+ pool: "internal",
59
+ });
60
+ }
61
+ },
62
+ plugins: [new WithSchemaPlugin(namespace)],
63
+ }),
64
+ user: new Kysely({
65
+ dialect: kyselyDialect,
66
+ log(event) {
67
+ if (event.level === "query") {
68
+ common.metrics.ponder_postgres_query_total.inc({
69
+ pool: "user",
70
+ });
71
+ }
72
+ },
73
+ plugins: [new WithSchemaPlugin(namespace)],
74
+ }),
75
+ sync: new Kysely({
76
+ dialect: kyselyDialect,
77
+ log(event) {
78
+ if (event.level === "query") {
79
+ common.metrics.ponder_postgres_query_total.inc({
80
+ pool: "sync",
81
+ });
82
+ }
83
+ },
84
+ plugins: [new WithSchemaPlugin("ponder_sync")],
85
+ }),
86
+ drizzle: drizzlePglite(driver.instance, {
87
+ casing: "snake_case",
88
+ schema: schemaBuild.schema,
89
+ }),
90
+ drizzleReadonly: drizzlePglite(driver.instance, {
91
+ casing: "snake_case",
92
+ schema: schemaBuild.schema,
93
+ }),
94
+ };
95
+ }
96
+ else {
97
+ const internalMax = 2;
98
+ const equalMax = Math.floor((preBuild.databaseConfig.poolConfig.max - internalMax) / 3);
99
+ const [readonlyMax, userMax, syncMax] = common.options.command === "serve"
100
+ ? [preBuild.databaseConfig.poolConfig.max - internalMax, 0, 0]
101
+ : [equalMax, equalMax, equalMax];
102
+ driver = {
103
+ internal: createPool({
104
+ ...preBuild.databaseConfig.poolConfig,
105
+ application_name: `${namespace}_internal`,
106
+ max: internalMax,
107
+ statement_timeout: 10 * 60 * 1000, // 10 minutes to accommodate slow sync store migrations.
108
+ }, common.logger),
109
+ user: createPool({
110
+ ...preBuild.databaseConfig.poolConfig,
111
+ application_name: `${namespace}_user`,
112
+ max: userMax,
113
+ }, common.logger),
114
+ readonly: createReadonlyPool({
115
+ ...preBuild.databaseConfig.poolConfig,
116
+ application_name: `${namespace}_readonly`,
117
+ max: readonlyMax,
118
+ }, common.logger, namespace),
119
+ sync: createPool({
120
+ ...preBuild.databaseConfig.poolConfig,
121
+ application_name: "ponder_sync",
122
+ max: syncMax,
123
+ }, common.logger),
124
+ listen: undefined,
125
+ };
126
+ common.shutdown.add(async () => {
127
+ clearInterval(heartbeatInterval);
128
+ await qb.internal
129
+ .updateTable("_ponder_meta")
130
+ .where("key", "=", "app")
131
+ .set({
132
+ value: sql `jsonb_set(value, '{is_locked}', to_jsonb(0))`,
133
+ })
134
+ .execute();
135
+ const d = driver;
136
+ d.listen?.release();
137
+ await Promise.all([
138
+ d.internal.end(),
139
+ d.user.end(),
140
+ d.readonly.end(),
141
+ d.sync.end(),
142
+ ]);
143
+ });
144
+ await driver.internal.query(`CREATE SCHEMA IF NOT EXISTS "${namespace}"`);
145
+ qb = {
146
+ internal: new Kysely({
147
+ dialect: new PostgresDialect({ pool: driver.internal }),
148
+ log(event) {
149
+ if (event.level === "query") {
150
+ common.metrics.ponder_postgres_query_total.inc({
151
+ pool: "internal",
152
+ });
153
+ }
154
+ },
155
+ plugins: [new WithSchemaPlugin(namespace)],
156
+ }),
157
+ user: new Kysely({
158
+ dialect: new PostgresDialect({ pool: driver.user }),
159
+ log(event) {
160
+ if (event.level === "query") {
161
+ common.metrics.ponder_postgres_query_total.inc({
162
+ pool: "user",
163
+ });
164
+ }
165
+ },
166
+ plugins: [new WithSchemaPlugin(namespace)],
167
+ }),
168
+ sync: new Kysely({
169
+ dialect: new PostgresDialect({ pool: driver.sync }),
170
+ log(event) {
171
+ if (event.level === "query") {
172
+ common.metrics.ponder_postgres_query_total.inc({
173
+ pool: "sync",
174
+ });
175
+ }
176
+ },
177
+ plugins: [new WithSchemaPlugin("ponder_sync")],
178
+ }),
179
+ drizzle: drizzleNodePg(driver.user, {
180
+ casing: "snake_case",
181
+ schema: schemaBuild.schema,
182
+ }),
183
+ drizzleReadonly: drizzleNodePg(driver.readonly, {
184
+ casing: "snake_case",
185
+ schema: schemaBuild.schema,
186
+ }),
187
+ };
188
+ // Register Postgres-only metrics
189
+ const d = driver;
190
+ common.metrics.registry.removeSingleMetric("ponder_postgres_pool_connections");
191
+ common.metrics.ponder_postgres_pool_connections = new prometheus.Gauge({
192
+ name: "ponder_postgres_pool_connections",
193
+ help: "Number of connections in the pool",
194
+ labelNames: ["pool", "kind"],
195
+ registers: [common.metrics.registry],
196
+ collect() {
197
+ this.set({ pool: "internal", kind: "idle" }, d.internal.idleCount);
198
+ this.set({ pool: "internal", kind: "total" }, d.internal.totalCount);
199
+ this.set({ pool: "sync", kind: "idle" }, d.sync.idleCount);
200
+ this.set({ pool: "sync", kind: "total" }, d.sync.totalCount);
201
+ this.set({ pool: "user", kind: "idle" }, d.user.idleCount);
202
+ this.set({ pool: "user", kind: "total" }, d.user.totalCount);
203
+ this.set({ pool: "readonly", kind: "idle" }, d.readonly.idleCount);
204
+ this.set({ pool: "readonly", kind: "total" }, d.readonly.totalCount);
205
+ },
206
+ });
207
+ common.metrics.registry.removeSingleMetric("ponder_postgres_query_queue_size");
208
+ common.metrics.ponder_postgres_query_queue_size = new prometheus.Gauge({
209
+ name: "ponder_postgres_query_queue_size",
210
+ help: "Number of queries waiting for an available connection",
211
+ labelNames: ["pool"],
212
+ registers: [common.metrics.registry],
213
+ collect() {
214
+ this.set({ pool: "internal" }, d.internal.waitingCount);
215
+ this.set({ pool: "sync" }, d.sync.waitingCount);
216
+ this.set({ pool: "user" }, d.user.waitingCount);
217
+ this.set({ pool: "readonly" }, d.readonly.waitingCount);
218
+ },
219
+ });
220
+ }
221
+ ////////
222
+ // Helpers
223
+ ////////
224
+ /** Undo operations in user tables by using the "reorg" tables. */
225
+ const revert = async ({ tx, tableName, checkpoint, }) => {
226
+ const primaryKeyColumns = getPrimaryKeyColumns(schemaBuild.schema[tableName.js]);
227
+ const rows = await tx
228
+ .deleteFrom(tableName.reorg)
229
+ .returningAll()
230
+ .where("checkpoint", ">", checkpoint)
231
+ .execute();
232
+ const reversed = rows.sort((a, b) => b.operation_id - a.operation_id);
233
+ // undo operation
234
+ for (const log of reversed) {
235
+ if (log.operation === 0) {
236
+ // Create
237
+ await tx
238
+ // @ts-ignore
239
+ .deleteFrom(tableName.sql)
240
+ .$call((qb) => {
241
+ for (const { sql } of primaryKeyColumns) {
242
+ // @ts-ignore
243
+ qb = qb.where(sql, "=", log[sql]);
244
+ }
245
+ return qb;
246
+ })
247
+ .execute();
248
+ }
249
+ else if (log.operation === 1) {
250
+ // Update
251
+ // @ts-ignore
252
+ log.operation_id = undefined;
253
+ // @ts-ignore
254
+ log.checkpoint = undefined;
255
+ // @ts-ignore
256
+ log.operation = undefined;
257
+ await tx
258
+ // @ts-ignore
259
+ .updateTable(tableName.sql)
260
+ .set(log)
261
+ .$call((qb) => {
262
+ for (const { sql } of primaryKeyColumns) {
263
+ // @ts-ignore
264
+ qb = qb.where(sql, "=", log[sql]);
265
+ }
266
+ return qb;
267
+ })
268
+ .execute();
269
+ }
270
+ else {
271
+ // Delete
272
+ // @ts-ignore
273
+ log.operation_id = undefined;
274
+ // @ts-ignore
275
+ log.checkpoint = undefined;
276
+ // @ts-ignore
277
+ log.operation = undefined;
278
+ await tx
279
+ // @ts-ignore
280
+ .insertInto(tableName.sql)
281
+ .values(log)
282
+ // @ts-ignore
283
+ .onConflict((oc) => oc
284
+ .columns(primaryKeyColumns.map(({ sql }) => sql))
285
+ .doNothing())
286
+ .execute();
287
+ }
288
+ }
289
+ common.logger.info({
290
+ service: "database",
291
+ msg: `Reverted ${rows.length} unfinalized operations from '${tableName.sql}' table`,
292
+ });
293
+ };
294
+ /** 'true' if `migrate` created new tables. */
295
+ let createdTables;
296
+ const database = {
297
+ driver,
298
+ qb,
299
+ // @ts-ignore
300
+ async wrap(options, fn) {
301
+ const RETRY_COUNT = 9;
302
+ const BASE_DURATION = 125;
303
+ // First error thrown is often the most useful
304
+ let firstError;
305
+ let hasError = false;
306
+ for (let i = 0; i <= RETRY_COUNT; i++) {
307
+ const endClock = startClock();
308
+ const id = randomUUID().slice(0, 8);
309
+ if (options.includeTraceLogs) {
310
+ common.logger.trace({
311
+ service: "database",
312
+ msg: `Started '${options.method}' database method (id=${id})`,
313
+ });
314
+ }
315
+ try {
316
+ if (common.shutdown.isKilled) {
317
+ throw new ShutdownError();
318
+ }
319
+ const result = await fn();
320
+ common.metrics.ponder_database_method_duration.observe({ method: options.method }, endClock());
321
+ if (common.shutdown.isKilled) {
322
+ throw new ShutdownError();
323
+ }
324
+ return result;
325
+ }
326
+ catch (_error) {
327
+ const error = _error;
328
+ if (common.shutdown.isKilled) {
329
+ throw new ShutdownError();
330
+ }
331
+ common.metrics.ponder_database_method_duration.observe({ method: options.method }, endClock());
332
+ common.metrics.ponder_database_method_error_total.inc({
333
+ method: options.method,
334
+ });
335
+ if (!hasError) {
336
+ hasError = true;
337
+ firstError = error;
338
+ }
339
+ if (error instanceof NonRetryableError) {
340
+ common.logger.warn({
341
+ service: "database",
342
+ msg: `Failed '${options.method}' database method (id=${id})`,
343
+ error,
344
+ });
345
+ throw error;
346
+ }
347
+ if (i === RETRY_COUNT) {
348
+ common.logger.warn({
349
+ service: "database",
350
+ msg: `Failed '${options.method}' database method after '${i + 1}' attempts (id=${id})`,
351
+ error,
352
+ });
353
+ throw firstError;
354
+ }
355
+ const duration = BASE_DURATION * 2 ** i;
356
+ common.logger.debug({
357
+ service: "database",
358
+ msg: `Failed '${options.method}' database method, retrying after ${duration} milliseconds (id=${id})`,
359
+ error,
360
+ });
361
+ await wait(duration);
362
+ }
363
+ finally {
364
+ if (options.includeTraceLogs) {
365
+ common.logger.trace({
366
+ service: "database",
367
+ msg: `Completed '${options.method}' database method in ${Math.round(endClock())}ms (id=${id})`,
368
+ });
369
+ }
370
+ }
371
+ }
372
+ },
373
+ async migrateSync() {
374
+ await this.wrap({ method: "migrateSyncStore", includeTraceLogs: true }, async () => {
375
+ // TODO: Probably remove this at 1.0 to speed up startup time.
376
+ await moveLegacyTables({
377
+ common: common,
378
+ db: qb.internal,
379
+ newSchemaName: "ponder_sync",
380
+ });
381
+ const migrator = new Migrator({
382
+ db: qb.sync,
383
+ provider: postgresMigrationProvider,
384
+ migrationTableSchema: "ponder_sync",
385
+ });
386
+ const { error } = await migrator.migrateToLatest();
387
+ if (error)
388
+ throw error;
389
+ });
390
+ },
391
+ async migrate({ buildId }) {
392
+ ////////
393
+ // Migrate
394
+ ////////
395
+ // v0.4 migration
396
+ // v0.6 migration
397
+ const hasPonderSchema = await qb.internal
398
+ // @ts-ignore
399
+ .selectFrom("information_schema.schemata")
400
+ // @ts-ignore
401
+ .select("schema_name")
402
+ // @ts-ignore
403
+ .where("schema_name", "=", "ponder")
404
+ .executeTakeFirst()
405
+ .then((schema) => schema?.schema_name === "ponder");
406
+ if (hasPonderSchema) {
407
+ const hasNamespaceLockTable = await qb.internal
408
+ // @ts-ignore
409
+ .selectFrom("information_schema.tables")
410
+ // @ts-ignore
411
+ .select(["table_name", "table_schema"])
412
+ // @ts-ignore
413
+ .where("table_name", "=", "namespace_lock")
414
+ // @ts-ignore
415
+ .where("table_schema", "=", "ponder")
416
+ .executeTakeFirst()
417
+ .then((table) => table !== undefined);
418
+ if (hasNamespaceLockTable) {
419
+ await this.wrap({ method: "migrate", includeTraceLogs: true }, async () => {
420
+ const namespaceCount = await qb.internal
421
+ .withSchema("ponder")
422
+ // @ts-ignore
423
+ .selectFrom("namespace_lock")
424
+ .select(sql `count(*)`.as("count"))
425
+ .executeTakeFirst();
426
+ const tableNames = await qb.internal
427
+ .withSchema("ponder")
428
+ // @ts-ignore
429
+ .selectFrom("namespace_lock")
430
+ // @ts-ignore
431
+ .select("schema")
432
+ // @ts-ignore
433
+ .where("namespace", "=", preBuild.namespace)
434
+ .executeTakeFirst()
435
+ .then((schema) => schema === undefined
436
+ ? undefined
437
+ : Object.keys(schema.schema.tables));
438
+ if (tableNames) {
439
+ for (const tableName of tableNames) {
440
+ await qb.internal.schema
441
+ .dropTable(tableName)
442
+ .ifExists()
443
+ .cascade()
444
+ .execute();
445
+ }
446
+ await qb.internal
447
+ .withSchema("ponder")
448
+ // @ts-ignore
449
+ .deleteFrom("namespace_lock")
450
+ // @ts-ignore
451
+ .where("namespace", "=", preBuild.namespace)
452
+ .execute();
453
+ if (namespaceCount.count === 1) {
454
+ await qb.internal.schema
455
+ .dropSchema("ponder")
456
+ .cascade()
457
+ .execute();
458
+ common.logger.debug({
459
+ service: "database",
460
+ msg: `Removed 'ponder' schema`,
461
+ });
462
+ }
463
+ }
464
+ });
465
+ }
466
+ }
467
+ // v0.8 migration
468
+ // If the schema previously ran with a 0.7 app, remove
469
+ // all unlocked "dev" apps. Then, copy a _ponder_meta entry
470
+ // to the new format if there is one remaining.
471
+ const hasPonderMetaTable = await qb.internal
472
+ // @ts-ignore
473
+ .selectFrom("information_schema.tables")
474
+ // @ts-ignore
475
+ .select(["table_name", "table_schema"])
476
+ // @ts-ignore
477
+ .where("table_name", "=", "_ponder_meta")
478
+ // @ts-ignore
479
+ .where("table_schema", "=", namespace)
480
+ .executeTakeFirst()
481
+ .then((table) => table !== undefined);
482
+ if (hasPonderMetaTable) {
483
+ await this.wrap({ method: "migrate", includeTraceLogs: true }, () => qb.internal.transaction().execute(async (tx) => {
484
+ const previousApps = await tx
485
+ .selectFrom("_ponder_meta")
486
+ // @ts-ignore
487
+ .where("key", "like", "app_%")
488
+ .select("value")
489
+ .execute()
490
+ .then((rows) => rows.map(({ value }) => value));
491
+ if (previousApps.some((app) => app.is_locked === 1 &&
492
+ app.heartbeat_at + common.options.databaseHeartbeatTimeout >
493
+ Date.now())) {
494
+ throw new NonRetryableError(`Migration failed: Schema '${namespace}' has an active app`);
495
+ }
496
+ for (const app of previousApps) {
497
+ for (const table of app.table_names) {
498
+ await tx.schema
499
+ // @ts-ignore
500
+ .dropTable(`${app.instance_id}__${table}`)
501
+ .cascade()
502
+ .ifExists()
503
+ .execute();
504
+ await tx.schema
505
+ // @ts-ignore
506
+ .dropTable(`${app.instance_id}_reorg__${table}`)
507
+ .cascade()
508
+ .ifExists()
509
+ .execute();
510
+ }
511
+ await tx
512
+ .deleteFrom("_ponder_meta")
513
+ // @ts-ignore
514
+ .where("key", "=", `status_${app.instance_id}`)
515
+ .execute();
516
+ await tx
517
+ .deleteFrom("_ponder_meta")
518
+ // @ts-ignore
519
+ .where("key", "=", `app_${app.instance_id}`)
520
+ .execute();
521
+ }
522
+ if (previousApps.length > 0) {
523
+ common.logger.debug({
524
+ service: "database",
525
+ msg: "Migrated previous app to v0.8",
526
+ });
527
+ }
528
+ }));
529
+ }
530
+ // 0.9 migration
531
+ if (hasPonderMetaTable) {
532
+ await qb.internal
533
+ .deleteFrom("_ponder_meta")
534
+ // @ts-ignore
535
+ .where("key", "=", "status")
536
+ .execute();
537
+ const version = await qb.internal
538
+ .selectFrom("_ponder_meta")
539
+ .select("value")
540
+ .where("key", "=", "app")
541
+ .executeTakeFirst()
542
+ .then((row) => row?.value.version);
543
+ if (version === undefined || Number(version) < Number(VERSION)) {
544
+ await qb.internal.schema
545
+ .dropTable("_ponder_status")
546
+ .ifExists()
547
+ .cascade()
548
+ .execute();
549
+ }
550
+ }
551
+ await this.wrap({ method: "migrate", includeTraceLogs: true }, async () => {
552
+ await qb.internal.schema
553
+ .createTable("_ponder_meta")
554
+ .addColumn("key", "text", (col) => col.primaryKey())
555
+ .addColumn("value", "jsonb")
556
+ .ifNotExists()
557
+ .execute();
558
+ await qb.internal.schema
559
+ .createTable("_ponder_status")
560
+ .addColumn("network_name", "text", (col) => col.primaryKey())
561
+ .addColumn("block_number", "bigint")
562
+ .addColumn("block_timestamp", "bigint")
563
+ .addColumn("ready", "boolean", (col) => col.notNull())
564
+ .ifNotExists()
565
+ .execute();
566
+ const trigger = "status_trigger";
567
+ const notification = "status_notify()";
568
+ const channel = `${namespace}_status_channel`;
569
+ await sql
570
+ .raw(`
571
+ CREATE OR REPLACE FUNCTION "${namespace}".${notification}
572
+ RETURNS TRIGGER
573
+ LANGUAGE plpgsql
574
+ AS $$
575
+ BEGIN
576
+ NOTIFY "${channel}";
577
+ RETURN NULL;
578
+ END;
579
+ $$;`)
580
+ .execute(qb.internal);
581
+ await sql
582
+ .raw(`
583
+ CREATE OR REPLACE TRIGGER "${trigger}"
584
+ AFTER INSERT OR UPDATE OR DELETE
585
+ ON "${namespace}"._ponder_status
586
+ FOR EACH STATEMENT
587
+ EXECUTE PROCEDURE "${namespace}".${notification};`)
588
+ .execute(qb.internal);
589
+ });
590
+ const attempt = () => this.wrap({ method: "migrate", includeTraceLogs: true }, () => qb.internal.transaction().execute(async (tx) => {
591
+ const createTables = async () => {
592
+ for (let i = 0; i < schemaBuild.statements.tables.sql.length; i++) {
593
+ await sql
594
+ .raw(schemaBuild.statements.tables.sql[i])
595
+ .execute(tx)
596
+ .catch((_error) => {
597
+ const error = _error;
598
+ if (!error.message.includes("already exists"))
599
+ throw error;
600
+ const e = new NonRetryableError(`Unable to create table '${namespace}'.'${schemaBuild.statements.tables.json[i].tableName}' because a table with that name already exists.`);
601
+ e.stack = undefined;
602
+ throw e;
603
+ });
604
+ }
605
+ };
606
+ const createEnums = async () => {
607
+ for (let i = 0; i < schemaBuild.statements.enums.sql.length; i++) {
608
+ await sql
609
+ .raw(schemaBuild.statements.enums.sql[i])
610
+ .execute(tx)
611
+ .catch((_error) => {
612
+ const error = _error;
613
+ if (!error.message.includes("already exists"))
614
+ throw error;
615
+ const e = new NonRetryableError(`Unable to create enum '${namespace}'.'${schemaBuild.statements.enums.json[i].name}' because an enum with that name already exists.`);
616
+ e.stack = undefined;
617
+ throw e;
618
+ });
619
+ }
620
+ };
621
+ const previousApp = await tx
622
+ .selectFrom("_ponder_meta")
623
+ .where("key", "=", "app")
624
+ .select("value")
625
+ .executeTakeFirst()
626
+ .then((row) => row?.value);
627
+ createdTables = false;
628
+ if (previousApp === undefined) {
629
+ await createEnums();
630
+ await createTables();
631
+ createdTables = true;
632
+ }
633
+ else if (previousApp.is_dev === 1 ||
634
+ (process.env.PONDER_EXPERIMENTAL_DB === "platform" &&
635
+ previousApp.build_id !== buildId) ||
636
+ (process.env.PONDER_EXPERIMENTAL_DB === "platform" &&
637
+ previousApp.checkpoint === ZERO_CHECKPOINT_STRING)) {
638
+ for (const tableName of getTableNames(schemaBuild.schema)) {
639
+ await tx.schema
640
+ .dropTable(tableName.sql)
641
+ .cascade()
642
+ .ifExists()
643
+ .execute();
644
+ await tx.schema
645
+ .dropTable(tableName.reorg)
646
+ .cascade()
647
+ .ifExists()
648
+ .execute();
649
+ }
650
+ for (const enumName of schemaBuild.statements.enums.json) {
651
+ await tx.schema.dropType(enumName.name).ifExists().execute();
652
+ }
653
+ await sql
654
+ .raw(`TRUNCATE TABLE "${namespace}"."_ponder_status" CASCADE`)
655
+ .execute(tx);
656
+ await createEnums();
657
+ await createTables();
658
+ createdTables = true;
659
+ }
660
+ if (createdTables) {
661
+ common.logger.info({
662
+ service: "database",
663
+ msg: `Created tables [${getTableNames(schemaBuild.schema)
664
+ .map(({ sql }) => sql)
665
+ .join(", ")}]`,
666
+ });
667
+ // write metadata
668
+ const newApp = {
669
+ is_locked: 1,
670
+ is_dev: common.options.command === "dev" ? 1 : 0,
671
+ heartbeat_at: Date.now(),
672
+ build_id: buildId,
673
+ checkpoint: ZERO_CHECKPOINT_STRING,
674
+ table_names: getTableNames(schemaBuild.schema).map(({ sql }) => sql),
675
+ version: VERSION,
676
+ };
677
+ await tx
678
+ .insertInto("_ponder_meta")
679
+ .values({ key: "app", value: newApp })
680
+ .onConflict((oc) => oc
681
+ .column("key")
682
+ // @ts-ignore
683
+ .doUpdateSet({ value: newApp }))
684
+ .execute();
685
+ }
686
+ else {
687
+ // schema one of: crash recovery, locked, error
688
+ if (common.options.command === "dev" ||
689
+ previousApp.build_id !== buildId) {
690
+ const error = new NonRetryableError(`Schema '${namespace}' was previously used by a different Ponder app. Drop the schema first, or use a different schema. Read more: https://ponder.sh/docs/getting-started/database#database-schema`);
691
+ error.stack = undefined;
692
+ throw error;
693
+ }
694
+ // locked
695
+ const isAppUnlocked = previousApp.is_locked === 0 ||
696
+ previousApp.heartbeat_at +
697
+ common.options.databaseHeartbeatTimeout <=
698
+ Date.now();
699
+ if (isAppUnlocked === false) {
700
+ return {
701
+ status: "locked",
702
+ expiry: previousApp.heartbeat_at +
703
+ common.options.databaseHeartbeatTimeout,
704
+ };
705
+ }
706
+ // crash recovery
707
+ common.logger.info({
708
+ service: "database",
709
+ msg: `Detected crash recovery for build '${buildId}' in schema '${namespace}' last active ${formatEta(Date.now() - previousApp.heartbeat_at)} ago`,
710
+ });
711
+ }
712
+ await tx
713
+ .updateTable("_ponder_status")
714
+ .set({ block_number: null, block_timestamp: null, ready: false })
715
+ .execute();
716
+ return { status: "success" };
717
+ }));
718
+ let result = await attempt();
719
+ if (result.status === "locked") {
720
+ const duration = result.expiry - Date.now();
721
+ common.logger.warn({
722
+ service: "database",
723
+ msg: `Schema '${namespace}' is locked by a different Ponder app`,
724
+ });
725
+ common.logger.warn({
726
+ service: "database",
727
+ msg: `Waiting ${formatEta(duration)} for lock on schema '${namespace} to expire...`,
728
+ });
729
+ await wait(duration);
730
+ result = await attempt();
731
+ if (result.status === "locked") {
732
+ const error = new NonRetryableError(`Failed to acquire lock on schema '${namespace}'. A different Ponder app is actively using this schema.`);
733
+ error.stack = undefined;
734
+ throw error;
735
+ }
736
+ }
737
+ heartbeatInterval = setInterval(async () => {
738
+ try {
739
+ const heartbeat = Date.now();
740
+ await qb.internal
741
+ .updateTable("_ponder_meta")
742
+ .where("key", "=", "app")
743
+ .set({
744
+ value: sql `jsonb_set(value, '{heartbeat_at}', ${heartbeat})`,
745
+ })
746
+ .execute();
747
+ common.logger.trace({
748
+ service: "database",
749
+ msg: `Updated heartbeat timestamp to ${heartbeat} (build_id=${buildId})`,
750
+ });
751
+ }
752
+ catch (err) {
753
+ const error = err;
754
+ common.logger.error({
755
+ service: "database",
756
+ msg: `Failed to update heartbeat timestamp, retrying in ${formatEta(common.options.databaseHeartbeatInterval)}`,
757
+ error,
758
+ });
759
+ }
760
+ }, common.options.databaseHeartbeatInterval);
761
+ },
762
+ async recoverCheckpoint() {
763
+ // new tables are empty
764
+ if (createdTables)
765
+ return ZERO_CHECKPOINT_STRING;
766
+ return this.wrap({ method: "recoverCheckpoint", includeTraceLogs: true }, () => qb.internal.transaction().execute(async (tx) => {
767
+ const app = await tx
768
+ .selectFrom("_ponder_meta")
769
+ .where("key", "=", "app")
770
+ .select("value")
771
+ .executeTakeFirstOrThrow()
772
+ .then((row) => row.value);
773
+ if (app.checkpoint === ZERO_CHECKPOINT_STRING) {
774
+ for (const tableName of getTableNames(schemaBuild.schema)) {
775
+ await sql
776
+ .raw(`TRUNCATE TABLE "${namespace}"."${tableName.sql}", "${namespace}"."${tableName.reorg}" CASCADE`)
777
+ .execute(tx);
778
+ }
779
+ }
780
+ else {
781
+ // Update metadata
782
+ app.is_locked = 1;
783
+ app.is_dev = common.options.command === "dev" ? 1 : 0;
784
+ await tx
785
+ .updateTable("_ponder_meta")
786
+ .set({ value: app })
787
+ .where("key", "=", "app")
788
+ .execute();
789
+ // Remove triggers
790
+ for (const tableName of getTableNames(schemaBuild.schema)) {
791
+ await sql
792
+ .raw(`DROP TRIGGER IF EXISTS "${tableName.trigger}" ON "${namespace}"."${tableName.sql}"`)
793
+ .execute(tx);
794
+ }
795
+ // Remove indexes
796
+ for (const indexStatement of schemaBuild.statements.indexes
797
+ .json) {
798
+ await tx.schema
799
+ .dropIndex(indexStatement.data.name)
800
+ .ifExists()
801
+ .execute();
802
+ common.logger.info({
803
+ service: "database",
804
+ msg: `Dropped index '${indexStatement.data.name}' in schema '${namespace}'`,
805
+ });
806
+ }
807
+ // Revert unfinalized data
808
+ for (const tableName of getTableNames(schemaBuild.schema)) {
809
+ await revert({ tableName, checkpoint: app.checkpoint, tx });
810
+ }
811
+ }
812
+ return app.checkpoint;
813
+ }));
814
+ },
815
+ async createIndexes() {
816
+ for (const statement of schemaBuild.statements.indexes.sql) {
817
+ await sql.raw(statement).execute(qb.internal);
818
+ }
819
+ },
820
+ async createTriggers() {
821
+ await this.wrap({ method: "createTriggers", includeTraceLogs: true }, async () => {
822
+ for (const tableName of getTableNames(schemaBuild.schema)) {
823
+ const columns = getTableColumns(schemaBuild.schema[tableName.js]);
824
+ const columnNames = Object.values(columns).map((column) => `"${getColumnCasing(column, "snake_case")}"`);
825
+ await sql
826
+ .raw(`
827
+ CREATE OR REPLACE FUNCTION "${namespace}".${tableName.triggerFn}
828
+ RETURNS TRIGGER AS $$
829
+ BEGIN
830
+ IF TG_OP = 'INSERT' THEN
831
+ INSERT INTO "${namespace}"."${tableName.reorg}" (${columnNames.join(",")}, operation, checkpoint)
832
+ VALUES (${columnNames.map((name) => `NEW.${name}`).join(",")}, 0, '${MAX_CHECKPOINT_STRING}');
833
+ ELSIF TG_OP = 'UPDATE' THEN
834
+ INSERT INTO "${namespace}"."${tableName.reorg}" (${columnNames.join(",")}, operation, checkpoint)
835
+ VALUES (${columnNames.map((name) => `OLD.${name}`).join(",")}, 1, '${MAX_CHECKPOINT_STRING}');
836
+ ELSIF TG_OP = 'DELETE' THEN
837
+ INSERT INTO "${namespace}"."${tableName.reorg}" (${columnNames.join(",")}, operation, checkpoint)
838
+ VALUES (${columnNames.map((name) => `OLD.${name}`).join(",")}, 2, '${MAX_CHECKPOINT_STRING}');
839
+ END IF;
840
+ RETURN NULL;
841
+ END;
842
+ $$ LANGUAGE plpgsql
843
+ `)
844
+ .execute(qb.internal);
845
+ await sql
846
+ .raw(`
847
+ CREATE OR REPLACE TRIGGER "${tableName.trigger}"
848
+ AFTER INSERT OR UPDATE OR DELETE ON "${namespace}"."${tableName.sql}"
849
+ FOR EACH ROW EXECUTE FUNCTION "${namespace}".${tableName.triggerFn};
850
+ `)
851
+ .execute(qb.internal);
852
+ }
853
+ });
854
+ },
855
+ async removeTriggers() {
856
+ await this.wrap({ method: "removeTriggers", includeTraceLogs: true }, async () => {
857
+ for (const tableName of getTableNames(schemaBuild.schema)) {
858
+ await sql
859
+ .raw(`DROP TRIGGER IF EXISTS "${tableName.trigger}" ON "${namespace}"."${tableName.sql}"`)
860
+ .execute(qb.internal);
861
+ }
862
+ });
863
+ },
864
+ async revert({ checkpoint }) {
865
+ await this.wrap({ method: "revert", includeTraceLogs: true }, () => Promise.all(getTableNames(schemaBuild.schema).map((tableName) => qb.internal
866
+ .transaction()
867
+ .execute((tx) => revert({ tx, tableName, checkpoint })))));
868
+ },
869
+ async finalize({ checkpoint }) {
870
+ await this.wrap({ method: "finalize", includeTraceLogs: true }, async () => {
871
+ await qb.internal
872
+ .updateTable("_ponder_meta")
873
+ .where("key", "=", "app")
874
+ .set({
875
+ value: sql `jsonb_set(value, '{checkpoint}', to_jsonb(${checkpoint}::varchar(75)))`,
876
+ })
877
+ .execute();
878
+ await Promise.all(getTableNames(schemaBuild.schema).map((tableName) => qb.internal
879
+ .deleteFrom(tableName.reorg)
880
+ .where("checkpoint", "<=", checkpoint)
881
+ .execute()));
882
+ });
883
+ const decoded = decodeCheckpoint(checkpoint);
884
+ common.logger.debug({
885
+ service: "database",
886
+ msg: `Updated finalized checkpoint to (timestamp=${decoded.blockTimestamp} chainId=${decoded.chainId} block=${decoded.blockNumber})`,
887
+ });
888
+ },
889
+ async complete({ checkpoint }) {
890
+ await Promise.all(getTableNames(schemaBuild.schema).map((tableName) => this.wrap({ method: "complete", includeTraceLogs: true }, async () => {
891
+ await qb.internal
892
+ .updateTable(tableName.reorg)
893
+ .set({ checkpoint })
894
+ .where("checkpoint", "=", MAX_CHECKPOINT_STRING)
895
+ .execute();
896
+ })));
897
+ },
898
+ async unlock() {
899
+ clearInterval(heartbeatInterval);
900
+ await this.wrap({ method: "unlock", includeTraceLogs: true }, async () => {
901
+ await qb.internal
902
+ .updateTable("_ponder_meta")
903
+ .where("key", "=", "app")
904
+ .set({
905
+ value: sql `jsonb_set(value, '{is_locked}', to_jsonb(0))`,
906
+ })
907
+ .execute();
908
+ });
909
+ },
910
+ };
911
+ // @ts-ignore
912
+ return database;
913
+ };
914
+ //# sourceMappingURL=index.js.map