feat(bin): add cmd wrapper

This commit is contained in:
Simon Chan 2023-03-02 16:01:01 +08:00
parent 9c5d2d8a5c
commit 225e369f53
19 changed files with 511 additions and 332 deletions

View file

@ -0,0 +1,67 @@
import type { Adb, AdbSubprocessProtocolConstructor } from "@yume-chan/adb";
import {
AdbCommandBase,
AdbFeature,
AdbSubprocessNoneProtocol,
AdbSubprocessShellProtocol,
} from "@yume-chan/adb";
export class Cmd extends AdbCommandBase {
private _supportsShellV2: boolean;
private _supportsCmd: boolean;
private _supportsAbb: boolean;
private _supportsAbbExec: boolean;
public get supportsShellV2() {
return this._supportsShellV2;
}
public get supportsCmd() {
return this._supportsCmd;
}
public get supportsAbb() {
return this._supportsAbb;
}
public get 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);
}
public async spawn(
shellProtocol: boolean,
command: string,
...args: string[]
) {
let supportAbb: boolean;
let supportCmd: boolean = this.supportsCmd;
let service: string;
let Protocol: AdbSubprocessProtocolConstructor;
if (shellProtocol) {
supportAbb = this._supportsAbb;
supportCmd &&= this.supportsShellV2;
service = "abb";
Protocol = AdbSubprocessShellProtocol;
} else {
supportAbb = this._supportsAbbExec;
service = "abb_exec";
Protocol = AdbSubprocessNoneProtocol;
}
if (supportAbb) {
const socket = await this.adb.createSocket(
`${service}:${command}\0${args.join("\0")}\0`
);
return new Protocol(socket);
} else if (supportCmd) {
return Protocol.raw(this.adb, `cmd ${command} ${args.join(" ")}`);
} else {
throw new Error("Not supported");
}
}
}