UNPKG

@picahq/authkit-node

Version:

Secure token generation for Pica AuthKit

111 lines (95 loc) 3.06 kB
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; } } };