@yume-chan/scrcpy
Version:
TypeScript implementation of Scrcpy client.
52 lines (42 loc) • 1.41 kB
text/typescript
import type { PushReadableStreamController } from "@yume-chan/stream-extra";
import { PushReadableStream } from "@yume-chan/stream-extra";
import type { AsyncExactReadable, StructValue } from "@yume-chan/struct";
import { buffer, struct, u16 } from "@yume-chan/struct";
import type { ScrcpyDeviceMessageParser } from "../../base/index.js";
export const UHidOutputDeviceMessage = struct(
{
id: u16,
data: buffer(u16),
},
{ littleEndian: false },
);
export type UHidOutputDeviceMessage = StructValue<
typeof UHidOutputDeviceMessage
>;
export class UHidOutputStream
extends PushReadableStream<UHidOutputDeviceMessage>
implements ScrcpyDeviceMessageParser
{
#controller: PushReadableStreamController<UHidOutputDeviceMessage>;
constructor() {
let controller!: PushReadableStreamController<UHidOutputDeviceMessage>;
super((controller_) => {
controller = controller_;
});
this.#controller = controller;
}
async parse(id: number, stream: AsyncExactReadable): Promise<boolean> {
if (id !== 2) {
return false;
}
const message = await UHidOutputDeviceMessage.deserialize(stream);
await this.#controller.enqueue(message);
return true;
}
close() {
this.#controller.close();
}
error(e?: unknown) {
this.#controller.error(e);
}
}