Buffer bounded recording segments for stable browser playback
This commit is contained in:
+11
-3
@@ -13,9 +13,9 @@ test('microsecond recording starts round inward and never seek into the precedin
|
||||
assert.equal(exact[0].start,Date.parse(raw));
|
||||
assert.deepEqual(Ranges.normalize([{start:raw,duration:0.0001}],date(0),date(1)),[]);
|
||||
});
|
||||
test('long recording continues after each one-hour session',()=>{
|
||||
const ranges=[{start:+date(0),end:+date(8000)}];assert.deepEqual(Ranges.at(ranges,date(0)),{start:+date(0),end:+date(3600)});
|
||||
assert.deepEqual(Ranges.next(ranges,date(3600)),{start:+date(3600),end:+date(7200)});assert.equal(Ranges.next(ranges,date(8000)),null);
|
||||
test('long recording continues in bounded five-minute sessions',()=>{
|
||||
const ranges=[{start:+date(0),end:+date(8000)}];assert.deepEqual(Ranges.at(ranges,date(0)),{start:+date(0),end:+date(300)});
|
||||
assert.deepEqual(Ranges.next(ranges,date(300)),{start:+date(300),end:+date(600)});assert.equal(Ranges.next(ranges,date(8000)),null);
|
||||
});
|
||||
test('next segment skips the actual gap and does not replay the previous end',()=>{
|
||||
const ranges=[{start:+date(0),end:+date(10)},{start:+date(30),end:+date(40)}];assert.equal(Ranges.at(ranges,date(10)),null);
|
||||
@@ -56,6 +56,14 @@ test('late recording list cannot replace another camera or a logged-out view',as
|
||||
vm.runInContext(section('recording-ui.js','async function queryRecordings(','function drawTimeline('),c);
|
||||
const work=c.queryRecordings();c.playbackGeneration++;p.resolve({items:[]});await work;assert.equal(c.spans,undefined);
|
||||
});
|
||||
test('resuming a long pause reopens the recorded position without a page refresh',()=>{
|
||||
const c=ui({playbackRange:{start:10000,end:300000},playbackPausedAt:Date.now()-20000,playAt:(date,preserve)=>c.played={time:+date,preserve}});
|
||||
c.$('#play-video').currentTime=45;
|
||||
vm.runInContext(section('recording-ui.js','function pausePlayback(','function makeClip('),c);
|
||||
c.resumePlayback();assert.deepEqual(c.played,{time:55000,preserve:true});assert.equal(c.playbackPausedAt,0);
|
||||
c.played=null;c.playbackPausedAt=Date.now();c.resumePlayback();assert.equal(c.played,null);
|
||||
c.playbackPausedAt=Date.now()-20000;c.loggedIn=false;c.resumePlayback();assert.equal(c.played,null);
|
||||
});
|
||||
test('download generation refuses gaps and invalidates old links first',()=>{
|
||||
const c=ui({queryCamera:'camera',spans:[{start:+date(0),end:+date(60)}],playbackParams:()=>new URLSearchParams({start:'test'}),Error});
|
||||
vm.runInContext(section('recording-ui.js','function makeClip(',"$('#query-recordings')"),c);
|
||||
|
||||
Reference in New Issue
Block a user