@synnaxlabs/client 0.56.2 → 0.57.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 (741) hide show
  1. package/dist/client-B08VDLSA.js +14463 -0
  2. package/dist/client-B08VDLSA.js.map +1 -0
  3. package/dist/client.js +1128 -14876
  4. package/dist/client.js.map +1 -0
  5. package/dist/src/access/client.d.ts +10 -1
  6. package/dist/src/access/client.d.ts.map +1 -1
  7. package/dist/src/access/enforce.d.ts.map +1 -1
  8. package/dist/src/access/external.d.ts +1 -0
  9. package/dist/src/access/external.d.ts.map +1 -1
  10. package/dist/src/access/granted.d.ts +39 -0
  11. package/dist/src/access/granted.d.ts.map +1 -0
  12. package/dist/src/access/policy/client.d.ts +136 -147
  13. package/dist/src/access/policy/client.d.ts.map +1 -1
  14. package/dist/src/access/policy/types.gen.d.ts +15 -68
  15. package/dist/src/access/policy/types.gen.d.ts.map +1 -1
  16. package/dist/src/access/role/client.d.ts +77 -58
  17. package/dist/src/access/role/client.d.ts.map +1 -1
  18. package/dist/src/access/role/types.gen.d.ts +8 -14
  19. package/dist/src/access/role/types.gen.d.ts.map +1 -1
  20. package/dist/src/actions/actions.d.ts +5 -6
  21. package/dist/src/actions/actions.d.ts.map +1 -1
  22. package/dist/src/actions/controller.d.ts +194 -0
  23. package/dist/src/actions/controller.d.ts.map +1 -0
  24. package/dist/src/actions/external.d.ts +1 -0
  25. package/dist/src/actions/external.d.ts.map +1 -1
  26. package/dist/src/arc/actions.d.ts +575 -0
  27. package/dist/src/arc/actions.d.ts.map +1 -0
  28. package/dist/src/arc/actions.gen.d.ts +1439 -0
  29. package/dist/src/arc/actions.gen.d.ts.map +1 -0
  30. package/dist/src/arc/client.d.ts +97 -13
  31. package/dist/src/arc/client.d.ts.map +1 -1
  32. package/dist/src/arc/compiler/types.gen.d.ts +3 -3
  33. package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
  34. package/dist/src/arc/external.d.ts +2 -0
  35. package/dist/src/arc/external.d.ts.map +1 -1
  36. package/dist/src/arc/graph/types.gen.d.ts +45 -597
  37. package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
  38. package/dist/src/arc/ir/index.d.ts +1 -1
  39. package/dist/src/arc/ir/index.d.ts.map +1 -1
  40. package/dist/src/arc/ir/ir.d.ts +2 -0
  41. package/dist/src/arc/ir/ir.d.ts.map +1 -0
  42. package/dist/src/arc/ir/types.gen.d.ts +58 -2807
  43. package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
  44. package/dist/src/arc/module/types.gen.d.ts +18 -1090
  45. package/dist/src/arc/module/types.gen.d.ts.map +1 -1
  46. package/dist/src/arc/program/types.gen.d.ts +18 -1090
  47. package/dist/src/arc/program/types.gen.d.ts.map +1 -1
  48. package/dist/src/arc/text/types.gen.d.ts +54 -1
  49. package/dist/src/arc/text/types.gen.d.ts.map +1 -1
  50. package/dist/src/arc/types/types.gen.d.ts +35 -153
  51. package/dist/src/arc/types/types.gen.d.ts.map +1 -1
  52. package/dist/src/arc/types.gen.d.ts +98 -2278
  53. package/dist/src/arc/types.gen.d.ts.map +1 -1
  54. package/dist/src/auth/auth.d.ts +14 -2
  55. package/dist/src/auth/auth.d.ts.map +1 -1
  56. package/dist/src/channel/client.d.ts +113 -75
  57. package/dist/src/channel/client.d.ts.map +1 -1
  58. package/dist/src/channel/external.d.ts +0 -1
  59. package/dist/src/channel/external.d.ts.map +1 -1
  60. package/dist/src/channel/payload.d.ts +65 -56
  61. package/dist/src/channel/payload.d.ts.map +1 -1
  62. package/dist/src/channel/types.gen.d.ts +26 -73
  63. package/dist/src/channel/types.gen.d.ts.map +1 -1
  64. package/dist/src/channel/writer.d.ts +1 -3
  65. package/dist/src/channel/writer.d.ts.map +1 -1
  66. package/dist/src/client.d.ts +55 -27
  67. package/dist/src/client.d.ts.map +1 -1
  68. package/dist/src/connection/client.d.ts +146 -0
  69. package/dist/src/connection/client.d.ts.map +1 -0
  70. package/dist/src/connection/external.d.ts +3 -0
  71. package/dist/src/connection/external.d.ts.map +1 -0
  72. package/dist/src/connection/index.d.ts +1 -1
  73. package/dist/src/connection/index.d.ts.map +1 -1
  74. package/dist/src/connection/status.d.ts +252 -0
  75. package/dist/src/connection/status.d.ts.map +1 -0
  76. package/dist/src/control/client.d.ts +31 -7
  77. package/dist/src/control/client.d.ts.map +1 -1
  78. package/dist/src/control/state.d.ts +47 -16
  79. package/dist/src/control/state.d.ts.map +1 -1
  80. package/dist/src/device/client.d.ts +59 -17
  81. package/dist/src/device/client.d.ts.map +1 -1
  82. package/dist/src/device/types.gen.d.ts +17 -67
  83. package/dist/src/device/types.gen.d.ts.map +1 -1
  84. package/dist/src/errors.d.ts +17 -20
  85. package/dist/src/errors.d.ts.map +1 -1
  86. package/dist/src/ethercat/external.d.ts +2 -0
  87. package/dist/src/ethercat/external.d.ts.map +1 -0
  88. package/dist/src/ethercat/index.d.ts +2 -0
  89. package/dist/src/ethercat/index.d.ts.map +1 -0
  90. package/dist/src/ethercat/types.gen.d.ts +243 -0
  91. package/dist/src/ethercat/types.gen.d.ts.map +1 -0
  92. package/dist/src/framer/adapter.d.ts +8 -5
  93. package/dist/src/framer/adapter.d.ts.map +1 -1
  94. package/dist/src/framer/benchutil.d.ts +19 -0
  95. package/dist/src/framer/benchutil.d.ts.map +1 -0
  96. package/dist/src/framer/cache/cache.d.ts +38 -0
  97. package/dist/src/framer/cache/cache.d.ts.map +1 -0
  98. package/dist/src/framer/cache/dynamic.d.ts +71 -0
  99. package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
  100. package/dist/src/framer/cache/reader.d.ts +43 -0
  101. package/dist/src/framer/cache/reader.d.ts.map +1 -0
  102. package/dist/src/framer/cache/static.d.ts +66 -0
  103. package/dist/src/framer/cache/static.d.ts.map +1 -0
  104. package/dist/src/framer/cache/streamer.d.ts +86 -0
  105. package/dist/src/framer/cache/streamer.d.ts.map +1 -0
  106. package/dist/src/framer/cache/transform.d.ts +18 -0
  107. package/dist/src/framer/cache/transform.d.ts.map +1 -0
  108. package/dist/src/framer/cache/unary.d.ts +37 -0
  109. package/dist/src/framer/cache/unary.d.ts.map +1 -0
  110. package/dist/src/framer/client.d.ts +35 -14
  111. package/dist/src/framer/client.d.ts.map +1 -1
  112. package/dist/src/framer/codec.d.ts.map +1 -1
  113. package/dist/src/framer/deleter.d.ts +3 -2
  114. package/dist/src/framer/deleter.d.ts.map +1 -1
  115. package/dist/src/framer/external.d.ts +6 -0
  116. package/dist/src/framer/external.d.ts.map +1 -1
  117. package/dist/src/framer/feed.d.ts +40 -0
  118. package/dist/src/framer/feed.d.ts.map +1 -0
  119. package/dist/src/framer/frame.d.ts +16 -20
  120. package/dist/src/framer/frame.d.ts.map +1 -1
  121. package/dist/src/framer/hardened.d.ts +70 -0
  122. package/dist/src/framer/hardened.d.ts.map +1 -0
  123. package/dist/src/framer/iterator.d.ts +36 -43
  124. package/dist/src/framer/iterator.d.ts.map +1 -1
  125. package/dist/src/framer/reader.d.ts +3 -2
  126. package/dist/src/framer/reader.d.ts.map +1 -1
  127. package/dist/src/framer/streamer.d.ts +132 -205
  128. package/dist/src/framer/streamer.d.ts.map +1 -1
  129. package/dist/src/framer/writer.d.ts +130 -161
  130. package/dist/src/framer/writer.d.ts.map +1 -1
  131. package/dist/src/group/client.d.ts +66 -9
  132. package/dist/src/group/client.d.ts.map +1 -1
  133. package/dist/src/group/types.gen.d.ts +2 -2
  134. package/dist/src/http/external.d.ts +2 -0
  135. package/dist/src/http/external.d.ts.map +1 -0
  136. package/dist/src/http/index.d.ts +2 -0
  137. package/dist/src/http/index.d.ts.map +1 -0
  138. package/dist/src/http/types.gen.d.ts +451 -0
  139. package/dist/src/http/types.gen.d.ts.map +1 -0
  140. package/dist/src/imex/client.d.ts +88 -0
  141. package/dist/src/imex/client.d.ts.map +1 -0
  142. package/dist/src/imex/index.d.ts +2 -0
  143. package/dist/src/imex/index.d.ts.map +1 -0
  144. package/dist/src/index.d.ts +18 -5
  145. package/dist/src/index.d.ts.map +1 -1
  146. package/dist/src/label/client.d.ts +55 -36
  147. package/dist/src/label/client.d.ts.map +1 -1
  148. package/dist/src/label/external.d.ts +2 -0
  149. package/dist/src/label/external.d.ts.map +1 -1
  150. package/dist/src/label/payload.d.ts +4 -46
  151. package/dist/src/label/payload.d.ts.map +1 -1
  152. package/dist/src/label/store.d.ts +8 -0
  153. package/dist/src/label/store.d.ts.map +1 -0
  154. package/dist/src/label/types.gen.d.ts +45 -0
  155. package/dist/src/label/types.gen.d.ts.map +1 -0
  156. package/dist/src/labjack/external.d.ts +2 -0
  157. package/dist/src/labjack/external.d.ts.map +1 -0
  158. package/dist/src/labjack/index.d.ts +2 -0
  159. package/dist/src/labjack/index.d.ts.map +1 -0
  160. package/dist/src/labjack/types.gen.d.ts +442 -0
  161. package/dist/src/labjack/types.gen.d.ts.map +1 -0
  162. package/dist/src/lineplot/actions.d.ts +914 -0
  163. package/dist/src/lineplot/actions.d.ts.map +1 -0
  164. package/dist/src/lineplot/actions.gen.d.ts +4208 -0
  165. package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
  166. package/dist/src/lineplot/client.d.ts +66 -16
  167. package/dist/src/lineplot/client.d.ts.map +1 -1
  168. package/dist/src/lineplot/external.d.ts +3 -0
  169. package/dist/src/lineplot/external.d.ts.map +1 -1
  170. package/dist/src/lineplot/line.d.ts +16 -0
  171. package/dist/src/lineplot/line.d.ts.map +1 -0
  172. package/dist/src/lineplot/types.gen.d.ts +837 -14
  173. package/dist/src/lineplot/types.gen.d.ts.map +1 -1
  174. package/dist/src/log/actions.d.ts +271 -0
  175. package/dist/src/log/actions.d.ts.map +1 -0
  176. package/dist/src/log/actions.gen.d.ts +1529 -0
  177. package/dist/src/log/actions.gen.d.ts.map +1 -0
  178. package/dist/src/log/client.d.ts +66 -16
  179. package/dist/src/log/client.d.ts.map +1 -1
  180. package/dist/src/log/external.d.ts +2 -0
  181. package/dist/src/log/external.d.ts.map +1 -1
  182. package/dist/src/log/types.gen.d.ts +139 -14
  183. package/dist/src/log/types.gen.d.ts.map +1 -1
  184. package/dist/src/modbus/external.d.ts +2 -0
  185. package/dist/src/modbus/external.d.ts.map +1 -0
  186. package/dist/src/modbus/index.d.ts +2 -0
  187. package/dist/src/modbus/index.d.ts.map +1 -0
  188. package/dist/src/modbus/types.gen.d.ts +280 -0
  189. package/dist/src/modbus/types.gen.d.ts.map +1 -0
  190. package/dist/src/ni/external.d.ts +2 -0
  191. package/dist/src/ni/external.d.ts.map +1 -0
  192. package/dist/src/ni/index.d.ts +2 -0
  193. package/dist/src/ni/index.d.ts.map +1 -0
  194. package/dist/src/ni/types.gen.d.ts +21029 -0
  195. package/dist/src/ni/types.gen.d.ts.map +1 -0
  196. package/dist/src/node/index.d.ts +2 -0
  197. package/dist/src/node/index.d.ts.map +1 -0
  198. package/dist/src/node/types.gen.d.ts +4 -0
  199. package/dist/src/node/types.gen.d.ts.map +1 -0
  200. package/dist/src/ontology/client.d.ts +314 -67
  201. package/dist/src/ontology/client.d.ts.map +1 -1
  202. package/dist/src/ontology/external.d.ts +1 -0
  203. package/dist/src/ontology/external.d.ts.map +1 -1
  204. package/dist/src/ontology/payload.d.ts +60 -18
  205. package/dist/src/ontology/payload.d.ts.map +1 -1
  206. package/dist/src/ontology/store.d.ts +32 -0
  207. package/dist/src/ontology/store.d.ts.map +1 -0
  208. package/dist/src/ontology/types.gen.d.ts +3 -2
  209. package/dist/src/ontology/types.gen.d.ts.map +1 -1
  210. package/dist/src/ontology/writer.d.ts +16 -10
  211. package/dist/src/ontology/writer.d.ts.map +1 -1
  212. package/dist/src/opcua/external.d.ts +2 -0
  213. package/dist/src/opcua/external.d.ts.map +1 -0
  214. package/dist/src/opcua/index.d.ts +2 -0
  215. package/dist/src/opcua/index.d.ts.map +1 -0
  216. package/dist/src/opcua/types.gen.d.ts +82 -0
  217. package/dist/src/opcua/types.gen.d.ts.map +1 -0
  218. package/dist/src/pagerduty/external.d.ts +2 -0
  219. package/dist/src/pagerduty/external.d.ts.map +1 -0
  220. package/dist/src/pagerduty/index.d.ts +2 -0
  221. package/dist/src/pagerduty/index.d.ts.map +1 -0
  222. package/dist/src/pagerduty/types.gen.d.ts +30 -0
  223. package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
  224. package/dist/src/panel/actions.d.ts +273 -0
  225. package/dist/src/panel/actions.d.ts.map +1 -0
  226. package/dist/src/panel/actions.gen.d.ts +1255 -0
  227. package/dist/src/panel/actions.gen.d.ts.map +1 -0
  228. package/dist/src/panel/client.d.ts +148 -0
  229. package/dist/src/panel/client.d.ts.map +1 -0
  230. package/dist/src/panel/external.d.ts +6 -0
  231. package/dist/src/panel/external.d.ts.map +1 -0
  232. package/dist/src/panel/index.d.ts +2 -0
  233. package/dist/src/panel/index.d.ts.map +1 -0
  234. package/dist/src/panel/tree.d.ts +50 -0
  235. package/dist/src/panel/tree.d.ts.map +1 -0
  236. package/dist/src/panel/types.gen.d.ts +370 -0
  237. package/dist/src/panel/types.gen.d.ts.map +1 -0
  238. package/dist/src/project/client.d.ts +89 -0
  239. package/dist/src/project/client.d.ts.map +1 -0
  240. package/dist/src/project/external.d.ts.map +1 -0
  241. package/dist/src/project/index.d.ts +2 -0
  242. package/dist/src/project/index.d.ts.map +1 -0
  243. package/dist/src/project/types.gen.d.ts +27 -0
  244. package/dist/src/project/types.gen.d.ts.map +1 -0
  245. package/dist/src/query/cache.d.ts +132 -0
  246. package/dist/src/query/cache.d.ts.map +1 -0
  247. package/dist/src/query/deleted.d.ts +20 -0
  248. package/dist/src/query/deleted.d.ts.map +1 -0
  249. package/dist/src/query/derived.d.ts +33 -0
  250. package/dist/src/query/derived.d.ts.map +1 -0
  251. package/dist/src/query/external.d.ts +10 -0
  252. package/dist/src/query/external.d.ts.map +1 -0
  253. package/dist/src/query/index.d.ts +2 -0
  254. package/dist/src/query/index.d.ts.map +1 -0
  255. package/dist/src/query/query.d.ts +235 -0
  256. package/dist/src/query/query.d.ts.map +1 -0
  257. package/dist/src/query/retriever.d.ts +135 -0
  258. package/dist/src/query/retriever.d.ts.map +1 -0
  259. package/dist/src/query/streamer.d.ts +67 -0
  260. package/dist/src/query/streamer.d.ts.map +1 -0
  261. package/dist/src/query/table.d.ts +219 -0
  262. package/dist/src/query/table.d.ts.map +1 -0
  263. package/dist/src/query/types.d.ts +35 -0
  264. package/dist/src/query/types.d.ts.map +1 -0
  265. package/dist/src/query/write.d.ts +21 -0
  266. package/dist/src/query/write.d.ts.map +1 -0
  267. package/dist/src/rack/client.d.ts +58 -20
  268. package/dist/src/rack/client.d.ts.map +1 -1
  269. package/dist/src/rack/types.gen.d.ts +11 -12
  270. package/dist/src/rack/types.gen.d.ts.map +1 -1
  271. package/dist/src/range/alias/types.gen.d.ts +2 -3
  272. package/dist/src/range/alias/types.gen.d.ts.map +1 -1
  273. package/dist/src/ranger/client.d.ts +138 -27
  274. package/dist/src/ranger/client.d.ts.map +1 -1
  275. package/dist/src/ranger/kv/client.d.ts +7 -4
  276. package/dist/src/ranger/kv/client.d.ts.map +1 -1
  277. package/dist/src/ranger/payload.d.ts +3 -0
  278. package/dist/src/ranger/payload.d.ts.map +1 -1
  279. package/dist/src/ranger/types.gen.d.ts +45 -101
  280. package/dist/src/ranger/types.gen.d.ts.map +1 -1
  281. package/dist/src/ranger/writer.d.ts +2 -74
  282. package/dist/src/ranger/writer.d.ts.map +1 -1
  283. package/dist/src/schematic/actions.d.ts +90 -33
  284. package/dist/src/schematic/actions.d.ts.map +1 -1
  285. package/dist/src/schematic/actions.gen.d.ts +207 -114
  286. package/dist/src/schematic/actions.gen.d.ts.map +1 -1
  287. package/dist/src/schematic/client.d.ts +70 -68
  288. package/dist/src/schematic/client.d.ts.map +1 -1
  289. package/dist/src/schematic/symbol/client.d.ts +133 -27
  290. package/dist/src/schematic/symbol/client.d.ts.map +1 -1
  291. package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
  292. package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
  293. package/dist/src/schematic/types.gen.d.ts +17 -96
  294. package/dist/src/schematic/types.gen.d.ts.map +1 -1
  295. package/dist/src/status/client.d.ts +69 -14
  296. package/dist/src/status/client.d.ts.map +1 -1
  297. package/dist/src/status/external.d.ts +2 -0
  298. package/dist/src/status/external.d.ts.map +1 -1
  299. package/dist/src/status/payload.d.ts +2 -36
  300. package/dist/src/status/payload.d.ts.map +1 -1
  301. package/dist/src/status/status.d.ts +65 -0
  302. package/dist/src/status/status.d.ts.map +1 -0
  303. package/dist/src/status/types.gen.d.ts +58 -0
  304. package/dist/src/status/types.gen.d.ts.map +1 -0
  305. package/dist/src/table/actions.d.ts +72 -13
  306. package/dist/src/table/actions.d.ts.map +1 -1
  307. package/dist/src/table/actions.gen.d.ts +221 -137
  308. package/dist/src/table/actions.gen.d.ts.map +1 -1
  309. package/dist/src/table/client.d.ts +64 -40
  310. package/dist/src/table/client.d.ts.map +1 -1
  311. package/dist/src/table/types.gen.d.ts +20 -55
  312. package/dist/src/table/types.gen.d.ts.map +1 -1
  313. package/dist/src/task/client.d.ts +149 -28
  314. package/dist/src/task/client.d.ts.map +1 -1
  315. package/dist/src/task/types.gen.d.ts +71 -89
  316. package/dist/src/task/types.gen.d.ts.map +1 -1
  317. package/dist/src/testutil/access.d.ts +27 -1
  318. package/dist/src/testutil/access.d.ts.map +1 -1
  319. package/dist/src/testutil/channels.d.ts +2 -0
  320. package/dist/src/testutil/channels.d.ts.map +1 -1
  321. package/dist/src/testutil/client.d.ts +5 -0
  322. package/dist/src/testutil/client.d.ts.map +1 -1
  323. package/dist/src/testutil/connection.d.ts +10 -0
  324. package/dist/src/testutil/connection.d.ts.map +1 -0
  325. package/dist/src/testutil/index.d.ts +9 -0
  326. package/dist/src/testutil/index.d.ts.map +1 -0
  327. package/dist/src/testutil/panels.d.ts +8 -0
  328. package/dist/src/testutil/panels.d.ts.map +1 -0
  329. package/dist/src/testutil/proxy.d.ts +29 -0
  330. package/dist/src/testutil/proxy.d.ts.map +1 -0
  331. package/dist/src/testutil/query.d.ts +7 -0
  332. package/dist/src/testutil/query.d.ts.map +1 -0
  333. package/dist/src/testutil/telem.d.ts +4 -0
  334. package/dist/src/testutil/telem.d.ts.map +1 -1
  335. package/dist/src/transport.d.ts +10 -4
  336. package/dist/src/transport.d.ts.map +1 -1
  337. package/dist/src/user/client.d.ts +29 -28
  338. package/dist/src/user/client.d.ts.map +1 -1
  339. package/dist/src/user/external.d.ts +1 -1
  340. package/dist/src/user/external.d.ts.map +1 -1
  341. package/dist/src/user/types.gen.d.ts +4 -4
  342. package/dist/src/util/retrieve.d.ts +2 -2
  343. package/dist/src/util/retrieve.d.ts.map +1 -1
  344. package/dist/src/util/telem.d.ts.map +1 -1
  345. package/dist/src/view/client.d.ts +30 -14
  346. package/dist/src/view/client.d.ts.map +1 -1
  347. package/dist/src/view/types.gen.d.ts +7 -15
  348. package/dist/src/view/types.gen.d.ts.map +1 -1
  349. package/dist/testutil.js +189 -0
  350. package/dist/testutil.js.map +1 -0
  351. package/package.json +40 -17
  352. package/src/access/client.ts +14 -3
  353. package/src/access/enforce.ts +0 -3
  354. package/src/access/external.ts +1 -0
  355. package/src/access/granted.ts +114 -0
  356. package/src/access/policy/client.ts +135 -43
  357. package/src/access/policy/types.gen.ts +9 -11
  358. package/src/access/role/client.ts +160 -38
  359. package/src/access/role/types.gen.ts +8 -12
  360. package/src/actions/actions.ts +5 -6
  361. package/src/actions/controller.ts +626 -0
  362. package/src/actions/external.ts +11 -0
  363. package/src/arc/actions.gen.ts +313 -0
  364. package/src/arc/actions.ts +192 -0
  365. package/src/arc/client.ts +424 -41
  366. package/src/arc/compiler/types.gen.ts +5 -6
  367. package/src/arc/external.ts +2 -0
  368. package/src/arc/graph/types.gen.ts +24 -22
  369. package/src/arc/ir/index.ts +1 -1
  370. package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
  371. package/src/arc/ir/types.gen.ts +42 -41
  372. package/src/arc/text/types.gen.ts +21 -2
  373. package/src/arc/types/types.gen.ts +40 -32
  374. package/src/arc/types.gen.ts +31 -29
  375. package/src/auth/auth.ts +40 -8
  376. package/src/channel/client.ts +529 -132
  377. package/src/channel/external.ts +0 -1
  378. package/src/channel/payload.ts +30 -3
  379. package/src/channel/types.gen.ts +37 -48
  380. package/src/channel/writer.ts +2 -11
  381. package/src/client.ts +215 -91
  382. package/src/connection/client.ts +495 -0
  383. package/src/connection/external.ts +34 -0
  384. package/src/connection/index.ts +1 -1
  385. package/src/connection/status.ts +442 -0
  386. package/src/control/client.ts +84 -12
  387. package/src/control/state.ts +17 -36
  388. package/src/device/client.ts +293 -41
  389. package/src/device/types.gen.ts +15 -26
  390. package/src/errors.ts +45 -22
  391. package/src/{workspace → ethercat}/external.ts +1 -2
  392. package/src/{workspace → ethercat}/index.ts +1 -1
  393. package/src/ethercat/types.gen.ts +151 -0
  394. package/src/framer/adapter.ts +60 -37
  395. package/src/framer/benchutil.ts +67 -0
  396. package/src/framer/cache/cache.ts +115 -0
  397. package/src/framer/cache/dynamic.ts +279 -0
  398. package/src/framer/cache/reader.ts +160 -0
  399. package/src/framer/cache/static.ts +215 -0
  400. package/src/framer/cache/streamer.ts +391 -0
  401. package/src/framer/cache/transform.ts +31 -0
  402. package/src/framer/cache/unary.ts +104 -0
  403. package/src/framer/client.ts +71 -43
  404. package/src/framer/codec.ts +55 -18
  405. package/src/framer/deleter.ts +4 -6
  406. package/src/framer/external.ts +10 -0
  407. package/src/framer/feed.ts +108 -0
  408. package/src/framer/frame.ts +13 -23
  409. package/src/framer/hardened.ts +283 -0
  410. package/src/framer/iterator.ts +31 -42
  411. package/src/framer/reader.ts +11 -11
  412. package/src/framer/streamer.ts +18 -178
  413. package/src/framer/writer.ts +39 -59
  414. package/src/group/client.ts +158 -23
  415. package/src/http/external.ts +10 -0
  416. package/src/{cluster → http}/index.ts +1 -1
  417. package/src/http/types.gen.ts +245 -0
  418. package/src/imex/client.ts +125 -0
  419. package/src/imex/index.ts +10 -0
  420. package/src/index.ts +18 -6
  421. package/src/label/client.ts +193 -54
  422. package/src/label/external.ts +2 -0
  423. package/src/label/payload.ts +4 -9
  424. package/src/label/store.ts +28 -0
  425. package/src/label/types.gen.ts +31 -0
  426. package/src/labjack/external.ts +10 -0
  427. package/src/labjack/index.ts +10 -0
  428. package/src/labjack/types.gen.ts +251 -0
  429. package/src/lineplot/actions.gen.ts +880 -0
  430. package/src/lineplot/actions.ts +535 -0
  431. package/src/lineplot/client.ts +224 -52
  432. package/src/lineplot/external.ts +3 -0
  433. package/src/lineplot/line.ts +80 -0
  434. package/src/lineplot/types.gen.ts +225 -12
  435. package/src/log/actions.gen.ts +474 -0
  436. package/src/log/actions.ts +242 -0
  437. package/src/log/client.ts +223 -52
  438. package/src/log/external.ts +2 -0
  439. package/src/log/types.gen.ts +45 -14
  440. package/src/modbus/external.ts +10 -0
  441. package/src/modbus/index.ts +10 -0
  442. package/src/modbus/types.gen.ts +185 -0
  443. package/src/ni/external.ts +10 -0
  444. package/src/ni/index.ts +10 -0
  445. package/src/ni/types.gen.ts +1632 -0
  446. package/src/node/index.ts +10 -0
  447. package/src/{cluster → node}/types.gen.ts +2 -2
  448. package/src/ontology/client.ts +408 -99
  449. package/src/ontology/external.ts +7 -0
  450. package/src/ontology/payload.ts +48 -7
  451. package/src/ontology/store.ts +83 -0
  452. package/src/ontology/types.gen.ts +2 -1
  453. package/src/ontology/writer.ts +1 -0
  454. package/src/opcua/external.ts +10 -0
  455. package/src/opcua/index.ts +10 -0
  456. package/src/opcua/types.gen.ts +65 -0
  457. package/src/pagerduty/external.ts +10 -0
  458. package/src/pagerduty/index.ts +10 -0
  459. package/src/pagerduty/types.gen.ts +41 -0
  460. package/src/panel/actions.gen.ts +267 -0
  461. package/src/panel/actions.ts +357 -0
  462. package/src/panel/client.ts +327 -0
  463. package/src/panel/external.ts +14 -0
  464. package/src/panel/index.ts +10 -0
  465. package/src/panel/tree.ts +163 -0
  466. package/src/panel/types.gen.ts +164 -0
  467. package/src/project/client.ts +273 -0
  468. package/src/project/external.ts +11 -0
  469. package/src/project/index.ts +10 -0
  470. package/src/project/types.gen.ts +40 -0
  471. package/src/query/cache.ts +326 -0
  472. package/src/query/deleted.ts +38 -0
  473. package/src/query/derived.ts +101 -0
  474. package/src/query/external.ts +51 -0
  475. package/src/query/index.ts +10 -0
  476. package/src/query/query.ts +865 -0
  477. package/src/query/retriever.ts +308 -0
  478. package/src/query/streamer.ts +207 -0
  479. package/src/query/table.ts +625 -0
  480. package/src/query/types.ts +54 -0
  481. package/src/query/write.ts +42 -0
  482. package/src/rack/client.ts +233 -45
  483. package/src/rack/types.gen.ts +15 -16
  484. package/src/range/alias/types.gen.ts +2 -3
  485. package/src/ranger/client.ts +581 -70
  486. package/src/ranger/kv/client.ts +52 -21
  487. package/src/ranger/payload.ts +3 -0
  488. package/src/ranger/types.gen.ts +21 -23
  489. package/src/ranger/writer.ts +4 -8
  490. package/src/schematic/actions.gen.ts +62 -53
  491. package/src/schematic/actions.ts +44 -42
  492. package/src/schematic/client.ts +226 -70
  493. package/src/schematic/symbol/client.ts +277 -48
  494. package/src/schematic/symbol/types.gen.ts +22 -34
  495. package/src/schematic/types.gen.ts +22 -29
  496. package/src/status/client.ts +321 -44
  497. package/src/status/external.ts +2 -0
  498. package/src/status/payload.ts +1 -23
  499. package/src/status/status.ts +241 -0
  500. package/src/status/types.gen.ts +108 -0
  501. package/src/table/actions.gen.ts +96 -63
  502. package/src/table/actions.ts +44 -19
  503. package/src/table/client.ts +220 -56
  504. package/src/table/types.gen.ts +24 -31
  505. package/src/task/client.ts +580 -101
  506. package/src/task/types.gen.ts +68 -75
  507. package/src/testutil/access.ts +102 -6
  508. package/src/testutil/channels.ts +29 -0
  509. package/src/testutil/client.ts +27 -2
  510. package/src/testutil/connection.ts +47 -0
  511. package/src/testutil/index.ts +17 -0
  512. package/src/testutil/panels.ts +26 -0
  513. package/src/testutil/proxy.ts +106 -0
  514. package/src/testutil/query.ts +28 -0
  515. package/src/testutil/telem.ts +17 -1
  516. package/src/transport.ts +18 -7
  517. package/src/user/client.ts +165 -64
  518. package/src/user/external.ts +1 -1
  519. package/src/user/types.gen.ts +5 -5
  520. package/src/util/retrieve.ts +4 -4
  521. package/src/util/telem.ts +0 -1
  522. package/src/view/client.ts +120 -37
  523. package/src/view/types.gen.ts +8 -11
  524. package/.turbo/turbo-build.log +0 -20
  525. package/.vscode/settings.json +0 -3
  526. package/CONTRIBUTING.md +0 -47
  527. package/dist/client.cjs +0 -118
  528. package/dist/eslint.config.d.ts +0 -4
  529. package/dist/eslint.config.d.ts.map +0 -1
  530. package/dist/src/access/enforce.spec.d.ts +0 -2
  531. package/dist/src/access/enforce.spec.d.ts.map +0 -1
  532. package/dist/src/access/policy/access.spec.d.ts +0 -2
  533. package/dist/src/access/policy/access.spec.d.ts.map +0 -1
  534. package/dist/src/access/role/role.spec.d.ts +0 -2
  535. package/dist/src/access/role/role.spec.d.ts.map +0 -1
  536. package/dist/src/actions/actions.spec.d.ts +0 -2
  537. package/dist/src/actions/actions.spec.d.ts.map +0 -1
  538. package/dist/src/arc/access.spec.d.ts +0 -2
  539. package/dist/src/arc/access.spec.d.ts.map +0 -1
  540. package/dist/src/arc/arc.spec.d.ts +0 -2
  541. package/dist/src/arc/arc.spec.d.ts.map +0 -1
  542. package/dist/src/arc/lsp.spec.d.ts +0 -2
  543. package/dist/src/arc/lsp.spec.d.ts.map +0 -1
  544. package/dist/src/auth/auth.spec.d.ts +0 -2
  545. package/dist/src/auth/auth.spec.d.ts.map +0 -1
  546. package/dist/src/channel/access.spec.d.ts +0 -2
  547. package/dist/src/channel/access.spec.d.ts.map +0 -1
  548. package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
  549. package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
  550. package/dist/src/channel/channel.spec.d.ts +0 -2
  551. package/dist/src/channel/channel.spec.d.ts.map +0 -1
  552. package/dist/src/channel/payload.spec.d.ts +0 -2
  553. package/dist/src/channel/payload.spec.d.ts.map +0 -1
  554. package/dist/src/channel/retriever.d.ts +0 -64
  555. package/dist/src/channel/retriever.d.ts.map +0 -1
  556. package/dist/src/cluster/index.d.ts +0 -2
  557. package/dist/src/cluster/index.d.ts.map +0 -1
  558. package/dist/src/cluster/types.gen.d.ts +0 -4
  559. package/dist/src/cluster/types.gen.d.ts.map +0 -1
  560. package/dist/src/connection/checker.d.ts +0 -86
  561. package/dist/src/connection/checker.d.ts.map +0 -1
  562. package/dist/src/connection/connection.spec.d.ts +0 -2
  563. package/dist/src/connection/connection.spec.d.ts.map +0 -1
  564. package/dist/src/connection.spec.d.ts +0 -2
  565. package/dist/src/connection.spec.d.ts.map +0 -1
  566. package/dist/src/control/state.spec.d.ts +0 -2
  567. package/dist/src/control/state.spec.d.ts.map +0 -1
  568. package/dist/src/device/access.spec.d.ts +0 -2
  569. package/dist/src/device/access.spec.d.ts.map +0 -1
  570. package/dist/src/device/device.spec.d.ts +0 -2
  571. package/dist/src/device/device.spec.d.ts.map +0 -1
  572. package/dist/src/device/payload.spec.d.ts +0 -2
  573. package/dist/src/device/payload.spec.d.ts.map +0 -1
  574. package/dist/src/errors.spec.d.ts +0 -2
  575. package/dist/src/errors.spec.d.ts.map +0 -1
  576. package/dist/src/framer/adapter.spec.d.ts +0 -2
  577. package/dist/src/framer/adapter.spec.d.ts.map +0 -1
  578. package/dist/src/framer/client.spec.d.ts +0 -2
  579. package/dist/src/framer/client.spec.d.ts.map +0 -1
  580. package/dist/src/framer/codec.spec.d.ts +0 -2
  581. package/dist/src/framer/codec.spec.d.ts.map +0 -1
  582. package/dist/src/framer/deleter.spec.d.ts +0 -2
  583. package/dist/src/framer/deleter.spec.d.ts.map +0 -1
  584. package/dist/src/framer/frame.spec.d.ts +0 -2
  585. package/dist/src/framer/frame.spec.d.ts.map +0 -1
  586. package/dist/src/framer/iterator.spec.d.ts +0 -2
  587. package/dist/src/framer/iterator.spec.d.ts.map +0 -1
  588. package/dist/src/framer/reader.spec.d.ts +0 -2
  589. package/dist/src/framer/reader.spec.d.ts.map +0 -1
  590. package/dist/src/framer/streamer.spec.d.ts +0 -2
  591. package/dist/src/framer/streamer.spec.d.ts.map +0 -1
  592. package/dist/src/framer/writer.spec.d.ts +0 -2
  593. package/dist/src/framer/writer.spec.d.ts.map +0 -1
  594. package/dist/src/group/access.spec.d.ts +0 -2
  595. package/dist/src/group/access.spec.d.ts.map +0 -1
  596. package/dist/src/group/group.spec.d.ts +0 -2
  597. package/dist/src/group/group.spec.d.ts.map +0 -1
  598. package/dist/src/label/access.spec.d.ts +0 -2
  599. package/dist/src/label/access.spec.d.ts.map +0 -1
  600. package/dist/src/label/label.spec.d.ts +0 -2
  601. package/dist/src/label/label.spec.d.ts.map +0 -1
  602. package/dist/src/lineplot/access.spec.d.ts +0 -2
  603. package/dist/src/lineplot/access.spec.d.ts.map +0 -1
  604. package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
  605. package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
  606. package/dist/src/log/access.spec.d.ts +0 -2
  607. package/dist/src/log/access.spec.d.ts.map +0 -1
  608. package/dist/src/log/log.spec.d.ts +0 -2
  609. package/dist/src/log/log.spec.d.ts.map +0 -1
  610. package/dist/src/ontology/ontology.spec.d.ts +0 -2
  611. package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
  612. package/dist/src/rack/access.spec.d.ts +0 -2
  613. package/dist/src/rack/access.spec.d.ts.map +0 -1
  614. package/dist/src/rack/rack.spec.d.ts +0 -2
  615. package/dist/src/rack/rack.spec.d.ts.map +0 -1
  616. package/dist/src/ranger/access.spec.d.ts +0 -2
  617. package/dist/src/ranger/access.spec.d.ts.map +0 -1
  618. package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
  619. package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
  620. package/dist/src/ranger/ranger.spec.d.ts +0 -2
  621. package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
  622. package/dist/src/schematic/access.spec.d.ts +0 -2
  623. package/dist/src/schematic/access.spec.d.ts.map +0 -1
  624. package/dist/src/schematic/actions.spec.d.ts +0 -2
  625. package/dist/src/schematic/actions.spec.d.ts.map +0 -1
  626. package/dist/src/schematic/schematic.spec.d.ts +0 -2
  627. package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
  628. package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
  629. package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
  630. package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
  631. package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
  632. package/dist/src/status/access.spec.d.ts +0 -2
  633. package/dist/src/status/access.spec.d.ts.map +0 -1
  634. package/dist/src/status/status.spec.d.ts +0 -2
  635. package/dist/src/status/status.spec.d.ts.map +0 -1
  636. package/dist/src/table/access.spec.d.ts +0 -2
  637. package/dist/src/table/access.spec.d.ts.map +0 -1
  638. package/dist/src/table/table.spec.d.ts +0 -2
  639. package/dist/src/table/table.spec.d.ts.map +0 -1
  640. package/dist/src/task/access.spec.d.ts +0 -2
  641. package/dist/src/task/access.spec.d.ts.map +0 -1
  642. package/dist/src/task/payload.spec.d.ts +0 -2
  643. package/dist/src/task/payload.spec.d.ts.map +0 -1
  644. package/dist/src/task/task.spec.d.ts +0 -2
  645. package/dist/src/task/task.spec.d.ts.map +0 -1
  646. package/dist/src/user/access.spec.d.ts +0 -2
  647. package/dist/src/user/access.spec.d.ts.map +0 -1
  648. package/dist/src/user/user.spec.d.ts +0 -2
  649. package/dist/src/user/user.spec.d.ts.map +0 -1
  650. package/dist/src/util/retrieve.spec.d.ts +0 -2
  651. package/dist/src/util/retrieve.spec.d.ts.map +0 -1
  652. package/dist/src/view/view.spec.d.ts +0 -2
  653. package/dist/src/view/view.spec.d.ts.map +0 -1
  654. package/dist/src/workspace/access.spec.d.ts +0 -2
  655. package/dist/src/workspace/access.spec.d.ts.map +0 -1
  656. package/dist/src/workspace/client.d.ts +0 -36
  657. package/dist/src/workspace/client.d.ts.map +0 -1
  658. package/dist/src/workspace/external.d.ts.map +0 -1
  659. package/dist/src/workspace/index.d.ts +0 -2
  660. package/dist/src/workspace/index.d.ts.map +0 -1
  661. package/dist/src/workspace/types.gen.d.ts +0 -34
  662. package/dist/src/workspace/types.gen.d.ts.map +0 -1
  663. package/dist/src/workspace/workspace.spec.d.ts +0 -2
  664. package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
  665. package/examples/node/basicReadWrite.js +0 -86
  666. package/examples/node/createChannels.js +0 -50
  667. package/examples/node/createRange.js +0 -67
  668. package/examples/node/package-lock.json +0 -133
  669. package/examples/node/package.json +0 -17
  670. package/examples/node/readLatest.js +0 -76
  671. package/examples/node/seriesAndFrames.js +0 -173
  672. package/examples/node/streamRead.js +0 -50
  673. package/examples/node/streamWrite.js +0 -87
  674. package/src/access/enforce.spec.ts +0 -188
  675. package/src/access/policy/access.spec.ts +0 -147
  676. package/src/access/role/role.spec.ts +0 -95
  677. package/src/actions/actions.spec.ts +0 -229
  678. package/src/arc/access.spec.ts +0 -149
  679. package/src/arc/arc.spec.ts +0 -44
  680. package/src/arc/lsp.spec.ts +0 -717
  681. package/src/auth/auth.spec.ts +0 -101
  682. package/src/channel/access.spec.ts +0 -116
  683. package/src/channel/batchRetriever.spec.ts +0 -115
  684. package/src/channel/channel.spec.ts +0 -352
  685. package/src/channel/payload.spec.ts +0 -117
  686. package/src/channel/retriever.ts +0 -252
  687. package/src/connection/checker.ts +0 -203
  688. package/src/connection/connection.spec.ts +0 -152
  689. package/src/connection.spec.ts +0 -145
  690. package/src/control/state.spec.ts +0 -22
  691. package/src/device/access.spec.ts +0 -159
  692. package/src/device/device.spec.ts +0 -461
  693. package/src/device/payload.spec.ts +0 -142
  694. package/src/errors.spec.ts +0 -71
  695. package/src/framer/adapter.spec.ts +0 -620
  696. package/src/framer/client.spec.ts +0 -180
  697. package/src/framer/codec.spec.ts +0 -383
  698. package/src/framer/deleter.spec.ts +0 -103
  699. package/src/framer/frame.spec.ts +0 -973
  700. package/src/framer/iterator.spec.ts +0 -169
  701. package/src/framer/reader.spec.ts +0 -865
  702. package/src/framer/streamer.spec.ts +0 -871
  703. package/src/framer/writer.spec.ts +0 -486
  704. package/src/group/access.spec.ts +0 -77
  705. package/src/group/group.spec.ts +0 -65
  706. package/src/label/access.spec.ts +0 -109
  707. package/src/label/label.spec.ts +0 -83
  708. package/src/lineplot/access.spec.ts +0 -134
  709. package/src/lineplot/lineplot.spec.ts +0 -120
  710. package/src/log/access.spec.ts +0 -132
  711. package/src/log/log.spec.ts +0 -106
  712. package/src/ontology/ontology.spec.ts +0 -521
  713. package/src/rack/access.spec.ts +0 -102
  714. package/src/rack/rack.spec.ts +0 -171
  715. package/src/ranger/access.spec.ts +0 -115
  716. package/src/ranger/alias/payload.spec.ts +0 -52
  717. package/src/ranger/ranger.spec.ts +0 -343
  718. package/src/schematic/access.spec.ts +0 -134
  719. package/src/schematic/actions.spec.ts +0 -699
  720. package/src/schematic/schematic.spec.ts +0 -340
  721. package/src/schematic/symbol/access.spec.ts +0 -172
  722. package/src/schematic/symbol/client.spec.ts +0 -160
  723. package/src/status/access.spec.ts +0 -129
  724. package/src/status/status.spec.ts +0 -448
  725. package/src/table/access.spec.ts +0 -128
  726. package/src/table/table.spec.ts +0 -651
  727. package/src/task/access.spec.ts +0 -131
  728. package/src/task/payload.spec.ts +0 -113
  729. package/src/task/task.spec.ts +0 -657
  730. package/src/user/access.spec.ts +0 -107
  731. package/src/user/user.spec.ts +0 -290
  732. package/src/util/retrieve.spec.ts +0 -49
  733. package/src/view/view.spec.ts +0 -165
  734. package/src/workspace/access.spec.ts +0 -108
  735. package/src/workspace/client.ts +0 -112
  736. package/src/workspace/types.gen.ts +0 -46
  737. package/src/workspace/workspace.spec.ts +0 -111
  738. package/tsconfig.json +0 -5
  739. package/tsconfig.vite.json +0 -4
  740. package/vite.config.ts +0 -29
  741. /package/dist/src/{workspace → project}/external.d.ts +0 -0
@@ -1,865 +0,0 @@
1
- // Copyright 2026 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 { DataType, id, runtime, TimeSpan, TimeStamp } from "@synnaxlabs/x";
11
- import { describe, expect, it } from "vitest";
12
-
13
- import { type channel } from "@/channel";
14
- import { createTestClient } from "@/testutil/client";
15
- import { secondsLinspace } from "@/testutil/telem";
16
-
17
- const client = createTestClient();
18
-
19
- const delimiter = runtime.getOS() === "Windows" ? "\r\n" : "\n";
20
-
21
- /** Helper to collect stream into a string */
22
- const streamToString = async (stream: ReadableStream<Uint8Array>): Promise<string> => {
23
- const reader = stream.getReader();
24
- const chunks: Uint8Array[] = [];
25
- while (true) {
26
- const { done, value } = await reader.read();
27
- if (done) break;
28
- chunks.push(value);
29
- }
30
- const decoder = new TextDecoder();
31
- return chunks.map((c) => decoder.decode(c)).join("");
32
- };
33
-
34
- const parseCSV = (csv: string): string[][] => {
35
- const lines = csv.trim().split(delimiter);
36
- return lines.map((line) => line.split(","));
37
- };
38
-
39
- const streamToRecords = async (
40
- stream: ReadableStream<Uint8Array>,
41
- ): Promise<string[][]> => {
42
- const csv = await streamToString(stream);
43
- return parseCSV(csv);
44
- };
45
-
46
- describe("Reader", () => {
47
- describe("CSV", () => {
48
- it("should export channels with the same index", async () => {
49
- const index = await client.channels.create({
50
- name: id.create(),
51
- dataType: DataType.TIMESTAMP,
52
- isIndex: true,
53
- });
54
- const data1 = await client.channels.create({
55
- name: id.create(),
56
- dataType: DataType.FLOAT64,
57
- index: index.key,
58
- });
59
- const data2 = await client.channels.create({
60
- name: id.create(),
61
- dataType: DataType.FLOAT64,
62
- index: index.key,
63
- });
64
- const start = TimeStamp.seconds(1);
65
- const writer = await client.openWriter({
66
- start,
67
- channels: [index.key, data1.key, data2.key],
68
- });
69
- await writer.write({
70
- [index.key]: [TimeStamp.seconds(1), TimeStamp.seconds(2), TimeStamp.seconds(3)],
71
- [data1.key]: [10, 20, 30],
72
- [data2.key]: [100, 200, 300],
73
- });
74
- await writer.commit();
75
- await writer.close();
76
- const stream = await client.read({
77
- channels: [index.key, data1.key, data2.key],
78
- timeRange: { start: TimeStamp.seconds(0), end: TimeStamp.seconds(10) },
79
- channelNames: {
80
- [index.key]: "Time",
81
- [data1.key]: "Sensor1",
82
- [data2.key]: "Sensor2",
83
- },
84
- responseType: "csv",
85
- });
86
- const records = await streamToRecords(stream);
87
- expect(records).toEqual([
88
- ["Time", "Sensor1", "Sensor2"],
89
- ["1000000000", "10", "100"],
90
- ["2000000000", "20", "200"],
91
- ["3000000000", "30", "300"],
92
- ]);
93
- });
94
- it("should export multiple channels with different indexes", async () => {
95
- const index1 = await client.channels.create({
96
- name: id.create(),
97
- dataType: DataType.TIMESTAMP,
98
- isIndex: true,
99
- });
100
- const data1 = await client.channels.create({
101
- name: id.create(),
102
- dataType: DataType.FLOAT64,
103
- index: index1.key,
104
- });
105
- const index2 = await client.channels.create({
106
- name: id.create(),
107
- dataType: DataType.TIMESTAMP,
108
- isIndex: true,
109
- });
110
- const data2 = await client.channels.create({
111
- name: id.create(),
112
- dataType: DataType.FLOAT64,
113
- index: index2.key,
114
- });
115
- // Write to first group - timestamps 1, 3, 5
116
- const writer1 = await client.openWriter({
117
- start: TimeStamp.seconds(1),
118
- channels: [index1.key, data1.key],
119
- });
120
- await writer1.write({
121
- [index1.key]: [
122
- TimeStamp.seconds(1),
123
- TimeStamp.seconds(3),
124
- TimeStamp.seconds(5),
125
- ],
126
- [data1.key]: [100, 300, 500],
127
- });
128
- await writer1.commit();
129
- await writer1.close();
130
-
131
- // Write to second group - timestamps 2, 4, 6
132
- const writer2 = await client.openWriter({
133
- start: TimeStamp.seconds(2),
134
- channels: [index2.key, data2.key],
135
- });
136
- await writer2.write({
137
- [index2.key]: [
138
- TimeStamp.seconds(2),
139
- TimeStamp.seconds(4),
140
- TimeStamp.seconds(6),
141
- ],
142
- [data2.key]: [200, 400, 600],
143
- });
144
- await writer2.commit();
145
- await writer2.close();
146
- const stream = await client.read({
147
- channels: [data1.key, data2.key], // Just data channels - indexes auto-included
148
- timeRange: { start: TimeStamp.seconds(0), end: TimeStamp.seconds(10) },
149
- channelNames: {
150
- [index1.key]: "Time1",
151
- [data1.key]: "Data1",
152
- [index2.key]: "Time2",
153
- [data2.key]: "Data2",
154
- },
155
- responseType: "csv",
156
- });
157
- const records = await streamToRecords(stream);
158
- expect(records).toEqual([
159
- ["Time1", "Data1", "Time2", "Data2"],
160
- ["1000000000", "100", "", ""],
161
- ["", "", "2000000000", "200"],
162
- ["3000000000", "300", "", ""],
163
- ["", "", "4000000000", "400"],
164
- ["5000000000", "500", "", ""],
165
- ["", "", "6000000000", "600"],
166
- ]);
167
- });
168
- it("should allow downsampling", async () => {
169
- const index = await client.channels.create({
170
- name: id.create(),
171
- dataType: DataType.TIMESTAMP,
172
- isIndex: true,
173
- });
174
- const data = await client.channels.create({
175
- name: id.create(),
176
- dataType: DataType.FLOAT64,
177
- index: index.key,
178
- });
179
- const writer = await client.openWriter({
180
- start: TimeStamp.seconds(1),
181
- channels: [index.key, data.key],
182
- });
183
- await writer.write({
184
- [index.key]: [
185
- TimeStamp.seconds(1),
186
- TimeStamp.seconds(2),
187
- TimeStamp.seconds(3),
188
- TimeStamp.seconds(4),
189
- TimeStamp.seconds(5),
190
- ],
191
- [data.key]: [10, 20, 30, 40, 50],
192
- });
193
- await writer.commit();
194
- await writer.close();
195
- const stream = await client.read({
196
- channels: [data.key],
197
- timeRange: { start: TimeStamp.seconds(0), end: TimeStamp.seconds(10) },
198
- responseType: "csv",
199
- iteratorConfig: { downsampleFactor: 2 },
200
- });
201
- const records = await streamToRecords(stream);
202
- expect(records).toEqual([
203
- [index.name, data.name],
204
- ["1000000000", "10"],
205
- ["3000000000", "30"],
206
- ["5000000000", "50"],
207
- ]);
208
- });
209
- it("should handle channels at different uneven rates with correct row ordering", async () => {
210
- const indexFast = await client.channels.create({
211
- name: id.create(),
212
- dataType: DataType.TIMESTAMP,
213
- isIndex: true,
214
- });
215
- const dataFast = await client.channels.create({
216
- name: id.create(),
217
- dataType: DataType.FLOAT64,
218
- index: indexFast.key,
219
- });
220
- const indexSlow = await client.channels.create({
221
- name: id.create(),
222
- dataType: DataType.TIMESTAMP,
223
- isIndex: true,
224
- });
225
- const dataSlow = await client.channels.create({
226
- name: id.create(),
227
- dataType: DataType.FLOAT64,
228
- index: indexSlow.key,
229
- });
230
- const baseTime = TimeStamp.nanoseconds(0);
231
- // Write fast data: 0ns, 1ns, 2ns, 3ns, 4ns, 5ns
232
- const writerFast = await client.openWriter({
233
- start: baseTime,
234
- channels: [indexFast.key, dataFast.key],
235
- });
236
- await writerFast.write({
237
- [indexFast.key]: [
238
- TimeStamp.nanoseconds(0),
239
- TimeStamp.nanoseconds(1),
240
- TimeStamp.nanoseconds(2),
241
- TimeStamp.nanoseconds(3),
242
- TimeStamp.nanoseconds(4),
243
- TimeStamp.nanoseconds(5),
244
- ],
245
- [dataFast.key]: [1.0, 1.1, 1.2, 1.3, 1.4, 1.5],
246
- });
247
- await writerFast.commit();
248
- await writerFast.close();
249
-
250
- // Write slow data: 0ns, 5ns
251
- const writerSlow = await client.openWriter({
252
- start: baseTime,
253
- channels: [indexSlow.key, dataSlow.key],
254
- });
255
- await writerSlow.write({
256
- [indexSlow.key]: [TimeStamp.nanoseconds(0), TimeStamp.nanoseconds(5)],
257
- [dataSlow.key]: [2.0, 2.5],
258
- });
259
- await writerSlow.commit();
260
- await writerSlow.close();
261
-
262
- const stream = await client.read({
263
- channels: [dataFast.key, dataSlow.key],
264
- timeRange: {
265
- start: baseTime,
266
- end: TimeStamp.nanoseconds(6),
267
- },
268
- responseType: "csv",
269
- });
270
- const records = await streamToRecords(stream);
271
- expect(records).toEqual([
272
- [indexFast.name, dataFast.name, indexSlow.name, dataSlow.name],
273
- ["0", "1", "0", "2"],
274
- ["1", "1.1", "", ""],
275
- ["2", "1.2", "", ""],
276
- ["3", "1.3", "", ""],
277
- ["4", "1.4", "", ""],
278
- ["5", "1.5", "5", "2.5"],
279
- ]);
280
- });
281
- it("should handle large amounts of channels", async () => {
282
- const numGroups = 5;
283
- const channelsPerGroup = 3;
284
- const dataKeys: channel.Key[] = [];
285
- const expectedColumns = numGroups * (1 + channelsPerGroup);
286
-
287
- // Store timestamps written per group for building expected rows later
288
- interface GroupWrite {
289
- groupIdx: number;
290
- timestamps: bigint[];
291
- values: number[][]; // values[sampleIdx][channelIdx]
292
- }
293
- const groupWrites: GroupWrite[] = [];
294
-
295
- for (let g = 0; g < numGroups; g++) {
296
- const index = await client.channels.create({
297
- name: id.create(),
298
- dataType: DataType.TIMESTAMP,
299
- isIndex: true,
300
- });
301
- const groupChannels: channel.Key[] = [index.key];
302
- for (let c = 0; c < channelsPerGroup; c++) {
303
- const data = await client.channels.create({
304
- name: id.create(),
305
- dataType: DataType.FLOAT64,
306
- index: index.key,
307
- });
308
- dataKeys.push(data.key);
309
- groupChannels.push(data.key);
310
- }
311
- const writer = await client.openWriter({
312
- start: TimeStamp.seconds(g + 1),
313
- channels: groupChannels,
314
- });
315
- // Write two timestamps for this group
316
- const ts1 = TimeStamp.seconds(g + 1);
317
- const ts2 = TimeStamp.seconds(g + 2);
318
- const writeData: Record<number, unknown[]> = {
319
- [index.key]: [ts1, ts2],
320
- };
321
- // Write sample values for all channels
322
- for (let c = 0; c < channelsPerGroup; c++)
323
- writeData[groupChannels[c + 1]] = [g * 10 + c, g * 10 + c + 1];
324
-
325
- await writer.write(writeData);
326
- await writer.commit();
327
- await writer.close();
328
-
329
- // Store the write info
330
- groupWrites.push({
331
- groupIdx: g,
332
- timestamps: [ts1.valueOf(), ts2.valueOf()],
333
- values: [
334
- Array.from({ length: channelsPerGroup }, (_, c) => g * 10 + c),
335
- Array.from({ length: channelsPerGroup }, (_, c) => g * 10 + c + 1),
336
- ],
337
- });
338
- }
339
-
340
- // Build expected rows AFTER all groups created (now we know total columns)
341
- const rowsByTime = new Map<string, string[]>();
342
- for (const gw of groupWrites)
343
- for (let i = 0; i < gw.timestamps.length; i++) {
344
- const timeStr = gw.timestamps[i].toString();
345
- if (!rowsByTime.has(timeStr))
346
- rowsByTime.set(timeStr, Array(expectedColumns).fill(""));
347
-
348
- const row = rowsByTime.get(timeStr)!;
349
- const colOffset = gw.groupIdx * (1 + channelsPerGroup);
350
- row[colOffset] = timeStr; // index timestamp
351
- for (let c = 0; c < channelsPerGroup; c++)
352
- row[colOffset + 1 + c] = gw.values[i][c].toString();
353
- }
354
-
355
- // Compose expected rows in time order (ascending)
356
- const sortedTimes = Array.from(rowsByTime.keys())
357
- .map((k) => BigInt(k))
358
- .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))
359
- .map((k) => k.toString());
360
-
361
- const expectedRows: string[][] = [];
362
- for (const timeStr of sortedTimes) expectedRows.push(rowsByTime.get(timeStr)!);
363
-
364
- const stream = await client.read({
365
- channels: dataKeys,
366
- timeRange: { start: TimeStamp.seconds(0), end: TimeStamp.seconds(20) },
367
- responseType: "csv",
368
- });
369
- const rows = await streamToRecords(stream);
370
- // There should be a header and at least the expected number of rows
371
- expect(rows.length).toBeGreaterThan(1);
372
- expect(rows.slice(1)).toEqual(expectedRows);
373
- // Each row should have columns for all groups (index + data channels each)
374
- rows.forEach((row) => {
375
- expect(row).toHaveLength(expectedColumns);
376
- });
377
- });
378
-
379
- it("should handle empty data gracefully", async () => {
380
- const index = await client.channels.create({
381
- name: id.create(),
382
- dataType: DataType.TIMESTAMP,
383
- isIndex: true,
384
- });
385
- const data = await client.channels.create({
386
- name: id.create(),
387
- dataType: DataType.FLOAT64,
388
- index: index.key,
389
- });
390
- const stream = await client.read({
391
- channels: [data.key],
392
- timeRange: { start: TimeStamp.seconds(0), end: TimeStamp.seconds(10) },
393
- responseType: "csv",
394
- });
395
- const rows = await streamToRecords(stream);
396
- expect(rows).toEqual([[index.name, data.name]]);
397
- });
398
-
399
- it("should use channel names as default headers", async () => {
400
- const uniqueSuffix = id.create();
401
- const indexName = `my_timestamp_${uniqueSuffix}`;
402
- const dataName = `my_sensor_data_${uniqueSuffix}`;
403
- const index = await client.channels.create({
404
- name: indexName,
405
- dataType: DataType.TIMESTAMP,
406
- isIndex: true,
407
- });
408
- const data = await client.channels.create({
409
- name: dataName,
410
- dataType: DataType.FLOAT64,
411
- index: index.key,
412
- });
413
- const writer = await client.openWriter({
414
- start: TimeStamp.nanoseconds(1),
415
- channels: [index.key, data.key],
416
- });
417
- await writer.write({
418
- [index.key]: [TimeStamp.nanoseconds(1)],
419
- [data.key]: [42],
420
- });
421
- await writer.commit();
422
- await writer.close();
423
- const stream = await client.read({
424
- channels: [data.key],
425
- timeRange: { start: TimeStamp.seconds(0), end: TimeStamp.seconds(100000) },
426
- responseType: "csv",
427
- });
428
- const records = await streamToRecords(stream);
429
- expect(records).toEqual([
430
- [index.name, data.name],
431
- ["1", "42"],
432
- ]);
433
- });
434
- it("should handle channels across domains with gaps in them", async () => {
435
- const index = await client.channels.create({
436
- name: id.create(),
437
- dataType: DataType.TIMESTAMP,
438
- isIndex: true,
439
- });
440
- const data = await client.channels.create({
441
- name: id.create(),
442
- dataType: DataType.FLOAT64,
443
- index: index.key,
444
- });
445
- let writer = await client.openWriter({
446
- start: TimeStamp.nanoseconds(101),
447
- channels: [index.key, data.key],
448
- });
449
- await writer.write({
450
- [index.key]: [
451
- TimeStamp.nanoseconds(101),
452
- TimeStamp.nanoseconds(102),
453
- TimeStamp.nanoseconds(103),
454
- ],
455
- [data.key]: [10, 11, 12],
456
- });
457
- await writer.commit();
458
- await writer.close();
459
- writer = await client.openWriter({
460
- start: TimeStamp.nanoseconds(1),
461
- channels: [index.key, data.key],
462
- });
463
- await writer.write({
464
- [index.key]: [
465
- TimeStamp.nanoseconds(1),
466
- TimeStamp.nanoseconds(2),
467
- TimeStamp.nanoseconds(3),
468
- ],
469
- [data.key]: [1, 2, 3],
470
- });
471
- await writer.commit();
472
- await writer.close();
473
- const stream = await client.read({
474
- channels: [data.key],
475
- timeRange: { start: TimeStamp.nanoseconds(3), end: TimeStamp.nanoseconds(103) },
476
- responseType: "csv",
477
- });
478
- const rows = await streamToRecords(stream);
479
- expect(rows).toEqual([
480
- [index.name, data.name],
481
- ["3", "3"],
482
- ["101", "10"],
483
- ["102", "11"],
484
- ]);
485
- });
486
- it("should handle non-overlapping data across domains", async () => {
487
- // first index will get written from times 10-15, second index from times 13-18
488
- const index1 = await client.channels.create({
489
- name: id.create(),
490
- dataType: DataType.TIMESTAMP,
491
- isIndex: true,
492
- });
493
- const index2 = await client.channels.create({
494
- name: id.create(),
495
- dataType: DataType.TIMESTAMP,
496
- isIndex: true,
497
- });
498
- const data1 = await client.channels.create({
499
- name: id.create(),
500
- dataType: DataType.FLOAT64,
501
- index: index1.key,
502
- });
503
- const data2 = await client.channels.create({
504
- name: id.create(),
505
- dataType: DataType.FLOAT64,
506
- index: index2.key,
507
- });
508
- const writer1 = await client.openWriter({
509
- start: TimeStamp.nanoseconds(10),
510
- channels: [index1.key, data1.key],
511
- });
512
- await writer1.write({
513
- [index1.key]: [
514
- TimeStamp.nanoseconds(10),
515
- TimeStamp.nanoseconds(11),
516
- TimeStamp.nanoseconds(12),
517
- TimeStamp.nanoseconds(13),
518
- TimeStamp.nanoseconds(14),
519
- TimeStamp.nanoseconds(15),
520
- ],
521
- [data1.key]: [1, 2, 3, 4, 5, 6],
522
- });
523
- await writer1.commit();
524
- await writer1.close();
525
- const writer2 = await client.openWriter({
526
- start: TimeStamp.nanoseconds(15),
527
- channels: [index2.key, data2.key],
528
- });
529
- await writer2.write({
530
- [index2.key]: [
531
- TimeStamp.nanoseconds(13),
532
- TimeStamp.nanoseconds(14),
533
- TimeStamp.nanoseconds(15),
534
- TimeStamp.nanoseconds(16),
535
- TimeStamp.nanoseconds(17),
536
- TimeStamp.nanoseconds(18),
537
- ],
538
- [data2.key]: [11, 12, 13, 14, 15, 16],
539
- });
540
- await writer2.commit();
541
- await writer2.close();
542
- const stream = await client.read({
543
- channels: [data1.key, data2.key],
544
- timeRange: { start: TimeStamp.nanoseconds(0), end: TimeStamp.nanoseconds(19) },
545
- responseType: "csv",
546
- });
547
- const rows = await streamToRecords(stream);
548
- expect(rows).toEqual([
549
- [index1.name, data1.name, index2.name, data2.name],
550
- ["10", "1", "", ""],
551
- ["11", "2", "", ""],
552
- ["12", "3", "", ""],
553
- ["13", "4", "13", "11"],
554
- ["14", "5", "14", "12"],
555
- ["15", "6", "15", "13"],
556
- ["", "", "16", "14"],
557
- ["", "", "17", "15"],
558
- ["", "", "18", "16"],
559
- ]);
560
- });
561
- it("should handle large dataset requiring multiple iterator calls", async () => {
562
- // Create 4 groups with different indexes at different rates
563
- const numGroups = 4;
564
- const samplesPerGroup = [3000, 2500, 2000, 1500]; // Different sample counts
565
- const channelsPerGroup = 3;
566
-
567
- interface GroupInfo {
568
- indexKey: number;
569
- dataKeys: number[];
570
- baseTime: TimeStamp;
571
- sampleCount: number;
572
- intervalMs: number;
573
- }
574
-
575
- const groups: GroupInfo[] = [];
576
- const allDataKeys: number[] = [];
577
-
578
- // Create channels for each group
579
- for (let g = 0; g < numGroups; g++) {
580
- const index = await client.channels.create({
581
- name: `stress_index_${id.create()}`,
582
- dataType: DataType.TIMESTAMP,
583
- isIndex: true,
584
- });
585
-
586
- const dataKeys: number[] = [];
587
- for (let c = 0; c < channelsPerGroup; c++) {
588
- const data = await client.channels.create({
589
- name: `stress_data_${id.create()}`,
590
- dataType: DataType.FLOAT64,
591
- index: index.key,
592
- });
593
- dataKeys.push(data.key);
594
- allDataKeys.push(data.key);
595
- }
596
-
597
- // Different base times and intervals to create interleaving
598
- const baseTime = TimeStamp.seconds(1000).add(TimeSpan.milliseconds(g * 7));
599
- const intervalMs = 10 + g * 3; // 10ms, 13ms, 16ms, 19ms intervals
600
-
601
- groups.push({
602
- indexKey: index.key,
603
- dataKeys,
604
- baseTime,
605
- sampleCount: samplesPerGroup[g],
606
- intervalMs,
607
- });
608
- }
609
-
610
- // Write data to each group in parallel using Promise.all
611
- await Promise.all(
612
- groups.map(async (group) => {
613
- const writer = await client.openWriter({
614
- start: group.baseTime,
615
- channels: [group.indexKey, ...group.dataKeys],
616
- });
617
-
618
- // Write in batches to avoid memory issues
619
- const batchSize = 500;
620
- for (
621
- let batchStart = 0;
622
- batchStart < group.sampleCount;
623
- batchStart += batchSize
624
- ) {
625
- const batchEnd = Math.min(batchStart + batchSize, group.sampleCount);
626
- const timestamps: TimeStamp[] = [];
627
- const dataArrays: number[][] = group.dataKeys.map(() => []);
628
-
629
- for (let i = batchStart; i < batchEnd; i++) {
630
- timestamps.push(
631
- group.baseTime.add(TimeSpan.milliseconds(i * group.intervalMs)),
632
- );
633
- group.dataKeys.forEach((_, c) => {
634
- dataArrays[c].push(i * 100 + c);
635
- });
636
- }
637
-
638
- const writeData: Record<number, unknown[]> = {
639
- [group.indexKey]: timestamps,
640
- };
641
- group.dataKeys.forEach((key, c) => {
642
- writeData[key] = dataArrays[c];
643
- });
644
-
645
- await writer.write(writeData);
646
- }
647
- await writer.commit();
648
- await writer.close();
649
- }),
650
- );
651
- // Calculate expected total samples across all groups
652
- const totalSamples = samplesPerGroup.reduce((a, b) => a + b, 0);
653
-
654
- // Export the data
655
- const stream = await client.read({
656
- channels: allDataKeys,
657
- timeRange: {
658
- start: TimeStamp.seconds(999),
659
- end: TimeStamp.seconds(1100),
660
- },
661
- responseType: "csv",
662
- });
663
-
664
- // Collect all chunks and track streaming behavior
665
- const reader = stream.getReader();
666
- const chunks: Uint8Array[] = [];
667
- let chunkCount = 0;
668
-
669
- while (true) {
670
- const { done, value } = await reader.read();
671
- if (done) break;
672
- chunks.push(value);
673
- chunkCount++;
674
- }
675
-
676
- // Verify multiple chunks were produced (proves streaming worked)
677
- expect(chunkCount).toBeGreaterThan(1);
678
-
679
- // Decode and parse the full CSV
680
- const decoder = new TextDecoder();
681
- const csv = chunks.map((c) => decoder.decode(c)).join("");
682
- const lines = csv.trim().split(delimiter);
683
-
684
- // Header + data rows (some timestamps may align, so rows <= totalSamples)
685
- expect(lines.length).toBeGreaterThan(1);
686
- expect(lines.length).toBeLessThanOrEqual(totalSamples + 1);
687
-
688
- // Verify header has correct number of columns
689
- // Each group has: 1 index + channelsPerGroup data channels
690
- const expectedColumns = numGroups * (1 + channelsPerGroup);
691
- const headerColumns = lines[0].split(",");
692
- expect(headerColumns).toHaveLength(expectedColumns);
693
-
694
- // Verify all data rows have correct column count
695
- for (let i = 1; i < lines.length; i++) {
696
- const cols = lines[i].split(",");
697
- expect(cols).toHaveLength(expectedColumns);
698
- }
699
-
700
- // Verify timestamps are in ascending order
701
- const rows = parseCSV(csv);
702
- let lastTimestamp: bigint | null = null;
703
- for (let i = 1; i < rows.length; i++)
704
- // Find the first non-empty timestamp in this row
705
- for (let g = 0; g < numGroups; g++) {
706
- const tsCol = g * (1 + channelsPerGroup);
707
- const tsStr = rows[i][tsCol];
708
- if (tsStr === "") continue;
709
- const ts = BigInt(tsStr);
710
- if (lastTimestamp !== null) expect(ts).toBeGreaterThanOrEqual(lastTimestamp);
711
- lastTimestamp = ts;
712
- break;
713
- }
714
-
715
- // Verify some specific data integrity
716
- // First row should have data from at least one group
717
- const firstDataRow = rows[1];
718
- const nonEmptyValues = firstDataRow.filter((v) => v !== "");
719
- expect(nonEmptyValues.length).toBeGreaterThan(0);
720
- });
721
- it(
722
- "should handle large dense and sparse indexes with correct ordering and merging",
723
- { timeout: 15_000 },
724
- async () => {
725
- const denseSamples = 100_000;
726
- const sparseStep = 1_000;
727
- const sparseSamples = denseSamples / sparseStep;
728
-
729
- const indexFast = await client.channels.create({
730
- name: `dense_index_${id.create()}`,
731
- dataType: DataType.TIMESTAMP,
732
- isIndex: true,
733
- });
734
- const dataFast = await client.channels.create({
735
- name: `dense_data_${id.create()}`,
736
- dataType: DataType.FLOAT64,
737
- index: indexFast.key,
738
- });
739
-
740
- const indexSlow = await client.channels.create({
741
- name: `sparse_index_${id.create()}`,
742
- dataType: DataType.TIMESTAMP,
743
- isIndex: true,
744
- });
745
- const dataSlow = await client.channels.create({
746
- name: `sparse_data_${id.create()}`,
747
- dataType: DataType.FLOAT64,
748
- index: indexSlow.key,
749
- });
750
- const start = TimeStamp.seconds(0);
751
- const denseWriter = await client.openWriter({
752
- start,
753
- channels: [indexFast.key, dataFast.key],
754
- });
755
-
756
- const maxBatchSize = 10_000;
757
- for (
758
- let batchStart = 1;
759
- batchStart <= denseSamples;
760
- batchStart += maxBatchSize
761
- ) {
762
- const batchEnd = Math.min(batchStart + maxBatchSize - 1, denseSamples);
763
- const batchSize = batchEnd - batchStart + 1;
764
- const times = secondsLinspace(batchStart, batchSize);
765
- const data = Array.from({ length: batchSize }, (_, i) => i + batchStart);
766
- await denseWriter.write({ [indexFast.key]: times, [dataFast.key]: data });
767
- }
768
- await denseWriter.commit();
769
- await denseWriter.close();
770
-
771
- const sparseWriter = await client.openWriter({
772
- start,
773
- channels: [indexSlow.key, dataSlow.key],
774
- });
775
-
776
- for (
777
- let batchStart = 1;
778
- batchStart < sparseSamples;
779
- batchStart += maxBatchSize
780
- ) {
781
- const batchEnd = Math.min(
782
- batchStart + (maxBatchSize - 1) * sparseStep,
783
- batchStart + sparseSamples * sparseStep,
784
- );
785
- const times: TimeStamp[] = [];
786
- const data: number[] = [];
787
-
788
- for (let j = batchStart; j < batchEnd; j += sparseStep) {
789
- times.push(start.add(TimeSpan.seconds(j)));
790
- data.push(j); // arbitrary data value
791
- }
792
- await sparseWriter.write({ [indexSlow.key]: times, [dataSlow.key]: data });
793
- }
794
- await sparseWriter.commit();
795
- await sparseWriter.close();
796
-
797
- const stream = await client.read({
798
- channels: [dataFast.key, dataSlow.key],
799
- timeRange: {
800
- start: TimeStamp.seconds(0),
801
- end: start.add(TimeSpan.seconds(denseSamples + 1)),
802
- },
803
- responseType: "csv",
804
- });
805
-
806
- const reader = stream.getReader();
807
- const decoder = new TextDecoder();
808
-
809
- let buffer = "";
810
- let chunkCount = 0;
811
- let isHeader = true;
812
- let totalRows = 0; // data rows only (exclude header)
813
- let sparseRows = 0;
814
- let lastTimestamp: bigint | null = null;
815
-
816
- while (true) {
817
- const { done, value } = await reader.read();
818
- if (done) break;
819
- chunkCount++;
820
- buffer += decoder.decode(value);
821
- while (true) {
822
- const idx = buffer.indexOf(delimiter);
823
- if (idx === -1) break;
824
- const line = buffer.slice(0, idx);
825
- buffer = buffer.slice(idx + delimiter.length);
826
- if (line === "") continue;
827
- if (isHeader) {
828
- const headerCols = line.split(",");
829
- expect(headerCols).toEqual([
830
- indexFast.name,
831
- dataFast.name,
832
- indexSlow.name,
833
- dataSlow.name,
834
- ]);
835
- isHeader = false;
836
- continue;
837
- }
838
-
839
- totalRows++;
840
- const cols = line.split(",");
841
- expect(cols).toHaveLength(4);
842
- const [fastTsStr, fastValStr, slowTsStr, slowValStr] = cols;
843
-
844
- expect(fastTsStr).not.toBe("");
845
- expect(fastValStr).not.toBe("");
846
-
847
- const ts = BigInt(fastTsStr);
848
- if (lastTimestamp !== null) expect(ts).toBeGreaterThan(lastTimestamp);
849
- lastTimestamp = ts;
850
-
851
- if (slowValStr !== "") {
852
- sparseRows++;
853
- // When sparse has data, its timestamp should match dense's timestamp
854
- expect(slowTsStr).toBe(fastTsStr);
855
- expect(slowValStr).not.toBe("");
856
- }
857
- }
858
- }
859
- expect(chunkCount).toBeGreaterThan(1);
860
- expect(totalRows).toBe(denseSamples);
861
- expect(sparseRows).toBe(sparseSamples);
862
- },
863
- );
864
- });
865
- });