@yume-chan/scrcpy
Version:
TypeScript implementation of Scrcpy client.
54 lines • 1.7 kB
JavaScript
import { PromiseResolver } from "@yume-chan/async";
import { string, struct, u32, u64, u8 } from "@yume-chan/struct";
export const AckClipboardDeviceMessage = struct({ sequence: u64 }, { littleEndian: false });
export const SetClipboardControlMessage = struct({
type: u8,
sequence: u64,
paste: u8(),
content: string(u32),
}, { littleEndian: false });
export class AckClipboardHandler {
#resolvers = new Map();
#closed = false;
async parse(id, stream) {
if (id !== 1) {
return false;
}
const message = await AckClipboardDeviceMessage.deserialize(stream);
const resolver = this.#resolvers.get(message.sequence);
if (resolver) {
resolver.resolve();
this.#resolvers.delete(message.sequence);
}
return true;
}
close() {
for (const resolver of this.#resolvers.values()) {
resolver.reject();
}
this.#resolvers.clear();
this.#closed = true;
}
error(e) {
for (const resolver of this.#resolvers.values()) {
resolver.reject(e);
}
this.#resolvers.clear();
this.#closed = true;
}
serializeSetClipboardControlMessage(message) {
if (message.sequence === 0n) {
return SetClipboardControlMessage.serialize(message);
}
if (this.#closed) {
throw new Error();
}
const resolver = new PromiseResolver();
this.#resolvers.set(message.sequence, resolver);
return [
SetClipboardControlMessage.serialize(message),
resolver.promise,
];
}
}
//# sourceMappingURL=set-clipboard.js.map