@yume-chan/adb 0.0.11 → 0.0.14
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 +39 -0
- package/CHANGELOG.md +23 -1
- package/README.md +24 -17
- package/esm/adb.d.ts +10 -9
- package/esm/adb.d.ts.map +1 -1
- package/esm/adb.js +87 -64
- package/esm/adb.js.map +1 -1
- package/esm/auth.d.ts +6 -6
- package/esm/auth.d.ts.map +1 -1
- package/esm/auth.js +8 -6
- package/esm/auth.js.map +1 -1
- package/esm/backend.d.ts +2 -2
- package/esm/commands/install.d.ts.map +1 -1
- package/esm/commands/install.js +5 -7
- package/esm/commands/install.js.map +1 -1
- package/esm/commands/reverse.d.ts +7 -10
- package/esm/commands/reverse.d.ts.map +1 -1
- package/esm/commands/reverse.js +9 -15
- package/esm/commands/reverse.js.map +1 -1
- package/esm/commands/subprocess/index.d.ts +19 -20
- package/esm/commands/subprocess/index.d.ts.map +1 -1
- package/esm/commands/subprocess/index.js +36 -31
- package/esm/commands/subprocess/index.js.map +1 -1
- package/esm/commands/subprocess/legacy.d.ts +14 -7
- package/esm/commands/subprocess/legacy.d.ts.map +1 -1
- package/esm/commands/subprocess/legacy.js +14 -5
- package/esm/commands/subprocess/legacy.js.map +1 -1
- package/esm/commands/subprocess/protocol.d.ts +3 -2
- package/esm/commands/subprocess/protocol.d.ts.map +1 -1
- package/esm/commands/subprocess/protocol.js +6 -4
- package/esm/commands/subprocess/protocol.js.map +1 -1
- package/esm/commands/subprocess/protocols/index.d.ts +4 -0
- package/esm/commands/subprocess/protocols/index.d.ts.map +1 -0
- package/esm/commands/subprocess/protocols/index.js +4 -0
- package/esm/commands/subprocess/protocols/index.js.map +1 -0
- package/esm/commands/subprocess/protocols/none.d.ts +35 -0
- package/esm/commands/subprocess/protocols/none.d.ts.map +1 -0
- package/esm/commands/subprocess/protocols/none.js +53 -0
- package/esm/commands/subprocess/protocols/none.js.map +1 -0
- package/esm/commands/subprocess/protocols/shell.d.ts +39 -0
- package/esm/commands/subprocess/protocols/shell.d.ts.map +1 -0
- package/esm/commands/subprocess/protocols/shell.js +155 -0
- package/esm/commands/subprocess/protocols/shell.js.map +1 -0
- package/esm/commands/subprocess/protocols/types.d.ts +50 -0
- package/esm/commands/subprocess/protocols/types.d.ts.map +1 -0
- package/esm/commands/subprocess/protocols/types.js +2 -0
- package/esm/commands/subprocess/protocols/types.js.map +1 -0
- package/esm/commands/subprocess/types.d.ts +9 -6
- package/esm/commands/subprocess/types.d.ts.map +1 -1
- package/esm/commands/sync/list.d.ts +25 -1
- package/esm/commands/sync/list.d.ts.map +1 -1
- package/esm/commands/sync/list.js +40 -5
- package/esm/commands/sync/list.js.map +1 -1
- package/esm/commands/sync/pull.d.ts.map +1 -1
- package/esm/commands/sync/pull.js +6 -3
- package/esm/commands/sync/pull.js.map +1 -1
- package/esm/commands/sync/request.d.ts +1 -0
- package/esm/commands/sync/request.d.ts.map +1 -1
- package/esm/commands/sync/request.js +1 -0
- package/esm/commands/sync/request.js.map +1 -1
- package/esm/commands/sync/response.d.ts +2 -1
- package/esm/commands/sync/response.d.ts.map +1 -1
- package/esm/commands/sync/response.js +2 -1
- package/esm/commands/sync/response.js.map +1 -1
- package/esm/commands/sync/stat.d.ts +13 -1
- package/esm/commands/sync/stat.d.ts.map +1 -1
- package/esm/commands/sync/stat.js +20 -7
- package/esm/commands/sync/stat.js.map +1 -1
- package/esm/commands/sync/sync.d.ts +13 -35
- package/esm/commands/sync/sync.d.ts.map +1 -1
- package/esm/commands/sync/sync.js +39 -9
- package/esm/commands/sync/sync.js.map +1 -1
- package/esm/crypto.d.ts +23 -10
- package/esm/crypto.d.ts.map +1 -1
- package/esm/crypto.js +64 -46
- package/esm/crypto.js.map +1 -1
- package/esm/features.d.ts +4 -2
- package/esm/features.d.ts.map +1 -1
- package/esm/features.js +6 -2
- package/esm/features.js.map +1 -1
- package/esm/packet.d.ts +21 -2
- package/esm/packet.d.ts.map +1 -1
- package/esm/packet.js +2 -2
- package/esm/packet.js.map +1 -1
- package/esm/socket/dispatcher.d.ts +34 -23
- package/esm/socket/dispatcher.d.ts.map +1 -1
- package/esm/socket/dispatcher.js +92 -70
- package/esm/socket/dispatcher.js.map +1 -1
- package/esm/socket/socket.d.ts +29 -8
- package/esm/socket/socket.d.ts.map +1 -1
- package/esm/socket/socket.js +41 -27
- package/esm/socket/socket.js.map +1 -1
- package/esm/stream/detect.d.ts +1 -17
- package/esm/stream/detect.d.ts.map +1 -1
- package/esm/stream/detect.js +4 -5
- package/esm/stream/detect.js.map +1 -1
- package/esm/stream/detect.polyfill.d.ts.map +1 -1
- package/esm/stream/detect.polyfill.js +4 -1
- package/esm/stream/detect.polyfill.js.map +1 -1
- package/esm/stream/transform.d.ts +37 -32
- package/esm/stream/transform.d.ts.map +1 -1
- package/esm/stream/transform.js +106 -92
- package/esm/stream/transform.js.map +1 -1
- package/esm/utils/encoding.d.ts.map +1 -1
- package/esm/utils/encoding.js.map +1 -1
- package/esm/utils/index.d.ts +1 -1
- package/esm/utils/index.d.ts.map +1 -1
- package/esm/utils/index.js +1 -1
- package/esm/utils/index.js.map +1 -1
- package/package.json +6 -6
- package/src/adb.ts +105 -76
- package/src/auth.ts +21 -18
- package/src/backend.ts +2 -2
- package/src/commands/install.ts +7 -9
- package/src/commands/reverse.ts +13 -24
- package/src/commands/subprocess/index.ts +57 -42
- package/src/commands/subprocess/protocols/index.ts +3 -0
- package/src/commands/subprocess/{legacy.ts → protocols/none.ts} +20 -10
- package/src/commands/subprocess/{protocol.ts → protocols/shell.ts} +22 -17
- package/src/commands/subprocess/{types.ts → protocols/types.ts} +13 -9
- package/src/commands/sync/list.ts +51 -5
- package/src/commands/sync/pull.ts +6 -3
- package/src/commands/sync/request.ts +1 -0
- package/src/commands/sync/response.ts +8 -2
- package/src/commands/sync/stat.ts +36 -9
- package/src/commands/sync/sync.ts +55 -19
- package/src/crypto.ts +72 -56
- package/src/features.ts +6 -2
- package/src/packet.ts +17 -6
- package/src/socket/dispatcher.ts +133 -88
- package/src/socket/socket.ts +61 -48
- package/src/stream/detect.polyfill.ts +4 -1
- package/src/stream/detect.ts +4 -24
- package/src/stream/transform.ts +133 -116
- package/src/utils/index.ts +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/src/utils/encoding.ts +0 -13
package/CHANGELOG.json
CHANGED
|
@@ -1,6 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yume-chan/adb",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.0.14",
|
|
6
|
+
"tag": "@yume-chan/adb_v0.0.14",
|
|
7
|
+
"date": "Sat, 30 Apr 2022 14:05:48 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"none": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "Fix an issue where `subprocess.spawn` doesn't work on Android 6"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"comment": "Add an `Adb#close()` method to gracefully shutdown a connection"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"version": "0.0.13",
|
|
21
|
+
"tag": "@yume-chan/adb_v0.0.13",
|
|
22
|
+
"date": "Thu, 28 Apr 2022 01:23:53 GMT",
|
|
23
|
+
"comments": {
|
|
24
|
+
"none": [
|
|
25
|
+
{
|
|
26
|
+
"comment": "Add support for raw shell mode"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"comment": "Add support for LIS2 command in Sync protocol"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"comment": "Add workaround for the push_mkdir issue in Android 9"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"version": "0.0.12",
|
|
39
|
+
"tag": "@yume-chan/adb_v0.0.12",
|
|
40
|
+
"date": "Sun, 03 Apr 2022 11:18:47 GMT",
|
|
41
|
+
"comments": {}
|
|
42
|
+
},
|
|
4
43
|
{
|
|
5
44
|
"version": "0.0.11",
|
|
6
45
|
"tag": "@yume-chan/adb_v0.0.11",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
# Change Log - @yume-chan/adb
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Sat, 30 Apr 2022 14:05:48 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 0.0.14
|
|
6
|
+
Sat, 30 Apr 2022 14:05:48 GMT
|
|
7
|
+
|
|
8
|
+
### Updates
|
|
9
|
+
|
|
10
|
+
- Fix an issue where `subprocess.spawn` doesn't work on Android 6
|
|
11
|
+
- Add an `Adb#close()` method to gracefully shutdown a connection
|
|
12
|
+
|
|
13
|
+
## 0.0.13
|
|
14
|
+
Thu, 28 Apr 2022 01:23:53 GMT
|
|
15
|
+
|
|
16
|
+
### Updates
|
|
17
|
+
|
|
18
|
+
- Add support for raw shell mode
|
|
19
|
+
- Add support for LIS2 command in Sync protocol
|
|
20
|
+
- Add workaround for the push_mkdir issue in Android 9
|
|
21
|
+
|
|
22
|
+
## 0.0.12
|
|
23
|
+
Sun, 03 Apr 2022 11:18:47 GMT
|
|
24
|
+
|
|
25
|
+
_Version update only_
|
|
4
26
|
|
|
5
27
|
## 0.0.11
|
|
6
28
|
Sun, 03 Apr 2022 10:54:15 GMT
|
package/README.md
CHANGED
|
@@ -18,9 +18,10 @@ TypeScript implementation of Android Debug Bridge (ADB) protocol.
|
|
|
18
18
|
- [AdbAuthenticator](#adbauthenticator)
|
|
19
19
|
- [`authenticate`](#authenticate)
|
|
20
20
|
- [Stream multiplex](#stream-multiplex)
|
|
21
|
-
- [Backend](#backend-1)
|
|
22
21
|
- [Commands](#commands)
|
|
23
|
-
- [
|
|
22
|
+
- [subprocess](#subprocess)
|
|
23
|
+
- [raw mode](#raw-mode)
|
|
24
|
+
- [pty mode](#pty-mode)
|
|
24
25
|
- [usb](#usb)
|
|
25
26
|
- [tcpip](#tcpip)
|
|
26
27
|
- [sync](#sync)
|
|
@@ -48,10 +49,9 @@ Each backend may have different requirements.
|
|
|
48
49
|
| | Chrome | Edge | Firefox | Internet Explorer | Safari | Node.js |
|
|
49
50
|
| ------------------------------- | ------ | ---- | ------- | ----------------- | ------ | ------------------- |
|
|
50
51
|
| `@yume-chan/struct`<sup>1</sup> | 67 | 79 | 68 | No | 14 | 8.3<sup>2</sup>, 11 |
|
|
51
|
-
| [Streams][MDN_Streams] | 67 | 79 | No | No | 14.1 | 16.5 |
|
|
52
52
|
| *Overall* | 67 | 79 | No | No | 14.1 | 16.5 |
|
|
53
53
|
|
|
54
|
-
<sup>1</sup> `uint64` and `string` used.
|
|
54
|
+
<sup>1</sup> `uint64` and `string` are used.
|
|
55
55
|
|
|
56
56
|
<sup>2</sup> `TextEncoder` and `TextDecoder` are only available in `util` module. Need to be assigned to `globalThis`.
|
|
57
57
|
|
|
@@ -61,8 +61,6 @@ Each backend may have different requirements.
|
|
|
61
61
|
| --------------- | ------ | ---- | ------- | ----------------- | ------ | ------- |
|
|
62
62
|
| Top-level await | 89 | 89 | 89 | No | 15 | 14.8 |
|
|
63
63
|
|
|
64
|
-
[MDN_Streams]: https://developer.mozilla.org/en-US/docs/Web/API/Streams_API
|
|
65
|
-
|
|
66
64
|
## Connection
|
|
67
65
|
|
|
68
66
|
This library doesn't tie to a specific transportation method.
|
|
@@ -79,7 +77,7 @@ connect(): ValueOrPromise<ReadableWritablePair<AdbPacketCore, AdbPacketInit>>
|
|
|
79
77
|
|
|
80
78
|
Connect to a device and create a pair of `AdbPacket` streams.
|
|
81
79
|
|
|
82
|
-
The backend is responsible for serializing and deserializing the packets
|
|
80
|
+
The backend, instead of the core library, is responsible for serializing and deserializing the packets. Because it's extreme slow for WebUSB backend (`@yume-chan/adb-backend-webusb`) to read packets with unknown size.
|
|
83
81
|
|
|
84
82
|
## Authentication
|
|
85
83
|
|
|
@@ -133,7 +131,7 @@ static async authenticate(
|
|
|
133
131
|
|
|
134
132
|
Call this method to authenticate the connection and create an `Adb` instance.
|
|
135
133
|
|
|
136
|
-
|
|
134
|
+
If an authentication process failed, it's possible to call `authenticate` again on the same connection (`AdbPacket` stream pair). Every time the device receives a `CNXN` packet, it resets all internal state, and starts a new authentication process.
|
|
137
135
|
|
|
138
136
|
## Stream multiplex
|
|
139
137
|
|
|
@@ -144,27 +142,36 @@ ADB commands are all based on streams. Multiple streams can send and receive at
|
|
|
144
142
|
3. Client and server read/write on the stream.
|
|
145
143
|
4. Client/server sends a `CLSE` to close the stream.
|
|
146
144
|
|
|
147
|
-
|
|
145
|
+
## Commands
|
|
148
146
|
|
|
149
|
-
###
|
|
147
|
+
### subprocess
|
|
150
148
|
|
|
151
|
-
|
|
149
|
+
ADB has two subprocess invocation modes and two data protocols (4 combinations).
|
|
152
150
|
|
|
153
|
-
|
|
151
|
+
#### raw mode
|
|
154
152
|
|
|
155
|
-
|
|
153
|
+
In raw mode, Shell protocol transfers `stdout` and `stderr` separately. It also supports returning exit code.
|
|
156
154
|
|
|
157
|
-
| | Legacy
|
|
155
|
+
| | Legacy protocol | Shell Protocol |
|
|
158
156
|
| --------------------------- | --------------------------- | ---------------------------- |
|
|
159
157
|
| Feature flag | - | `shell_v2` |
|
|
160
158
|
| Implementation | `AdbNoneSubprocessProtocol` | `AdbShellSubprocessProtocol` |
|
|
161
159
|
| Splitting stdout and stderr | No | Yes |
|
|
162
160
|
| Returning exit code | No | Yes |
|
|
163
|
-
| Resizing window | No | Yes |
|
|
164
161
|
|
|
165
|
-
|
|
162
|
+
Use `spawn` method to create a subprocess in raw mode.
|
|
163
|
+
|
|
164
|
+
#### pty mode
|
|
165
|
+
|
|
166
|
+
In PTY mode, the subprocess has a pseudo-terminal, so it can send special control sequences like clear screen and set cursor position. The two protocols both send data in `stdout`, but Shell Protocol also supports resizing the terminal from client.
|
|
167
|
+
|
|
168
|
+
| | Legacy protocol | Shell Protocol |
|
|
169
|
+
| --------------------------- | --------------------------- | ---------------------------- |
|
|
170
|
+
| Feature flag | - | `shell_v2` |
|
|
171
|
+
| Implementation | `AdbNoneSubprocessProtocol` | `AdbShellSubprocessProtocol` |
|
|
172
|
+
| Resizing window | No | Yes |
|
|
166
173
|
|
|
167
|
-
|
|
174
|
+
Use `shell` method to create a subprocess in PTY mode.
|
|
168
175
|
|
|
169
176
|
### usb
|
|
170
177
|
|
package/esm/adb.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type AdbCredentialStore } from './auth.js';
|
|
2
2
|
import { AdbPower, AdbReverseCommand, AdbSubprocess, AdbSync, AdbTcpIpCommand, type AdbFrameBuffer } from './commands/index.js';
|
|
3
3
|
import { AdbFeatures } from './features.js';
|
|
4
|
-
import { type
|
|
5
|
-
import { AdbSocket } from './socket/index.js';
|
|
4
|
+
import { type AdbPacketData, type AdbPacketInit } from './packet.js';
|
|
5
|
+
import { AdbIncomingSocketHandler, type AdbSocket, type Closeable } from './socket/index.js';
|
|
6
6
|
import { WritableStream, type ReadableWritablePair } from "./stream/index.js";
|
|
7
7
|
export declare enum AdbPropKey {
|
|
8
8
|
Product = "ro.product.name",
|
|
@@ -11,14 +11,14 @@ export declare enum AdbPropKey {
|
|
|
11
11
|
Features = "features"
|
|
12
12
|
}
|
|
13
13
|
export declare const VERSION_OMIT_CHECKSUM = 16777217;
|
|
14
|
-
export declare class Adb {
|
|
14
|
+
export declare class Adb implements Closeable {
|
|
15
15
|
/**
|
|
16
16
|
* It's possible to call `authenticate` multiple times on a single connection,
|
|
17
17
|
* every time the device receives a `CNXN` packet, it resets its internal state,
|
|
18
18
|
* and starts a new authentication process.
|
|
19
19
|
*/
|
|
20
|
-
static authenticate(connection: ReadableWritablePair<
|
|
21
|
-
private readonly
|
|
20
|
+
static authenticate(connection: ReadableWritablePair<AdbPacketData, AdbPacketInit>, credentialStore: AdbCredentialStore, authenticators?: import("./auth.js").AdbAuthenticator[]): Promise<Adb>;
|
|
21
|
+
private readonly dispatcher;
|
|
22
22
|
get disconnected(): Promise<void>;
|
|
23
23
|
private _protocolVersion;
|
|
24
24
|
get protocolVersion(): number | undefined;
|
|
@@ -34,15 +34,16 @@ export declare class Adb {
|
|
|
34
34
|
readonly power: AdbPower;
|
|
35
35
|
readonly reverse: AdbReverseCommand;
|
|
36
36
|
readonly tcpip: AdbTcpIpCommand;
|
|
37
|
-
constructor(connection: ReadableWritablePair<
|
|
37
|
+
constructor(connection: ReadableWritablePair<AdbPacketData, AdbPacketInit>, version: number, maxPayloadSize: number, banner: string);
|
|
38
38
|
private parseBanner;
|
|
39
|
+
addIncomingSocketHandler(handler: AdbIncomingSocketHandler): import("@yume-chan/event").RemoveEventListener;
|
|
40
|
+
createSocket(service: string): Promise<AdbSocket>;
|
|
41
|
+
createSocketAndWait(service: string): Promise<string>;
|
|
39
42
|
getProp(key: string): Promise<string>;
|
|
40
43
|
rm(...filenames: string[]): Promise<string>;
|
|
41
44
|
install(): WritableStream<Uint8Array>;
|
|
42
45
|
sync(): Promise<AdbSync>;
|
|
43
46
|
framebuffer(): Promise<AdbFrameBuffer>;
|
|
44
|
-
|
|
45
|
-
createSocketAndWait(service: string): Promise<string>;
|
|
46
|
-
dispose(): Promise<void>;
|
|
47
|
+
close(): Promise<void>;
|
|
47
48
|
}
|
|
48
49
|
//# sourceMappingURL=adb.d.ts.map
|
package/esm/adb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adb.d.ts","sourceRoot":"","sources":["../src/adb.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adb.d.ts","sourceRoot":"","sources":["../src/adb.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0D,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC5G,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,EAAmC,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACjK,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAiC,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,wBAAwB,EAAuB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EAAyD,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGrI,oBAAY,UAAU;IAClB,OAAO,oBAAoB;IAC3B,KAAK,qBAAqB;IAC1B,MAAM,sBAAsB;IAC5B,QAAQ,aAAa;CACxB;AAED,eAAO,MAAM,qBAAqB,WAAa,CAAC;AAEhD,qBAAa,GAAI,YAAW,SAAS;IACjC;;;;OAIG;WACiB,YAAY,CAC5B,UAAU,EAAE,oBAAoB,CAAC,aAAa,EAAE,aAAa,CAAC,EAC9D,eAAe,EAAE,kBAAkB,EACnC,cAAc,yCAA6B,GAC5C,OAAO,CAAC,GAAG,CAAC;IAwGf,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAEjD,IAAW,YAAY,kBAA2C;IAElE,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,IAAW,eAAe,uBAAoC;IAE9D,OAAO,CAAC,QAAQ,CAAqB;IACrC,IAAW,OAAO,uBAA4B;IAE9C,OAAO,CAAC,MAAM,CAAqB;IACnC,IAAW,KAAK,uBAA0B;IAE1C,OAAO,CAAC,OAAO,CAAqB;IACpC,IAAW,MAAM,uBAA2B;IAE5C,OAAO,CAAC,SAAS,CAA4B;IAC7C,IAAW,QAAQ,8BAA6B;IAEhD,SAAgB,UAAU,EAAE,aAAa,CAAC;IAC1C,SAAgB,KAAK,EAAE,QAAQ,CAAC;IAChC,SAAgB,OAAO,EAAE,iBAAiB,CAAC;IAC3C,SAAgB,KAAK,EAAE,eAAe,CAAC;gBAGnC,UAAU,EAAE,oBAAoB,CAAC,aAAa,EAAE,aAAa,CAAC,EAC9D,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM;IA+BlB,OAAO,CAAC,WAAW;IAmCZ,wBAAwB,CAAC,OAAO,EAAE,wBAAwB;IAIpD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIjD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASrD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOrC,EAAE,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAOjD,OAAO;IAID,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAKxB,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC;IAItC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}
|
package/esm/adb.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
// cspell: ignore libusb
|
|
1
2
|
import { PromiseResolver } from '@yume-chan/async';
|
|
2
|
-
import {
|
|
3
|
+
import { AdbAuthenticationProcessor, ADB_DEFAULT_AUTHENTICATORS } from './auth.js';
|
|
3
4
|
import { AdbPower, AdbReverseCommand, AdbSubprocess, AdbSync, AdbTcpIpCommand, escapeArg, framebuffer, install } from './commands/index.js';
|
|
4
5
|
import { AdbFeatures } from './features.js';
|
|
5
6
|
import { AdbCommand, calculateChecksum } from './packet.js';
|
|
@@ -20,29 +21,14 @@ export class Adb {
|
|
|
20
21
|
* every time the device receives a `CNXN` packet, it resets its internal state,
|
|
21
22
|
* and starts a new authentication process.
|
|
22
23
|
*/
|
|
23
|
-
static async authenticate(connection, credentialStore, authenticators =
|
|
24
|
+
static async authenticate(connection, credentialStore, authenticators = ADB_DEFAULT_AUTHENTICATORS) {
|
|
25
|
+
// Initially, set to highest-supported version and payload size.
|
|
24
26
|
let version = 0x01000001;
|
|
25
27
|
let maxPayloadSize = 0x100000;
|
|
26
|
-
const features = [
|
|
27
|
-
'shell_v2',
|
|
28
|
-
'cmd',
|
|
29
|
-
AdbFeatures.StatV2,
|
|
30
|
-
'ls_v2',
|
|
31
|
-
'fixed_push_mkdir',
|
|
32
|
-
'apex',
|
|
33
|
-
'abb',
|
|
34
|
-
'fixed_push_symlink_timestamp',
|
|
35
|
-
'abb_exec',
|
|
36
|
-
'remount_shell',
|
|
37
|
-
'track_app',
|
|
38
|
-
'sendrecv_v2',
|
|
39
|
-
'sendrecv_v2_brotli',
|
|
40
|
-
'sendrecv_v2_lz4',
|
|
41
|
-
'sendrecv_v2_zstd',
|
|
42
|
-
'sendrecv_v2_dry_run_send',
|
|
43
|
-
].join(',');
|
|
44
28
|
const resolver = new PromiseResolver();
|
|
45
|
-
const
|
|
29
|
+
const authProcessor = new AdbAuthenticationProcessor(authenticators, credentialStore);
|
|
30
|
+
// Here is similar to `AdbPacketDispatcher`,
|
|
31
|
+
// But the received packet types and send packet processing are different.
|
|
46
32
|
const abortController = new AbortController();
|
|
47
33
|
const pipe = connection.readable
|
|
48
34
|
.pipeTo(new WritableStream({
|
|
@@ -54,52 +40,79 @@ export class Adb {
|
|
|
54
40
|
resolver.resolve(decodeUtf8(packet.payload));
|
|
55
41
|
break;
|
|
56
42
|
case AdbCommand.Auth:
|
|
57
|
-
const response = await
|
|
43
|
+
const response = await authProcessor.process(packet);
|
|
58
44
|
await sendPacket(response);
|
|
59
45
|
break;
|
|
60
|
-
case AdbCommand.Close:
|
|
61
|
-
// Last connection was interrupted
|
|
62
|
-
// Ignore this packet, device will recover
|
|
63
|
-
break;
|
|
64
46
|
default:
|
|
65
|
-
|
|
47
|
+
// Maybe the previous ADB client exited without reading all packets,
|
|
48
|
+
// so they are still waiting in OS internal buffer.
|
|
49
|
+
// Just ignore them.
|
|
50
|
+
// Because a `Connect` packet will reset the device,
|
|
51
|
+
// Eventually there will be `Connect` and `Auth` response packets.
|
|
52
|
+
break;
|
|
66
53
|
}
|
|
67
54
|
}
|
|
68
55
|
}), {
|
|
69
56
|
preventCancel: true,
|
|
70
57
|
signal: abortController.signal,
|
|
71
58
|
})
|
|
72
|
-
.catch((e) => {
|
|
59
|
+
.catch((e) => {
|
|
60
|
+
resolver.reject(e);
|
|
61
|
+
});
|
|
73
62
|
const writer = connection.writable.getWriter();
|
|
74
63
|
async function sendPacket(init) {
|
|
75
64
|
// Always send checksum in auth steps
|
|
76
|
-
// Because we don't know if the device
|
|
65
|
+
// Because we don't know if the device needs it or not.
|
|
77
66
|
await writer.write(calculateChecksum(init));
|
|
78
67
|
}
|
|
79
|
-
await sendPacket({
|
|
80
|
-
command: AdbCommand.Connect,
|
|
81
|
-
arg0: version,
|
|
82
|
-
arg1: maxPayloadSize,
|
|
83
|
-
// The terminating `;` is required in formal definition
|
|
84
|
-
// But ADB daemon (all versions) can still work without it
|
|
85
|
-
payload: encodeUtf8(`host::features=${features};`),
|
|
86
|
-
});
|
|
87
68
|
try {
|
|
69
|
+
// https://android.googlesource.com/platform/packages/modules/adb/+/79010dc6d5ca7490c493df800d4421730f5466ca/transport.cpp#1252
|
|
70
|
+
// There are some other feature constants, but some of them are only used by ADB server, not devices (daemons).
|
|
71
|
+
const features = [
|
|
72
|
+
AdbFeatures.ShellV2,
|
|
73
|
+
AdbFeatures.Cmd,
|
|
74
|
+
AdbFeatures.StatV2,
|
|
75
|
+
AdbFeatures.ListV2,
|
|
76
|
+
AdbFeatures.FixedPushMkdir,
|
|
77
|
+
'apex',
|
|
78
|
+
'abb',
|
|
79
|
+
// only tells the client the symlink timestamp issue in `adb push --sync` has been fixed.
|
|
80
|
+
// No special handling required.
|
|
81
|
+
'fixed_push_symlink_timestamp',
|
|
82
|
+
'abb_exec',
|
|
83
|
+
'remount_shell',
|
|
84
|
+
'track_app',
|
|
85
|
+
'sendrecv_v2',
|
|
86
|
+
'sendrecv_v2_brotli',
|
|
87
|
+
'sendrecv_v2_lz4',
|
|
88
|
+
'sendrecv_v2_zstd',
|
|
89
|
+
'sendrecv_v2_dry_run_send',
|
|
90
|
+
].join(',');
|
|
91
|
+
await sendPacket({
|
|
92
|
+
command: AdbCommand.Connect,
|
|
93
|
+
arg0: version,
|
|
94
|
+
arg1: maxPayloadSize,
|
|
95
|
+
// The terminating `;` is required in formal definition
|
|
96
|
+
// But ADB daemon (all versions) can still work without it
|
|
97
|
+
payload: encodeUtf8(`host::features=${features};`),
|
|
98
|
+
});
|
|
88
99
|
const banner = await resolver.promise;
|
|
89
|
-
// Stop piping before creating Adb object
|
|
90
|
-
// Because AdbPacketDispatcher will
|
|
100
|
+
// Stop piping before creating `Adb` object
|
|
101
|
+
// Because `AdbPacketDispatcher` will lock the streams when initializing
|
|
91
102
|
abortController.abort();
|
|
92
|
-
await pipe;
|
|
93
103
|
writer.releaseLock();
|
|
104
|
+
// Wait until pipe stops (`ReadableStream` lock released)
|
|
105
|
+
await pipe;
|
|
94
106
|
return new Adb(connection, version, maxPayloadSize, banner);
|
|
95
107
|
}
|
|
96
|
-
|
|
108
|
+
catch (e) {
|
|
97
109
|
abortController.abort();
|
|
98
110
|
writer.releaseLock();
|
|
111
|
+
throw e;
|
|
99
112
|
}
|
|
100
113
|
}
|
|
101
|
-
|
|
102
|
-
get disconnected() { return this.
|
|
114
|
+
dispatcher;
|
|
115
|
+
get disconnected() { return this.dispatcher.disconnected; }
|
|
103
116
|
_protocolVersion;
|
|
104
117
|
get protocolVersion() { return this._protocolVersion; }
|
|
105
118
|
_product;
|
|
@@ -116,18 +129,25 @@ export class Adb {
|
|
|
116
129
|
tcpip;
|
|
117
130
|
constructor(connection, version, maxPayloadSize, banner) {
|
|
118
131
|
this.parseBanner(banner);
|
|
119
|
-
|
|
120
|
-
|
|
132
|
+
let calculateChecksum;
|
|
133
|
+
let appendNullToServiceString;
|
|
121
134
|
if (version >= VERSION_OMIT_CHECKSUM) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
135
|
+
calculateChecksum = false;
|
|
136
|
+
appendNullToServiceString = false;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
calculateChecksum = true;
|
|
140
|
+
appendNullToServiceString = true;
|
|
126
141
|
}
|
|
127
|
-
this.
|
|
142
|
+
this.dispatcher = new AdbPacketDispatcher(connection, {
|
|
143
|
+
calculateChecksum,
|
|
144
|
+
appendNullToServiceString,
|
|
145
|
+
maxPayloadSize,
|
|
146
|
+
});
|
|
147
|
+
this._protocolVersion = version;
|
|
128
148
|
this.subprocess = new AdbSubprocess(this);
|
|
129
149
|
this.power = new AdbPower(this);
|
|
130
|
-
this.reverse = new AdbReverseCommand(this
|
|
150
|
+
this.reverse = new AdbReverseCommand(this);
|
|
131
151
|
this.tcpip = new AdbTcpIpCommand(this);
|
|
132
152
|
}
|
|
133
153
|
parseBanner(banner) {
|
|
@@ -161,6 +181,20 @@ export class Adb {
|
|
|
161
181
|
}
|
|
162
182
|
}
|
|
163
183
|
}
|
|
184
|
+
addIncomingSocketHandler(handler) {
|
|
185
|
+
return this.dispatcher.addIncomingSocketHandler(handler);
|
|
186
|
+
}
|
|
187
|
+
async createSocket(service) {
|
|
188
|
+
return this.dispatcher.createSocket(service);
|
|
189
|
+
}
|
|
190
|
+
async createSocketAndWait(service) {
|
|
191
|
+
const socket = await this.createSocket(service);
|
|
192
|
+
const gatherStream = new GatherStringStream();
|
|
193
|
+
await socket.readable
|
|
194
|
+
.pipeThrough(new DecodeUtf8Stream())
|
|
195
|
+
.pipeTo(gatherStream);
|
|
196
|
+
return gatherStream.result;
|
|
197
|
+
}
|
|
164
198
|
async getProp(key) {
|
|
165
199
|
const stdout = await this.subprocess.spawnAndWaitLegacy(['getprop', key]);
|
|
166
200
|
return stdout.trim();
|
|
@@ -179,19 +213,8 @@ export class Adb {
|
|
|
179
213
|
async framebuffer() {
|
|
180
214
|
return framebuffer(this);
|
|
181
215
|
}
|
|
182
|
-
async
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
async createSocketAndWait(service) {
|
|
186
|
-
const socket = await this.createSocket(service);
|
|
187
|
-
const gatherStream = new GatherStringStream();
|
|
188
|
-
await socket.readable
|
|
189
|
-
.pipeThrough(new DecodeUtf8Stream())
|
|
190
|
-
.pipeTo(gatherStream.writable);
|
|
191
|
-
return gatherStream.result;
|
|
192
|
-
}
|
|
193
|
-
async dispose() {
|
|
194
|
-
this.packetDispatcher.dispose();
|
|
216
|
+
async close() {
|
|
217
|
+
await this.dispatcher.close();
|
|
195
218
|
}
|
|
196
219
|
}
|
|
197
220
|
//# sourceMappingURL=adb.js.map
|
package/esm/adb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adb.js","sourceRoot":"","sources":["../src/adb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"adb.js","sourceRoot":"","sources":["../src/adb.ts"],"names":[],"mappings":"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"}
|
package/esm/auth.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Disposable } from '@yume-chan/event';
|
|
2
2
|
import type { ValueOrPromise } from '@yume-chan/struct';
|
|
3
|
-
import {
|
|
3
|
+
import { type AdbPacketData } from './packet.js';
|
|
4
4
|
export declare type AdbKeyIterable = Iterable<Uint8Array> | AsyncIterable<Uint8Array>;
|
|
5
5
|
export interface AdbCredentialStore {
|
|
6
6
|
/**
|
|
@@ -33,20 +33,20 @@ export interface AdbAuthenticator {
|
|
|
33
33
|
*
|
|
34
34
|
* Calling `getNextRequest` multiple times without `yield` or `return` will always return the same request.
|
|
35
35
|
*/
|
|
36
|
-
(credentialStore: AdbCredentialStore, getNextRequest: () => Promise<
|
|
36
|
+
(credentialStore: AdbCredentialStore, getNextRequest: () => Promise<AdbPacketData>): AsyncIterable<AdbPacketData>;
|
|
37
37
|
}
|
|
38
38
|
export declare const AdbSignatureAuthenticator: AdbAuthenticator;
|
|
39
39
|
export declare const AdbPublicKeyAuthenticator: AdbAuthenticator;
|
|
40
|
-
export declare const
|
|
41
|
-
export declare class
|
|
40
|
+
export declare const ADB_DEFAULT_AUTHENTICATORS: AdbAuthenticator[];
|
|
41
|
+
export declare class AdbAuthenticationProcessor implements Disposable {
|
|
42
42
|
readonly authenticators: readonly AdbAuthenticator[];
|
|
43
43
|
private readonly credentialStore;
|
|
44
44
|
private pendingRequest;
|
|
45
45
|
private iterator;
|
|
46
46
|
constructor(authenticators: readonly AdbAuthenticator[], credentialStore: AdbCredentialStore);
|
|
47
47
|
private getNextRequest;
|
|
48
|
-
private
|
|
49
|
-
|
|
48
|
+
private invokeAuthenticator;
|
|
49
|
+
process(packet: AdbPacketData): Promise<AdbPacketData>;
|
|
50
50
|
dispose(): void;
|
|
51
51
|
}
|
|
52
52
|
//# sourceMappingURL=auth.d.ts.map
|
package/esm/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAc,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7D,oBAAY,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;AAE9E,MAAM,WAAW,kBAAkB;IAC/B;;;;OAIG;IACH,WAAW,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IAE1C;;;;OAIG;IACH,WAAW,IAAI,cAAc,CAAC;CACjC;AAED,oBAAY,WAAW;IACnB,KAAK,IAAI;IACT,SAAS,IAAI;IACb,SAAS,IAAI;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC7B;;;;;;;;;;OAUG;IACH,CACI,eAAe,EAAE,kBAAkB,EACnC,cAAc,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,GAC7C,aAAa,CAAC,aAAa,CAAC,CAAC;CACnC;AAED,eAAO,MAAM,yBAAyB,EAAE,gBAmBvC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,gBAwCvC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,gBAAgB,EAGxD,CAAC;AAEF,qBAAa,0BAA2B,YAAW,UAAU;IACzD,SAAgB,cAAc,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAE5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IAErD,OAAO,CAAC,cAAc,CAAwC;IAE9D,OAAO,CAAC,QAAQ,CAAuD;gBAGnE,cAAc,EAAE,SAAS,gBAAgB,EAAE,EAC3C,eAAe,EAAE,kBAAkB;IAMvC,OAAO,CAAC,cAAc,CAEpB;YAEa,mBAAmB;IAgBrB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAe5D,OAAO;CAGjB"}
|
package/esm/auth.js
CHANGED
|
@@ -50,11 +50,11 @@ export const AdbPublicKeyAuthenticator = async function* (credentialStore, getNe
|
|
|
50
50
|
payload: publicKeyBuffer,
|
|
51
51
|
};
|
|
52
52
|
};
|
|
53
|
-
export const
|
|
53
|
+
export const ADB_DEFAULT_AUTHENTICATORS = [
|
|
54
54
|
AdbSignatureAuthenticator,
|
|
55
55
|
AdbPublicKeyAuthenticator,
|
|
56
56
|
];
|
|
57
|
-
export class
|
|
57
|
+
export class AdbAuthenticationProcessor {
|
|
58
58
|
authenticators;
|
|
59
59
|
credentialStore;
|
|
60
60
|
pendingRequest = new PromiseResolver();
|
|
@@ -66,7 +66,7 @@ export class AdbAuthenticationHandler {
|
|
|
66
66
|
getNextRequest = () => {
|
|
67
67
|
return this.pendingRequest.promise;
|
|
68
68
|
};
|
|
69
|
-
async *
|
|
69
|
+
async *invokeAuthenticator() {
|
|
70
70
|
for (const authenticator of this.authenticators) {
|
|
71
71
|
for await (const packet of authenticator(this.credentialStore, this.getNextRequest)) {
|
|
72
72
|
// If the authenticator yielded a response
|
|
@@ -78,14 +78,16 @@ export class AdbAuthenticationHandler {
|
|
|
78
78
|
// If the authenticator returned,
|
|
79
79
|
// Next authenticator will be given the same `pendingRequest`
|
|
80
80
|
}
|
|
81
|
-
throw new Error('Cannot authenticate with device');
|
|
82
81
|
}
|
|
83
|
-
async
|
|
82
|
+
async process(packet) {
|
|
84
83
|
if (!this.iterator) {
|
|
85
|
-
this.iterator = this.
|
|
84
|
+
this.iterator = this.invokeAuthenticator();
|
|
86
85
|
}
|
|
87
86
|
this.pendingRequest.resolve(packet);
|
|
88
87
|
const result = await this.iterator.next();
|
|
88
|
+
if (result.done) {
|
|
89
|
+
throw new Error('No authenticator can handle the request');
|
|
90
|
+
}
|
|
89
91
|
return result.value;
|
|
90
92
|
}
|
|
91
93
|
dispose() {
|
package/esm/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/esm/backend.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { ValueOrPromise } from '@yume-chan/struct';
|
|
2
|
-
import type {
|
|
2
|
+
import type { AdbPacketData, AdbPacketInit } from "./packet.js";
|
|
3
3
|
import type { ReadableWritablePair } from "./stream/index.js";
|
|
4
4
|
export interface AdbBackend {
|
|
5
5
|
readonly serial: string;
|
|
6
6
|
readonly name: string | undefined;
|
|
7
|
-
connect(): ValueOrPromise<ReadableWritablePair<
|
|
7
|
+
connect(): ValueOrPromise<ReadableWritablePair<AdbPacketData, AdbPacketInit>>;
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAsB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIxE,wBAAgB,OAAO,CACnB,GAAG,EAAE,GAAG,GACT,cAAc,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAsB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIxE,wBAAgB,OAAO,CACnB,GAAG,EAAE,GAAG,GACT,cAAc,CAAC,UAAU,CAAC,CAsB5B"}
|
package/esm/commands/install.js
CHANGED
|
@@ -2,17 +2,15 @@ import { WrapWritableStream } from "../stream/index.js";
|
|
|
2
2
|
import { escapeArg } from "./subprocess/index.js";
|
|
3
3
|
export function install(adb) {
|
|
4
4
|
const filename = `/data/local/tmp/${Math.random().toString().substring(2)}.apk`;
|
|
5
|
+
let sync;
|
|
5
6
|
return new WrapWritableStream({
|
|
6
7
|
async start() {
|
|
8
|
+
// TODO: install: support other install apk methods (streaming, etc.)
|
|
7
9
|
// Upload apk file to tmp folder
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return {
|
|
11
|
-
writable,
|
|
12
|
-
state: sync,
|
|
13
|
-
};
|
|
10
|
+
sync = await adb.sync();
|
|
11
|
+
return sync.write(filename, undefined, undefined);
|
|
14
12
|
},
|
|
15
|
-
async close(
|
|
13
|
+
async close() {
|
|
16
14
|
sync.dispose();
|
|
17
15
|
// Invoke `pm install` to install it
|
|
18
16
|
await adb.subprocess.spawnAndWaitLegacy(['pm', 'install', escapeArg(filename)]);
|