@yume-chan/adb-daemon-webusb 0.0.20
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/CHANGELOG.json +157 -0
- package/CHANGELOG.md +89 -0
- package/LICENSE +21 -0
- package/README.md +130 -0
- package/esm/connection.d.ts +49 -0
- package/esm/connection.d.ts.map +1 -0
- package/esm/connection.js +230 -0
- package/esm/connection.js.map +1 -0
- package/esm/device.d.ts +45 -0
- package/esm/device.d.ts.map +1 -0
- package/esm/device.js +213 -0
- package/esm/device.js.map +1 -0
- package/esm/index.d.ts +5 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +5 -0
- package/esm/index.js.map +1 -0
- package/esm/manager.d.ts +45 -0
- package/esm/manager.d.ts.map +1 -0
- package/esm/manager.js +92 -0
- package/esm/manager.js.map +1 -0
- package/esm/utils.d.ts +13 -0
- package/esm/utils.d.ts.map +1 -0
- package/esm/utils.js +24 -0
- package/esm/utils.js.map +1 -0
- package/esm/watcher.d.ts +9 -0
- package/esm/watcher.d.ts.map +1 -0
- package/esm/watcher.js +21 -0
- package/esm/watcher.js.map +1 -0
- package/package.json +46 -0
- package/src/device.ts +328 -0
- package/src/index.ts +4 -0
- package/src/manager.ts +110 -0
- package/src/utils.ts +46 -0
- package/src/watcher.ts +28 -0
- package/tsconfig.build.json +23 -0
- package/tsconfig.build.tsbuildinfo +1 -0
package/src/device.ts
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AdbDaemonDevice,
|
|
3
|
+
AdbPacketData,
|
|
4
|
+
AdbPacketInit,
|
|
5
|
+
} from "@yume-chan/adb";
|
|
6
|
+
import {
|
|
7
|
+
AdbPacketHeader,
|
|
8
|
+
AdbPacketSerializeStream,
|
|
9
|
+
unreachable,
|
|
10
|
+
} from "@yume-chan/adb";
|
|
11
|
+
import type {
|
|
12
|
+
Consumable,
|
|
13
|
+
ReadableWritablePair,
|
|
14
|
+
WritableStream,
|
|
15
|
+
} from "@yume-chan/stream-extra";
|
|
16
|
+
import {
|
|
17
|
+
ConsumableWritableStream,
|
|
18
|
+
DuplexStreamFactory,
|
|
19
|
+
ReadableStream,
|
|
20
|
+
pipeFrom,
|
|
21
|
+
} from "@yume-chan/stream-extra";
|
|
22
|
+
import type { ExactReadable } from "@yume-chan/struct";
|
|
23
|
+
import { EMPTY_UINT8_ARRAY } from "@yume-chan/struct";
|
|
24
|
+
|
|
25
|
+
import type { AdbDeviceFilter } from "./utils.js";
|
|
26
|
+
import { findUsbAlternateInterface, isErrorName } from "./utils.js";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The default filter for ADB devices, as defined by Google.
|
|
30
|
+
*/
|
|
31
|
+
export const ADB_DEFAULT_DEVICE_FILTER = {
|
|
32
|
+
classCode: 0xff,
|
|
33
|
+
subclassCode: 0x42,
|
|
34
|
+
protocolCode: 1,
|
|
35
|
+
} as const satisfies AdbDeviceFilter;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Find the first pair of input and output endpoints from an alternate interface.
|
|
39
|
+
*
|
|
40
|
+
* ADB interface only has two endpoints, one for input and one for output.
|
|
41
|
+
*/
|
|
42
|
+
function findUsbEndpoints(endpoints: USBEndpoint[]) {
|
|
43
|
+
if (endpoints.length === 0) {
|
|
44
|
+
throw new Error("No endpoints given");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let inEndpoint: USBEndpoint | undefined;
|
|
48
|
+
let outEndpoint: USBEndpoint | undefined;
|
|
49
|
+
|
|
50
|
+
for (const endpoint of endpoints) {
|
|
51
|
+
switch (endpoint.direction) {
|
|
52
|
+
case "in":
|
|
53
|
+
inEndpoint = endpoint;
|
|
54
|
+
if (outEndpoint) {
|
|
55
|
+
return { inEndpoint, outEndpoint };
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
case "out":
|
|
59
|
+
outEndpoint = endpoint;
|
|
60
|
+
if (inEndpoint) {
|
|
61
|
+
return { inEndpoint, outEndpoint };
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!inEndpoint) {
|
|
68
|
+
throw new Error("No input endpoint found.");
|
|
69
|
+
}
|
|
70
|
+
if (!outEndpoint) {
|
|
71
|
+
throw new Error("No output endpoint found.");
|
|
72
|
+
}
|
|
73
|
+
throw new Error("unreachable");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
class Uint8ArrayExactReadable implements ExactReadable {
|
|
77
|
+
#data: Uint8Array;
|
|
78
|
+
#position: number;
|
|
79
|
+
|
|
80
|
+
public get position() {
|
|
81
|
+
return this.#position;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public constructor(data: Uint8Array) {
|
|
85
|
+
this.#data = data;
|
|
86
|
+
this.#position = 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public readExactly(length: number): Uint8Array {
|
|
90
|
+
const result = this.#data.subarray(
|
|
91
|
+
this.#position,
|
|
92
|
+
this.#position + length
|
|
93
|
+
);
|
|
94
|
+
this.#position += length;
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export class AdbDaemonWebUsbConnection
|
|
100
|
+
implements ReadableWritablePair<AdbPacketData, Consumable<AdbPacketInit>>
|
|
101
|
+
{
|
|
102
|
+
#readable: ReadableStream<AdbPacketData>;
|
|
103
|
+
public get readable() {
|
|
104
|
+
return this.#readable;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
#writable: WritableStream<Consumable<AdbPacketInit>>;
|
|
108
|
+
public get writable() {
|
|
109
|
+
return this.#writable;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public constructor(
|
|
113
|
+
device: USBDevice,
|
|
114
|
+
inEndpoint: USBEndpoint,
|
|
115
|
+
outEndpoint: USBEndpoint,
|
|
116
|
+
usbManager: USB
|
|
117
|
+
) {
|
|
118
|
+
let closed = false;
|
|
119
|
+
|
|
120
|
+
const duplex = new DuplexStreamFactory<
|
|
121
|
+
AdbPacketData,
|
|
122
|
+
Consumable<Uint8Array>
|
|
123
|
+
>({
|
|
124
|
+
close: async () => {
|
|
125
|
+
try {
|
|
126
|
+
closed = true;
|
|
127
|
+
await device.close();
|
|
128
|
+
} catch {
|
|
129
|
+
/* device may have already disconnected */
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
dispose: () => {
|
|
133
|
+
closed = true;
|
|
134
|
+
usbManager.removeEventListener(
|
|
135
|
+
"disconnect",
|
|
136
|
+
handleUsbDisconnect
|
|
137
|
+
);
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
function handleUsbDisconnect(e: USBConnectionEvent) {
|
|
142
|
+
if (e.device === device) {
|
|
143
|
+
duplex.dispose().catch(unreachable);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
usbManager.addEventListener("disconnect", handleUsbDisconnect);
|
|
148
|
+
|
|
149
|
+
this.#readable = duplex.wrapReadable(
|
|
150
|
+
new ReadableStream<AdbPacketData>({
|
|
151
|
+
async pull(controller) {
|
|
152
|
+
try {
|
|
153
|
+
// The `length` argument in `transferIn` must not be smaller than what the device sent,
|
|
154
|
+
// otherwise it will return `babble` status without any data.
|
|
155
|
+
// ADB daemon sends each packet in two parts, the 24-byte header and the payload.
|
|
156
|
+
const result = await device.transferIn(
|
|
157
|
+
inEndpoint.endpointNumber,
|
|
158
|
+
24
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
// TODO: webusb: handle `babble` by discarding the data and receive again
|
|
162
|
+
|
|
163
|
+
// Per spec, the `result.data` always covers the whole `buffer`.
|
|
164
|
+
const buffer = new Uint8Array(result.data!.buffer);
|
|
165
|
+
const stream = new Uint8ArrayExactReadable(buffer);
|
|
166
|
+
|
|
167
|
+
// Add `payload` field to its type, it's assigned below.
|
|
168
|
+
const packet = AdbPacketHeader.deserialize(
|
|
169
|
+
stream
|
|
170
|
+
) as AdbPacketHeader & { payload: Uint8Array };
|
|
171
|
+
if (packet.payloadLength !== 0) {
|
|
172
|
+
const result = await device.transferIn(
|
|
173
|
+
inEndpoint.endpointNumber,
|
|
174
|
+
packet.payloadLength
|
|
175
|
+
);
|
|
176
|
+
packet.payload = new Uint8Array(
|
|
177
|
+
result.data!.buffer
|
|
178
|
+
);
|
|
179
|
+
} else {
|
|
180
|
+
packet.payload = EMPTY_UINT8_ARRAY;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
controller.enqueue(packet);
|
|
184
|
+
} catch (e) {
|
|
185
|
+
// On Windows, disconnecting the device will cause `NetworkError` to be thrown,
|
|
186
|
+
// even before the `disconnect` event is fired.
|
|
187
|
+
// We need to wait a little bit and check if the device is still connected.
|
|
188
|
+
// https://github.com/WICG/webusb/issues/219
|
|
189
|
+
if (isErrorName(e, "NetworkError")) {
|
|
190
|
+
await new Promise<void>((resolve) => {
|
|
191
|
+
setTimeout(() => {
|
|
192
|
+
resolve();
|
|
193
|
+
}, 100);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
if (closed) {
|
|
197
|
+
controller.close();
|
|
198
|
+
} else {
|
|
199
|
+
throw e;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
throw e;
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
})
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
const zeroMask = outEndpoint.packetSize - 1;
|
|
210
|
+
this.#writable = pipeFrom(
|
|
211
|
+
duplex.createWritable(
|
|
212
|
+
new ConsumableWritableStream({
|
|
213
|
+
write: async (chunk) => {
|
|
214
|
+
try {
|
|
215
|
+
await device.transferOut(
|
|
216
|
+
outEndpoint.endpointNumber,
|
|
217
|
+
chunk
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
// In USB protocol, a not-full packet indicates the end of a transfer.
|
|
221
|
+
// If the payload size is a multiple of the packet size,
|
|
222
|
+
// we need to send an empty packet to indicate the end,
|
|
223
|
+
// so the OS will send it to the device immediately.
|
|
224
|
+
if (
|
|
225
|
+
zeroMask &&
|
|
226
|
+
(chunk.byteLength & zeroMask) === 0
|
|
227
|
+
) {
|
|
228
|
+
await device.transferOut(
|
|
229
|
+
outEndpoint.endpointNumber,
|
|
230
|
+
EMPTY_UINT8_ARRAY
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
} catch (e) {
|
|
234
|
+
if (closed) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
throw e;
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
})
|
|
241
|
+
),
|
|
242
|
+
new AdbPacketSerializeStream()
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export class AdbDaemonWebUsbDevice implements AdbDaemonDevice {
|
|
248
|
+
#filters: AdbDeviceFilter[];
|
|
249
|
+
#usbManager: USB;
|
|
250
|
+
|
|
251
|
+
#raw: USBDevice;
|
|
252
|
+
public get raw() {
|
|
253
|
+
return this.#raw;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
public get serial(): string {
|
|
257
|
+
return this.#raw.serialNumber!;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
public get name(): string {
|
|
261
|
+
return this.#raw.productName!;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Create a new instance of `AdbDaemonWebUsbConnection` using a specified `USBDevice` instance
|
|
266
|
+
*
|
|
267
|
+
* @param device The `USBDevice` instance obtained elsewhere.
|
|
268
|
+
* @param filters The filters to use when searching for ADB interface. Defaults to {@link ADB_DEFAULT_DEVICE_FILTER}.
|
|
269
|
+
*/
|
|
270
|
+
public constructor(
|
|
271
|
+
device: USBDevice,
|
|
272
|
+
filters: AdbDeviceFilter[] = [ADB_DEFAULT_DEVICE_FILTER],
|
|
273
|
+
usbManager: USB
|
|
274
|
+
) {
|
|
275
|
+
this.#raw = device;
|
|
276
|
+
this.#filters = filters;
|
|
277
|
+
this.#usbManager = usbManager;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Claim the device and create a pair of `AdbPacket` streams to the ADB interface.
|
|
282
|
+
* @returns The pair of `AdbPacket` streams.
|
|
283
|
+
*/
|
|
284
|
+
public async connect(): Promise<
|
|
285
|
+
ReadableWritablePair<AdbPacketData, Consumable<AdbPacketInit>>
|
|
286
|
+
> {
|
|
287
|
+
if (!this.#raw.opened) {
|
|
288
|
+
await this.#raw.open();
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const { configuration, interface_, alternate } =
|
|
292
|
+
findUsbAlternateInterface(this.#raw, this.#filters);
|
|
293
|
+
|
|
294
|
+
if (
|
|
295
|
+
this.#raw.configuration?.configurationValue !==
|
|
296
|
+
configuration.configurationValue
|
|
297
|
+
) {
|
|
298
|
+
// Note: Switching configuration is not supported on Windows,
|
|
299
|
+
// but Android devices should always expose ADB function at the first (default) configuration.
|
|
300
|
+
await this.#raw.selectConfiguration(
|
|
301
|
+
configuration.configurationValue
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (!interface_.claimed) {
|
|
306
|
+
await this.#raw.claimInterface(interface_.interfaceNumber);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if (
|
|
310
|
+
interface_.alternate.alternateSetting !== alternate.alternateSetting
|
|
311
|
+
) {
|
|
312
|
+
await this.#raw.selectAlternateInterface(
|
|
313
|
+
interface_.interfaceNumber,
|
|
314
|
+
alternate.alternateSetting
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const { inEndpoint, outEndpoint } = findUsbEndpoints(
|
|
319
|
+
alternate.endpoints
|
|
320
|
+
);
|
|
321
|
+
return new AdbDaemonWebUsbConnection(
|
|
322
|
+
this.#raw,
|
|
323
|
+
inEndpoint,
|
|
324
|
+
outEndpoint,
|
|
325
|
+
this.#usbManager
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
}
|
package/src/index.ts
ADDED
package/src/manager.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { ADB_DEFAULT_DEVICE_FILTER, AdbDaemonWebUsbDevice } from "./device.js";
|
|
2
|
+
import type { AdbDeviceFilter } from "./utils.js";
|
|
3
|
+
import { findUsbAlternateInterface, isErrorName } from "./utils.js";
|
|
4
|
+
|
|
5
|
+
export class AdbDaemonWebUsbDeviceManager {
|
|
6
|
+
/**
|
|
7
|
+
* Gets the instance of {@link AdbDaemonWebUsbDeviceManager} using browser WebUSB implementation.
|
|
8
|
+
*
|
|
9
|
+
* May be `undefined` if current runtime does not support WebUSB.
|
|
10
|
+
*/
|
|
11
|
+
public static readonly BROWSER =
|
|
12
|
+
typeof globalThis.navigator !== "undefined" &&
|
|
13
|
+
!!globalThis.navigator.usb
|
|
14
|
+
? new AdbDaemonWebUsbDeviceManager(globalThis.navigator.usb)
|
|
15
|
+
: undefined;
|
|
16
|
+
|
|
17
|
+
#usbManager: USB;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Create a new instance of {@link AdbDaemonWebUsbDeviceManager} using the specified WebUSB implementation.
|
|
21
|
+
* @param usbManager A WebUSB compatible interface.
|
|
22
|
+
*/
|
|
23
|
+
public constructor(usbManager: USB) {
|
|
24
|
+
this.#usbManager = usbManager;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Request access to a connected device.
|
|
29
|
+
* This is a convince method for `usb.requestDevice()`.
|
|
30
|
+
* @param filters
|
|
31
|
+
* The filters to apply to the device list.
|
|
32
|
+
*
|
|
33
|
+
* It must have `classCode`, `subclassCode` and `protocolCode` fields for selecting the ADB interface,
|
|
34
|
+
* but might also have `vendorId`, `productId` or `serialNumber` fields to limit the displayed device list.
|
|
35
|
+
*
|
|
36
|
+
* Defaults to {@link ADB_DEFAULT_DEVICE_FILTER}.
|
|
37
|
+
* @returns An {@link AdbDaemonWebUsbDevice} instance if the user selected a device,
|
|
38
|
+
* or `undefined` if the user cancelled the device picker.
|
|
39
|
+
*/
|
|
40
|
+
public async requestDevice(
|
|
41
|
+
filters: AdbDeviceFilter[] = [ADB_DEFAULT_DEVICE_FILTER]
|
|
42
|
+
): Promise<AdbDaemonWebUsbDevice | undefined> {
|
|
43
|
+
try {
|
|
44
|
+
const device = await this.#usbManager.requestDevice({
|
|
45
|
+
filters,
|
|
46
|
+
});
|
|
47
|
+
return new AdbDaemonWebUsbDevice(device, filters, this.#usbManager);
|
|
48
|
+
} catch (e) {
|
|
49
|
+
// No device selected
|
|
50
|
+
if (isErrorName(e, "NotFoundError")) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
throw e;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Get all connected and authenticated devices.
|
|
60
|
+
* This is a convince method for `usb.getDevices()`.
|
|
61
|
+
* @param filters
|
|
62
|
+
* The filters to apply to the device list.
|
|
63
|
+
*
|
|
64
|
+
* It must have `classCode`, `subclassCode` and `protocolCode` fields for selecting the ADB interface,
|
|
65
|
+
* but might also have `vendorId`, `productId` or `serialNumber` fields to limit the device list.
|
|
66
|
+
*
|
|
67
|
+
* Defaults to {@link ADB_DEFAULT_DEVICE_FILTER}.
|
|
68
|
+
* @returns An array of {@link AdbDaemonWebUsbDevice} instances for all connected and authenticated devices.
|
|
69
|
+
*/
|
|
70
|
+
public async getDevices(
|
|
71
|
+
filters: AdbDeviceFilter[] = [ADB_DEFAULT_DEVICE_FILTER]
|
|
72
|
+
): Promise<AdbDaemonWebUsbDevice[]> {
|
|
73
|
+
const devices = await this.#usbManager.getDevices();
|
|
74
|
+
return devices
|
|
75
|
+
.filter((device) => {
|
|
76
|
+
for (const filter of filters) {
|
|
77
|
+
if (
|
|
78
|
+
"vendorId" in filter &&
|
|
79
|
+
device.vendorId !== filter.vendorId
|
|
80
|
+
) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (
|
|
84
|
+
"productId" in filter &&
|
|
85
|
+
device.productId !== filter.productId
|
|
86
|
+
) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (
|
|
90
|
+
"serialNumber" in filter &&
|
|
91
|
+
device.serialNumber !== filter.serialNumber
|
|
92
|
+
) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
findUsbAlternateInterface(device, filters);
|
|
98
|
+
return true;
|
|
99
|
+
} catch {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
})
|
|
105
|
+
.map(
|
|
106
|
+
(device) =>
|
|
107
|
+
new AdbDaemonWebUsbDevice(device, filters, this.#usbManager)
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function isErrorName(e: unknown, name: string): boolean {
|
|
2
|
+
// node-usb package doesn't use `DOMException`,
|
|
3
|
+
// so use a looser check
|
|
4
|
+
// https://github.com/node-usb/node-usb/issues/573
|
|
5
|
+
return (
|
|
6
|
+
typeof e === "object" && e !== null && "name" in e && e.name === name
|
|
7
|
+
);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* `classCode`, `subclassCode` and `protocolCode` are required
|
|
12
|
+
* for selecting correct USB configuration and interface.
|
|
13
|
+
*/
|
|
14
|
+
export type AdbDeviceFilter = USBDeviceFilter &
|
|
15
|
+
Required<
|
|
16
|
+
Pick<USBDeviceFilter, "classCode" | "subclassCode" | "protocolCode">
|
|
17
|
+
>;
|
|
18
|
+
|
|
19
|
+
function alternateMatchesFilter(
|
|
20
|
+
alternate: USBAlternateInterface,
|
|
21
|
+
filters: AdbDeviceFilter[]
|
|
22
|
+
) {
|
|
23
|
+
return filters.some(
|
|
24
|
+
(filter) =>
|
|
25
|
+
alternate.interfaceClass === filter.classCode &&
|
|
26
|
+
alternate.interfaceSubclass === filter.subclassCode &&
|
|
27
|
+
alternate.interfaceProtocol === filter.protocolCode
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function findUsbAlternateInterface(
|
|
32
|
+
device: USBDevice,
|
|
33
|
+
filters: AdbDeviceFilter[]
|
|
34
|
+
) {
|
|
35
|
+
for (const configuration of device.configurations) {
|
|
36
|
+
for (const interface_ of configuration.interfaces) {
|
|
37
|
+
for (const alternate of interface_.alternates) {
|
|
38
|
+
if (alternateMatchesFilter(alternate, filters)) {
|
|
39
|
+
return { configuration, interface_, alternate };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
throw new Error("No matched alternate interface found");
|
|
46
|
+
}
|
package/src/watcher.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class AdbDaemonWebUsbDeviceWatcher {
|
|
2
|
+
#callback: (newDeviceSerial?: string) => void;
|
|
3
|
+
#usbManager: USB;
|
|
4
|
+
|
|
5
|
+
public constructor(callback: (newDeviceSerial?: string) => void, usb: USB) {
|
|
6
|
+
this.#callback = callback;
|
|
7
|
+
this.#usbManager = usb;
|
|
8
|
+
|
|
9
|
+
this.#usbManager.addEventListener("connect", this.handleConnect);
|
|
10
|
+
this.#usbManager.addEventListener("disconnect", this.handleDisconnect);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public dispose(): void {
|
|
14
|
+
this.#usbManager.removeEventListener("connect", this.handleConnect);
|
|
15
|
+
this.#usbManager.removeEventListener(
|
|
16
|
+
"disconnect",
|
|
17
|
+
this.handleDisconnect
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
private handleConnect = (e: USBConnectionEvent) => {
|
|
22
|
+
this.#callback(e.device.serialNumber);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
private handleDisconnect = () => {
|
|
26
|
+
this.#callback();
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./node_modules/@yume-chan/tsconfig/tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"lib": [
|
|
5
|
+
"ESNext",
|
|
6
|
+
"DOM"
|
|
7
|
+
],
|
|
8
|
+
"types": [
|
|
9
|
+
"w3c-web-usb",
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"references": [
|
|
13
|
+
{
|
|
14
|
+
"path": "../adb/tsconfig.build.json"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"path": "../stream-extra/tsconfig.build.json"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"path": "../struct/tsconfig.build.json"
|
|
21
|
+
},
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"program":{"fileNames":["../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es5.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2016.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2017.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2018.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2019.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2020.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2021.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2022.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2023.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.esnext.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.dom.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.core.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2017.object.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2017.string.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2019.array.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2019.object.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2019.string.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2020.date.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2020.string.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2020.number.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2021.string.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2022.array.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2022.error.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2022.object.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2022.string.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.es2023.array.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.decorators.d.ts","../../common/temp/node_modules/.pnpm/typescript@5.0.4/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../common/temp/node_modules/.pnpm/tslib@2.5.2/node_modules/tslib/tslib.d.ts","../../common/temp/node_modules/.pnpm/tslib@2.5.2/node_modules/tslib/modules/index.d.ts","../struct/esm/basic/options.d.ts","../struct/esm/basic/struct-value.d.ts","../struct/esm/basic/field-value.d.ts","../struct/esm/utils.d.ts","../struct/esm/basic/stream.d.ts","../struct/esm/basic/definition.d.ts","../struct/esm/basic/index.d.ts","../struct/esm/types/bigint.d.ts","../struct/esm/types/buffer/base.d.ts","../struct/esm/types/buffer/fixed-length.d.ts","../struct/esm/types/buffer/variable-length.d.ts","../struct/esm/types/buffer/index.d.ts","../struct/esm/types/number.d.ts","../struct/esm/types/index.d.ts","../struct/esm/struct.d.ts","../struct/esm/sync-promise.d.ts","../struct/esm/index.d.ts","../../common/temp/node_modules/.pnpm/web-streams-polyfill@4.0.0-beta.3/node_modules/web-streams-polyfill/types/ponyfill.d.ts","../stream-extra/esm/stream.d.ts","../stream-extra/esm/buffered.d.ts","../stream-extra/esm/buffered-transform.d.ts","../stream-extra/esm/consumable.d.ts","../stream-extra/esm/decode-utf8.d.ts","../stream-extra/esm/distribution.d.ts","../stream-extra/esm/wrap-readable.d.ts","../stream-extra/esm/duplex.d.ts","../stream-extra/esm/gather-string.d.ts","../stream-extra/esm/inspect.d.ts","../stream-extra/esm/pipe-from.d.ts","../stream-extra/esm/push-readable.d.ts","../stream-extra/esm/split-string.d.ts","../stream-extra/esm/struct-deserialize.d.ts","../stream-extra/esm/struct-serialize.d.ts","../stream-extra/esm/wrap-writable.d.ts","../stream-extra/esm/index.d.ts","../adb/esm/features.d.ts","../adb/esm/banner.d.ts","../event/esm/disposable.d.ts","../event/esm/event.d.ts","../event/esm/event-emitter.d.ts","../event/esm/utils.d.ts","../event/esm/index.d.ts","../adb/esm/commands/base.d.ts","../adb/esm/commands/framebuffer.d.ts","../adb/esm/commands/power.d.ts","../adb/esm/commands/reverse.d.ts","../adb/esm/commands/subprocess/protocols/types.d.ts","../adb/esm/commands/subprocess/protocols/none.d.ts","../adb/esm/commands/subprocess/protocols/shell.d.ts","../adb/esm/commands/subprocess/protocols/index.d.ts","../adb/esm/commands/subprocess/command.d.ts","../adb/esm/commands/subprocess/utils.d.ts","../adb/esm/commands/subprocess/index.d.ts","../adb/esm/commands/sync/response.d.ts","../adb/esm/utils/auto-reset-event.d.ts","../adb/esm/utils/base64.d.ts","../adb/esm/utils/conditional-variable.d.ts","../adb/esm/utils/hex.d.ts","../adb/esm/utils/no-op.d.ts","../adb/esm/utils/index.d.ts","../adb/esm/commands/sync/socket.d.ts","../adb/esm/commands/sync/stat.d.ts","../adb/esm/commands/sync/list.d.ts","../adb/esm/commands/sync/pull.d.ts","../adb/esm/commands/sync/request.d.ts","../adb/esm/commands/sync/push.d.ts","../adb/esm/commands/sync/sync.d.ts","../adb/esm/commands/sync/index.d.ts","../adb/esm/commands/tcpip.d.ts","../adb/esm/commands/index.d.ts","../adb/esm/adb.d.ts","../adb/esm/daemon/packet.d.ts","../adb/esm/daemon/auth.d.ts","../adb/esm/daemon/crypto.d.ts","../adb/esm/daemon/device.d.ts","../adb/esm/daemon/dispatcher.d.ts","../adb/esm/daemon/socket.d.ts","../adb/esm/daemon/transport.d.ts","../adb/esm/daemon/index.d.ts","../adb/esm/server/transport.d.ts","../adb/esm/server/client.d.ts","../adb/esm/server/index.d.ts","../adb/esm/index.d.ts","./src/utils.ts","./src/device.ts","./src/manager.ts","./src/watcher.ts","./src/index.ts","../../common/temp/node_modules/.pnpm/@types+w3c-web-usb@1.0.6/node_modules/@types/w3c-web-usb/index.d.ts"],"fileInfos":[{"version":"6a6b471e7e43e15ef6f8fe617a22ce4ecb0e34efa6c3dfcfe7cebd392bcca9d2","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","impliedFormat":1},{"version":"27147504487dc1159369da4f4da8a26406364624fa9bc3db632f7d94a5bae2c3","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"f4e736d6c8d69ae5b3ab0ddfcaa3dc365c3e76909d6660af5b4e979b3934ac20","impliedFormat":1},{"version":"eeeb3aca31fbadef8b82502484499dfd1757204799a6f5b33116201c810676ec","impliedFormat":1},{"version":"fcd3ecc9f764f06f4d5c467677f4f117f6abf49dee6716283aa204ff1162498b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5114a95689b63f96b957e00216bc04baf9e1a1782aa4d8ee7e5e9acbf768e301","affectsGlobalScope":true,"impliedFormat":1},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab22100fdd0d24cfc2cc59d0a00fc8cf449830d9c4030dc54390a46bd562e929","affectsGlobalScope":true,"impliedFormat":1},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"36ae84ccc0633f7c0787bc6108386c8b773e95d3b052d9464a99cd9b8795fbec","affectsGlobalScope":true,"impliedFormat":1},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true,"impliedFormat":1},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true,"impliedFormat":1},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true,"impliedFormat":1},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true,"impliedFormat":1},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true,"impliedFormat":1},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true,"impliedFormat":1},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"709efdae0cb5df5f49376cde61daacc95cdd44ae4671da13a540da5088bf3f30","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"61ed9b6d07af959e745fb11f9593ecd743b279418cc8a99448ea3cd5f3b3eb22","affectsGlobalScope":true,"impliedFormat":1},{"version":"038a2f66a34ee7a9c2fbc3584c8ab43dff2995f8c68e3f566f4c300d2175e31e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c92f2c27b06c1a41b88f6db8299205aee52c2a2943f7ed29bd585977f254e8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7feb7967c6c6003e11f49efa8f5de989484e0a6ba2e5a6c41b55f8b8bd85dba","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"b9ea5778ff8b50d7c04c9890170db34c26a5358cccba36844fe319f50a43a61a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"50d53ccd31f6667aff66e3d62adf948879a3a16f05d89882d1188084ee415bbc","affectsGlobalScope":true,"impliedFormat":1},{"version":"25de46552b782d43cb7284df22fe2a265de387cf0248b747a7a1b647d81861f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true,"impliedFormat":1},{"version":"189c0703923150aa30673fa3de411346d727cc44a11c75d05d7cf9ef095daa22","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1c9fe42b65437a61104e601eb298c5c859fb522b483f1bdb700eed67a16f980","impliedFormat":1},{"version":"0734467ebd328b91af92eff2af9c97f6079bc4736c4992f8a5e47123680cf21b","impliedFormat":99},{"version":"7ceac7d7800ef7065908464aba0a009e9a03ff95f177a44f999687bdf10d039f","impliedFormat":99},{"version":"6043ab81faab77b975cb2a8457cc28c3b6f90a766cbbd27914da686bc41c83a0","impliedFormat":99},{"version":"613051be0c04c0fadf883f5ec01dcb0a4639ac92d9e2c12a222680c91b374595","impliedFormat":99},{"version":"a740a1e2d889fc4344fbb49a7f8b02ee664850be5cdcf029ace8ceb4316623db","impliedFormat":99},{"version":"ffe3c0472cf0ad60edbf5037319135c645bd92e7acbf403d72101df3598258e0","impliedFormat":99},{"version":"64ebe41006e87ea8b5e9b3acf048018b5226c4b08c6575526a76f6801143bf90","impliedFormat":99},{"version":"5af3b8b1a9063e033fc1e32a3e95956f5f5e22548d5ccca628b1ab87e42087d1","impliedFormat":99},{"version":"2414e378fb9e46fe36d8a0f4fb7af126441078299c03a46096713b03a5f6571d","impliedFormat":99},{"version":"1ed47fe653ec1bbcbd8ed241873938642755f2917f9e9a2e78daef11519f0745","impliedFormat":99},{"version":"4e74287ad61c1544e88339e78a4da19cb79c729be8799b8cd190353368532e30","impliedFormat":99},{"version":"21a136c72551be7c24d797d4fa1401d35ee62325bec7442a6869cea50a50ad7a","impliedFormat":99},{"version":"5ea1325a998e722fffc89ff8c2d00eaf35e491f3fada16fb56c6360f63d16d79","impliedFormat":99},{"version":"2f50c2700b3397c9961c1e14b903d0ff1120e064755603740cecdcdf3b05d20f","impliedFormat":99},{"version":"e24d67437856c921a9a40f7fbac38ac576439e6616eb698fb769279ecbc7802a","impliedFormat":99},{"version":"8fd12fa3eb9c1cc067d1fed98d649971da96a5ed161dafc6fba4a5b7a9ceb7fe","impliedFormat":99},{"version":"15cc3dd9a039f8ba1628d1e27cdf4b45582fc387a4241ebb65eff1786b89f522","impliedFormat":99},{"version":"01056fd3092681e2f1c0cb0e1fec91ac081b5bb758551494fca1c1d27f06c2b4","affectsGlobalScope":true,"impliedFormat":99},{"version":"19c2d8da51e4944a19e0ca377df3fd9d249dd8f9cab9544632fb8d10a72808f7","impliedFormat":1},{"version":"a387648b45b3d02c838a213809bf7aa3a3c6e009b0cfedbbb98e7863219fd0b4","impliedFormat":99},{"version":"fd9a69c8fa10f578b0d5961441fb2778fb34cd41d20e5714aa49f983f1cdd52f","impliedFormat":99},{"version":"7e9aecc83330a5c15b10f8995dfce2e1004f9bbdd0c4a9df18e8483facd76703","impliedFormat":99},{"version":"280386331ba739ec12261d42474f90f2d98214f9ac87ecad4be0585507acd937","impliedFormat":99},{"version":"316d7bdfb430fa119cbd460e01ffbf726321a5e54575c22b70e8ff56241d849a","impliedFormat":99},{"version":"d5a938d49803873c6de2daa0e81fa87ab44eee5259df765345932a28ecfb64fc","impliedFormat":99},{"version":"6642b7e23799bfb100805fbde097790a6484bd375c2c75dc18da086639f8b7e5","impliedFormat":99},{"version":"f4be8f5f1fbf13b24da4b2141e124c000750454d5168544c27352631e4edccd9","impliedFormat":99},{"version":"15268f168504a8daad6197637bf91c0399fb26861e720805051dd0e8c2f2ebd1","impliedFormat":99},{"version":"4ebc57d20caf062019a2b8c9ce1e54602a411022eb4f7fa325888b9bcf63693a","impliedFormat":99},{"version":"662cafdf363d512eff0d6c525c711684dba726ac5f4d09f473110a05c8ecd8e5","impliedFormat":99},{"version":"86c62ba4f3279d13647e2901b8819c9b32f4eb9645d50d02b4d60e5521f693db","impliedFormat":99},{"version":"98678d6ac29dfa3f80452de2a87f464dee4908476f817d6f5e0677802ad43f7b","impliedFormat":99},{"version":"057f28f1e4c53bfdc397099ee4bf873ef32f26a938a135881b19bf10f968a805","impliedFormat":99},{"version":"d00e790b0d3738482ddb18bb446210b41019520dd32438570d6bc533f7b95239","impliedFormat":99},{"version":"c4e45ef293b9b228aad0d51acb0ef0397dad22a3454b3f6f751b6de1ac9e11e0","impliedFormat":99},{"version":"9e33e135a12a5761c92a4ef0057e1d24310ada6f0758a13223036efc22b9e745","impliedFormat":99},{"version":"020962899646e5e2efc7100d1a0c443be16800cef6f2cada68c20fe8de585d43","impliedFormat":99},{"version":"48b65aae077c0a25bef9982871b488aebd4161768ee8bb88b9cc0d4736e15644","impliedFormat":99},{"version":"7565a3e1f88b68c438331d8ece71540f9fb5a11a8a0480b5c262c701142c5048","impliedFormat":99},{"version":"af6ac8a19dbd05c34feff97d0eae81194fd0be1358bd2366478e9a574492d332","impliedFormat":99},{"version":"a21c587d34edbe9808b8f4fac207d190f802687b477ef55ee0f494d79a427f31","impliedFormat":99},{"version":"f00b8fc0c970cfd54d4df6047aae216bce4d7a2ceb6610655541a678ac54c57a","impliedFormat":99},{"version":"11fd6a023d60896a902933f64a2c8363102e5276838dbe29aa02a24c2e69fbd1","impliedFormat":99},{"version":"d5664fad55c16b09f4fbda92412a3c0d99c5e143434a5a82dc0f86d0823014ae","impliedFormat":99},{"version":"ac5d1242b5e0af60effdcbdbd2ea3f1a1cfbc2877eb4ad8e6df0e596ff3ce047","impliedFormat":99},{"version":"18d3ba92c8cd5b0dc0413aa76efde4892c1095c865a6590560f4e30679a31afb","impliedFormat":99},{"version":"22a65c300fb8989d8c282e949c1219ba70ec4a7542136629d75072b0c191539f","impliedFormat":99},{"version":"8b686124fd8d7102d8c2293311e0b9b2d48ddae7d88fe0688841b3f440eaef55","impliedFormat":99},{"version":"3662463ad80a475e0e31f0d909c04036e9dc5e4b63141396db38795f6ec20edb","impliedFormat":99},{"version":"eb5828be18865d34ea3049afc3679267661a290b9858e2cd2866387c70b981ef","impliedFormat":99},{"version":"721313e1405531faa6e144e78ad3561023150692fbbcc23a4db9c2bda7e2b292","impliedFormat":99},{"version":"0bfafbea0db16cf312eb181f9153d840640fc36e47c0e61b30ddc16e5d23d432","impliedFormat":99},{"version":"3651947da5192aa0655f8a24ca016b3fb0a65bf24950cf52176d8972c7c32785","impliedFormat":99},{"version":"98da7969aa8079a6625791fdb0806f2cb125ae398bccd84e8cb8a76c454aac93","impliedFormat":99},{"version":"57cf1e4b805c24f3d61c1e753a4aac48061e932e90e2afdf38ddbc5111886410","impliedFormat":99},{"version":"40471ac4c2b6056bdc7ee09f1f279345d8fcc40b8b326eac38cff2df37ece97a","impliedFormat":99},{"version":"c82303f9ddeb0df5c2853ba02e9f1603ad0f01200225e6ee4cb2da53757243c0","impliedFormat":99},{"version":"8923bb9bac8a80132bbf1510facaa96198df1de6df035b77b5a81b681c5fba70","impliedFormat":99},{"version":"390d45fe0b15286282624b4646ac3267a601bf47154e2809cc9c12762d13223b","impliedFormat":99},{"version":"6bfed074c652e8043dfc926842ebc05f81db6c0c45b521e4bedc9dd8998df736","impliedFormat":99},{"version":"9fca5e617704571d97a09c9d6bafd115ecfdf54e9b719b263bd77cc7820e1e7a","impliedFormat":99},{"version":"372b22fc038ee96b5a52f6b998d37c0c9c0cb8300b858e3f368b61388359ae23","impliedFormat":99},{"version":"8fc0d6a1e97a1fcd37ebdb72241e4608652a69e1a963ca662d1429750cf04f73","impliedFormat":99},{"version":"8f70945f7ea3ad857863b6035d2ac1fdf1b6793c6a2ca74ce89508f82be4dc29","impliedFormat":99},{"version":"85e159ffc1676583a00e26cdae8f40fa3139e32c89aa7ecbc725e120a8db1418","impliedFormat":99},{"version":"ea4d0669fa41158a8ae4dfbcb9f690f3177edd29c83a4cf01b74a4db24c5dcc8","impliedFormat":99},{"version":"3a908670fbb5fa07652421362e908b98e3abb854dc07b036dcdf800b919901b4","impliedFormat":99},{"version":"1df671bf418dd913e42d9d9d848541e3c6e5989e5db362cb12ddd84305f34b17","impliedFormat":99},{"version":"eb90fe18be0b3b5b759ff8f055e9ccb19c6a4287c9061c7a4bb9805968e46498","impliedFormat":99},{"version":"d73ce6a51a42271a54f27cd4bbc0a1aa9897882a83f35c3ce1a611578305bc11","impliedFormat":99},{"version":"055d5c58abf9c069d88cd9f62a426008adc38258390ceba978fa527fffa54441","impliedFormat":99},{"version":"5a78fbd15c9e2a1d0603252fabff17addd55597ca9e25440132c26fb2ce117f3","impliedFormat":99},{"version":"78ab431a811184547b55f5f0af6f2d2859f5e638b2665bccb5efee2f2d947325","impliedFormat":99},{"version":"72e9620fda3c1d56bb3f1cfcf7e3052732c61fc57b042b128b7bf41d6d8c199f","impliedFormat":99},{"version":"8ec40582c992093bdc404d6d4d21459d31cc4cbd761f738979ba31f2d054cedd","impliedFormat":99},{"version":"2943c4190d96fc3a3ec84acbd89b8467572facc49459a9727cbd48acb5581c0e","impliedFormat":99},{"version":"afc3207b86111de2fda0fce7951a0beccffbb34eee0cbed88298413ad8d45494","impliedFormat":99},{"version":"451dbe724a8951a9ea92fb490d984e06a0de072532b7c74ad48d8dc0dd918bd1","impliedFormat":99},{"version":"208884a7e414e5b3c04c02677a6ed4c50e2d386f0eb851f637860ced9366ab17","impliedFormat":99},{"version":"6651e0e8d0a95ccab2cd3b24df4ea6c33da06499f588938f8758d2d3e822090a","impliedFormat":99},{"version":"2dfefff9f09ec7460c4ca86b1c5e5d2cfa0fe9a2a1613916b74a6a4949ea26cc","impliedFormat":99},{"version":"74cd613e6eae8d673e2198d877583ddff7879d52ba5a94b3dc35d8da0800f199","impliedFormat":99},{"version":"25cbd0baaecc32efabbed23767498e3cd2ebfc8f7a222866efe1e580f08f526b","impliedFormat":99},{"version":"af7d6189331b10c030322f3dc7e600466126bad616f098bda0fce116c7dd09c2","impliedFormat":99},{"version":"038380c14e8df9d0e74a45ac9e52f712989fc004e1b7c0aa7a189b9d02e669ce","signature":"5880148b7628f44eac1f32b905815872261d19b639f8ba45772ef263983d962d","impliedFormat":99},{"version":"a015d7080d3a13ba12d49c86414272ec5fe42243faa5fe1eb1b8c88419ea35d6","signature":"590e4cf12b4184de031367f406075363c76603d9ae8798849d878fd3d82962e9","impliedFormat":99},{"version":"dcb4f516503619639ba92509a55ff5e71ac6c6baf30dafa69fd9bb04bde7b108","signature":"8911f91f6513ffecff496fbaafdfb61c6afed546365aab1c03ca1a11e7509c15","impliedFormat":99},{"version":"d534ffda869e64916cea59219f3f24d5f66e49ff348149deb604e34998ba7b4c","signature":"96e4bc9e76e4ede432e44d1aa45cc1db1a713c26c9412570e3cd041892ccf83d","impliedFormat":99},{"version":"4e6e61be5afdc113e504c2b51e235fe7e1b809bcd8c174aff02e5d3e602fc680","impliedFormat":99},{"version":"dc409f321fd996ae183ff5da8ddd2d6d8a9b234b340e3300fad92bfd8390f48c","affectsGlobalScope":true,"impliedFormat":1}],"root":[[146,150]],"options":{"composite":true,"declaration":true,"declarationDir":"./esm","declarationMap":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"importHelpers":true,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitOverride":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"outDir":"./esm","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"stripInternal":true,"target":99},"fileIdsList":[[61],[62,79,97,145,146],[62,146,147,148,149],[62,146,147],[62],[79,97,98,99,132],[98],[104,133],[79,133],[105,106,107,108,115,130,131],[105],[97,104,133],[105,112],[112,113,114],[109,110,111],[80,97,109,133],[79,97,109,133],[79,97,133],[116,123,124,125,126,127,128,129],[79,116,123,124],[79,97,116,123],[79,97,123,124,127],[79],[79,97,122,133],[79,116,123],[97,104,116,123,124,125,133],[79,104,134],[79,97,134],[97,133,134],[134,135,136,137,138,139,140],[79,97],[97,104,133,138],[79,97,99,133,134,135],[98,99,122,132,133,141,144],[79,97,98,133,142],[142,143],[79,99,133,143],[104],[79,117,118,119,120,121],[100,101],[100],[100,101,102,103],[101],[79,81,82],[79,81],[81],[84],[79,81,87],[81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96],[80,81],[80],[79,83],[63,64,65,67],[63,64,68],[63,64,65,67,68],[66],[65],[66,69,76,77,78],[66,69,76],[69],[71],[71,72,73],[66,69,71],[70,74,75],[97,145,146],[146,147,148,149],[146,147]],"referencedMap":[[62,1],[147,2],[150,3],[148,4],[146,5],[149,5],[133,6],[99,7],[105,8],[106,9],[132,10],[107,11],[108,12],[113,13],[115,14],[112,15],[110,16],[111,17],[109,18],[130,19],[125,20],[126,21],[128,22],[127,23],[116,23],[123,24],[124,25],[129,26],[131,11],[135,27],[137,28],[138,29],[141,30],[134,31],[139,32],[140,33],[145,34],[143,35],[144,36],[142,37],[117,38],[119,38],[122,39],[102,40],[101,41],[104,42],[103,43],[83,44],[82,45],[84,46],[85,46],[86,47],[88,48],[89,46],[97,49],[90,46],[91,50],[92,46],[93,46],[81,51],[94,52],[95,45],[87,45],[96,45],[68,53],[65,54],[69,55],[67,56],[64,57],[79,58],[77,59],[70,60],[71,60],[72,61],[74,62],[73,63],[76,64],[75,60]],"exportedModulesMap":[[62,1],[147,65],[150,66],[148,67],[133,6],[99,7],[105,8],[106,9],[132,10],[107,11],[108,12],[113,13],[115,14],[112,15],[110,16],[111,17],[109,18],[130,19],[125,20],[126,21],[128,22],[127,23],[116,23],[123,24],[124,25],[129,26],[131,11],[135,27],[137,28],[138,29],[141,30],[134,31],[139,32],[140,33],[145,34],[143,35],[144,36],[142,37],[117,38],[119,38],[122,39],[102,40],[101,41],[104,42],[103,43],[83,44],[82,45],[84,46],[85,46],[86,47],[88,48],[89,46],[97,49],[90,46],[91,50],[92,46],[93,46],[81,51],[94,52],[95,45],[87,45],[96,45],[68,53],[65,54],[69,55],[67,56],[64,57],[79,58],[77,59],[70,60],[71,60],[72,61],[74,62],[73,63],[76,64],[75,60]],"semanticDiagnosticsPerFile":[151,62,61,59,60,12,14,13,2,15,16,17,18,19,20,21,22,3,4,26,23,24,25,27,28,29,5,30,31,32,33,6,37,34,35,36,38,7,39,44,45,40,41,42,43,8,49,46,47,48,50,9,51,52,53,56,54,55,57,10,1,11,58,80,147,150,148,146,149,133,99,105,106,132,107,108,113,115,112,110,111,109,114,130,125,126,128,127,116,123,124,129,131,135,136,137,138,141,134,139,140,98,145,143,144,142,117,118,119,120,122,121,100,102,101,104,103,83,82,84,85,86,88,89,97,90,91,92,93,81,94,95,87,96,68,65,69,63,67,64,79,77,78,70,71,72,74,73,76,75,66],"latestChangedDtsFile":"./esm/manager.d.ts"},"version":"5.0.4"}
|