Release 2.6.7

This commit is contained in:
2026-08-08 13:02:31 +01:00
parent b20beb250b
commit 7e46fffc34
41 changed files with 2489 additions and 1290 deletions
+150 -30
View File
@@ -44,7 +44,18 @@ test('move client rebinding redirects the live player to the target screen', asy
return [[]];
}
},
common: {},
common: {
fetchPlayerRegistrations: async () => ([
{
public_base_url: 'http://player-a.example',
internal_base_url: 'http://player-a.internal'
},
{
public_base_url: 'http://player-b.example',
internal_base_url: 'http://player-b.internal'
}
])
},
forwardPlayerCommand(slug, payload, connectionId) {
calls.push({ kind: 'forwardPlayerCommand', slug, payload, connectionId });
return { ok: true };
@@ -67,6 +78,19 @@ test('move client rebinding redirects the live player to the target screen', asy
};
}
if (slug === 'target-screen') {
return {
connections: [
{
id: 'target-conn-1',
clientId: 'target-conn-1',
deviceId: 'target-device-1',
playerPublicBaseUrl: 'https://remote-target.example'
}
]
};
}
return { connections: [] };
},
isClientNameAvailable: async () => true,
@@ -115,34 +139,78 @@ test('move client rebinding redirects the live player to the target screen', asy
assert.equal(response.body.targetScreenSlug, 'target-screen');
assert.equal(response.body.playerUrl, 'http://remote-player.example/screen/target-screen');
assert.equal(calls.some((entry) => entry.kind === 'broadcastDashboardState'), true);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommandToBaseUrl' && entry.baseUrl === 'http://remote-player.example' && entry.payload && entry.payload.command === 'redirect'), true);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommand' && entry.slug === 'source-screen' && entry.payload && entry.payload.command === 'redirect'), false);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommandToBaseUrl' && entry.baseUrl === 'http://remote-player.example'), true);
});
test('screen control commands can target all screens', async () => {
const calls = [];
const { app, handlers } = createHandlers();
registerScreenCommandRoutes(app, {
registerScreenCommandRoutes(app, {
pool: {
async query(sql) {
calls.push({ kind: 'query', sql });
if (String(sql || '').includes('SELECT id, name, slug FROM d_screens WHERE slug IS NOT NULL ORDER BY slug ASC')) {
if (String(sql || '').includes('FROM d_screens') && String(sql || '').includes('ORDER BY slug ASC')) {
return [[
{ id: 1, name: 'Alpha', slug: 'alpha' },
{ id: 2, name: 'Beta', slug: 'beta' }
{ slug: 'alpha' },
{ slug: 'beta' }
]];
}
return [[]];
}
},
common: {},
common: {
fetchPlayerRegistrations: async () => ([
{
public_base_url: 'http://player-a.example',
internal_base_url: 'http://player-a.internal'
},
{
public_base_url: 'http://player-b.example',
internal_base_url: 'http://player-b.internal'
}
])
},
forwardPlayerCommand(slug, payload) {
calls.push({ kind: 'forwardPlayerCommand', slug, payload });
return { ok: true };
},
getScreenConnections: async () => ({ connections: [] }),
forwardPlayerCommandToBaseUrl(baseUrl, slug, payload, connectionId) {
calls.push({ kind: 'forwardPlayerCommandToBaseUrl', baseUrl, slug, payload, connectionId });
return { ok: true };
},
getScreenConnections: async (slug) => {
if (slug === 'alpha') {
return {
connections: [
{
id: 'alpha-1',
clientId: 'alpha-1',
deviceId: 'alpha-device',
playerPublicBaseUrl: 'http://player-a.example'
}
]
};
}
if (slug === 'beta') {
return {
connections: [
{
id: 'beta-1',
clientId: 'beta-1',
deviceId: 'beta-device',
playerPublicBaseUrl: 'http://player-b.example'
}
]
};
}
return { connections: [] };
},
isClientNameAvailable: async () => true,
withClientNameReservation: async (_pool, _name, callback) => callback(),
broadcastDashboardState: async () => {
@@ -184,11 +252,13 @@ test('screen control commands can target all screens', async () => {
assert.equal(response.body.ok, true);
assert.equal(response.body.allScreens, true);
assert.equal(response.body.targetScreenCount, 2);
assert.deepEqual(calls.filter((entry) => entry.kind === 'forwardPlayerCommand').map((entry) => entry.slug), ['alpha', 'beta']);
assert.equal(response.body.targetPlayerCount, 2);
assert.deepEqual(calls.filter((entry) => entry.kind === 'forwardPlayerCommandToBaseUrl').map((entry) => entry.baseUrl), ['http://player-a.internal', 'http://player-b.internal']);
assert.equal(calls.some((entry) => entry.kind === 'broadcastDashboardState'), true);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommand'), false);
});
test('screen control commands use the live connection player url when available', async () => {
test('screen control commands use the bridge for live connections', async () => {
const calls = [];
const { app, handlers } = createHandlers();
@@ -197,6 +267,17 @@ test('screen control commands use the live connection player url when available'
async query(sql, params) {
calls.push({ kind: 'query', sql, params });
if (String(sql || '').includes('SELECT s.slug, s.player_id, p.public_base_url, p.internal_base_url')) {
return [[
{
slug: 'source-screen',
player_id: 'player-a',
public_base_url: 'http://player-a.example',
internal_base_url: 'http://player-a.internal'
}
]];
}
if (sql.includes('SELECT id, name, slug FROM d_screens WHERE slug = ?') && params && params[0] === 'source-screen') {
return [[{ id: 12, name: 'Source Screen', slug: 'source-screen' }]];
}
@@ -204,15 +285,22 @@ test('screen control commands use the live connection player url when available'
return [[]];
}
},
common: {},
common: {
fetchPlayerRegistrations: async () => ([
{
public_base_url: 'http://player-a.example',
internal_base_url: 'http://player-a.internal'
},
{
public_base_url: 'http://player-b.example',
internal_base_url: 'http://player-b.internal'
}
])
},
forwardPlayerCommand(slug, payload, connectionId) {
calls.push({ kind: 'forwardPlayerCommand', slug, payload, connectionId });
return { ok: true };
},
forwardPlayerCommandToBaseUrl(baseUrl, slug, payload, connectionId) {
calls.push({ kind: 'forwardPlayerCommandToBaseUrl', baseUrl, slug, payload, connectionId });
return { ok: true };
},
getScreenConnections: async (slug) => {
if (slug === 'source-screen') {
return {
@@ -268,11 +356,11 @@ test('screen control commands use the live connection player url when available'
assert.equal(response.statusCode, 200);
assert.equal(response.body.ok, true);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommandToBaseUrl' && entry.baseUrl === 'http://local-player.example'), true);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommand'), false);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommand' && entry.slug === 'source-screen'), true);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommandToBaseUrl' && entry.baseUrl === 'http://local-player.example'), false);
});
test('screen control commands fan out to every live player for the selected screen', async () => {
test('screen control commands fan out through the bridge for the selected screen', async () => {
const calls = [];
const { app, handlers } = createHandlers();
@@ -281,6 +369,15 @@ test('screen control commands fan out to every live player for the selected scre
async query(sql, params) {
calls.push({ kind: 'query', sql, params });
if (String(sql || '').includes('SELECT s.slug, s.player_id, p.public_base_url, p.internal_base_url')) {
return [[{
slug: 'source-screen',
player_id: 'player-a',
public_base_url: 'http://player-a.example',
internal_base_url: 'http://player-a.internal'
}]];
}
if (sql.includes('SELECT id, name, slug FROM d_screens WHERE slug = ?') && params && params[0] === 'source-screen') {
return [[{ id: 12, name: 'Source Screen', slug: 'source-screen' }]];
}
@@ -288,7 +385,18 @@ test('screen control commands fan out to every live player for the selected scre
return [[]];
}
},
common: {},
common: {
fetchPlayerRegistrations: async () => ([
{
public_base_url: 'http://player-a.example',
internal_base_url: 'http://player-a.internal'
},
{
public_base_url: 'http://player-b.example',
internal_base_url: 'http://player-b.internal'
}
])
},
forwardPlayerCommand(slug, payload, connectionId) {
calls.push({ kind: 'forwardPlayerCommand', slug, payload, connectionId });
return { ok: true };
@@ -305,7 +413,7 @@ test('screen control commands fan out to every live player for the selected scre
id: 'conn-1',
clientId: 'conn-1',
deviceId: 'device-123',
playerPublicBaseUrl: 'http://local-player-a.example'
playerPublicBaseUrl: 'http://local-player.example'
},
{
id: 'conn-2',
@@ -357,14 +465,14 @@ test('screen control commands fan out to every live player for the selected scre
assert.equal(response.statusCode, 200);
assert.equal(response.body.ok, true);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommand' && entry.slug === 'source-screen'), false);
assert.deepEqual(
calls.filter((entry) => entry.kind === 'forwardPlayerCommandToBaseUrl').map((entry) => entry.baseUrl),
['http://local-player-a.example', 'http://local-player-b.example']
['http://local-player.example', 'http://local-player-b.example']
);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommand'), false);
});
test('all screens commands fan out across the live player for each screen', async () => {
test('all screens commands fan out through the bridge for each screen', async () => {
const calls = [];
const { app, handlers } = createHandlers();
@@ -373,23 +481,34 @@ test('all screens commands fan out across the live player for each screen', asyn
async query(sql) {
calls.push({ kind: 'query', sql });
if (String(sql || '').includes('SELECT id, name, slug FROM d_screens WHERE slug IS NOT NULL ORDER BY slug ASC')) {
if (String(sql || '').includes('FROM d_screens') && String(sql || '').includes('ORDER BY slug ASC')) {
return [[
{ id: 1, name: 'Alpha', slug: 'alpha' },
{ id: 2, name: 'Beta', slug: 'beta' }
{ slug: 'alpha' },
{ slug: 'beta' }
]];
}
return [[]];
}
},
common: {},
common: {
fetchPlayerRegistrations: async () => ([
{
public_base_url: 'http://player-a.example',
internal_base_url: 'http://player-a.internal'
},
{
public_base_url: 'http://player-b.example',
internal_base_url: 'http://player-b.internal'
}
])
},
forwardPlayerCommand(slug, payload) {
calls.push({ kind: 'forwardPlayerCommand', slug, payload });
return { ok: true };
},
forwardPlayerCommandToBaseUrl(baseUrl, slug, payload) {
calls.push({ kind: 'forwardPlayerCommandToBaseUrl', baseUrl, slug, payload });
forwardPlayerCommandToBaseUrl(baseUrl, slug, payload, connectionId) {
calls.push({ kind: 'forwardPlayerCommandToBaseUrl', baseUrl, slug, payload, connectionId });
return { ok: true };
},
getScreenConnections: async (slug) => {
@@ -461,10 +580,11 @@ test('all screens commands fan out across the live player for each screen', asyn
assert.equal(response.body.ok, true);
assert.equal(response.body.allScreens, true);
assert.equal(response.body.targetScreenCount, 2);
assert.equal(response.body.targetPlayerCount, 2);
assert.equal(calls.some((entry) => entry.kind === 'broadcastDashboardState'), true);
assert.deepEqual(
calls.filter((entry) => entry.kind === 'forwardPlayerCommandToBaseUrl').map((entry) => entry.baseUrl),
['http://player-a.example', 'http://player-b.example']
['http://player-a.internal', 'http://player-b.internal']
);
assert.equal(calls.some((entry) => entry.kind === 'forwardPlayerCommand'), false);
});