@geohar/un-bien 0.7.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/LICENSE +21 -0
- package/README.md +726 -0
- package/dist/actions/handlers.d.ts +77 -0
- package/dist/actions/handlers.js +26 -0
- package/dist/actions/handlers.js.map +1 -0
- package/dist/actions/registry.d.ts +39 -0
- package/dist/actions/registry.js +62 -0
- package/dist/actions/registry.js.map +1 -0
- package/dist/bin/supervisord.d.ts +2 -0
- package/dist/bin/supervisord.js +86 -0
- package/dist/bin/supervisord.js.map +1 -0
- package/dist/config.d.ts +84 -0
- package/dist/config.js +115 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/client.d.ts +20 -0
- package/dist/daemon/client.js +131 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/control_protocol.d.ts +176 -0
- package/dist/daemon/control_protocol.js +63 -0
- package/dist/daemon/control_protocol.js.map +1 -0
- package/dist/daemon/cron_log.d.ts +45 -0
- package/dist/daemon/cron_log.js +71 -0
- package/dist/daemon/cron_log.js.map +1 -0
- package/dist/daemon/cron_registry.d.ts +80 -0
- package/dist/daemon/cron_registry.js +198 -0
- package/dist/daemon/cron_registry.js.map +1 -0
- package/dist/daemon/id.d.ts +24 -0
- package/dist/daemon/id.js +36 -0
- package/dist/daemon/id.js.map +1 -0
- package/dist/daemon/install.d.ts +170 -0
- package/dist/daemon/install.js +603 -0
- package/dist/daemon/install.js.map +1 -0
- package/dist/daemon/registry.d.ts +63 -0
- package/dist/daemon/registry.js +153 -0
- package/dist/daemon/registry.js.map +1 -0
- package/dist/daemon/rpc_child.d.ts +194 -0
- package/dist/daemon/rpc_child.js +419 -0
- package/dist/daemon/rpc_child.js.map +1 -0
- package/dist/daemon/supervisor.d.ts +93 -0
- package/dist/daemon/supervisor.js +666 -0
- package/dist/daemon/supervisor.js.map +1 -0
- package/dist/extension_ui_bridge.d.ts +26 -0
- package/dist/extension_ui_bridge.js +341 -0
- package/dist/extension_ui_bridge.js.map +1 -0
- package/dist/index.d.ts +197 -0
- package/dist/index.js +5750 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/mesh_result.d.ts +10 -0
- package/dist/mcp/mesh_result.js +42 -0
- package/dist/mcp/mesh_result.js.map +1 -0
- package/dist/mcp/mesh_server.d.ts +16 -0
- package/dist/mcp/mesh_server.js +373 -0
- package/dist/mcp/mesh_server.js.map +1 -0
- package/dist/mesh/canonical.d.ts +30 -0
- package/dist/mesh/canonical.js +63 -0
- package/dist/mesh/canonical.js.map +1 -0
- package/dist/mesh/client.d.ts +18 -0
- package/dist/mesh/client.js +127 -0
- package/dist/mesh/client.js.map +1 -0
- package/dist/mesh/encoding.d.ts +38 -0
- package/dist/mesh/encoding.js +217 -0
- package/dist/mesh/encoding.js.map +1 -0
- package/dist/mesh/self_revoke.d.ts +73 -0
- package/dist/mesh/self_revoke.js +407 -0
- package/dist/mesh/self_revoke.js.map +1 -0
- package/dist/mesh/siblings.d.ts +49 -0
- package/dist/mesh/siblings.js +159 -0
- package/dist/mesh/siblings.js.map +1 -0
- package/dist/mesh/types.d.ts +34 -0
- package/dist/mesh/types.js +11 -0
- package/dist/mesh/types.js.map +1 -0
- package/dist/mesh/verify.d.ts +17 -0
- package/dist/mesh/verify.js +86 -0
- package/dist/mesh/verify.js.map +1 -0
- package/dist/pairing/crypto.d.ts +8 -0
- package/dist/pairing/crypto.js +22 -0
- package/dist/pairing/crypto.js.map +1 -0
- package/dist/pairing/qr.d.ts +59 -0
- package/dist/pairing/qr.js +127 -0
- package/dist/pairing/qr.js.map +1 -0
- package/dist/pairing/storage.d.ts +120 -0
- package/dist/pairing/storage.js +614 -0
- package/dist/pairing/storage.js.map +1 -0
- package/dist/panel_bridge.d.ts +15 -0
- package/dist/panel_bridge.js +409 -0
- package/dist/panel_bridge.js.map +1 -0
- package/dist/paths.d.ts +39 -0
- package/dist/paths.js +51 -0
- package/dist/paths.js.map +1 -0
- package/dist/protocol/codec.d.ts +7 -0
- package/dist/protocol/codec.js +48 -0
- package/dist/protocol/codec.js.map +1 -0
- package/dist/protocol/types.d.ts +404 -0
- package/dist/protocol/types.js +2 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/rooms.d.ts +42 -0
- package/dist/rooms.js +78 -0
- package/dist/rooms.js.map +1 -0
- package/dist/session/bridge.d.ts +37 -0
- package/dist/session/bridge.js +134 -0
- package/dist/session/bridge.js.map +1 -0
- package/dist/session/broker.d.ts +189 -0
- package/dist/session/broker.js +527 -0
- package/dist/session/broker.js.map +1 -0
- package/dist/session/broker_remote.d.ts +74 -0
- package/dist/session/broker_remote.js +581 -0
- package/dist/session/broker_remote.js.map +1 -0
- package/dist/session/cwd_lock.d.ts +33 -0
- package/dist/session/cwd_lock.js +127 -0
- package/dist/session/cwd_lock.js.map +1 -0
- package/dist/session/debug_log.d.ts +3 -0
- package/dist/session/debug_log.js +32 -0
- package/dist/session/debug_log.js.map +1 -0
- package/dist/session/envelope.d.ts +33 -0
- package/dist/session/envelope.js +117 -0
- package/dist/session/envelope.js.map +1 -0
- package/dist/session/global_config.d.ts +33 -0
- package/dist/session/global_config.js +73 -0
- package/dist/session/global_config.js.map +1 -0
- package/dist/session/ipc.d.ts +27 -0
- package/dist/session/ipc.js +22 -0
- package/dist/session/ipc.js.map +1 -0
- package/dist/session/leader_election.d.ts +32 -0
- package/dist/session/leader_election.js +108 -0
- package/dist/session/leader_election.js.map +1 -0
- package/dist/session/local_config.d.ts +67 -0
- package/dist/session/local_config.js +193 -0
- package/dist/session/local_config.js.map +1 -0
- package/dist/session/mesh_node.d.ts +116 -0
- package/dist/session/mesh_node.js +596 -0
- package/dist/session/mesh_node.js.map +1 -0
- package/dist/session/peer.d.ts +139 -0
- package/dist/session/peer.js +474 -0
- package/dist/session/peer.js.map +1 -0
- package/dist/session/peer_inventory.d.ts +13 -0
- package/dist/session/peer_inventory.js +48 -0
- package/dist/session/peer_inventory.js.map +1 -0
- package/dist/session/peer_limits.d.ts +9 -0
- package/dist/session/peer_limits.js +24 -0
- package/dist/session/peer_limits.js.map +1 -0
- package/dist/session/rpc_envelope.d.ts +108 -0
- package/dist/session/rpc_envelope.js +221 -0
- package/dist/session/rpc_envelope.js.map +1 -0
- package/dist/session/rpc_inbound.d.ts +55 -0
- package/dist/session/rpc_inbound.js +136 -0
- package/dist/session/rpc_inbound.js.map +1 -0
- package/dist/session/setup_wizard.d.ts +39 -0
- package/dist/session/setup_wizard.js +63 -0
- package/dist/session/setup_wizard.js.map +1 -0
- package/dist/session/tools.d.ts +24 -0
- package/dist/session/tools.js +272 -0
- package/dist/session/tools.js.map +1 -0
- package/dist/session/wizard.d.ts +13 -0
- package/dist/session/wizard.js +20 -0
- package/dist/session/wizard.js.map +1 -0
- package/dist/transport/peer_channel.d.ts +52 -0
- package/dist/transport/peer_channel.js +145 -0
- package/dist/transport/peer_channel.js.map +1 -0
- package/dist/transport/pi_forward_client.d.ts +29 -0
- package/dist/transport/pi_forward_client.js +68 -0
- package/dist/transport/pi_forward_client.js.map +1 -0
- package/dist/transport/relay_client.d.ts +96 -0
- package/dist/transport/relay_client.js +210 -0
- package/dist/transport/relay_client.js.map +1 -0
- package/dist/ui/footer.d.ts +32 -0
- package/dist/ui/footer.js +34 -0
- package/dist/ui/footer.js.map +1 -0
- package/docs/daemon.md +289 -0
- package/package.json +92 -0
- package/service-templates/launchd.plist.template +35 -0
- package/service-templates/systemd.service.template +19 -0
- package/service-templates/task-launcher.vbs.template +10 -0
- package/service-templates/task-scheduler.xml.template +38 -0
- package/skills/agent-network/SKILL.md +310 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare class MeshPublicKeyError extends Error {
|
|
2
|
+
readonly field: string;
|
|
3
|
+
constructor(field: string, message: string);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Strictly decodes a 32-byte Ed25519 public key accepted at a protocol boundary.
|
|
7
|
+
* The rejected value is deliberately absent from every error message.
|
|
8
|
+
*/
|
|
9
|
+
export declare function decodeEd25519PublicKey(raw: string, field?: string): Uint8Array;
|
|
10
|
+
/** Returns an Ed25519 public key in RFC 4648 standard padded base64. */
|
|
11
|
+
export declare function encodeEd25519PublicKey(bytes: Uint8Array, field?: string): string;
|
|
12
|
+
/** Decodes then returns an Ed25519 public key in canonical standard base64. */
|
|
13
|
+
export declare function canonicalizeEd25519PublicKey(raw: string, field?: string): string;
|
|
14
|
+
/** RFC 4648 URL-safe base64 without padding. */
|
|
15
|
+
export declare function toBase64UrlNoPad(bytes: Uint8Array): string;
|
|
16
|
+
/** Stable metadata-only fingerprint for a validated public key. */
|
|
17
|
+
export declare function publicKeyFingerprint(bytes: Uint8Array): string;
|
|
18
|
+
export interface RoutingAliasInput {
|
|
19
|
+
readonly pcPubkey: string;
|
|
20
|
+
readonly nickname?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Percent-encodes a nickname into the receiver-local routing grammar. */
|
|
23
|
+
export declare function encodeRoutingAlias(rawNickname: string): string;
|
|
24
|
+
/** Selects a raw nickname by encoded ASCII order, then raw UTF-8 bytes. */
|
|
25
|
+
export declare function selectRoutingNickname(candidates: readonly string[]): string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Allocates a deterministic bijection from canonical Pi key to effective alias.
|
|
28
|
+
* Every colliding base is suffixed with an adaptively expanded key prefix.
|
|
29
|
+
*/
|
|
30
|
+
export declare function allocateRoutingAliases(inputs: readonly RoutingAliasInput[]): ReadonlyMap<string, string>;
|
|
31
|
+
/**
|
|
32
|
+
* Constant-time-ish byte equality for validated public keys. Returns false
|
|
33
|
+
* immediately on length mismatch.
|
|
34
|
+
*
|
|
35
|
+
* Not strictly constant-time — Ed25519 pubkeys aren't secrets, so the
|
|
36
|
+
* short-circuit on length and the byte-by-byte compare are acceptable.
|
|
37
|
+
*/
|
|
38
|
+
export declare function bytesEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Base64 + byte-array helpers shared by the mesh module.
|
|
4
|
+
*
|
|
5
|
+
* **Why this exists**: the mesh protocol crosses three languages (Dart in
|
|
6
|
+
* the app, Rust in the relay, TypeScript here). Each language's default
|
|
7
|
+
* base64 encoder picks a different variant — `dart:convert.base64Encode`
|
|
8
|
+
* emits **standard** (`+`, `/`, `=`-padded), while the app's pairing layer
|
|
9
|
+
* historically emitted **URL-safe** (`-`, `_`, no padding) in some places.
|
|
10
|
+
* String comparison on those two encodings fails even when the underlying
|
|
11
|
+
* 32 bytes are identical, producing silent self-revocations (see
|
|
12
|
+
* `plan/24` Wave 3 incident report).
|
|
13
|
+
*
|
|
14
|
+
* The fix is to never compare base64 strings — decode both sides to bytes
|
|
15
|
+
* and compare bytes through the strict Ed25519 boundary helper.
|
|
16
|
+
*/
|
|
17
|
+
const ED25519_PUBLIC_KEY_BYTES = 32;
|
|
18
|
+
export class MeshPublicKeyError extends Error {
|
|
19
|
+
field;
|
|
20
|
+
constructor(field, message) {
|
|
21
|
+
super(`${field}: ${message}`);
|
|
22
|
+
this.field = field;
|
|
23
|
+
this.name = "MeshPublicKeyError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Strictly decodes a 32-byte Ed25519 public key accepted at a protocol boundary.
|
|
28
|
+
* The rejected value is deliberately absent from every error message.
|
|
29
|
+
*/
|
|
30
|
+
export function decodeEd25519PublicKey(raw, field = "public key") {
|
|
31
|
+
if (typeof raw !== "string" || raw.length === 0) {
|
|
32
|
+
throw new MeshPublicKeyError(field, "invalid base64 encoding");
|
|
33
|
+
}
|
|
34
|
+
const hasStandardOnlyCharacters = /[+/]/.test(raw);
|
|
35
|
+
const hasUrlSafeOnlyCharacters = /[-_]/.test(raw);
|
|
36
|
+
if (hasStandardOnlyCharacters && hasUrlSafeOnlyCharacters) {
|
|
37
|
+
throw new MeshPublicKeyError(field, "mixed base64 alphabets");
|
|
38
|
+
}
|
|
39
|
+
const firstPaddingIndex = raw.indexOf("=");
|
|
40
|
+
const body = firstPaddingIndex === -1 ? raw : raw.slice(0, firstPaddingIndex);
|
|
41
|
+
const padding = firstPaddingIndex === -1 ? "" : raw.slice(firstPaddingIndex);
|
|
42
|
+
const bodyPattern = hasUrlSafeOnlyCharacters
|
|
43
|
+
? /^[A-Za-z0-9_-]+$/
|
|
44
|
+
: /^[A-Za-z0-9+/]+$/;
|
|
45
|
+
if (!bodyPattern.test(body) ||
|
|
46
|
+
(padding !== "" && !/^={1,2}$/.test(padding))) {
|
|
47
|
+
throw new MeshPublicKeyError(field, "invalid base64 encoding");
|
|
48
|
+
}
|
|
49
|
+
const requiredPaddingLength = (4 - (body.length % 4)) % 4;
|
|
50
|
+
if (requiredPaddingLength === 3 ||
|
|
51
|
+
(padding.length > 0 && padding.length !== requiredPaddingLength)) {
|
|
52
|
+
throw new MeshPublicKeyError(field, "invalid base64 padding");
|
|
53
|
+
}
|
|
54
|
+
const normalizedBody = body.replaceAll("-", "+").replaceAll("_", "/");
|
|
55
|
+
const normalizedPadded = normalizedBody + "=".repeat(requiredPaddingLength);
|
|
56
|
+
const bytes = new Uint8Array(Buffer.from(normalizedPadded, "base64"));
|
|
57
|
+
if (bytes.length !== ED25519_PUBLIC_KEY_BYTES) {
|
|
58
|
+
throw new MeshPublicKeyError(field, `wrong length (${bytes.length}, expected ${ED25519_PUBLIC_KEY_BYTES})`);
|
|
59
|
+
}
|
|
60
|
+
const canonicalPadded = Buffer.from(bytes).toString("base64");
|
|
61
|
+
const canonicalUnpadded = canonicalPadded.replace(/=+$/, "");
|
|
62
|
+
const normalizedInput = normalizedBody + padding;
|
|
63
|
+
if (normalizedInput !== canonicalPadded &&
|
|
64
|
+
normalizedInput !== canonicalUnpadded) {
|
|
65
|
+
throw new MeshPublicKeyError(field, "non-canonical base64 trailing bits");
|
|
66
|
+
}
|
|
67
|
+
return bytes;
|
|
68
|
+
}
|
|
69
|
+
/** Returns an Ed25519 public key in RFC 4648 standard padded base64. */
|
|
70
|
+
export function encodeEd25519PublicKey(bytes, field = "public key") {
|
|
71
|
+
if (!(bytes instanceof Uint8Array) ||
|
|
72
|
+
bytes.length !== ED25519_PUBLIC_KEY_BYTES) {
|
|
73
|
+
const length = bytes instanceof Uint8Array ? bytes.length : 0;
|
|
74
|
+
throw new MeshPublicKeyError(field, `wrong length (${length}, expected ${ED25519_PUBLIC_KEY_BYTES})`);
|
|
75
|
+
}
|
|
76
|
+
return Buffer.from(bytes).toString("base64");
|
|
77
|
+
}
|
|
78
|
+
/** Decodes then returns an Ed25519 public key in canonical standard base64. */
|
|
79
|
+
export function canonicalizeEd25519PublicKey(raw, field = "public key") {
|
|
80
|
+
return encodeEd25519PublicKey(decodeEd25519PublicKey(raw, field), field);
|
|
81
|
+
}
|
|
82
|
+
/** RFC 4648 URL-safe base64 without padding. */
|
|
83
|
+
export function toBase64UrlNoPad(bytes) {
|
|
84
|
+
return Buffer.from(bytes)
|
|
85
|
+
.toString("base64")
|
|
86
|
+
.replaceAll("+", "-")
|
|
87
|
+
.replaceAll("/", "_")
|
|
88
|
+
.replace(/=+$/, "");
|
|
89
|
+
}
|
|
90
|
+
/** Stable metadata-only fingerprint for a validated public key. */
|
|
91
|
+
export function publicKeyFingerprint(bytes) {
|
|
92
|
+
return createHash("sha256").update(bytes).digest("hex").slice(0, 8);
|
|
93
|
+
}
|
|
94
|
+
function isRoutingAliasSafeByte(byte) {
|
|
95
|
+
return ((byte >= 0x41 && byte <= 0x5a) ||
|
|
96
|
+
(byte >= 0x61 && byte <= 0x7a) ||
|
|
97
|
+
(byte >= 0x30 && byte <= 0x39) ||
|
|
98
|
+
byte === 0x2e ||
|
|
99
|
+
byte === 0x5f ||
|
|
100
|
+
byte === 0x2d);
|
|
101
|
+
}
|
|
102
|
+
/** Percent-encodes a nickname into the receiver-local routing grammar. */
|
|
103
|
+
export function encodeRoutingAlias(rawNickname) {
|
|
104
|
+
let encoded = "";
|
|
105
|
+
for (const byte of Buffer.from(rawNickname, "utf8")) {
|
|
106
|
+
encoded += isRoutingAliasSafeByte(byte)
|
|
107
|
+
? String.fromCharCode(byte)
|
|
108
|
+
: `%${byte.toString(16).toUpperCase().padStart(2, "0")}`;
|
|
109
|
+
}
|
|
110
|
+
return encoded;
|
|
111
|
+
}
|
|
112
|
+
/** Selects a raw nickname by encoded ASCII order, then raw UTF-8 bytes. */
|
|
113
|
+
export function selectRoutingNickname(candidates) {
|
|
114
|
+
let selected;
|
|
115
|
+
let selectedEncoded;
|
|
116
|
+
for (const candidate of candidates) {
|
|
117
|
+
if (candidate.length === 0)
|
|
118
|
+
continue;
|
|
119
|
+
const encoded = encodeRoutingAlias(candidate);
|
|
120
|
+
if (selected === undefined ||
|
|
121
|
+
encoded < selectedEncoded ||
|
|
122
|
+
(encoded === selectedEncoded &&
|
|
123
|
+
Buffer.compare(Buffer.from(candidate), Buffer.from(selected)) < 0)) {
|
|
124
|
+
selected = candidate;
|
|
125
|
+
selectedEncoded = encoded;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return selected;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Allocates a deterministic bijection from canonical Pi key to effective alias.
|
|
132
|
+
* Every colliding base is suffixed with an adaptively expanded key prefix.
|
|
133
|
+
*/
|
|
134
|
+
export function allocateRoutingAliases(inputs) {
|
|
135
|
+
const preparedByKey = new Map();
|
|
136
|
+
for (const [index, input] of inputs.entries()) {
|
|
137
|
+
const keyBytes = decodeEd25519PublicKey(input.pcPubkey, `routingAliases[${index}].pcPubkey`);
|
|
138
|
+
const pcPubkey = encodeEd25519PublicKey(keyBytes);
|
|
139
|
+
if (preparedByKey.has(pcPubkey)) {
|
|
140
|
+
throw new Error("mesh: duplicate routing identity");
|
|
141
|
+
}
|
|
142
|
+
const keyUrl = toBase64UrlNoPad(keyBytes);
|
|
143
|
+
const base = input.nickname
|
|
144
|
+
? encodeRoutingAlias(input.nickname)
|
|
145
|
+
: `pc-${keyUrl.slice(0, 8)}`;
|
|
146
|
+
preparedByKey.set(pcPubkey, { pcPubkey, keyUrl, base });
|
|
147
|
+
}
|
|
148
|
+
const prepared = [...preparedByKey.values()].sort((left, right) => left.pcPubkey < right.pcPubkey
|
|
149
|
+
? -1
|
|
150
|
+
: left.pcPubkey > right.pcPubkey
|
|
151
|
+
? 1
|
|
152
|
+
: 0);
|
|
153
|
+
const groupsByBase = new Map();
|
|
154
|
+
for (const identity of prepared) {
|
|
155
|
+
const group = groupsByBase.get(identity.base);
|
|
156
|
+
if (group)
|
|
157
|
+
group.push(identity);
|
|
158
|
+
else
|
|
159
|
+
groupsByBase.set(identity.base, [identity]);
|
|
160
|
+
}
|
|
161
|
+
const reservedBases = new Set(groupsByBase.keys());
|
|
162
|
+
const aliasByKey = new Map();
|
|
163
|
+
const allocatedAliases = new Set();
|
|
164
|
+
for (const group of groupsByBase.values()) {
|
|
165
|
+
if (group.length !== 1)
|
|
166
|
+
continue;
|
|
167
|
+
const identity = group[0];
|
|
168
|
+
aliasByKey.set(identity.pcPubkey, identity.base);
|
|
169
|
+
allocatedAliases.add(identity.base);
|
|
170
|
+
}
|
|
171
|
+
const collidingGroups = [...groupsByBase.entries()]
|
|
172
|
+
.filter(([, group]) => group.length > 1)
|
|
173
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));
|
|
174
|
+
for (const [base, group] of collidingGroups) {
|
|
175
|
+
const fullPrefixLength = group[0].keyUrl.length;
|
|
176
|
+
let allocated = false;
|
|
177
|
+
for (let prefixLength = 8; prefixLength <= fullPrefixLength; prefixLength++) {
|
|
178
|
+
const candidates = group.map((identity) => `${base}~${identity.keyUrl.slice(0, prefixLength)}`);
|
|
179
|
+
const uniqueCandidates = new Set(candidates);
|
|
180
|
+
const conflicts = candidates.some((candidate) => reservedBases.has(candidate) || allocatedAliases.has(candidate));
|
|
181
|
+
if (uniqueCandidates.size !== group.length || conflicts)
|
|
182
|
+
continue;
|
|
183
|
+
for (let index = 0; index < group.length; index++) {
|
|
184
|
+
const identity = group[index];
|
|
185
|
+
const alias = candidates[index];
|
|
186
|
+
aliasByKey.set(identity.pcPubkey, alias);
|
|
187
|
+
allocatedAliases.add(alias);
|
|
188
|
+
}
|
|
189
|
+
allocated = true;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
if (!allocated) {
|
|
193
|
+
throw new Error("mesh: routing alias collision invariant failed");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return new Map(prepared.map((identity) => [
|
|
197
|
+
identity.pcPubkey,
|
|
198
|
+
aliasByKey.get(identity.pcPubkey),
|
|
199
|
+
]));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Constant-time-ish byte equality for validated public keys. Returns false
|
|
203
|
+
* immediately on length mismatch.
|
|
204
|
+
*
|
|
205
|
+
* Not strictly constant-time — Ed25519 pubkeys aren't secrets, so the
|
|
206
|
+
* short-circuit on length and the byte-by-byte compare are acceptable.
|
|
207
|
+
*/
|
|
208
|
+
export function bytesEqual(a, b) {
|
|
209
|
+
if (a.length !== b.length)
|
|
210
|
+
return false;
|
|
211
|
+
for (let i = 0; i < a.length; i++) {
|
|
212
|
+
if (a[i] !== b[i])
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=encoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/mesh/encoding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type MeshClient } from "./client.js";
|
|
2
|
+
import { type MeshTopologySnapshot } from "./siblings.js";
|
|
3
|
+
export interface SelfRevokeStorageSnapshotRecord {
|
|
4
|
+
readonly rawOwnerPubkey: unknown;
|
|
5
|
+
/** Storage-issued opaque provenance for this canonical Owner slot. */
|
|
6
|
+
readonly token: unknown;
|
|
7
|
+
}
|
|
8
|
+
export type SelfRevokeRemovalResult = {
|
|
9
|
+
readonly outcome: "removed";
|
|
10
|
+
readonly nextToken: unknown;
|
|
11
|
+
} | {
|
|
12
|
+
readonly outcome: "stale" | "not_found" | "no_authority";
|
|
13
|
+
};
|
|
14
|
+
export interface SelfRevokeStorage {
|
|
15
|
+
snapshotOwnerPubkeys(): Promise<readonly SelfRevokeStorageSnapshotRecord[]>;
|
|
16
|
+
conditionalRemovePeer(remoteEpk: string, expectedToken: unknown, canCommit?: () => boolean): Promise<SelfRevokeRemovalResult>;
|
|
17
|
+
}
|
|
18
|
+
export interface SelfRevokeOptions {
|
|
19
|
+
client: MeshClient;
|
|
20
|
+
storage: SelfRevokeStorage;
|
|
21
|
+
/** This Pi's long-term Ed25519 pubkey, raw 32 bytes. */
|
|
22
|
+
myPubkey: Uint8Array;
|
|
23
|
+
intervalMs?: number;
|
|
24
|
+
/** Raw storage handle first; canonical runtime Owner identity second. */
|
|
25
|
+
onRevoke?: (rawOwnerPubkey: string, canonicalOwnerPubkey: string) => void | Promise<void>;
|
|
26
|
+
onAuthoritativeOwners?: (canonicalOwnerPubkeys: readonly string[]) => void | Promise<void>;
|
|
27
|
+
onTopologyChanged?: (snapshot: MeshTopologySnapshot) => void | Promise<void>;
|
|
28
|
+
log?: {
|
|
29
|
+
info(msg: string): void;
|
|
30
|
+
warn(msg: string): void;
|
|
31
|
+
error(msg: string): void;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export declare class SelfRevoke {
|
|
35
|
+
private readonly client;
|
|
36
|
+
private readonly storage;
|
|
37
|
+
private readonly myPubkey;
|
|
38
|
+
private readonly intervalMs;
|
|
39
|
+
private readonly onRevoke?;
|
|
40
|
+
private readonly onAuthoritativeOwners?;
|
|
41
|
+
private readonly onTopologyChanged?;
|
|
42
|
+
private readonly log;
|
|
43
|
+
/**
|
|
44
|
+
* Accepted anti-rollback floor, deliberately independent from pending I/O.
|
|
45
|
+
* https://github.com/jacobaraujo7/remote_pi/issues/73: this in-memory floor
|
|
46
|
+
* resets on process restart, allowing pre-revocation membership replay.
|
|
47
|
+
*/
|
|
48
|
+
private readonly lastSeenVersion;
|
|
49
|
+
private readonly pendingRevocations;
|
|
50
|
+
private readonly membershipByOwner;
|
|
51
|
+
private previousTopology;
|
|
52
|
+
private sweepInFlight;
|
|
53
|
+
private timer;
|
|
54
|
+
/** Invalidates authority held by an async sweep when this producer stops/re-pairs. */
|
|
55
|
+
private lifecycleGeneration;
|
|
56
|
+
constructor(opts: SelfRevokeOptions);
|
|
57
|
+
start(): void;
|
|
58
|
+
stop(): void;
|
|
59
|
+
/** Called before a same-process pairing mutation enters the storage lane. */
|
|
60
|
+
invalidateStorageAuthority(): void;
|
|
61
|
+
/** Schedules one post-mutation authoritative sweep after any stale sweep exits. */
|
|
62
|
+
requestFreshCheck(): Promise<void>;
|
|
63
|
+
checkOnce(): Promise<void>;
|
|
64
|
+
private _runSweep;
|
|
65
|
+
private _hasAuthority;
|
|
66
|
+
private _canonicalOwnerSlots;
|
|
67
|
+
private _pruneStateNotIn;
|
|
68
|
+
private _checkOwnerSlot;
|
|
69
|
+
/** Returns true only when storage proves the pending snapshot was re-paired. */
|
|
70
|
+
private _retryPending;
|
|
71
|
+
private _invokeRevokeCallback;
|
|
72
|
+
private _publishTopology;
|
|
73
|
+
}
|