@peers-app/peers-sdk 0.14.0 → 0.15.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 (210) hide show
  1. package/dist/context/data-context.d.ts +4 -4
  2. package/dist/context/data-context.js +1 -1
  3. package/dist/context/index.d.ts +3 -3
  4. package/dist/context/index.js +4 -0
  5. package/dist/context/user-context-singleton.js +13 -14
  6. package/dist/context/user-context.d.ts +4 -4
  7. package/dist/context/user-context.js +48 -31
  8. package/dist/data/assistants.d.ts +1 -1
  9. package/dist/data/assistants.js +35 -24
  10. package/dist/data/change-tracking.d.ts +8 -8
  11. package/dist/data/change-tracking.js +45 -39
  12. package/dist/data/channels.js +5 -5
  13. package/dist/data/data-locks.d.ts +2 -2
  14. package/dist/data/data-locks.js +21 -23
  15. package/dist/data/data-locks.test.js +73 -75
  16. package/dist/data/device-sync-info.d.ts +1 -1
  17. package/dist/data/device-sync-info.js +4 -4
  18. package/dist/data/devices.d.ts +1 -1
  19. package/dist/data/devices.js +9 -12
  20. package/dist/data/embeddings.js +14 -11
  21. package/dist/data/files/file-read-stream.d.ts +2 -2
  22. package/dist/data/files/file-read-stream.js +23 -14
  23. package/dist/data/files/file-write-stream.d.ts +2 -2
  24. package/dist/data/files/file-write-stream.js +8 -8
  25. package/dist/data/files/file.types.d.ts +2 -2
  26. package/dist/data/files/file.types.js +17 -11
  27. package/dist/data/files/files.d.ts +6 -6
  28. package/dist/data/files/files.js +17 -19
  29. package/dist/data/files/files.test.js +213 -214
  30. package/dist/data/files/index.d.ts +4 -4
  31. package/dist/data/files/index.js +4 -4
  32. package/dist/data/group-member-roles.js +2 -2
  33. package/dist/data/group-members.d.ts +5 -5
  34. package/dist/data/group-members.js +27 -18
  35. package/dist/data/group-members.test.js +73 -73
  36. package/dist/data/group-permissions.d.ts +3 -3
  37. package/dist/data/group-permissions.js +13 -11
  38. package/dist/data/group-share.d.ts +2 -2
  39. package/dist/data/group-share.js +29 -24
  40. package/dist/data/groups.d.ts +4 -4
  41. package/dist/data/groups.js +27 -19
  42. package/dist/data/groups.test.js +44 -44
  43. package/dist/data/index.d.ts +6 -6
  44. package/dist/data/index.js +6 -6
  45. package/dist/data/knowledge/peer-types.js +9 -9
  46. package/dist/data/messages.d.ts +5 -5
  47. package/dist/data/messages.js +43 -30
  48. package/dist/data/orm/client-proxy.data-source.d.ts +4 -4
  49. package/dist/data/orm/client-proxy.data-source.js +10 -12
  50. package/dist/data/orm/cursor.d.ts +1 -1
  51. package/dist/data/orm/cursor.js +2 -2
  52. package/dist/data/orm/cursor.test.js +92 -93
  53. package/dist/data/orm/data-query.d.ts +3 -3
  54. package/dist/data/orm/data-query.js +24 -18
  55. package/dist/data/orm/data-query.mongo.d.ts +1 -1
  56. package/dist/data/orm/data-query.mongo.js +49 -51
  57. package/dist/data/orm/data-query.mongo.test.js +173 -204
  58. package/dist/data/orm/data-query.sqlite.d.ts +1 -1
  59. package/dist/data/orm/data-query.sqlite.js +84 -73
  60. package/dist/data/orm/data-query.sqlite.test.js +164 -176
  61. package/dist/data/orm/data-query.test.js +216 -224
  62. package/dist/data/orm/decorators.js +3 -3
  63. package/dist/data/orm/dependency-injection.test.js +53 -56
  64. package/dist/data/orm/doc.d.ts +4 -4
  65. package/dist/data/orm/doc.js +17 -21
  66. package/dist/data/orm/event-registry.d.ts +1 -1
  67. package/dist/data/orm/event-registry.test.js +16 -16
  68. package/dist/data/orm/factory.d.ts +2 -2
  69. package/dist/data/orm/factory.js +33 -33
  70. package/dist/data/orm/index.d.ts +10 -10
  71. package/dist/data/orm/index.js +10 -10
  72. package/dist/data/orm/multi-cursors.d.ts +1 -1
  73. package/dist/data/orm/multi-cursors.js +6 -6
  74. package/dist/data/orm/multi-cursors.test.js +152 -144
  75. package/dist/data/orm/sql.data-source.d.ts +7 -7
  76. package/dist/data/orm/sql.data-source.js +88 -93
  77. package/dist/data/orm/sql.data-source.test.js +109 -101
  78. package/dist/data/orm/subscribable.data-source.d.ts +4 -4
  79. package/dist/data/orm/subscribable.data-source.js +5 -5
  80. package/dist/data/orm/table-container-events.test.js +34 -26
  81. package/dist/data/orm/table-container.d.ts +6 -6
  82. package/dist/data/orm/table-container.js +33 -21
  83. package/dist/data/orm/table-container.test.js +64 -53
  84. package/dist/data/orm/table-definitions.system.d.ts +3 -3
  85. package/dist/data/orm/table-definitions.system.js +3 -3
  86. package/dist/data/orm/table-definitions.type.d.ts +5 -5
  87. package/dist/data/orm/table-dependencies.d.ts +2 -2
  88. package/dist/data/orm/table.d.ts +5 -5
  89. package/dist/data/orm/table.event-source.test.js +105 -115
  90. package/dist/data/orm/table.js +35 -34
  91. package/dist/data/orm/types.d.ts +3 -3
  92. package/dist/data/orm/types.js +26 -25
  93. package/dist/data/orm/types.test.js +166 -92
  94. package/dist/data/package-permissions.d.ts +1 -1
  95. package/dist/data/package-permissions.js +2 -2
  96. package/dist/data/package-version-permissions.d.ts +1 -1
  97. package/dist/data/package-version-permissions.js +2 -2
  98. package/dist/data/package-versions.d.ts +9 -9
  99. package/dist/data/package-versions.js +47 -33
  100. package/dist/data/packages.d.ts +2 -2
  101. package/dist/data/packages.js +36 -18
  102. package/dist/data/packages.utils.d.ts +2 -2
  103. package/dist/data/packages.utils.js +4 -4
  104. package/dist/data/persistent-vars.d.ts +15 -15
  105. package/dist/data/persistent-vars.js +165 -154
  106. package/dist/data/table-definitions-table.d.ts +5 -5
  107. package/dist/data/table-definitions-table.js +13 -12
  108. package/dist/data/tool-tests.js +6 -6
  109. package/dist/data/tools.js +29 -19
  110. package/dist/data/user-permissions.d.ts +1 -1
  111. package/dist/data/user-permissions.js +5 -5
  112. package/dist/data/user-permissions.test.js +90 -88
  113. package/dist/data/user-trust-levels.js +10 -10
  114. package/dist/data/users.d.ts +4 -4
  115. package/dist/data/users.js +16 -15
  116. package/dist/data/voice-messages.d.ts +2 -2
  117. package/dist/data/voice-messages.js +13 -13
  118. package/dist/data/welcome-modal.pvar.js +3 -1
  119. package/dist/data/workflow-logs.js +26 -18
  120. package/dist/data/workflow-runs.d.ts +6 -6
  121. package/dist/data/workflow-runs.js +70 -44
  122. package/dist/data/workflows.d.ts +2 -2
  123. package/dist/data/workflows.js +7 -9
  124. package/dist/device/binary-peer-connection-v2.d.ts +7 -7
  125. package/dist/device/binary-peer-connection-v2.js +32 -28
  126. package/dist/device/binary-peer-connection-v2.test.js +80 -67
  127. package/dist/device/binary-peer-connection.d.ts +7 -7
  128. package/dist/device/binary-peer-connection.js +29 -28
  129. package/dist/device/binary-peer-connection.test.js +35 -31
  130. package/dist/device/connection.d.ts +5 -5
  131. package/dist/device/connection.js +59 -48
  132. package/dist/device/connection.test.js +74 -68
  133. package/dist/device/device-election.d.ts +2 -2
  134. package/dist/device/device-election.js +25 -20
  135. package/dist/device/device-election.test.js +35 -36
  136. package/dist/device/device.d.ts +2 -2
  137. package/dist/device/device.js +10 -4
  138. package/dist/device/device.test.js +16 -17
  139. package/dist/device/get-trust-level-fn.d.ts +2 -2
  140. package/dist/device/get-trust-level-fn.js +22 -11
  141. package/dist/device/get-trust-level-fn.test.js +58 -58
  142. package/dist/device/socket-io-binary-peer.d.ts +1 -1
  143. package/dist/device/socket-io-binary-peer.js +16 -13
  144. package/dist/device/socket.type.d.ts +2 -2
  145. package/dist/device/streamed-socket.d.ts +2 -2
  146. package/dist/device/streamed-socket.js +8 -8
  147. package/dist/device/streamed-socket.test.js +40 -40
  148. package/dist/device/tx-encoding.test.js +77 -77
  149. package/dist/events.d.ts +1 -1
  150. package/dist/events.js +5 -2
  151. package/dist/group-invite/group-invite.js +110 -19
  152. package/dist/group-invite/group-invite.pvars.d.ts +2 -2
  153. package/dist/group-invite/group-invite.pvars.js +21 -13
  154. package/dist/group-invite/group-invite.types.d.ts +1 -1
  155. package/dist/group-invite/index.d.ts +3 -3
  156. package/dist/group-invite/index.js +1 -1
  157. package/dist/index.d.ts +25 -24
  158. package/dist/index.js +30 -25
  159. package/dist/keys.d.ts +3 -3
  160. package/dist/keys.js +31 -30
  161. package/dist/keys.test.js +69 -61
  162. package/dist/logging/console-logger.d.ts +1 -1
  163. package/dist/logging/console-logger.js +35 -40
  164. package/dist/logging/console-logger.test.js +115 -115
  165. package/dist/logging/console-logs.table.d.ts +3 -3
  166. package/dist/logging/console-logs.table.js +28 -23
  167. package/dist/mentions.js +16 -12
  168. package/dist/observable.d.ts +2 -2
  169. package/dist/observable.js +15 -9
  170. package/dist/observable.test.js +47 -47
  171. package/dist/package-loader/get-require.js +3 -4
  172. package/dist/package-loader/package-loader.d.ts +2 -2
  173. package/dist/package-loader/package-loader.js +52 -34
  174. package/dist/peers-ui/peers-ui.d.ts +2 -2
  175. package/dist/peers-ui/peers-ui.js +2 -4
  176. package/dist/peers-ui/peers-ui.types.d.ts +3 -3
  177. package/dist/peers-ui/peers-ui.types.js +0 -1
  178. package/dist/rpc-types.d.ts +61 -59
  179. package/dist/rpc-types.js +61 -55
  180. package/dist/serial-json.d.ts +1 -1
  181. package/dist/serial-json.js +50 -43
  182. package/dist/serial-json.test.js +22 -22
  183. package/dist/system-ids.js +8 -8
  184. package/dist/tools/index.d.ts +1 -1
  185. package/dist/tools/tools-factory.d.ts +1 -1
  186. package/dist/tools/tools-factory.js +2 -2
  187. package/dist/types/assistant-runner-args.d.ts +3 -3
  188. package/dist/types/peer-device.d.ts +1 -1
  189. package/dist/types/peers-package.d.ts +3 -3
  190. package/dist/types/workflow-logger.d.ts +1 -1
  191. package/dist/types/workflow-run-context.d.ts +4 -4
  192. package/dist/types/workflow.d.ts +4 -4
  193. package/dist/types/workflow.js +27 -14
  194. package/dist/types/zod-types.d.ts +2 -1
  195. package/dist/types/zod-types.js +9 -3
  196. package/dist/user-connect/connection-code.d.ts +1 -1
  197. package/dist/user-connect/connection-code.js +7 -7
  198. package/dist/user-connect/connection-code.test.js +106 -106
  199. package/dist/user-connect/index.d.ts +3 -3
  200. package/dist/user-connect/index.js +1 -1
  201. package/dist/user-connect/user-connect.pvars.js +13 -11
  202. package/dist/user-connect/user-connect.types.d.ts +3 -3
  203. package/dist/users.query.d.ts +2 -2
  204. package/dist/users.query.js +40 -30
  205. package/dist/utils.d.ts +2 -2
  206. package/dist/utils.js +34 -32
  207. package/dist/utils.test.js +12 -8
  208. package/dist/workflow-log-formatter.d.ts +1 -1
  209. package/dist/workflow-log-formatter.js +17 -18
  210. package/package.json +14 -8
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const keys_1 = require("../keys");
4
- const device_1 = require("./device");
5
4
  const utils_1 = require("../utils");
6
5
  const binary_peer_connection_v2_1 = require("./binary-peer-connection-v2");
6
+ const device_1 = require("./device");
7
7
  // Mock binary peer for testing - simulates WebRTC peers
8
8
  class MockBinaryPeer {
9
9
  dataHandlers = [];
@@ -12,27 +12,30 @@ class MockBinaryPeer {
12
12
  otherPeer;
13
13
  _bufferedAmount = 0;
14
14
  on(event, handler) {
15
- if (event === 'data') {
15
+ if (event === "data") {
16
16
  this.dataHandlers.push(handler);
17
17
  }
18
- else if (event === 'close') {
18
+ else if (event === "close") {
19
19
  this.closeHandlers.push(handler);
20
20
  }
21
- else if (event === 'drain') {
21
+ else if (event === "drain") {
22
22
  this.drainHandlers.push(handler);
23
23
  }
24
24
  }
25
25
  send(data) {
26
26
  if (this.otherPeer) {
27
- const bytes = typeof data === 'string'
27
+ const bytes = typeof data === "string"
28
28
  ? Buffer.from(data)
29
29
  : Buffer.isBuffer(data)
30
30
  ? data
31
31
  : Buffer.from(data);
32
32
  // Simulate async delivery
33
33
  setImmediate(() => {
34
- for (const handler of this.otherPeer.dataHandlers) {
35
- handler(bytes);
34
+ const handlers = this.otherPeer?.dataHandlers;
35
+ if (handlers) {
36
+ for (const handler of handlers) {
37
+ handler(bytes);
38
+ }
36
39
  }
37
40
  });
38
41
  }
@@ -57,29 +60,29 @@ async function getMockPeerPair() {
57
60
  await (0, utils_1.sleep)(10);
58
61
  return { iPeer, rPeer };
59
62
  }
60
- describe('binary-peer-connection-v2', () => {
61
- describe('MockBinaryPeer', () => {
62
- it('should exchange data between mock peers', async () => {
63
+ describe("binary-peer-connection-v2", () => {
64
+ describe("MockBinaryPeer", () => {
65
+ it("should exchange data between mock peers", async () => {
63
66
  const { iPeer, rPeer } = await getMockPeerPair();
64
- let iPeerDataReceived = '';
65
- iPeer.on('data', (data) => {
67
+ let iPeerDataReceived = "";
68
+ iPeer.on("data", (data) => {
66
69
  iPeerDataReceived += data.toString();
67
70
  });
68
- let rPeerDataReceived = '';
69
- rPeer.on('data', (data) => {
71
+ let rPeerDataReceived = "";
72
+ rPeer.on("data", (data) => {
70
73
  rPeerDataReceived += data.toString();
71
74
  });
72
- rPeer.send('rPeer');
73
- iPeer.send('iPeer');
75
+ rPeer.send("rPeer");
76
+ iPeer.send("iPeer");
74
77
  await (0, utils_1.sleep)(50);
75
- expect(iPeerDataReceived).toBe('rPeer');
76
- expect(rPeerDataReceived).toBe('iPeer');
78
+ expect(iPeerDataReceived).toBe("rPeer");
79
+ expect(rPeerDataReceived).toBe("iPeer");
77
80
  iPeer.destroy();
78
81
  rPeer.destroy();
79
82
  });
80
83
  });
81
- describe('createBinaryPeerSocket RPC', () => {
82
- it('should do RPC emit/on round-trip', async () => {
84
+ describe("createBinaryPeerSocket RPC", () => {
85
+ it("should do RPC emit/on round-trip", async () => {
83
86
  const { iPeer, rPeer } = await getMockPeerPair();
84
87
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "ws");
85
88
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "ws");
@@ -98,7 +101,7 @@ describe('binary-peer-connection-v2', () => {
98
101
  iPeer.destroy();
99
102
  rPeer.destroy();
100
103
  });
101
- it('should handle RPC errors', async () => {
104
+ it("should handle RPC errors", async () => {
102
105
  const { iPeer, rPeer } = await getMockPeerPair();
103
106
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "ws");
104
107
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "ws");
@@ -114,14 +117,18 @@ describe('binary-peer-connection-v2', () => {
114
117
  iPeer.destroy();
115
118
  rPeer.destroy();
116
119
  });
117
- it('should handle Uint8Array args without txEncode', async () => {
120
+ it("should handle Uint8Array args without txEncode", async () => {
118
121
  const { iPeer, rPeer } = await getMockPeerPair();
119
122
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "ws");
120
123
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "ws");
121
124
  const testPayload = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
122
125
  socketB.on("binary-event", (args, callback) => {
123
126
  const received = args instanceof Uint8Array ? args : new Uint8Array(args);
124
- callback(null, { size: received.length, first: received[0], last: received[received.length - 1] });
127
+ callback(null, {
128
+ size: received.length,
129
+ first: received[0],
130
+ last: received[received.length - 1],
131
+ });
125
132
  });
126
133
  const result = await new Promise((resolve, reject) => {
127
134
  socketA.emit("binary-event", testPayload, (err, res) => {
@@ -137,7 +144,7 @@ describe('binary-peer-connection-v2', () => {
137
144
  iPeer.destroy();
138
145
  rPeer.destroy();
139
146
  });
140
- it('should handle Uint8Array response without txEncode', async () => {
147
+ it("should handle Uint8Array response without txEncode", async () => {
141
148
  const { iPeer, rPeer } = await getMockPeerPair();
142
149
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "ws");
143
150
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "ws");
@@ -159,7 +166,7 @@ describe('binary-peer-connection-v2', () => {
159
166
  iPeer.destroy();
160
167
  rPeer.destroy();
161
168
  });
162
- it('should chunk large RPC messages (>maxFramePayload)', async () => {
169
+ it("should chunk large RPC messages (>maxFramePayload)", async () => {
163
170
  const { iPeer, rPeer } = await getMockPeerPair();
164
171
  // Use 'wrtc' to get 64KB maxFramePayload
165
172
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "wrtc");
@@ -186,7 +193,7 @@ describe('binary-peer-connection-v2', () => {
186
193
  iPeer.destroy();
187
194
  rPeer.destroy();
188
195
  });
189
- it('should handle large RPC response (>maxFramePayload)', async () => {
196
+ it("should handle large RPC response (>maxFramePayload)", async () => {
190
197
  const { iPeer, rPeer } = await getMockPeerPair();
191
198
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "wrtc");
192
199
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "wrtc");
@@ -212,7 +219,7 @@ describe('binary-peer-connection-v2', () => {
212
219
  iPeer.destroy();
213
220
  rPeer.destroy();
214
221
  });
215
- it('should handle concurrent RPC calls correctly', async () => {
222
+ it("should handle concurrent RPC calls correctly", async () => {
216
223
  const { iPeer, rPeer } = await getMockPeerPair();
217
224
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "ws");
218
225
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "ws");
@@ -232,32 +239,32 @@ describe('binary-peer-connection-v2', () => {
232
239
  }
233
240
  const results = await Promise.all(promises);
234
241
  for (let i = 0; i < 10; i++) {
235
- const r = results.find(r => r.id === i);
242
+ const r = results.find((r) => r.id === i);
236
243
  expect(r).toBeDefined();
237
- expect(r.value).toBe(i * 10 * 2);
244
+ expect(r?.value).toBe(i * 10 * 2);
238
245
  }
239
246
  iPeer.destroy();
240
247
  rPeer.destroy();
241
248
  });
242
249
  });
243
- describe('createBinaryPeerSocket raw bytes (stream mode)', () => {
244
- it('should send/receive raw bytes', async () => {
250
+ describe("createBinaryPeerSocket raw bytes (stream mode)", () => {
251
+ it("should send/receive raw bytes", async () => {
245
252
  const { iPeer, rPeer } = await getMockPeerPair();
246
253
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "ws");
247
254
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "ws");
248
255
  const testData = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
249
256
  const received = new Promise((resolve) => {
250
- socketB.onRawBytes("test-stream", (data) => {
257
+ socketB.onRawBytes?.("test-stream", (data) => {
251
258
  resolve(data);
252
259
  });
253
260
  });
254
- await socketA.sendRawBytes("test-stream", testData);
261
+ await socketA.sendRawBytes?.("test-stream", testData);
255
262
  const result = await received;
256
263
  expect(Buffer.from(result)).toEqual(Buffer.from(testData));
257
264
  iPeer.destroy();
258
265
  rPeer.destroy();
259
266
  });
260
- it('should multiplex multiple streams', async () => {
267
+ it("should multiplex multiple streams", async () => {
261
268
  const { iPeer, rPeer } = await getMockPeerPair();
262
269
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "ws");
263
270
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "ws");
@@ -265,18 +272,18 @@ describe('binary-peer-connection-v2', () => {
265
272
  "stream-alpha": [],
266
273
  "stream-beta": [],
267
274
  };
268
- socketB.onRawBytes("stream-alpha", (data) => results["stream-alpha"].push(new Uint8Array(data)));
269
- socketB.onRawBytes("stream-beta", (data) => results["stream-beta"].push(new Uint8Array(data)));
270
- await socketA.sendRawBytes("stream-alpha", new Uint8Array([10, 20, 30]));
271
- await socketA.sendRawBytes("stream-beta", new Uint8Array([40, 50, 60]));
272
- await socketA.sendRawBytes("stream-alpha", new Uint8Array([70, 80, 90]));
275
+ socketB.onRawBytes?.("stream-alpha", (data) => results["stream-alpha"].push(new Uint8Array(data)));
276
+ socketB.onRawBytes?.("stream-beta", (data) => results["stream-beta"].push(new Uint8Array(data)));
277
+ await socketA.sendRawBytes?.("stream-alpha", new Uint8Array([10, 20, 30]));
278
+ await socketA.sendRawBytes?.("stream-beta", new Uint8Array([40, 50, 60]));
279
+ await socketA.sendRawBytes?.("stream-alpha", new Uint8Array([70, 80, 90]));
273
280
  await (0, utils_1.sleep)(100);
274
281
  expect(results["stream-alpha"].length).toBe(2);
275
282
  expect(results["stream-beta"].length).toBe(1);
276
283
  iPeer.destroy();
277
284
  rPeer.destroy();
278
285
  });
279
- it('should chunk large stream data (>maxFramePayload)', async () => {
286
+ it("should chunk large stream data (>maxFramePayload)", async () => {
280
287
  const { iPeer, rPeer } = await getMockPeerPair();
281
288
  // Use wrtc for 64KB max frame size
282
289
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "wrtc");
@@ -286,11 +293,11 @@ describe('binary-peer-connection-v2', () => {
286
293
  largeData[i] = i % 256;
287
294
  }
288
295
  const received = new Promise((resolve) => {
289
- socketB.onRawBytes("large-stream", (data) => {
296
+ socketB.onRawBytes?.("large-stream", (data) => {
290
297
  resolve(data);
291
298
  });
292
299
  });
293
- await socketA.sendRawBytes("large-stream", largeData);
300
+ await socketA.sendRawBytes?.("large-stream", largeData);
294
301
  const result = await received;
295
302
  expect(result.length).toBe(largeData.length);
296
303
  // Verify content
@@ -301,25 +308,27 @@ describe('binary-peer-connection-v2', () => {
301
308
  iPeer.destroy();
302
309
  rPeer.destroy();
303
310
  });
304
- it('should remove raw bytes handlers', async () => {
311
+ it("should remove raw bytes handlers", async () => {
305
312
  const { iPeer, rPeer } = await getMockPeerPair();
306
313
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "ws");
307
314
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "ws");
308
315
  let callCount = 0;
309
- socketB.onRawBytes("temp-stream", () => { callCount++; });
310
- await socketA.sendRawBytes("temp-stream", new Uint8Array([1]));
316
+ socketB.onRawBytes?.("temp-stream", () => {
317
+ callCount++;
318
+ });
319
+ await socketA.sendRawBytes?.("temp-stream", new Uint8Array([1]));
311
320
  await (0, utils_1.sleep)(50);
312
321
  expect(callCount).toBe(1);
313
- socketB.removeRawBytesHandler("temp-stream");
314
- await socketA.sendRawBytes("temp-stream", new Uint8Array([2]));
322
+ socketB.removeRawBytesHandler?.("temp-stream");
323
+ await socketA.sendRawBytes?.("temp-stream", new Uint8Array([2]));
315
324
  await (0, utils_1.sleep)(50);
316
325
  expect(callCount).toBe(1); // Should not have increased
317
326
  iPeer.destroy();
318
327
  rPeer.destroy();
319
328
  });
320
329
  });
321
- describe('stats tracking', () => {
322
- it('should track bytes sent and received', async () => {
330
+ describe("stats tracking", () => {
331
+ it("should track bytes sent and received", async () => {
323
332
  const { iPeer, rPeer } = await getMockPeerPair();
324
333
  const socketA = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("a", iPeer, "ws");
325
334
  const socketB = (0, binary_peer_connection_v2_1.createBinaryPeerSocket)("b", rPeer, "ws");
@@ -334,27 +343,31 @@ describe('binary-peer-connection-v2', () => {
334
343
  resolve(res);
335
344
  });
336
345
  });
337
- expect(socketA.stats.bytesSent).toBeGreaterThan(0);
338
- expect(socketA.stats.messagesSent).toBeGreaterThan(0);
339
- expect(socketB.stats.bytesReceived).toBeGreaterThan(0);
340
- expect(socketB.stats.messagesReceived).toBeGreaterThan(0);
346
+ expect(socketA.stats?.bytesSent).toBeGreaterThan(0);
347
+ expect(socketA.stats?.messagesSent).toBeGreaterThan(0);
348
+ expect(socketB.stats?.bytesReceived).toBeGreaterThan(0);
349
+ expect(socketB.stats?.messagesReceived).toBeGreaterThan(0);
341
350
  iPeer.destroy();
342
351
  rPeer.destroy();
343
352
  });
344
353
  });
345
- describe('wrapBinaryPeer', () => {
346
- it('should successfully handshake over wrtc protocol', async () => {
354
+ describe("wrapBinaryPeer", () => {
355
+ it("should successfully handshake over wrtc protocol", async () => {
347
356
  const { iPeer, rPeer } = await getMockPeerPair();
348
357
  const userId = `00000000000000000user001`;
349
358
  const keys = (0, keys_1.newKeys)();
350
359
  const connectionId = `00000000000000000conn001`;
351
360
  const iPeerDeviceId = `000000000000000device001`;
352
361
  const iPeerDevice = new device_1.Device(userId, iPeerDeviceId, keys);
353
- const iPeerConnection = (0, binary_peer_connection_v2_1.wrapBinaryPeer)(connectionId, iPeer, iPeerDevice, true, { protocol: 'wrtc' });
362
+ const iPeerConnection = (0, binary_peer_connection_v2_1.wrapBinaryPeer)(connectionId, iPeer, iPeerDevice, true, {
363
+ protocol: "wrtc",
364
+ });
354
365
  const rPeerDeviceId = `000000000000000device002`;
355
366
  const rPeerDevice = new device_1.Device(userId, rPeerDeviceId, keys);
356
- const rPeerConnection = (0, binary_peer_connection_v2_1.wrapBinaryPeer)(connectionId, rPeer, rPeerDevice, false, { protocol: 'wrtc' });
357
- await iPeerConnection.doHandshake('wrtc://' + connectionId);
367
+ const rPeerConnection = (0, binary_peer_connection_v2_1.wrapBinaryPeer)(connectionId, rPeer, rPeerDevice, false, {
368
+ protocol: "wrtc",
369
+ });
370
+ await iPeerConnection.doHandshake(`wrtc://${connectionId}`);
358
371
  expect(rPeerConnection.remoteDeviceInfo).toBeDefined();
359
372
  expect(rPeerConnection.remoteDeviceInfo?.deviceId).toBe(iPeerDeviceId);
360
373
  expect(iPeerConnection.remoteDeviceInfo).toBeDefined();
@@ -362,7 +375,7 @@ describe('binary-peer-connection-v2', () => {
362
375
  iPeer.destroy();
363
376
  rPeer.destroy();
364
377
  });
365
- it('should set secureLocal/secureRemote when markTransportSecure is true', async () => {
378
+ it("should set secureLocal/secureRemote when markTransportSecure is true", async () => {
366
379
  const { iPeer, rPeer } = await getMockPeerPair();
367
380
  const userId = `00000000000000000user001`;
368
381
  const keys = (0, keys_1.newKeys)();
@@ -370,14 +383,14 @@ describe('binary-peer-connection-v2', () => {
370
383
  const iPeerDeviceId = `000000000000000device001`;
371
384
  const iPeerDevice = new device_1.Device(userId, iPeerDeviceId, keys);
372
385
  const iPeerConnection = (0, binary_peer_connection_v2_1.wrapBinaryPeer)(connectionId, iPeer, iPeerDevice, true, {
373
- protocol: 'wrtc',
374
- markTransportSecure: true
386
+ protocol: "wrtc",
387
+ markTransportSecure: true,
375
388
  });
376
389
  const rPeerDeviceId = `000000000000000device002`;
377
390
  const rPeerDevice = new device_1.Device(userId, rPeerDeviceId, keys);
378
391
  const rPeerConnection = (0, binary_peer_connection_v2_1.wrapBinaryPeer)(connectionId, rPeer, rPeerDevice, false, {
379
- protocol: 'wrtc',
380
- markTransportSecure: true
392
+ protocol: "wrtc",
393
+ markTransportSecure: true,
381
394
  });
382
395
  expect(iPeerConnection.secureLocal).toBe(true);
383
396
  expect(iPeerConnection.secureRemote).toBe(true);
@@ -387,8 +400,8 @@ describe('binary-peer-connection-v2', () => {
387
400
  rPeer.destroy();
388
401
  });
389
402
  });
390
- describe('backwards compatibility', () => {
391
- it('wrapWrtc should work as alias and set secure flags', async () => {
403
+ describe("backwards compatibility", () => {
404
+ it("wrapWrtc should work as alias and set secure flags", async () => {
392
405
  const { iPeer, rPeer } = await getMockPeerPair();
393
406
  const userId = `00000000000000000user001`;
394
407
  const keys = (0, keys_1.newKeys)();
@@ -401,13 +414,13 @@ describe('binary-peer-connection-v2', () => {
401
414
  const rPeerConnection = (0, binary_peer_connection_v2_1.wrapWrtc)(connectionId, rPeer, rPeerDevice, false);
402
415
  expect(iPeerConnection.secureLocal).toBe(true);
403
416
  expect(iPeerConnection.secureRemote).toBe(true);
404
- await iPeerConnection.doHandshake('wrtc://' + connectionId);
417
+ await iPeerConnection.doHandshake(`wrtc://${connectionId}`);
405
418
  expect(rPeerConnection.remoteDeviceInfo).toBeDefined();
406
419
  expect(rPeerConnection.remoteDeviceInfo?.deviceId).toBe(iPeerDeviceId);
407
420
  iPeer.destroy();
408
421
  rPeer.destroy();
409
422
  });
410
- it('binary peers should bypass StreamedSocket (handlesOwnEncoding)', async () => {
423
+ it("binary peers should bypass StreamedSocket (handlesOwnEncoding)", async () => {
411
424
  const { iPeer } = await getMockPeerPair();
412
425
  const userId = `00000000000000000user001`;
413
426
  const keys = (0, keys_1.newKeys)();
@@ -1,15 +1,15 @@
1
1
  import { Connection } from "./connection";
2
- import { Device } from "./device";
3
- import { ISocket } from "./socket.type";
4
- type ITrustLevelFn = Connection['getTrustLevel'];
2
+ import type { Device } from "./device";
3
+ import type { ISocket } from "./socket.type";
4
+ type ITrustLevelFn = Connection["getTrustLevel"];
5
5
  /**
6
6
  * Generic binary peer interface supporting WebRTC and WebSocket transports.
7
7
  * Provides a unified abstraction for binary data channel communication.
8
8
  */
9
9
  export interface IBinaryPeer {
10
- on(event: 'data', handler: (data: Buffer | Uint8Array) => void): void;
11
- on(event: 'close', handler: () => void): void;
12
- on(event: 'drain', handler: () => void): void;
10
+ on(event: "data", handler: (data: Buffer | Uint8Array) => void): void;
11
+ on(event: "close", handler: () => void): void;
12
+ on(event: "drain", handler: () => void): void;
13
13
  send(data: string | Uint8Array | Buffer): void;
14
14
  destroy(): void;
15
15
  /**
@@ -21,7 +21,7 @@ export interface IBinaryPeer {
21
21
  export type IWebRTCPeer = IBinaryPeer;
22
22
  export interface WrapBinaryPeerOptions {
23
23
  /** Protocol identifier used for server address (e.g., 'wrtc' or 'ws') */
24
- protocol: 'wrtc' | 'ws';
24
+ protocol: "wrtc" | "ws";
25
25
  /**
26
26
  * Mark the transport as already secure (encrypted at transport layer).
27
27
  * When true, sets secureLocal and secureRemote to skip application-level encryption.
@@ -4,10 +4,10 @@ exports.createBinaryPeerSocket = createBinaryPeerSocket;
4
4
  exports.wrapBinaryPeer = wrapBinaryPeer;
5
5
  exports.wrapWrtc = wrapWrtc;
6
6
  const msgpack_1 = require("@msgpack/msgpack");
7
+ const utils_1 = require("../utils");
7
8
  const connection_1 = require("./connection");
8
9
  const get_trust_level_fn_1 = require("./get-trust-level-fn");
9
10
  const streamed_socket_1 = require("./streamed-socket");
10
- const utils_1 = require("../utils");
11
11
  const tx_encoding_1 = require("./tx-encoding");
12
12
  // Protocol discriminator bytes for multiplexing RPC and raw byte streams
13
13
  const PROTOCOL_RPC = 0x00;
@@ -21,7 +21,7 @@ const LARGE_MESSAGE_THRESHOLD = 64 * 1024; // 64KB
21
21
  const RPC_CHUNK_SIZE_WRTC = 16 * 1024; // 16KB for WebRTC (fits in Unix socket kernel buffer)
22
22
  const RPC_CHUNK_SIZE_DEFAULT = 512 * 1024; // 512KB for WebSocket
23
23
  // Reserved stream ID for RPC messages sent via raw bytes
24
- const RPC_STREAM_ID = '__rpc';
24
+ const RPC_STREAM_ID = "__rpc";
25
25
  // Flags for __rpc stream chunking protocol:
26
26
  // Each message on the __rpc stream starts with a 1-byte flag.
27
27
  const RPC_FLAG_SINGLE = 0x00; // [0x00][encoded message] - complete in one message
@@ -56,10 +56,10 @@ function decodeStreamId(bytes) {
56
56
  function encodeMessage(message) {
57
57
  // Check if args/result is a Uint8Array - if so, flag it to keep it as raw bytes
58
58
  let isUint8ArrayData = false;
59
- if (message.type === 'call' && message.args instanceof Uint8Array) {
59
+ if (message.type === "call" && message.args instanceof Uint8Array) {
60
60
  isUint8ArrayData = true;
61
61
  }
62
- else if (message.type === 'callback' && message.result instanceof Uint8Array) {
62
+ else if (message.type === "callback" && message.result instanceof Uint8Array) {
63
63
  isUint8ArrayData = true;
64
64
  }
65
65
  // Encode metadata using msgpack (without args/result/error - those go in data)
@@ -73,7 +73,7 @@ function encodeMessage(message) {
73
73
  const metadataLength = metadataBytes.length;
74
74
  // Encode the data payload (args, result, or error)
75
75
  let dataBytes;
76
- if (message.type === 'call' && message.args !== undefined) {
76
+ if (message.type === "call" && message.args !== undefined) {
77
77
  // If args is already a Uint8Array, use it directly without txEncode
78
78
  if (isUint8ArrayData) {
79
79
  dataBytes = message.args;
@@ -82,7 +82,7 @@ function encodeMessage(message) {
82
82
  dataBytes = (0, tx_encoding_1.txEncode)(message.args);
83
83
  }
84
84
  }
85
- else if (message.type === 'callback') {
85
+ else if (message.type === "callback") {
86
86
  if (message.error !== undefined) {
87
87
  dataBytes = (0, tx_encoding_1.txEncode)({ error: message.error });
88
88
  }
@@ -125,7 +125,7 @@ function decodeMessage(bytes) {
125
125
  };
126
126
  // Decode the data payload
127
127
  if (dataBytes.length > 0) {
128
- if (message.type === 'call') {
128
+ if (message.type === "call") {
129
129
  // If it was a Uint8Array, use it directly without txDecode
130
130
  if (metadata.isUint8ArrayData) {
131
131
  message.args = dataBytes;
@@ -134,7 +134,7 @@ function decodeMessage(bytes) {
134
134
  message.args = (0, tx_encoding_1.txDecode)(dataBytes);
135
135
  }
136
136
  }
137
- else if (message.type === 'callback') {
137
+ else if (message.type === "callback") {
138
138
  if (metadata.isUint8ArrayData) {
139
139
  // If it was a Uint8Array result, use it directly
140
140
  message.result = dataBytes;
@@ -156,19 +156,18 @@ function decodeMessage(bytes) {
156
156
  * Creates an ISocket from a binary peer without creating a full Connection.
157
157
  * Useful when you need to pass custom localServerAddresses to the Connection.
158
158
  */
159
- function createBinaryPeerSocket(connectionId, peer, protocol = 'binary') {
159
+ function createBinaryPeerSocket(connectionId, peer, protocol = "binary") {
160
160
  const handlers = {};
161
161
  const callbacks = {};
162
162
  const rawBytesHandlers = {};
163
163
  let isClosed = false;
164
164
  const stats = (0, streamed_socket_1.createSocketStats)();
165
165
  // Map protocol string to TransportType (needed early for threshold calculations)
166
- const transportType = protocol === 'wrtc' ? 'wrtc' :
167
- protocol === 'ws' ? 'ws' : 'unknown';
166
+ const transportType = protocol === "wrtc" ? "wrtc" : protocol === "ws" ? "ws" : "unknown";
168
167
  // Transport-specific thresholds (computed once)
169
- const HIGH_WATER_MARK = transportType === 'wrtc' ? 128 * 1024 : 4 * 1024 * 1024;
170
- const LOW_WATER_MARK = transportType === 'wrtc' ? 32 * 1024 : 2 * 1024 * 1024;
171
- const RPC_CHUNK_SIZE = transportType === 'wrtc' ? RPC_CHUNK_SIZE_WRTC : RPC_CHUNK_SIZE_DEFAULT;
168
+ const HIGH_WATER_MARK = transportType === "wrtc" ? 128 * 1024 : 4 * 1024 * 1024;
169
+ const LOW_WATER_MARK = transportType === "wrtc" ? 32 * 1024 : 2 * 1024 * 1024;
170
+ const RPC_CHUNK_SIZE = transportType === "wrtc" ? RPC_CHUNK_SIZE_WRTC : RPC_CHUNK_SIZE_DEFAULT;
172
171
  // Core sendRawBytes implementation - defined early so sendRPCData can use it
173
172
  const sendRawBytesImpl = async (streamId, data) => {
174
173
  const sidBytes = getStreamIdBytes(streamId);
@@ -181,7 +180,7 @@ function createBinaryPeerSocket(connectionId, peer, protocol = 'binary') {
181
180
  packet.set(data, headerLen);
182
181
  // Backpressure: wait for buffer to drain before sending more
183
182
  if (peer.getBufferedAmount && peer.getBufferedAmount() > HIGH_WATER_MARK) {
184
- await new Promise(resolve => {
183
+ await new Promise((resolve) => {
185
184
  const checkDrain = () => {
186
185
  if (!peer.getBufferedAmount || peer.getBufferedAmount() < LOW_WATER_MARK) {
187
186
  resolve();
@@ -190,7 +189,7 @@ function createBinaryPeerSocket(connectionId, peer, protocol = 'binary') {
190
189
  setTimeout(checkDrain, 5);
191
190
  }
192
191
  };
193
- peer.on('drain', resolve);
192
+ peer.on("drain", resolve);
194
193
  checkDrain();
195
194
  });
196
195
  }
@@ -248,7 +247,7 @@ function createBinaryPeerSocket(connectionId, peer, protocol = 'binary') {
248
247
  let rpcReassemblyBuffer = null;
249
248
  let rpcReassemblyOffset = 0;
250
249
  // Handle incoming data
251
- peer.on('data', async (data) => {
250
+ peer.on("data", async (data) => {
252
251
  try {
253
252
  const bytes = new Uint8Array(data);
254
253
  stats.bytesReceived += bytes.length;
@@ -332,7 +331,7 @@ function createBinaryPeerSocket(connectionId, peer, protocol = 'binary') {
332
331
  }
333
332
  });
334
333
  // Handle closure
335
- peer.on('close', () => {
334
+ peer.on("close", () => {
336
335
  if (isClosed)
337
336
  return;
338
337
  isClosed = true;
@@ -347,7 +346,7 @@ function createBinaryPeerSocket(connectionId, peer, protocol = 'binary') {
347
346
  emit(eventName, args, callback) {
348
347
  const callbackId = (0, utils_1.newid)();
349
348
  callbacks[callbackId] = callback;
350
- const message = { type: 'call', eventName, args, callbackId };
349
+ const message = { type: "call", eventName, args, callbackId };
351
350
  const encoded = encodeMessage(message);
352
351
  sendRPCData(encoded);
353
352
  },
@@ -359,7 +358,9 @@ function createBinaryPeerSocket(connectionId, peer, protocol = 'binary') {
359
358
  delete handlers[eventName];
360
359
  }
361
360
  else {
362
- Object.keys(handlers).forEach(key => delete handlers[key]);
361
+ for (const key of Object.keys(handlers)) {
362
+ delete handlers[key];
363
+ }
363
364
  }
364
365
  },
365
366
  disconnect() {
@@ -371,7 +372,7 @@ function createBinaryPeerSocket(connectionId, peer, protocol = 'binary') {
371
372
  },
372
373
  removeRawBytesHandler(streamId) {
373
374
  delete rawBytesHandlers[streamId];
374
- }
375
+ },
375
376
  };
376
377
  return socket;
377
378
  }
@@ -379,7 +380,7 @@ function createBinaryPeerSocket(connectionId, peer, protocol = 'binary') {
379
380
  // sendRPCData automatically routes large messages through raw bytes streaming
380
381
  function handleRPCMessage(bytes, handlers, callbacks, sendRPCData) {
381
382
  const message = decodeMessage(bytes);
382
- if (message.type === 'callback') {
383
+ if (message.type === "callback") {
383
384
  const callback = callbacks[message.callbackId];
384
385
  if (callback) {
385
386
  delete callbacks[message.callbackId];
@@ -387,7 +388,7 @@ function handleRPCMessage(bytes, handlers, callbacks, sendRPCData) {
387
388
  }
388
389
  return;
389
390
  }
390
- if (message.type === 'call') {
391
+ if (message.type === "call") {
391
392
  const handler = handlers[message.eventName];
392
393
  if (!handler) {
393
394
  console.warn(`No handler for event: ${message.eventName}`);
@@ -396,7 +397,7 @@ function handleRPCMessage(bytes, handlers, callbacks, sendRPCData) {
396
397
  try {
397
398
  const callback = (err, result) => {
398
399
  const responseMessage = {
399
- type: 'callback',
400
+ type: "callback",
400
401
  callbackId: message.callbackId,
401
402
  };
402
403
  if (err)
@@ -412,9 +413,9 @@ function handleRPCMessage(bytes, handlers, callbacks, sendRPCData) {
412
413
  catch (error) {
413
414
  console.error("Error in handler", { eventName: message.eventName, error });
414
415
  const errorMessage = {
415
- type: 'callback',
416
+ type: "callback",
416
417
  callbackId: message.callbackId,
417
- error: error.message
418
+ error: error.message,
418
419
  };
419
420
  const encoded = encodeMessage(errorMessage);
420
421
  sendRPCData(encoded);
@@ -431,7 +432,7 @@ function wrapBinaryPeer(connectionId, peer, localDevice, initiator, options, get
431
432
  const socket = createBinaryPeerSocket(connectionId, peer, protocol);
432
433
  const serverAddress = `${protocol}://${connectionId}`;
433
434
  const localServerAddresses = initiator ? undefined : [serverAddress];
434
- if (process.env.NODE_ENV !== 'test') {
435
+ if (process.env.NODE_ENV !== "test") {
435
436
  getTrustLevel ??= (0, get_trust_level_fn_1.getTrustLevelFn)(localDevice, serverAddress);
436
437
  }
437
438
  const connection = new connection_1.Connection(socket, localDevice, localServerAddresses, getTrustLevel);
@@ -448,5 +449,5 @@ function wrapBinaryPeer(connectionId, peer, localDevice, initiator, options, get
448
449
  * WebRTC is encrypted at the transport layer (DTLS-SRTP), so we skip application-level encryption.
449
450
  */
450
451
  function wrapWrtc(connectionId, peer, localDevice, initiator, getTrustLevel) {
451
- return wrapBinaryPeer(connectionId, peer, localDevice, initiator, { protocol: 'wrtc', markTransportSecure: true }, getTrustLevel);
452
+ return wrapBinaryPeer(connectionId, peer, localDevice, initiator, { protocol: "wrtc", markTransportSecure: true }, getTrustLevel);
452
453
  }