@yume-chan/adb 1.1.0 → 2.0.0
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.md +20 -0
- package/LICENSE +1 -1
- package/esm/adb.d.ts +7 -6
- package/esm/adb.d.ts.map +1 -1
- package/esm/adb.js +22 -22
- package/esm/adb.js.map +1 -1
- package/esm/banner.js.map +1 -1
- package/esm/commands/base.d.ts +3 -2
- package/esm/commands/base.d.ts.map +1 -1
- package/esm/commands/base.js +6 -3
- package/esm/commands/base.js.map +1 -1
- package/esm/commands/framebuffer.d.ts +6 -6
- package/esm/commands/power.d.ts +2 -2
- package/esm/commands/power.d.ts.map +1 -1
- package/esm/commands/power.js +4 -4
- package/esm/commands/power.js.map +1 -1
- package/esm/commands/reverse.d.ts +3 -4
- package/esm/commands/reverse.d.ts.map +1 -1
- package/esm/commands/reverse.js +5 -10
- package/esm/commands/reverse.js.map +1 -1
- package/esm/commands/subprocess/index.d.ts +3 -2
- package/esm/commands/subprocess/index.d.ts.map +1 -1
- package/esm/commands/subprocess/index.js +3 -2
- package/esm/commands/subprocess/index.js.map +1 -1
- package/esm/commands/subprocess/none/index.d.ts +5 -0
- package/esm/commands/subprocess/none/index.d.ts.map +1 -0
- package/esm/commands/subprocess/none/index.js +5 -0
- package/esm/commands/subprocess/none/index.js.map +1 -0
- package/esm/commands/subprocess/none/process.d.ts +13 -0
- package/esm/commands/subprocess/none/process.d.ts.map +1 -0
- package/esm/commands/subprocess/none/process.js +36 -0
- package/esm/commands/subprocess/none/process.js.map +1 -0
- package/esm/commands/subprocess/none/pty.d.ts +15 -0
- package/esm/commands/subprocess/none/pty.d.ts.map +1 -0
- package/esm/commands/subprocess/none/pty.js +29 -0
- package/esm/commands/subprocess/none/pty.js.map +1 -0
- package/esm/commands/subprocess/none/service.d.ts +10 -0
- package/esm/commands/subprocess/none/service.d.ts.map +1 -0
- package/esm/commands/subprocess/none/service.js +32 -0
- package/esm/commands/subprocess/none/service.js.map +1 -0
- package/esm/commands/subprocess/none/spawner.d.ts +19 -0
- package/esm/commands/subprocess/none/spawner.d.ts.map +1 -0
- package/esm/commands/subprocess/none/spawner.js +26 -0
- package/esm/commands/subprocess/none/spawner.js.map +1 -0
- package/esm/commands/subprocess/pty.d.ts +10 -0
- package/esm/commands/subprocess/pty.d.ts.map +1 -0
- package/esm/commands/subprocess/pty.js +2 -0
- package/esm/commands/subprocess/pty.js.map +1 -0
- package/esm/commands/subprocess/service.d.ts +11 -0
- package/esm/commands/subprocess/service.d.ts.map +1 -0
- package/esm/commands/subprocess/service.js +25 -0
- package/esm/commands/subprocess/service.js.map +1 -0
- package/esm/commands/subprocess/shell/index.d.ts +6 -0
- package/esm/commands/subprocess/shell/index.d.ts.map +1 -0
- package/esm/commands/subprocess/shell/index.js +6 -0
- package/esm/commands/subprocess/shell/index.js.map +1 -0
- package/esm/commands/subprocess/shell/process.d.ts +15 -0
- package/esm/commands/subprocess/shell/process.d.ts.map +1 -0
- package/esm/commands/subprocess/{protocols/shell.js → shell/process.js} +27 -54
- package/esm/commands/subprocess/shell/process.js.map +1 -0
- package/esm/commands/subprocess/shell/pty.d.ts +15 -0
- package/esm/commands/subprocess/shell/pty.d.ts.map +1 -0
- package/esm/commands/subprocess/shell/pty.js +76 -0
- package/esm/commands/subprocess/shell/pty.js.map +1 -0
- package/esm/commands/subprocess/shell/service.d.ts +14 -0
- package/esm/commands/subprocess/shell/service.d.ts.map +1 -0
- package/esm/commands/subprocess/shell/service.js +41 -0
- package/esm/commands/subprocess/shell/service.js.map +1 -0
- package/esm/commands/subprocess/shell/shared.d.ts +19 -0
- package/esm/commands/subprocess/shell/shared.d.ts.map +1 -0
- package/esm/commands/subprocess/shell/shared.js +15 -0
- package/esm/commands/subprocess/shell/shared.js.map +1 -0
- package/esm/commands/subprocess/shell/spawner.d.ts +24 -0
- package/esm/commands/subprocess/shell/spawner.d.ts.map +1 -0
- package/esm/commands/subprocess/shell/spawner.js +38 -0
- package/esm/commands/subprocess/shell/spawner.js.map +1 -0
- package/esm/commands/subprocess/utils.d.ts +1 -0
- package/esm/commands/subprocess/utils.d.ts.map +1 -1
- package/esm/commands/subprocess/utils.js +37 -0
- package/esm/commands/subprocess/utils.js.map +1 -1
- package/esm/commands/sync/list.d.ts +12 -8
- package/esm/commands/sync/list.d.ts.map +1 -1
- package/esm/commands/sync/list.js +5 -7
- package/esm/commands/sync/list.js.map +1 -1
- package/esm/commands/sync/pull.d.ts +4 -4
- package/esm/commands/sync/pull.d.ts.map +1 -1
- package/esm/commands/sync/pull.js +2 -7
- package/esm/commands/sync/pull.js.map +1 -1
- package/esm/commands/sync/push.d.ts +4 -4
- package/esm/commands/sync/request.d.ts +1 -1
- package/esm/commands/sync/response.d.ts +5 -5
- 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 +4 -4
- package/esm/commands/sync/sync.d.ts +2 -2
- package/esm/commands/sync/sync.js +1 -1
- package/esm/commands/sync/sync.js.map +1 -1
- package/esm/commands/tcpip.d.ts +2 -2
- package/esm/commands/tcpip.js +2 -2
- package/esm/daemon/dispatcher.d.ts.map +1 -1
- package/esm/daemon/dispatcher.js.map +1 -1
- package/esm/daemon/packet.d.ts +6 -4
- package/esm/daemon/packet.d.ts.map +1 -1
- package/esm/daemon/packet.js +3 -5
- package/esm/daemon/packet.js.map +1 -1
- package/esm/daemon/socket.d.ts +2 -2
- package/esm/daemon/socket.d.ts.map +1 -1
- package/esm/daemon/socket.js +1 -1
- package/esm/daemon/socket.js.map +1 -1
- package/esm/device-observer.d.ts +4 -4
- package/esm/device-observer.d.ts.map +1 -1
- package/esm/server/client.d.ts +10 -38
- package/esm/server/client.d.ts.map +1 -1
- package/esm/server/client.js +9 -126
- package/esm/server/client.js.map +1 -1
- package/esm/server/commands/index.d.ts +3 -0
- package/esm/server/commands/index.d.ts.map +1 -0
- package/esm/server/commands/index.js +3 -0
- package/esm/server/commands/index.js.map +1 -0
- package/esm/server/commands/m-dns.d.ts +12 -0
- package/esm/server/commands/m-dns.d.ts.map +1 -0
- package/esm/server/commands/m-dns.js +38 -0
- package/esm/server/commands/m-dns.js.map +1 -0
- package/esm/server/commands/wireless.d.ts +27 -0
- package/esm/server/commands/wireless.d.ts.map +1 -0
- package/esm/server/commands/wireless.js +82 -0
- package/esm/server/commands/wireless.js.map +1 -0
- package/esm/server/observer.d.ts +2 -1
- package/esm/server/observer.d.ts.map +1 -1
- package/esm/server/observer.js +69 -47
- package/esm/server/observer.js.map +1 -1
- package/esm/server/stream.d.ts +1 -1
- package/esm/server/transport.d.ts.map +1 -1
- package/esm/server/transport.js +2 -2
- package/esm/server/transport.js.map +1 -1
- package/package.json +8 -8
- package/src/adb.ts +29 -28
- package/src/banner.ts +4 -4
- package/src/commands/base.ts +6 -3
- package/src/commands/power.ts +6 -6
- package/src/commands/reverse.ts +9 -12
- package/src/commands/subprocess/index.ts +3 -2
- package/src/commands/subprocess/none/index.ts +4 -0
- package/src/commands/subprocess/none/process.ts +56 -0
- package/src/commands/subprocess/none/pty.ts +45 -0
- package/src/commands/subprocess/none/service.ts +42 -0
- package/src/commands/subprocess/none/spawner.ts +68 -0
- package/src/commands/subprocess/pty.ts +15 -0
- package/src/commands/subprocess/service.ts +32 -0
- package/src/commands/subprocess/shell/index.ts +5 -0
- package/src/commands/subprocess/shell/process.ts +127 -0
- package/src/commands/subprocess/shell/pty.ts +112 -0
- package/src/commands/subprocess/shell/service.ts +58 -0
- package/src/commands/subprocess/shell/shared.ts +25 -0
- package/src/commands/subprocess/shell/spawner.ts +90 -0
- package/src/commands/subprocess/utils.ts +41 -0
- package/src/commands/sync/list.ts +7 -17
- package/src/commands/sync/pull.ts +2 -8
- package/src/commands/sync/response.ts +6 -4
- package/src/commands/sync/sync.ts +1 -1
- package/src/commands/tcpip.ts +2 -2
- package/src/daemon/dispatcher.ts +7 -4
- package/src/daemon/packet.ts +4 -8
- package/src/daemon/socket.ts +6 -6
- package/src/device-observer.ts +4 -4
- package/src/server/client.ts +23 -142
- package/src/server/commands/index.ts +2 -0
- package/src/server/commands/m-dns.ts +43 -0
- package/src/server/commands/wireless.ts +94 -0
- package/src/server/observer.ts +94 -66
- package/src/server/transport.ts +21 -20
- package/tsconfig.build.tsbuildinfo +1 -1
- package/esm/commands/subprocess/command.d.ts +0 -58
- package/esm/commands/subprocess/command.d.ts.map +0 -1
- package/esm/commands/subprocess/command.js +0 -89
- package/esm/commands/subprocess/command.js.map +0 -1
- package/esm/commands/subprocess/protocols/index.d.ts +0 -4
- package/esm/commands/subprocess/protocols/index.d.ts.map +0 -1
- package/esm/commands/subprocess/protocols/index.js +0 -4
- package/esm/commands/subprocess/protocols/index.js.map +0 -1
- package/esm/commands/subprocess/protocols/none.d.ts +0 -32
- package/esm/commands/subprocess/protocols/none.d.ts.map +0 -1
- package/esm/commands/subprocess/protocols/none.js +0 -61
- package/esm/commands/subprocess/protocols/none.js.map +0 -1
- package/esm/commands/subprocess/protocols/shell.d.ts +0 -42
- package/esm/commands/subprocess/protocols/shell.d.ts.map +0 -1
- package/esm/commands/subprocess/protocols/shell.js.map +0 -1
- package/esm/commands/subprocess/protocols/types.d.ts +0 -49
- package/esm/commands/subprocess/protocols/types.d.ts.map +0 -1
- package/esm/commands/subprocess/protocols/types.js +0 -2
- package/esm/commands/subprocess/protocols/types.js.map +0 -1
- package/src/commands/subprocess/command.ts +0 -141
- package/src/commands/subprocess/protocols/index.ts +0 -3
- package/src/commands/subprocess/protocols/none.ts +0 -81
- package/src/commands/subprocess/protocols/shell.ts +0 -171
- package/src/commands/subprocess/protocols/types.ts +0 -63
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AdbNoneProtocolProcessImpl } from "./process.js";
|
|
2
|
+
import { AdbNoneProtocolPtyProcess } from "./pty.js";
|
|
3
|
+
import { AdbNoneProtocolSpawner } from "./spawner.js";
|
|
4
|
+
export class AdbNoneProtocolSubprocessService extends AdbNoneProtocolSpawner {
|
|
5
|
+
#adb;
|
|
6
|
+
get adb() {
|
|
7
|
+
return this.#adb;
|
|
8
|
+
}
|
|
9
|
+
constructor(adb) {
|
|
10
|
+
super(async (command, signal) => {
|
|
11
|
+
// `shell,raw:${command}` also triggers raw mode,
|
|
12
|
+
// But is not supported on Android version <7.
|
|
13
|
+
const socket = await this.#adb.createSocket(`exec:${command.join(" ")}`);
|
|
14
|
+
if (signal?.aborted) {
|
|
15
|
+
await socket.close();
|
|
16
|
+
throw signal.reason;
|
|
17
|
+
}
|
|
18
|
+
return new AdbNoneProtocolProcessImpl(socket, signal);
|
|
19
|
+
});
|
|
20
|
+
this.#adb = adb;
|
|
21
|
+
}
|
|
22
|
+
async pty(command) {
|
|
23
|
+
if (command === undefined) {
|
|
24
|
+
command = "";
|
|
25
|
+
}
|
|
26
|
+
else if (Array.isArray(command)) {
|
|
27
|
+
command = command.join(" ");
|
|
28
|
+
}
|
|
29
|
+
return new AdbNoneProtocolPtyProcess(await this.#adb.createSocket(`shell:${command}`));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/none/service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,OAAO,gCAAiC,SAAQ,sBAAsB;IAC/D,IAAI,CAAM;IACnB,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,YAAY,GAAQ;QAChB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5B,iDAAiD;YACjD,8CAA8C;YAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CACvC,QAAQ,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC9B,CAAC;YAEF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBAClB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,MAAM,CAAC,MAAM,CAAC;YACxB,CAAC;YAED,OAAO,IAAI,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAA2B;QACjC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC;QACjB,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,IAAI,yBAAyB,CAChC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,OAAO,EAAE,CAAC,CACnD,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MaybePromiseLike } from "@yume-chan/async";
|
|
2
|
+
import type { AbortSignal, MaybeConsumable, ReadableStream, WritableStream } from "@yume-chan/stream-extra";
|
|
3
|
+
export interface AdbNoneProtocolProcess {
|
|
4
|
+
get stdin(): WritableStream<MaybeConsumable<Uint8Array>>;
|
|
5
|
+
/**
|
|
6
|
+
* Mix of stdout and stderr
|
|
7
|
+
*/
|
|
8
|
+
get output(): ReadableStream<Uint8Array>;
|
|
9
|
+
get exited(): Promise<void>;
|
|
10
|
+
kill(): MaybePromiseLike<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare class AdbNoneProtocolSpawner {
|
|
13
|
+
#private;
|
|
14
|
+
constructor(spawn: (command: string[], signal: AbortSignal | undefined) => Promise<AdbNoneProtocolProcess>);
|
|
15
|
+
spawn(command: string | string[], signal?: AbortSignal): Promise<AdbNoneProtocolProcess>;
|
|
16
|
+
spawnWait(command: string | string[]): Promise<Uint8Array>;
|
|
17
|
+
spawnWaitText(command: string | string[]): Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=spawner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/none/spawner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,EACjB,MAAM,yBAAyB,CAAC;AASjC,MAAM,WAAW,sBAAsB;IACnC,IAAI,KAAK,IAAI,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzD;;OAEG;IACH,IAAI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,qBAAa,sBAAsB;;gBAO3B,KAAK,EAAE,CACH,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,WAAW,GAAG,SAAS,KAC9B,OAAO,CAAC,sBAAsB,CAAC;IAKxC,KAAK,CACD,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,sBAAsB,CAAC;IAU5B,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAK1D,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAMnE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ConcatBufferStream, ConcatStringStream, TextDecoderStream, } from "@yume-chan/stream-extra";
|
|
2
|
+
import { splitCommand } from "../utils.js";
|
|
3
|
+
export class AdbNoneProtocolSpawner {
|
|
4
|
+
#spawn;
|
|
5
|
+
constructor(spawn) {
|
|
6
|
+
this.#spawn = spawn;
|
|
7
|
+
}
|
|
8
|
+
spawn(command, signal) {
|
|
9
|
+
signal?.throwIfAborted();
|
|
10
|
+
if (typeof command === "string") {
|
|
11
|
+
command = splitCommand(command);
|
|
12
|
+
}
|
|
13
|
+
return this.#spawn(command, signal);
|
|
14
|
+
}
|
|
15
|
+
async spawnWait(command) {
|
|
16
|
+
const process = await this.spawn(command);
|
|
17
|
+
return await process.output.pipeThrough(new ConcatBufferStream());
|
|
18
|
+
}
|
|
19
|
+
async spawnWaitText(command) {
|
|
20
|
+
const process = await this.spawn(command);
|
|
21
|
+
return await process.output
|
|
22
|
+
.pipeThrough(new TextDecoderStream())
|
|
23
|
+
.pipeThrough(new ConcatStringStream());
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=spawner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawner.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/none/spawner.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,MAAM,OAAO,sBAAsB;IACtB,MAAM,CAGsB;IAErC,YACI,KAGoC;QAEpC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,KAAK,CACD,OAA0B,EAC1B,MAAoB;QAEpB,MAAM,EAAE,cAAc,EAAE,CAAC;QAEzB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAA0B;QACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAA0B;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,MAAM,OAAO,CAAC,MAAM;aACtB,WAAW,CAAC,IAAI,iBAAiB,EAAE,CAAC;aACpC,WAAW,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAC/C,CAAC;CACJ"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MaybePromiseLike } from "@yume-chan/async";
|
|
2
|
+
import type { MaybeConsumable, ReadableStream, WritableStream } from "@yume-chan/stream-extra";
|
|
3
|
+
export interface AdbPtyProcess<TExitCode> {
|
|
4
|
+
get input(): WritableStream<MaybeConsumable<Uint8Array>>;
|
|
5
|
+
get output(): ReadableStream<Uint8Array>;
|
|
6
|
+
get exited(): Promise<TExitCode>;
|
|
7
|
+
sigint(): Promise<void>;
|
|
8
|
+
kill(): MaybePromiseLike<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=pty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../../src/commands/subprocess/pty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACR,eAAe,EACf,cAAc,EACd,cAAc,EACjB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,aAAa,CAAC,SAAS;IACpC,IAAI,KAAK,IAAI,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,IAAI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAEjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../../../src/commands/subprocess/pty.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Adb } from "../../adb.js";
|
|
2
|
+
import { AdbNoneProtocolSubprocessService } from "./none/index.js";
|
|
3
|
+
import { AdbShellProtocolSubprocessService } from "./shell/index.js";
|
|
4
|
+
export declare class AdbSubprocessService {
|
|
5
|
+
#private;
|
|
6
|
+
get adb(): Adb;
|
|
7
|
+
get noneProtocol(): AdbNoneProtocolSubprocessService;
|
|
8
|
+
get shellProtocol(): AdbShellProtocolSubprocessService | undefined;
|
|
9
|
+
constructor(adb: Adb);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/commands/subprocess/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGxC,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AAErE,qBAAa,oBAAoB;;IAE7B,IAAI,GAAG,QAEN;IAGD,IAAI,YAAY,IAAI,gCAAgC,CAEnD;IAGD,IAAI,aAAa,IAAI,iCAAiC,GAAG,SAAS,CAEjE;gBAEW,GAAG,EAAE,GAAG;CASvB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AdbFeature } from "../../features.js";
|
|
2
|
+
import { AdbNoneProtocolSubprocessService } from "./none/index.js";
|
|
3
|
+
import { AdbShellProtocolSubprocessService } from "./shell/index.js";
|
|
4
|
+
export class AdbSubprocessService {
|
|
5
|
+
#adb;
|
|
6
|
+
get adb() {
|
|
7
|
+
return this.#adb;
|
|
8
|
+
}
|
|
9
|
+
#noneProtocol;
|
|
10
|
+
get noneProtocol() {
|
|
11
|
+
return this.#noneProtocol;
|
|
12
|
+
}
|
|
13
|
+
#shellProtocol;
|
|
14
|
+
get shellProtocol() {
|
|
15
|
+
return this.#shellProtocol;
|
|
16
|
+
}
|
|
17
|
+
constructor(adb) {
|
|
18
|
+
this.#adb = adb;
|
|
19
|
+
this.#noneProtocol = new AdbNoneProtocolSubprocessService(adb);
|
|
20
|
+
if (adb.canUseFeature(AdbFeature.ShellV2)) {
|
|
21
|
+
this.#shellProtocol = new AdbShellProtocolSubprocessService(adb);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/commands/subprocess/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AAErE,MAAM,OAAO,oBAAoB;IACpB,IAAI,CAAM;IACnB,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAEQ,aAAa,CAAmC;IACzD,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAEQ,cAAc,CAAqC;IAC5D,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,YAAY,GAAQ;QAChB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAEhB,IAAI,CAAC,aAAa,GAAG,IAAI,gCAAgC,CAAC,GAAG,CAAC,CAAC;QAE/D,IAAI,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,cAAc,GAAG,IAAI,iCAAiC,CAAC,GAAG,CAAC,CAAC;QACrE,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MaybePromiseLike } from "@yume-chan/async";
|
|
2
|
+
import type { AbortSignal, ReadableStream } from "@yume-chan/stream-extra";
|
|
3
|
+
import { MaybeConsumable, WritableStream } from "@yume-chan/stream-extra";
|
|
4
|
+
import type { AdbSocket } from "../../../adb.js";
|
|
5
|
+
import type { AdbShellProtocolProcess } from "./spawner.js";
|
|
6
|
+
export declare class AdbShellProtocolProcessImpl implements AdbShellProtocolProcess {
|
|
7
|
+
#private;
|
|
8
|
+
get stdin(): WritableStream<MaybeConsumable<Uint8Array<ArrayBufferLike>>>;
|
|
9
|
+
get stdout(): ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
10
|
+
get stderr(): ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
11
|
+
get exited(): Promise<number>;
|
|
12
|
+
constructor(socket: AdbSocket, signal?: AbortSignal);
|
|
13
|
+
kill(): MaybePromiseLike<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EACR,WAAW,EAEX,cAAc,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,eAAe,EAGf,cAAc,EACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE5D,qBAAa,2BAA4B,YAAW,uBAAuB;;IAKvE,IAAI,KAAK,iEAER;IAGD,IAAI,MAAM,gDAET;IAGD,IAAI,MAAM,gDAET;IAGD,IAAI,MAAM,oBAET;gBAEW,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW;IA+EnD,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC;CAGjC"}
|
|
@@ -1,40 +1,7 @@
|
|
|
1
1
|
import { PromiseResolver } from "@yume-chan/async";
|
|
2
2
|
import { MaybeConsumable, PushReadableStream, StructDeserializeStream, WritableStream, } from "@yume-chan/stream-extra";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import { encodeUtf8 } from "../../../utils/index.js";
|
|
6
|
-
export const AdbShellProtocolId = {
|
|
7
|
-
Stdin: 0,
|
|
8
|
-
Stdout: 1,
|
|
9
|
-
Stderr: 2,
|
|
10
|
-
Exit: 3,
|
|
11
|
-
CloseStdin: 4,
|
|
12
|
-
WindowSizeChange: 5,
|
|
13
|
-
};
|
|
14
|
-
// This packet format is used in both directions.
|
|
15
|
-
export const AdbShellProtocolPacket = struct({
|
|
16
|
-
id: u8(),
|
|
17
|
-
data: buffer(u32),
|
|
18
|
-
}, { littleEndian: true });
|
|
19
|
-
/**
|
|
20
|
-
* Shell v2 a.k.a Shell Protocol
|
|
21
|
-
*
|
|
22
|
-
* Features:
|
|
23
|
-
* * `stderr`: Yes
|
|
24
|
-
* * `exit` exit code: Yes
|
|
25
|
-
* * `resize`: Yes
|
|
26
|
-
*/
|
|
27
|
-
export class AdbSubprocessShellProtocol {
|
|
28
|
-
static isSupported(adb) {
|
|
29
|
-
return adb.canUseFeature(AdbFeature.ShellV2);
|
|
30
|
-
}
|
|
31
|
-
static async pty(adb, command) {
|
|
32
|
-
// TODO: AdbShellSubprocessProtocol: Support setting `XTERM` environment variable
|
|
33
|
-
return new AdbSubprocessShellProtocol(await adb.createSocket(`shell,v2,pty:${command}`));
|
|
34
|
-
}
|
|
35
|
-
static async raw(adb, command) {
|
|
36
|
-
return new AdbSubprocessShellProtocol(await adb.createSocket(`shell,v2,raw:${command}`));
|
|
37
|
-
}
|
|
3
|
+
import { AdbShellProtocolId, AdbShellProtocolPacket } from "./shared.js";
|
|
4
|
+
export class AdbShellProtocolProcessImpl {
|
|
38
5
|
#socket;
|
|
39
6
|
#writer;
|
|
40
7
|
#stdin;
|
|
@@ -49,11 +16,11 @@ export class AdbSubprocessShellProtocol {
|
|
|
49
16
|
get stderr() {
|
|
50
17
|
return this.#stderr;
|
|
51
18
|
}
|
|
52
|
-
#
|
|
53
|
-
get
|
|
54
|
-
return this.#
|
|
19
|
+
#exited;
|
|
20
|
+
get exited() {
|
|
21
|
+
return this.#exited;
|
|
55
22
|
}
|
|
56
|
-
constructor(socket) {
|
|
23
|
+
constructor(socket, signal) {
|
|
57
24
|
this.#socket = socket;
|
|
58
25
|
let stdoutController;
|
|
59
26
|
let stderrController;
|
|
@@ -63,13 +30,15 @@ export class AdbSubprocessShellProtocol {
|
|
|
63
30
|
this.#stderr = new PushReadableStream((controller) => {
|
|
64
31
|
stderrController = controller;
|
|
65
32
|
});
|
|
33
|
+
const exited = new PromiseResolver();
|
|
34
|
+
this.#exited = exited.promise;
|
|
66
35
|
socket.readable
|
|
67
36
|
.pipeThrough(new StructDeserializeStream(AdbShellProtocolPacket))
|
|
68
37
|
.pipeTo(new WritableStream({
|
|
69
38
|
write: async (chunk) => {
|
|
70
39
|
switch (chunk.id) {
|
|
71
40
|
case AdbShellProtocolId.Exit:
|
|
72
|
-
|
|
41
|
+
exited.resolve(chunk.data[0]);
|
|
73
42
|
break;
|
|
74
43
|
case AdbShellProtocolId.Stdout:
|
|
75
44
|
await stdoutController.enqueue(chunk.data);
|
|
@@ -77,20 +46,33 @@ export class AdbSubprocessShellProtocol {
|
|
|
77
46
|
case AdbShellProtocolId.Stderr:
|
|
78
47
|
await stderrController.enqueue(chunk.data);
|
|
79
48
|
break;
|
|
49
|
+
default:
|
|
50
|
+
// Ignore unknown messages like Google ADB does
|
|
51
|
+
// https://cs.android.com/android/platform/superproject/main/+/main:packages/modules/adb/daemon/shell_service.cpp;l=684;drc=61197364367c9e404c7da6900658f1b16c42d0da
|
|
52
|
+
break;
|
|
80
53
|
}
|
|
81
54
|
},
|
|
82
55
|
}))
|
|
83
56
|
.then(() => {
|
|
84
57
|
stdoutController.close();
|
|
85
58
|
stderrController.close();
|
|
86
|
-
// If
|
|
87
|
-
|
|
59
|
+
// If `exited` has already settled, this will be a no-op
|
|
60
|
+
exited.reject(new Error("Socket ended without exit message"));
|
|
88
61
|
}, (e) => {
|
|
89
62
|
stdoutController.error(e);
|
|
90
63
|
stderrController.error(e);
|
|
91
|
-
// If
|
|
92
|
-
|
|
64
|
+
// If `exited` has already settled, this will be a no-op
|
|
65
|
+
exited.reject(e);
|
|
93
66
|
});
|
|
67
|
+
if (signal) {
|
|
68
|
+
// `signal` won't affect `this.stdout` and `this.stderr`
|
|
69
|
+
// So remaining data can still be read
|
|
70
|
+
// (call `controller.error` will discard all pending data)
|
|
71
|
+
signal.addEventListener("abort", () => {
|
|
72
|
+
exited.reject(signal.reason);
|
|
73
|
+
this.#socket.close();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
94
76
|
this.#writer = this.#socket.writable.getWriter();
|
|
95
77
|
this.#stdin = new MaybeConsumable.WritableStream({
|
|
96
78
|
write: async (chunk) => {
|
|
@@ -101,17 +83,8 @@ export class AdbSubprocessShellProtocol {
|
|
|
101
83
|
},
|
|
102
84
|
});
|
|
103
85
|
}
|
|
104
|
-
async resize(rows, cols) {
|
|
105
|
-
await this.#writer.write(AdbShellProtocolPacket.serialize({
|
|
106
|
-
id: AdbShellProtocolId.WindowSizeChange,
|
|
107
|
-
// The "correct" format is `${rows}x${cols},${x_pixels}x${y_pixels}`
|
|
108
|
-
// However, according to https://linux.die.net/man/4/tty_ioctl
|
|
109
|
-
// `x_pixels` and `y_pixels` are unused, so always sending `0` should be fine.
|
|
110
|
-
data: encodeUtf8(`${rows}x${cols},0x0\0`),
|
|
111
|
-
}));
|
|
112
|
-
}
|
|
113
86
|
kill() {
|
|
114
87
|
return this.#socket.close();
|
|
115
88
|
}
|
|
116
89
|
}
|
|
117
|
-
//# sourceMappingURL=
|
|
90
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/process.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOnD,OAAO,EACH,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,GACjB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGzE,MAAM,OAAO,2BAA2B;IAC3B,OAAO,CAAY;IACnB,OAAO,CAA2D;IAElE,MAAM,CAA8C;IAC7D,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAEQ,OAAO,CAA6B;IAC7C,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEQ,OAAO,CAA6B;IAC7C,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEQ,OAAO,CAAkB;IAClC,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,YAAY,MAAiB,EAAE,MAAoB;QAC/C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QAEtB,IAAI,gBAA2D,CAAC;QAChE,IAAI,gBAA2D,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAa,CAAC,UAAU,EAAE,EAAE;YAC7D,gBAAgB,GAAG,UAAU,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAa,CAAC,UAAU,EAAE,EAAE;YAC7D,gBAAgB,GAAG,UAAU,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAU,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAE9B,MAAM,CAAC,QAAQ;aACV,WAAW,CAAC,IAAI,uBAAuB,CAAC,sBAAsB,CAAC,CAAC;aAChE,MAAM,CACH,IAAI,cAAc,CAAyB;YACvC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACnB,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;oBACf,KAAK,kBAAkB,CAAC,IAAI;wBACxB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;wBAC/B,MAAM;oBACV,KAAK,kBAAkB,CAAC,MAAM;wBAC1B,MAAM,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC3C,MAAM;oBACV,KAAK,kBAAkB,CAAC,MAAM;wBAC1B,MAAM,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC3C,MAAM;oBACV;wBACI,+CAA+C;wBAC/C,oKAAoK;wBACpK,MAAM;gBACd,CAAC;YACL,CAAC;SACJ,CAAC,CACL;aACA,IAAI,CACD,GAAG,EAAE;YACD,gBAAgB,CAAC,KAAK,EAAE,CAAC;YACzB,gBAAgB,CAAC,KAAK,EAAE,CAAC;YACzB,wDAAwD;YACxD,MAAM,CAAC,MAAM,CACT,IAAI,KAAK,CAAC,mCAAmC,CAAC,CACjD,CAAC;QACN,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;YACF,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,wDAAwD;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,CACJ,CAAC;QAEN,IAAI,MAAM,EAAE,CAAC;YACT,wDAAwD;YACxD,sCAAsC;YACtC,0DAA0D;YAE1D,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAC,cAAc,CAAa;YACzD,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACnB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CACpB,sBAAsB,CAAC,SAAS,CAAC;oBAC7B,EAAE,EAAE,kBAAkB,CAAC,KAAK;oBAC5B,IAAI,EAAE,KAAK;iBACd,CAAC,CACL,CAAC;YACN,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAED,IAAI;QACA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;CACJ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReadableStream } from "@yume-chan/stream-extra";
|
|
2
|
+
import { MaybeConsumable, WritableStream } from "@yume-chan/stream-extra";
|
|
3
|
+
import type { AdbSocket } from "../../../adb.js";
|
|
4
|
+
import type { AdbPtyProcess } from "../pty.js";
|
|
5
|
+
export declare class AdbShellProtocolPtyProcess implements AdbPtyProcess<number> {
|
|
6
|
+
#private;
|
|
7
|
+
get input(): WritableStream<MaybeConsumable<Uint8Array<ArrayBufferLike>>>;
|
|
8
|
+
get output(): ReadableStream<Uint8Array<ArrayBufferLike>>;
|
|
9
|
+
get exited(): Promise<number>;
|
|
10
|
+
constructor(socket: AdbSocket);
|
|
11
|
+
resize(rows: number, cols: number): Promise<void>;
|
|
12
|
+
sigint(): Promise<void>;
|
|
13
|
+
kill(): import("@yume-chan/async").MaybePromiseLike<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=pty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/pty.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAER,cAAc,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,eAAe,EAGf,cAAc,EACjB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/C,qBAAa,0BAA2B,YAAW,aAAa,CAAC,MAAM,CAAC;;IAKpE,IAAI,KAAK,iEAER;IAGD,IAAI,MAAM,gDAET;IAGD,IAAI,MAAM,oBAET;gBAEW,MAAM,EAAE,SAAS;IAsDvB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAYvC,MAAM;IAIN,IAAI;CAGP"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { PromiseResolver } from "@yume-chan/async";
|
|
2
|
+
import { MaybeConsumable, PushReadableStream, StructDeserializeStream, WritableStream, } from "@yume-chan/stream-extra";
|
|
3
|
+
import { encodeUtf8 } from "@yume-chan/struct";
|
|
4
|
+
import { AdbShellProtocolId, AdbShellProtocolPacket } from "./shared.js";
|
|
5
|
+
export class AdbShellProtocolPtyProcess {
|
|
6
|
+
#socket;
|
|
7
|
+
#writer;
|
|
8
|
+
#input;
|
|
9
|
+
get input() {
|
|
10
|
+
return this.#input;
|
|
11
|
+
}
|
|
12
|
+
#stdout;
|
|
13
|
+
get output() {
|
|
14
|
+
return this.#stdout;
|
|
15
|
+
}
|
|
16
|
+
#exited = new PromiseResolver();
|
|
17
|
+
get exited() {
|
|
18
|
+
return this.#exited.promise;
|
|
19
|
+
}
|
|
20
|
+
constructor(socket) {
|
|
21
|
+
this.#socket = socket;
|
|
22
|
+
let stdoutController;
|
|
23
|
+
this.#stdout = new PushReadableStream((controller) => {
|
|
24
|
+
stdoutController = controller;
|
|
25
|
+
});
|
|
26
|
+
socket.readable
|
|
27
|
+
.pipeThrough(new StructDeserializeStream(AdbShellProtocolPacket))
|
|
28
|
+
.pipeTo(new WritableStream({
|
|
29
|
+
write: async (chunk) => {
|
|
30
|
+
switch (chunk.id) {
|
|
31
|
+
case AdbShellProtocolId.Exit:
|
|
32
|
+
this.#exited.resolve(chunk.data[0]);
|
|
33
|
+
break;
|
|
34
|
+
case AdbShellProtocolId.Stdout:
|
|
35
|
+
await stdoutController.enqueue(chunk.data);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
}))
|
|
40
|
+
.then(() => {
|
|
41
|
+
stdoutController.close();
|
|
42
|
+
// If `#exit` has already resolved, this will be a no-op
|
|
43
|
+
this.#exited.reject(new Error("Socket ended without exit message"));
|
|
44
|
+
}, (e) => {
|
|
45
|
+
stdoutController.error(e);
|
|
46
|
+
// If `#exit` has already resolved, this will be a no-op
|
|
47
|
+
this.#exited.reject(e);
|
|
48
|
+
});
|
|
49
|
+
this.#writer = this.#socket.writable.getWriter();
|
|
50
|
+
this.#input = new MaybeConsumable.WritableStream({
|
|
51
|
+
write: (chunk) => this.#writeStdin(chunk),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
#writeStdin(chunk) {
|
|
55
|
+
return this.#writer.write(AdbShellProtocolPacket.serialize({
|
|
56
|
+
id: AdbShellProtocolId.Stdin,
|
|
57
|
+
data: chunk,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
async resize(rows, cols) {
|
|
61
|
+
await this.#writer.write(AdbShellProtocolPacket.serialize({
|
|
62
|
+
id: AdbShellProtocolId.WindowSizeChange,
|
|
63
|
+
// The "correct" format is `${rows}x${cols},${x_pixels}x${y_pixels}`
|
|
64
|
+
// However, according to https://linux.die.net/man/4/tty_ioctl
|
|
65
|
+
// `x_pixels` and `y_pixels` are unused, so always sending `0` should be fine.
|
|
66
|
+
data: encodeUtf8(`${rows}x${cols},0x0\0`),
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
sigint() {
|
|
70
|
+
return this.#writeStdin(new Uint8Array([0x03]));
|
|
71
|
+
}
|
|
72
|
+
kill() {
|
|
73
|
+
return this.#socket.close();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=pty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/pty.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Adb } from "../../../adb.js";
|
|
2
|
+
import { AdbShellProtocolPtyProcess } from "./pty.js";
|
|
3
|
+
import { AdbShellProtocolSpawner } from "./spawner.js";
|
|
4
|
+
export declare class AdbShellProtocolSubprocessService extends AdbShellProtocolSpawner {
|
|
5
|
+
#private;
|
|
6
|
+
get adb(): Adb;
|
|
7
|
+
get isSupported(): boolean;
|
|
8
|
+
constructor(adb: Adb);
|
|
9
|
+
pty(options?: {
|
|
10
|
+
command?: string | string[] | undefined;
|
|
11
|
+
terminalType?: string;
|
|
12
|
+
}): Promise<AdbShellProtocolPtyProcess>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAI3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,qBAAa,iCAAkC,SAAQ,uBAAuB;;IAE1E,IAAI,GAAG,QAEN;IAED,IAAI,WAAW,YAEd;gBAEW,GAAG,EAAE,GAAG;IAgBd,GAAG,CAAC,OAAO,CAAC,EAAE;QAChB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;QACxC,YAAY,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,0BAA0B,CAAC;CAqB1C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AdbFeature } from "../../../features.js";
|
|
2
|
+
import { AdbShellProtocolProcessImpl } from "./process.js";
|
|
3
|
+
import { AdbShellProtocolPtyProcess } from "./pty.js";
|
|
4
|
+
import { AdbShellProtocolSpawner } from "./spawner.js";
|
|
5
|
+
export class AdbShellProtocolSubprocessService extends AdbShellProtocolSpawner {
|
|
6
|
+
#adb;
|
|
7
|
+
get adb() {
|
|
8
|
+
return this.#adb;
|
|
9
|
+
}
|
|
10
|
+
get isSupported() {
|
|
11
|
+
return this.#adb.canUseFeature(AdbFeature.ShellV2);
|
|
12
|
+
}
|
|
13
|
+
constructor(adb) {
|
|
14
|
+
super(async (command, signal) => {
|
|
15
|
+
const socket = await this.#adb.createSocket(`shell,v2,raw:${command.join(" ")}`);
|
|
16
|
+
if (signal?.aborted) {
|
|
17
|
+
await socket.close();
|
|
18
|
+
throw signal.reason;
|
|
19
|
+
}
|
|
20
|
+
return new AdbShellProtocolProcessImpl(socket, signal);
|
|
21
|
+
});
|
|
22
|
+
this.#adb = adb;
|
|
23
|
+
}
|
|
24
|
+
async pty(options) {
|
|
25
|
+
let service = "shell,v2,pty";
|
|
26
|
+
if (options?.terminalType) {
|
|
27
|
+
service += `,TERM=` + options.terminalType;
|
|
28
|
+
}
|
|
29
|
+
service += ":";
|
|
30
|
+
if (options) {
|
|
31
|
+
if (typeof options.command === "string") {
|
|
32
|
+
service += options.command;
|
|
33
|
+
}
|
|
34
|
+
else if (Array.isArray(options.command)) {
|
|
35
|
+
service += options.command.join(" ");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return new AdbShellProtocolPtyProcess(await this.#adb.createSocket(service));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,OAAO,iCAAkC,SAAQ,uBAAuB;IACjE,IAAI,CAAM;IACnB,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,YAAY,GAAQ;QAChB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CACvC,gBAAgB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACtC,CAAC;YAEF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBAClB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,MAAM,MAAM,CAAC,MAAM,CAAC;YACxB,CAAC;YAED,OAAO,IAAI,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAGT;QACG,IAAI,OAAO,GAAG,cAAc,CAAC;QAE7B,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;YACxB,OAAO,IAAI,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,GAAG,CAAC;QAEf,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACtC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;YAC/B,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,0BAA0B,CACjC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CACxC,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { StructValue } from "@yume-chan/struct";
|
|
2
|
+
export declare const AdbShellProtocolId: {
|
|
3
|
+
readonly Stdin: 0;
|
|
4
|
+
readonly Stdout: 1;
|
|
5
|
+
readonly Stderr: 2;
|
|
6
|
+
readonly Exit: 3;
|
|
7
|
+
readonly CloseStdin: 4;
|
|
8
|
+
readonly WindowSizeChange: 5;
|
|
9
|
+
};
|
|
10
|
+
export type AdbShellProtocolId = (typeof AdbShellProtocolId)[keyof typeof AdbShellProtocolId];
|
|
11
|
+
export declare const AdbShellProtocolPacket: import("@yume-chan/struct").Struct<{
|
|
12
|
+
id: import("@yume-chan/struct").Field<AdbShellProtocolId, never, never, number>;
|
|
13
|
+
data: import("@yume-chan/struct").Field<Uint8Array<ArrayBufferLike>, string, never, Uint8Array<ArrayBufferLike>>;
|
|
14
|
+
}, undefined, import("@yume-chan/struct").FieldsValue<{
|
|
15
|
+
id: import("@yume-chan/struct").Field<AdbShellProtocolId, never, never, number>;
|
|
16
|
+
data: import("@yume-chan/struct").Field<Uint8Array<ArrayBufferLike>, string, never, Uint8Array<ArrayBufferLike>>;
|
|
17
|
+
}>>;
|
|
18
|
+
export type AdbShellProtocolPacket = StructValue<typeof AdbShellProtocolPacket>;
|
|
19
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,eAAO,MAAM,kBAAkB;;;;;;;CAOrB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAC1B,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAGjE,eAAO,MAAM,sBAAsB;;;;;;GAMlC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { buffer, struct, u32, u8 } from "@yume-chan/struct";
|
|
2
|
+
export const AdbShellProtocolId = {
|
|
3
|
+
Stdin: 0,
|
|
4
|
+
Stdout: 1,
|
|
5
|
+
Stderr: 2,
|
|
6
|
+
Exit: 3,
|
|
7
|
+
CloseStdin: 4,
|
|
8
|
+
WindowSizeChange: 5,
|
|
9
|
+
};
|
|
10
|
+
// This packet format is used in both directions.
|
|
11
|
+
export const AdbShellProtocolPacket = struct({
|
|
12
|
+
id: u8(),
|
|
13
|
+
data: buffer(u32),
|
|
14
|
+
}, { littleEndian: true });
|
|
15
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAC9B,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,CAAC;IACb,gBAAgB,EAAE,CAAC;CACb,CAAC;AAKX,iDAAiD;AACjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CACxC;IACI,EAAE,EAAE,EAAE,EAAsB;IAC5B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC;CACpB,EACD,EAAE,YAAY,EAAE,IAAI,EAAE,CACzB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { MaybePromiseLike } from "@yume-chan/async";
|
|
2
|
+
import type { AbortSignal, MaybeConsumable, ReadableStream, WritableStream } from "@yume-chan/stream-extra";
|
|
3
|
+
export interface AdbShellProtocolProcess {
|
|
4
|
+
get stdin(): WritableStream<MaybeConsumable<Uint8Array>>;
|
|
5
|
+
get stdout(): ReadableStream<Uint8Array>;
|
|
6
|
+
get stderr(): ReadableStream<Uint8Array>;
|
|
7
|
+
get exited(): Promise<number>;
|
|
8
|
+
kill(): MaybePromiseLike<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare class AdbShellProtocolSpawner {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(spawn: (command: string[], signal: AbortSignal | undefined) => Promise<AdbShellProtocolProcess>);
|
|
13
|
+
spawn(command: string | string[], signal?: AbortSignal): Promise<AdbShellProtocolProcess>;
|
|
14
|
+
spawnWait(command: string | string[]): Promise<AdbShellProtocolSpawner.WaitResult<Uint8Array>>;
|
|
15
|
+
spawnWaitText(command: string | string[]): Promise<AdbShellProtocolSpawner.WaitResult<string>>;
|
|
16
|
+
}
|
|
17
|
+
export declare namespace AdbShellProtocolSpawner {
|
|
18
|
+
interface WaitResult<T> {
|
|
19
|
+
stdout: T;
|
|
20
|
+
stderr: T;
|
|
21
|
+
exitCode: number;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=spawner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../../../../src/commands/subprocess/shell/spawner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,EACjB,MAAM,yBAAyB,CAAC;AASjC,MAAM,WAAW,uBAAuB;IACpC,IAAI,KAAK,IAAI,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzD,IAAI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9B,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,qBAAa,uBAAuB;;gBAO5B,KAAK,EAAE,CACH,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,WAAW,GAAG,SAAS,KAC9B,OAAO,CAAC,uBAAuB,CAAC;IAKzC,KAAK,CACD,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAC1B,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,uBAAuB,CAAC;IAU7B,SAAS,CACX,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAC3B,OAAO,CAAC,uBAAuB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAUpD,aAAa,CACf,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAC3B,OAAO,CAAC,uBAAuB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;CAazD;AAED,yBAAiB,uBAAuB,CAAC;IACrC,UAAiB,UAAU,CAAC,CAAC;QACzB,MAAM,EAAE,CAAC,CAAC;QACV,MAAM,EAAE,CAAC,CAAC;QACV,QAAQ,EAAE,MAAM,CAAC;KACpB;CACJ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ConcatBufferStream, ConcatStringStream, TextDecoderStream, } from "@yume-chan/stream-extra";
|
|
2
|
+
import { splitCommand } from "../utils.js";
|
|
3
|
+
export class AdbShellProtocolSpawner {
|
|
4
|
+
#spawn;
|
|
5
|
+
constructor(spawn) {
|
|
6
|
+
this.#spawn = spawn;
|
|
7
|
+
}
|
|
8
|
+
spawn(command, signal) {
|
|
9
|
+
signal?.throwIfAborted();
|
|
10
|
+
if (typeof command === "string") {
|
|
11
|
+
command = splitCommand(command);
|
|
12
|
+
}
|
|
13
|
+
return this.#spawn(command, signal);
|
|
14
|
+
}
|
|
15
|
+
async spawnWait(command) {
|
|
16
|
+
const process = await this.spawn(command);
|
|
17
|
+
const [stdout, stderr, exitCode] = await Promise.all([
|
|
18
|
+
process.stdout.pipeThrough(new ConcatBufferStream()),
|
|
19
|
+
process.stderr.pipeThrough(new ConcatBufferStream()),
|
|
20
|
+
process.exited,
|
|
21
|
+
]);
|
|
22
|
+
return { stdout, stderr, exitCode };
|
|
23
|
+
}
|
|
24
|
+
async spawnWaitText(command) {
|
|
25
|
+
const process = await this.spawn(command);
|
|
26
|
+
const [stdout, stderr, exitCode] = await Promise.all([
|
|
27
|
+
process.stdout
|
|
28
|
+
.pipeThrough(new TextDecoderStream())
|
|
29
|
+
.pipeThrough(new ConcatStringStream()),
|
|
30
|
+
process.stderr
|
|
31
|
+
.pipeThrough(new TextDecoderStream())
|
|
32
|
+
.pipeThrough(new ConcatStringStream()),
|
|
33
|
+
process.exited,
|
|
34
|
+
]);
|
|
35
|
+
return { stdout, stderr, exitCode };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=spawner.js.map
|