{"version":3,"sources":["../src/ClarisId.ts"],"sourcesContent":["import type { CognitoUserSession } from \"amazon-cognito-identity-js\";\nimport { AuthenticationDetails, CognitoUser, CognitoUserPool } from \"amazon-cognito-identity-js\";\nimport type { Authentication } from \"./Connection.js\";\n\nclass ClarisId implements Authentication {\n    private readonly username: string;\n    private readonly password: string;\n    private authenticationDetails: AuthenticationDetails | undefined;\n    private userPool: CognitoUserPool | null = null;\n    private cognitoUser: CognitoUser | null = null;\n    private userSession: CognitoUserSession | null = null;\n    private idTokenPromise: Promise<string> | null = null;\n\n    public constructor(username: string, password: string) {\n        this.username = username;\n        this.password = password;\n    }\n\n    public async getAuthorizationHeader(): Promise<string> {\n        if (this.idTokenPromise) {\n            return `FMID ${await this.idTokenPromise}`;\n        }\n\n        this.idTokenPromise = this.getIdToken();\n        const idToken = await this.idTokenPromise;\n        this.idTokenPromise = null;\n\n        return `FMID ${idToken}`;\n    }\n\n    private getAuthenticationDetails(): AuthenticationDetails {\n        if (!this.authenticationDetails) {\n            this.authenticationDetails = new AuthenticationDetails({\n                Username: this.username,\n                Password: this.password,\n            });\n        }\n\n        return this.authenticationDetails;\n    }\n\n    private async getIdToken(): Promise<string> {\n        if (this.userSession) {\n            return this.getStoredIdToken(this.userSession);\n        }\n\n        const userSession = await this.retrieveNewSession();\n        return userSession.getIdToken().getJwtToken();\n    }\n\n    private async getStoredIdToken(userSession: CognitoUserSession): Promise<string> {\n        const currentUserSession: CognitoUserSession = !userSession.isValid()\n            ? await this.refreshSession(userSession)\n            : userSession;\n\n        return currentUserSession.getIdToken().getJwtToken();\n    }\n\n    private async refreshSession(userSession: CognitoUserSession): Promise<CognitoUserSession> {\n        const cognitoUser = await this.getCognitoUser();\n        this.userSession = await new Promise<CognitoUserSession>((resolve, reject) => {\n            cognitoUser.refreshSession(userSession.getRefreshToken(), async (error, session) => {\n                if (error) {\n                    // Refresh token might have been expired (unlikely, but could happen).\n                    try {\n                        resolve(await this.retrieveNewSession());\n                        return;\n                    } catch (e) {\n                        reject(e);\n                    }\n                }\n\n                resolve(session as CognitoUserSession);\n            });\n        });\n\n        return this.userSession;\n    }\n\n    private async retrieveNewSession(): Promise<CognitoUserSession> {\n        const cognitoUser = await this.getCognitoUser();\n        const authenticationDetails = this.getAuthenticationDetails();\n        this.userSession = await new Promise<CognitoUserSession>((resolve, reject) => {\n            cognitoUser.authenticateUser(authenticationDetails, {\n                onSuccess: (result) => {\n                    resolve(result);\n                },\n                onFailure: (error) => {\n                    reject(error);\n                },\n            });\n        });\n\n        return this.userSession;\n    }\n\n    private async getCognitoUser(): Promise<CognitoUser> {\n        if (this.cognitoUser) {\n            return this.cognitoUser;\n        }\n\n        this.cognitoUser = new CognitoUser({\n            Username: this.getAuthenticationDetails().getUsername(),\n            Pool: await this.getUserPool(),\n        });\n\n        return this.cognitoUser;\n    }\n\n    private async getUserPool(): Promise<CognitoUserPool> {\n        if (this.userPool) {\n            return this.userPool;\n        }\n\n        const response = await fetch(\n            \"https://www.ifmcloud.com/endpoint/userpool/2.2.0.my.claris.com.json\",\n        );\n\n        if (!response.ok) {\n            throw new Error(\"Could not fetch user pool config\");\n        }\n\n        const config = (await response.json()) as {\n            data: {\n                UserPool_ID: string;\n                Client_ID: string;\n            };\n        };\n\n        this.userPool = new CognitoUserPool({\n            UserPoolId: config.data.UserPool_ID,\n            ClientId: config.data.Client_ID,\n        });\n\n        return this.userPool;\n    }\n}\n\nexport default ClarisId;\n"],"mappings":"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","names":[]}