export const NIANCODE_APP_PROTOCOL = 'niancode'; export type NianCodeDeepLink = { type: 'desktop-auth-callback'; requestId: string; url: string; }; const SENSITIVE_QUERY_KEYS = new Set([ 'access_token', 'refresh_token', 'device_secret', 'token', ]); export function parseNianCodeDeepLinkUrl(rawUrl: string): NianCodeDeepLink | null { let url: URL; try { url = new URL(rawUrl); } catch { return null; } if (url.protocol !== `${NIANCODE_APP_PROTOCOL}:`) { return null; } if (url.hostname !== 'auth' || url.pathname !== '/callback') { return null; } for (const key of SENSITIVE_QUERY_KEYS) { if (url.searchParams.has(key)) { return null; } } const requestId = url.searchParams.get('request_id')?.trim(); if (!requestId || requestId.length > 128) { return null; } return { type: 'desktop-auth-callback', requestId, url: rawUrl, }; } export function findNianCodeDeepLinkUrl(args: readonly string[]): string | null { return args.find((arg) => parseNianCodeDeepLinkUrl(arg) !== null) ?? null; }