@yume-chan/adb
Version:
TypeScript implementation of Android Debug Bridge (ADB) protocol.
56 lines (50 loc) • 1.65 kB
text/typescript
import { ReadableStream } from "@yume-chan/stream-extra";
import type { StructValue } from "@yume-chan/struct";
import { buffer, struct, u32 } from "@yume-chan/struct";
import { AdbSyncRequestId, adbSyncWriteRequest } from "./request.js";
import { adbSyncReadResponses, AdbSyncResponseId } from "./response.js";
import type { AdbSyncSocket } from "./socket.js";
export const AdbSyncDataResponse = struct(
{ data: buffer(u32) },
{ littleEndian: true },
);
export type AdbSyncDataResponse = StructValue<typeof AdbSyncDataResponse>;
export async function* adbSyncPullGenerator(
socket: AdbSyncSocket,
path: string,
): AsyncGenerator<Uint8Array, void, void> {
const locked = await socket.lock();
let done = false;
try {
await adbSyncWriteRequest(locked, AdbSyncRequestId.Receive, path);
for await (const packet of adbSyncReadResponses(
locked,
AdbSyncResponseId.Data,
AdbSyncDataResponse,
)) {
yield packet.data;
}
done = true;
} catch (e) {
done = true;
throw e;
} finally {
if (!done) {
// sync pull can't be cancelled, so we have to read all data
for await (const packet of adbSyncReadResponses(
locked,
AdbSyncResponseId.Data,
AdbSyncDataResponse,
)) {
void packet;
}
}
locked.release();
}
}
export function adbSyncPull(
socket: AdbSyncSocket,
path: string,
): ReadableStream<Uint8Array> {
return ReadableStream.from(adbSyncPullGenerator(socket, path));
}