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
|
@@ -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
|
-
|
|
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
|
|
494
|
+
let relations: Set<string> | undefined;
|
|
485
495
|
try {
|
|
486
|
-
|
|
496
|
+
relations = await getSQLQueryRelations(_sql);
|
|
487
497
|
} catch {}
|
|
488
498
|
|
|
489
499
|
if (
|
|
490
|
-
Array.from(
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
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(),
|
package/src/internal/errors.ts
CHANGED
|
@@ -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);
|