mirror of
https://github.com/yume-chan/ya-webadb.git
synced 2025-10-03 17:59:50 +02:00
feat(adb): use sticky event emitter for AdbServerClient.DeviceObserver.prototype.onListChange
event
This commit is contained in:
parent
4deb890b20
commit
90cc63ee4f
5 changed files with 40 additions and 13 deletions
|
@ -1,5 +1,5 @@
|
|||
import type { DeviceObserver } from "@yume-chan/adb";
|
||||
import { EventEmitter } from "@yume-chan/event";
|
||||
import { EventEmitter, StickyEventEmitter } from "@yume-chan/event";
|
||||
|
||||
import {
|
||||
AdbDaemonWebUsbDevice,
|
||||
|
@ -34,7 +34,7 @@ export class AdbDaemonWebUsbDeviceObserver
|
|||
#onDeviceRemove = new EventEmitter<AdbDaemonWebUsbDevice[]>();
|
||||
onDeviceRemove = this.#onDeviceRemove.event;
|
||||
|
||||
#onListChange = new EventEmitter<AdbDaemonWebUsbDevice[]>();
|
||||
#onListChange = new StickyEventEmitter<AdbDaemonWebUsbDevice[]>();
|
||||
onListChange = this.#onListChange.event;
|
||||
|
||||
current: AdbDaemonWebUsbDevice[] = [];
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { EventEmitter } from "@yume-chan/event";
|
||||
import { EventEmitter, StickyEventEmitter } from "@yume-chan/event";
|
||||
|
||||
import { Ref } from "../utils/index.js";
|
||||
|
||||
|
@ -95,6 +95,17 @@ export class AdbServerDeviceObserverOwner {
|
|||
throw options.signal.reason;
|
||||
}
|
||||
|
||||
const onDeviceAdd = new EventEmitter<AdbServerClient.Device[]>();
|
||||
const onDeviceRemove = new EventEmitter<AdbServerClient.Device[]>();
|
||||
const onListChange = new StickyEventEmitter<AdbServerClient.Device[]>();
|
||||
const onError = new StickyEventEmitter<Error>();
|
||||
|
||||
const observer = { onDeviceAdd, onDeviceRemove, onListChange, onError };
|
||||
// Register `observer` before `#connect`.
|
||||
// Because `#connect` might immediately receive some data
|
||||
// and want to trigger observers
|
||||
this.#observers.push(observer);
|
||||
|
||||
this.#stream ??= this.#connect();
|
||||
const stream = await this.#stream;
|
||||
|
||||
|
@ -103,14 +114,6 @@ export class AdbServerDeviceObserverOwner {
|
|||
throw options.signal.reason;
|
||||
}
|
||||
|
||||
const onDeviceAdd = new EventEmitter<AdbServerClient.Device[]>();
|
||||
const onDeviceRemove = new EventEmitter<AdbServerClient.Device[]>();
|
||||
const onListChange = new EventEmitter<AdbServerClient.Device[]>();
|
||||
const onError = new EventEmitter<Error>();
|
||||
|
||||
const observer = { onDeviceAdd, onDeviceRemove, onListChange, onError };
|
||||
this.#observers.push(observer);
|
||||
|
||||
const ref = new Ref(options);
|
||||
|
||||
const stop = async () => {
|
||||
|
|
|
@ -62,7 +62,7 @@ export class EventEmitter<TEvent, TResult = unknown> implements Disposable {
|
|||
|
||||
fire(e: TEvent) {
|
||||
for (const info of this.listeners.slice()) {
|
||||
info.listener.apply(info.thisArg, [e, ...info.args]);
|
||||
info.listener.call(info.thisArg, e, ...info.args);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
export * from "./disposable.js";
|
||||
export * from "./event.js";
|
||||
export * from "./event-emitter.js";
|
||||
export * from "./event.js";
|
||||
export * from "./sticky-event-emitter.js";
|
||||
export * from "./utils.js";
|
||||
|
|
23
libraries/event/src/sticky-event-emitter.ts
Normal file
23
libraries/event/src/sticky-event-emitter.ts
Normal file
|
@ -0,0 +1,23 @@
|
|||
import { EventEmitter, type EventListenerInfo } from "./event-emitter.js";
|
||||
import type { RemoveEventListener } from "./event.js";
|
||||
|
||||
export class StickyEventEmitter<TEvent, TResult = unknown> extends EventEmitter<
|
||||
TEvent,
|
||||
TResult
|
||||
> {
|
||||
#value: TEvent | undefined;
|
||||
|
||||
protected override addEventListener(
|
||||
info: EventListenerInfo<TEvent, TResult>,
|
||||
): RemoveEventListener {
|
||||
if (this.#value) {
|
||||
info.listener.call(info.thisArg, this.#value, ...info.args);
|
||||
}
|
||||
return super.addEventListener(info);
|
||||
}
|
||||
|
||||
override fire(e: TEvent): void {
|
||||
this.#value = e;
|
||||
super.fire(e);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue