@synnaxlabs/client 0.1.0 → 0.1.2

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 (89) hide show
  1. package/build/main/index.d.ts +4 -0
  2. package/build/main/index.js +36 -0
  3. package/build/main/lib/channel/channel.spec.d.ts +1 -0
  4. package/build/main/lib/channel/channel.spec.js +35 -0
  5. package/build/main/lib/channel/client.d.ts +94 -0
  6. package/build/main/lib/channel/client.js +131 -0
  7. package/build/main/lib/channel/creator.d.ts +19 -0
  8. package/build/main/lib/channel/creator.js +44 -0
  9. package/build/main/lib/channel/payload.d.ts +25 -0
  10. package/build/main/lib/channel/payload.js +18 -0
  11. package/build/main/lib/channel/registry.d.ts +9 -0
  12. package/build/main/lib/channel/registry.js +37 -0
  13. package/build/main/lib/channel/retriever.d.ts +11 -0
  14. package/build/main/lib/channel/retriever.js +39 -0
  15. package/build/main/lib/client.d.ts +23 -0
  16. package/build/main/lib/client.js +34 -0
  17. package/build/main/lib/errors.d.ts +53 -0
  18. package/build/main/lib/errors.js +122 -0
  19. package/build/main/lib/segment/client.d.ts +62 -0
  20. package/build/main/lib/segment/client.js +95 -0
  21. package/build/main/lib/segment/iterator.d.ts +134 -0
  22. package/build/main/lib/segment/iterator.js +253 -0
  23. package/build/main/lib/segment/iterator.spec.d.ts +1 -0
  24. package/build/main/lib/segment/iterator.spec.js +62 -0
  25. package/build/main/lib/segment/payload.d.ts +16 -0
  26. package/build/main/lib/segment/payload.js +13 -0
  27. package/build/main/lib/segment/splitter.d.ts +7 -0
  28. package/build/main/lib/segment/splitter.js +25 -0
  29. package/build/main/lib/segment/typed.d.ts +15 -0
  30. package/build/main/lib/segment/typed.js +49 -0
  31. package/build/main/lib/segment/validator.d.ts +22 -0
  32. package/build/main/lib/segment/validator.js +64 -0
  33. package/build/main/lib/segment/writer.d.ts +98 -0
  34. package/build/main/lib/segment/writer.js +183 -0
  35. package/build/main/lib/segment/writer.spec.d.ts +1 -0
  36. package/build/main/lib/segment/writer.spec.js +76 -0
  37. package/build/main/lib/telem.d.ts +395 -0
  38. package/build/main/lib/telem.js +553 -0
  39. package/build/main/lib/telem.spec.d.ts +1 -0
  40. package/build/main/lib/telem.spec.js +150 -0
  41. package/build/main/lib/transport.d.ts +9 -0
  42. package/build/main/lib/transport.js +18 -0
  43. package/build/main/lib/util/telem.d.ts +2 -0
  44. package/build/main/lib/util/telem.js +13 -0
  45. package/build/module/index.d.ts +4 -0
  46. package/build/module/index.js +5 -0
  47. package/build/module/lib/channel/channel.spec.d.ts +1 -0
  48. package/build/module/lib/channel/channel.spec.js +30 -0
  49. package/build/module/lib/channel/client.d.ts +94 -0
  50. package/build/module/lib/channel/client.js +131 -0
  51. package/build/module/lib/channel/creator.d.ts +19 -0
  52. package/build/module/lib/channel/creator.js +42 -0
  53. package/build/module/lib/channel/payload.d.ts +25 -0
  54. package/build/module/lib/channel/payload.js +15 -0
  55. package/build/module/lib/channel/registry.d.ts +9 -0
  56. package/build/module/lib/channel/registry.js +36 -0
  57. package/build/module/lib/channel/retriever.d.ts +11 -0
  58. package/build/module/lib/channel/retriever.js +37 -0
  59. package/build/module/lib/client.d.ts +23 -0
  60. package/build/module/lib/client.js +31 -0
  61. package/build/module/lib/errors.d.ts +53 -0
  62. package/build/module/lib/errors.js +113 -0
  63. package/build/module/lib/segment/client.d.ts +62 -0
  64. package/build/module/lib/segment/client.js +94 -0
  65. package/build/module/lib/segment/iterator.d.ts +134 -0
  66. package/build/module/lib/segment/iterator.js +248 -0
  67. package/build/module/lib/segment/iterator.spec.d.ts +1 -0
  68. package/build/module/lib/segment/iterator.spec.js +57 -0
  69. package/build/module/lib/segment/payload.d.ts +16 -0
  70. package/build/module/lib/segment/payload.js +10 -0
  71. package/build/module/lib/segment/splitter.d.ts +7 -0
  72. package/build/module/lib/segment/splitter.js +26 -0
  73. package/build/module/lib/segment/typed.d.ts +15 -0
  74. package/build/module/lib/segment/typed.js +49 -0
  75. package/build/module/lib/segment/validator.d.ts +22 -0
  76. package/build/module/lib/segment/validator.js +60 -0
  77. package/build/module/lib/segment/writer.d.ts +98 -0
  78. package/build/module/lib/segment/writer.js +183 -0
  79. package/build/module/lib/segment/writer.spec.d.ts +1 -0
  80. package/build/module/lib/segment/writer.spec.js +71 -0
  81. package/build/module/lib/telem.d.ts +395 -0
  82. package/build/module/lib/telem.js +545 -0
  83. package/build/module/lib/telem.spec.d.ts +1 -0
  84. package/build/module/lib/telem.spec.js +145 -0
  85. package/build/module/lib/transport.d.ts +9 -0
  86. package/build/module/lib/transport.js +18 -0
  87. package/build/module/lib/util/telem.d.ts +2 -0
  88. package/build/module/lib/util/telem.js +9 -0
  89. package/package.json +2 -2
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TypedIterator = exports.CoreIterator = void 0;
7
+ const freighter_1 = require("@synnaxlabs/freighter");
8
+ const zod_1 = require("zod");
9
+ const telem_1 = require("../telem");
10
+ const payload_1 = require("./payload");
11
+ const typed_1 = __importDefault(require("./typed"));
12
+ var Command;
13
+ (function (Command) {
14
+ Command[Command["Open"] = 0] = "Open";
15
+ Command[Command["Next"] = 1] = "Next";
16
+ Command[Command["Prev"] = 2] = "Prev";
17
+ Command[Command["First"] = 3] = "First";
18
+ Command[Command["Last"] = 4] = "Last";
19
+ Command[Command["NextSpan"] = 5] = "NextSpan";
20
+ Command[Command["PrevSpan"] = 6] = "PrevSpan";
21
+ Command[Command["NextRange"] = 7] = "NextRange";
22
+ Command[Command["Valid"] = 8] = "Valid";
23
+ Command[Command["Error"] = 9] = "Error";
24
+ Command[Command["SeekFirst"] = 10] = "SeekFirst";
25
+ Command[Command["SeekLast"] = 11] = "SeekLast";
26
+ Command[Command["SeekLT"] = 12] = "SeekLT";
27
+ Command[Command["SeekGE"] = 13] = "SeekGE";
28
+ })(Command || (Command = {}));
29
+ var ResponseVariant;
30
+ (function (ResponseVariant) {
31
+ ResponseVariant[ResponseVariant["None"] = 0] = "None";
32
+ ResponseVariant[ResponseVariant["Ack"] = 1] = "Ack";
33
+ ResponseVariant[ResponseVariant["Data"] = 2] = "Data";
34
+ })(ResponseVariant || (ResponseVariant = {}));
35
+ const RequestSchema = zod_1.z.object({
36
+ command: zod_1.z.nativeEnum(Command),
37
+ span: zod_1.z.number().optional(),
38
+ range: zod_1.z.instanceof(telem_1.TimeRange).optional(),
39
+ stamp: zod_1.z.number().optional(),
40
+ keys: zod_1.z.string().array().optional(),
41
+ });
42
+ const ResponseSchema = zod_1.z.object({
43
+ variant: zod_1.z.nativeEnum(ResponseVariant),
44
+ ack: zod_1.z.boolean(),
45
+ command: zod_1.z.nativeEnum(Command),
46
+ error: freighter_1.ErrorPayloadSchema.optional(),
47
+ segments: payload_1.SegmentPayloadSchema.array().nullable(),
48
+ });
49
+ /**
50
+ * Used to iterate over a clusters telemetry in time-order. It should not be
51
+ * instantiated directly, and should instead be instantiated via the SegmentClient.
52
+ *
53
+ * Using an iterator is ideal when querying/processing large ranges of data, but
54
+ * is relatively complex and difficult to use. If you're looking to retrieve
55
+ * telemetry between two timestamps, see the SegmentClient.read method.
56
+ */
57
+ class CoreIterator {
58
+ constructor(client, aggregate = false) {
59
+ this.aggregate = false;
60
+ this.values = [];
61
+ this.client = client;
62
+ this.aggregate = aggregate;
63
+ }
64
+ /**
65
+ * Opens the iterator, configuring it to iterate over the telemetry in the
66
+ * channels with the given keys within the provided time range.
67
+ *
68
+ * @param tr - The time range to iterate over.
69
+ * @param keys - The keys of the channels to iterate over.
70
+ */
71
+ async open(tr, keys) {
72
+ this.stream = await this.client.stream(CoreIterator.ENDPOINT, RequestSchema,
73
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
74
+ // @ts-ignore
75
+ ResponseSchema);
76
+ await this.execute({ command: Command.Open, keys, range: tr });
77
+ this.values = [];
78
+ }
79
+ /**
80
+ * Reads the next segment for each channel in the iterator.
81
+ *
82
+ * @returns false if the next segment can't be found for one or more channels or
83
+ * the iterator has accumulated an error.
84
+ */
85
+ async next() {
86
+ return this.execute({ command: Command.Next });
87
+ }
88
+ /**
89
+ * Reads the previous segment for each channel in the iterator.
90
+ *
91
+ * @returns false if the next segment can't be found for one or more channels or
92
+ * the iterator has accumulated an error.
93
+ */
94
+ async prev() {
95
+ return this.execute({ command: Command.Prev });
96
+ }
97
+ /**
98
+ * Seeks to the beginning of the time range and reads the first segment of each
99
+ * channel in the iterator.
100
+ *
101
+ * @returns false if no segments exists in the time range for a particular channel
102
+ * or the iterator has accumulated an error.
103
+ */
104
+ async first() {
105
+ return this.execute({ command: Command.First });
106
+ }
107
+ /**
108
+ * Seeks to the end of the time range and reads the last segment of each channel
109
+ * in the iterator.
110
+ *
111
+ * @returns false if no segments exists in the time range for a particular channel,
112
+ * or the iterator has accumulated an error.
113
+ */
114
+ async last() {
115
+ return this.execute({ command: Command.Last });
116
+ }
117
+ /**
118
+ * Reads the next time span of telemetry for each channel in the iterator.
119
+ *
120
+ * @returns false if a segment satisfying the request can't be found for a
121
+ * particular channel or the iterator has accumulated an error.
122
+ */
123
+ async nextSpan(span) {
124
+ return this.execute({ command: Command.NextSpan, span });
125
+ }
126
+ /**
127
+ * Reads the previous time span of telemetry for each channel in the iterator.
128
+ *
129
+ * @returns false if a segment satisfying the request can't be found for a particular
130
+ * channel or the iterator has accumulated an error.
131
+ */
132
+ async prevSpan(span) {
133
+ return this.execute({ command: Command.PrevSpan, span });
134
+ }
135
+ /**
136
+ * Seeks the iterator to the start of the time range and reads the telemetry within
137
+ * the range for each channel.
138
+ *
139
+ * @returns: False if a segment satisfying the request can't be found for a particular
140
+ * channel or the iterator has accumulated an error.
141
+ */
142
+ async nextRange(range) {
143
+ return this.execute({ command: Command.NextRange, range });
144
+ }
145
+ /**
146
+ * Seeks the iterator to the first segment in the time range, but does not read
147
+ * it. Also invalidates the iterator. The iterator will not be considered valid
148
+ * until a call to first, last, next, prev, prev_span, next_span, or next_range.
149
+ *
150
+ * @returns false if the iterator is not pointing to a valid segment for a particular
151
+ * channel or has accumulated an error.
152
+ */
153
+ async seekFirst() {
154
+ return this.execute({ command: Command.SeekFirst });
155
+ }
156
+ /** Seeks the iterator to the last segment in the time range, but does not read it.
157
+ * Also invalidates the iterator. The iterator will not be considered valid
158
+ * until a call to first, last, next, prev, prev_span, next_span, or next_range.
159
+ *
160
+ * @returns false if the iterator is not pointing to a valid segment for a particular
161
+ * channel or has accumulated an error.
162
+ */
163
+ async seekLast() {
164
+ return this.execute({ command: Command.SeekLast });
165
+ }
166
+ /**
167
+ * Seeks the iterator to the first segment whose start is less than or equal to
168
+ * the provided timestamp. Also invalidates the iterator. The iterator will not be
169
+ * considered valid until a call to first, last, next, prev, prev_span, next_span, or next_range.
170
+ *
171
+ * @returns false if the iterator is not pointing to a valid segment for a particular
172
+ * channel or has accumulated an error.
173
+ */
174
+ async seekLT(stamp) {
175
+ return this.execute({ command: Command.SeekLT, stamp });
176
+ }
177
+ /**
178
+ * Seeks the iterator to the first segment whose start is greater than or equal to
179
+ * the provided timestamp. Also invalidates the iterator. The iterator will not be
180
+ * considered valid until a call to first, last, next, prev, prev_span, next_span, or next_range.
181
+ *
182
+ * @returns false if the iterator is not pointing to a valid segment for a particular
183
+ * channel or has accumulated an error.
184
+ */
185
+ async seekGE(stamp) {
186
+ return this.execute({ command: Command.SeekGE, stamp });
187
+ }
188
+ /**
189
+ * @returns true if the iterator value contains a valid segment, and fale otherwise.
190
+ * valid most commonly returns false when the iterator is exhausted or has
191
+ * accumulated an error.
192
+ */
193
+ async valid() {
194
+ return this.execute({ command: Command.Valid });
195
+ }
196
+ /**
197
+ * Closes the iterator. An iterator MUST be closed after use, and this method
198
+ * should probably be placed in a 'finally' block. If the iterator is not closed,
199
+ * it may leak resources.
200
+ */
201
+ async close() {
202
+ if (!this.stream)
203
+ throw new Error('iterator.open() must be called before any other method');
204
+ this.stream.closeSend();
205
+ const [, exc] = await this.stream.receive();
206
+ if (!(exc instanceof freighter_1.EOF))
207
+ throw exc;
208
+ }
209
+ async execute(request) {
210
+ if (!this.stream)
211
+ throw new Error('iterator.open() must be called before any other method');
212
+ const err = this.stream.send(request);
213
+ if (err)
214
+ throw err;
215
+ if (!this.aggregate)
216
+ this.values = [];
217
+ for (;;) {
218
+ const [res, err] = await this.stream.receive();
219
+ if (err || !res)
220
+ throw err;
221
+ if (res.variant == ResponseVariant.Ack)
222
+ return res.ack;
223
+ if (res.segments)
224
+ this.values.push(...res.segments);
225
+ }
226
+ }
227
+ }
228
+ exports.CoreIterator = CoreIterator;
229
+ CoreIterator.ENDPOINT = '/segment/iterate';
230
+ class TypedIterator extends CoreIterator {
231
+ constructor(client, channels, aggregate = false) {
232
+ super(client, aggregate);
233
+ this.channels = channels;
234
+ }
235
+ async value() {
236
+ const result = {};
237
+ this.values.sort((a, b) => a.start.valueOf() - b.start.valueOf());
238
+ const keys = this.values.map((v) => v.channelKey);
239
+ const channels = await this.channels.getN(...keys);
240
+ this.values.forEach((v) => {
241
+ const sugared = new typed_1.default(channels.find((c) => c.key == v.channelKey), v);
242
+ if (v.channelKey in result) {
243
+ result[v.channelKey].extend(sugared);
244
+ }
245
+ else {
246
+ result[v.channelKey] = sugared;
247
+ }
248
+ });
249
+ return result;
250
+ }
251
+ }
252
+ exports.TypedIterator = TypedIterator;
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlZ21lbnQvaXRlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBSytCO0FBQy9CLDZCQUF3QjtBQUl4QixvQ0FBcUM7QUFFckMsdUNBQWlFO0FBQ2pFLG9EQUFtQztBQUVuQyxJQUFLLE9BZUo7QUFmRCxXQUFLLE9BQU87SUFDVixxQ0FBUSxDQUFBO0lBQ1IscUNBQVEsQ0FBQTtJQUNSLHFDQUFRLENBQUE7SUFDUix1Q0FBUyxDQUFBO0lBQ1QscUNBQVEsQ0FBQTtJQUNSLDZDQUFZLENBQUE7SUFDWiw2Q0FBWSxDQUFBO0lBQ1osK0NBQWEsQ0FBQTtJQUNiLHVDQUFTLENBQUE7SUFDVCx1Q0FBUyxDQUFBO0lBQ1QsZ0RBQWMsQ0FBQTtJQUNkLDhDQUFhLENBQUE7SUFDYiwwQ0FBVyxDQUFBO0lBQ1gsMENBQVcsQ0FBQTtBQUNiLENBQUMsRUFmSSxPQUFPLEtBQVAsT0FBTyxRQWVYO0FBRUQsSUFBSyxlQUlKO0FBSkQsV0FBSyxlQUFlO0lBQ2xCLHFEQUFRLENBQUE7SUFDUixtREFBTyxDQUFBO0lBQ1AscURBQVEsQ0FBQTtBQUNWLENBQUMsRUFKSSxlQUFlLEtBQWYsZUFBZSxRQUluQjtBQUVELE1BQU0sYUFBYSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDN0IsT0FBTyxFQUFFLE9BQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO0lBQzlCLElBQUksRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzNCLEtBQUssRUFBRSxPQUFDLENBQUMsVUFBVSxDQUFDLGlCQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDekMsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDNUIsSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVB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
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ava_1 = __importDefault(require("ava"));
7
+ const client_1 = __importDefault(require("../client"));
8
+ const telem_1 = require("../telem");
9
+ const telem_2 = require("../util/telem");
10
+ const client = new client_1.default({ host: 'localhost', port: 8080 });
11
+ const newChannel = async () => {
12
+ return await client.channel.create({
13
+ name: 'test',
14
+ nodeId: 1,
15
+ rate: telem_1.Rate.Hz(25),
16
+ dataType: telem_1.DataType.Float64,
17
+ });
18
+ };
19
+ (0, ava_1.default)('TypedIterator - basic iteration', async (t) => {
20
+ const ch = await newChannel();
21
+ const writer = await client.data.newWriter([ch.key]);
22
+ const data = (0, telem_2.randomTypedArray)(25, ch.dataType);
23
+ try {
24
+ await writer.write(ch.key, telem_1.TimeSpan.Second, data);
25
+ await writer.write(ch.key, telem_1.TimeSpan.Seconds(2), data);
26
+ await writer.write(ch.key, telem_1.TimeSpan.Seconds(3), data);
27
+ }
28
+ finally {
29
+ await writer.close();
30
+ }
31
+ const iterator = await client.data.newIterator(new telem_1.TimeRange(telem_1.TimeSpan.Zero, telem_1.TimeSpan.Seconds(4)), [ch.key], false);
32
+ try {
33
+ t.true(await iterator.first());
34
+ t.true((await iterator.value())[ch.key].view.length === 25);
35
+ let c = 1;
36
+ while (await iterator.next()) {
37
+ c++;
38
+ t.true((await iterator.value())[ch.key].view.length === 25);
39
+ }
40
+ t.true(c === 3);
41
+ }
42
+ finally {
43
+ await iterator.close();
44
+ }
45
+ });
46
+ (0, ava_1.default)('Client - basic read', async (t) => {
47
+ const ch = await newChannel();
48
+ const writer = await client.data.newWriter([ch.key]);
49
+ const data = (0, telem_2.randomTypedArray)(25, ch.dataType);
50
+ try {
51
+ await writer.write(ch.key, telem_1.TimeSpan.Second, data);
52
+ await writer.write(ch.key, telem_1.TimeSpan.Seconds(2), data);
53
+ await writer.write(ch.key, telem_1.TimeSpan.Seconds(3), data);
54
+ }
55
+ finally {
56
+ await writer.close();
57
+ }
58
+ const resData = await client.data.read(ch.key, telem_1.TimeSpan.Zero, telem_1.TimeSpan.Seconds(4));
59
+ resData.slice(0, 25).forEach((v, i) => t.true(v === data[i]));
60
+ t.true(resData.length === 75);
61
+ });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlcmF0b3Iuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VnbWVudC9pdGVyYXRvci5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQXVCO0FBRXZCLHVEQUErQjtBQUMvQixvQ0FBK0Q7QUFDL0QseUNBQWlEO0FBRWpELE1BQU0sTUFBTSxHQUFHLElBQUksZ0JBQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFFN0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDNUIsT0FBTyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2pDLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLENBQUM7UUFDVCxJQUFJLEVBQUUsWUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakIsUUFBUSxFQUFFLGdCQUFRLENBQUMsT0FBTztLQUMzQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixJQUFBLGFBQUksRUFBQyxpQ0FBaUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDbEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQztJQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxJQUFJLEdBQUcsSUFBQSx3QkFBZ0IsRUFBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLElBQUk7UUFDRixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxnQkFBUSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxNQUFNLE1BQU0sQ0FBQyxLQUFL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
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ import { TimeStamp } from '../telem';
3
+ export declare const SegmentPayloadSchema: z.ZodObject<{
4
+ channelKey: z.ZodString;
5
+ start: z.ZodEffects<z.ZodNumber, TimeStamp, number>;
6
+ data: z.ZodEffects<z.ZodString, Uint8Array, string>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ data: Uint8Array;
9
+ channelKey: string;
10
+ start: TimeStamp;
11
+ }, {
12
+ data: string;
13
+ channelKey: string;
14
+ start: number;
15
+ }>;
16
+ export declare type SegmentPayload = z.infer<typeof SegmentPayloadSchema>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SegmentPayloadSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const telem_1 = require("../telem");
6
+ exports.SegmentPayloadSchema = zod_1.z.object({
7
+ channelKey: zod_1.z.string(),
8
+ start: zod_1.z.number().transform((n) => new telem_1.TimeStamp(n)),
9
+ data: zod_1.z.string().transform((s) => new Uint8Array(atob(s)
10
+ .split('')
11
+ .map((c) => c.charCodeAt(0)))),
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VnbWVudC9wYXlsb2FkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUF3QjtBQUV4QixvQ0FBcUM7QUFFeEIsUUFBQSxvQkFBb0IsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNDLFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQ3RCLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLGlCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQ3hCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixJQUFJLFVBQVUsQ0FDWixJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ0osS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUNULEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMvQixDQUNKO0NBQ0YsQ0FBQyxDQUFDIn0=
@@ -0,0 +1,7 @@
1
+ import { Size } from '../telem';
2
+ import TypedSegment from './typed';
3
+ export default class Splitter {
4
+ threshold: Size;
5
+ constructor(threshold: Size);
6
+ split(segment: TypedSegment): TypedSegment[];
7
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const errors_1 = require("../errors");
7
+ const typed_1 = __importDefault(require("./typed"));
8
+ class Splitter {
9
+ constructor(threshold) {
10
+ this.threshold = threshold;
11
+ }
12
+ split(segment) {
13
+ if (segment.size.smallerThan(this.threshold))
14
+ return [segment];
15
+ if (!segment.channel.density)
16
+ throw new errors_1.ValidationError('Cannot split segment because channel density is undefined');
17
+ const splitPoint = this.threshold.valueOf() -
18
+ (this.threshold.valueOf() % segment.channel.density.valueOf());
19
+ const truncated = new typed_1.default(segment.channel, Object.assign(Object.assign({}, segment.payload), { data: segment.payload.data.slice(0, splitPoint) }));
20
+ const next = new typed_1.default(segment.channel, Object.assign(Object.assign({}, segment.payload), { data: segment.payload.data.slice(splitPoint) }));
21
+ return [truncated, ...this.split(next)];
22
+ }
23
+ }
24
+ exports.default = Splitter;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlZ21lbnQvc3BsaXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzQ0FBNEM7QUFHNUMsb0RBQW1DO0FBRW5DLE1BQXFCLFFBQVE7SUFHM0IsWUFBWSxTQUFlO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBcUI7UUFDekIsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU87WUFDMUIsTUFBTSxJQUFJLHdCQUFlLENBQ3ZCLDJEQUEyRCxDQUM1RCxDQUFDO1FBQ0osTUFBTSxVQUFVLEdBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDeEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDakUsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sa0NBQzdDLE9BQU8sQ0FBQyxPQUFPLEtBQ2xCLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUMvQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxlQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sa0NBQ3hDLE9BQU8sQ0FBQyxPQUFPLEtBQ2xCLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQzVDLENBQUM7UUFDSCxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRjtBQTFCRCwyQkEwQkMifQ==
@@ -0,0 +1,15 @@
1
+ import { ChannelPayload } from '../channel/payload';
2
+ import { Size, TimeRange, TimeSpan, TimeStamp, TypedArray } from '../telem';
3
+ import { SegmentPayload } from './payload';
4
+ export default class TypedSegment {
5
+ payload: SegmentPayload;
6
+ channel: ChannelPayload;
7
+ view: TypedArray;
8
+ constructor(channel: ChannelPayload, payload: SegmentPayload);
9
+ get start(): TimeStamp;
10
+ get span(): TimeSpan;
11
+ get range(): TimeRange;
12
+ get end(): TimeStamp;
13
+ get size(): Size;
14
+ extend(other: TypedSegment): void;
15
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const errors_1 = require("../errors");
4
+ const telem_1 = require("../telem");
5
+ class TypedSegment {
6
+ constructor(channel, payload) {
7
+ this.channel = channel;
8
+ this.payload = payload;
9
+ this.view = new this.channel.dataType.arrayConstructor(this.payload.data.buffer);
10
+ }
11
+ get start() {
12
+ return this.payload.start;
13
+ }
14
+ get span() {
15
+ return this.channel.rate.byteSpan(this.view.byteLength, this.channel.density);
16
+ }
17
+ get range() {
18
+ return this.start.spanRange(this.span);
19
+ }
20
+ get end() {
21
+ return this.range.end;
22
+ }
23
+ get size() {
24
+ return telem_1.Size.Bytes(this.view.byteLength);
25
+ }
26
+ extend(other) {
27
+ if (other.channel.key !== this.channel.key) {
28
+ throw new errors_1.ValidationError(`
29
+ Cannot extend segment because channel keys mismatch.
30
+ Segment Channel Key: ${this.channel.key}
31
+ Other Segment Channel Key: ${other.channel.key}
32
+ `);
33
+ }
34
+ if (!this.end.equals(other.start)) {
35
+ throw new Error(`
36
+ Cannot extend segment because segments are not contiguous.
37
+ Segment End: ${this.end}
38
+ Other Segment Start: ${other.start}
39
+ `);
40
+ }
41
+ const newData = new Uint8Array(this.view.byteLength + other.view.byteLength);
42
+ newData.set(this.payload.data, 0);
43
+ newData.set(other.payload.data, this.view.byteLength);
44
+ this.payload.data = newData;
45
+ this.view = new this.channel.dataType.arrayConstructor(this.payload.data.buffer);
46
+ }
47
+ }
48
+ exports.default = TypedSegment;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlZ21lbnQvdHlwZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxzQ0FBNEM7QUFDNUMsb0NBT2tCO0FBSWxCLE1BQXFCLFlBQVk7SUFLL0IsWUFBWSxPQUF1QixFQUFFLE9BQXVCO1FBQzFELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUN6QixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFrQixDQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLFlBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQW1CO1FBQ3hCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDMUMsTUFBTSxJQUFJLHdCQUFlLENBQUM7OytCQUVELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRztxQ0FDVixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUc7T0FDL0MsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUM7O3FCQUVELElBQUksQ0FBQyxHQUFHOzZCQUNBLEtBQUssQ0FBQyxLQUFLO09BQ2pDLENBQUMsQ0FBQztTQUNKO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUM3QyxDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUN6QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBN0RELCtCQTZEQyJ9
@@ -0,0 +1,22 @@
1
+ import { DataType, TimeStamp, TypedArray } from '../telem';
2
+ import TypedSegment from './typed';
3
+ export declare class ScalarTypeValidator {
4
+ validate(array: TypedArray, dataType: DataType): void;
5
+ }
6
+ export declare type ContiguityValidatorProps = {
7
+ allowNoHighWaterMark: boolean;
8
+ allowOverlap: boolean;
9
+ allowGaps: boolean;
10
+ };
11
+ export declare class ContiguityValidator {
12
+ highWaterMarks: Map<string, TimeStamp>;
13
+ allowNoHighWaterMark: boolean;
14
+ allowOverlap: boolean;
15
+ allowGaps: boolean;
16
+ constructor(props: ContiguityValidatorProps);
17
+ validate(segment: TypedSegment): void;
18
+ private enforceNoOverlap;
19
+ private enforceNoGaps;
20
+ private getHighWaterMark;
21
+ private updateHighWaterMark;
22
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContiguityValidator = exports.ScalarTypeValidator = void 0;
4
+ const errors_1 = require("../errors");
5
+ class ScalarTypeValidator {
6
+ validate(array, dataType) {
7
+ if (!dataType.checkArray(array)) {
8
+ throw new errors_1.ValidationError({
9
+ field: 'data',
10
+ message: `Data type mismatch. Expected ${dataType} but got ${array.constructor.name}`,
11
+ });
12
+ }
13
+ }
14
+ }
15
+ exports.ScalarTypeValidator = ScalarTypeValidator;
16
+ class ContiguityValidator {
17
+ constructor(props) {
18
+ this.allowNoHighWaterMark = false;
19
+ this.allowOverlap = false;
20
+ this.allowGaps = false;
21
+ this.highWaterMarks = new Map();
22
+ this.allowNoHighWaterMark = props.allowNoHighWaterMark;
23
+ this.allowOverlap = props.allowOverlap;
24
+ this.allowGaps = props.allowGaps;
25
+ }
26
+ validate(segment) {
27
+ if (!segment.channel.key) {
28
+ throw new errors_1.UnexpectedError('Channel key is not set');
29
+ }
30
+ const hwm = this.getHighWaterMark(segment.channel.key);
31
+ if (hwm) {
32
+ this.enforceNoOverlap(hwm, segment);
33
+ this.enforceNoGaps(hwm, segment);
34
+ }
35
+ this.updateHighWaterMark(segment);
36
+ }
37
+ enforceNoOverlap(hwm, seg) {
38
+ if (!this.allowOverlap && seg.start.before(hwm)) {
39
+ throw new errors_1.ContiguityError(`Segment overlaps with previous segment. Previous segment ends at ${hwm.toString()}
40
+ Segment starts at ${seg.start.toString()}`);
41
+ }
42
+ }
43
+ enforceNoGaps(hwm, seg) {
44
+ if (!this.allowGaps && !seg.start.equals(hwm)) {
45
+ throw new errors_1.ContiguityError(`Segment is not contiguous with previous segment. Previous segment ends at ${hwm.toString()}
46
+ Segment starts at ${seg.start.toString()}`);
47
+ }
48
+ }
49
+ getHighWaterMark(key) {
50
+ const hwm = this.highWaterMarks.get(key);
51
+ if (!hwm && !this.allowNoHighWaterMark) {
52
+ throw new errors_1.UnexpectedError('No high water mark found for channel key ' + key);
53
+ }
54
+ return hwm;
55
+ }
56
+ updateHighWaterMark(seg) {
57
+ if (!seg.channel.key) {
58
+ throw new errors_1.UnexpectedError('Channel key is not set');
59
+ }
60
+ this.highWaterMarks.set(seg.channel.key, seg.end);
61
+ }
62
+ }
63
+ exports.ContiguityValidator = ContiguityValidator;
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZWdtZW50L3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzQ0FBOEU7QUFLOUUsTUFBYSxtQkFBbUI7SUFDOUIsUUFBUSxDQUFDLEtBQWlCLEVBQUUsUUFBa0I7UUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLHdCQUFlLENBQUM7Z0JBQ3hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLE9BQU8sRUFBRSxnQ0FBZ0MsUUFBUSxZQUFZLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFO2FBQ3RGLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztDQUNGO0FBVEQsa0RBU0M7QUFRRCxNQUFhLG1CQUFtQjtJQU05QixZQUFZLEtBQStCO1FBSjNDLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUM3QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBR2hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixDQUFDO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUFxQjtRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDeEIsTUFBTSxJQUFJLHdCQUFlLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNyRDtRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELElBQUksR0FBRyxFQUFFO1lBQ1AsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsR0FBYyxFQUFFLEdBQWlCO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9DLE1BQU0sSUFBSSx3QkFBZSxDQUN2QixvRUFBb0UsR0FBRyxDQUFDLFFBQVEsRUFBRTs0QkFDOUQsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUMzQyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQWMsRUFBRSxHQUFpQjtRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLE1BQU0sSUFBSSx3QkFBZSxDQUN2Qiw2RUFBNkUsR0FBRyxDQUFDLFFBQVEsRUFBRTs0QkFDdkUsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUMzQyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsR0FBVztRQUNsQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ3RDLE1BQU0sSUFBSSx3QkFBZSxDQUN2QiwyQ0FBMkMsR0FBRyxHQUFHLENBQ2xELENBQUM7U0FDSDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEdBQWlCO1FBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNwQixNQUFNLElBQUksd0JBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQTNERCxrREEyREMifQ==
@@ -0,0 +1,98 @@
1
+ import { StreamClient } from '@synnaxlabs/freighter';
2
+ import ChannelRegistry from '../channel/registry';
3
+ import { TypedArray, UnparsedTimeStamp } from '../telem';
4
+ import { SegmentPayload } from './payload';
5
+ /**
6
+ * CoreWriter is used to write telemetry to a set of channels in time-order. It
7
+ * should not be instantiated directly, but rather through a {@link SegmentClient}.
8
+ *
9
+ * Using a writer is ideal when writing large volumes of data (such as recording
10
+ * telemetry from a sensor), but it is relatively complex and challenging to use.
11
+ * If you're looking to write a contiguous block of telemetry, see the {@link SegmentClient}
12
+ * write() method.
13
+ */
14
+ export declare class CoreWriter {
15
+ private static ENDPOINT;
16
+ private client;
17
+ private stream;
18
+ private keys;
19
+ constructor(client: StreamClient);
20
+ /**
21
+ * Opens the writer, acquiring an exclusive lock on the given channels for
22
+ * the duration of the writer's lifetime. open must be called before any other
23
+ * writer methods.
24
+ *
25
+ * @param keys - A list of keys representing the channels the writer will write
26
+ * to.
27
+ */
28
+ open(keys: string[]): Promise<void>;
29
+ /**
30
+ * Validates and writes the given segments to the database. The provided segments
31
+ * must:
32
+ *
33
+ * 1. Be in time order (on a per-channel basis)
34
+ * 2. Have channel keys in the set of keys this writer was opened with.
35
+ * 3. Have non-zero length data with the correct data type.
36
+ *
37
+ * @param segments - A list of segments to write to the database.
38
+ * @returns false if the writer has accumulated an error. In this case,
39
+ * the caller should stop executing requests and close the writer.
40
+ */
41
+ write(segments: SegmentPayload[]): Promise<boolean>;
42
+ /**
43
+ * Closes the writer, raising any accumulated error encountered during operation.
44
+ * A writer MUST be closed after use, and this method should probably be placed
45
+ * in a 'finally' block. If the writer is not closed, the database will not release
46
+ * the exclusive lock on the channels, preventing any other callers from
47
+ * writing to them. It also might leak resources and threads.
48
+ */
49
+ close(): Promise<void>;
50
+ private checkKeys;
51
+ }
52
+ /**
53
+ * TypedWriter is used to write telemetry to a set of channels in time-order. It
54
+ * should not be instantiated directly, but rather through a {@link SegmentClient}.
55
+ *
56
+ * Using a writer is ideal when writing large volumes of data (such as recording
57
+ * telemetry from a sensor), but it is relatively complex and challenging to use.
58
+ * If you're looking to write a contiguous block of telemetry, see the {@link SegmentClient}
59
+ * write() method.
60
+ */
61
+ export declare class TypedWriter {
62
+ private core;
63
+ private splitter;
64
+ private channels;
65
+ private scalarTypeValidator;
66
+ private contiguityValidator;
67
+ constructor(client: StreamClient, channels: ChannelRegistry);
68
+ /**
69
+ * Opens the writer, acquiring an exclusive lock on the given channels for
70
+ * the duration of the writer's lifetime. open must be called before any other
71
+ * writer methods.
72
+ *
73
+ * @param keys - A list of keys representing the channels the writer will write
74
+ * to.
75
+ */
76
+ open(keys: string[]): Promise<void>;
77
+ /**
78
+ * Writes the given telemetry to the database.
79
+ *
80
+ * @param to - They key of the channel to write to. This must be in the set of
81
+ * keys this writer was opened with.
82
+ * @param start - The start time of the telemetry. This must be equal to
83
+ * the end of the previous segment written to the channel (unless it's the first
84
+ * write to that channel).
85
+ * @param data - The telemetry to write. This must be a valid type for the channel.
86
+ * @returns false if the writer has accumulated an error. In this case,
87
+ * the caller should stop executing requests and close the writer.
88
+ */
89
+ write(to: string, start: UnparsedTimeStamp, data: TypedArray): Promise<boolean>;
90
+ /**
91
+ * Closes the writer, raising any accumulated error encountered during operation.
92
+ * A writer MUST be closed after use, and this method should probably be placed
93
+ * in a 'finally' block. If the writer is not closed, the database will not release
94
+ * the exclusive lock on the channels, preventing any other callers from
95
+ * writing to them. It also might leak resources and threads.
96
+ */
97
+ close(): Promise<void>;
98
+ }