refactor: extract anki jimaku ipc deps runtime service

This commit is contained in:
2026-02-10 01:05:05 -08:00
parent e95728b4d1
commit adcae2ee01
5 changed files with 119 additions and 12 deletions

View File

@@ -0,0 +1,48 @@
import test from "node:test";
import assert from "node:assert/strict";
import {
AnkiJimakuIpcDepsRuntimeOptions,
createAnkiJimakuIpcDepsRuntimeService,
} from "./anki-jimaku-ipc-deps-runtime-service";
test("createAnkiJimakuIpcDepsRuntimeService returns passthrough runtime options", async () => {
const calls: string[] = [];
const options = {
patchAnkiConnectEnabled: () => calls.push("patch"),
getResolvedConfig: () => ({ ankiConnect: undefined }),
getRuntimeOptionsManager: () => null,
getSubtitleTimingTracker: () => null,
getMpvClient: () => null,
getAnkiIntegration: () => null,
setAnkiIntegration: () => calls.push("set-integration"),
showDesktopNotification: () => calls.push("notify"),
createFieldGroupingCallback: () => async () => ({
keepNoteId: 0,
deleteNoteId: 0,
deleteDuplicate: false,
cancelled: true,
}),
broadcastRuntimeOptionsChanged: () => calls.push("broadcast"),
getFieldGroupingResolver: () => null,
setFieldGroupingResolver: () => calls.push("set-resolver"),
parseMediaInfo: () => ({ mediaPath: null, baseName: null, episode: null }),
getCurrentMediaPath: () => "/tmp/a.mp4",
jimakuFetchJson: async () => ({ ok: true, data: [] }),
getJimakuMaxEntryResults: () => 100,
getJimakuLanguagePreference: () => "prefer-japanese",
resolveJimakuApiKey: async () => "abc",
isRemoteMediaPath: () => false,
downloadToFile: async () => ({ ok: true, path: "/tmp/a.srt" }),
} as unknown as AnkiJimakuIpcDepsRuntimeOptions;
const runtime = createAnkiJimakuIpcDepsRuntimeService(options);
runtime.patchAnkiConnectEnabled(true);
runtime.broadcastRuntimeOptionsChanged();
runtime.setFieldGroupingResolver(null);
assert.deepEqual(calls, ["patch", "broadcast", "set-resolver"]);
assert.equal(runtime.getCurrentMediaPath(), "/tmp/a.mp4");
assert.equal(runtime.getJimakuMaxEntryResults(), 100);
assert.equal(await runtime.resolveJimakuApiKey(), "abc");
});

View File

@@ -0,0 +1,32 @@
import {
AnkiJimakuIpcRuntimeOptions,
} from "./anki-jimaku-runtime-service";
export type AnkiJimakuIpcDepsRuntimeOptions = AnkiJimakuIpcRuntimeOptions;
export function createAnkiJimakuIpcDepsRuntimeService(
options: AnkiJimakuIpcDepsRuntimeOptions,
): AnkiJimakuIpcRuntimeOptions {
return {
patchAnkiConnectEnabled: options.patchAnkiConnectEnabled,
getResolvedConfig: options.getResolvedConfig,
getRuntimeOptionsManager: options.getRuntimeOptionsManager,
getSubtitleTimingTracker: options.getSubtitleTimingTracker,
getMpvClient: options.getMpvClient,
getAnkiIntegration: options.getAnkiIntegration,
setAnkiIntegration: options.setAnkiIntegration,
showDesktopNotification: options.showDesktopNotification,
createFieldGroupingCallback: options.createFieldGroupingCallback,
broadcastRuntimeOptionsChanged: options.broadcastRuntimeOptionsChanged,
getFieldGroupingResolver: options.getFieldGroupingResolver,
setFieldGroupingResolver: options.setFieldGroupingResolver,
parseMediaInfo: options.parseMediaInfo,
getCurrentMediaPath: options.getCurrentMediaPath,
jimakuFetchJson: options.jimakuFetchJson,
getJimakuMaxEntryResults: options.getJimakuMaxEntryResults,
getJimakuLanguagePreference: options.getJimakuLanguagePreference,
resolveJimakuApiKey: options.resolveJimakuApiKey,
isRemoteMediaPath: options.isRemoteMediaPath,
downloadToFile: options.downloadToFile,
};
}

View File

@@ -25,7 +25,7 @@ interface SubtitleTimingTrackerLike {
cleanup: () => void;
}
export function registerAnkiJimakuIpcRuntimeService(options: {
export interface AnkiJimakuIpcRuntimeOptions {
patchAnkiConnectEnabled: (enabled: boolean) => void;
getResolvedConfig: () => { ankiConnect?: AnkiConnectConfig };
getRuntimeOptionsManager: () => RuntimeOptionsManagerLike | null;
@@ -55,7 +55,11 @@ export function registerAnkiJimakuIpcRuntimeService(options: {
destPath: string,
headers: Record<string, string>,
) => Promise<{ ok: true; path: string } | { ok: false; error: { error: string; code?: number; retryAfter?: number } }>;
}): void {
}
export function registerAnkiJimakuIpcRuntimeService(
options: AnkiJimakuIpcRuntimeOptions,
): void {
registerAnkiJimakuIpcHandlers({
setAnkiConnectEnabled: (enabled) => {
options.patchAnkiConnectEnabled(enabled);