Files
SubMiner/src/main/runtime/anilist-setup-protocol.ts

88 lines
2.9 KiB
TypeScript

export type ConsumeAnilistSetupTokenDeps = {
consumeAnilistSetupCallbackUrl: (input: {
rawUrl: string;
saveToken: (token: string) => void;
setCachedToken: (token: string) => void;
setResolvedState: (resolvedAt: number) => void;
setSetupPageOpened: (opened: boolean) => void;
onSuccess: () => void;
closeWindow: () => void;
}) => boolean;
saveToken: (token: string) => void;
setCachedToken: (token: string) => void;
setResolvedState: (resolvedAt: number) => void;
setSetupPageOpened: (opened: boolean) => void;
onSuccess: () => void;
closeWindow: () => void;
};
export function createConsumeAnilistSetupTokenFromUrlHandler(deps: ConsumeAnilistSetupTokenDeps) {
return (rawUrl: string): boolean =>
deps.consumeAnilistSetupCallbackUrl({
rawUrl,
saveToken: deps.saveToken,
setCachedToken: deps.setCachedToken,
setResolvedState: deps.setResolvedState,
setSetupPageOpened: deps.setSetupPageOpened,
onSuccess: deps.onSuccess,
closeWindow: deps.closeWindow,
});
}
export function createNotifyAnilistSetupHandler(deps: {
hasMpvClient: () => boolean;
showMpvOsd: (message: string) => void;
showDesktopNotification: (title: string, options: { body: string }) => void;
logInfo: (message: string) => void;
}) {
return (message: string): void => {
if (deps.hasMpvClient()) {
deps.showMpvOsd(message);
return;
}
deps.showDesktopNotification('SubMiner AniList', { body: message });
deps.logInfo(`[AniList setup] ${message}`);
};
}
export function createHandleAnilistSetupProtocolUrlHandler(deps: {
consumeAnilistSetupTokenFromUrl: (rawUrl: string) => boolean;
logWarn: (message: string, details: unknown) => void;
}) {
return (rawUrl: string): boolean => {
if (!rawUrl.startsWith('subminer://anilist-setup')) {
return false;
}
if (deps.consumeAnilistSetupTokenFromUrl(rawUrl)) {
return true;
}
deps.logWarn('AniList setup protocol URL missing access token', { rawUrl });
return true;
};
}
export function createRegisterSubminerProtocolClientHandler(deps: {
isDefaultApp: () => boolean;
getArgv: () => string[];
execPath: string;
resolvePath: (value: string) => string;
setAsDefaultProtocolClient: (scheme: string, path?: string, args?: string[]) => boolean;
logDebug: (message: string, details?: unknown) => void;
}) {
return (): void => {
try {
const defaultAppEntry = deps.isDefaultApp() ? deps.getArgv()[1] : undefined;
const success = defaultAppEntry
? deps.setAsDefaultProtocolClient('subminer', deps.execPath, [
deps.resolvePath(defaultAppEntry),
])
: deps.setAsDefaultProtocolClient('subminer');
if (!success) {
deps.logDebug('Failed to register default protocol handler for subminer:// URLs');
}
} catch (error) {
deps.logDebug('Failed to register subminer:// protocol handler', error);
}
};
}