@v5x/serial 0.5.6 → 0.5.7

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.
@@ -0,0 +1,341 @@
1
+ // src/VexCRC.ts
2
+ var POLYNOMIAL_CRC32 = 79764919;
3
+ var POLYNOMIAL_CRC16 = 4129;
4
+ function genTable16() {
5
+ const table = new Uint16Array(256);
6
+ for (let i = 0;i < 256; i++) {
7
+ let acc = i << 8;
8
+ for (let j = 0;j < 8; j++) {
9
+ acc = (acc & 32768) !== 0 ? acc << 1 ^ POLYNOMIAL_CRC16 : acc << 1;
10
+ }
11
+ table[i] = acc & 65535;
12
+ }
13
+ return table;
14
+ }
15
+ function genTable32() {
16
+ const table = new Uint32Array(256);
17
+ for (let i = 0;i < 256; i++) {
18
+ let acc = i << 24;
19
+ for (let j = 0;j < 8; j++) {
20
+ acc = (acc & 2147483648) !== 0 ? acc << 1 ^ POLYNOMIAL_CRC32 : acc << 1;
21
+ }
22
+ table[i] = acc;
23
+ }
24
+ return table;
25
+ }
26
+ var CRC16_TABLE = genTable16();
27
+ var CRC32_TABLE = genTable32();
28
+
29
+ class CrcGenerator {
30
+ crc32Table = CRC32_TABLE;
31
+ static POLYNOMIAL_CRC32 = POLYNOMIAL_CRC32;
32
+ static POLYNOMIAL_CRC16 = POLYNOMIAL_CRC16;
33
+ crc16(buf, initValue) {
34
+ let acc = initValue;
35
+ for (let j = 0;j < buf.length; j++) {
36
+ acc = (acc << 8 ^ CRC16_TABLE[(acc >>> 8 ^ buf[j]) & 255]) >>> 0;
37
+ }
38
+ return acc & 65535;
39
+ }
40
+ crc32(buf, initValue) {
41
+ let acc = initValue;
42
+ for (let j = 0;j < buf.length; j++) {
43
+ acc = (acc << 8 ^ CRC32_TABLE[(acc >>> 24 ^ buf[j]) & 255]) >>> 0;
44
+ }
45
+ return acc >>> 0;
46
+ }
47
+ }
48
+ // src/VexFirmwareVersion.ts
49
+ class VexFirmwareVersion {
50
+ major;
51
+ minor;
52
+ build;
53
+ beta;
54
+ constructor(major, minor, build, beta) {
55
+ this.major = major;
56
+ this.minor = minor;
57
+ this.build = build;
58
+ this.beta = beta;
59
+ }
60
+ static fromString(version) {
61
+ const parts = version.toLowerCase().replace(/b/g, "").split(".").map((x) => parseInt(x, 10));
62
+ while (parts.length < 4)
63
+ parts.push(0);
64
+ return new VexFirmwareVersion(parts[0], parts[1], parts[2], parts[3]);
65
+ }
66
+ static fromUint8Array(data, offset = 0, reverse = false) {
67
+ return new VexFirmwareVersion(data[offset + (reverse ? 3 : 0)], data[offset + (reverse ? 2 : 1)], data[offset + (reverse ? 1 : 2)], data[offset + (reverse ? 0 : 3)]);
68
+ }
69
+ static allZero() {
70
+ return new VexFirmwareVersion(0, 0, 0, 0);
71
+ }
72
+ static fromCatalogString(version) {
73
+ return VexFirmwareVersion.fromString(version.replace(/_/g, "."));
74
+ }
75
+ isBeta() {
76
+ return this.beta !== 0;
77
+ }
78
+ toUint8Array(reverse = false) {
79
+ const data = new Uint8Array(4);
80
+ data[reverse ? 3 : 0] = this.major;
81
+ data[reverse ? 2 : 1] = this.minor;
82
+ data[reverse ? 1 : 2] = this.build;
83
+ data[reverse ? 0 : 3] = this.beta;
84
+ return data;
85
+ }
86
+ toUserString() {
87
+ return `${this.major}.${this.minor}.${this.build}`;
88
+ }
89
+ toInternalString() {
90
+ return `${this.toUserString()}.b${this.beta}`;
91
+ }
92
+ compare(that) {
93
+ for (const [a, b] of [
94
+ [this.major, that.major],
95
+ [this.minor, that.minor],
96
+ [this.build, that.build],
97
+ [this.beta, that.beta]
98
+ ]) {
99
+ const delta = a - b;
100
+ if (delta !== 0)
101
+ return delta;
102
+ }
103
+ return 0;
104
+ }
105
+ }
106
+ // src/VexPacketBase.ts
107
+ var MATCH_STATUS_ALT_ACK = 167;
108
+
109
+ class Packet {
110
+ data;
111
+ static ENCODER;
112
+ constructor(rawData) {
113
+ this.data = rawData instanceof ArrayBuffer ? new Uint8Array(rawData) : rawData;
114
+ }
115
+ }
116
+
117
+ class DeviceBoundPacket extends Packet {
118
+ static COMMAND_ID;
119
+ static COMMAND_EXTENDED_ID;
120
+ get commandId() {
121
+ return this.constructor.COMMAND_ID;
122
+ }
123
+ get commandExtendedId() {
124
+ return this.constructor.COMMAND_EXTENDED_ID;
125
+ }
126
+ constructor(payload) {
127
+ const { COMMAND_ID: cmd, COMMAND_EXTENDED_ID: ext } = new.target;
128
+ const encoder = Packet.ENCODER;
129
+ super(ext === undefined ? payload === undefined ? encoder.cdcCommand(cmd) : encoder.cdcCommandWithData(cmd, payload) : payload === undefined ? encoder.cdc2Command(cmd, ext) : encoder.cdc2CommandWithData(cmd, ext, payload));
130
+ }
131
+ }
132
+
133
+ class HostBoundPacket extends Packet {
134
+ static COMMAND_ID;
135
+ static COMMAND_EXTENDED_ID;
136
+ ack;
137
+ payloadSize;
138
+ ackIndex;
139
+ constructor(data) {
140
+ super(data);
141
+ this.payloadSize = Packet.ENCODER.getPayloadSize(this.data);
142
+ this.ackIndex = Packet.ENCODER.getHostHeaderLength(this.data) + 1;
143
+ this.ack = this.data[this.ackIndex];
144
+ }
145
+ static isValidPacket(data, n) {
146
+ const ack = data[n + 1];
147
+ return ack === 118 /* CDC2_ACK */ || ack === MATCH_STATUS_ALT_ACK;
148
+ }
149
+ }
150
+ // src/VexPacketEncoder.ts
151
+ var textEncoder = new TextEncoder;
152
+ var HEADER_TO_DEVICE = Uint8Array.of(201, 54, 184, 71);
153
+ function encodeFixedText(value, field, maxBytes) {
154
+ const encoded = textEncoder.encode(value);
155
+ if (encoded.byteLength > maxBytes) {
156
+ throw new RangeError(`${field} must be at most ${maxBytes} UTF-8 bytes`);
157
+ }
158
+ return encoded;
159
+ }
160
+
161
+ class PacketEncoder {
162
+ static HEADERS_LENGTH = 4;
163
+ static HEADER_TO_DEVICE = [201, 54, 184, 71];
164
+ static HEADER_TO_HOST = [170, 85];
165
+ static J2000_EPOCH = 946684800;
166
+ vexVersion = 0;
167
+ crcgen = new CrcGenerator;
168
+ allPacketsTable = new Map;
169
+ static getInstance() {
170
+ Packet.ENCODER ??= new PacketEncoder;
171
+ return Packet.ENCODER;
172
+ }
173
+ constructor() {}
174
+ registerPacketTypes(types) {
175
+ for (const type of types) {
176
+ let byExtendedId = this.allPacketsTable.get(type.COMMAND_ID);
177
+ if (byExtendedId === undefined) {
178
+ byExtendedId = new Map;
179
+ this.allPacketsTable.set(type.COMMAND_ID, byExtendedId);
180
+ }
181
+ byExtendedId.set(type.COMMAND_EXTENDED_ID, type);
182
+ }
183
+ }
184
+ getPacketType(commandId, commandExtendedId) {
185
+ if (commandId === undefined)
186
+ return;
187
+ return this.allPacketsTable.get(commandId)?.get(commandExtendedId);
188
+ }
189
+ createHeader(buf) {
190
+ if (buf === undefined || buf.byteLength < PacketEncoder.HEADERS_LENGTH) {
191
+ buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH);
192
+ }
193
+ const h = new Uint8Array(buf);
194
+ h.set(HEADER_TO_DEVICE);
195
+ return h;
196
+ }
197
+ cdcCommand(cmd) {
198
+ const h = new Uint8Array(5);
199
+ h.set(HEADER_TO_DEVICE);
200
+ h[4] = cmd;
201
+ return h;
202
+ }
203
+ cdcCommandWithData(cmd, data) {
204
+ const h = new Uint8Array(6 + data.length);
205
+ h.set(HEADER_TO_DEVICE);
206
+ h[4] = cmd;
207
+ h[5] = data.length;
208
+ h.set(data, 6);
209
+ return h;
210
+ }
211
+ cdc2Command(cmd, ext) {
212
+ const h = new Uint8Array(9);
213
+ h.set(HEADER_TO_DEVICE);
214
+ h[4] = cmd;
215
+ h[5] = ext;
216
+ h[6] = 0;
217
+ this.appendCrc16(h);
218
+ return h;
219
+ }
220
+ cdc2CommandBufferLength(data) {
221
+ return PacketEncoder.HEADERS_LENGTH + data.length + 5 + (data.length > 127 ? 1 : 0);
222
+ }
223
+ cdc2CommandWithData(cmd, ext, data) {
224
+ const h = new Uint8Array(this.cdc2CommandBufferLength(data));
225
+ h.set(HEADER_TO_DEVICE);
226
+ h[4] = cmd;
227
+ h[5] = ext;
228
+ if (data.length < 128) {
229
+ h[6] = data.length;
230
+ h.set(data, 7);
231
+ } else {
232
+ h[6] = data.length >>> 8 | 128;
233
+ h[7] = data.length & 255;
234
+ h.set(data, 8);
235
+ }
236
+ this.appendCrc16(h);
237
+ return h;
238
+ }
239
+ appendCrc16(h) {
240
+ const crc = this.crcgen.crc16(h.subarray(0, h.length - 2), 0);
241
+ h[h.length - 2] = crc >>> 8;
242
+ h[h.length - 1] = crc & 255;
243
+ }
244
+ validateHeader(data) {
245
+ return data[0] === PacketEncoder.HEADER_TO_HOST[0] && data[1] === PacketEncoder.HEADER_TO_HOST[1];
246
+ }
247
+ validateMessageCdc(data) {
248
+ const crc = (data[data.byteLength - 2] << 8) + data[data.byteLength - 1];
249
+ return this.crcgen.crc16(data.subarray(0, data.byteLength - 2), 0) === crc;
250
+ }
251
+ getPayloadSize(data) {
252
+ const a = data[3];
253
+ return (a & 128) === 0 ? a : ((a & 127) << 8) + data[4];
254
+ }
255
+ getHostHeaderLength(data) {
256
+ return (data[3] & 128) === 0 ? 4 : 5;
257
+ }
258
+ }
259
+ // src/VexPacketView.ts
260
+ var textDecoder = new TextDecoder("UTF-8");
261
+
262
+ class PacketView extends DataView {
263
+ position = 0;
264
+ littleEndianDefault = true;
265
+ constructor(buffer, offset = 0, length = buffer.byteLength - offset) {
266
+ super(buffer, offset, length);
267
+ }
268
+ static fromPacket(packet) {
269
+ const view = new PacketView(packet.data.buffer, packet.data.byteOffset, packet.data.byteLength);
270
+ view.position = packet.ackIndex + 1;
271
+ return view;
272
+ }
273
+ nextInt8() {
274
+ return this.getInt8(this.position++);
275
+ }
276
+ nextUint8() {
277
+ return this.getUint8(this.position++);
278
+ }
279
+ nextInt16(littleEndian = this.littleEndianDefault) {
280
+ const result = this.getInt16(this.position, littleEndian);
281
+ this.position += 2;
282
+ return result;
283
+ }
284
+ nextUint16(littleEndian = this.littleEndianDefault) {
285
+ const result = this.getUint16(this.position, littleEndian);
286
+ this.position += 2;
287
+ return result;
288
+ }
289
+ nextInt32(littleEndian = this.littleEndianDefault) {
290
+ const result = this.getInt32(this.position, littleEndian);
291
+ this.position += 4;
292
+ return result;
293
+ }
294
+ nextUint32(littleEndian = this.littleEndianDefault) {
295
+ const result = this.getUint32(this.position, littleEndian);
296
+ this.position += 4;
297
+ return result;
298
+ }
299
+ nextString(length) {
300
+ const result = textDecoder.decode(new Uint8Array(this.buffer, this.byteOffset + this.position, length));
301
+ this.position += length;
302
+ return result;
303
+ }
304
+ nextNTBS(length) {
305
+ const start = this.position;
306
+ const result = this.nextVarNTBS(length);
307
+ this.position = start + length;
308
+ return result;
309
+ }
310
+ nextVarNTBS(length) {
311
+ const start = this.position;
312
+ let byteLength = 0;
313
+ for (let i = 0;i < length; i++) {
314
+ if (this.byteLength <= this.position)
315
+ break;
316
+ const g = this.nextUint8();
317
+ if (g === 0)
318
+ break;
319
+ byteLength++;
320
+ }
321
+ return textDecoder.decode(new Uint8Array(this.buffer, this.byteOffset + start, byteLength));
322
+ }
323
+ nextVersion(reverse = false) {
324
+ const result = VexFirmwareVersion.fromUint8Array(new Uint8Array(this.buffer, this.byteOffset, this.byteLength), this.position, reverse);
325
+ this.position += 4;
326
+ return result;
327
+ }
328
+ }
329
+ export {
330
+ encodeFixedText,
331
+ VexFirmwareVersion,
332
+ PacketView,
333
+ PacketEncoder,
334
+ Packet,
335
+ HostBoundPacket,
336
+ DeviceBoundPacket,
337
+ CrcGenerator
338
+ };
339
+
340
+ //# debugId=19970C753A01B4D364756E2164756E21
341
+ //# sourceMappingURL=packet-core.js.map
@@ -0,0 +1,14 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/VexCRC.ts", "../src/VexFirmwareVersion.ts", "../src/VexPacketBase.ts", "../src/VexPacketEncoder.ts", "../src/VexPacketView.ts"],
4
+ "sourcesContent": [
5
+ "const POLYNOMIAL_CRC32 = 0x04c11db7;\nconst POLYNOMIAL_CRC16 = 0x1021;\n\nfunction genTable16(): Uint16Array {\n const table = new Uint16Array(256);\n for (let i = 0; i < 256; i++) {\n let acc = i << 8;\n for (let j = 0; j < 8; j++) {\n acc = (acc & 0x8000) !== 0 ? (acc << 1) ^ POLYNOMIAL_CRC16 : acc << 1;\n }\n table[i] = acc & 0xffff;\n }\n return table;\n}\n\nfunction genTable32(): Uint32Array {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let acc = i << 24;\n for (let j = 0; j < 8; j++) {\n acc = (acc & 0x80000000) !== 0 ? (acc << 1) ^ POLYNOMIAL_CRC32 : acc << 1;\n }\n table[i] = acc;\n }\n return table;\n}\n\nconst CRC16_TABLE = genTable16();\nconst CRC32_TABLE = genTable32();\n\nexport class CrcGenerator {\n crc32Table: Uint32Array = CRC32_TABLE;\n static POLYNOMIAL_CRC32 = POLYNOMIAL_CRC32;\n static POLYNOMIAL_CRC16 = POLYNOMIAL_CRC16;\n\n crc16(buf: Uint8Array, initValue: number): number {\n let acc = initValue;\n for (let j = 0; j < buf.length; j++) {\n acc = ((acc << 8) ^ CRC16_TABLE[((acc >>> 8) ^ buf[j]!) & 0xff]!) >>> 0;\n }\n return acc & 0xffff;\n }\n\n crc32(buf: Uint8Array, initValue: number): number {\n let acc = initValue;\n for (let j = 0; j < buf.length; j++) {\n acc = ((acc << 8) ^ CRC32_TABLE[((acc >>> 24) ^ buf[j]!) & 0xff]!) >>> 0;\n }\n return acc >>> 0;\n }\n}\n",
6
+ "export class VexFirmwareVersion {\n constructor(\n readonly major: number,\n readonly minor: number,\n readonly build: number,\n readonly beta: number,\n ) {}\n\n static fromString(version: string): VexFirmwareVersion {\n const parts = version\n .toLowerCase()\n .replace(/b/g, \"\")\n .split(\".\")\n .map((x) => parseInt(x, 10));\n while (parts.length < 4) parts.push(0);\n return new VexFirmwareVersion(parts[0]!, parts[1]!, parts[2]!, parts[3]!);\n }\n\n static fromUint8Array(\n data: Uint8Array,\n offset: number = 0,\n reverse: boolean = false,\n ): VexFirmwareVersion {\n return new VexFirmwareVersion(\n data[offset + (reverse ? 3 : 0)]!,\n data[offset + (reverse ? 2 : 1)]!,\n data[offset + (reverse ? 1 : 2)]!,\n data[offset + (reverse ? 0 : 3)]!,\n );\n }\n\n static allZero(): VexFirmwareVersion {\n return new VexFirmwareVersion(0, 0, 0, 0);\n }\n\n static fromCatalogString(version: string): VexFirmwareVersion {\n return VexFirmwareVersion.fromString(version.replace(/_/g, \".\"));\n }\n\n isBeta(): boolean {\n return this.beta !== 0;\n }\n\n toUint8Array(reverse: boolean = false): Uint8Array {\n const data = new Uint8Array(4);\n data[reverse ? 3 : 0] = this.major;\n data[reverse ? 2 : 1] = this.minor;\n data[reverse ? 1 : 2] = this.build;\n data[reverse ? 0 : 3] = this.beta;\n return data;\n }\n\n toUserString(): string {\n return `${this.major}.${this.minor}.${this.build}`;\n }\n\n toInternalString(): string {\n return `${this.toUserString()}.b${this.beta}`;\n }\n\n compare(that: VexFirmwareVersion): number {\n for (const [a, b] of [\n [this.major, that.major],\n [this.minor, that.minor],\n [this.build, that.build],\n [this.beta, that.beta],\n ] as const) {\n const delta = a - b;\n if (delta !== 0) return delta;\n }\n return 0;\n }\n}\n",
7
+ "import { AckType, type DataArray } from \"./Vex.js\";\nimport type { PacketEncoder } from \"./VexPacketEncoder.js\";\n\n// The match-status reply acknowledges with 167 instead of CDC2_ACK.\nconst MATCH_STATUS_ALT_ACK = 167;\n\nexport abstract class Packet {\n /** Raw bytes sent to or received from the device. */\n data: Uint8Array;\n\n static ENCODER: PacketEncoder;\n\n constructor(rawData: DataArray) {\n this.data =\n rawData instanceof ArrayBuffer ? new Uint8Array(rawData) : rawData;\n }\n}\n\nexport class DeviceBoundPacket extends Packet {\n static COMMAND_ID: number;\n static COMMAND_EXTENDED_ID: number | undefined;\n\n get commandId(): number {\n return (this.constructor as typeof DeviceBoundPacket).COMMAND_ID;\n }\n\n get commandExtendedId(): number | undefined {\n return (this.constructor as typeof DeviceBoundPacket).COMMAND_EXTENDED_ID;\n }\n\n constructor(payload?: Uint8Array) {\n const { COMMAND_ID: cmd, COMMAND_EXTENDED_ID: ext } =\n new.target as typeof DeviceBoundPacket;\n const encoder = Packet.ENCODER;\n super(\n ext === undefined\n ? payload === undefined\n ? encoder.cdcCommand(cmd)\n : encoder.cdcCommandWithData(cmd, payload)\n : payload === undefined\n ? encoder.cdc2Command(cmd, ext)\n : encoder.cdc2CommandWithData(cmd, ext, payload),\n );\n }\n}\n\nexport class HostBoundPacket extends Packet {\n static COMMAND_ID: number;\n static COMMAND_EXTENDED_ID: number | undefined;\n\n ack: AckType;\n payloadSize: number;\n ackIndex: number;\n\n constructor(data: DataArray) {\n super(data);\n this.payloadSize = Packet.ENCODER.getPayloadSize(this.data);\n this.ackIndex = Packet.ENCODER.getHostHeaderLength(this.data) + 1;\n this.ack = this.data[this.ackIndex]!;\n }\n\n static isValidPacket(data: Uint8Array, n: number): boolean {\n const ack = data[n + 1];\n return ack === AckType.CDC2_ACK || ack === MATCH_STATUS_ALT_ACK;\n }\n}\n",
8
+ "import { CrcGenerator } from \"./VexCRC.js\";\nimport { HostBoundPacket, Packet } from \"./VexPacketBase.js\";\n\nconst textEncoder = new TextEncoder();\nconst HEADER_TO_DEVICE = Uint8Array.of(201, 54, 184, 71);\n\nexport function encodeFixedText(\n value: string,\n field: string,\n maxBytes: number,\n): Uint8Array {\n const encoded = textEncoder.encode(value);\n if (encoded.byteLength > maxBytes) {\n throw new RangeError(`${field} must be at most ${maxBytes} UTF-8 bytes`);\n }\n return encoded;\n}\n\nexport class PacketEncoder {\n static HEADERS_LENGTH = 4;\n static HEADER_TO_DEVICE = [201, 54, 184, 71];\n static HEADER_TO_HOST = [170, 85];\n\n static J2000_EPOCH = 946684800;\n\n vexVersion = 0;\n\n crcgen = new CrcGenerator();\n allPacketsTable = new Map<\n number,\n Map<number | undefined, typeof HostBoundPacket>\n >();\n\n static getInstance(): PacketEncoder {\n Packet.ENCODER ??= new PacketEncoder();\n return Packet.ENCODER;\n }\n\n private constructor() {}\n\n /** Register reply packet classes without retaining an entire module object. */\n registerPacketTypes(types: Iterable<typeof HostBoundPacket>): void {\n for (const type of types) {\n let byExtendedId = this.allPacketsTable.get(type.COMMAND_ID);\n if (byExtendedId === undefined) {\n byExtendedId = new Map();\n this.allPacketsTable.set(type.COMMAND_ID, byExtendedId);\n }\n byExtendedId.set(type.COMMAND_EXTENDED_ID, type);\n }\n }\n\n /** Look up the reply class registered for a command ID pair. */\n getPacketType(\n commandId: number | undefined,\n commandExtendedId: number | undefined,\n ): typeof HostBoundPacket | undefined {\n if (commandId === undefined) return undefined;\n return this.allPacketsTable.get(commandId)?.get(commandExtendedId);\n }\n\n /** Create the vex CDC header. */\n createHeader(buf: ArrayBuffer | undefined): Uint8Array {\n if (buf === undefined || buf.byteLength < PacketEncoder.HEADERS_LENGTH) {\n buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH);\n }\n const h = new Uint8Array(buf);\n h.set(HEADER_TO_DEVICE);\n return h;\n }\n\n /** Create a simple CDC message. */\n cdcCommand(cmd: number): Uint8Array {\n const h = new Uint8Array(5);\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n return h;\n }\n\n /** Create a simple CDC message carrying data. */\n cdcCommandWithData(cmd: number, data: Uint8Array): Uint8Array {\n const h = new Uint8Array(6 + data.length);\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n h[5] = data.length;\n h.set(data, 6);\n return h;\n }\n\n /** Create a CDC2 (extended) message with no payload. */\n cdc2Command(cmd: number, ext: number): Uint8Array {\n const h = new Uint8Array(9);\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n h[5] = ext;\n h[6] = 0;\n this.appendCrc16(h);\n return h;\n }\n\n /**\n * Buffer length for a CDC2 command: header + command byte + function\n * byte + length byte (two bytes when payload > 127) + payload + CRC16.\n */\n cdc2CommandBufferLength(data: Uint8Array): number {\n return (\n PacketEncoder.HEADERS_LENGTH +\n data.length +\n 5 +\n (data.length > 127 ? 1 : 0)\n );\n }\n\n /** Create a CDC2 (extended) message carrying a payload. */\n cdc2CommandWithData(cmd: number, ext: number, data: Uint8Array): Uint8Array {\n const h = new Uint8Array(this.cdc2CommandBufferLength(data));\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n h[5] = ext;\n if (data.length < 128) {\n h[6] = data.length;\n h.set(data, 7);\n } else {\n h[6] = (data.length >>> 8) | 0x80;\n h[7] = data.length & 0xff;\n h.set(data, 8);\n }\n this.appendCrc16(h);\n return h;\n }\n\n private appendCrc16(h: Uint8Array): void {\n const crc = this.crcgen.crc16(h.subarray(0, h.length - 2), 0);\n h[h.length - 2] = crc >>> 8;\n h[h.length - 1] = crc & 0xff;\n }\n\n validateHeader(data: Uint8Array): boolean {\n return (\n data[0] === PacketEncoder.HEADER_TO_HOST[0] &&\n data[1] === PacketEncoder.HEADER_TO_HOST[1]\n );\n }\n\n validateMessageCdc(data: Uint8Array): boolean {\n const crc = (data[data.byteLength - 2]! << 8) + data[data.byteLength - 1]!;\n return this.crcgen.crc16(data.subarray(0, data.byteLength - 2), 0) === crc;\n }\n\n getPayloadSize(data: Uint8Array): number {\n const a = data[3]!;\n return (a & 0x80) === 0 ? a : ((a & 0x7f) << 8) + data[4]!;\n }\n\n getHostHeaderLength(data: Uint8Array): number {\n return (data[3]! & 0x80) === 0 ? 4 : 5;\n }\n}\n",
9
+ "import { VexFirmwareVersion } from \"./VexFirmwareVersion.js\";\nimport { type HostBoundPacket } from \"./VexPacket.js\";\n\nconst textDecoder = new TextDecoder(\"UTF-8\");\n\nexport class PacketView extends DataView<ArrayBuffer> {\n position = 0;\n littleEndianDefault = true;\n\n constructor(\n buffer: ArrayBuffer,\n offset: number = 0,\n length: number = buffer.byteLength - offset,\n ) {\n super(buffer, offset, length);\n }\n\n static fromPacket(packet: HostBoundPacket): PacketView {\n const view = new PacketView(\n packet.data.buffer as ArrayBuffer,\n packet.data.byteOffset,\n packet.data.byteLength,\n );\n view.position = packet.ackIndex + 1;\n return view;\n }\n\n nextInt8(): number {\n return this.getInt8(this.position++);\n }\n\n nextUint8(): number {\n return this.getUint8(this.position++);\n }\n\n nextInt16(littleEndian = this.littleEndianDefault): number {\n const result = this.getInt16(this.position, littleEndian);\n this.position += 2;\n return result;\n }\n\n nextUint16(littleEndian = this.littleEndianDefault): number {\n const result = this.getUint16(this.position, littleEndian);\n this.position += 2;\n return result;\n }\n\n nextInt32(littleEndian = this.littleEndianDefault): number {\n const result = this.getInt32(this.position, littleEndian);\n this.position += 4;\n return result;\n }\n\n nextUint32(littleEndian = this.littleEndianDefault): number {\n const result = this.getUint32(this.position, littleEndian);\n this.position += 4;\n return result;\n }\n\n nextString(length: number): string {\n const result = textDecoder.decode(\n new Uint8Array(this.buffer, this.byteOffset + this.position, length),\n );\n this.position += length;\n return result;\n }\n\n /** Read a null-terminated string from a fixed-width `length`-byte field. */\n nextNTBS(length: number): string {\n const start = this.position;\n const result = this.nextVarNTBS(length);\n this.position = start + length;\n return result;\n }\n\n /** Read a null-terminated string of at most `length` bytes. */\n nextVarNTBS(length: number): string {\n const start = this.position;\n let byteLength = 0;\n for (let i = 0; i < length; i++) {\n if (this.byteLength <= this.position) break;\n const g = this.nextUint8();\n if (g === 0) break;\n byteLength++;\n }\n return textDecoder.decode(\n new Uint8Array(this.buffer, this.byteOffset + start, byteLength),\n );\n }\n\n nextVersion(reverse = false): VexFirmwareVersion {\n const result = VexFirmwareVersion.fromUint8Array(\n new Uint8Array(this.buffer, this.byteOffset, this.byteLength),\n this.position,\n reverse,\n );\n this.position += 4;\n return result;\n }\n}\n"
10
+ ],
11
+ "mappings": "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",
12
+ "debugId": "19970C753A01B4D364756E2164756E21",
13
+ "names": []
14
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@v5x/serial",
3
- "version": "0.5.6",
3
+ "version": "0.5.7",
4
4
  "description": "implementation of the v5 serial protocol",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -12,17 +12,24 @@
12
12
  "types": "./dist/index.d.ts",
13
13
  "import": "./dist/index.js",
14
14
  "require": "./dist/index.cjs"
15
+ },
16
+ "./packet-core": {
17
+ "types": "./dist/VexPacketCore.d.ts",
18
+ "import": "./dist/packet-core.js",
19
+ "require": "./dist/packet-core.cjs"
15
20
  }
16
21
  },
17
22
  "scripts": {
18
23
  "build": "bun run clean && bun run build:dts && bun run build:esm && bun run build:cjs",
19
- "build:esm": "bun build ./src/index.ts --target browser --format esm --sourcemap=linked --outdir ./dist --entry-naming=index.js --external unzipit",
20
- "build:cjs": "bun build ./src/index.ts --target node --format cjs --sourcemap=linked --outdir ./dist --entry-naming=index.cjs --external unzipit",
24
+ "build:esm": "bun build ./src/index.ts --target browser --format esm --sourcemap=linked --outdir ./dist --entry-naming=index.js --external unzipit --external neverthrow && bun build ./src/VexPacketCore.ts --target browser --format esm --sourcemap=linked --outdir ./dist --entry-naming=packet-core.js",
25
+ "build:cjs": "bun build ./src/index.ts --target node --format cjs --sourcemap=linked --outdir ./dist --entry-naming=index.cjs --external unzipit --external neverthrow && bun build ./src/VexPacketCore.ts --target node --format cjs --sourcemap=linked --outdir ./dist --entry-naming=packet-core.cjs",
21
26
  "build:dts": "tsc -p tsconfig.build.json",
22
27
  "typecheck": "tsc --noEmit",
23
28
  "lint": "oxlint src --type-aware",
24
29
  "test": "bun test",
25
- "prepack": "bun run build",
30
+ "benchmark:screen-capture": "bun ./benchmarks/screen-capture.ts",
31
+ "measure:bundles": "bun ./scripts/measure-bundles.ts",
32
+ "prepack": "bun run build && bun ../../scripts/add-dom-serial-references.ts dist",
26
33
  "clean": "rm -rf dist"
27
34
  },
28
35
  "repository": {