import { NitroModules } from 'react-native-nitro-modules' import { assertArrayBuffer, assertNonEmptyString, createSafeCallback, validateSTTLoadOptions, } from './runtime' import type { STTLoadOptions, STT as STTSpec } from './specs/STT.nitro' let instance: STTSpec | null = null function getInstance(): STTSpec { if (!instance) { instance = NitroModules.createHybridObject('STT') } if (!instance) { throw new Error('Failed to initialize the STT Nitro module.') } return instance } export const STT = { load(modelId: string, options?: STTLoadOptions): Promise { return getInstance().load( assertNonEmptyString(modelId, 'STT modelId'), validateSTTLoadOptions(options), ) }, transcribe(audio: ArrayBuffer): Promise { return getInstance().transcribe(assertArrayBuffer(audio, 'STT audio')) }, transcribeStream( audio: ArrayBuffer, onToken: (token: string) => void, ): Promise { return getInstance().transcribeStream( assertArrayBuffer(audio, 'STT audio'), createSafeCallback('STT.transcribeStream onToken', onToken) ?? (() => {}), ) }, startListening(): Promise { return getInstance().startListening() }, transcribeBuffer(): Promise { return getInstance().transcribeBuffer() }, stopListening(): Promise { return getInstance().stopListening() }, stop(): void { getInstance().stop() }, unload(): void { getInstance().unload() }, get isLoaded(): boolean { return getInstance().isLoaded }, get isTranscribing(): boolean { return getInstance().isTranscribing }, get isListening(): boolean { return getInstance().isListening }, get modelId(): string { return getInstance().modelId }, }