refactor: event manager (#25481)

* refactor: event manager

* fix: broken downloadFile endpoint
This commit is contained in:
Jason Rasmussen
2026-01-23 18:02:23 -05:00
committed by GitHub
parent b52e8cd570
commit 4fedae4150
16 changed files with 45 additions and 116 deletions
+2 -51
View File
@@ -1,5 +1,6 @@
import type { ThemeSetting } from '$lib/managers/theme-manager.svelte';
import type { ReleaseEvent } from '$lib/types';
import { BaseEventManager } from '$lib/utils/base-event-manager.svelte';
import type { TreeNode } from '$lib/utils/tree-utils';
import type {
AlbumResponseDto,
@@ -85,54 +86,4 @@ export type Events = {
ReleaseEvent: [ReleaseEvent];
};
type Listener<EventMap extends Record<string, unknown[]>, K extends keyof EventMap> = (...params: EventMap[K]) => void;
class EventManager<EventMap extends Record<string, unknown[]>> {
private listeners: {
[K in keyof EventMap]?: {
listener: Listener<EventMap, K>;
once?: boolean;
}[];
} = {};
on<T extends keyof EventMap>(key: T, listener: (...params: EventMap[T]) => void) {
return this.addListener(key, listener, false);
}
once<T extends keyof EventMap>(key: T, listener: (...params: EventMap[T]) => void) {
return this.addListener(key, listener, true);
}
off<K extends keyof EventMap>(key: K, listener: Listener<EventMap, K>) {
if (this.listeners[key]) {
this.listeners[key] = this.listeners[key].filter((item) => item.listener !== listener);
}
return this;
}
emit<T extends keyof EventMap>(key: T, ...params: EventMap[T]) {
if (!this.listeners[key]) {
return;
}
for (const { listener } of this.listeners[key]) {
listener(...params);
}
// remove one time listeners
this.listeners[key] = this.listeners[key].filter((item) => !item.once);
}
private addListener<T extends keyof EventMap>(key: T, listener: (...params: EventMap[T]) => void, once: boolean) {
if (!this.listeners[key]) {
this.listeners[key] = [];
}
this.listeners[key].push({ listener, once });
return this;
}
}
export const eventManager = new EventManager<Events>();
export const eventManager = new BaseEventManager<Events>();
+1 -1
View File
@@ -19,7 +19,7 @@ export class QueueManager {
}
constructor() {
eventManager.on('QueueUpdate', () => void this.refresh());
eventManager.on('QueueUpdate', () => this.refresh());
}
listen() {
@@ -5,7 +5,7 @@ class ServerConfigManager {
#value?: ServerConfigDto = $state();
constructor() {
eventManager.on('SystemConfigUpdate', () => void this.loadServerConfig());
eventManager.on('SystemConfigUpdate', () => this.loadServerConfig());
}
async init() {
@@ -113,9 +113,7 @@ export class TimelineManager extends VirtualScrollManager {
const onAssetUpdate = (asset: AssetResponseDto) => this.upsertAssets([toTimelineAsset(asset)]);
eventManager.on('AssetUpdate', onAssetUpdate);
this.#unsubscribes.push(() => eventManager.off('AssetUpdate', onAssetUpdate));
this.#unsubscribes.push(eventManager.on('AssetUpdate', onAssetUpdate));
}
override get scrollTop(): number {
@@ -6,7 +6,8 @@ class UploadManager {
mediaTypes = $state<ServerMediaTypesResponseDto>({ image: [], sidecar: [], video: [] });
constructor() {
eventManager.on('AppInit', () => void this.#loadExtensions()).on('AuthLogout', () => void this.reset());
eventManager.on('AppInit', () => this.#loadExtensions());
eventManager.on('AuthLogout', () => this.reset());
}
reset() {