@levrbet/shared 0.4.26 → 0.4.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  export declare const HEALTH_CHECK_QUERY = "\n query {\n LevrFullTimeMarket_PositionOpened(order_by: {timestamp: desc}, limit: 1) {\n timestamp\n }\n }\n";
2
2
  export declare function checkEnvioGraphQlHealth(url: string, variables?: Record<string, any>, signal?: AbortSignal): Promise<{
3
3
  ok: boolean;
4
- block: any;
4
+ timestamp: any;
5
5
  }>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HEALTH_CHECK_QUERY = void 0;
4
+ exports.checkEnvioGraphQlHealth = checkEnvioGraphQlHealth;
5
+ // GraphQL query to check if the endpoint is healthy by requesting LevrFullTimeMarket_PositionOpened
6
+ exports.HEALTH_CHECK_QUERY = `
7
+ query {
8
+ LevrFullTimeMarket_PositionOpened(order_by: {timestamp: desc}, limit: 1) {
9
+ timestamp
10
+ }
11
+ }
12
+ `;
13
+ async function checkEnvioGraphQlHealth(url, variables, signal) {
14
+ try {
15
+ const response = await fetch(url, {
16
+ method: "POST",
17
+ headers: { "Content-Type": "application/json" },
18
+ body: JSON.stringify({
19
+ query: exports.HEALTH_CHECK_QUERY,
20
+ variables,
21
+ }),
22
+ // forward AbortSignal so the request can be aborted by caller
23
+ signal,
24
+ });
25
+ const data = await response.json();
26
+ const dataParsed = response.ok ? data : null;
27
+ return {
28
+ ok: response.ok === true,
29
+ timestamp: response.ok ? (dataParsed?.data?.LevrFullTimeMarket_PositionOpened?.[0]?.timestamp ?? null) : null,
30
+ };
31
+ }
32
+ catch {
33
+ return { ok: false, timestamp: null };
34
+ }
35
+ }
36
+ //# sourceMappingURL=envio.health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envio.health.js","sourceRoot":"","sources":["../../../src/core/indexers/envio.health.ts"],"names":[],"mappings":";;;AASA,0DAwBC;AAjCD,oGAAoG;AACvF,QAAA,kBAAkB,GAAG;;;;;;CAMjC,CAAA;AAEM,KAAK,UAAU,uBAAuB,CAAC,GAAW,EAAE,SAA+B,EAAE,MAAoB;IAC5G,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACjB,KAAK,EAAE,0BAAkB;gBACzB,SAAS;aACZ,CAAC;YACF,8DAA8D;YAC9D,MAAM;SACT,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QAE5C,OAAO;YACH,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;YACxB,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SAChH,CAAA;IACL,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACzC,CAAC;AACL,CAAC"}
@@ -7,7 +7,7 @@ declare class IndexersService {
7
7
  private checkIndexerHealth;
8
8
  /**
9
9
  * Get a healthy indexer for a given chain and environment
10
- * Checks each indexer sequentially until it finds a healthy one
10
+ * Checks all indexers in parallel and picks the one with the most recent timestamp
11
11
  */
12
12
  getHealthyIndexer(env: LevrEnv, chain: LevrChain): Promise<{
13
13
  type: LevrIndexer;
@@ -14,25 +14,22 @@ const ms_1 = __importDefault(require("ms"));
14
14
  const typescript_memoize_1 = require("typescript-memoize");
15
15
  const _1 = require("../.");
16
16
  const indexers_types_1 = require("../types/indexers.types");
17
- const envio_test_query_1 = require("./envio.test.query");
18
- const subsquid_test_query_1 = require("./subsquid.test.query");
17
+ const envio_health_1 = require("./envio.health");
18
+ const subsquid_health_1 = require("./subsquid.health");
19
19
  class IndexersService {
20
20
  /**
21
21
  * Check the health of a single indexer with caching
22
22
  */
23
23
  async checkIndexerHealth(url, indexer) {
24
24
  const controller = new AbortController();
25
- // ensure we clear the timeout regardless of outcome
26
25
  const timeoutId = setTimeout(() => controller.abort(), (0, ms_1.default)("5s"));
27
26
  try {
28
- // forward the abort signal to the helper health checks so they can cancel their fetches
29
27
  const indexerHealth = indexer == indexers_types_1.LevrIndexer.SUBSQUID
30
- ? await (0, subsquid_test_query_1.checkSubsquidGraphQLHealth)(url, undefined, controller.signal)
31
- : await (0, envio_test_query_1.checkEnvioGraphQlHealth)(url, undefined, controller.signal);
28
+ ? await (0, subsquid_health_1.checkSubsquidGraphQLHealth)(url, undefined, controller.signal)
29
+ : await (0, envio_health_1.checkEnvioGraphQlHealth)(url, undefined, controller.signal);
32
30
  return indexerHealth;
33
31
  }
34
32
  catch (error) {
35
- // node-fetch throws an AbortError when aborted; match on name to avoid noisy logs
36
33
  if (error && (error.name === "AbortError" || error.type === "aborted")) {
37
34
  console.warn(`Health check aborted (timeout) for ${url}`);
38
35
  }
@@ -41,7 +38,7 @@ class IndexersService {
41
38
  }
42
39
  return {
43
40
  ok: false,
44
- block: null,
41
+ timestamp: null,
45
42
  };
46
43
  }
47
44
  finally {
@@ -50,36 +47,19 @@ class IndexersService {
50
47
  }
51
48
  /**
52
49
  * Get a healthy indexer for a given chain and environment
53
- * Checks each indexer sequentially until it finds a healthy one
50
+ * Checks all indexers in parallel and picks the one with the most recent timestamp
54
51
  */
55
52
  async getHealthyIndexer(env, chain) {
56
53
  const indexers = _1.allUrls[env].indexers[chain] || [];
57
- const typeToBlockMap = {
58
- [indexers_types_1.LevrIndexer.ENVIO]: null,
59
- [indexers_types_1.LevrIndexer.SUBSQUID]: null,
60
- };
61
- for (const indexer of indexers) {
62
- const isHealthy = await this.checkIndexerHealth(indexer.url, indexer.type);
63
- typeToBlockMap[indexer.type] = isHealthy.block;
64
- }
65
- // use the one with the latest block if multiple are healthy
66
- const healthyIndexers = indexers.filter((idx) => typeToBlockMap[idx.type] !== null);
67
- if (healthyIndexers.length > 1) {
68
- healthyIndexers.sort((a, b) => {
69
- const blockA = typeToBlockMap[a.type] || 0;
70
- const blockB = typeToBlockMap[b.type] || 0;
71
- return blockB - blockA;
72
- });
73
- const bestIndexer = healthyIndexers[0];
74
- return { type: bestIndexer.type, url: bestIndexer.url };
75
- }
76
- else if (healthyIndexers.length === 1) {
77
- // return the first healthy one if only one is healthy
78
- return { type: healthyIndexers[0].type, url: healthyIndexers[0].url };
79
- }
80
- else {
54
+ const results = await Promise.all(indexers.map(async (indexer) => {
55
+ const health = await this.checkIndexerHealth(indexer.url, indexer.type);
56
+ return { ...indexer, timestamp: health.timestamp };
57
+ }));
58
+ const healthy = results.filter((r) => r.timestamp !== null).sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));
59
+ if (healthy.length === 0) {
81
60
  throw new Error(`No healthy indexer found for ${env} - Chain ${chain}`);
82
61
  }
62
+ return { type: healthy[0].type, url: healthy[0].url };
83
63
  }
84
64
  getIndexer(env, chain, type) {
85
65
  const indexers = _1.allUrls[env].indexers[chain] || [];
@@ -1 +1 @@
1
- {"version":3,"file":"indexers.service.js","sourceRoot":"","sources":["../../../src/core/indexers/indexers.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexers.service.js","sourceRoot":"","sources":["../../../src/core/indexers/indexers.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAAmB;AACnB,2DAAoD;AACpD,2BAAkD;AAClD,4DAAqD;AACrD,iDAAwD;AACxD,uDAA8D;AAE9D,MAAM,eAAe;IACjB;;OAEG;IAEW,AAAN,KAAK,CAAC,kBAAkB,CAC5B,GAAW,EACX,OAAoB;QAKpB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAA,YAAE,EAAC,IAAI,CAAC,CAAC,CAAA;QAEhE,IAAI,CAAC;YACD,MAAM,aAAa,GACf,OAAO,IAAI,4BAAW,CAAC,QAAQ;gBAC3B,CAAC,CAAC,MAAM,IAAA,4CAA0B,EAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC;gBACrE,CAAC,CAAC,MAAM,IAAA,sCAAuB,EAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;YAE1E,OAAO,aAAa,CAAA;QACxB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAA;YAC7D,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,GAAG,EAAE,KAAK,CAAC,CAAA;YAC3D,CAAC;YACD,OAAO;gBACH,EAAE,EAAE,KAAK;gBACT,SAAS,EAAE,IAAI;aAClB,CAAA;QACL,CAAC;gBAAS,CAAC;YACP,YAAY,CAAC,SAAS,CAAC,CAAA;QAC3B,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,GAAY,EAAE,KAAgB;QAClD,MAAM,QAAQ,GAAG,UAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QAEnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YACvE,OAAO,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAA;QACtD,CAAC,CAAC,CACL,CAAA;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAA;QAEnH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,YAAY,KAAK,EAAE,CAAC,CAAA;QAC3E,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,GAAG,EAAE,CAAA;IAC3D,CAAC;IAED,UAAU,CAAC,GAAY,EAAE,KAAgB,EAAE,IAAiB;QACxD,MAAM,QAAQ,GAAG,UAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QAEnD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;QACzD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,YAAY,KAAK,WAAW,IAAI,EAAE,CAAC,CAAA;QAE5F,OAAO,OAAO,CAAC,GAAG,CAAA;IACtB,CAAC;CACJ;AA/DiB;IADb,IAAA,oCAAe,EAAC,IAAA,YAAE,EAAC,IAAI,CAAC,CAAC;yDA+BzB;AAmCQ,QAAA,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA"}
@@ -1,4 +1,4 @@
1
1
  export declare function checkSubsquidGraphQLHealth(url: string, variables?: Record<string, any>, signal?: AbortSignal): Promise<{
2
2
  ok: boolean;
3
- block: number | null;
3
+ timestamp: number | null;
4
4
  }>;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkSubsquidGraphQLHealth = checkSubsquidGraphQLHealth;
4
+ const HEALTH_CHECK_QUERY = `
5
+ query HealthCheck {
6
+ levrFullTimeMarketSchemaPositionOpeneds(limit: 1, orderBy: timestamp_DESC) {
7
+ id
8
+ timestamp
9
+ }
10
+ }
11
+ `;
12
+ async function checkSubsquidGraphQLHealth(url, variables, signal) {
13
+ try {
14
+ const response = await fetch(url, {
15
+ method: "POST",
16
+ headers: { "Content-Type": "application/json" },
17
+ body: JSON.stringify({
18
+ query: HEALTH_CHECK_QUERY,
19
+ variables,
20
+ }),
21
+ signal,
22
+ });
23
+ const timestamp = response.ok
24
+ ? ((await response.json())?.data?.levrFullTimeMarketSchemaPositionOpeneds?.[0]?.timestamp ?? null)
25
+ : null;
26
+ const toUnix = (ts) => {
27
+ if (ts == null)
28
+ return null;
29
+ // numeric value or numeric string
30
+ const num = typeof ts === "number" ? ts : Number(ts);
31
+ if (!Number.isNaN(num) && Number.isFinite(num)) {
32
+ // if in milliseconds (likely > 1e12) convert to seconds, otherwise assume seconds
33
+ return num > 1e12 ? Math.floor(num / 1000) : Math.floor(num);
34
+ }
35
+ // try parsing ISO/date string
36
+ const parsed = Date.parse(String(ts));
37
+ return Number.isNaN(parsed) ? null : Math.floor(parsed / 1000);
38
+ };
39
+ return {
40
+ ok: response.ok === true,
41
+ timestamp: toUnix(timestamp),
42
+ };
43
+ }
44
+ catch {
45
+ return { ok: false, timestamp: null };
46
+ }
47
+ }
48
+ //# sourceMappingURL=subsquid.health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subsquid.health.js","sourceRoot":"","sources":["../../../src/core/indexers/subsquid.health.ts"],"names":[],"mappings":";;AASA,gEAoCC;AA7CD,MAAM,kBAAkB,GAAG;;;;;;;CAO1B,CAAA;AAEM,KAAK,UAAU,0BAA0B,CAAC,GAAW,EAAE,SAA+B,EAAE,MAAoB;IAC/G,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACjB,KAAK,EAAE,kBAAkB;gBACzB,SAAS;aACZ,CAAC;YACF,MAAM;SACT,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE;YACzB,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC;YAClG,CAAC,CAAC,IAAI,CAAA;QAEV,MAAM,MAAM,GAAG,CAAC,EAAO,EAAiB,EAAE;YACtC,IAAI,EAAE,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAA;YAC3B,kCAAkC;YAClC,MAAM,GAAG,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7C,kFAAkF;gBAClF,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAChE,CAAC;YACD,8BAA8B;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;YACrC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;QAClE,CAAC,CAAA;QAED,OAAO;YACH,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;YACxB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;SAC/B,CAAA;IACL,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACzC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@levrbet/shared",
3
- "version": "0.4.26",
3
+ "version": "0.4.27",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "exports": {
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HEALTH_CHECK_QUERY = void 0;
4
- exports.checkEnvioGraphQlHealth = checkEnvioGraphQlHealth;
5
- // GraphQL query to check if the endpoint is healthy by requesting LevrFullTimeMarket_PositionOpened
6
- exports.HEALTH_CHECK_QUERY = `
7
- query {
8
- LevrFullTimeMarket_PositionOpened(order_by: {timestamp: desc}, limit: 1) {
9
- timestamp
10
- }
11
- }
12
- `;
13
- async function checkEnvioGraphQlHealth(url, variables, signal) {
14
- const response = await fetch(url, {
15
- method: "POST",
16
- headers: { "Content-Type": "application/json" },
17
- body: JSON.stringify({
18
- query: exports.HEALTH_CHECK_QUERY,
19
- variables,
20
- }),
21
- // forward AbortSignal so the request can be aborted by caller
22
- signal,
23
- });
24
- const data = await response.json();
25
- const dataParsed = response.ok ? data : null;
26
- return {
27
- ok: response.ok === true,
28
- block: response.ok ? dataParsed?.data?.LevrFullTimeMarket_PositionOpened?.[0]?.timestamp ?? null : null,
29
- };
30
- }
31
- //# sourceMappingURL=envio.test.query.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"envio.test.query.js","sourceRoot":"","sources":["../../../src/core/indexers/envio.test.query.ts"],"names":[],"mappings":";;;AASA,0DAoBC;AA7BD,oGAAoG;AACvF,QAAA,kBAAkB,GAAG;;;;;;CAMjC,CAAA;AAEM,KAAK,UAAU,uBAAuB,CAAC,GAAW,EAAE,SAA+B,EAAE,MAAoB;IAC5G,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC9B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACjB,KAAK,EAAE,0BAAkB;YACzB,SAAS;SACZ,CAAC;QACF,8DAA8D;QAC9D,MAAM;KACT,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAElC,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAE5C,OAAO;QACH,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;QACxB,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;KAC1G,CAAA;AACL,CAAC"}
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.checkSubsquidGraphQLHealth = checkSubsquidGraphQLHealth;
4
- const HEALTH_CHECK_QUERY = `
5
- query HealthCheck {
6
- levrFullTimeMarketSchemaPositionOpeneds(limit: 1, orderBy: timestamp_DESC) {
7
- id
8
- timestamp
9
- }
10
- }
11
- `;
12
- async function checkSubsquidGraphQLHealth(url, variables, signal) {
13
- const response = await fetch(url, {
14
- method: "POST",
15
- headers: { "Content-Type": "application/json" },
16
- body: JSON.stringify({
17
- query: HEALTH_CHECK_QUERY,
18
- variables,
19
- }),
20
- signal,
21
- });
22
- const timestamp = response.ok ? (await response.json()).data.levrFullTimeMarketSchemaPositionOpeneds[0]?.timestamp : null;
23
- const toUnix = (ts) => {
24
- if (ts == null)
25
- return null;
26
- // numeric value or numeric string
27
- const num = typeof ts === "number" ? ts : Number(ts);
28
- if (!Number.isNaN(num) && Number.isFinite(num)) {
29
- // if in milliseconds (likely > 1e12) convert to seconds, otherwise assume seconds
30
- return num > 1e12 ? Math.floor(num / 1000) : Math.floor(num);
31
- }
32
- // try parsing ISO/date string
33
- const parsed = Date.parse(String(ts));
34
- return Number.isNaN(parsed) ? null : Math.floor(parsed / 1000);
35
- };
36
- console.log("Subsquid health check response status:", response.status, url, toUnix(timestamp));
37
- return {
38
- ok: response.ok === true,
39
- block: toUnix(timestamp),
40
- };
41
- }
42
- //# sourceMappingURL=subsquid.test.query.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subsquid.test.query.js","sourceRoot":"","sources":["../../../src/core/indexers/subsquid.test.query.ts"],"names":[],"mappings":";;AASA,gEAgCC;AAzCD,MAAM,kBAAkB,GAAG;;;;;;;CAO1B,CAAA;AAEM,KAAK,UAAU,0BAA0B,CAAC,GAAW,EAAE,SAA+B,EAAE,MAAoB;IAC/G,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC9B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACjB,KAAK,EAAE,kBAAkB;YACzB,SAAS;SACZ,CAAC;QACF,MAAM;KACT,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;IAEzH,MAAM,MAAM,GAAG,CAAC,EAAO,EAAiB,EAAE;QACtC,IAAI,EAAE,IAAI,IAAI;YAAE,OAAO,IAAI,CAAA;QAC3B,kCAAkC;QAClC,MAAM,GAAG,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,kFAAkF;YAClF,OAAO,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAChE,CAAC;QACD,8BAA8B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QACrC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAClE,CAAC,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;IAE9F,OAAO;QACH,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;QACxB,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC;KAC3B,CAAA;AACL,CAAC"}