@serfab/cadre-host 0.8.1 → 0.9.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/dist/auth/trust-circle.d.ts +5 -5
- package/dist/auth/trust-circle.js +10 -10
- package/dist/auth/trust-circle.js.map +1 -1
- package/dist/auth/types.d.ts +2 -2
- package/dist/bin/host.js +255 -54
- package/dist/bin/host.js.map +1 -1
- package/dist/donation/donation-service.d.ts +136 -0
- package/dist/donation/donation-service.js +306 -0
- package/dist/donation/donation-service.js.map +1 -0
- package/dist/donation/donation-store.d.ts +42 -0
- package/dist/donation/donation-store.js +141 -0
- package/dist/donation/donation-store.js.map +1 -0
- package/dist/donation/grant-service.d.ts +71 -0
- package/dist/donation/grant-service.js +163 -0
- package/dist/donation/grant-service.js.map +1 -0
- package/dist/donation/grant-store.d.ts +38 -0
- package/dist/donation/grant-store.js +135 -0
- package/dist/donation/grant-store.js.map +1 -0
- package/dist/donation/index.d.ts +18 -0
- package/dist/donation/index.js +16 -0
- package/dist/donation/index.js.map +1 -0
- package/dist/donation/types.d.ts +175 -0
- package/dist/donation/types.js +40 -0
- package/dist/donation/types.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/installer/config.d.ts +26 -0
- package/dist/installer/config.js +13 -0
- package/dist/installer/config.js.map +1 -1
- package/dist/installer/index.d.ts +2 -0
- package/dist/installer/index.js +3 -0
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/wizard.d.ts +4 -0
- package/dist/installer/wizard.js +5 -1
- package/dist/installer/wizard.js.map +1 -1
- package/dist/nat/nat-service.d.ts +5 -5
- package/dist/nat/nat-service.js +9 -9
- package/dist/nat/nat-service.js.map +1 -1
- package/dist/nat/types.d.ts +1 -1
- package/dist/orchestrator/host-process-orchestrator.d.ts +35 -27
- package/dist/orchestrator/host-process-orchestrator.js +79 -53
- package/dist/orchestrator/host-process-orchestrator.js.map +1 -1
- package/dist/orchestrator/index.d.ts +3 -3
- package/dist/orchestrator/index.js +1 -1
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/state-store.d.ts +5 -5
- package/dist/orchestrator/state-store.js +2 -2
- package/dist/orchestrator/state-store.js.map +1 -1
- package/dist/orchestrator/types.d.ts +8 -8
- package/dist/owner/index.d.ts +11 -0
- package/dist/owner/index.js +11 -0
- package/dist/owner/index.js.map +1 -0
- package/dist/{authority/authority-node-client.d.ts → owner/owner-node-client.d.ts} +32 -14
- package/dist/{authority/authority-node-client.js → owner/owner-node-client.js} +39 -15
- package/dist/owner/owner-node-client.js.map +1 -0
- package/dist/server/error-handler.d.ts +15 -0
- package/dist/server/error-handler.js +41 -0
- package/dist/server/error-handler.js.map +1 -1
- package/dist/server/index.d.ts +26 -2
- package/dist/server/index.js +37 -16
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/grants-admin.d.ts +17 -0
- package/dist/server/routes/grants-admin.js +32 -0
- package/dist/server/routes/grants-admin.js.map +1 -0
- package/dist/server/routes/grants.d.ts +28 -0
- package/dist/server/routes/grants.js +163 -0
- package/dist/server/routes/grants.js.map +1 -0
- package/dist/server/routes/nodes.d.ts +5 -4
- package/dist/server/routes/nodes.js +19 -18
- package/dist/server/routes/nodes.js.map +1 -1
- package/dist/server/routes/settings.d.ts +6 -1
- package/dist/server/routes/settings.js +5 -2
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/status.d.ts +8 -4
- package/dist/server/routes/status.js +9 -4
- package/dist/server/routes/status.js.map +1 -1
- package/dist/update/release-key.js +7 -5
- package/dist/update/release-key.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/{host-authority.smoke.test.ts → host-owner.smoke.test.ts} +7 -7
- package/src/__tests__/{orchestrator-authority.test.ts → orchestrator-owner.test.ts} +33 -33
- package/src/__tests__/orchestrator-pin-keys.test.ts +153 -0
- package/src/__tests__/orchestrator-push.test.ts +10 -10
- package/src/auth/__tests__/trust-circle-integration.test.ts +11 -11
- package/src/auth/__tests__/trust-circle.test.ts +10 -10
- package/src/auth/trust-circle.ts +10 -10
- package/src/auth/types.ts +2 -2
- package/src/bin/host.ts +273 -53
- package/src/donation/__tests__/donation-service.test.ts +290 -0
- package/src/donation/__tests__/grant-service.test.ts +213 -0
- package/src/donation/__tests__/grant-store.test.ts +113 -0
- package/src/donation/donation-service.ts +392 -0
- package/src/donation/donation-store.ts +164 -0
- package/src/donation/grant-service.ts +200 -0
- package/src/donation/grant-store.ts +152 -0
- package/src/donation/index.ts +49 -0
- package/src/donation/types.ts +220 -0
- package/src/index.ts +37 -5
- package/src/installer/__tests__/config.test.ts +27 -1
- package/src/installer/__tests__/installer.smoke.test.ts +31 -1
- package/src/installer/__tests__/wizard.test.ts +5 -1
- package/src/installer/config.ts +34 -0
- package/src/installer/index.ts +5 -0
- package/src/installer/wizard.ts +12 -1
- package/src/nat/__tests__/nat-service.test.ts +5 -5
- package/src/nat/nat-service.ts +10 -10
- package/src/nat/types.ts +1 -1
- package/src/orchestrator/host-process-orchestrator.ts +88 -60
- package/src/orchestrator/index.ts +3 -3
- package/src/orchestrator/state-store.ts +7 -7
- package/src/orchestrator/types.ts +8 -8
- package/src/{authority/__tests__/authority-node-client.test.ts → owner/__tests__/owner-node-client.test.ts} +45 -17
- package/src/owner/index.ts +12 -0
- package/src/{authority/authority-node-client.ts → owner/owner-node-client.ts} +55 -21
- package/src/server/__tests__/error-handler.test.ts +22 -0
- package/src/server/__tests__/grants-admin-route.test.ts +73 -0
- package/src/server/__tests__/grants-route.test.ts +189 -0
- package/src/server/__tests__/nodes-route.test.ts +25 -25
- package/src/server/__tests__/server.smoke.test.ts +75 -0
- package/src/server/__tests__/settings-route.test.ts +17 -0
- package/src/server/__tests__/status-route.test.ts +21 -0
- package/src/server/error-handler.ts +43 -0
- package/src/server/index.ts +62 -17
- package/src/server/routes/grants-admin.ts +41 -0
- package/src/server/routes/grants.ts +186 -0
- package/src/server/routes/nodes.ts +19 -18
- package/src/server/routes/settings.ts +11 -3
- package/src/server/routes/status.ts +18 -8
- package/src/update/__tests__/release-key.test.ts +16 -3
- package/src/update/release-key.ts +7 -5
- package/dist/authority/authority-node-client.js.map +0 -1
- package/dist/authority/index.d.ts +0 -11
- package/dist/authority/index.js +0 -11
- package/dist/authority/index.js.map +0 -1
- package/src/authority/index.ts +0 -12
|
@@ -23,7 +23,7 @@ export class StateStore {
|
|
|
23
23
|
return {
|
|
24
24
|
version: STATE_VERSION,
|
|
25
25
|
handles: parsed.handles,
|
|
26
|
-
...(parsed.
|
|
26
|
+
...(parsed.ownerConfig ? { ownerConfig: parsed.ownerConfig } : {}),
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
29
|
catch (err) {
|
|
@@ -39,7 +39,7 @@ export class StateStore {
|
|
|
39
39
|
const payload = JSON.stringify({
|
|
40
40
|
version: STATE_VERSION,
|
|
41
41
|
handles: state.handles,
|
|
42
|
-
...(state.
|
|
42
|
+
...(state.ownerConfig ? { ownerConfig: state.ownerConfig } : {}),
|
|
43
43
|
}, null, 2);
|
|
44
44
|
const tmp = `${this.path}.tmp`;
|
|
45
45
|
writeFileSync(tmp, payload, { encoding: 'utf8' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/orchestrator/state-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,GAAG,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC;AA4B5C,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,qEAAqE;AACrE,MAAM,OAAO,UAAU;IAGrB,YAAY,OAAe;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACjD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;YACjD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5E,GAAG,CAAC,0DAA0D,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3E,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACjD,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/orchestrator/state-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,GAAG,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC;AA4B5C,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,qEAAqE;AACrE,MAAM,OAAO,UAAU;IAGrB,YAAY,OAAe;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACjD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;YACjD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5E,GAAG,CAAC,0DAA0D,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3E,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACjD,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yEAAyE;YACzE,oEAAoE;YACpE,wDAAwD;YACxD,GAAG,CAAC,qCAAqC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAqB;QACxB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAC5B;YACE,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC;QAC/B,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -50,7 +50,7 @@ export interface NodePorts {
|
|
|
50
50
|
health: number;
|
|
51
51
|
metrics: number;
|
|
52
52
|
p2p: number;
|
|
53
|
-
/** Loopback admin-channel port. Bound only by the
|
|
53
|
+
/** Loopback admin-channel port. Bound only by the owner node. */
|
|
54
54
|
admin: number;
|
|
55
55
|
}
|
|
56
56
|
/** In-memory record per managed child. */
|
|
@@ -64,8 +64,8 @@ export interface Handle {
|
|
|
64
64
|
spawnedAt: string;
|
|
65
65
|
partyId: string;
|
|
66
66
|
profile: 'storage' | 'transaction';
|
|
67
|
-
/** True for the admin's
|
|
68
|
-
|
|
67
|
+
/** True for the admin's owner node (binds the admin channel). */
|
|
68
|
+
owner?: boolean;
|
|
69
69
|
/** Live ChildProcess reference; absent after re-attach via init(). */
|
|
70
70
|
child?: ChildProcess;
|
|
71
71
|
/** Marked false when init() finds the PID dead or token mismatched. */
|
|
@@ -84,15 +84,15 @@ export interface ManagedNodeInfo {
|
|
|
84
84
|
spawnedAt: string;
|
|
85
85
|
workdir: string;
|
|
86
86
|
ports: NodePorts;
|
|
87
|
-
/** True for the admin's
|
|
88
|
-
|
|
87
|
+
/** True for the admin's owner node. */
|
|
88
|
+
owner?: boolean;
|
|
89
89
|
}
|
|
90
90
|
/**
|
|
91
|
-
* Persisted spawn parameters for the admin's
|
|
92
|
-
* the handles so an orchestrator restart can re-spawn the
|
|
91
|
+
* Persisted spawn parameters for the admin's owner node. Stored alongside
|
|
92
|
+
* the handles so an orchestrator restart can re-spawn the owner node from
|
|
93
93
|
* `/api/nodes/:id/{start,restart}` without the caller re-supplying them.
|
|
94
94
|
*/
|
|
95
|
-
export interface
|
|
95
|
+
export interface OwnerSpawnConfig {
|
|
96
96
|
/** Absolute path to the host's libp2p protobuf identity (`identity.key`). */
|
|
97
97
|
identityPath: string;
|
|
98
98
|
/** Control-network partyId (the host's installId). */
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owner-node delegation surface for cadre-host.
|
|
3
|
+
*
|
|
4
|
+
* The manager process spawns the admin's owner cadre node (via
|
|
5
|
+
* `HostProcessOrchestrator`) and delegates owner/membership/identity
|
|
6
|
+
* operations to it over the loopback admin channel using
|
|
7
|
+
* {@link OwnerNodeClient}. See `docs/cadre-host.md` § Control-plane
|
|
8
|
+
* separation.
|
|
9
|
+
*/
|
|
10
|
+
export { OwnerNodeClient, OwnerNodeUnavailableError } from './owner-node-client.js';
|
|
11
|
+
export type { OwnerNodeClientOptions } from './owner-node-client.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owner-node delegation surface for cadre-host.
|
|
3
|
+
*
|
|
4
|
+
* The manager process spawns the admin's owner cadre node (via
|
|
5
|
+
* `HostProcessOrchestrator`) and delegates owner/membership/identity
|
|
6
|
+
* operations to it over the loopback admin channel using
|
|
7
|
+
* {@link OwnerNodeClient}. See `docs/cadre-host.md` § Control-plane
|
|
8
|
+
* separation.
|
|
9
|
+
*/
|
|
10
|
+
export { OwnerNodeClient, OwnerNodeUnavailableError } from './owner-node-client.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/owner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -1,51 +1,52 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTTP client for the
|
|
2
|
+
* HTTP client for the owner node's loopback admin channel (the 6.6
|
|
3
3
|
* `cadre-node-admin-channel` contract).
|
|
4
4
|
*
|
|
5
5
|
* cadre-host's manager process holds no in-process `CadreNode`; it spawns the
|
|
6
|
-
* admin's
|
|
7
|
-
* and delegates all
|
|
6
|
+
* admin's owner node as a managed child (see `HostProcessOrchestrator`)
|
|
7
|
+
* and delegates all owner/membership/identity operations to it over this
|
|
8
8
|
* client. The client implements **both** trimmed `CadreNodeLike` interfaces —
|
|
9
9
|
* the trust-circle one (`auth/trust-circle.ts`) and the NAT one
|
|
10
|
-
* (`nat/nat-service.ts`) — plus `pushInviteAddresses
|
|
10
|
+
* (`nat/nat-service.ts`) — plus `pushInviteAddresses` and `addDrone` (the
|
|
11
|
+
* node-donation requester side).
|
|
11
12
|
*
|
|
12
13
|
* Transport: `Authorization: Bearer <token>` against
|
|
13
14
|
* `http://127.0.0.1:<adminPort>`. Every response uses the cadre-provider
|
|
14
15
|
* envelope `{ ok: true, data }` / `{ ok: false, error: { code, message } }`.
|
|
15
16
|
* A refused connection, a transport error, or any non-2xx response surfaces
|
|
16
|
-
* as {@link
|
|
17
|
+
* as {@link OwnerNodeUnavailableError}; the trust-circle / NAT services
|
|
17
18
|
* translate that into a `node_unavailable` domain error so the management API
|
|
18
19
|
* returns a clear 503 rather than a raw 500.
|
|
19
20
|
*/
|
|
20
|
-
import type { CadreInvite } from '@serfab/cadre-core';
|
|
21
|
-
import type {
|
|
21
|
+
import type { CadreInvite, DroneInitResult } from '@serfab/cadre-core';
|
|
22
|
+
import type { OwnerAdminEndpoint } from '../orchestrator/index.js';
|
|
22
23
|
import type { CadreNodeLike as TrustCircleCadreNodeLike } from '../auth/trust-circle.js';
|
|
23
24
|
import type { CadreNodeLike as NatCadreNodeLike } from '../nat/nat-service.js';
|
|
24
25
|
/**
|
|
25
|
-
* Raised when the
|
|
26
|
+
* Raised when the owner node's admin channel can't be reached or returns
|
|
26
27
|
* a non-success response. Carries the node's stable error `code` when one was
|
|
27
28
|
* present in the envelope (e.g. `not_ready`, `not_authorized`).
|
|
28
29
|
*/
|
|
29
|
-
export declare class
|
|
30
|
+
export declare class OwnerNodeUnavailableError extends Error {
|
|
30
31
|
/** The admin-channel error code, when the node answered with an envelope. */
|
|
31
32
|
readonly nodeCode?: string;
|
|
32
33
|
constructor(message: string, nodeCode?: string);
|
|
33
34
|
}
|
|
34
35
|
/** Endpoint provided directly or via a getter (so it tracks re-spawns). */
|
|
35
|
-
type EndpointSource =
|
|
36
|
-
export interface
|
|
36
|
+
type EndpointSource = OwnerAdminEndpoint | (() => OwnerAdminEndpoint | undefined) | undefined;
|
|
37
|
+
export interface OwnerNodeClientOptions {
|
|
37
38
|
/** Fetch override for tests. Defaults to the global `fetch`. */
|
|
38
39
|
fetch?: typeof fetch;
|
|
39
40
|
}
|
|
40
|
-
export declare class
|
|
41
|
+
export declare class OwnerNodeClient implements TrustCircleCadreNodeLike, NatCadreNodeLike {
|
|
41
42
|
private readonly endpointSource;
|
|
42
43
|
private readonly fetchImpl;
|
|
43
44
|
/**
|
|
44
45
|
* @param endpoint Either a fixed `{ baseUrl, token }` or a getter returning
|
|
45
|
-
* the current endpoint (pass `orchestrator.
|
|
46
|
+
* the current endpoint (pass `orchestrator.getOwnerAdminEndpoint`
|
|
46
47
|
* bound, so a restart's new bearer token is picked up automatically).
|
|
47
48
|
*/
|
|
48
|
-
constructor(endpoint: EndpointSource, opts?:
|
|
49
|
+
constructor(endpoint: EndpointSource, opts?: OwnerNodeClientOptions);
|
|
49
50
|
createInvite(token?: string, expiresInMs?: number): Promise<{
|
|
50
51
|
invite: CadreInvite;
|
|
51
52
|
encodedInvite: string;
|
|
@@ -66,8 +67,25 @@ export declare class AuthorityNodeClient implements TrustCircleCadreNodeLike, Na
|
|
|
66
67
|
multiaddr: string | null;
|
|
67
68
|
}>>;
|
|
68
69
|
isMember(peerId: string): Promise<boolean>;
|
|
70
|
+
/** Authorized-membership surface (excludes self) — see {@link listMembers} for the addressable one. */
|
|
71
|
+
listAuthorizedMembers(): Promise<Array<{
|
|
72
|
+
peerId: string;
|
|
73
|
+
multiaddr: string | null;
|
|
74
|
+
}>>;
|
|
75
|
+
isAuthorizedMember(peerId: string): Promise<boolean>;
|
|
69
76
|
getPeerId(): Promise<string>;
|
|
70
77
|
getMultiaddrs(): Promise<string[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Mint a seed authorizing a drone — a provider-hosted / donated node — to join
|
|
80
|
+
* this node's cadre. The node signs the seed with its own authority key; only
|
|
81
|
+
* the signed, public `encodedSeed` is returned (the private key never leaves
|
|
82
|
+
* the node). This is the requester ("phone") side of the node-donation flow:
|
|
83
|
+
* the donor host presents the returned seed to the donated node's `POST /seed`.
|
|
84
|
+
*/
|
|
85
|
+
addDrone(options: {
|
|
86
|
+
dronePeerId: string;
|
|
87
|
+
droneMultiaddrs: string[];
|
|
88
|
+
}): Promise<DroneInitResult>;
|
|
71
89
|
/** Push the NAT-resolved addresses the node should embed in future invites. */
|
|
72
90
|
pushInviteAddresses(addresses: string[]): Promise<void>;
|
|
73
91
|
private resolveEndpoint;
|
|
@@ -1,41 +1,42 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTTP client for the
|
|
2
|
+
* HTTP client for the owner node's loopback admin channel (the 6.6
|
|
3
3
|
* `cadre-node-admin-channel` contract).
|
|
4
4
|
*
|
|
5
5
|
* cadre-host's manager process holds no in-process `CadreNode`; it spawns the
|
|
6
|
-
* admin's
|
|
7
|
-
* and delegates all
|
|
6
|
+
* admin's owner node as a managed child (see `HostProcessOrchestrator`)
|
|
7
|
+
* and delegates all owner/membership/identity operations to it over this
|
|
8
8
|
* client. The client implements **both** trimmed `CadreNodeLike` interfaces —
|
|
9
9
|
* the trust-circle one (`auth/trust-circle.ts`) and the NAT one
|
|
10
|
-
* (`nat/nat-service.ts`) — plus `pushInviteAddresses
|
|
10
|
+
* (`nat/nat-service.ts`) — plus `pushInviteAddresses` and `addDrone` (the
|
|
11
|
+
* node-donation requester side).
|
|
11
12
|
*
|
|
12
13
|
* Transport: `Authorization: Bearer <token>` against
|
|
13
14
|
* `http://127.0.0.1:<adminPort>`. Every response uses the cadre-provider
|
|
14
15
|
* envelope `{ ok: true, data }` / `{ ok: false, error: { code, message } }`.
|
|
15
16
|
* A refused connection, a transport error, or any non-2xx response surfaces
|
|
16
|
-
* as {@link
|
|
17
|
+
* as {@link OwnerNodeUnavailableError}; the trust-circle / NAT services
|
|
17
18
|
* translate that into a `node_unavailable` domain error so the management API
|
|
18
19
|
* returns a clear 503 rather than a raw 500.
|
|
19
20
|
*/
|
|
20
21
|
import debug from 'debug';
|
|
21
|
-
const log = debug('cadre:host:
|
|
22
|
+
const log = debug('cadre:host:owner-client');
|
|
22
23
|
/**
|
|
23
|
-
* Raised when the
|
|
24
|
+
* Raised when the owner node's admin channel can't be reached or returns
|
|
24
25
|
* a non-success response. Carries the node's stable error `code` when one was
|
|
25
26
|
* present in the envelope (e.g. `not_ready`, `not_authorized`).
|
|
26
27
|
*/
|
|
27
|
-
export class
|
|
28
|
+
export class OwnerNodeUnavailableError extends Error {
|
|
28
29
|
constructor(message, nodeCode) {
|
|
29
30
|
super(message);
|
|
30
|
-
this.name = '
|
|
31
|
+
this.name = 'OwnerNodeUnavailableError';
|
|
31
32
|
if (nodeCode !== undefined)
|
|
32
33
|
this.nodeCode = nodeCode;
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
|
-
export class
|
|
36
|
+
export class OwnerNodeClient {
|
|
36
37
|
/**
|
|
37
38
|
* @param endpoint Either a fixed `{ baseUrl, token }` or a getter returning
|
|
38
|
-
* the current endpoint (pass `orchestrator.
|
|
39
|
+
* the current endpoint (pass `orchestrator.getOwnerAdminEndpoint`
|
|
39
40
|
* bound, so a restart's new bearer token is picked up automatically).
|
|
40
41
|
*/
|
|
41
42
|
constructor(endpoint, opts = {}) {
|
|
@@ -78,6 +79,15 @@ export class AuthorityNodeClient {
|
|
|
78
79
|
const data = await this.request('GET', `/admin/members/${encodeURIComponent(peerId)}`);
|
|
79
80
|
return data.member;
|
|
80
81
|
}
|
|
82
|
+
/** Authorized-membership surface (excludes self) — see {@link listMembers} for the addressable one. */
|
|
83
|
+
async listAuthorizedMembers() {
|
|
84
|
+
const data = await this.request('GET', '/admin/authorized-members');
|
|
85
|
+
return data.members;
|
|
86
|
+
}
|
|
87
|
+
async isAuthorizedMember(peerId) {
|
|
88
|
+
const data = await this.request('GET', `/admin/authorized-members/${encodeURIComponent(peerId)}`);
|
|
89
|
+
return data.member;
|
|
90
|
+
}
|
|
81
91
|
// --- NAT CadreNodeLike ---
|
|
82
92
|
async getPeerId() {
|
|
83
93
|
const data = await this.request('GET', '/admin/identity');
|
|
@@ -87,6 +97,20 @@ export class AuthorityNodeClient {
|
|
|
87
97
|
const data = await this.request('GET', '/admin/multiaddrs');
|
|
88
98
|
return data.multiaddrs;
|
|
89
99
|
}
|
|
100
|
+
// --- drone seeding (node-donation requester side) ---
|
|
101
|
+
/**
|
|
102
|
+
* Mint a seed authorizing a drone — a provider-hosted / donated node — to join
|
|
103
|
+
* this node's cadre. The node signs the seed with its own authority key; only
|
|
104
|
+
* the signed, public `encodedSeed` is returned (the private key never leaves
|
|
105
|
+
* the node). This is the requester ("phone") side of the node-donation flow:
|
|
106
|
+
* the donor host presents the returned seed to the donated node's `POST /seed`.
|
|
107
|
+
*/
|
|
108
|
+
async addDrone(options) {
|
|
109
|
+
return await this.request('POST', '/admin/add-drone', {
|
|
110
|
+
dronePeerId: options.dronePeerId,
|
|
111
|
+
droneMultiaddrs: options.droneMultiaddrs,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
90
114
|
// --- push-model invite addresses ---
|
|
91
115
|
/** Push the NAT-resolved addresses the node should embed in future invites. */
|
|
92
116
|
async pushInviteAddresses(addresses) {
|
|
@@ -96,7 +120,7 @@ export class AuthorityNodeClient {
|
|
|
96
120
|
resolveEndpoint() {
|
|
97
121
|
const ep = typeof this.endpointSource === 'function' ? this.endpointSource() : this.endpointSource;
|
|
98
122
|
if (!ep) {
|
|
99
|
-
throw new
|
|
123
|
+
throw new OwnerNodeUnavailableError('Owner node admin endpoint is not available');
|
|
100
124
|
}
|
|
101
125
|
return ep;
|
|
102
126
|
}
|
|
@@ -115,14 +139,14 @@ export class AuthorityNodeClient {
|
|
|
115
139
|
catch (err) {
|
|
116
140
|
const message = err instanceof Error ? err.message : String(err);
|
|
117
141
|
log('admin %s %s transport error: %s', method, path, message);
|
|
118
|
-
throw new
|
|
142
|
+
throw new OwnerNodeUnavailableError(`Owner node unreachable: ${message}`);
|
|
119
143
|
}
|
|
120
144
|
const envelope = await this.parseEnvelope(res);
|
|
121
145
|
if (!res.ok || !envelope.ok) {
|
|
122
146
|
const code = envelope.error?.code;
|
|
123
147
|
const message = envelope.error?.message ?? `admin ${method} ${path} → HTTP ${res.status}`;
|
|
124
148
|
log('admin %s %s failed: [%s] %s', method, path, code ?? res.status, message);
|
|
125
|
-
throw new
|
|
149
|
+
throw new OwnerNodeUnavailableError(message, code);
|
|
126
150
|
}
|
|
127
151
|
return envelope.data;
|
|
128
152
|
}
|
|
@@ -140,4 +164,4 @@ export class AuthorityNodeClient {
|
|
|
140
164
|
return {};
|
|
141
165
|
}
|
|
142
166
|
}
|
|
143
|
-
//# sourceMappingURL=
|
|
167
|
+
//# sourceMappingURL=owner-node-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-node-client.js","sourceRoot":"","sources":["../../src/owner/owner-node-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,21 @@
|
|
|
22
22
|
* apply_in_progress → 409
|
|
23
23
|
* signature_invalid, unsupported_state_version,
|
|
24
24
|
* apply_failed, rollback_failed, storage_error → 500
|
|
25
|
+
* - GrantError
|
|
26
|
+
* invalid_label, invalid_max_nodes,
|
|
27
|
+
* invalid_ttl → 400
|
|
28
|
+
* not_found → 404
|
|
29
|
+
* storage_error → 500
|
|
30
|
+
* - DonationError
|
|
31
|
+
* invalid_request → 400
|
|
32
|
+
* unauthorized → 401
|
|
33
|
+
* forbidden → 403
|
|
34
|
+
* not_found → 404
|
|
35
|
+
* invalid_state → 409
|
|
36
|
+
* quota_exceeded → 429
|
|
37
|
+
* orchestrator_error, storage_error → 500
|
|
38
|
+
* seed_failed → 502
|
|
39
|
+
* peer_unavailable → 503
|
|
25
40
|
* - everything else → 500 (code "internal")
|
|
26
41
|
*/
|
|
27
42
|
import type { FastifyInstance } from 'fastify';
|
|
@@ -22,12 +22,28 @@
|
|
|
22
22
|
* apply_in_progress → 409
|
|
23
23
|
* signature_invalid, unsupported_state_version,
|
|
24
24
|
* apply_failed, rollback_failed, storage_error → 500
|
|
25
|
+
* - GrantError
|
|
26
|
+
* invalid_label, invalid_max_nodes,
|
|
27
|
+
* invalid_ttl → 400
|
|
28
|
+
* not_found → 404
|
|
29
|
+
* storage_error → 500
|
|
30
|
+
* - DonationError
|
|
31
|
+
* invalid_request → 400
|
|
32
|
+
* unauthorized → 401
|
|
33
|
+
* forbidden → 403
|
|
34
|
+
* not_found → 404
|
|
35
|
+
* invalid_state → 409
|
|
36
|
+
* quota_exceeded → 429
|
|
37
|
+
* orchestrator_error, storage_error → 500
|
|
38
|
+
* seed_failed → 502
|
|
39
|
+
* peer_unavailable → 503
|
|
25
40
|
* - everything else → 500 (code "internal")
|
|
26
41
|
*/
|
|
27
42
|
import debug from 'debug';
|
|
28
43
|
import { TrustCircleError } from '../auth/types.js';
|
|
29
44
|
import { NatError } from '../nat/types.js';
|
|
30
45
|
import { UpdateErrorException } from '../update/types.js';
|
|
46
|
+
import { GrantError, DonationError } from '../donation/types.js';
|
|
31
47
|
const log = debug('cadre:host:error-handler');
|
|
32
48
|
const TRUST_STATUS = {
|
|
33
49
|
invalid_label: 400,
|
|
@@ -50,6 +66,25 @@ const NAT_STATUS = {
|
|
|
50
66
|
ddns_update_failed: 500,
|
|
51
67
|
node_unavailable: 503,
|
|
52
68
|
};
|
|
69
|
+
const GRANT_STATUS = {
|
|
70
|
+
invalid_label: 400,
|
|
71
|
+
invalid_max_nodes: 400,
|
|
72
|
+
invalid_ttl: 400,
|
|
73
|
+
not_found: 404,
|
|
74
|
+
storage_error: 500,
|
|
75
|
+
};
|
|
76
|
+
const DONATION_STATUS = {
|
|
77
|
+
unauthorized: 401,
|
|
78
|
+
forbidden: 403,
|
|
79
|
+
quota_exceeded: 429,
|
|
80
|
+
invalid_request: 400,
|
|
81
|
+
not_found: 404,
|
|
82
|
+
invalid_state: 409,
|
|
83
|
+
seed_failed: 502,
|
|
84
|
+
peer_unavailable: 503,
|
|
85
|
+
orchestrator_error: 500,
|
|
86
|
+
storage_error: 500,
|
|
87
|
+
};
|
|
53
88
|
const UPDATE_STATUS = {
|
|
54
89
|
manifest_invalid: 400,
|
|
55
90
|
no_update_available: 400,
|
|
@@ -86,6 +121,12 @@ function classify(err) {
|
|
|
86
121
|
if (err instanceof UpdateErrorException) {
|
|
87
122
|
return { status: UPDATE_STATUS[err.code] ?? 500, code: err.code, message: err.message };
|
|
88
123
|
}
|
|
124
|
+
if (err instanceof GrantError) {
|
|
125
|
+
return { status: GRANT_STATUS[err.code] ?? 500, code: err.code, message: err.message };
|
|
126
|
+
}
|
|
127
|
+
if (err instanceof DonationError) {
|
|
128
|
+
return { status: DONATION_STATUS[err.code] ?? 500, code: err.code, message: err.message };
|
|
129
|
+
}
|
|
89
130
|
// Fastify body-parsing / validation errors have a statusCode we should honour.
|
|
90
131
|
if (typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600) {
|
|
91
132
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/server/error-handler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/server/error-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ import type { HostProcessOrchestrator } from '../orchestrator/index.js';
|
|
|
17
17
|
import type { TrustCircleService } from '../auth/index.js';
|
|
18
18
|
import type { NatService } from '../nat/index.js';
|
|
19
19
|
import type { UpdateService } from '../update/index.js';
|
|
20
|
+
import type { GrantService, DonationService } from '../donation/index.js';
|
|
20
21
|
import { EventBus } from './events/bus.js';
|
|
21
22
|
import { HostSettingsStore } from './settings-store.js';
|
|
22
23
|
export interface LocalUiServerOptions {
|
|
@@ -26,10 +27,33 @@ export interface LocalUiServerOptions {
|
|
|
26
27
|
dataDir: string;
|
|
27
28
|
/** Wired dependencies — all owned by the caller. */
|
|
28
29
|
orchestrator: HostProcessOrchestrator;
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Trust-circle service — present only when the host runs its own personal
|
|
32
|
+
* cadre (`ownCadre.enabled`). Absent in donor-only mode, where `/auth/*`
|
|
33
|
+
* stays unmounted and 404s.
|
|
34
|
+
*/
|
|
35
|
+
trustCircle?: TrustCircleService;
|
|
36
|
+
/**
|
|
37
|
+
* NAT service — present only when the host runs its own personal cadre.
|
|
38
|
+
* Absent in donor-only mode (loopback-only in v1), where `/nat/*` stays
|
|
39
|
+
* unmounted and 404s.
|
|
40
|
+
*/
|
|
41
|
+
nat?: NatService;
|
|
31
42
|
/** Optional — 6.4.2 lands this; nullable while still iterating. */
|
|
32
43
|
update?: UpdateService;
|
|
44
|
+
/**
|
|
45
|
+
* Donation grant layer. When present, mounts the loopback admin surface at
|
|
46
|
+
* `/grants-admin` (issue/list/revoke). Optional so existing callers/tests
|
|
47
|
+
* that don't exercise donations need not wire it.
|
|
48
|
+
*/
|
|
49
|
+
grants?: GrantService;
|
|
50
|
+
/**
|
|
51
|
+
* Donation lifecycle service. When present (alongside `grants`), mounts the
|
|
52
|
+
* bearer-gated grantee-facing provisioning surface at `/grants`
|
|
53
|
+
* (provision / peer / seed / terminate). Optional so callers/tests that don't
|
|
54
|
+
* exercise the donor path need not wire it.
|
|
55
|
+
*/
|
|
56
|
+
donations?: DonationService;
|
|
33
57
|
/** Settings I/O facade. Defaults to a new one rooted at `dataDir`. */
|
|
34
58
|
settingsStore?: HostSettingsStore;
|
|
35
59
|
/** Bus instance — pass the same one to subsystems that publish events. */
|
package/dist/server/index.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import { createTrustCircleHandlers } from '../auth/index.js';
|
|
16
16
|
import { createNatHandlers } from '../nat/index.js';
|
|
17
17
|
import { createUpdateHandlers } from '../update/index.js';
|
|
18
|
+
import { createGrantAdminHandlers } from '../donation/index.js';
|
|
18
19
|
import { EventBus } from './events/bus.js';
|
|
19
20
|
import { registerSseRoute } from './events/sse-route.js';
|
|
20
21
|
import { registerErrorHandler } from './error-handler.js';
|
|
@@ -27,6 +28,8 @@ import { registerUpdateRoutes } from './routes/update.js';
|
|
|
27
28
|
import { registerStatusRoute } from './routes/status.js';
|
|
28
29
|
import { registerNodesRoutes } from './routes/nodes.js';
|
|
29
30
|
import { registerSettingsRoutes } from './routes/settings.js';
|
|
31
|
+
import { registerGrantsAdminRoutes } from './routes/grants-admin.js';
|
|
32
|
+
import { registerGrantsRoutes } from './routes/grants.js';
|
|
30
33
|
import { HostSettingsStore } from './settings-store.js';
|
|
31
34
|
/** How often to poll UpdateService.getState() looking for new versions. */
|
|
32
35
|
const UPDATE_OBSERVER_INTERVAL_MS = 60000;
|
|
@@ -44,17 +47,32 @@ export function createLocalUiServer(opts) {
|
|
|
44
47
|
});
|
|
45
48
|
registerStatusRoute(app, {
|
|
46
49
|
orchestrator: opts.orchestrator,
|
|
47
|
-
trustCircle: opts.trustCircle,
|
|
48
|
-
nat: opts.nat,
|
|
50
|
+
...(opts.trustCircle ? { trustCircle: opts.trustCircle } : {}),
|
|
51
|
+
...(opts.nat ? { nat: opts.nat } : {}),
|
|
49
52
|
...(opts.update ? { update: opts.update } : {}),
|
|
50
53
|
});
|
|
51
54
|
registerNodesRoutes(app, { orchestrator: opts.orchestrator });
|
|
52
|
-
registerSettingsRoutes(app, { settingsStore, nat: opts.nat, ...(opts.update ? { update: opts.update } : {}) });
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
registerSettingsRoutes(app, { settingsStore, ...(opts.nat ? { nat: opts.nat } : {}), ...(opts.update ? { update: opts.update } : {}) });
|
|
56
|
+
// Trust-circle + NAT surfaces exist only when the host runs its own personal
|
|
57
|
+
// cadre. In donor-only mode they're left unmounted, so `/auth/*` and `/nat/*`
|
|
58
|
+
// fall through to the static not-found handler and 404 (see static.ts).
|
|
59
|
+
if (opts.trustCircle) {
|
|
60
|
+
registerTrustCircleRoutes(app, { handlers: createTrustCircleHandlers(opts.trustCircle), events });
|
|
61
|
+
}
|
|
62
|
+
if (opts.nat) {
|
|
63
|
+
registerNatRoutes(app, { handlers: createNatHandlers(opts.nat), events });
|
|
64
|
+
}
|
|
55
65
|
if (opts.update) {
|
|
56
66
|
registerUpdateRoutes(app, { handlers: createUpdateHandlers(opts.update), events });
|
|
57
67
|
}
|
|
68
|
+
if (opts.grants) {
|
|
69
|
+
registerGrantsAdminRoutes(app, { handlers: createGrantAdminHandlers(opts.grants) });
|
|
70
|
+
// Grantee-facing provisioning surface needs both the donation service and a
|
|
71
|
+
// grant validator (the GrantService doubles as the validator).
|
|
72
|
+
if (opts.donations) {
|
|
73
|
+
registerGrantsRoutes(app, { donations: opts.donations, grants: opts.grants });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
58
76
|
// Static mount registers as the not-found handler — declared last so the
|
|
59
77
|
// API paths above win.
|
|
60
78
|
registerStaticMount(app, { ...(opts.staticRoot !== undefined ? { rootDir: opts.staticRoot } : {}) });
|
|
@@ -85,17 +103,20 @@ export function createLocalUiServer(opts) {
|
|
|
85
103
|
});
|
|
86
104
|
}));
|
|
87
105
|
// One-shot connectivity publish — the SPA will get a sane initial
|
|
88
|
-
// signal even if no settings have changed yet this session.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
106
|
+
// signal even if no settings have changed yet this session. Skipped in
|
|
107
|
+
// donor-only mode, where there is no NatService.
|
|
108
|
+
if (opts.nat) {
|
|
109
|
+
try {
|
|
110
|
+
const snap = opts.nat.getStatus();
|
|
111
|
+
events.publish({
|
|
112
|
+
type: 'connectivity-changed',
|
|
113
|
+
portMode: snap.portMode,
|
|
114
|
+
directReachability: snap.directReachability,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// NatService.start may not have completed; harmless to skip.
|
|
119
|
+
}
|
|
99
120
|
}
|
|
100
121
|
// Update observer: poll UpdateService.getState() every 60 s and emit
|
|
101
122
|
// `update-available` when `available.version` changes. Cheap, avoids
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Donation grant **admin** HTTP routes — thin adapters around
|
|
3
|
+
* `GrantAdminHandlers` (`createGrantAdminHandlers(service)`).
|
|
4
|
+
*
|
|
5
|
+
* Mount path: `/grants-admin` — the admin surface the `cadre-host grant` CLI
|
|
6
|
+
* targets. It is **loopback, no bearer**: same-machine admin, matching
|
|
7
|
+
* cadre-host's local-UI "no login" posture (see docs/cadre-host.md §
|
|
8
|
+
* Security posture). This is distinct from the grantee-facing `/grants`
|
|
9
|
+
* provisioning surface that carries the bearer gate — that arrives in the
|
|
10
|
+
* `2-donation-service` ticket.
|
|
11
|
+
*/
|
|
12
|
+
import type { FastifyInstance } from 'fastify';
|
|
13
|
+
import type { GrantAdminHandlers } from '../../donation/types.js';
|
|
14
|
+
export interface GrantsAdminRoutesOptions {
|
|
15
|
+
handlers: GrantAdminHandlers;
|
|
16
|
+
}
|
|
17
|
+
export declare function registerGrantsAdminRoutes(app: FastifyInstance, opts: GrantsAdminRoutesOptions): void;
|