{"version":3,"sources":["src/common.speech/Transcription/ConversationTranslatorRecognizer.ts"],"names":[],"mappings":"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","file":"ConversationTranslatorRecognizer.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport {\n    IAuthentication,\n    IConnectionFactory,\n    RecognizerConfig,\n    ServiceRecognizerBase,\n    SpeechServiceConfig\n} from \"../../common.speech/Exports\";\nimport { AudioConfigImpl } from \"../../sdk/Audio/AudioConfig\";\nimport { Contracts } from \"../../sdk/Contracts\";\nimport { AudioConfig,\n    ConversationExpirationEventArgs,\n    ConversationParticipantsChangedEventArgs,\n    ConversationTranslationCanceledEventArgs,\n    PropertyCollection,\n    Recognizer,\n    SessionEventArgs,\n    SpeechTranslationConfig} from \"../../sdk/Exports\";\nimport { SpeechTranslationConfigImpl } from \"../../sdk/SpeechTranslationConfig\";\nimport { Callback } from \"../../sdk/Transcription/IConversation\";\nimport { ConversationConnectionFactory } from \"./ConversationConnectionFactory\";\nimport { ConversationServiceAdapter } from \"./ConversationServiceAdapter\";\nimport {\n    ConversationReceivedTranslationEventArgs,\n    LockRoomEventArgs,\n    MuteAllEventArgs,\n    ParticipantAttributeEventArgs,\n    ParticipantEventArgs,\n    ParticipantsListEventArgs } from \"./ConversationTranslatorEventArgs\";\nimport {\n    ConversationTranslatorCommandTypes,\n    ConversationTranslatorMessageTypes,\n    IChangeNicknameCommand,\n    IConversationTranslatorRecognizer,\n    IEjectParticipantCommand,\n    IInstantMessageCommand,\n    IInternalConversation,\n    ILockConversationCommand,\n    IMuteAllCommand,\n    IMuteCommand} from \"./ConversationTranslatorInterfaces\";\nimport { PromiseToEmptyCallback } from \"./ConversationUtils\";\n\n/**\n * Sends messages to the Conversation Translator websocket and listens for incoming events containing websocket messages.\n * Based off the recognizers in the SDK folder.\n */\nexport class ConversationTranslatorRecognizer extends Recognizer implements IConversationTranslatorRecognizer {\n\n    private privIsDisposed: boolean;\n    private privSpeechRecognitionLanguage: string;\n    private privRoom: IInternalConversation;\n\n    public constructor(speechConfig: SpeechTranslationConfig, audioConfig?: AudioConfig) {\n        const serviceConfigImpl = speechConfig as SpeechTranslationConfigImpl;\n        Contracts.throwIfNull(serviceConfigImpl, \"speechConfig\");\n\n        super(audioConfig, serviceConfigImpl.properties, new ConversationConnectionFactory());\n\n        this.privIsDisposed = false;\n        this.privProperties = serviceConfigImpl.properties.clone();\n\n    }\n\n    public canceled: (sender: IConversationTranslatorRecognizer, event: ConversationTranslationCanceledEventArgs) => void;\n    public conversationExpiration: (sender: IConversationTranslatorRecognizer, event: ConversationExpirationEventArgs) => void;\n    public lockRoomCommandReceived: (sender: IConversationTranslatorRecognizer, event: LockRoomEventArgs) => void;\n    public muteAllCommandReceived: (sender: IConversationTranslatorRecognizer, event: MuteAllEventArgs) => void;\n    public participantJoinCommandReceived: (sender: IConversationTranslatorRecognizer, event: ParticipantEventArgs) => void;\n    public participantLeaveCommandReceived: (sender: IConversationTranslatorRecognizer, event: ParticipantEventArgs) => void;\n    public participantUpdateCommandReceived: (sender: IConversationTranslatorRecognizer, event: ParticipantAttributeEventArgs) => void;\n    public connectionOpened: (sender: IConversationTranslatorRecognizer, event: SessionEventArgs) => void;\n    public connectionClosed: (sender: IConversationTranslatorRecognizer, event: SessionEventArgs) => void;\n    public translationReceived: (sender: IConversationTranslatorRecognizer, event: ConversationReceivedTranslationEventArgs) => void;\n    public participantsListReceived: (sender: IConversationTranslatorRecognizer, event: ParticipantsListEventArgs) => void;\n    public participantsChanged: (sender: IConversationTranslatorRecognizer, event: ConversationParticipantsChangedEventArgs) => void;\n\n    public set conversation(value: IInternalConversation) {\n        this.privRoom = value;\n    }\n\n    /**\n     * Return the speech language used by the recognizer\n     */\n    public get speechRecognitionLanguage(): string {\n        return this.privSpeechRecognitionLanguage;\n    }\n\n    /**\n     * Return the properties for the recognizer\n     */\n    public get properties(): PropertyCollection {\n        return this.privProperties;\n    }\n\n    public isDisposed(): boolean {\n        return this.privIsDisposed;\n    }\n\n    /**\n     * Connect to the recognizer\n     * @param token\n     */\n    public connect(token: string, cb?: () => void, err?: (e: string) => void): void {\n        try {\n            Contracts.throwIfDisposed(this.privIsDisposed);\n            Contracts.throwIfNullOrWhitespace(token, \"token\");\n            this.privReco.conversationTranslatorToken = token;\n            this.privReco.connectAsync(cb, err);\n        } catch (error) {\n            if (!!err) {\n                if (error instanceof Error) {\n                    const typedError: Error = error as Error;\n                    err(typedError.name + \": \" + typedError.message);\n                } else {\n                    err(error);\n                }\n            }\n        }\n    }\n\n    /**\n     * Disconnect from the recognizer\n     */\n    public disconnect(cb?: () => void, err?: (e: string) => void): void {\n        try {\n            Contracts.throwIfDisposed(this.privIsDisposed);\n            this.privRoom = undefined;\n            this.privReco.disconnectAsync(cb, err);\n        } catch (error) {\n            if (!!err) {\n                if (error instanceof Error) {\n                    const typedError: Error = error as Error;\n                    err(typedError.name + \": \" + typedError.message);\n                } else {\n                    err(error);\n                }\n            }\n            // Destroy the recognizer.\n            this.dispose(true);\n        }\n    }\n\n    /**\n     * Send the text message command to the websocket\n     * @param conversationId\n     * @param participantId\n     * @param message\n     */\n    public sendMessageRequest(message: string, cb?: () => void, err?: (e: string) => void): void {\n        try {\n            Contracts.throwIfDisposed(this.privIsDisposed);\n            Contracts.throwIfNullOrWhitespace(this.privRoom.roomId, \"conversationId\");\n            Contracts.throwIfNullOrWhitespace(this.privRoom.participantId, \"participantId\");\n            Contracts.throwIfNullOrWhitespace(message, \"message\");\n\n            const command: IInstantMessageCommand = {\n                // tslint:disable-next-line: object-literal-shorthand\n                participantId: this.privRoom.participantId,\n                roomId: this.privRoom.roomId,\n                text: message,\n                type: ConversationTranslatorMessageTypes.instantMessage\n            };\n\n            this.sendMessage(JSON.stringify(command), cb, err);\n\n        } catch (error) {\n            if (!!err) {\n                if (error instanceof Error) {\n                    const typedError: Error = error as Error;\n                    err(typedError.name + \": \" + typedError.message);\n                } else {\n                    err(error);\n                }\n            }\n\n            // Destroy the recognizer.\n            this.dispose(true);\n        }\n    }\n\n    /**\n     * Send the lock conversation command to the websocket\n     * @param conversationId\n     * @param participantId\n     * @param isLocked\n     */\n    public sendLockRequest(isLocked: boolean, cb?: () => void, err?: (e: string) => void): void {\n\n        try {\n            Contracts.throwIfDisposed(this.privIsDisposed);\n            Contracts.throwIfNullOrWhitespace(this.privRoom.roomId, \"conversationId\");\n            Contracts.throwIfNullOrWhitespace(this.privRoom.participantId, \"participantId\");\n            Contracts.throwIfNullOrUndefined(isLocked, \"isLocked\");\n\n            const command: ILockConversationCommand = {\n                command: ConversationTranslatorCommandTypes.setLockState,\n                // tslint:disable-next-line: object-literal-shorthand\n                participantId: this.privRoom.participantId,\n                roomid: this.privRoom.roomId,\n                type: ConversationTranslatorMessageTypes.participantCommand,\n                value: isLocked\n            };\n\n            this.sendMessage(JSON.stringify(command), cb, err);\n        } catch (error) {\n            if (!!err) {\n                if (error instanceof Error) {\n                    const typedError: Error = error as Error;\n                    err(typedError.name + \": \" + typedError.message);\n                } else {\n                    err(error);\n                }\n            }\n\n            // Destroy the recognizer.\n            this.dispose(true);\n        }\n    }\n\n    /**\n     * Send the mute all participants command to the websocket\n     * @param conversationId\n     * @param participantId\n     * @param isMuted\n     */\n    public sendMuteAllRequest(isMuted: boolean, cb?: () => void, err?: (e: string) => void): void {\n\n        try {\n            Contracts.throwIfDisposed(this.privIsDisposed);\n            Contracts.throwIfNullOrWhitespace(this.privRoom.roomId, \"conversationId\");\n            Contracts.throwIfNullOrWhitespace(this.privRoom.participantId, \"participantId\");\n            Contracts.throwIfNullOrUndefined(isMuted, \"isMuted\");\n\n            const command: IMuteAllCommand = {\n                command: ConversationTranslatorCommandTypes.setMuteAll,\n                // tslint:disable-next-line: object-literal-shorthand\n                participantId: this.privRoom.participantId, // the id of the host\n                roomid: this.privRoom.roomId,\n                type: ConversationTranslatorMessageTypes.participantCommand,\n                value: isMuted\n            };\n\n            this.sendMessage(JSON.stringify(command), cb, err);\n        } catch (error) {\n            if (!!err) {\n                if (error instanceof Error) {\n                    const typedError: Error = error as Error;\n                    err(typedError.name + \": \" + typedError.message);\n                } else {\n                    err(error);\n                }\n            }\n\n            // Destroy the recognizer.\n            this.dispose(true);\n        }\n    }\n\n    /**\n     * Send the mute participant command to the websocket\n     * @param conversationId\n     * @param participantId\n     * @param isMuted\n     */\n    public sendMuteRequest(participantId: string, isMuted: boolean, cb?: () => void, err?: (e: string) => void): void {\n\n        try {\n            Contracts.throwIfDisposed(this.privIsDisposed);\n            Contracts.throwIfNullOrWhitespace(this.privRoom.roomId, \"conversationId\");\n            Contracts.throwIfNullOrWhitespace(participantId, \"participantId\");\n            Contracts.throwIfNullOrUndefined(isMuted, \"isMuted\");\n\n            const command: IMuteCommand = {\n                command: ConversationTranslatorCommandTypes.setMute,\n                // tslint:disable-next-line: object-literal-shorthand\n                participantId: participantId, // the id of the participant\n                roomid: this.privRoom.roomId,\n                type: ConversationTranslatorMessageTypes.participantCommand,\n                value: isMuted\n            };\n\n            this.sendMessage(JSON.stringify(command), cb, err);\n        } catch (error) {\n            if (!!err) {\n                if (error instanceof Error) {\n                    const typedError: Error = error as Error;\n                    err(typedError.name + \": \" + typedError.message);\n                } else {\n                    err(error);\n                }\n            }\n\n            // Destroy the recognizer.\n            this.dispose(true);\n        }\n    }\n\n    /**\n     * Send the eject participant command to the websocket\n     * @param conversationId\n     * @param participantId\n     */\n    public sendEjectRequest(participantId: string, cb?: () => void, err?: (e: string) => void): void {\n\n        try {\n            Contracts.throwIfDisposed(this.privIsDisposed);\n            Contracts.throwIfNullOrWhitespace(this.privRoom.roomId, \"conversationId\");\n            Contracts.throwIfNullOrWhitespace(participantId, \"participantId\");\n\n            const command: IEjectParticipantCommand = {\n                command: ConversationTranslatorCommandTypes.ejectParticipant,\n                // tslint:disable-next-line: object-literal-shorthand\n                participantId: participantId,\n                roomid: this.privRoom.roomId,\n                type: ConversationTranslatorMessageTypes.participantCommand,\n            };\n\n            this.sendMessage(JSON.stringify(command), cb, err);\n\n            if (!!cb) {\n                try {\n                    cb();\n                } catch (e) {\n                    if (!!err) {\n                        err(e);\n                    }\n                }\n            }\n\n        } catch (error) {\n            if (!!err) {\n                if (error instanceof Error) {\n                    const typedError: Error = error as Error;\n                    err(typedError.name + \": \" + typedError.message);\n                } else {\n                    err(error);\n                }\n            }\n\n            // Destroy the recognizer.\n            this.dispose(true);\n        }\n    }\n\n    /**\n     * Send the mute participant command to the websocket\n     * @param conversationId\n     * @param participantId\n     * @param isMuted\n     */\n    public sendChangeNicknameRequest(nickname: string, cb?: () => void, err?: (e: string) => void): void {\n\n        try {\n            Contracts.throwIfDisposed(this.privIsDisposed);\n            Contracts.throwIfNullOrWhitespace(this.privRoom.roomId, \"conversationId\");\n            Contracts.throwIfNullOrWhitespace(nickname, \"nickname\");\n\n            const command: IChangeNicknameCommand = {\n                command: ConversationTranslatorCommandTypes.changeNickname,\n                nickname,\n                // tslint:disable-next-line: object-literal-shorthand\n                participantId: this.privRoom.participantId, // the id of the host\n                roomid: this.privRoom.roomId,\n                type: ConversationTranslatorMessageTypes.participantCommand,\n                value: nickname\n            };\n\n            this.sendMessage(JSON.stringify(command), cb, err);\n\n        } catch (error) {\n            if (!!err) {\n                if (error instanceof Error) {\n                    const typedError: Error = error as Error;\n                    err(typedError.name + \": \" + typedError.message);\n                } else {\n                    err(error);\n                }\n            }\n\n            // Destroy the recognizer.\n            this.dispose(true);\n        }\n    }\n\n    /**\n     * Close and dispose the recognizer\n     */\n    public close(): void {\n        Contracts.throwIfDisposed(this.privIsDisposed);\n        this.dispose(true);\n    }\n\n    /**\n     * Dispose the recognizer\n     * @param disposing\n     */\n    protected dispose(disposing: boolean): boolean {\n        if (this.privIsDisposed) {\n            return;\n        }\n        if (disposing) {\n            this.privIsDisposed = true;\n            super.dispose(disposing);\n        }\n    }\n\n    /**\n     * Create the config for the recognizer\n     * @param speechConfig\n     */\n    protected createRecognizerConfig(speechConfig: SpeechServiceConfig): RecognizerConfig {\n        return new RecognizerConfig(speechConfig, this.privProperties);\n    }\n\n    /**\n     * Create the service recognizer.\n     * The audio source is redundnant here but is required by the implementation.\n     * @param authentication\n     * @param connectionFactory\n     * @param audioConfig\n     * @param recognizerConfig\n     */\n    protected createServiceRecognizer(\n        authentication: IAuthentication,\n        connectionFactory: IConnectionFactory,\n        audioConfig: AudioConfig,\n        recognizerConfig: RecognizerConfig): ServiceRecognizerBase {\n\n        const audioSource: AudioConfigImpl = audioConfig as AudioConfigImpl;\n\n        return new ConversationServiceAdapter(authentication, connectionFactory, audioSource, recognizerConfig, this);\n    }\n\n    private sendMessage(msg: string, cb?: Callback, err?: Callback): void {\n        const withAsync = this.privReco as ConversationServiceAdapter;\n        PromiseToEmptyCallback(withAsync.sendMessageAsync(msg), cb, err);\n    }\n\n}\n"]}