@synnaxlabs/client 0.19.0 → 0.20.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 (268) hide show
  1. package/.turbo/turbo-build.log +5 -5
  2. package/README.md +1 -1
  3. package/dist/auth/auth.d.ts +1 -0
  4. package/dist/auth/auth.d.ts.map +1 -0
  5. package/dist/auth/auth.spec.d.ts +1 -0
  6. package/dist/auth/auth.spec.d.ts.map +1 -0
  7. package/dist/auth/index.d.ts +1 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/channel/batchRetriever.spec.d.ts +1 -0
  10. package/dist/channel/batchRetriever.spec.d.ts.map +1 -0
  11. package/dist/channel/channel.spec.d.ts +1 -0
  12. package/dist/channel/channel.spec.d.ts.map +1 -0
  13. package/dist/channel/client.d.ts +4 -3
  14. package/dist/channel/client.d.ts.map +1 -0
  15. package/dist/channel/external.d.ts +1 -0
  16. package/dist/channel/external.d.ts.map +1 -0
  17. package/dist/channel/index.d.ts +1 -0
  18. package/dist/channel/index.d.ts.map +1 -0
  19. package/dist/channel/payload.d.ts +1 -0
  20. package/dist/channel/payload.d.ts.map +1 -0
  21. package/dist/channel/retriever.d.ts +1 -0
  22. package/dist/channel/retriever.d.ts.map +1 -0
  23. package/dist/channel/writer.d.ts +1 -0
  24. package/dist/channel/writer.d.ts.map +1 -0
  25. package/dist/client.cjs +7 -7
  26. package/dist/client.cjs.map +1 -1
  27. package/dist/client.d.ts +3 -3
  28. package/dist/client.d.ts.map +1 -0
  29. package/dist/client.js +2014 -1988
  30. package/dist/client.js.map +1 -1
  31. package/dist/connection/checker.d.ts +1 -0
  32. package/dist/connection/checker.d.ts.map +1 -0
  33. package/dist/connection/connection.spec.d.ts +1 -0
  34. package/dist/connection/connection.spec.d.ts.map +1 -0
  35. package/dist/connection/index.d.ts +1 -0
  36. package/dist/connection/index.d.ts.map +1 -0
  37. package/dist/control/authority.d.ts +1 -0
  38. package/dist/control/authority.d.ts.map +1 -0
  39. package/dist/control/external.d.ts +1 -0
  40. package/dist/control/external.d.ts.map +1 -0
  41. package/dist/control/index.d.ts +1 -0
  42. package/dist/control/index.d.ts.map +1 -0
  43. package/dist/control/state.d.ts +1 -0
  44. package/dist/control/state.d.ts.map +1 -0
  45. package/dist/control/state.spec.d.ts +1 -0
  46. package/dist/control/state.spec.d.ts.map +1 -0
  47. package/dist/errors.d.ts +3 -2
  48. package/dist/errors.d.ts.map +1 -0
  49. package/dist/framer/adapter.d.ts +1 -0
  50. package/dist/framer/adapter.d.ts.map +1 -0
  51. package/dist/framer/adapter.spec.d.ts +1 -0
  52. package/dist/framer/adapter.spec.d.ts.map +1 -0
  53. package/dist/framer/client.d.ts +9 -15
  54. package/dist/framer/client.d.ts.map +1 -0
  55. package/dist/framer/client.spec.d.ts +2 -0
  56. package/dist/framer/client.spec.d.ts.map +1 -0
  57. package/dist/framer/external.d.ts +1 -0
  58. package/dist/framer/external.d.ts.map +1 -0
  59. package/dist/framer/frame.d.ts +25 -24
  60. package/dist/framer/frame.d.ts.map +1 -0
  61. package/dist/framer/frame.spec.d.ts +1 -0
  62. package/dist/framer/frame.spec.d.ts.map +1 -0
  63. package/dist/framer/index.d.ts +1 -0
  64. package/dist/framer/index.d.ts.map +1 -0
  65. package/dist/framer/iterator.d.ts +3 -2
  66. package/dist/framer/iterator.d.ts.map +1 -0
  67. package/dist/framer/iterator.spec.d.ts +1 -0
  68. package/dist/framer/iterator.spec.d.ts.map +1 -0
  69. package/dist/framer/streamProxy.d.ts +1 -0
  70. package/dist/framer/streamProxy.d.ts.map +1 -0
  71. package/dist/framer/streamer.d.ts +1 -0
  72. package/dist/framer/streamer.d.ts.map +1 -0
  73. package/dist/framer/streamer.spec.d.ts +1 -0
  74. package/dist/framer/streamer.spec.d.ts.map +1 -0
  75. package/dist/framer/writer.d.ts +21 -19
  76. package/dist/framer/writer.d.ts.map +1 -0
  77. package/dist/framer/writer.spec.d.ts +1 -0
  78. package/dist/framer/writer.spec.d.ts.map +1 -0
  79. package/dist/hardware/client.d.ts +1 -0
  80. package/dist/hardware/client.d.ts.map +1 -0
  81. package/dist/hardware/device/client.d.ts +1 -0
  82. package/dist/hardware/device/client.d.ts.map +1 -0
  83. package/dist/hardware/device/device.spec.d.ts +1 -0
  84. package/dist/hardware/device/device.spec.d.ts.map +1 -0
  85. package/dist/hardware/device/external.d.ts +1 -0
  86. package/dist/hardware/device/external.d.ts.map +1 -0
  87. package/dist/hardware/device/index.d.ts +1 -0
  88. package/dist/hardware/device/index.d.ts.map +1 -0
  89. package/dist/hardware/device/payload.d.ts +1 -0
  90. package/dist/hardware/device/payload.d.ts.map +1 -0
  91. package/dist/hardware/device/retriever.d.ts +1 -0
  92. package/dist/hardware/device/retriever.d.ts.map +1 -0
  93. package/dist/hardware/device/writer.d.ts +1 -0
  94. package/dist/hardware/device/writer.d.ts.map +1 -0
  95. package/dist/hardware/external.d.ts +1 -0
  96. package/dist/hardware/external.d.ts.map +1 -0
  97. package/dist/hardware/index.d.ts +1 -0
  98. package/dist/hardware/index.d.ts.map +1 -0
  99. package/dist/hardware/rack/client.d.ts +1 -0
  100. package/dist/hardware/rack/client.d.ts.map +1 -0
  101. package/dist/hardware/rack/external.d.ts +1 -0
  102. package/dist/hardware/rack/external.d.ts.map +1 -0
  103. package/dist/hardware/rack/index.d.ts +1 -0
  104. package/dist/hardware/rack/index.d.ts.map +1 -0
  105. package/dist/hardware/rack/payload.d.ts +1 -0
  106. package/dist/hardware/rack/payload.d.ts.map +1 -0
  107. package/dist/hardware/rack/rack.spec.d.ts +1 -0
  108. package/dist/hardware/rack/rack.spec.d.ts.map +1 -0
  109. package/dist/hardware/rack/retriever.d.ts +1 -0
  110. package/dist/hardware/rack/retriever.d.ts.map +1 -0
  111. package/dist/hardware/rack/writer.d.ts +1 -0
  112. package/dist/hardware/rack/writer.d.ts.map +1 -0
  113. package/dist/hardware/task/client.d.ts +1 -0
  114. package/dist/hardware/task/client.d.ts.map +1 -0
  115. package/dist/hardware/task/external.d.ts +1 -0
  116. package/dist/hardware/task/external.d.ts.map +1 -0
  117. package/dist/hardware/task/index.d.ts +1 -0
  118. package/dist/hardware/task/index.d.ts.map +1 -0
  119. package/dist/hardware/task/payload.d.ts +1 -0
  120. package/dist/hardware/task/payload.d.ts.map +1 -0
  121. package/dist/hardware/task/retriever.d.ts +1 -0
  122. package/dist/hardware/task/retriever.d.ts.map +1 -0
  123. package/dist/hardware/task/task.spec.d.ts +1 -0
  124. package/dist/hardware/task/task.spec.d.ts.map +1 -0
  125. package/dist/hardware/task/writer.d.ts +1 -0
  126. package/dist/hardware/task/writer.d.ts.map +1 -0
  127. package/dist/index.d.ts +1 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/label/client.d.ts +1 -0
  130. package/dist/label/client.d.ts.map +1 -0
  131. package/dist/label/external.d.ts +1 -0
  132. package/dist/label/external.d.ts.map +1 -0
  133. package/dist/label/index.d.ts +1 -0
  134. package/dist/label/index.d.ts.map +1 -0
  135. package/dist/label/label.spec.d.ts +1 -0
  136. package/dist/label/label.spec.d.ts.map +1 -0
  137. package/dist/label/payload.d.ts +1 -0
  138. package/dist/label/payload.d.ts.map +1 -0
  139. package/dist/label/retriever.d.ts +1 -0
  140. package/dist/label/retriever.d.ts.map +1 -0
  141. package/dist/label/writer.d.ts +1 -0
  142. package/dist/label/writer.d.ts.map +1 -0
  143. package/dist/ontology/client.d.ts +1 -0
  144. package/dist/ontology/client.d.ts.map +1 -0
  145. package/dist/ontology/external.d.ts +1 -0
  146. package/dist/ontology/external.d.ts.map +1 -0
  147. package/dist/ontology/group/client.d.ts +1 -0
  148. package/dist/ontology/group/client.d.ts.map +1 -0
  149. package/dist/ontology/group/external.d.ts +1 -0
  150. package/dist/ontology/group/external.d.ts.map +1 -0
  151. package/dist/ontology/group/group.d.ts +1 -0
  152. package/dist/ontology/group/group.d.ts.map +1 -0
  153. package/dist/ontology/group/group.spec.d.ts +1 -0
  154. package/dist/ontology/group/group.spec.d.ts.map +1 -0
  155. package/dist/ontology/group/index.d.ts +1 -0
  156. package/dist/ontology/group/index.d.ts.map +1 -0
  157. package/dist/ontology/group/payload.d.ts +1 -0
  158. package/dist/ontology/group/payload.d.ts.map +1 -0
  159. package/dist/ontology/group/writer.d.ts +1 -0
  160. package/dist/ontology/group/writer.d.ts.map +1 -0
  161. package/dist/ontology/index.d.ts +1 -0
  162. package/dist/ontology/index.d.ts.map +1 -0
  163. package/dist/ontology/ontology.spec.d.ts +1 -0
  164. package/dist/ontology/ontology.spec.d.ts.map +1 -0
  165. package/dist/ontology/payload.d.ts +1 -0
  166. package/dist/ontology/payload.d.ts.map +1 -0
  167. package/dist/ontology/retriever.d.ts +1 -0
  168. package/dist/ontology/retriever.d.ts.map +1 -0
  169. package/dist/ontology/signals.d.ts +1 -0
  170. package/dist/ontology/signals.d.ts.map +1 -0
  171. package/dist/ontology/writer.d.ts +1 -0
  172. package/dist/ontology/writer.d.ts.map +1 -0
  173. package/dist/ranger/active.d.ts +1 -0
  174. package/dist/ranger/active.d.ts.map +1 -0
  175. package/dist/ranger/alias.d.ts +1 -0
  176. package/dist/ranger/alias.d.ts.map +1 -0
  177. package/dist/ranger/client.d.ts +1 -0
  178. package/dist/ranger/client.d.ts.map +1 -0
  179. package/dist/ranger/external.d.ts +1 -0
  180. package/dist/ranger/external.d.ts.map +1 -0
  181. package/dist/ranger/index.d.ts +1 -0
  182. package/dist/ranger/index.d.ts.map +1 -0
  183. package/dist/ranger/kv.d.ts +1 -0
  184. package/dist/ranger/kv.d.ts.map +1 -0
  185. package/dist/ranger/payload.d.ts +29 -28
  186. package/dist/ranger/payload.d.ts.map +1 -0
  187. package/dist/ranger/range.d.ts +1 -0
  188. package/dist/ranger/range.d.ts.map +1 -0
  189. package/dist/ranger/ranger.spec.d.ts +1 -0
  190. package/dist/ranger/ranger.spec.d.ts.map +1 -0
  191. package/dist/ranger/retriever.d.ts +1 -0
  192. package/dist/ranger/retriever.d.ts.map +1 -0
  193. package/dist/ranger/writer.d.ts +1 -0
  194. package/dist/ranger/writer.d.ts.map +1 -0
  195. package/dist/setupspecs.d.ts +1 -0
  196. package/dist/setupspecs.d.ts.map +1 -0
  197. package/dist/signals/external.d.ts +1 -0
  198. package/dist/signals/external.d.ts.map +1 -0
  199. package/dist/signals/index.d.ts +1 -0
  200. package/dist/signals/index.d.ts.map +1 -0
  201. package/dist/signals/observable.d.ts +1 -0
  202. package/dist/signals/observable.d.ts.map +1 -0
  203. package/dist/transport.d.ts +1 -0
  204. package/dist/transport.d.ts.map +1 -0
  205. package/dist/user/index.d.ts +1 -0
  206. package/dist/user/index.d.ts.map +1 -0
  207. package/dist/user/payload.d.ts +1 -0
  208. package/dist/user/payload.d.ts.map +1 -0
  209. package/dist/util/telem.d.ts +1 -0
  210. package/dist/util/telem.d.ts.map +1 -0
  211. package/dist/workspace/client.d.ts +1 -0
  212. package/dist/workspace/client.d.ts.map +1 -0
  213. package/dist/workspace/external.d.ts +1 -0
  214. package/dist/workspace/external.d.ts.map +1 -0
  215. package/dist/workspace/index.d.ts +1 -0
  216. package/dist/workspace/index.d.ts.map +1 -0
  217. package/dist/workspace/lineplot/client.d.ts +1 -0
  218. package/dist/workspace/lineplot/client.d.ts.map +1 -0
  219. package/dist/workspace/lineplot/external.d.ts +1 -0
  220. package/dist/workspace/lineplot/external.d.ts.map +1 -0
  221. package/dist/workspace/lineplot/index.d.ts +1 -0
  222. package/dist/workspace/lineplot/index.d.ts.map +1 -0
  223. package/dist/workspace/lineplot/linePlot.spec.d.ts +1 -0
  224. package/dist/workspace/lineplot/linePlot.spec.d.ts.map +1 -0
  225. package/dist/workspace/lineplot/payload.d.ts +1 -0
  226. package/dist/workspace/lineplot/payload.d.ts.map +1 -0
  227. package/dist/workspace/lineplot/retriever.d.ts +1 -0
  228. package/dist/workspace/lineplot/retriever.d.ts.map +1 -0
  229. package/dist/workspace/lineplot/writer.d.ts +1 -0
  230. package/dist/workspace/lineplot/writer.d.ts.map +1 -0
  231. package/dist/workspace/payload.d.ts +1 -0
  232. package/dist/workspace/payload.d.ts.map +1 -0
  233. package/dist/workspace/pid/client.d.ts +1 -0
  234. package/dist/workspace/pid/client.d.ts.map +1 -0
  235. package/dist/workspace/pid/external.d.ts +1 -0
  236. package/dist/workspace/pid/external.d.ts.map +1 -0
  237. package/dist/workspace/pid/index.d.ts +1 -0
  238. package/dist/workspace/pid/index.d.ts.map +1 -0
  239. package/dist/workspace/pid/payload.d.ts +1 -0
  240. package/dist/workspace/pid/payload.d.ts.map +1 -0
  241. package/dist/workspace/pid/pid.spec.d.ts +1 -0
  242. package/dist/workspace/pid/pid.spec.d.ts.map +1 -0
  243. package/dist/workspace/pid/retriever.d.ts +1 -0
  244. package/dist/workspace/pid/retriever.d.ts.map +1 -0
  245. package/dist/workspace/pid/writer.d.ts +1 -0
  246. package/dist/workspace/pid/writer.d.ts.map +1 -0
  247. package/dist/workspace/retriever.d.ts +1 -0
  248. package/dist/workspace/retriever.d.ts.map +1 -0
  249. package/dist/workspace/workspace.spec.d.ts +1 -0
  250. package/dist/workspace/workspace.spec.d.ts.map +1 -0
  251. package/dist/workspace/writer.d.ts +1 -0
  252. package/dist/workspace/writer.d.ts.map +1 -0
  253. package/examples/node/liveStream.js +1 -1
  254. package/examples/node/package-lock.json +46 -47
  255. package/examples/node/package.json +2 -2
  256. package/examples/node/streamWrite.js +1 -1
  257. package/package.json +12 -12
  258. package/src/channel/client.ts +7 -7
  259. package/src/client.ts +24 -27
  260. package/src/control/state.spec.ts +2 -2
  261. package/src/errors.ts +2 -2
  262. package/src/framer/client.spec.ts +63 -0
  263. package/src/framer/client.ts +46 -14
  264. package/src/framer/iterator.spec.ts +2 -2
  265. package/src/framer/iterator.ts +7 -2
  266. package/src/framer/streamer.spec.ts +4 -4
  267. package/src/framer/writer.spec.ts +6 -6
  268. package/src/framer/writer.ts +6 -1
@@ -9,7 +9,7 @@
9
9
  "version": "1.0.0",
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
- "@synnaxlabs/client": "^0.18.2"
12
+ "@synnaxlabs/client": "^0.19.0"
13
13
  }
14
14
  },
15
15
  "node_modules/@grpc/grpc-js": {
@@ -3653,35 +3653,23 @@
3653
3653
  }
3654
3654
  },
3655
3655
  "node_modules/@synnaxlabs/client": {
3656
- "version": "0.18.2",
3657
- "resolved": "https://registry.npmjs.org/@synnaxlabs/client/-/client-0.18.2.tgz",
3658
- "integrity": "sha512-y/uetgJq4zeB+7HTqFZyMkLYe1cV4iU0gRc90V/kYvVwTtWt0F5aB2kpZi5ta4nJTFFczPSUwzHOQNVm0zUZOQ==",
3656
+ "version": "0.19.0",
3657
+ "resolved": "https://registry.npmjs.org/@synnaxlabs/client/-/client-0.19.0.tgz",
3658
+ "integrity": "sha512-GS0TOznRbxMeRS1wMGo3tz91goM2tmaqN/QEUebfCY6UjTKAmLZEUKqtjQZGvrk/0k4euP5DoEf4i1YE0julCg==",
3659
3659
  "dependencies": {
3660
- "@synnaxlabs/freighter": "0.9.3",
3661
- "@synnaxlabs/x": "0.15.2",
3660
+ "@synnaxlabs/freighter": "0.9.4",
3661
+ "@synnaxlabs/x": "0.15.4",
3662
3662
  "async-mutex": "^0.4.0",
3663
3663
  "zod": "3.22.4"
3664
3664
  }
3665
3665
  },
3666
- "node_modules/@synnaxlabs/client/node_modules/@synnaxlabs/x": {
3667
- "version": "0.15.2",
3668
- "resolved": "https://registry.npmjs.org/@synnaxlabs/x/-/x-0.15.2.tgz",
3669
- "integrity": "sha512-d0XP4tk7dx7847aeXppAFVCKLmPSGIWRnsyDvTkbU9rEZdt1XLnQh1+PoWBmlYUNtliGhcgOKkbCv3Tj9Di38Q==",
3670
- "dependencies": {
3671
- "async-mutex": "^0.4.0",
3672
- "js-convert-case": "^4.2.0",
3673
- "nanoid": "^5.0.2",
3674
- "typescript": "^5.3.3",
3675
- "zod": "3.22.4"
3676
- }
3677
- },
3678
3666
  "node_modules/@synnaxlabs/freighter": {
3679
- "version": "0.9.3",
3680
- "resolved": "https://registry.npmjs.org/@synnaxlabs/freighter/-/freighter-0.9.3.tgz",
3681
- "integrity": "sha512-H8a4HePVykwlkQMw8yClJ/BpydMDieBD2HHC2bBcvfJKZ3w32uiAqvhqezy14aU2XgNG92hU65IBi2FT6esBng==",
3667
+ "version": "0.9.4",
3668
+ "resolved": "https://registry.npmjs.org/@synnaxlabs/freighter/-/freighter-0.9.4.tgz",
3669
+ "integrity": "sha512-WgkpLPuJrX3DA5+6c3i+OGJ/aeTFcEVGb1vf1nz47GGzAMRI4LikVSvodG9FuM2i2oTWsdbJJJpweX84PKDRvw==",
3682
3670
  "dependencies": {
3683
3671
  "@synnaxlabs/alamos": "0.3.0",
3684
- "@synnaxlabs/x": "0.15.0",
3672
+ "@synnaxlabs/x": "0.15.3",
3685
3673
  "js-convert-case": "^4.2.0",
3686
3674
  "node-fetch": "2.6.11",
3687
3675
  "ws": "^8.15.1",
@@ -3691,14 +3679,25 @@
3691
3679
  "node": ">=18"
3692
3680
  }
3693
3681
  },
3682
+ "node_modules/@synnaxlabs/freighter/node_modules/@synnaxlabs/x": {
3683
+ "version": "0.15.3",
3684
+ "resolved": "https://registry.npmjs.org/@synnaxlabs/x/-/x-0.15.3.tgz",
3685
+ "integrity": "sha512-gVIh1xSvvIlkuOr4QPMeFdzAStX+YhSjL2Pc7sytxDnm0iYhIJn+4kGSBE7GAqBqFbaeaIVNoo1Iif4v+mlYOg==",
3686
+ "dependencies": {
3687
+ "async-mutex": "^0.4.0",
3688
+ "js-convert-case": "^4.2.0",
3689
+ "nanoid": "^5.0.2",
3690
+ "typescript": "^5.3.3",
3691
+ "zod": "3.22.4"
3692
+ }
3693
+ },
3694
3694
  "node_modules/@synnaxlabs/x": {
3695
- "version": "0.15.0",
3696
- "resolved": "https://registry.npmjs.org/@synnaxlabs/x/-/x-0.15.0.tgz",
3697
- "integrity": "sha512-baowvPsc0oKeMscKHh/5u0WVRB7J3ylIYzkx8feyP67QkjE8PCQpf0gmdThMGg6r0HwUbubzTcD0N64TNvahWw==",
3695
+ "version": "0.15.4",
3696
+ "resolved": "https://registry.npmjs.org/@synnaxlabs/x/-/x-0.15.4.tgz",
3697
+ "integrity": "sha512-uk9A+wDy5d0F3grB3M/sIxpetj7Zs06nMpgMw/6AKc7op+GWoqqh2ohhnV4LxEDtku9CfDYySa1OngtCGZKzDA==",
3698
3698
  "dependencies": {
3699
3699
  "async-mutex": "^0.4.0",
3700
3700
  "js-convert-case": "^4.2.0",
3701
- "msgpackr": "^1.9.9",
3702
3701
  "nanoid": "^5.0.2",
3703
3702
  "typescript": "^5.3.3",
3704
3703
  "zod": "3.22.4"
@@ -3770,9 +3769,9 @@
3770
3769
  }
3771
3770
  },
3772
3771
  "node_modules/@types/express-serve-static-core": {
3773
- "version": "4.17.43",
3774
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz",
3775
- "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==",
3772
+ "version": "4.19.0",
3773
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz",
3774
+ "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==",
3776
3775
  "dependencies": {
3777
3776
  "@types/node": "*",
3778
3777
  "@types/qs": "*",
@@ -3898,9 +3897,9 @@
3898
3897
  }
3899
3898
  },
3900
3899
  "node_modules/@types/node": {
3901
- "version": "20.12.4",
3902
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz",
3903
- "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==",
3900
+ "version": "20.12.7",
3901
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
3902
+ "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
3904
3903
  "dependencies": {
3905
3904
  "undici-types": "~5.26.4"
3906
3905
  }
@@ -3924,9 +3923,9 @@
3924
3923
  }
3925
3924
  },
3926
3925
  "node_modules/@types/qs": {
3927
- "version": "6.9.14",
3928
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz",
3929
- "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA=="
3926
+ "version": "6.9.15",
3927
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz",
3928
+ "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg=="
3930
3929
  },
3931
3930
  "node_modules/@types/range-parser": {
3932
3931
  "version": "1.2.7",
@@ -4426,9 +4425,9 @@
4426
4425
  }
4427
4426
  },
4428
4427
  "node_modules/gaxios": {
4429
- "version": "6.4.0",
4430
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.4.0.tgz",
4431
- "integrity": "sha512-apAloYrY4dlBGlhauDAYSZveafb5U6+L9titing1wox6BvWM0TSXBp603zTrLpyLMGkrcFgohnUN150dFN/zOA==",
4428
+ "version": "6.5.0",
4429
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.5.0.tgz",
4430
+ "integrity": "sha512-R9QGdv8j4/dlNoQbX3hSaK/S0rkMijqjVvW3YM06CoBdbU/VdKd159j4hePpng0KuE6Lh6JJ7UdmVGJZFcAG1w==",
4432
4431
  "dependencies": {
4433
4432
  "extend": "^3.0.2",
4434
4433
  "https-proxy-agent": "^7.0.1",
@@ -4525,9 +4524,9 @@
4525
4524
  }
4526
4525
  },
4527
4526
  "node_modules/joi": {
4528
- "version": "17.12.3",
4529
- "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.3.tgz",
4530
- "integrity": "sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==",
4527
+ "version": "17.13.0",
4528
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.0.tgz",
4529
+ "integrity": "sha512-9qcrTyoBmFZRNHeVP4edKqIUEgFzq7MHvTNSDuHSqkpOPtiBkgNgcmTSqmiw1kw9tdKaiddvIDv/eCJDxmqWCA==",
4531
4530
  "dependencies": {
4532
4531
  "@hapi/hoek": "^9.3.0",
4533
4532
  "@hapi/topo": "^5.1.0",
@@ -4615,9 +4614,9 @@
4615
4614
  }
4616
4615
  },
4617
4616
  "node_modules/nanoid": {
4618
- "version": "5.0.6",
4619
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.6.tgz",
4620
- "integrity": "sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==",
4617
+ "version": "5.0.7",
4618
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz",
4619
+ "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==",
4621
4620
  "funding": [
4622
4621
  {
4623
4622
  "type": "github",
@@ -4854,9 +4853,9 @@
4854
4853
  "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
4855
4854
  },
4856
4855
  "node_modules/typescript": {
4857
- "version": "5.4.3",
4858
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz",
4859
- "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==",
4856
+ "version": "5.4.5",
4857
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
4858
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
4860
4859
  "bin": {
4861
4860
  "tsc": "bin/tsc",
4862
4861
  "tsserver": "bin/tsserver"
@@ -11,6 +11,6 @@
11
11
  "author": "",
12
12
  "license": "ISC",
13
13
  "dependencies": {
14
- "@synnaxlabs/client": "^0.18.2"
14
+ "@synnaxlabs/client": "^0.19.0"
15
15
  }
16
- }
16
+ }
@@ -48,7 +48,7 @@ const roughRate = Rate.hz(40);
48
48
  // historical reads every 500 samples.
49
49
  const commitInterval = 500;
50
50
 
51
- const writer = await client.telem.openWriter({
51
+ const writer = await client.openWriter({
52
52
  start,
53
53
  channels: [timeChannel.key, dataChannel1.key, dataChannel2.key]
54
54
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@synnaxlabs/client",
3
3
  "private": false,
4
- "version": "0.19.0",
4
+ "version": "0.20.0",
5
5
  "type": "module",
6
6
  "description": "The Client Library for Synnax",
7
7
  "repository": "https://github.com/synnaxlabs/synnax/tree/main/client/ts",
@@ -16,21 +16,21 @@
16
16
  "control systems"
17
17
  ],
18
18
  "dependencies": {
19
- "async-mutex": "^0.4.0",
19
+ "async-mutex": "^0.4.1",
20
20
  "zod": "3.22.4",
21
- "@synnaxlabs/x": "0.15.4",
22
- "@synnaxlabs/freighter": "0.9.4"
21
+ "@synnaxlabs/freighter": "0.9.4",
22
+ "@synnaxlabs/x": "0.16.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@types/node": "^20.10.5",
26
- "@vitest/coverage-v8": "^1.2.2",
27
- "eslint": "^8.55.0",
28
- "typescript": "^5.3.3",
29
- "vite": "^5.1.2",
30
- "vitest": "^1.2.2",
31
- "eslint-config-synnaxlabs": "0.0.1",
25
+ "@types/node": "^20.12.7",
26
+ "@vitest/coverage-v8": "1.2.2",
27
+ "eslint": "^8.57.0",
28
+ "typescript": "^5.4.5",
29
+ "vite": "5.1.2",
30
+ "vitest": "1.2.2",
31
+ "@synnaxlabs/tsconfig": "0.0.2",
32
32
  "@synnaxlabs/vite-plugin": "0.0.1",
33
- "@synnaxlabs/tsconfig": "0.0.2"
33
+ "eslint-config-synnaxlabs": "0.0.1"
34
34
  },
35
35
  "main": "dist/client.cjs",
36
36
  "module": "dist/client.js",
@@ -13,11 +13,11 @@ import {
13
13
  Rate,
14
14
  type TypedArray,
15
15
  type CrudeDensity,
16
- type Series,
17
16
  type TimeRange,
18
17
  type AsyncTermSearcher,
19
18
  toArray,
20
19
  type CrudeTimeStamp,
20
+ type MultiSeries,
21
21
  } from "@synnaxlabs/x";
22
22
 
23
23
  import {
@@ -36,7 +36,7 @@ import {
36
36
  type Retriever,
37
37
  } from "@/channel/retriever";
38
38
  import { type Writer } from "@/channel/writer";
39
- import { MultipleResultsError, NoResultsError, ValidationError } from "@/errors";
39
+ import { MultipleFoundError, NotFoundError, ValidationError } from "@/errors";
40
40
  import { type framer } from "@/framer";
41
41
 
42
42
  interface CreateOptions {
@@ -148,7 +148,7 @@ export class Channel {
148
148
  * @param end - The ending timestamp of the range to read from.
149
149
  * @returns A typed array containing the retrieved
150
150
  */
151
- async read(tr: TimeRange): Promise<Series | undefined> {
151
+ async read(tr: TimeRange): Promise<MultiSeries> {
152
152
  return await this.framer.read(tr, this.key);
153
153
  }
154
154
 
@@ -159,7 +159,7 @@ export class Channel {
159
159
  * @param data - THe telemetry to write to the channel.
160
160
  */
161
161
  async write(start: CrudeTimeStamp, data: TypedArray): Promise<void> {
162
- return await this.framer.write(this.key, start, data);
162
+ return await this.framer.write(start, this.key, data);
163
163
  }
164
164
  }
165
165
 
@@ -277,7 +277,7 @@ export class Client implements AsyncTermSearcher<string, Key, Channel> {
277
277
  *
278
278
  * @returns The retrieved channel.
279
279
  * @throws {NotFoundError} if the channel does not exist in the cluster.
280
- * @throws {MultipleResultsError} is only thrown if the channel is retrieved by name,
280
+ * @throws {MultipleFoundError} is only thrown if the channel is retrieved by name,
281
281
  * and multiple channels with the same name exist in the cluster.
282
282
  *
283
283
  * @example
@@ -316,9 +316,9 @@ export class Client implements AsyncTermSearcher<string, Key, Channel> {
316
316
  const res = this.sugar(await this.retriever.retrieve(channels, rangeKey));
317
317
  if (!single) return res;
318
318
  if (res.length === 0)
319
- throw new NoResultsError(`channel matching ${actual} not found`);
319
+ throw new NotFoundError(`channel matching ${actual} not found`);
320
320
  if (res.length > 1)
321
- throw new MultipleResultsError(`multiple channels matching ${actual} found`);
321
+ throw new MultipleFoundError(`multiple channels matching ${actual} found`);
322
322
  return res[0];
323
323
  }
324
324
 
package/src/client.ts CHANGED
@@ -47,10 +47,9 @@ export type ParsedSynnaxProps = z.output<typeof synnaxPropsZ>;
47
47
  * @property ontology - Client for querying the cluster's ontology.
48
48
  */
49
49
  // eslint-disable-next-line import/no-default-export
50
- export default class Synnax {
50
+ export default class Synnax extends framer.Client {
51
51
  readonly createdAt: TimeStamp;
52
52
  readonly props: ParsedSynnaxProps;
53
- readonly telem: framer.Client;
54
53
  readonly ranges: ranger.Client;
55
54
  readonly channels: channel.Client;
56
55
  readonly auth: auth.Client | undefined;
@@ -77,42 +76,40 @@ export default class Synnax {
77
76
  * A Synnax client must be closed when it is no longer needed. This will stop
78
77
  * the client from polling the cluster for connectivity information.
79
78
  */
80
- constructor(props: SynnaxProps) {
81
- this.createdAt = TimeStamp.now();
82
- this.props = synnaxPropsZ.parse(props);
83
- const { host, port, username, password, connectivityPollFrequency, secure } =
84
- this.props;
85
- this.transport = new Transport(new URL({ host, port: Number(port) }), secure);
86
- this.transport.use(errorsMiddleware);
79
+ constructor(props_: SynnaxProps) {
80
+ const props = synnaxPropsZ.parse(props_);
81
+ const { host, port, username, password, connectivityPollFrequency, secure } = props;
82
+ const transport = new Transport(new URL({ host, port: Number(port) }), secure);
83
+ transport.use(errorsMiddleware);
84
+ let auth_: auth.Client | undefined;
87
85
  if (username != null && password != null) {
88
- this.auth = new auth.Client(this.transport.unary, {
86
+ const auth_ = new auth.Client(transport.unary, {
89
87
  username,
90
88
  password,
91
89
  });
92
- this.transport.use(this.auth.middleware());
90
+ transport.use(auth_.middleware());
93
91
  }
94
92
  const chRetriever = new channel.CacheRetriever(
95
- new channel.ClusterRetriever(this.transport.unary),
96
- );
97
- const chCreator = new channel.Writer(this.transport.unary);
98
- this.telem = new framer.Client(this.transport.stream, chRetriever);
99
- this.channels = new channel.Client(
100
- this.telem,
101
- chRetriever,
102
- this.transport.unary,
103
- chCreator,
93
+ new channel.ClusterRetriever(transport.unary),
104
94
  );
95
+ const chCreator = new channel.Writer(transport.unary);
96
+ super(transport.stream, chRetriever);
97
+ this.createdAt = TimeStamp.now();
98
+ this.props = props;
99
+ this.auth = auth_;
100
+ this.transport = transport;
101
+ this.channels = new channel.Client(this, chRetriever, transport.unary, chCreator);
105
102
  this.connectivity = new connection.Checker(
106
- this.transport.unary,
103
+ transport.unary,
107
104
  connectivityPollFrequency,
108
105
  props.name,
109
106
  );
110
- this.ontology = new ontology.Client(this.transport.unary, this.telem);
111
- const rangeRetriever = new ranger.Retriever(this.transport.unary);
107
+ this.ontology = new ontology.Client(transport.unary, this);
108
+ const rangeRetriever = new ranger.Retriever(transport.unary);
112
109
  const rangeWriter = new ranger.Writer(this.transport.unary);
113
- this.labels = new label.Client(this.transport.unary, this.telem);
110
+ this.labels = new label.Client(this.transport.unary, this);
114
111
  this.ranges = new ranger.Client(
115
- this.telem,
112
+ this,
116
113
  rangeRetriever,
117
114
  rangeWriter,
118
115
  this.transport.unary,
@@ -123,7 +120,7 @@ export default class Synnax {
123
120
  const devices = new device.Client(
124
121
  new device.Retriever(this.transport.unary),
125
122
  new device.Writer(this.transport.unary),
126
- this.telem,
123
+ this,
127
124
  );
128
125
  const taskRetriever = new task.Retriever(this.transport.unary);
129
126
  const taskWriter = new task.Writer(this.transport.unary);
@@ -131,7 +128,7 @@ export default class Synnax {
131
128
  const racks = new rack.Client(
132
129
  new rack.Retriever(this.transport.unary),
133
130
  new rack.Writer(this.transport.unary),
134
- this.telem,
131
+ this,
135
132
  taskWriter,
136
133
  taskRetriever,
137
134
  );
@@ -16,9 +16,9 @@ const client = newClient();
16
16
 
17
17
  describe("state", () => {
18
18
  it("should receive the initial control state from the cluster", async () => {
19
- const s = await control.StateTracker.open(client.telem);
19
+ const s = await control.StateTracker.open(client);
20
20
  await new Promise((resolve) => setTimeout(resolve, 50));
21
21
  expect(s.states.size).toBeGreaterThan(0);
22
- s.close();
22
+ await s.close();
23
23
  });
24
24
  });
package/src/errors.ts CHANGED
@@ -95,9 +95,9 @@ export class UnexpectedError extends BaseError {
95
95
  */
96
96
  export class QueryError extends BaseError {}
97
97
 
98
- export class NoResultsError extends QueryError {}
98
+ export class NotFoundError extends QueryError {}
99
99
 
100
- export class MultipleResultsError extends QueryError {}
100
+ export class MultipleFoundError extends QueryError {}
101
101
 
102
102
  /**
103
103
  * RouteError is raised when a routing error occurs.
@@ -0,0 +1,63 @@
1
+ // Copyright 2023 Synnax Labs, Inc.
2
+ //
3
+ // Use of this software is governed by the Business Source License included in the file
4
+ // licenses/BSL.txt.
5
+ //
6
+ // As of the Change Date specified in that file, in accordance with the Business Source
7
+ // License, use of this software will be governed by the Apache License, Version 2.0,
8
+ // included in the file licenses/APL.txt.
9
+
10
+ import { TimeSpan, TimeStamp } from "@synnaxlabs/x";
11
+ import { describe, expect, it } from "vitest";
12
+
13
+ import { newClient } from "@/setupspecs";
14
+
15
+ const client = newClient();
16
+
17
+ describe("Client", () => {
18
+ describe("read + write", () => {
19
+ it("should correctly write and read a frame of data", async () => {
20
+ const rand = `${TimeStamp.now().toString()}${Math.random()}`;
21
+ const time = await client.channels.create({
22
+ name: `time-${rand}`,
23
+ dataType: "timestamp",
24
+ isIndex: true,
25
+ });
26
+ const data = await client.channels.create({
27
+ name: `data-${rand}`,
28
+ dataType: "float32",
29
+ index: time.key,
30
+ });
31
+ const start = TimeStamp.now();
32
+ await client.write(start, {
33
+ [time.key]: [start],
34
+ [data.key]: [1],
35
+ });
36
+ const frame = await client.read(
37
+ {
38
+ start,
39
+ end: start.add(TimeSpan.seconds(1)),
40
+ },
41
+ [time.key, data.key],
42
+ );
43
+ expect(Array.from(frame.get(time.key))).toEqual([start.valueOf()]);
44
+ expect(Array.from(frame.get(data.key))).toEqual([1]);
45
+ });
46
+ it("should correctly write a single series of data", async () => {
47
+ const rand = `${TimeStamp.now().toString()}${Math.random()}`;
48
+ const time = await client.channels.create({
49
+ name: `time-${rand}`,
50
+ dataType: "timestamp",
51
+ isIndex: true,
52
+ });
53
+ const data = await client.channels.create({
54
+ name: `data-${rand}`,
55
+ dataType: "float32",
56
+ index: time.key,
57
+ });
58
+ const start = TimeStamp.now();
59
+ await client.write(start, time.key, TimeStamp.now());
60
+ await client.write(start, data.key, 1);
61
+ });
62
+ });
63
+ });
@@ -9,13 +9,13 @@
9
9
 
10
10
  import { type StreamClient } from "@synnaxlabs/freighter";
11
11
  import {
12
- type Series,
13
- type TimeRange,
14
12
  type CrudeTimeStamp,
15
13
  type CrudeSeries,
14
+ type CrudeTimeRange,
15
+ type MultiSeries,
16
16
  } from "@synnaxlabs/x";
17
17
 
18
- import { type KeyOrName, type Params } from "@/channel/payload";
18
+ import { type KeysOrNames, type KeyOrName, type Params } from "@/channel/payload";
19
19
  import { type Retriever, analyzeParams } from "@/channel/retriever";
20
20
  import { Frame } from "@/framer/frame";
21
21
  import { Iterator } from "@/framer/iterator";
@@ -38,7 +38,7 @@ export class Client {
38
38
  * @param keys - A list of channel keys to iterate over.
39
39
  * @returns a new {@link TypedIterator}.
40
40
  */
41
- async openIterator(tr: TimeRange, channels: Params): Promise<Iterator> {
41
+ async openIterator(tr: CrudeTimeRange, channels: Params): Promise<Iterator> {
42
42
  return await Iterator._open(tr, channels, this.retriever, this.stream);
43
43
  }
44
44
 
@@ -84,45 +84,77 @@ export class Client {
84
84
  return await Streamer._open(this.retriever, this.stream, config as StreamerConfig);
85
85
  }
86
86
 
87
+ async write(
88
+ start: CrudeTimeStamp,
89
+ channel: KeyOrName,
90
+ data: CrudeSeries,
91
+ ): Promise<void>;
92
+
93
+ async write(
94
+ start: CrudeTimeStamp,
95
+ channels: KeysOrNames,
96
+ data: CrudeSeries[],
97
+ ): Promise<void>;
98
+
99
+ async write(
100
+ start: CrudeTimeStamp,
101
+ data: Record<KeyOrName, CrudeSeries>,
102
+ ): Promise<void>;
103
+
87
104
  /**
88
105
  * Writes telemetry to the given channel starting at the given timestamp.
89
106
  *
90
- * @param channel - The key of the channel to write to.
107
+ * @param channels - The key of the channel to write to.
91
108
  * @param start - The starting timestamp of the first sample in data.
92
109
  * @param data - The telemetry to write. This telemetry must have the same
93
110
  * data type as the channel.
94
111
  * @throws if the channel does not exist.
95
112
  */
96
113
  async write(
97
- channel: KeyOrName,
98
114
  start: CrudeTimeStamp,
99
- data: CrudeSeries,
115
+ channels: Params | Record<KeyOrName, CrudeSeries>,
116
+ data?: CrudeSeries | CrudeSeries[],
100
117
  ): Promise<void> {
118
+ if (data == null) {
119
+ const data_ = channels as Record<KeyOrName, CrudeSeries>;
120
+ const w = await this.openWriter({
121
+ start,
122
+ channels: Object.keys(data_),
123
+ mode: WriterMode.PersistOnly,
124
+ });
125
+ try {
126
+ await w.write(data_);
127
+ await w.commit();
128
+ } finally {
129
+ await w.close();
130
+ }
131
+ return;
132
+ }
101
133
  const w = await this.openWriter({
102
134
  start,
103
- channels: channel,
135
+ channels: channels as Params,
104
136
  mode: WriterMode.PersistOnly,
105
137
  });
106
138
  try {
107
- await w.write(channel, data);
139
+ await w.write(channels as Params, data);
108
140
  await w.commit();
109
141
  } finally {
110
142
  await w.close();
111
143
  }
112
144
  }
113
145
 
114
- async read(tr: TimeRange, channel: KeyOrName): Promise<Series>;
146
+ async read(tr: CrudeTimeRange, channel: KeyOrName): Promise<MultiSeries>;
115
147
 
116
- async read(tr: TimeRange, channels: Params): Promise<Frame>;
148
+ async read(tr: CrudeTimeRange, channels: Params): Promise<Frame>;
117
149
 
118
- async read(tr: TimeRange, channels: Params): Promise<Series | Frame> {
150
+ async read(tr: CrudeTimeRange, channels: Params): Promise<MultiSeries | Frame> {
119
151
  const { single } = analyzeParams(channels);
120
152
  const fr = await this.readFrame(tr, channels);
121
- if (single) return fr.series[0];
153
+ if (single) return fr.get(channels as KeyOrName);
122
154
  return fr;
123
155
  }
124
156
 
125
- private async readFrame(tr: TimeRange, params: Params): Promise<Frame> {
157
+ private async readFrame(tr: CrudeTimeRange, params: Params): Promise<Frame> {
126
158
  const i = await this.openIterator(tr, params);
127
159
  const frame = new Frame();
128
160
  try {
@@ -28,7 +28,7 @@ const newChannel = async (): Promise<channel.Channel> => {
28
28
  describe("Iterator", () => {
29
29
  test("happy path", async () => {
30
30
  const ch = await newChannel();
31
- const writer = await client.telem.openWriter({
31
+ const writer = await client.openWriter({
32
32
  start: TimeStamp.SECOND,
33
33
  channels: ch.key,
34
34
  });
@@ -42,7 +42,7 @@ describe("Iterator", () => {
42
42
  await writer.close();
43
43
  }
44
44
 
45
- const iter = await client.telem.openIterator(
45
+ const iter = await client.openIterator(
46
46
  new TimeRange(TimeSpan.ZERO, TimeSpan.seconds(4)),
47
47
  [ch.key],
48
48
  );
@@ -14,6 +14,7 @@ import {
14
14
  TimeRange,
15
15
  TimeSpan,
16
16
  TimeStamp,
17
+ type CrudeTimeRange,
17
18
  } from "@synnaxlabs/x";
18
19
  import { z } from "zod";
19
20
 
@@ -92,7 +93,7 @@ export class Iterator {
92
93
  * @param keys - The keys of the channels to iterate over.
93
94
  */
94
95
  static async _open(
95
- tr: TimeRange,
96
+ tr: CrudeTimeRange,
96
97
  channels: Params,
97
98
  retriever: Retriever,
98
99
  client: StreamClient,
@@ -100,7 +101,11 @@ export class Iterator {
100
101
  const adapter = await ReadFrameAdapter.open(retriever, channels);
101
102
  const stream = await client.stream(Iterator.ENDPOINT, reqZ, resZ);
102
103
  const iter = new Iterator(stream, adapter);
103
- await iter.execute({ command: Command.Open, keys: adapter.keys, bounds: tr });
104
+ await iter.execute({
105
+ command: Command.Open,
106
+ keys: adapter.keys,
107
+ bounds: new TimeRange(tr),
108
+ });
104
109
  return iter;
105
110
  }
106
111