@bcts/frost-hubert 1.0.0-alpha.23 → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/bin/frost.cjs +344 -72
- package/dist/bin/frost.cjs.map +1 -1
- package/dist/bin/frost.mjs +344 -71
- package/dist/bin/frost.mjs.map +1 -1
- package/dist/busy-B_h0bNAJ.cjs +38 -0
- package/dist/busy-B_h0bNAJ.cjs.map +1 -0
- package/dist/busy-BlU8_pS2.mjs +27 -0
- package/dist/busy-BlU8_pS2.mjs.map +1 -0
- package/dist/cmd/index.cjs +27 -22
- package/dist/cmd/index.d.cts +2 -2
- package/dist/cmd/index.d.mts +2 -2
- package/dist/cmd/index.mjs +6 -3
- package/dist/cmd-CCVhHzG7.cjs +129 -0
- package/dist/cmd-CCVhHzG7.cjs.map +1 -0
- package/dist/cmd-DNsHd19v.mjs +112 -0
- package/dist/cmd-DNsHd19v.mjs.map +1 -0
- package/dist/common-7-BOgaTt.cjs +113 -0
- package/dist/common-7-BOgaTt.cjs.map +1 -0
- package/dist/common-Cf1UvJaP.mjs +282 -0
- package/dist/common-Cf1UvJaP.mjs.map +1 -0
- package/dist/common-CnvAUC2b.cjs +372 -0
- package/dist/common-CnvAUC2b.cjs.map +1 -0
- package/dist/common-DNrD_-EI.mjs +96 -0
- package/dist/common-DNrD_-EI.mjs.map +1 -0
- package/dist/dkg/index.cjs +6 -103
- package/dist/dkg/index.cjs.map +1 -1
- package/dist/dkg/index.d.cts +2 -2
- package/dist/dkg/index.d.mts +2 -2
- package/dist/dkg/index.mjs +4 -101
- package/dist/dkg/index.mjs.map +1 -1
- package/dist/finalize-BpC0rz93.mjs +389 -0
- package/dist/finalize-BpC0rz93.mjs.map +1 -0
- package/dist/finalize-Cb0obTSo.cjs +402 -0
- package/dist/finalize-Cb0obTSo.cjs.map +1 -0
- package/dist/finalize-DHEnKobp.cjs +303 -0
- package/dist/finalize-DHEnKobp.cjs.map +1 -0
- package/dist/finalize-DQ0VGUHO.cjs +265 -0
- package/dist/finalize-DQ0VGUHO.cjs.map +1 -0
- package/dist/finalize-DtRxHZ7H.mjs +290 -0
- package/dist/finalize-DtRxHZ7H.mjs.map +1 -0
- package/dist/finalize-T83Ko8nG.mjs +252 -0
- package/dist/finalize-T83Ko8nG.mjs.map +1 -0
- package/dist/frost/index.cjs +1 -1
- package/dist/frost/index.cjs.map +1 -1
- package/dist/frost/index.d.cts.map +1 -1
- package/dist/frost/index.d.mts.map +1 -1
- package/dist/frost/index.mjs +1 -1
- package/dist/frost/index.mjs.map +1 -1
- package/dist/{index-BJlwbPYu.d.cts → index-BErX9AZF.d.cts} +101 -79
- package/dist/index-BErX9AZF.d.cts.map +1 -0
- package/dist/{index-BkqLimZT.d.mts → index-BaUVw4b1.d.mts} +25 -2
- package/dist/index-BaUVw4b1.d.mts.map +1 -0
- package/dist/{index-BMbPgH0W.d.cts → index-CD50Qtgw.d.cts} +46 -2
- package/dist/index-CD50Qtgw.d.cts.map +1 -0
- package/dist/{index-DoV5HFvV.d.mts → index-CD50Qtgw.d.mts} +46 -2
- package/dist/index-CD50Qtgw.d.mts.map +1 -0
- package/dist/{index-Dzm1v4_4.d.mts → index-Drklne-Y.d.mts} +101 -79
- package/dist/index-Drklne-Y.d.mts.map +1 -0
- package/dist/{index-DmxfT59Y.d.cts → index-gkmZzEuD.d.cts} +25 -2
- package/dist/index-gkmZzEuD.d.cts.map +1 -0
- package/dist/index.cjs +30 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +8 -4
- package/dist/index.mjs.map +1 -1
- package/dist/invite-1tzg0B0P.cjs +274 -0
- package/dist/invite-1tzg0B0P.cjs.map +1 -0
- package/dist/invite-BLwtexAu.cjs +109 -0
- package/dist/invite-BLwtexAu.cjs.map +1 -0
- package/dist/invite-Be2v2SVc.mjs +96 -0
- package/dist/invite-Be2v2SVc.mjs.map +1 -0
- package/dist/invite-D8mQSnFz.mjs +219 -0
- package/dist/invite-D8mQSnFz.mjs.map +1 -0
- package/dist/parallel-PZiwHZT8.mjs +235 -0
- package/dist/parallel-PZiwHZT8.mjs.map +1 -0
- package/dist/parallel-szwYx-bi.cjs +318 -0
- package/dist/parallel-szwYx-bi.cjs.map +1 -0
- package/dist/proposed-participant-BvHNnpcZ.cjs +140 -0
- package/dist/proposed-participant-BvHNnpcZ.cjs.map +1 -0
- package/dist/proposed-participant-Detb823_.mjs +129 -0
- package/dist/proposed-participant-Detb823_.mjs.map +1 -0
- package/dist/receive-BR-knnGv.cjs +213 -0
- package/dist/receive-BR-knnGv.cjs.map +1 -0
- package/dist/receive-D_r4Mryr.cjs +190 -0
- package/dist/receive-D_r4Mryr.cjs.map +1 -0
- package/dist/receive-dkSCSGpl.mjs +188 -0
- package/dist/receive-dkSCSGpl.mjs.map +1 -0
- package/dist/receive-g8EhZF2Y.mjs +177 -0
- package/dist/receive-g8EhZF2Y.mjs.map +1 -0
- package/dist/registry/index.cjs +86 -11
- package/dist/registry/index.cjs.map +1 -1
- package/dist/registry/index.d.cts +1 -1
- package/dist/registry/index.d.mts +1 -1
- package/dist/registry/index.mjs +85 -10
- package/dist/registry/index.mjs.map +1 -1
- package/dist/{registry-loI1_Mh1.cjs → registry-CkIbA7nt.cjs} +79 -2
- package/dist/registry-CkIbA7nt.cjs.map +1 -0
- package/dist/{registry-CgrCZ4En.mjs → registry-DGjs4qDK.mjs} +74 -3
- package/dist/registry-DGjs4qDK.mjs.map +1 -0
- package/dist/round1-9FAqFvL5.cjs +465 -0
- package/dist/round1-9FAqFvL5.cjs.map +1 -0
- package/dist/round1-B8haiMM8.mjs +208 -0
- package/dist/round1-B8haiMM8.mjs.map +1 -0
- package/dist/round1-BOIE1E4O.mjs +452 -0
- package/dist/round1-BOIE1E4O.mjs.map +1 -0
- package/dist/round1-Bq0vweyQ.cjs +422 -0
- package/dist/round1-Bq0vweyQ.cjs.map +1 -0
- package/dist/round1-CXkXoVQU.cjs +208 -0
- package/dist/round1-CXkXoVQU.cjs.map +1 -0
- package/dist/round1-D8t7EzIo.mjs +373 -0
- package/dist/round1-D8t7EzIo.mjs.map +1 -0
- package/dist/round1-DriPu15x.cjs +221 -0
- package/dist/round1-DriPu15x.cjs.map +1 -0
- package/dist/round1-Y2kcVwnR.mjs +195 -0
- package/dist/round1-Y2kcVwnR.mjs.map +1 -0
- package/dist/round2-AMDYMUIg.cjs +305 -0
- package/dist/round2-AMDYMUIg.cjs.map +1 -0
- package/dist/round2-BHQKVJFo.cjs +410 -0
- package/dist/round2-BHQKVJFo.cjs.map +1 -0
- package/dist/round2-BfetYacV.mjs +450 -0
- package/dist/round2-BfetYacV.mjs.map +1 -0
- package/dist/round2-Cf5CJc_8.mjs +397 -0
- package/dist/round2-Cf5CJc_8.mjs.map +1 -0
- package/dist/round2-CvrmylN1.cjs +293 -0
- package/dist/round2-CvrmylN1.cjs.map +1 -0
- package/dist/round2-Dk_w97nl.cjs +499 -0
- package/dist/round2-Dk_w97nl.cjs.map +1 -0
- package/dist/round2-Z2JhMwxc.mjs +292 -0
- package/dist/round2-Z2JhMwxc.mjs.map +1 -0
- package/dist/round2-mF6UlkT-.mjs +280 -0
- package/dist/round2-mF6UlkT-.mjs.map +1 -0
- package/package.json +14 -14
- package/src/bin/frost.ts +849 -128
- package/src/cmd/common.ts +19 -1
- package/src/cmd/dkg/common.ts +97 -10
- package/src/cmd/dkg/coordinator/invite.ts +5 -2
- package/src/cmd/dkg/participant/finalize.ts +51 -17
- package/src/cmd/dkg/participant/round1.ts +39 -38
- package/src/cmd/dkg/participant/round2.ts +60 -26
- package/src/cmd/sign/coordinator/round2.ts +5 -1
- package/src/cmd/sign/participant/finalize.ts +6 -2
- package/src/cmd/sign/participant/receive.ts +5 -2
- package/src/dkg/group-invite.ts +12 -2
- package/src/dkg/proposed-participant.ts +32 -3
- package/src/registry/owner-record.ts +12 -0
- package/src/registry/participant-record.ts +35 -2
- package/src/registry/registry-impl.ts +74 -18
- package/dist/cmd-5yLeC_QL.mjs +0 -4708
- package/dist/cmd-5yLeC_QL.mjs.map +0 -1
- package/dist/cmd-BfZjC3Uh.cjs +0 -4847
- package/dist/cmd-BfZjC3Uh.cjs.map +0 -1
- package/dist/index-BJlwbPYu.d.cts.map +0 -1
- package/dist/index-BMbPgH0W.d.cts.map +0 -1
- package/dist/index-BkqLimZT.d.mts.map +0 -1
- package/dist/index-DmxfT59Y.d.cts.map +0 -1
- package/dist/index-DoV5HFvV.d.mts.map +0 -1
- package/dist/index-Dzm1v4_4.d.mts.map +0 -1
- package/dist/registry-CgrCZ4En.mjs.map +0 -1
- package/dist/registry-loI1_Mh1.cjs.map +0 -1
- /package/dist/{chunk-CZWwpsFl.cjs → chunk-DakpK96I.cjs} +0 -0
- /package/dist/{chunk-CjcI7cDX.mjs → chunk-z9aeyW2b.mjs} +0 -0
|
@@ -1,9 +1,80 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-
|
|
1
|
+
const require_chunk = require("./chunk-DakpK96I.cjs");
|
|
2
2
|
const require_registry_index = require("./registry/index.cjs");
|
|
3
3
|
let node_fs = require("node:fs");
|
|
4
4
|
node_fs = require_chunk.__toESM(node_fs, 1);
|
|
5
5
|
let node_path = require("node:path");
|
|
6
6
|
node_path = require_chunk.__toESM(node_path, 1);
|
|
7
|
+
//#region src/cmd/storage.ts
|
|
8
|
+
/**
|
|
9
|
+
* Create a storage client based on the selection.
|
|
10
|
+
*
|
|
11
|
+
* Port of storage client creation from cmd/storage.rs.
|
|
12
|
+
*/
|
|
13
|
+
async function createStorageClient(selection, serverUrl) {
|
|
14
|
+
switch (selection) {
|
|
15
|
+
case "server": {
|
|
16
|
+
const { ServerKvClient } = await import("@bcts/hubert/server");
|
|
17
|
+
const client = new ServerKvClient(serverUrl ?? "http://localhost:8080");
|
|
18
|
+
return {
|
|
19
|
+
async put(arid, envelope) {
|
|
20
|
+
await client.put(arid, envelope);
|
|
21
|
+
},
|
|
22
|
+
async get(arid, timeoutSeconds) {
|
|
23
|
+
return await client.get(arid, timeoutSeconds) ?? void 0;
|
|
24
|
+
},
|
|
25
|
+
exists(arid) {
|
|
26
|
+
return client.exists(arid);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
case "mainline": {
|
|
31
|
+
const { MainlineDhtKv } = await import("@bcts/hubert/mainline");
|
|
32
|
+
const client = await MainlineDhtKv.create();
|
|
33
|
+
return {
|
|
34
|
+
async put(arid, envelope) {
|
|
35
|
+
await client.put(arid, envelope);
|
|
36
|
+
},
|
|
37
|
+
async get(arid, timeoutSeconds) {
|
|
38
|
+
return await client.get(arid, timeoutSeconds) ?? void 0;
|
|
39
|
+
},
|
|
40
|
+
exists(arid) {
|
|
41
|
+
return client.exists(arid);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
case "ipfs": {
|
|
46
|
+
const { IpfsKv } = await import("@bcts/hubert/ipfs");
|
|
47
|
+
const client = new IpfsKv("http://127.0.0.1:5001");
|
|
48
|
+
return {
|
|
49
|
+
async put(arid, envelope) {
|
|
50
|
+
await client.put(arid, envelope);
|
|
51
|
+
},
|
|
52
|
+
async get(arid, timeoutSeconds) {
|
|
53
|
+
return await client.get(arid, timeoutSeconds) ?? void 0;
|
|
54
|
+
},
|
|
55
|
+
exists(arid) {
|
|
56
|
+
return client.exists(arid);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
case "hybrid": {
|
|
61
|
+
const { HybridKv } = await import("@bcts/hubert/hybrid");
|
|
62
|
+
const client = await HybridKv.create("http://127.0.0.1:5001");
|
|
63
|
+
return {
|
|
64
|
+
async put(arid, envelope) {
|
|
65
|
+
await client.put(arid, envelope);
|
|
66
|
+
},
|
|
67
|
+
async get(arid, timeoutSeconds) {
|
|
68
|
+
return await client.get(arid, timeoutSeconds) ?? void 0;
|
|
69
|
+
},
|
|
70
|
+
exists(arid) {
|
|
71
|
+
return client.exists(arid);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
7
78
|
//#region src/cmd/registry/owner/set.ts
|
|
8
79
|
/**
|
|
9
80
|
* Copyright © 2023-2026 Blockchain Commons, LLC
|
|
@@ -150,6 +221,12 @@ function endsWithSeparator(input) {
|
|
|
150
221
|
return input.endsWith("/") || input.endsWith("\\");
|
|
151
222
|
}
|
|
152
223
|
//#endregion
|
|
224
|
+
Object.defineProperty(exports, "createStorageClient", {
|
|
225
|
+
enumerable: true,
|
|
226
|
+
get: function() {
|
|
227
|
+
return createStorageClient;
|
|
228
|
+
}
|
|
229
|
+
});
|
|
153
230
|
Object.defineProperty(exports, "ownerSet", {
|
|
154
231
|
enumerable: true,
|
|
155
232
|
get: function() {
|
|
@@ -169,4 +246,4 @@ Object.defineProperty(exports, "registry_exports", {
|
|
|
169
246
|
}
|
|
170
247
|
});
|
|
171
248
|
|
|
172
|
-
//# sourceMappingURL=registry-
|
|
249
|
+
//# sourceMappingURL=registry-CkIbA7nt.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-CkIbA7nt.cjs","names":["normalizePetName","OwnerRecord","Registry","ParticipantRecord","Registry","path","fs"],"sources":["../src/cmd/storage.ts","../src/cmd/registry/owner/set.ts","../src/cmd/registry/participant/add.ts","../src/cmd/registry/index.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Storage client abstraction for Hubert.\n *\n * Port of cmd/storage.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { type ARID } from \"@bcts/components\";\nimport { type Envelope } from \"@bcts/envelope\";\n\n/**\n * Storage backend selection.\n *\n * Port of `enum StorageSelection` from cmd/storage.rs.\n */\nexport type StorageSelection = \"server\" | \"mainline\" | \"ipfs\" | \"hybrid\";\n\n/**\n * Storage client interface for Hubert operations.\n *\n * Port of `struct StorageClient` from cmd/storage.rs.\n */\nexport interface StorageClient {\n /**\n * Put an envelope at the given ARID.\n */\n put(arid: ARID, envelope: Envelope): Promise<void>;\n\n /**\n * Get an envelope from the given ARID.\n */\n get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined>;\n\n /**\n * Check if an envelope exists at the given ARID.\n */\n exists(arid: ARID): Promise<boolean>;\n}\n\n/**\n * Create a storage client based on the selection.\n *\n * Port of storage client creation from cmd/storage.rs.\n */\nexport async function createStorageClient(\n selection: StorageSelection,\n serverUrl?: string,\n): Promise<StorageClient> {\n switch (selection) {\n case \"server\": {\n const { ServerKvClient } = await import(\"@bcts/hubert/server\");\n const client = new ServerKvClient(serverUrl ?? \"http://localhost:8080\");\n return {\n async put(arid: ARID, envelope: Envelope): Promise<void> {\n await client.put(arid, envelope);\n },\n async get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined> {\n const result = await client.get(arid, timeoutSeconds);\n return result ?? undefined;\n },\n exists(arid: ARID): Promise<boolean> {\n return client.exists(arid);\n },\n };\n }\n case \"mainline\": {\n const { MainlineDhtKv } = await import(\"@bcts/hubert/mainline\");\n const client = await MainlineDhtKv.create();\n return {\n async put(arid: ARID, envelope: Envelope): Promise<void> {\n await client.put(arid, envelope);\n },\n async get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined> {\n const result = await client.get(arid, timeoutSeconds);\n return result ?? undefined;\n },\n exists(arid: ARID): Promise<boolean> {\n return client.exists(arid);\n },\n };\n }\n case \"ipfs\": {\n const { IpfsKv } = await import(\"@bcts/hubert/ipfs\");\n const client = new IpfsKv(\"http://127.0.0.1:5001\");\n return {\n async put(arid: ARID, envelope: Envelope): Promise<void> {\n await client.put(arid, envelope);\n },\n async get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined> {\n const result = await client.get(arid, timeoutSeconds);\n return result ?? undefined;\n },\n exists(arid: ARID): Promise<boolean> {\n return client.exists(arid);\n },\n };\n }\n case \"hybrid\": {\n const { HybridKv } = await import(\"@bcts/hubert/hybrid\");\n const client = await HybridKv.create(\"http://127.0.0.1:5001\");\n return {\n async put(arid: ARID, envelope: Envelope): Promise<void> {\n await client.put(arid, envelope);\n },\n async get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined> {\n const result = await client.get(arid, timeoutSeconds);\n return result ?? undefined;\n },\n exists(arid: ARID): Promise<boolean> {\n return client.exists(arid);\n },\n };\n }\n }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry owner set command.\n *\n * Port of cmd/registry/owner/set.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, OwnerRecord, OwnerOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the owner set command.\n */\nexport interface OwnerSetOptions {\n /** Signed ur:xid document containing the owner's XID document (must include private keys) */\n xidDocument: string;\n /** Optional human readable alias for the owner */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the owner set command.\n */\nexport interface OwnerSetResult {\n outcome: OwnerOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the owner set command.\n *\n * Sets the registry owner using an ur:xid document that includes private keys.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/owner/set.rs.\n */\nexport function ownerSet(options: OwnerSetOptions, cwd: string): OwnerSetResult {\n const petName = normalizePetName(options.petName);\n const owner = OwnerRecord.fromSignedXidUr(options.xidDocument, petName);\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.setOwner(owner);\n\n if (outcome === OwnerOutcome.AlreadyPresent) {\n console.log(\"Owner already recorded\");\n }\n\n // Always save to persist pet name updates on existing owner records.\n registry.save(path);\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry participant add command.\n *\n * Port of cmd/registry/participant/add.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, ParticipantRecord, AddOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the participant add command.\n */\nexport interface ParticipantAddOptions {\n /** Signed ur:xid document containing the participant's XID document */\n xidDocument: string;\n /** Optional human readable alias */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the participant add command.\n */\nexport interface ParticipantAddResult {\n outcome: AddOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the participant add command.\n *\n * Adds a participant using an ur:xid document.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/participant/add.rs.\n */\nexport function participantAdd(options: ParticipantAddOptions, cwd: string): ParticipantAddResult {\n const petName = normalizePetName(options.petName);\n const participant = ParticipantRecord.fromSignedXidUr(options.xidDocument, petName);\n const xid = participant.xid();\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.addParticipant(xid, participant);\n\n if (outcome === AddOutcome.AlreadyPresent) {\n console.log(\"Participant already recorded\");\n } else if (outcome === AddOutcome.Inserted) {\n registry.save(path);\n }\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry commands.\n *\n * Port of cmd/registry/mod.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport * from \"./owner/index.js\";\nexport * from \"./participant/index.js\";\n\nconst DEFAULT_FILENAME = \"registry.json\";\n\n/**\n * Resolve the participants registry path, defaulting to `registry.json` in the\n * current working directory.\n *\n * Port of `participants_file_path()` from cmd/registry/mod.rs.\n */\nexport function participantsFilePath(registry: string | undefined, cwd: string): string {\n if (registry === undefined) {\n return path.join(cwd, DEFAULT_FILENAME);\n }\n\n return resolveRegistryPath(cwd, DEFAULT_FILENAME, registry);\n}\n\n/**\n * Resolve registry path with smart directory detection.\n *\n * Port of `resolve_registry_path()` from cmd/registry/mod.rs.\n */\nfunction resolveRegistryPath(cwd: string, defaultFilename: string, raw: string): string {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Registry path cannot be empty\");\n }\n\n const provided = trimmed;\n const treatAsDirectory = isDirectoryHint(trimmed, provided);\n\n let resolved: string;\n if (path.isAbsolute(provided)) {\n resolved = provided;\n } else {\n resolved = path.join(cwd, provided);\n }\n\n if (treatAsDirectory) {\n // Ensure the directory exists\n if (!fs.existsSync(resolved)) {\n fs.mkdirSync(resolved, { recursive: true });\n }\n resolved = path.join(resolved, defaultFilename);\n }\n\n return resolved;\n}\n\n/**\n * Check if the input should be treated as a directory path.\n *\n * Port of `is_directory_hint()` from cmd/registry/mod.rs.\n */\nfunction isDirectoryHint(input: string, pathStr: string): boolean {\n if (endsWithSeparator(input)) {\n return true;\n }\n\n const basename = path.basename(pathStr);\n if (basename === \"\" || basename === \".\" || basename === \"..\") {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if input ends with a path separator.\n *\n * Port of `ends_with_separator()` from cmd/registry/mod.rs.\n */\nfunction endsWithSeparator(input: string): boolean {\n return input.endsWith(\"/\") || input.endsWith(\"\\\\\");\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,78 @@
|
|
|
1
|
-
import { t as __exportAll } from "./chunk-
|
|
1
|
+
import { t as __exportAll } from "./chunk-z9aeyW2b.mjs";
|
|
2
2
|
import { OwnerRecord, ParticipantRecord, Registry } from "./registry/index.mjs";
|
|
3
3
|
import * as fs from "node:fs";
|
|
4
4
|
import * as path from "node:path";
|
|
5
|
+
//#region src/cmd/storage.ts
|
|
6
|
+
/**
|
|
7
|
+
* Create a storage client based on the selection.
|
|
8
|
+
*
|
|
9
|
+
* Port of storage client creation from cmd/storage.rs.
|
|
10
|
+
*/
|
|
11
|
+
async function createStorageClient(selection, serverUrl) {
|
|
12
|
+
switch (selection) {
|
|
13
|
+
case "server": {
|
|
14
|
+
const { ServerKvClient } = await import("@bcts/hubert/server");
|
|
15
|
+
const client = new ServerKvClient(serverUrl ?? "http://localhost:8080");
|
|
16
|
+
return {
|
|
17
|
+
async put(arid, envelope) {
|
|
18
|
+
await client.put(arid, envelope);
|
|
19
|
+
},
|
|
20
|
+
async get(arid, timeoutSeconds) {
|
|
21
|
+
return await client.get(arid, timeoutSeconds) ?? void 0;
|
|
22
|
+
},
|
|
23
|
+
exists(arid) {
|
|
24
|
+
return client.exists(arid);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
case "mainline": {
|
|
29
|
+
const { MainlineDhtKv } = await import("@bcts/hubert/mainline");
|
|
30
|
+
const client = await MainlineDhtKv.create();
|
|
31
|
+
return {
|
|
32
|
+
async put(arid, envelope) {
|
|
33
|
+
await client.put(arid, envelope);
|
|
34
|
+
},
|
|
35
|
+
async get(arid, timeoutSeconds) {
|
|
36
|
+
return await client.get(arid, timeoutSeconds) ?? void 0;
|
|
37
|
+
},
|
|
38
|
+
exists(arid) {
|
|
39
|
+
return client.exists(arid);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
case "ipfs": {
|
|
44
|
+
const { IpfsKv } = await import("@bcts/hubert/ipfs");
|
|
45
|
+
const client = new IpfsKv("http://127.0.0.1:5001");
|
|
46
|
+
return {
|
|
47
|
+
async put(arid, envelope) {
|
|
48
|
+
await client.put(arid, envelope);
|
|
49
|
+
},
|
|
50
|
+
async get(arid, timeoutSeconds) {
|
|
51
|
+
return await client.get(arid, timeoutSeconds) ?? void 0;
|
|
52
|
+
},
|
|
53
|
+
exists(arid) {
|
|
54
|
+
return client.exists(arid);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
case "hybrid": {
|
|
59
|
+
const { HybridKv } = await import("@bcts/hubert/hybrid");
|
|
60
|
+
const client = await HybridKv.create("http://127.0.0.1:5001");
|
|
61
|
+
return {
|
|
62
|
+
async put(arid, envelope) {
|
|
63
|
+
await client.put(arid, envelope);
|
|
64
|
+
},
|
|
65
|
+
async get(arid, timeoutSeconds) {
|
|
66
|
+
return await client.get(arid, timeoutSeconds) ?? void 0;
|
|
67
|
+
},
|
|
68
|
+
exists(arid) {
|
|
69
|
+
return client.exists(arid);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
5
76
|
//#region src/cmd/registry/owner/set.ts
|
|
6
77
|
/**
|
|
7
78
|
* Copyright © 2023-2026 Blockchain Commons, LLC
|
|
@@ -148,6 +219,6 @@ function endsWithSeparator(input) {
|
|
|
148
219
|
return input.endsWith("/") || input.endsWith("\\");
|
|
149
220
|
}
|
|
150
221
|
//#endregion
|
|
151
|
-
export { participantAdd as n, ownerSet as r, registry_exports as t };
|
|
222
|
+
export { createStorageClient as i, participantAdd as n, ownerSet as r, registry_exports as t };
|
|
152
223
|
|
|
153
|
-
//# sourceMappingURL=registry-
|
|
224
|
+
//# sourceMappingURL=registry-DGjs4qDK.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-DGjs4qDK.mjs","names":["normalizePetName"],"sources":["../src/cmd/storage.ts","../src/cmd/registry/owner/set.ts","../src/cmd/registry/participant/add.ts","../src/cmd/registry/index.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Storage client abstraction for Hubert.\n *\n * Port of cmd/storage.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { type ARID } from \"@bcts/components\";\nimport { type Envelope } from \"@bcts/envelope\";\n\n/**\n * Storage backend selection.\n *\n * Port of `enum StorageSelection` from cmd/storage.rs.\n */\nexport type StorageSelection = \"server\" | \"mainline\" | \"ipfs\" | \"hybrid\";\n\n/**\n * Storage client interface for Hubert operations.\n *\n * Port of `struct StorageClient` from cmd/storage.rs.\n */\nexport interface StorageClient {\n /**\n * Put an envelope at the given ARID.\n */\n put(arid: ARID, envelope: Envelope): Promise<void>;\n\n /**\n * Get an envelope from the given ARID.\n */\n get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined>;\n\n /**\n * Check if an envelope exists at the given ARID.\n */\n exists(arid: ARID): Promise<boolean>;\n}\n\n/**\n * Create a storage client based on the selection.\n *\n * Port of storage client creation from cmd/storage.rs.\n */\nexport async function createStorageClient(\n selection: StorageSelection,\n serverUrl?: string,\n): Promise<StorageClient> {\n switch (selection) {\n case \"server\": {\n const { ServerKvClient } = await import(\"@bcts/hubert/server\");\n const client = new ServerKvClient(serverUrl ?? \"http://localhost:8080\");\n return {\n async put(arid: ARID, envelope: Envelope): Promise<void> {\n await client.put(arid, envelope);\n },\n async get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined> {\n const result = await client.get(arid, timeoutSeconds);\n return result ?? undefined;\n },\n exists(arid: ARID): Promise<boolean> {\n return client.exists(arid);\n },\n };\n }\n case \"mainline\": {\n const { MainlineDhtKv } = await import(\"@bcts/hubert/mainline\");\n const client = await MainlineDhtKv.create();\n return {\n async put(arid: ARID, envelope: Envelope): Promise<void> {\n await client.put(arid, envelope);\n },\n async get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined> {\n const result = await client.get(arid, timeoutSeconds);\n return result ?? undefined;\n },\n exists(arid: ARID): Promise<boolean> {\n return client.exists(arid);\n },\n };\n }\n case \"ipfs\": {\n const { IpfsKv } = await import(\"@bcts/hubert/ipfs\");\n const client = new IpfsKv(\"http://127.0.0.1:5001\");\n return {\n async put(arid: ARID, envelope: Envelope): Promise<void> {\n await client.put(arid, envelope);\n },\n async get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined> {\n const result = await client.get(arid, timeoutSeconds);\n return result ?? undefined;\n },\n exists(arid: ARID): Promise<boolean> {\n return client.exists(arid);\n },\n };\n }\n case \"hybrid\": {\n const { HybridKv } = await import(\"@bcts/hubert/hybrid\");\n const client = await HybridKv.create(\"http://127.0.0.1:5001\");\n return {\n async put(arid: ARID, envelope: Envelope): Promise<void> {\n await client.put(arid, envelope);\n },\n async get(arid: ARID, timeoutSeconds?: number): Promise<Envelope | undefined> {\n const result = await client.get(arid, timeoutSeconds);\n return result ?? undefined;\n },\n exists(arid: ARID): Promise<boolean> {\n return client.exists(arid);\n },\n };\n }\n }\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry owner set command.\n *\n * Port of cmd/registry/owner/set.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, OwnerRecord, OwnerOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the owner set command.\n */\nexport interface OwnerSetOptions {\n /** Signed ur:xid document containing the owner's XID document (must include private keys) */\n xidDocument: string;\n /** Optional human readable alias for the owner */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the owner set command.\n */\nexport interface OwnerSetResult {\n outcome: OwnerOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the owner set command.\n *\n * Sets the registry owner using an ur:xid document that includes private keys.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/owner/set.rs.\n */\nexport function ownerSet(options: OwnerSetOptions, cwd: string): OwnerSetResult {\n const petName = normalizePetName(options.petName);\n const owner = OwnerRecord.fromSignedXidUr(options.xidDocument, petName);\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.setOwner(owner);\n\n if (outcome === OwnerOutcome.AlreadyPresent) {\n console.log(\"Owner already recorded\");\n }\n\n // Always save to persist pet name updates on existing owner records.\n registry.save(path);\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry participant add command.\n *\n * Port of cmd/registry/participant/add.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport { Registry, ParticipantRecord, AddOutcome } from \"../../../registry/index.js\";\nimport { participantsFilePath } from \"../index.js\";\n\n/**\n * Options for the participant add command.\n */\nexport interface ParticipantAddOptions {\n /** Signed ur:xid document containing the participant's XID document */\n xidDocument: string;\n /** Optional human readable alias */\n petName?: string | undefined;\n /** Optional registry path or filename override */\n registryPath?: string | undefined;\n}\n\n/**\n * Result of the participant add command.\n */\nexport interface ParticipantAddResult {\n outcome: AddOutcome;\n}\n\n/**\n * Normalize pet name, trimming whitespace and validating non-empty.\n */\nfunction normalizePetName(petName?: string): string | undefined {\n if (petName === undefined) {\n return undefined;\n }\n\n const trimmed = petName.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Pet name cannot be empty\");\n }\n\n return trimmed;\n}\n\n/**\n * Execute the participant add command.\n *\n * Adds a participant using an ur:xid document.\n *\n * Port of `CommandArgs.exec()` from cmd/registry/participant/add.rs.\n */\nexport function participantAdd(options: ParticipantAddOptions, cwd: string): ParticipantAddResult {\n const petName = normalizePetName(options.petName);\n const participant = ParticipantRecord.fromSignedXidUr(options.xidDocument, petName);\n const xid = participant.xid();\n const path = participantsFilePath(options.registryPath, cwd);\n const registry = Registry.load(path);\n\n const outcome = registry.addParticipant(xid, participant);\n\n if (outcome === AddOutcome.AlreadyPresent) {\n console.log(\"Participant already recorded\");\n } else if (outcome === AddOutcome.Inserted) {\n registry.save(path);\n }\n\n return { outcome };\n}\n","/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Registry commands.\n *\n * Port of cmd/registry/mod.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport * from \"./owner/index.js\";\nexport * from \"./participant/index.js\";\n\nconst DEFAULT_FILENAME = \"registry.json\";\n\n/**\n * Resolve the participants registry path, defaulting to `registry.json` in the\n * current working directory.\n *\n * Port of `participants_file_path()` from cmd/registry/mod.rs.\n */\nexport function participantsFilePath(registry: string | undefined, cwd: string): string {\n if (registry === undefined) {\n return path.join(cwd, DEFAULT_FILENAME);\n }\n\n return resolveRegistryPath(cwd, DEFAULT_FILENAME, registry);\n}\n\n/**\n * Resolve registry path with smart directory detection.\n *\n * Port of `resolve_registry_path()` from cmd/registry/mod.rs.\n */\nfunction resolveRegistryPath(cwd: string, defaultFilename: string, raw: string): string {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new Error(\"Registry path cannot be empty\");\n }\n\n const provided = trimmed;\n const treatAsDirectory = isDirectoryHint(trimmed, provided);\n\n let resolved: string;\n if (path.isAbsolute(provided)) {\n resolved = provided;\n } else {\n resolved = path.join(cwd, provided);\n }\n\n if (treatAsDirectory) {\n // Ensure the directory exists\n if (!fs.existsSync(resolved)) {\n fs.mkdirSync(resolved, { recursive: true });\n }\n resolved = path.join(resolved, defaultFilename);\n }\n\n return resolved;\n}\n\n/**\n * Check if the input should be treated as a directory path.\n *\n * Port of `is_directory_hint()` from cmd/registry/mod.rs.\n */\nfunction isDirectoryHint(input: string, pathStr: string): boolean {\n if (endsWithSeparator(input)) {\n return true;\n }\n\n const basename = path.basename(pathStr);\n if (basename === \"\" || basename === \".\" || basename === \"..\") {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if input ends with a path separator.\n *\n * Port of `ends_with_separator()` from cmd/registry/mod.rs.\n */\nfunction endsWithSeparator(input: string): boolean {\n return input.endsWith(\"/\") || input.endsWith(\"\\\\\");\n}\n"],"mappings":"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"}
|