import type { Dayjs } from "dayjs"; import type { DateLike, ErrorLike, LifecycleStep, PlayMatchResult, PlayObject, PlayState, QueueContext, QueueStatus, ScrobbleResult } from "./Atomic.ts"; import type { Changeset } from "json-diff-ts"; export type PlayEventType = 'transform' | 'queueStateChange' | 'playStateChange' | 'dupeCheck' | 'scrobbleResult' | 'updatePlay'; export const PLAY_EVENT_TYPE = { transform: 'transform', updatePlay: 'updatePlay', 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 | null retries?: number error?: ErrorLike | null } export type PlayEventQueueStateChange = BasePlayEvent<'queueStateChange', PlayEventQueueStateChangeData, D>; export interface PlayEventPlayStateChangeData { state: PlayState error?: ErrorLike | null 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 PlayEventUpdatePlayData = {input: Partial, patch: Changeset}; export type PlayEventUpdatePlay = BasePlayEvent<'updatePlay', PlayEventUpdatePlayData, D>; export type PlayEvent = PlayEventTransform | PlayEventQueueStateChange | PlayEventPlayStateChange | PlayEventDupeCheck | PlayEventScrobbleResult | PlayEventUpdatePlay;