@latticexyz/store-indexer 2.0.0-snapshot-test-32d38619 → 2.0.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/README.md +23 -15
- package/dist/bin/postgres-decoded-indexer.js +3 -0
- package/dist/bin/postgres-decoded-indexer.js.map +1 -0
- package/dist/bin/postgres-frontend.js +31 -0
- package/dist/bin/postgres-frontend.js.map +1 -0
- package/dist/bin/postgres-indexer.js +1 -1
- package/dist/bin/postgres-indexer.js.map +1 -1
- package/dist/bin/sqlite-indexer.js +1 -1
- package/dist/bin/sqlite-indexer.js.map +1 -1
- package/dist/chunk-KDDXIBYJ.js +2 -0
- package/dist/chunk-KDDXIBYJ.js.map +1 -0
- package/dist/chunk-NHP2EYE7.js +7 -0
- package/dist/chunk-NHP2EYE7.js.map +1 -0
- package/dist/chunk-OUZYPRYF.js +2 -0
- package/dist/chunk-OUZYPRYF.js.map +1 -0
- package/dist/chunk-VCBWGHIO.js +2 -0
- package/dist/chunk-VCBWGHIO.js.map +1 -0
- package/dist/chunk-ZS3IQEZ4.js +2 -0
- package/dist/chunk-ZS3IQEZ4.js.map +1 -0
- package/dist/healthcheck-7XXWJH5U.js +2 -0
- package/dist/healthcheck-7XXWJH5U.js.map +1 -0
- package/dist/helloWorld-BMBNVEA7.js +2 -0
- package/dist/helloWorld-BMBNVEA7.js.map +1 -0
- package/package.json +34 -20
- package/src/debug.ts +7 -0
- package/src/koa-middleware/compress.ts +48 -0
- package/src/koa-middleware/healthcheck.ts +37 -0
- package/src/koa-middleware/helloWorld.ts +12 -0
- package/src/koa-middleware/sentry.ts +101 -0
- package/src/postgres/apiRoutes.ts +58 -0
- package/src/postgres/common.ts +21 -0
- package/src/postgres/deprecated/createQueryAdapter.ts +57 -0
- package/src/postgres/deprecated/getLogs.ts +82 -0
- package/src/postgres/queryLogs.ts +71 -0
- package/src/postgres/recordToLog.ts +19 -0
- package/src/sqlite/apiRoutes.ts +48 -0
- package/src/sqlite/createQueryAdapter.ts +10 -29
- package/src/sqlite/getTablesWithRecords.ts +76 -0
- package/dist/chunk-X3OEYQLT.js +0 -7
- package/dist/chunk-X3OEYQLT.js.map +0 -1
- package/src/postgres/createQueryAdapter.ts +0 -54
@@ -0,0 +1,76 @@
|
|
1
|
+
import { asc, eq } from "drizzle-orm";
|
2
|
+
import { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core";
|
3
|
+
import { buildTable, chainState, getTables } from "@latticexyz/store-sync/sqlite";
|
4
|
+
import { Hex, getAddress } from "viem";
|
5
|
+
import { decodeDynamicField } from "@latticexyz/protocol-parser/internal";
|
6
|
+
import { SyncFilter, TableWithRecords } from "@latticexyz/store-sync";
|
7
|
+
|
8
|
+
// TODO: refactor sqlite and replace this with getLogs to match postgres (https://github.com/latticexyz/mud/issues/1970)
|
9
|
+
|
10
|
+
/**
|
11
|
+
* @deprecated
|
12
|
+
* */
|
13
|
+
export function getTablesWithRecords(
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
15
|
+
database: BaseSQLiteDatabase<"sync", any>,
|
16
|
+
{
|
17
|
+
chainId,
|
18
|
+
address,
|
19
|
+
filters = [],
|
20
|
+
}: {
|
21
|
+
readonly chainId: number;
|
22
|
+
readonly address?: Hex;
|
23
|
+
readonly filters?: readonly SyncFilter[];
|
24
|
+
},
|
25
|
+
): { blockNumber: bigint | null; tables: readonly TableWithRecords[] } {
|
26
|
+
const metadata = database
|
27
|
+
.select()
|
28
|
+
.from(chainState)
|
29
|
+
.where(eq(chainState.chainId, chainId))
|
30
|
+
.limit(1)
|
31
|
+
.all()
|
32
|
+
.find(() => true);
|
33
|
+
|
34
|
+
// If _any_ filter has a table ID, this will filter down all data to just those tables. Which mean we can't yet mix table filters with key-only filters.
|
35
|
+
// TODO: improve this so we can express this in the query (need to be able to query data across tables more easily)
|
36
|
+
const tableIds = Array.from(new Set(filters.map((filter) => filter.tableId)));
|
37
|
+
const tables = getTables(database)
|
38
|
+
.filter((table) => address == null || getAddress(address) === getAddress(table.address))
|
39
|
+
.filter((table) => !tableIds.length || tableIds.includes(table.tableId));
|
40
|
+
|
41
|
+
const tablesWithRecords = tables.map((table) => {
|
42
|
+
const sqliteTable = buildTable(table);
|
43
|
+
const records = database
|
44
|
+
.select()
|
45
|
+
.from(sqliteTable)
|
46
|
+
.where(eq(sqliteTable.__isDeleted, false))
|
47
|
+
.orderBy(
|
48
|
+
asc(sqliteTable.__lastUpdatedBlockNumber),
|
49
|
+
// TODO: add logIndex (https://github.com/latticexyz/mud/issues/1979)
|
50
|
+
)
|
51
|
+
.all();
|
52
|
+
const filteredRecords = !filters.length
|
53
|
+
? records
|
54
|
+
: records.filter((record) => {
|
55
|
+
const keyTuple = decodeDynamicField("bytes32[]", record.__key);
|
56
|
+
return filters.some(
|
57
|
+
(filter) =>
|
58
|
+
filter.tableId === table.tableId &&
|
59
|
+
(filter.key0 == null || filter.key0 === keyTuple[0]) &&
|
60
|
+
(filter.key1 == null || filter.key1 === keyTuple[1]),
|
61
|
+
);
|
62
|
+
});
|
63
|
+
return {
|
64
|
+
...table,
|
65
|
+
records: filteredRecords.map((record) => ({
|
66
|
+
key: Object.fromEntries(Object.entries(table.keySchema).map(([name]) => [name, record[name]])),
|
67
|
+
value: Object.fromEntries(Object.entries(table.valueSchema).map(([name]) => [name, record[name]])),
|
68
|
+
})),
|
69
|
+
};
|
70
|
+
});
|
71
|
+
|
72
|
+
return {
|
73
|
+
blockNumber: metadata?.lastUpdatedBlockNumber ?? null,
|
74
|
+
tables: tablesWithRecords,
|
75
|
+
};
|
76
|
+
}
|
package/dist/chunk-X3OEYQLT.js
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
import{z as e,ZodError as c}from"zod";var t=e.intersection(e.object({HOST:e.string().default("0.0.0.0"),PORT:e.coerce.number().positive().default(3001),START_BLOCK:e.coerce.bigint().nonnegative().default(0n),MAX_BLOCK_RANGE:e.coerce.bigint().positive().default(1000n),POLLING_INTERVAL:e.coerce.number().positive().default(1e3)}),e.union([e.object({RPC_HTTP_URL:e.string(),RPC_WS_URL:e.string().optional()}),e.object({RPC_HTTP_URL:e.string().optional(),RPC_WS_URL:e.string()})]));function f(o){let r=o!==void 0?e.intersection(t,o):t;try{return r.parse(process.env)}catch(n){if(n instanceof c){let{_errors:a,...i}=n.format();console.error(`
|
2
|
-
Missing or invalid environment variables:
|
3
|
-
|
4
|
-
${Object.keys(i).join(`
|
5
|
-
`)}
|
6
|
-
`),process.exit(1)}throw n}}import s from"debug";var _=s("mud:store-indexer");export{_ as a,f as b};
|
7
|
-
//# sourceMappingURL=chunk-X3OEYQLT.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../bin/parseEnv.ts","../src/debug.ts"],"sourcesContent":["import { z, ZodError, ZodIntersection, ZodTypeAny } from \"zod\";\n\nconst commonSchema = z.intersection(\n z.object({\n HOST: z.string().default(\"0.0.0.0\"),\n PORT: z.coerce.number().positive().default(3001),\n START_BLOCK: z.coerce.bigint().nonnegative().default(0n),\n MAX_BLOCK_RANGE: z.coerce.bigint().positive().default(1000n),\n POLLING_INTERVAL: z.coerce.number().positive().default(1000),\n }),\n z.union([\n z.object({\n RPC_HTTP_URL: z.string(),\n RPC_WS_URL: z.string().optional(),\n }),\n z.object({\n RPC_HTTP_URL: z.string().optional(),\n RPC_WS_URL: z.string(),\n }),\n ])\n);\n\nexport function parseEnv<TSchema extends ZodTypeAny | undefined = undefined>(\n schema?: TSchema\n): z.infer<TSchema extends ZodTypeAny ? ZodIntersection<typeof commonSchema, TSchema> : typeof commonSchema> {\n const envSchema = schema !== undefined ? z.intersection(commonSchema, schema) : commonSchema;\n try {\n return envSchema.parse(process.env);\n } catch (error) {\n if (error instanceof ZodError) {\n const { _errors, ...invalidEnvVars } = error.format();\n console.error(`\\nMissing or invalid environment variables:\\n\\n ${Object.keys(invalidEnvVars).join(\"\\n \")}\\n`);\n process.exit(1);\n }\n throw error;\n }\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"mud:store-indexer\");\n"],"mappings":"AAAA,OAAS,KAAAA,EAAG,YAAAC,MAA6C,MAEzD,IAAMC,EAAeF,EAAE,aACrBA,EAAE,OAAO,CACP,KAAMA,EAAE,OAAO,EAAE,QAAQ,SAAS,EAClC,KAAMA,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,EAC/C,YAAaA,EAAE,OAAO,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,EACvD,gBAAiBA,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,EAC3D,iBAAkBA,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAI,CAC7D,CAAC,EACDA,EAAE,MAAM,CACNA,EAAE,OAAO,CACP,aAAcA,EAAE,OAAO,EACvB,WAAYA,EAAE,OAAO,EAAE,SAAS,CAClC,CAAC,EACDA,EAAE,OAAO,CACP,aAAcA,EAAE,OAAO,EAAE,SAAS,EAClC,WAAYA,EAAE,OAAO,CACvB,CAAC,CACH,CAAC,CACH,EAEO,SAASG,EACdC,EAC2G,CAC3G,IAAMC,EAAYD,IAAW,OAAYJ,EAAE,aAAaE,EAAcE,CAAM,EAAIF,EAChF,GAAI,CACF,OAAOG,EAAU,MAAM,QAAQ,GAAG,CACpC,OAASC,EAAP,CACA,GAAIA,aAAiBL,EAAU,CAC7B,GAAM,CAAE,QAAAM,EAAS,GAAGC,CAAe,EAAIF,EAAM,OAAO,EACpD,QAAQ,MAAM;AAAA;AAAA;AAAA,IAAoD,OAAO,KAAKE,CAAc,EAAE,KAAK;AAAA,GAAM;AAAA,CAAK,EAC9G,QAAQ,KAAK,CAAC,EAEhB,MAAMF,CACR,CACF,CCpCA,OAAOG,MAAiB,QAEjB,IAAMC,EAAQD,EAAY,mBAAmB","names":["z","ZodError","commonSchema","parseEnv","schema","envSchema","error","_errors","invalidEnvVars","createDebug","debug"]}
|
@@ -1,54 +0,0 @@
|
|
1
|
-
import { eq } from "drizzle-orm";
|
2
|
-
import { PgDatabase } from "drizzle-orm/pg-core";
|
3
|
-
import { buildTable, buildInternalTables, getTables } from "@latticexyz/store-sync/postgres";
|
4
|
-
import { QueryAdapter } from "@latticexyz/store-sync/trpc-indexer";
|
5
|
-
import { debug } from "../debug";
|
6
|
-
import { getAddress } from "viem";
|
7
|
-
|
8
|
-
/**
|
9
|
-
* Creates a query adapter for the tRPC server/client to query data from Postgres.
|
10
|
-
*
|
11
|
-
* @param {PgDatabase<any>} database Postgres database object from Drizzle
|
12
|
-
* @returns {Promise<QueryAdapter>} A set of methods used by tRPC endpoints.
|
13
|
-
*/
|
14
|
-
export async function createQueryAdapter(database: PgDatabase<any>): Promise<QueryAdapter> {
|
15
|
-
const adapter: QueryAdapter = {
|
16
|
-
async findAll(chainId, address) {
|
17
|
-
const internalTables = buildInternalTables();
|
18
|
-
const tables = (await getTables(database)).filter(
|
19
|
-
(table) => address != null && getAddress(address) === getAddress(table.address)
|
20
|
-
);
|
21
|
-
|
22
|
-
const tablesWithRecords = await Promise.all(
|
23
|
-
tables.map(async (table) => {
|
24
|
-
const sqliteTable = buildTable(table);
|
25
|
-
const records = await database.select().from(sqliteTable).where(eq(sqliteTable.__isDeleted, false)).execute();
|
26
|
-
return {
|
27
|
-
...table,
|
28
|
-
records: records.map((record) => ({
|
29
|
-
key: Object.fromEntries(Object.entries(table.keySchema).map(([name]) => [name, record[name]])),
|
30
|
-
value: Object.fromEntries(Object.entries(table.valueSchema).map(([name]) => [name, record[name]])),
|
31
|
-
})),
|
32
|
-
};
|
33
|
-
})
|
34
|
-
);
|
35
|
-
|
36
|
-
const metadata = await database
|
37
|
-
.select()
|
38
|
-
.from(internalTables.chain)
|
39
|
-
.where(eq(internalTables.chain.chainId, chainId))
|
40
|
-
.execute();
|
41
|
-
const { lastUpdatedBlockNumber } = metadata[0] ?? {};
|
42
|
-
|
43
|
-
const result = {
|
44
|
-
blockNumber: lastUpdatedBlockNumber ?? null,
|
45
|
-
tables: tablesWithRecords,
|
46
|
-
};
|
47
|
-
|
48
|
-
debug("findAll", chainId, address, result);
|
49
|
-
|
50
|
-
return result;
|
51
|
-
},
|
52
|
-
};
|
53
|
-
return adapter;
|
54
|
-
}
|