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

View file

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

View file

@ -2,6 +2,7 @@
import type { MaybePromiseLike } from "@yume-chan/async";
import { PromiseResolver } from "@yume-chan/async";
import type { Event } from "@yume-chan/event";
import { EventEmitter } from "@yume-chan/event";
import { getUint64LittleEndian } from "@yume-chan/no-data-view";
import type {
@ -24,7 +25,7 @@ import {
import type { AdbIncomingSocketHandler, AdbSocket, Closeable } from "../adb.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 { hexToNumber, sequenceEqual, write4HexDigits } from "../utils/index.js";
@ -287,7 +288,7 @@ export class AdbServerClient {
/**
* Monitors device list changes.
*/
async trackDevices(): Promise<DeviceObserver<AdbServerClient.Device>> {
async trackDevices(): Promise<AdbServerClient.DeviceObserver> {
const connection = await this.createConnection("host:track-devices-l");
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 { createTinyH264Wrapper } from "./wrapper.js";
const NOOP = () => {
const noop = () => {
// 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() {
if (typeof document !== "undefined") {
return document.createElement("canvas");
@ -77,7 +68,7 @@ export class TinyH264Decoder implements ScrcpyVideoDecoder {
#yuvCanvas: YuvCanvas | undefined;
#initializer: PromiseResolver<TinyH264Wrapper> | undefined;
constructor({ canvas }: TinyH264DecoderInit = {}) {
constructor({ canvas }: TinyH264Decoder.Options = {}) {
if (canvas) {
this.#renderer = canvas;
} else {
@ -180,7 +171,18 @@ export class TinyH264Decoder implements ScrcpyVideoDecoder {
this.#initializer?.promise
.then((wrapper) => wrapper.dispose())
// NOOP: It's disposed so nobody cares about the error
.catch(NOOP);
.catch(noop);
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__ */
new Pool(() => new VideoFrameCapturer(), 4);
export interface WebCodecsVideoDecoderInit {
/**
* The video codec to decode
*/
codec: ScrcpyVideoCodecId;
renderer: WebCodecsVideoDecoderRenderer;
}
export class WebCodecsVideoDecoder implements ScrcpyVideoDecoder {
static get isSupported() {
return typeof globalThis.VideoDecoder !== "undefined";
@ -164,7 +155,7 @@ export class WebCodecsVideoDecoder implements ScrcpyVideoDecoder {
/**
* Create a new WebCodecs video decoder.
*/
constructor({ codec, renderer }: WebCodecsVideoDecoderInit) {
constructor({ codec, renderer }: WebCodecsVideoDecoder.Options) {
this.#codec = codec;
this.#renderer = renderer;
@ -303,3 +294,14 @@ export class WebCodecsVideoDecoder implements ScrcpyVideoDecoder {
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;
constructor(canvas?: HTMLCanvasElement | OffscreenCanvas) {

View file

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

View file

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