@latticexyz/store-indexer 2.0.0-main-b00550ce → 2.0.0-main-dce54943
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.
@@ -0,0 +1,3 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
import{b as c,c as m}from"../chunk-2E5MDUA2.js";import"dotenv/config";import{z as s}from"zod";import{eq as T}from"drizzle-orm";import{createPublicClient as b,fallback as C,webSocket as E,http as g}from"viem";import{isDefined as _}from"@latticexyz/common/utils";import{combineLatest as A,filter as L,first as R}from"rxjs";import{drizzle as h}from"drizzle-orm/postgres-js";import S from"postgres";import{createStorageAdapter as k}from"@latticexyz/store-sync/postgres-decoded";import{createStoreSync as w}from"@latticexyz/store-sync";var e=m(s.intersection(c,s.object({DATABASE_URL:s.string(),HEALTHCHECK_HOST:s.string().optional(),HEALTHCHECK_PORT:s.coerce.number().optional()}))),O=[e.RPC_WS_URL?E(e.RPC_WS_URL):void 0,e.RPC_HTTP_URL?g(e.RPC_HTTP_URL):void 0].filter(_),l=b({transport:C(O),pollingInterval:e.POLLING_INTERVAL}),P=await l.getChainId(),u=h(S(e.DATABASE_URL,{prepare:!1})),{storageAdapter:K,tables:p}=await k({database:u,publicClient:l}),i=e.START_BLOCK;try{let o=await u.select().from(p.configTable).where(T(p.configTable.chainId,P)).limit(1).execute().then(r=>r.find(()=>!0));o?.blockNumber!=null&&(i=o.blockNumber+1n,console.log("resuming from block number",i))}catch{}var{latestBlockNumber$:B,storedBlockLogs$:f}=await w({storageAdapter:K,publicClient:l,startBlock:i,maxBlockRange:e.MAX_BLOCK_RANGE,address:e.STORE_ADDRESS});f.subscribe();var H=!1;A([B,f]).pipe(L(([o,{blockNumber:r}])=>o===r),R()).subscribe(()=>{H=!0,console.log("all caught up")});if(e.HEALTHCHECK_HOST!=null||e.HEALTHCHECK_PORT!=null){let{default:o}=await import("koa"),{default:r}=await import("@koa/cors"),{default:d}=await import("@koa/router"),n=new o;n.use(r());let a=new d;a.get("/",t=>{t.body="emit HelloWorld();"}),a.get("/healthz",t=>{t.status=200}),a.get("/readyz",t=>{H?(t.status=200,t.body="ready"):(t.status=424,t.body="backfilling")}),n.use(a.routes()),n.use(a.allowedMethods()),n.listen({host:e.HEALTHCHECK_HOST,port:e.HEALTHCHECK_PORT}),console.log(`postgres indexer healthcheck server listening on http://${e.HEALTHCHECK_HOST}:${e.HEALTHCHECK_PORT}`)}
|
3
|
+
//# sourceMappingURL=postgres-decoded-indexer.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../../bin/postgres-decoded-indexer.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { z } from \"zod\";\nimport { eq } from \"drizzle-orm\";\nimport { createPublicClient, fallback, webSocket, http, Transport } from \"viem\";\nimport { isDefined } from \"@latticexyz/common/utils\";\nimport { combineLatest, filter, first } from \"rxjs\";\nimport { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\nimport { createStorageAdapter } from \"@latticexyz/store-sync/postgres-decoded\";\nimport { createStoreSync } from \"@latticexyz/store-sync\";\nimport { indexerEnvSchema, parseEnv } from \"./parseEnv\";\n\nconst env = parseEnv(\n z.intersection(\n indexerEnvSchema,\n z.object({\n DATABASE_URL: z.string(),\n HEALTHCHECK_HOST: z.string().optional(),\n HEALTHCHECK_PORT: z.coerce.number().optional(),\n })\n )\n);\n\nconst transports: Transport[] = [\n // prefer WS when specified\n env.RPC_WS_URL ? webSocket(env.RPC_WS_URL) : undefined,\n // otherwise use or fallback to HTTP\n env.RPC_HTTP_URL ? http(env.RPC_HTTP_URL) : undefined,\n].filter(isDefined);\n\nconst publicClient = createPublicClient({\n transport: fallback(transports),\n pollingInterval: env.POLLING_INTERVAL,\n});\n\nconst chainId = await publicClient.getChainId();\nconst database = drizzle(postgres(env.DATABASE_URL, { prepare: false }));\n\nconst { storageAdapter, tables } = await createStorageAdapter({ database, publicClient });\n\nlet startBlock = env.START_BLOCK;\n\n// Resume from latest block stored in DB. This will throw if the DB doesn't exist yet, so we wrap in a try/catch and ignore the error.\n// TODO: query if the DB exists instead of try/catch\ntry {\n const chainState = await database\n .select()\n .from(tables.configTable)\n .where(eq(tables.configTable.chainId, chainId))\n .limit(1)\n .execute()\n // Get the first record in a way that returns a possible `undefined`\n // TODO: move this to `.findFirst` after upgrading drizzle or `rows[0]` after enabling `noUncheckedIndexedAccess: true`\n .then((rows) => rows.find(() => true));\n\n if (chainState?.blockNumber != null) {\n startBlock = chainState.blockNumber + 1n;\n console.log(\"resuming from block number\", startBlock);\n }\n} catch (error) {\n // ignore errors for now\n}\n\nconst { latestBlockNumber$, storedBlockLogs$ } = await createStoreSync({\n storageAdapter,\n publicClient,\n startBlock,\n maxBlockRange: env.MAX_BLOCK_RANGE,\n address: env.STORE_ADDRESS,\n});\n\nstoredBlockLogs$.subscribe();\n\nlet isCaughtUp = false;\ncombineLatest([latestBlockNumber$, storedBlockLogs$])\n .pipe(\n filter(\n ([latestBlockNumber, { blockNumber: lastBlockNumberProcessed }]) => latestBlockNumber === lastBlockNumberProcessed\n ),\n first()\n )\n .subscribe(() => {\n isCaughtUp = true;\n console.log(\"all caught up\");\n });\n\nif (env.HEALTHCHECK_HOST != null || env.HEALTHCHECK_PORT != null) {\n const { default: Koa } = await import(\"koa\");\n const { default: cors } = await import(\"@koa/cors\");\n const { default: Router } = await import(\"@koa/router\");\n\n const server = new Koa();\n server.use(cors());\n\n const router = new Router();\n\n router.get(\"/\", (ctx) => {\n ctx.body = \"emit HelloWorld();\";\n });\n\n // k8s healthchecks\n router.get(\"/healthz\", (ctx) => {\n ctx.status = 200;\n });\n router.get(\"/readyz\", (ctx) => {\n if (isCaughtUp) {\n ctx.status = 200;\n ctx.body = \"ready\";\n } else {\n ctx.status = 424;\n ctx.body = \"backfilling\";\n }\n });\n\n server.use(router.routes());\n server.use(router.allowedMethods());\n\n server.listen({ host: env.HEALTHCHECK_HOST, port: env.HEALTHCHECK_PORT });\n console.log(\n `postgres indexer healthcheck server listening on http://${env.HEALTHCHECK_HOST}:${env.HEALTHCHECK_PORT}`\n );\n}\n"],"mappings":"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","names":["z","eq","createPublicClient","fallback","webSocket","http","isDefined","combineLatest","filter","first","drizzle","postgres","createStorageAdapter","createStoreSync","env","parseEnv","z","indexerEnvSchema","transports","webSocket","http","isDefined","publicClient","createPublicClient","fallback","chainId","database","drizzle","postgres","storageAdapter","tables","createStorageAdapter","startBlock","chainState","eq","rows","latestBlockNumber$","storedBlockLogs$","createStoreSync","isCaughtUp","combineLatest","filter","latestBlockNumber","lastBlockNumberProcessed","first","Koa","cors","Router","server","router","ctx"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@latticexyz/store-indexer",
|
3
|
-
"version": "2.0.0-main-
|
3
|
+
"version": "2.0.0-main-dce54943",
|
4
4
|
"description": "Minimal Typescript indexer for Store",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -14,6 +14,7 @@
|
|
14
14
|
},
|
15
15
|
"types": "src/index.ts",
|
16
16
|
"bin": {
|
17
|
+
"postgres-decoded-indexer": "./dist/bin/postgres-decoded-indexer.js",
|
17
18
|
"postgres-frontend": "./dist/bin/postgres-frontend.js",
|
18
19
|
"postgres-indexer": "./dist/bin/postgres-indexer.js",
|
19
20
|
"sqlite-indexer": "./dist/bin/sqlite-indexer.js"
|
@@ -39,11 +40,11 @@
|
|
39
40
|
"trpc-koa-adapter": "^1.1.3",
|
40
41
|
"viem": "1.14.0",
|
41
42
|
"zod": "^3.21.4",
|
42
|
-
"@latticexyz/block-logs-stream": "2.0.0-main-
|
43
|
-
"@latticexyz/common": "2.0.0-main-
|
44
|
-
"@latticexyz/protocol-parser": "2.0.0-main-
|
45
|
-
"@latticexyz/store": "2.0.0-main-
|
46
|
-
"@latticexyz/store-sync": "2.0.0-main-
|
43
|
+
"@latticexyz/block-logs-stream": "2.0.0-main-dce54943",
|
44
|
+
"@latticexyz/common": "2.0.0-main-dce54943",
|
45
|
+
"@latticexyz/protocol-parser": "2.0.0-main-dce54943",
|
46
|
+
"@latticexyz/store": "2.0.0-main-dce54943",
|
47
|
+
"@latticexyz/store-sync": "2.0.0-main-dce54943"
|
47
48
|
},
|
48
49
|
"devDependencies": {
|
49
50
|
"@types/accepts": "^1.3.7",
|