@serfab/cadre-host 1.12.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,123 +1,115 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* /api/settings — host-level settings UI surface.
|
|
3
|
-
*
|
|
4
|
-
* The persisted shape is `host.config.json` (managed by the installer).
|
|
5
|
-
* This route is a thin passthrough plus a write-whitelist:
|
|
6
|
-
*
|
|
7
|
-
* - uiPort rejected (restart required; only edit at install time)
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* - updates.
|
|
11
|
-
* -
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
import type {
|
|
21
|
-
import type {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
nat
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (!
|
|
96
|
-
return { error:
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
'manifestUrl' in updates &&
|
|
117
|
-
typeof updates.manifestUrl !== 'string'
|
|
118
|
-
) {
|
|
119
|
-
return { error: '"updates.manifestUrl" must be a string' };
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return {};
|
|
123
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* /api/settings — host-level settings UI surface.
|
|
3
|
+
*
|
|
4
|
+
* The persisted shape is `host.config.json` (managed by the installer).
|
|
5
|
+
* This route is a thin passthrough plus a write-whitelist:
|
|
6
|
+
*
|
|
7
|
+
* - uiPort rejected (restart required; only edit at install time)
|
|
8
|
+
* - upnpEnabled accepted → also propagated to NatService.putSettings
|
|
9
|
+
* - updates.autoApply accepted → propagated to UpdateService.putSettings
|
|
10
|
+
* - updates.manifestUrl accepted → propagated to UpdateService.putSettings
|
|
11
|
+
* - anything else 400 invalid_setting
|
|
12
|
+
*
|
|
13
|
+
* GET returns the full `HostConfigFile` (the SPA wants the full shape so it
|
|
14
|
+
* can render a read-only view of the rejected keys).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { FastifyInstance } from 'fastify';
|
|
18
|
+
|
|
19
|
+
import type { NatService } from '../../nat/index.js';
|
|
20
|
+
import type { UpdateService } from '../../update/index.js';
|
|
21
|
+
import type { HostSettingsStore } from '../settings-store.js';
|
|
22
|
+
|
|
23
|
+
const FORBIDDEN_KEYS = new Set<string>(['uiPort', 'dataDir', 'installId', 'installedAt', 'installerVersion', 'version']);
|
|
24
|
+
|
|
25
|
+
const WRITABLE_TOP_KEYS = new Set<string>(['upnpEnabled', 'updates']);
|
|
26
|
+
const WRITABLE_UPDATES_KEYS = new Set<string>(['autoApply', 'manifestUrl']);
|
|
27
|
+
|
|
28
|
+
export interface SettingsRoutesOptions {
|
|
29
|
+
settingsStore: HostSettingsStore;
|
|
30
|
+
/** An `upnpEnabled` write takes effect on it at once. */
|
|
31
|
+
nat: NatService;
|
|
32
|
+
update?: UpdateService;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function registerSettingsRoutes(app: FastifyInstance, opts: SettingsRoutesOptions): void {
|
|
36
|
+
const { settingsStore, nat, update } = opts;
|
|
37
|
+
|
|
38
|
+
app.get('/api/settings', async () => {
|
|
39
|
+
return { ok: true, data: settingsStore.read() };
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
app.put('/api/settings', async (request, reply) => {
|
|
43
|
+
const body = (request.body ?? {}) as Record<string, unknown>;
|
|
44
|
+
const validation = validatePatch(body);
|
|
45
|
+
if (validation.error) {
|
|
46
|
+
return reply.code(400).send({
|
|
47
|
+
ok: false,
|
|
48
|
+
error: { code: 'invalid_setting', message: validation.error },
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const current = settingsStore.read();
|
|
53
|
+
const patch: { upnpEnabled?: boolean; updates?: typeof current.updates } = {};
|
|
54
|
+
|
|
55
|
+
if ('upnpEnabled' in body) {
|
|
56
|
+
patch.upnpEnabled = body.upnpEnabled as boolean;
|
|
57
|
+
// Propagate the UPnP toggle into the running NatService so the change
|
|
58
|
+
// takes effect immediately. NatService persists into nat.json — that's
|
|
59
|
+
// independent of host.config.json's `upnpEnabled` (which the installer
|
|
60
|
+
// uses on first run to seed nat.json). Update both for consistency.
|
|
61
|
+
await nat.putSettings({ upnpEnabled: body.upnpEnabled as boolean });
|
|
62
|
+
}
|
|
63
|
+
if ('updates' in body) {
|
|
64
|
+
const updates = body.updates as { autoApply?: boolean; manifestUrl?: string };
|
|
65
|
+
const nextUpdates = { ...current.updates };
|
|
66
|
+
if ('autoApply' in updates) nextUpdates.autoApply = updates.autoApply as boolean;
|
|
67
|
+
if ('manifestUrl' in updates) nextUpdates.manifestUrl = updates.manifestUrl as string;
|
|
68
|
+
patch.updates = nextUpdates;
|
|
69
|
+
if (update) {
|
|
70
|
+
const propagate: { autoApply?: boolean; manifestUrl?: string } = {};
|
|
71
|
+
if ('autoApply' in updates) propagate.autoApply = updates.autoApply as boolean;
|
|
72
|
+
if ('manifestUrl' in updates) propagate.manifestUrl = updates.manifestUrl as string;
|
|
73
|
+
await update.putSettings(propagate);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const next = settingsStore.update(patch);
|
|
78
|
+
return { ok: true, data: next };
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function validatePatch(body: Record<string, unknown>): { error?: string } {
|
|
83
|
+
for (const key of Object.keys(body)) {
|
|
84
|
+
if (FORBIDDEN_KEYS.has(key)) {
|
|
85
|
+
return { error: `Setting "${key}" is not editable at runtime; change it in host.config.json and restart cadre-host.` };
|
|
86
|
+
}
|
|
87
|
+
if (!WRITABLE_TOP_KEYS.has(key)) {
|
|
88
|
+
return { error: `Unknown setting "${key}"` };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if ('upnpEnabled' in body && typeof body.upnpEnabled !== 'boolean') {
|
|
92
|
+
return { error: '"upnpEnabled" must be a boolean' };
|
|
93
|
+
}
|
|
94
|
+
if ('updates' in body) {
|
|
95
|
+
if (!body.updates || typeof body.updates !== 'object') {
|
|
96
|
+
return { error: '"updates" must be an object' };
|
|
97
|
+
}
|
|
98
|
+
const updates = body.updates as Record<string, unknown>;
|
|
99
|
+
for (const key of Object.keys(updates)) {
|
|
100
|
+
if (!WRITABLE_UPDATES_KEYS.has(key)) {
|
|
101
|
+
return { error: `Unknown setting "updates.${key}"` };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if ('autoApply' in updates && typeof updates.autoApply !== 'boolean') {
|
|
105
|
+
return { error: '"updates.autoApply" must be a boolean' };
|
|
106
|
+
}
|
|
107
|
+
if (
|
|
108
|
+
'manifestUrl' in updates &&
|
|
109
|
+
typeof updates.manifestUrl !== 'string'
|
|
110
|
+
) {
|
|
111
|
+
return { error: '"updates.manifestUrl" must be a string' };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return {};
|
|
115
|
+
}
|
|
@@ -1,134 +1,102 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GET /api/status — aggregated health snapshot used by the SPA's dashboard.
|
|
3
|
-
*
|
|
4
|
-
* All inputs are in-memory subsystem state — no disk reads on each call.
|
|
5
|
-
* The response budget is < 5 ms; favour `getStatus()` over `testReachability()`.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { readFileSync } from 'node:fs';
|
|
9
|
-
import { dirname, resolve } from 'node:path';
|
|
10
|
-
import { fileURLToPath } from 'node:url';
|
|
11
|
-
|
|
12
|
-
import type { FastifyInstance } from 'fastify';
|
|
13
|
-
|
|
14
|
-
import type { HostProcessOrchestrator } from '../../orchestrator/index.js';
|
|
15
|
-
import type { ManagedNodeInfo } from '../../orchestrator/types.js';
|
|
16
|
-
import type {
|
|
17
|
-
import type {
|
|
18
|
-
import type {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function secondsSince(start: bigint): number {
|
|
106
|
-
const now = process.hrtime.bigint();
|
|
107
|
-
const elapsedNs = now - start;
|
|
108
|
-
return Number(elapsedNs / 1_000_000_000n);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
let cachedVersion: string | null = null;
|
|
112
|
-
function readPackageVersion(): string {
|
|
113
|
-
if (cachedVersion) return cachedVersion;
|
|
114
|
-
try {
|
|
115
|
-
// dist/server/routes/status.js -> ../../../package.json
|
|
116
|
-
// src/server/routes/status.ts -> ../../../package.json (vitest)
|
|
117
|
-
const here = dirname(fileURLToPath(import.meta.url));
|
|
118
|
-
const candidates = [
|
|
119
|
-
resolve(here, '..', '..', '..', 'package.json'),
|
|
120
|
-
resolve(here, '..', '..', 'package.json'),
|
|
121
|
-
];
|
|
122
|
-
for (const p of candidates) {
|
|
123
|
-
try {
|
|
124
|
-
const parsed = JSON.parse(readFileSync(p, 'utf8')) as { version?: string };
|
|
125
|
-
if (parsed.version) {
|
|
126
|
-
cachedVersion = parsed.version;
|
|
127
|
-
return cachedVersion;
|
|
128
|
-
}
|
|
129
|
-
} catch { /* try next */ }
|
|
130
|
-
}
|
|
131
|
-
} catch { /* ignore */ }
|
|
132
|
-
cachedVersion = '0.0.0-unknown';
|
|
133
|
-
return cachedVersion;
|
|
134
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* GET /api/status — aggregated health snapshot used by the SPA's dashboard.
|
|
3
|
+
*
|
|
4
|
+
* All inputs are in-memory subsystem state — no disk reads on each call.
|
|
5
|
+
* The response budget is < 5 ms; favour `getStatus()` over `testReachability()`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
import { dirname, resolve } from 'node:path';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
|
|
12
|
+
import type { FastifyInstance } from 'fastify';
|
|
13
|
+
|
|
14
|
+
import type { HostProcessOrchestrator } from '../../orchestrator/index.js';
|
|
15
|
+
import type { ManagedNodeInfo } from '../../orchestrator/types.js';
|
|
16
|
+
import type { NatService } from '../../nat/index.js';
|
|
17
|
+
import type { NatStatusSnapshot } from '../../nat/types.js';
|
|
18
|
+
import type { UpdateService } from '../../update/index.js';
|
|
19
|
+
|
|
20
|
+
const PROCESS_STARTED_AT = process.hrtime.bigint();
|
|
21
|
+
|
|
22
|
+
export interface StatusRouteOptions {
|
|
23
|
+
orchestrator: HostProcessOrchestrator;
|
|
24
|
+
nat: NatService;
|
|
25
|
+
update?: UpdateService;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface StatusResponse {
|
|
29
|
+
service: { name: 'cadre-host'; version: string; uptimeSeconds: number };
|
|
30
|
+
nodes: Array<{
|
|
31
|
+
id: string;
|
|
32
|
+
partyId: string;
|
|
33
|
+
status: ManagedNodeInfo['status'];
|
|
34
|
+
profile: ManagedNodeInfo['profile'];
|
|
35
|
+
}>;
|
|
36
|
+
connectivity: NatStatusSnapshot;
|
|
37
|
+
update?: { available?: string; lastChecked?: string };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function registerStatusRoute(app: FastifyInstance, opts: StatusRouteOptions): void {
|
|
41
|
+
const version = readPackageVersion();
|
|
42
|
+
|
|
43
|
+
app.get('/api/status', async (): Promise<StatusResponse> => {
|
|
44
|
+
const nodes = opts.orchestrator.listNodes().map((n) => ({
|
|
45
|
+
id: n.id,
|
|
46
|
+
partyId: n.partyId,
|
|
47
|
+
status: n.status,
|
|
48
|
+
profile: n.profile,
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
const response: StatusResponse = {
|
|
52
|
+
service: {
|
|
53
|
+
name: 'cadre-host',
|
|
54
|
+
version,
|
|
55
|
+
uptimeSeconds: secondsSince(PROCESS_STARTED_AT),
|
|
56
|
+
},
|
|
57
|
+
nodes,
|
|
58
|
+
connectivity: opts.nat.getStatus(),
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
if (opts.update) {
|
|
62
|
+
const state = await opts.update.getState();
|
|
63
|
+
const update: { available?: string; lastChecked?: string } = {};
|
|
64
|
+
if (state.available?.version) update.available = state.available.version;
|
|
65
|
+
if (state.lastChecked) update.lastChecked = state.lastChecked;
|
|
66
|
+
response.update = update;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return response;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function secondsSince(start: bigint): number {
|
|
74
|
+
const now = process.hrtime.bigint();
|
|
75
|
+
const elapsedNs = now - start;
|
|
76
|
+
return Number(elapsedNs / 1_000_000_000n);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
let cachedVersion: string | null = null;
|
|
80
|
+
function readPackageVersion(): string {
|
|
81
|
+
if (cachedVersion) return cachedVersion;
|
|
82
|
+
try {
|
|
83
|
+
// dist/server/routes/status.js -> ../../../package.json
|
|
84
|
+
// src/server/routes/status.ts -> ../../../package.json (vitest)
|
|
85
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
86
|
+
const candidates = [
|
|
87
|
+
resolve(here, '..', '..', '..', 'package.json'),
|
|
88
|
+
resolve(here, '..', '..', 'package.json'),
|
|
89
|
+
];
|
|
90
|
+
for (const p of candidates) {
|
|
91
|
+
try {
|
|
92
|
+
const parsed = JSON.parse(readFileSync(p, 'utf8')) as { version?: string };
|
|
93
|
+
if (parsed.version) {
|
|
94
|
+
cachedVersion = parsed.version;
|
|
95
|
+
return cachedVersion;
|
|
96
|
+
}
|
|
97
|
+
} catch { /* try next */ }
|
|
98
|
+
}
|
|
99
|
+
} catch { /* ignore */ }
|
|
100
|
+
cachedVersion = '0.0.0-unknown';
|
|
101
|
+
return cachedVersion;
|
|
102
|
+
}
|
package/src/server/server.ts
CHANGED
|
@@ -124,14 +124,14 @@ export function buildFastify(): FastifyInstance {
|
|
|
124
124
|
* request with no body (`request.body === undefined`), instead of Fastify's
|
|
125
125
|
* default `400 FST_ERR_CTP_EMPTY_JSON_BODY`.
|
|
126
126
|
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
* and the prototype-poisoning checks are unchanged (`'error'` is Fastify's
|
|
134
|
-
* for both).
|
|
127
|
+
* Sending the JSON content type on every request, body or not, is a common
|
|
128
|
+
* client habit (`POST /api/hosted-nodes` takes no body today, and a body-less
|
|
129
|
+
* `DELETE` is the norm), and a refused request here is a node left running.
|
|
130
|
+
* Every route that reads a body already reads `request.body ?? {}`, so a route
|
|
131
|
+
* that needs a field still answers its own `invalid_request` naming it. A
|
|
132
|
+
* non-empty body goes to Fastify's own parser, so malformed JSON is still a 400
|
|
133
|
+
* and the prototype-poisoning checks are unchanged (`'error'` is Fastify's
|
|
134
|
+
* default for both).
|
|
135
135
|
*/
|
|
136
136
|
function acceptEmptyJsonBodies(app: FastifyInstance): void {
|
|
137
137
|
// 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
|
*
|
|
@@ -29,7 +29,7 @@ export class HostSettingsStore {
|
|
|
29
29
|
// /api/settings answers 500 code "internal" with the read message passed through.
|
|
30
30
|
// Fine while the UI just surfaces the text; if it ever needs to tell "your config
|
|
31
31
|
// file is unreadable" apart from a genuine server bug, give this a typed error.
|
|
32
|
-
/** Read the current host.config.json. Throws if absent, malformed, or not version
|
|
32
|
+
/** Read the current host.config.json. Throws if absent, malformed, or not version 3. */
|
|
33
33
|
read(): HostConfigFile {
|
|
34
34
|
return readHostConfig(this.configPath);
|
|
35
35
|
}
|
package/src/server/static.ts
CHANGED
|
@@ -65,7 +65,6 @@ export function registerStaticMount(app: FastifyInstance, opts: StaticMountOptio
|
|
|
65
65
|
// Don't try to serve API paths as static.
|
|
66
66
|
if (
|
|
67
67
|
request.url.startsWith('/api') ||
|
|
68
|
-
request.url.startsWith('/auth') ||
|
|
69
68
|
request.url.startsWith('/nat') ||
|
|
70
69
|
request.url.startsWith('/update')
|
|
71
70
|
) {
|
|
@@ -198,7 +197,7 @@ function placeholderHtml(): string {
|
|
|
198
197
|
<li><span class="endpoint">GET /api/nodes</span></li>
|
|
199
198
|
<li><span class="endpoint">GET /api/settings</span></li>
|
|
200
199
|
<li><span class="endpoint">GET /api/events</span> (Server-Sent Events)</li>
|
|
201
|
-
<li><span class="endpoint">/
|
|
200
|
+
<li><span class="endpoint">/nat/*</span>, <span class="endpoint">/update/*</span></li>
|
|
202
201
|
</ul>
|
|
203
202
|
<p>See <a href="https://github.com/gotchoices/sereus/blob/master/docs/cadre-host.md">docs/cadre-host.md</a>.</p>
|
|
204
203
|
</body>
|
package/src/update/index.ts
CHANGED
|
@@ -305,8 +305,8 @@ export class UpdateService {
|
|
|
305
305
|
}
|
|
306
306
|
|
|
307
307
|
/**
|
|
308
|
-
* Typed handler facade —
|
|
309
|
-
*
|
|
308
|
+
* Typed handler facade — same shape as `createNatHandlers`. The local-UI
|
|
309
|
+
* server consumes these.
|
|
310
310
|
*/
|
|
311
311
|
export function createUpdateHandlers(service: UpdateService): UpdateHandlers {
|
|
312
312
|
return {
|
package/src/update/store.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Atomic JSON store for `<dataDir>/update-state.json`.
|
|
3
3
|
*
|
|
4
|
-
* Mirrors `
|
|
4
|
+
* Mirrors `NatStore`: load on demand, write to
|
|
5
5
|
* `<path>.tmp` then rename. Single-writer assumption — only one cadre-host
|
|
6
6
|
* process owns a given dataDir.
|
|
7
7
|
*/
|
package/src/update/types.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* - apply.ts — invoke `npm install -g` + rollback on failure.
|
|
9
9
|
* - index.ts — composes the above (UpdateService).
|
|
10
10
|
*
|
|
11
|
-
* Mirrors the typed-handler pattern used by
|
|
11
|
+
* Mirrors the typed-handler pattern used by NAT (handlers
|
|
12
12
|
* throw `UpdateError` whose `.code` the local-UI maps to HTTP status).
|
|
13
13
|
*/
|
|
14
14
|
|
package/dist/auth/duration.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function parseDuration(input: string): number;
|
package/dist/auth/duration.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tiny duration parser for invite TTLs.
|
|
3
|
-
*
|
|
4
|
-
* Accepts a single value+unit token: `30s`, `5m`, `24h`, `7d`, `2w`.
|
|
5
|
-
* Whitespace is allowed around it. Bare numbers are treated as milliseconds.
|
|
6
|
-
*
|
|
7
|
-
* Returns the duration in milliseconds. Throws on unparseable input.
|
|
8
|
-
*/
|
|
9
|
-
const UNIT_MULTIPLIERS = {
|
|
10
|
-
ms: 1,
|
|
11
|
-
s: 1000,
|
|
12
|
-
m: 60 * 1000,
|
|
13
|
-
h: 60 * 60 * 1000,
|
|
14
|
-
d: 24 * 60 * 60 * 1000,
|
|
15
|
-
w: 7 * 24 * 60 * 60 * 1000,
|
|
16
|
-
};
|
|
17
|
-
const DURATION_RE = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d|w)?$/;
|
|
18
|
-
export function parseDuration(input) {
|
|
19
|
-
const trimmed = input.trim();
|
|
20
|
-
const match = DURATION_RE.exec(trimmed);
|
|
21
|
-
if (!match) {
|
|
22
|
-
throw new Error(`Invalid duration: ${JSON.stringify(input)} (expected e.g. "24h", "7d", "30m")`);
|
|
23
|
-
}
|
|
24
|
-
const value = parseFloat(match[1]);
|
|
25
|
-
const unit = match[2] ?? 'ms';
|
|
26
|
-
const multiplier = UNIT_MULTIPLIERS[unit];
|
|
27
|
-
if (multiplier === undefined) {
|
|
28
|
-
throw new Error(`Unknown duration unit: ${unit}`);
|
|
29
|
-
}
|
|
30
|
-
return Math.round(value * multiplier);
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=duration.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"duration.js","sourceRoot":"","sources":["../../src/auth/duration.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,gBAAgB,GAA2B;IAC/C,EAAE,EAAE,CAAC;IACL,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,EAAE,GAAG,IAAI;IACZ,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IACjB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IACtB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;CAC3B,CAAC;AAEF,MAAM,WAAW,GAAG,qCAAqC,CAAC;AAE1D,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC9B,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;AACxC,CAAC"}
|
package/dist/auth/index.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Trust-circle auth for cadre-host. See ./trust-circle.ts and ./types.ts.
|
|
3
|
-
*/
|
|
4
|
-
export { TrustCircleService, createTrustCircleHandlers, DEFAULT_INVITE_TTL_MS } from './trust-circle.js';
|
|
5
|
-
export type { TrustCircleServiceOptions, CadreNodeLike } from './trust-circle.js';
|
|
6
|
-
export { TrustCircleStore } from './trust-circle-store.js';
|
|
7
|
-
export { ensureSelfLabel, SELF_LABEL } from './self-label.js';
|
|
8
|
-
export type { EnsureSelfLabelOptions } from './self-label.js';
|
|
9
|
-
export { parseDuration } from './duration.js';
|
|
10
|
-
export { TrustCircleError, } from './types.js';
|
|
11
|
-
export type { TrustCircleMember, PendingInvite, TrustCircleFile, TrustCircleSnapshot, TrustCircleHandlers, TrustCircleErrorCode, } from './types.js';
|