refactor(main): extract password-store args, mpv plugin detection, yomitan anki sync, session bindings, log export from main.ts

This commit is contained in:
2026-06-11 22:52:34 -07:00
parent 2d1b6cb78e
commit 1a3944aa4f
6 changed files with 407 additions and 265 deletions
@@ -0,0 +1,75 @@
import { sendMpvCommandRuntime, type MpvRuntimeClientLike } from '../../core/services';
import {
buildPluginSessionBindingsArtifact,
compileSessionBindings,
} from '../../core/services/session-bindings';
import type { ConfiguredShortcuts } from '../../core/utils/shortcut-config';
import type { CompiledSessionBinding, Keybinding, ResolvedConfig } from '../../types';
import { writeSessionBindingsArtifact } from './session-bindings-artifact';
export interface SessionBindingsRuntimeDeps {
configDir: string;
getKeybindings: () => Keybinding[];
getConfiguredShortcuts: () => ConfiguredShortcuts;
getResolvedConfig: () => ResolvedConfig;
getMpvClient: () => MpvRuntimeClientLike | null;
setSessionBindings: (bindings: CompiledSessionBinding[]) => void;
setSessionBindingsInitialized: (initialized: boolean) => void;
logWarn: (message: string) => void;
}
export function createSessionBindingsRuntime(deps: SessionBindingsRuntimeDeps): {
persistSessionBindings: (
bindings: CompiledSessionBinding[],
warnings?: ReturnType<typeof compileSessionBindings>['warnings'],
) => void;
refreshCurrentSessionBindings: () => void;
} {
function resolveSessionBindingPlatform(): 'darwin' | 'win32' | 'linux' {
if (process.platform === 'darwin') return 'darwin';
if (process.platform === 'win32') return 'win32';
return 'linux';
}
function compileCurrentSessionBindings(): {
bindings: CompiledSessionBinding[];
warnings: ReturnType<typeof compileSessionBindings>['warnings'];
} {
return compileSessionBindings({
keybindings: deps.getKeybindings(),
shortcuts: deps.getConfiguredShortcuts(),
statsToggleKey: deps.getResolvedConfig().stats.toggleKey,
statsMarkWatchedKey: deps.getResolvedConfig().stats.markWatchedKey,
platform: resolveSessionBindingPlatform(),
rawConfig: deps.getResolvedConfig(),
});
}
function persistSessionBindings(
bindings: CompiledSessionBinding[],
warnings: ReturnType<typeof compileSessionBindings>['warnings'] = [],
): void {
const artifact = buildPluginSessionBindingsArtifact({
bindings,
warnings,
numericSelectionTimeoutMs: deps.getConfiguredShortcuts().multiCopyTimeoutMs,
});
writeSessionBindingsArtifact(deps.configDir, artifact);
deps.setSessionBindings(bindings);
deps.setSessionBindingsInitialized(true);
const mpvClient = deps.getMpvClient();
if (mpvClient?.connected) {
sendMpvCommandRuntime(mpvClient, ['script-message', 'subminer-reload-session-bindings']);
}
}
function refreshCurrentSessionBindings(): void {
const compiled = compileCurrentSessionBindings();
for (const warning of compiled.warnings) {
deps.logWarn(`[session-bindings] ${warning.message}`);
}
persistSessionBindings(compiled.bindings, compiled.warnings);
}
return { persistSessionBindings, refreshCurrentSessionBindings };
}