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
@@ -1,4 +1,3 @@
1
- import { findTableNames, validateQuery } from "@/client/parse.js";
2
1
  import type { QB } from "@/database/queryBuilder.js";
3
2
  import type { Common } from "@/internal/common.js";
4
3
  import {
@@ -13,6 +12,7 @@ import type { IndexingErrorHandler, SchemaBuild } from "@/internal/types.js";
13
12
  import { copy, copyOnWrite } from "@/utils/copy.js";
14
13
  import { createLock } from "@/utils/mutex.js";
15
14
  import { prettyPrint } from "@/utils/print.js";
15
+ import { getSQLQueryRelations, isReadonlySQLQuery } from "@/utils/sql-parse.js";
16
16
  import { startClock } from "@/utils/timer.js";
17
17
  import {
18
18
  type QueryWithTypings,
@@ -27,6 +27,7 @@ import type { IndexingCache, Row } from "./cache.js";
27
27
  import {
28
28
  type IndexingStore,
29
29
  checkOnchainTable,
30
+ checkTableAccess,
30
31
  validateUpdateSet,
31
32
  } from "./index.js";
32
33
  import { getPrimaryKeyCache } from "./utils.js";
@@ -36,11 +37,13 @@ export const createHistoricalIndexingStore = ({
36
37
  schemaBuild: { schema },
37
38
  indexingCache,
38
39
  indexingErrorHandler,
40
+ chainId,
39
41
  }: {
40
42
  common: Common;
41
43
  schemaBuild: Pick<SchemaBuild, "schema">;
42
44
  indexingCache: IndexingCache;
43
45
  indexingErrorHandler: IndexingErrorHandler;
46
+ chainId?: number;
44
47
  }): IndexingStore => {
45
48
  let qb: QB = undefined!;
46
49
  let isProcessingEvents = true;
@@ -97,6 +100,7 @@ export const createHistoricalIndexingStore = ({
97
100
  method: "find",
98
101
  });
99
102
  checkOnchainTable(table, "find");
103
+ checkTableAccess(table, "find", key, chainId);
100
104
  const ponderRow = await indexingCache.get({ table, key });
101
105
  const userRow = ponderRow === null ? null : copyOnWrite(ponderRow);
102
106
  return userRow;
@@ -120,6 +124,7 @@ export const createHistoricalIndexingStore = ({
120
124
  if (Array.isArray(ponderValues)) {
121
125
  const ponderRows = [];
122
126
  for (const value of ponderValues) {
127
+ checkTableAccess(table, "insert", value, chainId);
123
128
  const row = await indexingCache.get({ table, key: value });
124
129
 
125
130
  if (row) {
@@ -140,6 +145,7 @@ export const createHistoricalIndexingStore = ({
140
145
  );
141
146
  return userRows;
142
147
  } else {
148
+ checkTableAccess(table, "insert", ponderValues, chainId);
143
149
  const row = await indexingCache.get({
144
150
  table,
145
151
  key: ponderValues,
@@ -171,6 +177,7 @@ export const createHistoricalIndexingStore = ({
171
177
  if (Array.isArray(userValues)) {
172
178
  const ponderRows: Row[] = [];
173
179
  for (const value of userValues) {
180
+ checkTableAccess(table, "insert", value, chainId);
174
181
  const ponderRowUpdate = await indexingCache.get({
175
182
  table,
176
183
  key: value,
@@ -230,6 +237,7 @@ export const createHistoricalIndexingStore = ({
230
237
  );
231
238
  return userRows;
232
239
  } else {
240
+ checkTableAccess(table, "insert", userValues, chainId);
233
241
  const ponderRowUpdate = await indexingCache.get({
234
242
  table,
235
243
  key: userValues,
@@ -301,6 +309,8 @@ export const createHistoricalIndexingStore = ({
301
309
  if (Array.isArray(ponderValues)) {
302
310
  const ponderRows = [];
303
311
  for (const value of ponderValues) {
312
+ checkTableAccess(table, "insert", value, chainId);
313
+
304
314
  if (qb.$dialect === "pglite") {
305
315
  const row = await indexingCache.get({
306
316
  table,
@@ -343,6 +353,8 @@ export const createHistoricalIndexingStore = ({
343
353
  onRejected,
344
354
  );
345
355
  } else {
356
+ checkTableAccess(table, "insert", ponderValues, chainId);
357
+
346
358
  let ponderRow: Row;
347
359
  if (qb.$dialect === "pglite") {
348
360
  const row = await indexingCache.get({
@@ -405,6 +417,7 @@ export const createHistoricalIndexingStore = ({
405
417
  method: "update",
406
418
  });
407
419
  checkOnchainTable(table, "update");
420
+ checkTableAccess(table, "update", key, chainId);
408
421
 
409
422
  const ponderRowUpdate = await indexingCache.get({ table, key });
410
423
 
@@ -463,16 +476,13 @@ export const createHistoricalIndexingStore = ({
463
476
  method: "delete",
464
477
  });
465
478
  checkOnchainTable(table, "delete");
479
+ checkTableAccess(table, "delete", key, chainId);
466
480
  return indexingCache.delete({ table, key });
467
481
  }),
468
482
  // @ts-ignore
469
483
  sql: drizzle(
470
484
  storeMethodWrapper(async (_sql, params, method, typings) => {
471
- let isSelectOnly = false;
472
- try {
473
- await validateQuery(_sql, false);
474
- isSelectOnly = true;
475
- } catch {}
485
+ const isSelectOnly = await isReadonlySQLQuery(_sql);
476
486
 
477
487
  if (isSelectOnly === false) {
478
488
  await indexingCache.flush();
@@ -481,19 +491,19 @@ export const createHistoricalIndexingStore = ({
481
491
  } else {
482
492
  // Note: Not all nodes are implemented in the parser,
483
493
  // so we need to try/catch to avoid throwing an error.
484
- let refNames: Set<string> | undefined;
494
+ let relations: Set<string> | undefined;
485
495
  try {
486
- refNames = await findTableNames(_sql);
496
+ relations = await getSQLQueryRelations(_sql);
487
497
  } catch {}
488
498
 
489
499
  if (
490
- Array.from(refNames ?? []).some((refName) =>
500
+ Array.from(relations ?? []).some((refName) =>
491
501
  views.some((view) => getViewName(view) === refName),
492
502
  )
493
503
  ) {
494
504
  await indexingCache.flush();
495
505
  } else {
496
- await indexingCache.flush({ tableNames: refNames });
506
+ await indexingCache.flush({ tableNames: relations });
497
507
  }
498
508
  }
499
509
 
@@ -1,6 +1,7 @@
1
1
  import type { QB } from "@/database/queryBuilder.js";
2
2
  import { onchain } from "@/drizzle/onchain.js";
3
3
  import {
4
+ InvalidStoreAccessError,
4
5
  InvalidStoreMethodError,
5
6
  NonRetryableUserError,
6
7
  UndefinedTableError,
@@ -55,3 +56,18 @@ export const checkOnchainTable = (
55
56
  : `Indexing functions can only write to onchain tables, and '${getTableConfig(table).name}' is an offchain table or a view.`,
56
57
  );
57
58
  };
59
+
60
+ export const checkTableAccess = (
61
+ table: Table,
62
+ method: "find" | "insert" | "update" | "delete",
63
+ key: object,
64
+ chainId?: number,
65
+ ) => {
66
+ if (chainId === undefined) return;
67
+ if ("chainId" in key && String(key.chainId) === String(chainId)) return;
68
+ throw new InvalidStoreAccessError(
69
+ "chainId" in key
70
+ ? `db.${method}(${getTableConfig(table).name}) cannot access rows on different chains when ordering is 'isolated'.`
71
+ : `db.${method}(${getTableConfig(table).name}) must specify 'chainId' when ordering is 'isolated'.`,
72
+ );
73
+ };
@@ -63,7 +63,7 @@ const matchEventParameters = (
63
63
  event: Event,
64
64
  value: any,
65
65
  ): ProfilePattern[keyof ProfilePattern] | undefined => {
66
- if (eq(event.chainId, value)) {
66
+ if (eq(event.chain.id, value)) {
67
67
  return { type: "derived", value: ["chainId"] };
68
68
  }
69
69
 
@@ -515,7 +515,7 @@ export const recoverProfilePattern = (
515
515
  if (_pattern.type === "derived") {
516
516
  const { value, fn } = _pattern;
517
517
  if (value[0] === "chainId") {
518
- result[key] = event.chainId;
518
+ result[key] = event.chain.id;
519
519
  } else {
520
520
  let _result: unknown = event.event;
521
521
  for (const prop of value) {
@@ -534,7 +534,7 @@ export const recoverProfilePattern = (
534
534
  result[key] = values
535
535
  .map(({ value, fn }) => {
536
536
  if (value[0] === "chainId") {
537
- return event.chainId;
537
+ return event.chain.id;
538
538
  } else {
539
539
  let _result: unknown = event.event;
540
540
  for (const prop of value) {
@@ -22,6 +22,7 @@ import { drizzle } from "drizzle-orm/pg-proxy";
22
22
  import {
23
23
  type IndexingStore,
24
24
  checkOnchainTable,
25
+ checkTableAccess,
25
26
  validateUpdateSet,
26
27
  } from "./index.js";
27
28
  import { getCacheKey, getPrimaryKeyCache, getWhereCondition } from "./utils.js";
@@ -30,10 +31,12 @@ export const createRealtimeIndexingStore = ({
30
31
  common,
31
32
  schemaBuild: { schema },
32
33
  indexingErrorHandler,
34
+ chainId,
33
35
  }: {
34
36
  common: Common;
35
37
  schemaBuild: Pick<SchemaBuild, "schema">;
36
38
  indexingErrorHandler: IndexingErrorHandler;
39
+ chainId?: number;
37
40
  }): IndexingStore => {
38
41
  let qb: QB = undefined!;
39
42
  let isProcessingEvents = true;
@@ -96,6 +99,7 @@ export const createRealtimeIndexingStore = ({
96
99
  method: "find",
97
100
  });
98
101
  checkOnchainTable(table, "find");
102
+ checkTableAccess(table, "find", key, chainId);
99
103
  return find(table, key);
100
104
  }),
101
105
  // @ts-ignore
@@ -137,6 +141,16 @@ export const createRealtimeIndexingStore = ({
137
141
  return rows;
138
142
  };
139
143
 
144
+ if (chainId !== undefined) {
145
+ if (Array.isArray(values)) {
146
+ for (const value of values) {
147
+ checkTableAccess(table, "insert", value, chainId);
148
+ }
149
+ } else {
150
+ checkTableAccess(table, "insert", values, chainId);
151
+ }
152
+ }
153
+
140
154
  return qb.wrap((db) =>
141
155
  db
142
156
  .insert(table)
@@ -156,6 +170,7 @@ export const createRealtimeIndexingStore = ({
156
170
  if (Array.isArray(values)) {
157
171
  const rows = [];
158
172
  for (const value of values) {
173
+ checkTableAccess(table, "insert", value, chainId);
159
174
  const row = await find(table, value);
160
175
 
161
176
  if (row) {
@@ -187,6 +202,7 @@ export const createRealtimeIndexingStore = ({
187
202
  }
188
203
  return rows;
189
204
  } else {
205
+ checkTableAccess(table, "insert", values, chainId);
190
206
  const row = await find(table, values);
191
207
 
192
208
  if (row) {
@@ -244,6 +260,16 @@ export const createRealtimeIndexingStore = ({
244
260
  return result[0];
245
261
  };
246
262
 
263
+ if (chainId !== undefined) {
264
+ if (Array.isArray(values)) {
265
+ for (const value of values) {
266
+ checkTableAccess(table, "insert", value, chainId);
267
+ }
268
+ } else {
269
+ checkTableAccess(table, "insert", values, chainId);
270
+ }
271
+ }
272
+
247
273
  return qb.wrap((db) =>
248
274
  db
249
275
  .insert(table)
@@ -281,6 +307,7 @@ export const createRealtimeIndexingStore = ({
281
307
  method: "update",
282
308
  });
283
309
  checkOnchainTable(table, "update");
310
+ checkTableAccess(table, "update", key, chainId);
284
311
 
285
312
  const row = await find(table, key);
286
313
  if (typeof values === "function") {
@@ -325,6 +352,7 @@ export const createRealtimeIndexingStore = ({
325
352
  method: "delete",
326
353
  });
327
354
  checkOnchainTable(table, "delete");
355
+ checkTableAccess(table, "delete", key, chainId);
328
356
 
329
357
  const deleted = await qb.wrap((db) =>
330
358
  db.delete(table).where(getWhereCondition(table, key)).returning(),
@@ -77,6 +77,15 @@ export class NotNullConstraintError extends NonRetryableUserError {
77
77
  }
78
78
  }
79
79
 
80
+ export class InvalidStoreAccessError extends NonRetryableUserError {
81
+ override name = "InvalidStoreAccessError";
82
+
83
+ constructor(message?: string | undefined) {
84
+ super(message);
85
+ Object.setPrototypeOf(this, InvalidStoreAccessError.prototype);
86
+ }
87
+ }
88
+
80
89
  export class RecordNotFoundError extends NonRetryableUserError {
81
90
  override name = "RecordNotFoundError";
82
91
 
@@ -200,3 +209,20 @@ export class RpcProviderError extends BaseError {
200
209
  Object.setPrototypeOf(this, RpcProviderError.prototype);
201
210
  }
202
211
  }
212
+
213
+ export const nonRetryableUserErrorNames = [
214
+ ShutdownError,
215
+ BuildError,
216
+ MigrationError,
217
+ UniqueConstraintError,
218
+ NotNullConstraintError,
219
+ InvalidStoreAccessError,
220
+ RecordNotFoundError,
221
+ CheckConstraintError,
222
+ InvalidStoreMethodError,
223
+ UndefinedTableError,
224
+ BigIntSerializationError,
225
+ DelayedInsertError,
226
+ RawSqlError,
227
+ IndexingFunctionError,
228
+ ].map((err) => err.name);