diff --git a/assets/replay.js b/assets/replay.js index 9a864f5..2a24e28 100644 --- a/assets/replay.js +++ b/assets/replay.js @@ -80,20 +80,21 @@ function base64ToUint8array(base64) { return array; } -async function play_ctrl(term, session, start, total_dur, paused, shifted, prog) { +// replay session +// term: xterm, path: session file to replay, +// start: start position to replay in percentile, range 0-100 +// paused: callback whether to stop play +// prog: callback to update the progress bar +// shift: callback whether we should change position +// end: callback when playback is finished + +async function replay_session(term, records, total_dur, start, paused, prog, end) { var cur = 0 - var new_pos = -1 start = parseInt(total_dur * start / 100) term.reset() - for (const item of session) { - new_pos = shifted() - - if (new_pos != -1) { - return new_pos - } - + for (const item of records) { // we will blast through the beginning of the session if (cur >= start) { // we are cheating a little bit here, we do not want to wait for too long @@ -112,50 +113,50 @@ async function play_ctrl(term, session, start, total_dur, paused, shifted, prog) } } - return -1 + end() } -// replay session -// term: xterm, path: session file to replay, -// start: start position to replay in percentile, range 0-100 -// paused: callback whether to stop play -// prog: callback to update the progress bar -// shift: callback whether we should change position -// end: callback when playback is finished -async function replay_session(term, path, start, paused, shifted, prog, end) { - var session - var total_dur = 0 - var cur = 0 - var new_pos = 0 - var ret = 0 - // read file from server - await fetch(path) - .then(res => res.json()) - .then(out => { - session = out - }) +function forwardScreen(term, records, end) { + var cur = 0 + end = parseInt(total_dur * end / 100) + term.reset() + + for (const item of records) { + // we will blast through the beginning of the session + if (cur >= end) { + return + } + + term.write(base64ToUint8array(item.Data)) + cur += item.Duration + } +} + + +async function fetchAndParse(path, update) { + var records + var total_dur = 0 + + // read file from server, we need to await twice. + var res = await fetch(path) + + if (!res.ok) { + return + } + + records = await res.json() //calculate the total duration - for (const item of session) { + for (const item of records) { item.Duration = parseInt(item.Duration / 1000000) total_dur += item.Duration } - console.log("Total duration:", total_dur, "start replay on position", start) - - while (true) { - ret = await play_ctrl(term, session, start, total_dur, paused, shifted, prog) - if (ret == -1) { - break - } - - start = ret - } - - term.reset() - end() + console.log("total_dur", total_dur) + update(records, total_dur) } + function Init() { let term = createReplayTerminal(); var str = [ diff --git a/assets/template/replay.html b/assets/template/replay.html index 1bc4d29..c36e5dc 100644 --- a/assets/template/replay.html +++ b/assets/template/replay.html @@ -40,8 +40,7 @@ - + @@ -52,23 +51,26 @@ rc.value = 0 var icon = document.getElementById("play-btn") - var path = "/records/{{.fname}}" var pause = false - var clicked = -1 + + var records + var total_dur + + // return values are not reliable with async functions + fetchAndParse("/records/{{.fname}}", + function (v1, v2) { + records = v1 + total_dur = v2 + }) function playbtn() { if (icon.src.includes("play")) { icon.src = "/assets/img/pause.svg" pause = false - replay_session(term, path, rc.value, + replay_session(term, records, total_dur, rc.value, function () { return pause }, - function(){ - var tmp = clicked - clicked = -1 - return tmp - }, function (percent) { rc.value = percent }, @@ -81,6 +83,15 @@ pause = true } } + + function seek(end) { + // pause the play if it is currently playing + if (!icon.src.includes("play")) { + playbtn() + } + + forwardScreen(term, records, end) + }