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,9 +1,12 @@
1
- import { getTableNames } from "@/drizzle/index.js";
1
+ import { getPartitionName, getReorgTableName } from "@/drizzle/index.js";
2
2
  import {
3
3
  SHARED_OPERATION_ID_SEQUENCE,
4
- getReorgTable,
5
4
  sqlToReorgTableName,
6
5
  } from "@/drizzle/kit/index.js";
6
+ import {
7
+ getLiveQueryNotifyProcedureName,
8
+ getLiveQueryProcedureName,
9
+ } from "@/drizzle/onchain.js";
7
10
  import type { Common } from "@/internal/common.js";
8
11
  import {
9
12
  MigrationError,
@@ -41,7 +44,12 @@ import { Kysely, Migrator, PostgresDialect, WithSchemaPlugin } from "kysely";
41
44
  import type { Pool } from "pg";
42
45
  import prometheus from "prom-client";
43
46
  import { hexToBigInt } from "viem";
44
- import { crashRecovery } from "./actions.js";
47
+ import {
48
+ crashRecovery,
49
+ createLiveQueryProcedures,
50
+ dropLiveQueryTriggers,
51
+ dropTriggers,
52
+ } from "./actions.js";
45
53
  import { type QB, createQB, parseDbError } from "./queryBuilder.js";
46
54
 
47
55
  export type Database = {
@@ -178,7 +186,7 @@ export const createDatabase = ({
178
186
  }: {
179
187
  common: Common;
180
188
  namespace: NamespaceBuild;
181
- preBuild: Pick<PreBuild, "databaseConfig">;
189
+ preBuild: Pick<PreBuild, "databaseConfig" | "ordering">;
182
190
  schemaBuild: Omit<SchemaBuild, "graphqlSchema">;
183
191
  }): Database => {
184
192
  let heartbeatInterval: NodeJS.Timeout | undefined;
@@ -489,27 +497,50 @@ export const createDatabase = ({
489
497
 
490
498
  const createTables = async (tx: QB) => {
491
499
  for (let i = 0; i < schemaBuild.statements.tables.sql.length; i++) {
492
- await tx
493
- .wrap(
494
- (tx) => tx.execute(schemaBuild.statements.tables.sql[i]!),
495
- context,
496
- )
497
- .catch((_error) => {
498
- const error = _error as Error;
499
- if (!error.message.includes("already exists")) throw error;
500
- const e = new MigrationError(
501
- `Unable to create table "${namespace.schema}"."${schemaBuild.statements.tables.json[i]!.tableName}" because a table with that name already exists.`,
500
+ try {
501
+ const schemaName = schemaBuild.statements.tables.json[i]!.schema;
502
+ const tableName = schemaBuild.statements.tables.json[i]!.tableName;
503
+
504
+ if (
505
+ preBuild.ordering === "experimental_isolated" &&
506
+ tableName.startsWith("_reorg__") === false
507
+ ) {
508
+ const sql = schemaBuild.statements.tables.sql[i]!;
509
+ await tx.wrap((tx) =>
510
+ tx.execute(
511
+ `${sql.slice(0, sql.length - 2)} PARTITION BY LIST (chain_id);`,
512
+ ),
502
513
  );
503
- e.stack = undefined;
504
- throw e;
505
- });
514
+
515
+ for (const chain of chains) {
516
+ await tx.wrap((tx) =>
517
+ tx.execute(
518
+ `CREATE TABLE "${schemaName}"."${getPartitionName(tableName, chain.id)}" PARTITION OF "${schemaName}"."${tableName}" FOR VALUES IN (${chain.id});`,
519
+ ),
520
+ );
521
+ }
522
+ } else {
523
+ await tx.wrap(
524
+ (tx) => tx.execute(schemaBuild.statements.tables.sql[i]!),
525
+ context,
526
+ );
527
+ }
528
+ } catch (_error) {
529
+ let error = _error as Error;
530
+ if (!error.message.includes("already exists")) throw error;
531
+ error = new MigrationError(
532
+ `Unable to create table '${namespace.schema}'.'${schemaBuild.statements.tables.json[i]!.tableName}' because a table with that name already exists.`,
533
+ );
534
+ error.stack = undefined;
535
+ throw error;
536
+ }
506
537
  }
507
538
 
508
539
  for (const table of tables) {
509
540
  await tx.wrap(
510
541
  (tx) =>
511
542
  tx.execute(
512
- `CREATE INDEX IF NOT EXISTS "${getTableName(table)}_checkpoint_index" ON "${namespace.schema}"."${getTableName(getReorgTable(table))}" ("checkpoint")`,
543
+ `CREATE INDEX IF NOT EXISTS "${getTableName(table)}_checkpoint_index" ON "${namespace.schema}"."${getReorgTableName(table)}" ("checkpoint")`,
513
544
  ),
514
545
  context,
515
546
  );
@@ -589,40 +620,6 @@ CREATE TABLE IF NOT EXISTS "${namespace.schema}"."_ponder_checkpoint" (
589
620
  ),
590
621
  context,
591
622
  );
592
-
593
- const trigger = "status_trigger";
594
- const notification = "status_notify()";
595
- const channel = `${namespace.schema}_status_channel`;
596
-
597
- await tx.wrap(
598
- (tx) =>
599
- tx.execute(
600
- `
601
- CREATE OR REPLACE FUNCTION "${namespace.schema}".${notification}
602
- RETURNS TRIGGER
603
- LANGUAGE plpgsql
604
- AS $$
605
- BEGIN
606
- NOTIFY "${channel}";
607
- RETURN NULL;
608
- END;
609
- $$;`,
610
- ),
611
- context,
612
- );
613
-
614
- await tx.wrap(
615
- (tx) =>
616
- tx.execute(
617
- `
618
- CREATE OR REPLACE TRIGGER "${trigger}"
619
- AFTER INSERT OR UPDATE OR DELETE
620
- ON "${namespace.schema}"._ponder_checkpoint
621
- FOR EACH STATEMENT
622
- EXECUTE PROCEDURE "${namespace.schema}".${notification};`,
623
- ),
624
- context,
625
- );
626
623
  };
627
624
 
628
625
  const tryAcquireLockAndMigrate = () =>
@@ -680,6 +677,11 @@ EXECUTE PROCEDURE "${namespace.schema}".${notification};`,
680
677
  await createEnums(tx);
681
678
  await createTables(tx);
682
679
  await createViews(tx);
680
+ await createLiveQueryProcedures(
681
+ tx,
682
+ { namespaceBuild: namespace },
683
+ context,
684
+ );
683
685
 
684
686
  common.logger.info({
685
687
  msg: "Created database tables",
@@ -800,7 +802,24 @@ EXECUTE PROCEDURE "${namespace.schema}".${notification};`,
800
802
  context,
801
803
  );
802
804
 
805
+ await tx.wrap((tx) =>
806
+ tx.execute(
807
+ `DROP FUNCTION IF EXISTS "${namespace.schema}".${getLiveQueryProcedureName()}`,
808
+ ),
809
+ );
810
+
811
+ await tx.wrap((tx) =>
812
+ tx.execute(
813
+ `DROP FUNCTION IF EXISTS "${namespace.schema}".${getLiveQueryNotifyProcedureName()}`,
814
+ ),
815
+ );
816
+
803
817
  await createAdminObjects(tx);
818
+ await createLiveQueryProcedures(
819
+ tx,
820
+ { namespaceBuild: namespace },
821
+ context,
822
+ );
804
823
 
805
824
  common.logger.debug({
806
825
  msg: "Reset internal database objects",
@@ -902,12 +921,20 @@ EXECUTE PROCEDURE "${namespace.schema}".${notification};`,
902
921
 
903
922
  // Remove triggers
904
923
 
905
- for (const table of tables) {
906
- await tx.wrap(
907
- (tx) =>
908
- tx.execute(
909
- `DROP TRIGGER IF EXISTS "${getTableNames(table).trigger}" ON "${namespace.schema}"."${getTableName(table)}"`,
910
- ),
924
+ if (preBuild.ordering === "experimental_isolated") {
925
+ for (const { chainId } of checkpoints) {
926
+ await dropTriggers(tx, { tables, chainId });
927
+ await dropLiveQueryTriggers(
928
+ tx,
929
+ { namespaceBuild: namespace, tables, chainId },
930
+ context,
931
+ );
932
+ }
933
+ } else {
934
+ await dropTriggers(tx, { tables });
935
+ await dropLiveQueryTriggers(
936
+ tx,
937
+ { namespaceBuild: namespace, tables },
911
938
  context,
912
939
  );
913
940
  }
@@ -1,3 +1,4 @@
1
+ import crypto from "node:crypto";
1
2
  import type { Common } from "@/internal/common.js";
2
3
  import { BaseError } from "@/internal/errors.js";
3
4
  import {
@@ -6,14 +6,22 @@ import {
6
6
  } from "drizzle-orm/pg-core";
7
7
  import { getColumnCasing, sqlToReorgTableName } from "./kit/index.js";
8
8
 
9
- export const getTableNames = (table: PgTable) => {
10
- const sql = getTableName(table);
9
+ export const getPartitionName = (table: string | PgTable, chainId: number) => {
10
+ return `${typeof table === "string" ? table : getTableName(table)}_${chainId}`;
11
+ };
11
12
 
12
- return {
13
- reorg: sqlToReorgTableName(sql),
14
- trigger: sqlToReorgTableName(sql),
15
- triggerFn: `operation_reorg__${sql}()`,
16
- };
13
+ export const getReorgTableName = (table: string | PgTable) => {
14
+ return sqlToReorgTableName(
15
+ typeof table === "string" ? table : getTableName(table),
16
+ );
17
+ };
18
+
19
+ export const getReorgTriggerName = () => {
20
+ return "reorg_trigger";
21
+ };
22
+
23
+ export const getReorgProcedureName = (table: PgTable) => {
24
+ return `operation_reorg__${getTableName(table)}()`;
17
25
  };
18
26
 
19
27
  export const getPrimaryKeyColumns = (
@@ -38,6 +38,25 @@ import {
38
38
  } from "./json.js";
39
39
  import { PgTextBuilder, type PgTextBuilderInitial } from "./text.js";
40
40
 
41
+ export const getLiveQueryTriggerName = () => {
42
+ return "live_query_trigger";
43
+ };
44
+ export const getLiveQueryProcedureName = () => {
45
+ return "live_query_procedure()";
46
+ };
47
+ export const getLiveQueryChannelName = (schema: string) => {
48
+ return `${schema}_live_query_channel`;
49
+ };
50
+ export const getLiveQueryNotifyTriggerName = () => {
51
+ return "live_query_notify_trigger";
52
+ };
53
+ export const getViewsLiveQueryNotifyTriggerName = (schema?: string) => {
54
+ return `${schema}_live_query_notify_trigger`;
55
+ };
56
+ export const getLiveQueryNotifyProcedureName = () => {
57
+ return "live_query_notify_procedure()";
58
+ };
59
+
41
60
  /** @internal */
42
61
  function getColumnNameAndConfig<
43
62
  TConfig extends Record<string, any> | undefined,
@@ -453,32 +453,32 @@ export const createCachedViemClient = ({
453
453
  hasConstant,
454
454
  }: { pattern: ProfilePattern; hasConstant: boolean }) => {
455
455
  const profilePatternKey = getProfilePatternKey(pattern);
456
+ const eventName = (event as Event).eventCallback.name;
456
457
 
457
- if (profile.get(event.name)!.has(profilePatternKey)) {
458
- profile.get(event.name)!.get(profilePatternKey)!.count++;
458
+ if (profile.get(eventName)!.has(profilePatternKey)) {
459
+ profile.get(eventName)!.get(profilePatternKey)!.count++;
459
460
 
460
461
  if (hasConstant) {
461
- profileConstantLRU.get(event.name)!.delete(profilePatternKey);
462
- profileConstantLRU.get(event.name)!.add(profilePatternKey);
462
+ profileConstantLRU.get(eventName)!.delete(profilePatternKey);
463
+ profileConstantLRU.get(eventName)!.add(profilePatternKey);
463
464
  }
464
465
  } else {
465
466
  profile
466
- .get(event.name)!
467
+ .get(eventName)!
467
468
  .set(profilePatternKey, { pattern, hasConstant, count: 1 });
468
469
 
469
470
  if (hasConstant) {
470
- profileConstantLRU.get(event.name)!.add(profilePatternKey);
471
+ profileConstantLRU.get(eventName)!.add(profilePatternKey);
471
472
  if (
472
- profileConstantLRU.get(event.name)!.size >
473
- MAX_CONSTANT_PATTERN_COUNT
473
+ profileConstantLRU.get(eventName)!.size > MAX_CONSTANT_PATTERN_COUNT
474
474
  ) {
475
475
  const firstKey = profileConstantLRU
476
- .get(event.name)!
476
+ .get(eventName)!
477
477
  .keys()
478
478
  .next().value;
479
479
  if (firstKey) {
480
- profile.get(event.name)!.delete(firstKey);
481
- profileConstantLRU.get(event.name)!.delete(firstKey);
480
+ profile.get(eventName)!.delete(firstKey);
481
+ profileConstantLRU.get(eventName)!.delete(firstKey);
482
482
  }
483
483
  }
484
484
  }
@@ -500,11 +500,13 @@ export const createCachedViemClient = ({
500
500
  if (
501
501
  event.type !== "setup" &&
502
502
  userBlockNumber === undefined &&
503
- eventCount[event.name]! % SAMPLING_RATE === 1
503
+ eventCount[event.eventCallback.name]! % SAMPLING_RATE === 1
504
504
  ) {
505
- if (profile.has(event.name) === false) {
506
- profile.set(event.name, new Map());
507
- profileConstantLRU.set(event.name, new Set());
505
+ const eventName = event.eventCallback.name;
506
+
507
+ if (profile.has(eventName) === false) {
508
+ profile.set(eventName, new Map());
509
+ profileConstantLRU.set(eventName, new Set());
508
510
  }
509
511
 
510
512
  // profile "readContract" and "multicall" actions
@@ -514,7 +516,7 @@ export const createCachedViemClient = ({
514
516
  args: { ...args, cache } as Parameters<
515
517
  PonderActions["readContract"]
516
518
  >[0],
517
- hints: Array.from(profile.get(event.name)!.values()),
519
+ hints: Array.from(profile.get(eventName)!.values()),
518
520
  });
519
521
  if (recordPatternResult) {
520
522
  addProfilePattern(recordPatternResult);
@@ -529,7 +531,7 @@ export const createCachedViemClient = ({
529
531
  const recordPatternResult = recordProfilePattern({
530
532
  event: event,
531
533
  args: contract,
532
- hints: Array.from(profile.get(event.name)!.values()),
534
+ hints: Array.from(profile.get(eventName)!.values()),
533
535
  });
534
536
  if (recordPatternResult) {
535
537
  addProfilePattern(recordPatternResult);
@@ -564,6 +566,10 @@ export const createCachedViemClient = ({
564
566
  // @ts-ignore
565
567
  return await action(...args);
566
568
  } catch (error) {
569
+ const eventName =
570
+ event.type === "setup"
571
+ ? event.setupCallback.name
572
+ : event.eventCallback.name;
567
573
  if (
568
574
  (error instanceof BlockNotFoundError === false &&
569
575
  error instanceof TransactionNotFoundError === false &&
@@ -576,12 +582,12 @@ export const createCachedViemClient = ({
576
582
  (args[0] as RetryableOptions).retryEmptyResponse === false
577
583
  ) {
578
584
  const chain = indexingBuild.chains.find(
579
- (n) => n.id === event.chainId,
585
+ (n) => n.id === event.chain.id,
580
586
  )!;
581
587
  common.logger.warn({
582
588
  msg: "Failed 'context.client' action",
583
589
  action: actionName,
584
- event: event.name,
590
+ event: eventName,
585
591
  chain: chain.name,
586
592
  chain_id: chain.id,
587
593
  retry_count: i,
@@ -593,12 +599,12 @@ export const createCachedViemClient = ({
593
599
 
594
600
  const duration = BASE_DURATION * 2 ** i;
595
601
  const chain = indexingBuild.chains.find(
596
- (n) => n.id === event.chainId,
602
+ (n) => n.id === event.chain.id,
597
603
  )!;
598
604
  common.logger.warn({
599
605
  msg: "Failed 'context.client' action",
600
606
  action: actionName,
601
- event: event.name,
607
+ event: eventName,
602
608
  chain: chain.name,
603
609
  chain_id: chain.id,
604
610
  retry_count: i,
@@ -683,10 +689,13 @@ export const createCachedViemClient = ({
683
689
  const prediction: { ev: number; request: Request }[] = [];
684
690
 
685
691
  for (const event of events) {
686
- if (profile.has(event.name)) {
687
- for (const [, { pattern, count }] of profile.get(event.name)!) {
692
+ if (profile.has(event.eventCallback.name)) {
693
+ for (const [, { pattern, count }] of profile.get(
694
+ event.eventCallback.name,
695
+ )!) {
688
696
  // Expected value of times the prediction will be used.
689
- const ev = (count * SAMPLING_RATE) / eventCount[event.name]!;
697
+ const ev =
698
+ (count * SAMPLING_RATE) / eventCount[event.eventCallback.name]!;
690
699
  prediction.push({
691
700
  ev,
692
701
  request: recoverProfilePattern(pattern, event),
@@ -808,10 +817,14 @@ export const cachedTransport =
808
817
  ({ chain: viemChain }) =>
809
818
  custom({
810
819
  async request({ method, params }) {
820
+ const _event = event();
811
821
  const context = {
812
822
  logger: common.logger.child({
813
823
  action: "cache JSON-RPC request",
814
- event: event().name,
824
+ event:
825
+ _event.type === "setup"
826
+ ? _event.setupCallback.name
827
+ : _event.eventCallback.name,
815
828
  }),
816
829
  };
817
830
  const body = { method, params };