@serfab/cadre-core 0.0.2
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 +252 -0
- package/dist/arachnode-stub.d.ts +60 -0
- package/dist/arachnode-stub.js +120 -0
- package/dist/arachnode-stub.js.map +1 -0
- package/dist/cadre-node.d.ts +252 -0
- package/dist/cadre-node.js +753 -0
- package/dist/cadre-node.js.map +1 -0
- package/dist/control-database.d.ts +62 -0
- package/dist/control-database.js +295 -0
- package/dist/control-database.js.map +1 -0
- package/dist/enrollment.d.ts +76 -0
- package/dist/enrollment.js +126 -0
- package/dist/enrollment.js.map +1 -0
- package/dist/hibernation-manager.d.ts +68 -0
- package/dist/hibernation-manager.js +212 -0
- package/dist/hibernation-manager.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/seed-bootstrap.d.ts +164 -0
- package/dist/seed-bootstrap.js +554 -0
- package/dist/seed-bootstrap.js.map +1 -0
- package/dist/strand-database.d.ts +39 -0
- package/dist/strand-database.js +108 -0
- package/dist/strand-database.js.map +1 -0
- package/dist/strand-formation-manager.d.ts +87 -0
- package/dist/strand-formation-manager.js +168 -0
- package/dist/strand-formation-manager.js.map +1 -0
- package/dist/strand-instance-manager.d.ts +60 -0
- package/dist/strand-instance-manager.js +209 -0
- package/dist/strand-instance-manager.js.map +1 -0
- package/dist/strand-solicitation.d.ts +145 -0
- package/dist/strand-solicitation.js +180 -0
- package/dist/strand-solicitation.js.map +1 -0
- package/dist/strand-watcher.d.ts +70 -0
- package/dist/strand-watcher.js +136 -0
- package/dist/strand-watcher.js.map +1 -0
- package/dist/types.d.ts +484 -0
- package/dist/types.js +26 -0
- package/dist/types.js.map +1 -0
- package/package.json +67 -0
- package/src/arachnode-stub.ts +160 -0
- package/src/cadre-node.ts +923 -0
- package/src/control-database.ts +376 -0
- package/src/enrollment.ts +199 -0
- package/src/hibernation-manager.ts +268 -0
- package/src/index.ts +71 -0
- package/src/seed-bootstrap.ts +753 -0
- package/src/strand-database.ts +168 -0
- package/src/strand-formation-manager.ts +277 -0
- package/src/strand-instance-manager.ts +281 -0
- package/src/strand-solicitation.ts +318 -0
- package/src/strand-watcher.ts +197 -0
- package/src/types.ts +553 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cadre-node.js","sourceRoot":"","sources":["../src/cadre-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Database } from '@quereus/quereus';
|
|
2
|
+
import type { Libp2p } from '@libp2p/interface';
|
|
3
|
+
import type { IRepo } from '@optimystic/db-core';
|
|
4
|
+
import type { StrandRow } from './types.js';
|
|
5
|
+
export interface ControlDatabaseConfig {
|
|
6
|
+
/** Party ID for the control network */
|
|
7
|
+
partyId: string;
|
|
8
|
+
/**
|
|
9
|
+
* Optional path to the control schema file.
|
|
10
|
+
* If not provided, uses the embedded schema for cross-platform compatibility.
|
|
11
|
+
* Only use this if you need to override the default schema (e.g., for testing).
|
|
12
|
+
*/
|
|
13
|
+
schemaPath?: string;
|
|
14
|
+
/** Libp2p node for the control network (injected) */
|
|
15
|
+
libp2pNode: Libp2p;
|
|
16
|
+
/** Coordinated repo from the libp2p node */
|
|
17
|
+
coordinatedRepo: IRepo;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* ControlDatabase manages the CadreControl schema using Quereus with Optimystic backend.
|
|
21
|
+
* It provides typed query methods for accessing control network data.
|
|
22
|
+
*/
|
|
23
|
+
export declare class ControlDatabase {
|
|
24
|
+
private db;
|
|
25
|
+
private collectionFactory;
|
|
26
|
+
private readonly config;
|
|
27
|
+
private initialized;
|
|
28
|
+
constructor(config: ControlDatabaseConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the database - load schema and register plugins
|
|
31
|
+
*/
|
|
32
|
+
initialize(): Promise<void>;
|
|
33
|
+
private loadSchema;
|
|
34
|
+
/**
|
|
35
|
+
* Query all strands from the control database
|
|
36
|
+
*/
|
|
37
|
+
queryStrands(): Promise<StrandRow[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Get the underlying database for advanced queries
|
|
40
|
+
*/
|
|
41
|
+
getDatabase(): Database;
|
|
42
|
+
/**
|
|
43
|
+
* Insert the initial authority key (bootstrap - no existing authorities required)
|
|
44
|
+
*/
|
|
45
|
+
insertAuthorityKey(key: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Insert a strand into the control database using authority signature.
|
|
48
|
+
* This starts a transaction, gets the StampId, signs it, and inserts the strand.
|
|
49
|
+
*
|
|
50
|
+
* @param strandId - Unique identifier for the strand
|
|
51
|
+
* @param type - Strand type: 'o' for open, 'c' for closed
|
|
52
|
+
* @param authorityKey - Public key of the authorizing authority
|
|
53
|
+
* @param signStampId - Function to sign the stamp ID with the authority's private key
|
|
54
|
+
* @param memberPrivateKey - Optional private key for membership in closed strands
|
|
55
|
+
*/
|
|
56
|
+
insertStrand(strandId: string, type: 'o' | 'c', authorityKey: string, signStampId: (stampId: string) => string, memberPrivateKey?: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Close the database and cleanup resources
|
|
59
|
+
*/
|
|
60
|
+
close(): Promise<void>;
|
|
61
|
+
private ensureInitialized;
|
|
62
|
+
}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import debug from 'debug';
|
|
2
|
+
import { toString as uint8ArrayToString } from 'uint8arrays';
|
|
3
|
+
import { Database, registerPlugin } from '@quereus/quereus';
|
|
4
|
+
import cryptoPlugin from '@optimystic/quereus-plugin-crypto/plugin';
|
|
5
|
+
import optimysticPlugin from '@optimystic/quereus-plugin-optimystic/plugin';
|
|
6
|
+
import { digest, randomBytes } from '@optimystic/quereus-plugin-crypto';
|
|
7
|
+
const log = debug('sereus:cadre:control-db');
|
|
8
|
+
/**
|
|
9
|
+
* Embedded control schema for cross-platform compatibility.
|
|
10
|
+
* This schema is embedded directly in the code to work in React Native and other
|
|
11
|
+
* environments where file system access is not available.
|
|
12
|
+
*/
|
|
13
|
+
const CONTROL_SCHEMA = `-- This manages a Sereus party's cadre, or set of nodes, and their participation in strands (networks)
|
|
14
|
+
declare schema CadreControl {
|
|
15
|
+
-- A key that can authorize various control changes
|
|
16
|
+
table AuthorityKey (
|
|
17
|
+
Key text primary key,
|
|
18
|
+
constraint Authorized check (
|
|
19
|
+
-- Bootstrap: first authority key needs no existing authorization
|
|
20
|
+
(select count(1) from AuthorityKey) <= 1
|
|
21
|
+
|
|
22
|
+
-- Old authority can authorize by signature and transaction stamp id (not repeatable)
|
|
23
|
+
or (old.Key is not null and old.Key = context.AuthorityKey and verify(digest(context.StampId, 'sha256', 'utf8'), context.Signature, old.Key, 'ed25519'))
|
|
24
|
+
|
|
25
|
+
-- or other authorities can authorize by signature and transaction stamp id (not repeatable)
|
|
26
|
+
or exists (select 1 from AuthorityKey A where A.Key = context.AuthorityKey and verify(digest(context.StampId, 'sha256', 'utf8'), context.Signature, A.Key, 'ed25519'))
|
|
27
|
+
)
|
|
28
|
+
) with context (AuthorityKey text null, Signature text null, StampId text);
|
|
29
|
+
|
|
30
|
+
-- A key that can validate a strand formation disclosure
|
|
31
|
+
table ValidationKey (
|
|
32
|
+
Key text primary key,
|
|
33
|
+
constraint Authorized check (
|
|
34
|
+
-- Authorities can authorize by signature and transaction stamp id (not repeatable)
|
|
35
|
+
exists (select 1 from AuthorityKey A where A.Key = context.AuthorityKey and verify(digest(context.StampId, 'sha256', 'utf8'), context.Signature, A.Key, 'ed25519'))
|
|
36
|
+
)
|
|
37
|
+
) with context (AuthorityKey text, StampId text, Signature text);
|
|
38
|
+
|
|
39
|
+
-- A network of members sharing an sApp database, each contributing peer nodes (their cadre) to the overall cohort
|
|
40
|
+
-- Cadre peers should participate in each of these strands
|
|
41
|
+
table Strand (
|
|
42
|
+
Id text primary key, -- UUID
|
|
43
|
+
MemberPrivateKey text null unique, -- Our private key as a member of this strand
|
|
44
|
+
Type text, -- Types: 'o' = Open, 'c' = Closed -- Open can still control writes in the sApp, but only Closed controls reads
|
|
45
|
+
constraint Authorized check (
|
|
46
|
+
-- Authorized by authority signature and transaction stamp id (not repeatable)
|
|
47
|
+
exists (select 1 from AuthorityKey A where A.Key = context.AuthorityKey and verify(digest(context.StampId, 'sha256', 'utf8'), context.Signature, A.Key, 'ed25519'))
|
|
48
|
+
|
|
49
|
+
-- or authorized by a cadre peer who has received a valid formation invitation
|
|
50
|
+
or exists (select 1 from FormationUsage FU where FU.StrandId = new.Id)
|
|
51
|
+
),
|
|
52
|
+
-- TODO: constraint to ensure member private key only if closed
|
|
53
|
+
) with context (AuthorityKey text, StampId text, Signature text);
|
|
54
|
+
|
|
55
|
+
-- A peer (node) that is part of the cadre
|
|
56
|
+
table CadrePeer (
|
|
57
|
+
PeerId text primary key,
|
|
58
|
+
Multiaddr text,
|
|
59
|
+
constraint AuthorizedInsert check on insert, delete (
|
|
60
|
+
-- Authorized by an authority key
|
|
61
|
+
-- Use utf8 input encoding since peer IDs are base58btc strings, not base64url
|
|
62
|
+
exists (select 1 from AuthorityKey A where A.Key = context.AuthorityKey and verify(digest(coalesce(new.PeerId, old.PeerId), 'sha256', 'utf8'), context.Signature, A.Key, 'ed25519'))
|
|
63
|
+
),
|
|
64
|
+
constraint AuthorizedUpdate check on update (
|
|
65
|
+
-- Peer can change its own multiaddr (using utf8 encoding for both values)
|
|
66
|
+
verify(digest(new.PeerId, 'sha256', 'utf8') || digest(new.Multiaddr, 'sha256', 'utf8'), context.Signature, new.PeerId, 'ed25519')
|
|
67
|
+
-- or authorized by an authority key
|
|
68
|
+
or exists (select 1 from AuthorityKey A where A.Key = context.AuthorityKey and verify(digest(new.PeerId, 'sha256', 'utf8'), context.Signature, A.Key, 'ed25519'))
|
|
69
|
+
)
|
|
70
|
+
) with context (AuthorityKey text null, Signature text);
|
|
71
|
+
|
|
72
|
+
-- An open invitation to form a strand with this party
|
|
73
|
+
table FormationInvite (
|
|
74
|
+
Token text primary key, -- Just a random string
|
|
75
|
+
sAppId text, -- The app for the strand that will be formed
|
|
76
|
+
ExpiresAt datetime null,
|
|
77
|
+
TotalUses int null check (TotalUses >= 0),
|
|
78
|
+
ValidationUrl text null, -- Web hook - send disclosure, IP address...
|
|
79
|
+
constraint AuthorizedAddOrRemove check on insert, delete (
|
|
80
|
+
-- Authorized by an authority key to add or remove this invite
|
|
81
|
+
exists (select 1 from AuthorityKey A where A.Key = context.AuthorityKey and verify(digest(context.StampId), context.Signature, A.Key))
|
|
82
|
+
)
|
|
83
|
+
) with context (AuthorityKey text, StampId text, Signature text);
|
|
84
|
+
|
|
85
|
+
table FormationUsage (
|
|
86
|
+
Token text,
|
|
87
|
+
UseNumber int,
|
|
88
|
+
Disclosure text,
|
|
89
|
+
StrandId text,
|
|
90
|
+
primary key (Token, UseNumber),
|
|
91
|
+
constraint InsertOnly check on update, delete (false),
|
|
92
|
+
constraint Monotonic check (
|
|
93
|
+
new.UseNumber = coalesce((select max(UseNumber) from FormationUsage U where U.Token = new.Token), 0) + 1
|
|
94
|
+
),
|
|
95
|
+
constraint Authorized check on insert (
|
|
96
|
+
-- Satisfies an invitation
|
|
97
|
+
exists (
|
|
98
|
+
select 1 from FormationInvite FI
|
|
99
|
+
where FI.Token = new.Token
|
|
100
|
+
and (FI.TotalUses is null or FI.TotalUses >= new.UseNumber)
|
|
101
|
+
and (FI.ExpiresAt is null or FI.ExpiresAt > context.Now)
|
|
102
|
+
and (FI.ValidationUrl is null or verify(digest(new.Token, new.Disclosure), context.ValidationSignature, context.ValidationKey))
|
|
103
|
+
)
|
|
104
|
+
),
|
|
105
|
+
constraint StrandExists check (exists (select 1 from Strand S where S.Id = new.StrandId)),
|
|
106
|
+
) with context (PeerId text, PeerSignature text, Now datetime, ValidationKey text null, ValidationSignature text null);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
apply schema CadreControl;`;
|
|
110
|
+
/**
|
|
111
|
+
* Generate a unique stamp ID for transaction authorization.
|
|
112
|
+
* Format: 32 bytes base64url encoded
|
|
113
|
+
* - First 16 bytes: SHA-256 hash of peer ID (for distributed uniqueness)
|
|
114
|
+
* - Last 16 bytes: Random bytes (for collision resistance)
|
|
115
|
+
*/
|
|
116
|
+
function generateStampId(peerId) {
|
|
117
|
+
// Hash the peer ID and get first 16 bytes (128 bits)
|
|
118
|
+
const peerIdHash = digest(peerId, 'sha256', 'utf8', 'bytes');
|
|
119
|
+
const peerIdHashPart = peerIdHash.slice(0, 16);
|
|
120
|
+
// Generate 16 random bytes
|
|
121
|
+
const randomPart = randomBytes(128, 'bytes');
|
|
122
|
+
// Combine peer ID hash and random bytes
|
|
123
|
+
const combined = new Uint8Array(32);
|
|
124
|
+
combined.set(peerIdHashPart, 0);
|
|
125
|
+
combined.set(randomPart, 16);
|
|
126
|
+
// Convert to base64url
|
|
127
|
+
return uint8ArrayToString(combined, 'base64url');
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* ControlDatabase manages the CadreControl schema using Quereus with Optimystic backend.
|
|
131
|
+
* It provides typed query methods for accessing control network data.
|
|
132
|
+
*/
|
|
133
|
+
export class ControlDatabase {
|
|
134
|
+
constructor(config) {
|
|
135
|
+
this.db = null;
|
|
136
|
+
this.collectionFactory = null;
|
|
137
|
+
this.initialized = false;
|
|
138
|
+
this.config = config;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Initialize the database - load schema and register plugins
|
|
142
|
+
*/
|
|
143
|
+
async initialize() {
|
|
144
|
+
if (this.initialized) {
|
|
145
|
+
log('ControlDatabase already initialized');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
log('Initializing ControlDatabase for party: %s', this.config.partyId);
|
|
149
|
+
// Create database instance
|
|
150
|
+
this.db = new Database();
|
|
151
|
+
// Register crypto plugin (provides digest, sign, verify functions)
|
|
152
|
+
await registerPlugin(this.db, cryptoPlugin);
|
|
153
|
+
log('Registered crypto plugin');
|
|
154
|
+
// Register optimystic plugin with network transactor as default
|
|
155
|
+
const networkName = `control-${this.config.partyId}`;
|
|
156
|
+
const pluginResult = optimysticPlugin(this.db, {
|
|
157
|
+
default_transactor: 'network',
|
|
158
|
+
default_key_network: 'libp2p',
|
|
159
|
+
default_network_name: networkName,
|
|
160
|
+
enable_cache: true,
|
|
161
|
+
});
|
|
162
|
+
// Register vtables and functions manually since we need access to collectionFactory
|
|
163
|
+
for (const vtable of pluginResult.vtables) {
|
|
164
|
+
this.db.registerModule(vtable.name, vtable.module, vtable.auxData);
|
|
165
|
+
}
|
|
166
|
+
for (const func of pluginResult.functions) {
|
|
167
|
+
this.db.registerFunction(func.schema);
|
|
168
|
+
}
|
|
169
|
+
this.collectionFactory = pluginResult.collectionFactory;
|
|
170
|
+
// Inject the libp2p node into the collection factory
|
|
171
|
+
this.collectionFactory.registerLibp2pNode(networkName, this.config.libp2pNode, this.config.coordinatedRepo);
|
|
172
|
+
log('Registered libp2p node with collection factory');
|
|
173
|
+
// Load and execute the schema
|
|
174
|
+
await this.loadSchema();
|
|
175
|
+
this.initialized = true;
|
|
176
|
+
log('ControlDatabase initialized successfully');
|
|
177
|
+
}
|
|
178
|
+
async loadSchema() {
|
|
179
|
+
let schemaContent;
|
|
180
|
+
if (this.config.schemaPath) {
|
|
181
|
+
// Load from file if explicitly provided (for testing or custom schemas)
|
|
182
|
+
// This only works in Node.js environments
|
|
183
|
+
log('Loading schema from file: %s', this.config.schemaPath);
|
|
184
|
+
// Check if we're in a Node.js environment
|
|
185
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
186
|
+
try {
|
|
187
|
+
// Use require to conditionally load fs only in Node.js
|
|
188
|
+
// This won't be bundled by React Native's Metro bundler
|
|
189
|
+
const fs = require('fs/promises');
|
|
190
|
+
schemaContent = await fs.readFile(this.config.schemaPath, 'utf-8');
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw new Error(`Failed to load schema from ${this.config.schemaPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
throw new Error('Loading schema from file is not supported in React Native. ' +
|
|
198
|
+
'Remove the schemaPath option to use the embedded schema instead.');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Use embedded schema for cross-platform compatibility
|
|
203
|
+
log('Using embedded control schema');
|
|
204
|
+
schemaContent = CONTROL_SCHEMA;
|
|
205
|
+
}
|
|
206
|
+
await this.db.exec(schemaContent);
|
|
207
|
+
log('Schema loaded and executed');
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Query all strands from the control database
|
|
211
|
+
*/
|
|
212
|
+
async queryStrands() {
|
|
213
|
+
this.ensureInitialized();
|
|
214
|
+
const results = [];
|
|
215
|
+
for await (const row of this.db.eval('select Id, MemberPrivateKey, Type from CadreControl.Strand')) {
|
|
216
|
+
results.push({
|
|
217
|
+
Id: row.Id,
|
|
218
|
+
MemberPrivateKey: row.MemberPrivateKey,
|
|
219
|
+
Type: row.Type,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return results;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get the underlying database for advanced queries
|
|
226
|
+
*/
|
|
227
|
+
getDatabase() {
|
|
228
|
+
this.ensureInitialized();
|
|
229
|
+
return this.db;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Insert the initial authority key (bootstrap - no existing authorities required)
|
|
233
|
+
*/
|
|
234
|
+
async insertAuthorityKey(key) {
|
|
235
|
+
this.ensureInitialized();
|
|
236
|
+
log('Inserting authority key: %s', key);
|
|
237
|
+
// For bootstrap, context values are not verified since no existing authorities
|
|
238
|
+
// Use fully qualified table name since schema is CadreControl
|
|
239
|
+
// StampId() provides the transaction's unique stamp from the optimystic transaction
|
|
240
|
+
await this.db.exec(`
|
|
241
|
+
insert into CadreControl.AuthorityKey (Key)
|
|
242
|
+
with context AuthorityKey = null, Signature = null, StampId = StampId()
|
|
243
|
+
values ('${key}')
|
|
244
|
+
`);
|
|
245
|
+
log('Authority key inserted');
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Insert a strand into the control database using authority signature.
|
|
249
|
+
* This starts a transaction, gets the StampId, signs it, and inserts the strand.
|
|
250
|
+
*
|
|
251
|
+
* @param strandId - Unique identifier for the strand
|
|
252
|
+
* @param type - Strand type: 'o' for open, 'c' for closed
|
|
253
|
+
* @param authorityKey - Public key of the authorizing authority
|
|
254
|
+
* @param signStampId - Function to sign the stamp ID with the authority's private key
|
|
255
|
+
* @param memberPrivateKey - Optional private key for membership in closed strands
|
|
256
|
+
*/
|
|
257
|
+
async insertStrand(strandId, type, authorityKey, signStampId, memberPrivateKey) {
|
|
258
|
+
this.ensureInitialized();
|
|
259
|
+
log('Inserting strand: %s (type: %s)', strandId, type);
|
|
260
|
+
const memberKeyValue = memberPrivateKey ? `'${memberPrivateKey}'` : 'null';
|
|
261
|
+
// Generate a unique stamp ID using the peer ID for distributed uniqueness
|
|
262
|
+
const peerId = this.config.libp2pNode.peerId.toString();
|
|
263
|
+
const stampId = generateStampId(peerId);
|
|
264
|
+
// Sign the stamp ID with the authority key
|
|
265
|
+
const signature = signStampId(stampId);
|
|
266
|
+
// Insert with the signed stamp ID
|
|
267
|
+
await this.db.exec(`
|
|
268
|
+
insert into CadreControl.Strand (Id, Type, MemberPrivateKey)
|
|
269
|
+
with context AuthorityKey = '${authorityKey}', Signature = '${signature}', StampId = '${stampId}'
|
|
270
|
+
values ('${strandId}', '${type}', ${memberKeyValue})
|
|
271
|
+
`);
|
|
272
|
+
log('Strand inserted: %s', strandId);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Close the database and cleanup resources
|
|
276
|
+
*/
|
|
277
|
+
async close() {
|
|
278
|
+
if (this.collectionFactory) {
|
|
279
|
+
await this.collectionFactory.shutdown();
|
|
280
|
+
this.collectionFactory = null;
|
|
281
|
+
}
|
|
282
|
+
if (this.db) {
|
|
283
|
+
this.db.close();
|
|
284
|
+
this.db = null;
|
|
285
|
+
}
|
|
286
|
+
this.initialized = false;
|
|
287
|
+
log('ControlDatabase closed');
|
|
288
|
+
}
|
|
289
|
+
ensureInitialized() {
|
|
290
|
+
if (!this.initialized || !this.db) {
|
|
291
|
+
throw new Error('ControlDatabase not initialized. Call initialize() first.');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=control-database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-database.js","sourceRoot":"","sources":["../src/control-database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { CreatePeerResult, MemberRegistration, MemberRegistrationResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Interface for verifying member signatures for strand joining
|
|
4
|
+
*/
|
|
5
|
+
export interface MemberVerifier {
|
|
6
|
+
/**
|
|
7
|
+
* Verify that the signature is valid for the given member registration
|
|
8
|
+
* @param registration The member registration data
|
|
9
|
+
* @param signature The signature to verify
|
|
10
|
+
* @returns true if signature is valid
|
|
11
|
+
*/
|
|
12
|
+
verifyMember(registration: MemberRegistration, signature: string): Promise<boolean>;
|
|
13
|
+
/**
|
|
14
|
+
* Check if the member key is authorized to join the strand
|
|
15
|
+
* (e.g., was invited via FormationInvite)
|
|
16
|
+
*/
|
|
17
|
+
isAuthorizedToJoin(strandId: string, memberKey: string): Promise<boolean>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Interface for registering members in a strand
|
|
21
|
+
*/
|
|
22
|
+
export interface MemberRegistry {
|
|
23
|
+
/**
|
|
24
|
+
* Register a member in the strand's member list
|
|
25
|
+
*/
|
|
26
|
+
registerMember(strandId: string, memberKey: string, peerIds: string[]): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a member is already registered in the strand
|
|
29
|
+
*/
|
|
30
|
+
isMemberRegistered(strandId: string, memberKey: string): Promise<boolean>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Enrollment API for creating peer identities and managing strand membership
|
|
34
|
+
*
|
|
35
|
+
* Peer Creation:
|
|
36
|
+
* `createCadrePeer()` generates an Ed25519 keypair for a new node.
|
|
37
|
+
* For cadre peer authorization, use the Seed Bootstrap API instead.
|
|
38
|
+
*
|
|
39
|
+
* Member Registration:
|
|
40
|
+
* Accept invitations to join strands as a member.
|
|
41
|
+
*/
|
|
42
|
+
export declare class EnrollmentService {
|
|
43
|
+
private readonly memberVerifier?;
|
|
44
|
+
private readonly memberRegistry?;
|
|
45
|
+
constructor(options?: {
|
|
46
|
+
memberVerifier?: MemberVerifier;
|
|
47
|
+
memberRegistry?: MemberRegistry;
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* Create a new cadre peer identity
|
|
51
|
+
*
|
|
52
|
+
* Generates a new Ed25519 keypair for a cadre node.
|
|
53
|
+
* The private key should be stored securely by the node.
|
|
54
|
+
* The PeerId can be used with the Seed Bootstrap API for authorization.
|
|
55
|
+
*/
|
|
56
|
+
createCadrePeer(): Promise<CreatePeerResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Register a member into a strand.
|
|
59
|
+
*
|
|
60
|
+
* Called by an invited party to accept an invitation and join as a member.
|
|
61
|
+
* The signature proves ownership of the member key.
|
|
62
|
+
*
|
|
63
|
+
* @param registration The member registration data (strandId, key, peerIds)
|
|
64
|
+
* @param signature Signature over the registration proving key ownership
|
|
65
|
+
* @returns Success/failure with optional reason
|
|
66
|
+
*/
|
|
67
|
+
registerMember(registration: MemberRegistration, signature: string): Promise<MemberRegistrationResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Validate a member registration without actually registering
|
|
70
|
+
* Useful for pre-flight checks
|
|
71
|
+
*/
|
|
72
|
+
validateMemberRegistration(registration: MemberRegistration, signature: string): Promise<{
|
|
73
|
+
valid: boolean;
|
|
74
|
+
reason?: string;
|
|
75
|
+
}>;
|
|
76
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import debug from 'debug';
|
|
2
|
+
import { generateKeyPair, privateKeyToProtobuf } from '@libp2p/crypto/keys';
|
|
3
|
+
import { peerIdFromPrivateKey } from '@libp2p/peer-id';
|
|
4
|
+
const log = debug('sereus:cadre:enrollment');
|
|
5
|
+
/**
|
|
6
|
+
* Enrollment API for creating peer identities and managing strand membership
|
|
7
|
+
*
|
|
8
|
+
* Peer Creation:
|
|
9
|
+
* `createCadrePeer()` generates an Ed25519 keypair for a new node.
|
|
10
|
+
* For cadre peer authorization, use the Seed Bootstrap API instead.
|
|
11
|
+
*
|
|
12
|
+
* Member Registration:
|
|
13
|
+
* Accept invitations to join strands as a member.
|
|
14
|
+
*/
|
|
15
|
+
export class EnrollmentService {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.memberVerifier = options?.memberVerifier;
|
|
18
|
+
this.memberRegistry = options?.memberRegistry;
|
|
19
|
+
log('EnrollmentService created');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a new cadre peer identity
|
|
23
|
+
*
|
|
24
|
+
* Generates a new Ed25519 keypair for a cadre node.
|
|
25
|
+
* The private key should be stored securely by the node.
|
|
26
|
+
* The PeerId can be used with the Seed Bootstrap API for authorization.
|
|
27
|
+
*/
|
|
28
|
+
async createCadrePeer() {
|
|
29
|
+
log('Creating new cadre peer identity');
|
|
30
|
+
// Generate Ed25519 keypair (same as libp2p uses)
|
|
31
|
+
const privateKey = await generateKeyPair('Ed25519');
|
|
32
|
+
const peerId = peerIdFromPrivateKey(privateKey);
|
|
33
|
+
// Export private key as protobuf bytes for storage
|
|
34
|
+
const privateKeyBytes = privateKeyToProtobuf(privateKey);
|
|
35
|
+
log('Created peer with ID: %s', peerId.toString());
|
|
36
|
+
return {
|
|
37
|
+
peerId,
|
|
38
|
+
privateKey: privateKeyBytes
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Member Registration API
|
|
43
|
+
// ============================================================================
|
|
44
|
+
/**
|
|
45
|
+
* Register a member into a strand.
|
|
46
|
+
*
|
|
47
|
+
* Called by an invited party to accept an invitation and join as a member.
|
|
48
|
+
* The signature proves ownership of the member key.
|
|
49
|
+
*
|
|
50
|
+
* @param registration The member registration data (strandId, key, peerIds)
|
|
51
|
+
* @param signature Signature over the registration proving key ownership
|
|
52
|
+
* @returns Success/failure with optional reason
|
|
53
|
+
*/
|
|
54
|
+
async registerMember(registration, signature) {
|
|
55
|
+
const { strandId, key, peerIds } = registration;
|
|
56
|
+
log('Registering member %s for strand %s with %d peers', key, strandId, peerIds.length);
|
|
57
|
+
// Check required dependencies
|
|
58
|
+
if (!this.memberVerifier) {
|
|
59
|
+
log('MemberVerifier not configured');
|
|
60
|
+
return { success: false, reason: 'MemberVerifier not configured' };
|
|
61
|
+
}
|
|
62
|
+
if (!this.memberRegistry) {
|
|
63
|
+
log('MemberRegistry not configured');
|
|
64
|
+
return { success: false, reason: 'MemberRegistry not configured' };
|
|
65
|
+
}
|
|
66
|
+
// Verify the signature
|
|
67
|
+
const isValidSignature = await this.memberVerifier.verifyMember(registration, signature);
|
|
68
|
+
if (!isValidSignature) {
|
|
69
|
+
log('Invalid signature for member registration: %s', key);
|
|
70
|
+
return { success: false, reason: 'Invalid signature' };
|
|
71
|
+
}
|
|
72
|
+
// Check if member is authorized to join (e.g., has a valid invitation)
|
|
73
|
+
const isAuthorized = await this.memberVerifier.isAuthorizedToJoin(strandId, key);
|
|
74
|
+
if (!isAuthorized) {
|
|
75
|
+
log('Member %s not authorized to join strand %s', key, strandId);
|
|
76
|
+
return { success: false, reason: 'Not authorized to join strand' };
|
|
77
|
+
}
|
|
78
|
+
// Check if already registered
|
|
79
|
+
const alreadyRegistered = await this.memberRegistry.isMemberRegistered(strandId, key);
|
|
80
|
+
if (alreadyRegistered) {
|
|
81
|
+
log('Member %s already registered in strand %s', key, strandId);
|
|
82
|
+
return { success: false, reason: 'Member already registered' };
|
|
83
|
+
}
|
|
84
|
+
// Register the member
|
|
85
|
+
try {
|
|
86
|
+
await this.memberRegistry.registerMember(strandId, key, peerIds);
|
|
87
|
+
log('Member %s successfully registered in strand %s', key, strandId);
|
|
88
|
+
return { success: true };
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
92
|
+
log('Failed to register member %s: %s', key, message);
|
|
93
|
+
return { success: false, reason: `Registration failed: ${message}` };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Validate a member registration without actually registering
|
|
98
|
+
* Useful for pre-flight checks
|
|
99
|
+
*/
|
|
100
|
+
async validateMemberRegistration(registration, signature) {
|
|
101
|
+
const { strandId, key } = registration;
|
|
102
|
+
if (!this.memberVerifier) {
|
|
103
|
+
return { valid: false, reason: 'MemberVerifier not configured' };
|
|
104
|
+
}
|
|
105
|
+
if (!this.memberRegistry) {
|
|
106
|
+
return { valid: false, reason: 'MemberRegistry not configured' };
|
|
107
|
+
}
|
|
108
|
+
// Verify signature
|
|
109
|
+
const isValidSignature = await this.memberVerifier.verifyMember(registration, signature);
|
|
110
|
+
if (!isValidSignature) {
|
|
111
|
+
return { valid: false, reason: 'Invalid signature' };
|
|
112
|
+
}
|
|
113
|
+
// Check authorization
|
|
114
|
+
const isAuthorized = await this.memberVerifier.isAuthorizedToJoin(strandId, key);
|
|
115
|
+
if (!isAuthorized) {
|
|
116
|
+
return { valid: false, reason: 'Not authorized to join strand' };
|
|
117
|
+
}
|
|
118
|
+
// Check if already registered
|
|
119
|
+
const alreadyRegistered = await this.memberRegistry.isMemberRegistered(strandId, key);
|
|
120
|
+
if (alreadyRegistered) {
|
|
121
|
+
return { valid: false, reason: 'Member already registered' };
|
|
122
|
+
}
|
|
123
|
+
return { valid: true };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=enrollment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrollment.js","sourceRoot":"","sources":["../src/enrollment.ts"],"names":[],"mappings":"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"}
|