import open from 'open' import { getConeUrl } from 'src/cone' import log from 'src/log' import { LogPrefixConeAuth, EVENT_CONE_AUTH_SUCCESS, EVENT_CONE_AUTH_FAIL, ee, } from 'src/util' import { coneAccessTokenExistsSync, removeConeAccessTokenSync, } from './accessToken' import { isConeAccessTokenValid } from './accessTokenValid' import { createAuthServer } from './server' export function coneLogout() { removeConeAccessTokenSync() } export async function coneLogin() { if (coneAccessTokenExistsSync()) { const valid = await isConeAccessTokenValid() if (valid) { log.verbose(LogPrefixConeAuth, 'token is valid, 跳过登录') return } log.info(LogPrefixConeAuth, '登录已失效') removeConeAccessTokenSync() } log.info(LogPrefixConeAuth, '登录中...') const { url, server, destroyServer } = await createAuthServer() let timer: ReturnType function closeServer() { timer && clearTimeout(timer) server.close() } await new Promise((resolve, reject) => { ee.on(EVENT_CONE_AUTH_SUCCESS, () => { log.info(LogPrefixConeAuth, '登录成功') closeServer() resolve(null) }) ee.on(EVENT_CONE_AUTH_FAIL, () => { log.error(LogPrefixConeAuth, '登录失败') closeServer() reject(new Error('登录失败')) }) timer = setTimeout(() => { log.error(LogPrefixConeAuth, '登录超时') closeServer() reject(new Error('登录超时')) }, 1000 * 60 * 5) log.info(LogPrefixConeAuth, '请在打开的浏览器网页里面登录 cone') const authUrl = new URL(getConeUrl({ urlPath: '/auth/login' })) authUrl.searchParams.append( 'saveConeAccessTokenCallback', `${url}/saveConeAccessToken`, ) log.verbose(LogPrefixConeAuth, authUrl.href) open(authUrl.href).catch(() => { log.error(LogPrefixConeAuth, '打开浏览器失败') closeServer() reject(new Error('打开浏览器失败')) }) }) } export * from './accessToken'