refactor: code cleanup

This commit is contained in:
Simon Chan 2024-12-02 10:26:21 +08:00
parent f3d8ded9d2
commit d8301a61f2
No known key found for this signature in database
GPG key ID: A8B69F750B9BCEDD
8 changed files with 38 additions and 34 deletions

View file

@ -20,9 +20,6 @@ export class AdbDaemonWebUsbDeviceObserver
#exclusionFilters?: USBDeviceFilter[] | undefined; #exclusionFilters?: USBDeviceFilter[] | undefined;
#usbManager: USB; #usbManager: USB;
#onError = new EventEmitter<Error>();
onError = this.#onError.event;
#onDeviceAdd = new EventEmitter<AdbDaemonWebUsbDevice[]>(); #onDeviceAdd = new EventEmitter<AdbDaemonWebUsbDevice[]>();
onDeviceAdd = this.#onDeviceAdd.event; onDeviceAdd = this.#onDeviceAdd.event;
@ -86,7 +83,6 @@ export class AdbDaemonWebUsbDeviceObserver
this.#handleDisconnect, this.#handleDisconnect,
); );
this.#onError.dispose();
this.#onDeviceAdd.dispose(); this.#onDeviceAdd.dispose();
this.#onDeviceRemove.dispose(); this.#onDeviceRemove.dispose();
this.#onListChange.dispose(); this.#onListChange.dispose();

View file

@ -2,7 +2,6 @@ import type { MaybePromiseLike } from "@yume-chan/async";
import type { Event } from "@yume-chan/event"; import type { Event } from "@yume-chan/event";
export interface DeviceObserver<T> { export interface DeviceObserver<T> {
onError: Event<Error>;
onDeviceAdd: Event<T[]>; onDeviceAdd: Event<T[]>;
onDeviceRemove: Event<T[]>; onDeviceRemove: Event<T[]>;
onListChange: Event<T[]>; onListChange: Event<T[]>;

View file

@ -2,6 +2,7 @@
import type { MaybePromiseLike } from "@yume-chan/async"; import type { MaybePromiseLike } from "@yume-chan/async";
import { PromiseResolver } from "@yume-chan/async"; import { PromiseResolver } from "@yume-chan/async";
import type { Event } from "@yume-chan/event";
import { EventEmitter } from "@yume-chan/event"; import { EventEmitter } from "@yume-chan/event";
import { getUint64LittleEndian } from "@yume-chan/no-data-view"; import { getUint64LittleEndian } from "@yume-chan/no-data-view";
import type { import type {
@ -24,7 +25,7 @@ import {
import type { AdbIncomingSocketHandler, AdbSocket, Closeable } from "../adb.js"; import type { AdbIncomingSocketHandler, AdbSocket, Closeable } from "../adb.js";
import { AdbBanner } from "../banner.js"; import { AdbBanner } from "../banner.js";
import type { DeviceObserver } from "../device-observer.js"; import type { DeviceObserver as DeviceObserverBase } from "../device-observer.js";
import type { AdbFeature } from "../features.js"; import type { AdbFeature } from "../features.js";
import { hexToNumber, sequenceEqual, write4HexDigits } from "../utils/index.js"; import { hexToNumber, sequenceEqual, write4HexDigits } from "../utils/index.js";
@ -287,7 +288,7 @@ export class AdbServerClient {
/** /**
* Monitors device list changes. * Monitors device list changes.
*/ */
async trackDevices(): Promise<DeviceObserver<AdbServerClient.Device>> { async trackDevices(): Promise<AdbServerClient.DeviceObserver> {
const connection = await this.createConnection("host:track-devices-l"); const connection = await this.createConnection("host:track-devices-l");
let current: AdbServerClient.Device[] = []; let current: AdbServerClient.Device[] = [];
@ -752,4 +753,8 @@ export namespace AdbServerClient {
} }
} }
} }
export interface DeviceObserver extends DeviceObserverBase<Device> {
onError: Event<Error>;
}
} }

View file

@ -17,19 +17,10 @@ import type {
import type { TinyH264Wrapper } from "./wrapper.js"; import type { TinyH264Wrapper } from "./wrapper.js";
import { createTinyH264Wrapper } from "./wrapper.js"; import { createTinyH264Wrapper } from "./wrapper.js";
const NOOP = () => { const noop = () => {
// no-op // no-op
}; };
export interface TinyH264DecoderInit {
/**
* Optional render target canvas element or offscreen canvas.
* If not provided, a new `<canvas>` (when DOM is available)
* or a `OffscreenCanvas` will be created.
*/
canvas?: HTMLCanvasElement | OffscreenCanvas | undefined;
}
export function createCanvas() { export function createCanvas() {
if (typeof document !== "undefined") { if (typeof document !== "undefined") {
return document.createElement("canvas"); return document.createElement("canvas");
@ -77,7 +68,7 @@ export class TinyH264Decoder implements ScrcpyVideoDecoder {
#yuvCanvas: YuvCanvas | undefined; #yuvCanvas: YuvCanvas | undefined;
#initializer: PromiseResolver<TinyH264Wrapper> | undefined; #initializer: PromiseResolver<TinyH264Wrapper> | undefined;
constructor({ canvas }: TinyH264DecoderInit = {}) { constructor({ canvas }: TinyH264Decoder.Options = {}) {
if (canvas) { if (canvas) {
this.#renderer = canvas; this.#renderer = canvas;
} else { } else {
@ -180,7 +171,18 @@ export class TinyH264Decoder implements ScrcpyVideoDecoder {
this.#initializer?.promise this.#initializer?.promise
.then((wrapper) => wrapper.dispose()) .then((wrapper) => wrapper.dispose())
// NOOP: It's disposed so nobody cares about the error // NOOP: It's disposed so nobody cares about the error
.catch(NOOP); .catch(noop);
this.#initializer = undefined; this.#initializer = undefined;
} }
} }
export namespace TinyH264Decoder {
export interface Options {
/**
* Optional render target canvas element or offscreen canvas.
* If not provided, a new `<canvas>` (when DOM is available)
* or a `OffscreenCanvas` will be created.
*/
canvas?: HTMLCanvasElement | OffscreenCanvas | undefined;
}
}

View file

@ -96,15 +96,6 @@ const VideoFrameCapturerPool =
/* #__PURE__ */ /* #__PURE__ */
new Pool(() => new VideoFrameCapturer(), 4); new Pool(() => new VideoFrameCapturer(), 4);
export interface WebCodecsVideoDecoderInit {
/**
* The video codec to decode
*/
codec: ScrcpyVideoCodecId;
renderer: WebCodecsVideoDecoderRenderer;
}
export class WebCodecsVideoDecoder implements ScrcpyVideoDecoder { export class WebCodecsVideoDecoder implements ScrcpyVideoDecoder {
static get isSupported() { static get isSupported() {
return typeof globalThis.VideoDecoder !== "undefined"; return typeof globalThis.VideoDecoder !== "undefined";
@ -164,7 +155,7 @@ export class WebCodecsVideoDecoder implements ScrcpyVideoDecoder {
/** /**
* Create a new WebCodecs video decoder. * Create a new WebCodecs video decoder.
*/ */
constructor({ codec, renderer }: WebCodecsVideoDecoderInit) { constructor({ codec, renderer }: WebCodecsVideoDecoder.Options) {
this.#codec = codec; this.#codec = codec;
this.#renderer = renderer; this.#renderer = renderer;
@ -303,3 +294,14 @@ export class WebCodecsVideoDecoder implements ScrcpyVideoDecoder {
this.#captureFrame?.close(); this.#captureFrame?.close();
} }
} }
export namespace WebCodecsVideoDecoder {
export interface Options {
/**
* The video codec to decode
*/
codec: ScrcpyVideoCodecId;
renderer: WebCodecsVideoDecoderRenderer;
}
}

View file

@ -1,6 +1,6 @@
import { CanvasWebCodecsVideoDecoderRenderer } from "./canvas.js"; import { CanvasWebCodecsDecoderRenderer } from "./canvas.js";
export class BitmapWebCodecsDecoderRenderer extends CanvasWebCodecsVideoDecoderRenderer { export class BitmapWebCodecsDecoderRenderer extends CanvasWebCodecsDecoderRenderer {
#context: ImageBitmapRenderingContext; #context: ImageBitmapRenderingContext;
constructor(canvas?: HTMLCanvasElement | OffscreenCanvas) { constructor(canvas?: HTMLCanvasElement | OffscreenCanvas) {

View file

@ -2,7 +2,7 @@ import { createCanvas } from "@yume-chan/scrcpy-decoder-tinyh264";
import type { WebCodecsVideoDecoderRenderer } from "./type.js"; import type { WebCodecsVideoDecoderRenderer } from "./type.js";
export abstract class CanvasWebCodecsVideoDecoderRenderer export abstract class CanvasWebCodecsDecoderRenderer
implements WebCodecsVideoDecoderRenderer implements WebCodecsVideoDecoderRenderer
{ {
#canvas: HTMLCanvasElement | OffscreenCanvas; #canvas: HTMLCanvasElement | OffscreenCanvas;

View file

@ -1,6 +1,6 @@
import { createCanvas } from "@yume-chan/scrcpy-decoder-tinyh264"; import { createCanvas } from "@yume-chan/scrcpy-decoder-tinyh264";
import { CanvasWebCodecsVideoDecoderRenderer } from "./canvas.js"; import { CanvasWebCodecsDecoderRenderer } from "./canvas.js";
const Resolved = Promise.resolve(); const Resolved = Promise.resolve();
@ -24,7 +24,7 @@ function createContext(
); );
} }
export class WebGLWebCodecsDecoderRenderer extends CanvasWebCodecsVideoDecoderRenderer { export class WebGLWebCodecsDecoderRenderer extends CanvasWebCodecsDecoderRenderer {
static vertexShaderSource = ` static vertexShaderSource = `
attribute vec2 xy; attribute vec2 xy;