* feat(ui): start assist stats * feat(ui): design mock up for stats * feat(ui): naming... * feat(ui): types, api service, some changes for recs and loaders * feat(ui): csv export button/request * feat(ui): csv export button/request * feat(ui): format dates * feat(ui): some fixes for stats requests * fix(tracker): fix test * fix(tracker): fix ci build * fix(tracker): fix assist tests * fix(tracker): bump test coverage, fix minor bug * fix(ui): more cypress fixes * fix(ui): add proj id to socket connection * fix(ui): remove console log * fix(ui): update filters * feat(ui):fix some api keys for stats * feat(ui): fix type * feat(ui): remove unused * feat(ui): some fixes * feat(ui): some fixes 2 * fix(ui): some search fixes * fix(ui): change api keys * fix(ui): change api keys * fix(ui): pdf button fix * fix(ui): pdf button fix * fix(ui): some ui fixes after review * fix(ui): fix csv export * fix(ui): change header for pds export for stats * fix(ui): change header width for exports
102 lines
No EOL
3 KiB
TypeScript
102 lines
No EOL
3 KiB
TypeScript
import type { Store, SessionFilesInfo } from 'Player'
|
|
import type { Message } from './messages'
|
|
|
|
import WebPlayer from './WebPlayer'
|
|
import AssistManager from './assist/AssistManager'
|
|
|
|
import MFileReader from './messages/MFileReader'
|
|
import { requestEFSDom } from './network/loadFiles'
|
|
|
|
export default class WebLivePlayer extends WebPlayer {
|
|
static readonly INITIAL_STATE = {
|
|
...WebPlayer.INITIAL_STATE,
|
|
...AssistManager.INITIAL_STATE,
|
|
liveTimeTravel: false,
|
|
}
|
|
|
|
assistManager: AssistManager // public so far
|
|
private readonly incomingMessages: Message[] = []
|
|
private historyFileIsLoading = false
|
|
private lastMessageInFileTime = 0
|
|
|
|
constructor(
|
|
wpState: Store<typeof WebLivePlayer.INITIAL_STATE>,
|
|
private session: SessionFilesInfo,
|
|
config: RTCIceServer[] | null,
|
|
agentId: number,
|
|
projectId: number,
|
|
uiErrorHandler?: { error: (msg: string) => void },
|
|
) {
|
|
super(wpState, session, true, false, uiErrorHandler)
|
|
|
|
this.assistManager = new AssistManager(
|
|
session,
|
|
f => this.messageManager.setMessagesLoading(f),
|
|
(msg) => {
|
|
this.incomingMessages.push(msg)
|
|
if (!this.historyFileIsLoading) {
|
|
// TODO: fix index-ing after historyFile-load
|
|
this.messageManager.distributeMessage(msg)
|
|
}
|
|
},
|
|
this.screen,
|
|
config,
|
|
wpState,
|
|
uiErrorHandler,
|
|
)
|
|
this.assistManager.connect(session.agentToken!, agentId, projectId)
|
|
}
|
|
|
|
toggleTimetravel = async () => {
|
|
if (this.wpState.get().liveTimeTravel) {
|
|
return
|
|
}
|
|
let result = false;
|
|
this.historyFileIsLoading = true
|
|
this.messageManager.setMessagesLoading(true) // do it in one place. update unique loading states each time instead
|
|
this.messageManager.resetMessageManagers()
|
|
|
|
try {
|
|
const bytes = await requestEFSDom(this.session.sessionId)
|
|
const fileReader = new MFileReader(bytes, this.session.startedAt)
|
|
for (let msg = fileReader.readNext();msg !== null;msg = fileReader.readNext()) {
|
|
this.messageManager.distributeMessage(msg)
|
|
}
|
|
this.wpState.update({
|
|
liveTimeTravel: true,
|
|
})
|
|
result = true
|
|
// here we need to update also lists state, if we gonna use them this.messageManager.onFileReadSuccess
|
|
} catch(e) {
|
|
this.uiErrorHandler?.error('Error requesting a session file')
|
|
console.error("EFS file download error:", e)
|
|
}
|
|
|
|
// Append previously received messages
|
|
this.incomingMessages
|
|
.filter(msg => msg.time >= this.lastMessageInFileTime)
|
|
.forEach((msg) => this.messageManager.distributeMessage(msg))
|
|
this.incomingMessages.length = 0
|
|
|
|
this.historyFileIsLoading = false
|
|
this.messageManager.setMessagesLoading(false)
|
|
return result;
|
|
}
|
|
|
|
jumpToLive = () => {
|
|
this.wpState.update({
|
|
live: true,
|
|
livePlay: true,
|
|
})
|
|
this.jump(this.wpState.get().lastMessageTime)
|
|
}
|
|
|
|
clean = () => {
|
|
this.incomingMessages.length = 0
|
|
this.assistManager.clean()
|
|
this.screen?.clean?.()
|
|
// @ts-ignore
|
|
this.screen = undefined;
|
|
super.clean()
|
|
}
|
|
} |