@serfab/cadre-host 1.13.0 → 1.14.0
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/README.md +332 -423
- package/dist/bin/host.d.ts +6 -3
- package/dist/bin/host.js +301 -505
- package/dist/bin/host.js.map +1 -1
- package/dist/bin/join-output.d.ts +56 -0
- package/dist/bin/join-output.js +92 -0
- package/dist/bin/join-output.js.map +1 -0
- package/dist/bin/nat-output.d.ts +49 -0
- package/dist/bin/nat-output.js +127 -0
- package/dist/bin/nat-output.js.map +1 -0
- package/dist/hosted/claim-details.d.ts +44 -0
- package/dist/hosted/claim-details.js +66 -0
- package/dist/hosted/claim-details.js.map +1 -0
- package/dist/hosted/hosted-node-service.d.ts +318 -0
- package/dist/hosted/hosted-node-service.js +666 -0
- package/dist/hosted/hosted-node-service.js.map +1 -0
- package/dist/hosted/hosted-node-store.d.ts +40 -0
- package/dist/hosted/hosted-node-store.js +126 -0
- package/dist/hosted/hosted-node-store.js.map +1 -0
- package/dist/{donation/donation-supervisor.d.ts → hosted/hosted-node-supervisor.d.ts} +70 -53
- package/dist/hosted/hosted-node-supervisor.js +396 -0
- package/dist/hosted/hosted-node-supervisor.js.map +1 -0
- package/dist/hosted/hosted-node-watcher.d.ts +83 -0
- package/dist/hosted/hosted-node-watcher.js +224 -0
- package/dist/hosted/hosted-node-watcher.js.map +1 -0
- package/dist/hosted/index.d.ts +16 -0
- package/dist/hosted/index.js +13 -0
- package/dist/hosted/index.js.map +1 -0
- package/dist/hosted/node-status.d.ts +35 -0
- package/dist/hosted/node-status.js +61 -0
- package/dist/hosted/node-status.js.map +1 -0
- package/dist/hosted/types.d.ts +134 -0
- package/dist/hosted/types.js +22 -0
- package/dist/hosted/types.js.map +1 -0
- package/dist/index.d.ts +12 -24
- package/dist/index.js +9 -19
- package/dist/index.js.map +1 -1
- package/dist/installer/config.d.ts +4 -34
- package/dist/installer/config.js +3 -18
- package/dist/installer/config.js.map +1 -1
- package/dist/installer/index.d.ts +7 -19
- package/dist/installer/index.js +14 -69
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/paths.d.ts +0 -2
- package/dist/installer/paths.js +0 -4
- package/dist/installer/paths.js.map +1 -1
- package/dist/installer/wizard.d.ts +0 -7
- package/dist/installer/wizard.js +1 -8
- package/dist/installer/wizard.js.map +1 -1
- package/dist/nat/address-resolver.d.ts +18 -17
- package/dist/nat/address-resolver.js +79 -25
- package/dist/nat/address-resolver.js.map +1 -1
- package/dist/nat/address-watch.d.ts +37 -0
- package/dist/nat/address-watch.js +84 -0
- package/dist/nat/address-watch.js.map +1 -0
- package/dist/nat/ddns/duckdns.d.ts +2 -1
- package/dist/nat/ddns/duckdns.js +5 -1
- package/dist/nat/ddns/duckdns.js.map +1 -1
- package/dist/nat/ddns/index.d.ts +6 -0
- package/dist/nat/ddns/index.js.map +1 -1
- package/dist/nat/index.d.ts +12 -9
- package/dist/nat/index.js +6 -5
- package/dist/nat/index.js.map +1 -1
- package/dist/nat/nat-service.d.ts +203 -77
- package/dist/nat/nat-service.js +602 -237
- package/dist/nat/nat-service.js.map +1 -1
- package/dist/nat/nat-store.d.ts +12 -5
- package/dist/nat/nat-store.js +114 -30
- package/dist/nat/nat-store.js.map +1 -1
- package/dist/nat/port-mapper.d.ts +83 -79
- package/dist/nat/port-mapper.js +148 -189
- package/dist/nat/port-mapper.js.map +1 -1
- package/dist/nat/reachability.d.ts +31 -15
- package/dist/nat/reachability.js +97 -22
- package/dist/nat/reachability.js.map +1 -1
- package/dist/nat/types.d.ts +78 -27
- package/dist/nat/types.js +8 -5
- package/dist/nat/types.js.map +1 -1
- package/dist/orchestrator/host-process-orchestrator.d.ts +29 -71
- package/dist/orchestrator/host-process-orchestrator.js +78 -218
- package/dist/orchestrator/host-process-orchestrator.js.map +1 -1
- package/dist/{installer/identity.d.ts → orchestrator/identity-file.d.ts} +5 -5
- package/dist/{installer/identity.js → orchestrator/identity-file.js} +6 -6
- package/dist/orchestrator/identity-file.js.map +1 -0
- package/dist/orchestrator/index.d.ts +2 -3
- package/dist/orchestrator/index.js +1 -1
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/node-identity.d.ts +6 -6
- package/dist/orchestrator/node-identity.js +7 -7
- package/dist/orchestrator/node-identity.js.map +1 -1
- package/dist/orchestrator/port-allocator.d.ts +5 -6
- package/dist/orchestrator/port-allocator.js +9 -11
- package/dist/orchestrator/port-allocator.js.map +1 -1
- package/dist/orchestrator/state-store.d.ts +3 -5
- package/dist/orchestrator/state-store.js +2 -10
- package/dist/orchestrator/state-store.js.map +1 -1
- package/dist/orchestrator/types.d.ts +33 -22
- package/dist/orchestrator/types.js.map +1 -1
- package/dist/server/error-handler.d.ts +5 -25
- package/dist/server/error-handler.js +11 -74
- package/dist/server/error-handler.js.map +1 -1
- package/dist/server/events/types.d.ts +7 -11
- package/dist/server/events/types.js +2 -1
- package/dist/server/events/types.js.map +1 -1
- package/dist/server/index.d.ts +11 -37
- package/dist/server/index.js +30 -48
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/hosted-nodes.d.ts +28 -0
- package/dist/server/routes/hosted-nodes.js +68 -0
- package/dist/server/routes/hosted-nodes.js.map +1 -0
- package/dist/server/routes/nat.d.ts +4 -1
- package/dist/server/routes/nat.js +13 -2
- package/dist/server/routes/nat.js.map +1 -1
- package/dist/server/routes/nodes.d.ts +6 -20
- package/dist/server/routes/nodes.js +7 -86
- package/dist/server/routes/nodes.js.map +1 -1
- package/dist/server/routes/settings.d.ts +2 -7
- package/dist/server/routes/settings.js +3 -7
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/status.d.ts +2 -25
- package/dist/server/routes/status.js +1 -11
- package/dist/server/routes/status.js.map +1 -1
- package/dist/server/server.js +8 -8
- package/dist/server/settings-store.d.ts +2 -2
- package/dist/server/settings-store.js +2 -2
- package/dist/server/static.js +1 -2
- package/dist/server/static.js.map +1 -1
- package/dist/ui/assets/index-4FWuU8ye.js +19 -0
- package/dist/ui/assets/index-4FWuU8ye.js.map +1 -0
- package/dist/ui/assets/index-Di9Q4d01.css +1 -0
- package/dist/ui/index.html +2 -2
- package/dist/update/index.d.ts +2 -2
- package/dist/update/index.js +2 -2
- package/dist/update/store.d.ts +1 -1
- package/dist/update/store.js +1 -1
- package/dist/update/types.d.ts +1 -1
- package/dist/update/types.js +1 -1
- package/package.json +5 -6
- package/src/__tests__/cli-nat.smoke.test.ts +219 -212
- package/src/__tests__/cli.smoke.test.ts +1 -1
- package/src/__tests__/global-setup.ts +2 -3
- package/src/__tests__/orchestrator-claim-secret.test.ts +112 -0
- package/src/__tests__/orchestrator-handle-contract.ts +134 -134
- package/src/__tests__/orchestrator-node-identity.test.ts +182 -203
- package/src/__tests__/orchestrator-ports.test.ts +124 -143
- package/src/__tests__/orchestrator-push.test.ts +138 -146
- package/src/__tests__/orchestrator.test.ts +1019 -1063
- package/src/bin/host.ts +368 -553
- package/src/bin/join-output.ts +120 -0
- package/src/bin/nat-output.ts +177 -0
- package/src/{donation → hosted}/__tests__/fake-orchestrator.test.ts +173 -173
- package/src/{donation → hosted}/__tests__/fake-orchestrator.ts +265 -243
- package/src/hosted/__tests__/hosted-node-service.test.ts +609 -0
- package/src/hosted/__tests__/hosted-node-supervisor.test.ts +474 -0
- package/src/hosted/__tests__/test-invitation.ts +33 -0
- package/src/hosted/claim-details.ts +96 -0
- package/src/hosted/hosted-node-service.ts +795 -0
- package/src/hosted/hosted-node-store.ts +144 -0
- package/src/hosted/hosted-node-supervisor.ts +439 -0
- package/src/hosted/hosted-node-watcher.ts +250 -0
- package/src/hosted/index.ts +53 -0
- package/src/hosted/node-status.ts +71 -0
- package/src/hosted/types.ts +153 -0
- package/src/index.ts +72 -91
- package/src/installer/__tests__/config.test.ts +15 -40
- package/src/installer/__tests__/installer.smoke.test.ts +5 -86
- package/src/installer/__tests__/wizard.test.ts +56 -64
- package/src/installer/config.ts +135 -175
- package/src/installer/index.ts +15 -83
- package/src/installer/paths.ts +104 -109
- package/src/installer/wizard.ts +87 -103
- package/src/nat/__tests__/address-resolver.test.ts +107 -82
- package/src/nat/__tests__/nat-service.test.ts +433 -408
- package/src/nat/__tests__/nat-store.test.ts +127 -93
- package/src/nat/__tests__/port-mapper.test.ts +30 -191
- package/src/nat/__tests__/reachability.test.ts +96 -13
- package/src/nat/address-resolver.ts +94 -52
- package/src/nat/address-watch.ts +92 -0
- package/src/nat/ddns/duckdns.ts +5 -1
- package/src/nat/ddns/index.ts +6 -0
- package/src/nat/index.ts +87 -71
- package/src/nat/nat-service.ts +889 -501
- package/src/nat/nat-store.ts +237 -154
- package/src/nat/port-mapper.ts +241 -329
- package/src/nat/reachability.ts +134 -25
- package/src/nat/types.ts +209 -159
- package/src/{installer/__tests__/identity.test.ts → orchestrator/__tests__/identity-file.test.ts} +34 -34
- package/src/orchestrator/__tests__/node-identity.test.ts +62 -62
- package/src/orchestrator/host-process-orchestrator.ts +81 -243
- package/src/{installer/identity.ts → orchestrator/identity-file.ts} +56 -56
- package/src/orchestrator/index.ts +9 -10
- package/src/orchestrator/node-identity.ts +41 -41
- package/src/orchestrator/port-allocator.ts +71 -73
- package/src/orchestrator/state-store.ts +76 -90
- package/src/orchestrator/types.ts +34 -23
- package/src/server/__tests__/bus.test.ts +38 -38
- package/src/server/__tests__/error-handler.test.ts +81 -118
- package/src/server/__tests__/fakes.ts +40 -44
- package/src/server/__tests__/hosted-nodes-route.test.ts +160 -0
- package/src/server/__tests__/nodes-route.test.ts +114 -283
- package/src/server/__tests__/publishers.test.ts +193 -180
- package/src/server/__tests__/server.smoke.test.ts +134 -223
- package/src/server/__tests__/settings-route.test.ts +179 -195
- package/src/server/__tests__/sse-route.test.ts +119 -119
- package/src/server/__tests__/status-route.test.ts +82 -121
- package/src/server/error-handler.ts +112 -178
- package/src/server/events/types.ts +20 -24
- package/src/server/index.ts +223 -267
- package/src/server/routes/hosted-nodes.ts +83 -0
- package/src/server/routes/nat.ts +75 -63
- package/src/server/routes/nodes.ts +96 -188
- package/src/server/routes/settings.ts +115 -123
- package/src/server/routes/status.ts +102 -134
- package/src/server/server.ts +8 -8
- package/src/server/settings-store.ts +2 -2
- package/src/server/static.ts +1 -2
- package/src/update/index.ts +2 -2
- package/src/update/store.ts +1 -1
- package/src/update/types.ts +1 -1
- package/dist/auth/duration.d.ts +0 -1
- package/dist/auth/duration.js +0 -32
- package/dist/auth/duration.js.map +0 -1
- package/dist/auth/index.d.ts +0 -11
- package/dist/auth/index.js +0 -9
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/self-label.d.ts +0 -36
- package/dist/auth/self-label.js +0 -57
- package/dist/auth/self-label.js.map +0 -1
- package/dist/auth/trust-circle-store.d.ts +0 -26
- package/dist/auth/trust-circle-store.js +0 -129
- package/dist/auth/trust-circle-store.js.map +0 -1
- package/dist/auth/trust-circle.d.ts +0 -156
- package/dist/auth/trust-circle.js +0 -307
- package/dist/auth/trust-circle.js.map +0 -1
- package/dist/auth/types.d.ts +0 -84
- package/dist/auth/types.js +0 -24
- package/dist/auth/types.js.map +0 -1
- package/dist/donation/donation-service.d.ts +0 -389
- package/dist/donation/donation-service.js +0 -828
- package/dist/donation/donation-service.js.map +0 -1
- package/dist/donation/donation-store.d.ts +0 -51
- package/dist/donation/donation-store.js +0 -152
- package/dist/donation/donation-store.js.map +0 -1
- package/dist/donation/donation-supervisor.js +0 -364
- package/dist/donation/donation-supervisor.js.map +0 -1
- package/dist/donation/grant-service.d.ts +0 -80
- package/dist/donation/grant-service.js +0 -210
- package/dist/donation/grant-service.js.map +0 -1
- package/dist/donation/grant-store.d.ts +0 -38
- package/dist/donation/grant-store.js +0 -135
- package/dist/donation/grant-store.js.map +0 -1
- package/dist/donation/index.d.ts +0 -20
- package/dist/donation/index.js +0 -17
- package/dist/donation/index.js.map +0 -1
- package/dist/donation/types.d.ts +0 -224
- package/dist/donation/types.js +0 -40
- package/dist/donation/types.js.map +0 -1
- package/dist/installer/identity.js.map +0 -1
- package/dist/owner/index.d.ts +0 -11
- package/dist/owner/index.js +0 -11
- package/dist/owner/index.js.map +0 -1
- package/dist/owner/owner-node-client.d.ts +0 -110
- package/dist/owner/owner-node-client.js +0 -184
- package/dist/owner/owner-node-client.js.map +0 -1
- package/dist/server/routes/bootstrap-node-validation.d.ts +0 -115
- package/dist/server/routes/bootstrap-node-validation.js +0 -197
- package/dist/server/routes/bootstrap-node-validation.js.map +0 -1
- package/dist/server/routes/grants-admin.d.ts +0 -29
- package/dist/server/routes/grants-admin.js +0 -58
- package/dist/server/routes/grants-admin.js.map +0 -1
- package/dist/server/routes/grants.d.ts +0 -28
- package/dist/server/routes/grants.js +0 -165
- package/dist/server/routes/grants.js.map +0 -1
- package/dist/server/routes/provision-request-validation.d.ts +0 -45
- package/dist/server/routes/provision-request-validation.js +0 -97
- package/dist/server/routes/provision-request-validation.js.map +0 -1
- package/dist/server/routes/strands.d.ts +0 -20
- package/dist/server/routes/strands.js +0 -38
- package/dist/server/routes/strands.js.map +0 -1
- package/dist/server/routes/trust-circle.d.ts +0 -17
- package/dist/server/routes/trust-circle.js +0 -35
- package/dist/server/routes/trust-circle.js.map +0 -1
- package/dist/strands/index.d.ts +0 -7
- package/dist/strands/index.js +0 -6
- package/dist/strands/index.js.map +0 -1
- package/dist/strands/strand-service.d.ts +0 -50
- package/dist/strands/strand-service.js +0 -103
- package/dist/strands/strand-service.js.map +0 -1
- package/dist/strands/types.d.ts +0 -93
- package/dist/strands/types.js +0 -23
- package/dist/strands/types.js.map +0 -1
- package/dist/ui/assets/index-C6nELNfC.js +0 -23
- package/dist/ui/assets/index-C6nELNfC.js.map +0 -1
- package/dist/ui/assets/index-TtIYSeZO.css +0 -1
- package/src/__tests__/cli-invite.smoke.test.ts +0 -192
- package/src/__tests__/host-owner.smoke.test.ts +0 -123
- package/src/__tests__/orchestrator-owner.test.ts +0 -234
- package/src/__tests__/orchestrator-pin-keys.test.ts +0 -152
- package/src/auth/__tests__/duration.test.ts +0 -28
- package/src/auth/__tests__/self-label.test.ts +0 -85
- package/src/auth/__tests__/trust-circle-integration.test.ts +0 -152
- package/src/auth/__tests__/trust-circle-store.test.ts +0 -115
- package/src/auth/__tests__/trust-circle.test.ts +0 -445
- package/src/auth/duration.ts +0 -33
- package/src/auth/index.ts +0 -21
- package/src/auth/self-label.ts +0 -74
- package/src/auth/trust-circle-store.ts +0 -155
- package/src/auth/trust-circle.ts +0 -395
- package/src/auth/types.ts +0 -99
- package/src/donation/__tests__/donation-service.test.ts +0 -1193
- package/src/donation/__tests__/donation-supervisor.test.ts +0 -548
- package/src/donation/__tests__/grant-service.test.ts +0 -213
- package/src/donation/__tests__/grant-store.test.ts +0 -113
- package/src/donation/donation-service.ts +0 -1033
- package/src/donation/donation-store.ts +0 -176
- package/src/donation/donation-supervisor.ts +0 -411
- package/src/donation/grant-service.ts +0 -252
- package/src/donation/grant-store.ts +0 -152
- package/src/donation/index.ts +0 -65
- package/src/donation/types.ts +0 -260
- package/src/owner/__tests__/owner-node-client.test.ts +0 -194
- package/src/owner/index.ts +0 -12
- package/src/owner/owner-node-client.ts +0 -259
- package/src/server/__tests__/bootstrap-node-validation.test.ts +0 -138
- package/src/server/__tests__/grants-admin-route.test.ts +0 -171
- package/src/server/__tests__/grants-route.test.ts +0 -394
- package/src/server/__tests__/strands-route.test.ts +0 -234
- package/src/server/routes/bootstrap-node-validation.ts +0 -206
- package/src/server/routes/grants-admin.ts +0 -74
- package/src/server/routes/grants.ts +0 -193
- package/src/server/routes/provision-request-validation.ts +0 -105
- package/src/server/routes/strands.ts +0 -54
- package/src/server/routes/trust-circle.ts +0 -49
- package/src/strands/__tests__/strand-service.test.ts +0 -165
- package/src/strands/index.ts +0 -14
- package/src/strands/strand-service.ts +0 -135
- package/src/strands/types.ts +0 -102
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* /api/nodes — list managed cadre nodes, look up
|
|
3
|
-
* lifecycle
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* start/stop/restart are real for the admin's owner node only (start/restart
|
|
10
|
-
* re-spawn it from the persisted `OwnerSpawnConfig`). Every other node this
|
|
11
|
-
* route can see is a donated node, whose lifecycle belongs to the donation
|
|
12
|
-
* surface — this route no longer spawns generic nodes, and a stop here would
|
|
13
|
-
* be undone at once by the donation supervisor's respawn. So all three verbs
|
|
14
|
-
* answer a known non-owner node with 501, pointing at the donation teardown.
|
|
15
|
-
*
|
|
16
|
-
* Owner start/restart are founder-only: a donor-only host that once ran as a
|
|
17
|
-
* founder still holds the owner handle and saved config (so re-enabling
|
|
18
|
-
* `ownCadre` can resume it), but spawning it here would bring the owner node
|
|
19
|
-
* back without its trust circle, NAT or strand services — so those answer 409.
|
|
2
|
+
* /api/nodes — list managed cadre nodes (orchestrator handles), look up one
|
|
3
|
+
* node's details, and tail its log. Read-only: every node's lifecycle belongs to
|
|
4
|
+
* `/api/hosted-nodes`, whose supervisor would undo at once a stop issued
|
|
5
|
+
* anywhere else. A handle's `partyId` is the placeholder an unclaimed node was
|
|
6
|
+
* started with until its first respawn after the claim; the hosted-node record
|
|
7
|
+
* carries the real party.
|
|
20
8
|
*/
|
|
21
9
|
import type { FastifyInstance } from 'fastify';
|
|
22
10
|
import type { HostProcessOrchestrator } from '../../orchestrator/index.js';
|
|
23
|
-
import type { HostRole } from './status.js';
|
|
24
11
|
export interface NodesRoutesOptions {
|
|
25
12
|
orchestrator: HostProcessOrchestrator;
|
|
26
|
-
role: HostRole;
|
|
27
13
|
}
|
|
28
14
|
export declare function registerNodesRoutes(app: FastifyInstance, opts: NodesRoutesOptions): void;
|
|
29
15
|
/**
|
|
@@ -1,29 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* /api/nodes — list managed cadre nodes, look up
|
|
3
|
-
* lifecycle
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* start/stop/restart are real for the admin's owner node only (start/restart
|
|
10
|
-
* re-spawn it from the persisted `OwnerSpawnConfig`). Every other node this
|
|
11
|
-
* route can see is a donated node, whose lifecycle belongs to the donation
|
|
12
|
-
* surface — this route no longer spawns generic nodes, and a stop here would
|
|
13
|
-
* be undone at once by the donation supervisor's respawn. So all three verbs
|
|
14
|
-
* answer a known non-owner node with 501, pointing at the donation teardown.
|
|
15
|
-
*
|
|
16
|
-
* Owner start/restart are founder-only: a donor-only host that once ran as a
|
|
17
|
-
* founder still holds the owner handle and saved config (so re-enabling
|
|
18
|
-
* `ownCadre` can resume it), but spawning it here would bring the owner node
|
|
19
|
-
* back without its trust circle, NAT or strand services — so those answer 409.
|
|
2
|
+
* /api/nodes — list managed cadre nodes (orchestrator handles), look up one
|
|
3
|
+
* node's details, and tail its log. Read-only: every node's lifecycle belongs to
|
|
4
|
+
* `/api/hosted-nodes`, whose supervisor would undo at once a stop issued
|
|
5
|
+
* anywhere else. A handle's `partyId` is the placeholder an unclaimed node was
|
|
6
|
+
* started with until its first respawn after the claim; the hosted-node record
|
|
7
|
+
* carries the real party.
|
|
20
8
|
*/
|
|
21
9
|
import { existsSync, openSync, readSync, closeSync, statSync } from 'node:fs';
|
|
22
10
|
import { defaultLogPath } from '../../orchestrator/log-rotator.js';
|
|
23
11
|
const DEFAULT_LOG_LINES = 200;
|
|
24
12
|
const MAX_LOG_LINES = 2000;
|
|
25
13
|
export function registerNodesRoutes(app, opts) {
|
|
26
|
-
const { orchestrator
|
|
14
|
+
const { orchestrator } = opts;
|
|
27
15
|
app.get('/api/nodes', async () => {
|
|
28
16
|
return { ok: true, data: { nodes: orchestrator.listNodes() } };
|
|
29
17
|
});
|
|
@@ -51,61 +39,6 @@ export function registerNodesRoutes(app, opts) {
|
|
|
51
39
|
const lines = tailLogFile(defaultLogPath(node.workdir), tail);
|
|
52
40
|
return { ok: true, data: { lines } };
|
|
53
41
|
});
|
|
54
|
-
// start / stop / restart: real for the admin's owner node (started from the
|
|
55
|
-
// persisted OwnerSpawnConfig). Donated-node lifecycle belongs to the donation
|
|
56
|
-
// surface — those ids return a clear not_implemented that points there;
|
|
57
|
-
// unknown ids 404.
|
|
58
|
-
app.post('/api/nodes/:id/stop', async (request, reply) => {
|
|
59
|
-
const { id } = request.params;
|
|
60
|
-
if (!orchestrator.isOwnerNode(id)) {
|
|
61
|
-
return ownerOnlyFallback(reply, orchestrator, id, 'stop');
|
|
62
|
-
}
|
|
63
|
-
const dockerId = orchestrator.resolveDockerId(id);
|
|
64
|
-
if (!dockerId)
|
|
65
|
-
return notFound(reply, id);
|
|
66
|
-
await orchestrator.stopContainer(dockerId);
|
|
67
|
-
// The orchestrator emits its own onStateChange — createLocalUiServer
|
|
68
|
-
// forwards that to the bus. Don't double-publish here.
|
|
69
|
-
return { ok: true };
|
|
70
|
-
});
|
|
71
|
-
app.post('/api/nodes/:id/start', async (request, reply) => {
|
|
72
|
-
const { id } = request.params;
|
|
73
|
-
if (orchestrator.isOwnerNode(id)) {
|
|
74
|
-
if (role === 'donor')
|
|
75
|
-
return ownCadreDisabled(reply, 'start');
|
|
76
|
-
if (!orchestrator.hasOwnerConfig()) {
|
|
77
|
-
return notImplemented(reply, `start ${id}: owner node has no saved spawn config.`);
|
|
78
|
-
}
|
|
79
|
-
const node = await orchestrator.ensureOwnerNode();
|
|
80
|
-
return { ok: true, data: { node } };
|
|
81
|
-
}
|
|
82
|
-
return ownerOnlyFallback(reply, orchestrator, id, 'start');
|
|
83
|
-
});
|
|
84
|
-
app.post('/api/nodes/:id/restart', async (request, reply) => {
|
|
85
|
-
const { id } = request.params;
|
|
86
|
-
if (orchestrator.isOwnerNode(id)) {
|
|
87
|
-
if (role === 'donor')
|
|
88
|
-
return ownCadreDisabled(reply, 'restart');
|
|
89
|
-
if (!orchestrator.hasOwnerConfig()) {
|
|
90
|
-
return notImplemented(reply, `restart ${id}: owner node has no saved spawn config.`);
|
|
91
|
-
}
|
|
92
|
-
const node = await orchestrator.restartOwnerNode();
|
|
93
|
-
return { ok: true, data: { node } };
|
|
94
|
-
}
|
|
95
|
-
return ownerOnlyFallback(reply, orchestrator, id, 'restart');
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* 404 for unknown ids; 501 not_implemented for known non-owner nodes — all of
|
|
100
|
-
* them donated. A donated node's containerId is its donation id, so the
|
|
101
|
-
* message names `node.id` rather than the route param, which may be the
|
|
102
|
-
* opaque dockerId — only the donation id is what the terminate command takes.
|
|
103
|
-
*/
|
|
104
|
-
function ownerOnlyFallback(reply, orchestrator, id, verb) {
|
|
105
|
-
const node = orchestrator.getNode(id);
|
|
106
|
-
if (!node)
|
|
107
|
-
return notFound(reply, id);
|
|
108
|
-
return notImplemented(reply, `${verb} ${id}: only the owner node can be started, stopped or restarted here; a donated node's lifecycle is owned by the donation surface — end it with 'cadre-host grant terminate ${node.id}' (DELETE /grants-admin/donations/${node.id}).`);
|
|
109
42
|
}
|
|
110
43
|
function notFound(reply, id) {
|
|
111
44
|
return reply.code(404).send({
|
|
@@ -113,18 +46,6 @@ function notFound(reply, id) {
|
|
|
113
46
|
error: { code: 'not_found', message: `Unknown node: ${id}` },
|
|
114
47
|
});
|
|
115
48
|
}
|
|
116
|
-
function notImplemented(reply, message) {
|
|
117
|
-
return reply.code(501).send({ ok: false, error: { code: 'not_implemented', message } });
|
|
118
|
-
}
|
|
119
|
-
function ownCadreDisabled(reply, verb) {
|
|
120
|
-
return reply.code(409).send({
|
|
121
|
-
ok: false,
|
|
122
|
-
error: {
|
|
123
|
-
code: 'own_cadre_disabled',
|
|
124
|
-
message: `${verb} owner: this host's own cadre is turned off (donor-only mode). Set ownCadre.enabled in host.config.json and restart cadre-host to run it again.`,
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
49
|
/**
|
|
129
50
|
* Read the last `n` lines from a log file by walking the tail in chunks.
|
|
130
51
|
* Returns [] for a missing file.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/server/routes/nodes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../../src/server/routes/nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* This route is a thin passthrough plus a write-whitelist:
|
|
6
6
|
*
|
|
7
7
|
* - uiPort rejected (restart required; only edit at install time)
|
|
8
|
-
* - libp2pPort rejected (restart required)
|
|
9
8
|
* - upnpEnabled accepted → also propagated to NatService.putSettings
|
|
10
9
|
* - updates.autoApply accepted → propagated to UpdateService.putSettings
|
|
11
10
|
* - updates.manifestUrl accepted → propagated to UpdateService.putSettings
|
|
@@ -20,12 +19,8 @@ import type { UpdateService } from '../../update/index.js';
|
|
|
20
19
|
import type { HostSettingsStore } from '../settings-store.js';
|
|
21
20
|
export interface SettingsRoutesOptions {
|
|
22
21
|
settingsStore: HostSettingsStore;
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
* an `upnpEnabled` write still persists to host.config.json but has no running
|
|
26
|
-
* NatService to propagate into.
|
|
27
|
-
*/
|
|
28
|
-
nat?: NatService;
|
|
22
|
+
/** An `upnpEnabled` write takes effect on it at once. */
|
|
23
|
+
nat: NatService;
|
|
29
24
|
update?: UpdateService;
|
|
30
25
|
}
|
|
31
26
|
export declare function registerSettingsRoutes(app: FastifyInstance, opts: SettingsRoutesOptions): void;
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* This route is a thin passthrough plus a write-whitelist:
|
|
6
6
|
*
|
|
7
7
|
* - uiPort rejected (restart required; only edit at install time)
|
|
8
|
-
* - libp2pPort rejected (restart required)
|
|
9
8
|
* - upnpEnabled accepted → also propagated to NatService.putSettings
|
|
10
9
|
* - updates.autoApply accepted → propagated to UpdateService.putSettings
|
|
11
10
|
* - updates.manifestUrl accepted → propagated to UpdateService.putSettings
|
|
@@ -14,7 +13,7 @@
|
|
|
14
13
|
* GET returns the full `HostConfigFile` (the SPA wants the full shape so it
|
|
15
14
|
* can render a read-only view of the rejected keys).
|
|
16
15
|
*/
|
|
17
|
-
const FORBIDDEN_KEYS = new Set(['uiPort', '
|
|
16
|
+
const FORBIDDEN_KEYS = new Set(['uiPort', 'dataDir', 'installId', 'installedAt', 'installerVersion', 'version']);
|
|
18
17
|
const WRITABLE_TOP_KEYS = new Set(['upnpEnabled', 'updates']);
|
|
19
18
|
const WRITABLE_UPDATES_KEYS = new Set(['autoApply', 'manifestUrl']);
|
|
20
19
|
export function registerSettingsRoutes(app, opts) {
|
|
@@ -35,14 +34,11 @@ export function registerSettingsRoutes(app, opts) {
|
|
|
35
34
|
const patch = {};
|
|
36
35
|
if ('upnpEnabled' in body) {
|
|
37
36
|
patch.upnpEnabled = body.upnpEnabled;
|
|
38
|
-
// Propagate UPnP toggle into the running NatService so the change
|
|
37
|
+
// Propagate the UPnP toggle into the running NatService so the change
|
|
39
38
|
// takes effect immediately. NatService persists into nat.json — that's
|
|
40
39
|
// independent of host.config.json's `upnpEnabled` (which the installer
|
|
41
40
|
// uses on first run to seed nat.json). Update both for consistency.
|
|
42
|
-
|
|
43
|
-
if (nat) {
|
|
44
|
-
await nat.putSettings({ upnpEnabled: body.upnpEnabled });
|
|
45
|
-
}
|
|
41
|
+
await nat.putSettings({ upnpEnabled: body.upnpEnabled });
|
|
46
42
|
}
|
|
47
43
|
if ('updates' in body) {
|
|
48
44
|
const updates = body.updates;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/server/routes/settings.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/server/routes/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,22 +7,12 @@
|
|
|
7
7
|
import type { FastifyInstance } from 'fastify';
|
|
8
8
|
import type { HostProcessOrchestrator } from '../../orchestrator/index.js';
|
|
9
9
|
import type { ManagedNodeInfo } from '../../orchestrator/types.js';
|
|
10
|
-
import type { TrustCircleService } from '../../auth/index.js';
|
|
11
10
|
import type { NatService } from '../../nat/index.js';
|
|
12
11
|
import type { NatStatusSnapshot } from '../../nat/types.js';
|
|
13
12
|
import type { UpdateService } from '../../update/index.js';
|
|
14
|
-
/**
|
|
15
|
-
* Which role the running process is in: `'founder'` also runs the host's own
|
|
16
|
-
* cadre (`ownCadre.enabled` at start), `'donor'` only donates nodes.
|
|
17
|
-
*/
|
|
18
|
-
export type HostRole = 'founder' | 'donor';
|
|
19
13
|
export interface StatusRouteOptions {
|
|
20
14
|
orchestrator: HostProcessOrchestrator;
|
|
21
|
-
|
|
22
|
-
/** Present only when the host runs its own personal cadre (`ownCadre.enabled`). */
|
|
23
|
-
trustCircle?: TrustCircleService;
|
|
24
|
-
/** Present only when the host runs its own personal cadre (`ownCadre.enabled`). */
|
|
25
|
-
nat?: NatService;
|
|
15
|
+
nat: NatService;
|
|
26
16
|
update?: UpdateService;
|
|
27
17
|
}
|
|
28
18
|
export interface StatusResponse {
|
|
@@ -31,26 +21,13 @@ export interface StatusResponse {
|
|
|
31
21
|
version: string;
|
|
32
22
|
uptimeSeconds: number;
|
|
33
23
|
};
|
|
34
|
-
/**
|
|
35
|
-
* Decided at start from `ownCadre.enabled` — the running process, not the file
|
|
36
|
-
* on disk, which may have been edited since without a restart.
|
|
37
|
-
*/
|
|
38
|
-
role: HostRole;
|
|
39
24
|
nodes: Array<{
|
|
40
25
|
id: string;
|
|
41
26
|
partyId: string;
|
|
42
27
|
status: ManagedNodeInfo['status'];
|
|
43
28
|
profile: ManagedNodeInfo['profile'];
|
|
44
|
-
/** Present (true) only on the host's own owner node; every other node is donated. */
|
|
45
|
-
owner?: true;
|
|
46
29
|
}>;
|
|
47
|
-
|
|
48
|
-
trustCircle?: {
|
|
49
|
-
members: number;
|
|
50
|
-
pending: number;
|
|
51
|
-
};
|
|
52
|
-
/** Omitted in donor-only mode (no NAT service). */
|
|
53
|
-
connectivity?: NatStatusSnapshot;
|
|
30
|
+
connectivity: NatStatusSnapshot;
|
|
54
31
|
update?: {
|
|
55
32
|
available?: string;
|
|
56
33
|
lastChecked?: string;
|
|
@@ -16,7 +16,6 @@ export function registerStatusRoute(app, opts) {
|
|
|
16
16
|
partyId: n.partyId,
|
|
17
17
|
status: n.status,
|
|
18
18
|
profile: n.profile,
|
|
19
|
-
...(n.owner ? { owner: true } : {}),
|
|
20
19
|
}));
|
|
21
20
|
const response = {
|
|
22
21
|
service: {
|
|
@@ -24,18 +23,9 @@ export function registerStatusRoute(app, opts) {
|
|
|
24
23
|
version,
|
|
25
24
|
uptimeSeconds: secondsSince(PROCESS_STARTED_AT),
|
|
26
25
|
},
|
|
27
|
-
role: opts.role,
|
|
28
26
|
nodes,
|
|
27
|
+
connectivity: opts.nat.getStatus(),
|
|
29
28
|
};
|
|
30
|
-
// Trust-circle + connectivity exist only when the host runs its own
|
|
31
|
-
// personal cadre; donor-only mode omits both.
|
|
32
|
-
if (opts.trustCircle) {
|
|
33
|
-
const tc = await opts.trustCircle.list();
|
|
34
|
-
response.trustCircle = { members: tc.members.length, pending: tc.pending.length };
|
|
35
|
-
}
|
|
36
|
-
if (opts.nat) {
|
|
37
|
-
response.connectivity = opts.nat.getStatus();
|
|
38
|
-
}
|
|
39
29
|
if (opts.update) {
|
|
40
30
|
const state = await opts.update.getState();
|
|
41
31
|
const update = {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/server/routes/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/server/routes/status.ts"],"names":[],"mappings":"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"}
|
package/dist/server/server.js
CHANGED
|
@@ -90,14 +90,14 @@ export function buildFastify() {
|
|
|
90
90
|
* request with no body (`request.body === undefined`), instead of Fastify's
|
|
91
91
|
* default `400 FST_ERR_CTP_EMPTY_JSON_BODY`.
|
|
92
92
|
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* and the prototype-poisoning checks are unchanged (`'error'` is Fastify's
|
|
100
|
-
* for both).
|
|
93
|
+
* Sending the JSON content type on every request, body or not, is a common
|
|
94
|
+
* client habit (`POST /api/hosted-nodes` takes no body today, and a body-less
|
|
95
|
+
* `DELETE` is the norm), and a refused request here is a node left running.
|
|
96
|
+
* Every route that reads a body already reads `request.body ?? {}`, so a route
|
|
97
|
+
* that needs a field still answers its own `invalid_request` naming it. A
|
|
98
|
+
* non-empty body goes to Fastify's own parser, so malformed JSON is still a 400
|
|
99
|
+
* and the prototype-poisoning checks are unchanged (`'error'` is Fastify's
|
|
100
|
+
* default for both).
|
|
101
101
|
*/
|
|
102
102
|
function acceptEmptyJsonBodies(app) {
|
|
103
103
|
// NOTE: 'error', 'error' mirrors Fastify's defaults for proto/constructor poisoning; if
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Settings store — read-write facade around `host.config.json` for the
|
|
3
3
|
* /api/settings route.
|
|
4
4
|
*
|
|
5
|
-
* The installer (`6.4.1`) owns the schema (`HostConfigFile`
|
|
5
|
+
* The installer (`6.4.1`) owns the schema (`HostConfigFile` v3). This module
|
|
6
6
|
* just delegates load/persist to that file's helpers; it exists so route
|
|
7
7
|
* handlers can read/write without each one re-resolving `configPath(dataDir)`.
|
|
8
8
|
*
|
|
@@ -17,7 +17,7 @@ export interface HostSettingsStoreOptions {
|
|
|
17
17
|
export declare class HostSettingsStore {
|
|
18
18
|
private readonly configPath;
|
|
19
19
|
constructor(opts: HostSettingsStoreOptions);
|
|
20
|
-
/** Read the current host.config.json. Throws if absent, malformed, or not version
|
|
20
|
+
/** Read the current host.config.json. Throws if absent, malformed, or not version 3. */
|
|
21
21
|
read(): HostConfigFile;
|
|
22
22
|
/** Patch and persist. */
|
|
23
23
|
update(patch: Partial<Omit<HostConfigFile, 'version'>>): HostConfigFile;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Settings store — read-write facade around `host.config.json` for the
|
|
3
3
|
* /api/settings route.
|
|
4
4
|
*
|
|
5
|
-
* The installer (`6.4.1`) owns the schema (`HostConfigFile`
|
|
5
|
+
* The installer (`6.4.1`) owns the schema (`HostConfigFile` v3). This module
|
|
6
6
|
* just delegates load/persist to that file's helpers; it exists so route
|
|
7
7
|
* handlers can read/write without each one re-resolving `configPath(dataDir)`.
|
|
8
8
|
*
|
|
@@ -19,7 +19,7 @@ export class HostSettingsStore {
|
|
|
19
19
|
// /api/settings answers 500 code "internal" with the read message passed through.
|
|
20
20
|
// Fine while the UI just surfaces the text; if it ever needs to tell "your config
|
|
21
21
|
// file is unreadable" apart from a genuine server bug, give this a typed error.
|
|
22
|
-
/** Read the current host.config.json. Throws if absent, malformed, or not version
|
|
22
|
+
/** Read the current host.config.json. Throws if absent, malformed, or not version 3. */
|
|
23
23
|
read() {
|
|
24
24
|
return readHostConfig(this.configPath);
|
|
25
25
|
}
|
package/dist/server/static.js
CHANGED
|
@@ -52,7 +52,6 @@ export function registerStaticMount(app, opts = {}) {
|
|
|
52
52
|
}
|
|
53
53
|
// Don't try to serve API paths as static.
|
|
54
54
|
if (request.url.startsWith('/api') ||
|
|
55
|
-
request.url.startsWith('/auth') ||
|
|
56
55
|
request.url.startsWith('/nat') ||
|
|
57
56
|
request.url.startsWith('/update')) {
|
|
58
57
|
return reply.code(404).send({
|
|
@@ -184,7 +183,7 @@ function placeholderHtml() {
|
|
|
184
183
|
<li><span class="endpoint">GET /api/nodes</span></li>
|
|
185
184
|
<li><span class="endpoint">GET /api/settings</span></li>
|
|
186
185
|
<li><span class="endpoint">GET /api/events</span> (Server-Sent Events)</li>
|
|
187
|
-
<li><span class="endpoint">/
|
|
186
|
+
<li><span class="endpoint">/nat/*</span>, <span class="endpoint">/update/*</span></li>
|
|
188
187
|
</ul>
|
|
189
188
|
<p>See <a href="https://github.com/gotchoices/sereus/blob/master/docs/cadre-host.md">docs/cadre-host.md</a>.</p>
|
|
190
189
|
</body>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/server/static.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAClG,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,uCAAuC;IAC9C,MAAM,EAAE,uCAAuC;IAC/C,MAAM,EAAE,yBAAyB;IACjC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,2BAA2B;IACnC,MAAM,EAAE,iCAAiC;CAC1C,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAOD,MAAM,UAAU,mBAAmB,CAAC,GAAoB,EAAE,OAA2B,EAAE;IACrF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;IAEpD,gDAAgD;IAChD,GAAG,CAAC,kBAAkB,CAAC,CAAC,OAAuB,EAAE,KAAmB,EAAE,EAAE;QACtE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE;aACvF,CAAC,CAAC;QACL,CAAC;QACD,0CAA0C;QAC1C,IACE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/server/static.ts"],"names":[],"mappings":"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"}
|