@yume-chan/adb
Version:
TypeScript implementation of Android Debug Bridge (ADB) protocol.
91 lines (77 loc) • 2.51 kB
text/typescript
import type { MaybePromiseLike } from "@yume-chan/async";
import type {
AbortSignal,
MaybeConsumable,
ReadableStream,
WritableStream,
} from "@yume-chan/stream-extra";
import {
ConcatBufferStream,
ConcatStringStream,
TextDecoderStream,
} from "@yume-chan/stream-extra";
import { splitCommand } from "../utils.js";
export interface AdbShellProtocolProcess {
get stdin(): WritableStream<MaybeConsumable<Uint8Array>>;
get stdout(): ReadableStream<Uint8Array>;
get stderr(): ReadableStream<Uint8Array>;
get exited(): Promise<number>;
kill(): MaybePromiseLike<void>;
}
export class AdbShellProtocolSpawner {
readonly #spawn: (
command: string[],
signal: AbortSignal | undefined,
) => Promise<AdbShellProtocolProcess>;
constructor(
spawn: (
command: string[],
signal: AbortSignal | undefined,
) => Promise<AdbShellProtocolProcess>,
) {
this.#spawn = spawn;
}
spawn(
command: string | string[],
signal?: AbortSignal,
): Promise<AdbShellProtocolProcess> {
signal?.throwIfAborted();
if (typeof command === "string") {
command = splitCommand(command);
}
return this.#spawn(command, signal);
}
async spawnWait(
command: string | string[],
): Promise<AdbShellProtocolSpawner.WaitResult<Uint8Array>> {
const process = await this.spawn(command);
const [stdout, stderr, exitCode] = await Promise.all([
process.stdout.pipeThrough(new ConcatBufferStream()),
process.stderr.pipeThrough(new ConcatBufferStream()),
process.exited,
]);
return { stdout, stderr, exitCode };
}
async spawnWaitText(
command: string | string[],
): Promise<AdbShellProtocolSpawner.WaitResult<string>> {
const process = await this.spawn(command);
const [stdout, stderr, exitCode] = await Promise.all([
process.stdout
.pipeThrough(new TextDecoderStream())
.pipeThrough(new ConcatStringStream()),
process.stderr
.pipeThrough(new TextDecoderStream())
.pipeThrough(new ConcatStringStream()),
process.exited,
]);
return { stdout, stderr, exitCode };
}
}
export namespace AdbShellProtocolSpawner {
export interface WaitResult<T> {
stdout: T;
stderr: T;
exitCode: number;
}
}