saltfish 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.
- package/LICENSE +34 -0
- package/README.md +633 -0
- package/dist/components/buttons/ExitButton.d.ts +9 -0
- package/dist/components/buttons/ExitButton.d.ts.map +1 -0
- package/dist/components/buttons/MinimizeButton.d.ts +11 -0
- package/dist/components/buttons/MinimizeButton.d.ts.map +1 -0
- package/dist/components/buttons/PlayPauseButton.d.ts +13 -0
- package/dist/components/buttons/PlayPauseButton.d.ts.map +1 -0
- package/dist/core/SaltfishPlayer.d.ts +154 -0
- package/dist/core/SaltfishPlayer.d.ts.map +1 -0
- package/dist/core/stateMachine.d.ts +119 -0
- package/dist/core/stateMachine.d.ts.map +1 -0
- package/dist/core/stateMachineConfig.d.ts +7 -0
- package/dist/core/stateMachineConfig.d.ts.map +1 -0
- package/dist/core/store.d.ts +27 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/index.d.ts +127 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/managers/AnalyticsManager.d.ts +107 -0
- package/dist/managers/AnalyticsManager.d.ts.map +1 -0
- package/dist/managers/ButtonManager.d.ts +40 -0
- package/dist/managers/ButtonManager.d.ts.map +1 -0
- package/dist/managers/CursorManager.d.ts +143 -0
- package/dist/managers/CursorManager.d.ts.map +1 -0
- package/dist/managers/EventManager.d.ts +127 -0
- package/dist/managers/EventManager.d.ts.map +1 -0
- package/dist/managers/InteractionManager.d.ts +58 -0
- package/dist/managers/InteractionManager.d.ts.map +1 -0
- package/dist/managers/PlaylistManager.d.ts +42 -0
- package/dist/managers/PlaylistManager.d.ts.map +1 -0
- package/dist/managers/SessionManager.d.ts +56 -0
- package/dist/managers/SessionManager.d.ts.map +1 -0
- package/dist/managers/SessionRecordingManager.d.ts +52 -0
- package/dist/managers/SessionRecordingManager.d.ts.map +1 -0
- package/dist/managers/ShadowDOMManager.d.ts +35 -0
- package/dist/managers/ShadowDOMManager.d.ts.map +1 -0
- package/dist/managers/StepTimeoutManager.d.ts +38 -0
- package/dist/managers/StepTimeoutManager.d.ts.map +1 -0
- package/dist/managers/TransitionManager.d.ts +73 -0
- package/dist/managers/TransitionManager.d.ts.map +1 -0
- package/dist/managers/VideoManager.d.ts +231 -0
- package/dist/managers/VideoManager.d.ts.map +1 -0
- package/dist/observers/EventObserver.d.ts +52 -0
- package/dist/observers/EventObserver.d.ts.map +1 -0
- package/dist/observers/UIObserver.d.ts +43 -0
- package/dist/observers/UIObserver.d.ts.map +1 -0
- package/dist/patterns/Observer.d.ts +63 -0
- package/dist/patterns/Observer.d.ts.map +1 -0
- package/dist/patterns/PlayerStateSubject.d.ts +34 -0
- package/dist/patterns/PlayerStateSubject.d.ts.map +1 -0
- package/dist/player.js +8 -0
- package/dist/player.min.js +6 -0
- package/dist/saltfish-playlist-player.es.js +7202 -0
- package/dist/saltfish-playlist-player.umd.js +1 -0
- package/dist/styles/index.d.ts +14 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +337 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/ErrorHandler.d.ts +106 -0
- package/dist/utils/ErrorHandler.d.ts.map +1 -0
- package/dist/utils/PositionCalculator.d.ts +90 -0
- package/dist/utils/PositionCalculator.d.ts.map +1 -0
- package/dist/utils/deviceDetection.d.ts +90 -0
- package/dist/utils/deviceDetection.d.ts.map +1 -0
- package/dist/utils/dimensions.d.ts +26 -0
- package/dist/utils/dimensions.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +35 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/mockManifest.d.ts +27 -0
- package/dist/utils/mockManifest.d.ts.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { DeviceInfo } from '../utils/deviceDetection';
|
|
2
|
+
/**
|
|
3
|
+
* Defines how the video should behave when it reaches the end
|
|
4
|
+
*/
|
|
5
|
+
export type CompletionPolicy = 'auto' | 'manual';
|
|
6
|
+
/**
|
|
7
|
+
* Manager class for handling video playback and controls
|
|
8
|
+
*/
|
|
9
|
+
export declare class VideoManager {
|
|
10
|
+
private currentVideo;
|
|
11
|
+
private nextVideo;
|
|
12
|
+
private activeVideoIndex;
|
|
13
|
+
private container;
|
|
14
|
+
private progressBar;
|
|
15
|
+
private muteButton;
|
|
16
|
+
private preloadedVideos;
|
|
17
|
+
private updateInterval;
|
|
18
|
+
private animationFrameId;
|
|
19
|
+
private lastTimeupdateEvent;
|
|
20
|
+
private currentVideoUrl;
|
|
21
|
+
private nextVideoUrl;
|
|
22
|
+
private playbackPositions;
|
|
23
|
+
private completionPolicy;
|
|
24
|
+
private videoEndedCallback;
|
|
25
|
+
private deviceInfo;
|
|
26
|
+
private deviceChangeCleanup;
|
|
27
|
+
private hasUserInteracted;
|
|
28
|
+
private autoplayFallbackTimeout;
|
|
29
|
+
constructor();
|
|
30
|
+
/**
|
|
31
|
+
* Gets current device information
|
|
32
|
+
* @returns DeviceInfo object with device details
|
|
33
|
+
*/
|
|
34
|
+
getDeviceInfo(): DeviceInfo;
|
|
35
|
+
/**
|
|
36
|
+
* Checks if the current device is mobile
|
|
37
|
+
* @returns boolean indicating if device is mobile
|
|
38
|
+
*/
|
|
39
|
+
isMobileDevice(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Handles device information changes (orientation, resize, etc.)
|
|
42
|
+
* @param deviceInfo Updated device information
|
|
43
|
+
*/
|
|
44
|
+
private handleDeviceChange;
|
|
45
|
+
/**
|
|
46
|
+
* Creates video player elements
|
|
47
|
+
* @param container - The container element for the video player
|
|
48
|
+
*/
|
|
49
|
+
create(container: HTMLElement): void;
|
|
50
|
+
/**
|
|
51
|
+
* Returns the currently active video element
|
|
52
|
+
*/
|
|
53
|
+
private getActiveVideo;
|
|
54
|
+
/**
|
|
55
|
+
* Returns the inactive video element (for preloading)
|
|
56
|
+
*/
|
|
57
|
+
private getInactiveVideo;
|
|
58
|
+
/**
|
|
59
|
+
* Swaps between the two video elements
|
|
60
|
+
*/
|
|
61
|
+
private swapVideos;
|
|
62
|
+
/**
|
|
63
|
+
* Loads a video from URL
|
|
64
|
+
* @param url - URL of the video to load
|
|
65
|
+
*/
|
|
66
|
+
loadVideo(url: string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Preloads a video for future playback to reduce transition delays
|
|
69
|
+
* @param url - URL of the video to preload
|
|
70
|
+
*/
|
|
71
|
+
preloadNextVideo(url: string): void;
|
|
72
|
+
/**
|
|
73
|
+
* Plays the video
|
|
74
|
+
*/
|
|
75
|
+
play(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Pauses the video
|
|
78
|
+
*/
|
|
79
|
+
pause(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Seeks to a specified time in the video
|
|
82
|
+
* @param time - The time to seek to in seconds
|
|
83
|
+
*/
|
|
84
|
+
seek(time: number): void;
|
|
85
|
+
/**
|
|
86
|
+
* Gets the current playback time of the video
|
|
87
|
+
* @returns The current time in seconds
|
|
88
|
+
*/
|
|
89
|
+
getCurrentTime(): number;
|
|
90
|
+
/**
|
|
91
|
+
* Gets the duration of the video
|
|
92
|
+
* @returns The duration in seconds
|
|
93
|
+
*/
|
|
94
|
+
getDuration(): number;
|
|
95
|
+
/**
|
|
96
|
+
* Gets the active video element
|
|
97
|
+
* @returns The video element
|
|
98
|
+
*/
|
|
99
|
+
getVideoElement(): HTMLVideoElement | null;
|
|
100
|
+
/**
|
|
101
|
+
* Destroys the video player and cleans up resources
|
|
102
|
+
*/
|
|
103
|
+
destroy(): void;
|
|
104
|
+
/**
|
|
105
|
+
* Adds event listeners to the video elements
|
|
106
|
+
*/
|
|
107
|
+
private addEventListeners;
|
|
108
|
+
/**
|
|
109
|
+
* Removes event listeners from the video elements
|
|
110
|
+
*/
|
|
111
|
+
private removeEventListeners;
|
|
112
|
+
/**
|
|
113
|
+
* Handles video ended event
|
|
114
|
+
*/
|
|
115
|
+
private handleVideoEnded;
|
|
116
|
+
/**
|
|
117
|
+
* Handles video time update (for debugging)
|
|
118
|
+
*/
|
|
119
|
+
private handleTimeUpdate;
|
|
120
|
+
/**
|
|
121
|
+
* Handles video error event
|
|
122
|
+
*/
|
|
123
|
+
private handleVideoError;
|
|
124
|
+
/**
|
|
125
|
+
* Starts updating the progress bar
|
|
126
|
+
*/
|
|
127
|
+
private startProgressUpdates;
|
|
128
|
+
/**
|
|
129
|
+
* Stops updating the progress bar
|
|
130
|
+
*/
|
|
131
|
+
private stopProgressUpdates;
|
|
132
|
+
/**
|
|
133
|
+
* Updates the progress bar based on current playback position
|
|
134
|
+
*/
|
|
135
|
+
private updateProgress;
|
|
136
|
+
/**
|
|
137
|
+
* Handles detailed time updates for smooth progress bar
|
|
138
|
+
*/
|
|
139
|
+
private handleDetailedTimeUpdate;
|
|
140
|
+
/**
|
|
141
|
+
* Sets the muted state of both video elements
|
|
142
|
+
* @param muted - Whether to mute the video
|
|
143
|
+
*/
|
|
144
|
+
setMuted(muted: boolean): void;
|
|
145
|
+
/**
|
|
146
|
+
* Toggles the muted state of the video
|
|
147
|
+
* @param event - Optional mouse event
|
|
148
|
+
*/
|
|
149
|
+
private toggleMute;
|
|
150
|
+
/**
|
|
151
|
+
* Updates the mute button icon based on muted state
|
|
152
|
+
*/
|
|
153
|
+
private updateMuteButtonIcon;
|
|
154
|
+
/**
|
|
155
|
+
* Checks if the video is currently muted
|
|
156
|
+
* @returns Whether the video is muted
|
|
157
|
+
*/
|
|
158
|
+
isMuted(): boolean;
|
|
159
|
+
/**
|
|
160
|
+
* Sets the completion policy for the video
|
|
161
|
+
* @param policy - The completion policy to use
|
|
162
|
+
* @param callback - Optional callback to execute when video ends
|
|
163
|
+
*/
|
|
164
|
+
setCompletionPolicy(policy: CompletionPolicy, callback?: () => void): void;
|
|
165
|
+
/**
|
|
166
|
+
* Updates the video ended handler based on completion policy
|
|
167
|
+
*/
|
|
168
|
+
private updateVideoEndedHandler;
|
|
169
|
+
/**
|
|
170
|
+
* Handles video ended event for automatic completion policy
|
|
171
|
+
*/
|
|
172
|
+
private handleAutoVideoEnded;
|
|
173
|
+
/**
|
|
174
|
+
* Handles video ended event for manual completion policy
|
|
175
|
+
*/
|
|
176
|
+
private handleManualVideoEnded;
|
|
177
|
+
/**
|
|
178
|
+
* Handles click on the progress bar to seek
|
|
179
|
+
*/
|
|
180
|
+
private handleProgressBarClick;
|
|
181
|
+
/**
|
|
182
|
+
* Handles seeking events to ensure smooth progress updates
|
|
183
|
+
*/
|
|
184
|
+
private handleSeeking;
|
|
185
|
+
/**
|
|
186
|
+
* Handles seeked events (seeking ended)
|
|
187
|
+
*/
|
|
188
|
+
private handleSeeked;
|
|
189
|
+
/**
|
|
190
|
+
* Hides the progress bar (used during autoplay fallback)
|
|
191
|
+
*/
|
|
192
|
+
hideProgressBar(): void;
|
|
193
|
+
/**
|
|
194
|
+
* Shows the progress bar and resets it to proper state
|
|
195
|
+
*/
|
|
196
|
+
showProgressBar(): void;
|
|
197
|
+
/**
|
|
198
|
+
* Hides the mute button (used during autoplay fallback)
|
|
199
|
+
*/
|
|
200
|
+
hideMuteButton(): void;
|
|
201
|
+
/**
|
|
202
|
+
* Shows the mute button
|
|
203
|
+
*/
|
|
204
|
+
showMuteButton(): void;
|
|
205
|
+
/**
|
|
206
|
+
* Marks that the user has interacted with the video player
|
|
207
|
+
* This is important for mobile autoplay policies
|
|
208
|
+
*/
|
|
209
|
+
markUserInteraction(): void;
|
|
210
|
+
/**
|
|
211
|
+
* Checks if user has interacted with the player
|
|
212
|
+
* @returns boolean indicating if user has interacted
|
|
213
|
+
*/
|
|
214
|
+
hasUserInteractedWith(): boolean;
|
|
215
|
+
/**
|
|
216
|
+
* Resets user interaction state (called when starting a new playlist)
|
|
217
|
+
*/
|
|
218
|
+
resetUserInteraction(): void;
|
|
219
|
+
/**
|
|
220
|
+
* Determines if video should start muted based on mobile autoplay policies
|
|
221
|
+
* @param isAutoplayBlocked - Whether we're currently in autoplay blocked state
|
|
222
|
+
* @returns boolean indicating if video should start muted
|
|
223
|
+
*/
|
|
224
|
+
private shouldStartMuted;
|
|
225
|
+
/**
|
|
226
|
+
* Handles autoplay fallback click specifically for mobile Chrome
|
|
227
|
+
* @param videoElement - The video element to configure
|
|
228
|
+
*/
|
|
229
|
+
handleAutoplayFallbackClick(videoElement: HTMLVideoElement): void;
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=VideoManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoManager.d.ts","sourceRoot":"","sources":["../../src/managers/VideoManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { PlayerStateObserver, PlayerStateChangeData } from '../patterns/PlayerStateSubject';
|
|
2
|
+
import { EventManager } from '../managers/EventManager';
|
|
3
|
+
/**
|
|
4
|
+
* EventObserver - Translates player state changes to events in the EventManager
|
|
5
|
+
*
|
|
6
|
+
* This class decouples the event triggering logic from the player's state management,
|
|
7
|
+
* following the Observer pattern for better separation of concerns.
|
|
8
|
+
*/
|
|
9
|
+
export declare class EventObserver implements PlayerStateObserver {
|
|
10
|
+
private eventManager;
|
|
11
|
+
/**
|
|
12
|
+
* Create a new EventObserver
|
|
13
|
+
* @param eventManager The event manager to trigger events on
|
|
14
|
+
*/
|
|
15
|
+
constructor(eventManager: EventManager);
|
|
16
|
+
/**
|
|
17
|
+
* Reset static fields when starting a new playlist
|
|
18
|
+
* This ensures clean state between playlist transitions
|
|
19
|
+
*/
|
|
20
|
+
reset(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Handle state change updates from the PlayerStateSubject
|
|
23
|
+
* @param data The updated player state data
|
|
24
|
+
*/
|
|
25
|
+
update(data: PlayerStateChangeData): void;
|
|
26
|
+
/**
|
|
27
|
+
* Handle state transition events (paused, resumed)
|
|
28
|
+
* @param data The state change data
|
|
29
|
+
* @param store The Saltfish store
|
|
30
|
+
*/
|
|
31
|
+
private handleStateTransitionEvents;
|
|
32
|
+
/**
|
|
33
|
+
* Handle minimize/maximize events
|
|
34
|
+
* @param data The state change data
|
|
35
|
+
*/
|
|
36
|
+
private handleMinimizeEvents;
|
|
37
|
+
/**
|
|
38
|
+
* Handle step change events
|
|
39
|
+
* @param data The state change data
|
|
40
|
+
* @param store The Saltfish store
|
|
41
|
+
*/
|
|
42
|
+
private handleStepEvents;
|
|
43
|
+
/**
|
|
44
|
+
* Handle error events
|
|
45
|
+
* @param data The state change data
|
|
46
|
+
* @param store The Saltfish store
|
|
47
|
+
*/
|
|
48
|
+
private handleErrorEvents;
|
|
49
|
+
private static prevIsMinimized;
|
|
50
|
+
private static prevStepId;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=EventObserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventObserver.d.ts","sourceRoot":"","sources":["../../src/observers/EventObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,mBAAmB;IACvD,OAAO,CAAC,YAAY,CAAe;IAEnC;;;OAGG;gBACS,YAAY,EAAE,YAAY;IAItC;;;OAGG;IACI,KAAK,IAAI,IAAI;IAapB;;;OAGG;IACI,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAkBhD;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IA+CnC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA+B5B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAkHxB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,MAAM,CAAC,eAAe,CAAwB;IACtD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAuB;CACjD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { PlayerStateObserver, PlayerStateChangeData } from '../patterns/PlayerStateSubject';
|
|
2
|
+
import { Observer } from '../patterns/Observer';
|
|
3
|
+
import { CursorManager } from '../managers/CursorManager';
|
|
4
|
+
/**
|
|
5
|
+
* UIObserver - Handles UI updates based on player state changes
|
|
6
|
+
*
|
|
7
|
+
* This class decouples UI updates from the player's state management logic,
|
|
8
|
+
* following the Observer pattern for better separation of concerns.
|
|
9
|
+
*/
|
|
10
|
+
export declare class UIObserver implements PlayerStateObserver, Observer<PlayerStateChangeData> {
|
|
11
|
+
private playerElement;
|
|
12
|
+
private minimizeButton;
|
|
13
|
+
private cursorManager;
|
|
14
|
+
/**
|
|
15
|
+
* Set the player element that will be updated based on state changes
|
|
16
|
+
* @param element The player element
|
|
17
|
+
*/
|
|
18
|
+
setPlayerElement(element: HTMLElement): void;
|
|
19
|
+
/**
|
|
20
|
+
* Set the cursor manager to control cursor visibility
|
|
21
|
+
* @param cursorManager The cursor manager instance
|
|
22
|
+
*/
|
|
23
|
+
setCursorManager(cursorManager: CursorManager): void;
|
|
24
|
+
/**
|
|
25
|
+
* Handle state change updates from the PlayerStateSubject
|
|
26
|
+
* @param data The updated player state data
|
|
27
|
+
*/
|
|
28
|
+
update(data: PlayerStateChangeData): void;
|
|
29
|
+
/**
|
|
30
|
+
* Update the class on the player element based on state
|
|
31
|
+
*/
|
|
32
|
+
private updateStateClass;
|
|
33
|
+
/**
|
|
34
|
+
* Update the minimized class on the player element
|
|
35
|
+
*/
|
|
36
|
+
private updateMinimizeState;
|
|
37
|
+
/**
|
|
38
|
+
* Update minimize button icon based on state
|
|
39
|
+
* @param isMinimized Whether the player is minimized
|
|
40
|
+
*/
|
|
41
|
+
private updateMinimizeButtonIcon;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=UIObserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UIObserver.d.ts","sourceRoot":"","sources":["../../src/observers/UIObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI1D;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,mBAAmB,EAAE,QAAQ,CAAC,qBAAqB,CAAC;IACrF,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,aAAa,CAA8B;IAEnD;;;OAGG;IACI,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAOnD;;;OAGG;IACI,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAI3D;;;OAGG;IACI,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAehD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;CAUjC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observer Pattern implementation
|
|
3
|
+
*
|
|
4
|
+
* This file implements the Observer pattern to decouple state changes from UI updates.
|
|
5
|
+
* It provides a generic Subject and Observer interface that can be used throughout
|
|
6
|
+
* the application.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Observable Subject interface
|
|
10
|
+
* Represents an object that can be observed by multiple observers.
|
|
11
|
+
*/
|
|
12
|
+
export interface Subject<T> {
|
|
13
|
+
/**
|
|
14
|
+
* Register an observer to receive notifications
|
|
15
|
+
* @param observer The observer to register
|
|
16
|
+
*/
|
|
17
|
+
addObserver(observer: Observer<T>): void;
|
|
18
|
+
/**
|
|
19
|
+
* Remove an observer to stop receiving notifications
|
|
20
|
+
* @param observer The observer to remove
|
|
21
|
+
* @returns true if the observer was found and removed, false otherwise
|
|
22
|
+
*/
|
|
23
|
+
removeObserver(observer: Observer<T>): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Notify all observers about a state change
|
|
26
|
+
* @param data The data to pass to observers
|
|
27
|
+
*/
|
|
28
|
+
notifyObservers(data: T): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Observer interface
|
|
32
|
+
* Represents an object that wants to be notified of changes in a Subject.
|
|
33
|
+
*/
|
|
34
|
+
export interface Observer<T> {
|
|
35
|
+
/**
|
|
36
|
+
* Handle a state change notification from a subject
|
|
37
|
+
* @param data The data passed from the subject
|
|
38
|
+
*/
|
|
39
|
+
update(data: T): void;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Abstract Subject class that implements the core Subject functionality
|
|
43
|
+
*/
|
|
44
|
+
export declare abstract class AbstractSubject<T> implements Subject<T> {
|
|
45
|
+
private observers;
|
|
46
|
+
/**
|
|
47
|
+
* Register an observer to receive notifications
|
|
48
|
+
* @param observer The observer to register
|
|
49
|
+
*/
|
|
50
|
+
addObserver(observer: Observer<T>): void;
|
|
51
|
+
/**
|
|
52
|
+
* Remove an observer to stop receiving notifications
|
|
53
|
+
* @param observer The observer to remove
|
|
54
|
+
* @returns true if the observer was found and removed, false otherwise
|
|
55
|
+
*/
|
|
56
|
+
removeObserver(observer: Observer<T>): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Notify all observers about a state change
|
|
59
|
+
* @param data The data to pass to observers
|
|
60
|
+
*/
|
|
61
|
+
notifyObservers(data: T): void;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=Observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Observer.d.ts","sourceRoot":"","sources":["../../src/patterns/Observer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEzC;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAE/C;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,8BAAsB,eAAe,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,SAAS,CAA+B;IAEhD;;;OAGG;IACI,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAI/C;;;;OAIG;IACI,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO;IAIrD;;;OAGG;IACI,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;CAStC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AbstractSubject, Observer } from './Observer';
|
|
2
|
+
import { PlayerState } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* PlayerStateChangeData - The data passed to observers when player state changes
|
|
5
|
+
*/
|
|
6
|
+
export interface PlayerStateChangeData {
|
|
7
|
+
previousState?: string;
|
|
8
|
+
currentState: PlayerState;
|
|
9
|
+
currentStepId: string | null;
|
|
10
|
+
isMinimized: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* PlayerStateObserver - Specialized observer interface for player state changes
|
|
14
|
+
*/
|
|
15
|
+
export interface PlayerStateObserver extends Observer<PlayerStateChangeData> {
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* PlayerStateSubject - Subject that notifies observers about player state changes
|
|
19
|
+
*/
|
|
20
|
+
export declare class PlayerStateSubject extends AbstractSubject<PlayerStateChangeData> {
|
|
21
|
+
private currentState;
|
|
22
|
+
constructor();
|
|
23
|
+
/**
|
|
24
|
+
* Update the player state and notify observers if there's a change
|
|
25
|
+
* @param newState The new player state
|
|
26
|
+
*/
|
|
27
|
+
updateState(newState: Partial<PlayerStateChangeData>): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get the current player state
|
|
30
|
+
* @returns The current player state
|
|
31
|
+
*/
|
|
32
|
+
getState(): PlayerStateChangeData;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=PlayerStateSubject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlayerStateSubject.d.ts","sourceRoot":"","sources":["../../src/patterns/PlayerStateSubject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,WAAW,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CAEtB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,QAAQ,CAAC,qBAAqB,CAAC;CAAG;AAE/E;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,eAAe,CAAC,qBAAqB,CAAC;IAC5E,OAAO,CAAC,YAAY,CAAwB;;IAY5C;;;OAGG;IACI,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI;IAuBlE;;;OAGG;IACI,QAAQ,IAAI,qBAAqB;CAGzC"}
|