Split web and player build artifacts
This commit is contained in:
@@ -52,7 +52,13 @@ function registerStartupTasks(options) {
|
||||
}
|
||||
|
||||
async function initialize() {
|
||||
await loadTaskModules(backgroundTaskDirectory, options);
|
||||
const startupTaskFile = path.join(backgroundTaskDirectory, 'data-source-refresh.js');
|
||||
const taskModule = require(startupTaskFile);
|
||||
const exported = getTaskExport(taskModule);
|
||||
|
||||
if (typeof exported === 'function') {
|
||||
await exported(options);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
@@ -9,6 +9,7 @@ function registerFontSyncTask(options) {
|
||||
backgroundTaskQueue.setTaskHandler('font-sync', async function (task) {
|
||||
const payload = task && task.payload ? task.payload : task || {};
|
||||
const uploadDir = String(payload.uploadDir || '').trim();
|
||||
const playerIdentifier = String(payload.playerIdentifier || payload.deviceId || '').trim();
|
||||
const operations = Array.isArray(payload.operations)
|
||||
? payload.operations
|
||||
: Array.isArray(payload.uploadPaths)
|
||||
@@ -28,9 +29,9 @@ function registerFontSyncTask(options) {
|
||||
continue;
|
||||
}
|
||||
if (String(operation.type || '').trim().toLowerCase() === 'delete') {
|
||||
await uploadSyncService.removeUploadFileFromPlayer(uploadPath, uploadDir);
|
||||
await uploadSyncService.removeUploadFileFromPlayer(uploadPath, uploadDir, undefined, playerIdentifier);
|
||||
} else {
|
||||
await uploadSyncService.pushUploadFileToPlayer(uploadPath, uploadDir);
|
||||
await uploadSyncService.pushUploadFileToPlayer(uploadPath, uploadDir, undefined, playerIdentifier);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,16 +1,40 @@
|
||||
const { collectFontLibrarySyncOperations } = require('../../media/font-library');
|
||||
const { fetchPlayerRegistrations } = require('#src/data/player-registry');
|
||||
|
||||
const TASK = {
|
||||
key: 'initial-font-sync',
|
||||
category: 'fonts'
|
||||
};
|
||||
|
||||
function isRecentPlayerRegistration(player, staleSeconds) {
|
||||
const lastSeenAt = player && player.last_seen_at;
|
||||
const lastSeenAtValue = lastSeenAt instanceof Date ? lastSeenAt.getTime() : new Date(lastSeenAt).getTime();
|
||||
const cutoffTime = Date.now() - Math.max(30, Number(staleSeconds || 60)) * 1000;
|
||||
|
||||
return Number.isFinite(lastSeenAtValue) && lastSeenAtValue >= cutoffTime;
|
||||
}
|
||||
|
||||
function normalizePlayerMetadata(player) {
|
||||
const playerIdentifier = String(player && player.identifier || '').trim();
|
||||
const playerPublicBaseUrl = String(player && player.public_base_url || '').trim();
|
||||
const playerInternalBaseUrl = String(player && player.internal_base_url || '').trim();
|
||||
|
||||
return {
|
||||
playerIdentifier: playerIdentifier || null,
|
||||
playerPublicBaseUrl: playerPublicBaseUrl || null,
|
||||
playerInternalBaseUrl: playerInternalBaseUrl || null,
|
||||
playerLabel: playerIdentifier || playerPublicBaseUrl || playerInternalBaseUrl || null,
|
||||
playerActive: true
|
||||
};
|
||||
}
|
||||
|
||||
function registerInitialFontSyncTask(options) {
|
||||
const pool = options && options.pool;
|
||||
const backgroundTaskQueue = options && options.backgroundTaskQueue;
|
||||
const mediaDir = String(options && options.mediaDir || '').trim();
|
||||
const uploadSyncService = options && options.uploadSyncService;
|
||||
|
||||
if (!backgroundTaskQueue || !mediaDir) {
|
||||
if (!pool || !backgroundTaskQueue || !mediaDir) {
|
||||
throw new Error('registerInitialFontSyncTask requires the initial font sync dependencies.');
|
||||
}
|
||||
|
||||
@@ -18,20 +42,45 @@ function registerInitialFontSyncTask(options) {
|
||||
? uploadSyncService.getPlayerTaskMetadata()
|
||||
: Promise.resolve({});
|
||||
|
||||
return Promise.resolve(metadataPromise).then(function (metadata) {
|
||||
return backgroundTaskQueue.enqueueTask({
|
||||
key: TASK.key,
|
||||
title: 'Initial font sync',
|
||||
category: TASK.category,
|
||||
taskType: 'font-sync',
|
||||
metadata: Object.assign({}, metadata || {}),
|
||||
payload: {
|
||||
mode: 'initial',
|
||||
uploadDir: mediaDir,
|
||||
operations: collectFontLibrarySyncOperations(mediaDir)
|
||||
},
|
||||
persist: true
|
||||
});
|
||||
return Promise.resolve(metadataPromise).then(async function () {
|
||||
let players = [];
|
||||
try {
|
||||
players = await fetchPlayerRegistrations(pool);
|
||||
} catch (error) {
|
||||
console.warn('Unable to fetch player registrations for initial font sync:', error);
|
||||
return null;
|
||||
}
|
||||
|
||||
const livePlayers = Array.isArray(players)
|
||||
? players.filter(function (player) {
|
||||
return isRecentPlayerRegistration(player, 60);
|
||||
})
|
||||
: [];
|
||||
|
||||
if (!livePlayers.length) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const operations = collectFontLibrarySyncOperations(mediaDir);
|
||||
return Promise.all(livePlayers.map(function (player) {
|
||||
const metadata = normalizePlayerMetadata(player);
|
||||
return backgroundTaskQueue.enqueueTask({
|
||||
key: TASK.key,
|
||||
title: 'Initial font sync',
|
||||
category: TASK.category,
|
||||
taskType: 'font-sync',
|
||||
metadata: metadata,
|
||||
payload: {
|
||||
mode: 'initial',
|
||||
uploadDir: mediaDir,
|
||||
operations: operations,
|
||||
playerIdentifier: metadata.playerIdentifier,
|
||||
playerPublicBaseUrl: metadata.playerPublicBaseUrl,
|
||||
playerInternalBaseUrl: metadata.playerInternalBaseUrl
|
||||
},
|
||||
persist: true
|
||||
});
|
||||
}));
|
||||
}).catch(function (error) {
|
||||
console.warn('Unable to queue initial font sync:', error);
|
||||
});
|
||||
|
||||
@@ -3,12 +3,37 @@ const TASK = {
|
||||
category: 'media-sync',
|
||||
};
|
||||
|
||||
const { fetchPlayerRegistrations } = require('#src/data/player-registry');
|
||||
|
||||
function isRecentPlayerRegistration(player, staleSeconds) {
|
||||
const lastSeenAt = player && player.last_seen_at;
|
||||
const lastSeenAtValue = lastSeenAt instanceof Date ? lastSeenAt.getTime() : new Date(lastSeenAt).getTime();
|
||||
const cutoffTime = Date.now() - Math.max(30, Number(staleSeconds || 60)) * 1000;
|
||||
|
||||
return Number.isFinite(lastSeenAtValue) && lastSeenAtValue >= cutoffTime;
|
||||
}
|
||||
|
||||
function normalizePlayerMetadata(player) {
|
||||
const playerIdentifier = String(player && player.identifier || '').trim();
|
||||
const playerPublicBaseUrl = String(player && player.public_base_url || '').trim();
|
||||
const playerInternalBaseUrl = String(player && player.internal_base_url || '').trim();
|
||||
|
||||
return {
|
||||
playerIdentifier: playerIdentifier || null,
|
||||
playerPublicBaseUrl: playerPublicBaseUrl || null,
|
||||
playerInternalBaseUrl: playerInternalBaseUrl || null,
|
||||
playerLabel: playerIdentifier || playerPublicBaseUrl || playerInternalBaseUrl || null,
|
||||
playerActive: true
|
||||
};
|
||||
}
|
||||
|
||||
function registerInitialMediaSyncTask(options) {
|
||||
const pool = options && options.pool;
|
||||
const backgroundTaskQueue = options && options.backgroundTaskQueue;
|
||||
const mediaDir = String(options && options.mediaDir || '').trim();
|
||||
const uploadSyncService = options && options.uploadSyncService;
|
||||
|
||||
if (!backgroundTaskQueue || !mediaDir) {
|
||||
if (!pool || !backgroundTaskQueue || !mediaDir) {
|
||||
throw new Error('registerInitialMediaSyncTask requires the initial media sync dependencies.');
|
||||
}
|
||||
|
||||
@@ -16,19 +41,43 @@ function registerInitialMediaSyncTask(options) {
|
||||
? uploadSyncService.getPlayerTaskMetadata()
|
||||
: Promise.resolve({});
|
||||
|
||||
return Promise.resolve(metadataPromise).then(function (metadata) {
|
||||
return backgroundTaskQueue.enqueueTask({
|
||||
key: TASK.key,
|
||||
title: 'Initial media sync',
|
||||
category: TASK.category,
|
||||
taskType: 'media-sync',
|
||||
metadata: Object.assign({}, metadata || {}),
|
||||
payload: {
|
||||
mode: 'initial',
|
||||
uploadDir: mediaDir
|
||||
},
|
||||
persist: true
|
||||
});
|
||||
return Promise.resolve(metadataPromise).then(async function () {
|
||||
let players = [];
|
||||
try {
|
||||
players = await fetchPlayerRegistrations(pool);
|
||||
} catch (error) {
|
||||
console.warn('Unable to fetch player registrations for initial media sync:', error);
|
||||
return null;
|
||||
}
|
||||
|
||||
const livePlayers = Array.isArray(players)
|
||||
? players.filter(function (player) {
|
||||
return isRecentPlayerRegistration(player, 60);
|
||||
})
|
||||
: [];
|
||||
|
||||
if (!livePlayers.length) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Promise.all(livePlayers.map(function (player) {
|
||||
const metadata = normalizePlayerMetadata(player);
|
||||
return backgroundTaskQueue.enqueueTask({
|
||||
key: TASK.key,
|
||||
title: 'Initial media sync',
|
||||
category: TASK.category,
|
||||
taskType: 'media-sync',
|
||||
metadata: metadata,
|
||||
payload: {
|
||||
mode: 'initial',
|
||||
uploadDir: mediaDir,
|
||||
playerIdentifier: metadata.playerIdentifier,
|
||||
playerPublicBaseUrl: metadata.playerPublicBaseUrl,
|
||||
playerInternalBaseUrl: metadata.playerInternalBaseUrl
|
||||
},
|
||||
persist: true
|
||||
});
|
||||
}));
|
||||
}).catch(function (error) {
|
||||
console.warn('Unable to queue initial media sync:', error);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user