@@ -28,6 +28,12 @@ export type PlayerEvent =
28
28
timeOffset : number ;
29
29
} ;
30
30
}
31
+ | {
32
+ type : 'PLAY_SINGLE_EVENT' ;
33
+ payload : {
34
+ singleEvent : number ;
35
+ } ;
36
+ }
31
37
| {
32
38
type : 'CAST_EVENT' ;
33
39
payload : {
@@ -78,6 +84,30 @@ export function discardPriorSnapshots(
78
84
return events ;
79
85
}
80
86
87
+ function discardPriorSnapshotsToEvent (
88
+ events : eventWithTime [ ] ,
89
+ targetIndex : number ,
90
+ ) {
91
+ const targetEvent = events [ targetIndex ] ;
92
+
93
+ if ( ! targetEvent ) {
94
+ return [ ] ;
95
+ }
96
+
97
+ for ( let idx = targetIndex ; idx >= 0 ; idx -- ) {
98
+ const event = events [ idx ] ;
99
+
100
+ if ( ! event ) {
101
+ continue ;
102
+ }
103
+
104
+ if ( event . type === EventType . Meta ) {
105
+ return events . slice ( idx , targetIndex + 1 ) ;
106
+ }
107
+ }
108
+ return events ;
109
+ }
110
+
81
111
type PlayerAssets = {
82
112
emitter : Emitter ;
83
113
applyEventsSynchronously ( events : Array < eventWithTime > ) : void ;
@@ -119,6 +149,10 @@ export function createPlayerService(
119
149
target : 'playing' ,
120
150
actions : [ 'recordTimeOffset' , 'play' ] ,
121
151
} ,
152
+ PLAY_SINGLE_EVENT : {
153
+ target : 'paused' ,
154
+ actions : [ 'playSingleEvent' ] ,
155
+ } ,
122
156
CAST_EVENT : {
123
157
target : 'paused' ,
124
158
actions : 'castEvent' ,
@@ -168,6 +202,24 @@ export function createPlayerService(
168
202
baselineTime : ctx . events [ 0 ] . timestamp + timeOffset ,
169
203
} ;
170
204
} ) ,
205
+
206
+ playSingleEvent ( ctx , event ) {
207
+ if ( event . type !== 'PLAY_SINGLE_EVENT' ) {
208
+ return ;
209
+ }
210
+
211
+ const { singleEvent } = event . payload ;
212
+
213
+ const neededEvents2 = discardPriorSnapshotsToEvent (
214
+ ctx . events ,
215
+ singleEvent ,
216
+ ) ;
217
+
218
+ applyEventsSynchronously ( neededEvents2 ) ;
219
+ emitter . emit ( ReplayerEvents . Flush ) ;
220
+ // emitter.emit(ReplayerEvents.Finish);
221
+ } ,
222
+
171
223
play ( ctx ) {
172
224
const { timer, events, baselineTime, lastPlayedEvent } = ctx ;
173
225
timer . clear ( ) ;
0 commit comments