@latticexyz/store-indexer 2.0.7-main-7dfb82f7 → 2.0.8-account-kit-38709026

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.
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as c}from"../chunk-VCBWGHIO.js";import{b as s,c as l}from"../chunk-NHP2EYE7.js";import{a as m}from"../chunk-KDDXIBYJ.js";import{a as p}from"../chunk-OUZYPRYF.js";import"dotenv/config";import{z as o}from"zod";import{eq as _}from"drizzle-orm";import{createPublicClient as C,fallback as E,webSocket as b,http as L}from"viem";import{isDefined as R}from"@latticexyz/common/utils";import{combineLatest as S,filter as d,first as A}from"rxjs";import{drizzle as g}from"drizzle-orm/postgres-js";import h from"postgres";import{createStorageAdapter as O}from"@latticexyz/store-sync/postgres-decoded";import{createStoreSync as k}from"@latticexyz/store-sync";var e=l(o.intersection(s,o.object({DATABASE_URL:o.string(),HEALTHCHECK_HOST:o.string().optional(),HEALTHCHECK_PORT:o.coerce.number().optional(),SENTRY_DSN:o.string().optional()}))),N=[e.RPC_WS_URL?b(e.RPC_WS_URL):void 0,e.RPC_HTTP_URL?L(e.RPC_HTTP_URL):void 0].filter(R),a=C({transport:E(N),pollingInterval:e.POLLING_INTERVAL}),K=await a.getChainId(),f=g(h(e.DATABASE_URL,{prepare:!1})),{storageAdapter:P,tables:T}=await O({database:f,publicClient:a}),n=e.START_BLOCK;try{let t=await f.select().from(T.configTable).where(_(T.configTable.chainId,K)).limit(1).execute().then(r=>r.find(()=>!0));t?.blockNumber!=null&&(n=t.blockNumber+1n,console.log("resuming from block number",n))}catch{}var{latestBlockNumber$:w,storedBlockLogs$:H}=await k({storageAdapter:P,publicClient:a,followBlockTag:e.FOLLOW_BLOCK_TAG,startBlock:n,maxBlockRange:e.MAX_BLOCK_RANGE,address:e.STORE_ADDRESS});H.subscribe();var u=!1;S([w,H]).pipe(d(([t,{blockNumber:r}])=>t===r),A()).subscribe(()=>{u=!0,console.log("all caught up")});if(e.HEALTHCHECK_HOST!=null||e.HEALTHCHECK_PORT!=null){let{default:t}=await import("koa"),{default:r}=await import("@koa/cors"),i=new t;e.SENTRY_DSN&&i.use(c(e.SENTRY_DSN)),i.use(r()),i.use(m({isReady:()=>u})),i.use(p()),i.listen({host:e.HEALTHCHECK_HOST,port:e.HEALTHCHECK_PORT}),console.log(`postgres indexer healthcheck server listening on http://${e.HEALTHCHECK_HOST}:${e.HEALTHCHECK_PORT}`)}
2
+ import{a as c}from"../chunk-VCBWGHIO.js";import{b as s,c as l}from"../chunk-7B4KE2DO.js";import{a as m}from"../chunk-KDDXIBYJ.js";import{a as p}from"../chunk-OUZYPRYF.js";import"dotenv/config";import{z as o}from"zod";import{eq as _}from"drizzle-orm";import{createPublicClient as C,fallback as E,webSocket as b,http as L}from"viem";import{isDefined as R}from"@latticexyz/common/utils";import{combineLatest as S,filter as d,first as A}from"rxjs";import{drizzle as g}from"drizzle-orm/postgres-js";import h from"postgres";import{createStorageAdapter as O}from"@latticexyz/store-sync/postgres-decoded";import{createStoreSync as k}from"@latticexyz/store-sync";var e=l(o.intersection(s,o.object({DATABASE_URL:o.string(),HEALTHCHECK_HOST:o.string().optional(),HEALTHCHECK_PORT:o.coerce.number().optional(),SENTRY_DSN:o.string().optional()}))),N=[e.RPC_WS_URL?b(e.RPC_WS_URL):void 0,e.RPC_HTTP_URL?L(e.RPC_HTTP_URL):void 0].filter(R),a=C({transport:E(N),pollingInterval:e.POLLING_INTERVAL}),K=await a.getChainId(),f=g(h(e.DATABASE_URL,{prepare:!1})),{storageAdapter:P,tables:T}=await O({database:f,publicClient:a}),n=e.START_BLOCK;try{let t=await f.select().from(T.configTable).where(_(T.configTable.chainId,K)).limit(1).execute().then(r=>r.find(()=>!0));t?.blockNumber!=null&&(n=t.blockNumber+1n,console.log("resuming from block number",n))}catch{}var{latestBlockNumber$:w,storedBlockLogs$:H}=await k({storageAdapter:P,publicClient:a,followBlockTag:e.FOLLOW_BLOCK_TAG,startBlock:n,maxBlockRange:e.MAX_BLOCK_RANGE,address:e.STORE_ADDRESS});H.subscribe();var u=!1;S([w,H]).pipe(d(([t,{blockNumber:r}])=>t===r),A()).subscribe(()=>{u=!0,console.log("all caught up")});if(e.HEALTHCHECK_HOST!=null||e.HEALTHCHECK_PORT!=null){let{default:t}=await import("koa"),{default:r}=await import("@koa/cors"),i=new t;e.SENTRY_DSN&&i.use(c(e.SENTRY_DSN)),i.use(r()),i.use(m({isReady:()=>u})),i.use(p()),i.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
3
  //# sourceMappingURL=postgres-decoded-indexer.js.map
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as b,b as T,c as $}from"../chunk-ZS3IQEZ4.js";import{a as L}from"../chunk-VCBWGHIO.js";import{a as A,c as N}from"../chunk-NHP2EYE7.js";import{a as x}from"../chunk-KDDXIBYJ.js";import{a as w}from"../chunk-OUZYPRYF.js";import{a as I}from"../chunk-WOLC7XUT.js";import"dotenv/config";import{z as h}from"zod";import te from"koa";import ne from"@koa/cors";import{createKoaMiddleware as ae}from"trpc-koa-adapter";import{createAppRouter as se}from"@latticexyz/store-sync/trpc-indexer";import{drizzle as ie}from"drizzle-orm/postgres-js";import de from"postgres";import{getAddress as D}from"viem";import{isTableRegistrationLog as J,logToTable as j,storeTables as Y}from"@latticexyz/store-sync";import{decodeKey as K,decodeValueArgs as U}from"@latticexyz/protocol-parser/internal";import{tables as d}from"@latticexyz/store-sync/postgres";import{and as Q,asc as z,eq as p,or as F}from"drizzle-orm";import{bigIntMax as H}from"@latticexyz/common/utils";import{decodeDynamicField as M}from"@latticexyz/protocol-parser/internal";function S(e){return{address:e.address,eventName:"Store_SetRecord",args:{tableId:e.tableId,keyTuple:M("bytes32[]",e.keyBytes),staticData:e.staticData??"0x",encodedLengths:e.encodedLengths??"0x",dynamicData:e.dynamicData??"0x"}}}import{createBenchmark as W}from"@latticexyz/common";async function k(e,{chainId:t,address:r,filters:a=[]}){let o=W("drizzleGetLogs"),n=a.length?a.map(s=>Q(r!=null?p(d.recordsTable.address,r):void 0,p(d.recordsTable.tableId,s.tableId),s.key0!=null?p(d.recordsTable.key0,s.key0):void 0,s.key1!=null?p(d.recordsTable.key1,s.key1):void 0)):r!=null?[p(d.recordsTable.address,r)]:[];o("parse config");let f=(await e.select().from(d.configTable).where(p(d.configTable.chainId,t)).limit(1).execute().then(s=>s.find(()=>!0)))?.blockNumber??0n;o("query chainState");let l=await e.select().from(d.recordsTable).where(F(...n)).orderBy(z(d.recordsTable.blockNumber));o("query records");let i=l.reduce((s,y)=>H(s,y.blockNumber??0n),f);o("find block number");let R=l.filter(s=>!s.isDeleted).map(S);return o("map records to logs"),{blockNumber:i,logs:R}}import{groupBy as V}from"@latticexyz/common/utils";async function _(e){return{async getLogs(r){return k(e,r)},async findAll(r){let a=r.filters??[],{blockNumber:o,logs:n}=await k(e,{...r,filters:a.length>0?[...a,{tableId:Y.Tables.tableId}]:[]}),u=n.filter(J).map(j),f=V(n,i=>`${D(i.address)}:${i.args.tableId}`),l=u.map(i=>{let s=(f.get(`${D(i.address)}:${i.tableId}`)??[]).map(y=>({key:K(i.keySchema,y.args.keyTuple),value:U(i.valueSchema,y.args)}));return{...i,records:s}});return b("findAll: decoded %d logs across %d tables",n.length,u.length),{blockNumber:o,tables:l}}}}import X from"@koa/router";import Z from"koa-compose";import{input as ee}from"@latticexyz/store-sync/indexer-client";import{storeTables as re}from"@latticexyz/store-sync";import{isNotNull as E}from"@latticexyz/common/utils";import{hexToBytes as g}from"viem";import{transformSchemaName as q}from"@latticexyz/store-sync/postgres";var O=q("mud");function B(e,t){return e`(${t.reduce((r,a)=>e`${r} AND ${a}`)})`}function G(e,t){return e`(${t.reduce((r,a)=>e`${r} OR ${a}`)})`}function P(e,t){let r=t.filters.length?t.filters.map(o=>B(e,[t.address!=null?e`address = ${g(t.address)}`:null,e`table_id = ${g(o.tableId)}`,o.key0!=null?e`key0 = ${g(o.key0)}`:null,o.key1!=null?e`key1 = ${g(o.key1)}`:null].filter(E))):t.address!=null?[e`address = ${g(t.address)}`]:[],a=e`WHERE ${B(e,[e`is_deleted != true`,r.length?G(e,r):null].filter(E))}`;return e`
2
+ import{a as b,b as T,c as $}from"../chunk-ZS3IQEZ4.js";import{a as L}from"../chunk-VCBWGHIO.js";import{a as A,c as N}from"../chunk-7B4KE2DO.js";import{a as x}from"../chunk-KDDXIBYJ.js";import{a as w}from"../chunk-OUZYPRYF.js";import{a as I}from"../chunk-WOLC7XUT.js";import"dotenv/config";import{z as h}from"zod";import te from"koa";import ne from"@koa/cors";import{createKoaMiddleware as ae}from"trpc-koa-adapter";import{createAppRouter as se}from"@latticexyz/store-sync/trpc-indexer";import{drizzle as ie}from"drizzle-orm/postgres-js";import de from"postgres";import{getAddress as D}from"viem";import{isTableRegistrationLog as J,logToTable as j,storeTables as Y}from"@latticexyz/store-sync";import{decodeKey as K,decodeValueArgs as U}from"@latticexyz/protocol-parser/internal";import{tables as d}from"@latticexyz/store-sync/postgres";import{and as Q,asc as z,eq as p,or as F}from"drizzle-orm";import{bigIntMax as H}from"@latticexyz/common/utils";import{decodeDynamicField as M}from"@latticexyz/protocol-parser/internal";function S(e){return{address:e.address,eventName:"Store_SetRecord",args:{tableId:e.tableId,keyTuple:M("bytes32[]",e.keyBytes),staticData:e.staticData??"0x",encodedLengths:e.encodedLengths??"0x",dynamicData:e.dynamicData??"0x"}}}import{createBenchmark as W}from"@latticexyz/common";async function k(e,{chainId:t,address:r,filters:a=[]}){let o=W("drizzleGetLogs"),n=a.length?a.map(s=>Q(r!=null?p(d.recordsTable.address,r):void 0,p(d.recordsTable.tableId,s.tableId),s.key0!=null?p(d.recordsTable.key0,s.key0):void 0,s.key1!=null?p(d.recordsTable.key1,s.key1):void 0)):r!=null?[p(d.recordsTable.address,r)]:[];o("parse config");let f=(await e.select().from(d.configTable).where(p(d.configTable.chainId,t)).limit(1).execute().then(s=>s.find(()=>!0)))?.blockNumber??0n;o("query chainState");let l=await e.select().from(d.recordsTable).where(F(...n)).orderBy(z(d.recordsTable.blockNumber));o("query records");let i=l.reduce((s,y)=>H(s,y.blockNumber??0n),f);o("find block number");let R=l.filter(s=>!s.isDeleted).map(S);return o("map records to logs"),{blockNumber:i,logs:R}}import{groupBy as V}from"@latticexyz/common/utils";async function _(e){return{async getLogs(r){return k(e,r)},async findAll(r){let a=r.filters??[],{blockNumber:o,logs:n}=await k(e,{...r,filters:a.length>0?[...a,{tableId:Y.Tables.tableId}]:[]}),u=n.filter(J).map(j),f=V(n,i=>`${D(i.address)}:${i.args.tableId}`),l=u.map(i=>{let s=(f.get(`${D(i.address)}:${i.tableId}`)??[]).map(y=>({key:K(i.keySchema,y.args.keyTuple),value:U(i.valueSchema,y.args)}));return{...i,records:s}});return b("findAll: decoded %d logs across %d tables",n.length,u.length),{blockNumber:o,tables:l}}}}import X from"@koa/router";import Z from"koa-compose";import{input as ee}from"@latticexyz/store-sync/indexer-client";import{storeTables as re}from"@latticexyz/store-sync";import{isNotNull as E}from"@latticexyz/common/utils";import{hexToBytes as g}from"viem";import{transformSchemaName as q}from"@latticexyz/store-sync/postgres";var O=q("mud");function B(e,t){return e`(${t.reduce((r,a)=>e`${r} AND ${a}`)})`}function G(e,t){return e`(${t.reduce((r,a)=>e`${r} OR ${a}`)})`}function P(e,t){let r=t.filters.length?t.filters.map(o=>B(e,[t.address!=null?e`address = ${g(t.address)}`:null,e`table_id = ${g(o.tableId)}`,o.key0!=null?e`key0 = ${g(o.key0)}`:null,o.key1!=null?e`key1 = ${g(o.key1)}`:null].filter(E))):t.address!=null?[e`address = ${g(t.address)}`]:[],a=e`WHERE ${B(e,[e`is_deleted != true`,r.length?G(e,r):null].filter(E))}`;return e`
3
3
  WITH
4
4
  config AS (
5
5
  SELECT
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{b as c,c as m}from"../chunk-NHP2EYE7.js";import"dotenv/config";import{z as a}from"zod";import{eq as L}from"drizzle-orm";import{createPublicClient as _,fallback as g,webSocket as h,http as E}from"viem";import{isDefined as A}from"@latticexyz/common/utils";import{combineLatest as R,filter as S,first as O}from"rxjs";import{drizzle as w}from"drizzle-orm/postgres-js";import k from"postgres";import{cleanDatabase as B,createStorageAdapter as K,shouldCleanDatabase as P}from"@latticexyz/store-sync/postgres";import{createStoreSync as N}from"@latticexyz/store-sync";var t=m(a.intersection(c,a.object({DATABASE_URL:a.string(),HEALTHCHECK_HOST:a.string().optional(),HEALTHCHECK_PORT:a.coerce.number().optional()}))),v=[t.RPC_WS_URL?h(t.RPC_WS_URL):void 0,t.RPC_HTTP_URL?E(t.RPC_HTTP_URL):void 0].filter(A),l=_({transport:g(v),pollingInterval:t.POLLING_INTERVAL}),d=await l.getChainId(),i=w(k(t.DATABASE_URL,{prepare:!1}));await P(i,d)&&(console.log("outdated database detected, clearing data to start fresh"),await B(i));var{storageAdapter:D,tables:p}=await K({database:i,publicClient:l}),n=t.START_BLOCK;async function f(){try{return(await i.select().from(p.configTable).where(L(p.configTable.chainId,d)).limit(1).execute().then(o=>o.find(()=>!0)))?.blockNumber}catch{}}var u=await f();u!=null&&(n=u+1n,console.log("resuming from block number",n));var{latestBlockNumber$:U,storedBlockLogs$:T}=await N({storageAdapter:D,publicClient:l,followBlockTag:t.FOLLOW_BLOCK_TAG,startBlock:n,maxBlockRange:t.MAX_BLOCK_RANGE,address:t.STORE_ADDRESS});T.subscribe();var s=!1;R([U,T]).pipe(S(([e,{blockNumber:o}])=>e===o),O()).subscribe(()=>{s=!0,console.log("all caught up")});if(t.HEALTHCHECK_HOST!=null||t.HEALTHCHECK_PORT!=null){let{default:e}=await import("koa"),{default:o}=await import("@koa/cors"),{healthcheck:H}=await import("../healthcheck-7XXWJH5U.js"),{metrics:b}=await import("../metrics-IL7G7G42.js"),{helloWorld:C}=await import("../helloWorld-BMBNVEA7.js"),r=new e;r.use(o()),r.use(H({isReady:()=>s})),r.use(b({isHealthy:()=>!0,isReady:()=>s,getLatestStoredBlockNumber:f,followBlockTag:t.FOLLOW_BLOCK_TAG})),r.use(C()),r.listen({host:t.HEALTHCHECK_HOST,port:t.HEALTHCHECK_PORT}),console.log(`postgres indexer healthcheck server listening on http://${t.HEALTHCHECK_HOST}:${t.HEALTHCHECK_PORT}`)}
2
+ import{b as c,c as m}from"../chunk-7B4KE2DO.js";import"dotenv/config";import{z as a}from"zod";import{eq as L}from"drizzle-orm";import{createPublicClient as _,fallback as g,webSocket as h,http as E}from"viem";import{isDefined as A}from"@latticexyz/common/utils";import{combineLatest as R,filter as S,first as O}from"rxjs";import{drizzle as w}from"drizzle-orm/postgres-js";import k from"postgres";import{cleanDatabase as B,createStorageAdapter as K,shouldCleanDatabase as P}from"@latticexyz/store-sync/postgres";import{createStoreSync as N}from"@latticexyz/store-sync";var t=m(a.intersection(c,a.object({DATABASE_URL:a.string(),HEALTHCHECK_HOST:a.string().optional(),HEALTHCHECK_PORT:a.coerce.number().optional()}))),v=[t.RPC_WS_URL?h(t.RPC_WS_URL):void 0,t.RPC_HTTP_URL?E(t.RPC_HTTP_URL):void 0].filter(A),l=_({transport:g(v),pollingInterval:t.POLLING_INTERVAL}),d=await l.getChainId(),i=w(k(t.DATABASE_URL,{prepare:!1}));await P(i,d)&&(console.log("outdated database detected, clearing data to start fresh"),await B(i));var{storageAdapter:D,tables:p}=await K({database:i,publicClient:l}),n=t.START_BLOCK;async function f(){try{return(await i.select().from(p.configTable).where(L(p.configTable.chainId,d)).limit(1).execute().then(o=>o.find(()=>!0)))?.blockNumber}catch{}}var u=await f();u!=null&&(n=u+1n,console.log("resuming from block number",n));var{latestBlockNumber$:U,storedBlockLogs$:T}=await N({storageAdapter:D,publicClient:l,followBlockTag:t.FOLLOW_BLOCK_TAG,startBlock:n,maxBlockRange:t.MAX_BLOCK_RANGE,address:t.STORE_ADDRESS});T.subscribe();var s=!1;R([U,T]).pipe(S(([e,{blockNumber:o}])=>e===o),O()).subscribe(()=>{s=!0,console.log("all caught up")});if(t.HEALTHCHECK_HOST!=null||t.HEALTHCHECK_PORT!=null){let{default:e}=await import("koa"),{default:o}=await import("@koa/cors"),{healthcheck:H}=await import("../healthcheck-7XXWJH5U.js"),{metrics:b}=await import("../metrics-IL7G7G42.js"),{helloWorld:C}=await import("../helloWorld-BMBNVEA7.js"),r=new e;r.use(o()),r.use(H({isReady:()=>s})),r.use(b({isHealthy:()=>!0,isReady:()=>s,getLatestStoredBlockNumber:f,followBlockTag:t.FOLLOW_BLOCK_TAG})),r.use(C()),r.listen({host:t.HEALTHCHECK_HOST,port:t.HEALTHCHECK_PORT}),console.log(`postgres indexer healthcheck server listening on http://${t.HEALTHCHECK_HOST}:${t.HEALTHCHECK_PORT}`)}
3
3
  //# sourceMappingURL=postgres-indexer.js.map
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as S,c as _}from"../chunk-ZS3IQEZ4.js";import{a as B}from"../chunk-VCBWGHIO.js";import{a as R,b as L,c as N}from"../chunk-NHP2EYE7.js";import{a as C}from"../chunk-KDDXIBYJ.js";import{a as E}from"../chunk-OUZYPRYF.js";import{a as I}from"../chunk-WOLC7XUT.js";import"dotenv/config";import X from"node:fs";import{z as p}from"zod";import{eq as Z}from"drizzle-orm";import{drizzle as ee}from"drizzle-orm/better-sqlite3";import te from"better-sqlite3";import{createPublicClient as re,fallback as oe,webSocket as ae,http as se}from"viem";import ne from"koa";import ie from"@koa/cors";import{createKoaMiddleware as le}from"trpc-koa-adapter";import{createAppRouter as ce}from"@latticexyz/store-sync/trpc-indexer";import{chainState as P,schemaVersion as W,syncToSqlite as me}from"@latticexyz/store-sync/sqlite";import{asc as F,eq as O}from"drizzle-orm";import{buildTable as H,chainState as w,getTables as K}from"@latticexyz/store-sync/sqlite";import{getAddress as A}from"viem";import{decodeDynamicField as j}from"@latticexyz/protocol-parser/internal";function u(r,{chainId:s,address:t,filters:n=[]}){let i=r.select().from(w).where(O(w.chainId,s)).limit(1).all().find(()=>!0),o=Array.from(new Set(n.map(a=>a.tableId))),y=K(r).filter(a=>t==null||A(t)===A(a.address)).filter(a=>!o.length||o.includes(a.tableId)).map(a=>{let h=H(a),k=r.select().from(h).where(O(h.__isDeleted,!1)).orderBy(F(h.__lastUpdatedBlockNumber)).all(),M=n.length?k.filter(f=>{let l=j("bytes32[]",f.__key);return n.some(d=>d.tableId===a.tableId&&(d.key0==null||d.key0===l[0])&&(d.key1==null||d.key1===l[1]))}):k;return{...a,records:M.map(f=>({key:Object.fromEntries(Object.entries(a.keySchema).map(([l])=>[l,f[l]])),value:Object.fromEntries(Object.entries(a.valueSchema).map(([l])=>[l,f[l]]))}))}});return{blockNumber:i?.lastUpdatedBlockNumber??null,tables:y}}import{tablesWithRecordsToLogs as V}from"@latticexyz/store-sync";async function D(r){return{async getLogs(t){let{blockNumber:n,tables:i}=u(r,t),o=V(i);return{blockNumber:n??0n,logs:o}},async findAll(t){return u(r,t)}}}import{isDefined as de}from"@latticexyz/common/utils";import{combineLatest as ue,filter as pe,first as fe}from"rxjs";import x from"@koa/router";import G from"koa-compose";import{input as J}from"@latticexyz/store-sync/indexer-client";import{storeTables as $,tablesWithRecordsToLogs as z}from"@latticexyz/store-sync";import{createBenchmark as Y}from"@latticexyz/common";function Q(r){let s=new x;return s.get("/api/logs",_(),async t=>{let n=Y("sqlite:logs"),i;try{i=J.parse(typeof t.query.input=="string"?JSON.parse(t.query.input):{})}catch(o){t.status=400,t.body=JSON.stringify(o),S(o);return}try{i.filters=i.filters.length>0?[...i.filters,{tableId:$.Tables.tableId}]:[],n("parse config");let{blockNumber:o,tables:T}=u(r,i);n("query tables with records");let y=z(T);n("convert records to logs"),t.body=JSON.stringify({blockNumber:o?.toString()??"-1",logs:y}),t.status=200}catch(o){t.status=500,t.body=JSON.stringify(o),S(o)}}),G([s.routes(),s.allowedMethods()])}var e=N(p.intersection(p.intersection(L,R),p.object({SQLITE_FILENAME:p.string().default("indexer.db"),SENTRY_DSN:p.string().optional()}))),be=[e.RPC_WS_URL?ae(e.RPC_WS_URL):void 0,e.RPC_HTTP_URL?se(e.RPC_HTTP_URL):void 0].filter(de),U=re({transport:oe(be),pollingInterval:e.POLLING_INTERVAL}),ye=await U.getChainId(),b=ee(new te(e.SQLITE_FILENAME)),v=e.START_BLOCK;async function q(){try{return b.select().from(P).where(Z(P.chainId,ye)).all()[0]}catch{}}async function he(){return(await q())?.lastUpdatedBlockNumber??void 0}var m=await q();m&&(m.schemaVersion!=W?(console.log("schema version changed from",m.schemaVersion,"to",W,"recreating database"),X.truncateSync(e.SQLITE_FILENAME)):m.lastUpdatedBlockNumber!=null&&(console.log("resuming from block number",m.lastUpdatedBlockNumber+1n),v=m.lastUpdatedBlockNumber+1n));var{latestBlockNumber$:Se,storedBlockLogs$:ge}=await me({database:b,publicClient:U,followBlockTag:e.FOLLOW_BLOCK_TAG,startBlock:v,maxBlockRange:e.MAX_BLOCK_RANGE,address:e.STORE_ADDRESS}),g=!1;ue([Se,ge]).pipe(pe(([r,{blockNumber:s}])=>r===s),fe()).subscribe(()=>{g=!0,console.log("all caught up")});var c=new ne;e.SENTRY_DSN&&c.use(B(e.SENTRY_DSN));c.use(ie());c.use(C({isReady:()=>g}));c.use(I({isHealthy:()=>!0,isReady:()=>g,getLatestStoredBlockNumber:he,followBlockTag:e.FOLLOW_BLOCK_TAG}));c.use(E());c.use(Q(b));c.use(le({prefix:"/trpc",router:ce(),createContext:async()=>({queryAdapter:await D(b)})}));c.listen({host:e.HOST,port:e.PORT});console.log(`sqlite indexer frontend listening on http://${e.HOST}:${e.PORT}`);
2
+ import{a as S,c as _}from"../chunk-ZS3IQEZ4.js";import{a as B}from"../chunk-VCBWGHIO.js";import{a as R,b as L,c as N}from"../chunk-7B4KE2DO.js";import{a as C}from"../chunk-KDDXIBYJ.js";import{a as E}from"../chunk-OUZYPRYF.js";import{a as I}from"../chunk-WOLC7XUT.js";import"dotenv/config";import X from"node:fs";import{z as p}from"zod";import{eq as Z}from"drizzle-orm";import{drizzle as ee}from"drizzle-orm/better-sqlite3";import te from"better-sqlite3";import{createPublicClient as re,fallback as oe,webSocket as ae,http as se}from"viem";import ne from"koa";import ie from"@koa/cors";import{createKoaMiddleware as le}from"trpc-koa-adapter";import{createAppRouter as ce}from"@latticexyz/store-sync/trpc-indexer";import{chainState as P,schemaVersion as W,syncToSqlite as me}from"@latticexyz/store-sync/sqlite";import{asc as F,eq as O}from"drizzle-orm";import{buildTable as H,chainState as w,getTables as K}from"@latticexyz/store-sync/sqlite";import{getAddress as A}from"viem";import{decodeDynamicField as j}from"@latticexyz/protocol-parser/internal";function u(r,{chainId:s,address:t,filters:n=[]}){let i=r.select().from(w).where(O(w.chainId,s)).limit(1).all().find(()=>!0),o=Array.from(new Set(n.map(a=>a.tableId))),y=K(r).filter(a=>t==null||A(t)===A(a.address)).filter(a=>!o.length||o.includes(a.tableId)).map(a=>{let h=H(a),k=r.select().from(h).where(O(h.__isDeleted,!1)).orderBy(F(h.__lastUpdatedBlockNumber)).all(),M=n.length?k.filter(f=>{let l=j("bytes32[]",f.__key);return n.some(d=>d.tableId===a.tableId&&(d.key0==null||d.key0===l[0])&&(d.key1==null||d.key1===l[1]))}):k;return{...a,records:M.map(f=>({key:Object.fromEntries(Object.entries(a.keySchema).map(([l])=>[l,f[l]])),value:Object.fromEntries(Object.entries(a.valueSchema).map(([l])=>[l,f[l]]))}))}});return{blockNumber:i?.lastUpdatedBlockNumber??null,tables:y}}import{tablesWithRecordsToLogs as V}from"@latticexyz/store-sync";async function D(r){return{async getLogs(t){let{blockNumber:n,tables:i}=u(r,t),o=V(i);return{blockNumber:n??0n,logs:o}},async findAll(t){return u(r,t)}}}import{isDefined as de}from"@latticexyz/common/utils";import{combineLatest as ue,filter as pe,first as fe}from"rxjs";import x from"@koa/router";import G from"koa-compose";import{input as J}from"@latticexyz/store-sync/indexer-client";import{storeTables as $,tablesWithRecordsToLogs as z}from"@latticexyz/store-sync";import{createBenchmark as Y}from"@latticexyz/common";function Q(r){let s=new x;return s.get("/api/logs",_(),async t=>{let n=Y("sqlite:logs"),i;try{i=J.parse(typeof t.query.input=="string"?JSON.parse(t.query.input):{})}catch(o){t.status=400,t.body=JSON.stringify(o),S(o);return}try{i.filters=i.filters.length>0?[...i.filters,{tableId:$.Tables.tableId}]:[],n("parse config");let{blockNumber:o,tables:T}=u(r,i);n("query tables with records");let y=z(T);n("convert records to logs"),t.body=JSON.stringify({blockNumber:o?.toString()??"-1",logs:y}),t.status=200}catch(o){t.status=500,t.body=JSON.stringify(o),S(o)}}),G([s.routes(),s.allowedMethods()])}var e=N(p.intersection(p.intersection(L,R),p.object({SQLITE_FILENAME:p.string().default("indexer.db"),SENTRY_DSN:p.string().optional()}))),be=[e.RPC_WS_URL?ae(e.RPC_WS_URL):void 0,e.RPC_HTTP_URL?se(e.RPC_HTTP_URL):void 0].filter(de),U=re({transport:oe(be),pollingInterval:e.POLLING_INTERVAL}),ye=await U.getChainId(),b=ee(new te(e.SQLITE_FILENAME)),v=e.START_BLOCK;async function q(){try{return b.select().from(P).where(Z(P.chainId,ye)).all()[0]}catch{}}async function he(){return(await q())?.lastUpdatedBlockNumber??void 0}var m=await q();m&&(m.schemaVersion!=W?(console.log("schema version changed from",m.schemaVersion,"to",W,"recreating database"),X.truncateSync(e.SQLITE_FILENAME)):m.lastUpdatedBlockNumber!=null&&(console.log("resuming from block number",m.lastUpdatedBlockNumber+1n),v=m.lastUpdatedBlockNumber+1n));var{latestBlockNumber$:Se,storedBlockLogs$:ge}=await me({database:b,publicClient:U,followBlockTag:e.FOLLOW_BLOCK_TAG,startBlock:v,maxBlockRange:e.MAX_BLOCK_RANGE,address:e.STORE_ADDRESS}),g=!1;ue([Se,ge]).pipe(pe(([r,{blockNumber:s}])=>r===s),fe()).subscribe(()=>{g=!0,console.log("all caught up")});var c=new ne;e.SENTRY_DSN&&c.use(B(e.SENTRY_DSN));c.use(ie());c.use(C({isReady:()=>g}));c.use(I({isHealthy:()=>!0,isReady:()=>g,getLatestStoredBlockNumber:he,followBlockTag:e.FOLLOW_BLOCK_TAG}));c.use(E());c.use(Q(b));c.use(le({prefix:"/trpc",router:ce(),createContext:async()=>({queryAdapter:await D(b)})}));c.listen({host:e.HOST,port:e.PORT});console.log(`sqlite indexer frontend listening on http://${e.HOST}:${e.PORT}`);
3
3
  //# sourceMappingURL=sqlite-indexer.js.map
@@ -0,0 +1,7 @@
1
+ import{isHex as t}from"viem";import{z as e,ZodError as i}from"zod";var u=e.object({HOST:e.string().default("0.0.0.0"),PORT:e.coerce.number().positive().default(3001)});function s(n){return n===void 0||t(n)}var p=e.intersection(e.object({FOLLOW_BLOCK_TAG:e.enum(["latest","safe","finalized"]).default("safe"),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),STORE_ADDRESS:e.string().optional().transform(n=>n===""?void 0:n).refine(s)}),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 T(n){try{return n.parse(process.env)}catch(o){if(o instanceof i){let{...r}=o.format();console.error(`
2
+ Missing or invalid environment variables:
3
+
4
+ ${Object.keys(r).join(`
5
+ `)}
6
+ `),process.exit(1)}throw o}}export{u as a,p as b,T as c};
7
+ //# sourceMappingURL=chunk-7B4KE2DO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bin/parseEnv.ts"],"sourcesContent":["import { Hex, isHex } from \"viem\";\nimport { z, ZodError, ZodTypeAny } from \"zod\";\n\nexport const frontendEnvSchema = z.object({\n HOST: z.string().default(\"0.0.0.0\"),\n PORT: z.coerce.number().positive().default(3001),\n});\n\nfunction isHexOrUndefined(input: unknown): input is Hex | undefined {\n return input === undefined || isHex(input);\n}\n\nexport const indexerEnvSchema = z.intersection(\n z.object({\n FOLLOW_BLOCK_TAG: z.enum([\"latest\", \"safe\", \"finalized\"]).default(\"safe\"),\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 STORE_ADDRESS: z\n .string()\n .optional()\n .transform((input) => (input === \"\" ? undefined : input))\n .refine(isHexOrUndefined),\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>(envSchema: TSchema): z.infer<TSchema> {\n try {\n return envSchema.parse(process.env);\n } catch (error) {\n if (error instanceof ZodError) {\n const { ...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"],"mappings":"AAAA,OAAc,SAAAA,MAAa,OAC3B,OAAS,KAAAC,EAAG,YAAAC,MAA4B,MAEjC,IAAMC,EAAoBF,EAAE,OAAO,CACxC,KAAMA,EAAE,OAAO,EAAE,QAAQ,SAAS,EAClC,KAAMA,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CACjD,CAAC,EAED,SAASG,EAAiBC,EAA0C,CAClE,OAAOA,IAAU,QAAaL,EAAMK,CAAK,CAC3C,CAEO,IAAMC,EAAmBL,EAAE,aAChCA,EAAE,OAAO,CACP,iBAAkBA,EAAE,KAAK,CAAC,SAAU,OAAQ,WAAW,CAAC,EAAE,QAAQ,MAAM,EACxE,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,EAC3D,cAAeA,EACZ,OAAO,EACP,SAAS,EACT,UAAWI,GAAWA,IAAU,GAAK,OAAYA,CAAM,EACvD,OAAOD,CAAgB,CAC5B,CAAC,EACDH,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,SAASM,EAAqCC,EAAsC,CACzF,GAAI,CACF,OAAOA,EAAU,MAAM,QAAQ,GAAG,CACpC,OAASC,EAAP,CACA,GAAIA,aAAiBP,EAAU,CAC7B,GAAM,CAAE,GAAGQ,CAAe,EAAID,EAAM,OAAO,EAC3C,QAAQ,MAAM;AAAA;AAAA;AAAA,IAAoD,OAAO,KAAKC,CAAc,EAAE,KAAK;AAAA,GAAM;AAAA,CAAK,EAC9G,QAAQ,KAAK,CAAC,EAEhB,MAAMD,CACR,CACF","names":["isHex","z","ZodError","frontendEnvSchema","isHexOrUndefined","input","indexerEnvSchema","parseEnv","envSchema","error","invalidEnvVars"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/store-indexer",
3
- "version": "2.0.7-main-7dfb82f7",
3
+ "version": "2.0.8-account-kit-38709026",
4
4
  "description": "Minimal Typescript indexer for Store",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,11 +41,11 @@
41
41
  "trpc-koa-adapter": "^1.1.3",
42
42
  "viem": "2.9.20",
43
43
  "zod": "^3.21.4",
44
- "@latticexyz/block-logs-stream": "2.0.7-main-7dfb82f7",
45
- "@latticexyz/common": "2.0.7-main-7dfb82f7",
46
- "@latticexyz/protocol-parser": "2.0.7-main-7dfb82f7",
47
- "@latticexyz/store": "2.0.7-main-7dfb82f7",
48
- "@latticexyz/store-sync": "2.0.7-main-7dfb82f7"
44
+ "@latticexyz/common": "2.0.8-account-kit-38709026",
45
+ "@latticexyz/block-logs-stream": "2.0.8-account-kit-38709026",
46
+ "@latticexyz/protocol-parser": "2.0.8-account-kit-38709026",
47
+ "@latticexyz/store": "2.0.8-account-kit-38709026",
48
+ "@latticexyz/store-sync": "2.0.8-account-kit-38709026"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/accepts": "^1.3.7",
@@ -1,7 +0,0 @@
1
- import{isHex as r}from"viem";import{z as e,ZodError as i}from"zod";var f=e.object({HOST:e.string().default("0.0.0.0"),PORT:e.coerce.number().positive().default(3001)}),p=e.intersection(e.object({FOLLOW_BLOCK_TAG:e.enum(["latest","safe","finalized"]).default("safe"),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),STORE_ADDRESS:e.string().refine(r).optional()}),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 T(t){try{return t.parse(process.env)}catch(n){if(n instanceof i){let{...o}=n.format();console.error(`
2
- Missing or invalid environment variables:
3
-
4
- ${Object.keys(o).join(`
5
- `)}
6
- `),process.exit(1)}throw n}}export{f as a,p as b,T as c};
7
- //# sourceMappingURL=chunk-NHP2EYE7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bin/parseEnv.ts"],"sourcesContent":["import { isHex } from \"viem\";\nimport { z, ZodError, ZodTypeAny } from \"zod\";\n\nexport const frontendEnvSchema = z.object({\n HOST: z.string().default(\"0.0.0.0\"),\n PORT: z.coerce.number().positive().default(3001),\n});\n\nexport const indexerEnvSchema = z.intersection(\n z.object({\n FOLLOW_BLOCK_TAG: z.enum([\"latest\", \"safe\", \"finalized\"]).default(\"safe\"),\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 STORE_ADDRESS: z.string().refine(isHex).optional(),\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>(envSchema: TSchema): z.infer<TSchema> {\n try {\n return envSchema.parse(process.env);\n } catch (error) {\n if (error instanceof ZodError) {\n const { ...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"],"mappings":"AAAA,OAAS,SAAAA,MAAa,OACtB,OAAS,KAAAC,EAAG,YAAAC,MAA4B,MAEjC,IAAMC,EAAoBF,EAAE,OAAO,CACxC,KAAMA,EAAE,OAAO,EAAE,QAAQ,SAAS,EAClC,KAAMA,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,CACjD,CAAC,EAEYG,EAAmBH,EAAE,aAChCA,EAAE,OAAO,CACP,iBAAkBA,EAAE,KAAK,CAAC,SAAU,OAAQ,WAAW,CAAC,EAAE,QAAQ,MAAM,EACxE,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,EAC3D,cAAeA,EAAE,OAAO,EAAE,OAAOD,CAAK,EAAE,SAAS,CACnD,CAAC,EACDC,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,SAASI,EAAqCC,EAAsC,CACzF,GAAI,CACF,OAAOA,EAAU,MAAM,QAAQ,GAAG,CACpC,OAASC,EAAP,CACA,GAAIA,aAAiBL,EAAU,CAC7B,GAAM,CAAE,GAAGM,CAAe,EAAID,EAAM,OAAO,EAC3C,QAAQ,MAAM;AAAA;AAAA;AAAA,IAAoD,OAAO,KAAKC,CAAc,EAAE,KAAK;AAAA,GAAM;AAAA,CAAK,EAC9G,QAAQ,KAAK,CAAC,EAEhB,MAAMD,CACR,CACF","names":["isHex","z","ZodError","frontendEnvSchema","indexerEnvSchema","parseEnv","envSchema","error","invalidEnvVars"]}