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.
- package/CHANGELOG.md +16 -0
- package/dist/esm/bin/commands/createViews.js +28 -11
- package/dist/esm/bin/commands/createViews.js.map +1 -1
- package/dist/esm/bin/commands/dev.js +42 -22
- package/dist/esm/bin/commands/dev.js.map +1 -1
- package/dist/esm/bin/commands/prune.js +3 -0
- package/dist/esm/bin/commands/prune.js.map +1 -1
- package/dist/esm/bin/commands/serve.js +4 -1
- package/dist/esm/bin/commands/serve.js.map +1 -1
- package/dist/esm/bin/commands/start.js +18 -6
- package/dist/esm/bin/commands/start.js.map +1 -1
- package/dist/esm/bin/isolatedController.js +200 -0
- package/dist/esm/bin/isolatedController.js.map +1 -0
- package/dist/esm/bin/isolatedWorker.js +146 -0
- package/dist/esm/bin/isolatedWorker.js.map +1 -0
- package/dist/esm/build/config.js +322 -402
- package/dist/esm/build/config.js.map +1 -1
- package/dist/esm/build/index.js +8 -11
- package/dist/esm/build/index.js.map +1 -1
- package/dist/esm/build/pre.js +1 -4
- package/dist/esm/build/pre.js.map +1 -1
- package/dist/esm/build/schema.js +25 -3
- package/dist/esm/build/schema.js.map +1 -1
- package/dist/esm/client/index.js +306 -42
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/database/actions.js +264 -104
- package/dist/esm/database/actions.js.map +1 -1
- package/dist/esm/database/index.js +39 -33
- package/dist/esm/database/index.js.map +1 -1
- package/dist/esm/database/queryBuilder.js +1 -0
- package/dist/esm/database/queryBuilder.js.map +1 -1
- package/dist/esm/drizzle/index.js +11 -7
- package/dist/esm/drizzle/index.js.map +1 -1
- package/dist/esm/drizzle/onchain.js +18 -0
- package/dist/esm/drizzle/onchain.js.map +1 -1
- package/dist/esm/indexing/client.js +32 -25
- package/dist/esm/indexing/client.js.map +1 -1
- package/dist/esm/indexing/index.js +110 -178
- package/dist/esm/indexing/index.js.map +1 -1
- package/dist/esm/indexing/profile.js +1 -1
- package/dist/esm/indexing/profile.js.map +1 -1
- package/dist/esm/indexing-store/cache.js +196 -274
- package/dist/esm/indexing-store/cache.js.map +1 -1
- package/dist/esm/indexing-store/historical.js +17 -13
- package/dist/esm/indexing-store/historical.js.map +1 -1
- package/dist/esm/indexing-store/index.js +10 -1
- package/dist/esm/indexing-store/index.js.map +1 -1
- package/dist/esm/indexing-store/profile.js +3 -3
- package/dist/esm/indexing-store/profile.js.map +1 -1
- package/dist/esm/indexing-store/realtime.js +27 -2
- package/dist/esm/indexing-store/realtime.js.map +1 -1
- package/dist/esm/internal/errors.js +28 -0
- package/dist/esm/internal/errors.js.map +1 -1
- package/dist/esm/internal/metrics.js +279 -82
- package/dist/esm/internal/metrics.js.map +1 -1
- package/dist/esm/internal/options.js +1 -0
- package/dist/esm/internal/options.js.map +1 -1
- package/dist/esm/internal/telemetry.js +1 -1
- package/dist/esm/internal/telemetry.js.map +1 -1
- package/dist/esm/rpc/http.js +130 -0
- package/dist/esm/rpc/http.js.map +1 -0
- package/dist/esm/rpc/index.js +38 -7
- package/dist/esm/rpc/index.js.map +1 -1
- package/dist/esm/runtime/events.js +179 -212
- package/dist/esm/runtime/events.js.map +1 -1
- package/dist/esm/runtime/filter.js +71 -0
- package/dist/esm/runtime/filter.js.map +1 -1
- package/dist/esm/runtime/fragments.js +78 -73
- package/dist/esm/runtime/fragments.js.map +1 -1
- package/dist/esm/runtime/historical.js +306 -130
- package/dist/esm/runtime/historical.js.map +1 -1
- package/dist/esm/runtime/index.js +183 -58
- package/dist/esm/runtime/index.js.map +1 -1
- package/dist/esm/runtime/isolated.js +462 -0
- package/dist/esm/runtime/isolated.js.map +1 -0
- package/dist/esm/runtime/multichain.js +80 -73
- package/dist/esm/runtime/multichain.js.map +1 -1
- package/dist/esm/runtime/omnichain.js +82 -75
- package/dist/esm/runtime/omnichain.js.map +1 -1
- package/dist/esm/runtime/realtime.js +198 -66
- package/dist/esm/runtime/realtime.js.map +1 -1
- package/dist/esm/sync-historical/index.js +416 -457
- package/dist/esm/sync-historical/index.js.map +1 -1
- package/dist/esm/sync-realtime/bloom.js +3 -3
- package/dist/esm/sync-realtime/bloom.js.map +1 -1
- package/dist/esm/sync-realtime/index.js +27 -46
- package/dist/esm/sync-realtime/index.js.map +1 -1
- package/dist/esm/sync-store/index.js +112 -63
- package/dist/esm/sync-store/index.js.map +1 -1
- package/dist/esm/utils/abi.js +20 -32
- package/dist/esm/utils/abi.js.map +1 -1
- package/dist/esm/utils/chunk.js +8 -0
- package/dist/esm/utils/chunk.js.map +1 -0
- package/dist/esm/utils/promiseAllSettledWithThrow.js +19 -0
- package/dist/esm/utils/promiseAllSettledWithThrow.js.map +1 -0
- package/dist/esm/{client/parse.js → utils/sql-parse.js} +94 -80
- package/dist/esm/utils/sql-parse.js.map +1 -0
- package/dist/types/bin/commands/createViews.d.ts.map +1 -1
- package/dist/types/bin/commands/dev.d.ts.map +1 -1
- package/dist/types/bin/commands/prune.d.ts.map +1 -1
- package/dist/types/bin/commands/serve.d.ts.map +1 -1
- package/dist/types/bin/commands/start.d.ts.map +1 -1
- package/dist/types/bin/isolatedController.d.ts +13 -0
- package/dist/types/bin/isolatedController.d.ts.map +1 -0
- package/dist/types/bin/isolatedWorker.d.ts +9 -0
- package/dist/types/bin/isolatedWorker.d.ts.map +1 -0
- package/dist/types/build/config.d.ts +29 -11
- package/dist/types/build/config.d.ts.map +1 -1
- package/dist/types/build/index.d.ts +3 -2
- package/dist/types/build/index.d.ts.map +1 -1
- package/dist/types/build/pre.d.ts +1 -1
- package/dist/types/build/pre.d.ts.map +1 -1
- package/dist/types/build/schema.d.ts +5 -3
- package/dist/types/build/schema.d.ts.map +1 -1
- package/dist/types/client/index.d.ts +1 -1
- package/dist/types/client/index.d.ts.map +1 -1
- package/dist/types/config/index.d.ts +3 -3
- package/dist/types/config/index.d.ts.map +1 -1
- package/dist/types/database/actions.d.ts +53 -7
- package/dist/types/database/actions.d.ts.map +1 -1
- package/dist/types/database/index.d.ts +21 -21
- package/dist/types/database/index.d.ts.map +1 -1
- package/dist/types/database/queryBuilder.d.ts.map +1 -1
- package/dist/types/drizzle/index.d.ts +4 -5
- package/dist/types/drizzle/index.d.ts.map +1 -1
- package/dist/types/drizzle/onchain.d.ts +6 -0
- package/dist/types/drizzle/onchain.d.ts.map +1 -1
- package/dist/types/indexing/client.d.ts.map +1 -1
- package/dist/types/indexing/index.d.ts +2 -5
- package/dist/types/indexing/index.d.ts.map +1 -1
- package/dist/types/indexing-store/cache.d.ts +3 -2
- package/dist/types/indexing-store/cache.d.ts.map +1 -1
- package/dist/types/indexing-store/historical.d.ts +2 -1
- package/dist/types/indexing-store/historical.d.ts.map +1 -1
- package/dist/types/indexing-store/index.d.ts +1 -0
- package/dist/types/indexing-store/index.d.ts.map +1 -1
- package/dist/types/indexing-store/realtime.d.ts +2 -1
- package/dist/types/indexing-store/realtime.d.ts.map +1 -1
- package/dist/types/internal/errors.d.ts +5 -0
- package/dist/types/internal/errors.d.ts.map +1 -1
- package/dist/types/internal/metrics.d.ts +21 -0
- package/dist/types/internal/metrics.d.ts.map +1 -1
- package/dist/types/internal/options.d.ts +2 -0
- package/dist/types/internal/options.d.ts.map +1 -1
- package/dist/types/internal/types.d.ts +66 -58
- package/dist/types/internal/types.d.ts.map +1 -1
- package/dist/types/rpc/http.d.ts +17 -0
- package/dist/types/rpc/http.d.ts.map +1 -0
- package/dist/types/rpc/index.d.ts.map +1 -1
- package/dist/types/runtime/events.d.ts +4 -4
- package/dist/types/runtime/events.d.ts.map +1 -1
- package/dist/types/runtime/filter.d.ts +5 -1
- package/dist/types/runtime/filter.d.ts.map +1 -1
- package/dist/types/runtime/fragments.d.ts +4 -3
- package/dist/types/runtime/fragments.d.ts.map +1 -1
- package/dist/types/runtime/historical.d.ts +29 -13
- package/dist/types/runtime/historical.d.ts.map +1 -1
- package/dist/types/runtime/index.d.ts +49 -6
- package/dist/types/runtime/index.d.ts.map +1 -1
- package/dist/types/runtime/init.d.ts +5 -5
- package/dist/types/runtime/init.d.ts.map +1 -1
- package/dist/types/runtime/isolated.d.ts +14 -0
- package/dist/types/runtime/isolated.d.ts.map +1 -0
- package/dist/types/runtime/multichain.d.ts.map +1 -1
- package/dist/types/runtime/omnichain.d.ts.map +1 -1
- package/dist/types/runtime/realtime.d.ts +21 -10
- package/dist/types/runtime/realtime.d.ts.map +1 -1
- package/dist/types/sync-historical/index.d.ts +18 -8
- package/dist/types/sync-historical/index.d.ts.map +1 -1
- package/dist/types/sync-realtime/bloom.d.ts.map +1 -1
- package/dist/types/sync-realtime/index.d.ts +2 -2
- package/dist/types/sync-realtime/index.d.ts.map +1 -1
- package/dist/types/sync-store/index.d.ts +9 -9
- package/dist/types/sync-store/index.d.ts.map +1 -1
- package/dist/types/utils/abi.d.ts +3 -34
- package/dist/types/utils/abi.d.ts.map +1 -1
- package/dist/types/utils/chunk.d.ts +2 -0
- package/dist/types/utils/chunk.d.ts.map +1 -0
- package/dist/types/utils/promiseAllSettledWithThrow.d.ts +8 -0
- package/dist/types/utils/promiseAllSettledWithThrow.d.ts.map +1 -0
- package/dist/types/utils/sql-parse.d.ts +21 -0
- package/dist/types/utils/sql-parse.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/bin/commands/createViews.ts +35 -15
- package/src/bin/commands/dev.ts +43 -21
- package/src/bin/commands/prune.ts +6 -0
- package/src/bin/commands/serve.ts +4 -1
- package/src/bin/commands/start.ts +20 -5
- package/src/bin/isolatedController.ts +300 -0
- package/src/bin/isolatedWorker.ts +192 -0
- package/src/build/config.ts +570 -632
- package/src/build/index.ts +14 -14
- package/src/build/pre.ts +1 -4
- package/src/build/schema.ts +49 -4
- package/src/client/index.ts +386 -48
- package/src/config/index.ts +3 -3
- package/src/database/actions.ts +469 -120
- package/src/database/index.ts +85 -58
- package/src/database/queryBuilder.ts +1 -0
- package/src/drizzle/index.ts +15 -7
- package/src/drizzle/onchain.ts +19 -0
- package/src/indexing/client.ts +38 -25
- package/src/indexing/index.ts +137 -230
- package/src/indexing/profile.ts +1 -1
- package/src/indexing-store/cache.ts +285 -414
- package/src/indexing-store/historical.ts +20 -10
- package/src/indexing-store/index.ts +16 -0
- package/src/indexing-store/profile.ts +3 -3
- package/src/indexing-store/realtime.ts +28 -0
- package/src/internal/errors.ts +26 -0
- package/src/internal/metrics.ts +341 -111
- package/src/internal/options.ts +4 -0
- package/src/internal/telemetry.ts +1 -1
- package/src/internal/types.ts +70 -87
- package/src/rpc/http.ts +164 -0
- package/src/rpc/index.ts +39 -7
- package/src/runtime/events.ts +195 -240
- package/src/runtime/filter.ts +85 -1
- package/src/runtime/fragments.ts +109 -113
- package/src/runtime/historical.ts +467 -189
- package/src/runtime/index.ts +337 -69
- package/src/runtime/init.ts +5 -5
- package/src/runtime/isolated.ts +768 -0
- package/src/runtime/multichain.ts +137 -102
- package/src/runtime/omnichain.ts +138 -106
- package/src/runtime/realtime.ts +322 -123
- package/src/sync-historical/index.ts +556 -692
- package/src/sync-realtime/bloom.ts +7 -3
- package/src/sync-realtime/index.ts +31 -46
- package/src/sync-store/index.ts +189 -95
- package/src/utils/abi.ts +33 -90
- package/src/utils/chunk.ts +7 -0
- package/src/utils/promiseAllSettledWithThrow.ts +27 -0
- package/src/{client/parse.ts → utils/sql-parse.ts} +100 -90
- package/dist/esm/client/parse.js.map +0 -1
- package/dist/types/client/parse.d.ts +0 -14
- package/dist/types/client/parse.d.ts.map +0 -1
package/src/database/index.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
493
|
-
.
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
const
|
|
501
|
-
|
|
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
|
-
|
|
504
|
-
|
|
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}"."${
|
|
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
|
-
|
|
906
|
-
|
|
907
|
-
(tx)
|
|
908
|
-
|
|
909
|
-
|
|
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
|
}
|
package/src/drizzle/index.ts
CHANGED
|
@@ -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
|
|
10
|
-
|
|
9
|
+
export const getPartitionName = (table: string | PgTable, chainId: number) => {
|
|
10
|
+
return `${typeof table === "string" ? table : getTableName(table)}_${chainId}`;
|
|
11
|
+
};
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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 = (
|
package/src/drizzle/onchain.ts
CHANGED
|
@@ -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,
|
package/src/indexing/client.ts
CHANGED
|
@@ -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(
|
|
458
|
-
profile.get(
|
|
458
|
+
if (profile.get(eventName)!.has(profilePatternKey)) {
|
|
459
|
+
profile.get(eventName)!.get(profilePatternKey)!.count++;
|
|
459
460
|
|
|
460
461
|
if (hasConstant) {
|
|
461
|
-
profileConstantLRU.get(
|
|
462
|
-
profileConstantLRU.get(
|
|
462
|
+
profileConstantLRU.get(eventName)!.delete(profilePatternKey);
|
|
463
|
+
profileConstantLRU.get(eventName)!.add(profilePatternKey);
|
|
463
464
|
}
|
|
464
465
|
} else {
|
|
465
466
|
profile
|
|
466
|
-
.get(
|
|
467
|
+
.get(eventName)!
|
|
467
468
|
.set(profilePatternKey, { pattern, hasConstant, count: 1 });
|
|
468
469
|
|
|
469
470
|
if (hasConstant) {
|
|
470
|
-
profileConstantLRU.get(
|
|
471
|
+
profileConstantLRU.get(eventName)!.add(profilePatternKey);
|
|
471
472
|
if (
|
|
472
|
-
profileConstantLRU.get(
|
|
473
|
-
MAX_CONSTANT_PATTERN_COUNT
|
|
473
|
+
profileConstantLRU.get(eventName)!.size > MAX_CONSTANT_PATTERN_COUNT
|
|
474
474
|
) {
|
|
475
475
|
const firstKey = profileConstantLRU
|
|
476
|
-
.get(
|
|
476
|
+
.get(eventName)!
|
|
477
477
|
.keys()
|
|
478
478
|
.next().value;
|
|
479
479
|
if (firstKey) {
|
|
480
|
-
profile.get(
|
|
481
|
-
profileConstantLRU.get(
|
|
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
|
-
|
|
506
|
-
|
|
507
|
-
|
|
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(
|
|
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(
|
|
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.
|
|
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:
|
|
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.
|
|
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:
|
|
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(
|
|
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 =
|
|
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:
|
|
824
|
+
event:
|
|
825
|
+
_event.type === "setup"
|
|
826
|
+
? _event.setupCallback.name
|
|
827
|
+
: _event.eventCallback.name,
|
|
815
828
|
}),
|
|
816
829
|
};
|
|
817
830
|
const body = { method, params };
|