ponder 0.14.13 → 0.15.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 (237) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/esm/bin/commands/createViews.js +28 -11
  3. package/dist/esm/bin/commands/createViews.js.map +1 -1
  4. package/dist/esm/bin/commands/dev.js +42 -22
  5. package/dist/esm/bin/commands/dev.js.map +1 -1
  6. package/dist/esm/bin/commands/prune.js +3 -0
  7. package/dist/esm/bin/commands/prune.js.map +1 -1
  8. package/dist/esm/bin/commands/serve.js +4 -1
  9. package/dist/esm/bin/commands/serve.js.map +1 -1
  10. package/dist/esm/bin/commands/start.js +18 -6
  11. package/dist/esm/bin/commands/start.js.map +1 -1
  12. package/dist/esm/bin/isolatedController.js +200 -0
  13. package/dist/esm/bin/isolatedController.js.map +1 -0
  14. package/dist/esm/bin/isolatedWorker.js +146 -0
  15. package/dist/esm/bin/isolatedWorker.js.map +1 -0
  16. package/dist/esm/build/config.js +322 -402
  17. package/dist/esm/build/config.js.map +1 -1
  18. package/dist/esm/build/index.js +8 -11
  19. package/dist/esm/build/index.js.map +1 -1
  20. package/dist/esm/build/pre.js +1 -4
  21. package/dist/esm/build/pre.js.map +1 -1
  22. package/dist/esm/build/schema.js +25 -3
  23. package/dist/esm/build/schema.js.map +1 -1
  24. package/dist/esm/client/index.js +306 -42
  25. package/dist/esm/client/index.js.map +1 -1
  26. package/dist/esm/database/actions.js +264 -104
  27. package/dist/esm/database/actions.js.map +1 -1
  28. package/dist/esm/database/index.js +39 -33
  29. package/dist/esm/database/index.js.map +1 -1
  30. package/dist/esm/database/queryBuilder.js +1 -0
  31. package/dist/esm/database/queryBuilder.js.map +1 -1
  32. package/dist/esm/drizzle/index.js +11 -7
  33. package/dist/esm/drizzle/index.js.map +1 -1
  34. package/dist/esm/drizzle/onchain.js +18 -0
  35. package/dist/esm/drizzle/onchain.js.map +1 -1
  36. package/dist/esm/indexing/client.js +32 -25
  37. package/dist/esm/indexing/client.js.map +1 -1
  38. package/dist/esm/indexing/index.js +110 -178
  39. package/dist/esm/indexing/index.js.map +1 -1
  40. package/dist/esm/indexing/profile.js +1 -1
  41. package/dist/esm/indexing/profile.js.map +1 -1
  42. package/dist/esm/indexing-store/cache.js +196 -274
  43. package/dist/esm/indexing-store/cache.js.map +1 -1
  44. package/dist/esm/indexing-store/historical.js +17 -13
  45. package/dist/esm/indexing-store/historical.js.map +1 -1
  46. package/dist/esm/indexing-store/index.js +10 -1
  47. package/dist/esm/indexing-store/index.js.map +1 -1
  48. package/dist/esm/indexing-store/profile.js +3 -3
  49. package/dist/esm/indexing-store/profile.js.map +1 -1
  50. package/dist/esm/indexing-store/realtime.js +27 -2
  51. package/dist/esm/indexing-store/realtime.js.map +1 -1
  52. package/dist/esm/internal/errors.js +28 -0
  53. package/dist/esm/internal/errors.js.map +1 -1
  54. package/dist/esm/internal/metrics.js +279 -82
  55. package/dist/esm/internal/metrics.js.map +1 -1
  56. package/dist/esm/internal/options.js +1 -0
  57. package/dist/esm/internal/options.js.map +1 -1
  58. package/dist/esm/internal/telemetry.js +1 -1
  59. package/dist/esm/internal/telemetry.js.map +1 -1
  60. package/dist/esm/rpc/http.js +130 -0
  61. package/dist/esm/rpc/http.js.map +1 -0
  62. package/dist/esm/rpc/index.js +38 -7
  63. package/dist/esm/rpc/index.js.map +1 -1
  64. package/dist/esm/runtime/events.js +179 -212
  65. package/dist/esm/runtime/events.js.map +1 -1
  66. package/dist/esm/runtime/filter.js +71 -0
  67. package/dist/esm/runtime/filter.js.map +1 -1
  68. package/dist/esm/runtime/fragments.js +78 -73
  69. package/dist/esm/runtime/fragments.js.map +1 -1
  70. package/dist/esm/runtime/historical.js +306 -130
  71. package/dist/esm/runtime/historical.js.map +1 -1
  72. package/dist/esm/runtime/index.js +183 -58
  73. package/dist/esm/runtime/index.js.map +1 -1
  74. package/dist/esm/runtime/isolated.js +462 -0
  75. package/dist/esm/runtime/isolated.js.map +1 -0
  76. package/dist/esm/runtime/multichain.js +80 -73
  77. package/dist/esm/runtime/multichain.js.map +1 -1
  78. package/dist/esm/runtime/omnichain.js +82 -75
  79. package/dist/esm/runtime/omnichain.js.map +1 -1
  80. package/dist/esm/runtime/realtime.js +198 -66
  81. package/dist/esm/runtime/realtime.js.map +1 -1
  82. package/dist/esm/sync-historical/index.js +416 -457
  83. package/dist/esm/sync-historical/index.js.map +1 -1
  84. package/dist/esm/sync-realtime/bloom.js +3 -3
  85. package/dist/esm/sync-realtime/bloom.js.map +1 -1
  86. package/dist/esm/sync-realtime/index.js +27 -46
  87. package/dist/esm/sync-realtime/index.js.map +1 -1
  88. package/dist/esm/sync-store/index.js +112 -63
  89. package/dist/esm/sync-store/index.js.map +1 -1
  90. package/dist/esm/utils/abi.js +20 -32
  91. package/dist/esm/utils/abi.js.map +1 -1
  92. package/dist/esm/utils/chunk.js +8 -0
  93. package/dist/esm/utils/chunk.js.map +1 -0
  94. package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
  95. package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
  96. package/dist/esm/{client/parse.js → utils/sql-parse.js} +94 -80
  97. package/dist/esm/utils/sql-parse.js.map +1 -0
  98. package/dist/types/bin/commands/createViews.d.ts.map +1 -1
  99. package/dist/types/bin/commands/dev.d.ts.map +1 -1
  100. package/dist/types/bin/commands/prune.d.ts.map +1 -1
  101. package/dist/types/bin/commands/serve.d.ts.map +1 -1
  102. package/dist/types/bin/commands/start.d.ts.map +1 -1
  103. package/dist/types/bin/isolatedController.d.ts +13 -0
  104. package/dist/types/bin/isolatedController.d.ts.map +1 -0
  105. package/dist/types/bin/isolatedWorker.d.ts +9 -0
  106. package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
  107. package/dist/types/build/config.d.ts +29 -11
  108. package/dist/types/build/config.d.ts.map +1 -1
  109. package/dist/types/build/index.d.ts +3 -2
  110. package/dist/types/build/index.d.ts.map +1 -1
  111. package/dist/types/build/pre.d.ts +1 -1
  112. package/dist/types/build/pre.d.ts.map +1 -1
  113. package/dist/types/build/schema.d.ts +5 -3
  114. package/dist/types/build/schema.d.ts.map +1 -1
  115. package/dist/types/client/index.d.ts +1 -1
  116. package/dist/types/client/index.d.ts.map +1 -1
  117. package/dist/types/config/index.d.ts +3 -3
  118. package/dist/types/config/index.d.ts.map +1 -1
  119. package/dist/types/database/actions.d.ts +53 -7
  120. package/dist/types/database/actions.d.ts.map +1 -1
  121. package/dist/types/database/index.d.ts +21 -21
  122. package/dist/types/database/index.d.ts.map +1 -1
  123. package/dist/types/database/queryBuilder.d.ts.map +1 -1
  124. package/dist/types/drizzle/index.d.ts +4 -5
  125. package/dist/types/drizzle/index.d.ts.map +1 -1
  126. package/dist/types/drizzle/onchain.d.ts +6 -0
  127. package/dist/types/drizzle/onchain.d.ts.map +1 -1
  128. package/dist/types/indexing/client.d.ts.map +1 -1
  129. package/dist/types/indexing/index.d.ts +2 -5
  130. package/dist/types/indexing/index.d.ts.map +1 -1
  131. package/dist/types/indexing-store/cache.d.ts +3 -2
  132. package/dist/types/indexing-store/cache.d.ts.map +1 -1
  133. package/dist/types/indexing-store/historical.d.ts +2 -1
  134. package/dist/types/indexing-store/historical.d.ts.map +1 -1
  135. package/dist/types/indexing-store/index.d.ts +1 -0
  136. package/dist/types/indexing-store/index.d.ts.map +1 -1
  137. package/dist/types/indexing-store/realtime.d.ts +2 -1
  138. package/dist/types/indexing-store/realtime.d.ts.map +1 -1
  139. package/dist/types/internal/errors.d.ts +5 -0
  140. package/dist/types/internal/errors.d.ts.map +1 -1
  141. package/dist/types/internal/metrics.d.ts +21 -0
  142. package/dist/types/internal/metrics.d.ts.map +1 -1
  143. package/dist/types/internal/options.d.ts +2 -0
  144. package/dist/types/internal/options.d.ts.map +1 -1
  145. package/dist/types/internal/types.d.ts +66 -58
  146. package/dist/types/internal/types.d.ts.map +1 -1
  147. package/dist/types/rpc/http.d.ts +17 -0
  148. package/dist/types/rpc/http.d.ts.map +1 -0
  149. package/dist/types/rpc/index.d.ts.map +1 -1
  150. package/dist/types/runtime/events.d.ts +4 -4
  151. package/dist/types/runtime/events.d.ts.map +1 -1
  152. package/dist/types/runtime/filter.d.ts +5 -1
  153. package/dist/types/runtime/filter.d.ts.map +1 -1
  154. package/dist/types/runtime/fragments.d.ts +4 -3
  155. package/dist/types/runtime/fragments.d.ts.map +1 -1
  156. package/dist/types/runtime/historical.d.ts +29 -13
  157. package/dist/types/runtime/historical.d.ts.map +1 -1
  158. package/dist/types/runtime/index.d.ts +49 -6
  159. package/dist/types/runtime/index.d.ts.map +1 -1
  160. package/dist/types/runtime/init.d.ts +5 -5
  161. package/dist/types/runtime/init.d.ts.map +1 -1
  162. package/dist/types/runtime/isolated.d.ts +14 -0
  163. package/dist/types/runtime/isolated.d.ts.map +1 -0
  164. package/dist/types/runtime/multichain.d.ts.map +1 -1
  165. package/dist/types/runtime/omnichain.d.ts.map +1 -1
  166. package/dist/types/runtime/realtime.d.ts +21 -10
  167. package/dist/types/runtime/realtime.d.ts.map +1 -1
  168. package/dist/types/sync-historical/index.d.ts +18 -8
  169. package/dist/types/sync-historical/index.d.ts.map +1 -1
  170. package/dist/types/sync-realtime/bloom.d.ts.map +1 -1
  171. package/dist/types/sync-realtime/index.d.ts +2 -2
  172. package/dist/types/sync-realtime/index.d.ts.map +1 -1
  173. package/dist/types/sync-store/index.d.ts +9 -9
  174. package/dist/types/sync-store/index.d.ts.map +1 -1
  175. package/dist/types/utils/abi.d.ts +3 -34
  176. package/dist/types/utils/abi.d.ts.map +1 -1
  177. package/dist/types/utils/chunk.d.ts +2 -0
  178. package/dist/types/utils/chunk.d.ts.map +1 -0
  179. package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
  180. package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
  181. package/dist/types/utils/sql-parse.d.ts +21 -0
  182. package/dist/types/utils/sql-parse.d.ts.map +1 -0
  183. package/package.json +2 -2
  184. package/src/bin/commands/createViews.ts +35 -15
  185. package/src/bin/commands/dev.ts +43 -21
  186. package/src/bin/commands/prune.ts +6 -0
  187. package/src/bin/commands/serve.ts +4 -1
  188. package/src/bin/commands/start.ts +20 -5
  189. package/src/bin/isolatedController.ts +300 -0
  190. package/src/bin/isolatedWorker.ts +192 -0
  191. package/src/build/config.ts +570 -632
  192. package/src/build/index.ts +14 -14
  193. package/src/build/pre.ts +1 -4
  194. package/src/build/schema.ts +49 -4
  195. package/src/client/index.ts +386 -48
  196. package/src/config/index.ts +3 -3
  197. package/src/database/actions.ts +469 -120
  198. package/src/database/index.ts +85 -58
  199. package/src/database/queryBuilder.ts +1 -0
  200. package/src/drizzle/index.ts +15 -7
  201. package/src/drizzle/onchain.ts +19 -0
  202. package/src/indexing/client.ts +38 -25
  203. package/src/indexing/index.ts +137 -230
  204. package/src/indexing/profile.ts +1 -1
  205. package/src/indexing-store/cache.ts +285 -414
  206. package/src/indexing-store/historical.ts +20 -10
  207. package/src/indexing-store/index.ts +16 -0
  208. package/src/indexing-store/profile.ts +3 -3
  209. package/src/indexing-store/realtime.ts +28 -0
  210. package/src/internal/errors.ts +26 -0
  211. package/src/internal/metrics.ts +341 -111
  212. package/src/internal/options.ts +4 -0
  213. package/src/internal/telemetry.ts +1 -1
  214. package/src/internal/types.ts +70 -87
  215. package/src/rpc/http.ts +164 -0
  216. package/src/rpc/index.ts +39 -7
  217. package/src/runtime/events.ts +195 -240
  218. package/src/runtime/filter.ts +85 -1
  219. package/src/runtime/fragments.ts +109 -113
  220. package/src/runtime/historical.ts +467 -189
  221. package/src/runtime/index.ts +337 -69
  222. package/src/runtime/init.ts +5 -5
  223. package/src/runtime/isolated.ts +768 -0
  224. package/src/runtime/multichain.ts +137 -102
  225. package/src/runtime/omnichain.ts +138 -106
  226. package/src/runtime/realtime.ts +322 -123
  227. package/src/sync-historical/index.ts +556 -692
  228. package/src/sync-realtime/bloom.ts +7 -3
  229. package/src/sync-realtime/index.ts +31 -46
  230. package/src/sync-store/index.ts +189 -95
  231. package/src/utils/abi.ts +33 -90
  232. package/src/utils/chunk.ts +7 -0
  233. package/src/utils/promiseAllSettledWithThrow.ts +27 -0
  234. package/src/{client/parse.ts → utils/sql-parse.ts} +100 -90
  235. package/dist/esm/client/parse.js.map +0 -1
  236. package/dist/types/client/parse.d.ts +0 -14
  237. package/dist/types/client/parse.d.ts.map +0 -1
@@ -10,9 +10,9 @@ import { BuildError, RetryableError } from "@/internal/errors.js";
10
10
  import type {
11
11
  ApiBuild,
12
12
  IndexingBuild,
13
+ IndexingFunctions,
13
14
  NamespaceBuild,
14
15
  PreBuild,
15
- RawIndexingFunctions,
16
16
  Schema,
17
17
  SchemaBuild,
18
18
  } from "@/internal/types.js";
@@ -51,7 +51,7 @@ const BUILD_ID_VERSION = "2";
51
51
  type ConfigResult = Result<{ config: Config; contentHash: string }>;
52
52
  type SchemaResult = Result<{ schema: Schema; contentHash: string }>;
53
53
  type IndexingResult = Result<{
54
- indexingFunctions: RawIndexingFunctions;
54
+ indexingFunctions: IndexingFunctions;
55
55
  contentHash: string;
56
56
  }>;
57
57
  type ApiResult = Result<{ app: Hono }>;
@@ -66,7 +66,10 @@ export type Build = {
66
66
  }) => Promise<ApiResult>;
67
67
  namespaceCompile: () => Result<NamespaceBuild>;
68
68
  preCompile: (params: { config: Config }) => Result<PreBuild>;
69
- compileSchema: (params: { schema: Schema }) => Result<SchemaBuild>;
69
+ compileSchema: (params: {
70
+ schema: Schema;
71
+ preBuild: PreBuild;
72
+ }) => Result<SchemaBuild>;
70
73
  compileConfig: (params: {
71
74
  configResult: Extract<ConfigResult, { status: "success" }>["result"];
72
75
  }) => Result<Pick<IndexingBuild, "chains" | "rpcs">>;
@@ -356,10 +359,7 @@ export const createBuild = async ({
356
359
  } as const;
357
360
  },
358
361
  preCompile({ config }): Result<PreBuild> {
359
- const preBuild = safeBuildPre({
360
- config,
361
- options: common.options,
362
- });
362
+ const preBuild = safeBuildPre({ config, options: common.options });
363
363
  if (preBuild.status === "error") {
364
364
  return preBuild;
365
365
  }
@@ -372,10 +372,8 @@ export const createBuild = async ({
372
372
  },
373
373
  } as const;
374
374
  },
375
- compileSchema({ schema }) {
376
- const buildSchemaResult = safeBuildSchema({
377
- schema,
378
- });
375
+ compileSchema({ schema, preBuild }) {
376
+ const buildSchemaResult = safeBuildSchema({ schema, preBuild });
379
377
 
380
378
  if (buildSchemaResult.status === "error") {
381
379
  return buildSchemaResult;
@@ -422,7 +420,7 @@ export const createBuild = async ({
422
420
  const buildIndexingFunctionsResult = await safeBuildIndexingFunctions({
423
421
  common,
424
422
  config: configResult.config,
425
- rawIndexingFunctions: indexingResult.indexingFunctions,
423
+ indexingFunctions: indexingResult.indexingFunctions,
426
424
  configBuild,
427
425
  });
428
426
  if (buildIndexingFunctionsResult.status === "error") {
@@ -446,11 +444,13 @@ export const createBuild = async ({
446
444
  status: "success",
447
445
  result: {
448
446
  buildId,
449
- sources: buildIndexingFunctionsResult.sources,
450
447
  chains: buildIndexingFunctionsResult.chains,
451
448
  rpcs: buildIndexingFunctionsResult.rpcs,
452
449
  finalizedBlocks: buildIndexingFunctionsResult.finalizedBlocks,
453
- indexingFunctions: buildIndexingFunctionsResult.indexingFunctions,
450
+ eventCallbacks: buildIndexingFunctionsResult.eventCallbacks,
451
+ setupCallbacks: buildIndexingFunctionsResult.setupCallbacks,
452
+ contracts: buildIndexingFunctionsResult.contracts,
453
+ indexingFunctions: indexingResult.indexingFunctions,
454
454
  },
455
455
  } as const;
456
456
  },
package/src/build/pre.ts CHANGED
@@ -85,10 +85,7 @@ export function safeBuildPre({
85
85
  options: Pick<Options, "rootDir" | "ponderDir">;
86
86
  }) {
87
87
  try {
88
- const result = buildPre({
89
- config,
90
- options,
91
- });
88
+ const result = buildPre({ config, options });
92
89
 
93
90
  return {
94
91
  status: "success",
@@ -1,6 +1,7 @@
1
+ import { getPrimaryKeyColumns } from "@/drizzle/index.js";
1
2
  import { getSql } from "@/drizzle/kit/index.js";
2
3
  import { BuildError } from "@/internal/errors.js";
3
- import type { Schema } from "@/internal/types.js";
4
+ import type { PreBuild, Schema } from "@/internal/types.js";
4
5
  import {
5
6
  SQL,
6
7
  getTableColumns,
@@ -21,7 +22,10 @@ import {
21
22
  getViewConfig,
22
23
  } from "drizzle-orm/pg-core";
23
24
 
24
- export const buildSchema = ({ schema }: { schema: Schema }) => {
25
+ export const buildSchema = ({
26
+ schema,
27
+ preBuild,
28
+ }: { schema: Schema; preBuild: Pick<PreBuild, "ordering"> }) => {
25
29
  const statements = getSql(schema);
26
30
 
27
31
  const tableNames = new Set<string>();
@@ -31,6 +35,7 @@ export const buildSchema = ({ schema }: { schema: Schema }) => {
31
35
  for (const [name, s] of Object.entries(schema)) {
32
36
  if (is(s, PgTable)) {
33
37
  let hasPrimaryKey = false;
38
+ let hasChainIdColumn = false;
34
39
 
35
40
  for (const [columnName, column] of Object.entries(getTableColumns(s))) {
36
41
  if (column.primary) {
@@ -91,6 +96,37 @@ export const buildSchema = ({ schema }: { schema: Schema }) => {
91
96
  );
92
97
  }
93
98
  }
99
+
100
+ // TODO(kyle) It is an invariant that `getColumnCasing(column, "snake_case") === column.name`
101
+ if (columnName === "chainId" && column.name === "chain_id") {
102
+ hasChainIdColumn = true;
103
+ }
104
+ }
105
+
106
+ if (preBuild.ordering === "experimental_isolated") {
107
+ if (hasChainIdColumn === false) {
108
+ throw new Error(
109
+ `Schema validation failed: '${name}' does not have required 'chainId' column.`,
110
+ );
111
+ }
112
+
113
+ if (
114
+ getTableColumns(s).chainId!.dataType !== "number" &&
115
+ getTableColumns(s).chainId!.dataType !== "bigint"
116
+ ) {
117
+ throw new Error(
118
+ `Schema validation failed: '${name}'.chainId column must be an integer or numeric.`,
119
+ );
120
+ }
121
+
122
+ if (
123
+ getPrimaryKeyColumns(s).some(({ sql }) => sql === "chain_id") ===
124
+ false
125
+ ) {
126
+ throw new Error(
127
+ `Schema validation failed: '${name}.chain_id' column is required to be in the primary key when ordering is 'isolated'.`,
128
+ );
129
+ }
94
130
  }
95
131
 
96
132
  if (tableNames.has(getTableName(s))) {
@@ -180,6 +216,12 @@ export const buildSchema = ({ schema }: { schema: Schema }) => {
180
216
  );
181
217
  }
182
218
 
219
+ if (viewConfig.query === undefined) {
220
+ throw new Error(
221
+ `Schema validation failed: view '${getViewName(s)}' has no underlying query.`,
222
+ );
223
+ }
224
+
183
225
  if (viewConfig)
184
226
  for (const [columnName, column] of Object.entries(
185
227
  viewConfig.selectedFields,
@@ -225,9 +267,12 @@ export const buildSchema = ({ schema }: { schema: Schema }) => {
225
267
  return { statements };
226
268
  };
227
269
 
228
- export const safeBuildSchema = ({ schema }: { schema: Schema }) => {
270
+ export const safeBuildSchema = ({
271
+ schema,
272
+ preBuild,
273
+ }: { schema: Schema; preBuild: Pick<PreBuild, "ordering"> }) => {
229
274
  try {
230
- const result = buildSchema({ schema });
275
+ const result = buildSchema({ schema, preBuild });
231
276
 
232
277
  return {
233
278
  status: "success",