@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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /// <reference types="w3c-web-usb" />
2
+ import type { AdbDaemonDevice, AdbPacketData, AdbPacketInit } from "@yume-chan/adb";
3
+ import type { Consumable, ReadableWritablePair, WritableStream } from "@yume-chan/stream-extra";
4
+ import { ReadableStream } from "@yume-chan/stream-extra";
5
+ import type { AdbDeviceFilter } from "./utils.js";
6
+ /**
7
+ * The default filter for ADB devices, as defined by Google.
8
+ */
9
+ export declare const ADB_DEFAULT_DEVICE_FILTER: {
10
+ readonly classCode: 255;
11
+ readonly subclassCode: 66;
12
+ readonly protocolCode: 1;
13
+ };
14
+ export declare class AdbDaemonWebUsbConnection implements ReadableWritablePair<AdbPacketData, Consumable<AdbPacketInit>> {
15
+ #private;
16
+ get readable(): ReadableStream<AdbPacketData>;
17
+ get writable(): WritableStream<Consumable<{
18
+ command: number;
19
+ arg0: number;
20
+ arg1: number;
21
+ checksum: number;
22
+ magic: number;
23
+ payload: Uint8Array;
24
+ }>>;
25
+ constructor(device: USBDevice, inEndpoint: USBEndpoint, outEndpoint: USBEndpoint, usbManager: USB);
26
+ }
27
+ export declare class AdbDaemonWebUsbDevice implements AdbDaemonDevice {
28
+ #private;
29
+ get raw(): USBDevice;
30
+ get serial(): string;
31
+ get name(): string;
32
+ /**
33
+ * Create a new instance of `AdbDaemonWebUsbConnection` using a specified `USBDevice` instance
34
+ *
35
+ * @param device The `USBDevice` instance obtained elsewhere.
36
+ * @param filters The filters to use when searching for ADB interface. Defaults to {@link ADB_DEFAULT_DEVICE_FILTER}.
37
+ */
38
+ constructor(device: USBDevice, filters: AdbDeviceFilter[] | undefined, usbManager: USB);
39
+ /**
40
+ * Claim the device and create a pair of `AdbPacket` streams to the ADB interface.
41
+ * @returns The pair of `AdbPacket` streams.
42
+ */
43
+ connect(): Promise<ReadableWritablePair<AdbPacketData, Consumable<AdbPacketInit>>>;
44
+ }
45
+ //# sourceMappingURL=device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EACR,eAAe,EACf,aAAa,EACb,aAAa,EAChB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EACR,UAAU,EACV,oBAAoB,EACpB,cAAc,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGH,cAAc,EAEjB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;CAIF,CAAC;AAgErC,qBAAa,yBACT,YAAW,oBAAoB,CAAC,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;;IAGzE,IAAW,QAAQ,kCAElB;IAGD,IAAW,QAAQ;;;;;;;QAElB;gBAGG,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,WAAW,EACvB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,GAAG;CAiItB;AAED,qBAAa,qBAAsB,YAAW,eAAe;;IAKzD,IAAW,GAAG,cAEb;IAED,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;;;OAKG;gBAEC,MAAM,EAAE,SAAS,EACjB,OAAO,+BAAiD,EACxD,UAAU,EAAE,GAAG;IAOnB;;;OAGG;IACU,OAAO,IAAI,OAAO,CAC3B,oBAAoB,CAAC,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,CACjE;CA0CJ"}
package/esm/device.js ADDED
@@ -0,0 +1,213 @@
1
+ import { AdbPacketHeader, AdbPacketSerializeStream, unreachable, } from "@yume-chan/adb";
2
+ import { ConsumableWritableStream, DuplexStreamFactory, ReadableStream, pipeFrom, } from "@yume-chan/stream-extra";
3
+ import { EMPTY_UINT8_ARRAY } from "@yume-chan/struct";
4
+ import { findUsbAlternateInterface, isErrorName } from "./utils.js";
5
+ /**
6
+ * The default filter for ADB devices, as defined by Google.
7
+ */
8
+ export const ADB_DEFAULT_DEVICE_FILTER = {
9
+ classCode: 0xff,
10
+ subclassCode: 0x42,
11
+ protocolCode: 1,
12
+ };
13
+ /**
14
+ * Find the first pair of input and output endpoints from an alternate interface.
15
+ *
16
+ * ADB interface only has two endpoints, one for input and one for output.
17
+ */
18
+ function findUsbEndpoints(endpoints) {
19
+ if (endpoints.length === 0) {
20
+ throw new Error("No endpoints given");
21
+ }
22
+ let inEndpoint;
23
+ let outEndpoint;
24
+ for (const endpoint of endpoints) {
25
+ switch (endpoint.direction) {
26
+ case "in":
27
+ inEndpoint = endpoint;
28
+ if (outEndpoint) {
29
+ return { inEndpoint, outEndpoint };
30
+ }
31
+ break;
32
+ case "out":
33
+ outEndpoint = endpoint;
34
+ if (inEndpoint) {
35
+ return { inEndpoint, outEndpoint };
36
+ }
37
+ break;
38
+ }
39
+ }
40
+ if (!inEndpoint) {
41
+ throw new Error("No input endpoint found.");
42
+ }
43
+ if (!outEndpoint) {
44
+ throw new Error("No output endpoint found.");
45
+ }
46
+ throw new Error("unreachable");
47
+ }
48
+ class Uint8ArrayExactReadable {
49
+ #data;
50
+ #position;
51
+ get position() {
52
+ return this.#position;
53
+ }
54
+ constructor(data) {
55
+ this.#data = data;
56
+ this.#position = 0;
57
+ }
58
+ readExactly(length) {
59
+ const result = this.#data.subarray(this.#position, this.#position + length);
60
+ this.#position += length;
61
+ return result;
62
+ }
63
+ }
64
+ export class AdbDaemonWebUsbConnection {
65
+ #readable;
66
+ get readable() {
67
+ return this.#readable;
68
+ }
69
+ #writable;
70
+ get writable() {
71
+ return this.#writable;
72
+ }
73
+ constructor(device, inEndpoint, outEndpoint, usbManager) {
74
+ let closed = false;
75
+ const duplex = new DuplexStreamFactory({
76
+ close: async () => {
77
+ try {
78
+ closed = true;
79
+ await device.close();
80
+ }
81
+ catch {
82
+ /* device may have already disconnected */
83
+ }
84
+ },
85
+ dispose: () => {
86
+ closed = true;
87
+ usbManager.removeEventListener("disconnect", handleUsbDisconnect);
88
+ },
89
+ });
90
+ function handleUsbDisconnect(e) {
91
+ if (e.device === device) {
92
+ duplex.dispose().catch(unreachable);
93
+ }
94
+ }
95
+ usbManager.addEventListener("disconnect", handleUsbDisconnect);
96
+ this.#readable = duplex.wrapReadable(new ReadableStream({
97
+ async pull(controller) {
98
+ try {
99
+ // The `length` argument in `transferIn` must not be smaller than what the device sent,
100
+ // otherwise it will return `babble` status without any data.
101
+ // ADB daemon sends each packet in two parts, the 24-byte header and the payload.
102
+ const result = await device.transferIn(inEndpoint.endpointNumber, 24);
103
+ // TODO: webusb: handle `babble` by discarding the data and receive again
104
+ // Per spec, the `result.data` always covers the whole `buffer`.
105
+ const buffer = new Uint8Array(result.data.buffer);
106
+ const stream = new Uint8ArrayExactReadable(buffer);
107
+ // Add `payload` field to its type, it's assigned below.
108
+ const packet = AdbPacketHeader.deserialize(stream);
109
+ if (packet.payloadLength !== 0) {
110
+ const result = await device.transferIn(inEndpoint.endpointNumber, packet.payloadLength);
111
+ packet.payload = new Uint8Array(result.data.buffer);
112
+ }
113
+ else {
114
+ packet.payload = EMPTY_UINT8_ARRAY;
115
+ }
116
+ controller.enqueue(packet);
117
+ }
118
+ catch (e) {
119
+ // On Windows, disconnecting the device will cause `NetworkError` to be thrown,
120
+ // even before the `disconnect` event is fired.
121
+ // We need to wait a little bit and check if the device is still connected.
122
+ // https://github.com/WICG/webusb/issues/219
123
+ if (isErrorName(e, "NetworkError")) {
124
+ await new Promise((resolve) => {
125
+ setTimeout(() => {
126
+ resolve();
127
+ }, 100);
128
+ });
129
+ if (closed) {
130
+ controller.close();
131
+ }
132
+ else {
133
+ throw e;
134
+ }
135
+ }
136
+ throw e;
137
+ }
138
+ },
139
+ }));
140
+ const zeroMask = outEndpoint.packetSize - 1;
141
+ this.#writable = pipeFrom(duplex.createWritable(new ConsumableWritableStream({
142
+ write: async (chunk) => {
143
+ try {
144
+ await device.transferOut(outEndpoint.endpointNumber, chunk);
145
+ // In USB protocol, a not-full packet indicates the end of a transfer.
146
+ // If the payload size is a multiple of the packet size,
147
+ // we need to send an empty packet to indicate the end,
148
+ // so the OS will send it to the device immediately.
149
+ if (zeroMask &&
150
+ (chunk.byteLength & zeroMask) === 0) {
151
+ await device.transferOut(outEndpoint.endpointNumber, EMPTY_UINT8_ARRAY);
152
+ }
153
+ }
154
+ catch (e) {
155
+ if (closed) {
156
+ return;
157
+ }
158
+ throw e;
159
+ }
160
+ },
161
+ })), new AdbPacketSerializeStream());
162
+ }
163
+ }
164
+ export class AdbDaemonWebUsbDevice {
165
+ #filters;
166
+ #usbManager;
167
+ #raw;
168
+ get raw() {
169
+ return this.#raw;
170
+ }
171
+ get serial() {
172
+ return this.#raw.serialNumber;
173
+ }
174
+ get name() {
175
+ return this.#raw.productName;
176
+ }
177
+ /**
178
+ * Create a new instance of `AdbDaemonWebUsbConnection` using a specified `USBDevice` instance
179
+ *
180
+ * @param device The `USBDevice` instance obtained elsewhere.
181
+ * @param filters The filters to use when searching for ADB interface. Defaults to {@link ADB_DEFAULT_DEVICE_FILTER}.
182
+ */
183
+ constructor(device, filters = [ADB_DEFAULT_DEVICE_FILTER], usbManager) {
184
+ this.#raw = device;
185
+ this.#filters = filters;
186
+ this.#usbManager = usbManager;
187
+ }
188
+ /**
189
+ * Claim the device and create a pair of `AdbPacket` streams to the ADB interface.
190
+ * @returns The pair of `AdbPacket` streams.
191
+ */
192
+ async connect() {
193
+ if (!this.#raw.opened) {
194
+ await this.#raw.open();
195
+ }
196
+ const { configuration, interface_, alternate } = findUsbAlternateInterface(this.#raw, this.#filters);
197
+ if (this.#raw.configuration?.configurationValue !==
198
+ configuration.configurationValue) {
199
+ // Note: Switching configuration is not supported on Windows,
200
+ // but Android devices should always expose ADB function at the first (default) configuration.
201
+ await this.#raw.selectConfiguration(configuration.configurationValue);
202
+ }
203
+ if (!interface_.claimed) {
204
+ await this.#raw.claimInterface(interface_.interfaceNumber);
205
+ }
206
+ if (interface_.alternate.alternateSetting !== alternate.alternateSetting) {
207
+ await this.#raw.selectAlternateInterface(interface_.interfaceNumber, alternate.alternateSetting);
208
+ }
209
+ const { inEndpoint, outEndpoint } = findUsbEndpoints(alternate.endpoints);
210
+ return new AdbDaemonWebUsbConnection(this.#raw, inEndpoint, outEndpoint, this.#usbManager);
211
+ }
212
+ }
213
+ //# sourceMappingURL=device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"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"}
package/esm/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./device.js";
2
+ export * from "./manager.js";
3
+ export * from "./utils.js";
4
+ export * from "./watcher.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
package/esm/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./device.js";
2
+ export * from "./manager.js";
3
+ export * from "./utils.js";
4
+ export * from "./watcher.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,45 @@
1
+ /// <reference types="w3c-web-usb" />
2
+ import { AdbDaemonWebUsbDevice } from "./device.js";
3
+ import type { AdbDeviceFilter } from "./utils.js";
4
+ export declare class AdbDaemonWebUsbDeviceManager {
5
+ #private;
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
+ static readonly BROWSER: AdbDaemonWebUsbDeviceManager | undefined;
12
+ /**
13
+ * Create a new instance of {@link AdbDaemonWebUsbDeviceManager} using the specified WebUSB implementation.
14
+ * @param usbManager A WebUSB compatible interface.
15
+ */
16
+ constructor(usbManager: USB);
17
+ /**
18
+ * Request access to a connected device.
19
+ * This is a convince method for `usb.requestDevice()`.
20
+ * @param filters
21
+ * The filters to apply to the device list.
22
+ *
23
+ * It must have `classCode`, `subclassCode` and `protocolCode` fields for selecting the ADB interface,
24
+ * but might also have `vendorId`, `productId` or `serialNumber` fields to limit the displayed device list.
25
+ *
26
+ * Defaults to {@link ADB_DEFAULT_DEVICE_FILTER}.
27
+ * @returns An {@link AdbDaemonWebUsbDevice} instance if the user selected a device,
28
+ * or `undefined` if the user cancelled the device picker.
29
+ */
30
+ requestDevice(filters?: AdbDeviceFilter[]): Promise<AdbDaemonWebUsbDevice | undefined>;
31
+ /**
32
+ * Get all connected and authenticated devices.
33
+ * This is a convince method for `usb.getDevices()`.
34
+ * @param filters
35
+ * The filters to apply to the device list.
36
+ *
37
+ * It must have `classCode`, `subclassCode` and `protocolCode` fields for selecting the ADB interface,
38
+ * but might also have `vendorId`, `productId` or `serialNumber` fields to limit the device list.
39
+ *
40
+ * Defaults to {@link ADB_DEFAULT_DEVICE_FILTER}.
41
+ * @returns An array of {@link AdbDaemonWebUsbDevice} instances for all connected and authenticated devices.
42
+ */
43
+ getDevices(filters?: AdbDeviceFilter[]): Promise<AdbDaemonWebUsbDevice[]>;
44
+ }
45
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":";AAAA,OAAO,EAA6B,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,qBAAa,4BAA4B;;IACrC;;;;OAIG;IACH,gBAAuB,OAAO,2CAIV;IAIpB;;;OAGG;gBACgB,UAAU,EAAE,GAAG;IAIlC;;;;;;;;;;;;OAYG;IACU,aAAa,CACtB,OAAO,GAAE,eAAe,EAAgC,GACzD,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAgB7C;;;;;;;;;;;OAWG;IACU,UAAU,CACnB,OAAO,GAAE,eAAe,EAAgC,GACzD,OAAO,CAAC,qBAAqB,EAAE,CAAC;CAsCtC"}
package/esm/manager.js ADDED
@@ -0,0 +1,92 @@
1
+ import { ADB_DEFAULT_DEVICE_FILTER, AdbDaemonWebUsbDevice } from "./device.js";
2
+ import { findUsbAlternateInterface, isErrorName } from "./utils.js";
3
+ class AdbDaemonWebUsbDeviceManager {
4
+ /**
5
+ * Gets the instance of {@link AdbDaemonWebUsbDeviceManager} using browser WebUSB implementation.
6
+ *
7
+ * May be `undefined` if current runtime does not support WebUSB.
8
+ */
9
+ static BROWSER = typeof globalThis.navigator !== "undefined" &&
10
+ !!globalThis.navigator.usb
11
+ ? new AdbDaemonWebUsbDeviceManager(globalThis.navigator.usb)
12
+ : undefined;
13
+ #usbManager;
14
+ /**
15
+ * Create a new instance of {@link AdbDaemonWebUsbDeviceManager} using the specified WebUSB implementation.
16
+ * @param usbManager A WebUSB compatible interface.
17
+ */
18
+ constructor(usbManager) {
19
+ this.#usbManager = usbManager;
20
+ }
21
+ /**
22
+ * Request access to a connected device.
23
+ * This is a convince method for `usb.requestDevice()`.
24
+ * @param filters
25
+ * The filters to apply to the device list.
26
+ *
27
+ * It must have `classCode`, `subclassCode` and `protocolCode` fields for selecting the ADB interface,
28
+ * but might also have `vendorId`, `productId` or `serialNumber` fields to limit the displayed device list.
29
+ *
30
+ * Defaults to {@link ADB_DEFAULT_DEVICE_FILTER}.
31
+ * @returns An {@link AdbDaemonWebUsbDevice} instance if the user selected a device,
32
+ * or `undefined` if the user cancelled the device picker.
33
+ */
34
+ async requestDevice(filters = [ADB_DEFAULT_DEVICE_FILTER]) {
35
+ try {
36
+ const device = await this.#usbManager.requestDevice({
37
+ filters,
38
+ });
39
+ return new AdbDaemonWebUsbDevice(device, filters, this.#usbManager);
40
+ }
41
+ catch (e) {
42
+ // No device selected
43
+ if (isErrorName(e, "NotFoundError")) {
44
+ return undefined;
45
+ }
46
+ throw e;
47
+ }
48
+ }
49
+ /**
50
+ * Get all connected and authenticated devices.
51
+ * This is a convince method for `usb.getDevices()`.
52
+ * @param filters
53
+ * The filters to apply to the device list.
54
+ *
55
+ * It must have `classCode`, `subclassCode` and `protocolCode` fields for selecting the ADB interface,
56
+ * but might also have `vendorId`, `productId` or `serialNumber` fields to limit the device list.
57
+ *
58
+ * Defaults to {@link ADB_DEFAULT_DEVICE_FILTER}.
59
+ * @returns An array of {@link AdbDaemonWebUsbDevice} instances for all connected and authenticated devices.
60
+ */
61
+ async getDevices(filters = [ADB_DEFAULT_DEVICE_FILTER]) {
62
+ const devices = await this.#usbManager.getDevices();
63
+ return devices
64
+ .filter((device) => {
65
+ for (const filter of filters) {
66
+ if ("vendorId" in filter &&
67
+ device.vendorId !== filter.vendorId) {
68
+ continue;
69
+ }
70
+ if ("productId" in filter &&
71
+ device.productId !== filter.productId) {
72
+ continue;
73
+ }
74
+ if ("serialNumber" in filter &&
75
+ device.serialNumber !== filter.serialNumber) {
76
+ continue;
77
+ }
78
+ try {
79
+ findUsbAlternateInterface(device, filters);
80
+ return true;
81
+ }
82
+ catch {
83
+ continue;
84
+ }
85
+ }
86
+ return false;
87
+ })
88
+ .map((device) => new AdbDaemonWebUsbDevice(device, filters, this.#usbManager));
89
+ }
90
+ }
91
+ export { AdbDaemonWebUsbDeviceManager };
92
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAa,4BAA4B;IACrC;;;;OAIG;IACI,MAAM,CAAU,OAAO,GAC1B,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW;QAC3C,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG;QACtB,CAAC,CAAC,IAAI,4BAA4B,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC;QAC5D,CAAC,CAAC,SAAS,CAAC;IAEpB,WAAW,CAAM;IAEjB;;;OAGG;IACH,YAAmB,UAAe;QAC9B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;OAYG;IACI,KAAK,CAAC,aAAa,CACtB,UAA6B,CAAC,yBAAyB,CAAC;QAExD,IAAI;YACA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;gBAChD,OAAO;aACV,CAAC,CAAC;YACH,OAAO,IAAI,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACvE;QAAC,OAAO,CAAC,EAAE;YACR,qBAAqB;YACrB,IAAI,WAAW,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE;gBACjC,OAAO,SAAS,CAAC;aACpB;YAED,MAAM,CAAC,CAAC;SACX;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,UAAU,CACnB,UAA6B,CAAC,yBAAyB,CAAC;QAExD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QACpD,OAAO,OAAO;aACT,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC1B,IACI,UAAU,IAAI,MAAM;oBACpB,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EACrC;oBACE,SAAS;iBACZ;gBACD,IACI,WAAW,IAAI,MAAM;oBACrB,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,EACvC;oBACE,SAAS;iBACZ;gBACD,IACI,cAAc,IAAI,MAAM;oBACxB,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,EAC7C;oBACE,SAAS;iBACZ;gBAED,IAAI;oBACA,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC3C,OAAO,IAAI,CAAC;iBACf;gBAAC,MAAM;oBACJ,SAAS;iBACZ;aACJ;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC;aACD,GAAG,CACA,CAAC,MAAM,EAAE,EAAE,CACP,IAAI,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CACnE,CAAC;IACV,CAAC;;SAxGQ,4BAA4B"}
package/esm/utils.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ /// <reference types="w3c-web-usb" />
2
+ export declare function isErrorName(e: unknown, name: string): boolean;
3
+ /**
4
+ * `classCode`, `subclassCode` and `protocolCode` are required
5
+ * for selecting correct USB configuration and interface.
6
+ */
7
+ export type AdbDeviceFilter = USBDeviceFilter & Required<Pick<USBDeviceFilter, "classCode" | "subclassCode" | "protocolCode">>;
8
+ export declare function findUsbAlternateInterface(device: USBDevice, filters: AdbDeviceFilter[]): {
9
+ configuration: USBConfiguration;
10
+ interface_: USBInterface;
11
+ alternate: USBAlternateInterface;
12
+ };
13
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,eAAe,GACzC,QAAQ,CACJ,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC,CACvE,CAAC;AAcN,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,eAAe,EAAE;;;;EAa7B"}
package/esm/utils.js ADDED
@@ -0,0 +1,24 @@
1
+ export function isErrorName(e, name) {
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 (typeof e === "object" && e !== null && "name" in e && e.name === name);
6
+ }
7
+ function alternateMatchesFilter(alternate, filters) {
8
+ return filters.some((filter) => alternate.interfaceClass === filter.classCode &&
9
+ alternate.interfaceSubclass === filter.subclassCode &&
10
+ alternate.interfaceProtocol === filter.protocolCode);
11
+ }
12
+ export function findUsbAlternateInterface(device, filters) {
13
+ for (const configuration of device.configurations) {
14
+ for (const interface_ of configuration.interfaces) {
15
+ for (const alternate of interface_.alternates) {
16
+ if (alternateMatchesFilter(alternate, filters)) {
17
+ return { configuration, interface_, alternate };
18
+ }
19
+ }
20
+ }
21
+ }
22
+ throw new Error("No matched alternate interface found");
23
+ }
24
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,CAAU,EAAE,IAAY;IAChD,+CAA+C;IAC/C,wBAAwB;IACxB,kDAAkD;IAClD,OAAO,CACH,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CACxE,CAAC;AACN,CAAC;AAWD,SAAS,sBAAsB,CAC3B,SAAgC,EAChC,OAA0B;IAE1B,OAAO,OAAO,CAAC,IAAI,CACf,CAAC,MAAM,EAAE,EAAE,CACP,SAAS,CAAC,cAAc,KAAK,MAAM,CAAC,SAAS;QAC7C,SAAS,CAAC,iBAAiB,KAAK,MAAM,CAAC,YAAY;QACnD,SAAS,CAAC,iBAAiB,KAAK,MAAM,CAAC,YAAY,CAC1D,CAAC;AACN,CAAC;AAED,MAAM,UAAU,yBAAyB,CACrC,MAAiB,EACjB,OAA0B;IAE1B,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,cAAc,EAAE;QAC/C,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,UAAU,EAAE;YAC/C,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE;gBAC3C,IAAI,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;oBAC5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;iBACnD;aACJ;SACJ;KACJ;IAED,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,9 @@
1
+ /// <reference types="w3c-web-usb" />
2
+ export declare class AdbDaemonWebUsbDeviceWatcher {
3
+ #private;
4
+ constructor(callback: (newDeviceSerial?: string) => void, usb: USB);
5
+ dispose(): void;
6
+ private handleConnect;
7
+ private handleDisconnect;
8
+ }
9
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":";AAAA,qBAAa,4BAA4B;;gBAIlB,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG;IAQlE,OAAO,IAAI,IAAI;IAQtB,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,gBAAgB,CAEtB;CACL"}
package/esm/watcher.js ADDED
@@ -0,0 +1,21 @@
1
+ export class AdbDaemonWebUsbDeviceWatcher {
2
+ #callback;
3
+ #usbManager;
4
+ constructor(callback, usb) {
5
+ this.#callback = callback;
6
+ this.#usbManager = usb;
7
+ this.#usbManager.addEventListener("connect", this.handleConnect);
8
+ this.#usbManager.addEventListener("disconnect", this.handleDisconnect);
9
+ }
10
+ dispose() {
11
+ this.#usbManager.removeEventListener("connect", this.handleConnect);
12
+ this.#usbManager.removeEventListener("disconnect", this.handleDisconnect);
13
+ }
14
+ handleConnect = (e) => {
15
+ this.#callback(e.device.serialNumber);
16
+ };
17
+ handleDisconnect = () => {
18
+ this.#callback();
19
+ };
20
+ }
21
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,4BAA4B;IACrC,SAAS,CAAqC;IAC9C,WAAW,CAAM;IAEjB,YAAmB,QAA4C,EAAE,GAAQ;QACrE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QAEvB,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3E,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACpE,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAChC,YAAY,EACZ,IAAI,CAAC,gBAAgB,CACxB,CAAC;IACN,CAAC;IAEO,aAAa,GAAG,CAAC,CAAqB,EAAE,EAAE;QAC9C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC,CAAC;CACL"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@yume-chan/adb-daemon-webusb",
3
+ "version": "0.0.20",
4
+ "description": "Adb daemon transport connection for `@yume-chan/adb` using WebUSB API.",
5
+ "keywords": [
6
+ "webusb",
7
+ "adb"
8
+ ],
9
+ "license": "MIT",
10
+ "author": {
11
+ "name": "Simon Chan",
12
+ "email": "cnsimonchan@live.com",
13
+ "url": "https://chensi.moe/blog"
14
+ },
15
+ "homepage": "https://github.com/yume-chan/ya-webadb/tree/main/libraries/adb-daemon-webusb#readme",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/yume-chan/ya-webadb.git",
19
+ "directory": "libraries/adb-daemon-webusb"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/yume-chan/ya-webadb/issues"
23
+ },
24
+ "type": "module",
25
+ "main": "esm/index.js",
26
+ "types": "esm/index.d.ts",
27
+ "dependencies": {
28
+ "@types/w3c-web-usb": "^1.0.6",
29
+ "@yume-chan/adb": "^0.0.20",
30
+ "@yume-chan/stream-extra": "^0.0.20",
31
+ "@yume-chan/struct": "^0.0.20",
32
+ "tslib": "^2.5.2"
33
+ },
34
+ "devDependencies": {
35
+ "@yume-chan/eslint-config": "^1.0.0",
36
+ "@yume-chan/tsconfig": "^1.0.0",
37
+ "eslint": "^8.41.0",
38
+ "prettier": "^2.8.8",
39
+ "typescript": "^5.0.3"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc -b tsconfig.build.json",
43
+ "build:watch": "tsc -b tsconfig.build.json",
44
+ "lint": "eslint src/**/*.ts --fix && prettier src/**/*.ts --write --tab-width 4"
45
+ }
46
+ }