@vtechcom/hexcore 2.0.0-beta.1
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/CHANGELOG.md +127 -0
- package/LICENSE +201 -0
- package/README.md +283 -0
- package/dist/app.module.js +55 -0
- package/dist/app.module.js.map +1 -0
- package/dist/auth.js +151 -0
- package/dist/auth.js.map +1 -0
- package/dist/chain/cost-models.js +81 -0
- package/dist/chain/cost-models.js.map +1 -0
- package/dist/chain/provider.js +269 -0
- package/dist/chain/provider.js.map +1 -0
- package/dist/chain/socket.js +48 -0
- package/dist/chain/socket.js.map +1 -0
- package/dist/cli/doctor.js +43 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/hexcore.js +435 -0
- package/dist/cli/hexcore.js.map +1 -0
- package/dist/common/auth.guard.js +66 -0
- package/dist/common/auth.guard.js.map +1 -0
- package/dist/common/http.js +171 -0
- package/dist/common/http.js.map +1 -0
- package/dist/common/zod-validation.pipe.js +47 -0
- package/dist/common/zod-validation.pipe.js.map +1 -0
- package/dist/config.js +354 -0
- package/dist/config.js.map +1 -0
- package/dist/config.module.js +35 -0
- package/dist/config.module.js.map +1 -0
- package/dist/controllers/cardano.controller.js +173 -0
- package/dist/controllers/cardano.controller.js.map +1 -0
- package/dist/controllers/heads.controller.js +225 -0
- package/dist/controllers/heads.controller.js.map +1 -0
- package/dist/controllers/setup.controller.js +127 -0
- package/dist/controllers/setup.controller.js.map +1 -0
- package/dist/controllers/system.controller.js +153 -0
- package/dist/controllers/system.controller.js.map +1 -0
- package/dist/db/database.module.js +73 -0
- package/dist/db/database.module.js.map +1 -0
- package/dist/db/index.js +135 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/repositories.js +220 -0
- package/dist/db/repositories.js.map +1 -0
- package/dist/docker/container-stats.js +134 -0
- package/dist/docker/container-stats.js.map +1 -0
- package/dist/docker/docker.service.js +335 -0
- package/dist/docker/docker.service.js.map +1 -0
- package/dist/hydra/argv.js +172 -0
- package/dist/hydra/argv.js.map +1 -0
- package/dist/hydra/blockfrost-keys.js +15 -0
- package/dist/hydra/blockfrost-keys.js.map +1 -0
- package/dist/hydra/boot-progress.js +165 -0
- package/dist/hydra/boot-progress.js.map +1 -0
- package/dist/hydra/capabilities.js +131 -0
- package/dist/hydra/capabilities.js.map +1 -0
- package/dist/hydra/head.service.js +1072 -0
- package/dist/hydra/head.service.js.map +1 -0
- package/dist/hydra/keys.js +301 -0
- package/dist/hydra/keys.js.map +1 -0
- package/dist/hydra/node-monitor.service.js +265 -0
- package/dist/hydra/node-monitor.service.js.map +1 -0
- package/dist/hydra/ws-client.js +177 -0
- package/dist/hydra/ws-client.js.map +1 -0
- package/dist/main.js +106 -0
- package/dist/main.js.map +1 -0
- package/dist/preflight.js +215 -0
- package/dist/preflight.js.map +1 -0
- package/dist/settings.js +243 -0
- package/dist/settings.js.map +1 -0
- package/dist/setup.service.js +257 -0
- package/dist/setup.service.js.map +1 -0
- package/dist/version.js +46 -0
- package/dist/version.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/api.d.ts +730 -0
- package/node_modules/@hexcore/shared/dist/cjs/api.d.ts.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/api.js +358 -0
- package/node_modules/@hexcore/shared/dist/cjs/api.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/domain.d.ts +298 -0
- package/node_modules/@hexcore/shared/dist/cjs/domain.d.ts.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/domain.js +49 -0
- package/node_modules/@hexcore/shared/dist/cjs/domain.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.d.ts +279 -0
- package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.d.ts.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.js +453 -0
- package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/index.d.ts +7 -0
- package/node_modules/@hexcore/shared/dist/cjs/index.d.ts.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/index.js +23 -0
- package/node_modules/@hexcore/shared/dist/cjs/index.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/naming.d.ts +118 -0
- package/node_modules/@hexcore/shared/dist/cjs/naming.d.ts.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/naming.js +103 -0
- package/node_modules/@hexcore/shared/dist/cjs/naming.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/offline.d.ts +73 -0
- package/node_modules/@hexcore/shared/dist/cjs/offline.d.ts.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/offline.js +80 -0
- package/node_modules/@hexcore/shared/dist/cjs/offline.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/protocol-params.d.ts +79 -0
- package/node_modules/@hexcore/shared/dist/cjs/protocol-params.d.ts.map +1 -0
- package/node_modules/@hexcore/shared/dist/cjs/protocol-params.js +223 -0
- package/node_modules/@hexcore/shared/dist/cjs/protocol-params.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/esm/api.js +355 -0
- package/node_modules/@hexcore/shared/dist/esm/api.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/esm/domain.js +46 -0
- package/node_modules/@hexcore/shared/dist/esm/domain.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/esm/hydra-versions.js +441 -0
- package/node_modules/@hexcore/shared/dist/esm/hydra-versions.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/esm/index.js +7 -0
- package/node_modules/@hexcore/shared/dist/esm/index.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/esm/naming.js +95 -0
- package/node_modules/@hexcore/shared/dist/esm/naming.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/esm/offline.js +75 -0
- package/node_modules/@hexcore/shared/dist/esm/offline.js.map +1 -0
- package/node_modules/@hexcore/shared/dist/esm/package.json +3 -0
- package/node_modules/@hexcore/shared/dist/esm/protocol-params.js +217 -0
- package/node_modules/@hexcore/shared/dist/esm/protocol-params.js.map +1 -0
- package/node_modules/@hexcore/shared/package.json +15 -0
- package/package.json +67 -0
- package/web/200.html +23 -0
- package/web/404.html +23 -0
- package/web/_nuxt/2MxohCD-.js +1 -0
- package/web/_nuxt/4pFXjB_u.js +1 -0
- package/web/_nuxt/B-v0dEQX.js +1 -0
- package/web/_nuxt/B4yE3U25.js +1 -0
- package/web/_nuxt/BFh8Ai0L.js +1 -0
- package/web/_nuxt/BgPn4NJH.js +1 -0
- package/web/_nuxt/Bj1xviSh.js +1 -0
- package/web/_nuxt/BnotlrL7.js +1 -0
- package/web/_nuxt/C1YRg2ic.js +1 -0
- package/web/_nuxt/CGD7MYQH.js +1 -0
- package/web/_nuxt/CQcG7Bu4.js +1 -0
- package/web/_nuxt/CS3KqpH_.js +1 -0
- package/web/_nuxt/CT-yt694.js +1 -0
- package/web/_nuxt/CZK6xUH-.js +1 -0
- package/web/_nuxt/CcdyYRYz.js +1 -0
- package/web/_nuxt/CePNTU1S.js +1 -0
- package/web/_nuxt/CgPLsCeU.js +5 -0
- package/web/_nuxt/CkCrahXt.js +1 -0
- package/web/_nuxt/CnOqDT9k.js +3 -0
- package/web/_nuxt/CqsSss-D.js +1 -0
- package/web/_nuxt/Cr8dL64Q.js +1 -0
- package/web/_nuxt/D3CwzwU0.js +1 -0
- package/web/_nuxt/DDANn6-H.js +1 -0
- package/web/_nuxt/DDl9uKIA.js +1 -0
- package/web/_nuxt/DL9i0ayn.js +1 -0
- package/web/_nuxt/DLNoK9BC.js +1 -0
- package/web/_nuxt/DLztFeOQ.js +1 -0
- package/web/_nuxt/DPihKXdt.js +1 -0
- package/web/_nuxt/DXyr6Naa.js +1 -0
- package/web/_nuxt/DeDg5p0D.js +1 -0
- package/web/_nuxt/DgDlQiDU.js +1 -0
- package/web/_nuxt/DyPI7qJE.js +30 -0
- package/web/_nuxt/LGfPBi70.js +1 -0
- package/web/_nuxt/Onf26W-r.js +1 -0
- package/web/_nuxt/QZNQe_OX.js +1 -0
- package/web/_nuxt/Y8IJM-iz.js +1 -0
- package/web/_nuxt/YUGC0nt0.js +1 -0
- package/web/_nuxt/builds/latest.json +1 -0
- package/web/_nuxt/builds/meta/7e461629-93e2-4694-b237-6d5c6a85c97c.json +1 -0
- package/web/_nuxt/builds/meta/dev.json +1 -0
- package/web/_nuxt/entry.BxsAxZxf.css +1 -0
- package/web/_nuxt/error-404.XbtAw-qw.css +1 -0
- package/web/_nuxt/error-500.CNHVltWM.css +1 -0
- package/web/_nuxt/rS90pPZ_.js +1 -0
- package/web/_nuxt/rhEiP908.js +1 -0
- package/web/_nuxt/vSj9Ec0g.js +1 -0
- package/web/_nuxt/woNjBJMN.js +1 -0
- package/web/favicon.svg +28 -0
- package/web/heads/index.html +23 -0
- package/web/heads/new/index.html +23 -0
- package/web/index.html +23 -0
- package/web/login/index.html +23 -0
- package/web/logo.svg +56 -0
- package/web/settings/index.html +23 -0
- package/web/setup/index.html +23 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-monitor.service.js","sourceRoot":"","sources":["../../src/hydra/node-monitor.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toHydraState = toHydraState;
|
|
4
|
+
exports.describeConnectError = describeConnectError;
|
|
5
|
+
exports.probeNode = probeNode;
|
|
6
|
+
exports.waitForNodes = waitForNodes;
|
|
7
|
+
exports.aggregateHydraState = aggregateHydraState;
|
|
8
|
+
/**
|
|
9
|
+
* One-shot readiness probe for a hydra-node.
|
|
10
|
+
*
|
|
11
|
+
* Used while a head is booting, where the only question is "has this node come
|
|
12
|
+
* up yet, and in what phase". Ongoing status does NOT come from here — see
|
|
13
|
+
* node-monitor.service.ts, which holds a connection open, because connectivity
|
|
14
|
+
* events (a peer dropping out) are not observable by anything that connects
|
|
15
|
+
* after the fact.
|
|
16
|
+
*
|
|
17
|
+
* Built on `@hydra-sdk/bridge` rather than a raw socket so the frame shapes
|
|
18
|
+
* come from the SDK that tracks hydra-node's releases, instead of being decoded
|
|
19
|
+
* by hand here and quietly going stale at the next version — which is exactly
|
|
20
|
+
* what happened to `connectedPeers`, dropped from `Greetings` in 2.x.
|
|
21
|
+
*/
|
|
22
|
+
const bridge_1 = require("@hydra-sdk/bridge");
|
|
23
|
+
/**
|
|
24
|
+
* Client-facing head status vocabulary.
|
|
25
|
+
*
|
|
26
|
+
* Sourced from `Hydra.API.ServerOutput.HeadStatus`. Note this is NOT the same
|
|
27
|
+
* set as the `tag` of `GET /head`, which returns a HeadState — that one has no
|
|
28
|
+
* `FanoutPossible` at all. Both are accepted here, since this maps whichever
|
|
29
|
+
* of the two a caller happens to hold.
|
|
30
|
+
*/
|
|
31
|
+
function toHydraState(raw) {
|
|
32
|
+
switch (String(raw ?? '').toLowerCase()) {
|
|
33
|
+
case 'idle':
|
|
34
|
+
return 'IDLE';
|
|
35
|
+
case 'initializing':
|
|
36
|
+
return 'INITIALIZING';
|
|
37
|
+
case 'open':
|
|
38
|
+
return 'OPEN';
|
|
39
|
+
case 'closed':
|
|
40
|
+
return 'CLOSED';
|
|
41
|
+
case 'fanoutpossible':
|
|
42
|
+
return 'FANOUT_POSSIBLE';
|
|
43
|
+
case 'fanningout':
|
|
44
|
+
return 'FANNING_OUT';
|
|
45
|
+
case 'final':
|
|
46
|
+
return 'FINAL';
|
|
47
|
+
default:
|
|
48
|
+
return 'UNKNOWN';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* A readable reason from whatever the socket threw.
|
|
53
|
+
*
|
|
54
|
+
* The bridge surfaces connection failures as a DOM `ErrorEvent`, which is not
|
|
55
|
+
* an `Error`, so the obvious `String(err)` yields the literal
|
|
56
|
+
* `[object ErrorEvent]` — which is exactly the useless message this whole
|
|
57
|
+
* boot-progress work exists to stop producing. The underlying cause hangs off
|
|
58
|
+
* `.error`; `.message` and `.type` are the fallbacks.
|
|
59
|
+
*/
|
|
60
|
+
function describeConnectError(err) {
|
|
61
|
+
if (err instanceof Error)
|
|
62
|
+
return err.message;
|
|
63
|
+
if (err && typeof err === 'object') {
|
|
64
|
+
const e = err;
|
|
65
|
+
if (e.error instanceof Error)
|
|
66
|
+
return e.error.message;
|
|
67
|
+
if (typeof e.message === 'string' && e.message)
|
|
68
|
+
return e.message;
|
|
69
|
+
if (typeof e.type === 'string' && e.type)
|
|
70
|
+
return `socket ${e.type}`;
|
|
71
|
+
}
|
|
72
|
+
const text = String(err ?? '');
|
|
73
|
+
return text && text !== '[object Object]' ? text : 'connection failed';
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Connect to a node's API port and wait for the `Greetings` frame that
|
|
77
|
+
* hydra-node emits to every new client. Resolves as soon as it arrives.
|
|
78
|
+
*/
|
|
79
|
+
function probeNode(port, timeoutMs = 8000, host = '127.0.0.1') {
|
|
80
|
+
return new Promise(resolvePromise => {
|
|
81
|
+
let settled = false;
|
|
82
|
+
let timer = null;
|
|
83
|
+
// history=no keeps the node from replaying its whole event log at us,
|
|
84
|
+
// which on a long-running head is thousands of frames for one answer.
|
|
85
|
+
const bridge = new bridge_1.HydraBridge({ url: `ws://${host}:${port}`, history: false, noSnapshotUtxo: false });
|
|
86
|
+
const finish = (result) => {
|
|
87
|
+
if (settled)
|
|
88
|
+
return;
|
|
89
|
+
settled = true;
|
|
90
|
+
if (timer)
|
|
91
|
+
clearTimeout(timer);
|
|
92
|
+
// Nothing useful to do if the socket is already gone.
|
|
93
|
+
void Promise.resolve(bridge.disconnect()).catch(() => undefined);
|
|
94
|
+
resolvePromise(result);
|
|
95
|
+
};
|
|
96
|
+
timer = setTimeout(() => finish({ reachable: false, error: `timeout after ${timeoutMs}ms` }), timeoutMs);
|
|
97
|
+
bridge.events.on('onMessage', (payload) => {
|
|
98
|
+
const msg = payload;
|
|
99
|
+
if (msg.tag !== 'Greetings')
|
|
100
|
+
return;
|
|
101
|
+
const snapshot = msg.snapshotUtxo;
|
|
102
|
+
const synced = msg.chainSyncedStatus;
|
|
103
|
+
/**
|
|
104
|
+
* `connectedPeers` is deliberately not read here. 2.x dropped it
|
|
105
|
+
* from Greetings — peer membership is delivered as events instead —
|
|
106
|
+
* so a probe cannot answer it at all and must leave it undefined
|
|
107
|
+
* rather than report a confident zero. NodeMonitorService is what
|
|
108
|
+
* knows the real answer.
|
|
109
|
+
*/
|
|
110
|
+
finish({
|
|
111
|
+
reachable: true,
|
|
112
|
+
info: {
|
|
113
|
+
hydraState: toHydraState(msg.headStatus),
|
|
114
|
+
version: typeof msg.hydraNodeVersion === 'string' ? msg.hydraNodeVersion : undefined,
|
|
115
|
+
snapshotUtxoCount: snapshot ? Object.keys(snapshot).length : undefined,
|
|
116
|
+
headId: typeof msg.hydraHeadId === 'string' ? msg.hydraHeadId : undefined,
|
|
117
|
+
chainSynced: synced === 'InSync' || synced === 'CatchingUp' ? synced : undefined,
|
|
118
|
+
currentSlot: typeof msg.currentSlot === 'number' ? msg.currentSlot : undefined,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
bridge.events.on('onConnectError', (err) => finish({ reachable: false, error: describeConnectError(err) }));
|
|
123
|
+
bridge.events.on('onDisconnected', () => finish({ reachable: false, error: 'connection closed before Greetings' }));
|
|
124
|
+
void bridge.connect().catch((err) => finish({ reachable: false, error: describeConnectError(err) }));
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Poll every node until all of them greet us, or the deadline passes.
|
|
129
|
+
* Returns the per-port result so the caller can report exactly which node
|
|
130
|
+
* failed instead of v1's opaque "timeout waiting for nodes".
|
|
131
|
+
*/
|
|
132
|
+
async function waitForNodes(ports, opts = {}) {
|
|
133
|
+
const { timeoutMs = 180_000, intervalMs = 2000, probeTimeoutMs = 6000, onProgress, onTick } = opts;
|
|
134
|
+
const results = new Map();
|
|
135
|
+
const deadline = Date.now() + timeoutMs;
|
|
136
|
+
while (Date.now() < deadline) {
|
|
137
|
+
const pending = ports.filter(p => !results.get(p)?.reachable);
|
|
138
|
+
if (pending.length === 0)
|
|
139
|
+
return results;
|
|
140
|
+
const probes = await Promise.all(pending.map(async (p) => [p, await probeNode(p, probeTimeoutMs)]));
|
|
141
|
+
for (const [port, res] of probes)
|
|
142
|
+
results.set(port, res);
|
|
143
|
+
const ready = ports.filter(p => results.get(p)?.reachable).length;
|
|
144
|
+
onProgress?.(ready, ports.length);
|
|
145
|
+
// Awaited before the readiness check so a boot that succeeds on this
|
|
146
|
+
// poll still leaves the node's own greeting in the log pane.
|
|
147
|
+
await onTick?.();
|
|
148
|
+
if (ready === ports.length)
|
|
149
|
+
return results;
|
|
150
|
+
await sleep(intervalMs);
|
|
151
|
+
}
|
|
152
|
+
return results;
|
|
153
|
+
}
|
|
154
|
+
function sleep(ms) {
|
|
155
|
+
return new Promise(r => setTimeout(r, ms));
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Aggregate node states into one head-level state.
|
|
159
|
+
*
|
|
160
|
+
* UNKNOWN entries are dropped before comparing, because UNKNOWN is "this node
|
|
161
|
+
* has no opinion" — an unreachable node, or one we have not heard from yet.
|
|
162
|
+
* Folding it in as a disagreement made a three-node head with one node down
|
|
163
|
+
* report UNKNOWN for the whole head, hiding the fact that the other two were
|
|
164
|
+
* still Open. That the head is short a node is reported separately, as
|
|
165
|
+
* `degraded`, which is the thing an operator can act on.
|
|
166
|
+
*
|
|
167
|
+
* Nodes that genuinely disagree — one Open, one Closed — still collapse to
|
|
168
|
+
* UNKNOWN. That is a real inconsistency and naming either one would be a guess.
|
|
169
|
+
*/
|
|
170
|
+
function aggregateHydraState(states) {
|
|
171
|
+
const known = states.filter(s => s !== 'UNKNOWN');
|
|
172
|
+
if (known.length === 0)
|
|
173
|
+
return 'UNKNOWN';
|
|
174
|
+
const first = known[0];
|
|
175
|
+
return known.every(s => s === first) ? first : 'UNKNOWN';
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=ws-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../../src/hydra/ws-client.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bootstrap = bootstrap;
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
const core_1 = require("@nestjs/core");
|
|
6
|
+
const platform_fastify_1 = require("@nestjs/platform-fastify");
|
|
7
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
8
|
+
const common_1 = require("@nestjs/common");
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const node_path_1 = require("node:path");
|
|
11
|
+
const app_module_1 = require("./app.module");
|
|
12
|
+
const setup_service_1 = require("./setup.service");
|
|
13
|
+
const version_1 = require("./version");
|
|
14
|
+
const http_1 = require("./common/http");
|
|
15
|
+
const config_1 = require("./config");
|
|
16
|
+
const preflight_1 = require("./preflight");
|
|
17
|
+
async function bootstrap() {
|
|
18
|
+
let config;
|
|
19
|
+
try {
|
|
20
|
+
config = (0, config_1.loadConfig)();
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
if (err instanceof config_1.ConfigError) {
|
|
24
|
+
// A bad .env prints exactly which key is wrong and how to fix it,
|
|
25
|
+
// instead of v1's stack trace from inside the DI container.
|
|
26
|
+
console.error(`\n${err.message}\n`);
|
|
27
|
+
console.error('Fix the values above in your .env, then start again. See .env.example.\n');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
// Preflight before Nest boots: failing here is far cheaper than failing
|
|
33
|
+
// later inside a container create with an unrelated-looking error.
|
|
34
|
+
const report = await (0, preflight_1.runPreflight)(config);
|
|
35
|
+
console.log((0, preflight_1.formatReport)(report));
|
|
36
|
+
if (report.some(c => c.status === 'fail' && c.fatal)) {
|
|
37
|
+
console.error('Preflight failed — refusing to start.\n');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const app = await core_1.NestFactory.create(app_module_1.AppModule, new platform_fastify_1.FastifyAdapter({ bodyLimit: 8 * 1024 * 1024 }));
|
|
41
|
+
app.enableCors({
|
|
42
|
+
origin: config.corsOrigin === '*' ? true : config.corsOrigin.split(',').map(s => s.trim()),
|
|
43
|
+
credentials: true,
|
|
44
|
+
});
|
|
45
|
+
/**
|
|
46
|
+
* Single-process mode: serve the built web UI from this same port so a
|
|
47
|
+
* deployment is one container instead of v1's separate UI and API repos.
|
|
48
|
+
*
|
|
49
|
+
* The UI is a client-rendered SPA, so a deep link like /heads/3 has no file
|
|
50
|
+
* on disk and must fall back to index.html for vue-router to resolve.
|
|
51
|
+
* Nest installs its own not-found handler, so the fallback is expressed as
|
|
52
|
+
* a @fastify/static option rather than a second setNotFoundHandler, which
|
|
53
|
+
* Fastify rejects outright.
|
|
54
|
+
*/
|
|
55
|
+
if (config.serveWeb && (0, node_fs_1.existsSync)(config.webDist)) {
|
|
56
|
+
app.useStaticAssets({
|
|
57
|
+
root: config.webDist,
|
|
58
|
+
wildcard: false,
|
|
59
|
+
});
|
|
60
|
+
// The filter serves this for any non-API 404 so deep links resolve.
|
|
61
|
+
http_1.ApiExceptionFilter.spaIndexPath = (0, node_path_1.join)(config.webDist, 'index.html');
|
|
62
|
+
new common_1.Logger('Bootstrap').log(`serving web UI from ${config.webDist}`);
|
|
63
|
+
}
|
|
64
|
+
const swagger = new swagger_1.DocumentBuilder()
|
|
65
|
+
.setTitle('Hexcore v2 control-plane')
|
|
66
|
+
.setDescription('Boot and operate Hydra Heads on Cardano.')
|
|
67
|
+
.setVersion(version_1.VERSION)
|
|
68
|
+
.addBearerAuth()
|
|
69
|
+
.build();
|
|
70
|
+
swagger_1.SwaggerModule.setup('api-docs', app, swagger_1.SwaggerModule.createDocument(app, swagger));
|
|
71
|
+
app.enableShutdownHooks();
|
|
72
|
+
await app.listen({ port: config.port, host: config.host });
|
|
73
|
+
const logger = new common_1.Logger('Bootstrap');
|
|
74
|
+
const base = `http://localhost:${config.port}`;
|
|
75
|
+
logger.log(`control-plane ready on ${base}`);
|
|
76
|
+
logger.log(`API docs at ${base}/api-docs`);
|
|
77
|
+
logger.log(`network=${config.network} backend=${config.chainBackend} state=${config.stateDir}`);
|
|
78
|
+
/**
|
|
79
|
+
* The setup link, with its token already in it.
|
|
80
|
+
*
|
|
81
|
+
* Setup is necessarily reachable without a login — it is where the login is
|
|
82
|
+
* created — so it is gated on a token instead. Printing the whole URL is
|
|
83
|
+
* the difference between a security measure and an obstacle: the person who
|
|
84
|
+
* just started Hexcore is looking at this line.
|
|
85
|
+
*/
|
|
86
|
+
const setup = app.get(setup_service_1.SetupService);
|
|
87
|
+
const token = setup.setupToken();
|
|
88
|
+
if (token) {
|
|
89
|
+
logger.warn('Hexcore is not configured yet. Open this link to finish setup:');
|
|
90
|
+
logger.warn(` ${base}/setup?token=${token}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Only self-start when run directly.
|
|
95
|
+
*
|
|
96
|
+
* `hexcore start` imports this module so it can set defaults first — serving
|
|
97
|
+
* the bundled UI, above all — and an unconditional call here would boot the
|
|
98
|
+
* server on import, before any of that was applied.
|
|
99
|
+
*/
|
|
100
|
+
if (require.main === module) {
|
|
101
|
+
bootstrap().catch(err => {
|
|
102
|
+
console.error('Fatal startup error:', err);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runPreflight = runPreflight;
|
|
4
|
+
exports.formatReport = formatReport;
|
|
5
|
+
/**
|
|
6
|
+
* Preflight checks.
|
|
7
|
+
*
|
|
8
|
+
* The single biggest v1 complaint was "it doesn't start and I can't tell why":
|
|
9
|
+
* a missing docker group membership, an unreachable MySQL, a Blockfrost key for
|
|
10
|
+
* the wrong network, or an unwritable hydra folder all surfaced as unrelated
|
|
11
|
+
* stack traces at some later point. Every one of those is checked here, up
|
|
12
|
+
* front, with a message that says what to do about it.
|
|
13
|
+
*/
|
|
14
|
+
const promises_1 = require("node:fs/promises");
|
|
15
|
+
const node_net_1 = require("node:net");
|
|
16
|
+
const node_os_1 = require("node:os");
|
|
17
|
+
const shared_1 = require("@hexcore/shared");
|
|
18
|
+
const docker_service_1 = require("./docker/docker.service");
|
|
19
|
+
const provider_1 = require("./chain/provider");
|
|
20
|
+
const socket_1 = require("./chain/socket");
|
|
21
|
+
async function check(name, fatal, fn, hintOnFail) {
|
|
22
|
+
try {
|
|
23
|
+
const res = await fn();
|
|
24
|
+
return { name, status: res.status ?? 'pass', fatal, message: res.message, hint: res.hint };
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
return { name, status: 'fail', fatal, message: err.message, hint: hintOnFail };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function runPreflight(config) {
|
|
31
|
+
const results = [];
|
|
32
|
+
results.push(await check('node runtime', true, async () => {
|
|
33
|
+
const major = Number(process.versions.node.split('.')[0]);
|
|
34
|
+
if (major < 20)
|
|
35
|
+
throw new Error(`Node ${process.versions.node} is too old; v2 needs Node >= 20`);
|
|
36
|
+
return { message: `Node ${process.versions.node}` };
|
|
37
|
+
}));
|
|
38
|
+
results.push(await check('state directory', true, async () => {
|
|
39
|
+
await (0, promises_1.mkdir)(config.stateDir, { recursive: true });
|
|
40
|
+
// Prove it is actually writable rather than just present —
|
|
41
|
+
// a root-owned bind mount passes existsSync and fails on write.
|
|
42
|
+
const probe = `${config.stateDir}/.write-probe`;
|
|
43
|
+
await (0, promises_1.writeFile)(probe, 'ok');
|
|
44
|
+
await (0, promises_1.rm)(probe, { force: true });
|
|
45
|
+
return { message: config.stateDir };
|
|
46
|
+
}, 'Pick a directory your user owns via STATE_DIR, or fix its permissions with chown.'));
|
|
47
|
+
/**
|
|
48
|
+
* Never fatal, for the same reason the backend credentials are not.
|
|
49
|
+
*
|
|
50
|
+
* An unreachable daemon used to abort startup, which is the one outcome
|
|
51
|
+
* that leaves an operator with nothing: the UI is built to run without
|
|
52
|
+
* Docker — it reports the daemon as down, says so in a banner and refuses
|
|
53
|
+
* every lifecycle action with a reason — but none of that can be shown by a
|
|
54
|
+
* process that exited. Docker also comes and goes under the running server
|
|
55
|
+
* (Docker Desktop paused, a restart), and `reconcile()` already survives
|
|
56
|
+
* that, so refusing only the boot case was inconsistent as well as unhelpful.
|
|
57
|
+
*/
|
|
58
|
+
results.push(await check('docker daemon', false, async () => {
|
|
59
|
+
const docker = new docker_service_1.DockerService(config);
|
|
60
|
+
await docker.ping();
|
|
61
|
+
const version = await docker.version();
|
|
62
|
+
return { message: `reachable (engine ${version}) via ${config.dockerSocket}` };
|
|
63
|
+
}, (0, node_os_1.platform)() === 'darwin'
|
|
64
|
+
? 'Start Docker Desktop. The control-plane starts anyway; heads cannot be started until it is back.'
|
|
65
|
+
: 'Run `sudo systemctl start docker`, and add yourself to the docker group: `sudo usermod -aG docker $USER` (re-login required). The control-plane starts anyway; heads cannot be started until it is back.'));
|
|
66
|
+
results.push(await check('docker socket permissions', false, async () => {
|
|
67
|
+
await (0, promises_1.access)(config.dockerSocket, promises_1.constants.R_OK | promises_1.constants.W_OK);
|
|
68
|
+
return { message: 'read/write ok' };
|
|
69
|
+
}, 'Your user cannot write to the Docker socket. `sudo usermod -aG docker $USER` then log out and back in.'));
|
|
70
|
+
results.push(await check('hydra-node image', false, async () => {
|
|
71
|
+
const docker = new docker_service_1.DockerService(config);
|
|
72
|
+
const present = await docker.hasImage(config.hydraNodeImage);
|
|
73
|
+
return present
|
|
74
|
+
? { message: `${config.hydraNodeImage} present` }
|
|
75
|
+
: {
|
|
76
|
+
status: 'warn',
|
|
77
|
+
message: `${config.hydraNodeImage} not pulled yet`,
|
|
78
|
+
hint: 'It will be pulled automatically on the first head start (~200MB).',
|
|
79
|
+
};
|
|
80
|
+
}));
|
|
81
|
+
if (config.chainBackend === 'blockfrost') {
|
|
82
|
+
/**
|
|
83
|
+
* Non-fatal, and skipped entirely with no server-wide key: the key is a
|
|
84
|
+
* default now, not a requirement. An operator who gives every head its
|
|
85
|
+
* own key has nothing to configure here, and must still be able to boot.
|
|
86
|
+
*/
|
|
87
|
+
results.push(await check('blockfrost', false, async () => {
|
|
88
|
+
if (!config.blockfrostProjectId) {
|
|
89
|
+
return {
|
|
90
|
+
status: 'warn',
|
|
91
|
+
message: 'no server-wide key',
|
|
92
|
+
hint: 'Every Blockfrost head will have to carry its own project id, entered ' +
|
|
93
|
+
'when the head is created. Set BLOCKFROST_PROJECT_ID to give them a default.',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const provider = new provider_1.BlockfrostProvider(config.blockfrostProjectId, config.blockfrostBaseUrl);
|
|
97
|
+
try {
|
|
98
|
+
await provider.latestEpochParameters();
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
return {
|
|
102
|
+
status: 'warn',
|
|
103
|
+
message: err.message,
|
|
104
|
+
hint: 'Check BLOCKFROST_PROJECT_ID and that its network prefix matches ' +
|
|
105
|
+
'CARDANO_NETWORK (a key starting with "preprod" only works on preprod). ' +
|
|
106
|
+
'Heads carrying their own key are unaffected.',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return { message: `${config.network} key valid` };
|
|
110
|
+
}));
|
|
111
|
+
/**
|
|
112
|
+
* Warn when the unsynced budget sits inside Blockfrost's observed drift
|
|
113
|
+
* band. Upstream measured 50-80s of tip lag on preprod, and past
|
|
114
|
+
* --unsynced-period hydra-node stops signing snapshots and rejects
|
|
115
|
+
* client input — so a head boots fine and then quietly refuses to work.
|
|
116
|
+
*
|
|
117
|
+
* Checked against the default image's version profile, since that is
|
|
118
|
+
* what a head created without an explicit image will boot with. A head
|
|
119
|
+
* pinned to another version resolves its own value at start.
|
|
120
|
+
*/
|
|
121
|
+
results.push(await check('blockfrost sync budget', false, async () => {
|
|
122
|
+
const profile = (0, shared_1.findVersionProfile)(config.hydraNodeImage);
|
|
123
|
+
const args = (0, shared_1.resolveHydraArgs)(profile, config.hydraArgOverrides);
|
|
124
|
+
const source = config.hydraArgOverrides.unsyncedPeriod !== undefined
|
|
125
|
+
? 'HYDRA_UNSYNCED_PERIOD'
|
|
126
|
+
: `${profile?.label ?? 'default'} profile`;
|
|
127
|
+
if (!profile?.flags.unsyncedPeriod && profile) {
|
|
128
|
+
return {
|
|
129
|
+
status: 'warn',
|
|
130
|
+
message: `${profile.label} has no --unsynced-period`,
|
|
131
|
+
hint: 'This version runs with a 60s unsynced budget inside Blockfrost’s 50-80s ' +
|
|
132
|
+
'drift band. Create heads on 2.3.x for drift tolerance.',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (args.unsyncedPeriod < 120) {
|
|
136
|
+
throw new Error(`${source} gives ${args.unsyncedPeriod}s, inside the 50-80s tip drift ` +
|
|
137
|
+
'Blockfrost typically shows. Nodes may flip to "unsynced" during normal ' +
|
|
138
|
+
'operation and stop signing snapshots.');
|
|
139
|
+
}
|
|
140
|
+
return { message: `${args.unsyncedPeriod}s from ${source} (drift-tolerant)` };
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Reported for every configuration, not just CHAIN_BACKEND=cardano-node,
|
|
145
|
+
* because the backend is now a per-head choice: a server defaulting to
|
|
146
|
+
* Blockfrost can still host a cardano-node head, and vice versa.
|
|
147
|
+
*
|
|
148
|
+
* Never fatal. An unusable socket used to abort startup, which took the
|
|
149
|
+
* whole control-plane down over one backend while the other needed nothing
|
|
150
|
+
* but an API key. Heads that would need the socket are refused at creation
|
|
151
|
+
* instead, with a message that says why.
|
|
152
|
+
*/
|
|
153
|
+
results.push(await check('cardano-node socket', false, async () => {
|
|
154
|
+
const socket = await (0, socket_1.checkNodeSocket)(config.cardanoNodeSocket);
|
|
155
|
+
if (socket.available)
|
|
156
|
+
return { message: config.cardanoNodeSocket };
|
|
157
|
+
const wanted = config.chainBackend === 'cardano-node';
|
|
158
|
+
return {
|
|
159
|
+
status: 'warn',
|
|
160
|
+
message: socket.reason ?? 'unavailable',
|
|
161
|
+
hint: wanted
|
|
162
|
+
? 'CHAIN_BACKEND=cardano-node but the socket is unusable — new heads must use ' +
|
|
163
|
+
'the Blockfrost backend until it is. `chmod 660` plus group membership is enough.'
|
|
164
|
+
: 'Only needed for heads on the cardano-node backend; Blockfrost heads are unaffected.',
|
|
165
|
+
};
|
|
166
|
+
}));
|
|
167
|
+
results.push(await check('port availability', false, async () => {
|
|
168
|
+
const busy = await firstBusyPort([config.port]);
|
|
169
|
+
if (busy)
|
|
170
|
+
throw new Error(`port ${busy} is already in use`);
|
|
171
|
+
return { message: `API port ${config.port} free` };
|
|
172
|
+
}, 'Another process is on that port — change PORT in .env or stop the other process.'));
|
|
173
|
+
return results;
|
|
174
|
+
}
|
|
175
|
+
/** Return the first port that already has a listener, or null. */
|
|
176
|
+
async function firstBusyPort(ports) {
|
|
177
|
+
for (const port of ports) {
|
|
178
|
+
const inUse = await new Promise(resolve => {
|
|
179
|
+
const socket = (0, node_net_1.createConnection)({ port, host: '127.0.0.1' });
|
|
180
|
+
const done = (result) => {
|
|
181
|
+
socket.removeAllListeners();
|
|
182
|
+
socket.destroy();
|
|
183
|
+
resolve(result);
|
|
184
|
+
};
|
|
185
|
+
socket.setTimeout(500);
|
|
186
|
+
socket.on('connect', () => done(true));
|
|
187
|
+
socket.on('timeout', () => done(false));
|
|
188
|
+
socket.on('error', () => done(false));
|
|
189
|
+
});
|
|
190
|
+
if (inUse)
|
|
191
|
+
return port;
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const ICON = { pass: '✔', warn: '!', fail: '✖' };
|
|
196
|
+
function formatReport(results) {
|
|
197
|
+
const lines = ['', 'Hexcore preflight', '─────────────────'];
|
|
198
|
+
for (const r of results) {
|
|
199
|
+
lines.push(` ${ICON[r.status]} ${r.name.padEnd(26)} ${r.message}`);
|
|
200
|
+
if (r.status !== 'pass' && r.hint)
|
|
201
|
+
lines.push(` → ${r.hint}`);
|
|
202
|
+
}
|
|
203
|
+
const failed = results.filter(r => r.status === 'fail');
|
|
204
|
+
lines.push('');
|
|
205
|
+
if (failed.length === 0) {
|
|
206
|
+
lines.push(' All checks passed.');
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const fatal = failed.filter(f => f.fatal).length;
|
|
210
|
+
lines.push(` ${failed.length} check(s) failed${fatal ? `, ${fatal} fatal` : ' (non-fatal)'}.`);
|
|
211
|
+
}
|
|
212
|
+
lines.push('');
|
|
213
|
+
return lines.join('\n');
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":";;AAyCA,oCA+LC;AAwBD,oCAgBC;AAhRD;;;;;;;;GAQG;AACH,+CAA2E;AAC3E,uCAA4C;AAC5C,qCAAmC;AACnC,4CAAuE;AAEvE,4DAAwD;AACxD,+CAAsD;AACtD,2CAAiD;AAWjD,KAAK,UAAU,KAAK,CAChB,IAAY,EACZ,KAAc,EACd,EAA+E,EAC/E,UAAmB;IAEnB,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,EAAE,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9F,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,MAAiB;IAChD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,OAAO,CAAC,IAAI,CACR,MAAM,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,KAAK,GAAG,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,CAAC,QAAQ,CAAC,IAAI,kCAAkC,CAAC,CAAC;QACjG,OAAO,EAAE,OAAO,EAAE,QAAQ,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IACxD,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,CAAC,IAAI,CACR,MAAM,KAAK,CACP,iBAAiB,EACjB,IAAI,EACJ,KAAK,IAAI,EAAE;QACP,MAAM,IAAA,gBAAK,EAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,2DAA2D;QAC3D,gEAAgE;QAChE,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,QAAQ,eAAe,CAAC;QAChD,MAAM,IAAA,oBAAS,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7B,MAAM,IAAA,aAAE,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC,EACD,mFAAmF,CACtF,CACJ,CAAC;IAEF;;;;;;;;;;OAUG;IACH,OAAO,CAAC,IAAI,CACR,MAAM,KAAK,CACP,eAAe,EACf,KAAK,EACL,KAAK,IAAI,EAAE;QACP,MAAM,MAAM,GAAG,IAAI,8BAAa,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvC,OAAO,EAAE,OAAO,EAAE,qBAAqB,OAAO,SAAS,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;IACnF,CAAC,EACD,IAAA,kBAAQ,GAAE,KAAK,QAAQ;QACnB,CAAC,CAAC,kGAAkG;QACpG,CAAC,CAAC,0MAA0M,CACnN,CACJ,CAAC;IAEF,OAAO,CAAC,IAAI,CACR,MAAM,KAAK,CACP,2BAA2B,EAC3B,KAAK,EACL,KAAK,IAAI,EAAE;QACP,MAAM,IAAA,iBAAM,EAAC,MAAM,CAAC,YAAY,EAAE,oBAAS,CAAC,IAAI,GAAG,oBAAS,CAAC,IAAI,CAAC,CAAC;QACnE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IACxC,CAAC,EACD,wGAAwG,CAC3G,CACJ,CAAC;IAEF,OAAO,CAAC,IAAI,CACR,MAAM,KAAK,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,IAAI,8BAAa,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7D,OAAO,OAAO;YACV,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,cAAc,UAAU,EAAE;YACjD,CAAC,CAAC;gBACI,MAAM,EAAE,MAAe;gBACvB,OAAO,EAAE,GAAG,MAAM,CAAC,cAAc,iBAAiB;gBAClD,IAAI,EAAE,mEAAmE;aAC5E,CAAC;IACZ,CAAC,CAAC,CACL,CAAC;IAEF,IAAI,MAAM,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;QACvC;;;;WAIG;QACH,OAAO,CAAC,IAAI,CACR,MAAM,KAAK,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBAC9B,OAAO;oBACH,MAAM,EAAE,MAAe;oBACvB,OAAO,EAAE,oBAAoB;oBAC7B,IAAI,EACA,uEAAuE;wBACvE,6EAA6E;iBACpF,CAAC;YACN,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,6BAAkB,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC9F,IAAI,CAAC;gBACD,MAAM,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YAC3C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO;oBACH,MAAM,EAAE,MAAe;oBACvB,OAAO,EAAG,GAAa,CAAC,OAAO;oBAC/B,IAAI,EACA,kEAAkE;wBAClE,yEAAyE;wBACzE,8CAA8C;iBACrD,CAAC;YACN,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,YAAY,EAAE,CAAC;QACtD,CAAC,CAAC,CACL,CAAC;QAEF;;;;;;;;;WASG;QACH,OAAO,CAAC,IAAI,CACR,MAAM,KAAK,CAAC,wBAAwB,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG,IAAA,2BAAkB,EAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAA,yBAAgB,EAAC,OAAO,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACjE,MAAM,MAAM,GACR,MAAM,CAAC,iBAAiB,CAAC,cAAc,KAAK,SAAS;gBACjD,CAAC,CAAC,uBAAuB;gBACzB,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,IAAI,SAAS,UAAU,CAAC;YAEnD,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,IAAI,OAAO,EAAE,CAAC;gBAC5C,OAAO;oBACH,MAAM,EAAE,MAAe;oBACvB,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,2BAA2B;oBACpD,IAAI,EACA,0EAA0E;wBAC1E,wDAAwD;iBAC/D,CAAC;YACN,CAAC;YACD,IAAI,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CACX,GAAG,MAAM,UAAU,IAAI,CAAC,cAAc,iCAAiC;oBACnE,yEAAyE;oBACzE,uCAAuC,CAC9C,CAAC;YACN,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,UAAU,MAAM,mBAAmB,EAAE,CAAC;QAClF,CAAC,CAAC,CACL,CAAC;IACN,CAAC;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,IAAI,CACR,MAAM,KAAK,CAAC,qBAAqB,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAe,EAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,KAAK,cAAc,CAAC;QACtD,OAAO;YACH,MAAM,EAAE,MAAe;YACvB,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,aAAa;YACvC,IAAI,EAAE,MAAM;gBACR,CAAC,CAAC,6EAA6E;oBAC7E,kFAAkF;gBACpF,CAAC,CAAC,qFAAqF;SAC9F,CAAC;IACN,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,CAAC,IAAI,CACR,MAAM,KAAK,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,oBAAoB,CAAC,CAAC;QAC5D,OAAO,EAAE,OAAO,EAAE,YAAY,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;IACvD,CAAC,EAAE,kFAAkF,CAAC,CACzF,CAAC;IAEF,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,kEAAkE;AAClE,KAAK,UAAU,aAAa,CAAC,KAAe;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAU,OAAO,CAAC,EAAE;YAC/C,MAAM,MAAM,GAAG,IAAA,2BAAgB,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,EAAE;gBAC7B,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAW,CAAC;AAE1D,SAAgB,YAAY,CAAC,OAAsB;IAC/C,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,mBAAmB,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
|