Files
AgentCompany/src/main/services/provider-oauth-service.ts
T
ZacharyZhang-NY 07d0b4587d Promote AgentCompany-New to the repository root and retire the old app
The legacy application - its src, tests, landing site, promo assets, docs,
release tooling, CI workflows, and root configs - leaves the tree; it stays
reachable in history. Everything under AgentCompany-New moves up unchanged:
same package name, so the production userData/database path is untouched,
and e2e/build scripts already resolved paths relative to the project. The
developer cred.txt stays gitignored at its new location. Full verify:ci
passes from the new root.
2026-07-07 00:04:13 -04:00

41 lines
1.4 KiB
TypeScript

import { getOAuthFlow } from "./oauth/oauth-flows";
export interface ProviderOAuthHooks {
onAuth: (info: { url: string; instructions?: string }) => void;
onProgress?: (message: string) => void;
}
/**
* Drives a provider's native OAuth login and returns the obtained credentials
* as a JSON string, ready to be stored through the existing secret vault. The
* service is decoupled from Electron: opening the browser and emitting UI
* events are supplied by the caller via {@link ProviderOAuthHooks}.
*/
export class ProviderOAuthService {
private readonly controllers = new Map<string, AbortController>();
async run(input: { providerKey: string; enterpriseDomain?: string | null }, hooks: ProviderOAuthHooks): Promise<string> {
const flow = getOAuthFlow(input.providerKey);
if (this.controllers.has(input.providerKey)) {
throw new Error("A sign-in for this provider is already in progress.");
}
const controller = new AbortController();
this.controllers.set(input.providerKey, controller);
try {
const credentials = await flow.login({
onAuth: hooks.onAuth,
onProgress: hooks.onProgress,
signal: controller.signal,
enterpriseDomain: input.enterpriseDomain ?? null,
});
return JSON.stringify(credentials);
} finally {
this.controllers.delete(input.providerKey);
}
}
cancel(providerKey: string): void {
this.controllers.get(providerKey)?.abort();
}
}