{"version":3,"sources":["../src/ffi_client.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport {\n  FfiEvent,\n  FfiHandle,\n  FfiRequest,\n  FfiResponse,\n  type PartialMessage,\n  livekitCopyBuffer,\n  livekitDispose,\n  livekitFfiRequest,\n  livekitInitialize,\n  livekitRetrievePtr,\n} from '@livekit/rtc-ffi-bindings';\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport EventEmitter from 'events';\nimport { SDK_VERSION } from './version.js';\n\nexport { FfiHandle, type FfiEvent, type FfiResponse, FfiRequest, livekitDispose as dispose };\n\nexport type FfiClientCallbacks = {\n  ffi_event: (event: FfiEvent) => void;\n};\n\nexport enum FfiClientEvent {\n  FfiEvent = 'ffi_event',\n}\n\ndeclare global {\n  // eslint-disable-next-line no-var\n  var _ffiClientInstance: FfiClient | undefined;\n}\n\nexport class FfiClient extends (EventEmitter as new () => TypedEmitter<FfiClientCallbacks>) {\n  /** @internal */\n  static get instance(): FfiClient {\n    if (!globalThis._ffiClientInstance) {\n      globalThis._ffiClientInstance = new FfiClient();\n    }\n    return globalThis._ffiClientInstance;\n  }\n\n  constructor() {\n    super();\n    this.setMaxListeners(0);\n\n    livekitInitialize(\n      (event_data: Uint8Array) => {\n        const event = FfiEvent.fromBinary(event_data);\n        this.emit(FfiClientEvent.FfiEvent, event);\n      },\n      true,\n      SDK_VERSION,\n    );\n  }\n\n  request<T>(req: PartialMessage<FfiRequest>): T {\n    const request = new FfiRequest(req);\n    const req_data = request.toBinary();\n    const res_data = livekitFfiRequest(req_data);\n    return FfiResponse.fromBinary(res_data).message.value as T;\n  }\n\n  copyBuffer(ptr: bigint, len: number): Uint8Array {\n    return livekitCopyBuffer(ptr, len);\n  }\n\n  retrievePtr(data: Uint8Array): bigint {\n    return livekitRetrievePtr(data);\n  }\n\n  async waitFor<T>(predicate: (ev: FfiEvent) => boolean): Promise<T> {\n    return new Promise<T>((resolve) => {\n      const listener = (ev: FfiEvent) => {\n        if (predicate(ev)) {\n          this.off(FfiClientEvent.FfiEvent, listener);\n          resolve(ev.message.value as T);\n        }\n      };\n      this.on(FfiClientEvent.FfiEvent, listener);\n    });\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,8BAWO;AAEP,oBAAyB;AACzB,qBAA4B;AAQrB,IAAK,iBAAL,kBAAKA,oBAAL;AACL,EAAAA,gBAAA,cAAW;AADD,SAAAA;AAAA,GAAA;AASL,MAAM,kBAAmB,cAAAC,QAA4D;AAAA;AAAA,EAE1F,WAAW,WAAsB;AAC/B,QAAI,CAAC,WAAW,oBAAoB;AAClC,iBAAW,qBAAqB,IAAI,UAAU;AAAA,IAChD;AACA,WAAO,WAAW;AAAA,EACpB;AAAA,EAEA,cAAc;AACZ,UAAM;AACN,SAAK,gBAAgB,CAAC;AAEtB;AAAA,MACE,CAAC,eAA2B;AAC1B,cAAM,QAAQ,iCAAS,WAAW,UAAU;AAC5C,aAAK,KAAK,4BAAyB,KAAK;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAW,KAAoC;AAC7C,UAAM,UAAU,IAAI,mCAAW,GAAG;AAClC,UAAM,WAAW,QAAQ,SAAS;AAClC,UAAM,eAAW,2CAAkB,QAAQ;AAC3C,WAAO,oCAAY,WAAW,QAAQ,EAAE,QAAQ;AAAA,EAClD;AAAA,EAEA,WAAW,KAAa,KAAyB;AAC/C,eAAO,2CAAkB,KAAK,GAAG;AAAA,EACnC;AAAA,EAEA,YAAY,MAA0B;AACpC,eAAO,4CAAmB,IAAI;AAAA,EAChC;AAAA,EAEA,MAAM,QAAW,WAAkD;AACjE,WAAO,IAAI,QAAW,CAAC,YAAY;AACjC,YAAM,WAAW,CAAC,OAAiB;AACjC,YAAI,UAAU,EAAE,GAAG;AACjB,eAAK,IAAI,4BAAyB,QAAQ;AAC1C,kBAAQ,GAAG,QAAQ,KAAU;AAAA,QAC/B;AAAA,MACF;AACA,WAAK,GAAG,4BAAyB,QAAQ;AAAA,IAC3C,CAAC;AAAA,EACH;AACF;","names":["FfiClientEvent","EventEmitter"]}