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'; export type SystemConfigUpdateEvent = { newConfig: SystemConfig; oldConfig: SystemConfig }; export type AlbumUpdateEvent = { id: string; /** user id */ updatedBy: string; }; export type AlbumInviteEvent = { id: string; userId: string }; export type UserSignupEvent = { notify: boolean; id: string; tempPassword?: string }; type MaybePromise = Promise | T; type Handler = (data: T) => MaybePromise; const noop = () => {}; const dummyHandlers = { // app events onBootstrapEvent: noop as Handler<'api' | 'microservices'>, onShutdownEvent: noop as () => MaybePromise, // config events onConfigUpdateEvent: noop as Handler, onConfigValidateEvent: noop as Handler, // album events onAlbumUpdateEvent: noop as Handler, onAlbumInviteEvent: noop as Handler, // user events onUserSignupEvent: noop as Handler, }; export type EventHandlers = typeof dummyHandlers; export type EmitEvent = keyof EventHandlers; export type EmitEventHandler = (...args: Parameters) => MaybePromise; export const events = Object.keys(dummyHandlers) as EmitEvent[]; export type OnEvents = Partial; 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', } 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; [ClientEvent.NEW_RELEASE]: ReleaseNotification; } export enum ServerEvent { CONFIG_UPDATE = 'config.update', WEBSOCKET_CONNECT = 'websocket.connect', } export interface ServerEventMap { [ServerEvent.CONFIG_UPDATE]: null; [ServerEvent.WEBSOCKET_CONNECT]: { userId: string }; } export interface IEventRepository { on(event: T, handler: EmitEventHandler): void; emit(event: T, ...args: Parameters>): Promise; /** * Send to connected clients for a specific user */ clientSend(event: E, userId: string, data: ClientEventMap[E]): void; /** * Send to all connected clients */ clientBroadcast(event: E, data: ClientEventMap[E]): void; /** * Notify listeners in this and connected processes. Subscribe to an event with `@OnServerEvent` */ serverSend(event: E, data: ServerEventMap[E]): boolean; }