@levrbet/shared 0.4.25 → 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.
- package/dist/core/indexers/{envio.test.query.d.ts → envio.health.d.ts} +1 -1
- package/dist/core/indexers/envio.health.js +36 -0
- package/dist/core/indexers/envio.health.js.map +1 -0
- package/dist/core/indexers/indexers.service.d.ts +1 -1
- package/dist/core/indexers/indexers.service.js +13 -33
- package/dist/core/indexers/indexers.service.js.map +1 -1
- package/dist/core/indexers/{subsquid.test.query.d.ts → subsquid.health.d.ts} +1 -1
- package/dist/core/indexers/subsquid.health.js +48 -0
- package/dist/core/indexers/subsquid.health.js.map +1 -0
- package/dist/core/socket.io/events.d.ts +9 -1
- package/dist/core/socket.io/events.js +1 -0
- package/dist/core/socket.io/events.js.map +1 -1
- package/package.json +1 -1
- package/dist/core/indexers/envio.test.query.js +0 -31
- package/dist/core/indexers/envio.test.query.js.map +0 -1
- package/dist/core/indexers/subsquid.test.query.js +0 -42
- package/dist/core/indexers/subsquid.test.query.js.map +0 -1
|
@@ -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
|
-
|
|
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
|
|
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
|
|
18
|
-
const
|
|
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,
|
|
31
|
-
: await (0,
|
|
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
|
-
|
|
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
|
|
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
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
|
|
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":";;;;;;;;;;;;AAAA,4CAAmB;AACnB,2DAAoD;AACpD,2BAAkD;AAClD,4DAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"indexers.service.js","sourceRoot":"","sources":["../../../src/core/indexers/indexers.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -7,7 +7,8 @@ export declare enum RoomEvent {
|
|
|
7
7
|
export declare enum GameEvent {
|
|
8
8
|
ScoreUpdate = "gameScoreUpdate",
|
|
9
9
|
PhaseUpdate = "gamePhaseUpdate",
|
|
10
|
-
GameTimeUpdate = "gameTimeUpdate"
|
|
10
|
+
GameTimeUpdate = "gameTimeUpdate",
|
|
11
|
+
StateUpdate = "gameStateUpdate"
|
|
11
12
|
}
|
|
12
13
|
export type GameScoreUpdate = Scores;
|
|
13
14
|
export type GamePhaseUpdate = {
|
|
@@ -15,6 +16,13 @@ export type GamePhaseUpdate = {
|
|
|
15
16
|
levrFixtureId: LevrFixtureId;
|
|
16
17
|
phase: GamePhase;
|
|
17
18
|
};
|
|
19
|
+
export type GameStateUpdate = {
|
|
20
|
+
chainId: number;
|
|
21
|
+
gameId: number;
|
|
22
|
+
levrFixtureId: LevrFixtureId;
|
|
23
|
+
phase: GamePhase;
|
|
24
|
+
paused: boolean;
|
|
25
|
+
};
|
|
18
26
|
export type GameTimeUpdate = {
|
|
19
27
|
chainId: number;
|
|
20
28
|
gameObjectId: string;
|
|
@@ -12,6 +12,7 @@ var GameEvent;
|
|
|
12
12
|
GameEvent["ScoreUpdate"] = "gameScoreUpdate";
|
|
13
13
|
GameEvent["PhaseUpdate"] = "gamePhaseUpdate";
|
|
14
14
|
GameEvent["GameTimeUpdate"] = "gameTimeUpdate";
|
|
15
|
+
GameEvent["StateUpdate"] = "gameStateUpdate";
|
|
15
16
|
})(GameEvent || (exports.GameEvent = GameEvent = {}));
|
|
16
17
|
// MARKET EVENTS AND TYPES
|
|
17
18
|
var MarketEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/core/socket.io/events.ts"],"names":[],"mappings":";;;AAGA,IAAY,SAGX;AAHD,WAAY,SAAS;IACjB,kCAAqB,CAAA;IACrB,oCAAuB,CAAA;AAC3B,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAED,wBAAwB;AACxB,IAAY,
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/core/socket.io/events.ts"],"names":[],"mappings":";;;AAGA,IAAY,SAGX;AAHD,WAAY,SAAS;IACjB,kCAAqB,CAAA;IACrB,oCAAuB,CAAA;AAC3B,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAED,wBAAwB;AACxB,IAAY,SAKX;AALD,WAAY,SAAS;IACjB,4CAA+B,CAAA;IAC/B,4CAA+B,CAAA;IAC/B,8CAAiC,CAAA;IACjC,4CAA+B,CAAA;AACnC,CAAC,EALW,SAAS,yBAAT,SAAS,QAKpB;AAuBD,0BAA0B;AAC1B,IAAY,WAGX;AAHD,WAAY,WAAW;IACnB,8CAA+B,CAAA;IAC/B,oDAAqC,CAAA;AACzC,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB"}
|
package/package.json
CHANGED
|
@@ -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"}
|