@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.
Files changed (173) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/LICENSE +201 -0
  3. package/README.md +283 -0
  4. package/dist/app.module.js +55 -0
  5. package/dist/app.module.js.map +1 -0
  6. package/dist/auth.js +151 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/chain/cost-models.js +81 -0
  9. package/dist/chain/cost-models.js.map +1 -0
  10. package/dist/chain/provider.js +269 -0
  11. package/dist/chain/provider.js.map +1 -0
  12. package/dist/chain/socket.js +48 -0
  13. package/dist/chain/socket.js.map +1 -0
  14. package/dist/cli/doctor.js +43 -0
  15. package/dist/cli/doctor.js.map +1 -0
  16. package/dist/cli/hexcore.js +435 -0
  17. package/dist/cli/hexcore.js.map +1 -0
  18. package/dist/common/auth.guard.js +66 -0
  19. package/dist/common/auth.guard.js.map +1 -0
  20. package/dist/common/http.js +171 -0
  21. package/dist/common/http.js.map +1 -0
  22. package/dist/common/zod-validation.pipe.js +47 -0
  23. package/dist/common/zod-validation.pipe.js.map +1 -0
  24. package/dist/config.js +354 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/config.module.js +35 -0
  27. package/dist/config.module.js.map +1 -0
  28. package/dist/controllers/cardano.controller.js +173 -0
  29. package/dist/controllers/cardano.controller.js.map +1 -0
  30. package/dist/controllers/heads.controller.js +225 -0
  31. package/dist/controllers/heads.controller.js.map +1 -0
  32. package/dist/controllers/setup.controller.js +127 -0
  33. package/dist/controllers/setup.controller.js.map +1 -0
  34. package/dist/controllers/system.controller.js +153 -0
  35. package/dist/controllers/system.controller.js.map +1 -0
  36. package/dist/db/database.module.js +73 -0
  37. package/dist/db/database.module.js.map +1 -0
  38. package/dist/db/index.js +135 -0
  39. package/dist/db/index.js.map +1 -0
  40. package/dist/db/repositories.js +220 -0
  41. package/dist/db/repositories.js.map +1 -0
  42. package/dist/docker/container-stats.js +134 -0
  43. package/dist/docker/container-stats.js.map +1 -0
  44. package/dist/docker/docker.service.js +335 -0
  45. package/dist/docker/docker.service.js.map +1 -0
  46. package/dist/hydra/argv.js +172 -0
  47. package/dist/hydra/argv.js.map +1 -0
  48. package/dist/hydra/blockfrost-keys.js +15 -0
  49. package/dist/hydra/blockfrost-keys.js.map +1 -0
  50. package/dist/hydra/boot-progress.js +165 -0
  51. package/dist/hydra/boot-progress.js.map +1 -0
  52. package/dist/hydra/capabilities.js +131 -0
  53. package/dist/hydra/capabilities.js.map +1 -0
  54. package/dist/hydra/head.service.js +1072 -0
  55. package/dist/hydra/head.service.js.map +1 -0
  56. package/dist/hydra/keys.js +301 -0
  57. package/dist/hydra/keys.js.map +1 -0
  58. package/dist/hydra/node-monitor.service.js +265 -0
  59. package/dist/hydra/node-monitor.service.js.map +1 -0
  60. package/dist/hydra/ws-client.js +177 -0
  61. package/dist/hydra/ws-client.js.map +1 -0
  62. package/dist/main.js +106 -0
  63. package/dist/main.js.map +1 -0
  64. package/dist/preflight.js +215 -0
  65. package/dist/preflight.js.map +1 -0
  66. package/dist/settings.js +243 -0
  67. package/dist/settings.js.map +1 -0
  68. package/dist/setup.service.js +257 -0
  69. package/dist/setup.service.js.map +1 -0
  70. package/dist/version.js +46 -0
  71. package/dist/version.js.map +1 -0
  72. package/node_modules/@hexcore/shared/dist/cjs/api.d.ts +730 -0
  73. package/node_modules/@hexcore/shared/dist/cjs/api.d.ts.map +1 -0
  74. package/node_modules/@hexcore/shared/dist/cjs/api.js +358 -0
  75. package/node_modules/@hexcore/shared/dist/cjs/api.js.map +1 -0
  76. package/node_modules/@hexcore/shared/dist/cjs/domain.d.ts +298 -0
  77. package/node_modules/@hexcore/shared/dist/cjs/domain.d.ts.map +1 -0
  78. package/node_modules/@hexcore/shared/dist/cjs/domain.js +49 -0
  79. package/node_modules/@hexcore/shared/dist/cjs/domain.js.map +1 -0
  80. package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.d.ts +279 -0
  81. package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.d.ts.map +1 -0
  82. package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.js +453 -0
  83. package/node_modules/@hexcore/shared/dist/cjs/hydra-versions.js.map +1 -0
  84. package/node_modules/@hexcore/shared/dist/cjs/index.d.ts +7 -0
  85. package/node_modules/@hexcore/shared/dist/cjs/index.d.ts.map +1 -0
  86. package/node_modules/@hexcore/shared/dist/cjs/index.js +23 -0
  87. package/node_modules/@hexcore/shared/dist/cjs/index.js.map +1 -0
  88. package/node_modules/@hexcore/shared/dist/cjs/naming.d.ts +118 -0
  89. package/node_modules/@hexcore/shared/dist/cjs/naming.d.ts.map +1 -0
  90. package/node_modules/@hexcore/shared/dist/cjs/naming.js +103 -0
  91. package/node_modules/@hexcore/shared/dist/cjs/naming.js.map +1 -0
  92. package/node_modules/@hexcore/shared/dist/cjs/offline.d.ts +73 -0
  93. package/node_modules/@hexcore/shared/dist/cjs/offline.d.ts.map +1 -0
  94. package/node_modules/@hexcore/shared/dist/cjs/offline.js +80 -0
  95. package/node_modules/@hexcore/shared/dist/cjs/offline.js.map +1 -0
  96. package/node_modules/@hexcore/shared/dist/cjs/protocol-params.d.ts +79 -0
  97. package/node_modules/@hexcore/shared/dist/cjs/protocol-params.d.ts.map +1 -0
  98. package/node_modules/@hexcore/shared/dist/cjs/protocol-params.js +223 -0
  99. package/node_modules/@hexcore/shared/dist/cjs/protocol-params.js.map +1 -0
  100. package/node_modules/@hexcore/shared/dist/esm/api.js +355 -0
  101. package/node_modules/@hexcore/shared/dist/esm/api.js.map +1 -0
  102. package/node_modules/@hexcore/shared/dist/esm/domain.js +46 -0
  103. package/node_modules/@hexcore/shared/dist/esm/domain.js.map +1 -0
  104. package/node_modules/@hexcore/shared/dist/esm/hydra-versions.js +441 -0
  105. package/node_modules/@hexcore/shared/dist/esm/hydra-versions.js.map +1 -0
  106. package/node_modules/@hexcore/shared/dist/esm/index.js +7 -0
  107. package/node_modules/@hexcore/shared/dist/esm/index.js.map +1 -0
  108. package/node_modules/@hexcore/shared/dist/esm/naming.js +95 -0
  109. package/node_modules/@hexcore/shared/dist/esm/naming.js.map +1 -0
  110. package/node_modules/@hexcore/shared/dist/esm/offline.js +75 -0
  111. package/node_modules/@hexcore/shared/dist/esm/offline.js.map +1 -0
  112. package/node_modules/@hexcore/shared/dist/esm/package.json +3 -0
  113. package/node_modules/@hexcore/shared/dist/esm/protocol-params.js +217 -0
  114. package/node_modules/@hexcore/shared/dist/esm/protocol-params.js.map +1 -0
  115. package/node_modules/@hexcore/shared/package.json +15 -0
  116. package/package.json +67 -0
  117. package/web/200.html +23 -0
  118. package/web/404.html +23 -0
  119. package/web/_nuxt/2MxohCD-.js +1 -0
  120. package/web/_nuxt/4pFXjB_u.js +1 -0
  121. package/web/_nuxt/B-v0dEQX.js +1 -0
  122. package/web/_nuxt/B4yE3U25.js +1 -0
  123. package/web/_nuxt/BFh8Ai0L.js +1 -0
  124. package/web/_nuxt/BgPn4NJH.js +1 -0
  125. package/web/_nuxt/Bj1xviSh.js +1 -0
  126. package/web/_nuxt/BnotlrL7.js +1 -0
  127. package/web/_nuxt/C1YRg2ic.js +1 -0
  128. package/web/_nuxt/CGD7MYQH.js +1 -0
  129. package/web/_nuxt/CQcG7Bu4.js +1 -0
  130. package/web/_nuxt/CS3KqpH_.js +1 -0
  131. package/web/_nuxt/CT-yt694.js +1 -0
  132. package/web/_nuxt/CZK6xUH-.js +1 -0
  133. package/web/_nuxt/CcdyYRYz.js +1 -0
  134. package/web/_nuxt/CePNTU1S.js +1 -0
  135. package/web/_nuxt/CgPLsCeU.js +5 -0
  136. package/web/_nuxt/CkCrahXt.js +1 -0
  137. package/web/_nuxt/CnOqDT9k.js +3 -0
  138. package/web/_nuxt/CqsSss-D.js +1 -0
  139. package/web/_nuxt/Cr8dL64Q.js +1 -0
  140. package/web/_nuxt/D3CwzwU0.js +1 -0
  141. package/web/_nuxt/DDANn6-H.js +1 -0
  142. package/web/_nuxt/DDl9uKIA.js +1 -0
  143. package/web/_nuxt/DL9i0ayn.js +1 -0
  144. package/web/_nuxt/DLNoK9BC.js +1 -0
  145. package/web/_nuxt/DLztFeOQ.js +1 -0
  146. package/web/_nuxt/DPihKXdt.js +1 -0
  147. package/web/_nuxt/DXyr6Naa.js +1 -0
  148. package/web/_nuxt/DeDg5p0D.js +1 -0
  149. package/web/_nuxt/DgDlQiDU.js +1 -0
  150. package/web/_nuxt/DyPI7qJE.js +30 -0
  151. package/web/_nuxt/LGfPBi70.js +1 -0
  152. package/web/_nuxt/Onf26W-r.js +1 -0
  153. package/web/_nuxt/QZNQe_OX.js +1 -0
  154. package/web/_nuxt/Y8IJM-iz.js +1 -0
  155. package/web/_nuxt/YUGC0nt0.js +1 -0
  156. package/web/_nuxt/builds/latest.json +1 -0
  157. package/web/_nuxt/builds/meta/7e461629-93e2-4694-b237-6d5c6a85c97c.json +1 -0
  158. package/web/_nuxt/builds/meta/dev.json +1 -0
  159. package/web/_nuxt/entry.BxsAxZxf.css +1 -0
  160. package/web/_nuxt/error-404.XbtAw-qw.css +1 -0
  161. package/web/_nuxt/error-500.CNHVltWM.css +1 -0
  162. package/web/_nuxt/rS90pPZ_.js +1 -0
  163. package/web/_nuxt/rhEiP908.js +1 -0
  164. package/web/_nuxt/vSj9Ec0g.js +1 -0
  165. package/web/_nuxt/woNjBJMN.js +1 -0
  166. package/web/favicon.svg +28 -0
  167. package/web/heads/index.html +23 -0
  168. package/web/heads/new/index.html +23 -0
  169. package/web/index.html +23 -0
  170. package/web/login/index.html +23 -0
  171. package/web/logo.svg +56 -0
  172. package/web/settings/index.html +23 -0
  173. 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
@@ -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":"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"}