@meshwhisper/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/chaff/index.d.ts +91 -0
- package/dist/chaff/index.d.ts.map +1 -0
- package/dist/chaff/index.js +268 -0
- package/dist/chaff/index.js.map +1 -0
- package/dist/cluster/index.d.ts +159 -0
- package/dist/cluster/index.d.ts.map +1 -0
- package/dist/cluster/index.js +393 -0
- package/dist/cluster/index.js.map +1 -0
- package/dist/compliance/index.d.ts +129 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +315 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/crypto/index.d.ts +65 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +146 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/group/index.d.ts +155 -0
- package/dist/group/index.d.ts.map +1 -0
- package/dist/group/index.js +560 -0
- package/dist/group/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/namespace/index.d.ts +155 -0
- package/dist/namespace/index.d.ts.map +1 -0
- package/dist/namespace/index.js +278 -0
- package/dist/namespace/index.js.map +1 -0
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +19 -0
- package/dist/node/index.js.map +1 -0
- package/dist/packet/index.d.ts +63 -0
- package/dist/packet/index.d.ts.map +1 -0
- package/dist/packet/index.js +244 -0
- package/dist/packet/index.js.map +1 -0
- package/dist/permissions/index.d.ts +107 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +282 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/persistence/idb-storage.d.ts +27 -0
- package/dist/persistence/idb-storage.d.ts.map +1 -0
- package/dist/persistence/idb-storage.js +75 -0
- package/dist/persistence/idb-storage.js.map +1 -0
- package/dist/persistence/index.d.ts +4 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +3 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/node-storage.d.ts +33 -0
- package/dist/persistence/node-storage.d.ts.map +1 -0
- package/dist/persistence/node-storage.js +90 -0
- package/dist/persistence/node-storage.js.map +1 -0
- package/dist/persistence/serialization.d.ts +4 -0
- package/dist/persistence/serialization.d.ts.map +1 -0
- package/dist/persistence/serialization.js +49 -0
- package/dist/persistence/serialization.js.map +1 -0
- package/dist/persistence/types.d.ts +29 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +5 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/ratchet/index.d.ts +80 -0
- package/dist/ratchet/index.d.ts.map +1 -0
- package/dist/ratchet/index.js +259 -0
- package/dist/ratchet/index.js.map +1 -0
- package/dist/reciprocity/index.d.ts +109 -0
- package/dist/reciprocity/index.d.ts.map +1 -0
- package/dist/reciprocity/index.js +311 -0
- package/dist/reciprocity/index.js.map +1 -0
- package/dist/relay/index.d.ts +87 -0
- package/dist/relay/index.d.ts.map +1 -0
- package/dist/relay/index.js +286 -0
- package/dist/relay/index.js.map +1 -0
- package/dist/routing/index.d.ts +136 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +478 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/sdk/index.d.ts +322 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +1530 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sybil/index.d.ts +123 -0
- package/dist/sybil/index.d.ts.map +1 -0
- package/dist/sybil/index.js +491 -0
- package/dist/sybil/index.js.map +1 -0
- package/dist/transport/browser/index.d.ts +34 -0
- package/dist/transport/browser/index.d.ts.map +1 -0
- package/dist/transport/browser/index.js +176 -0
- package/dist/transport/browser/index.js.map +1 -0
- package/dist/transport/local/index.d.ts +57 -0
- package/dist/transport/local/index.d.ts.map +1 -0
- package/dist/transport/local/index.js +442 -0
- package/dist/transport/local/index.js.map +1 -0
- package/dist/transport/negotiator/index.d.ts +79 -0
- package/dist/transport/negotiator/index.d.ts.map +1 -0
- package/dist/transport/negotiator/index.js +289 -0
- package/dist/transport/negotiator/index.js.map +1 -0
- package/dist/transport/node/index.d.ts +56 -0
- package/dist/transport/node/index.d.ts.map +1 -0
- package/dist/transport/node/index.js +209 -0
- package/dist/transport/node/index.js.map +1 -0
- package/dist/transport/noop/index.d.ts +11 -0
- package/dist/transport/noop/index.d.ts.map +1 -0
- package/dist/transport/noop/index.js +20 -0
- package/dist/transport/noop/index.js.map +1 -0
- package/dist/transport/p2p/index.d.ts +109 -0
- package/dist/transport/p2p/index.d.ts.map +1 -0
- package/dist/transport/p2p/index.js +237 -0
- package/dist/transport/p2p/index.js.map +1 -0
- package/dist/transport/websocket/index.d.ts +89 -0
- package/dist/transport/websocket/index.d.ts.map +1 -0
- package/dist/transport/websocket/index.js +498 -0
- package/dist/transport/websocket/index.js.map +1 -0
- package/dist/transport/websocket/serialize.d.ts +5 -0
- package/dist/transport/websocket/serialize.d.ts.map +1 -0
- package/dist/transport/websocket/serialize.js +55 -0
- package/dist/transport/websocket/serialize.js.map +1 -0
- package/dist/types.d.ts +215 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist/x3dh/index.d.ts +120 -0
- package/dist/x3dh/index.d.ts.map +1 -0
- package/dist/x3dh/index.js +290 -0
- package/dist/x3dh/index.js.map +1 -0
- package/package.json +59 -0
- package/src/browser/index.ts +19 -0
- package/src/chaff/index.ts +340 -0
- package/src/cluster/index.ts +482 -0
- package/src/compliance/index.ts +407 -0
- package/src/crypto/index.ts +193 -0
- package/src/group/index.ts +719 -0
- package/src/index.ts +87 -0
- package/src/lz4js.d.ts +58 -0
- package/src/namespace/index.ts +336 -0
- package/src/node/index.ts +19 -0
- package/src/packet/index.ts +326 -0
- package/src/permissions/index.ts +405 -0
- package/src/persistence/idb-storage.ts +83 -0
- package/src/persistence/index.ts +3 -0
- package/src/persistence/node-storage.ts +96 -0
- package/src/persistence/serialization.ts +75 -0
- package/src/persistence/types.ts +33 -0
- package/src/ratchet/index.ts +363 -0
- package/src/reciprocity/index.ts +371 -0
- package/src/relay/index.ts +382 -0
- package/src/routing/index.ts +577 -0
- package/src/sdk/index.ts +1994 -0
- package/src/sybil/index.ts +661 -0
- package/src/transport/browser/index.ts +201 -0
- package/src/transport/local/index.ts +540 -0
- package/src/transport/negotiator/index.ts +397 -0
- package/src/transport/node/index.ts +234 -0
- package/src/transport/noop/index.ts +22 -0
- package/src/transport/p2p/index.ts +345 -0
- package/src/transport/websocket/index.ts +660 -0
- package/src/transport/websocket/serialize.ts +68 -0
- package/src/types.ts +275 -0
- package/src/x3dh/index.ts +388 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// MeshWhisper SDK — Store-and-Forward Relay Module
|
|
3
|
+
// Stores encrypted blobs for offline peers and delivers them
|
|
4
|
+
// when the recipient announces presence.
|
|
5
|
+
// ============================================================
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Helpers
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
/** Generate a random 32-hex-char blob ID. */
|
|
10
|
+
function generateBlobId() {
|
|
11
|
+
// crypto.randomUUID() is available in Node >= 19 and modern runtimes,
|
|
12
|
+
// but a hex string is more portable and avoids dashes.
|
|
13
|
+
const bytes = new Uint8Array(16);
|
|
14
|
+
crypto.getRandomValues(bytes);
|
|
15
|
+
return Array.from(bytes)
|
|
16
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
17
|
+
.join("");
|
|
18
|
+
}
|
|
19
|
+
/** Constant-time-ish comparison for Uint8Array equality. */
|
|
20
|
+
function uint8Equal(a, b) {
|
|
21
|
+
if (a.length !== b.length)
|
|
22
|
+
return false;
|
|
23
|
+
let diff = 0;
|
|
24
|
+
for (let i = 0; i < a.length; i++) {
|
|
25
|
+
diff |= a[i] ^ b[i];
|
|
26
|
+
}
|
|
27
|
+
return diff === 0;
|
|
28
|
+
}
|
|
29
|
+
/** Rough byte size of a StoredBlob (payload dominates, but we account for metadata too). */
|
|
30
|
+
function blobByteSize(blob) {
|
|
31
|
+
return (blob.encryptedPayload.byteLength +
|
|
32
|
+
blob.destHash.byteLength +
|
|
33
|
+
blob.id.length * 2 + // JS string ≈ 2 bytes per char
|
|
34
|
+
32 // fixed overhead for numeric fields + object shell
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Default constants
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
const DEFAULT_MAX_STORAGE_BYTES = 50 * 1024 * 1024; // 50 MB
|
|
41
|
+
const DEFAULT_TTL_HOURS = 72;
|
|
42
|
+
const DEFAULT_PRUNE_INTERVAL_MS = 60_000; // 1 minute
|
|
43
|
+
export class RelayStore {
|
|
44
|
+
maxStorageBytes;
|
|
45
|
+
defaultTTLHours;
|
|
46
|
+
/** All stored blobs keyed by blob id. */
|
|
47
|
+
blobs = new Map();
|
|
48
|
+
/** Secondary index: destHash hex -> set of blob ids. */
|
|
49
|
+
destIndex = new Map();
|
|
50
|
+
/** Track insertion order for LRU eviction (oldest first). */
|
|
51
|
+
insertionOrder = [];
|
|
52
|
+
currentStorageBytes = 0;
|
|
53
|
+
pruneTimer = null;
|
|
54
|
+
constructor(options) {
|
|
55
|
+
this.maxStorageBytes = options?.maxStorageBytes ?? DEFAULT_MAX_STORAGE_BYTES;
|
|
56
|
+
this.defaultTTLHours = options?.defaultTTLHours ?? DEFAULT_TTL_HOURS;
|
|
57
|
+
}
|
|
58
|
+
// ----- helpers -----
|
|
59
|
+
destKey(destHash) {
|
|
60
|
+
return Array.from(destHash)
|
|
61
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
62
|
+
.join("");
|
|
63
|
+
}
|
|
64
|
+
isExpired(blob) {
|
|
65
|
+
const expiryMs = blob.receivedAt + blob.ttlHours * 3_600_000;
|
|
66
|
+
return Date.now() >= expiryMs;
|
|
67
|
+
}
|
|
68
|
+
// ----- Blob storage -----
|
|
69
|
+
/**
|
|
70
|
+
* Store an encrypted blob. Returns false if storage is full even after
|
|
71
|
+
* evicting the oldest blobs.
|
|
72
|
+
*/
|
|
73
|
+
storeBlob(blob) {
|
|
74
|
+
const size = blobByteSize(blob);
|
|
75
|
+
// Evict oldest blobs until there is room (or nothing left to evict)
|
|
76
|
+
while (this.currentStorageBytes + size > this.maxStorageBytes &&
|
|
77
|
+
this.insertionOrder.length > 0) {
|
|
78
|
+
const oldestId = this.insertionOrder[0];
|
|
79
|
+
this.removeBlob(oldestId);
|
|
80
|
+
}
|
|
81
|
+
if (this.currentStorageBytes + size > this.maxStorageBytes) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Avoid duplicate ids
|
|
85
|
+
if (this.blobs.has(blob.id)) {
|
|
86
|
+
this.removeBlob(blob.id);
|
|
87
|
+
}
|
|
88
|
+
this.blobs.set(blob.id, blob);
|
|
89
|
+
this.currentStorageBytes += size;
|
|
90
|
+
this.insertionOrder.push(blob.id);
|
|
91
|
+
const dk = this.destKey(blob.destHash);
|
|
92
|
+
let set = this.destIndex.get(dk);
|
|
93
|
+
if (!set) {
|
|
94
|
+
set = new Set();
|
|
95
|
+
this.destIndex.set(dk, set);
|
|
96
|
+
}
|
|
97
|
+
set.add(blob.id);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
/** Retrieve all stored blobs for a given destination hash. */
|
|
101
|
+
getBlobs(destHash) {
|
|
102
|
+
const dk = this.destKey(destHash);
|
|
103
|
+
const ids = this.destIndex.get(dk);
|
|
104
|
+
if (!ids)
|
|
105
|
+
return [];
|
|
106
|
+
const results = [];
|
|
107
|
+
for (const id of ids) {
|
|
108
|
+
const blob = this.blobs.get(id);
|
|
109
|
+
if (blob)
|
|
110
|
+
results.push(blob);
|
|
111
|
+
}
|
|
112
|
+
return results;
|
|
113
|
+
}
|
|
114
|
+
/** Remove a single blob by id. */
|
|
115
|
+
removeBlob(id) {
|
|
116
|
+
const blob = this.blobs.get(id);
|
|
117
|
+
if (!blob)
|
|
118
|
+
return;
|
|
119
|
+
this.currentStorageBytes -= blobByteSize(blob);
|
|
120
|
+
this.blobs.delete(id);
|
|
121
|
+
const dk = this.destKey(blob.destHash);
|
|
122
|
+
const set = this.destIndex.get(dk);
|
|
123
|
+
if (set) {
|
|
124
|
+
set.delete(id);
|
|
125
|
+
if (set.size === 0)
|
|
126
|
+
this.destIndex.delete(dk);
|
|
127
|
+
}
|
|
128
|
+
const idx = this.insertionOrder.indexOf(id);
|
|
129
|
+
if (idx !== -1)
|
|
130
|
+
this.insertionOrder.splice(idx, 1);
|
|
131
|
+
}
|
|
132
|
+
/** Remove all blobs targeting a specific destination hash. */
|
|
133
|
+
removeBlobsForDest(destHash) {
|
|
134
|
+
const dk = this.destKey(destHash);
|
|
135
|
+
const ids = this.destIndex.get(dk);
|
|
136
|
+
if (!ids)
|
|
137
|
+
return;
|
|
138
|
+
// Snapshot the ids before iterating — removeBlob mutates the set.
|
|
139
|
+
for (const id of [...ids]) {
|
|
140
|
+
this.removeBlob(id);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ----- TTL management -----
|
|
144
|
+
/** Remove all expired blobs. Returns count of blobs removed. */
|
|
145
|
+
pruneExpired() {
|
|
146
|
+
let removed = 0;
|
|
147
|
+
// Iterate oldest-first for efficiency.
|
|
148
|
+
for (let i = this.insertionOrder.length - 1; i >= 0; i--) {
|
|
149
|
+
const id = this.insertionOrder[i];
|
|
150
|
+
const blob = this.blobs.get(id);
|
|
151
|
+
if (blob && this.isExpired(blob)) {
|
|
152
|
+
this.removeBlob(id);
|
|
153
|
+
removed++;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return removed;
|
|
157
|
+
}
|
|
158
|
+
/** Start automatic periodic pruning. */
|
|
159
|
+
startPruneInterval(intervalMs) {
|
|
160
|
+
this.stopPruneInterval();
|
|
161
|
+
this.pruneTimer = setInterval(() => this.pruneExpired(), intervalMs ?? DEFAULT_PRUNE_INTERVAL_MS);
|
|
162
|
+
// Allow the Node.js process to exit even if the timer is running.
|
|
163
|
+
if (typeof this.pruneTimer === "object" && "unref" in this.pruneTimer) {
|
|
164
|
+
this.pruneTimer.unref();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/** Stop automatic periodic pruning. */
|
|
168
|
+
stopPruneInterval() {
|
|
169
|
+
if (this.pruneTimer !== null) {
|
|
170
|
+
clearInterval(this.pruneTimer);
|
|
171
|
+
this.pruneTimer = null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ----- Storage metrics -----
|
|
175
|
+
/** Bytes currently consumed by stored blobs. */
|
|
176
|
+
getStorageUsed() {
|
|
177
|
+
return this.currentStorageBytes;
|
|
178
|
+
}
|
|
179
|
+
/** Configured maximum storage capacity in bytes. */
|
|
180
|
+
getStorageCapacity() {
|
|
181
|
+
return this.maxStorageBytes;
|
|
182
|
+
}
|
|
183
|
+
/** Total number of blobs currently stored. */
|
|
184
|
+
getBlobCount() {
|
|
185
|
+
return this.blobs.size;
|
|
186
|
+
}
|
|
187
|
+
handlePresenceAnnouncement(destHash, previousEpochDestHash) {
|
|
188
|
+
const delivered = [];
|
|
189
|
+
// Current epoch
|
|
190
|
+
const currentBlobs = this.getBlobs(destHash);
|
|
191
|
+
delivered.push(...currentBlobs);
|
|
192
|
+
this.removeBlobsForDest(destHash);
|
|
193
|
+
// Previous epoch (dest hashes rotate hourly)
|
|
194
|
+
if (previousEpochDestHash && !uint8Equal(destHash, previousEpochDestHash)) {
|
|
195
|
+
const prevBlobs = this.getBlobs(previousEpochDestHash);
|
|
196
|
+
delivered.push(...prevBlobs);
|
|
197
|
+
this.removeBlobsForDest(previousEpochDestHash);
|
|
198
|
+
}
|
|
199
|
+
return delivered;
|
|
200
|
+
}
|
|
201
|
+
// ----- Multi-hop forwarding -----
|
|
202
|
+
/**
|
|
203
|
+
* Decide whether a blob should be forwarded to a closer relay.
|
|
204
|
+
* Returns true when the blob still has remaining hops and a closer relay
|
|
205
|
+
* is available.
|
|
206
|
+
*/
|
|
207
|
+
shouldForward(blob, closerRelayAvailable) {
|
|
208
|
+
return closerRelayAvailable && blob.hopsRemaining > 0;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Prepare a blob for multi-hop forwarding.
|
|
212
|
+
* Returns a new StoredBlob with decremented hopsRemaining and a fresh id.
|
|
213
|
+
*/
|
|
214
|
+
prepareForward(blob) {
|
|
215
|
+
if (blob.hopsRemaining <= 0) {
|
|
216
|
+
throw new Error("Cannot forward blob with no remaining hops");
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
...blob,
|
|
220
|
+
id: generateBlobId(),
|
|
221
|
+
hopsRemaining: blob.hopsRemaining - 1,
|
|
222
|
+
receivedAt: Date.now(),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
export class StoreAndForwardManager {
|
|
227
|
+
store;
|
|
228
|
+
constructor(store) {
|
|
229
|
+
this.store = store;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Store an encrypted payload destined for an offline peer.
|
|
233
|
+
* Returns the generated blob id, or throws if storage is completely full.
|
|
234
|
+
*/
|
|
235
|
+
storeForDelivery(destHash, encryptedPayload, ttlHours) {
|
|
236
|
+
const blob = {
|
|
237
|
+
id: generateBlobId(),
|
|
238
|
+
destHash,
|
|
239
|
+
encryptedPayload,
|
|
240
|
+
receivedAt: Date.now(),
|
|
241
|
+
ttlHours: ttlHours ?? 72,
|
|
242
|
+
hopsRemaining: 3, // sensible default for multi-hop
|
|
243
|
+
};
|
|
244
|
+
const stored = this.store.storeBlob(blob);
|
|
245
|
+
if (!stored) {
|
|
246
|
+
throw new Error("Relay storage full: could not store blob even after eviction");
|
|
247
|
+
}
|
|
248
|
+
return blob.id;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Called when a peer comes online. Returns all stored blobs for its
|
|
252
|
+
* destination hash and removes them from the store.
|
|
253
|
+
*/
|
|
254
|
+
deliverStored(destHash) {
|
|
255
|
+
return this.store.handlePresenceAnnouncement(destHash);
|
|
256
|
+
}
|
|
257
|
+
/** Return aggregate stats about the relay store. */
|
|
258
|
+
getStats() {
|
|
259
|
+
const blobCount = this.store.getBlobCount();
|
|
260
|
+
const bytesUsed = this.store.getStorageUsed();
|
|
261
|
+
let oldestBlobAge = 0;
|
|
262
|
+
if (blobCount > 0) {
|
|
263
|
+
// We don't have direct access to the internal insertion order,
|
|
264
|
+
// so scan all blobs via a destHash-agnostic approach: use getBlobs
|
|
265
|
+
// is not feasible without knowing hashes. Instead we expose a
|
|
266
|
+
// helper below or compute from the public API. Since we control
|
|
267
|
+
// both classes in this module, we reach into the store's blobs map
|
|
268
|
+
// via a dedicated accessor.
|
|
269
|
+
oldestBlobAge = this.computeOldestAge();
|
|
270
|
+
}
|
|
271
|
+
return { blobCount, bytesUsed, oldestBlobAge };
|
|
272
|
+
}
|
|
273
|
+
computeOldestAge() {
|
|
274
|
+
// Access internal state via the store — both classes live in the same
|
|
275
|
+
// module, so this tightly-coupled reach is acceptable.
|
|
276
|
+
const blobs = this.store
|
|
277
|
+
.blobs;
|
|
278
|
+
let oldest = Infinity;
|
|
279
|
+
for (const blob of blobs.values()) {
|
|
280
|
+
if (blob.receivedAt < oldest)
|
|
281
|
+
oldest = blob.receivedAt;
|
|
282
|
+
}
|
|
283
|
+
return oldest === Infinity ? 0 : Date.now() - oldest;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { Packet, PeerProximityEntry, RouteRequest, RouteOffer } from '../types.js';
|
|
2
|
+
export interface Route {
|
|
3
|
+
destHash: Uint8Array;
|
|
4
|
+
nextHop: string;
|
|
5
|
+
hopCount: number;
|
|
6
|
+
estimatedLatency: number;
|
|
7
|
+
discoveredAt: number;
|
|
8
|
+
expiresAt: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Maintains a table of known peers indexed by social proximity.
|
|
12
|
+
* Entries are keyed by peerId and can also be looked up by destHash.
|
|
13
|
+
*/
|
|
14
|
+
export declare class PeerProximityTable {
|
|
15
|
+
private readonly entries;
|
|
16
|
+
private readonly destHashIndex;
|
|
17
|
+
private readonly ttlMs;
|
|
18
|
+
constructor(ttlMs?: number);
|
|
19
|
+
/** Add or replace a peer entry. */
|
|
20
|
+
addPeer(entry: PeerProximityEntry): void;
|
|
21
|
+
/** Remove a peer by ID. */
|
|
22
|
+
removePeer(peerId: string): void;
|
|
23
|
+
/** Partially update an existing peer entry. */
|
|
24
|
+
updatePeer(peerId: string, updates: Partial<PeerProximityEntry>): void;
|
|
25
|
+
/** Find a peer that owns the given destination hash. */
|
|
26
|
+
findPeer(destHash: Uint8Array): PeerProximityEntry | null;
|
|
27
|
+
/**
|
|
28
|
+
* Return the N peers whose known destHash is closest (by XOR distance) to
|
|
29
|
+
* the target destination hash. Results are sorted closest-first.
|
|
30
|
+
*/
|
|
31
|
+
getClosestPeers(destHash: Uint8Array, count: number): PeerProximityEntry[];
|
|
32
|
+
/** Remove entries whose lastSeen is older than maxAgeMs. */
|
|
33
|
+
pruneStale(maxAgeMs?: number): void;
|
|
34
|
+
/** Number of entries currently in the table. */
|
|
35
|
+
get size(): number;
|
|
36
|
+
/** Iterate all entries (snapshot). */
|
|
37
|
+
allEntries(): PeerProximityEntry[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Core social graph router.
|
|
41
|
+
*
|
|
42
|
+
* Uses the peer proximity table as the routing topology.
|
|
43
|
+
* Route discovery gossips route requests to socially proximate peers
|
|
44
|
+
* and selects the shortest/fastest offered route.
|
|
45
|
+
*/
|
|
46
|
+
export declare class SocialGraphRouter {
|
|
47
|
+
readonly localPeerId: string;
|
|
48
|
+
readonly proximityTable: PeerProximityTable;
|
|
49
|
+
private readonly routeCache;
|
|
50
|
+
private readonly seenPackets;
|
|
51
|
+
private readonly pendingRequests;
|
|
52
|
+
private readonly routeTtlMs;
|
|
53
|
+
private readonly requestTimeoutMs;
|
|
54
|
+
constructor(localPeerId: string, proximityTable: PeerProximityTable, options?: {
|
|
55
|
+
routeTtlMs?: number;
|
|
56
|
+
requestTimeoutMs?: number;
|
|
57
|
+
});
|
|
58
|
+
/** Retrieve a cached route if it exists and has not expired. */
|
|
59
|
+
getCachedRoute(destHash: Uint8Array): Route | null;
|
|
60
|
+
/** Store a route in the cache. */
|
|
61
|
+
cacheRoute(route: Route): void;
|
|
62
|
+
/** Remove a cached route. */
|
|
63
|
+
invalidateRoute(destHash: Uint8Array): void;
|
|
64
|
+
/**
|
|
65
|
+
* Discover a route to the given destination hash.
|
|
66
|
+
*
|
|
67
|
+
* Algorithm:
|
|
68
|
+
* 1. Check the route cache for a non-expired entry.
|
|
69
|
+
* 2. Check if any connected peer in the proximity table has a recent
|
|
70
|
+
* relay path to the destination.
|
|
71
|
+
* 3. If not, create a RouteRequest (containing only dest_hash, not
|
|
72
|
+
* sender identity) and gossip it to socially proximate peers.
|
|
73
|
+
* 4. Collect RouteOffer responses within the request timeout.
|
|
74
|
+
* 5. Select the shortest/fastest offered route.
|
|
75
|
+
*
|
|
76
|
+
* Returns the route, or null if no route could be discovered within the
|
|
77
|
+
* timeout window.
|
|
78
|
+
*/
|
|
79
|
+
findRoute(destHash: Uint8Array): Promise<Route | null>;
|
|
80
|
+
/**
|
|
81
|
+
* Handle an incoming route request from a neighbouring peer.
|
|
82
|
+
*
|
|
83
|
+
* If this node knows the destination (via its proximity table), it
|
|
84
|
+
* returns a RouteOffer. Otherwise returns null (the caller should
|
|
85
|
+
* decide whether to forward the request further).
|
|
86
|
+
*/
|
|
87
|
+
handleRouteRequest(request: RouteRequest, fromPeer: string): RouteOffer | null;
|
|
88
|
+
/**
|
|
89
|
+
* Register a received route offer against the matching pending request.
|
|
90
|
+
* If no pending request exists for the offer's requestId, the offer is
|
|
91
|
+
* silently dropped.
|
|
92
|
+
*/
|
|
93
|
+
handleRouteOffer(offer: RouteOffer): void;
|
|
94
|
+
/**
|
|
95
|
+
* Return a list of the RouteRequests that are still awaiting responses.
|
|
96
|
+
* Expired requests are pruned as a side-effect.
|
|
97
|
+
*/
|
|
98
|
+
getPendingRequests(): RouteRequest[];
|
|
99
|
+
/**
|
|
100
|
+
* Return the list of socially proximate peers that a route request
|
|
101
|
+
* should be gossiped to. Useful for the transport layer to know where
|
|
102
|
+
* to send route requests produced by findRoute.
|
|
103
|
+
*/
|
|
104
|
+
getGossipTargets(destHash: Uint8Array): PeerProximityEntry[];
|
|
105
|
+
/**
|
|
106
|
+
* Determine the next-hop peer to forward a message to for the given
|
|
107
|
+
* destination hash.
|
|
108
|
+
*
|
|
109
|
+
* Returns null if no route is known.
|
|
110
|
+
*/
|
|
111
|
+
getNextHop(destHash: Uint8Array): string | null;
|
|
112
|
+
/**
|
|
113
|
+
* Determine whether this device should relay a given packet.
|
|
114
|
+
*
|
|
115
|
+
* A packet is relayed when:
|
|
116
|
+
* - Its TTL is greater than 0
|
|
117
|
+
* - It has not been seen before (deduplication)
|
|
118
|
+
*/
|
|
119
|
+
shouldRelay(packet: Packet): boolean;
|
|
120
|
+
/**
|
|
121
|
+
* Return a copy of the packet with TTL decremented by 1.
|
|
122
|
+
* Callers must ensure TTL > 0 before calling (see shouldRelay).
|
|
123
|
+
*/
|
|
124
|
+
decrementTTL(packet: Packet): Packet;
|
|
125
|
+
/** Check if a timestamp is recent enough to trust. */
|
|
126
|
+
private isRecent;
|
|
127
|
+
/** Convert a proximity entry to a Route. */
|
|
128
|
+
private peerToRoute;
|
|
129
|
+
/** Resolve a pending request by selecting the best offer. */
|
|
130
|
+
private resolvePendingRequest;
|
|
131
|
+
/** Remove pending requests that have exceeded their timeout. */
|
|
132
|
+
private pruneExpiredRequests;
|
|
133
|
+
/** Generate a random 16-byte request ID. */
|
|
134
|
+
private generateRequestId;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"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"}
|