@synnaxlabs/client 0.18.1 → 0.18.3

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.
@@ -9,7 +9,7 @@
9
9
  "version": "1.0.0",
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
- "@synnaxlabs/client": "^0.18.0"
12
+ "@synnaxlabs/client": "^0.18.2"
13
13
  }
14
14
  },
15
15
  "node_modules/@grpc/grpc-js": {
@@ -3653,16 +3653,28 @@
3653
3653
  }
3654
3654
  },
3655
3655
  "node_modules/@synnaxlabs/client": {
3656
- "version": "0.18.0",
3657
- "resolved": "https://registry.npmjs.org/@synnaxlabs/client/-/client-0.18.0.tgz",
3658
- "integrity": "sha512-o53rR0awYUCcdSCENzo+6VjsEEt30ExHG0B1FLOk3+865eIJkvazS4RrRYpitrIxuzAGIK12v0vZ/qj8sGzlfA==",
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==",
3659
3659
  "dependencies": {
3660
3660
  "@synnaxlabs/freighter": "0.9.3",
3661
- "@synnaxlabs/x": "0.15.0",
3661
+ "@synnaxlabs/x": "0.15.2",
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
+ },
3666
3678
  "node_modules/@synnaxlabs/freighter": {
3667
3679
  "version": "0.9.3",
3668
3680
  "resolved": "https://registry.npmjs.org/@synnaxlabs/freighter/-/freighter-0.9.3.tgz",
@@ -11,6 +11,6 @@
11
11
  "author": "",
12
12
  "license": "ISC",
13
13
  "dependencies": {
14
- "@synnaxlabs/client": "^0.18.0"
14
+ "@synnaxlabs/client": "^0.18.2"
15
15
  }
16
16
  }
@@ -34,4 +34,130 @@ let v = series.at(0);
34
34
  series = new Series([1, 2, 3, 4, 5]);
35
35
  let easierSeries = series.as("number");
36
36
  // Now we have a guarantee that this is a series of numbers.
37
- v = easierSeries.at(0);
37
+ v = easierSeries.at(0);
38
+ console.log(v);
39
+
40
+ series = new Series({ data: [1, 2, 3, 4, 5], dataType: "int8" });
41
+ const ta = series.data;
42
+ console.log(ta); // Int8Array [ 1, 2, 3, 4, 5 ]
43
+
44
+ series = new Series([1, 2, 3, 4, 5]);
45
+ let jsArray = [...series];
46
+ console.log(jsArray); // [ 1, 2, 3, 4, 5 ]
47
+ const jsArray2 = Array.from(series);
48
+ console.log(jsArray2); // [ 1, 2, 3, 4, 5 ]
49
+
50
+ series = new Series([{ red: "cherry", yellow: "banana", orange: "orange" }]);
51
+ jsArray = [...series];
52
+ console.log(jsArray); // [ { red: 'cherry', yellow: 'banana', orange: 'orange' } ]
53
+
54
+ import { TimeRange, TimeStamp, TimeSpan } from "@synnaxlabs/client";
55
+
56
+ const start = TimeStamp.now();
57
+
58
+ const tr = new TimeRange(start, start.add(TimeSpan.seconds(5)));
59
+
60
+ series = new Series({
61
+ data: [1, 2, 3, 4, 5],
62
+ dataType: "float64",
63
+ timeRange: new TimeRange(start, start.add(TimeSpan.seconds(6)))
64
+ });
65
+
66
+ series = new Series([1, 2, 3, 4, 5]);
67
+ console.log(series.length); // 5
68
+
69
+ const stringSeries = new Series(["apple", "banana", "cherry"]);
70
+ console.log(stringSeries.length); // 3
71
+
72
+ import { DataType } from "@synnaxlabs/client";
73
+
74
+ series = new Series([1, 2, 3, 4, 5]);
75
+ console.log(series.dataType.toString()); // "float64"
76
+ console.log(series.dataType.equals(DataType.STRING)); // true
77
+
78
+ series = new Series([1, 2, 3, 4, 5]);
79
+ console.log(series.max); // 5
80
+ console.log(series.min); // 1
81
+ console.log(series.bounds); // { lower: 1, upper: 5 }
82
+
83
+ import { Frame } from "@synnaxlabs/client";
84
+
85
+ // Construct a frame for the given channel names.
86
+ let frame = new Frame({
87
+ "channel1": new Series([1, 2, 3, 4, 5]),
88
+ "channel2": new Series([5, 4, 3, 2, 1]),
89
+ "channel3": new Series([1, 1, 1, 1, 1]),
90
+ });
91
+
92
+ // Construct a frame for the given channel keys
93
+ frame = new Frame({
94
+ 1: new Series([1, 2, 3, 4, 5]),
95
+ 2: new Series([5, 4, 3, 2, 1]),
96
+ // Notice that series do not need to be the same length.
97
+ 3: new Series([1, 1, 1]),
98
+ });
99
+
100
+ // Construct a frame from a map
101
+ frame = new Frame(new Map([
102
+ ["channel1", new Series([1, 2, 3, 4, 5])],
103
+ ["channel2", new Series([5, 4, 3, 2, 1])],
104
+ ["channel3", new Series([1, 1, 1, 1, 1])],
105
+ ]));
106
+
107
+ // Or from an array of keys and series
108
+ frame = new Frame(["channel1", "channel2", "channel3"], [
109
+ new Series([1, 2, 3, 4, 5]),
110
+ new Series([5, 4, 3, 2, 1]),
111
+ new Series([1, 1, 1, 1, 1]),
112
+ ]);
113
+
114
+ // Or construct a frame with multiple series for a single channel
115
+ frame = new Frame({
116
+ "channel1": [
117
+ new Series([1, 2, 3, 4, 5]),
118
+ new Series([5, 4, 3, 2, 1]),
119
+ new Series([1, 1, 1, 1, 1]),
120
+ ],
121
+ "channel2": [
122
+ new Series([1, 2, 3, 4, 5]),
123
+ ],
124
+ });
125
+
126
+ import { MultiSeries } from "@synnaxlabs/client";
127
+
128
+ frame = new Frame({
129
+ "channel1": [new Series([1, 2]), new Series([3, 4, 5])],
130
+ "channel2": new Series([5, 4, 3, 2, 1]),
131
+ "channel3": new Series([1, 1, 1, 1, 1]),
132
+ });
133
+
134
+ const multiSeries = frame.get("channel1");
135
+ // Access a value
136
+ console.log(multiSeries.at(0)); // 1
137
+
138
+ // Access a value from a specific series
139
+ console.log(multiSeries.series[0].at(0)); // 1
140
+
141
+ // Construct a Javascript array from the MultiSeries
142
+ jsArray = [...multiSeries];
143
+ console.log(jsArray); // [ 1, 2, 3, 4, 5 ]
144
+
145
+ frame = new Frame({
146
+ "channel1": new Series([1, 2, 3, 4, 5]),
147
+ "channel2": new Series([5, 4, 3, 2, 1]),
148
+ "channel3": new Series([1, 1]),
149
+ });
150
+
151
+ let obj = frame.at(3);
152
+ console.log(obj); // { channel1: 1, channel2: 5, channel3: undefined }
153
+
154
+ frame = new Frame({
155
+ "channel1": new Series([1, 2, 3, 4, 5]),
156
+ "channel2": new Series([5, 4, 3, 2, 1]),
157
+ "channel3": new Series([1, 1]),
158
+ });
159
+ try {
160
+ obj = frame.at(3, true); // Throws an error
161
+ } catch (e) {
162
+ console.log(e.message); // no value at index
163
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@synnaxlabs/client",
3
3
  "private": false,
4
- "version": "0.18.1",
4
+ "version": "0.18.3",
5
5
  "type": "module",
6
6
  "description": "The Client Library for Synnax",
7
7
  "repository": "https://github.com/synnaxlabs/synnax/tree/main/client/ts",
@@ -18,8 +18,8 @@
18
18
  "dependencies": {
19
19
  "async-mutex": "^0.4.0",
20
20
  "zod": "3.22.4",
21
- "@synnaxlabs/freighter": "0.9.3",
22
- "@synnaxlabs/x": "0.15.1"
21
+ "@synnaxlabs/freighter": "0.9.4",
22
+ "@synnaxlabs/x": "0.15.3"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/node": "^20.10.5",
@@ -10,6 +10,7 @@
10
10
  import { DataType, Rate, TimeStamp } from "@synnaxlabs/x";
11
11
  import { describe, test, expect, it } from "vitest";
12
12
 
13
+ import { Channel } from "@/channel/client";
13
14
  import { QueryError } from "@/errors";
14
15
  import { newClient } from "@/setupspecs";
15
16
 
@@ -62,72 +63,102 @@ describe("Channel", () => {
62
63
  expect(channels[0].name).toEqual("test1");
63
64
  expect(channels[1].name).toEqual("test2");
64
65
  });
66
+ test("create instances of channels", async () => {
67
+ const timeIndexChannel = await client.channels.create({
68
+ name: "time",
69
+ dataType: DataType.TIMESTAMP,
70
+ isIndex: true,
71
+ });
72
+
73
+ const sensorOne = new Channel({
74
+ name: "sensor_one",
75
+ dataType: DataType.FLOAT32,
76
+ index: timeIndexChannel.key,
77
+ });
78
+
79
+ const sensorTwo = new Channel({
80
+ name: "sensor_two",
81
+ dataType: DataType.FLOAT32,
82
+ index: timeIndexChannel.key,
83
+ });
84
+
85
+ const sensorThree = new Channel({
86
+ name: "sensor_three",
87
+ dataType: DataType.FLOAT32,
88
+ index: timeIndexChannel.key,
89
+ });
90
+
91
+ const sensors = await client.channels.create([sensorOne, sensorTwo, sensorThree]);
92
+ });
65
93
  describe("retrieveIfNameExists", () => {
66
94
  it("should retrieve the existing channel when it exists", async () => {
67
- const name = `test-${Math.random()}-${TimeStamp.now().valueOf()}`
95
+ const name = `test-${Math.random()}-${TimeStamp.now().valueOf()}`;
68
96
  const channel = await client.channels.create({
69
97
  name,
70
98
  leaseholder: 1,
71
99
  rate: Rate.hz(1),
72
100
  dataType: DataType.FLOAT32,
73
101
  });
74
- const channelTwo = await client.channels.create({
75
- name,
76
- leaseholder: 1,
77
- rate: Rate.hz(1),
78
- dataType: DataType.FLOAT32,
79
- },
80
- {retrieveIfNameExists: true}
102
+ const channelTwo = await client.channels.create(
103
+ {
104
+ name,
105
+ leaseholder: 1,
106
+ rate: Rate.hz(1),
107
+ dataType: DataType.FLOAT32,
108
+ },
109
+ { retrieveIfNameExists: true },
81
110
  );
82
111
  expect(channelTwo.key).toEqual(channel.key);
83
112
  });
84
113
  it("should create a new channel when it does not exist", async () => {
85
- const name = `test-${Math.random()}-${TimeStamp.now().valueOf()}`
114
+ const name = `test-${Math.random()}-${TimeStamp.now().valueOf()}`;
86
115
  const channel = await client.channels.create({
87
116
  name,
88
117
  leaseholder: 1,
89
118
  rate: Rate.hz(1),
90
119
  dataType: DataType.FLOAT32,
91
120
  });
92
- const channelTwo = await client.channels.create({
93
- name: `${name}-2`,
94
- leaseholder: 1,
95
- rate: Rate.hz(1),
96
- dataType: DataType.FLOAT32,
97
- },
98
- {retrieveIfNameExists: true}
121
+ const channelTwo = await client.channels.create(
122
+ {
123
+ name: `${name}-2`,
124
+ leaseholder: 1,
125
+ rate: Rate.hz(1),
126
+ dataType: DataType.FLOAT32,
127
+ },
128
+ { retrieveIfNameExists: true },
99
129
  );
100
130
  expect(channelTwo.key).not.toEqual(channel.key);
101
131
  });
102
132
  it("should retrieve and create the correct channels when creating many", async () => {
103
- const name = `test-${Math.random()}-${TimeStamp.now().valueOf()}`
133
+ const name = `test-${Math.random()}-${TimeStamp.now().valueOf()}`;
104
134
  const channel = await client.channels.create({
105
135
  name,
106
136
  leaseholder: 1,
107
137
  rate: Rate.hz(1),
108
138
  dataType: DataType.FLOAT32,
109
139
  });
110
- const channelTwo = await client.channels.create([
111
- {
112
- name,
113
- leaseholder: 1,
114
- rate: Rate.hz(1),
115
- dataType: DataType.FLOAT32,
116
- },
117
- {
118
- name: `${name}-2`,
119
- leaseholder: 1,
120
- rate: Rate.hz(1),
121
- dataType: DataType.FLOAT32,
122
- },
123
- ],
124
- {retrieveIfNameExists: true}
140
+ const channelTwo = await client.channels.create(
141
+ [
142
+ {
143
+ name,
144
+ leaseholder: 1,
145
+ rate: Rate.hz(1),
146
+ dataType: DataType.FLOAT32,
147
+ },
148
+ {
149
+ name: `${name}-2`,
150
+ leaseholder: 1,
151
+ rate: Rate.hz(1),
152
+ dataType: DataType.FLOAT32,
153
+ },
154
+ ],
155
+ { retrieveIfNameExists: true },
125
156
  );
126
157
  expect(channelTwo.length).toEqual(2);
127
158
  expect(channelTwo[0].key).toEqual(channel.key);
128
159
  expect(channelTwo[1].key).not.toEqual(channel.key);
129
160
  });
130
- })
161
+ });
131
162
  });
132
163
  test("retrieve by key", async () => {
133
164
  const channel = await client.channels.create({
@@ -41,7 +41,7 @@ describe("WriteFrameAdapter", () => {
41
41
  expect(res.series).toHaveLength(2);
42
42
  expect(res.get(timeCh.key)).toHaveLength(1);
43
43
  expect(res.get(dataCh.key)).toHaveLength(1);
44
- expect(res.get(timeCh.key).at(0)).toEqual(Number(ts));
44
+ expect(res.get(timeCh.key).at(0)).toEqual(ts);
45
45
  expect(res.get(dataCh.key).at(0)).toEqual(1);
46
46
  });
47
47
 
@@ -55,7 +55,7 @@ describe("WriteFrameAdapter", () => {
55
55
  expect(res2.series).toHaveLength(2);
56
56
  expect(res2.get(timeCh.key)).toHaveLength(1);
57
57
  expect(res2.get(dataCh.key)).toHaveLength(1);
58
- expect(res2.get(timeCh.key).at(0)).toEqual(Number(ts));
58
+ expect(res2.get(timeCh.key).at(0)).toEqual(ts);
59
59
  expect(res2.get(dataCh.key).at(0)).toEqual(1);
60
60
  });
61
61
 
@@ -75,7 +75,7 @@ describe("WriteFrameAdapter", () => {
75
75
  );
76
76
  expect(res4.get(timeCh.key)).toHaveLength(1);
77
77
  expect(res4.get(dataCh.key)).toHaveLength(1);
78
- expect(res4.get(timeCh.key).at(0)).toEqual(Number(ts));
78
+ expect(res4.get(timeCh.key).at(0)).toEqual(ts);
79
79
  expect(res4.get(dataCh.key).at(0)).toEqual(1);
80
80
  });
81
81
 
@@ -88,7 +88,7 @@ describe("WriteFrameAdapter", () => {
88
88
  const res = await adapter.adapt(fr);
89
89
  expect(res.columns).toHaveLength(2);
90
90
  expect(res.series).toHaveLength(2);
91
- expect(res.get(timeCh.key).at(0)).toEqual(Number(ts));
91
+ expect(res.get(timeCh.key).at(0)).toEqual(ts);
92
92
  expect(res.get(dataCh.key).at(0)).toEqual(1);
93
93
  });
94
94
 
@@ -101,7 +101,7 @@ describe("WriteFrameAdapter", () => {
101
101
  const res = await adapter.adapt(fr);
102
102
  expect(res.columns).toHaveLength(2);
103
103
  expect(res.series).toHaveLength(2);
104
- expect(res.get(timeCh.key).at(0)).toEqual(Number(ts));
104
+ expect(res.get(timeCh.key).at(0)).toEqual(ts);
105
105
  expect(res.get(dataCh.key).at(0)).toEqual(1);
106
106
  });
107
107
 
@@ -113,6 +113,6 @@ describe("WriteFrameAdapter", () => {
113
113
  expect(res.columns).toHaveLength(1);
114
114
  expect(res.series).toHaveLength(1);
115
115
  expect(res.get(timeCh.key)).toHaveLength(1);
116
- expect(res.get(timeCh.key).at(0)).toEqual(Number(ts));
116
+ expect(res.get(timeCh.key).at(0)).toEqual(ts);
117
117
  });
118
118
  });