feat(bin): use cmd in settings

This commit is contained in:
Simon Chan 2023-06-22 19:55:45 +08:00
parent 9b0e06cdfb
commit e3bfd1592f
No known key found for this signature in database
GPG key ID: A8B69F750B9BCEDD
8 changed files with 1490 additions and 1495 deletions

View file

@ -1,67 +1,100 @@
import type { Adb, AdbSubprocessProtocolConstructor } from "@yume-chan/adb";
import type {
Adb,
AdbSubprocessProtocol,
AdbSubprocessProtocolConstructor,
AdbSubprocessWaitResult,
} from "@yume-chan/adb";
import {
AdbCommandBase,
AdbFeature,
AdbSubprocessNoneProtocol,
AdbSubprocessShellProtocol,
} from "@yume-chan/adb";
import { DecodeUtf8Stream, GatherStringStream } from "@yume-chan/stream-extra";
export class Cmd extends AdbCommandBase {
private _supportsShellV2: boolean;
private _supportsCmd: boolean;
private _supportsAbb: boolean;
private _supportsAbbExec: boolean;
#supportsShellV2: boolean;
public get supportsShellV2() {
return this._supportsShellV2;
return this.#supportsShellV2;
}
#supportsCmd: boolean;
public get supportsCmd() {
return this._supportsCmd;
return this.#supportsCmd;
}
#supportsAbb: boolean;
public get supportsAbb() {
return this._supportsAbb;
return this.#supportsAbb;
}
#supportsAbbExec: boolean;
public get supportsAbbExec() {
return this._supportsAbbExec;
return this.#supportsAbbExec;
}
public constructor(adb: Adb) {
super(adb);
this._supportsShellV2 = adb.supportsFeature(AdbFeature.ShellV2);
this._supportsCmd = adb.supportsFeature(AdbFeature.Cmd);
this._supportsAbb = adb.supportsFeature(AdbFeature.Abb);
this._supportsAbbExec = adb.supportsFeature(AdbFeature.AbbExec);
this.#supportsShellV2 = adb.supportsFeature(AdbFeature.ShellV2);
this.#supportsCmd = adb.supportsFeature(AdbFeature.Cmd);
this.#supportsAbb = adb.supportsFeature(AdbFeature.Abb);
this.#supportsAbbExec = adb.supportsFeature(AdbFeature.AbbExec);
}
public async spawn(
shellProtocol: boolean,
command: string,
...args: string[]
) {
): Promise<AdbSubprocessProtocol> {
let supportsAbb: boolean;
let supportsCmd: boolean = this.supportsCmd;
let supportsCmd: boolean = this.#supportsCmd;
let service: string;
let Protocol: AdbSubprocessProtocolConstructor;
if (shellProtocol) {
supportsAbb = this._supportsAbb;
supportsAbb = this.#supportsAbb;
supportsCmd &&= this.supportsShellV2;
service = "abb";
Protocol = AdbSubprocessShellProtocol;
} else {
supportsAbb = this._supportsAbbExec;
supportsAbb = this.#supportsAbbExec;
service = "abb_exec";
Protocol = AdbSubprocessNoneProtocol;
}
if (supportsAbb) {
const socket = await this.adb.createSocket(
`${service}:${command}\0${args.join("\0")}\0`
return new Protocol(
await this.adb.createSocket(
`${service}:${command}\0${args.join("\0")}\0`
)
);
return new Protocol(socket);
} else if (supportsCmd) {
return Protocol.raw(this.adb, `cmd ${command} ${args.join(" ")}`);
} else {
throw new Error("Not supported");
}
if (supportsCmd) {
return Protocol.raw(this.adb, `cmd ${command} ${args.join(" ")}`);
}
throw new Error("Not supported");
}
public async spawnAndWait(
command: string,
...args: string[]
): Promise<AdbSubprocessWaitResult> {
const process = await this.spawn(true, command, ...args);
const stdout = new GatherStringStream();
const stderr = new GatherStringStream();
const [, , exitCode] = await Promise.all([
process.stdout.pipeThrough(new DecodeUtf8Stream()).pipeTo(stdout),
process.stderr.pipeThrough(new DecodeUtf8Stream()).pipeTo(stderr),
process.exit,
]);
return {
stdout: stdout.result,
stderr: stderr.result,
exitCode,
};
}
}