UNPKG

@cipherstash/jseql

Version:

Encrypted Query Language JavaScript Library

115 lines (95 loc) 2.72 kB
import { logger } from '../../../utils/logger' export type CtsRegions = 'ap-southeast-2' export type IdentifyOptions = { fetchFromCts?: boolean } export type CtsToken = { accessToken: string expiry: number } export type Context = { identityClaim: string[] } export type LockContextOptions = { context?: Context ctsToken?: CtsToken } export type GetLockContextResponse = | { success: boolean error: string ctsToken?: never context?: never } | { success: boolean error?: never ctsToken: CtsToken context: Context } export class LockContext { private ctsToken: CtsToken | undefined private workspaceId: string private context: Context constructor({ context = { identityClaim: ['sub'] }, ctsToken, }: LockContextOptions = {}) { if (!process.env.CS_WORKSPACE_ID) { const errorMessage = 'CS_WORKSPACE_ID environment variable is not set, and is required to initialize a LockContext.' logger.error(errorMessage) throw new Error(`[jseql]: ${errorMessage}`) } if (ctsToken) { this.ctsToken = ctsToken } this.workspaceId = process.env.CS_WORKSPACE_ID this.context = context logger.debug('Successfully initialized the EQL lock context.') } async identify(jwtToken: string): Promise<LockContext> { const workspaceId = this.workspaceId const ctsEndoint = process.env.CS_CTS_ENDPOINT || 'https://ap-southeast-2.aws.auth.viturhosted.net' const ctsResponse = await fetch(`${ctsEndoint}/api/authorize`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ workspaceId, oidcToken: jwtToken, }), }) if (!ctsResponse.ok) { throw new Error( `[jseql]: Failed to fetch CTS token: ${ctsResponse.statusText}`, ) } const ctsToken = (await ctsResponse.json()) as CtsToken if (!ctsToken.accessToken) { const errorMessage = 'The response from the CipherStash API did not contain an access token. Please contact support.' logger.error(errorMessage) throw new Error(errorMessage) } this.ctsToken = ctsToken return this } getLockContext(): GetLockContextResponse { if (!this.ctsToken?.accessToken && !this.ctsToken?.expiry) { return { success: false, error: 'The CTS token is not set. Please call identify() with a users JWT token, or pass an existing CTS token to the LockContext constructor before calling getLockContext().', } } return { success: true, context: this.context, ctsToken: this.ctsToken, } } }