feat(core): add Electron runtime, services, and app composition

This commit is contained in:
2026-02-22 21:43:43 -08:00
parent 448ce03fd4
commit d3fd47f0ec
562 changed files with 69719 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import {
createBuildEnsureMpvConnectedForJellyfinPlaybackMainDepsHandler,
createBuildLaunchMpvIdleForJellyfinPlaybackMainDepsHandler,
createBuildWaitForMpvConnectedMainDepsHandler,
} from './jellyfin-remote-connection-main-deps';
test('wait for mpv connected main deps builder maps callbacks', async () => {
const calls: string[] = [];
const client = { connected: false, connect: () => calls.push('connect') };
const deps = createBuildWaitForMpvConnectedMainDepsHandler({
getMpvClient: () => client,
now: () => 123,
sleep: async () => {
calls.push('sleep');
},
})();
assert.equal(deps.getMpvClient(), client);
assert.equal(deps.now(), 123);
await deps.sleep(10);
assert.deepEqual(calls, ['sleep']);
});
test('launch mpv for jellyfin main deps builder maps callbacks', () => {
const calls: string[] = [];
const proc = {
on: () => {},
unref: () => {
calls.push('unref');
},
};
const deps = createBuildLaunchMpvIdleForJellyfinPlaybackMainDepsHandler({
getSocketPath: () => '/tmp/mpv.sock',
platform: 'darwin',
execPath: '/tmp/subminer',
defaultMpvLogPath: '/tmp/mpv.log',
defaultMpvArgs: ['--no-config'],
removeSocketPath: (socketPath) => calls.push(`rm:${socketPath}`),
spawnMpv: (args) => {
calls.push(`spawn:${args.join(' ')}`);
return proc;
},
logWarn: (message) => calls.push(`warn:${message}`),
logInfo: (message) => calls.push(`info:${message}`),
})();
assert.equal(deps.getSocketPath(), '/tmp/mpv.sock');
assert.equal(deps.platform, 'darwin');
assert.equal(deps.execPath, '/tmp/subminer');
assert.equal(deps.defaultMpvLogPath, '/tmp/mpv.log');
assert.deepEqual(deps.defaultMpvArgs, ['--no-config']);
deps.removeSocketPath('/tmp/mpv.sock');
deps.spawnMpv(['--idle=yes']);
deps.logInfo('launched');
deps.logWarn('bad', null);
assert.deepEqual(calls, ['rm:/tmp/mpv.sock', 'spawn:--idle=yes', 'info:launched', 'warn:bad']);
});
test('ensure mpv connected for jellyfin main deps builder maps callbacks', async () => {
const calls: string[] = [];
const client = { connected: true, connect: () => {} };
const waitPromise = Promise.resolve(true);
const inFlight = Promise.resolve(false);
const deps = createBuildEnsureMpvConnectedForJellyfinPlaybackMainDepsHandler({
getMpvClient: () => client,
setMpvClient: () => calls.push('set-client'),
createMpvClient: () => client,
waitForMpvConnected: () => waitPromise,
launchMpvIdleForJellyfinPlayback: () => calls.push('launch'),
getAutoLaunchInFlight: () => inFlight,
setAutoLaunchInFlight: () => calls.push('set-in-flight'),
connectTimeoutMs: 7000,
autoLaunchTimeoutMs: 15000,
})();
assert.equal(deps.getMpvClient(), client);
deps.setMpvClient(client);
assert.equal(deps.createMpvClient(), client);
assert.equal(await deps.waitForMpvConnected(1), true);
deps.launchMpvIdleForJellyfinPlayback();
assert.equal(deps.getAutoLaunchInFlight(), inFlight);
deps.setAutoLaunchInFlight(null);
assert.equal(deps.connectTimeoutMs, 7000);
assert.equal(deps.autoLaunchTimeoutMs, 15000);
assert.deepEqual(calls, ['set-client', 'launch', 'set-in-flight']);
});