@yume-chan/adb-daemon-webusb 0.0.20 → 0.0.22
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 +24 -0
- package/CHANGELOG.md +15 -1
- package/README.md +46 -130
- package/esm/device.d.ts +5 -2
- package/esm/device.d.ts.map +1 -1
- package/esm/device.js +93 -50
- package/esm/device.js.map +1 -1
- package/esm/manager.d.ts +7 -1
- package/esm/manager.d.ts.map +1 -1
- package/esm/manager.js +13 -7
- package/esm/manager.js.map +1 -1
- package/esm/utils.js.map +1 -1
- package/esm/watcher.d.ts +0 -2
- package/esm/watcher.d.ts.map +1 -1
- package/esm/watcher.js +6 -6
- package/esm/watcher.js.map +1 -1
- package/package.json +9 -9
- package/src/device.ts +138 -90
- package/src/manager.ts +36 -11
- package/src/utils.ts +3 -3
- package/src/watcher.ts +8 -8
- package/tsconfig.build.tsbuildinfo +1 -1
- package/esm/connection.d.ts +0 -49
- package/esm/connection.d.ts.map +0 -1
- package/esm/connection.js +0 -230
- package/esm/connection.js.map +0 -1
package/CHANGELOG.json
CHANGED
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yume-chan/adb-daemon-webusb",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.0.22",
|
|
6
|
+
"tag": "@yume-chan/adb-daemon-webusb_v0.0.22",
|
|
7
|
+
"date": "Wed, 13 Dec 2023 05:57:27 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"none": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "Check incoming packet size to prevent Chrome from crashing"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"comment": "Add `exclusionFilters` option to `AdbDaemonWebUsbDeviceManager#requestDevice` method"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"comment": "`AdbDaemonWebUsbDevice` will generate a fake serial number from vid and pid if the device serial number is empty"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"version": "0.0.21",
|
|
24
|
+
"tag": "@yume-chan/adb-daemon-webusb_v0.0.21",
|
|
25
|
+
"date": "Fri, 25 Aug 2023 14:05:18 GMT",
|
|
26
|
+
"comments": {}
|
|
27
|
+
},
|
|
4
28
|
{
|
|
5
29
|
"version": "0.0.20",
|
|
6
30
|
"tag": "@yume-chan/adb-daemon-webusb_v0.0.20",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
# Change Log - @yume-chan/adb-daemon-webusb
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Wed, 13 Dec 2023 05:57:27 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 0.0.22
|
|
6
|
+
Wed, 13 Dec 2023 05:57:27 GMT
|
|
7
|
+
|
|
8
|
+
### Updates
|
|
9
|
+
|
|
10
|
+
- Check incoming packet size to prevent Chrome from crashing
|
|
11
|
+
- Add `exclusionFilters` option to `AdbDaemonWebUsbDeviceManager#requestDevice` method
|
|
12
|
+
- `AdbDaemonWebUsbDevice` will generate a fake serial number from vid and pid if the device serial number is empty
|
|
13
|
+
|
|
14
|
+
## 0.0.21
|
|
15
|
+
Fri, 25 Aug 2023 14:05:18 GMT
|
|
16
|
+
|
|
17
|
+
_Version update only_
|
|
4
18
|
|
|
5
19
|
## 0.0.20
|
|
6
20
|
Mon, 05 Jun 2023 02:51:41 GMT
|
package/README.md
CHANGED
|
@@ -1,130 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
Create a new instance of `AdbDaemonWebUsbDevice` using a specified `USBDevice` instance.
|
|
49
|
-
|
|
50
|
-
`USBDevice` and `USB` types are from WebUSB API.
|
|
51
|
-
|
|
52
|
-
The `filters` parameter specifies the `classCode`, `subclassCode` and `protocolCode` to use when searching for ADB interface. The default value is `[{ classCode: 0xff, subclassCode: 0x42, protocolCode: 0x1 }]`, defined by Google.
|
|
53
|
-
|
|
54
|
-
### `raw`
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
public get raw(): USBDevice;
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Gets the raw `USBDevice` from the device. Allow sending/receiving USB packets to other interfaces/endpoints. For example can be used with `@yume-chan/aoa` package.
|
|
61
|
-
|
|
62
|
-
### `connect`
|
|
63
|
-
|
|
64
|
-
```ts
|
|
65
|
-
public async connect(): Promise<
|
|
66
|
-
ReadableWritablePair<AdbPacketData, Consumable<AdbPacketInit>>
|
|
67
|
-
>
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Claim the device and create a pair of `AdbPacket` streams to the ADB interface.
|
|
71
|
-
|
|
72
|
-
## `AdbDaemonWebUsbDeviceManager`
|
|
73
|
-
|
|
74
|
-
A helper class that wraps the WebUSB API.
|
|
75
|
-
|
|
76
|
-
### `BROWSER`
|
|
77
|
-
|
|
78
|
-
```ts
|
|
79
|
-
public static readonly BROWSER: AdbDaemonWebUsbDeviceManager | undefined;
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Gets the instance of `AdbDaemonWebUsbDeviceManager` using browser WebUSB implementation.
|
|
83
|
-
|
|
84
|
-
May be `undefined` if the browser does not support WebUSB.
|
|
85
|
-
|
|
86
|
-
### constructor
|
|
87
|
-
|
|
88
|
-
```ts
|
|
89
|
-
public constructor(usbManager: USB);
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Create a new instance of `AdbDaemonWebUsbDeviceManager` using the specified WebUSB API implementation.
|
|
93
|
-
|
|
94
|
-
### `requestDevice`
|
|
95
|
-
|
|
96
|
-
```ts
|
|
97
|
-
public async requestDevice(
|
|
98
|
-
filters: AdbDeviceFilter[] = [ADB_DEFAULT_DEVICE_FILTER]
|
|
99
|
-
): Promise<AdbDaemonWebUsbDevice | undefined>
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Request access to a connected device.
|
|
103
|
-
This is a convince method for `usb.requestDevice()`.
|
|
104
|
-
|
|
105
|
-
The `filters` parameter must have `classCode`, `subclassCode` and `protocolCode` fields for selecting the ADB interface. It can also have `vendorId`, `productId` or `serialNumber` fields to limit the displayed device list.
|
|
106
|
-
|
|
107
|
-
Returns an `AdbDaemonWebUsbDevice` instance, or `undefined` if the user cancelled the picker.
|
|
108
|
-
|
|
109
|
-
### `getDevices`
|
|
110
|
-
|
|
111
|
-
```ts
|
|
112
|
-
public async getDevices(
|
|
113
|
-
filters: AdbDeviceFilter[] = [ADB_DEFAULT_DEVICE_FILTER]
|
|
114
|
-
): Promise<AdbDaemonWebUsbDevice[]>
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
Get all connected and authenticated devices.
|
|
118
|
-
|
|
119
|
-
This is a convince method for `usb.getDevices()`.
|
|
120
|
-
|
|
121
|
-
## Note on secure context
|
|
122
|
-
|
|
123
|
-
WebUSB requires a [secure context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) (HTTPS).
|
|
124
|
-
|
|
125
|
-
`localhost` is considered secure, so local development works. But to access a self-hosted server running on another machine, either add a certificate, or add the domain name to the allowlist on each client machine:
|
|
126
|
-
|
|
127
|
-
1. Open `chrome://flags/#unsafely-treat-insecure-origin-as-secure`
|
|
128
|
-
2. Add the protocol and domain part of your url (e.g. `http://192.168.0.100:9000`) to the input box
|
|
129
|
-
3. Choose `Enable` from the dropdown menu
|
|
130
|
-
4. Restart browser
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img alt="Tango" src="https://raw.githubusercontent.com/yume-chan/ya-webadb/main/.github/logo.svg" width="200">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">@yume-chan/adb-daemon-webusb</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
Adb daemon transport connection for `@yume-chan/adb` using WebUSB API.
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://github.com/yume-chan/ya-webadb/blob/main/LICENSE">
|
|
13
|
+
<img alt="MIT License" src="https://img.shields.io/github/license/yume-chan/ya-webadb">
|
|
14
|
+
</a>
|
|
15
|
+
<a href="https://github.com/yume-chan/ya-webadb/releases">
|
|
16
|
+
<img alt="GitHub release" src="https://img.shields.io/github/v/release/yume-chan/ya-webadb?logo=github">
|
|
17
|
+
</a>
|
|
18
|
+
<a href="https://www.npmjs.com/package/@yume-chan/adb">
|
|
19
|
+
<img alt="npm" src="https://img.shields.io/npm/dm/%40yume-chan/adb?logo=npm">
|
|
20
|
+
</a>
|
|
21
|
+
<a href="https://discord.gg/26k3ttC2PN">
|
|
22
|
+
<img alt="Discord" src="https://img.shields.io/discord/1120215514732564502?logo=discord&logoColor=%23ffffff&label=Discord">
|
|
23
|
+
</a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
This package is part of [Tango ADB](https://github.com/yume-chan/ya-webadb). Generally you need multiple packages to build a complete ADB client that can run on Web browsers and Node.js. Read the documentation for more information.
|
|
27
|
+
|
|
28
|
+
## Documentation
|
|
29
|
+
|
|
30
|
+
Check the latest documentation at https://tango-adb.github.io/docs/
|
|
31
|
+
|
|
32
|
+
## Sponsors
|
|
33
|
+
|
|
34
|
+
[Become a backer](https://opencollective.com/ya-webadb) and get your image on our README on Github with a link to your site.
|
|
35
|
+
|
|
36
|
+
<a href="https://opencollective.com/ya-webadb/backer/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/0/avatar.svg?requireActive=false"></a>
|
|
37
|
+
<a href="https://opencollective.com/ya-webadb/backer/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/1/avatar.svg?requireActive=false"></a>
|
|
38
|
+
<a href="https://opencollective.com/ya-webadb/backer/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/2/avatar.svg?requireActive=false"></a>
|
|
39
|
+
<a href="https://opencollective.com/ya-webadb/backer/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/3/avatar.svg?requireActive=false"></a>
|
|
40
|
+
<a href="https://opencollective.com/ya-webadb/backer/4/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/4/avatar.svg?requireActive=false"></a>
|
|
41
|
+
<a href="https://opencollective.com/ya-webadb/backer/5/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/5/avatar.svg?requireActive=false"></a>
|
|
42
|
+
<a href="https://opencollective.com/ya-webadb/backer/6/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/6/avatar.svg?requireActive=false"></a>
|
|
43
|
+
<a href="https://opencollective.com/ya-webadb/backer/7/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/7/avatar.svg?requireActive=false"></a>
|
|
44
|
+
<a href="https://opencollective.com/ya-webadb/backer/8/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/8/avatar.svg?requireActive=false"></a>
|
|
45
|
+
<a href="https://opencollective.com/ya-webadb/backer/9/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/9/avatar.svg?requireActive=false"></a>
|
|
46
|
+
<a href="https://opencollective.com/ya-webadb/backer/10/website?requireActive=false" target="_blank"><img src="https://opencollective.com/ya-webadb/backer/10/avatar.svg?requireActive=false"></a>
|
package/esm/device.d.ts
CHANGED
|
@@ -13,6 +13,9 @@ export declare const ADB_DEFAULT_DEVICE_FILTER: {
|
|
|
13
13
|
};
|
|
14
14
|
export declare class AdbDaemonWebUsbConnection implements ReadableWritablePair<AdbPacketData, Consumable<AdbPacketInit>> {
|
|
15
15
|
#private;
|
|
16
|
+
get device(): AdbDaemonWebUsbDevice;
|
|
17
|
+
get inEndpoint(): USBEndpoint;
|
|
18
|
+
get outEndpoint(): USBEndpoint;
|
|
16
19
|
get readable(): ReadableStream<AdbPacketData>;
|
|
17
20
|
get writable(): WritableStream<Consumable<{
|
|
18
21
|
command: number;
|
|
@@ -22,7 +25,7 @@ export declare class AdbDaemonWebUsbConnection implements ReadableWritablePair<A
|
|
|
22
25
|
magic: number;
|
|
23
26
|
payload: Uint8Array;
|
|
24
27
|
}>>;
|
|
25
|
-
constructor(device:
|
|
28
|
+
constructor(device: AdbDaemonWebUsbDevice, inEndpoint: USBEndpoint, outEndpoint: USBEndpoint, usbManager: USB);
|
|
26
29
|
}
|
|
27
30
|
export declare class AdbDaemonWebUsbDevice implements AdbDaemonDevice {
|
|
28
31
|
#private;
|
|
@@ -40,6 +43,6 @@ export declare class AdbDaemonWebUsbDevice implements AdbDaemonDevice {
|
|
|
40
43
|
* Claim the device and create a pair of `AdbPacket` streams to the ADB interface.
|
|
41
44
|
* @returns The pair of `AdbPacket` streams.
|
|
42
45
|
*/
|
|
43
|
-
connect(): Promise<
|
|
46
|
+
connect(): Promise<AdbDaemonWebUsbConnection>;
|
|
44
47
|
}
|
|
45
48
|
//# sourceMappingURL=device.d.ts.map
|
package/esm/device.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,IAAI,MAAM,0BAET;IAGD,IAAI,UAAU,gBAEb;IAGD,IAAI,WAAW,gBAEd;IAGD,IAAI,QAAQ,kCAEX;IAGD,IAAI,QAAQ;;;;;;;QAEX;gBAGG,MAAM,EAAE,qBAAqB,EAC7B,UAAU,EAAE,WAAW,EACvB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,GAAG;CAsJtB;AAED,qBAAa,qBAAsB,YAAW,eAAe;;IAKzD,IAAI,GAAG,cAEN;IAGD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;OAKG;gBAEC,MAAM,EAAE,SAAS,EACjB,OAAO,+BAAiD,EACxD,UAAU,EAAE,GAAG;IAqDnB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,yBAAyB,CAAC;CAStD"}
|
package/esm/device.js
CHANGED
|
@@ -62,6 +62,18 @@ class Uint8ArrayExactReadable {
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
export class AdbDaemonWebUsbConnection {
|
|
65
|
+
#device;
|
|
66
|
+
get device() {
|
|
67
|
+
return this.#device;
|
|
68
|
+
}
|
|
69
|
+
#inEndpoint;
|
|
70
|
+
get inEndpoint() {
|
|
71
|
+
return this.#inEndpoint;
|
|
72
|
+
}
|
|
73
|
+
#outEndpoint;
|
|
74
|
+
get outEndpoint() {
|
|
75
|
+
return this.#outEndpoint;
|
|
76
|
+
}
|
|
65
77
|
#readable;
|
|
66
78
|
get readable() {
|
|
67
79
|
return this.#readable;
|
|
@@ -71,12 +83,15 @@ export class AdbDaemonWebUsbConnection {
|
|
|
71
83
|
return this.#writable;
|
|
72
84
|
}
|
|
73
85
|
constructor(device, inEndpoint, outEndpoint, usbManager) {
|
|
86
|
+
this.#device = device;
|
|
87
|
+
this.#inEndpoint = inEndpoint;
|
|
88
|
+
this.#outEndpoint = outEndpoint;
|
|
74
89
|
let closed = false;
|
|
75
90
|
const duplex = new DuplexStreamFactory({
|
|
76
91
|
close: async () => {
|
|
77
92
|
try {
|
|
78
93
|
closed = true;
|
|
79
|
-
await device.close();
|
|
94
|
+
await device.raw.close();
|
|
80
95
|
}
|
|
81
96
|
catch {
|
|
82
97
|
/* device may have already disconnected */
|
|
@@ -88,67 +103,34 @@ export class AdbDaemonWebUsbConnection {
|
|
|
88
103
|
},
|
|
89
104
|
});
|
|
90
105
|
function handleUsbDisconnect(e) {
|
|
91
|
-
if (e.device === device) {
|
|
106
|
+
if (e.device === device.raw) {
|
|
92
107
|
duplex.dispose().catch(unreachable);
|
|
93
108
|
}
|
|
94
109
|
}
|
|
95
110
|
usbManager.addEventListener("disconnect", handleUsbDisconnect);
|
|
96
111
|
this.#readable = duplex.wrapReadable(new ReadableStream({
|
|
97
|
-
async
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
}
|
|
112
|
+
pull: async (controller) => {
|
|
113
|
+
const packet = await this.#transferIn();
|
|
114
|
+
if (packet) {
|
|
116
115
|
controller.enqueue(packet);
|
|
117
116
|
}
|
|
118
|
-
|
|
119
|
-
|
|
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;
|
|
117
|
+
else {
|
|
118
|
+
controller.close();
|
|
137
119
|
}
|
|
138
120
|
},
|
|
139
|
-
}));
|
|
121
|
+
}, { highWaterMark: 0 }));
|
|
140
122
|
const zeroMask = outEndpoint.packetSize - 1;
|
|
141
123
|
this.#writable = pipeFrom(duplex.createWritable(new ConsumableWritableStream({
|
|
142
124
|
write: async (chunk) => {
|
|
143
125
|
try {
|
|
144
|
-
await device.transferOut(outEndpoint.endpointNumber, chunk);
|
|
126
|
+
await device.raw.transferOut(outEndpoint.endpointNumber, chunk);
|
|
145
127
|
// In USB protocol, a not-full packet indicates the end of a transfer.
|
|
146
128
|
// If the payload size is a multiple of the packet size,
|
|
147
129
|
// we need to send an empty packet to indicate the end,
|
|
148
130
|
// so the OS will send it to the device immediately.
|
|
149
131
|
if (zeroMask &&
|
|
150
132
|
(chunk.byteLength & zeroMask) === 0) {
|
|
151
|
-
await device.transferOut(outEndpoint.endpointNumber, EMPTY_UINT8_ARRAY);
|
|
133
|
+
await device.raw.transferOut(outEndpoint.endpointNumber, EMPTY_UINT8_ARRAY);
|
|
152
134
|
}
|
|
153
135
|
}
|
|
154
136
|
catch (e) {
|
|
@@ -160,6 +142,53 @@ export class AdbDaemonWebUsbConnection {
|
|
|
160
142
|
},
|
|
161
143
|
})), new AdbPacketSerializeStream());
|
|
162
144
|
}
|
|
145
|
+
async #transferIn() {
|
|
146
|
+
try {
|
|
147
|
+
while (true) {
|
|
148
|
+
// ADB daemon sends each packet in two parts, the 24-byte header and the payload.
|
|
149
|
+
const result = await this.#device.raw.transferIn(this.#inEndpoint.endpointNumber, this.#inEndpoint.packetSize);
|
|
150
|
+
if (result.data.byteLength !== 24) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
// Per spec, the `result.data` always covers the whole `buffer`.
|
|
154
|
+
const buffer = new Uint8Array(result.data.buffer);
|
|
155
|
+
const stream = new Uint8ArrayExactReadable(buffer);
|
|
156
|
+
// Add `payload` field to its type, it's assigned below.
|
|
157
|
+
const packet = AdbPacketHeader.deserialize(stream);
|
|
158
|
+
if (packet.magic !== (packet.command ^ 0xffffffff)) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (packet.payloadLength !== 0) {
|
|
162
|
+
const result = await this.#device.raw.transferIn(this.#inEndpoint.endpointNumber, packet.payloadLength);
|
|
163
|
+
packet.payload = new Uint8Array(result.data.buffer);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
packet.payload = EMPTY_UINT8_ARRAY;
|
|
167
|
+
}
|
|
168
|
+
return packet;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
// On Windows, disconnecting the device will cause `NetworkError` to be thrown,
|
|
173
|
+
// even before the `disconnect` event is fired.
|
|
174
|
+
// We need to wait a little bit and check if the device is still connected.
|
|
175
|
+
// https://github.com/WICG/webusb/issues/219
|
|
176
|
+
if (isErrorName(e, "NetworkError")) {
|
|
177
|
+
await new Promise((resolve) => {
|
|
178
|
+
setTimeout(() => {
|
|
179
|
+
resolve();
|
|
180
|
+
}, 100);
|
|
181
|
+
});
|
|
182
|
+
if (closed) {
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
throw e;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
throw e;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
163
192
|
}
|
|
164
193
|
export class AdbDaemonWebUsbDevice {
|
|
165
194
|
#filters;
|
|
@@ -168,8 +197,9 @@ export class AdbDaemonWebUsbDevice {
|
|
|
168
197
|
get raw() {
|
|
169
198
|
return this.#raw;
|
|
170
199
|
}
|
|
200
|
+
#serial;
|
|
171
201
|
get serial() {
|
|
172
|
-
return this.#
|
|
202
|
+
return this.#serial;
|
|
173
203
|
}
|
|
174
204
|
get name() {
|
|
175
205
|
return this.#raw.productName;
|
|
@@ -182,14 +212,19 @@ export class AdbDaemonWebUsbDevice {
|
|
|
182
212
|
*/
|
|
183
213
|
constructor(device, filters = [ADB_DEFAULT_DEVICE_FILTER], usbManager) {
|
|
184
214
|
this.#raw = device;
|
|
215
|
+
if (device.serialNumber) {
|
|
216
|
+
this.#serial = device.serialNumber;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this.#serial =
|
|
220
|
+
device.vendorId.toString(16).padStart(4, "0") +
|
|
221
|
+
"x" +
|
|
222
|
+
device.productId.toString(16).padStart(4, "0");
|
|
223
|
+
}
|
|
185
224
|
this.#filters = filters;
|
|
186
225
|
this.#usbManager = usbManager;
|
|
187
226
|
}
|
|
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() {
|
|
227
|
+
async #claimInterface() {
|
|
193
228
|
if (!this.#raw.opened) {
|
|
194
229
|
await this.#raw.open();
|
|
195
230
|
}
|
|
@@ -207,7 +242,15 @@ export class AdbDaemonWebUsbDevice {
|
|
|
207
242
|
await this.#raw.selectAlternateInterface(interface_.interfaceNumber, alternate.alternateSetting);
|
|
208
243
|
}
|
|
209
244
|
const { inEndpoint, outEndpoint } = findUsbEndpoints(alternate.endpoints);
|
|
210
|
-
return
|
|
245
|
+
return [inEndpoint, outEndpoint];
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Claim the device and create a pair of `AdbPacket` streams to the ADB interface.
|
|
249
|
+
* @returns The pair of `AdbPacket` streams.
|
|
250
|
+
*/
|
|
251
|
+
async connect() {
|
|
252
|
+
const [inEndpoint, outEndpoint] = await this.#claimInterface();
|
|
253
|
+
return new AdbDaemonWebUsbConnection(this, inEndpoint, outEndpoint, this.#usbManager);
|
|
211
254
|
}
|
|
212
255
|
}
|
|
213
256
|
//# sourceMappingURL=device.js.map
|
package/esm/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"AAKA,OAAO,EACH,eAAe,EACf,wBAAwB,EACxB,WAAW,GACd,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EACH,wBAAwB,EACxB,mBAAmB,EACnB,cAAc,EACd,QAAQ,GACX,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACrC,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,CAAC;CACiB,CAAC;AAErC;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,SAAwB;IAC9C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"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"}
|
package/esm/manager.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
/// <reference types="w3c-web-usb" />
|
|
2
2
|
import { AdbDaemonWebUsbDevice } from "./device.js";
|
|
3
3
|
import type { AdbDeviceFilter } from "./utils.js";
|
|
4
|
+
export declare namespace AdbDaemonWebUsbDeviceManager {
|
|
5
|
+
interface RequestDeviceOptions {
|
|
6
|
+
filters?: AdbDeviceFilter[] | undefined;
|
|
7
|
+
exclusionFilters?: USBDeviceFilter[] | undefined;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
4
10
|
export declare class AdbDaemonWebUsbDeviceManager {
|
|
5
11
|
#private;
|
|
6
12
|
/**
|
|
@@ -27,7 +33,7 @@ export declare class AdbDaemonWebUsbDeviceManager {
|
|
|
27
33
|
* @returns An {@link AdbDaemonWebUsbDevice} instance if the user selected a device,
|
|
28
34
|
* or `undefined` if the user cancelled the device picker.
|
|
29
35
|
*/
|
|
30
|
-
requestDevice(
|
|
36
|
+
requestDevice(options?: AdbDaemonWebUsbDeviceManager.RequestDeviceOptions): Promise<AdbDaemonWebUsbDevice | undefined>;
|
|
31
37
|
/**
|
|
32
38
|
* Get all connected and authenticated devices.
|
|
33
39
|
* This is a convince method for `usb.getDevices()`.
|
package/esm/manager.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,yBAAiB,4BAA4B,CAAC;IAC1C,UAAiB,oBAAoB;QACjC,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC;QACxC,gBAAgB,CAAC,EAAE,eAAe,EAAE,GAAG,SAAS,CAAC;KACpD;CACJ;AAED,qBAAa,4BAA4B;;IACrC;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,2CAIH;IAIpB;;;OAGG;gBACS,UAAU,EAAE,GAAG;IAI3B;;;;;;;;;;;;OAYG;IACG,aAAa,CACf,OAAO,GAAE,4BAA4B,CAAC,oBAAyB,GAChE,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IA0B7C;;;;;;;;;;;OAWG;IACG,UAAU,CACZ,OAAO,GAAE,eAAe,EAAgC,GACzD,OAAO,CAAC,qBAAqB,EAAE,CAAC;CA8CtC"}
|
package/esm/manager.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ADB_DEFAULT_DEVICE_FILTER, AdbDaemonWebUsbDevice } from "./device.js";
|
|
2
2
|
import { findUsbAlternateInterface, isErrorName } from "./utils.js";
|
|
3
|
-
class AdbDaemonWebUsbDeviceManager {
|
|
3
|
+
export class AdbDaemonWebUsbDeviceManager {
|
|
4
4
|
/**
|
|
5
5
|
* Gets the instance of {@link AdbDaemonWebUsbDeviceManager} using browser WebUSB implementation.
|
|
6
6
|
*
|
|
@@ -31,12 +31,16 @@ class AdbDaemonWebUsbDeviceManager {
|
|
|
31
31
|
* @returns An {@link AdbDaemonWebUsbDevice} instance if the user selected a device,
|
|
32
32
|
* or `undefined` if the user cancelled the device picker.
|
|
33
33
|
*/
|
|
34
|
-
async requestDevice(
|
|
34
|
+
async requestDevice(options = {}) {
|
|
35
|
+
if (!options.filters) {
|
|
36
|
+
options.filters = [ADB_DEFAULT_DEVICE_FILTER];
|
|
37
|
+
}
|
|
38
|
+
else if (options.filters.length === 0) {
|
|
39
|
+
throw new TypeError("filters must not be empty");
|
|
40
|
+
}
|
|
35
41
|
try {
|
|
36
|
-
const device = await this.#usbManager.requestDevice(
|
|
37
|
-
|
|
38
|
-
});
|
|
39
|
-
return new AdbDaemonWebUsbDevice(device, filters, this.#usbManager);
|
|
42
|
+
const device = await this.#usbManager.requestDevice(options);
|
|
43
|
+
return new AdbDaemonWebUsbDevice(device, options.filters, this.#usbManager);
|
|
40
44
|
}
|
|
41
45
|
catch (e) {
|
|
42
46
|
// No device selected
|
|
@@ -59,6 +63,9 @@ class AdbDaemonWebUsbDeviceManager {
|
|
|
59
63
|
* @returns An array of {@link AdbDaemonWebUsbDevice} instances for all connected and authenticated devices.
|
|
60
64
|
*/
|
|
61
65
|
async getDevices(filters = [ADB_DEFAULT_DEVICE_FILTER]) {
|
|
66
|
+
if (filters.length === 0) {
|
|
67
|
+
throw new TypeError("filters must not be empty");
|
|
68
|
+
}
|
|
62
69
|
const devices = await this.#usbManager.getDevices();
|
|
63
70
|
return devices
|
|
64
71
|
.filter((device) => {
|
|
@@ -88,5 +95,4 @@ class AdbDaemonWebUsbDeviceManager {
|
|
|
88
95
|
.map((device) => new AdbDaemonWebUsbDevice(device, filters, this.#usbManager));
|
|
89
96
|
}
|
|
90
97
|
}
|
|
91
|
-
export { AdbDaemonWebUsbDeviceManager };
|
|
92
98
|
//# sourceMappingURL=manager.js.map
|
package/esm/manager.js.map
CHANGED
|
@@ -1 +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;
|
|
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;AASpE,MAAM,OAAO,4BAA4B;IACrC;;;;OAIG;IACH,MAAM,CAAU,OAAO,GACnB,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,YAAY,UAAe;QACvB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,aAAa,CACf,UAA6D,EAAE;QAE/D,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,OAAO,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAC/C,OAAkC,CACrC,CAAC;YACF,OAAO,IAAI,qBAAqB,CAC5B,MAAM,EACN,OAAO,CAAC,OAAO,EACf,IAAI,CAAC,WAAW,CACnB,CAAC;QACN,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,qBAAqB;YACrB,IAAI,WAAW,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC;gBAClC,OAAO,SAAS,CAAC;YACrB,CAAC;YAED,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,UAAU,CACZ,UAA6B,CAAC,yBAAyB,CAAC;QAExD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACrD,CAAC;QAED,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,CAAC;gBAC3B,IACI,UAAU,IAAI,MAAM;oBACpB,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EACrC,CAAC;oBACC,SAAS;gBACb,CAAC;gBACD,IACI,WAAW,IAAI,MAAM;oBACrB,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,EACvC,CAAC;oBACC,SAAS;gBACb,CAAC;gBACD,IACI,cAAc,IAAI,MAAM;oBACxB,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,EAC7C,CAAC;oBACC,SAAS;gBACb,CAAC;gBAED,IAAI,CAAC;oBACD,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC3C,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAAC,MAAM,CAAC;oBACL,SAAS;gBACb,CAAC;YACL,CAAC;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC;aACD,GAAG,CACA,CAAC,MAAM,EAAE,EAAE,CACP,IAAI,qBAAqB,CACrB,MAAM,EACN,OAAO,EACP,IAAI,CAAC,WAAW,CACnB,CACR,CAAC;IACV,CAAC"}
|
package/esm/utils.js.map
CHANGED
|
@@ -1 +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;
|
|
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,CAAC;QAChD,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;YAChD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC5C,IAAI,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC7C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;gBACpD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC5D,CAAC"}
|
package/esm/watcher.d.ts
CHANGED
package/esm/watcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":";AAAA,qBAAa,4BAA4B;;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":";AAAA,qBAAa,4BAA4B;;gBAIzB,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG;IAQlE,OAAO,IAAI,IAAI;CAelB"}
|