@latticexyz/store-indexer 2.0.0-next.4 → 2.0.0-next.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/store-indexer",
3
- "version": "2.0.0-next.4",
3
+ "version": "2.0.0-next.5",
4
4
  "description": "Minimal Typescript indexer for Store",
5
5
  "repository": {
6
6
  "type": "git",
@@ -22,14 +22,15 @@
22
22
  "debug": "^4.3.4",
23
23
  "drizzle-orm": "^0.27.0",
24
24
  "fastify": "^4.21.0",
25
+ "postgres": "^3.3.5",
25
26
  "rxjs": "7.5.5",
26
27
  "superjson": "^1.12.4",
27
28
  "viem": "1.6.0",
28
29
  "zod": "^3.21.4",
29
- "@latticexyz/block-logs-stream": "2.0.0-next.4",
30
- "@latticexyz/common": "2.0.0-next.4",
31
- "@latticexyz/store": "2.0.0-next.4",
32
- "@latticexyz/store-sync": "2.0.0-next.4"
30
+ "@latticexyz/block-logs-stream": "2.0.0-next.5",
31
+ "@latticexyz/common": "2.0.0-next.5",
32
+ "@latticexyz/store": "2.0.0-next.5",
33
+ "@latticexyz/store-sync": "2.0.0-next.5"
33
34
  },
34
35
  "devDependencies": {
35
36
  "@types/better-sqlite3": "^7.6.4",
@@ -50,10 +51,15 @@
50
51
  "clean:js": "rimraf dist",
51
52
  "dev": "tsup --watch",
52
53
  "lint": "eslint .",
53
- "start": "tsx bin/sqlite-indexer",
54
- "start:local": "SQLITE_FILENAME=anvil.db CHAIN_ID=31337 pnpm start",
55
- "start:testnet": "SQLITE_FILENAME=testnet.db CHAIN_ID=4242 START_BLOCK=19037160 pnpm start",
56
- "start:testnet2": "SQLITE_FILENAME=testnet2.db CHAIN_ID=4243 pnpm start",
57
- "test": "tsc --noEmit --skipLibCheck"
54
+ "start:postgres": "tsx bin/postgres-indexer",
55
+ "start:postgres:local": "DATABASE_URL=postgres://127.0.0.1/postgres CHAIN_ID=31337 pnpm start:postgres",
56
+ "start:postgres:testnet": "DATABASE_URL=postgres://127.0.0.1/postgres CHAIN_ID=4242 START_BLOCK=19037160 pnpm start:postgres",
57
+ "start:postgres:testnet2": "DATABASE_URL=postgres://127.0.0.1/postgres CHAIN_ID=4243 pnpm start:postgres",
58
+ "start:sqlite": "tsx bin/sqlite-indexer",
59
+ "start:sqlite:local": "SQLITE_FILENAME=anvil.db CHAIN_ID=31337 pnpm start:sqlite",
60
+ "start:sqlite:testnet": "SQLITE_FILENAME=testnet.db CHAIN_ID=4242 START_BLOCK=19037160 pnpm start:sqlite",
61
+ "start:sqlite:testnet2": "SQLITE_FILENAME=testnet2.db CHAIN_ID=4243 pnpm start:sqlite",
62
+ "test": "tsc --noEmit --skipLibCheck",
63
+ "test:ci": "pnpm run test"
58
64
  }
59
65
  }
@@ -0,0 +1,54 @@
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
+ }
@@ -1,17 +1,17 @@
1
1
  import { eq } from "drizzle-orm";
2
2
  import { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core";
3
3
  import { createSqliteTable, chainState, getTables } from "@latticexyz/store-sync/sqlite";
4
- import { StorageAdapter } from "@latticexyz/store-sync/trpc-indexer";
4
+ import { QueryAdapter } from "@latticexyz/store-sync/trpc-indexer";
5
5
  import { debug } from "../debug";
6
6
 
7
7
  /**
8
8
  * Creates a storage adapter for the tRPC server/client to query data from SQLite.
9
9
  *
10
10
  * @param {BaseSQLiteDatabase<"sync", any>} database SQLite database object from Drizzle
11
- * @returns {Promise<StorageAdapter>} A set of methods used by tRPC endpoints.
11
+ * @returns {Promise<QueryAdapter>} A set of methods used by tRPC endpoints.
12
12
  */
13
- export async function createStorageAdapter(database: BaseSQLiteDatabase<"sync", any>): Promise<StorageAdapter> {
14
- const adapter: StorageAdapter = {
13
+ export async function createQueryAdapter(database: BaseSQLiteDatabase<"sync", any>): Promise<QueryAdapter> {
14
+ const adapter: QueryAdapter = {
15
15
  async findAll(chainId, address) {
16
16
  const tables = getTables(database).filter((table) => table.address === address);
17
17