authentication-session.ts•2.87 kB
import dayjs from 'dayjs';
import { jwtDecode } from 'jwt-decode';
import { AuthenticationResponse, isNil, Principal } from '@activepieces/shared';
import { ApStorage } from './ap-browser-storage';
import { authenticationApi } from './authentication-api';
const tokenKey = 'token';
export const authenticationSession = {
saveResponse(response: AuthenticationResponse, isEmbedding: boolean) {
if (isEmbedding) {
ApStorage.setInstanceToSessionStorage();
}
ApStorage.getInstance().setItem(tokenKey, response.token);
window.dispatchEvent(new Event('storage'));
},
isJwtExpired(token: string): boolean {
if (!token) {
return true;
}
try {
const decoded = jwtDecode(token);
if (decoded && decoded.exp && dayjs().isAfter(dayjs.unix(decoded.exp))) {
return true;
}
return false;
} catch (e) {
return true;
}
},
getToken(): string | null {
return ApStorage.getInstance().getItem(tokenKey) ?? null;
},
getProjectId(): string | null {
const token = this.getToken();
if (isNil(token)) {
return null;
}
const decodedJwt = getDecodedJwt(token);
return decodedJwt.projectId;
},
getCurrentUserId(): string | null {
const token = this.getToken();
if (isNil(token)) {
return null;
}
const decodedJwt = getDecodedJwt(token);
return decodedJwt.id;
},
appendProjectRoutePrefix(path: string): string {
const projectId = this.getProjectId();
if (isNil(projectId)) {
return path;
}
return `/projects/${projectId}${path.startsWith('/') ? path : `/${path}`}`;
},
getPlatformId(): string | null {
const token = this.getToken();
if (isNil(token)) {
return null;
}
const decodedJwt = getDecodedJwt(token);
return decodedJwt.platform.id;
},
async switchToPlatform(platformId: string) {
if (authenticationSession.getPlatformId() === platformId) {
return;
}
const result = await authenticationApi.switchPlatform({
platformId,
});
ApStorage.getInstance().setItem(tokenKey, result.token);
window.location.href = '/';
},
async switchToProject(projectId: string) {
if (authenticationSession.getProjectId() === projectId) {
return;
}
const result = await authenticationApi.switchProject({ projectId });
ApStorage.getInstance().setItem(tokenKey, result.token);
window.dispatchEvent(new Event('storage'));
},
isLoggedIn(): boolean {
const token = this.getToken();
if (isNil(token)) {
return false;
}
return !this.isJwtExpired(token);
},
clearSession() {
ApStorage.getInstance().removeItem(tokenKey);
},
logOut() {
this.clearSession();
window.location.href = '/sign-in';
},
};
function getDecodedJwt(token: string): Principal {
return jwtDecode<Principal>(token);
}