Files
pulse-signage/src/web/lib/notify-player-screens.js
T
lzstealth 8c0c22156e
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m15s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 34s
Release v2.10.6
2026-08-29 14:59:06 +01:00

62 lines
3.0 KiB
JavaScript

// Route screen refresh commands to the physical player hosting each screen.
function createNotifyPlayerScreens(forwardPlayerCommand, getScreenConnections, forwardPlayerCommandToBaseUrl, resolvePlayerBaseUrl, forwardPlayerCommandToDevice) {
if (typeof forwardPlayerCommand !== 'function') {
throw new Error('createNotifyPlayerScreens requires a player command sender.');
}
return function notifyPlayerScreens(slugs, commandOrPayload) {
const uniqueSlugs = Array.from(new Set((slugs || []).map(function (slug) {
return String(slug || '').trim();
}).filter(Boolean)));
if (!uniqueSlugs.length) {
return Promise.resolve(0);
}
return Promise.allSettled(uniqueSlugs.map(async function (slug) {
// A screen may have connections on multiple players after a remote move or reconnect.
if (typeof getScreenConnections === 'function' && typeof forwardPlayerCommandToBaseUrl === 'function') {
const screenState = await getScreenConnections(slug);
const connections = Array.isArray(screenState && screenState.connections) ? screenState.connections : [];
const deviceIds = Array.from(new Set(connections.map(function (connection) {
return String(connection && connection.playerDeviceId || '').trim();
}).filter(Boolean)));
const playerBaseUrls = Array.from(new Set(connections.map(function (connection) {
if (String(connection && connection.playerDeviceId || '').trim()) {
return '';
}
return String(connection && connection.playerPublicBaseUrl || '').trim().replace(/\/$/, '');
}).filter(Boolean)));
const deviceResults = deviceIds.length && typeof forwardPlayerCommandToDevice === 'function'
? await Promise.all(deviceIds.map(function (deviceId) {
return forwardPlayerCommandToDevice(deviceId, {
command: commandOrPayload || 'refresh',
screenSlug: slug
});
}))
: [];
let baseUrlResults = [];
if (playerBaseUrls.length) {
const resolvedPlayerBaseUrls = typeof resolvePlayerBaseUrl === 'function'
? await Promise.all(playerBaseUrls.map(function (playerBaseUrl) { return resolvePlayerBaseUrl(playerBaseUrl); }))
: playerBaseUrls;
baseUrlResults = await Promise.all(resolvedPlayerBaseUrls.filter(Boolean).map(function (playerBaseUrl) {
return forwardPlayerCommandToBaseUrl(playerBaseUrl, slug, commandOrPayload || 'refresh');
}));
}
if (deviceResults.length || baseUrlResults.length) {
return deviceResults.concat(baseUrlResults);
}
}
return forwardPlayerCommand(slug, commandOrPayload || 'refresh');
})).then(function (results) {
const successful = results.filter(function (result) {
return result.status === 'fulfilled' && (!result.value || result.value.ok !== false);
}).length;
return successful;
});
};
}
module.exports = { createNotifyPlayerScreens };