@latticexyz/store-indexer 2.2.18-9fa07c8489f1fbf167d0db01cd9aaa645a29c8e2 → 2.2.18-c2ad22c7feb566e1731ff16e8be291746bdffb3e

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.
Files changed (54) hide show
  1. package/dist/bin/postgres-decoded-indexer.js +1 -92
  2. package/dist/bin/postgres-decoded-indexer.js.map +1 -1
  3. package/dist/bin/postgres-frontend.js +5 -258
  4. package/dist/bin/postgres-frontend.js.map +1 -1
  5. package/dist/bin/postgres-indexer.js +1 -106
  6. package/dist/bin/postgres-indexer.js.map +1 -1
  7. package/dist/bin/sqlite-indexer.js +1 -243
  8. package/dist/bin/sqlite-indexer.js.map +1 -1
  9. package/dist/chunk-7O2ZWWUX.js +2 -0
  10. package/dist/{chunk-SJLOWI5M.js.map → chunk-7O2ZWWUX.js.map} +1 -1
  11. package/dist/chunk-AYPBOJNL.js +2 -0
  12. package/dist/{chunk-GDNGJPVT.js.map → chunk-AYPBOJNL.js.map} +1 -1
  13. package/dist/chunk-ED45N3IT.js +2 -0
  14. package/dist/{chunk-O4XAWAXU.js.map → chunk-ED45N3IT.js.map} +1 -1
  15. package/dist/chunk-JDWVOODJ.js +2 -0
  16. package/dist/{chunk-R7UQFYRA.js.map → chunk-JDWVOODJ.js.map} +1 -1
  17. package/dist/chunk-O2SDU7EQ.js +7 -0
  18. package/dist/{chunk-L5CWEDU6.js.map → chunk-O2SDU7EQ.js.map} +1 -1
  19. package/dist/chunk-R7HX5BT2.js +2 -0
  20. package/dist/{chunk-66BWQNF7.js.map → chunk-R7HX5BT2.js.map} +1 -1
  21. package/dist/chunk-YQ7E5W26.js +2 -0
  22. package/dist/{chunk-CGE4ONKA.js.map → chunk-YQ7E5W26.js.map} +1 -1
  23. package/dist/healthcheck-57YETUEX.js +2 -0
  24. package/dist/helloWorld-4VT4FZ7F.js +2 -0
  25. package/dist/metrics-4BMCDEZZ.js +2 -0
  26. package/package.json +9 -17
  27. package/dist/bin/postgres-decoded-indexer.cjs +0 -322
  28. package/dist/bin/postgres-decoded-indexer.cjs.map +0 -1
  29. package/dist/bin/postgres-decoded-indexer.d.cts +0 -1
  30. package/dist/bin/postgres-frontend.cjs +0 -567
  31. package/dist/bin/postgres-frontend.cjs.map +0 -1
  32. package/dist/bin/postgres-frontend.d.cts +0 -1
  33. package/dist/bin/postgres-indexer.cjs +0 -368
  34. package/dist/bin/postgres-indexer.cjs.map +0 -1
  35. package/dist/bin/postgres-indexer.d.cts +0 -1
  36. package/dist/bin/sqlite-indexer.cjs +0 -567
  37. package/dist/bin/sqlite-indexer.cjs.map +0 -1
  38. package/dist/bin/sqlite-indexer.d.cts +0 -1
  39. package/dist/chunk-66BWQNF7.js +0 -38
  40. package/dist/chunk-CGE4ONKA.js +0 -44
  41. package/dist/chunk-GDNGJPVT.js +0 -16
  42. package/dist/chunk-L5CWEDU6.js +0 -53
  43. package/dist/chunk-O4XAWAXU.js +0 -72
  44. package/dist/chunk-R7UQFYRA.js +0 -99
  45. package/dist/chunk-SJLOWI5M.js +0 -31
  46. package/dist/healthcheck-2DQWYXPX.js +0 -7
  47. package/dist/helloWorld-6IXGINV6.js +0 -7
  48. package/dist/index.cjs +0 -2
  49. package/dist/index.d.cts +0 -2
  50. package/dist/metrics-HO5SO4EX.js +0 -7
  51. package/dist/metrics-HO5SO4EX.js.map +0 -1
  52. /package/dist/{healthcheck-2DQWYXPX.js.map → healthcheck-57YETUEX.js.map} +0 -0
  53. /package/dist/{helloWorld-6IXGINV6.js.map → helloWorld-4VT4FZ7F.js.map} +0 -0
  54. /package/dist/{index.cjs.map → metrics-4BMCDEZZ.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/koa-middleware/sentry.ts","../src/debug.ts"],"sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport { ProfilingIntegration } from \"@sentry/profiling-node\";\nimport { stripUrlQueryAndFragment } from \"@sentry/utils\";\nimport { debug } from \"../debug\";\nimport Koa from \"koa\";\nimport compose from \"koa-compose\";\n\nexport function errorHandler(): Koa.Middleware {\n return async function errorHandlerMiddleware(ctx, next) {\n try {\n await next();\n } catch (err) {\n Sentry.withScope((scope) => {\n scope.addEventProcessor((event) => {\n return Sentry.addRequestDataToEvent(event, ctx.request);\n });\n Sentry.captureException(err);\n });\n throw err;\n }\n };\n}\n\nexport function requestHandler(): Koa.Middleware {\n return async function requestHandlerMiddleware(ctx, next) {\n await Sentry.runWithAsyncContext(async () => {\n const hub = Sentry.getCurrentHub();\n hub.configureScope((scope) =>\n scope.addEventProcessor((event) =>\n Sentry.addRequestDataToEvent(event, ctx.request, {\n include: {\n user: false,\n },\n }),\n ),\n );\n await next();\n });\n };\n}\n\nexport function tracing(): Koa.Middleware {\n // creates a Sentry transaction per request\n return async function tracingMiddleware(ctx, next) {\n const reqMethod = (ctx.method || \"\").toUpperCase();\n const reqUrl = ctx.url && stripUrlQueryAndFragment(ctx.url);\n\n // Connect to trace of upstream app\n let traceparentData;\n if (ctx.request.get(\"sentry-trace\")) {\n traceparentData = Sentry.extractTraceparentData(ctx.request.get(\"sentry-trace\"));\n }\n\n const transaction = Sentry.startTransaction({\n name: `${reqMethod} ${reqUrl}`,\n op: \"http.server\",\n ...traceparentData,\n });\n\n ctx.__sentry_transaction = transaction;\n\n // We put the transaction on the scope so users can attach children to it\n Sentry.getCurrentHub().configureScope((scope) => {\n scope.setSpan(transaction);\n });\n\n ctx.res.on(\"finish\", () => {\n // Push `transaction.finish` to the next event loop so open spans have a chance to finish before the transaction closes\n setImmediate(() => {\n // If you're using koa router, set the matched route as transaction name\n if (ctx._matchedRoute) {\n const mountPath = ctx.mountPath || \"\";\n transaction.setName(`${reqMethod} ${mountPath}${ctx._matchedRoute}`);\n }\n\n transaction.setHttpStatus(ctx.status);\n transaction.finish();\n });\n });\n\n await next();\n };\n}\n\nexport function sentry(dsn: string): Koa.Middleware {\n debug(\"Initializing Sentry\");\n Sentry.init({\n dsn,\n integrations: [\n // Automatically instrument Node.js libraries and frameworks\n ...Sentry.autoDiscoverNodePerformanceMonitoringIntegrations(),\n new ProfilingIntegration(),\n ],\n // Performance Monitoring\n tracesSampleRate: 1.0,\n // Set sampling rate for profiling - this is relative to tracesSampleRate\n profilesSampleRate: 1.0,\n });\n\n return compose([errorHandler(), requestHandler(), tracing()]);\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"mud:store-indexer\");\nexport const error = createDebug(\"mud:store-indexer\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n"],"mappings":";AAAA,YAAY,YAAY;AACxB,SAAS,4BAA4B;AACrC,SAAS,gCAAgC;;;ACFzC,OAAO,iBAAiB;AAEjB,IAAM,QAAQ,YAAY,mBAAmB;AAC7C,IAAM,QAAQ,YAAY,mBAAmB;AAGpD,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO;AAGtC,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO;;;ADJtC,OAAO,aAAa;AAEb,SAAS,eAA+B;AAC7C,SAAO,eAAe,uBAAuB,KAAK,MAAM;AACtD,QAAI;AACF,YAAM,KAAK;AAAA,IACb,SAAS,KAAK;AACZ,MAAO,iBAAU,CAAC,UAAU;AAC1B,cAAM,kBAAkB,CAAC,UAAU;AACjC,iBAAc,6BAAsB,OAAO,IAAI,OAAO;AAAA,QACxD,CAAC;AACD,QAAO,wBAAiB,GAAG;AAAA,MAC7B,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,SAAS,iBAAiC;AAC/C,SAAO,eAAe,yBAAyB,KAAK,MAAM;AACxD,UAAa,2BAAoB,YAAY;AAC3C,YAAM,MAAa,qBAAc;AACjC,UAAI;AAAA,QAAe,CAAC,UAClB,MAAM;AAAA,UAAkB,CAAC,UAChB,6BAAsB,OAAO,IAAI,SAAS;AAAA,YAC/C,SAAS;AAAA,cACP,MAAM;AAAA,YACR;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH;AACF;AAEO,SAAS,UAA0B;AAExC,SAAO,eAAe,kBAAkB,KAAK,MAAM;AACjD,UAAM,aAAa,IAAI,UAAU,IAAI,YAAY;AACjD,UAAM,SAAS,IAAI,OAAO,yBAAyB,IAAI,GAAG;AAG1D,QAAI;AACJ,QAAI,IAAI,QAAQ,IAAI,cAAc,GAAG;AACnC,wBAAyB,8BAAuB,IAAI,QAAQ,IAAI,cAAc,CAAC;AAAA,IACjF;AAEA,UAAM,cAAqB,wBAAiB;AAAA,MAC1C,MAAM,GAAG,SAAS,IAAI,MAAM;AAAA,MAC5B,IAAI;AAAA,MACJ,GAAG;AAAA,IACL,CAAC;AAED,QAAI,uBAAuB;AAG3B,IAAO,qBAAc,EAAE,eAAe,CAAC,UAAU;AAC/C,YAAM,QAAQ,WAAW;AAAA,IAC3B,CAAC;AAED,QAAI,IAAI,GAAG,UAAU,MAAM;AAEzB,mBAAa,MAAM;AAEjB,YAAI,IAAI,eAAe;AACrB,gBAAM,YAAY,IAAI,aAAa;AACnC,sBAAY,QAAQ,GAAG,SAAS,IAAI,SAAS,GAAG,IAAI,aAAa,EAAE;AAAA,QACrE;AAEA,oBAAY,cAAc,IAAI,MAAM;AACpC,oBAAY,OAAO;AAAA,MACrB,CAAC;AAAA,IACH,CAAC;AAED,UAAM,KAAK;AAAA,EACb;AACF;AAEO,SAAS,OAAO,KAA6B;AAClD,QAAM,qBAAqB;AAC3B,EAAO,YAAK;AAAA,IACV;AAAA,IACA,cAAc;AAAA;AAAA,MAEZ,GAAU,yDAAkD;AAAA,MAC5D,IAAI,qBAAqB;AAAA,IAC3B;AAAA;AAAA,IAEA,kBAAkB;AAAA;AAAA,IAElB,oBAAoB;AAAA,EACtB,CAAC;AAED,SAAO,QAAQ,CAAC,aAAa,GAAG,eAAe,GAAG,QAAQ,CAAC,CAAC;AAC9D;","names":[]}
1
+ {"version":3,"sources":["../src/koa-middleware/sentry.ts","../src/debug.ts"],"sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport { ProfilingIntegration } from \"@sentry/profiling-node\";\nimport { stripUrlQueryAndFragment } from \"@sentry/utils\";\nimport { debug } from \"../debug\";\nimport Koa from \"koa\";\nimport compose from \"koa-compose\";\n\nexport function errorHandler(): Koa.Middleware {\n return async function errorHandlerMiddleware(ctx, next) {\n try {\n await next();\n } catch (err) {\n Sentry.withScope((scope) => {\n scope.addEventProcessor((event) => {\n return Sentry.addRequestDataToEvent(event, ctx.request);\n });\n Sentry.captureException(err);\n });\n throw err;\n }\n };\n}\n\nexport function requestHandler(): Koa.Middleware {\n return async function requestHandlerMiddleware(ctx, next) {\n await Sentry.runWithAsyncContext(async () => {\n const hub = Sentry.getCurrentHub();\n hub.configureScope((scope) =>\n scope.addEventProcessor((event) =>\n Sentry.addRequestDataToEvent(event, ctx.request, {\n include: {\n user: false,\n },\n }),\n ),\n );\n await next();\n });\n };\n}\n\nexport function tracing(): Koa.Middleware {\n // creates a Sentry transaction per request\n return async function tracingMiddleware(ctx, next) {\n const reqMethod = (ctx.method || \"\").toUpperCase();\n const reqUrl = ctx.url && stripUrlQueryAndFragment(ctx.url);\n\n // Connect to trace of upstream app\n let traceparentData;\n if (ctx.request.get(\"sentry-trace\")) {\n traceparentData = Sentry.extractTraceparentData(ctx.request.get(\"sentry-trace\"));\n }\n\n const transaction = Sentry.startTransaction({\n name: `${reqMethod} ${reqUrl}`,\n op: \"http.server\",\n ...traceparentData,\n });\n\n ctx.__sentry_transaction = transaction;\n\n // We put the transaction on the scope so users can attach children to it\n Sentry.getCurrentHub().configureScope((scope) => {\n scope.setSpan(transaction);\n });\n\n ctx.res.on(\"finish\", () => {\n // Push `transaction.finish` to the next event loop so open spans have a chance to finish before the transaction closes\n setImmediate(() => {\n // If you're using koa router, set the matched route as transaction name\n if (ctx._matchedRoute) {\n const mountPath = ctx.mountPath || \"\";\n transaction.setName(`${reqMethod} ${mountPath}${ctx._matchedRoute}`);\n }\n\n transaction.setHttpStatus(ctx.status);\n transaction.finish();\n });\n });\n\n await next();\n };\n}\n\nexport function sentry(dsn: string): Koa.Middleware {\n debug(\"Initializing Sentry\");\n Sentry.init({\n dsn,\n integrations: [\n // Automatically instrument Node.js libraries and frameworks\n ...Sentry.autoDiscoverNodePerformanceMonitoringIntegrations(),\n new ProfilingIntegration(),\n ],\n // Performance Monitoring\n tracesSampleRate: 1.0,\n // Set sampling rate for profiling - this is relative to tracesSampleRate\n profilesSampleRate: 1.0,\n });\n\n return compose([errorHandler(), requestHandler(), tracing()]);\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"mud:store-indexer\");\nexport const error = createDebug(\"mud:store-indexer\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n"],"mappings":"AAAA,UAAYA,MAAY,eACxB,OAAS,wBAAAC,MAA4B,yBACrC,OAAS,4BAAAC,MAAgC,gBCFzC,OAAOC,MAAiB,QAEjB,IAAMC,EAAQD,EAAY,mBAAmB,EACvCE,EAAQF,EAAY,mBAAmB,EAGpDC,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EAGtCC,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EDJtC,OAAOC,MAAa,cAEb,SAASC,GAA+B,CAC7C,OAAO,eAAsCC,EAAKC,EAAM,CACtD,GAAI,CACF,MAAMA,EAAK,CACb,OAASC,EAAK,CACZ,MAAO,YAAWC,GAAU,CAC1BA,EAAM,kBAAmBC,GACT,wBAAsBA,EAAOJ,EAAI,OAAO,CACvD,EACM,mBAAiBE,CAAG,CAC7B,CAAC,EACKA,CACR,CACF,CACF,CAEO,SAASG,GAAiC,CAC/C,OAAO,eAAwCL,EAAKC,EAAM,CACxD,MAAa,sBAAoB,SAAY,CACxB,gBAAc,EAC7B,eAAgBE,GAClBA,EAAM,kBAAmBC,GAChB,wBAAsBA,EAAOJ,EAAI,QAAS,CAC/C,QAAS,CACP,KAAM,EACR,CACF,CAAC,CACH,CACF,EACA,MAAMC,EAAK,CACb,CAAC,CACH,CACF,CAEO,SAASK,GAA0B,CAExC,OAAO,eAAiCN,EAAKC,EAAM,CACjD,IAAMM,GAAaP,EAAI,QAAU,IAAI,YAAY,EAC3CQ,EAASR,EAAI,KAAOS,EAAyBT,EAAI,GAAG,EAGtDU,EACAV,EAAI,QAAQ,IAAI,cAAc,IAChCU,EAAyB,yBAAuBV,EAAI,QAAQ,IAAI,cAAc,CAAC,GAGjF,IAAMW,EAAqB,mBAAiB,CAC1C,KAAM,GAAGJ,CAAS,IAAIC,CAAM,GAC5B,GAAI,cACJ,GAAGE,CACL,CAAC,EAEDV,EAAI,qBAAuBW,EAGpB,gBAAc,EAAE,eAAgBR,GAAU,CAC/CA,EAAM,QAAQQ,CAAW,CAC3B,CAAC,EAEDX,EAAI,IAAI,GAAG,SAAU,IAAM,CAEzB,aAAa,IAAM,CAEjB,GAAIA,EAAI,cAAe,CACrB,IAAMY,EAAYZ,EAAI,WAAa,GACnCW,EAAY,QAAQ,GAAGJ,CAAS,IAAIK,CAAS,GAAGZ,EAAI,aAAa,EAAE,CACrE,CAEAW,EAAY,cAAcX,EAAI,MAAM,EACpCW,EAAY,OAAO,CACrB,CAAC,CACH,CAAC,EAED,MAAMV,EAAK,CACb,CACF,CAEO,SAASY,EAAOC,EAA6B,CAClD,OAAAC,EAAM,qBAAqB,EACpB,OAAK,CACV,IAAAD,EACA,aAAc,CAEZ,GAAU,oDAAkD,EAC5D,IAAIE,CACN,EAEA,iBAAkB,EAElB,mBAAoB,CACtB,CAAC,EAEMlB,EAAQ,CAACC,EAAa,EAAGM,EAAe,EAAGC,EAAQ,CAAC,CAAC,CAC9D","names":["Sentry","ProfilingIntegration","stripUrlQueryAndFragment","createDebug","debug","error","compose","errorHandler","ctx","next","err","scope","event","requestHandler","tracing","reqMethod","reqUrl","stripUrlQueryAndFragment","traceparentData","transaction","mountPath","sentry","dsn","debug","ProfilingIntegration"]}
@@ -0,0 +1,7 @@
1
+ import{isHex as t}from"viem";import{z as e,ZodError as i}from"zod";var _=e.object({HOST:e.string().default("0.0.0.0"),PORT:e.coerce.number().positive().default(3001)}),T=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),INTERNAL__VALIDATE_BLOCK_RANGE:e.string().optional().transform(n=>n==="true"||n==="1")}),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 u(n){try{return n.parse(process.env)}catch(r){if(r instanceof i){let{...o}=r.format();console.error(`
2
+ Missing or invalid environment variables:
3
+
4
+ ${Object.keys(o).join(`
5
+ `)}
6
+ `),process.exit(1)}throw r}}function s(n){return n===void 0||t(n)}export{_ as a,T as b,u as c};
7
+ //# sourceMappingURL=chunk-O2SDU7EQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/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\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 INTERNAL__VALIDATE_BLOCK_RANGE: z\n .string()\n .optional()\n .transform((input) => input === \"true\" || input === \"1\"),\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\nfunction isHexOrUndefined(input: unknown): input is Hex | undefined {\n return input === undefined || isHex(input);\n}\n"],"mappings":";AAAA,SAAc,aAAa;AAC3B,SAAS,GAAG,gBAA4B;AAEjC,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,MAAM,EAAE,OAAO,EAAE,QAAQ,SAAS;AAAA,EAClC,MAAM,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AACjD,CAAC;AAEM,IAAM,mBAAmB,EAAE;AAAA,EAChC,EAAE,OAAO;AAAA,IACP,kBAAkB,EAAE,KAAK,CAAC,UAAU,QAAQ,WAAW,CAAC,EAAE,QAAQ,MAAM;AAAA,IACxE,aAAa,EAAE,OAAO,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE;AAAA,IACvD,iBAAiB,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,IAC3D,kBAAkB,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAI;AAAA,IAC3D,eAAe,EACZ,OAAO,EACP,SAAS,EACT,UAAU,CAAC,UAAW,UAAU,KAAK,SAAY,KAAM,EACvD,OAAO,gBAAgB;AAAA,IAC1B,gCAAgC,EAC7B,OAAO,EACP,SAAS,EACT,UAAU,CAAC,UAAU,UAAU,UAAU,UAAU,GAAG;AAAA,EAC3D,CAAC;AAAA,EACD,EAAE,MAAM;AAAA,IACN,EAAE,OAAO;AAAA,MACP,cAAc,EAAE,OAAO;AAAA,MACvB,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAClC,CAAC;AAAA,IACD,EAAE,OAAO;AAAA,MACP,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,MAClC,YAAY,EAAE,OAAO;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,SAAqC,WAAsC;AACzF,MAAI;AACF,WAAO,UAAU,MAAM,QAAQ,GAAG;AAAA,EACpC,SAAS,OAAO;AACd,QAAI,iBAAiB,UAAU;AAC7B,YAAM,EAAE,GAAG,eAAe,IAAI,MAAM,OAAO;AAC3C,cAAQ,MAAM;AAAA;AAAA;AAAA,IAAoD,OAAO,KAAK,cAAc,EAAE,KAAK,MAAM,CAAC;AAAA,CAAI;AAC9G,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,iBAAiB,OAA0C;AAClE,SAAO,UAAU,UAAa,MAAM,KAAK;AAC3C;","names":[]}
1
+ {"version":3,"sources":["../src/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\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 INTERNAL__VALIDATE_BLOCK_RANGE: z\n .string()\n .optional()\n .transform((input) => input === \"true\" || input === \"1\"),\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\nfunction isHexOrUndefined(input: unknown): input is Hex | undefined {\n return input === undefined || isHex(input);\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,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,EACZ,OAAO,EACP,SAAS,EACT,UAAWI,GAAWA,IAAU,GAAK,OAAYA,CAAM,EACvD,OAAOC,CAAgB,EAC1B,+BAAgCL,EAC7B,OAAO,EACP,SAAS,EACT,UAAWI,GAAUA,IAAU,QAAUA,IAAU,GAAG,CAC3D,CAAC,EACDJ,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,EAAO,CACd,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,CAAC;AAAA,CAAI,EAC9G,QAAQ,KAAK,CAAC,CAChB,CACA,MAAMD,CACR,CACF,CAEA,SAASH,EAAiBD,EAA0C,CAClE,OAAOA,IAAU,QAAaL,EAAMK,CAAK,CAC3C","names":["isHex","z","ZodError","frontendEnvSchema","indexerEnvSchema","input","isHexOrUndefined","parseEnv","envSchema","error","invalidEnvVars"]}
@@ -0,0 +1,2 @@
1
+ import{Stream as a}from"node:stream";import c from"accepts";import{createBrotliCompress as p,createDeflate as m,createGzip as f}from"node:zlib";import{includes as l}from"@latticexyz/common/utils";var d={br:p,gzip:f,deflate:m},i=Object.keys(d);function b(o,s){let e=0;return o.on("data",n=>{e+=n.length,e>s&&(e=0,o.flush())}),o}function E({flushThreshold:o=1024*4}={}){return async function(e,n){e.vary("Accept-Encoding"),await n();let r=c(e.req).encoding(i);if(!l(i,r))return;let t=b(d[r](),o);e.set("Content-Encoding",r),e.body=e.body instanceof a?e.body.pipe(t):t.end(e.body)}}export{E as a};
2
+ //# sourceMappingURL=chunk-R7HX5BT2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/koa-middleware/compress.ts"],"sourcesContent":["import { Middleware } from \"koa\";\nimport { Readable, Stream } from \"node:stream\";\nimport accepts from \"accepts\";\nimport { Zlib, createBrotliCompress, createDeflate, createGzip } from \"node:zlib\";\nimport { includes } from \"@latticexyz/common/utils\";\n\n// Loosely based on https://github.com/holic/koa-compress/blob/master/lib/index.js\n// with better handling of streams better with occasional flushing\n\nconst encodings = {\n br: createBrotliCompress,\n gzip: createGzip,\n deflate: createDeflate,\n} as const;\n\nconst encodingNames = Object.keys(encodings) as (keyof typeof encodings)[];\n\nfunction flushEvery<stream extends Zlib & Readable>(stream: stream, bytesThreshold: number): stream {\n let bytesSinceFlush = 0;\n stream.on(\"data\", (data) => {\n bytesSinceFlush += data.length;\n if (bytesSinceFlush > bytesThreshold) {\n bytesSinceFlush = 0;\n stream.flush();\n }\n });\n return stream;\n}\n\ntype CompressOptions = {\n flushThreshold?: number;\n};\n\nexport function compress({ flushThreshold = 1024 * 4 }: CompressOptions = {}): Middleware {\n return async function compressMiddleware(ctx, next) {\n ctx.vary(\"Accept-Encoding\");\n\n await next();\n\n const encoding = accepts(ctx.req).encoding(encodingNames);\n if (!includes(encodingNames, encoding)) return;\n\n const compressed = flushEvery(encodings[encoding](), flushThreshold);\n\n ctx.set(\"Content-Encoding\", encoding);\n ctx.body = ctx.body instanceof Stream ? ctx.body.pipe(compressed) : compressed.end(ctx.body);\n };\n}\n"],"mappings":";AACA,SAAmB,cAAc;AACjC,OAAO,aAAa;AACpB,SAAe,sBAAsB,eAAe,kBAAkB;AACtE,SAAS,gBAAgB;AAKzB,IAAM,YAAY;AAAA,EAChB,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AACX;AAEA,IAAM,gBAAgB,OAAO,KAAK,SAAS;AAE3C,SAAS,WAA2C,QAAgB,gBAAgC;AAClG,MAAI,kBAAkB;AACtB,SAAO,GAAG,QAAQ,CAAC,SAAS;AAC1B,uBAAmB,KAAK;AACxB,QAAI,kBAAkB,gBAAgB;AACpC,wBAAkB;AAClB,aAAO,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAMO,SAAS,SAAS,EAAE,iBAAiB,OAAO,EAAE,IAAqB,CAAC,GAAe;AACxF,SAAO,eAAe,mBAAmB,KAAK,MAAM;AAClD,QAAI,KAAK,iBAAiB;AAE1B,UAAM,KAAK;AAEX,UAAM,WAAW,QAAQ,IAAI,GAAG,EAAE,SAAS,aAAa;AACxD,QAAI,CAAC,SAAS,eAAe,QAAQ,EAAG;AAExC,UAAM,aAAa,WAAW,UAAU,QAAQ,EAAE,GAAG,cAAc;AAEnE,QAAI,IAAI,oBAAoB,QAAQ;AACpC,QAAI,OAAO,IAAI,gBAAgB,SAAS,IAAI,KAAK,KAAK,UAAU,IAAI,WAAW,IAAI,IAAI,IAAI;AAAA,EAC7F;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/koa-middleware/compress.ts"],"sourcesContent":["import { Middleware } from \"koa\";\nimport { Readable, Stream } from \"node:stream\";\nimport accepts from \"accepts\";\nimport { Zlib, createBrotliCompress, createDeflate, createGzip } from \"node:zlib\";\nimport { includes } from \"@latticexyz/common/utils\";\n\n// Loosely based on https://github.com/holic/koa-compress/blob/master/lib/index.js\n// with better handling of streams better with occasional flushing\n\nconst encodings = {\n br: createBrotliCompress,\n gzip: createGzip,\n deflate: createDeflate,\n} as const;\n\nconst encodingNames = Object.keys(encodings) as (keyof typeof encodings)[];\n\nfunction flushEvery<stream extends Zlib & Readable>(stream: stream, bytesThreshold: number): stream {\n let bytesSinceFlush = 0;\n stream.on(\"data\", (data) => {\n bytesSinceFlush += data.length;\n if (bytesSinceFlush > bytesThreshold) {\n bytesSinceFlush = 0;\n stream.flush();\n }\n });\n return stream;\n}\n\ntype CompressOptions = {\n flushThreshold?: number;\n};\n\nexport function compress({ flushThreshold = 1024 * 4 }: CompressOptions = {}): Middleware {\n return async function compressMiddleware(ctx, next) {\n ctx.vary(\"Accept-Encoding\");\n\n await next();\n\n const encoding = accepts(ctx.req).encoding(encodingNames);\n if (!includes(encodingNames, encoding)) return;\n\n const compressed = flushEvery(encodings[encoding](), flushThreshold);\n\n ctx.set(\"Content-Encoding\", encoding);\n ctx.body = ctx.body instanceof Stream ? ctx.body.pipe(compressed) : compressed.end(ctx.body);\n };\n}\n"],"mappings":"AACA,OAAmB,UAAAA,MAAc,cACjC,OAAOC,MAAa,UACpB,OAAe,wBAAAC,EAAsB,iBAAAC,EAAe,cAAAC,MAAkB,YACtE,OAAS,YAAAC,MAAgB,2BAKzB,IAAMC,EAAY,CAChB,GAAIJ,EACJ,KAAME,EACN,QAASD,CACX,EAEMI,EAAgB,OAAO,KAAKD,CAAS,EAE3C,SAASE,EAA2CC,EAAgBC,EAAgC,CAClG,IAAIC,EAAkB,EACtB,OAAAF,EAAO,GAAG,OAASG,GAAS,CAC1BD,GAAmBC,EAAK,OACpBD,EAAkBD,IACpBC,EAAkB,EAClBF,EAAO,MAAM,EAEjB,CAAC,EACMA,CACT,CAMO,SAASI,EAAS,CAAE,eAAAC,EAAiB,KAAO,CAAE,EAAqB,CAAC,EAAe,CACxF,OAAO,eAAkCC,EAAKC,EAAM,CAClDD,EAAI,KAAK,iBAAiB,EAE1B,MAAMC,EAAK,EAEX,IAAMC,EAAWhB,EAAQc,EAAI,GAAG,EAAE,SAASR,CAAa,EACxD,GAAI,CAACF,EAASE,EAAeU,CAAQ,EAAG,OAExC,IAAMC,EAAaV,EAAWF,EAAUW,CAAQ,EAAE,EAAGH,CAAc,EAEnEC,EAAI,IAAI,mBAAoBE,CAAQ,EACpCF,EAAI,KAAOA,EAAI,gBAAgBf,EAASe,EAAI,KAAK,KAAKG,CAAU,EAAIA,EAAW,IAAIH,EAAI,IAAI,CAC7F,CACF","names":["Stream","accepts","createBrotliCompress","createDeflate","createGzip","includes","encodings","encodingNames","flushEvery","stream","bytesThreshold","bytesSinceFlush","data","compress","flushThreshold","ctx","next","encoding","compressed"]}
@@ -0,0 +1,2 @@
1
+ import{createClient as n,fallback as o,http as e,webSocket as a}from"viem";import{isDefined as _}from"@latticexyz/common/utils";import{getChainId as c}from"viem/actions";async function f(t){if(t.INTERNAL__VALIDATE_BLOCK_RANGE){let i=t.RPC_HTTP_URL;if(!i)throw new Error("Must provide RPC_HTTP_URL when using INTERNAL__VALIDATE_BLOCK_RANGE.");return{internal_clientOptions:{chain:{id:await c(n({transport:e(i)})),name:"Unknown",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:[i]}}},pollingInterval:t.POLLING_INTERVAL,validateBlockRange:t.INTERNAL__VALIDATE_BLOCK_RANGE}}}let r=o([t.RPC_WS_URL?a(t.RPC_WS_URL):void 0,t.RPC_HTTP_URL?e(t.RPC_HTTP_URL):void 0].filter(_));return{publicClient:n({transport:r,pollingInterval:t.POLLING_INTERVAL})}}export{f as a};
2
+ //# sourceMappingURL=chunk-YQ7E5W26.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin/getClientOptions.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { indexerEnvSchema } from \"./parseEnv\";\nimport { GetRpcClientOptions } from \"@latticexyz/block-logs-stream\";\nimport { Chain, createClient, fallback, http, webSocket } from \"viem\";\nimport { isDefined } from \"@latticexyz/common/utils\";\nimport { getChainId } from \"viem/actions\";\n\nexport async function getClientOptions(env: z.infer<typeof indexerEnvSchema>): Promise<GetRpcClientOptions> {\n if (env.INTERNAL__VALIDATE_BLOCK_RANGE) {\n const rpcHttpUrl = env.RPC_HTTP_URL;\n if (!rpcHttpUrl) {\n throw new Error(\"Must provide RPC_HTTP_URL when using INTERNAL__VALIDATE_BLOCK_RANGE.\");\n }\n\n const chainId = await getChainId(createClient({ transport: http(rpcHttpUrl) }));\n\n // Mock a chain config so we can use in client options\n const chain = {\n id: chainId,\n name: \"Unknown\",\n nativeCurrency: { decimals: 18, name: \"Ether\", symbol: \"ETH\" },\n rpcUrls: { default: { http: [rpcHttpUrl] } },\n } satisfies Chain;\n\n return {\n internal_clientOptions: {\n chain,\n pollingInterval: env.POLLING_INTERVAL,\n validateBlockRange: env.INTERNAL__VALIDATE_BLOCK_RANGE,\n },\n };\n }\n\n const transport = fallback(\n [\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 );\n\n const publicClient = createClient({\n transport,\n pollingInterval: env.POLLING_INTERVAL,\n });\n\n return { publicClient };\n}\n"],"mappings":";AAGA,SAAgB,cAAc,UAAU,MAAM,iBAAiB;AAC/D,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAE3B,eAAsB,iBAAiB,KAAqE;AAC1G,MAAI,IAAI,gCAAgC;AACtC,UAAM,aAAa,IAAI;AACvB,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,sEAAsE;AAAA,IACxF;AAEA,UAAM,UAAU,MAAM,WAAW,aAAa,EAAE,WAAW,KAAK,UAAU,EAAE,CAAC,CAAC;AAG9E,UAAM,QAAQ;AAAA,MACZ,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,gBAAgB,EAAE,UAAU,IAAI,MAAM,SAAS,QAAQ,MAAM;AAAA,MAC7D,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE;AAAA,IAC7C;AAEA,WAAO;AAAA,MACL,wBAAwB;AAAA,QACtB;AAAA,QACA,iBAAiB,IAAI;AAAA,QACrB,oBAAoB,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB;AAAA;AAAA,MAEE,IAAI,aAAa,UAAU,IAAI,UAAU,IAAI;AAAA;AAAA,MAE7C,IAAI,eAAe,KAAK,IAAI,YAAY,IAAI;AAAA,IAC9C,EAAE,OAAO,SAAS;AAAA,EACpB;AAEA,QAAM,eAAe,aAAa;AAAA,IAChC;AAAA,IACA,iBAAiB,IAAI;AAAA,EACvB,CAAC;AAED,SAAO,EAAE,aAAa;AACxB;","names":[]}
1
+ {"version":3,"sources":["../src/bin/getClientOptions.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { indexerEnvSchema } from \"./parseEnv\";\nimport { GetRpcClientOptions } from \"@latticexyz/block-logs-stream\";\nimport { Chain, createClient, fallback, http, webSocket } from \"viem\";\nimport { isDefined } from \"@latticexyz/common/utils\";\nimport { getChainId } from \"viem/actions\";\n\nexport async function getClientOptions(env: z.infer<typeof indexerEnvSchema>): Promise<GetRpcClientOptions> {\n if (env.INTERNAL__VALIDATE_BLOCK_RANGE) {\n const rpcHttpUrl = env.RPC_HTTP_URL;\n if (!rpcHttpUrl) {\n throw new Error(\"Must provide RPC_HTTP_URL when using INTERNAL__VALIDATE_BLOCK_RANGE.\");\n }\n\n const chainId = await getChainId(createClient({ transport: http(rpcHttpUrl) }));\n\n // Mock a chain config so we can use in client options\n const chain = {\n id: chainId,\n name: \"Unknown\",\n nativeCurrency: { decimals: 18, name: \"Ether\", symbol: \"ETH\" },\n rpcUrls: { default: { http: [rpcHttpUrl] } },\n } satisfies Chain;\n\n return {\n internal_clientOptions: {\n chain,\n pollingInterval: env.POLLING_INTERVAL,\n validateBlockRange: env.INTERNAL__VALIDATE_BLOCK_RANGE,\n },\n };\n }\n\n const transport = fallback(\n [\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 );\n\n const publicClient = createClient({\n transport,\n pollingInterval: env.POLLING_INTERVAL,\n });\n\n return { publicClient };\n}\n"],"mappings":"AAGA,OAAgB,gBAAAA,EAAc,YAAAC,EAAU,QAAAC,EAAM,aAAAC,MAAiB,OAC/D,OAAS,aAAAC,MAAiB,2BAC1B,OAAS,cAAAC,MAAkB,eAE3B,eAAsBC,EAAiBC,EAAqE,CAC1G,GAAIA,EAAI,+BAAgC,CACtC,IAAMC,EAAaD,EAAI,aACvB,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,sEAAsE,EAaxF,MAAO,CACL,uBAAwB,CACtB,MATU,CACZ,GAJc,MAAMH,EAAWL,EAAa,CAAE,UAAWE,EAAKM,CAAU,CAAE,CAAC,CAAC,EAK5E,KAAM,UACN,eAAgB,CAAE,SAAU,GAAI,KAAM,QAAS,OAAQ,KAAM,EAC7D,QAAS,CAAE,QAAS,CAAE,KAAM,CAACA,CAAU,CAAE,CAAE,CAC7C,EAKI,gBAAiBD,EAAI,iBACrB,mBAAoBA,EAAI,8BAC1B,CACF,CACF,CAEA,IAAME,EAAYR,EAChB,CAEEM,EAAI,WAAaJ,EAAUI,EAAI,UAAU,EAAI,OAE7CA,EAAI,aAAeL,EAAKK,EAAI,YAAY,EAAI,MAC9C,EAAE,OAAOH,CAAS,CACpB,EAOA,MAAO,CAAE,aALYJ,EAAa,CAChC,UAAAS,EACA,gBAAiBF,EAAI,gBACvB,CAAC,CAEqB,CACxB","names":["createClient","fallback","http","webSocket","isDefined","getChainId","getClientOptions","env","rpcHttpUrl","transport"]}
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-7O2ZWWUX.js";export{a as healthcheck};
2
+ //# sourceMappingURL=healthcheck-57YETUEX.js.map
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-AYPBOJNL.js";export{a as helloWorld};
2
+ //# sourceMappingURL=helloWorld-4VT4FZ7F.js.map
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-ED45N3IT.js";export{a as metrics};
2
+ //# sourceMappingURL=metrics-4BMCDEZZ.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/store-indexer",
3
- "version": "2.2.18-9fa07c8489f1fbf167d0db01cd9aaa645a29c8e2",
3
+ "version": "2.2.18-c2ad22c7feb566e1731ff16e8be291746bdffb3e",
4
4
  "description": "Minimal Typescript indexer for Store",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,16 +10,7 @@
10
10
  "license": "MIT",
11
11
  "type": "module",
12
12
  "exports": {
13
- ".": {
14
- "import": {
15
- "import": "./dist/index.js",
16
- "types": "./dist/index.d.ts"
17
- },
18
- "require": {
19
- "require": "./dist/index.cjs",
20
- "types": "./dist/index.d.cts"
21
- }
22
- }
13
+ ".": "./dist/index.js"
23
14
  },
24
15
  "typesVersions": {
25
16
  "*": {
@@ -59,11 +50,11 @@
59
50
  "superjson": "^1.12.4",
60
51
  "trpc-koa-adapter": "^1.1.3",
61
52
  "zod": "3.23.8",
62
- "@latticexyz/block-logs-stream": "2.2.18-9fa07c8489f1fbf167d0db01cd9aaa645a29c8e2",
63
- "@latticexyz/common": "2.2.18-9fa07c8489f1fbf167d0db01cd9aaa645a29c8e2",
64
- "@latticexyz/protocol-parser": "2.2.18-9fa07c8489f1fbf167d0db01cd9aaa645a29c8e2",
65
- "@latticexyz/store": "2.2.18-9fa07c8489f1fbf167d0db01cd9aaa645a29c8e2",
66
- "@latticexyz/store-sync": "2.2.18-9fa07c8489f1fbf167d0db01cd9aaa645a29c8e2"
53
+ "@latticexyz/block-logs-stream": "2.2.18-c2ad22c7feb566e1731ff16e8be291746bdffb3e",
54
+ "@latticexyz/common": "2.2.18-c2ad22c7feb566e1731ff16e8be291746bdffb3e",
55
+ "@latticexyz/protocol-parser": "2.2.18-c2ad22c7feb566e1731ff16e8be291746bdffb3e",
56
+ "@latticexyz/store": "2.2.18-c2ad22c7feb566e1731ff16e8be291746bdffb3e",
57
+ "@latticexyz/store-sync": "2.2.18-c2ad22c7feb566e1731ff16e8be291746bdffb3e"
67
58
  },
68
59
  "devDependencies": {
69
60
  "@types/accepts": "^1.3.7",
@@ -74,7 +65,8 @@
74
65
  "@types/koa__cors": "^4.0.3",
75
66
  "@types/koa__router": "^12.0.4",
76
67
  "concurrently": "^8.2.2",
77
- "viem": "2.21.19"
68
+ "viem": "2.21.19",
69
+ "vitest": "0.34.6"
78
70
  },
79
71
  "peerDependencies": {
80
72
  "viem": "2.x"
@@ -1,322 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
- // If the importer is in node compatibility mode or this is not an ESM
19
- // file that has been converted to a CommonJS file using a Babel-
20
- // compatible transform (i.e. "__esModule" has not been set), then set
21
- // "default" to the CommonJS "module.exports" for node compatibility.
22
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
- mod
24
- ));
25
-
26
- // src/bin/postgres-decoded-indexer.ts
27
- var import_config = require("dotenv/config");
28
- var import_zod2 = require("zod");
29
- var import_drizzle_orm = require("drizzle-orm");
30
- var import_rxjs = require("rxjs");
31
- var import_postgres_js = require("drizzle-orm/postgres-js");
32
- var import_postgres = __toESM(require("postgres"), 1);
33
- var import_postgres_decoded = require("@latticexyz/store-sync/postgres-decoded");
34
- var import_store_sync = require("@latticexyz/store-sync");
35
-
36
- // src/bin/parseEnv.ts
37
- var import_viem = require("viem");
38
- var import_zod = require("zod");
39
- var frontendEnvSchema = import_zod.z.object({
40
- HOST: import_zod.z.string().default("0.0.0.0"),
41
- PORT: import_zod.z.coerce.number().positive().default(3001)
42
- });
43
- var indexerEnvSchema = import_zod.z.intersection(
44
- import_zod.z.object({
45
- FOLLOW_BLOCK_TAG: import_zod.z.enum(["latest", "safe", "finalized"]).default("safe"),
46
- START_BLOCK: import_zod.z.coerce.bigint().nonnegative().default(0n),
47
- MAX_BLOCK_RANGE: import_zod.z.coerce.bigint().positive().default(1000n),
48
- POLLING_INTERVAL: import_zod.z.coerce.number().positive().default(1e3),
49
- STORE_ADDRESS: import_zod.z.string().optional().transform((input) => input === "" ? void 0 : input).refine(isHexOrUndefined),
50
- INTERNAL__VALIDATE_BLOCK_RANGE: import_zod.z.string().optional().transform((input) => input === "true" || input === "1")
51
- }),
52
- import_zod.z.union([
53
- import_zod.z.object({
54
- RPC_HTTP_URL: import_zod.z.string(),
55
- RPC_WS_URL: import_zod.z.string().optional()
56
- }),
57
- import_zod.z.object({
58
- RPC_HTTP_URL: import_zod.z.string().optional(),
59
- RPC_WS_URL: import_zod.z.string()
60
- })
61
- ])
62
- );
63
- function parseEnv(envSchema) {
64
- try {
65
- return envSchema.parse(process.env);
66
- } catch (error2) {
67
- if (error2 instanceof import_zod.ZodError) {
68
- const { ...invalidEnvVars } = error2.format();
69
- console.error(`
70
- Missing or invalid environment variables:
71
-
72
- ${Object.keys(invalidEnvVars).join("\n ")}
73
- `);
74
- process.exit(1);
75
- }
76
- throw error2;
77
- }
78
- }
79
- function isHexOrUndefined(input) {
80
- return input === void 0 || (0, import_viem.isHex)(input);
81
- }
82
-
83
- // src/koa-middleware/sentry.ts
84
- var Sentry = __toESM(require("@sentry/node"), 1);
85
- var import_profiling_node = require("@sentry/profiling-node");
86
- var import_utils = require("@sentry/utils");
87
-
88
- // src/debug.ts
89
- var import_debug = __toESM(require("debug"), 1);
90
- var debug = (0, import_debug.default)("mud:store-indexer");
91
- var error = (0, import_debug.default)("mud:store-indexer");
92
- debug.log = console.debug.bind(console);
93
- error.log = console.error.bind(console);
94
-
95
- // src/koa-middleware/sentry.ts
96
- var import_koa_compose = __toESM(require("koa-compose"), 1);
97
- function errorHandler() {
98
- return async function errorHandlerMiddleware(ctx, next) {
99
- try {
100
- await next();
101
- } catch (err) {
102
- Sentry.withScope((scope) => {
103
- scope.addEventProcessor((event) => {
104
- return Sentry.addRequestDataToEvent(event, ctx.request);
105
- });
106
- Sentry.captureException(err);
107
- });
108
- throw err;
109
- }
110
- };
111
- }
112
- function requestHandler() {
113
- return async function requestHandlerMiddleware(ctx, next) {
114
- await Sentry.runWithAsyncContext(async () => {
115
- const hub = Sentry.getCurrentHub();
116
- hub.configureScope(
117
- (scope) => scope.addEventProcessor(
118
- (event) => Sentry.addRequestDataToEvent(event, ctx.request, {
119
- include: {
120
- user: false
121
- }
122
- })
123
- )
124
- );
125
- await next();
126
- });
127
- };
128
- }
129
- function tracing() {
130
- return async function tracingMiddleware(ctx, next) {
131
- const reqMethod = (ctx.method || "").toUpperCase();
132
- const reqUrl = ctx.url && (0, import_utils.stripUrlQueryAndFragment)(ctx.url);
133
- let traceparentData;
134
- if (ctx.request.get("sentry-trace")) {
135
- traceparentData = Sentry.extractTraceparentData(ctx.request.get("sentry-trace"));
136
- }
137
- const transaction = Sentry.startTransaction({
138
- name: `${reqMethod} ${reqUrl}`,
139
- op: "http.server",
140
- ...traceparentData
141
- });
142
- ctx.__sentry_transaction = transaction;
143
- Sentry.getCurrentHub().configureScope((scope) => {
144
- scope.setSpan(transaction);
145
- });
146
- ctx.res.on("finish", () => {
147
- setImmediate(() => {
148
- if (ctx._matchedRoute) {
149
- const mountPath = ctx.mountPath || "";
150
- transaction.setName(`${reqMethod} ${mountPath}${ctx._matchedRoute}`);
151
- }
152
- transaction.setHttpStatus(ctx.status);
153
- transaction.finish();
154
- });
155
- });
156
- await next();
157
- };
158
- }
159
- function sentry(dsn) {
160
- debug("Initializing Sentry");
161
- Sentry.init({
162
- dsn,
163
- integrations: [
164
- // Automatically instrument Node.js libraries and frameworks
165
- ...Sentry.autoDiscoverNodePerformanceMonitoringIntegrations(),
166
- new import_profiling_node.ProfilingIntegration()
167
- ],
168
- // Performance Monitoring
169
- tracesSampleRate: 1,
170
- // Set sampling rate for profiling - this is relative to tracesSampleRate
171
- profilesSampleRate: 1
172
- });
173
- return (0, import_koa_compose.default)([errorHandler(), requestHandler(), tracing()]);
174
- }
175
-
176
- // src/koa-middleware/healthcheck.ts
177
- function healthcheck({ isHealthy, isReady } = {}) {
178
- return async function healthcheckMiddleware(ctx, next) {
179
- if (ctx.path === "/healthz") {
180
- if (isHealthy == null || isHealthy()) {
181
- ctx.status = 200;
182
- ctx.body = "healthy";
183
- } else {
184
- ctx.status = 503;
185
- ctx.body = "not healthy";
186
- }
187
- return;
188
- }
189
- if (ctx.path === "/readyz") {
190
- if (isReady == null || isReady()) {
191
- ctx.status = 200;
192
- ctx.body = "ready";
193
- } else {
194
- ctx.status = 503;
195
- ctx.body = "not ready";
196
- }
197
- return;
198
- }
199
- await next();
200
- };
201
- }
202
-
203
- // src/koa-middleware/helloWorld.ts
204
- function helloWorld() {
205
- return async function helloWorldMiddleware(ctx, next) {
206
- if (ctx.path === "/") {
207
- ctx.status = 200;
208
- ctx.body = "emit HelloWorld();";
209
- return;
210
- }
211
- await next();
212
- };
213
- }
214
-
215
- // src/bin/getClientOptions.ts
216
- var import_viem2 = require("viem");
217
- var import_utils2 = require("@latticexyz/common/utils");
218
- var import_actions = require("viem/actions");
219
- async function getClientOptions(env) {
220
- if (env.INTERNAL__VALIDATE_BLOCK_RANGE) {
221
- const rpcHttpUrl = env.RPC_HTTP_URL;
222
- if (!rpcHttpUrl) {
223
- throw new Error("Must provide RPC_HTTP_URL when using INTERNAL__VALIDATE_BLOCK_RANGE.");
224
- }
225
- const chainId = await (0, import_actions.getChainId)((0, import_viem2.createClient)({ transport: (0, import_viem2.http)(rpcHttpUrl) }));
226
- const chain = {
227
- id: chainId,
228
- name: "Unknown",
229
- nativeCurrency: { decimals: 18, name: "Ether", symbol: "ETH" },
230
- rpcUrls: { default: { http: [rpcHttpUrl] } }
231
- };
232
- return {
233
- internal_clientOptions: {
234
- chain,
235
- pollingInterval: env.POLLING_INTERVAL,
236
- validateBlockRange: env.INTERNAL__VALIDATE_BLOCK_RANGE
237
- }
238
- };
239
- }
240
- const transport = (0, import_viem2.fallback)(
241
- [
242
- // prefer WS when specified
243
- env.RPC_WS_URL ? (0, import_viem2.webSocket)(env.RPC_WS_URL) : void 0,
244
- // otherwise use or fallback to HTTP
245
- env.RPC_HTTP_URL ? (0, import_viem2.http)(env.RPC_HTTP_URL) : void 0
246
- ].filter(import_utils2.isDefined)
247
- );
248
- const publicClient = (0, import_viem2.createClient)({
249
- transport,
250
- pollingInterval: env.POLLING_INTERVAL
251
- });
252
- return { publicClient };
253
- }
254
-
255
- // src/bin/postgres-decoded-indexer.ts
256
- var import_actions2 = require("viem/actions");
257
- var import_block_logs_stream = require("@latticexyz/block-logs-stream");
258
- (async () => {
259
- const env = parseEnv(
260
- import_zod2.z.intersection(
261
- indexerEnvSchema,
262
- import_zod2.z.object({
263
- DATABASE_URL: import_zod2.z.string(),
264
- HEALTHCHECK_HOST: import_zod2.z.string().optional(),
265
- HEALTHCHECK_PORT: import_zod2.z.coerce.number().optional(),
266
- SENTRY_DSN: import_zod2.z.string().optional()
267
- })
268
- )
269
- );
270
- const clientOptions = await getClientOptions(env);
271
- const chainId = await (0, import_actions2.getChainId)((0, import_block_logs_stream.getRpcClient)(clientOptions));
272
- const database = (0, import_postgres_js.drizzle)((0, import_postgres.default)(env.DATABASE_URL, { prepare: false }));
273
- const { storageAdapter, tables } = await (0, import_postgres_decoded.createStorageAdapter)({ ...clientOptions, database });
274
- let startBlock = env.START_BLOCK;
275
- try {
276
- const chainState = await database.select().from(tables.configTable).where((0, import_drizzle_orm.eq)(tables.configTable.chainId, chainId)).limit(1).execute().then((rows) => rows.find(() => true));
277
- if (chainState?.blockNumber != null) {
278
- startBlock = chainState.blockNumber + 1n;
279
- console.log("resuming from block number", startBlock);
280
- }
281
- } catch (error2) {
282
- }
283
- const { latestBlockNumber$, storedBlockLogs$ } = await (0, import_store_sync.createStoreSync)({
284
- ...clientOptions,
285
- storageAdapter,
286
- followBlockTag: env.FOLLOW_BLOCK_TAG,
287
- startBlock,
288
- maxBlockRange: env.MAX_BLOCK_RANGE,
289
- address: env.STORE_ADDRESS
290
- });
291
- storedBlockLogs$.subscribe();
292
- let isCaughtUp = false;
293
- (0, import_rxjs.combineLatest)([latestBlockNumber$, storedBlockLogs$]).pipe(
294
- (0, import_rxjs.filter)(
295
- ([latestBlockNumber, { blockNumber: lastBlockNumberProcessed }]) => latestBlockNumber === lastBlockNumberProcessed
296
- ),
297
- (0, import_rxjs.first)()
298
- ).subscribe(() => {
299
- isCaughtUp = true;
300
- console.log("all caught up");
301
- });
302
- if (env.HEALTHCHECK_HOST != null || env.HEALTHCHECK_PORT != null) {
303
- const { default: Koa } = await import("koa");
304
- const { default: cors } = await import("@koa/cors");
305
- const server = new Koa();
306
- if (env.SENTRY_DSN) {
307
- server.use(sentry(env.SENTRY_DSN));
308
- }
309
- server.use(cors());
310
- server.use(
311
- healthcheck({
312
- isReady: () => isCaughtUp
313
- })
314
- );
315
- server.use(helloWorld());
316
- server.listen({ host: env.HEALTHCHECK_HOST, port: env.HEALTHCHECK_PORT });
317
- console.log(
318
- `postgres indexer healthcheck server listening on http://${env.HEALTHCHECK_HOST}:${env.HEALTHCHECK_PORT}`
319
- );
320
- }
321
- })();
322
- //# sourceMappingURL=postgres-decoded-indexer.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/bin/postgres-decoded-indexer.ts","../../src/bin/parseEnv.ts","../../src/koa-middleware/sentry.ts","../../src/debug.ts","../../src/koa-middleware/healthcheck.ts","../../src/koa-middleware/helloWorld.ts","../../src/bin/getClientOptions.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { z } from \"zod\";\nimport { eq } from \"drizzle-orm\";\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\";\nimport { sentry } from \"../koa-middleware/sentry\";\nimport { healthcheck } from \"../koa-middleware/healthcheck\";\nimport { helloWorld } from \"../koa-middleware/helloWorld\";\nimport { getClientOptions } from \"./getClientOptions\";\nimport { getChainId } from \"viem/actions\";\nimport { getRpcClient } from \"@latticexyz/block-logs-stream\";\n\n// Workaround for:\n// Top-level await is currently not supported with the \"cjs\" output format\n(async (): Promise<void> => {\n const 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 SENTRY_DSN: z.string().optional(),\n }),\n ),\n );\n\n const clientOptions = await getClientOptions(env);\n\n const chainId = await getChainId(getRpcClient(clientOptions));\n const database = drizzle(postgres(env.DATABASE_URL, { prepare: false }));\n\n const { storageAdapter, tables } = await createStorageAdapter({ ...clientOptions, database });\n\n let 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\n try {\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\n const { latestBlockNumber$, storedBlockLogs$ } = await createStoreSync({\n ...clientOptions,\n storageAdapter,\n followBlockTag: env.FOLLOW_BLOCK_TAG,\n startBlock,\n maxBlockRange: env.MAX_BLOCK_RANGE,\n address: env.STORE_ADDRESS,\n });\n\n storedBlockLogs$.subscribe();\n\n let isCaughtUp = false;\n combineLatest([latestBlockNumber$, storedBlockLogs$])\n .pipe(\n filter(\n ([latestBlockNumber, { blockNumber: lastBlockNumberProcessed }]) =>\n latestBlockNumber === lastBlockNumberProcessed,\n ),\n first(),\n )\n .subscribe(() => {\n isCaughtUp = true;\n console.log(\"all caught up\");\n });\n\n if (env.HEALTHCHECK_HOST != null || env.HEALTHCHECK_PORT != null) {\n const { default: Koa } = await import(\"koa\");\n const { default: cors } = await import(\"@koa/cors\");\n\n const server = new Koa();\n\n if (env.SENTRY_DSN) {\n server.use(sentry(env.SENTRY_DSN));\n }\n\n server.use(cors());\n server.use(\n healthcheck({\n isReady: () => isCaughtUp,\n }),\n );\n server.use(helloWorld());\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})();\n","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\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 INTERNAL__VALIDATE_BLOCK_RANGE: z\n .string()\n .optional()\n .transform((input) => input === \"true\" || input === \"1\"),\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\nfunction isHexOrUndefined(input: unknown): input is Hex | undefined {\n return input === undefined || isHex(input);\n}\n","import * as Sentry from \"@sentry/node\";\nimport { ProfilingIntegration } from \"@sentry/profiling-node\";\nimport { stripUrlQueryAndFragment } from \"@sentry/utils\";\nimport { debug } from \"../debug\";\nimport Koa from \"koa\";\nimport compose from \"koa-compose\";\n\nexport function errorHandler(): Koa.Middleware {\n return async function errorHandlerMiddleware(ctx, next) {\n try {\n await next();\n } catch (err) {\n Sentry.withScope((scope) => {\n scope.addEventProcessor((event) => {\n return Sentry.addRequestDataToEvent(event, ctx.request);\n });\n Sentry.captureException(err);\n });\n throw err;\n }\n };\n}\n\nexport function requestHandler(): Koa.Middleware {\n return async function requestHandlerMiddleware(ctx, next) {\n await Sentry.runWithAsyncContext(async () => {\n const hub = Sentry.getCurrentHub();\n hub.configureScope((scope) =>\n scope.addEventProcessor((event) =>\n Sentry.addRequestDataToEvent(event, ctx.request, {\n include: {\n user: false,\n },\n }),\n ),\n );\n await next();\n });\n };\n}\n\nexport function tracing(): Koa.Middleware {\n // creates a Sentry transaction per request\n return async function tracingMiddleware(ctx, next) {\n const reqMethod = (ctx.method || \"\").toUpperCase();\n const reqUrl = ctx.url && stripUrlQueryAndFragment(ctx.url);\n\n // Connect to trace of upstream app\n let traceparentData;\n if (ctx.request.get(\"sentry-trace\")) {\n traceparentData = Sentry.extractTraceparentData(ctx.request.get(\"sentry-trace\"));\n }\n\n const transaction = Sentry.startTransaction({\n name: `${reqMethod} ${reqUrl}`,\n op: \"http.server\",\n ...traceparentData,\n });\n\n ctx.__sentry_transaction = transaction;\n\n // We put the transaction on the scope so users can attach children to it\n Sentry.getCurrentHub().configureScope((scope) => {\n scope.setSpan(transaction);\n });\n\n ctx.res.on(\"finish\", () => {\n // Push `transaction.finish` to the next event loop so open spans have a chance to finish before the transaction closes\n setImmediate(() => {\n // If you're using koa router, set the matched route as transaction name\n if (ctx._matchedRoute) {\n const mountPath = ctx.mountPath || \"\";\n transaction.setName(`${reqMethod} ${mountPath}${ctx._matchedRoute}`);\n }\n\n transaction.setHttpStatus(ctx.status);\n transaction.finish();\n });\n });\n\n await next();\n };\n}\n\nexport function sentry(dsn: string): Koa.Middleware {\n debug(\"Initializing Sentry\");\n Sentry.init({\n dsn,\n integrations: [\n // Automatically instrument Node.js libraries and frameworks\n ...Sentry.autoDiscoverNodePerformanceMonitoringIntegrations(),\n new ProfilingIntegration(),\n ],\n // Performance Monitoring\n tracesSampleRate: 1.0,\n // Set sampling rate for profiling - this is relative to tracesSampleRate\n profilesSampleRate: 1.0,\n });\n\n return compose([errorHandler(), requestHandler(), tracing()]);\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"mud:store-indexer\");\nexport const error = createDebug(\"mud:store-indexer\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { Middleware } from \"koa\";\n\ntype HealthcheckOptions = {\n isHealthy?: () => boolean;\n isReady?: () => boolean;\n};\n\n/**\n * Middleware to add Kubernetes healthcheck endpoints\n */\nexport function healthcheck({ isHealthy, isReady }: HealthcheckOptions = {}): Middleware {\n return async function healthcheckMiddleware(ctx, next): Promise<void> {\n if (ctx.path === \"/healthz\") {\n if (isHealthy == null || isHealthy()) {\n ctx.status = 200;\n ctx.body = \"healthy\";\n } else {\n ctx.status = 503;\n ctx.body = \"not healthy\";\n }\n return;\n }\n\n if (ctx.path === \"/readyz\") {\n if (isReady == null || isReady()) {\n ctx.status = 200;\n ctx.body = \"ready\";\n } else {\n ctx.status = 503;\n ctx.body = \"not ready\";\n }\n return;\n }\n\n await next();\n };\n}\n","import { Middleware } from \"koa\";\n\nexport function helloWorld(): Middleware {\n return async function helloWorldMiddleware(ctx, next): Promise<void> {\n if (ctx.path === \"/\") {\n ctx.status = 200;\n ctx.body = \"emit HelloWorld();\";\n return;\n }\n await next();\n };\n}\n","import { z } from \"zod\";\nimport { indexerEnvSchema } from \"./parseEnv\";\nimport { GetRpcClientOptions } from \"@latticexyz/block-logs-stream\";\nimport { Chain, createClient, fallback, http, webSocket } from \"viem\";\nimport { isDefined } from \"@latticexyz/common/utils\";\nimport { getChainId } from \"viem/actions\";\n\nexport async function getClientOptions(env: z.infer<typeof indexerEnvSchema>): Promise<GetRpcClientOptions> {\n if (env.INTERNAL__VALIDATE_BLOCK_RANGE) {\n const rpcHttpUrl = env.RPC_HTTP_URL;\n if (!rpcHttpUrl) {\n throw new Error(\"Must provide RPC_HTTP_URL when using INTERNAL__VALIDATE_BLOCK_RANGE.\");\n }\n\n const chainId = await getChainId(createClient({ transport: http(rpcHttpUrl) }));\n\n // Mock a chain config so we can use in client options\n const chain = {\n id: chainId,\n name: \"Unknown\",\n nativeCurrency: { decimals: 18, name: \"Ether\", symbol: \"ETH\" },\n rpcUrls: { default: { http: [rpcHttpUrl] } },\n } satisfies Chain;\n\n return {\n internal_clientOptions: {\n chain,\n pollingInterval: env.POLLING_INTERVAL,\n validateBlockRange: env.INTERNAL__VALIDATE_BLOCK_RANGE,\n },\n };\n }\n\n const transport = fallback(\n [\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 );\n\n const publicClient = createClient({\n transport,\n pollingInterval: env.POLLING_INTERVAL,\n });\n\n return { publicClient };\n}\n"],"mappings":"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","names":["import_zod","error","createDebug","compose","import_viem","import_utils","import_actions","postgres","error"]}
@@ -1 +0,0 @@
1
- #!/usr/bin/env node