{"version":3,"sources":["src/common.speech/Transcription/ConversationTranslatorConnectionFactory.ts"],"names":[],"mappings":"AAQA,OAAO,EACH,WAAW,EAEd,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EACH,gBAAgB,EACnB,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EACH,qBAAqB,EACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACH,QAAQ,EACR,gBAAgB,EAInB,MAAM,iBAAiB,CAAC;AAEzB;;;GAGG;AACH,qBAAa,uCAAwC,SAAQ,qBAAqB;IAE9E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAA8C;IAEvF,OAAO,CAAC,cAAc,CAAyB;gBAE5B,UAAU,EAAE,MAAM,gBAAgB;IAO9C,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAgF3G","file":"ConversationTranslatorConnectionFactory.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport {\n    ProxyInfo,\n    RestConfigBase,\n    WebsocketConnection,\n} from \"../../common.browser/Exports.js\";\nimport {\n    IConnection,\n    IStringDictionary,\n} from \"../../common/Exports.js\";\nimport { StringUtils } from \"../../common/StringUtils.js\";\nimport { Contracts } from \"../../sdk/Contracts.js\";\nimport {\n    PropertyId\n} from \"../../sdk/Exports.js\";\nimport {\n    ConversationImpl\n} from \"../../sdk/Transcription/Conversation.js\";\nimport { HeaderNames } from \"../HeaderNames.js\";\nimport { QueryParameterNames } from \"../QueryParameterNames.js\";\nimport {\n    ConnectionFactoryBase\n} from \"./../ConnectionFactoryBase.js\";\nimport {\n    AuthInfo,\n    RecognizerConfig,\n    TranscriberConnectionFactory,\n    TranslationConnectionFactory,\n    WebsocketMessageFormatter,\n} from \"./../Exports.js\";\n\n/**\n * Connection factory for the conversation translator. Handles connecting to the regular translator endpoint,\n * as well as the virtual microphone array transcription endpoint\n */\nexport class ConversationTranslatorConnectionFactory extends ConnectionFactoryBase {\n\n    private static readonly CTS_VIRT_MIC_PATH: string = \"/speech/recognition/dynamicaudio\";\n\n    private privConvGetter: () => ConversationImpl;\n\n    public constructor(convGetter: () => ConversationImpl) {\n        super();\n\n        Contracts.throwIfNullOrUndefined(convGetter, \"convGetter\");\n        this.privConvGetter = convGetter;\n    }\n\n    public create(config: RecognizerConfig, authInfo: AuthInfo, connectionId?: string): Promise<IConnection> {\n        const isVirtMicArrayEndpoint = config.parameters.getProperty(\"ConversationTranslator_MultiChannelAudio\", \"\").toUpperCase() === \"TRUE\";\n\n        const convInfo = this.privConvGetter().room;\n        const region = convInfo.cognitiveSpeechRegion || config.parameters.getProperty(PropertyId.SpeechServiceConnection_Region, \"\");\n\n        const replacementValues: IStringDictionary<string> = {\n            hostSuffix: ConnectionFactoryBase.getHostSuffix(region),\n            path: ConversationTranslatorConnectionFactory.CTS_VIRT_MIC_PATH,\n            region: encodeURIComponent(region)\n        };\n        replacementValues[QueryParameterNames.Language] = encodeURIComponent(config.parameters.getProperty(PropertyId.SpeechServiceConnection_RecoLanguage, \"\"));\n        replacementValues[QueryParameterNames.CtsMeetingId] = encodeURIComponent(convInfo.roomId);\n        replacementValues[QueryParameterNames.CtsDeviceId] = encodeURIComponent(convInfo.participantId);\n        replacementValues[QueryParameterNames.CtsIsParticipant] = convInfo.isHost ? \"\" : (\"&\" + QueryParameterNames.CtsIsParticipant);\n\n        let endpointUrl: string = \"\";\n        const queryParams: IStringDictionary<string> = {};\n        const headers: IStringDictionary<string> = {};\n\n        if (isVirtMicArrayEndpoint) {\n            // connecting to the conversation transcription virtual microphone array endpoint\n            endpointUrl = config.parameters.getProperty(PropertyId.SpeechServiceConnection_Endpoint);\n            if (!endpointUrl) {\n                const hostName = config.parameters.getProperty(\n                    PropertyId.SpeechServiceConnection_Host,\n                    \"transcribe.{region}.cts.speech{hostSuffix}\");\n\n                endpointUrl = \"wss://\" + hostName + \"{path}\";\n            }\n\n            // because the region can change during a session, we support being passed a format string which we can then\n            // replace with the correct information.\n            endpointUrl = StringUtils.formatString(endpointUrl, replacementValues);\n\n            const parsedUrl = new URL(endpointUrl);\n            parsedUrl.searchParams.forEach((val: string, key: string): void => {\n                queryParams[key] = val;\n            });\n\n            const connFactory = new TranscriberConnectionFactory();\n            connFactory.setQueryParams(queryParams, config, endpointUrl);\n\n            // Some query parameters are required for the CTS endpoint, let's explicity set them here\n            queryParams[QueryParameterNames.CtsMeetingId] = replacementValues[QueryParameterNames.CtsMeetingId];\n            queryParams[QueryParameterNames.CtsDeviceId] = replacementValues[QueryParameterNames.CtsDeviceId];\n            if (!convInfo.isHost) {\n                queryParams[QueryParameterNames.CtsIsParticipant] = \"\"; // this doesn't have a value so set to an empty string\n            }\n\n            if (!(QueryParameterNames.Format in queryParams)) {\n                queryParams[QueryParameterNames.Format] = \"simple\";\n            }\n\n            parsedUrl.searchParams.forEach((val: string, key: string): void => {\n                parsedUrl.searchParams.set(key, queryParams[key]);\n                delete queryParams[key];\n            });\n\n            endpointUrl = parsedUrl.toString();\n\n        } else {\n            // connecting to regular translation endpoint\n            const connFactory = new TranslationConnectionFactory();\n\n            endpointUrl = connFactory.getEndpointUrl(config, true);\n            endpointUrl = StringUtils.formatString(endpointUrl, replacementValues);\n\n            connFactory.setQueryParams(queryParams, config, endpointUrl);\n        }\n\n        headers[HeaderNames.ConnectionId] = connectionId;\n        headers[RestConfigBase.configParams.token] = convInfo.token;\n        if (!!authInfo.token) {\n            headers[authInfo.headerName] = authInfo.token;\n        }\n\n        const enableCompression = config.parameters.getProperty(\"SPEECH-EnableWebsocketCompression\", \"\").toUpperCase() === \"TRUE\";\n        return Promise.resolve(new WebsocketConnection(endpointUrl, queryParams, headers, new WebsocketMessageFormatter(), ProxyInfo.fromRecognizerConfig(config), enableCompression, connectionId));\n    }\n}\n"]}