@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.
Files changed (163) hide show
  1. package/README.md +138 -0
  2. package/dist/browser/index.d.ts +4 -0
  3. package/dist/browser/index.d.ts.map +1 -0
  4. package/dist/browser/index.js +19 -0
  5. package/dist/browser/index.js.map +1 -0
  6. package/dist/chaff/index.d.ts +91 -0
  7. package/dist/chaff/index.d.ts.map +1 -0
  8. package/dist/chaff/index.js +268 -0
  9. package/dist/chaff/index.js.map +1 -0
  10. package/dist/cluster/index.d.ts +159 -0
  11. package/dist/cluster/index.d.ts.map +1 -0
  12. package/dist/cluster/index.js +393 -0
  13. package/dist/cluster/index.js.map +1 -0
  14. package/dist/compliance/index.d.ts +129 -0
  15. package/dist/compliance/index.d.ts.map +1 -0
  16. package/dist/compliance/index.js +315 -0
  17. package/dist/compliance/index.js.map +1 -0
  18. package/dist/crypto/index.d.ts +65 -0
  19. package/dist/crypto/index.d.ts.map +1 -0
  20. package/dist/crypto/index.js +146 -0
  21. package/dist/crypto/index.js.map +1 -0
  22. package/dist/group/index.d.ts +155 -0
  23. package/dist/group/index.d.ts.map +1 -0
  24. package/dist/group/index.js +560 -0
  25. package/dist/group/index.js.map +1 -0
  26. package/dist/index.d.ts +7 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +11 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/namespace/index.d.ts +155 -0
  31. package/dist/namespace/index.d.ts.map +1 -0
  32. package/dist/namespace/index.js +278 -0
  33. package/dist/namespace/index.js.map +1 -0
  34. package/dist/node/index.d.ts +4 -0
  35. package/dist/node/index.d.ts.map +1 -0
  36. package/dist/node/index.js +19 -0
  37. package/dist/node/index.js.map +1 -0
  38. package/dist/packet/index.d.ts +63 -0
  39. package/dist/packet/index.d.ts.map +1 -0
  40. package/dist/packet/index.js +244 -0
  41. package/dist/packet/index.js.map +1 -0
  42. package/dist/permissions/index.d.ts +107 -0
  43. package/dist/permissions/index.d.ts.map +1 -0
  44. package/dist/permissions/index.js +282 -0
  45. package/dist/permissions/index.js.map +1 -0
  46. package/dist/persistence/idb-storage.d.ts +27 -0
  47. package/dist/persistence/idb-storage.d.ts.map +1 -0
  48. package/dist/persistence/idb-storage.js +75 -0
  49. package/dist/persistence/idb-storage.js.map +1 -0
  50. package/dist/persistence/index.d.ts +4 -0
  51. package/dist/persistence/index.d.ts.map +1 -0
  52. package/dist/persistence/index.js +3 -0
  53. package/dist/persistence/index.js.map +1 -0
  54. package/dist/persistence/node-storage.d.ts +33 -0
  55. package/dist/persistence/node-storage.d.ts.map +1 -0
  56. package/dist/persistence/node-storage.js +90 -0
  57. package/dist/persistence/node-storage.js.map +1 -0
  58. package/dist/persistence/serialization.d.ts +4 -0
  59. package/dist/persistence/serialization.d.ts.map +1 -0
  60. package/dist/persistence/serialization.js +49 -0
  61. package/dist/persistence/serialization.js.map +1 -0
  62. package/dist/persistence/types.d.ts +29 -0
  63. package/dist/persistence/types.d.ts.map +1 -0
  64. package/dist/persistence/types.js +5 -0
  65. package/dist/persistence/types.js.map +1 -0
  66. package/dist/ratchet/index.d.ts +80 -0
  67. package/dist/ratchet/index.d.ts.map +1 -0
  68. package/dist/ratchet/index.js +259 -0
  69. package/dist/ratchet/index.js.map +1 -0
  70. package/dist/reciprocity/index.d.ts +109 -0
  71. package/dist/reciprocity/index.d.ts.map +1 -0
  72. package/dist/reciprocity/index.js +311 -0
  73. package/dist/reciprocity/index.js.map +1 -0
  74. package/dist/relay/index.d.ts +87 -0
  75. package/dist/relay/index.d.ts.map +1 -0
  76. package/dist/relay/index.js +286 -0
  77. package/dist/relay/index.js.map +1 -0
  78. package/dist/routing/index.d.ts +136 -0
  79. package/dist/routing/index.d.ts.map +1 -0
  80. package/dist/routing/index.js +478 -0
  81. package/dist/routing/index.js.map +1 -0
  82. package/dist/sdk/index.d.ts +322 -0
  83. package/dist/sdk/index.d.ts.map +1 -0
  84. package/dist/sdk/index.js +1530 -0
  85. package/dist/sdk/index.js.map +1 -0
  86. package/dist/sybil/index.d.ts +123 -0
  87. package/dist/sybil/index.d.ts.map +1 -0
  88. package/dist/sybil/index.js +491 -0
  89. package/dist/sybil/index.js.map +1 -0
  90. package/dist/transport/browser/index.d.ts +34 -0
  91. package/dist/transport/browser/index.d.ts.map +1 -0
  92. package/dist/transport/browser/index.js +176 -0
  93. package/dist/transport/browser/index.js.map +1 -0
  94. package/dist/transport/local/index.d.ts +57 -0
  95. package/dist/transport/local/index.d.ts.map +1 -0
  96. package/dist/transport/local/index.js +442 -0
  97. package/dist/transport/local/index.js.map +1 -0
  98. package/dist/transport/negotiator/index.d.ts +79 -0
  99. package/dist/transport/negotiator/index.d.ts.map +1 -0
  100. package/dist/transport/negotiator/index.js +289 -0
  101. package/dist/transport/negotiator/index.js.map +1 -0
  102. package/dist/transport/node/index.d.ts +56 -0
  103. package/dist/transport/node/index.d.ts.map +1 -0
  104. package/dist/transport/node/index.js +209 -0
  105. package/dist/transport/node/index.js.map +1 -0
  106. package/dist/transport/noop/index.d.ts +11 -0
  107. package/dist/transport/noop/index.d.ts.map +1 -0
  108. package/dist/transport/noop/index.js +20 -0
  109. package/dist/transport/noop/index.js.map +1 -0
  110. package/dist/transport/p2p/index.d.ts +109 -0
  111. package/dist/transport/p2p/index.d.ts.map +1 -0
  112. package/dist/transport/p2p/index.js +237 -0
  113. package/dist/transport/p2p/index.js.map +1 -0
  114. package/dist/transport/websocket/index.d.ts +89 -0
  115. package/dist/transport/websocket/index.d.ts.map +1 -0
  116. package/dist/transport/websocket/index.js +498 -0
  117. package/dist/transport/websocket/index.js.map +1 -0
  118. package/dist/transport/websocket/serialize.d.ts +5 -0
  119. package/dist/transport/websocket/serialize.d.ts.map +1 -0
  120. package/dist/transport/websocket/serialize.js +55 -0
  121. package/dist/transport/websocket/serialize.js.map +1 -0
  122. package/dist/types.d.ts +215 -0
  123. package/dist/types.d.ts.map +1 -0
  124. package/dist/types.js +15 -0
  125. package/dist/types.js.map +1 -0
  126. package/dist/x3dh/index.d.ts +120 -0
  127. package/dist/x3dh/index.d.ts.map +1 -0
  128. package/dist/x3dh/index.js +290 -0
  129. package/dist/x3dh/index.js.map +1 -0
  130. package/package.json +59 -0
  131. package/src/browser/index.ts +19 -0
  132. package/src/chaff/index.ts +340 -0
  133. package/src/cluster/index.ts +482 -0
  134. package/src/compliance/index.ts +407 -0
  135. package/src/crypto/index.ts +193 -0
  136. package/src/group/index.ts +719 -0
  137. package/src/index.ts +87 -0
  138. package/src/lz4js.d.ts +58 -0
  139. package/src/namespace/index.ts +336 -0
  140. package/src/node/index.ts +19 -0
  141. package/src/packet/index.ts +326 -0
  142. package/src/permissions/index.ts +405 -0
  143. package/src/persistence/idb-storage.ts +83 -0
  144. package/src/persistence/index.ts +3 -0
  145. package/src/persistence/node-storage.ts +96 -0
  146. package/src/persistence/serialization.ts +75 -0
  147. package/src/persistence/types.ts +33 -0
  148. package/src/ratchet/index.ts +363 -0
  149. package/src/reciprocity/index.ts +371 -0
  150. package/src/relay/index.ts +382 -0
  151. package/src/routing/index.ts +577 -0
  152. package/src/sdk/index.ts +1994 -0
  153. package/src/sybil/index.ts +661 -0
  154. package/src/transport/browser/index.ts +201 -0
  155. package/src/transport/local/index.ts +540 -0
  156. package/src/transport/negotiator/index.ts +397 -0
  157. package/src/transport/node/index.ts +234 -0
  158. package/src/transport/noop/index.ts +22 -0
  159. package/src/transport/p2p/index.ts +345 -0
  160. package/src/transport/websocket/index.ts +660 -0
  161. package/src/transport/websocket/serialize.ts +68 -0
  162. package/src/types.ts +275 -0
  163. package/src/x3dh/index.ts +388 -0
@@ -0,0 +1,27 @@
1
+ import type { StorageBackend } from './types.js';
2
+ /**
3
+ * IndexedDB-backed storage for MeshWhisper. Use this in browsers and PWAs.
4
+ *
5
+ * ```ts
6
+ * import { IDBStorage } from '@meshwhisper/sdk/browser';
7
+ *
8
+ * const mw = await MeshWhisper.init({
9
+ * namespace: 'com.example.app',
10
+ * storage: new IDBStorage('com.example.app'),
11
+ * });
12
+ * ```
13
+ *
14
+ * When `MeshWhisper.init()` is called in a browser without an explicit
15
+ * `storage` option, an `IDBStorage` is created automatically.
16
+ */
17
+ export declare class IDBStorage implements StorageBackend {
18
+ private readonly namespace;
19
+ private dbPromise;
20
+ constructor(namespace?: string);
21
+ private getDB;
22
+ get(key: string): Promise<string | null>;
23
+ set(key: string, value: string): Promise<void>;
24
+ delete(key: string): Promise<void>;
25
+ keys(prefix: string): Promise<string[]>;
26
+ }
27
+ //# sourceMappingURL=idb-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idb-storage.d.ts","sourceRoot":"","sources":["../../src/persistence/idb-storage.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwBjD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,UAAW,YAAW,cAAc;IAGnC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,SAAS,CAAqC;gBAEzB,SAAS,GAAE,MAAkB;IAE1D,OAAO,CAAC,KAAK;IAOP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAM9C"}
@@ -0,0 +1,75 @@
1
+ // ============================================================
2
+ // MeshWhisper SDK — IndexedDB Storage Backend
3
+ // Implements StorageBackend for browsers and PWAs using the
4
+ // native IndexedDB API. No external dependencies.
5
+ // ============================================================
6
+ const DB_NAME = 'meshwhisper';
7
+ const STORE_NAME = 'kv';
8
+ const DB_VERSION = 1;
9
+ function openDB(namespace) {
10
+ return new Promise((resolve, reject) => {
11
+ const req = indexedDB.open(`${DB_NAME}:${namespace}`, DB_VERSION);
12
+ req.onupgradeneeded = () => {
13
+ req.result.createObjectStore(STORE_NAME);
14
+ };
15
+ req.onsuccess = () => resolve(req.result);
16
+ req.onerror = () => reject(req.error);
17
+ });
18
+ }
19
+ function request(req) {
20
+ return new Promise((resolve, reject) => {
21
+ req.onsuccess = () => resolve(req.result);
22
+ req.onerror = () => reject(req.error);
23
+ });
24
+ }
25
+ /**
26
+ * IndexedDB-backed storage for MeshWhisper. Use this in browsers and PWAs.
27
+ *
28
+ * ```ts
29
+ * import { IDBStorage } from '@meshwhisper/sdk/browser';
30
+ *
31
+ * const mw = await MeshWhisper.init({
32
+ * namespace: 'com.example.app',
33
+ * storage: new IDBStorage('com.example.app'),
34
+ * });
35
+ * ```
36
+ *
37
+ * When `MeshWhisper.init()` is called in a browser without an explicit
38
+ * `storage` option, an `IDBStorage` is created automatically.
39
+ */
40
+ export class IDBStorage {
41
+ namespace;
42
+ dbPromise = null;
43
+ constructor(namespace = 'default') {
44
+ this.namespace = namespace;
45
+ }
46
+ getDB() {
47
+ if (!this.dbPromise) {
48
+ this.dbPromise = openDB(this.namespace);
49
+ }
50
+ return this.dbPromise;
51
+ }
52
+ async get(key) {
53
+ const db = await this.getDB();
54
+ const tx = db.transaction(STORE_NAME, 'readonly');
55
+ const val = await request(tx.objectStore(STORE_NAME).get(key));
56
+ return val ?? null;
57
+ }
58
+ async set(key, value) {
59
+ const db = await this.getDB();
60
+ const tx = db.transaction(STORE_NAME, 'readwrite');
61
+ await request(tx.objectStore(STORE_NAME).put(value, key));
62
+ }
63
+ async delete(key) {
64
+ const db = await this.getDB();
65
+ const tx = db.transaction(STORE_NAME, 'readwrite');
66
+ await request(tx.objectStore(STORE_NAME).delete(key));
67
+ }
68
+ async keys(prefix) {
69
+ const db = await this.getDB();
70
+ const tx = db.transaction(STORE_NAME, 'readonly');
71
+ const allKeys = await request(tx.objectStore(STORE_NAME).getAllKeys());
72
+ return allKeys.filter((k) => k.startsWith(prefix));
73
+ }
74
+ }
75
+ //# sourceMappingURL=idb-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idb-storage.js","sourceRoot":"","sources":["../../src/persistence/idb-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { StorageBackend, StoredMessage } from './types.js';
2
+ export { NodeStorage } from './node-storage.js';
3
+ export { serializeRatchetState, deserializeRatchetState } from './serialization.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { NodeStorage } from './node-storage.js';
2
+ export { serializeRatchetState, deserializeRatchetState } from './serialization.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { StorageBackend } from './types.js';
2
+ /**
3
+ * Node.js StorageBackend backed by the local filesystem.
4
+ *
5
+ * Usage:
6
+ * ```ts
7
+ * import { MeshWhisper } from '@meshwhisper/sdk';
8
+ * import { NodeStorage } from '@meshwhisper/sdk/persistence/node';
9
+ *
10
+ * const mw = await MeshWhisper.init({
11
+ * namespace: 'com.example.myapp',
12
+ * storage: new NodeStorage('./data/meshwhisper'),
13
+ * });
14
+ * ```
15
+ *
16
+ * Data layout under `dataDir/`:
17
+ * identity — hex-encoded Ed25519 private key
18
+ * sessions/<id> — serialized RatchetState (JSON)
19
+ * peers/<id> — hex-encoded X25519 public key
20
+ * contacts — JSON array of peer ID strings
21
+ * messages/<id> — JSON array of StoredMessage
22
+ * seen_ids — JSON array of { id, ts } for deduplication
23
+ */
24
+ export declare class NodeStorage implements StorageBackend {
25
+ private readonly root;
26
+ constructor(dataDir: string);
27
+ private resolve;
28
+ get(key: string): Promise<string | null>;
29
+ set(key: string, value: string): Promise<void>;
30
+ delete(key: string): Promise<void>;
31
+ keys(prefix: string): Promise<string[]>;
32
+ }
33
+ //# sourceMappingURL=node-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-storage.d.ts","sourceRoot":"","sources":["../../src/persistence/node-storage.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,OAAO,EAAE,MAAM;IAK3B,OAAO,CAAC,OAAO;IAWT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAmB9C"}
@@ -0,0 +1,90 @@
1
+ // ============================================================
2
+ // MeshWhisper SDK — Node.js StorageBackend
3
+ // Filesystem-based persistence using one file per key.
4
+ // Files are written with mode 0600 (owner read/write only).
5
+ // ============================================================
6
+ import * as fs from 'node:fs';
7
+ import * as path from 'node:path';
8
+ /**
9
+ * Node.js StorageBackend backed by the local filesystem.
10
+ *
11
+ * Usage:
12
+ * ```ts
13
+ * import { MeshWhisper } from '@meshwhisper/sdk';
14
+ * import { NodeStorage } from '@meshwhisper/sdk/persistence/node';
15
+ *
16
+ * const mw = await MeshWhisper.init({
17
+ * namespace: 'com.example.myapp',
18
+ * storage: new NodeStorage('./data/meshwhisper'),
19
+ * });
20
+ * ```
21
+ *
22
+ * Data layout under `dataDir/`:
23
+ * identity — hex-encoded Ed25519 private key
24
+ * sessions/<id> — serialized RatchetState (JSON)
25
+ * peers/<id> — hex-encoded X25519 public key
26
+ * contacts — JSON array of peer ID strings
27
+ * messages/<id> — JSON array of StoredMessage
28
+ * seen_ids — JSON array of { id, ts } for deduplication
29
+ */
30
+ export class NodeStorage {
31
+ root;
32
+ constructor(dataDir) {
33
+ this.root = path.resolve(dataDir);
34
+ fs.mkdirSync(this.root, { recursive: true });
35
+ }
36
+ resolve(key) {
37
+ // Sanitize: only allow alphanumeric, underscore, hyphen, forward slash, dot
38
+ const safe = key.replace(/[^a-zA-Z0-9/_.-]/g, '_');
39
+ const abs = path.join(this.root, safe);
40
+ // Guard against path traversal
41
+ if (!abs.startsWith(this.root + path.sep) && abs !== this.root) {
42
+ throw new Error(`Storage key escapes data directory: ${key}`);
43
+ }
44
+ return abs;
45
+ }
46
+ async get(key) {
47
+ try {
48
+ return fs.readFileSync(this.resolve(key), 'utf-8');
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ async set(key, value) {
55
+ const filePath = this.resolve(key);
56
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
57
+ // Write atomically: write to a temp file, then rename
58
+ const tmp = `${filePath}.tmp`;
59
+ fs.writeFileSync(tmp, value, { encoding: 'utf-8', mode: 0o600 });
60
+ fs.renameSync(tmp, filePath);
61
+ }
62
+ async delete(key) {
63
+ try {
64
+ fs.unlinkSync(this.resolve(key));
65
+ }
66
+ catch {
67
+ // File doesn't exist — fine
68
+ }
69
+ }
70
+ async keys(prefix) {
71
+ // Walk the directory corresponding to the prefix
72
+ const prefixPath = this.resolve(prefix);
73
+ // The prefix may itself be a directory (e.g. "sessions/") or a path fragment
74
+ const dir = prefix.endsWith('/') ? prefixPath : path.dirname(prefixPath);
75
+ const base = prefix.endsWith('/') ? '' : path.basename(prefixPath);
76
+ try {
77
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
78
+ return entries
79
+ .filter((e) => e.isFile() && e.name.startsWith(base))
80
+ .map((e) => {
81
+ const rel = path.relative(this.root, path.join(dir, e.name));
82
+ return rel.replace(/\\/g, '/'); // normalise on Windows
83
+ });
84
+ }
85
+ catch {
86
+ return [];
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=node-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-storage.js","sourceRoot":"","sources":["../../src/persistence/node-storage.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,2CAA2C;AAC3C,uDAAuD;AACvD,4DAA4D;AAC5D,+DAA+D;AAE/D,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,WAAW;IACL,IAAI,CAAS;IAE9B,YAAY,OAAe;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAEO,OAAO,CAAC,GAAW;QACzB,4EAA4E;QAC5E,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,+BAA+B;QAC/B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,sDAAsD;QACtD,MAAM,GAAG,GAAG,GAAG,QAAQ,MAAM,CAAC;QAC9B,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,iDAAiD;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxC,6EAA6E;QAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAEnE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,OAAO,OAAO;iBACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;iBACpD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7D,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,uBAAuB;YACzD,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { RatchetState } from '../ratchet/index.js';
2
+ export declare function serializeRatchetState(state: RatchetState): string;
3
+ export declare function deserializeRatchetState(json: string): RatchetState;
4
+ //# sourceMappingURL=serialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/persistence/serialization.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA8BxD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAiBjE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAmBlE"}
@@ -0,0 +1,49 @@
1
+ // ============================================================
2
+ // MeshWhisper SDK — RatchetState serialization
3
+ // Converts between the in-memory RatchetState and a JSON string
4
+ // suitable for storage. All Uint8Array fields are hex-encoded.
5
+ // ============================================================
6
+ // ---- Helpers ----
7
+ function toHex(bytes) {
8
+ return Buffer.from(bytes).toString('hex');
9
+ }
10
+ function fromHex(hex) {
11
+ return new Uint8Array(Buffer.from(hex, 'hex'));
12
+ }
13
+ // ---- Public API ----
14
+ export function serializeRatchetState(state) {
15
+ const obj = {
16
+ v: 1,
17
+ dhSendingPriv: toHex(state.dhSending.privateKey),
18
+ dhSendingPub: toHex(state.dhSending.publicKey),
19
+ dhReceiving: state.dhReceiving ? toHex(state.dhReceiving) : null,
20
+ rootKey: toHex(state.rootKey),
21
+ sendingChainKey: state.sendingChainKey ? toHex(state.sendingChainKey) : null,
22
+ receivingChainKey: state.receivingChainKey ? toHex(state.receivingChainKey) : null,
23
+ sendMessageNumber: state.sendMessageNumber,
24
+ receiveMessageNumber: state.receiveMessageNumber,
25
+ previousSendingChainLength: state.previousSendingChainLength,
26
+ skippedMessageKeys: Object.fromEntries([...state.skippedMessageKeys.entries()].map(([k, v]) => [k, toHex(v)])),
27
+ };
28
+ return JSON.stringify(obj);
29
+ }
30
+ export function deserializeRatchetState(json) {
31
+ const obj = JSON.parse(json);
32
+ if (obj.v !== 1)
33
+ throw new Error(`Unknown RatchetState version: ${obj.v}`);
34
+ return {
35
+ dhSending: {
36
+ privateKey: fromHex(obj.dhSendingPriv),
37
+ publicKey: fromHex(obj.dhSendingPub),
38
+ },
39
+ dhReceiving: obj.dhReceiving ? fromHex(obj.dhReceiving) : null,
40
+ rootKey: fromHex(obj.rootKey),
41
+ sendingChainKey: obj.sendingChainKey ? fromHex(obj.sendingChainKey) : null,
42
+ receivingChainKey: obj.receivingChainKey ? fromHex(obj.receivingChainKey) : null,
43
+ sendMessageNumber: obj.sendMessageNumber,
44
+ receiveMessageNumber: obj.receiveMessageNumber,
45
+ previousSendingChainLength: obj.previousSendingChainLength,
46
+ skippedMessageKeys: new Map(Object.entries(obj.skippedMessageKeys).map(([k, v]) => [k, fromHex(v)])),
47
+ };
48
+ }
49
+ //# sourceMappingURL=serialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../src/persistence/serialization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Minimal key-value storage interface. Implement this for your platform:
3
+ * - Node.js: NodeStorage (provided)
4
+ * - React Native: AsyncStorage or SQLCipher wrapper
5
+ * - Browser: IndexedDB wrapper
6
+ *
7
+ * Values are always JSON strings. Keys use forward-slash namespacing:
8
+ * identity, sessions/<peerId>, peers/<peerId>, contacts, messages/<peerId>, seen_ids
9
+ */
10
+ export interface StorageBackend {
11
+ get(key: string): Promise<string | null>;
12
+ set(key: string, value: string): Promise<void>;
13
+ delete(key: string): Promise<void>;
14
+ /** Returns all stored keys that start with the given prefix. */
15
+ keys(prefix: string): Promise<string[]>;
16
+ }
17
+ export interface StoredMessage {
18
+ id: string;
19
+ /** The peer ID of the other party in this conversation. */
20
+ conversationId: string;
21
+ senderId: string;
22
+ recipientId: string;
23
+ /** Message payload as a plain number array (JSON-serialisable Uint8Array). */
24
+ payload: number[];
25
+ timestamp: number;
26
+ direction: 'inbound' | 'outbound';
27
+ status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';
28
+ }
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/persistence/types.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,gEAAgE;IAChE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC9D"}
@@ -0,0 +1,5 @@
1
+ // ============================================================
2
+ // MeshWhisper SDK — Persistence Types
3
+ // ============================================================
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/persistence/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,sCAAsC;AACtC,+DAA+D"}
@@ -0,0 +1,80 @@
1
+ import type { KeyPair } from '../types.js';
2
+ export interface RatchetHeader {
3
+ dhPublicKey: Uint8Array;
4
+ previousChainLength: number;
5
+ messageNumber: number;
6
+ }
7
+ export interface RatchetState {
8
+ dhSending: KeyPair;
9
+ dhReceiving: Uint8Array | null;
10
+ rootKey: Uint8Array;
11
+ sendingChainKey: Uint8Array | null;
12
+ receivingChainKey: Uint8Array | null;
13
+ sendMessageNumber: number;
14
+ receiveMessageNumber: number;
15
+ previousSendingChainLength: number;
16
+ skippedMessageKeys: Map<string, Uint8Array>;
17
+ }
18
+ /**
19
+ * KDF root step: derive a new root key and chain key from a root key and DH output.
20
+ * output = BLAKE3(rootKey || dhOutput, dkLen=64), split into two 32-byte halves.
21
+ */
22
+ export declare function kdfRootStep(rootKey: Uint8Array, dhOutput: Uint8Array): {
23
+ newRootKey: Uint8Array;
24
+ chainKey: Uint8Array;
25
+ };
26
+ /**
27
+ * KDF chain step: derive a message key and the next chain key from the current chain key.
28
+ * messageKey = BLAKE3(chainKey || 0x01)
29
+ * newChainKey = BLAKE3(chainKey || 0x02)
30
+ */
31
+ export declare function kdfChainStep(chainKey: Uint8Array): {
32
+ newChainKey: Uint8Array;
33
+ messageKey: Uint8Array;
34
+ };
35
+ /**
36
+ * Perform a DH ratchet step: compute new root key / receiving chain key from the
37
+ * remote's new public key, then generate a new sending keypair and compute the
38
+ * sending chain key.
39
+ */
40
+ export declare function dhRatchetStep(state: RatchetState, remotePublicKey: Uint8Array): RatchetState;
41
+ /**
42
+ * Initialize the ratchet state as the sender (initiator) after X3DH.
43
+ *
44
+ * The sender knows the shared secret and the remote's signed pre-key (or ratchet public key).
45
+ * It performs the first DH ratchet step immediately so it can begin sending.
46
+ */
47
+ export declare function initSender(sharedSecret: Uint8Array, remotePublicKey: Uint8Array): RatchetState;
48
+ /**
49
+ * Initialize the ratchet state as the receiver (responder) after X3DH.
50
+ *
51
+ * The receiver provides its own keypair (the signed pre-key used in X3DH) and
52
+ * the shared secret. It waits for the first message to complete the DH ratchet.
53
+ */
54
+ export declare function initReceiver(sharedSecret: Uint8Array, localKeyPair: KeyPair): RatchetState;
55
+ /**
56
+ * Encrypt a plaintext message, advancing the sending chain.
57
+ *
58
+ * Returns the updated state, a header (to be sent alongside the ciphertext), and
59
+ * the AES-256-GCM ciphertext.
60
+ */
61
+ export declare function ratchetEncrypt(state: RatchetState, plaintext: Uint8Array): {
62
+ state: RatchetState;
63
+ header: RatchetHeader;
64
+ ciphertext: Uint8Array;
65
+ };
66
+ /**
67
+ * Decrypt a received message, handling DH ratchet steps and out-of-order delivery.
68
+ *
69
+ * 1. Try skipped message keys first (for out-of-order messages).
70
+ * 2. If the header's DH public key differs from our stored remote key, perform
71
+ * a DH ratchet step (advancing the root chain).
72
+ * 3. Advance the receiving chain to the header's message number, storing any
73
+ * skipped message keys along the way.
74
+ * 4. Decrypt with the derived message key.
75
+ */
76
+ export declare function ratchetDecrypt(state: RatchetState, header: RatchetHeader, ciphertext: Uint8Array): {
77
+ state: RatchetState;
78
+ plaintext: Uint8Array;
79
+ };
80
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ratchet/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAU3C,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,UAAU,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,UAAU,CAAC;IACpB,eAAe,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,iBAAiB,EAAE,UAAU,GAAG,IAAI,CAAC;IACrC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,0BAA0B,EAAE,MAAM,CAAC;IACnC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAC7C;AAkBD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,UAAU,GACnB;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAA;CAAE,CAOlD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,UAAU,GACnB;IAAE,WAAW,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAIrD;AAsDD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,UAAU,GAC1B,YAAY,CA6Bd;AA8BD;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,YAAY,EAAE,UAAU,EACxB,eAAe,EAAE,UAAU,GAC1B,YAAY,CAgBd;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,UAAU,EACxB,YAAY,EAAE,OAAO,GACpB,YAAY,CAYd;AAID;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,UAAU,GACpB;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAsBxE;AAID;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,UAAU,GACrB;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,CAgDhD"}