mirror of
https://github.com/samsonjs/immich.git
synced 2026-03-30 10:05:54 +00:00
* refactor(server): events * chore: better type --------- Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
119 lines
3.9 KiB
TypeScript
119 lines
3.9 KiB
TypeScript
import { SystemConfig } from 'src/config';
|
|
import { AssetResponseDto } from 'src/dtos/asset-response.dto';
|
|
import { ReleaseNotification, ServerVersionResponseDto } from 'src/dtos/server.dto';
|
|
|
|
export const IEventRepository = 'IEventRepository';
|
|
|
|
type EventMap = {
|
|
// app events
|
|
'app.bootstrap': ['api' | 'microservices'];
|
|
'app.shutdown': [];
|
|
|
|
// config events
|
|
'config.update': [
|
|
{
|
|
newConfig: SystemConfig;
|
|
/** When the server starts, `oldConfig` is `undefined` */
|
|
oldConfig?: SystemConfig;
|
|
},
|
|
];
|
|
'config.validate': [{ newConfig: SystemConfig; oldConfig: SystemConfig }];
|
|
|
|
// album events
|
|
'album.update': [{ id: string; updatedBy: string }];
|
|
'album.invite': [{ id: string; userId: string }];
|
|
|
|
// asset events
|
|
'asset.tag': [{ assetId: string }];
|
|
'asset.untag': [{ assetId: string }];
|
|
'asset.hide': [{ assetId: string; userId: string }];
|
|
'asset.show': [{ assetId: string; userId: string }];
|
|
'asset.trash': [{ assetId: string; userId: string }];
|
|
'asset.delete': [{ assetId: string; userId: string }];
|
|
|
|
// asset bulk events
|
|
'assets.trash': [{ assetIds: string[]; userId: string }];
|
|
'assets.delete': [{ assetIds: string[]; userId: string }];
|
|
'assets.restore': [{ assetIds: string[]; userId: string }];
|
|
|
|
// session events
|
|
'session.delete': [{ sessionId: string }];
|
|
|
|
// stack events
|
|
'stack.create': [{ stackId: string; userId: string }];
|
|
'stack.update': [{ stackId: string; userId: string }];
|
|
'stack.delete': [{ stackId: string; userId: string }];
|
|
|
|
// stack bulk events
|
|
'stacks.delete': [{ stackIds: string[]; userId: string }];
|
|
|
|
// user events
|
|
'user.signup': [{ notify: boolean; id: string; tempPassword?: string }];
|
|
|
|
// websocket events
|
|
'websocket.connect': [{ userId: string }];
|
|
};
|
|
|
|
export const serverEvents = ['config.update'] as const;
|
|
export type ServerEvents = (typeof serverEvents)[number];
|
|
|
|
export type EmitEvent = keyof EventMap;
|
|
export type EmitHandler<T extends EmitEvent> = (...args: ArgsOf<T>) => Promise<void> | void;
|
|
export type ArgOf<T extends EmitEvent> = EventMap[T][0];
|
|
export type ArgsOf<T extends EmitEvent> = EventMap[T];
|
|
|
|
export enum ClientEvent {
|
|
UPLOAD_SUCCESS = 'on_upload_success',
|
|
USER_DELETE = 'on_user_delete',
|
|
ASSET_DELETE = 'on_asset_delete',
|
|
ASSET_TRASH = 'on_asset_trash',
|
|
ASSET_UPDATE = 'on_asset_update',
|
|
ASSET_HIDDEN = 'on_asset_hidden',
|
|
ASSET_RESTORE = 'on_asset_restore',
|
|
ASSET_STACK_UPDATE = 'on_asset_stack_update',
|
|
PERSON_THUMBNAIL = 'on_person_thumbnail',
|
|
SERVER_VERSION = 'on_server_version',
|
|
CONFIG_UPDATE = 'on_config_update',
|
|
NEW_RELEASE = 'on_new_release',
|
|
SESSION_DELETE = 'on_session_delete',
|
|
}
|
|
|
|
export interface ClientEventMap {
|
|
[ClientEvent.UPLOAD_SUCCESS]: AssetResponseDto;
|
|
[ClientEvent.USER_DELETE]: string;
|
|
[ClientEvent.ASSET_DELETE]: string;
|
|
[ClientEvent.ASSET_TRASH]: string[];
|
|
[ClientEvent.ASSET_UPDATE]: AssetResponseDto;
|
|
[ClientEvent.ASSET_HIDDEN]: string;
|
|
[ClientEvent.ASSET_RESTORE]: string[];
|
|
[ClientEvent.ASSET_STACK_UPDATE]: string[];
|
|
[ClientEvent.PERSON_THUMBNAIL]: string;
|
|
[ClientEvent.SERVER_VERSION]: ServerVersionResponseDto;
|
|
[ClientEvent.CONFIG_UPDATE]: Record<string, never>;
|
|
[ClientEvent.NEW_RELEASE]: ReleaseNotification;
|
|
[ClientEvent.SESSION_DELETE]: string;
|
|
}
|
|
|
|
export type EventItem<T extends EmitEvent> = {
|
|
event: T;
|
|
handler: EmitHandler<T>;
|
|
server: boolean;
|
|
};
|
|
|
|
export interface IEventRepository {
|
|
on<T extends keyof EventMap>(item: EventItem<T>): void;
|
|
emit<T extends keyof EventMap>(event: T, ...args: ArgsOf<T>): Promise<void>;
|
|
|
|
/**
|
|
* Send to connected clients for a specific user
|
|
*/
|
|
clientSend<E extends keyof ClientEventMap>(event: E, room: string, data: ClientEventMap[E]): void;
|
|
/**
|
|
* Send to all connected clients
|
|
*/
|
|
clientBroadcast<E extends keyof ClientEventMap>(event: E, data: ClientEventMap[E]): void;
|
|
/**
|
|
* Send to all connected servers
|
|
*/
|
|
serverSend<T extends ServerEvents>(event: T, ...args: ArgsOf<T>): void;
|
|
}
|