mirror of
https://github.com/yume-chan/ya-webadb.git
synced 2025-10-03 17:59:50 +02:00
feat(bin): use cmd
in settings
This commit is contained in:
parent
9b0e06cdfb
commit
e3bfd1592f
8 changed files with 1490 additions and 1495 deletions
|
@ -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,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue