82 lines
2.0 KiB
TypeScript
82 lines
2.0 KiB
TypeScript
/**
|
|
* Singleton manager for cloud-provider authentication status (AWS Bedrock,
|
|
* GCP Vertex). Communicates auth refresh state between auth utilities and
|
|
* React components / SDK output. The SDK 'auth_status' message shape is
|
|
* provider-agnostic, so a single manager serves all providers.
|
|
*
|
|
* Legacy name: originally AWS-only; now used by all cloud auth refresh flows.
|
|
*/
|
|
|
|
import { createSignal } from './signal.js'
|
|
|
|
export type AwsAuthStatus = {
|
|
isAuthenticating: boolean
|
|
output: string[]
|
|
error?: string
|
|
}
|
|
|
|
export class AwsAuthStatusManager {
|
|
private static instance: AwsAuthStatusManager | null = null
|
|
private status: AwsAuthStatus = {
|
|
isAuthenticating: false,
|
|
output: [],
|
|
}
|
|
private changed = createSignal<[status: AwsAuthStatus]>()
|
|
|
|
static getInstance(): AwsAuthStatusManager {
|
|
if (!AwsAuthStatusManager.instance) {
|
|
AwsAuthStatusManager.instance = new AwsAuthStatusManager()
|
|
}
|
|
return AwsAuthStatusManager.instance
|
|
}
|
|
|
|
getStatus(): AwsAuthStatus {
|
|
return {
|
|
...this.status,
|
|
output: [...this.status.output],
|
|
}
|
|
}
|
|
|
|
startAuthentication(): void {
|
|
this.status = {
|
|
isAuthenticating: true,
|
|
output: [],
|
|
}
|
|
this.changed.emit(this.getStatus())
|
|
}
|
|
|
|
addOutput(line: string): void {
|
|
this.status.output.push(line)
|
|
this.changed.emit(this.getStatus())
|
|
}
|
|
|
|
setError(error: string): void {
|
|
this.status.error = error
|
|
this.changed.emit(this.getStatus())
|
|
}
|
|
|
|
endAuthentication(success: boolean): void {
|
|
if (success) {
|
|
// Clear the status completely on success
|
|
this.status = {
|
|
isAuthenticating: false,
|
|
output: [],
|
|
}
|
|
} else {
|
|
// Keep the output visible on failure
|
|
this.status.isAuthenticating = false
|
|
}
|
|
this.changed.emit(this.getStatus())
|
|
}
|
|
|
|
subscribe = this.changed.subscribe
|
|
|
|
// Clean up for testing
|
|
static reset(): void {
|
|
if (AwsAuthStatusManager.instance) {
|
|
AwsAuthStatusManager.instance.changed.clear()
|
|
AwsAuthStatusManager.instance = null
|
|
}
|
|
}
|
|
}
|