webserial-core 1.0.7 → 1.0.9
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.
- package/README.md +9 -1
- package/dist/Core.d.ts +52 -11
- package/dist/Core.d.ts.map +1 -1
- package/dist/webserial-core.js +329 -195
- package/dist/webserial-core.umd.cjs +2 -2
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -218,6 +218,7 @@ arduino.on('serial:disconnected', (event) => {
|
|
|
218
218
|
|
|
219
219
|
document.getElementById('disconnected').classList.remove('hidden');
|
|
220
220
|
document.getElementById('connect').classList.remove('hidden');
|
|
221
|
+
document.getElementById("disconnect")?.classList.add("hidden");
|
|
221
222
|
});
|
|
222
223
|
|
|
223
224
|
// eslint-disable-next-line no-unused-vars
|
|
@@ -232,6 +233,7 @@ arduino.on('serial:connected', (event) => {
|
|
|
232
233
|
document.getElementById('disconnected').classList.add('hidden');
|
|
233
234
|
document.getElementById('need-permission').classList.add('hidden');
|
|
234
235
|
document.getElementById('connect').classList.add('hidden');
|
|
236
|
+
document.getElementById("disconnect")?.classList.remove("hidden");
|
|
235
237
|
});
|
|
236
238
|
|
|
237
239
|
// eslint-disable-next-line no-unused-vars
|
|
@@ -239,6 +241,7 @@ arduino.on('serial:need-permission', (event) => {
|
|
|
239
241
|
document.getElementById('disconnected').classList.remove('hidden');
|
|
240
242
|
document.getElementById('need-permission').classList.remove('hidden');
|
|
241
243
|
document.getElementById('connect').classList.remove('hidden');
|
|
244
|
+
document.getElementById("disconnect")?.classList.add("hidden");
|
|
242
245
|
});
|
|
243
246
|
|
|
244
247
|
// eslint-disable-next-line no-unused-vars
|
|
@@ -260,7 +263,11 @@ function tryConnect() {
|
|
|
260
263
|
|
|
261
264
|
document.addEventListener('DOMContentLoaded', () => {
|
|
262
265
|
tryConnect();
|
|
263
|
-
document.getElementById('connect')
|
|
266
|
+
document.getElementById('connect')?.addEventListener('click', tryConnect);
|
|
267
|
+
document.getElementById("disconnect")?.addEventListener("click", async () => {
|
|
268
|
+
await board.disconnect().catch(console.error);
|
|
269
|
+
document.getElementById('log')?.innerText += 'Disconnected by user\n\n';
|
|
270
|
+
});
|
|
264
271
|
});
|
|
265
272
|
|
|
266
273
|
```
|
|
@@ -283,6 +290,7 @@ But wait still need to create the HTML file.
|
|
|
283
290
|
<div class="webserial w-full max-w-xl mx-auto grid grid-cols-1 gap-y-4">
|
|
284
291
|
<div class="my-6"></div>
|
|
285
292
|
<button id="connect" class="hidden px-4 py-3 bg-gray-800 rounded-lg">Connect to serial</button>
|
|
293
|
+
<button id="disconnect" class="hidden px-4 py-3 bg-rose-800 rounded-lg">Disconnect device</button>
|
|
286
294
|
|
|
287
295
|
<div id="need-permission" class="hidden p-4 bg-rose-900 rounded-lg">
|
|
288
296
|
Woooah! It seems that you need to give permission to access the serial port.
|
package/dist/Core.d.ts
CHANGED
|
@@ -17,12 +17,17 @@ interface SerialResponse {
|
|
|
17
17
|
as: SerialResponseAs;
|
|
18
18
|
replacer: RegExp | string;
|
|
19
19
|
limiter: null | string | RegExp;
|
|
20
|
+
prefixLimiter: boolean;
|
|
21
|
+
sufixLimiter: boolean;
|
|
22
|
+
delimited: boolean;
|
|
20
23
|
}
|
|
21
24
|
interface QueueData {
|
|
22
25
|
bytes: string | Uint8Array | Array<string> | Array<number>;
|
|
23
26
|
action: string;
|
|
24
27
|
}
|
|
25
28
|
type SerialData = {
|
|
29
|
+
aux_connecting: string;
|
|
30
|
+
connecting: boolean;
|
|
26
31
|
connected: boolean;
|
|
27
32
|
port: SerialPort | null;
|
|
28
33
|
last_action: string | null;
|
|
@@ -40,6 +45,8 @@ type SerialData = {
|
|
|
40
45
|
config_port: SerialOptions;
|
|
41
46
|
queue: QueueData[];
|
|
42
47
|
auto_response: any;
|
|
48
|
+
free_timeout_ms: number;
|
|
49
|
+
useRTSCTS: boolean;
|
|
43
50
|
};
|
|
44
51
|
interface TimeResponse {
|
|
45
52
|
response_connection: number;
|
|
@@ -52,6 +59,7 @@ interface InternalIntervals {
|
|
|
52
59
|
reconnection: number;
|
|
53
60
|
}
|
|
54
61
|
export type Internal = {
|
|
62
|
+
bypassSerialBytesConnection: boolean;
|
|
55
63
|
auto_response: boolean;
|
|
56
64
|
device_number: number;
|
|
57
65
|
aux_port_connector: number;
|
|
@@ -67,9 +75,10 @@ interface CoreConstructorParams {
|
|
|
67
75
|
config_port?: SerialOptions;
|
|
68
76
|
no_device?: number;
|
|
69
77
|
device_listen_on_channel?: number | string;
|
|
78
|
+
bypassSerialBytesConnection?: boolean;
|
|
70
79
|
}
|
|
71
80
|
interface CustomCode {
|
|
72
|
-
code: Array<string>;
|
|
81
|
+
code: string | Uint8Array | Array<string> | Array<number>;
|
|
73
82
|
}
|
|
74
83
|
interface ICore {
|
|
75
84
|
lastAction: string | null;
|
|
@@ -79,14 +88,31 @@ interface ICore {
|
|
|
79
88
|
set serialConfigPort(config_port: SerialOptions);
|
|
80
89
|
get serialConfigPort(): SerialOptions;
|
|
81
90
|
get isConnected(): boolean;
|
|
91
|
+
get isConnecting(): boolean;
|
|
82
92
|
get isDisconnected(): boolean;
|
|
93
|
+
get useRTSCTS(): boolean;
|
|
94
|
+
set useRTSCTS(value: boolean);
|
|
83
95
|
get deviceNumber(): number;
|
|
84
96
|
get uuid(): string;
|
|
85
97
|
get typeDevice(): string;
|
|
86
98
|
get queue(): QueueData[];
|
|
99
|
+
get timeoutBeforeResponseBytes(): number;
|
|
100
|
+
set timeoutBeforeResponseBytes(value: number);
|
|
101
|
+
get fixedBytesMessage(): number | null;
|
|
102
|
+
set fixedBytesMessage(length: number | null);
|
|
103
|
+
get responseDelimited(): boolean;
|
|
104
|
+
set responseDelimited(value: boolean);
|
|
105
|
+
get responsePrefixLimited(): boolean;
|
|
106
|
+
set responsePrefixLimited(value: boolean);
|
|
107
|
+
get responseSufixLimited(): boolean;
|
|
108
|
+
set responseSufixLimited(value: boolean);
|
|
109
|
+
get responseLimiter(): string | RegExp | null;
|
|
110
|
+
set responseLimiter(limiter: string | RegExp | null);
|
|
111
|
+
get bypassSerialBytesConnection(): boolean;
|
|
112
|
+
set bypassSerialBytesConnection(value: boolean);
|
|
87
113
|
timeout(bytes: string[], event: string): Promise<void>;
|
|
88
114
|
disconnect(detail?: null): Promise<void>;
|
|
89
|
-
connect(): Promise<
|
|
115
|
+
connect(): Promise<boolean>;
|
|
90
116
|
serialDisconnect(): Promise<void>;
|
|
91
117
|
serialPortsSaved(ports: SerialPort[]): Promise<void>;
|
|
92
118
|
serialErrors(error: unknown | Error | DOMException): void;
|
|
@@ -99,15 +125,13 @@ interface ICore {
|
|
|
99
125
|
bytesToHex(bytes: string[]): string[];
|
|
100
126
|
appendToQueue(arr: string[], action: string): Promise<void>;
|
|
101
127
|
serialSetConnectionConstant(listen_on_port?: number): string | Uint8Array | string[] | number[] | null;
|
|
102
|
-
serialMessage(
|
|
103
|
-
serialCorruptMessage(
|
|
128
|
+
serialMessage(code: string[]): void;
|
|
129
|
+
serialCorruptMessage(data: Uint8Array | number[] | string[] | never | null | string | ArrayBuffer): void;
|
|
104
130
|
clearSerialQueue(): void;
|
|
105
131
|
sumHex(arr: string[]): string;
|
|
106
132
|
softReload(): void;
|
|
107
133
|
sendConnect(): Promise<void>;
|
|
108
|
-
sendCustomCode(
|
|
109
|
-
code: CustomCode;
|
|
110
|
-
}): Promise<void>;
|
|
134
|
+
sendCustomCode(customCode: CustomCode): Promise<void>;
|
|
111
135
|
stringToArrayHex(string: string): string[];
|
|
112
136
|
stringToArrayBuffer(string: string, end: string): ArrayBufferLike;
|
|
113
137
|
parseStringToBytes(string: string, end: string): string[];
|
|
@@ -126,7 +150,7 @@ interface ICore {
|
|
|
126
150
|
export declare class Core extends Dispatcher implements ICore {
|
|
127
151
|
#private;
|
|
128
152
|
protected __internal__: Internal;
|
|
129
|
-
constructor({ filters, config_port, no_device, device_listen_on_channel, }?: CoreConstructorParams);
|
|
153
|
+
constructor({ filters, config_port, no_device, device_listen_on_channel, bypassSerialBytesConnection, }?: CoreConstructorParams);
|
|
130
154
|
set listenOnChannel(channel: string | number);
|
|
131
155
|
get lastAction(): string | null;
|
|
132
156
|
get listenOnChannel(): number;
|
|
@@ -134,15 +158,32 @@ export declare class Core extends Dispatcher implements ICore {
|
|
|
134
158
|
get serialFilters(): SerialPortFilter[];
|
|
135
159
|
set serialConfigPort(config_port: SerialOptions);
|
|
136
160
|
get serialConfigPort(): SerialOptions;
|
|
161
|
+
get useRTSCTS(): boolean;
|
|
162
|
+
set useRTSCTS(value: boolean);
|
|
137
163
|
get isConnected(): boolean;
|
|
164
|
+
get isConnecting(): boolean;
|
|
138
165
|
get isDisconnected(): boolean;
|
|
139
166
|
get deviceNumber(): number;
|
|
140
167
|
get uuid(): string;
|
|
141
168
|
get typeDevice(): string;
|
|
142
169
|
get queue(): QueueData[];
|
|
170
|
+
get responseDelimited(): boolean;
|
|
171
|
+
set responseDelimited(value: boolean);
|
|
172
|
+
get responsePrefixLimited(): boolean;
|
|
173
|
+
set responsePrefixLimited(value: boolean);
|
|
174
|
+
get responseSufixLimited(): boolean;
|
|
175
|
+
set responseSufixLimited(value: boolean);
|
|
176
|
+
get responseLimiter(): string | RegExp | null;
|
|
177
|
+
set responseLimiter(limiter: string | RegExp | null);
|
|
178
|
+
get fixedBytesMessage(): number | null;
|
|
179
|
+
set fixedBytesMessage(length: number | null);
|
|
180
|
+
get timeoutBeforeResponseBytes(): number;
|
|
181
|
+
set timeoutBeforeResponseBytes(value: number);
|
|
182
|
+
get bypassSerialBytesConnection(): boolean;
|
|
183
|
+
set bypassSerialBytesConnection(value: boolean);
|
|
143
184
|
timeout(bytes: string | Uint8Array | Array<string> | Array<number>, event: string): Promise<void>;
|
|
144
185
|
disconnect(detail?: null): Promise<void>;
|
|
145
|
-
connect(): Promise<
|
|
186
|
+
connect(): Promise<boolean>;
|
|
146
187
|
serialDisconnect(): Promise<void>;
|
|
147
188
|
getResponseAsArrayBuffer(): void;
|
|
148
189
|
getResponseAsArrayHex(): void;
|
|
@@ -160,8 +201,8 @@ export declare class Core extends Dispatcher implements ICore {
|
|
|
160
201
|
validateBytes(data: string | Uint8Array | Array<string> | Array<number>): Uint8Array;
|
|
161
202
|
appendToQueue(arr: string | Uint8Array | string[] | number[], action: string): Promise<void>;
|
|
162
203
|
serialSetConnectionConstant(listen_on_port?: number): string | Uint8Array | string[] | number[] | null;
|
|
163
|
-
serialMessage(
|
|
164
|
-
serialCorruptMessage(code: Uint8Array | number[] | string[]
|
|
204
|
+
serialMessage(code: string[] | Uint8Array<ArrayBufferLike> | string | ArrayBuffer): void;
|
|
205
|
+
serialCorruptMessage(code: Uint8Array | number[] | string[] | never | null | string | ArrayBuffer): void;
|
|
165
206
|
clearSerialQueue(): void;
|
|
166
207
|
sumHex(arr: string[]): string;
|
|
167
208
|
toString(): string;
|
package/dist/Core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Core.d.ts","sourceRoot":"","sources":["../lib/Core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC;IAC1E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,KAAK,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEnE,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,EAAE,EAAE,gBAAgB,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Core.d.ts","sourceRoot":"","sources":["../lib/Core.ts"],"names":[],"mappings":"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"}
|
package/dist/webserial-core.js
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
throw TypeError(
|
|
1
|
+
var Q = Object.defineProperty;
|
|
2
|
+
var T = (l) => {
|
|
3
|
+
throw TypeError(l);
|
|
4
4
|
};
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
class
|
|
10
|
-
constructor(
|
|
11
|
-
super(
|
|
5
|
+
var V = (l, s, e) => s in l ? Q(l, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : l[s] = e;
|
|
6
|
+
var g = (l, s, e) => V(l, typeof s != "symbol" ? s + "" : s, e), z = (l, s, e) => s.has(l) || T("Cannot " + e);
|
|
7
|
+
var E = (l, s, e) => s.has(l) ? T("Cannot add the same private member more than once") : s instanceof WeakSet ? s.add(l) : s.set(l, e);
|
|
8
|
+
var a = (l, s, e) => (z(l, s, "access private method"), e);
|
|
9
|
+
class A extends CustomEvent {
|
|
10
|
+
constructor(s, e) {
|
|
11
|
+
super(s, e);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
class
|
|
14
|
+
class B extends EventTarget {
|
|
15
15
|
constructor() {
|
|
16
16
|
super(...arguments);
|
|
17
|
-
|
|
17
|
+
g(this, "__listeners__", {
|
|
18
18
|
debug: !1
|
|
19
19
|
});
|
|
20
|
-
|
|
20
|
+
g(this, "__debug__", !1);
|
|
21
21
|
}
|
|
22
22
|
dispatch(e, t = null) {
|
|
23
|
-
const i = new
|
|
24
|
-
this.dispatchEvent(i), this.__debug__ && this.dispatchEvent(new
|
|
23
|
+
const i = new A(e, { detail: t });
|
|
24
|
+
this.dispatchEvent(i), this.__debug__ && this.dispatchEvent(new A("debug", { detail: { type: e, data: t } }));
|
|
25
25
|
}
|
|
26
26
|
dispatchAsync(e, t = null, i = 100) {
|
|
27
|
-
const
|
|
27
|
+
const r = this;
|
|
28
28
|
setTimeout(() => {
|
|
29
|
-
|
|
29
|
+
r.dispatch(e, t);
|
|
30
30
|
}, i);
|
|
31
31
|
}
|
|
32
32
|
on(e, t) {
|
|
@@ -45,58 +45,58 @@ class C extends EventTarget {
|
|
|
45
45
|
}));
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
const
|
|
48
|
+
const o = class o extends B {
|
|
49
49
|
constructor() {
|
|
50
50
|
super(), ["change"].forEach((e) => {
|
|
51
51
|
this.serialRegisterAvailableListener(e);
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
|
-
static $dispatchChange(
|
|
55
|
-
|
|
54
|
+
static $dispatchChange(s = null) {
|
|
55
|
+
s && s.$checkAndDispatchConnection(), o.instance.dispatch("change", { devices: o.devices, dispatcher: s });
|
|
56
56
|
}
|
|
57
|
-
static typeError(
|
|
57
|
+
static typeError(s) {
|
|
58
58
|
const e = new Error();
|
|
59
|
-
throw e.message = `Type ${
|
|
59
|
+
throw e.message = `Type ${s} is not supported`, e.name = "DeviceTypeError", e;
|
|
60
60
|
}
|
|
61
|
-
static registerType(
|
|
62
|
-
typeof
|
|
61
|
+
static registerType(s) {
|
|
62
|
+
typeof o.devices[s] > "u" && (o.devices[s] = {});
|
|
63
63
|
}
|
|
64
|
-
static add(
|
|
65
|
-
const e =
|
|
66
|
-
typeof
|
|
67
|
-
const t =
|
|
68
|
-
if (typeof
|
|
64
|
+
static add(s) {
|
|
65
|
+
const e = s.typeDevice;
|
|
66
|
+
typeof o.devices[e] > "u" && (o.devices[e] = {});
|
|
67
|
+
const t = s.uuid;
|
|
68
|
+
if (typeof o.devices[e] > "u" && o.typeError(e), o.devices[e][t])
|
|
69
69
|
throw new Error(`Device with id ${t} already exists`);
|
|
70
|
-
return
|
|
70
|
+
return o.devices[e][t] = s, o.$dispatchChange(s), Object.keys(o.devices[e]).indexOf(t);
|
|
71
71
|
}
|
|
72
|
-
static get(
|
|
73
|
-
return typeof
|
|
72
|
+
static get(s, e) {
|
|
73
|
+
return typeof o.devices[s] > "u" && (o.devices[s] = {}), typeof o.devices[s] > "u" && o.typeError(s), o.devices[s][e];
|
|
74
74
|
}
|
|
75
|
-
static getAll(
|
|
76
|
-
return
|
|
75
|
+
static getAll(s = null) {
|
|
76
|
+
return s === null ? o.devices : (typeof o.devices[s] > "u" && o.typeError(s), o.devices[s]);
|
|
77
77
|
}
|
|
78
78
|
static getList() {
|
|
79
|
-
return Object.values(
|
|
79
|
+
return Object.values(o.devices).map((e) => Object.values(e)).flat();
|
|
80
80
|
}
|
|
81
|
-
static getByNumber(
|
|
82
|
-
return typeof
|
|
81
|
+
static getByNumber(s, e) {
|
|
82
|
+
return typeof o.devices[s] > "u" && o.typeError(s), Object.values(o.devices[s]).find((i) => i.deviceNumber === e) ?? null;
|
|
83
83
|
}
|
|
84
|
-
static getCustom(
|
|
85
|
-
return typeof
|
|
84
|
+
static getCustom(s, e = 1) {
|
|
85
|
+
return typeof o.devices[s] > "u" && o.typeError(s), Object.values(o.devices[s]).find((i) => i.deviceNumber === e) ?? null;
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
|
-
|
|
89
|
-
let
|
|
90
|
-
|
|
91
|
-
function
|
|
88
|
+
g(o, "instance"), g(o, "devices", {});
|
|
89
|
+
let h = o;
|
|
90
|
+
h.instance || (h.instance = new h());
|
|
91
|
+
function L(l = 100) {
|
|
92
92
|
return new Promise(
|
|
93
|
-
(
|
|
93
|
+
(s) => setTimeout(() => s(), l)
|
|
94
94
|
);
|
|
95
95
|
}
|
|
96
|
-
function
|
|
96
|
+
function G() {
|
|
97
97
|
return "serial" in navigator;
|
|
98
98
|
}
|
|
99
|
-
const
|
|
99
|
+
const x = {
|
|
100
100
|
baudRate: 9600,
|
|
101
101
|
dataBits: 8,
|
|
102
102
|
stopBits: 1,
|
|
@@ -104,22 +104,25 @@ const g = {
|
|
|
104
104
|
bufferSize: 32768,
|
|
105
105
|
flowControl: "none"
|
|
106
106
|
};
|
|
107
|
-
var
|
|
108
|
-
class
|
|
107
|
+
var n, y, w, U, v, k, p, I, P, $, D, R, M, m, q, N, O, F, H, j, W;
|
|
108
|
+
class K extends B {
|
|
109
109
|
constructor({
|
|
110
110
|
filters: e = null,
|
|
111
|
-
config_port: t =
|
|
111
|
+
config_port: t = x,
|
|
112
112
|
no_device: i = 1,
|
|
113
|
-
device_listen_on_channel:
|
|
113
|
+
device_listen_on_channel: r = 1,
|
|
114
|
+
bypassSerialBytesConnection: _ = !1
|
|
114
115
|
} = {
|
|
115
116
|
filters: null,
|
|
116
|
-
config_port:
|
|
117
|
+
config_port: x,
|
|
117
118
|
no_device: 1,
|
|
118
|
-
device_listen_on_channel: 1
|
|
119
|
+
device_listen_on_channel: 1,
|
|
120
|
+
bypassSerialBytesConnection: !1
|
|
119
121
|
}) {
|
|
120
122
|
super();
|
|
121
|
-
|
|
122
|
-
|
|
123
|
+
E(this, n);
|
|
124
|
+
g(this, "__internal__", {
|
|
125
|
+
bypassSerialBytesConnection: !1,
|
|
123
126
|
auto_response: !1,
|
|
124
127
|
device_number: 1,
|
|
125
128
|
aux_port_connector: 0,
|
|
@@ -130,6 +133,8 @@ class R extends C {
|
|
|
130
133
|
no_code: 0
|
|
131
134
|
},
|
|
132
135
|
serial: {
|
|
136
|
+
aux_connecting: "idle",
|
|
137
|
+
connecting: !1,
|
|
133
138
|
connected: !1,
|
|
134
139
|
port: null,
|
|
135
140
|
last_action: null,
|
|
@@ -138,7 +143,10 @@ class R extends C {
|
|
|
138
143
|
buffer: new Uint8Array([]),
|
|
139
144
|
as: "uint8",
|
|
140
145
|
replacer: /[\n\r]+/g,
|
|
141
|
-
limiter: null
|
|
146
|
+
limiter: null,
|
|
147
|
+
prefixLimiter: !1,
|
|
148
|
+
sufixLimiter: !0,
|
|
149
|
+
delimited: !1
|
|
142
150
|
},
|
|
143
151
|
reader: null,
|
|
144
152
|
input_done: null,
|
|
@@ -150,9 +158,13 @@ class R extends C {
|
|
|
150
158
|
delay_first_connection: 200,
|
|
151
159
|
bytes_connection: null,
|
|
152
160
|
filters: [],
|
|
153
|
-
config_port:
|
|
161
|
+
config_port: x,
|
|
154
162
|
queue: [],
|
|
155
|
-
auto_response: ["DD", "DD"]
|
|
163
|
+
auto_response: ["DD", "DD"],
|
|
164
|
+
free_timeout_ms: 50,
|
|
165
|
+
// In previous versions 400 was used
|
|
166
|
+
useRTSCTS: !1
|
|
167
|
+
// Use RTS/CTS flow control
|
|
156
168
|
},
|
|
157
169
|
device: {
|
|
158
170
|
type: "unknown",
|
|
@@ -172,12 +184,12 @@ class R extends C {
|
|
|
172
184
|
});
|
|
173
185
|
if (!("serial" in navigator))
|
|
174
186
|
throw new Error("Web Serial not supported");
|
|
175
|
-
e && (this.serialFilters = e), t && (this.serialConfigPort = t), i &&
|
|
187
|
+
e && (this.serialFilters = e), t && (this.serialConfigPort = t), _ && (this.__internal__.bypassSerialBytesConnection = _), i && a(this, n, j).call(this, i), r && ["number", "string"].includes(typeof r) && (this.listenOnChannel = r), a(this, n, N).call(this), a(this, n, O).call(this);
|
|
176
188
|
}
|
|
177
189
|
set listenOnChannel(e) {
|
|
178
190
|
if (typeof e == "string" && (e = parseInt(e)), isNaN(e) || e < 1 || e > 255)
|
|
179
191
|
throw new Error("Invalid port number");
|
|
180
|
-
this.__internal__.device.listen_on_port = e, this.__internal__.serial.bytes_connection = this.serialSetConnectionConstant(e);
|
|
192
|
+
this.__internal__.device.listen_on_port = e, !this.__internal__.bypassSerialBytesConnection && (this.__internal__.serial.bytes_connection = this.serialSetConnectionConstant(e));
|
|
181
193
|
}
|
|
182
194
|
get lastAction() {
|
|
183
195
|
return this.__internal__.serial.last_action;
|
|
@@ -186,24 +198,35 @@ class R extends C {
|
|
|
186
198
|
return this.__internal__.device.listen_on_port ?? 1;
|
|
187
199
|
}
|
|
188
200
|
set serialFilters(e) {
|
|
201
|
+
if (this.isConnected) throw new Error("Cannot change serial filters while connected");
|
|
189
202
|
this.__internal__.serial.filters = e;
|
|
190
203
|
}
|
|
191
204
|
get serialFilters() {
|
|
192
205
|
return this.__internal__.serial.filters;
|
|
193
206
|
}
|
|
194
207
|
set serialConfigPort(e) {
|
|
208
|
+
if (this.isConnected) throw new Error("Cannot change serial filters while connected");
|
|
195
209
|
this.__internal__.serial.config_port = e;
|
|
196
210
|
}
|
|
197
211
|
get serialConfigPort() {
|
|
198
212
|
return this.__internal__.serial.config_port;
|
|
199
213
|
}
|
|
214
|
+
get useRTSCTS() {
|
|
215
|
+
return this.__internal__.serial.useRTSCTS;
|
|
216
|
+
}
|
|
217
|
+
set useRTSCTS(e) {
|
|
218
|
+
this.__internal__.serial.useRTSCTS = e;
|
|
219
|
+
}
|
|
200
220
|
get isConnected() {
|
|
201
|
-
const e = this.__internal__.serial.connected, t =
|
|
202
|
-
return e && !t &&
|
|
221
|
+
const e = this.__internal__.serial.connected, t = a(this, n, y).call(this, this.__internal__.serial.port);
|
|
222
|
+
return e && !t && a(this, n, w).call(this, { error: "Port is closed, not readable or writable." }), this.__internal__.serial.connected = t, this.__internal__.serial.connected;
|
|
223
|
+
}
|
|
224
|
+
get isConnecting() {
|
|
225
|
+
return this.__internal__.serial.connecting;
|
|
203
226
|
}
|
|
204
227
|
get isDisconnected() {
|
|
205
|
-
const e = this.__internal__.serial.connected, t =
|
|
206
|
-
return !e && t && (this.dispatch("serial:connected"),
|
|
228
|
+
const e = this.__internal__.serial.connected, t = a(this, n, y).call(this, this.__internal__.serial.port);
|
|
229
|
+
return !e && t && (this.dispatch("serial:connected"), a(this, n, m).call(this, !1), h.$dispatchChange(this)), this.__internal__.serial.connected = t, !this.__internal__.serial.connected;
|
|
207
230
|
}
|
|
208
231
|
get deviceNumber() {
|
|
209
232
|
return this.__internal__.device_number;
|
|
@@ -217,31 +240,91 @@ class R extends C {
|
|
|
217
240
|
get queue() {
|
|
218
241
|
return this.__internal__.serial.queue;
|
|
219
242
|
}
|
|
243
|
+
get responseDelimited() {
|
|
244
|
+
return this.__internal__.serial.response.delimited;
|
|
245
|
+
}
|
|
246
|
+
set responseDelimited(e) {
|
|
247
|
+
if (typeof e != "boolean")
|
|
248
|
+
throw new Error("responseDelimited must be a boolean");
|
|
249
|
+
this.__internal__.serial.response.delimited = e;
|
|
250
|
+
}
|
|
251
|
+
get responsePrefixLimited() {
|
|
252
|
+
return this.__internal__.serial.response.prefixLimiter;
|
|
253
|
+
}
|
|
254
|
+
set responsePrefixLimited(e) {
|
|
255
|
+
if (typeof e != "boolean")
|
|
256
|
+
throw new Error("responsePrefixLimited must be a boolean");
|
|
257
|
+
this.__internal__.serial.response.prefixLimiter = e;
|
|
258
|
+
}
|
|
259
|
+
get responseSufixLimited() {
|
|
260
|
+
return this.__internal__.serial.response.sufixLimiter;
|
|
261
|
+
}
|
|
262
|
+
set responseSufixLimited(e) {
|
|
263
|
+
if (typeof e != "boolean")
|
|
264
|
+
throw new Error("responseSufixLimited must be a boolean");
|
|
265
|
+
this.__internal__.serial.response.sufixLimiter = e;
|
|
266
|
+
}
|
|
267
|
+
get responseLimiter() {
|
|
268
|
+
return this.__internal__.serial.response.limiter;
|
|
269
|
+
}
|
|
270
|
+
set responseLimiter(e) {
|
|
271
|
+
if (typeof e != "string" && !(e instanceof RegExp))
|
|
272
|
+
throw new Error("responseLimiter must be a string or a RegExp");
|
|
273
|
+
this.__internal__.serial.response.limiter = e;
|
|
274
|
+
}
|
|
275
|
+
get fixedBytesMessage() {
|
|
276
|
+
return this.__internal__.serial.response.length;
|
|
277
|
+
}
|
|
278
|
+
set fixedBytesMessage(e) {
|
|
279
|
+
if (e !== null && (typeof e != "number" || e < 1))
|
|
280
|
+
throw new Error("Invalid length for fixed bytes message");
|
|
281
|
+
this.__internal__.serial.response.length = e;
|
|
282
|
+
}
|
|
283
|
+
get timeoutBeforeResponseBytes() {
|
|
284
|
+
return this.__internal__.serial.free_timeout_ms || 50;
|
|
285
|
+
}
|
|
286
|
+
set timeoutBeforeResponseBytes(e) {
|
|
287
|
+
if (e !== void 0 && (typeof e != "number" || e < 1))
|
|
288
|
+
throw new Error("Invalid timeout for response bytes");
|
|
289
|
+
this.__internal__.serial.free_timeout_ms = e ?? 50;
|
|
290
|
+
}
|
|
291
|
+
get bypassSerialBytesConnection() {
|
|
292
|
+
return this.__internal__.bypassSerialBytesConnection;
|
|
293
|
+
}
|
|
294
|
+
set bypassSerialBytesConnection(e) {
|
|
295
|
+
if (typeof e != "boolean")
|
|
296
|
+
throw new Error("bypassSerialBytesConnection must be a boolean");
|
|
297
|
+
this.__internal__.bypassSerialBytesConnection = e;
|
|
298
|
+
}
|
|
220
299
|
async timeout(e, t) {
|
|
221
|
-
this.__internal__.last_error.message = "Operation response timed out.", this.__internal__.last_error.action = t, this.__internal__.last_error.code = e, this.__internal__.timeout.until_response && (clearTimeout(this.__internal__.timeout.until_response), this.__internal__.timeout.until_response = 0), t === "connect" ? (this.__internal__.serial.connected = !1, this.dispatch("serial:reconnect", {}),
|
|
300
|
+
this.__internal__.last_error.message = "Operation response timed out.", this.__internal__.last_error.action = t, this.__internal__.last_error.code = e, this.__internal__.timeout.until_response && (clearTimeout(this.__internal__.timeout.until_response), this.__internal__.timeout.until_response = 0), t === "connect" ? (this.__internal__.serial.connected = !1, this.dispatch("serial:reconnect", {}), h.$dispatchChange(this)) : t === "connection:start" && (await this.serialDisconnect(), this.__internal__.serial.connected = !1, this.__internal__.aux_port_connector += 1, h.$dispatchChange(this), await this.serialConnect()), this.dispatch("serial:timeout", {
|
|
222
301
|
...this.__internal__.last_error,
|
|
223
302
|
bytes: e,
|
|
224
303
|
action: t
|
|
225
304
|
});
|
|
226
305
|
}
|
|
227
306
|
async disconnect(e = null) {
|
|
228
|
-
await this.serialDisconnect(),
|
|
307
|
+
await this.serialDisconnect(), a(this, n, w).call(this, e);
|
|
229
308
|
}
|
|
230
309
|
async connect() {
|
|
231
|
-
return new Promise((e, t) => {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
310
|
+
return this.isConnected ? !0 : (this.__internal__.serial.aux_connecting = "idle", new Promise((e, t) => {
|
|
311
|
+
G() || t("Web Serial not supported");
|
|
312
|
+
const i = a(this, n, U).bind(this);
|
|
313
|
+
this.on("serial:connecting", i);
|
|
314
|
+
const r = setInterval(() => {
|
|
315
|
+
this.__internal__.serial.aux_connecting === "finished" ? (clearInterval(r), this.__internal__.serial.aux_connecting = "idle", this.off("serial:connecting", i), this.isConnected ? e(!0) : t(`${this.typeDevice} device ${this.deviceNumber} not connected`)) : this.__internal__.serial.aux_connecting === "connecting" && (this.__internal__.serial.aux_connecting = "idle", this.dispatch("serial:connecting", { active: !0 }));
|
|
316
|
+
}, 100);
|
|
317
|
+
this.serialConnect();
|
|
318
|
+
}));
|
|
236
319
|
}
|
|
237
320
|
async serialDisconnect() {
|
|
238
321
|
try {
|
|
239
322
|
const e = this.__internal__.serial.reader, t = this.__internal__.serial.output_stream;
|
|
240
|
-
e && (await e.cancel().catch((
|
|
323
|
+
e && (await e.cancel().catch((r) => this.serialErrors(r)), await this.__internal__.serial.input_done), t && (await t.getWriter().close(), await this.__internal__.serial.output_done), this.__internal__.serial.connected && this.__internal__.serial && this.__internal__.serial.port && await this.__internal__.serial.port.close();
|
|
241
324
|
} catch (e) {
|
|
242
325
|
this.serialErrors(e);
|
|
243
326
|
} finally {
|
|
244
|
-
this.__internal__.serial.reader = null, this.__internal__.serial.input_done = null, this.__internal__.serial.output_stream = null, this.__internal__.serial.output_done = null, this.__internal__.serial.connected = !1, this.__internal__.serial.port = null,
|
|
327
|
+
this.__internal__.serial.reader = null, this.__internal__.serial.input_done = null, this.__internal__.serial.output_stream = null, this.__internal__.serial.output_done = null, this.__internal__.serial.connected = !1, this.__internal__.serial.port = null, h.$dispatchChange(this);
|
|
245
328
|
}
|
|
246
329
|
}
|
|
247
330
|
getResponseAsArrayBuffer() {
|
|
@@ -281,7 +364,7 @@ class R extends C {
|
|
|
281
364
|
case t.includes(
|
|
282
365
|
"this readable stream reader has been released and cannot be used to cancel its previous owner stream"
|
|
283
366
|
):
|
|
284
|
-
this.dispatch("serial:need-permission", {}),
|
|
367
|
+
this.dispatch("serial:need-permission", {}), h.$dispatchChange(this);
|
|
285
368
|
break;
|
|
286
369
|
case t.includes("the port is already open."):
|
|
287
370
|
case t.includes("failed to open serial port"):
|
|
@@ -304,7 +387,7 @@ class R extends C {
|
|
|
304
387
|
case t.includes("the port is already closed."):
|
|
305
388
|
break;
|
|
306
389
|
case t.includes("the device has been lost"):
|
|
307
|
-
this.dispatch("serial:lost", {}),
|
|
390
|
+
this.dispatch("serial:lost", {}), h.$dispatchChange(this);
|
|
308
391
|
break;
|
|
309
392
|
case t.includes("navigator.serial is undefined"):
|
|
310
393
|
this.dispatch("serial:unsupported", {});
|
|
@@ -317,14 +400,14 @@ class R extends C {
|
|
|
317
400
|
}
|
|
318
401
|
async serialConnect() {
|
|
319
402
|
try {
|
|
320
|
-
this.
|
|
321
|
-
const e = await
|
|
403
|
+
a(this, n, m).call(this, !0);
|
|
404
|
+
const e = await a(this, n, I).call(this);
|
|
322
405
|
if (e.length > 0)
|
|
323
406
|
await this.serialPortsSaved(e);
|
|
324
407
|
else {
|
|
325
|
-
const
|
|
408
|
+
const r = this.serialFilters;
|
|
326
409
|
this.__internal__.serial.port = await navigator.serial.requestPort({
|
|
327
|
-
filters:
|
|
410
|
+
filters: r
|
|
328
411
|
});
|
|
329
412
|
}
|
|
330
413
|
const t = this.__internal__.serial.port;
|
|
@@ -332,22 +415,23 @@ class R extends C {
|
|
|
332
415
|
throw new Error("No port selected by the user");
|
|
333
416
|
await t.open(this.serialConfigPort);
|
|
334
417
|
const i = this;
|
|
335
|
-
t.onconnect = (
|
|
336
|
-
|
|
418
|
+
t.onconnect = (r) => {
|
|
419
|
+
var _;
|
|
420
|
+
i.dispatch("serial:connected", r), a(_ = i, n, m).call(_, !1), h.$dispatchChange(this), i.__internal__.serial.queue.length > 0 && i.dispatch("internal:queue", {});
|
|
337
421
|
}, t.ondisconnect = async () => {
|
|
338
422
|
await i.disconnect();
|
|
339
|
-
}, await
|
|
423
|
+
}, await L(this.__internal__.serial.delay_first_connection), this.__internal__.timeout.until_response = setTimeout(async () => {
|
|
340
424
|
await i.timeout(i.__internal__.serial.bytes_connection ?? [], "connection:start");
|
|
341
|
-
}, this.__internal__.time.response_connection), this.__internal__.serial.last_action = "connect", await
|
|
425
|
+
}, this.__internal__.time.response_connection), this.__internal__.serial.last_action = "connect", await a(this, n, v).call(this, this.__internal__.serial.bytes_connection ?? []), this.dispatch("serial:sent", {
|
|
342
426
|
action: "connect",
|
|
343
427
|
bytes: this.__internal__.serial.bytes_connection
|
|
344
|
-
}), this.__internal__.auto_response &&
|
|
428
|
+
}), this.__internal__.auto_response && a(this, n, p).call(this, this.__internal__.serial.auto_response), await a(this, n, M).call(this);
|
|
345
429
|
} catch (e) {
|
|
346
|
-
this.serialErrors(e);
|
|
430
|
+
a(this, n, m).call(this, !1), this.serialErrors(e);
|
|
347
431
|
}
|
|
348
432
|
}
|
|
349
433
|
async serialForget() {
|
|
350
|
-
return await
|
|
434
|
+
return await a(this, n, q).call(this);
|
|
351
435
|
}
|
|
352
436
|
decToHex(e) {
|
|
353
437
|
return typeof e == "string" && (e = parseInt(e, 10)), e.toString(16);
|
|
@@ -360,8 +444,8 @@ class R extends C {
|
|
|
360
444
|
}
|
|
361
445
|
add0x(e) {
|
|
362
446
|
const t = [];
|
|
363
|
-
return e.forEach((i,
|
|
364
|
-
t[
|
|
447
|
+
return e.forEach((i, r) => {
|
|
448
|
+
t[r] = "0x" + i;
|
|
365
449
|
}), t;
|
|
366
450
|
}
|
|
367
451
|
bytesToHex(e) {
|
|
@@ -391,13 +475,14 @@ class R extends C {
|
|
|
391
475
|
this.__internal__.serial.queue.push({ bytes: i, action: t }), this.dispatch("internal:queue", {});
|
|
392
476
|
}
|
|
393
477
|
serialSetConnectionConstant(e = 1) {
|
|
478
|
+
if (this.__internal__.bypassSerialBytesConnection) return this.__internal__.serial.bytes_connection;
|
|
394
479
|
throw new Error(`Method not implemented 'serialSetConnectionConstant' to listen on channel ${e}`);
|
|
395
480
|
}
|
|
396
481
|
serialMessage(e) {
|
|
397
|
-
throw console.log(e), new Error("Method not implemented 'serialMessage'");
|
|
482
|
+
throw console.log(e), this.dispatch("serial:message", { code: e }), new Error("Method not implemented 'serialMessage'");
|
|
398
483
|
}
|
|
399
|
-
serialCorruptMessage(e
|
|
400
|
-
throw console.log(e,
|
|
484
|
+
serialCorruptMessage(e) {
|
|
485
|
+
throw console.log(e), this.dispatch("serial:corrupt-message", { code: e }), new Error("Method not implemented 'serialCorruptMessage'");
|
|
401
486
|
}
|
|
402
487
|
clearSerialQueue() {
|
|
403
488
|
this.__internal__.serial.queue = [];
|
|
@@ -418,18 +503,17 @@ class R extends C {
|
|
|
418
503
|
});
|
|
419
504
|
}
|
|
420
505
|
softReload() {
|
|
421
|
-
|
|
506
|
+
a(this, n, W).call(this), this.dispatch("serial:soft-reload", {});
|
|
422
507
|
}
|
|
423
508
|
async sendConnect() {
|
|
424
509
|
if (!this.__internal__.serial.bytes_connection)
|
|
425
510
|
throw new Error("No connection bytes defined");
|
|
426
511
|
await this.appendToQueue(this.__internal__.serial.bytes_connection, "connect");
|
|
427
512
|
}
|
|
428
|
-
// @ts-expect-error code is required but can be empty
|
|
429
513
|
async sendCustomCode({ code: e = [] } = { code: [] }) {
|
|
430
|
-
if (e
|
|
514
|
+
if (!e)
|
|
431
515
|
throw new Error("No data to send");
|
|
432
|
-
await this.appendToQueue(e, "custom");
|
|
516
|
+
this.__internal__.bypassSerialBytesConnection && (this.__internal__.serial.bytes_connection = this.validateBytes(e)), await this.appendToQueue(e, "custom");
|
|
433
517
|
}
|
|
434
518
|
stringToArrayHex(e) {
|
|
435
519
|
return Array.from(e).map((t) => t.charCodeAt(0).toString(16));
|
|
@@ -446,7 +530,7 @@ class R extends C {
|
|
|
446
530
|
parseStringToBytes(e = "", t = `
|
|
447
531
|
`) {
|
|
448
532
|
const i = this.parseStringToTextEncoder(e, t);
|
|
449
|
-
return Array.from(i).map((
|
|
533
|
+
return Array.from(i).map((r) => r.toString(16));
|
|
450
534
|
}
|
|
451
535
|
parseUint8ToHex(e) {
|
|
452
536
|
return Array.from(e).map((t) => t.toString(16));
|
|
@@ -456,29 +540,29 @@ class R extends C {
|
|
|
456
540
|
}
|
|
457
541
|
stringArrayToUint8Array(e) {
|
|
458
542
|
const t = [];
|
|
459
|
-
return e.forEach((i) => {
|
|
460
|
-
const
|
|
461
|
-
t.push(parseInt(
|
|
462
|
-
}), new Uint8Array(t);
|
|
543
|
+
return typeof e == "string" ? this.parseStringToTextEncoder(e).buffer : (e.forEach((i) => {
|
|
544
|
+
const r = i.replace("0x", "");
|
|
545
|
+
t.push(parseInt(r, 16));
|
|
546
|
+
}), new Uint8Array(t));
|
|
463
547
|
}
|
|
464
548
|
parseUint8ArrayToString(e) {
|
|
465
549
|
let t = new Uint8Array(0);
|
|
466
550
|
e instanceof Uint8Array ? t = e : t = this.stringArrayToUint8Array(e), e = this.parseUint8ToHex(t);
|
|
467
|
-
const i = e.map((
|
|
551
|
+
const i = e.map((r) => parseInt(r, 16));
|
|
468
552
|
return this.__internal__.serial.response.replacer ? String.fromCharCode(...i).replace(this.__internal__.serial.response.replacer, "") : String.fromCharCode(...i);
|
|
469
553
|
}
|
|
470
554
|
hexToAscii(e) {
|
|
471
555
|
const t = e.toString();
|
|
472
556
|
let i = "";
|
|
473
|
-
for (let
|
|
474
|
-
i += String.fromCharCode(parseInt(t.substring(
|
|
557
|
+
for (let r = 0; r < t.length; r += 2)
|
|
558
|
+
i += String.fromCharCode(parseInt(t.substring(r, 2), 16));
|
|
475
559
|
return i;
|
|
476
560
|
}
|
|
477
561
|
asciiToHex(e) {
|
|
478
562
|
const t = [];
|
|
479
|
-
for (let i = 0,
|
|
480
|
-
const
|
|
481
|
-
t.push(
|
|
563
|
+
for (let i = 0, r = e.length; i < r; i++) {
|
|
564
|
+
const _ = Number(e.charCodeAt(i)).toString(16);
|
|
565
|
+
t.push(_);
|
|
482
566
|
}
|
|
483
567
|
return t.join("");
|
|
484
568
|
}
|
|
@@ -486,102 +570,151 @@ class R extends C {
|
|
|
486
570
|
return this.isConnected;
|
|
487
571
|
}
|
|
488
572
|
}
|
|
489
|
-
|
|
573
|
+
n = new WeakSet(), y = function(e) {
|
|
490
574
|
return !!(e && e.readable && e.writable);
|
|
491
|
-
},
|
|
492
|
-
this.__internal__.serial.connected = !1, this.__internal__.aux_port_connector = 0, this.dispatch("serial:disconnected", e),
|
|
493
|
-
},
|
|
575
|
+
}, w = function(e = null) {
|
|
576
|
+
this.__internal__.serial.connected = !1, this.__internal__.aux_port_connector = 0, this.dispatch("serial:disconnected", e), h.$dispatchChange(this);
|
|
577
|
+
}, U = function(e) {
|
|
578
|
+
this.__internal__.serial.aux_connecting = e.detail.active ? "connecting" : "finished";
|
|
579
|
+
}, v = async function(e) {
|
|
494
580
|
const t = this.__internal__.serial.port;
|
|
495
581
|
if (!t || t && (!t.readable || !t.writable))
|
|
496
|
-
throw
|
|
582
|
+
throw a(this, n, w).call(this, { error: "Port is closed, not readable or writable." }), new Error("The port is closed or is not readable/writable");
|
|
497
583
|
const i = this.validateBytes(e);
|
|
498
|
-
if (t.writable === null) return;
|
|
499
|
-
const
|
|
500
|
-
await
|
|
501
|
-
},
|
|
584
|
+
if (this.useRTSCTS && await a(this, n, k).call(this, t, 5e3), t.writable === null) return;
|
|
585
|
+
const r = t.writable.getWriter();
|
|
586
|
+
await r.write(i), r.releaseLock();
|
|
587
|
+
}, k = async function(e, t = 5e3) {
|
|
588
|
+
const i = Date.now();
|
|
589
|
+
for (; ; ) {
|
|
590
|
+
if (Date.now() - i > t)
|
|
591
|
+
throw new Error("Timeout waiting for clearToSend signal");
|
|
592
|
+
const { clearToSend: r } = await e.getSignals();
|
|
593
|
+
if (r) return;
|
|
594
|
+
await L(100);
|
|
595
|
+
}
|
|
596
|
+
}, p = function(e = new Uint8Array([]), t = !1) {
|
|
502
597
|
if (e && e.length > 0) {
|
|
503
598
|
const i = this.__internal__.serial.connected;
|
|
504
|
-
if (this.__internal__.serial.connected =
|
|
505
|
-
this.serialMessage(this.parseUint8ToHex(e));
|
|
599
|
+
if (this.__internal__.serial.connected = a(this, n, y).call(this, this.__internal__.serial.port), h.$dispatchChange(this), !i && this.__internal__.serial.connected && (this.dispatch("serial:connected"), a(this, n, m).call(this, !1)), this.__internal__.interval.reconnection && (clearInterval(this.__internal__.interval.reconnection), this.__internal__.interval.reconnection = 0), this.__internal__.timeout.until_response && (clearTimeout(this.__internal__.timeout.until_response), this.__internal__.timeout.until_response = 0), this.__internal__.serial.response.as === "hex")
|
|
600
|
+
t ? this.serialCorruptMessage(this.parseUint8ToHex(e)) : this.serialMessage(this.parseUint8ToHex(e));
|
|
506
601
|
else if (this.__internal__.serial.response.as === "uint8")
|
|
507
|
-
this.serialMessage(e);
|
|
602
|
+
t ? this.serialCorruptMessage(e) : this.serialMessage(e);
|
|
508
603
|
else if (this.__internal__.serial.response.as === "string") {
|
|
509
|
-
const
|
|
604
|
+
const r = this.parseUint8ArrayToString(e);
|
|
510
605
|
if (this.__internal__.serial.response.limiter !== null) {
|
|
511
|
-
const
|
|
512
|
-
for (const
|
|
513
|
-
c
|
|
606
|
+
const _ = r.split(this.__internal__.serial.response.limiter);
|
|
607
|
+
for (const c in _)
|
|
608
|
+
_[c] && (t ? this.serialCorruptMessage(_[c]) : this.serialMessage(_[c]));
|
|
514
609
|
} else
|
|
515
|
-
this.serialMessage(
|
|
610
|
+
t ? this.serialCorruptMessage(r) : this.serialMessage(r);
|
|
516
611
|
} else {
|
|
517
|
-
const
|
|
518
|
-
this.serialMessage(
|
|
612
|
+
const r = this.stringToArrayBuffer(this.parseUint8ArrayToString(e));
|
|
613
|
+
t ? this.serialCorruptMessage(r) : this.serialMessage(r);
|
|
519
614
|
}
|
|
520
|
-
}
|
|
521
|
-
this.serialCorruptMessage(e, t);
|
|
615
|
+
}
|
|
522
616
|
this.__internal__.serial.queue.length !== 0 && this.dispatch("internal:queue", {});
|
|
523
|
-
},
|
|
617
|
+
}, I = async function() {
|
|
524
618
|
const e = this.serialFilters, t = await navigator.serial.getPorts({ filters: e });
|
|
525
|
-
return e.length === 0 ? t : t.filter((
|
|
526
|
-
const
|
|
527
|
-
return e.some((
|
|
528
|
-
}).filter((
|
|
529
|
-
},
|
|
619
|
+
return e.length === 0 ? t : t.filter((r) => {
|
|
620
|
+
const _ = r.getInfo();
|
|
621
|
+
return e.some((c) => _.usbProductId === c.usbProductId && _.usbVendorId === c.usbVendorId);
|
|
622
|
+
}).filter((r) => !a(this, n, y).call(this, r));
|
|
623
|
+
}, P = function(e) {
|
|
530
624
|
if (e) {
|
|
531
625
|
const t = this.__internal__.serial.response.buffer, i = new Uint8Array(t.length + e.byteLength);
|
|
532
626
|
i.set(t, 0), i.set(new Uint8Array(e), t.length), this.__internal__.serial.response.buffer = i;
|
|
533
627
|
}
|
|
534
|
-
},
|
|
628
|
+
}, $ = async function() {
|
|
535
629
|
this.__internal__.serial.time_until_send_bytes && (clearTimeout(this.__internal__.serial.time_until_send_bytes), this.__internal__.serial.time_until_send_bytes = 0), this.__internal__.serial.time_until_send_bytes = setTimeout(() => {
|
|
536
|
-
this.__internal__.serial.response.buffer &&
|
|
537
|
-
},
|
|
538
|
-
},
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
630
|
+
this.__internal__.serial.response.buffer && a(this, n, p).call(this, this.__internal__.serial.response.buffer), this.__internal__.serial.response.buffer = new Uint8Array(0);
|
|
631
|
+
}, this.__internal__.serial.free_timeout_ms || 50);
|
|
632
|
+
}, D = async function() {
|
|
633
|
+
const e = this.__internal__.serial.response.length;
|
|
634
|
+
let t = this.__internal__.serial.response.buffer;
|
|
635
|
+
if (this.__internal__.serial.time_until_send_bytes && (clearTimeout(this.__internal__.serial.time_until_send_bytes), this.__internal__.serial.time_until_send_bytes = 0), !(e === null || !t || t.length === 0)) {
|
|
636
|
+
for (; t.length >= e; ) {
|
|
637
|
+
const i = t.slice(0, e);
|
|
638
|
+
a(this, n, p).call(this, i), t = t.slice(e);
|
|
639
|
+
}
|
|
640
|
+
this.__internal__.serial.response.buffer = t, t.length > 0 && (this.__internal__.serial.time_until_send_bytes = setTimeout(() => {
|
|
641
|
+
a(this, n, p).call(this, this.__internal__.serial.response.buffer, !0);
|
|
642
|
+
}, this.__internal__.serial.free_timeout_ms || 50));
|
|
643
|
+
}
|
|
644
|
+
}, R = async function() {
|
|
645
|
+
const {
|
|
646
|
+
limiter: e,
|
|
647
|
+
prefixLimiter: t = !1,
|
|
648
|
+
sufixLimiter: i = !0
|
|
649
|
+
} = this.__internal__.serial.response;
|
|
650
|
+
if (!e)
|
|
651
|
+
throw new Error("No limiter defined for delimited serial response");
|
|
652
|
+
const r = this.__internal__.serial.response.buffer;
|
|
653
|
+
if (!e || !r || r.length === 0) return;
|
|
654
|
+
this.__internal__.serial.time_until_send_bytes && (clearTimeout(this.__internal__.serial.time_until_send_bytes), this.__internal__.serial.time_until_send_bytes = 0);
|
|
655
|
+
let c = new TextDecoder().decode(r);
|
|
656
|
+
const b = [];
|
|
657
|
+
if (typeof e == "string") {
|
|
658
|
+
let u;
|
|
659
|
+
if (t && i)
|
|
660
|
+
u = new RegExp(`${e}([^${e}]+)${e}`, "g");
|
|
661
|
+
else if (t)
|
|
662
|
+
u = new RegExp(`${e}([^${e}]*)`, "g");
|
|
663
|
+
else if (i)
|
|
664
|
+
u = new RegExp(`([^${e}]+)${e}`, "g");
|
|
665
|
+
else
|
|
666
|
+
return;
|
|
667
|
+
let f, d = 0;
|
|
668
|
+
for (; (f = u.exec(c)) !== null; )
|
|
669
|
+
b.push(new TextEncoder().encode(f[1])), d = u.lastIndex;
|
|
670
|
+
c = c.slice(d);
|
|
671
|
+
} else if (e instanceof RegExp) {
|
|
672
|
+
let u, f = 0;
|
|
673
|
+
if (t && i) {
|
|
674
|
+
const d = new RegExp(`${e.source}(.*?)${e.source}`, "g");
|
|
675
|
+
for (; (u = d.exec(c)) !== null; )
|
|
676
|
+
b.push(new TextEncoder().encode(u[1])), f = d.lastIndex;
|
|
677
|
+
} else if (i)
|
|
678
|
+
for (; (u = e.exec(c)) !== null; ) {
|
|
679
|
+
const d = u.index, C = c.slice(f, d);
|
|
680
|
+
b.push(new TextEncoder().encode(C)), f = e.lastIndex;
|
|
556
681
|
}
|
|
682
|
+
else if (t) {
|
|
683
|
+
const d = c.split(e);
|
|
684
|
+
d.shift();
|
|
685
|
+
for (const C of d)
|
|
686
|
+
b.push(new TextEncoder().encode(C));
|
|
687
|
+
c = "";
|
|
557
688
|
}
|
|
558
|
-
|
|
559
|
-
}
|
|
689
|
+
c = c.slice(f);
|
|
690
|
+
}
|
|
691
|
+
for (const u of b)
|
|
692
|
+
a(this, n, p).call(this, u);
|
|
693
|
+
const S = new TextEncoder().encode(c);
|
|
694
|
+
this.__internal__.serial.response.buffer = S, S.length > 0 && (this.__internal__.serial.time_until_send_bytes = setTimeout(() => {
|
|
695
|
+
a(this, n, p).call(this, this.__internal__.serial.response.buffer, !0), this.__internal__.serial.response.buffer = new Uint8Array(0);
|
|
696
|
+
}, this.__internal__.serial.free_timeout_ms ?? 50));
|
|
697
|
+
}, M = async function() {
|
|
560
698
|
const e = this.__internal__.serial.port;
|
|
561
699
|
if (!e || !e.readable) throw new Error("Port is not readable");
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
if (c) {
|
|
570
|
-
t.releaseLock(), this.__internal__.serial.keep_reading = !1, i = !1;
|
|
571
|
-
break;
|
|
572
|
-
}
|
|
573
|
-
l(this, r, E).call(this, s), this.__internal__.serial.response.length === null ? await l(this, r, x).call(this) : await l(this, r, T).call(this);
|
|
574
|
-
}
|
|
575
|
-
} catch (i) {
|
|
576
|
-
this.serialErrors(i);
|
|
577
|
-
} finally {
|
|
578
|
-
t.releaseLock();
|
|
700
|
+
const t = e.readable.getReader();
|
|
701
|
+
this.__internal__.serial.reader = t;
|
|
702
|
+
try {
|
|
703
|
+
for (; this.__internal__.serial.keep_reading; ) {
|
|
704
|
+
const { value: i, done: r } = await t.read();
|
|
705
|
+
if (r) break;
|
|
706
|
+
a(this, n, P).call(this, i), this.__internal__.serial.response.delimited ? await a(this, n, R).call(this) : this.__internal__.serial.response.length === null ? await a(this, n, $).call(this) : await a(this, n, D).call(this);
|
|
579
707
|
}
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
}
|
|
708
|
+
} catch (i) {
|
|
709
|
+
this.serialErrors(i);
|
|
710
|
+
} finally {
|
|
711
|
+
t.releaseLock(), this.__internal__.serial.keep_reading = !0, this.__internal__.serial.port && await this.__internal__.serial.port.close();
|
|
712
|
+
}
|
|
713
|
+
}, m = function(e) {
|
|
714
|
+
e !== this.__internal__.serial.connecting && (this.__internal__.serial.connecting = e, e ? this.dispatch("serial:connecting", { active: !0 }) : this.dispatch("serial:connecting", { active: !1 }));
|
|
715
|
+
}, q = async function() {
|
|
583
716
|
return typeof window > "u" ? !1 : "serial" in navigator && "forget" in SerialPort.prototype && this.__internal__.serial.port ? (await this.__internal__.serial.port.forget(), !0) : !1;
|
|
584
|
-
},
|
|
717
|
+
}, N = function() {
|
|
585
718
|
[
|
|
586
719
|
"serial:connected",
|
|
587
720
|
"serial:connecting",
|
|
@@ -591,6 +724,7 @@ r = new WeakSet(), d = function(e) {
|
|
|
591
724
|
"serial:sent",
|
|
592
725
|
"serial:soft-reload",
|
|
593
726
|
"serial:message",
|
|
727
|
+
"serial:corrupt-message",
|
|
594
728
|
"unknown",
|
|
595
729
|
"serial:need-permission",
|
|
596
730
|
"serial:lost",
|
|
@@ -600,21 +734,21 @@ r = new WeakSet(), d = function(e) {
|
|
|
600
734
|
].forEach((t) => {
|
|
601
735
|
this.serialRegisterAvailableListener(t);
|
|
602
736
|
});
|
|
603
|
-
},
|
|
737
|
+
}, O = function() {
|
|
604
738
|
const e = this;
|
|
605
739
|
this.on("internal:queue", async () => {
|
|
606
740
|
var t;
|
|
607
|
-
await
|
|
608
|
-
}),
|
|
609
|
-
},
|
|
741
|
+
await a(t = e, n, H).call(t);
|
|
742
|
+
}), a(this, n, F).call(this);
|
|
743
|
+
}, F = function() {
|
|
610
744
|
const e = this;
|
|
611
745
|
navigator.serial.addEventListener("connect", async () => {
|
|
612
746
|
e.isDisconnected && await e.serialConnect().catch(() => {
|
|
613
747
|
});
|
|
614
748
|
});
|
|
615
|
-
},
|
|
616
|
-
if (!
|
|
617
|
-
|
|
749
|
+
}, H = async function() {
|
|
750
|
+
if (!a(this, n, y).call(this, this.__internal__.serial.port)) {
|
|
751
|
+
a(this, n, w).call(this, { error: "Port is closed, not readable or writable." }), await this.serialConnect();
|
|
618
752
|
return;
|
|
619
753
|
}
|
|
620
754
|
if (this.__internal__.timeout.until_response || this.__internal__.serial.queue.length === 0) return;
|
|
@@ -622,23 +756,23 @@ r = new WeakSet(), d = function(e) {
|
|
|
622
756
|
let t = this.__internal__.time.response_general;
|
|
623
757
|
if (e.action === "connect" && (t = this.__internal__.time.response_connection), this.__internal__.timeout.until_response = setTimeout(async () => {
|
|
624
758
|
await this.timeout(e.bytes, e.action);
|
|
625
|
-
}, t), this.__internal__.serial.last_action = e.action ?? "unknown", await
|
|
759
|
+
}, t), this.__internal__.serial.last_action = e.action ?? "unknown", await a(this, n, v).call(this, e.bytes), this.dispatch("serial:sent", {
|
|
626
760
|
action: e.action,
|
|
627
761
|
bytes: e.bytes
|
|
628
762
|
}), this.__internal__.auto_response) {
|
|
629
|
-
let
|
|
763
|
+
let r = new Uint8Array(0);
|
|
630
764
|
try {
|
|
631
|
-
|
|
632
|
-
} catch (
|
|
633
|
-
this.serialErrors(
|
|
765
|
+
r = this.validateBytes(this.__internal__.serial.auto_response);
|
|
766
|
+
} catch (_) {
|
|
767
|
+
this.serialErrors(_);
|
|
634
768
|
}
|
|
635
|
-
|
|
769
|
+
a(this, n, p).call(this, r);
|
|
636
770
|
}
|
|
637
771
|
const i = [...this.__internal__.serial.queue];
|
|
638
772
|
this.__internal__.serial.queue = i.splice(1);
|
|
639
|
-
},
|
|
640
|
-
this.__internal__.device_number = e, this.__internal__.serial.bytes_connection = this.serialSetConnectionConstant(e);
|
|
641
|
-
},
|
|
773
|
+
}, j = function(e = 1) {
|
|
774
|
+
this.__internal__.device_number = e, !this.__internal__.bypassSerialBytesConnection && (this.__internal__.serial.bytes_connection = this.serialSetConnectionConstant(e));
|
|
775
|
+
}, W = function() {
|
|
642
776
|
this.__internal__.last_error = {
|
|
643
777
|
message: null,
|
|
644
778
|
action: null,
|
|
@@ -647,7 +781,7 @@ r = new WeakSet(), d = function(e) {
|
|
|
647
781
|
};
|
|
648
782
|
};
|
|
649
783
|
export {
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
784
|
+
K as Core,
|
|
785
|
+
h as Devices,
|
|
786
|
+
B as Dispatcher
|
|
653
787
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(o,_){typeof exports=="object"&&typeof module<"u"?_(exports):typeof define=="function"&&define.amd?define(["exports"],_):(o=typeof globalThis<"u"?globalThis:o||self,_(o.WebSerialCore={}))})(this,function(o){"use strict";var O=Object.defineProperty;var C=o=>{throw TypeError(o)};var B=(o,_,h)=>_ in o?O(o,_,{enumerable:!0,configurable:!0,writable:!0,value:h}):o[_]=h;var p=(o,_,h)=>B(o,typeof _!="symbol"?_+"":_,h),R=(o,_,h)=>_.has(o)||C("Cannot "+h);var A=(o,_,h)=>_.has(o)?C("Cannot add the same private member more than once"):_ instanceof WeakSet?_.add(o):_.set(o,h);var l=(o,_,h)=>(R(o,_,"access private method"),h);var n,f,y,m,d,E,T,S,x,U,k,P,D,L,$,q,I;class _ extends CustomEvent{constructor(r,e){super(r,e)}}class h extends EventTarget{constructor(){super(...arguments);p(this,"__listeners__",{debug:!1});p(this,"__debug__",!1)}dispatch(e,t=null){const i=new _(e,{detail:t});this.dispatchEvent(i),this.__debug__&&this.dispatchEvent(new _("debug",{detail:{type:e,data:t}}))}dispatchAsync(e,t=null,i=100){const s=this;setTimeout(()=>{s.dispatch(e,t)},i)}on(e,t){typeof this.__listeners__[e]<"u"&&!this.__listeners__[e]&&(this.__listeners__[e]=!0),this.addEventListener(e,t)}off(e,t){this.removeEventListener(e,t)}serialRegisterAvailableListener(e){this.__listeners__[e]||(this.__listeners__[e]=!1)}get availableListeners(){return Object.keys(this.__listeners__).sort().map(t=>({type:t,listening:this.__listeners__[t]}))}}const a=class a extends h{constructor(){super(),["change"].forEach(e=>{this.serialRegisterAvailableListener(e)})}static $dispatchChange(r=null){r&&r.$checkAndDispatchConnection(),a.instance.dispatch("change",{devices:a.devices,dispatcher:r})}static typeError(r){const e=new Error;throw e.message=`Type ${r} is not supported`,e.name="DeviceTypeError",e}static registerType(r){typeof a.devices[r]>"u"&&(a.devices[r]={})}static add(r){const e=r.typeDevice;typeof a.devices[e]>"u"&&(a.devices[e]={});const t=r.uuid;if(typeof a.devices[e]>"u"&&a.typeError(e),a.devices[e][t])throw new Error(`Device with id ${t} already exists`);return a.devices[e][t]=r,a.$dispatchChange(r),Object.keys(a.devices[e]).indexOf(t)}static get(r,e){return typeof a.devices[r]>"u"&&(a.devices[r]={}),typeof a.devices[r]>"u"&&a.typeError(r),a.devices[r][e]}static getAll(r=null){return r===null?a.devices:(typeof a.devices[r]>"u"&&a.typeError(r),a.devices[r])}static getList(){return Object.values(a.devices).map(e=>Object.values(e)).flat()}static getByNumber(r,e){return typeof a.devices[r]>"u"&&a.typeError(r),Object.values(a.devices[r]).find(i=>i.deviceNumber===e)??null}static getCustom(r,e=1){return typeof a.devices[r]>"u"&&a.typeError(r),Object.values(a.devices[r]).find(i=>i.deviceNumber===e)??null}};p(a,"instance"),p(a,"devices",{});let c=a;c.instance||(c.instance=new c);function v(b=100){return new Promise(r=>setTimeout(()=>r(),b))}function M(){return"serial"in navigator}const w={baudRate:9600,dataBits:8,stopBits:1,parity:"none",bufferSize:32768,flowControl:"none"};class N extends h{constructor({filters:e=null,config_port:t=w,no_device:i=1,device_listen_on_channel:s=1}={filters:null,config_port:w,no_device:1,device_listen_on_channel:1}){super();A(this,n);p(this,"__internal__",{auto_response:!1,device_number:1,aux_port_connector:0,last_error:{message:null,action:null,code:null,no_code:0},serial:{connected:!1,port:null,last_action:null,response:{length:null,buffer:new Uint8Array([]),as:"uint8",replacer:/[\n\r]+/g,limiter:null},reader:null,input_done:null,output_done:null,input_stream:null,output_stream:null,keep_reading:!0,time_until_send_bytes:void 0,delay_first_connection:200,bytes_connection:null,filters:[],config_port:w,queue:[],auto_response:["DD","DD"]},device:{type:"unknown",id:window.crypto.randomUUID(),listen_on_port:null},time:{response_connection:500,response_general:2e3},timeout:{until_response:0},interval:{reconnection:0}});if(!("serial"in navigator))throw new Error("Web Serial not supported");e&&(this.serialFilters=e),t&&(this.serialConfigPort=t),i&&l(this,n,q).call(this,i),s&&["number","string"].includes(typeof s)&&(this.listenOnChannel=s),l(this,n,P).call(this),l(this,n,D).call(this)}set listenOnChannel(e){if(typeof e=="string"&&(e=parseInt(e)),isNaN(e)||e<1||e>255)throw new Error("Invalid port number");this.__internal__.device.listen_on_port=e,this.__internal__.serial.bytes_connection=this.serialSetConnectionConstant(e)}get lastAction(){return this.__internal__.serial.last_action}get listenOnChannel(){return this.__internal__.device.listen_on_port??1}set serialFilters(e){this.__internal__.serial.filters=e}get serialFilters(){return this.__internal__.serial.filters}set serialConfigPort(e){this.__internal__.serial.config_port=e}get serialConfigPort(){return this.__internal__.serial.config_port}get isConnected(){const e=this.__internal__.serial.connected,t=l(this,n,f).call(this,this.__internal__.serial.port);return e&&!t&&l(this,n,y).call(this,{error:"Port is closed, not readable or writable."}),this.__internal__.serial.connected=t,this.__internal__.serial.connected}get isDisconnected(){const e=this.__internal__.serial.connected,t=l(this,n,f).call(this,this.__internal__.serial.port);return!e&&t&&(this.dispatch("serial:connected"),c.$dispatchChange(this)),this.__internal__.serial.connected=t,!this.__internal__.serial.connected}get deviceNumber(){return this.__internal__.device_number}get uuid(){return this.__internal__.device.id}get typeDevice(){return this.__internal__.device.type}get queue(){return this.__internal__.serial.queue}async timeout(e,t){this.__internal__.last_error.message="Operation response timed out.",this.__internal__.last_error.action=t,this.__internal__.last_error.code=e,this.__internal__.timeout.until_response&&(clearTimeout(this.__internal__.timeout.until_response),this.__internal__.timeout.until_response=0),t==="connect"?(this.__internal__.serial.connected=!1,this.dispatch("serial:reconnect",{}),c.$dispatchChange(this)):t==="connection:start"&&(await this.serialDisconnect(),this.__internal__.serial.connected=!1,this.__internal__.aux_port_connector+=1,c.$dispatchChange(this),await this.serialConnect()),this.dispatch("serial:timeout",{...this.__internal__.last_error,bytes:e,action:t})}async disconnect(e=null){await this.serialDisconnect(),l(this,n,y).call(this,e)}async connect(){return new Promise((e,t)=>{M()||t("Web Serial not supported"),setTimeout(async()=>{await v(499),await this.serialConnect(),this.isConnected?e(`${this.typeDevice} device ${this.deviceNumber} connected`):t(`${this.typeDevice} device ${this.deviceNumber} not connected`)},1)})}async serialDisconnect(){try{const e=this.__internal__.serial.reader,t=this.__internal__.serial.output_stream;e&&(await e.cancel().catch(s=>this.serialErrors(s)),await this.__internal__.serial.input_done),t&&(await t.getWriter().close(),await this.__internal__.serial.output_done),this.__internal__.serial.connected&&this.__internal__.serial&&this.__internal__.serial.port&&await this.__internal__.serial.port.close()}catch(e){this.serialErrors(e)}finally{this.__internal__.serial.reader=null,this.__internal__.serial.input_done=null,this.__internal__.serial.output_stream=null,this.__internal__.serial.output_done=null,this.__internal__.serial.connected=!1,this.__internal__.serial.port=null,c.$dispatchChange(this)}}getResponseAsArrayBuffer(){this.__internal__.serial.response.as="arraybuffer"}getResponseAsArrayHex(){this.__internal__.serial.response.as="hex"}getResponseAsUint8Array(){this.__internal__.serial.response.as="uint8"}getResponseAsString(){this.__internal__.serial.response.as="string"}async serialPortsSaved(e){const t=this.serialFilters;if(this.__internal__.aux_port_connector<e.length){const i=this.__internal__.aux_port_connector;this.__internal__.serial.port=e[i]}else this.__internal__.aux_port_connector=0,this.__internal__.serial.port=await navigator.serial.requestPort({filters:t});if(!this.__internal__.serial.port)throw new Error("Select another port please")}serialErrors(e){const t=e.toString().toLowerCase();switch(!0){case t.includes("must be handling a user gesture to show a permission request"):case t.includes("the port is closed."):case t.includes("the port is closed or is not writable"):case t.includes("the port is closed or is not readable"):case t.includes("the port is closed or is not readable/writable"):case t.includes("select another port please"):case t.includes("no port selected by the user"):case t.includes("this readable stream reader has been released and cannot be used to cancel its previous owner stream"):this.dispatch("serial:need-permission",{}),c.$dispatchChange(this);break;case t.includes("the port is already open."):case t.includes("failed to open serial port"):this.serialDisconnect().then(async()=>{this.__internal__.aux_port_connector+=1,await this.serialConnect()});break;case t.includes("cannot read properties of undefined (reading 'writable')"):case t.includes("cannot read properties of null (reading 'writable')"):case t.includes("cannot read property 'writable' of null"):case t.includes("cannot read property 'writable' of undefined"):this.serialDisconnect().then(async()=>{await this.serialConnect()});break;case t.includes("'close' on 'serialport': a call to close() is already in progress."):break;case t.includes("failed to execute 'open' on 'serialport': a call to open() is already in progress."):break;case t.includes("the port is already closed."):break;case t.includes("the device has been lost"):this.dispatch("serial:lost",{}),c.$dispatchChange(this);break;case t.includes("navigator.serial is undefined"):this.dispatch("serial:unsupported",{});break;default:console.error(e);break}this.dispatch("serial:error",e)}async serialConnect(){try{this.dispatch("serial:connecting",{});const e=await l(this,n,E).call(this);if(e.length>0)await this.serialPortsSaved(e);else{const s=this.serialFilters;this.__internal__.serial.port=await navigator.serial.requestPort({filters:s})}const t=this.__internal__.serial.port;if(!t)throw new Error("No port selected by the user");await t.open(this.serialConfigPort);const i=this;t.onconnect=s=>{console.log(s),i.dispatch("serial:connected",s),c.$dispatchChange(this),i.__internal__.serial.queue.length>0&&i.dispatch("internal:queue",{})},t.ondisconnect=async()=>{await i.disconnect()},await v(this.__internal__.serial.delay_first_connection),this.__internal__.timeout.until_response=setTimeout(async()=>{await i.timeout(i.__internal__.serial.bytes_connection??[],"connection:start")},this.__internal__.time.response_connection),this.__internal__.serial.last_action="connect",await l(this,n,m).call(this,this.__internal__.serial.bytes_connection??[]),this.dispatch("serial:sent",{action:"connect",bytes:this.__internal__.serial.bytes_connection}),this.__internal__.auto_response&&l(this,n,d).call(this,this.__internal__.serial.auto_response,null),await l(this,n,U).call(this)}catch(e){this.serialErrors(e)}}async serialForget(){return await l(this,n,k).call(this)}decToHex(e){return typeof e=="string"&&(e=parseInt(e,10)),e.toString(16)}hexToDec(e){return parseInt(e,16)}hexMaker(e="00",t=2){return e.toString().padStart(t,"0").toLowerCase()}add0x(e){const t=[];return e.forEach((i,s)=>{t[s]="0x"+i}),t}bytesToHex(e){return this.add0x(Array.from(e,t=>this.hexMaker(t)))}validateBytes(e){let t=new Uint8Array(0);if(e instanceof Uint8Array)t=e;else if(typeof e=="string")t=this.parseStringToTextEncoder(e);else if(Array.isArray(e)&&typeof e[0]=="string")t=this.stringArrayToUint8Array(e);else if(Array.isArray(e)&&typeof e[0]=="number")t=new Uint8Array(e);else throw new Error("Invalid data type");return t}async appendToQueue(e,t){const i=this.validateBytes(e);if(["connect","connection:start"].includes(t)){if(this.__internal__.serial.connected)return;await this.serialConnect();return}this.__internal__.serial.queue.push({bytes:i,action:t}),this.dispatch("internal:queue",{})}serialSetConnectionConstant(e=1){throw new Error(`Method not implemented 'serialSetConnectionConstant' to listen on channel ${e}`)}serialMessage(e){throw console.log(e),new Error("Method not implemented 'serialMessage'")}serialCorruptMessage(e,t){throw console.log(e,t),new Error("Method not implemented 'serialCorruptMessage'")}clearSerialQueue(){this.__internal__.serial.queue=[]}sumHex(e){let t=0;return e.forEach(i=>{t+=parseInt(i,16)}),t.toString(16)}toString(){return JSON.stringify({__class:this.typeDevice,device_number:this.deviceNumber,uuid:this.uuid,connected:this.isConnected,connection:this.__internal__.serial.bytes_connection})}softReload(){l(this,n,I).call(this),this.dispatch("serial:soft-reload",{})}async sendConnect(){if(!this.__internal__.serial.bytes_connection)throw new Error("No connection bytes defined");await this.appendToQueue(this.__internal__.serial.bytes_connection,"connect")}async sendCustomCode({code:e=[]}={code:[]}){if(e===null||e.length===0)throw new Error("No data to send");await this.appendToQueue(e,"custom")}stringToArrayHex(e){return Array.from(e).map(t=>t.charCodeAt(0).toString(16))}stringToArrayBuffer(e,t=`
|
|
1
|
+
(function(l,_){typeof exports=="object"&&typeof module<"u"?_(exports):typeof define=="function"&&define.amd?define(["exports"],_):(l=typeof globalThis<"u"?globalThis:l||self,_(l.WebSerialCore={}))})(this,function(l){"use strict";var G=Object.defineProperty;var B=l=>{throw TypeError(l)};var J=(l,_,d)=>_ in l?G(l,_,{enumerable:!0,configurable:!0,writable:!0,value:d}):l[_]=d;var m=(l,_,d)=>J(l,typeof _!="symbol"?_+"":_,d),K=(l,_,d)=>_.has(l)||B("Cannot "+d);var U=(l,_,d)=>_.has(l)?B("Cannot add the same private member more than once"):_ instanceof WeakSet?_.add(l):_.set(l,d);var a=(l,_,d)=>(K(l,_,"access private method"),d);var n,b,v,k,E,D,g,I,P,$,R,M,q,w,N,O,F,H,j,W,Q;class _ extends CustomEvent{constructor(r,e){super(r,e)}}class d extends EventTarget{constructor(){super(...arguments);m(this,"__listeners__",{debug:!1});m(this,"__debug__",!1)}dispatch(e,t=null){const i=new _(e,{detail:t});this.dispatchEvent(i),this.__debug__&&this.dispatchEvent(new _("debug",{detail:{type:e,data:t}}))}dispatchAsync(e,t=null,i=100){const s=this;setTimeout(()=>{s.dispatch(e,t)},i)}on(e,t){typeof this.__listeners__[e]<"u"&&!this.__listeners__[e]&&(this.__listeners__[e]=!0),this.addEventListener(e,t)}off(e,t){this.removeEventListener(e,t)}serialRegisterAvailableListener(e){this.__listeners__[e]||(this.__listeners__[e]=!1)}get availableListeners(){return Object.keys(this.__listeners__).sort().map(t=>({type:t,listening:this.__listeners__[t]}))}}const o=class o extends d{constructor(){super(),["change"].forEach(e=>{this.serialRegisterAvailableListener(e)})}static $dispatchChange(r=null){r&&r.$checkAndDispatchConnection(),o.instance.dispatch("change",{devices:o.devices,dispatcher:r})}static typeError(r){const e=new Error;throw e.message=`Type ${r} is not supported`,e.name="DeviceTypeError",e}static registerType(r){typeof o.devices[r]>"u"&&(o.devices[r]={})}static add(r){const e=r.typeDevice;typeof o.devices[e]>"u"&&(o.devices[e]={});const t=r.uuid;if(typeof o.devices[e]>"u"&&o.typeError(e),o.devices[e][t])throw new Error(`Device with id ${t} already exists`);return o.devices[e][t]=r,o.$dispatchChange(r),Object.keys(o.devices[e]).indexOf(t)}static get(r,e){return typeof o.devices[r]>"u"&&(o.devices[r]={}),typeof o.devices[r]>"u"&&o.typeError(r),o.devices[r][e]}static getAll(r=null){return r===null?o.devices:(typeof o.devices[r]>"u"&&o.typeError(r),o.devices[r])}static getList(){return Object.values(o.devices).map(e=>Object.values(e)).flat()}static getByNumber(r,e){return typeof o.devices[r]>"u"&&o.typeError(r),Object.values(o.devices[r]).find(i=>i.deviceNumber===e)??null}static getCustom(r,e=1){return typeof o.devices[r]>"u"&&o.typeError(r),Object.values(o.devices[r]).find(i=>i.deviceNumber===e)??null}};m(o,"instance"),m(o,"devices",{});let u=o;u.instance||(u.instance=new u);function A(x=100){return new Promise(r=>setTimeout(()=>r(),x))}function V(){return"serial"in navigator}const S={baudRate:9600,dataBits:8,stopBits:1,parity:"none",bufferSize:32768,flowControl:"none"};class z extends d{constructor({filters:e=null,config_port:t=S,no_device:i=1,device_listen_on_channel:s=1,bypassSerialBytesConnection:c=!1}={filters:null,config_port:S,no_device:1,device_listen_on_channel:1,bypassSerialBytesConnection:!1}){super();U(this,n);m(this,"__internal__",{bypassSerialBytesConnection:!1,auto_response:!1,device_number:1,aux_port_connector:0,last_error:{message:null,action:null,code:null,no_code:0},serial:{aux_connecting:"idle",connecting:!1,connected:!1,port:null,last_action:null,response:{length:null,buffer:new Uint8Array([]),as:"uint8",replacer:/[\n\r]+/g,limiter:null,prefixLimiter:!1,sufixLimiter:!0,delimited:!1},reader:null,input_done:null,output_done:null,input_stream:null,output_stream:null,keep_reading:!0,time_until_send_bytes:void 0,delay_first_connection:200,bytes_connection:null,filters:[],config_port:S,queue:[],auto_response:["DD","DD"],free_timeout_ms:50,useRTSCTS:!1},device:{type:"unknown",id:window.crypto.randomUUID(),listen_on_port:null},time:{response_connection:500,response_general:2e3},timeout:{until_response:0},interval:{reconnection:0}});if(!("serial"in navigator))throw new Error("Web Serial not supported");e&&(this.serialFilters=e),t&&(this.serialConfigPort=t),c&&(this.__internal__.bypassSerialBytesConnection=c),i&&a(this,n,W).call(this,i),s&&["number","string"].includes(typeof s)&&(this.listenOnChannel=s),a(this,n,O).call(this),a(this,n,F).call(this)}set listenOnChannel(e){if(typeof e=="string"&&(e=parseInt(e)),isNaN(e)||e<1||e>255)throw new Error("Invalid port number");this.__internal__.device.listen_on_port=e,!this.__internal__.bypassSerialBytesConnection&&(this.__internal__.serial.bytes_connection=this.serialSetConnectionConstant(e))}get lastAction(){return this.__internal__.serial.last_action}get listenOnChannel(){return this.__internal__.device.listen_on_port??1}set serialFilters(e){if(this.isConnected)throw new Error("Cannot change serial filters while connected");this.__internal__.serial.filters=e}get serialFilters(){return this.__internal__.serial.filters}set serialConfigPort(e){if(this.isConnected)throw new Error("Cannot change serial filters while connected");this.__internal__.serial.config_port=e}get serialConfigPort(){return this.__internal__.serial.config_port}get useRTSCTS(){return this.__internal__.serial.useRTSCTS}set useRTSCTS(e){this.__internal__.serial.useRTSCTS=e}get isConnected(){const e=this.__internal__.serial.connected,t=a(this,n,b).call(this,this.__internal__.serial.port);return e&&!t&&a(this,n,v).call(this,{error:"Port is closed, not readable or writable."}),this.__internal__.serial.connected=t,this.__internal__.serial.connected}get isConnecting(){return this.__internal__.serial.connecting}get isDisconnected(){const e=this.__internal__.serial.connected,t=a(this,n,b).call(this,this.__internal__.serial.port);return!e&&t&&(this.dispatch("serial:connected"),a(this,n,w).call(this,!1),u.$dispatchChange(this)),this.__internal__.serial.connected=t,!this.__internal__.serial.connected}get deviceNumber(){return this.__internal__.device_number}get uuid(){return this.__internal__.device.id}get typeDevice(){return this.__internal__.device.type}get queue(){return this.__internal__.serial.queue}get responseDelimited(){return this.__internal__.serial.response.delimited}set responseDelimited(e){if(typeof e!="boolean")throw new Error("responseDelimited must be a boolean");this.__internal__.serial.response.delimited=e}get responsePrefixLimited(){return this.__internal__.serial.response.prefixLimiter}set responsePrefixLimited(e){if(typeof e!="boolean")throw new Error("responsePrefixLimited must be a boolean");this.__internal__.serial.response.prefixLimiter=e}get responseSufixLimited(){return this.__internal__.serial.response.sufixLimiter}set responseSufixLimited(e){if(typeof e!="boolean")throw new Error("responseSufixLimited must be a boolean");this.__internal__.serial.response.sufixLimiter=e}get responseLimiter(){return this.__internal__.serial.response.limiter}set responseLimiter(e){if(typeof e!="string"&&!(e instanceof RegExp))throw new Error("responseLimiter must be a string or a RegExp");this.__internal__.serial.response.limiter=e}get fixedBytesMessage(){return this.__internal__.serial.response.length}set fixedBytesMessage(e){if(e!==null&&(typeof e!="number"||e<1))throw new Error("Invalid length for fixed bytes message");this.__internal__.serial.response.length=e}get timeoutBeforeResponseBytes(){return this.__internal__.serial.free_timeout_ms||50}set timeoutBeforeResponseBytes(e){if(e!==void 0&&(typeof e!="number"||e<1))throw new Error("Invalid timeout for response bytes");this.__internal__.serial.free_timeout_ms=e??50}get bypassSerialBytesConnection(){return this.__internal__.bypassSerialBytesConnection}set bypassSerialBytesConnection(e){if(typeof e!="boolean")throw new Error("bypassSerialBytesConnection must be a boolean");this.__internal__.bypassSerialBytesConnection=e}async timeout(e,t){this.__internal__.last_error.message="Operation response timed out.",this.__internal__.last_error.action=t,this.__internal__.last_error.code=e,this.__internal__.timeout.until_response&&(clearTimeout(this.__internal__.timeout.until_response),this.__internal__.timeout.until_response=0),t==="connect"?(this.__internal__.serial.connected=!1,this.dispatch("serial:reconnect",{}),u.$dispatchChange(this)):t==="connection:start"&&(await this.serialDisconnect(),this.__internal__.serial.connected=!1,this.__internal__.aux_port_connector+=1,u.$dispatchChange(this),await this.serialConnect()),this.dispatch("serial:timeout",{...this.__internal__.last_error,bytes:e,action:t})}async disconnect(e=null){await this.serialDisconnect(),a(this,n,v).call(this,e)}async connect(){return this.isConnected?!0:(this.__internal__.serial.aux_connecting="idle",new Promise((e,t)=>{V()||t("Web Serial not supported");const i=a(this,n,k).bind(this);this.on("serial:connecting",i);const s=setInterval(()=>{this.__internal__.serial.aux_connecting==="finished"?(clearInterval(s),this.__internal__.serial.aux_connecting="idle",this.off("serial:connecting",i),this.isConnected?e(!0):t(`${this.typeDevice} device ${this.deviceNumber} not connected`)):this.__internal__.serial.aux_connecting==="connecting"&&(this.__internal__.serial.aux_connecting="idle",this.dispatch("serial:connecting",{active:!0}))},100);this.serialConnect()}))}async serialDisconnect(){try{const e=this.__internal__.serial.reader,t=this.__internal__.serial.output_stream;e&&(await e.cancel().catch(s=>this.serialErrors(s)),await this.__internal__.serial.input_done),t&&(await t.getWriter().close(),await this.__internal__.serial.output_done),this.__internal__.serial.connected&&this.__internal__.serial&&this.__internal__.serial.port&&await this.__internal__.serial.port.close()}catch(e){this.serialErrors(e)}finally{this.__internal__.serial.reader=null,this.__internal__.serial.input_done=null,this.__internal__.serial.output_stream=null,this.__internal__.serial.output_done=null,this.__internal__.serial.connected=!1,this.__internal__.serial.port=null,u.$dispatchChange(this)}}getResponseAsArrayBuffer(){this.__internal__.serial.response.as="arraybuffer"}getResponseAsArrayHex(){this.__internal__.serial.response.as="hex"}getResponseAsUint8Array(){this.__internal__.serial.response.as="uint8"}getResponseAsString(){this.__internal__.serial.response.as="string"}async serialPortsSaved(e){const t=this.serialFilters;if(this.__internal__.aux_port_connector<e.length){const i=this.__internal__.aux_port_connector;this.__internal__.serial.port=e[i]}else this.__internal__.aux_port_connector=0,this.__internal__.serial.port=await navigator.serial.requestPort({filters:t});if(!this.__internal__.serial.port)throw new Error("Select another port please")}serialErrors(e){const t=e.toString().toLowerCase();switch(!0){case t.includes("must be handling a user gesture to show a permission request"):case t.includes("the port is closed."):case t.includes("the port is closed or is not writable"):case t.includes("the port is closed or is not readable"):case t.includes("the port is closed or is not readable/writable"):case t.includes("select another port please"):case t.includes("no port selected by the user"):case t.includes("this readable stream reader has been released and cannot be used to cancel its previous owner stream"):this.dispatch("serial:need-permission",{}),u.$dispatchChange(this);break;case t.includes("the port is already open."):case t.includes("failed to open serial port"):this.serialDisconnect().then(async()=>{this.__internal__.aux_port_connector+=1,await this.serialConnect()});break;case t.includes("cannot read properties of undefined (reading 'writable')"):case t.includes("cannot read properties of null (reading 'writable')"):case t.includes("cannot read property 'writable' of null"):case t.includes("cannot read property 'writable' of undefined"):this.serialDisconnect().then(async()=>{await this.serialConnect()});break;case t.includes("'close' on 'serialport': a call to close() is already in progress."):break;case t.includes("failed to execute 'open' on 'serialport': a call to open() is already in progress."):break;case t.includes("the port is already closed."):break;case t.includes("the device has been lost"):this.dispatch("serial:lost",{}),u.$dispatchChange(this);break;case t.includes("navigator.serial is undefined"):this.dispatch("serial:unsupported",{});break;default:console.error(e);break}this.dispatch("serial:error",e)}async serialConnect(){try{a(this,n,w).call(this,!0);const e=await a(this,n,I).call(this);if(e.length>0)await this.serialPortsSaved(e);else{const s=this.serialFilters;this.__internal__.serial.port=await navigator.serial.requestPort({filters:s})}const t=this.__internal__.serial.port;if(!t)throw new Error("No port selected by the user");await t.open(this.serialConfigPort);const i=this;t.onconnect=s=>{var c;i.dispatch("serial:connected",s),a(c=i,n,w).call(c,!1),u.$dispatchChange(this),i.__internal__.serial.queue.length>0&&i.dispatch("internal:queue",{})},t.ondisconnect=async()=>{await i.disconnect()},await A(this.__internal__.serial.delay_first_connection),this.__internal__.timeout.until_response=setTimeout(async()=>{await i.timeout(i.__internal__.serial.bytes_connection??[],"connection:start")},this.__internal__.time.response_connection),this.__internal__.serial.last_action="connect",await a(this,n,E).call(this,this.__internal__.serial.bytes_connection??[]),this.dispatch("serial:sent",{action:"connect",bytes:this.__internal__.serial.bytes_connection}),this.__internal__.auto_response&&a(this,n,g).call(this,this.__internal__.serial.auto_response),await a(this,n,q).call(this)}catch(e){a(this,n,w).call(this,!1),this.serialErrors(e)}}async serialForget(){return await a(this,n,N).call(this)}decToHex(e){return typeof e=="string"&&(e=parseInt(e,10)),e.toString(16)}hexToDec(e){return parseInt(e,16)}hexMaker(e="00",t=2){return e.toString().padStart(t,"0").toLowerCase()}add0x(e){const t=[];return e.forEach((i,s)=>{t[s]="0x"+i}),t}bytesToHex(e){return this.add0x(Array.from(e,t=>this.hexMaker(t)))}validateBytes(e){let t=new Uint8Array(0);if(e instanceof Uint8Array)t=e;else if(typeof e=="string")t=this.parseStringToTextEncoder(e);else if(Array.isArray(e)&&typeof e[0]=="string")t=this.stringArrayToUint8Array(e);else if(Array.isArray(e)&&typeof e[0]=="number")t=new Uint8Array(e);else throw new Error("Invalid data type");return t}async appendToQueue(e,t){const i=this.validateBytes(e);if(["connect","connection:start"].includes(t)){if(this.__internal__.serial.connected)return;await this.serialConnect();return}this.__internal__.serial.queue.push({bytes:i,action:t}),this.dispatch("internal:queue",{})}serialSetConnectionConstant(e=1){if(this.__internal__.bypassSerialBytesConnection)return this.__internal__.serial.bytes_connection;throw new Error(`Method not implemented 'serialSetConnectionConstant' to listen on channel ${e}`)}serialMessage(e){throw console.log(e),this.dispatch("serial:message",{code:e}),new Error("Method not implemented 'serialMessage'")}serialCorruptMessage(e){throw console.log(e),this.dispatch("serial:corrupt-message",{code:e}),new Error("Method not implemented 'serialCorruptMessage'")}clearSerialQueue(){this.__internal__.serial.queue=[]}sumHex(e){let t=0;return e.forEach(i=>{t+=parseInt(i,16)}),t.toString(16)}toString(){return JSON.stringify({__class:this.typeDevice,device_number:this.deviceNumber,uuid:this.uuid,connected:this.isConnected,connection:this.__internal__.serial.bytes_connection})}softReload(){a(this,n,Q).call(this),this.dispatch("serial:soft-reload",{})}async sendConnect(){if(!this.__internal__.serial.bytes_connection)throw new Error("No connection bytes defined");await this.appendToQueue(this.__internal__.serial.bytes_connection,"connect")}async sendCustomCode({code:e=[]}={code:[]}){if(!e)throw new Error("No data to send");this.__internal__.bypassSerialBytesConnection&&(this.__internal__.serial.bytes_connection=this.validateBytes(e)),await this.appendToQueue(e,"custom")}stringToArrayHex(e){return Array.from(e).map(t=>t.charCodeAt(0).toString(16))}stringToArrayBuffer(e,t=`
|
|
2
2
|
`){return this.parseStringToTextEncoder(e,t).buffer}parseStringToTextEncoder(e="",t=`
|
|
3
3
|
`){const i=new TextEncoder;return e+=t,i.encode(e)}parseStringToBytes(e="",t=`
|
|
4
|
-
`){const i=this.parseStringToTextEncoder(e,t);return Array.from(i).map(s=>s.toString(16))}parseUint8ToHex(e){return Array.from(e).map(t=>t.toString(16))}parseHexToUint8(e){return new Uint8Array(e.map(t=>parseInt(t,16)))}stringArrayToUint8Array(e){const t=[];return e.forEach(i=>{const s=i.replace("0x","");t.push(parseInt(s,16))}),new Uint8Array(t)}parseUint8ArrayToString(e){let t=new Uint8Array(0);e instanceof Uint8Array?t=e:t=this.stringArrayToUint8Array(e),e=this.parseUint8ToHex(t);const i=e.map(s=>parseInt(s,16));return this.__internal__.serial.response.replacer?String.fromCharCode(...i).replace(this.__internal__.serial.response.replacer,""):String.fromCharCode(...i)}hexToAscii(e){const t=e.toString();let i="";for(let s=0;s<t.length;s+=2)i+=String.fromCharCode(parseInt(t.substring(s,2),16));return i}asciiToHex(e){const t=[];for(let i=0,s=e.length;i<s;i++){const
|
|
4
|
+
`){const i=this.parseStringToTextEncoder(e,t);return Array.from(i).map(s=>s.toString(16))}parseUint8ToHex(e){return Array.from(e).map(t=>t.toString(16))}parseHexToUint8(e){return new Uint8Array(e.map(t=>parseInt(t,16)))}stringArrayToUint8Array(e){const t=[];return typeof e=="string"?this.parseStringToTextEncoder(e).buffer:(e.forEach(i=>{const s=i.replace("0x","");t.push(parseInt(s,16))}),new Uint8Array(t))}parseUint8ArrayToString(e){let t=new Uint8Array(0);e instanceof Uint8Array?t=e:t=this.stringArrayToUint8Array(e),e=this.parseUint8ToHex(t);const i=e.map(s=>parseInt(s,16));return this.__internal__.serial.response.replacer?String.fromCharCode(...i).replace(this.__internal__.serial.response.replacer,""):String.fromCharCode(...i)}hexToAscii(e){const t=e.toString();let i="";for(let s=0;s<t.length;s+=2)i+=String.fromCharCode(parseInt(t.substring(s,2),16));return i}asciiToHex(e){const t=[];for(let i=0,s=e.length;i<s;i++){const c=Number(e.charCodeAt(i)).toString(16);t.push(c)}return t.join("")}$checkAndDispatchConnection(){return this.isConnected}}n=new WeakSet,b=function(e){return!!(e&&e.readable&&e.writable)},v=function(e=null){this.__internal__.serial.connected=!1,this.__internal__.aux_port_connector=0,this.dispatch("serial:disconnected",e),u.$dispatchChange(this)},k=function(e){this.__internal__.serial.aux_connecting=e.detail.active?"connecting":"finished"},E=async function(e){const t=this.__internal__.serial.port;if(!t||t&&(!t.readable||!t.writable))throw a(this,n,v).call(this,{error:"Port is closed, not readable or writable."}),new Error("The port is closed or is not readable/writable");const i=this.validateBytes(e);if(this.useRTSCTS&&await a(this,n,D).call(this,t,5e3),t.writable===null)return;const s=t.writable.getWriter();await s.write(i),s.releaseLock()},D=async function(e,t=5e3){const i=Date.now();for(;;){if(Date.now()-i>t)throw new Error("Timeout waiting for clearToSend signal");const{clearToSend:s}=await e.getSignals();if(s)return;await A(100)}},g=function(e=new Uint8Array([]),t=!1){if(e&&e.length>0){const i=this.__internal__.serial.connected;if(this.__internal__.serial.connected=a(this,n,b).call(this,this.__internal__.serial.port),u.$dispatchChange(this),!i&&this.__internal__.serial.connected&&(this.dispatch("serial:connected"),a(this,n,w).call(this,!1)),this.__internal__.interval.reconnection&&(clearInterval(this.__internal__.interval.reconnection),this.__internal__.interval.reconnection=0),this.__internal__.timeout.until_response&&(clearTimeout(this.__internal__.timeout.until_response),this.__internal__.timeout.until_response=0),this.__internal__.serial.response.as==="hex")t?this.serialCorruptMessage(this.parseUint8ToHex(e)):this.serialMessage(this.parseUint8ToHex(e));else if(this.__internal__.serial.response.as==="uint8")t?this.serialCorruptMessage(e):this.serialMessage(e);else if(this.__internal__.serial.response.as==="string"){const s=this.parseUint8ArrayToString(e);if(this.__internal__.serial.response.limiter!==null){const c=s.split(this.__internal__.serial.response.limiter);for(const h in c)c[h]&&(t?this.serialCorruptMessage(c[h]):this.serialMessage(c[h]))}else t?this.serialCorruptMessage(s):this.serialMessage(s)}else{const s=this.stringToArrayBuffer(this.parseUint8ArrayToString(e));t?this.serialCorruptMessage(s):this.serialMessage(s)}}this.__internal__.serial.queue.length!==0&&this.dispatch("internal:queue",{})},I=async function(){const e=this.serialFilters,t=await navigator.serial.getPorts({filters:e});return e.length===0?t:t.filter(s=>{const c=s.getInfo();return e.some(h=>c.usbProductId===h.usbProductId&&c.usbVendorId===h.usbVendorId)}).filter(s=>!a(this,n,b).call(this,s))},P=function(e){if(e){const t=this.__internal__.serial.response.buffer,i=new Uint8Array(t.length+e.byteLength);i.set(t,0),i.set(new Uint8Array(e),t.length),this.__internal__.serial.response.buffer=i}},$=async function(){this.__internal__.serial.time_until_send_bytes&&(clearTimeout(this.__internal__.serial.time_until_send_bytes),this.__internal__.serial.time_until_send_bytes=0),this.__internal__.serial.time_until_send_bytes=setTimeout(()=>{this.__internal__.serial.response.buffer&&a(this,n,g).call(this,this.__internal__.serial.response.buffer),this.__internal__.serial.response.buffer=new Uint8Array(0)},this.__internal__.serial.free_timeout_ms||50)},R=async function(){const e=this.__internal__.serial.response.length;let t=this.__internal__.serial.response.buffer;if(this.__internal__.serial.time_until_send_bytes&&(clearTimeout(this.__internal__.serial.time_until_send_bytes),this.__internal__.serial.time_until_send_bytes=0),!(e===null||!t||t.length===0)){for(;t.length>=e;){const i=t.slice(0,e);a(this,n,g).call(this,i),t=t.slice(e)}this.__internal__.serial.response.buffer=t,t.length>0&&(this.__internal__.serial.time_until_send_bytes=setTimeout(()=>{a(this,n,g).call(this,this.__internal__.serial.response.buffer,!0)},this.__internal__.serial.free_timeout_ms||50))}},M=async function(){const{limiter:e,prefixLimiter:t=!1,sufixLimiter:i=!0}=this.__internal__.serial.response;if(!e)throw new Error("No limiter defined for delimited serial response");const s=this.__internal__.serial.response.buffer;if(!e||!s||s.length===0)return;this.__internal__.serial.time_until_send_bytes&&(clearTimeout(this.__internal__.serial.time_until_send_bytes),this.__internal__.serial.time_until_send_bytes=0);let h=new TextDecoder().decode(s);const C=[];if(typeof e=="string"){let p;if(t&&i)p=new RegExp(`${e}([^${e}]+)${e}`,"g");else if(t)p=new RegExp(`${e}([^${e}]*)`,"g");else if(i)p=new RegExp(`([^${e}]+)${e}`,"g");else return;let y,f=0;for(;(y=p.exec(h))!==null;)C.push(new TextEncoder().encode(y[1])),f=p.lastIndex;h=h.slice(f)}else if(e instanceof RegExp){let p,y=0;if(t&&i){const f=new RegExp(`${e.source}(.*?)${e.source}`,"g");for(;(p=f.exec(h))!==null;)C.push(new TextEncoder().encode(p[1])),y=f.lastIndex}else if(i)for(;(p=e.exec(h))!==null;){const f=p.index,T=h.slice(y,f);C.push(new TextEncoder().encode(T)),y=e.lastIndex}else if(t){const f=h.split(e);f.shift();for(const T of f)C.push(new TextEncoder().encode(T));h=""}h=h.slice(y)}for(const p of C)a(this,n,g).call(this,p);const L=new TextEncoder().encode(h);this.__internal__.serial.response.buffer=L,L.length>0&&(this.__internal__.serial.time_until_send_bytes=setTimeout(()=>{a(this,n,g).call(this,this.__internal__.serial.response.buffer,!0),this.__internal__.serial.response.buffer=new Uint8Array(0)},this.__internal__.serial.free_timeout_ms??50))},q=async function(){const e=this.__internal__.serial.port;if(!e||!e.readable)throw new Error("Port is not readable");const t=e.readable.getReader();this.__internal__.serial.reader=t;try{for(;this.__internal__.serial.keep_reading;){const{value:i,done:s}=await t.read();if(s)break;a(this,n,P).call(this,i),this.__internal__.serial.response.delimited?await a(this,n,M).call(this):this.__internal__.serial.response.length===null?await a(this,n,$).call(this):await a(this,n,R).call(this)}}catch(i){this.serialErrors(i)}finally{t.releaseLock(),this.__internal__.serial.keep_reading=!0,this.__internal__.serial.port&&await this.__internal__.serial.port.close()}},w=function(e){e!==this.__internal__.serial.connecting&&(this.__internal__.serial.connecting=e,e?this.dispatch("serial:connecting",{active:!0}):this.dispatch("serial:connecting",{active:!1}))},N=async function(){return typeof window>"u"?!1:"serial"in navigator&&"forget"in SerialPort.prototype&&this.__internal__.serial.port?(await this.__internal__.serial.port.forget(),!0):!1},O=function(){["serial:connected","serial:connecting","serial:reconnect","serial:timeout","serial:disconnected","serial:sent","serial:soft-reload","serial:message","serial:corrupt-message","unknown","serial:need-permission","serial:lost","serial:unsupported","serial:error","debug"].forEach(t=>{this.serialRegisterAvailableListener(t)})},F=function(){const e=this;this.on("internal:queue",async()=>{var t;await a(t=e,n,j).call(t)}),a(this,n,H).call(this)},H=function(){const e=this;navigator.serial.addEventListener("connect",async()=>{e.isDisconnected&&await e.serialConnect().catch(()=>{})})},j=async function(){if(!a(this,n,b).call(this,this.__internal__.serial.port)){a(this,n,v).call(this,{error:"Port is closed, not readable or writable."}),await this.serialConnect();return}if(this.__internal__.timeout.until_response||this.__internal__.serial.queue.length===0)return;const e=this.__internal__.serial.queue[0];let t=this.__internal__.time.response_general;if(e.action==="connect"&&(t=this.__internal__.time.response_connection),this.__internal__.timeout.until_response=setTimeout(async()=>{await this.timeout(e.bytes,e.action)},t),this.__internal__.serial.last_action=e.action??"unknown",await a(this,n,E).call(this,e.bytes),this.dispatch("serial:sent",{action:e.action,bytes:e.bytes}),this.__internal__.auto_response){let s=new Uint8Array(0);try{s=this.validateBytes(this.__internal__.serial.auto_response)}catch(c){this.serialErrors(c)}a(this,n,g).call(this,s)}const i=[...this.__internal__.serial.queue];this.__internal__.serial.queue=i.splice(1)},W=function(e=1){this.__internal__.device_number=e,!this.__internal__.bypassSerialBytesConnection&&(this.__internal__.serial.bytes_connection=this.serialSetConnectionConstant(e))},Q=function(){this.__internal__.last_error={message:null,action:null,code:null,no_code:0}},l.Core=z,l.Devices=u,l.Dispatcher=d,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webserial-core",
|
|
3
3
|
"description": "Webserial Core to easy connections with serial devices",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.9",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "danidoble",
|
|
@@ -45,13 +45,13 @@
|
|
|
45
45
|
"format": "prettier --write ./lib/**/*.ts"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@eslint/js": "^9.
|
|
48
|
+
"@eslint/js": "^9.29.0",
|
|
49
49
|
"@types/w3c-web-serial": "^1.0.8",
|
|
50
|
-
"eslint": "^9.
|
|
50
|
+
"eslint": "^9.29.0",
|
|
51
51
|
"globals": "^15.15.0",
|
|
52
52
|
"prettier": "3.4.2",
|
|
53
53
|
"typescript": "~5.7.3",
|
|
54
|
-
"typescript-eslint": "^8.
|
|
54
|
+
"typescript-eslint": "^8.35.0",
|
|
55
55
|
"vite": "^6.3.5"
|
|
56
56
|
},
|
|
57
57
|
"publishConfig": {
|