Release 2.6.24

This commit is contained in:
2026-08-10 00:32:28 +01:00
parent 08b06941a4
commit 4491c15215
6 changed files with 131 additions and 4 deletions
+116
View File
@@ -279,6 +279,122 @@ test('single-slide playlists re-render the active slide instead of refreshing af
assert.deepEqual(sandbox.slides, [{ id: 2, duration_seconds: 12 }]);
});
test('deferred playlist updates preserve the current slide index', async () => {
const sandbox = {
window: null,
location: { origin: 'http://localhost', href: 'http://localhost/screen/test2' },
Date,
JSON,
Math,
Number,
String,
Boolean,
Array,
Object,
Promise,
setTimeout,
clearTimeout,
console,
currentPlaylistSignature: 'old-signature',
currentPlaylistFadeBetweenSlides: false,
currentPlaylistSkipUnavailableRtmp: false,
slug: 'test2',
pendingPlaylistUpdate: null,
slides: [
{ id: 1, duration_seconds: 12 },
{ id: 2, duration_seconds: 12 },
{ id: 3, duration_seconds: 12 }
],
lastRenderedSlide: { id: 2, duration_seconds: 12 },
index: 1,
timer: null,
slideExpiresAt: null,
pausedRemainingMs: null,
app: null,
currentPlaylistEtag: '',
activeSlidesCacheKey: '',
activeSlidesCacheValue: [],
renderCacheViewportKey: '',
slideMarkupCache: Object.create(null),
templateLayoutCache: Object.create(null),
templateRenderPlanCache: Object.create(null),
getCurrentActiveSlides() {
return sandbox.slides;
},
getPlaylistRevision(data) {
return data.signature;
},
normalizeSlide(slide) {
return slide;
},
getActiveSlidesFrom(slideList) {
return slideList;
},
savePlaylistSnapshot() {},
markRefreshHealthy() {},
setOfflineBannerVisible() {},
scheduleRefreshRetry() {},
syncWebpagePreloads() {},
syncRtmpWarmups() {},
clearActiveSlidesCache() {},
showCurrent() {},
sendCommandState() {},
logDebug() {}
};
sandbox.window = sandbox;
const scriptPath = path.join(__dirname, '..', 'src', 'player', 'public', 'js', 'player-page-playback.js');
const script = fs.readFileSync(scriptPath, 'utf8');
const prelude = `
var pendingPlaylistUpdate = null;
var slides = [
{ id: 1, duration_seconds: 12 },
{ id: 2, duration_seconds: 12 },
{ id: 3, duration_seconds: 12 }
];
var currentPlaylistSignature = 'old-signature';
var currentPlaylistFadeBetweenSlides = false;
var currentPlaylistSkipUnavailableRtmp = false;
var currentPlaylistEtag = '';
var lastRenderedSlide = { id: 2, duration_seconds: 12 };
var index = 1;
var timer = null;
var slideExpiresAt = null;
var pausedRemainingMs = null;
var app = null;
var activeSlidesCacheKey = '';
var activeSlidesCacheValue = [];
var renderCacheViewportKey = '';
var slideMarkupCache = Object.create(null);
var templateLayoutCache = Object.create(null);
var templateRenderPlanCache = Object.create(null);
`;
vm.runInNewContext(prelude + '\n' + script, sandbox, { filename: scriptPath });
sandbox.pendingPlaylistUpdate = {
slides: [
{ id: 10, duration_seconds: 12 },
{ id: 11, duration_seconds: 12 },
{ id: 12, duration_seconds: 12 }
],
signature: 'next-signature',
fadeBetweenSlides: false,
skipUnavailableRtmp: false
};
const applied = sandbox.applyPendingPlaylistUpdate();
assert.equal(applied, true);
assert.equal(sandbox.currentPlaylistSignature, 'next-signature');
assert.equal(sandbox.pendingPlaylistUpdate, null);
assert.deepEqual(sandbox.slides, [
{ id: 10, duration_seconds: 12 },
{ id: 11, duration_seconds: 12 },
{ id: 12, duration_seconds: 12 }
]);
assert.equal(sandbox.index, 1);
});
test('removing the currently visible slide from a two-slide playlist applies the one-slide update immediately', async () => {
const calls = {
showCurrent: 0,