@peers-app/peers-sdk 0.27.3 → 0.27.5

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 (272) hide show
  1. package/dist/contracts/contract-proxy.d.ts +7 -0
  2. package/dist/contracts/contract-proxy.js +19 -2
  3. package/dist/contracts/contract-transport.d.ts +2 -1
  4. package/dist/contracts/contract-transport.js +24 -2
  5. package/dist/contracts/create-local-consumer.js +16 -1
  6. package/dist/contracts/index.d.ts +2 -0
  7. package/dist/contracts/index.js +2 -0
  8. package/dist/contracts/system/index.d.ts +2 -0
  9. package/dist/contracts/system/index.js +2 -0
  10. package/dist/contracts/system/invites-contract.js +2 -1
  11. package/dist/contracts/system/sync-check-contract.d.ts +97 -0
  12. package/dist/contracts/system/sync-check-contract.js +115 -0
  13. package/dist/contracts/tool-arguments.d.ts +15 -0
  14. package/dist/contracts/tool-arguments.js +41 -0
  15. package/dist/contracts/tool-catalog-service.js +2 -12
  16. package/dist/contracts/tool-catalog.js +6 -2
  17. package/dist/data/change-tracking.d.ts +40 -0
  18. package/dist/data/change-tracking.js +89 -0
  19. package/dist/data/orm/types.d.ts +24 -7
  20. package/dist/data/orm/types.js +97 -24
  21. package/dist/define/manifest.js +6 -34
  22. package/dist/device/binary-peer-connection-v2.d.ts +7 -15
  23. package/dist/device/binary-peer-connection-v2.js +14 -30
  24. package/dist/device/connection.d.ts +34 -43
  25. package/dist/device/connection.js +188 -186
  26. package/dist/device/device.d.ts +1 -8
  27. package/dist/device/device.js +1 -30
  28. package/dist/device/socket.type.d.ts +6 -12
  29. package/dist/package-loader/package-loader.js +27 -22
  30. package/dist/system-ids.d.ts +5 -0
  31. package/dist/system-ids.js +6 -1
  32. package/package.json +4 -2
  33. package/dist/context/user-context-identity.test.d.ts +0 -1
  34. package/dist/context/user-context-identity.test.js +0 -220
  35. package/dist/contracts/__tests__/action-dispatch.test.d.ts +0 -1
  36. package/dist/contracts/__tests__/action-dispatch.test.js +0 -319
  37. package/dist/contracts/__tests__/also-implements.test.d.ts +0 -1
  38. package/dist/contracts/__tests__/also-implements.test.js +0 -110
  39. package/dist/contracts/__tests__/builder.test.d.ts +0 -1
  40. package/dist/contracts/__tests__/builder.test.js +0 -669
  41. package/dist/contracts/__tests__/contract-events.test.d.ts +0 -1
  42. package/dist/contracts/__tests__/contract-events.test.js +0 -199
  43. package/dist/contracts/__tests__/contract-observables.test.d.ts +0 -1
  44. package/dist/contracts/__tests__/contract-observables.test.js +0 -290
  45. package/dist/contracts/__tests__/contract-provider-router.test.d.ts +0 -1
  46. package/dist/contracts/__tests__/contract-provider-router.test.js +0 -315
  47. package/dist/contracts/__tests__/contract-proxy.test.d.ts +0 -1
  48. package/dist/contracts/__tests__/contract-proxy.test.js +0 -657
  49. package/dist/contracts/__tests__/contract-resolvers.test.d.ts +0 -1
  50. package/dist/contracts/__tests__/contract-resolvers.test.js +0 -758
  51. package/dist/contracts/__tests__/contract-subscription-lifecycle.test.d.ts +0 -1
  52. package/dist/contracts/__tests__/contract-subscription-lifecycle.test.js +0 -353
  53. package/dist/contracts/__tests__/contract-table-events.test.d.ts +0 -1
  54. package/dist/contracts/__tests__/contract-table-events.test.js +0 -209
  55. package/dist/contracts/__tests__/contract-transport.test.d.ts +0 -1
  56. package/dist/contracts/__tests__/contract-transport.test.js +0 -163
  57. package/dist/contracts/__tests__/extract.test.d.ts +0 -1
  58. package/dist/contracts/__tests__/extract.test.js +0 -145
  59. package/dist/contracts/__tests__/frozen-contracts.test.d.ts +0 -1
  60. package/dist/contracts/__tests__/frozen-contracts.test.js +0 -191
  61. package/dist/contracts/__tests__/generic-tool-dispatch.test.d.ts +0 -1
  62. package/dist/contracts/__tests__/generic-tool-dispatch.test.js +0 -130
  63. package/dist/contracts/__tests__/host-contract-client.test.d.ts +0 -1
  64. package/dist/contracts/__tests__/host-contract-client.test.js +0 -793
  65. package/dist/contracts/__tests__/host-contract-consumer.test.d.ts +0 -1
  66. package/dist/contracts/__tests__/host-contract-consumer.test.js +0 -163
  67. package/dist/contracts/__tests__/host-contract-transport.test.d.ts +0 -1
  68. package/dist/contracts/__tests__/host-contract-transport.test.js +0 -66
  69. package/dist/contracts/__tests__/integration.test.d.ts +0 -1
  70. package/dist/contracts/__tests__/integration.test.js +0 -348
  71. package/dist/contracts/__tests__/legacy-removal.test.d.ts +0 -1
  72. package/dist/contracts/__tests__/legacy-removal.test.js +0 -128
  73. package/dist/contracts/__tests__/persistent-registry.test.d.ts +0 -1
  74. package/dist/contracts/__tests__/persistent-registry.test.js +0 -109
  75. package/dist/contracts/__tests__/playground.test.d.ts +0 -1
  76. package/dist/contracts/__tests__/playground.test.js +0 -216
  77. package/dist/contracts/__tests__/registry.test.d.ts +0 -1
  78. package/dist/contracts/__tests__/registry.test.js +0 -238
  79. package/dist/contracts/__tests__/remote-contract-transport.test.d.ts +0 -1
  80. package/dist/contracts/__tests__/remote-contract-transport.test.js +0 -119
  81. package/dist/contracts/__tests__/system-contracts.test.d.ts +0 -1
  82. package/dist/contracts/__tests__/system-contracts.test.js +0 -247
  83. package/dist/contracts/__tests__/target-dispatch.d.ts +0 -11
  84. package/dist/contracts/__tests__/target-dispatch.js +0 -24
  85. package/dist/contracts/__tests__/tool-catalog-inventory.test.d.ts +0 -1
  86. package/dist/contracts/__tests__/tool-catalog-inventory.test.js +0 -44
  87. package/dist/contracts/__tests__/tool-catalog-service.test.d.ts +0 -1
  88. package/dist/contracts/__tests__/tool-catalog-service.test.js +0 -482
  89. package/dist/contracts/__tests__/tool-catalog.test.d.ts +0 -1
  90. package/dist/contracts/__tests__/tool-catalog.test.js +0 -1199
  91. package/dist/contracts/__tests__/validate.test.d.ts +0 -1
  92. package/dist/contracts/__tests__/validate.test.js +0 -991
  93. package/dist/contracts/__tests__/workflow-context.test.d.ts +0 -1
  94. package/dist/contracts/__tests__/workflow-context.test.js +0 -50
  95. package/dist/data/access-level.test.d.ts +0 -1
  96. package/dist/data/access-level.test.js +0 -53
  97. package/dist/data/change-tracking.test.d.ts +0 -1
  98. package/dist/data/change-tracking.test.js +0 -62
  99. package/dist/data/files/files.test.d.ts +0 -1
  100. package/dist/data/files/files.test.js +0 -770
  101. package/dist/data/group-members.test.d.ts +0 -1
  102. package/dist/data/group-members.test.js +0 -336
  103. package/dist/data/group-share.test.d.ts +0 -1
  104. package/dist/data/group-share.test.js +0 -110
  105. package/dist/data/groups.test.d.ts +0 -1
  106. package/dist/data/groups.test.js +0 -153
  107. package/dist/data/orm/cursor.test.d.ts +0 -1
  108. package/dist/data/orm/cursor.test.js +0 -314
  109. package/dist/data/orm/data-query.mongo.test.d.ts +0 -1
  110. package/dist/data/orm/data-query.mongo.test.js +0 -367
  111. package/dist/data/orm/data-query.sqlite.test.d.ts +0 -1
  112. package/dist/data/orm/data-query.sqlite.test.js +0 -365
  113. package/dist/data/orm/data-query.test.d.ts +0 -1
  114. package/dist/data/orm/data-query.test.js +0 -545
  115. package/dist/data/orm/dependency-injection.test.d.ts +0 -1
  116. package/dist/data/orm/dependency-injection.test.js +0 -171
  117. package/dist/data/orm/event-registry.test.d.ts +0 -1
  118. package/dist/data/orm/event-registry.test.js +0 -44
  119. package/dist/data/orm/multi-cursors.test.d.ts +0 -1
  120. package/dist/data/orm/multi-cursors.test.js +0 -463
  121. package/dist/data/orm/sql.data-source.test.d.ts +0 -1
  122. package/dist/data/orm/sql.data-source.test.js +0 -731
  123. package/dist/data/orm/table-container-events.test.d.ts +0 -1
  124. package/dist/data/orm/table-container-events.test.js +0 -101
  125. package/dist/data/orm/table-container.test.d.ts +0 -1
  126. package/dist/data/orm/table-container.test.js +0 -273
  127. package/dist/data/orm/table.event-source.test.d.ts +0 -1
  128. package/dist/data/orm/table.event-source.test.js +0 -331
  129. package/dist/data/orm/types.test.d.ts +0 -1
  130. package/dist/data/orm/types.test.js +0 -409
  131. package/dist/data/package-table-identity.test.d.ts +0 -1
  132. package/dist/data/package-table-identity.test.js +0 -46
  133. package/dist/data/package-version-permissions.test.d.ts +0 -1
  134. package/dist/data/package-version-permissions.test.js +0 -107
  135. package/dist/data/package-version-resolver.test.d.ts +0 -4
  136. package/dist/data/package-version-resolver.test.js +0 -543
  137. package/dist/data/package-versions.test.d.ts +0 -1
  138. package/dist/data/package-versions.test.js +0 -227
  139. package/dist/data/persistent-vars.conflict.test.d.ts +0 -1
  140. package/dist/data/persistent-vars.conflict.test.js +0 -126
  141. package/dist/data/persistent-vars.migration.test.d.ts +0 -1
  142. package/dist/data/persistent-vars.migration.test.js +0 -133
  143. package/dist/data/persistent-vars.package-scope.test.d.ts +0 -1
  144. package/dist/data/persistent-vars.package-scope.test.js +0 -27
  145. package/dist/data/sync-recovery-queue.test.d.ts +0 -1
  146. package/dist/data/sync-recovery-queue.test.js +0 -215
  147. package/dist/data/table-signing.test.d.ts +0 -1
  148. package/dist/data/table-signing.test.js +0 -118
  149. package/dist/data/tool-access.test.d.ts +0 -1
  150. package/dist/data/tool-access.test.js +0 -166
  151. package/dist/data/user-permissions.test.d.ts +0 -1
  152. package/dist/data/user-permissions.test.js +0 -305
  153. package/dist/data/user-trust-levels.test.d.ts +0 -1
  154. package/dist/data/user-trust-levels.test.js +0 -37
  155. package/dist/define/also-implements.test.d.ts +0 -1
  156. package/dist/define/also-implements.test.js +0 -123
  157. package/dist/define/declare-contract.test.d.ts +0 -1
  158. package/dist/define/declare-contract.test.js +0 -573
  159. package/dist/define/define.test.d.ts +0 -1
  160. package/dist/define/define.test.js +0 -1010
  161. package/dist/define/empty-fields.test.d.ts +0 -1
  162. package/dist/define/empty-fields.test.js +0 -55
  163. package/dist/define/events-observables.test.d.ts +0 -1
  164. package/dist/define/events-observables.test.js +0 -1013
  165. package/dist/define/serve-members.test.d.ts +0 -1
  166. package/dist/define/serve-members.test.js +0 -630
  167. package/dist/define/vars.test.d.ts +0 -1
  168. package/dist/define/vars.test.js +0 -39
  169. package/dist/device/binary-peer-connection-v2.test.d.ts +0 -1
  170. package/dist/device/binary-peer-connection-v2.test.js +0 -730
  171. package/dist/device/binary-peer-connection.d.ts +0 -58
  172. package/dist/device/binary-peer-connection.js +0 -516
  173. package/dist/device/binary-peer-connection.test.d.ts +0 -1
  174. package/dist/device/binary-peer-connection.test.js +0 -184
  175. package/dist/device/connection.test.d.ts +0 -1
  176. package/dist/device/connection.test.js +0 -613
  177. package/dist/device/device-election.test.d.ts +0 -1
  178. package/dist/device/device-election.test.js +0 -516
  179. package/dist/device/device.test.d.ts +0 -1
  180. package/dist/device/device.test.js +0 -243
  181. package/dist/device/frame-cipher.test.d.ts +0 -1
  182. package/dist/device/frame-cipher.test.js +0 -219
  183. package/dist/device/get-trust-level-fn.test.d.ts +0 -1
  184. package/dist/device/get-trust-level-fn.test.js +0 -685
  185. package/dist/device/streamed-socket.d.ts +0 -23
  186. package/dist/device/streamed-socket.js +0 -255
  187. package/dist/device/streamed-socket.test.d.ts +0 -1
  188. package/dist/device/streamed-socket.test.js +0 -216
  189. package/dist/device/tx-encoding.test.d.ts +0 -1
  190. package/dist/device/tx-encoding.test.js +0 -295
  191. package/dist/device-pairing/cpace.test.d.ts +0 -1
  192. package/dist/device-pairing/cpace.test.js +0 -116
  193. package/dist/device-pairing/device-pairing.test.d.ts +0 -1
  194. package/dist/device-pairing/device-pairing.test.js +0 -211
  195. package/dist/hlc.test.d.ts +0 -1
  196. package/dist/hlc.test.js +0 -45
  197. package/dist/host-credentials.test.d.ts +0 -1
  198. package/dist/host-credentials.test.js +0 -88
  199. package/dist/identity/account-email.test.d.ts +0 -1
  200. package/dist/identity/account-email.test.js +0 -59
  201. package/dist/identity/anchor-document.test.d.ts +0 -1
  202. package/dist/identity/anchor-document.test.js +0 -16
  203. package/dist/identity/anchor-resolution.test.d.ts +0 -1
  204. package/dist/identity/anchor-resolution.test.js +0 -130
  205. package/dist/identity/key-change.test.d.ts +0 -1
  206. package/dist/identity/key-change.test.js +0 -811
  207. package/dist/invites/group-approval.test.d.ts +0 -1
  208. package/dist/invites/group-approval.test.js +0 -223
  209. package/dist/invites/invite-token.test.d.ts +0 -1
  210. package/dist/invites/invite-token.test.js +0 -123
  211. package/dist/keys.test.d.ts +0 -1
  212. package/dist/keys.test.js +0 -336
  213. package/dist/logging/console-logger.test.d.ts +0 -1
  214. package/dist/logging/console-logger.test.js +0 -300
  215. package/dist/logging/console-logs.table.test.d.ts +0 -1
  216. package/dist/logging/console-logs.table.test.js +0 -156
  217. package/dist/observable.test.d.ts +0 -1
  218. package/dist/observable.test.js +0 -309
  219. package/dist/package-build/build-package.test.d.ts +0 -1
  220. package/dist/package-build/build-package.test.js +0 -204
  221. package/dist/package-build/contract-add.test.d.ts +0 -1
  222. package/dist/package-build/contract-add.test.js +0 -467
  223. package/dist/package-build/freeze-contracts.test.d.ts +0 -1
  224. package/dist/package-build/freeze-contracts.test.js +0 -355
  225. package/dist/package-installer/package-author-signing.test.d.ts +0 -1
  226. package/dist/package-installer/package-author-signing.test.js +0 -200
  227. package/dist/package-installer/package-cloner.test.d.ts +0 -1
  228. package/dist/package-installer/package-cloner.test.js +0 -278
  229. package/dist/package-installer/package-creator.test.d.ts +0 -1
  230. package/dist/package-installer/package-creator.test.js +0 -908
  231. package/dist/package-installer/package-dev-tools.test.d.ts +0 -1
  232. package/dist/package-installer/package-dev-tools.test.js +0 -64
  233. package/dist/package-installer/package-installer.test.d.ts +0 -1
  234. package/dist/package-installer/package-installer.test.js +0 -882
  235. package/dist/package-installer/package-propagation.test.d.ts +0 -1
  236. package/dist/package-installer/package-propagation.test.js +0 -1269
  237. package/dist/package-installer/package-publisher.test.d.ts +0 -1
  238. package/dist/package-installer/package-publisher.test.js +0 -153
  239. package/dist/package-installer/package-remote-checker.test.d.ts +0 -1
  240. package/dist/package-installer/package-remote-checker.test.js +0 -334
  241. package/dist/package-installer/package-seed-installer.test.d.ts +0 -1
  242. package/dist/package-installer/package-seed-installer.test.js +0 -123
  243. package/dist/package-installer/package-tarball.test.d.ts +0 -1
  244. package/dist/package-installer/package-tarball.test.js +0 -75
  245. package/dist/package-installer/peers-core-installer.test.d.ts +0 -1
  246. package/dist/package-installer/peers-core-installer.test.js +0 -49
  247. package/dist/package-installer/peers-core-trust-anchor.test.d.ts +0 -1
  248. package/dist/package-installer/peers-core-trust-anchor.test.js +0 -155
  249. package/dist/package-loader/contract-package-loader.test.d.ts +0 -1
  250. package/dist/package-loader/contract-package-loader.test.js +0 -274
  251. package/dist/package-loader/host-authority-loading.test.d.ts +0 -1
  252. package/dist/package-loader/host-authority-loading.test.js +0 -104
  253. package/dist/package-loader/host-dispatch-policy.test.d.ts +0 -1
  254. package/dist/package-loader/host-dispatch-policy.test.js +0 -56
  255. package/dist/package-loader/isolated-artifact.test.d.ts +0 -1
  256. package/dist/package-loader/isolated-artifact.test.js +0 -688
  257. package/dist/package-loader/isolated-persistent-var-gateway.test.d.ts +0 -1
  258. package/dist/package-loader/isolated-persistent-var-gateway.test.js +0 -56
  259. package/dist/package-loader/isolated-table-gateway.test.d.ts +0 -1
  260. package/dist/package-loader/isolated-table-gateway.test.js +0 -633
  261. package/dist/package-loader/package-loader.test.d.ts +0 -1
  262. package/dist/package-loader/package-loader.test.js +0 -1764
  263. package/dist/package-loader/resolve-consumed-contracts.test.d.ts +0 -1
  264. package/dist/package-loader/resolve-consumed-contracts.test.js +0 -166
  265. package/dist/serial-json.compat.test.d.ts +0 -1
  266. package/dist/serial-json.compat.test.js +0 -369
  267. package/dist/serial-json.test.d.ts +0 -1
  268. package/dist/serial-json.test.js +0 -401
  269. package/dist/testing/mock-host-contract.test.d.ts +0 -1
  270. package/dist/testing/mock-host-contract.test.js +0 -782
  271. package/dist/utils.test.d.ts +0 -1
  272. package/dist/utils.test.js +0 -232
@@ -1,23 +0,0 @@
1
- import { type ISocket, type ISocketStats, type RPCCallback } from "./socket.type";
2
- /** Creates a new stats object for tracking socket throughput */
3
- export declare function createSocketStats(): ISocketStats;
4
- export declare class StreamedSocket implements ISocket {
5
- readonly socket: ISocket;
6
- maxChunkSize: number;
7
- readonly safeSocketChunkEventName = "__streamed-socket-chunk";
8
- readonly safeSocketResponseEventName = "__streamed-socket-response";
9
- readonly stats: ISocketStats;
10
- constructor(socket: ISocket, maxChunkSize?: number);
11
- get id(): string | undefined;
12
- get connected(): boolean | undefined;
13
- disconnect(close?: boolean): void;
14
- private readonly callbacks;
15
- emit(eventName: string, args: any, callback: RPCCallback): void;
16
- private handlers;
17
- on(eventName: string, handler: (...args: any[]) => void): void;
18
- removeAllListeners(eventName: string): void;
19
- private readonly chunkBuffers;
20
- private handleChunk;
21
- private processChunks;
22
- private handleResponse;
23
- }
@@ -1,255 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StreamedSocket = void 0;
4
- exports.createSocketStats = createSocketStats;
5
- const msgpack_1 = require("@msgpack/msgpack");
6
- const lodash_1 = require("lodash");
7
- const utils_1 = require("../utils");
8
- const socket_type_1 = require("./socket.type");
9
- const tx_encoding_1 = require("./tx-encoding");
10
- /** Creates a new stats object for tracking socket throughput */
11
- function createSocketStats() {
12
- const now = Date.now();
13
- return {
14
- bytesSent: 0,
15
- bytesReceived: 0,
16
- messagesSent: 0,
17
- messagesReceived: 0,
18
- startTime: now,
19
- // For calculating recent rates
20
- lastSampleTime: now,
21
- lastSampleBytesSent: 0,
22
- lastSampleBytesReceived: 0,
23
- };
24
- }
25
- // Encode chunk metadata + data into a single Uint8Array
26
- function encodeChunk(chunk) {
27
- // Encode metadata using msgpack
28
- const metadata = {
29
- messageId: chunk.messageId,
30
- chunkIndex: chunk.chunkIndex,
31
- ...(chunk.totalChunks !== undefined && { totalChunks: chunk.totalChunks }),
32
- ...(chunk.eventName !== undefined && { eventName: chunk.eventName }),
33
- };
34
- const metadataBytes = (0, msgpack_1.encode)(metadata);
35
- const metadataLength = metadataBytes.length;
36
- // Create combined buffer: [4 bytes length][metadata][data]
37
- const combined = new Uint8Array(4 + metadataLength + chunk.data.length);
38
- // Write metadata length as 32-bit unsigned integer (big-endian)
39
- const view = new DataView(combined.buffer, combined.byteOffset, combined.byteLength);
40
- view.setUint32(0, metadataLength, false); // big-endian
41
- // Write metadata
42
- combined.set(metadataBytes, 4);
43
- // Write data
44
- combined.set(chunk.data, 4 + metadataLength);
45
- return combined;
46
- }
47
- // Decode binary chunk back into IMessageChunk
48
- function decodeChunk(bytes) {
49
- // Ensure we have a proper Uint8Array with a valid ArrayBuffer
50
- // Socket.io might send data that doesn't have a proper buffer property
51
- let normalizedBytes;
52
- if (bytes.buffer instanceof ArrayBuffer) {
53
- normalizedBytes = bytes;
54
- }
55
- else {
56
- // Create a new Uint8Array copy which will have a proper buffer
57
- normalizedBytes = new Uint8Array(bytes);
58
- }
59
- // Read metadata length
60
- const view = new DataView(normalizedBytes.buffer, normalizedBytes.byteOffset, normalizedBytes.byteLength);
61
- const metadataLength = view.getUint32(0, false); // big-endian
62
- // Extract metadata
63
- const metadataBytes = normalizedBytes.subarray(4, 4 + metadataLength);
64
- const metadata = (0, msgpack_1.decode)(metadataBytes);
65
- // Extract data
66
- const data = normalizedBytes.subarray(4 + metadataLength);
67
- return {
68
- messageId: metadata.messageId,
69
- chunkIndex: metadata.chunkIndex,
70
- totalChunks: metadata.totalChunks,
71
- eventName: metadata.eventName,
72
- data: data,
73
- };
74
- }
75
- class StreamedSocket {
76
- socket;
77
- maxChunkSize;
78
- safeSocketChunkEventName = "__streamed-socket-chunk";
79
- safeSocketResponseEventName = "__streamed-socket-response";
80
- stats = createSocketStats();
81
- constructor(socket, maxChunkSize = socket_type_1.DEFAULT_MAX_CHUNK_SIZE) {
82
- this.socket = socket;
83
- this.maxChunkSize = maxChunkSize;
84
- socket.on(this.safeSocketChunkEventName, (encodedChunk) => {
85
- // Track received bytes
86
- this.stats.bytesReceived += encodedChunk.length;
87
- const chunk = decodeChunk(encodedChunk);
88
- this.handleChunk(chunk);
89
- });
90
- }
91
- get id() {
92
- return this.socket.id;
93
- }
94
- get connected() {
95
- return this.socket.connected;
96
- }
97
- disconnect(close) {
98
- this.socket.disconnect(close);
99
- }
100
- callbacks = {};
101
- emit(eventName, args, callback) {
102
- const encoded = (0, tx_encoding_1.txEncode)(args);
103
- // if (encoded.length < this.maxChunkSize) {
104
- // // If the data is small enough, send it directly
105
- // this.socket.emit(eventName, args, callback);
106
- // return;
107
- // }
108
- const messageId = (0, utils_1.newid)();
109
- if (callback !== lodash_1.noop) {
110
- this.callbacks[messageId] = callback;
111
- }
112
- const chunks = [];
113
- // Reserve space for metadata overhead (typically ~50-100 bytes)
114
- const metadataOverhead = 128;
115
- if (this.maxChunkSize < metadataOverhead * 2) {
116
- throw new Error(`maxChunkSize ${this.maxChunkSize} is too small to accommodate metadata overhead, must be greater than ${metadataOverhead * 2}`);
117
- }
118
- const effectiveChunkSize = this.maxChunkSize - metadataOverhead;
119
- for (let i = 0; i < encoded.length; i += effectiveChunkSize) {
120
- const chunkData = encoded.subarray(i, i + effectiveChunkSize);
121
- chunks.push({
122
- messageId,
123
- chunkIndex: Math.floor(i / effectiveChunkSize),
124
- data: chunkData,
125
- });
126
- if (i === 0) {
127
- // The first chunk contains metadata about the chunks
128
- chunks[0].eventName = eventName;
129
- chunks[0].totalChunks = Math.ceil(encoded.length / effectiveChunkSize);
130
- }
131
- }
132
- if (chunks.length > 1) {
133
- console.debug(`Sending ${chunks.length} chunks for event ${eventName} with messageId ${messageId}`);
134
- }
135
- let totalBytesSent = 0;
136
- for (const chunk of chunks) {
137
- // Encode chunk with metadata into single Uint8Array
138
- const encodedChunk = encodeChunk(chunk);
139
- totalBytesSent += encodedChunk.length;
140
- // TODO on error or timeout retry
141
- // TODO respond to backpressure from socket
142
- this.socket.emit(this.safeSocketChunkEventName, encodedChunk, lodash_1.noop);
143
- }
144
- // Track stats
145
- this.stats.bytesSent += totalBytesSent;
146
- this.stats.messagesSent++;
147
- }
148
- handlers = {};
149
- on(eventName, handler) {
150
- this.handlers[eventName] = handler;
151
- // TODO I think this needs to come back to a handleResult method on this class
152
- this.socket.on(eventName, handler);
153
- }
154
- removeAllListeners(eventName) {
155
- this.socket.removeAllListeners(eventName);
156
- delete this.handlers[eventName];
157
- }
158
- chunkBuffers = {};
159
- async handleChunk(chunk) {
160
- if (!this.chunkBuffers[chunk.messageId]) {
161
- // TODO handle timeout for chunks and cleanup data to prevent memory leaks
162
- this.chunkBuffers[chunk.messageId] = [];
163
- }
164
- const chunks = this.chunkBuffers[chunk.messageId];
165
- const chunkIndex = chunk.chunkIndex;
166
- if (chunkIndex < 0) {
167
- console.warn(`Received chunk with negative index ${chunk.chunkIndex} for messageId: ${chunk.messageId}`, chunk);
168
- return;
169
- }
170
- chunks[chunkIndex] = chunk;
171
- const chunkZero = chunks[0];
172
- if (!chunkZero && chunks.length > 100) {
173
- console.error(`Received over 100 chunks without a chunkZero for messageId: ${chunk.messageId}. This could indicate a memory attack`, chunk);
174
- }
175
- if (chunkZero) {
176
- if (chunkZero?.totalChunks <= chunkIndex) {
177
- console.warn(`Received chunk with index ${chunk.chunkIndex} which is greater than totalChunks ${chunkZero.totalChunks} for messageId: ${chunk.messageId}`, chunk);
178
- return;
179
- }
180
- if (chunks.length >= chunkZero.totalChunks) {
181
- this.processChunks(chunks);
182
- }
183
- }
184
- }
185
- async processChunks(chunks) {
186
- try {
187
- const chunkZero = chunks[0];
188
- // Reassemble Uint8Array chunks (already decoded from binary format)
189
- const totalSize = chunks.reduce((sum, chunk) => sum + chunk.data.length, 0);
190
- const reassembled = new Uint8Array(totalSize);
191
- let offset = 0;
192
- for (const chunk of chunks) {
193
- reassembled.set(chunk.data, offset);
194
- offset += chunk.data.length;
195
- }
196
- // Track message received
197
- this.stats.messagesReceived++;
198
- delete this.chunkBuffers[chunkZero.messageId];
199
- const eventName = chunkZero.eventName;
200
- const args = (0, tx_encoding_1.txDecode)(reassembled);
201
- if (eventName === this.safeSocketResponseEventName) {
202
- this.handleResponse(args.messageId, args.error, args.result);
203
- return;
204
- }
205
- const handler = this.handlers[eventName];
206
- if (!handler) {
207
- throw new Error(`No handler registered for event ${eventName}`);
208
- }
209
- let error;
210
- let result;
211
- try {
212
- await new Promise((resolve) => {
213
- handler(args, (...params) => {
214
- [error, result] = params;
215
- resolve();
216
- });
217
- });
218
- }
219
- catch (err) {
220
- error = err;
221
- }
222
- this.emit(this.safeSocketResponseEventName, {
223
- messageId: chunkZero.messageId,
224
- error,
225
- result,
226
- }, lodash_1.noop);
227
- }
228
- catch (error) {
229
- if (String(error).includes("No handler registered for event")) {
230
- console.warn(String(error));
231
- }
232
- else {
233
- console.error(`Error handling chunked request:`, error);
234
- }
235
- return;
236
- }
237
- }
238
- async handleResponse(messageId, error, result) {
239
- const callback = this.callbacks[messageId];
240
- if (!callback) {
241
- console.warn(`No callback found for messageId ${messageId}`);
242
- }
243
- delete this.callbacks[messageId];
244
- if (error) {
245
- console.error(`Error in SafeSocket response for messageId ${messageId}:`, error);
246
- }
247
- try {
248
- await callback(error, result);
249
- }
250
- catch (err) {
251
- console.error(`Error in SafeSocket callback for messageId ${messageId}:`, err);
252
- }
253
- }
254
- }
255
- exports.StreamedSocket = StreamedSocket;
@@ -1 +0,0 @@
1
- export {};
@@ -1,216 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const msgpack_1 = require("@msgpack/msgpack");
4
- const utils_1 = require("../utils");
5
- const streamed_socket_1 = require("./streamed-socket");
6
- const tx_encoding_1 = require("./tx-encoding");
7
- // Helper to decode the binary chunk format
8
- function decodeChunk(bytes) {
9
- const view = new DataView(bytes.buffer, bytes.byteOffset);
10
- const metadataLength = view.getUint32(0, false);
11
- const metadataBytes = bytes.subarray(4, 4 + metadataLength);
12
- const metadata = (0, msgpack_1.decode)(metadataBytes);
13
- const data = bytes.subarray(4 + metadataLength);
14
- return { ...metadata, data };
15
- }
16
- function createMockSocket() {
17
- const emittedEvents = [];
18
- const socket = {
19
- id: (0, utils_1.newid)(),
20
- emit(eventName, args, callback) {
21
- emittedEvents.push({ eventName, args, callback });
22
- },
23
- on(_eventName, _handler) {
24
- // Simple mock - we'll manually trigger events in tests
25
- },
26
- removeAllListeners(_eventName) {
27
- // Simple mock
28
- },
29
- disconnect() {
30
- // Simple mock - we'll assume the socket is disconnected
31
- },
32
- };
33
- return {
34
- socket,
35
- getEmittedEvents: () => emittedEvents,
36
- };
37
- }
38
- describe("StreamedSocket", () => {
39
- it("should emit a single chunk for small messages", () => {
40
- const mock = createMockSocket();
41
- const streamedSocket = new streamed_socket_1.StreamedSocket(mock.socket, 1000); // Large chunk size
42
- const testData = { message: "hello" };
43
- streamedSocket.emit("test-event", testData, () => { });
44
- // Should emit a single chunk
45
- const emittedEvents = mock.getEmittedEvents();
46
- expect(emittedEvents).toHaveLength(1);
47
- const chunkEvent = emittedEvents[0];
48
- expect(chunkEvent.eventName).toBe("__streamed-socket-chunk");
49
- // Args should be a Uint8Array (binary encoded chunk)
50
- expect(chunkEvent.args).toBeInstanceOf(Uint8Array);
51
- // Decode the binary chunk
52
- const decodedChunk = decodeChunk(chunkEvent.args);
53
- expect(decodedChunk.messageId).toBeTruthy();
54
- expect(decodedChunk.chunkIndex).toBe(0);
55
- expect(decodedChunk.totalChunks).toBe(1);
56
- expect(decodedChunk.eventName).toBe("test-event");
57
- // Decode the actual data
58
- const decoded = (0, tx_encoding_1.txDecode)(decodedChunk.data);
59
- expect(decoded).toEqual(testData);
60
- });
61
- it("should emit multiple chunks for large messages", () => {
62
- const mock = createMockSocket();
63
- const streamedSocket = new streamed_socket_1.StreamedSocket(mock.socket, 256); // Small chunk size to force chunking
64
- // Create a large test object
65
- const testData = {
66
- message: "x".repeat(200),
67
- array: [1, 2, 3, 4, 5],
68
- nested: { deep: "value" },
69
- };
70
- streamedSocket.emit("test-event", testData, () => { });
71
- const emittedEvents = mock.getEmittedEvents();
72
- expect(emittedEvents.length).toBeGreaterThan(1);
73
- // Decode all chunks
74
- const decodedChunks = emittedEvents.map((event) => {
75
- expect(event.args).toBeInstanceOf(Uint8Array);
76
- return decodeChunk(event.args);
77
- });
78
- // Verify first chunk has metadata
79
- const firstChunk = decodedChunks[0];
80
- expect(firstChunk.eventName).toBe("test-event");
81
- expect(firstChunk.totalChunks).toBe(emittedEvents.length);
82
- expect(firstChunk.chunkIndex).toBe(0);
83
- // Verify all chunks have the same messageId
84
- const messageId = firstChunk.messageId;
85
- decodedChunks.forEach((chunk) => {
86
- expect(chunk.messageId).toBe(messageId);
87
- });
88
- // Verify chunks are in order
89
- decodedChunks.forEach((chunk, index) => {
90
- expect(chunk.chunkIndex).toBe(index);
91
- });
92
- // Verify all chunk data are Uint8Arrays
93
- decodedChunks.forEach((chunk) => {
94
- expect(chunk.data).toBeInstanceOf(Uint8Array);
95
- });
96
- // Reassemble chunks and verify data integrity
97
- const reassembled = new Uint8Array(decodedChunks.reduce((sum, chunk) => sum + chunk.data.length, 0));
98
- let offset = 0;
99
- for (const chunk of decodedChunks) {
100
- reassembled.set(chunk.data, offset);
101
- offset += chunk.data.length;
102
- }
103
- const decoded = (0, tx_encoding_1.txDecode)(reassembled);
104
- expect(decoded).toEqual(testData);
105
- });
106
- it("should handle binary data in messages", () => {
107
- const mock = createMockSocket();
108
- const streamedSocket = new streamed_socket_1.StreamedSocket(mock.socket, 1000);
109
- const testData = {
110
- binaryData: new Uint8Array([1, 2, 3, 4, 5]),
111
- metadata: { name: "test" },
112
- };
113
- streamedSocket.emit("test-event", testData, () => { });
114
- const emittedEvents = mock.getEmittedEvents();
115
- expect(emittedEvents).toHaveLength(1);
116
- const decodedChunk = decodeChunk(emittedEvents[0].args);
117
- const decoded = (0, tx_encoding_1.txDecode)(decodedChunk.data);
118
- expect(decoded.binaryData).toBeInstanceOf(Uint8Array);
119
- expect(decoded.binaryData).toEqual(testData.binaryData);
120
- expect(decoded.metadata).toEqual(testData.metadata);
121
- });
122
- it("should handle special types in messages", () => {
123
- const mock = createMockSocket();
124
- const streamedSocket = new streamed_socket_1.StreamedSocket(mock.socket, 1000);
125
- const testData = {
126
- date: new Date("2023-01-01T00:00:00.000Z"),
127
- nan: NaN,
128
- infinity: Infinity,
129
- undef: undefined,
130
- nullVal: null,
131
- };
132
- streamedSocket.emit("test-event", testData, () => { });
133
- const emittedEvents = mock.getEmittedEvents();
134
- expect(emittedEvents).toHaveLength(1);
135
- const decodedChunk = decodeChunk(emittedEvents[0].args);
136
- const decoded = (0, tx_encoding_1.txDecode)(decodedChunk.data);
137
- expect(decoded.date).toBeInstanceOf(Date);
138
- expect(decoded.date.toISOString()).toBe("2023-01-01T00:00:00.000Z");
139
- expect(Number.isNaN(decoded.nan)).toBe(true);
140
- expect(decoded.infinity).toBe(Infinity);
141
- expect(decoded.undef).toBeUndefined();
142
- expect(decoded.nullVal).toBeNull();
143
- });
144
- it("should demonstrate msgpack efficiency: structured data vs JSON string (uncompressed)", () => {
145
- const mock1 = createMockSocket();
146
- const mock2 = createMockSocket();
147
- const streamedSocket1 = new streamed_socket_1.StreamedSocket(mock1.socket, 1000000); // Large chunk to avoid splitting
148
- const streamedSocket2 = new streamed_socket_1.StreamedSocket(mock2.socket, 1000000);
149
- // Create a small structured object that won't trigger compression (< 1024 bytes)
150
- const smallObject = {
151
- users: Array.from({ length: 5 }, (_, i) => ({
152
- id: i + 1000000, // Use larger numbers to make JSON less compressible
153
- name: `User${i}_${Math.random().toString(36).substring(7)}`, // Add randomness
154
- email: `user${i}@example.com`,
155
- score: Math.random() * 1000,
156
- active: i % 2 === 0,
157
- })),
158
- };
159
- // Convert to JSON string
160
- const jsonString = JSON.stringify(smallObject);
161
- console.log(`Original JSON string size: ${jsonString.length} bytes`);
162
- // Send as structured object (msgpack can optimize)
163
- streamedSocket1.emit("test-object", smallObject, () => { });
164
- // Send as JSON string (msgpack treats it as opaque string)
165
- streamedSocket2.emit("test-string", { jsonPayload: jsonString }, () => { });
166
- const objectEvents = mock1.getEmittedEvents();
167
- const stringEvents = mock2.getEmittedEvents();
168
- expect(objectEvents).toHaveLength(1);
169
- expect(stringEvents).toHaveLength(1);
170
- // Decode and measure sizes
171
- const objectChunk = decodeChunk(objectEvents[0].args);
172
- const stringChunk = decodeChunk(stringEvents[0].args);
173
- const objectSize = objectChunk.data.length;
174
- const stringSize = stringChunk.data.length;
175
- console.log(`Msgpack with structured data: ${objectSize} bytes (${((1 - objectSize / jsonString.length) * 100).toFixed(1)}% reduction from JSON)`);
176
- console.log(`Msgpack with JSON string: ${stringSize} bytes (${((1 - stringSize / jsonString.length) * 100).toFixed(1)}% reduction from JSON)`);
177
- console.log(`Efficiency gain: structured data is ${((1 - objectSize / stringSize) * 100).toFixed(1)}% smaller than JSON string`);
178
- // Msgpack should be more efficient with structured data than with a JSON string
179
- expect(objectSize).toBeLessThan(stringSize);
180
- // Structured data should be at least 10% more efficient
181
- const efficiency = (1 - objectSize / stringSize) * 100;
182
- expect(efficiency).toBeGreaterThan(10);
183
- // Verify data integrity
184
- const decodedObject = (0, tx_encoding_1.txDecode)(objectChunk.data);
185
- const decodedString = (0, tx_encoding_1.txDecode)(stringChunk.data);
186
- expect(decodedObject.users).toHaveLength(5);
187
- expect(decodedString.jsonPayload).toBe(jsonString);
188
- });
189
- it("should demonstrate compression effectiveness for large repetitive data", () => {
190
- const mock = createMockSocket();
191
- const streamedSocket = new streamed_socket_1.StreamedSocket(mock.socket, 1000000);
192
- // Create large repetitive object that will compress well
193
- const largeObject = {
194
- data: Array.from({ length: 200 }, () => ({
195
- type: "event",
196
- status: "active",
197
- category: "user_action",
198
- timestamp: new Date("2024-01-01"),
199
- metadata: { app: "test", version: "1.0.0" },
200
- })),
201
- };
202
- const jsonString = JSON.stringify(largeObject);
203
- console.log(`Large repetitive data - JSON size: ${jsonString.length} bytes`);
204
- streamedSocket.emit("test-compressed", largeObject, () => { });
205
- const events = mock.getEmittedEvents();
206
- const chunk = decodeChunk(events[0].args);
207
- console.log(`After msgpack + compression: ${chunk.data.length} bytes`);
208
- console.log(`Compression ratio: ${((1 - chunk.data.length / jsonString.length) * 100).toFixed(1)}% reduction`);
209
- // Should achieve significant compression (>80% reduction)
210
- expect(chunk.data.length).toBeLessThan(jsonString.length * 0.2);
211
- // Verify data integrity
212
- const decoded = (0, tx_encoding_1.txDecode)(chunk.data);
213
- expect(decoded.data).toHaveLength(200);
214
- expect(decoded.data[0].type).toBe("event");
215
- });
216
- });
@@ -1 +0,0 @@
1
- export {};