@picahq/authkit-node
Version:
Secure token generation for Pica AuthKit
111 lines (95 loc) • 3.06 kB
text/typescript
import axios from 'axios';
import {
CreateEventLinkPayload,
LinkSettings,
EventLink,
ConnectionDefinitions,
EmbedTokenRecord,
} from '../types';
export const generateId = async (prefix: string) => {
const apiBaseUrl = process.env.PICA_API_BASE_URL || "https://api.picaos.com/v1";
try {
const response = await axios.get<{
id: string
}>(
`${apiBaseUrl}/public/generate-id/${prefix}`
);
const id = response?.data?.id;
return id;
} catch (error) {
throw new Error('Failed to generate id from api');
}
}
export const createEventLinkTokenApi = async (
headers: Record<string, string>,
url: string,
secret: string,
payload?: CreateEventLinkPayload,
) => {
try {
const settings = await axios.post<LinkSettings>(
`${url}/v1/settings/get`,
payload,
{ headers }
);
const link = await axios.post<EventLink>(
`${url}/v1/event-links/create`,
{
...payload,
environment: secret.startsWith('sk_test') ? 'test' : 'live',
usageSource: 'sdk',
},
{ headers }
);
const apiBaseUrl = process.env.PICA_API_BASE_URL || "https://api.picaos.com/v1";
const connectionDefinitionUrl = `${apiBaseUrl}/public/connection-definitions`;
const connectionDefinitions = await axios.get<ConnectionDefinitions>(
`${connectionDefinitionUrl}?limit=1000&skip=0`
);
const isLiveSecret = secret.includes('sk_live');
const activeConnectionDefinitionsData =
connectionDefinitions?.data?.rows?.filter(
(definition) => definition?.active
);
const connectedPlatforms = settings?.data?.connectedPlatforms?.filter(
(platform) => {
return (
activeConnectionDefinitionsData?.find(
(definition) => definition?._id === platform?.connectionDefinitionId
) && platform?.active
);
}
);
const connectedPlatformsFiltered = connectedPlatforms?.filter(
(platform) =>
isLiveSecret
? platform?.environment === 'live'
: platform?.environment === 'test' || !platform?.environment
);
const sessionId = await generateId('session_id');
const tokenPayload = {
linkSettings: {
connectedPlatforms: connectedPlatformsFiltered ?? [],
eventIncToken: link?.data?.token,
},
identity: link?.data?.identity,
identityType: link?.data?.identityType,
group: link?.data?.group,
label: link?.data?.label,
environment: secret.startsWith('sk_test') ? 'test' : 'live',
expiresAt: new Date().getTime() + 5 * 1000 * 60,
sessionId,
features: settings?.data?.features,
};
const token = await axios.post<EmbedTokenRecord>(
`${url}/v1/embed-tokens/create`,
tokenPayload,
{ headers }
);
return token.data;
} catch (error) {
if (axios.isAxiosError(error)) {
return error.response?.data;
}
}
};