@latticexyz/store-indexer 2.2.18-2762cefb93e90632e0b25e11d0238b5998852f8b → 2.2.18-318924725246340b208d3fbee8793314686f1759

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 (39) hide show
  1. package/dist/bin/postgres-decoded-indexer.js +90 -1
  2. package/dist/bin/postgres-decoded-indexer.js.map +1 -1
  3. package/dist/bin/postgres-frontend.js +256 -5
  4. package/dist/bin/postgres-frontend.js.map +1 -1
  5. package/dist/bin/postgres-indexer.js +104 -1
  6. package/dist/bin/postgres-indexer.js.map +1 -1
  7. package/dist/bin/sqlite-indexer.js +241 -1
  8. package/dist/bin/sqlite-indexer.js.map +1 -1
  9. package/dist/chunk-7E7HV6WZ.js +38 -0
  10. package/dist/{chunk-R7HX5BT2.js.map → chunk-7E7HV6WZ.js.map} +1 -1
  11. package/dist/chunk-ALQNRR4A.js +99 -0
  12. package/dist/{chunk-JDWVOODJ.js.map → chunk-ALQNRR4A.js.map} +1 -1
  13. package/dist/chunk-DRMERYGH.js +53 -0
  14. package/dist/{chunk-O2SDU7EQ.js.map → chunk-DRMERYGH.js.map} +1 -1
  15. package/dist/chunk-H3UGY6JG.js +72 -0
  16. package/dist/{chunk-ED45N3IT.js.map → chunk-H3UGY6JG.js.map} +1 -1
  17. package/dist/chunk-JSDKBP77.js +16 -0
  18. package/dist/{chunk-AYPBOJNL.js.map → chunk-JSDKBP77.js.map} +1 -1
  19. package/dist/chunk-MGRTFMMG.js +44 -0
  20. package/dist/{chunk-YQ7E5W26.js.map → chunk-MGRTFMMG.js.map} +1 -1
  21. package/dist/chunk-YBZTPLEM.js +31 -0
  22. package/dist/{chunk-7O2ZWWUX.js.map → chunk-YBZTPLEM.js.map} +1 -1
  23. package/dist/healthcheck-I7MZ4QZU.js +7 -0
  24. package/dist/helloWorld-SETMCIYX.js +7 -0
  25. package/dist/metrics-UNOJV54N.js +7 -0
  26. package/package.json +7 -7
  27. package/dist/chunk-7O2ZWWUX.js +0 -2
  28. package/dist/chunk-AYPBOJNL.js +0 -2
  29. package/dist/chunk-ED45N3IT.js +0 -2
  30. package/dist/chunk-JDWVOODJ.js +0 -2
  31. package/dist/chunk-O2SDU7EQ.js +0 -7
  32. package/dist/chunk-R7HX5BT2.js +0 -2
  33. package/dist/chunk-YQ7E5W26.js +0 -2
  34. package/dist/healthcheck-57YETUEX.js +0 -2
  35. package/dist/helloWorld-4VT4FZ7F.js +0 -2
  36. package/dist/metrics-4BMCDEZZ.js +0 -2
  37. /package/dist/{healthcheck-57YETUEX.js.map → healthcheck-I7MZ4QZU.js.map} +0 -0
  38. /package/dist/{helloWorld-4VT4FZ7F.js.map → helloWorld-SETMCIYX.js.map} +0 -0
  39. /package/dist/{metrics-4BMCDEZZ.js.map → metrics-UNOJV54N.js.map} +0 -0
@@ -0,0 +1,53 @@
1
+ // src/bin/parseEnv.ts
2
+ import { isHex } from "viem";
3
+ import { z, ZodError } from "zod";
4
+ var frontendEnvSchema = z.object({
5
+ HOST: z.string().default("0.0.0.0"),
6
+ PORT: z.coerce.number().positive().default(3001)
7
+ });
8
+ var indexerEnvSchema = z.intersection(
9
+ z.object({
10
+ FOLLOW_BLOCK_TAG: z.enum(["latest", "safe", "finalized"]).default("safe"),
11
+ START_BLOCK: z.coerce.bigint().nonnegative().default(0n),
12
+ MAX_BLOCK_RANGE: z.coerce.bigint().positive().default(1000n),
13
+ POLLING_INTERVAL: z.coerce.number().positive().default(1e3),
14
+ STORE_ADDRESS: z.string().optional().transform((input) => input === "" ? void 0 : input).refine(isHexOrUndefined),
15
+ INTERNAL__VALIDATE_BLOCK_RANGE: z.string().optional().transform((input) => input === "true" || input === "1")
16
+ }),
17
+ z.union([
18
+ z.object({
19
+ RPC_HTTP_URL: z.string(),
20
+ RPC_WS_URL: z.string().optional()
21
+ }),
22
+ z.object({
23
+ RPC_HTTP_URL: z.string().optional(),
24
+ RPC_WS_URL: z.string()
25
+ })
26
+ ])
27
+ );
28
+ function parseEnv(envSchema) {
29
+ try {
30
+ return envSchema.parse(process.env);
31
+ } catch (error) {
32
+ if (error instanceof ZodError) {
33
+ const { ...invalidEnvVars } = error.format();
34
+ console.error(`
35
+ Missing or invalid environment variables:
36
+
37
+ ${Object.keys(invalidEnvVars).join("\n ")}
38
+ `);
39
+ process.exit(1);
40
+ }
41
+ throw error;
42
+ }
43
+ }
44
+ function isHexOrUndefined(input) {
45
+ return input === void 0 || isHex(input);
46
+ }
47
+
48
+ export {
49
+ frontendEnvSchema,
50
+ indexerEnvSchema,
51
+ parseEnv
52
+ };
53
+ //# sourceMappingURL=chunk-DRMERYGH.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,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"]}
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":[]}
@@ -0,0 +1,72 @@
1
+ // src/koa-middleware/metrics.ts
2
+ import promClient from "prom-client";
3
+ function metrics({
4
+ isHealthy,
5
+ isReady,
6
+ getLatestStoredBlockNumber,
7
+ getDistanceFromFollowBlock,
8
+ followBlockTag
9
+ } = {}) {
10
+ promClient.collectDefaultMetrics();
11
+ if (isHealthy != null) {
12
+ new promClient.Gauge({
13
+ name: "health_status",
14
+ help: "Health status (0 = unhealthy, 1 = healthy)",
15
+ collect() {
16
+ this.set(Number(isHealthy()));
17
+ }
18
+ });
19
+ }
20
+ if (isReady != null) {
21
+ new promClient.Gauge({
22
+ name: "readiness_status",
23
+ help: "Readiness status (whether the service is ready to receive requests, 0 = not ready, 1 = ready)",
24
+ collect() {
25
+ this.set(Number(isReady()));
26
+ }
27
+ });
28
+ }
29
+ if (getLatestStoredBlockNumber != null) {
30
+ new promClient.Gauge({
31
+ name: "latest_stored_block_number",
32
+ help: "Latest block number stored in the database",
33
+ async collect() {
34
+ this.set(Number(await getLatestStoredBlockNumber()));
35
+ }
36
+ });
37
+ }
38
+ if (followBlockTag != null) {
39
+ const blockTagGauge = new promClient.Gauge({
40
+ name: "follow_block_tag",
41
+ help: "Block tag the indexer is following (0 = finalized, 1 = safe, 2 = latest)"
42
+ });
43
+ const blockTagToValue = {
44
+ finalized: 0,
45
+ safe: 1,
46
+ latest: 2
47
+ };
48
+ blockTagGauge.set(blockTagToValue[followBlockTag]);
49
+ }
50
+ if (getDistanceFromFollowBlock != null) {
51
+ new promClient.Gauge({
52
+ name: "distance_from_follow_block",
53
+ help: "Block distance from the block tag this the indexer is following",
54
+ async collect() {
55
+ this.set(Number(await getDistanceFromFollowBlock()));
56
+ }
57
+ });
58
+ }
59
+ return async function metricsMiddleware(ctx, next) {
60
+ if (ctx.path === "/metrics") {
61
+ ctx.status = 200;
62
+ ctx.body = await promClient.register.metrics();
63
+ return;
64
+ }
65
+ await next();
66
+ };
67
+ }
68
+
69
+ export {
70
+ metrics
71
+ };
72
+ //# sourceMappingURL=chunk-H3UGY6JG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/koa-middleware/metrics.ts"],"sourcesContent":["import { Middleware } from \"koa\";\nimport promClient from \"prom-client\";\n\ntype MetricsOptions = {\n isHealthy?: () => boolean;\n isReady?: () => boolean;\n getLatestStoredBlockNumber?: () => Promise<bigint | undefined>;\n getDistanceFromFollowBlock?: () => Promise<bigint>;\n followBlockTag?: \"latest\" | \"safe\" | \"finalized\";\n};\n\n/**\n * Middleware to add Prometheus metrics endpoints\n */\nexport function metrics({\n isHealthy,\n isReady,\n getLatestStoredBlockNumber,\n getDistanceFromFollowBlock,\n followBlockTag,\n}: MetricsOptions = {}): Middleware {\n promClient.collectDefaultMetrics();\n if (isHealthy != null) {\n new promClient.Gauge({\n name: \"health_status\",\n help: \"Health status (0 = unhealthy, 1 = healthy)\",\n collect(): void {\n this.set(Number(isHealthy()));\n },\n });\n }\n\n if (isReady != null) {\n new promClient.Gauge({\n name: \"readiness_status\",\n help: \"Readiness status (whether the service is ready to receive requests, 0 = not ready, 1 = ready)\",\n collect(): void {\n this.set(Number(isReady()));\n },\n });\n }\n\n if (getLatestStoredBlockNumber != null) {\n new promClient.Gauge({\n name: \"latest_stored_block_number\",\n help: \"Latest block number stored in the database\",\n async collect(): Promise<void> {\n this.set(Number(await getLatestStoredBlockNumber()));\n },\n });\n }\n\n if (followBlockTag != null) {\n const blockTagGauge = new promClient.Gauge({\n name: \"follow_block_tag\",\n help: \"Block tag the indexer is following (0 = finalized, 1 = safe, 2 = latest)\",\n });\n const blockTagToValue = {\n finalized: 0,\n safe: 1,\n latest: 2,\n };\n blockTagGauge.set(blockTagToValue[followBlockTag]);\n }\n\n if (getDistanceFromFollowBlock != null) {\n new promClient.Gauge({\n name: \"distance_from_follow_block\",\n help: \"Block distance from the block tag this the indexer is following\",\n async collect(): Promise<void> {\n this.set(Number(await getDistanceFromFollowBlock()));\n },\n });\n }\n\n return async function metricsMiddleware(ctx, next): Promise<void> {\n if (ctx.path === \"/metrics\") {\n ctx.status = 200;\n ctx.body = await promClient.register.metrics();\n return;\n }\n\n await next();\n };\n}\n"],"mappings":"AACA,OAAOA,MAAgB,cAahB,SAASC,EAAQ,CACtB,UAAAC,EACA,QAAAC,EACA,2BAAAC,EACA,2BAAAC,EACA,eAAAC,CACF,EAAoB,CAAC,EAAe,CAgClC,GA/BAN,EAAW,sBAAsB,EAC7BE,GAAa,MACf,IAAIF,EAAW,MAAM,CACnB,KAAM,gBACN,KAAM,6CACN,SAAgB,CACd,KAAK,IAAI,OAAOE,EAAU,CAAC,CAAC,CAC9B,CACF,CAAC,EAGCC,GAAW,MACb,IAAIH,EAAW,MAAM,CACnB,KAAM,mBACN,KAAM,gGACN,SAAgB,CACd,KAAK,IAAI,OAAOG,EAAQ,CAAC,CAAC,CAC5B,CACF,CAAC,EAGCC,GAA8B,MAChC,IAAIJ,EAAW,MAAM,CACnB,KAAM,6BACN,KAAM,6CACN,MAAM,SAAyB,CAC7B,KAAK,IAAI,OAAO,MAAMI,EAA2B,CAAC,CAAC,CACrD,CACF,CAAC,EAGCE,GAAkB,KAAM,CAC1B,IAAMC,EAAgB,IAAIP,EAAW,MAAM,CACzC,KAAM,mBACN,KAAM,0EACR,CAAC,EACKQ,EAAkB,CACtB,UAAW,EACX,KAAM,EACN,OAAQ,CACV,EACAD,EAAc,IAAIC,EAAgBF,CAAc,CAAC,CACnD,CAEA,OAAID,GAA8B,MAChC,IAAIL,EAAW,MAAM,CACnB,KAAM,6BACN,KAAM,kEACN,MAAM,SAAyB,CAC7B,KAAK,IAAI,OAAO,MAAMK,EAA2B,CAAC,CAAC,CACrD,CACF,CAAC,EAGI,eAAiCI,EAAKC,EAAqB,CAChE,GAAID,EAAI,OAAS,WAAY,CAC3BA,EAAI,OAAS,IACbA,EAAI,KAAO,MAAMT,EAAW,SAAS,QAAQ,EAC7C,MACF,CAEA,MAAMU,EAAK,CACb,CACF","names":["promClient","metrics","isHealthy","isReady","getLatestStoredBlockNumber","getDistanceFromFollowBlock","followBlockTag","blockTagGauge","blockTagToValue","ctx","next"]}
1
+ {"version":3,"sources":["../src/koa-middleware/metrics.ts"],"sourcesContent":["import { Middleware } from \"koa\";\nimport promClient from \"prom-client\";\n\ntype MetricsOptions = {\n isHealthy?: () => boolean;\n isReady?: () => boolean;\n getLatestStoredBlockNumber?: () => Promise<bigint | undefined>;\n getDistanceFromFollowBlock?: () => Promise<bigint>;\n followBlockTag?: \"latest\" | \"safe\" | \"finalized\";\n};\n\n/**\n * Middleware to add Prometheus metrics endpoints\n */\nexport function metrics({\n isHealthy,\n isReady,\n getLatestStoredBlockNumber,\n getDistanceFromFollowBlock,\n followBlockTag,\n}: MetricsOptions = {}): Middleware {\n promClient.collectDefaultMetrics();\n if (isHealthy != null) {\n new promClient.Gauge({\n name: \"health_status\",\n help: \"Health status (0 = unhealthy, 1 = healthy)\",\n collect(): void {\n this.set(Number(isHealthy()));\n },\n });\n }\n\n if (isReady != null) {\n new promClient.Gauge({\n name: \"readiness_status\",\n help: \"Readiness status (whether the service is ready to receive requests, 0 = not ready, 1 = ready)\",\n collect(): void {\n this.set(Number(isReady()));\n },\n });\n }\n\n if (getLatestStoredBlockNumber != null) {\n new promClient.Gauge({\n name: \"latest_stored_block_number\",\n help: \"Latest block number stored in the database\",\n async collect(): Promise<void> {\n this.set(Number(await getLatestStoredBlockNumber()));\n },\n });\n }\n\n if (followBlockTag != null) {\n const blockTagGauge = new promClient.Gauge({\n name: \"follow_block_tag\",\n help: \"Block tag the indexer is following (0 = finalized, 1 = safe, 2 = latest)\",\n });\n const blockTagToValue = {\n finalized: 0,\n safe: 1,\n latest: 2,\n };\n blockTagGauge.set(blockTagToValue[followBlockTag]);\n }\n\n if (getDistanceFromFollowBlock != null) {\n new promClient.Gauge({\n name: \"distance_from_follow_block\",\n help: \"Block distance from the block tag this the indexer is following\",\n async collect(): Promise<void> {\n this.set(Number(await getDistanceFromFollowBlock()));\n },\n });\n }\n\n return async function metricsMiddleware(ctx, next): Promise<void> {\n if (ctx.path === \"/metrics\") {\n ctx.status = 200;\n ctx.body = await promClient.register.metrics();\n return;\n }\n\n await next();\n };\n}\n"],"mappings":";AACA,OAAO,gBAAgB;AAahB,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAoB,CAAC,GAAe;AAClC,aAAW,sBAAsB;AACjC,MAAI,aAAa,MAAM;AACrB,QAAI,WAAW,MAAM;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAgB;AACd,aAAK,IAAI,OAAO,UAAU,CAAC,CAAC;AAAA,MAC9B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,WAAW,MAAM;AACnB,QAAI,WAAW,MAAM;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAgB;AACd,aAAK,IAAI,OAAO,QAAQ,CAAC,CAAC;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,8BAA8B,MAAM;AACtC,QAAI,WAAW,MAAM;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,UAAyB;AAC7B,aAAK,IAAI,OAAO,MAAM,2BAA2B,CAAC,CAAC;AAAA,MACrD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,kBAAkB,MAAM;AAC1B,UAAM,gBAAgB,IAAI,WAAW,MAAM;AAAA,MACzC,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AACD,UAAM,kBAAkB;AAAA,MACtB,WAAW;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AACA,kBAAc,IAAI,gBAAgB,cAAc,CAAC;AAAA,EACnD;AAEA,MAAI,8BAA8B,MAAM;AACtC,QAAI,WAAW,MAAM;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,UAAyB;AAC7B,aAAK,IAAI,OAAO,MAAM,2BAA2B,CAAC,CAAC;AAAA,MACrD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,eAAe,kBAAkB,KAAK,MAAqB;AAChE,QAAI,IAAI,SAAS,YAAY;AAC3B,UAAI,SAAS;AACb,UAAI,OAAO,MAAM,WAAW,SAAS,QAAQ;AAC7C;AAAA,IACF;AAEA,UAAM,KAAK;AAAA,EACb;AACF;","names":[]}
@@ -0,0 +1,16 @@
1
+ // src/koa-middleware/helloWorld.ts
2
+ function helloWorld() {
3
+ return async function helloWorldMiddleware(ctx, next) {
4
+ if (ctx.path === "/") {
5
+ ctx.status = 200;
6
+ ctx.body = "emit HelloWorld();";
7
+ return;
8
+ }
9
+ await next();
10
+ };
11
+ }
12
+
13
+ export {
14
+ helloWorld
15
+ };
16
+ //# sourceMappingURL=chunk-JSDKBP77.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/koa-middleware/helloWorld.ts"],"sourcesContent":["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"],"mappings":"AAEO,SAASA,GAAyB,CACvC,OAAO,eAAoCC,EAAKC,EAAqB,CACnE,GAAID,EAAI,OAAS,IAAK,CACpBA,EAAI,OAAS,IACbA,EAAI,KAAO,qBACX,MACF,CACA,MAAMC,EAAK,CACb,CACF","names":["helloWorld","ctx","next"]}
1
+ {"version":3,"sources":["../src/koa-middleware/helloWorld.ts"],"sourcesContent":["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"],"mappings":";AAEO,SAAS,aAAyB;AACvC,SAAO,eAAe,qBAAqB,KAAK,MAAqB;AACnE,QAAI,IAAI,SAAS,KAAK;AACpB,UAAI,SAAS;AACb,UAAI,OAAO;AACX;AAAA,IACF;AACA,UAAM,KAAK;AAAA,EACb;AACF;","names":[]}
@@ -0,0 +1,44 @@
1
+ // src/bin/getClientOptions.ts
2
+ import { createClient, fallback, http, webSocket } from "viem";
3
+ import { isDefined } from "@latticexyz/common/utils";
4
+ import { getChainId } from "viem/actions";
5
+ async function getClientOptions(env) {
6
+ if (env.INTERNAL__VALIDATE_BLOCK_RANGE) {
7
+ const rpcHttpUrl = env.RPC_HTTP_URL;
8
+ if (!rpcHttpUrl) {
9
+ throw new Error("Must provide RPC_HTTP_URL when using INTERNAL__VALIDATE_BLOCK_RANGE.");
10
+ }
11
+ const chainId = await getChainId(createClient({ transport: http(rpcHttpUrl) }));
12
+ const chain = {
13
+ id: chainId,
14
+ name: "Unknown",
15
+ nativeCurrency: { decimals: 18, name: "Ether", symbol: "ETH" },
16
+ rpcUrls: { default: { http: [rpcHttpUrl] } }
17
+ };
18
+ return {
19
+ internal_clientOptions: {
20
+ chain,
21
+ pollingInterval: env.POLLING_INTERVAL,
22
+ validateBlockRange: env.INTERNAL__VALIDATE_BLOCK_RANGE
23
+ }
24
+ };
25
+ }
26
+ const transport = fallback(
27
+ [
28
+ // prefer WS when specified
29
+ env.RPC_WS_URL ? webSocket(env.RPC_WS_URL) : void 0,
30
+ // otherwise use or fallback to HTTP
31
+ env.RPC_HTTP_URL ? http(env.RPC_HTTP_URL) : void 0
32
+ ].filter(isDefined)
33
+ );
34
+ const publicClient = createClient({
35
+ transport,
36
+ pollingInterval: env.POLLING_INTERVAL
37
+ });
38
+ return { publicClient };
39
+ }
40
+
41
+ export {
42
+ getClientOptions
43
+ };
44
+ //# sourceMappingURL=chunk-MGRTFMMG.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,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"]}
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":[]}
@@ -0,0 +1,31 @@
1
+ // src/koa-middleware/healthcheck.ts
2
+ function healthcheck({ isHealthy, isReady } = {}) {
3
+ return async function healthcheckMiddleware(ctx, next) {
4
+ if (ctx.path === "/healthz") {
5
+ if (isHealthy == null || isHealthy()) {
6
+ ctx.status = 200;
7
+ ctx.body = "healthy";
8
+ } else {
9
+ ctx.status = 503;
10
+ ctx.body = "not healthy";
11
+ }
12
+ return;
13
+ }
14
+ if (ctx.path === "/readyz") {
15
+ if (isReady == null || isReady()) {
16
+ ctx.status = 200;
17
+ ctx.body = "ready";
18
+ } else {
19
+ ctx.status = 503;
20
+ ctx.body = "not ready";
21
+ }
22
+ return;
23
+ }
24
+ await next();
25
+ };
26
+ }
27
+
28
+ export {
29
+ healthcheck
30
+ };
31
+ //# sourceMappingURL=chunk-YBZTPLEM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/koa-middleware/healthcheck.ts"],"sourcesContent":["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"],"mappings":"AAUO,SAASA,EAAY,CAAE,UAAAC,EAAW,QAAAC,CAAQ,EAAwB,CAAC,EAAe,CACvF,OAAO,eAAqCC,EAAKC,EAAqB,CACpE,GAAID,EAAI,OAAS,WAAY,CACvBF,GAAa,MAAQA,EAAU,GACjCE,EAAI,OAAS,IACbA,EAAI,KAAO,YAEXA,EAAI,OAAS,IACbA,EAAI,KAAO,eAEb,MACF,CAEA,GAAIA,EAAI,OAAS,UAAW,CACtBD,GAAW,MAAQA,EAAQ,GAC7BC,EAAI,OAAS,IACbA,EAAI,KAAO,UAEXA,EAAI,OAAS,IACbA,EAAI,KAAO,aAEb,MACF,CAEA,MAAMC,EAAK,CACb,CACF","names":["healthcheck","isHealthy","isReady","ctx","next"]}
1
+ {"version":3,"sources":["../src/koa-middleware/healthcheck.ts"],"sourcesContent":["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"],"mappings":";AAUO,SAAS,YAAY,EAAE,WAAW,QAAQ,IAAwB,CAAC,GAAe;AACvF,SAAO,eAAe,sBAAsB,KAAK,MAAqB;AACpE,QAAI,IAAI,SAAS,YAAY;AAC3B,UAAI,aAAa,QAAQ,UAAU,GAAG;AACpC,YAAI,SAAS;AACb,YAAI,OAAO;AAAA,MACb,OAAO;AACL,YAAI,SAAS;AACb,YAAI,OAAO;AAAA,MACb;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,WAAW;AAC1B,UAAI,WAAW,QAAQ,QAAQ,GAAG;AAChC,YAAI,SAAS;AACb,YAAI,OAAO;AAAA,MACb,OAAO;AACL,YAAI,SAAS;AACb,YAAI,OAAO;AAAA,MACb;AACA;AAAA,IACF;AAEA,UAAM,KAAK;AAAA,EACb;AACF;","names":[]}
@@ -0,0 +1,7 @@
1
+ import {
2
+ healthcheck
3
+ } from "./chunk-YBZTPLEM.js";
4
+ export {
5
+ healthcheck
6
+ };
7
+ //# sourceMappingURL=healthcheck-I7MZ4QZU.js.map
@@ -0,0 +1,7 @@
1
+ import {
2
+ helloWorld
3
+ } from "./chunk-JSDKBP77.js";
4
+ export {
5
+ helloWorld
6
+ };
7
+ //# sourceMappingURL=helloWorld-SETMCIYX.js.map
@@ -0,0 +1,7 @@
1
+ import {
2
+ metrics
3
+ } from "./chunk-H3UGY6JG.js";
4
+ export {
5
+ metrics
6
+ };
7
+ //# sourceMappingURL=metrics-UNOJV54N.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/store-indexer",
3
- "version": "2.2.18-2762cefb93e90632e0b25e11d0238b5998852f8b",
3
+ "version": "2.2.18-318924725246340b208d3fbee8793314686f1759",
4
4
  "description": "Minimal Typescript indexer for Store",
5
5
  "repository": {
6
6
  "type": "git",
@@ -50,11 +50,11 @@
50
50
  "superjson": "^1.12.4",
51
51
  "trpc-koa-adapter": "^1.1.3",
52
52
  "zod": "3.23.8",
53
- "@latticexyz/block-logs-stream": "2.2.18-2762cefb93e90632e0b25e11d0238b5998852f8b",
54
- "@latticexyz/common": "2.2.18-2762cefb93e90632e0b25e11d0238b5998852f8b",
55
- "@latticexyz/protocol-parser": "2.2.18-2762cefb93e90632e0b25e11d0238b5998852f8b",
56
- "@latticexyz/store": "2.2.18-2762cefb93e90632e0b25e11d0238b5998852f8b",
57
- "@latticexyz/store-sync": "2.2.18-2762cefb93e90632e0b25e11d0238b5998852f8b"
53
+ "@latticexyz/block-logs-stream": "2.2.18-318924725246340b208d3fbee8793314686f1759",
54
+ "@latticexyz/common": "2.2.18-318924725246340b208d3fbee8793314686f1759",
55
+ "@latticexyz/protocol-parser": "2.2.18-318924725246340b208d3fbee8793314686f1759",
56
+ "@latticexyz/store": "2.2.18-318924725246340b208d3fbee8793314686f1759",
57
+ "@latticexyz/store-sync": "2.2.18-318924725246340b208d3fbee8793314686f1759"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/accepts": "^1.3.7",
@@ -81,7 +81,7 @@
81
81
  "dev": "tsup --watch",
82
82
  "lint": "eslint .",
83
83
  "start:postgres": "concurrently -n indexer,frontend -c cyan,magenta 'tsx src/bin/postgres-indexer' 'tsx src/bin/postgres-frontend'",
84
- "start:postgres-decoded": "tsx src/bin/postgres-decoded-indexer",
84
+ "start:postgres-decoded": "concurrently -n indexer,frontend -c cyan,magenta 'tsx src/bin/postgres-decoded-indexer' 'tsx src/bin/postgres-frontend'",
85
85
  "start:postgres-decoded:local": "DATABASE_URL=postgres://127.0.0.1/postgres RPC_HTTP_URL=http://127.0.0.1:8545 pnpm start:postgres-decoded",
86
86
  "start:postgres-decoded:testnet": "DATABASE_URL=postgres://127.0.0.1/postgres RPC_HTTP_URL=https://rpc.holesky.redstone.xyz pnpm start:postgres-decoded",
87
87
  "start:postgres:local": "DATABASE_URL=postgres://127.0.0.1/postgres RPC_HTTP_URL=http://127.0.0.1:8545 pnpm start:postgres",
@@ -1,2 +0,0 @@
1
- function l({isHealthy:a,isReady:t}={}){return async function(e,o){if(e.path==="/healthz"){a==null||a()?(e.status=200,e.body="healthy"):(e.status=503,e.body="not healthy");return}if(e.path==="/readyz"){t==null||t()?(e.status=200,e.body="ready"):(e.status=503,e.body="not ready");return}await o()}}export{l as a};
2
- //# sourceMappingURL=chunk-7O2ZWWUX.js.map
@@ -1,2 +0,0 @@
1
- function l(){return async function(e,o){if(e.path==="/"){e.status=200,e.body="emit HelloWorld();";return}await o()}}export{l as a};
2
- //# sourceMappingURL=chunk-AYPBOJNL.js.map
@@ -1,2 +0,0 @@
1
- import e from"prom-client";function u({isHealthy:i,isReady:a,getLatestStoredBlockNumber:s,getDistanceFromFollowBlock:l,followBlockTag:o}={}){if(e.collectDefaultMetrics(),i!=null&&new e.Gauge({name:"health_status",help:"Health status (0 = unhealthy, 1 = healthy)",collect(){this.set(Number(i()))}}),a!=null&&new e.Gauge({name:"readiness_status",help:"Readiness status (whether the service is ready to receive requests, 0 = not ready, 1 = ready)",collect(){this.set(Number(a()))}}),s!=null&&new e.Gauge({name:"latest_stored_block_number",help:"Latest block number stored in the database",async collect(){this.set(Number(await s()))}}),o!=null){let n=new e.Gauge({name:"follow_block_tag",help:"Block tag the indexer is following (0 = finalized, 1 = safe, 2 = latest)"}),t={finalized:0,safe:1,latest:2};n.set(t[o])}return l!=null&&new e.Gauge({name:"distance_from_follow_block",help:"Block distance from the block tag this the indexer is following",async collect(){this.set(Number(await l()))}}),async function(t,r){if(t.path==="/metrics"){t.status=200,t.body=await e.register.metrics();return}await r()}}export{u as a};
2
- //# sourceMappingURL=chunk-ED45N3IT.js.map
@@ -1,2 +0,0 @@
1
- import*as e from"@sentry/node";import{ProfilingIntegration as m}from"@sentry/profiling-node";import{stripUrlQueryAndFragment as l}from"@sentry/utils";import c from"debug";var d=c("mud:store-indexer"),p=c("mud:store-indexer");d.log=console.debug.bind(console);p.log=console.error.bind(console);import f from"koa-compose";function y(){return async function(r,o){try{await o()}catch(t){throw e.withScope(a=>{a.addEventProcessor(n=>e.addRequestDataToEvent(n,r.request)),e.captureException(t)}),t}}}function g(){return async function(r,o){await e.runWithAsyncContext(async()=>{e.getCurrentHub().configureScope(a=>a.addEventProcessor(n=>e.addRequestDataToEvent(n,r.request,{include:{user:!1}}))),await o()})}}function S(){return async function(r,o){let t=(r.method||"").toUpperCase(),a=r.url&&l(r.url),n;r.request.get("sentry-trace")&&(n=e.extractTraceparentData(r.request.get("sentry-trace")));let i=e.startTransaction({name:`${t} ${a}`,op:"http.server",...n});r.__sentry_transaction=i,e.getCurrentHub().configureScope(u=>{u.setSpan(i)}),r.res.on("finish",()=>{setImmediate(()=>{if(r._matchedRoute){let u=r.mountPath||"";i.setName(`${t} ${u}${r._matchedRoute}`)}i.setHttpStatus(r.status),i.finish()})}),await o()}}function v(s){return d("Initializing Sentry"),e.init({dsn:s,integrations:[...e.autoDiscoverNodePerformanceMonitoringIntegrations(),new m],tracesSampleRate:1,profilesSampleRate:1}),f([y(),g(),S()])}export{d as a,p as b,v as c};
2
- //# sourceMappingURL=chunk-JDWVOODJ.js.map
@@ -1,7 +0,0 @@
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,2 +0,0 @@
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,2 +0,0 @@
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,2 +0,0 @@
1
- import{a}from"./chunk-7O2ZWWUX.js";export{a as healthcheck};
2
- //# sourceMappingURL=healthcheck-57YETUEX.js.map
@@ -1,2 +0,0 @@
1
- import{a}from"./chunk-AYPBOJNL.js";export{a as helloWorld};
2
- //# sourceMappingURL=helloWorld-4VT4FZ7F.js.map
@@ -1,2 +0,0 @@
1
- import{a}from"./chunk-ED45N3IT.js";export{a as metrics};
2
- //# sourceMappingURL=metrics-4BMCDEZZ.js.map