{"version":3,"sources":["webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/ReplayableAudioNode.js","webpack:///./node_modules/core-js/internals/string-repeat.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/WebsocketMessageAdapter.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/WebsocketConnection.js","webpack:///./node_modules/core-js/internals/this-number-value.js","webpack:///./node_modules/core-js/modules/web.timers.js","webpack:///./node_modules/core-js/modules/es.date.now.js","webpack:///./node_modules/core-js/modules/es.array.find.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/RestMessageAdapter.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/RestConfigBase.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/ConsoleLoggingListener.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/microsoft.cognitiveservices.speech.sdk.js","webpack:///./node_modules/core-js/modules/es.number.to-fixed.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/ProxyInfo.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/PCMRecorder.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/FileAudioSource.js","webpack:///./node_modules/core-js/modules/es.array.index-of.js","webpack:///./node_modules/core-js/modules/es.array.map.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/MicAudioSource.js","webpack:///./node_modules/microsoft-cognitiveservices-speech-sdk/distrib/es2015/src/common.browser/CertChecks.js"],"names":["ReplayableAudioNode","audioSource","bytesPerSecond","this","privBuffers","privReplayOffset","privLastShrinkOffset","privBufferStartOffset","privBufferSerial","privBufferedBytes","privReplay","privLastChunkAcquiredTime","id","privAudioNode","privBytesPerSecond","length","offsetToSeek","bytesToSeek","Math","round","i","chunk","buffer","byteLength","retVal","slice","Promise","resolve","isEnd","timeReceived","read","then","result","push","BufferEntry","undefined","detach","offset","value","startOffset","byteOffset","endOffset","serial","toInteger","requireObjectCoercible","module","exports","repeat","count","str","String","n","Infinity","RangeError","__awaiter","thisArg","_arguments","P","generator","adopt","reject","fulfilled","step","next","e","rejected","done","apply","uri","connectionId","messageFormatter","proxyInfo","headers","enableCompression","open","privConnectionState","Disconnected","privConnectionEstablishDeferral","promise","privCertificateValidatedDeferral","Connecting","WebSocket","forceNpmWebSocket","options","privHeaders","perMessageDeflate","privEnableCompression","checkAgent","agent","GetAgent","privWebsocketClient","privUri","binaryType","privReceivingMessageQueue","Queue","privDisconnectDeferral","privSendMessageQueue","processSendQueue","catch","reason","Events","instance","onEvent","error","ConnectionOpenResponse","privConnectionId","onopen","Connected","onerror","message","type","privLastErrorReceived","onclose","code","onClose","onmessage","networkReceivedTime","Date","toISOString","deferred","enqueueFromPromise","data","ArrayBuffer","rawMessage","RawWebsocketMessage","Binary","privMessageFormatter","toConnectionMessage","connectionMessage","Text","send","messageSendStatusDeferral","messageSendDeferral","fromConnectionMessage","Message","sendStatusDeferral","dequeue","close","sendRawMessage","sendItem","isWebsocketOpen","payload","Error","stack","event","privConnectionEvents","EventSource","None","HeaderNames","ConnectionId","closeReason","drainAndDispose","pendingReceiveItem","pendingSendItem","itemToSend","sendError","readyState","OPEN","queryParameters","privIsDisposed","isDisposed","state","privConnectionMessageAdapter","queryParams","paramName","indexOf","val","encodeURIComponent","headerName","privId","events","classof","TypeError","$","global","userAgent","MSIE","test","wrap","scheduler","handler","timeout","boundArgs","arguments","args","call","Function","bind","forced","setTimeout","setInterval","target","stat","now","getTime","$find","find","addToUnscopables","arrayMethodUsesToLength","FIND","SKIPS_HOLES","USES_TO_LENGTH","Array","proto","callbackfn","RestRequestType","RestMessageAdapter","configParams","privTimeout","privIgnoreCache","ignoreCache","key","method","body","binaryBody","responseReceivedDeferral","xhr","XMLHttpRequest","requestCommand","File","withQuery","Object","keys","forEach","setRequestHeader","onload","parseXHRResult","errorResponse","ontimeout","Post","JSON","stringify","responseText","getAllResponseHeaders","json","parse","ok","status","statusText","url","params","queryString","map","k","join","RestConfigBase","privDefaultRequestOptions","privDefaultParams","privRestErrors","Accept","authInvalidSubscriptionKey","authInvalidSubscriptionRegion","invalidArgs","invalidCreateJoinConversationResponse","invalidParticipantRequest","permissionDeniedConnect","permissionDeniedConversation","permissionDeniedParticipant","permissionDeniedSend","permissionDeniedStart","apiVersion","authorization","clientAppId","contentTypeKey","correlationId","languageCode","nickname","profanity","requestId","roomId","sessionToken","subscriptionKey","subscriptionRegion","token","logLevelFilter","Warning","eventType","privLogLevelFilter","log","toString","Debug","console","debug","Info","info","warn","logFragments","EventTime","Name","prop","hasOwnProperty","valueToLog","attachListener","thisNumberValue","fails","nativeToFixed","toFixed","floor","pow","x","acc","x2","FORCED","fractionDigits","z","j","number","fractDigits","sign","multiply","c","index","c2","divide","dataToString","s","t","ProxyInfo","proxyHostName","proxyPort","proxyUserName","proxyPassword","privProxyHostName","privProxyPort","privProxyUserName","privProxyPassword","parameters","getProperty","SpeechServiceConnection_ProxyHostName","parseInt","SpeechServiceConnection_ProxyPort","SpeechServiceConnection_ProxyUserName","SpeechServiceConnection_ProxyPassword","config","fromParameters","PcmRecorder","record","context","mediaStream","outputStream","desiredSampleRate","scriptNode","bufferSize","createScriptProcessor","audioSampleRate","sampleRate","waveStreamEncoder","needHeader","onaudioprocess","inputFrame","inputBuffer","getChannelData","isClosed","waveFrame","encode","writeStreamChunk","micInput","createMediaStreamSource","privSpeechProcessorScript","audioWorklet","addModule","workletNode","AudioWorkletNode","port","ev","connect","destination","privMediaResources","scriptProcessorNode","source","stream","releaseMediaResources","disconnect","getTracks","track","stop","FileAudioSource","file","audioSourceId","privStreams","privHeaderEnd","turnOn","FileReader","errorMsg","privFile","name","lastIndexOf","attach","audioNodeId","upload","readEnded","turnOff","streamId","privEvents","privAudioFormatPromise","readHeader","bitspersample","bitsPerSample","channelcount","channels","connectivity","Unknown","manufacturer","model","samplerate","samplesPerSec","maxHeaderSize","header","headerReader","headerResult","processHeader","view","DataView","getWord","fromCharCode","getUint8","formatSize","getInt32","channelCount","getUint16","getUint32","pos","max","getWaveFormatPCM","readAsArrayBuffer","format","reader","avgBytesPerSec","processFile","$indexOf","arrayMethodIsStrict","nativeIndexOf","NEGATIVE_ZERO","STRICT_METHOD","ACCESSORS","1","searchElement","$map","arrayMethodHasSpeciesSupport","HAS_SPECIES_SUPPORT","AudioWorkletSourceURLPropertyName","MicAudioSource","privRecorder","deviceId","privInitializeDeferral","createAudioContext","typedError","nav","window","navigator","getUserMedia","webkitGetUserMedia","mozGetUserMedia","msGetUserMedia","mediaDevices","constraints","successCallback","errorCallback","privMediaStream","active","audio","video","privContext","resume","listen","privOutputChunkSize","getAudioContext","AUDIOFORMAT","destroyAudioContext","getMicrophoneLabel","label","Microphones","setWorkletUrl","defaultMicrophoneName","privMicrophoneLabel","microphoneDeviceId","getSettings","enumerateDevices","devices","device","hasClose","suspend","getDefaultInputFormat","CertCheckAgent","privProxyInfo","privDiskCache","supportBuffer","location","process","SPEECH_OCSP_CACHE_ROOT","privMemCache","disableStapling","Agent","CreateConnection","HostName","Port","proxyName","httpProxyOptions","host","UserName","Buffer","Password","requestOCSP","httpProxyAgent","socketPromise","ocspRequest","stapling","resolved","socket","cork","tlsSocket","on","destroy","peer","getPeerCertificate","issuer","GetIssuer","generate","raw","sig","cacheEntry","GetResponseFromCache","VerifyOCSPResponse","uncork","issuerCertificate","ocspAgent","fetchIssuer","signature","cachedResponse","diskCacheResponse","get","isCached","StoreMemoryCacheEntry","cachedOcspResponse","parseResponse","tbsData","tbsResponseData","responses","cachedStartTime","thisUpdate","cachedNextTime","nextUpdate","testTimeOffset","minUpdate","min","UpdateCache","cacheValue","ocspResponse","certID","GetOCSPResponse","request","response","StoreCacheEntry","req","rawResponse","StoreDiskCacheEntry","set","ocspMethod","GetProxyAgent","getAuthorityInfo","cert","parsedUri","assign","getResponse","enableOCSP","NODE_TLS_REJECT_UNAUTHORIZED","SPEECH_CONDUCT_OCSP_CHECK","secureEndpoint","forceDisableOCSPStapling","servername","baseAgent","callback","OCSPCheck"],"mappings":"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","file":"js/MockTestView~748942c6.b6f7d5e0.js","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nexport class ReplayableAudioNode {\n constructor(audioSource, bytesPerSecond) {\n this.privBuffers = [];\n this.privReplayOffset = 0;\n this.privLastShrinkOffset = 0;\n this.privBufferStartOffset = 0;\n this.privBufferSerial = 0;\n this.privBufferedBytes = 0;\n this.privReplay = false;\n this.privLastChunkAcquiredTime = 0;\n this.id = () => {\n return this.privAudioNode.id();\n };\n this.privAudioNode = audioSource;\n this.privBytesPerSecond = bytesPerSecond;\n }\n // Reads and returns the next chunk of audio buffer.\n // If replay of existing buffers are needed, read() will first seek and replay\n // existing content, and upoin completion it will read new content from the underlying\n // audio node, saving that content into the replayable buffers.\n read() {\n // if there is a replay request to honor.\n if (!!this.privReplay && this.privBuffers.length !== 0) {\n // Find the start point in the buffers.\n // Offsets are in 100ns increments.\n // So how many bytes do we need to seek to get the right offset?\n const offsetToSeek = this.privReplayOffset - this.privBufferStartOffset;\n let bytesToSeek = Math.round(offsetToSeek * this.privBytesPerSecond * 1e-7);\n if (0 !== (bytesToSeek % 2)) {\n bytesToSeek++;\n }\n let i = 0;\n while (i < this.privBuffers.length && bytesToSeek >= this.privBuffers[i].chunk.buffer.byteLength) {\n bytesToSeek -= this.privBuffers[i++].chunk.buffer.byteLength;\n }\n const retVal = this.privBuffers[i].chunk.buffer.slice(bytesToSeek);\n this.privReplayOffset += (retVal.byteLength / this.privBytesPerSecond) * 1e+7;\n // If we've reached the end of the buffers, stop replaying.\n if (i === this.privBuffers.length - 1) {\n this.privReplay = false;\n }\n return Promise.resolve({\n buffer: retVal,\n isEnd: false,\n timeReceived: this.privBuffers[i].chunk.timeReceived,\n });\n }\n return this.privAudioNode.read()\n .then((result) => {\n if (result && result.buffer) {\n this.privBuffers.push(new BufferEntry(result, this.privBufferSerial++, this.privBufferedBytes));\n this.privBufferedBytes += result.buffer.byteLength;\n }\n return result;\n });\n }\n detach() {\n this.privBuffers = undefined;\n return this.privAudioNode.detach();\n }\n replay() {\n if (this.privBuffers && 0 !== this.privBuffers.length) {\n this.privReplay = true;\n this.privReplayOffset = this.privLastShrinkOffset;\n }\n }\n // Shrinks the existing audio buffers to start at the new offset, or at the\n // beginning of the buffer closest to the requested offset.\n // A replay request will start from the last shrink point.\n shrinkBuffers(offset) {\n if (this.privBuffers === undefined || this.privBuffers.length === 0) {\n return;\n }\n this.privLastShrinkOffset = offset;\n // Find the start point in the buffers.\n // Offsets are in 100ns increments.\n // So how many bytes do we need to seek to get the right offset?\n const offsetToSeek = offset - this.privBufferStartOffset;\n let bytesToSeek = Math.round(offsetToSeek * this.privBytesPerSecond * 1e-7);\n let i = 0;\n while (i < this.privBuffers.length && bytesToSeek >= this.privBuffers[i].chunk.buffer.byteLength) {\n bytesToSeek -= this.privBuffers[i++].chunk.buffer.byteLength;\n }\n this.privBufferStartOffset = Math.round(offset - ((bytesToSeek / this.privBytesPerSecond) * 1e+7));\n this.privBuffers = this.privBuffers.slice(i);\n }\n // Finds the time a buffer of audio was first seen by offset.\n findTimeAtOffset(offset) {\n if (offset < this.privBufferStartOffset || this.privBuffers === undefined) {\n return 0;\n }\n for (const value of this.privBuffers) {\n const startOffset = (value.byteOffset / this.privBytesPerSecond) * 1e7;\n const endOffset = startOffset + ((value.chunk.buffer.byteLength / this.privBytesPerSecond) * 1e7);\n if (offset >= startOffset && offset <= endOffset) {\n return value.chunk.timeReceived;\n }\n }\n return 0;\n }\n}\n// Primary use of this class is to help debugging problems with the replay\n// code. If the memory cost of alloc / dealloc gets too much, drop it and just use\n// the ArrayBuffer directly.\n// tslint:disable-next-line:max-classes-per-file\nclass BufferEntry {\n constructor(chunk, serial, byteOffset) {\n this.chunk = chunk;\n this.serial = serial;\n this.byteOffset = byteOffset;\n }\n}\n\n//# sourceMappingURL=ReplayableAudioNode.js.map\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { HeaderNames } from \"../common.speech/HeaderNames\";\nimport { ArgumentNullError, BackgroundEvent, ConnectionClosedEvent, ConnectionErrorEvent, ConnectionEstablishedEvent, ConnectionMessageReceivedEvent, ConnectionMessageSentEvent, ConnectionOpenResponse, ConnectionStartEvent, ConnectionState, Deferred, Events, EventSource, MessageType, Queue, RawWebsocketMessage, } from \"../common/Exports\";\n// Node.JS specific web socket / browser support.\nimport ws from \"ws\";\nimport { CertCheckAgent } from \"./CertChecks\";\nexport class WebsocketMessageAdapter {\n constructor(uri, connectionId, messageFormatter, proxyInfo, headers, enableCompression) {\n this.open = () => {\n if (this.privConnectionState === ConnectionState.Disconnected) {\n return Promise.reject(`Cannot open a connection that is in ${this.privConnectionState} state`);\n }\n if (this.privConnectionEstablishDeferral) {\n return this.privConnectionEstablishDeferral.promise;\n }\n this.privConnectionEstablishDeferral = new Deferred();\n this.privCertificateValidatedDeferral = new Deferred();\n this.privConnectionState = ConnectionState.Connecting;\n try {\n if (typeof WebSocket !== \"undefined\" && !WebsocketMessageAdapter.forceNpmWebSocket) {\n // Browser handles cert checks.\n this.privCertificateValidatedDeferral.resolve();\n this.privWebsocketClient = new WebSocket(this.privUri);\n }\n else {\n const options = { headers: this.privHeaders, perMessageDeflate: this.privEnableCompression };\n // The ocsp library will handle validation for us and fail the connection if needed.\n this.privCertificateValidatedDeferral.resolve();\n const checkAgent = new CertCheckAgent(this.proxyInfo);\n options.agent = checkAgent.GetAgent();\n this.privWebsocketClient = new ws(this.privUri, options);\n }\n this.privWebsocketClient.binaryType = \"arraybuffer\";\n this.privReceivingMessageQueue = new Queue();\n this.privDisconnectDeferral = new Deferred();\n this.privSendMessageQueue = new Queue();\n this.processSendQueue().catch((reason) => {\n Events.instance.onEvent(new BackgroundEvent(reason));\n });\n }\n catch (error) {\n this.privConnectionEstablishDeferral.resolve(new ConnectionOpenResponse(500, error));\n return this.privConnectionEstablishDeferral.promise;\n }\n this.onEvent(new ConnectionStartEvent(this.privConnectionId, this.privUri));\n this.privWebsocketClient.onopen = (e) => {\n this.privCertificateValidatedDeferral.promise.then(() => {\n this.privConnectionState = ConnectionState.Connected;\n this.onEvent(new ConnectionEstablishedEvent(this.privConnectionId));\n this.privConnectionEstablishDeferral.resolve(new ConnectionOpenResponse(200, \"\"));\n }, (error) => {\n this.privConnectionEstablishDeferral.reject(error);\n });\n };\n this.privWebsocketClient.onerror = (e) => {\n this.onEvent(new ConnectionErrorEvent(this.privConnectionId, e.message, e.type));\n this.privLastErrorReceived = e.message;\n };\n this.privWebsocketClient.onclose = (e) => {\n if (this.privConnectionState === ConnectionState.Connecting) {\n this.privConnectionState = ConnectionState.Disconnected;\n // this.onEvent(new ConnectionEstablishErrorEvent(this.connectionId, e.code, e.reason));\n this.privConnectionEstablishDeferral.resolve(new ConnectionOpenResponse(e.code, e.reason + \" \" + this.privLastErrorReceived));\n }\n else {\n this.privConnectionState = ConnectionState.Disconnected;\n this.onEvent(new ConnectionClosedEvent(this.privConnectionId, e.code, e.reason));\n }\n this.onClose(e.code, e.reason).catch((reason) => {\n Events.instance.onEvent(new BackgroundEvent(reason));\n });\n };\n this.privWebsocketClient.onmessage = (e) => {\n const networkReceivedTime = new Date().toISOString();\n if (this.privConnectionState === ConnectionState.Connected) {\n const deferred = new Deferred();\n // let id = ++this.idCounter;\n this.privReceivingMessageQueue.enqueueFromPromise(deferred.promise);\n if (e.data instanceof ArrayBuffer) {\n const rawMessage = new RawWebsocketMessage(MessageType.Binary, e.data);\n this.privMessageFormatter\n .toConnectionMessage(rawMessage)\n .then((connectionMessage) => {\n this.onEvent(new ConnectionMessageReceivedEvent(this.privConnectionId, networkReceivedTime, connectionMessage));\n deferred.resolve(connectionMessage);\n }, (error) => {\n // TODO: Events for these ?\n deferred.reject(`Invalid binary message format. Error: ${error}`);\n });\n }\n else {\n const rawMessage = new RawWebsocketMessage(MessageType.Text, e.data);\n this.privMessageFormatter\n .toConnectionMessage(rawMessage)\n .then((connectionMessage) => {\n this.onEvent(new ConnectionMessageReceivedEvent(this.privConnectionId, networkReceivedTime, connectionMessage));\n deferred.resolve(connectionMessage);\n }, (error) => {\n // TODO: Events for these ?\n deferred.reject(`Invalid text message format. Error: ${error}`);\n });\n }\n }\n };\n return this.privConnectionEstablishDeferral.promise;\n };\n this.send = (message) => {\n if (this.privConnectionState !== ConnectionState.Connected) {\n return Promise.reject(`Cannot send on connection that is in ${ConnectionState[this.privConnectionState]} state`);\n }\n const messageSendStatusDeferral = new Deferred();\n const messageSendDeferral = new Deferred();\n this.privSendMessageQueue.enqueueFromPromise(messageSendDeferral.promise);\n this.privMessageFormatter\n .fromConnectionMessage(message)\n .then((rawMessage) => {\n messageSendDeferral.resolve({\n Message: message,\n RawWebsocketMessage: rawMessage,\n sendStatusDeferral: messageSendStatusDeferral,\n });\n }, (error) => {\n messageSendDeferral.reject(`Error formatting the message. ${error}`);\n });\n return messageSendStatusDeferral.promise;\n };\n this.read = () => {\n if (this.privConnectionState !== ConnectionState.Connected) {\n return Promise.reject(`Cannot read on connection that is in ${this.privConnectionState} state`);\n }\n return this.privReceivingMessageQueue.dequeue();\n };\n this.close = (reason) => {\n if (this.privWebsocketClient) {\n if (this.privConnectionState !== ConnectionState.Disconnected) {\n this.privWebsocketClient.close(1000, reason ? reason : \"Normal closure by client\");\n }\n }\n else {\n return Promise.resolve();\n }\n return this.privDisconnectDeferral.promise;\n };\n this.sendRawMessage = (sendItem) => {\n try {\n // indicates we are draining the queue and it came with no message;\n if (!sendItem) {\n return Promise.resolve();\n }\n this.onEvent(new ConnectionMessageSentEvent(this.privConnectionId, new Date().toISOString(), sendItem.Message));\n // add a check for the ws readystate in order to stop the red console error 'WebSocket is already in CLOSING or CLOSED state' appearing\n if (this.isWebsocketOpen) {\n this.privWebsocketClient.send(sendItem.RawWebsocketMessage.payload);\n }\n else {\n return Promise.reject(\"websocket send error: Websocket not ready \" + this.privConnectionId + \" \" + sendItem.Message.id + \" \" + new Error().stack);\n }\n return Promise.resolve();\n }\n catch (e) {\n return Promise.reject(`websocket send error: ${e}`);\n }\n };\n this.onEvent = (event) => {\n this.privConnectionEvents.onEvent(event);\n Events.instance.onEvent(event);\n };\n if (!uri) {\n throw new ArgumentNullError(\"uri\");\n }\n if (!messageFormatter) {\n throw new ArgumentNullError(\"messageFormatter\");\n }\n this.proxyInfo = proxyInfo;\n this.privConnectionEvents = new EventSource();\n this.privConnectionId = connectionId;\n this.privMessageFormatter = messageFormatter;\n this.privConnectionState = ConnectionState.None;\n this.privUri = uri;\n this.privHeaders = headers;\n this.privEnableCompression = enableCompression;\n // Add the connection ID to the headers\n this.privHeaders[HeaderNames.ConnectionId] = this.privConnectionId;\n this.privLastErrorReceived = \"\";\n }\n get state() {\n return this.privConnectionState;\n }\n get events() {\n return this.privConnectionEvents;\n }\n onClose(code, reason) {\n return __awaiter(this, void 0, void 0, function* () {\n const closeReason = `Connection closed. ${code}: ${reason}`;\n this.privConnectionState = ConnectionState.Disconnected;\n this.privDisconnectDeferral.resolve();\n yield this.privReceivingMessageQueue.drainAndDispose((pendingReceiveItem) => {\n // TODO: Events for these ?\n // Logger.instance.onEvent(new LoggingEvent(LogType.Warning, null, `Failed to process received message. Reason: ${closeReason}, Message: ${JSON.stringify(pendingReceiveItem)}`));\n }, closeReason);\n yield this.privSendMessageQueue.drainAndDispose((pendingSendItem) => {\n pendingSendItem.sendStatusDeferral.reject(closeReason);\n }, closeReason);\n });\n }\n processSendQueue() {\n return __awaiter(this, void 0, void 0, function* () {\n const itemToSend = this.privSendMessageQueue.dequeue();\n const sendItem = yield itemToSend;\n // indicates we are draining the queue and it came with no message;\n if (!sendItem) {\n return;\n }\n try {\n yield this.sendRawMessage(sendItem);\n sendItem.sendStatusDeferral.resolve();\n }\n catch (sendError) {\n sendItem.sendStatusDeferral.reject(sendError);\n }\n yield this.processSendQueue();\n });\n }\n get isWebsocketOpen() {\n return this.privWebsocketClient && this.privWebsocketClient.readyState === this.privWebsocketClient.OPEN;\n }\n}\nWebsocketMessageAdapter.forceNpmWebSocket = false;\n\n//# sourceMappingURL=WebsocketMessageAdapter.js.map\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { ArgumentNullError, createNoDashGuid, } from \"../common/Exports\";\nimport { WebsocketMessageAdapter } from \"./WebsocketMessageAdapter\";\nexport class WebsocketConnection {\n constructor(uri, queryParameters, headers, messageFormatter, proxyInfo, enableCompression = false, connectionId) {\n this.privIsDisposed = false;\n this.isDisposed = () => {\n return this.privIsDisposed;\n };\n this.state = () => {\n return this.privConnectionMessageAdapter.state;\n };\n this.open = () => {\n return this.privConnectionMessageAdapter.open();\n };\n this.send = (message) => {\n return this.privConnectionMessageAdapter.send(message);\n };\n this.read = () => {\n return this.privConnectionMessageAdapter.read();\n };\n if (!uri) {\n throw new ArgumentNullError(\"uri\");\n }\n if (!messageFormatter) {\n throw new ArgumentNullError(\"messageFormatter\");\n }\n this.privMessageFormatter = messageFormatter;\n let queryParams = \"\";\n let i = 0;\n if (queryParameters) {\n for (const paramName in queryParameters) {\n if (paramName) {\n queryParams += ((i === 0) && (uri.indexOf(\"?\") === -1)) ? \"?\" : \"&\";\n const val = encodeURIComponent(queryParameters[paramName]);\n queryParams += `${paramName}=${val}`;\n i++;\n }\n }\n }\n if (headers) {\n for (const headerName in headers) {\n if (headerName) {\n queryParams += ((i === 0) && (uri.indexOf(\"?\") === -1)) ? \"?\" : \"&\";\n const val = encodeURIComponent(headers[headerName]);\n queryParams += `${headerName}=${val}`;\n i++;\n }\n }\n }\n this.privUri = uri + queryParams;\n this.privId = connectionId ? connectionId : createNoDashGuid();\n this.privConnectionMessageAdapter = new WebsocketMessageAdapter(this.privUri, this.id, this.privMessageFormatter, proxyInfo, headers, enableCompression);\n }\n dispose() {\n return __awaiter(this, void 0, void 0, function* () {\n this.privIsDisposed = true;\n if (this.privConnectionMessageAdapter) {\n yield this.privConnectionMessageAdapter.close();\n }\n });\n }\n get id() {\n return this.privId;\n }\n get events() {\n return this.privConnectionMessageAdapter.events;\n }\n}\n\n//# sourceMappingURL=WebsocketConnection.js.map\n","var classof = require('../internals/classof-raw');\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nmodule.exports = function (value) {\n if (typeof value != 'number' && classof(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n};\n","var $ = require('../internals/export');\nvar global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\n\nvar wrap = function (scheduler) {\n return function (handler, timeout /* , ...arguments */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : undefined;\n return scheduler(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof handler == 'function' ? handler : Function(handler)).apply(this, args);\n } : handler, timeout);\n };\n};\n\n// ie9- setTimeout & setInterval additional parameters fix\n// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers\n$({ global: true, bind: true, forced: MSIE }, {\n // `setTimeout` method\n // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout\n setTimeout: wrap(global.setTimeout),\n // `setInterval` method\n // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval\n setInterval: wrap(global.setInterval)\n});\n","var $ = require('../internals/export');\n\n// `Date.now` method\n// https://tc39.github.io/ecma262/#sec-date.now\n$({ target: 'Date', stat: true }, {\n now: function now() {\n return new Date().getTime();\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { ArgumentNullError, Deferred } from \"../common/Exports\";\n// Node.JS specific xmlhttprequest / browser support.\nimport * as XHR from \"xmlhttprequest-ts\";\nexport var RestRequestType;\n(function (RestRequestType) {\n RestRequestType[\"Get\"] = \"get\";\n RestRequestType[\"Post\"] = \"post\";\n RestRequestType[\"Delete\"] = \"delete\";\n RestRequestType[\"File\"] = \"file\";\n})(RestRequestType || (RestRequestType = {}));\n// accept rest operations via request method and return abstracted objects from server response\nexport class RestMessageAdapter {\n constructor(configParams, connectionId) {\n if (!configParams) {\n throw new ArgumentNullError(\"configParams\");\n }\n this.privHeaders = configParams.headers;\n this.privTimeout = configParams.timeout;\n this.privIgnoreCache = configParams.ignoreCache;\n }\n setHeaders(key, value) {\n this.privHeaders[key] = value;\n }\n request(method, uri, queryParams = {}, body = null, binaryBody = null) {\n const responseReceivedDeferral = new Deferred();\n let xhr;\n if (typeof (XMLHttpRequest) === \"undefined\") {\n xhr = new XHR.XMLHttpRequest();\n }\n else {\n xhr = new XMLHttpRequest();\n }\n const requestCommand = method === RestRequestType.File ? \"post\" : method;\n xhr.open(requestCommand, this.withQuery(uri, queryParams), true);\n if (this.privHeaders) {\n Object.keys(this.privHeaders).forEach((key) => xhr.setRequestHeader(key, this.privHeaders[key]));\n }\n if (this.privIgnoreCache) {\n xhr.setRequestHeader(\"Cache-Control\", \"no-cache\");\n }\n xhr.timeout = this.privTimeout;\n xhr.onload = () => {\n responseReceivedDeferral.resolve(this.parseXHRResult(xhr));\n };\n xhr.onerror = () => {\n responseReceivedDeferral.resolve(this.errorResponse(xhr, \"Failed to make request.\"));\n };\n xhr.ontimeout = () => {\n responseReceivedDeferral.resolve(this.errorResponse(xhr, \"Request took longer than expected.\"));\n };\n if (method === RestRequestType.File && binaryBody) {\n xhr.setRequestHeader(\"Content-Type\", \"multipart/form-data\");\n xhr.send(binaryBody);\n }\n else if (method === RestRequestType.Post && body) {\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n xhr.send(JSON.stringify(body));\n }\n else {\n xhr.send();\n }\n return responseReceivedDeferral.promise;\n }\n parseXHRResult(xhr) {\n return {\n data: xhr.responseText,\n headers: xhr.getAllResponseHeaders(),\n json: () => JSON.parse(xhr.responseText),\n ok: xhr.status >= 200 && xhr.status < 300,\n status: xhr.status,\n statusText: xhr.statusText,\n };\n }\n errorResponse(xhr, message = null) {\n return {\n data: message || xhr.statusText,\n headers: xhr.getAllResponseHeaders(),\n json: () => JSON.parse(message || (\"\\\"\" + xhr.statusText + \"\\\"\")),\n ok: false,\n status: xhr.status,\n statusText: xhr.statusText,\n };\n }\n withQuery(url, params = {}) {\n const queryString = this.queryParams(params);\n return queryString ? url + (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + queryString : url;\n }\n queryParams(params = {}) {\n return Object.keys(params)\n .map((k) => encodeURIComponent(k) + \"=\" + encodeURIComponent(params[k]))\n .join(\"&\");\n }\n}\n\n//# sourceMappingURL=RestMessageAdapter.js.map\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nexport class RestConfigBase {\n static get requestOptions() {\n return RestConfigBase.privDefaultRequestOptions;\n }\n static get configParams() {\n return RestConfigBase.privDefaultParams;\n }\n static get restErrors() {\n return RestConfigBase.privRestErrors;\n }\n}\nRestConfigBase.privDefaultRequestOptions = {\n headers: {\n Accept: \"application/json\",\n },\n ignoreCache: false,\n timeout: 10000,\n};\nRestConfigBase.privRestErrors = {\n authInvalidSubscriptionKey: \"You must specify either an authentication token to use, or a Cognitive Speech subscription key.\",\n authInvalidSubscriptionRegion: \"You must specify the Cognitive Speech region to use.\",\n invalidArgs: \"Required input not found: {arg}.\",\n invalidCreateJoinConversationResponse: \"Creating/Joining conversation failed with HTTP {status}.\",\n invalidParticipantRequest: \"The requested participant was not found.\",\n permissionDeniedConnect: \"Required credentials not found.\",\n permissionDeniedConversation: \"Invalid operation: only the host can {command} the conversation.\",\n permissionDeniedParticipant: \"Invalid operation: only the host can {command} a participant.\",\n permissionDeniedSend: \"Invalid operation: the conversation is not in a connected state.\",\n permissionDeniedStart: \"Invalid operation: there is already an active conversation.\",\n};\nRestConfigBase.privDefaultParams = {\n apiVersion: \"api-version\",\n authorization: \"Authorization\",\n clientAppId: \"X-ClientAppId\",\n contentTypeKey: \"Content-Type\",\n correlationId: \"X-CorrelationId\",\n languageCode: \"language\",\n nickname: \"nickname\",\n profanity: \"profanity\",\n requestId: \"X-RequestId\",\n roomId: \"roomid\",\n sessionToken: \"token\",\n subscriptionKey: \"Ocp-Apim-Subscription-Key\",\n subscriptionRegion: \"Ocp-Apim-Subscription-Region\",\n token: \"X-CapitoToken\",\n};\n\n//# sourceMappingURL=RestConfigBase.js.map\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { EventType } from \"../common/Exports\";\nexport class ConsoleLoggingListener {\n constructor(logLevelFilter = EventType.Warning) {\n this.onEvent = (event) => {\n if (event.eventType >= this.privLogLevelFilter) {\n const log = this.toString(event);\n switch (event.eventType) {\n case EventType.Debug:\n // tslint:disable-next-line:no-console\n console.debug(log);\n break;\n case EventType.Info:\n // tslint:disable-next-line:no-console\n console.info(log);\n break;\n case EventType.Warning:\n // tslint:disable-next-line:no-console\n console.warn(log);\n break;\n case EventType.Error:\n // tslint:disable-next-line:no-console\n console.error(log);\n break;\n default:\n // tslint:disable-next-line:no-console\n console.log(log);\n break;\n }\n }\n };\n this.toString = (event) => {\n const logFragments = [\n `${event.EventTime}`,\n `${event.Name}`,\n ];\n for (const prop in event) {\n if (prop && event.hasOwnProperty(prop) &&\n prop !== \"eventTime\" && prop !== \"eventType\" &&\n prop !== \"eventId\" && prop !== \"name\" &&\n prop !== \"constructor\") {\n const value = event[prop];\n let valueToLog = \"\";\n if (value !== undefined && value !== null) {\n if (typeof (value) === \"number\" || typeof (value) === \"string\") {\n valueToLog = value.toString();\n }\n else {\n valueToLog = JSON.stringify(value);\n }\n }\n logFragments.push(`${prop}: ${valueToLog}`);\n }\n }\n return logFragments.join(\" | \");\n };\n this.privLogLevelFilter = logLevelFilter;\n }\n}\n\n//# sourceMappingURL=ConsoleLoggingListener.js.map\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { ConsoleLoggingListener } from \"./src/common.browser/Exports\";\nimport { Events } from \"./src/common/Exports\";\n// Common.Storage.SetLocalStorage(new Common.Browser.LocalStorage());\n// Common.Storage.SetSessionStorage(new Common.Browser.SessionStorage());\nEvents.instance.attachListener(new ConsoleLoggingListener());\n// Speech SDK API\nexport * from \"./src/sdk/Exports\";\n\n//# sourceMappingURL=microsoft.cognitiveservices.speech.sdk.js.map\n","'use strict';\nvar $ = require('../internals/export');\nvar toInteger = require('../internals/to-integer');\nvar thisNumberValue = require('../internals/this-number-value');\nvar repeat = require('../internals/string-repeat');\nvar fails = require('../internals/fails');\n\nvar nativeToFixed = 1.0.toFixed;\nvar floor = Math.floor;\n\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\nvar FORCED = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n$({ target: 'Number', proto: true, forced: FORCED }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow(2, 69, 1)) - 69;\n z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + repeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + repeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n});\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { PropertyId } from \"../sdk/Exports\";\nexport class ProxyInfo {\n constructor(proxyHostName, proxyPort, proxyUserName, proxyPassword) {\n this.privProxyHostName = proxyHostName;\n this.privProxyPort = proxyPort;\n this.privProxyUserName = proxyUserName;\n this.privProxyPassword = proxyPassword;\n }\n static fromParameters(parameters) {\n return new ProxyInfo(parameters.getProperty(PropertyId.SpeechServiceConnection_ProxyHostName), parseInt(parameters.getProperty(PropertyId.SpeechServiceConnection_ProxyPort), 10), parameters.getProperty(PropertyId.SpeechServiceConnection_ProxyUserName), parameters.getProperty(PropertyId.SpeechServiceConnection_ProxyPassword));\n }\n static fromRecognizerConfig(config) {\n return this.fromParameters(config.parameters);\n }\n get HostName() {\n return this.privProxyHostName;\n }\n get Port() {\n return this.privProxyPort;\n }\n get UserName() {\n return this.privProxyUserName;\n }\n get Password() {\n return this.privProxyPassword;\n }\n}\n\n//# sourceMappingURL=ProxyInfo.js.map\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { RiffPcmEncoder } from \"../common/Exports\";\nexport class PcmRecorder {\n constructor() {\n this.record = (context, mediaStream, outputStream) => {\n const desiredSampleRate = 16000;\n const scriptNode = (() => {\n let bufferSize = 0;\n try {\n return context.createScriptProcessor(bufferSize, 1, 1);\n }\n catch (error) {\n // Webkit (<= version 31) requires a valid bufferSize.\n bufferSize = 2048;\n let audioSampleRate = context.sampleRate;\n while (bufferSize < 16384 && audioSampleRate >= (2 * desiredSampleRate)) {\n bufferSize <<= 1;\n audioSampleRate >>= 1;\n }\n return context.createScriptProcessor(bufferSize, 1, 1);\n }\n })();\n const waveStreamEncoder = new RiffPcmEncoder(context.sampleRate, desiredSampleRate);\n let needHeader = true;\n const that = this;\n scriptNode.onaudioprocess = (event) => {\n const inputFrame = event.inputBuffer.getChannelData(0);\n if (outputStream && !outputStream.isClosed) {\n const waveFrame = waveStreamEncoder.encode(inputFrame);\n if (!!waveFrame) {\n outputStream.writeStreamChunk({\n buffer: waveFrame,\n isEnd: false,\n timeReceived: Date.now(),\n });\n needHeader = false;\n }\n }\n };\n const micInput = context.createMediaStreamSource(mediaStream);\n // https://webaudio.github.io/web-audio-api/#audioworklet\n // Using AudioWorklet to improve audio quality and avoid audio glitches due to blocking the UI thread\n if (!!this.privSpeechProcessorScript && !!context.audioWorklet) {\n context.audioWorklet\n .addModule(this.privSpeechProcessorScript)\n .then(() => {\n const workletNode = new AudioWorkletNode(context, \"speech-processor\");\n workletNode.port.onmessage = (ev) => {\n const inputFrame = ev.data;\n if (outputStream && !outputStream.isClosed) {\n const waveFrame = waveStreamEncoder.encode(inputFrame);\n if (!!waveFrame) {\n outputStream.writeStreamChunk({\n buffer: waveFrame,\n isEnd: false,\n timeReceived: Date.now(),\n });\n needHeader = false;\n }\n }\n };\n micInput.connect(workletNode);\n workletNode.connect(context.destination);\n this.privMediaResources = {\n scriptProcessorNode: workletNode,\n source: micInput,\n stream: mediaStream,\n };\n })\n .catch(() => {\n micInput.connect(scriptNode);\n scriptNode.connect(context.destination);\n this.privMediaResources = {\n scriptProcessorNode: scriptNode,\n source: micInput,\n stream: mediaStream,\n };\n });\n }\n else {\n micInput.connect(scriptNode);\n scriptNode.connect(context.destination);\n this.privMediaResources = {\n scriptProcessorNode: scriptNode,\n source: micInput,\n stream: mediaStream,\n };\n }\n };\n this.releaseMediaResources = (context) => {\n if (this.privMediaResources) {\n if (this.privMediaResources.scriptProcessorNode) {\n this.privMediaResources.scriptProcessorNode.disconnect(context.destination);\n this.privMediaResources.scriptProcessorNode = null;\n }\n if (this.privMediaResources.source) {\n this.privMediaResources.source.disconnect();\n this.privMediaResources.stream.getTracks().forEach((track) => track.stop());\n this.privMediaResources.source = null;\n }\n }\n };\n }\n setWorkletUrl(url) {\n this.privSpeechProcessorScript = url;\n }\n}\n\n//# sourceMappingURL=PCMRecorder.js.map\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { connectivity, type, } from \"../common.speech/Exports\";\nimport { AudioSourceErrorEvent, AudioSourceInitializingEvent, AudioSourceOffEvent, AudioSourceReadyEvent, AudioStreamNodeAttachedEvent, AudioStreamNodeAttachingEvent, AudioStreamNodeDetachedEvent, AudioStreamNodeErrorEvent, ChunkedArrayBufferStream, createNoDashGuid, Deferred, Events, EventSource, } from \"../common/Exports\";\nimport { AudioStreamFormat } from \"../sdk/Audio/AudioStreamFormat\";\nexport class FileAudioSource {\n constructor(file, audioSourceId) {\n this.privStreams = {};\n this.privHeaderEnd = 44;\n this.turnOn = () => {\n if (typeof FileReader === \"undefined\") {\n const errorMsg = \"Browser does not support FileReader.\";\n this.onEvent(new AudioSourceErrorEvent(errorMsg, \"\")); // initialization error - no streamid at this point\n return Promise.reject(errorMsg);\n }\n else if (this.privFile.name.lastIndexOf(\".wav\") !== this.privFile.name.length - 4) {\n const errorMsg = this.privFile.name + \" is not supported. Only WAVE files are allowed at the moment.\";\n this.onEvent(new AudioSourceErrorEvent(errorMsg, \"\"));\n return Promise.reject(errorMsg);\n }\n this.onEvent(new AudioSourceInitializingEvent(this.privId)); // no stream id\n this.onEvent(new AudioSourceReadyEvent(this.privId));\n return;\n };\n this.id = () => {\n return this.privId;\n };\n this.attach = (audioNodeId) => __awaiter(this, void 0, void 0, function* () {\n this.onEvent(new AudioStreamNodeAttachingEvent(this.privId, audioNodeId));\n const stream = yield this.upload(audioNodeId);\n this.onEvent(new AudioStreamNodeAttachedEvent(this.privId, audioNodeId));\n return Promise.resolve({\n detach: () => __awaiter(this, void 0, void 0, function* () {\n stream.readEnded();\n delete this.privStreams[audioNodeId];\n this.onEvent(new AudioStreamNodeDetachedEvent(this.privId, audioNodeId));\n yield this.turnOff();\n }),\n id: () => {\n return audioNodeId;\n },\n read: () => {\n return stream.read();\n },\n });\n });\n this.detach = (audioNodeId) => {\n if (audioNodeId && this.privStreams[audioNodeId]) {\n this.privStreams[audioNodeId].close();\n delete this.privStreams[audioNodeId];\n this.onEvent(new AudioStreamNodeDetachedEvent(this.privId, audioNodeId));\n }\n };\n this.turnOff = () => {\n for (const streamId in this.privStreams) {\n if (streamId) {\n const stream = this.privStreams[streamId];\n if (stream && !stream.isClosed) {\n stream.close();\n }\n }\n }\n this.onEvent(new AudioSourceOffEvent(this.privId)); // no stream now\n return Promise.resolve();\n };\n this.onEvent = (event) => {\n this.privEvents.onEvent(event);\n Events.instance.onEvent(event);\n };\n this.privId = audioSourceId ? audioSourceId : createNoDashGuid();\n this.privEvents = new EventSource();\n this.privFile = file;\n // Read the header.\n this.privAudioFormatPromise = this.readHeader();\n }\n get format() {\n return this.privAudioFormatPromise;\n }\n get blob() {\n return Promise.resolve(this.privFile);\n }\n get events() {\n return this.privEvents;\n }\n get deviceInfo() {\n return this.privAudioFormatPromise.then((result) => {\n return Promise.resolve({\n bitspersample: result.bitsPerSample,\n channelcount: result.channels,\n connectivity: connectivity.Unknown,\n manufacturer: \"Speech SDK\",\n model: \"File\",\n samplerate: result.samplesPerSec,\n type: type.File,\n });\n });\n }\n readHeader() {\n // Read the wave header.\n const maxHeaderSize = 128;\n const header = this.privFile.slice(0, maxHeaderSize);\n const headerReader = new FileReader();\n const headerResult = new Deferred();\n const processHeader = (event) => {\n const header = event.target.result;\n const view = new DataView(header);\n const getWord = (index) => {\n return String.fromCharCode(view.getUint8(index), view.getUint8(index + 1), view.getUint8(index + 2), view.getUint8(index + 3));\n };\n // RIFF 4 bytes.\n if (\"RIFF\" !== getWord(0)) {\n headerResult.reject(\"Invalid WAV header in file, RIFF was not found\");\n }\n // length, 4 bytes\n // RIFF Type & fmt 8 bytes\n if (\"WAVE\" !== getWord(8) || \"fmt \" !== getWord(12)) {\n headerResult.reject(\"Invalid WAV header in file, WAVEfmt was not found\");\n }\n const formatSize = view.getInt32(16, true);\n const channelCount = view.getUint16(22, true);\n const sampleRate = view.getUint32(24, true);\n const bitsPerSample = view.getUint16(34, true);\n // Confirm if header is 44 bytes long.\n let pos = 36 + Math.max(formatSize - 16, 0);\n for (; getWord(pos) !== \"data\"; pos += 2) {\n if (pos > maxHeaderSize - 8) {\n headerResult.reject(\"Invalid WAV header in file, data block was not found\");\n }\n }\n this.privHeaderEnd = pos + 8;\n headerResult.resolve(AudioStreamFormat.getWaveFormatPCM(sampleRate, bitsPerSample, channelCount));\n };\n headerReader.onload = processHeader;\n headerReader.readAsArrayBuffer(header);\n return headerResult.promise;\n }\n upload(audioNodeId) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.turnOn();\n const format = yield this.privAudioFormatPromise;\n const reader = new FileReader();\n const stream = new ChunkedArrayBufferStream(format.avgBytesPerSec / 10, audioNodeId);\n this.privStreams[audioNodeId] = stream;\n const processFile = (event) => {\n if (stream.isClosed) {\n return; // output stream was closed (somebody called TurnOff). We're done here.\n }\n stream.writeStreamChunk({\n buffer: reader.result,\n isEnd: false,\n timeReceived: Date.now(),\n });\n stream.close();\n };\n reader.onload = processFile;\n reader.onerror = (event) => {\n const errorMsg = `Error occurred while processing '${this.privFile.name}'. ${event}`;\n this.onEvent(new AudioStreamNodeErrorEvent(this.privId, audioNodeId, errorMsg));\n throw new Error(errorMsg);\n };\n const chunk = this.privFile.slice(this.privHeaderEnd);\n reader.readAsArrayBuffer(chunk);\n return stream;\n });\n }\n}\n\n//# sourceMappingURL=FileAudioSource.js.map\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { connectivity, type } from \"../common.speech/Exports\";\nimport { AudioSourceErrorEvent, AudioSourceInitializingEvent, AudioSourceOffEvent, AudioSourceReadyEvent, AudioStreamNodeAttachedEvent, AudioStreamNodeAttachingEvent, AudioStreamNodeDetachedEvent, AudioStreamNodeErrorEvent, ChunkedArrayBufferStream, createNoDashGuid, Deferred, Events, EventSource, } from \"../common/Exports\";\nimport { AudioStreamFormat, AudioStreamFormatImpl, } from \"../sdk/Audio/AudioStreamFormat\";\nexport const AudioWorkletSourceURLPropertyName = \"MICROPHONE-WorkletSourceUrl\";\nexport class MicAudioSource {\n constructor(privRecorder, deviceId, audioSourceId, mediaStream) {\n this.privRecorder = privRecorder;\n this.deviceId = deviceId;\n this.privStreams = {};\n this.turnOn = () => {\n if (this.privInitializeDeferral) {\n return this.privInitializeDeferral.promise;\n }\n this.privInitializeDeferral = new Deferred();\n try {\n this.createAudioContext();\n }\n catch (error) {\n if (error instanceof Error) {\n const typedError = error;\n this.privInitializeDeferral.reject(typedError.name + \": \" + typedError.message);\n }\n else {\n this.privInitializeDeferral.reject(error);\n }\n return this.privInitializeDeferral.promise;\n }\n const nav = window.navigator;\n let getUserMedia = (nav.getUserMedia ||\n nav.webkitGetUserMedia ||\n nav.mozGetUserMedia ||\n nav.msGetUserMedia);\n if (!!nav.mediaDevices) {\n getUserMedia = (constraints, successCallback, errorCallback) => {\n nav.mediaDevices\n .getUserMedia(constraints)\n .then(successCallback)\n .catch(errorCallback);\n };\n }\n if (!getUserMedia) {\n const errorMsg = \"Browser does not support getUserMedia.\";\n this.privInitializeDeferral.reject(errorMsg);\n this.onEvent(new AudioSourceErrorEvent(errorMsg, \"\")); // mic initialized error - no streamid at this point\n }\n else {\n const next = () => {\n this.onEvent(new AudioSourceInitializingEvent(this.privId)); // no stream id\n if (this.privMediaStream && this.privMediaStream.active) {\n this.onEvent(new AudioSourceReadyEvent(this.privId));\n this.privInitializeDeferral.resolve();\n }\n else {\n getUserMedia({ audio: this.deviceId ? { deviceId: this.deviceId } : true, video: false }, (mediaStream) => {\n this.privMediaStream = mediaStream;\n this.onEvent(new AudioSourceReadyEvent(this.privId));\n this.privInitializeDeferral.resolve();\n }, (error) => {\n const errorMsg = `Error occurred during microphone initialization: ${error}`;\n this.privInitializeDeferral.reject(errorMsg);\n this.onEvent(new AudioSourceErrorEvent(this.privId, errorMsg));\n });\n }\n };\n if (this.privContext.state === \"suspended\") {\n // NOTE: On iOS, the Web Audio API requires sounds to be triggered from an explicit user action.\n // https://github.com/WebAudio/web-audio-api/issues/790\n this.privContext.resume()\n .then(next)\n .catch((reason) => {\n this.privInitializeDeferral.reject(`Failed to initialize audio context: ${reason}`);\n });\n }\n else {\n next();\n }\n }\n return this.privInitializeDeferral.promise;\n };\n this.id = () => {\n return this.privId;\n };\n this.attach = (audioNodeId) => {\n this.onEvent(new AudioStreamNodeAttachingEvent(this.privId, audioNodeId));\n return this.listen(audioNodeId).then((stream) => {\n this.onEvent(new AudioStreamNodeAttachedEvent(this.privId, audioNodeId));\n return {\n detach: () => __awaiter(this, void 0, void 0, function* () {\n stream.readEnded();\n delete this.privStreams[audioNodeId];\n this.onEvent(new AudioStreamNodeDetachedEvent(this.privId, audioNodeId));\n return this.turnOff();\n }),\n id: () => {\n return audioNodeId;\n },\n read: () => {\n return stream.read();\n },\n };\n });\n };\n this.detach = (audioNodeId) => {\n if (audioNodeId && this.privStreams[audioNodeId]) {\n this.privStreams[audioNodeId].close();\n delete this.privStreams[audioNodeId];\n this.onEvent(new AudioStreamNodeDetachedEvent(this.privId, audioNodeId));\n }\n };\n this.listen = (audioNodeId) => __awaiter(this, void 0, void 0, function* () {\n yield this.turnOn();\n const stream = new ChunkedArrayBufferStream(this.privOutputChunkSize, audioNodeId);\n this.privStreams[audioNodeId] = stream;\n try {\n this.privRecorder.record(this.privContext, this.privMediaStream, stream);\n }\n catch (error) {\n this.onEvent(new AudioStreamNodeErrorEvent(this.privId, audioNodeId, error));\n throw error;\n }\n const result = stream;\n return result;\n });\n this.onEvent = (event) => {\n this.privEvents.onEvent(event);\n Events.instance.onEvent(event);\n };\n this.createAudioContext = () => {\n if (!!this.privContext) {\n return;\n }\n this.privContext = AudioStreamFormatImpl.getAudioContext(MicAudioSource.AUDIOFORMAT.samplesPerSec);\n };\n this.privOutputChunkSize = MicAudioSource.AUDIOFORMAT.avgBytesPerSec / 10;\n this.privId = audioSourceId ? audioSourceId : createNoDashGuid();\n this.privEvents = new EventSource();\n this.privMediaStream = mediaStream || null;\n }\n get format() {\n return Promise.resolve(MicAudioSource.AUDIOFORMAT);\n }\n get blob() {\n return Promise.reject(\"Not implemented for Mic input\");\n }\n turnOff() {\n return __awaiter(this, void 0, void 0, function* () {\n for (const streamId in this.privStreams) {\n if (streamId) {\n const stream = this.privStreams[streamId];\n if (stream) {\n stream.close();\n }\n }\n }\n this.onEvent(new AudioSourceOffEvent(this.privId)); // no stream now\n this.privInitializeDeferral = null;\n yield this.destroyAudioContext();\n return;\n });\n }\n get events() {\n return this.privEvents;\n }\n get deviceInfo() {\n return this.getMicrophoneLabel().then((label) => {\n return {\n bitspersample: MicAudioSource.AUDIOFORMAT.bitsPerSample,\n channelcount: MicAudioSource.AUDIOFORMAT.channels,\n connectivity: connectivity.Unknown,\n manufacturer: \"Speech SDK\",\n model: label,\n samplerate: MicAudioSource.AUDIOFORMAT.samplesPerSec,\n type: type.Microphones,\n };\n });\n }\n setProperty(name, value) {\n if (name === AudioWorkletSourceURLPropertyName) {\n this.privRecorder.setWorkletUrl(value);\n }\n else {\n throw new Error(\"Property '\" + name + \"' is not supported on Microphone.\");\n }\n }\n getMicrophoneLabel() {\n const defaultMicrophoneName = \"microphone\";\n // If we did this already, return the value.\n if (this.privMicrophoneLabel !== undefined) {\n return Promise.resolve(this.privMicrophoneLabel);\n }\n // If the stream isn't currently running, we can't query devices because security.\n if (this.privMediaStream === undefined || !this.privMediaStream.active) {\n return Promise.resolve(defaultMicrophoneName);\n }\n // Setup a default\n this.privMicrophoneLabel = defaultMicrophoneName;\n // Get the id of the device running the audio track.\n const microphoneDeviceId = this.privMediaStream.getTracks()[0].getSettings().deviceId;\n // If the browser doesn't support getting the device ID, set a default and return.\n if (undefined === microphoneDeviceId) {\n return Promise.resolve(this.privMicrophoneLabel);\n }\n const deferred = new Deferred();\n // Enumerate the media devices.\n navigator.mediaDevices.enumerateDevices().then((devices) => {\n for (const device of devices) {\n if (device.deviceId === microphoneDeviceId) {\n // Found the device\n this.privMicrophoneLabel = device.label;\n break;\n }\n }\n deferred.resolve(this.privMicrophoneLabel);\n }, () => deferred.resolve(this.privMicrophoneLabel));\n return deferred.promise;\n }\n destroyAudioContext() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.privContext) {\n return;\n }\n this.privRecorder.releaseMediaResources(this.privContext);\n // This pattern brought to you by a bug in the TypeScript compiler where it\n // confuses the (\"close\" in this.privContext) with this.privContext always being null as the alternate.\n // https://github.com/Microsoft/TypeScript/issues/11498\n let hasClose = false;\n if (\"close\" in this.privContext) {\n hasClose = true;\n }\n if (hasClose) {\n yield this.privContext.close();\n this.privContext = null;\n }\n else if (null !== this.privContext && this.privContext.state === \"running\") {\n // Suspend actually takes a callback, but analogous to the\n // resume method, it'll be only fired if suspend is called\n // in a direct response to a user action. The later is not always\n // the case, as TurnOff is also called, when we receive an\n // end-of-speech message from the service. So, doing a best effort\n // fire-and-forget here.\n yield this.privContext.suspend();\n }\n });\n }\n}\nMicAudioSource.AUDIOFORMAT = AudioStreamFormat.getDefaultInputFormat();\n\n//# sourceMappingURL=MicAudioSource.js.map\n","// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as tls from \"tls\";\nimport * as url from \"url\";\nimport * as ocsp from \"../../external/ocsp/ocsp\";\nimport { Events, OCSPCacheEntryExpiredEvent, OCSPCacheEntryNeedsRefreshEvent, OCSPCacheFetchErrorEvent, OCSPCacheHitEvent, OCSPCacheMissEvent, OCSPCacheUpdatehCompleteEvent, OCSPCacheUpdateNeededEvent, OCSPDiskCacheHitEvent, OCSPDiskCacheStoreEvent, OCSPMemoryCacheHitEvent, OCSPMemoryCacheStoreEvent, OCSPResponseRetrievedEvent, OCSPStapleReceivedEvent, OCSPVerificationFailedEvent } from \"../common/Exports\";\nimport Agent from \"agent-base\";\n// @ts-ignore\nimport Cache from \"async-disk-cache\";\nimport HttpsProxyAgent from \"https-proxy-agent\";\nimport * as net from \"net\";\nimport { OCSPCacheUpdateErrorEvent } from \"../common/OCSPEvents\";\nexport class CertCheckAgent {\n constructor(proxyInfo) {\n if (!!proxyInfo) {\n this.privProxyInfo = proxyInfo;\n }\n // Initialize this here to allow tests to set the env variable before the cache is constructed.\n if (!CertCheckAgent.privDiskCache) {\n CertCheckAgent.privDiskCache = new Cache(\"microsoft-cognitiveservices-speech-sdk-cache\", { supportBuffer: true, location: (typeof process !== \"undefined\" && !!process.env.SPEECH_OCSP_CACHE_ROOT) ? process.env.SPEECH_OCSP_CACHE_ROOT : undefined });\n }\n }\n // Test hook to force the disk cache to be recreated.\n static forceReinitDiskCache() {\n CertCheckAgent.privDiskCache = undefined;\n CertCheckAgent.privMemCache = {};\n }\n GetAgent(disableStapling) {\n const agent = new Agent.Agent(this.CreateConnection);\n if (this.privProxyInfo !== undefined &&\n this.privProxyInfo.HostName !== undefined &&\n this.privProxyInfo.Port > 0) {\n const proxyName = \"privProxyInfo\";\n agent[proxyName] = this.privProxyInfo;\n }\n return agent;\n }\n static GetProxyAgent(proxyInfo) {\n const httpProxyOptions = {\n host: proxyInfo.HostName,\n port: proxyInfo.Port,\n };\n if (!!proxyInfo.UserName) {\n httpProxyOptions.headers = {\n \"Proxy-Authentication\": \"Basic \" + new Buffer(proxyInfo.UserName + \":\" + (proxyInfo.Password === undefined) ? \"\" : proxyInfo.Password).toString(\"base64\"),\n };\n }\n else {\n httpProxyOptions.headers = {};\n }\n httpProxyOptions.headers.requestOCSP = \"true\";\n const httpProxyAgent = new HttpsProxyAgent(httpProxyOptions);\n return httpProxyAgent;\n }\n static OCSPCheck(socketPromise, proxyInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n let ocspRequest;\n let stapling;\n let resolved = false;\n const socket = yield socketPromise;\n socket.cork();\n const tlsSocket = socket;\n return new Promise((resolve, reject) => {\n socket.on(\"OCSPResponse\", (data) => {\n if (!!data) {\n this.onEvent(new OCSPStapleReceivedEvent());\n stapling = data;\n }\n });\n socket.on(\"error\", (error) => {\n if (!resolved) {\n resolved = true;\n socket.destroy();\n reject(error);\n }\n });\n tlsSocket.on(\"secure\", () => __awaiter(this, void 0, void 0, function* () {\n const peer = tlsSocket.getPeerCertificate(true);\n try {\n const issuer = yield this.GetIssuer(peer);\n // We always need a request to verify the response.\n ocspRequest = ocsp.request.generate(peer.raw, issuer.raw);\n // Do we have a result for this certificate in our memory cache?\n const sig = ocspRequest.id.toString(\"hex\");\n // Stapled response trumps cached response.\n if (!stapling) {\n const cacheEntry = yield CertCheckAgent.GetResponseFromCache(sig, ocspRequest, proxyInfo);\n stapling = cacheEntry;\n }\n yield this.VerifyOCSPResponse(stapling, ocspRequest, proxyInfo);\n socket.uncork();\n resolved = true;\n resolve(socket);\n }\n catch (e) {\n socket.destroy();\n resolved = true;\n reject(e);\n }\n }));\n });\n });\n }\n static GetIssuer(peer) {\n if (peer.issuerCertificate) {\n return Promise.resolve(peer.issuerCertificate);\n }\n return new Promise((resolve, reject) => {\n const ocspAgent = new ocsp.Agent({});\n ocspAgent.fetchIssuer(peer, null, (error, value) => {\n if (!!error) {\n reject(error);\n return;\n }\n resolve(value);\n });\n });\n }\n static GetResponseFromCache(signature, ocspRequest, proxyInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n let cachedResponse = CertCheckAgent.privMemCache[signature];\n if (!!cachedResponse) {\n this.onEvent(new OCSPMemoryCacheHitEvent(signature));\n }\n // Do we have a result for this certificate on disk in %TMP%?\n if (!cachedResponse) {\n try {\n const diskCacheResponse = yield CertCheckAgent.privDiskCache.get(signature);\n if (!!diskCacheResponse.isCached) {\n CertCheckAgent.onEvent(new OCSPDiskCacheHitEvent(signature));\n CertCheckAgent.StoreMemoryCacheEntry(signature, diskCacheResponse.value);\n cachedResponse = diskCacheResponse.value;\n }\n }\n catch (error) {\n cachedResponse = null;\n }\n }\n if (!cachedResponse) {\n return cachedResponse;\n }\n try {\n const cachedOcspResponse = ocsp.utils.parseResponse(cachedResponse);\n const tbsData = cachedOcspResponse.value.tbsResponseData;\n if (tbsData.responses.length < 1) {\n this.onEvent(new OCSPCacheFetchErrorEvent(signature, \"Not enough data in cached response\"));\n return;\n }\n const cachedStartTime = tbsData.responses[0].thisUpdate;\n const cachedNextTime = tbsData.responses[0].nextUpdate;\n if (cachedNextTime < (Date.now() + this.testTimeOffset - 60000)) {\n // Cached entry has expired.\n this.onEvent(new OCSPCacheEntryExpiredEvent(signature, cachedNextTime));\n cachedResponse = null;\n }\n else {\n // If we're within one day of the next update, or 50% of the way through the validity period,\n // background an update to the cache.\n const minUpdate = Math.min(24 * 60 * 60 * 1000, (cachedNextTime - cachedStartTime) / 2);\n if ((cachedNextTime - (Date.now() + this.testTimeOffset)) < minUpdate) {\n this.onEvent(new OCSPCacheEntryNeedsRefreshEvent(signature, cachedStartTime, cachedNextTime));\n this.UpdateCache(ocspRequest, proxyInfo).catch((error) => {\n // Well, not much we can do here.\n this.onEvent(new OCSPCacheUpdateErrorEvent(signature, error.toString()));\n });\n }\n else {\n this.onEvent(new OCSPCacheHitEvent(signature, cachedStartTime, cachedNextTime));\n }\n }\n }\n catch (error) {\n this.onEvent(new OCSPCacheFetchErrorEvent(signature, error));\n cachedResponse = null;\n }\n if (!cachedResponse) {\n this.onEvent(new OCSPCacheMissEvent(signature));\n }\n return cachedResponse;\n });\n }\n static VerifyOCSPResponse(cacheValue, ocspRequest, proxyInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n let ocspResponse = cacheValue;\n const sig = ocspRequest.certID.toString(\"hex\");\n // Do we have a valid response?\n if (!ocspResponse) {\n ocspResponse = yield CertCheckAgent.GetOCSPResponse(ocspRequest, proxyInfo);\n }\n return new Promise((resolve, reject) => {\n ocsp.verify({ request: ocspRequest, response: ocspResponse }, (error, result) => {\n if (!!error) {\n CertCheckAgent.onEvent(new OCSPVerificationFailedEvent(ocspRequest.id.toString(\"hex\"), error));\n // Bad Cached Value? One more try without the cache.\n if (!!cacheValue) {\n this.VerifyOCSPResponse(null, ocspRequest, proxyInfo).then(() => {\n resolve();\n }, (error) => {\n reject(error);\n });\n }\n else {\n reject(error);\n }\n }\n else {\n if (!cacheValue) {\n CertCheckAgent.StoreCacheEntry(ocspRequest.id.toString(\"hex\"), ocspResponse);\n }\n resolve();\n }\n });\n });\n });\n }\n static UpdateCache(req, proxyInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n const signature = req.id.toString(\"hex\");\n this.onEvent(new OCSPCacheUpdateNeededEvent(signature));\n const rawResponse = yield this.GetOCSPResponse(req, proxyInfo);\n this.StoreCacheEntry(signature, rawResponse);\n this.onEvent(new OCSPCacheUpdatehCompleteEvent(req.id.toString(\"hex\")));\n });\n }\n static StoreCacheEntry(sig, rawResponse) {\n this.StoreMemoryCacheEntry(sig, rawResponse);\n this.StoreDiskCacheEntry(sig, rawResponse);\n }\n static StoreMemoryCacheEntry(sig, rawResponse) {\n this.privMemCache[sig] = rawResponse;\n this.onEvent(new OCSPMemoryCacheStoreEvent(sig));\n }\n static StoreDiskCacheEntry(sig, rawResponse) {\n this.privDiskCache.set(sig, rawResponse).then(() => {\n this.onEvent(new OCSPDiskCacheStoreEvent(sig));\n });\n }\n static GetOCSPResponse(req, proxyInfo) {\n const ocspMethod = \"1.3.6.1.5.5.7.48.1\";\n let options = {};\n if (!!proxyInfo) {\n const agent = CertCheckAgent.GetProxyAgent(proxyInfo);\n options.agent = agent;\n }\n return new Promise((resolve, reject) => {\n ocsp.utils.getAuthorityInfo(req.cert, ocspMethod, (error, uri) => {\n if (error) {\n reject(error);\n return;\n }\n const parsedUri = url.parse(uri);\n options = Object.assign(Object.assign({}, options), parsedUri);\n ocsp.utils.getResponse(options, req.data, (error, raw) => {\n if (error) {\n reject(error);\n return;\n }\n this.onEvent(new OCSPResponseRetrievedEvent(req.certID.toString(\"hex\")));\n resolve(raw);\n });\n });\n });\n }\n CreateConnection(request, options) {\n const enableOCSP = (typeof process !== \"undefined\" && process.env.NODE_TLS_REJECT_UNAUTHORIZED !== \"0\" && process.env.SPEECH_CONDUCT_OCSP_CHECK !== \"0\") && options.secureEndpoint;\n let socketPromise;\n options = Object.assign(Object.assign({}, options), {\n requestOCSP: !CertCheckAgent.forceDisableOCSPStapling,\n servername: options.host\n });\n if (!!this.privProxyInfo) {\n const httpProxyAgent = CertCheckAgent.GetProxyAgent(this.privProxyInfo);\n const baseAgent = httpProxyAgent;\n socketPromise = new Promise((resolve, reject) => {\n baseAgent.callback(request, options, (error, socket) => {\n if (!!error) {\n reject(error);\n }\n else {\n resolve(socket);\n }\n });\n });\n }\n else {\n if (!!options.secureEndpoint) {\n socketPromise = Promise.resolve(tls.connect(options));\n }\n else {\n socketPromise = Promise.resolve(net.connect(options));\n }\n }\n if (!!enableOCSP) {\n return CertCheckAgent.OCSPCheck(socketPromise, this.privProxyInfo);\n }\n else {\n return socketPromise;\n }\n }\n}\n// Test hook to enable forcing expiration / refresh to happen.\nCertCheckAgent.testTimeOffset = 0;\n// Test hook to disable stapling for cache testing.\nCertCheckAgent.forceDisableOCSPStapling = false;\n// An in memory cache for recived responses.\nCertCheckAgent.privMemCache = {};\nCertCheckAgent.onEvent = (event) => {\n Events.instance.onEvent(event);\n};\n\n//# sourceMappingURL=CertChecks.js.map\n"],"sourceRoot":""}