@scarlett-player/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/error-handler.d.ts.map +1 -0
  2. package/dist/error-handler.js +300 -0
  3. package/dist/error-handler.js.map +1 -0
  4. package/dist/events/event-bus.d.ts.map +1 -0
  5. package/dist/events/event-bus.js +407 -0
  6. package/dist/events/event-bus.js.map +1 -0
  7. package/dist/index.cjs +2 -0
  8. package/dist/index.cjs.map +1 -0
  9. package/dist/index.d.ts +16 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +2271 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/logger.d.ts.map +1 -0
  14. package/dist/logger.js +272 -0
  15. package/dist/logger.js.map +1 -0
  16. package/dist/plugin-api.d.ts +147 -0
  17. package/dist/plugin-api.d.ts.map +1 -0
  18. package/dist/plugin-api.js +160 -0
  19. package/dist/plugin-api.js.map +1 -0
  20. package/dist/plugin-manager.d.ts +52 -0
  21. package/dist/plugin-manager.d.ts.map +1 -0
  22. package/dist/plugin-manager.js +224 -0
  23. package/dist/plugin-manager.js.map +1 -0
  24. package/dist/scarlett-player.d.ts +404 -0
  25. package/dist/scarlett-player.d.ts.map +1 -0
  26. package/dist/scarlett-player.js +769 -0
  27. package/dist/scarlett-player.js.map +1 -0
  28. package/dist/state/computed.d.ts.map +1 -0
  29. package/dist/state/computed.js +134 -0
  30. package/dist/state/computed.js.map +1 -0
  31. package/dist/state/effect.d.ts.map +1 -0
  32. package/dist/state/effect.js +77 -0
  33. package/dist/state/effect.js.map +1 -0
  34. package/dist/state/index.d.ts.map +1 -0
  35. package/dist/state/index.js +9 -0
  36. package/dist/state/index.js.map +1 -0
  37. package/dist/state/signal.d.ts.map +1 -0
  38. package/dist/state/signal.js +126 -0
  39. package/dist/state/signal.js.map +1 -0
  40. package/dist/state/state-manager.d.ts.map +1 -0
  41. package/dist/state/state-manager.js +334 -0
  42. package/dist/state/state-manager.js.map +1 -0
  43. package/dist/types/events.d.ts +323 -0
  44. package/dist/types/events.d.ts.map +1 -0
  45. package/dist/types/events.js +7 -0
  46. package/dist/types/events.js.map +1 -0
  47. package/dist/types/index.d.ts +9 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/types/index.js +7 -0
  50. package/dist/types/index.js.map +1 -0
  51. package/dist/types/plugin.d.ts +141 -0
  52. package/dist/types/plugin.d.ts.map +1 -0
  53. package/dist/types/plugin.js +8 -0
  54. package/dist/types/plugin.js.map +1 -0
  55. package/dist/types/state.d.ts +232 -0
  56. package/dist/types/state.d.ts.map +1 -0
  57. package/dist/types/state.js +8 -0
  58. package/dist/types/state.js.map +1 -0
  59. package/package.json +64 -0
@@ -0,0 +1,334 @@
1
+ /**
2
+ * StateManager - Centralized reactive state management for Scarlett Player.
3
+ *
4
+ * Manages all player state using reactive signals. Each state property
5
+ * is a Signal that can be observed for changes.
6
+ *
7
+ * Target size: ~1-2KB (excluding type definitions)
8
+ */
9
+ import { signal } from './signal';
10
+ /**
11
+ * Default initial values for all state properties.
12
+ */
13
+ const DEFAULT_STATE = {
14
+ // Core Playback State
15
+ playbackState: 'idle',
16
+ playing: false,
17
+ paused: true,
18
+ ended: false,
19
+ buffering: false,
20
+ waiting: false,
21
+ seeking: false,
22
+ // Time & Duration
23
+ currentTime: 0,
24
+ duration: NaN,
25
+ buffered: null,
26
+ bufferedAmount: 0,
27
+ // Media Info
28
+ mediaType: 'unknown',
29
+ source: null,
30
+ title: '',
31
+ poster: '',
32
+ // Volume & Audio
33
+ volume: 1.0,
34
+ muted: false,
35
+ // Playback Controls
36
+ playbackRate: 1.0,
37
+ fullscreen: false,
38
+ pip: false,
39
+ controlsVisible: true,
40
+ // Quality & Tracks
41
+ qualities: [],
42
+ currentQuality: null,
43
+ audioTracks: [],
44
+ currentAudioTrack: null,
45
+ textTracks: [],
46
+ currentTextTrack: null,
47
+ // Live/DVR State (TSP features)
48
+ live: false,
49
+ liveEdge: true,
50
+ seekableRange: null,
51
+ liveLatency: 0,
52
+ lowLatencyMode: false,
53
+ // Chapters (TSP features)
54
+ chapters: [],
55
+ currentChapter: null,
56
+ // Error State
57
+ error: null,
58
+ // Network & Performance
59
+ bandwidth: 0,
60
+ autoplay: false,
61
+ loop: false,
62
+ // Casting State
63
+ airplayAvailable: false,
64
+ airplayActive: false,
65
+ chromecastAvailable: false,
66
+ chromecastActive: false,
67
+ // UI State
68
+ interacting: false,
69
+ hovering: false,
70
+ focused: false,
71
+ };
72
+ /**
73
+ * StateManager manages all player state using reactive signals.
74
+ *
75
+ * Each state property is a Signal that automatically tracks dependencies
76
+ * and notifies subscribers when changed.
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * const state = new StateManager();
81
+ *
82
+ * // Get a signal
83
+ * const playingSignal = state.get('playing');
84
+ * playingSignal.get(); // false
85
+ *
86
+ * // Set a value
87
+ * state.set('playing', true);
88
+ *
89
+ * // Subscribe to changes
90
+ * state.subscribe((event) => {
91
+ * console.log(`${event.key} changed to`, event.value);
92
+ * });
93
+ *
94
+ * // Batch updates
95
+ * state.update({
96
+ * playing: true,
97
+ * currentTime: 10,
98
+ * volume: 0.8,
99
+ * });
100
+ * ```
101
+ */
102
+ export class StateManager {
103
+ /**
104
+ * Create a new StateManager with default initial state.
105
+ *
106
+ * @param initialState - Optional partial initial state (merged with defaults)
107
+ */
108
+ constructor(initialState) {
109
+ /** Internal map of state signals */
110
+ this.signals = new Map();
111
+ /** Global state change subscribers */
112
+ this.changeSubscribers = new Set();
113
+ this.initializeSignals(initialState);
114
+ }
115
+ /**
116
+ * Initialize all state signals with default or provided values.
117
+ * @private
118
+ */
119
+ initializeSignals(overrides) {
120
+ const initialState = { ...DEFAULT_STATE, ...overrides };
121
+ // Create signals for all state properties
122
+ for (const [key, value] of Object.entries(initialState)) {
123
+ const stateKey = key;
124
+ const stateSignal = signal(value);
125
+ // Subscribe to each signal to emit global change events
126
+ stateSignal.subscribe(() => {
127
+ this.notifyChangeSubscribers(stateKey);
128
+ });
129
+ this.signals.set(stateKey, stateSignal);
130
+ }
131
+ }
132
+ /**
133
+ * Get the signal for a state property.
134
+ *
135
+ * @param key - State property key
136
+ * @returns Signal for the property
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * const playingSignal = state.get('playing');
141
+ * playingSignal.get(); // false
142
+ * playingSignal.set(true);
143
+ * ```
144
+ */
145
+ get(key) {
146
+ const stateSignal = this.signals.get(key);
147
+ if (!stateSignal) {
148
+ throw new Error(`[StateManager] Unknown state key: ${key}`);
149
+ }
150
+ return stateSignal;
151
+ }
152
+ /**
153
+ * Get the current value of a state property (convenience method).
154
+ *
155
+ * @param key - State property key
156
+ * @returns Current value
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * state.getValue('playing'); // false
161
+ * ```
162
+ */
163
+ getValue(key) {
164
+ return this.get(key).get();
165
+ }
166
+ /**
167
+ * Set the value of a state property.
168
+ *
169
+ * @param key - State property key
170
+ * @param value - New value
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * state.set('playing', true);
175
+ * state.set('currentTime', 10.5);
176
+ * ```
177
+ */
178
+ set(key, value) {
179
+ this.get(key).set(value);
180
+ }
181
+ /**
182
+ * Update multiple state properties at once (batch update).
183
+ *
184
+ * More efficient than calling set() multiple times.
185
+ *
186
+ * @param updates - Partial state object with updates
187
+ *
188
+ * @example
189
+ * ```ts
190
+ * state.update({
191
+ * playing: true,
192
+ * currentTime: 0,
193
+ * volume: 1.0,
194
+ * });
195
+ * ```
196
+ */
197
+ update(updates) {
198
+ for (const [key, value] of Object.entries(updates)) {
199
+ const stateKey = key;
200
+ if (this.signals.has(stateKey)) {
201
+ this.set(stateKey, value);
202
+ }
203
+ }
204
+ }
205
+ /**
206
+ * Subscribe to changes on a specific state property.
207
+ *
208
+ * @param key - State property key
209
+ * @param callback - Callback function receiving new value
210
+ * @returns Unsubscribe function
211
+ *
212
+ * @example
213
+ * ```ts
214
+ * const unsub = state.subscribe('playing', (value) => {
215
+ * console.log('Playing:', value);
216
+ * });
217
+ * ```
218
+ */
219
+ subscribeToKey(key, callback) {
220
+ const stateSignal = this.get(key);
221
+ return stateSignal.subscribe(() => {
222
+ callback(stateSignal.get());
223
+ });
224
+ }
225
+ /**
226
+ * Subscribe to all state changes.
227
+ *
228
+ * Receives a StateChangeEvent for every state property change.
229
+ *
230
+ * @param callback - Callback function receiving change events
231
+ * @returns Unsubscribe function
232
+ *
233
+ * @example
234
+ * ```ts
235
+ * const unsub = state.subscribe((event) => {
236
+ * console.log(`${event.key} changed:`, event.value);
237
+ * });
238
+ * ```
239
+ */
240
+ subscribe(callback) {
241
+ this.changeSubscribers.add(callback);
242
+ return () => this.changeSubscribers.delete(callback);
243
+ }
244
+ /**
245
+ * Notify all global change subscribers.
246
+ * @private
247
+ */
248
+ notifyChangeSubscribers(key) {
249
+ const stateSignal = this.get(key);
250
+ const value = stateSignal.get();
251
+ const event = {
252
+ key,
253
+ value,
254
+ previousValue: value, // Note: We don't track previous values in this simple impl
255
+ };
256
+ this.changeSubscribers.forEach(subscriber => {
257
+ try {
258
+ subscriber(event);
259
+ }
260
+ catch (error) {
261
+ console.error('[StateManager] Error in change subscriber:', error);
262
+ }
263
+ });
264
+ }
265
+ /**
266
+ * Reset all state to default values.
267
+ *
268
+ * @example
269
+ * ```ts
270
+ * state.reset();
271
+ * ```
272
+ */
273
+ reset() {
274
+ this.update(DEFAULT_STATE);
275
+ }
276
+ /**
277
+ * Reset a specific state property to its default value.
278
+ *
279
+ * @param key - State property key
280
+ *
281
+ * @example
282
+ * ```ts
283
+ * state.resetKey('playing');
284
+ * ```
285
+ */
286
+ resetKey(key) {
287
+ const defaultValue = DEFAULT_STATE[key];
288
+ this.set(key, defaultValue);
289
+ }
290
+ /**
291
+ * Get a snapshot of all current state values.
292
+ *
293
+ * @returns Frozen snapshot of current state
294
+ *
295
+ * @example
296
+ * ```ts
297
+ * const snapshot = state.snapshot();
298
+ * console.log(snapshot.playing, snapshot.currentTime);
299
+ * ```
300
+ */
301
+ snapshot() {
302
+ const snapshot = {};
303
+ for (const [key, stateSignal] of this.signals) {
304
+ snapshot[key] = stateSignal.get();
305
+ }
306
+ return Object.freeze(snapshot);
307
+ }
308
+ /**
309
+ * Get the number of subscribers for a state property (for debugging).
310
+ *
311
+ * @param key - State property key
312
+ * @returns Number of subscribers
313
+ * @internal
314
+ */
315
+ getSubscriberCount(key) {
316
+ return this.signals.get(key)?.getSubscriberCount() ?? 0;
317
+ }
318
+ /**
319
+ * Destroy the state manager and cleanup all signals.
320
+ *
321
+ * @example
322
+ * ```ts
323
+ * state.destroy();
324
+ * ```
325
+ */
326
+ destroy() {
327
+ // Destroy all signals
328
+ this.signals.forEach(stateSignal => stateSignal.destroy());
329
+ this.signals.clear();
330
+ // Clear change subscribers
331
+ this.changeSubscribers.clear();
332
+ }
333
+ }
334
+ //# sourceMappingURL=state-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/state/state-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Event system type definitions for Scarlett Player.
3
+ *
4
+ * Type-safe event bus for plugin communication and player events.
5
+ */
6
+ import type { StateChangeEvent } from './state';
7
+ import type { Chapter } from './state';
8
+ import type { PlayerError } from '../error-handler';
9
+ /**
10
+ * Core player events.
11
+ */
12
+ export interface PlayerEventMap {
13
+ /** Player is ready (initialized) */
14
+ 'player:ready': void;
15
+ /** Player is being destroyed */
16
+ 'player:destroy': void;
17
+ /** Playback started */
18
+ 'playback:play': void;
19
+ /** Playback paused */
20
+ 'playback:pause': void;
21
+ /** Playback ended */
22
+ 'playback:ended': void;
23
+ /** Playback time updated */
24
+ 'playback:timeupdate': {
25
+ currentTime: number;
26
+ };
27
+ /** Seeking started */
28
+ 'playback:seeking': {
29
+ time: number;
30
+ };
31
+ /** Seeking completed */
32
+ 'playback:seeked': {
33
+ time: number;
34
+ };
35
+ /** Playback rate changed */
36
+ 'playback:ratechange': {
37
+ rate: number;
38
+ };
39
+ /** Media source loaded */
40
+ 'media:loaded': {
41
+ src: string;
42
+ type: string;
43
+ };
44
+ /** Media metadata loaded (duration, dimensions, etc.) */
45
+ 'media:loadedmetadata': {
46
+ duration: number;
47
+ };
48
+ /** Media can play (buffered enough) */
49
+ 'media:canplay': void;
50
+ /** Media can play through without buffering */
51
+ 'media:canplaythrough': void;
52
+ /** Media is buffering/loading */
53
+ 'media:waiting': void;
54
+ /** Media progress (buffering) */
55
+ 'media:progress': {
56
+ buffered: number;
57
+ };
58
+ /** Media error occurred */
59
+ 'media:error': {
60
+ error: Error;
61
+ };
62
+ /** Volume changed */
63
+ 'volume:change': {
64
+ volume: number;
65
+ muted: boolean;
66
+ };
67
+ /** Mute toggled */
68
+ 'volume:mute': {
69
+ muted: boolean;
70
+ };
71
+ /** Quality level changed */
72
+ 'quality:change': {
73
+ quality: string;
74
+ auto: boolean;
75
+ };
76
+ /** Available qualities updated */
77
+ 'quality:levels': {
78
+ levels: Array<{
79
+ id: string;
80
+ label: string;
81
+ }>;
82
+ };
83
+ /** User selected a quality level */
84
+ 'quality:select': {
85
+ quality: string;
86
+ auto?: boolean;
87
+ };
88
+ /** Text track (subtitle/caption) changed */
89
+ 'track:text': {
90
+ trackId: string | null;
91
+ };
92
+ /** Audio track changed */
93
+ 'track:audio': {
94
+ trackId: string | null;
95
+ };
96
+ /** Entered fullscreen */
97
+ 'fullscreen:enter': void;
98
+ /** Exited fullscreen */
99
+ 'fullscreen:exit': void;
100
+ /** Fullscreen changed */
101
+ 'fullscreen:change': {
102
+ fullscreen: boolean;
103
+ };
104
+ /** Entered PiP */
105
+ 'pip:enter': void;
106
+ /** Exited PiP */
107
+ 'pip:exit': void;
108
+ /** PiP changed */
109
+ 'pip:change': {
110
+ pip: boolean;
111
+ };
112
+ /** AirPlay devices available */
113
+ 'airplay:available': void;
114
+ /** AirPlay devices not available */
115
+ 'airplay:unavailable': void;
116
+ /** AirPlay connected */
117
+ 'airplay:connected': void;
118
+ /** AirPlay disconnected */
119
+ 'airplay:disconnected': void;
120
+ /** Chromecast available */
121
+ 'chromecast:available': void;
122
+ /** Chromecast unavailable */
123
+ 'chromecast:unavailable': void;
124
+ /** Chromecast connected */
125
+ 'chromecast:connected': {
126
+ deviceName: string;
127
+ };
128
+ /** Chromecast disconnected */
129
+ 'chromecast:disconnected': void;
130
+ /** Chromecast error */
131
+ 'chromecast:error': {
132
+ error: Error;
133
+ };
134
+ /** Live edge state changed */
135
+ 'live:edgechange': {
136
+ atEdge: boolean;
137
+ };
138
+ /** Live latency updated */
139
+ 'live:latency': {
140
+ latency: number;
141
+ };
142
+ /** Seekable range updated (DVR window) */
143
+ 'live:seekablerange': {
144
+ start: number;
145
+ end: number;
146
+ };
147
+ /** Low-latency mode toggled */
148
+ 'live:lowlatency': {
149
+ enabled: boolean;
150
+ };
151
+ /** Chapter changed (based on playback time) */
152
+ 'chapter:change': {
153
+ chapter: Chapter | null;
154
+ previous: Chapter | null;
155
+ };
156
+ /** Chapters loaded/updated */
157
+ 'chapter:loaded': {
158
+ chapters: Chapter[];
159
+ };
160
+ /** User clicked/selected a chapter */
161
+ 'chapter:select': {
162
+ chapter: Chapter;
163
+ };
164
+ /** Controls shown */
165
+ 'controls:show': void;
166
+ /** Controls hidden */
167
+ 'controls:hide': void;
168
+ /** Controls visibility changed */
169
+ 'controls:change': {
170
+ visible: boolean;
171
+ };
172
+ /** User started interacting */
173
+ 'ui:interact:start': void;
174
+ /** User stopped interacting */
175
+ 'ui:interact:end': void;
176
+ /** Mouse entered player */
177
+ 'ui:mouseenter': void;
178
+ /** Mouse left player */
179
+ 'ui:mouseleave': void;
180
+ /** Player gained focus */
181
+ 'ui:focus': void;
182
+ /** Player lost focus */
183
+ 'ui:blur': void;
184
+ /** Any state changed */
185
+ 'state:change': StateChangeEvent;
186
+ /** Plugin registered */
187
+ 'plugin:registered': {
188
+ name: string;
189
+ type: string;
190
+ };
191
+ /** Plugin activated */
192
+ 'plugin:active': {
193
+ name: string;
194
+ };
195
+ /** Plugin destroyed */
196
+ 'plugin:destroyed': {
197
+ name: string;
198
+ };
199
+ /** Plugin error */
200
+ 'plugin:error': {
201
+ name: string;
202
+ error: Error;
203
+ };
204
+ /** General error occurred */
205
+ 'error': PlayerError;
206
+ /** Network error */
207
+ 'error:network': {
208
+ error: Error;
209
+ };
210
+ /** Media error (decode, format, etc.) */
211
+ 'error:media': {
212
+ error: Error;
213
+ };
214
+ /** Plugin error */
215
+ 'error:plugin': {
216
+ error: Error;
217
+ plugin: string;
218
+ };
219
+ }
220
+ /**
221
+ * Event names (type-safe).
222
+ */
223
+ export type EventName = keyof PlayerEventMap;
224
+ /**
225
+ * Event payload for a specific event name.
226
+ */
227
+ export type EventPayload<T extends EventName> = PlayerEventMap[T];
228
+ /**
229
+ * Event handler function signature.
230
+ */
231
+ export type EventHandler<T extends EventName = EventName> = (payload: EventPayload<T>) => void | Promise<void>;
232
+ /**
233
+ * Event interceptor function signature.
234
+ * Can modify payload or cancel event propagation.
235
+ */
236
+ export type EventInterceptor<T extends EventName = EventName> = (payload: EventPayload<T>) => EventPayload<T> | null | Promise<EventPayload<T> | null>;
237
+ /**
238
+ * Event subscription interface.
239
+ */
240
+ export interface EventSubscription {
241
+ /** Unsubscribe from event */
242
+ unsubscribe(): void;
243
+ }
244
+ /**
245
+ * Event bus interface.
246
+ */
247
+ export interface EventBus {
248
+ /**
249
+ * Subscribe to an event.
250
+ *
251
+ * @param event - Event name
252
+ * @param handler - Event handler function
253
+ * @returns Unsubscribe function
254
+ */
255
+ on<T extends EventName>(event: T, handler: EventHandler<T>): () => void;
256
+ /**
257
+ * Subscribe to an event once (auto-unsubscribe after first call).
258
+ *
259
+ * @param event - Event name
260
+ * @param handler - Event handler function
261
+ * @returns Unsubscribe function
262
+ */
263
+ once<T extends EventName>(event: T, handler: EventHandler<T>): () => void;
264
+ /**
265
+ * Unsubscribe from an event.
266
+ *
267
+ * @param event - Event name
268
+ * @param handler - Event handler function to remove
269
+ */
270
+ off<T extends EventName>(event: T, handler: EventHandler<T>): void;
271
+ /**
272
+ * Emit an event.
273
+ *
274
+ * @param event - Event name
275
+ * @param payload - Event payload
276
+ */
277
+ emit<T extends EventName>(event: T, payload: EventPayload<T>): void;
278
+ /**
279
+ * Emit an event asynchronously (next tick).
280
+ *
281
+ * @param event - Event name
282
+ * @param payload - Event payload
283
+ */
284
+ emitAsync<T extends EventName>(event: T, payload: EventPayload<T>): Promise<void>;
285
+ /**
286
+ * Add an event interceptor.
287
+ * Interceptors run before handlers and can modify/cancel events.
288
+ *
289
+ * @param event - Event name
290
+ * @param interceptor - Interceptor function
291
+ * @returns Remove interceptor function
292
+ */
293
+ intercept<T extends EventName>(event: T, interceptor: EventInterceptor<T>): () => void;
294
+ /**
295
+ * Remove all listeners for an event (or all events if no event specified).
296
+ *
297
+ * @param event - Optional event name
298
+ */
299
+ removeAllListeners(event?: EventName): void;
300
+ /**
301
+ * Get listener count for an event.
302
+ *
303
+ * @param event - Event name
304
+ * @returns Number of listeners
305
+ */
306
+ listenerCount(event: EventName): number;
307
+ /**
308
+ * Destroy event bus and cleanup all listeners.
309
+ */
310
+ destroy(): void;
311
+ }
312
+ /**
313
+ * Event emitter options.
314
+ */
315
+ export interface EventEmitterOptions {
316
+ /** Maximum listeners per event (default: 100) */
317
+ maxListeners?: number;
318
+ /** Enable async event emission (default: false) */
319
+ async?: boolean;
320
+ /** Enable event interceptors (default: true) */
321
+ interceptors?: boolean;
322
+ }
323
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Event system type definitions for Scarlett Player.
3
+ *
4
+ * Type-safe event bus for plugin communication and player events.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Scarlett Player Type Definitions
3
+ *
4
+ * Central export for all TypeScript types and interfaces.
5
+ */
6
+ export type { Plugin, PluginType, PluginState, PluginConfig, PluginFactory, PluginDescriptor, IPluginAPI, } from './plugin';
7
+ export type { StateStore, StateKey, StateValue, StateUpdate, StateChangeEvent, IStateManager, PlaybackState, MediaType, MediaSource, Chapter, TextTrack, AudioTrack, QualityLevel, SeekableRange, } from './state';
8
+ export type { PlayerEventMap, EventName, EventPayload, EventHandler, EventInterceptor, EventSubscription, EventBus, EventEmitterOptions, } from './events';
9
+ //# sourceMappingURL=index.d.ts.map