import type { Dayjs } from "dayjs"; import type { DateLike, ErrorLike, LifecycleStep, PlayMatchResult, PlayState, QueueContext, QueueStatus, ScrobbleResult } from "./Atomic.ts"; export type PlayEventType = 'transform' | 'queueStateChange' | 'playStateChange' | 'dupeCheck' | 'scrobbleResult'; export const PLAY_EVENT_TYPE = { transform: 'transform', queueStateChange: 'queueStateChange', playStateChange: 'playStateChange', dupeCheck: 'dupeCheck', scrobbleResult: 'scrobbleResult' } as const satisfies Record; export interface BasePlayEvent { id?: number playId: number eventName: K error?: ErrorLike createdAt?: D data: T } export type PlayEventTranformData = LifecycleStep[]; export type PlayEventTransform = BasePlayEvent<'transform', PlayEventTranformData, D>; export interface PlayEventQueueStateChangeData { queueName: string queueStatus: QueueStatus context?: QueueContext retries?: number error?: ErrorLike } export type PlayEventQueueStateChange = BasePlayEvent<'queueStateChange', PlayEventQueueStateChangeData, D>; export interface PlayEventPlayStateChangeData { state: PlayState error?: ErrorLike reason?: string } export type PlayEventPlayStateChange = BasePlayEvent<'playStateChange', PlayEventPlayStateChangeData, D>; export type PlayEventDupeCheckData = PlayMatchResult; export type PlayEventDupeCheck = BasePlayEvent<'dupeCheck', PlayEventDupeCheckData, D>; export type PlayEventScrobbleResultData = ScrobbleResult; export type PlayEventScrobbleResult = BasePlayEvent<'scrobbleResult', PlayEventScrobbleResultData, D>; export type PlayEvent = PlayEventTransform | PlayEventQueueStateChange | PlayEventPlayStateChange | PlayEventDupeCheck | PlayEventScrobbleResult;