{"version":3,"sources":["../src/index.ts","../src/ffi/index.ts","../../utils/logger/index.ts","../src/ffi/env-check.ts","../src/ffi/payload-helpers.ts","../src/identify/index.ts","../src/eql/index.ts"],"sourcesContent":["import { EqlClient } from './ffi'\n\nexport const eql = (): Promise<EqlClient> => {\n  const client = new EqlClient()\n  return client.init()\n}\n\nexport type { EqlClient } from './ffi'\nexport * from './cs_plaintext_v1'\nexport * from './identify'\nexport * from './eql'\n","import {\n  newClient,\n  encrypt as ffiEncrypt,\n  decrypt as ffiDecrypt,\n  encryptBulk as ffiEncryptBulk,\n  decryptBulk as ffiDecryptBulk,\n} from '@cipherstash/jseql-ffi'\nimport { logger } from '../../../utils/logger'\nimport { checkEnvironmentVariables } from './env-check'\nimport {\n  normalizeBulkEncryptPayloads,\n  normalizeBulkDecryptPayloads,\n  normalizeBulkEncryptPayloadsWithLockContext,\n  normalizeBulkDecryptPayloadsWithLockContext,\n} from './payload-helpers'\nimport type { LockContext } from '../identify'\n\n// ------------------------\n// Type Definitions\n// ------------------------\nexport type EncryptPayload = string | null\n\nexport type EncryptedPayload = { c: string } | null\n\nexport type BulkEncryptPayload = {\n  plaintext: string\n  id: string\n}[]\n\nexport type BulkEncryptedData =\n  | {\n      c: string\n      id: string\n    }[]\n  | null\n\nexport type BulkDecryptedData =\n  | ({\n      plaintext: string\n      id: string\n    } | null)[]\n  | null\n\nexport type EncryptOptions = {\n  column: string\n  table: string\n}\n\ntype Client = Awaited<ReturnType<typeof newClient>> | undefined\n\n// ------------------------\n// Reusable functions\n// ------------------------\nconst noClientError = () =>\n  new Error(\n    'The EQL client has not been initialized. Please call init() before using the client.',\n  )\n\n// ------------------------\n// Encrhyption operation implementations\n// ------------------------\nclass EncryptOperation implements PromiseLike<EncryptedPayload> {\n  private client: Client\n  private plaintext: EncryptPayload\n  private column: string\n  private table: string\n\n  constructor(client: Client, plaintext: EncryptPayload, opts: EncryptOptions) {\n    this.client = client\n    this.plaintext = plaintext\n    this.column = opts.column\n    this.table = opts.table\n  }\n\n  public withLockContext(\n    lockContext: LockContext,\n  ): EncryptOperationWithLockContext {\n    return new EncryptOperationWithLockContext(this, lockContext)\n  }\n\n  /** Implement the PromiseLike interface so `await` works. */\n  public then<TResult1 = EncryptedPayload, TResult2 = never>(\n    onfulfilled?:\n      | ((value: EncryptedPayload) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    // biome-ignore lint/suspicious/noExplicitAny: Rejections require an any type\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  /** Actual encryption logic, deferred until `then()` is called. */\n  private async execute(): Promise<EncryptedPayload> {\n    if (!this.client) {\n      throw noClientError()\n    }\n\n    if (this.plaintext === null) {\n      return null\n    }\n\n    logger.debug('Encrypting data WITHOUT a lock context', {\n      column: this.column,\n      table: this.table,\n    })\n\n    logger.debug('SHOULD NEVER BE LOGGED: Plaintext for encryption')\n\n    const val = await ffiEncrypt(this.client, this.plaintext, this.column)\n    return { c: val }\n  }\n\n  public getOperation(): {\n    client: Client\n    plaintext: EncryptPayload\n    column: string\n    table: string\n  } {\n    return {\n      client: this.client,\n      plaintext: this.plaintext,\n      column: this.column,\n      table: this.table,\n    }\n  }\n}\n\nclass EncryptOperationWithLockContext implements PromiseLike<EncryptedPayload> {\n  private operation: EncryptOperation\n  private lockContext: LockContext\n\n  constructor(operation: EncryptOperation, lockContext: LockContext) {\n    this.operation = operation\n    this.lockContext = lockContext\n  }\n\n  public then<TResult1 = EncryptedPayload, TResult2 = never>(\n    onfulfilled?:\n      | ((value: EncryptedPayload) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    // biome-ignore lint/suspicious/noExplicitAny: Rejections require an any type\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  private async execute(): Promise<EncryptedPayload> {\n    const { client, plaintext, column, table } = this.operation.getOperation()\n\n    if (!client) {\n      throw noClientError()\n    }\n\n    if (plaintext === null) {\n      return null\n    }\n\n    logger.debug('Encrypting data WITH a lock context')\n\n    const context = this.lockContext?.getLockContext()\n\n    if (!context?.success) {\n      throw new Error(`[jseql]: ${context?.error}`)\n    }\n\n    logger.debug('SENSITIVE TO BE DELETED: Lock context for encryption', {\n      context: context.context,\n      ctsToken: context.ctsToken,\n      accessToken: context.ctsToken?.accessToken,\n    })\n\n    const val = await ffiEncrypt(\n      client,\n      plaintext,\n      column,\n      context.context,\n      context.ctsToken,\n    )\n    return { c: val }\n  }\n}\n\n// ------------------------\n// Decryption operation implementations\n// ------------------------\nclass DecryptOperation implements PromiseLike<string | null> {\n  private client: Client\n  private encryptedPayload: EncryptedPayload\n\n  constructor(client: Client, encryptedPayload: EncryptedPayload) {\n    this.client = client\n    this.encryptedPayload = encryptedPayload\n  }\n\n  public withLockContext(\n    lockContext: LockContext,\n  ): DecryptOperationWithLockContext {\n    return new DecryptOperationWithLockContext(this, lockContext)\n  }\n\n  public then<TResult1 = string | null, TResult2 = never>(\n    onfulfilled?:\n      | ((value: string | null) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    // biome-ignore lint/suspicious/noExplicitAny: Rejections require an any type\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  private async execute(): Promise<string | null> {\n    if (!this.client) {\n      throw noClientError()\n    }\n\n    if (this.encryptedPayload === null) {\n      return null\n    }\n\n    logger.debug('Decrypting data WITHOUT a lock context')\n\n    logger.debug('SHOULD NEVER BE LOGGED: Encrypted payload for decryption')\n\n    return await ffiDecrypt(this.client, this.encryptedPayload.c)\n  }\n\n  public getOperation(): {\n    client: Client\n    encryptedPayload: EncryptedPayload\n  } {\n    return {\n      client: this.client,\n      encryptedPayload: this.encryptedPayload,\n    }\n  }\n}\n\nclass DecryptOperationWithLockContext implements PromiseLike<string | null> {\n  private operation: DecryptOperation\n  private lockContext: LockContext\n\n  constructor(operation: DecryptOperation, lockContext: LockContext) {\n    this.operation = operation\n    this.lockContext = lockContext\n  }\n\n  public then<TResult1 = string | null, TResult2 = never>(\n    onfulfilled?:\n      | ((value: string | null) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    // biome-ignore lint/suspicious/noExplicitAny: Rejections require an any type\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  private async execute(): Promise<string | null> {\n    const { client, encryptedPayload } = this.operation.getOperation()\n\n    if (!client) {\n      throw noClientError()\n    }\n\n    if (encryptedPayload === null) {\n      return null\n    }\n\n    logger.debug('Decrypting data WITH a lock context')\n\n    const context = this.lockContext?.getLockContext()\n\n    if (!context?.success) {\n      throw new Error(`[jseql]: ${context?.error}`)\n    }\n\n    logger.debug('SENSITIVE TO BE DELETED: Lock context for decryption', {\n      context: context.context,\n      ctsToken: context.ctsToken,\n      accessToken: context.ctsToken?.accessToken,\n    })\n\n    return await ffiDecrypt(\n      client,\n      encryptedPayload.c,\n      context.context,\n      context.ctsToken,\n    )\n  }\n}\n\n// ------------------------\n// Bulk Encryption operation implementations\n// ------------------------\nclass BulkEncryptOperation implements PromiseLike<BulkEncryptedData> {\n  private client: Client\n  private plaintexts: BulkEncryptPayload\n  private column: string\n  private table: string\n\n  constructor(\n    client: Client,\n    plaintexts: BulkEncryptPayload,\n    opts: EncryptOptions,\n  ) {\n    this.client = client\n    this.plaintexts = plaintexts\n    this.column = opts.column\n    this.table = opts.table\n  }\n\n  public withLockContext(\n    lockContext: LockContext,\n  ): BulkEncryptOperationWithLockContext {\n    return new BulkEncryptOperationWithLockContext(this, lockContext)\n  }\n\n  public then<TResult1 = BulkEncryptedData, TResult2 = never>(\n    onfulfilled?:\n      | ((value: BulkEncryptedData) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    // biome-ignore lint/suspicious/noExplicitAny: Rejections require an any type\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  private async execute(): Promise<BulkEncryptedData> {\n    if (!this.client) {\n      throw noClientError()\n    }\n\n    if (!this.plaintexts || this.plaintexts.length === 0) {\n      return null\n    }\n\n    const encryptPayloads = normalizeBulkEncryptPayloads(\n      this.plaintexts,\n      this.column,\n    )\n\n    logger.debug('Bulk encrypting data WITHOUT a lock context', {\n      column: this.column,\n      table: this.table,\n    })\n\n    logger.debug('SHOULD NEVER BE LOGGED: Plaintexts for bulk encryption')\n\n    const encryptedData = await ffiEncryptBulk(this.client, encryptPayloads)\n    return encryptedData.map((enc, index) => ({\n      c: enc,\n      id: this.plaintexts[index].id,\n    }))\n  }\n\n  public getOperation(): {\n    client: Client\n    plaintexts: BulkEncryptPayload\n    column: string\n    table: string\n  } {\n    return {\n      client: this.client,\n      plaintexts: this.plaintexts,\n      column: this.column,\n      table: this.table,\n    }\n  }\n}\n\nclass BulkEncryptOperationWithLockContext\n  implements PromiseLike<BulkEncryptedData>\n{\n  private operation: BulkEncryptOperation\n  private lockContext: LockContext\n\n  constructor(operation: BulkEncryptOperation, lockContext: LockContext) {\n    this.operation = operation\n    this.lockContext = lockContext\n  }\n\n  public then<TResult1 = BulkEncryptedData, TResult2 = never>(\n    onfulfilled?:\n      | ((value: BulkEncryptedData) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    // biome-ignore lint/suspicious/noExplicitAny: Rejections require an any type\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  private async execute(): Promise<BulkEncryptedData> {\n    const { client, plaintexts, column, table } = this.operation.getOperation()\n\n    if (!client) {\n      throw noClientError()\n    }\n\n    if (!plaintexts || plaintexts.length === 0) {\n      return null\n    }\n\n    const encryptPayloads = normalizeBulkEncryptPayloadsWithLockContext(\n      plaintexts,\n      column,\n      this.lockContext,\n    )\n\n    logger.debug('Bulk encrypting data WITH a lock context', {\n      column,\n      table,\n    })\n\n    const context = this.lockContext.getLockContext()\n\n    if (!context.success) {\n      throw new Error(`[jseql]: ${context?.error}`)\n    }\n\n    logger.debug('SENSITIVE TO BE DELETED: Lock context for bulk encryption', {\n      context: context.context,\n      ctsToken: context.ctsToken,\n      accessToken: context.ctsToken?.accessToken,\n    })\n\n    const encryptedData = await ffiEncryptBulk(\n      client,\n      encryptPayloads,\n      context.ctsToken,\n    )\n\n    return encryptedData.map((enc, index) => ({\n      c: enc,\n      id: plaintexts[index].id,\n    }))\n  }\n}\n\n// ------------------------\n// Bulk Decryption operation implementations\n// ------------------------\nclass BulkDecryptOperation implements PromiseLike<BulkDecryptedData> {\n  private client: Client\n  private encryptedPayloads: BulkEncryptedData\n\n  constructor(client: Client, encryptedPayloads: BulkEncryptedData) {\n    this.client = client\n    this.encryptedPayloads = encryptedPayloads\n  }\n\n  public withLockContext(\n    lockContext: LockContext,\n  ): BulkDecryptOperationWithLockContext {\n    return new BulkDecryptOperationWithLockContext(this, lockContext)\n  }\n\n  public then<TResult1 = BulkDecryptedData, TResult2 = never>(\n    onfulfilled?:\n      | ((value: BulkDecryptedData) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    // biome-ignore lint/suspicious/noExplicitAny: Rejections require an any type\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  private async execute(): Promise<BulkDecryptedData> {\n    if (!this.client) {\n      throw noClientError()\n    }\n\n    if (!this.encryptedPayloads) {\n      return null\n    }\n\n    const decryptPayloads = normalizeBulkDecryptPayloads(this.encryptedPayloads)\n\n    if (!decryptPayloads) {\n      return null\n    }\n\n    logger.debug('Bulk decrypting data WITHOUT a lock context')\n\n    logger.debug(\n      'SHOULD NEVER BE LOGGED: Encrypted payloads for bulk decryption',\n    )\n\n    const decryptedData = await ffiDecryptBulk(this.client, decryptPayloads)\n    return decryptedData.map((dec, index) => {\n      if (!this.encryptedPayloads) return null\n      return {\n        plaintext: dec,\n        id: this.encryptedPayloads[index].id,\n      }\n    })\n  }\n\n  public getOperation(): {\n    client: Client\n    encryptedPayloads: BulkEncryptedData\n  } {\n    return {\n      client: this.client,\n      encryptedPayloads: this.encryptedPayloads,\n    }\n  }\n}\n\nclass BulkDecryptOperationWithLockContext\n  implements PromiseLike<BulkDecryptedData>\n{\n  private operation: BulkDecryptOperation\n  private lockContext: LockContext\n\n  constructor(operation: BulkDecryptOperation, lockContext: LockContext) {\n    this.operation = operation\n    this.lockContext = lockContext\n  }\n\n  public then<TResult1 = BulkDecryptedData, TResult2 = never>(\n    onfulfilled?:\n      | ((value: BulkDecryptedData) => TResult1 | PromiseLike<TResult1>)\n      | null,\n    // biome-ignore lint/suspicious/noExplicitAny: Rejections require an any type\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): Promise<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  private async execute(): Promise<BulkDecryptedData> {\n    const { client, encryptedPayloads } = this.operation.getOperation()\n\n    if (!client) {\n      throw noClientError()\n    }\n\n    if (!encryptedPayloads) {\n      return null\n    }\n\n    const decryptPayloads = normalizeBulkDecryptPayloadsWithLockContext(\n      encryptedPayloads,\n      this.lockContext,\n    )\n\n    if (!decryptPayloads) {\n      return null\n    }\n\n    logger.debug('Bulk decrypting data WITH a lock context')\n\n    const context = this.lockContext.getLockContext()\n\n    if (!context.success) {\n      throw new Error(`[jseql]: ${context?.error}`)\n    }\n\n    logger.debug('SENSITIVE TO BE DELETED: Lock context for bulk decryption', {\n      context: context.context,\n      ctsToken: context.ctsToken,\n      accessToken: context.ctsToken?.accessToken,\n    })\n\n    const decryptedData = await ffiDecryptBulk(\n      client,\n      decryptPayloads,\n      context.ctsToken,\n    )\n\n    return decryptedData.map((dec, index) => {\n      if (!encryptedPayloads) return null\n      return {\n        plaintext: dec,\n        id: encryptedPayloads[index].id,\n      }\n    })\n  }\n}\n\n// ------------------------\n// Main EQL Client\n// ------------------------\nexport class EqlClient {\n  private client: Client\n  private workspaceId: string | undefined\n\n  constructor() {\n    checkEnvironmentVariables()\n\n    logger.info(\n      'Successfully initialized the EQL client with your defined environment variables.',\n    )\n\n    this.workspaceId = process.env.CS_WORKSPACE_ID\n  }\n\n  async init(): Promise<EqlClient> {\n    const c = await newClient()\n    this.client = c\n    return this\n  }\n\n  /**\n   * Encryption - returns a thenable object.\n   * Usage:\n   *    await eqlClient.encrypt(plaintext, { column, table })\n   *    await eqlClient.encrypt(plaintext, { column, table }).withLockContext(lockContext)\n   */\n  encrypt(plaintext: EncryptPayload, opts: EncryptOptions): EncryptOperation {\n    if (!this.client) {\n      throw noClientError()\n    }\n\n    return new EncryptOperation(this.client, plaintext, opts)\n  }\n\n  /**\n   * Decryption - returns a thenable object.\n   * Usage:\n   *    await eqlClient.decrypt(encryptedPayload)\n   *    await eqlClient.decrypt(encryptedPayload).withLockContext(lockContext)\n   */\n  decrypt(encryptedPayload: EncryptedPayload): DecryptOperation {\n    if (!this.client) {\n      throw noClientError()\n    }\n\n    return new DecryptOperation(this.client, encryptedPayload)\n  }\n\n  /**\n   * Bulk Encrypt - returns a thenable object.\n   * Usage:\n   *    await eqlClient.bulkEncrypt([{ plaintext, id }, ...], { column, table })\n   *    await eqlClient\n   *      .bulkEncrypt([{ plaintext, id }, ...], { column, table })\n   *      .withLockContext(lockContext)\n   */\n  bulkEncrypt(\n    plaintexts: BulkEncryptPayload,\n    opts: EncryptOptions,\n  ): BulkEncryptOperation {\n    if (!this.client) {\n      throw noClientError()\n    }\n\n    return new BulkEncryptOperation(this.client, plaintexts, opts)\n  }\n\n  /**\n   * Bulk Decrypt - returns a thenable object.\n   * Usage:\n   *    await eqlClient.bulkDecrypt(encryptedPayloads)\n   *    await eqlClient.bulkDecrypt(encryptedPayloads).withLockContext(lockContext)\n   */\n  bulkDecrypt(encryptedPayloads: BulkEncryptedData): BulkDecryptOperation {\n    if (!this.client) {\n      throw noClientError()\n    }\n\n    return new BulkDecryptOperation(this.client, encryptedPayloads)\n  }\n\n  /** e.g., debugging or environment info */\n  clientInfo() {\n    return {\n      workspaceId: this.workspaceId,\n    }\n  }\n}\n","function getLevelValue(level: string): number {\n  switch (level) {\n    case 'debug':\n      return 10\n    case 'info':\n      return 20\n    case 'error':\n      return 30\n    default:\n      return 30 // default to error level\n  }\n}\n\nconst envLogLevel = process.env.JSEQL_LOG_LEVEL || 'info'\nconst currentLevel = getLevelValue(envLogLevel)\n\nfunction debug(...args: unknown[]): void {\n  if (currentLevel <= getLevelValue('debug')) {\n    console.debug('[jseql] DEBUG', ...args)\n  }\n}\n\nfunction info(...args: unknown[]): void {\n  if (currentLevel <= getLevelValue('info')) {\n    console.info('[jseql] INFO', ...args)\n  }\n}\n\nfunction error(...args: unknown[]): void {\n  if (currentLevel <= getLevelValue('error')) {\n    console.error('[jseql] ERROR', ...args)\n  }\n}\n\nexport const logger = {\n  debug,\n  info,\n  error,\n}\n","import { logger } from '../../../utils/logger'\n\nlet message = ''\nconst errorMessage = (message: string) => `Initialization error: ${message}`\n\nexport const checkEnvironmentVariables = () => {\n  if (!process.env.CS_WORKSPACE_ID) {\n    message = errorMessage(\n      'The environment variable \"CS_WORKSPACE_ID\" must be set. You can find your workspace ID in the CipherStash dashboard.',\n    )\n\n    logger.error(message)\n    throw new Error(`[jseql]: ${message}`)\n  }\n\n  if (!process.env.CS_CLIENT_ID || !process.env.CS_CLIENT_KEY) {\n    message = errorMessage(\n      'The environment variables \"CS_CLIENT_ID\" and \"CS_CLIENT_KEY\" must be set. You must use the CipherStash CLI to generate a new client key pair.',\n    )\n\n    logger.error(message)\n    throw new Error(`[jseql]: ${message}`)\n  }\n\n  if (!process.env.CS_CLIENT_ACCESS_KEY) {\n    message = errorMessage(\n      'The environment variable \"CS_CLIENT_ACCESS_KEY\" must be set. Generate a new access token in the CipherStash dashboard or CLI.',\n    )\n\n    logger.error(message)\n    throw new Error(`[jseql]: ${message}`)\n  }\n}\n","import type {\n  BulkEncryptPayload as InternalBulkEncryptPayload,\n  BulkDecryptPayload as InternalBulkDecryptPayload,\n} from '@cipherstash/jseql-ffi'\n\nimport type { BulkEncryptPayload, BulkEncryptedData } from './index'\nimport type { LockContext } from '../identify'\n\nconst getLockContextPayload = (lockContext: LockContext) => {\n  const context = lockContext.getLockContext()\n\n  if (!context.ctsToken?.accessToken) {\n    throw new Error(\n      '[jseql]: LockContext must be initialized with a valid CTS token before using it.',\n    )\n  }\n\n  return {\n    lockContext: context.context,\n  }\n}\n\nexport const normalizeBulkDecryptPayloads = (\n  encryptedPayloads: BulkEncryptedData,\n) =>\n  encryptedPayloads?.reduce((acc, encryptedPayload) => {\n    const payload = {\n      ciphertext: encryptedPayload.c,\n    }\n\n    acc.push(payload)\n    return acc\n  }, [] as InternalBulkDecryptPayload[])\n\nexport const normalizeBulkEncryptPayloads = (\n  plaintexts: BulkEncryptPayload,\n  column: string,\n) =>\n  plaintexts.reduce((acc, plaintext) => {\n    const payload = {\n      plaintext: plaintext.plaintext,\n      column,\n    }\n\n    acc.push(payload)\n    return acc\n  }, [] as InternalBulkEncryptPayload[])\n\nexport const normalizeBulkDecryptPayloadsWithLockContext = (\n  encryptedPayloads: BulkEncryptedData,\n  lockContext: LockContext,\n) =>\n  encryptedPayloads?.reduce((acc, encryptedPayload) => {\n    const payload = {\n      ciphertext: encryptedPayload.c,\n      ...getLockContextPayload(lockContext),\n    }\n\n    acc.push(payload)\n    return acc\n  }, [] as InternalBulkDecryptPayload[])\n\nexport const normalizeBulkEncryptPayloadsWithLockContext = (\n  plaintexts: BulkEncryptPayload,\n  column: string,\n  lockContext: LockContext,\n) =>\n  plaintexts.reduce((acc, plaintext) => {\n    const payload = {\n      plaintext: plaintext.plaintext,\n      column,\n      ...getLockContextPayload(lockContext),\n    }\n\n    acc.push(payload)\n    return acc\n  }, [] as InternalBulkEncryptPayload[])\n","import { logger } from '../../../utils/logger'\n\nexport type CtsRegions = 'ap-southeast-2'\n\nexport type IdentifyOptions = {\n  fetchFromCts?: boolean\n}\n\nexport type CtsToken = {\n  accessToken: string\n  expiry: number\n}\n\nexport type Context = {\n  identityClaim: string[]\n}\n\nexport type LockContextOptions = {\n  context?: Context\n  ctsToken?: CtsToken\n}\n\nexport type GetLockContextResponse =\n  | {\n      success: boolean\n      error: string\n      ctsToken?: never\n      context?: never\n    }\n  | {\n      success: boolean\n      error?: never\n      ctsToken: CtsToken\n      context: Context\n    }\n\nexport class LockContext {\n  private ctsToken: CtsToken | undefined\n  private workspaceId: string\n  private context: Context\n\n  constructor({\n    context = { identityClaim: ['sub'] },\n    ctsToken,\n  }: LockContextOptions = {}) {\n    if (!process.env.CS_WORKSPACE_ID) {\n      const errorMessage =\n        'CS_WORKSPACE_ID environment variable is not set, and is required to initialize a LockContext.'\n      logger.error(errorMessage)\n      throw new Error(`[jseql]: ${errorMessage}`)\n    }\n\n    if (ctsToken) {\n      this.ctsToken = ctsToken\n    }\n\n    this.workspaceId = process.env.CS_WORKSPACE_ID\n    this.context = context\n    logger.debug('Successfully initialized the EQL lock context.')\n  }\n\n  async identify(jwtToken: string): Promise<LockContext> {\n    const workspaceId = this.workspaceId\n\n    const ctsEndoint =\n      process.env.CS_CTS_ENDPOINT ||\n      'https://ap-southeast-2.aws.auth.viturhosted.net'\n\n    const ctsResponse = await fetch(`${ctsEndoint}/api/authorize`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        workspaceId,\n        oidcToken: jwtToken,\n      }),\n    })\n\n    if (!ctsResponse.ok) {\n      throw new Error(\n        `[jseql]: Failed to fetch CTS token: ${ctsResponse.statusText}`,\n      )\n    }\n\n    const ctsToken = (await ctsResponse.json()) as CtsToken\n\n    if (!ctsToken.accessToken) {\n      const errorMessage =\n        'The response from the CipherStash API did not contain an access token. Please contact support.'\n      logger.error(errorMessage)\n      throw new Error(errorMessage)\n    }\n\n    this.ctsToken = ctsToken\n    return this\n  }\n\n  getLockContext(): GetLockContextResponse {\n    if (!this.ctsToken?.accessToken && !this.ctsToken?.expiry) {\n      return {\n        success: false,\n        error:\n          '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().',\n      }\n    }\n\n    return {\n      success: true,\n      context: this.context,\n      ctsToken: this.ctsToken,\n    }\n  }\n}\n","import type {\n  CsPlaintextV1Schema,\n  ForQuery,\n  SchemaVersion,\n  Table,\n  Column,\n  Plaintext,\n} from '../cs_plaintext_v1'\nimport { logger } from '../../../utils/logger'\n\nexport type CreateEqlPayload = {\n  plaintext: Plaintext\n  table: Table\n  column: Column\n  schemaVersion?: SchemaVersion\n  queryType?: ForQuery | null\n}\n\nexport type Result = {\n  failure?: boolean\n  error?: Error\n  plaintext?: Plaintext\n}\n\nexport const createEqlPayload = ({\n  plaintext,\n  table,\n  column,\n  schemaVersion = 1,\n  queryType = null,\n}: CreateEqlPayload): CsPlaintextV1Schema => {\n  const payload: CsPlaintextV1Schema = {\n    v: schemaVersion,\n    k: 'pt',\n    p: plaintext ?? '',\n    i: {\n      t: table,\n      c: column,\n    },\n  }\n\n  if (queryType) {\n    payload.q = queryType\n  }\n\n  logger.debug('Creating the EQL payload', payload)\n  return payload\n}\n\nexport const getPlaintext = (payload: CsPlaintextV1Schema): Result => {\n  if (payload?.p && payload?.k === 'pt') {\n    logger.debug('Returning the plaintext data from the EQL payload', payload)\n    return {\n      failure: false,\n      plaintext: payload.p,\n    }\n  }\n\n  logger.error('No plaintext data found in the EQL payload', payload ?? {})\n  return {\n    failure: true,\n    error: new Error('No plaintext data found in the EQL payload'),\n  }\n}\n"],"mappings":"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","names":["message","ffiEncrypt","ffiDecrypt","ffiEncryptBulk","ffiDecryptBulk","errorMessage"]}