{"version":3,"sources":["webpack:///./node_modules/core-js/internals/native-url.js","webpack:///../../../src/components/VGrid/VRow.ts","webpack:///./node_modules/core-js/modules/web.url.js","webpack:///../../../src/components/VRadioGroup/VRadioGroup.ts","webpack:///../../../src/mixins/rippleable/index.ts","webpack:///./node_modules/core-js/internals/string-punycode-to-ascii.js","webpack:///../../../src/components/VGrid/VCol.ts","webpack:///../../../src/components/VRadioGroup/VRadio.ts","webpack:///./src/components/common/VideoRecorder.vue?f203","webpack:///./src/components/common/VideoRecorder.vue","webpack:///./src/components/common/VideoRecorder.vue?0808","webpack:///./src/components/common/VideoRecorder.vue?b93a","webpack:///./src/core/utils/videoRecorder.ts","webpack:///./node_modules/core-js/modules/web.url-search-params.js","webpack:///./node_modules/core-js/internals/get-iterator.js","webpack:///./node_modules/recordrtc/RecordRTC.js","webpack:///./src/views/recorder/components/DeviceSelect.vue?81b2","webpack:///./src/views/recorder/components/DeviceSelect.vue","webpack:///./src/views/recorder/components/DeviceSelect.vue?0ac9","webpack:///./src/views/recorder/components/DeviceSelect.vue?4f3e","webpack:///../../../src/components/VCheckbox/VCheckbox.ts","webpack:///./src/views/recorder/lib/devices.ts","webpack:///../../../src/mixins/selectable/index.ts"],"names":["fails","wellKnownSymbol","IS_PURE","ITERATOR","module","exports","url","URL","searchParams","result","pathname","forEach","value","key","toJSON","sort","href","get","String","URLSearchParams","username","host","hash","undefined","breakpoints","ALIGNMENT","makeProps","prefix","def","reduce","props","val","upperFirst","alignValidator","str","includes","alignProps","type","default","validator","justifyValidator","justifyProps","alignContentValidator","alignContentProps","propMap","align","Object","keys","justify","alignContent","classMap","breakpointClass","prop","className","breakpoint","replace","toLowerCase","cache","Map","Vue","extend","name","functional","tag","dense","Boolean","noGutters","render","h","data","children","cacheKey","classList","push","set","mergeData","staticClass","class","EOF","$","DESCRIPTORS","USE_NATIVE_URL","global","defineProperties","redefine","anInstance","has","assign","arrayFrom","codeAt","toASCII","setToStringTag","URLSearchParamsModule","InternalStateModule","NativeURL","getInternalSearchParamsState","getState","setInternalState","getInternalURLState","getterFor","floor","Math","pow","INVALID_AUTHORITY","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","parseHost","input","codePoints","index","charAt","length","parseIPv6","slice","isSpecial","test","parseIPv4","percentEncode","C0ControlPercentEncodeSet","partsLength","numbers","part","radix","number","ipv4","parts","split","pop","parseInt","numbersSeen","ipv4Piece","swaps","swap","address","pieceIndex","compress","pointer","char","findLongestZeroSequence","ipv6","maxIndex","maxLength","currStart","currLength","serializeHost","ignore0","unshift","join","toString","fragmentPercentEncodeSet","pathPercentEncodeSet","userinfoPercentEncodeSet","code","encodeURIComponent","specialSchemes","ftp","file","http","https","ws","wss","scheme","includesCredentials","password","cannotHaveUsernamePasswordPort","cannotBeABaseURL","isWindowsDriveLetter","string","normalized","second","startsWithWindowsDriveLetter","third","shortenURLsPath","path","pathSize","isSingleDot","segment","isDoubleDot","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","parseURL","stateOverride","base","bufferCodePoints","failure","state","buffer","seenAt","seenBracket","seenPasswordToken","port","query","fragment","i","codePoint","encodedCodePoints","shift","URLConstructor","baseState","that","this","arguments","urlString","TypeError","searchParamsState","updateSearchParams","updateURL","serializeURL","call","origin","getOrigin","protocol","getProtocol","getUsername","getPassword","getHost","hostname","getHostname","getPort","getPathname","search","getSearch","getSearchParams","getHash","URLPrototype","prototype","output","error","accessorDescriptor","getter","setter","configurable","enumerable","nativeCreateObjectURL","createObjectURL","nativeRevokeObjectURL","revokeObjectURL","blob","apply","forced","sham","baseMixins","mixins","BaseItemGroup","VInput","provide","radioGroup","column","height","Number","row","computed","classes","options","methods","genDefaultSlot","$createElement","attrs","id","role","computedId","genInputSlot","on","click","genLabel","label","for","onClick","vnode","_b","attrs$","directives","ripple","genRipple","center","maxInt","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexNonASCII","regexSeparators","OVERFLOW_ERROR","baseMinusTMin","stringFromCharCode","fromCharCode","ucs2decode","counter","charCodeAt","extra","digitToBasic","digit","adapt","delta","numPoints","firstTime","k","encode","currentValue","inputLength","n","bias","basicLength","handledCPCount","m","handledCPCountPlusOne","RangeError","q","t","qMinusT","baseMinusT","encoded","labels","breakpointProps","offsetProps","orderProps","col","offset","order","cols","alignSelf","parent","hasColClasses","some","startsWith","BindsAttrs","Colorable","Rippleable","GroupableFactory","Themeable","inheritAttrs","disabled","offIcon","onIcon","readonly","isFocused","isDisabled","themeClasses","groupClasses","computedColor","Selectable","computedIcon","isActive","hasLabel","hasState","isReadonly","computedName","_uid","rippleState","validationState","genInput","args","VLabel","prevent","color","focused","getSlot","genRadio","radioAttrs","title","VIcon","setTextColor","onFocus","e","$emit","onBlur","onChange","toggle","onKeydown","mergeListeners","listeners$","_vm","_h","_c","_self","VDialog","model","callback","$$v","isTooBig","expression","VCard","_v","_s","$t","staticStyle","VDivider","VSpacer","VBtn","$event","VRow","VCol","video_recorder__flipped","flipped","_e","overtime","isTimed","elapsedTime","expectedLen","isRecording","isPaused","resume","start","pause","stop","openUpload","reset","maxLen","uploadDialog","VRadioGroup","isShared","VRadio","VCheckbox","askForFeedback","cancelUpload","upload","staticRenderFns","VideoRecorder","recorder","Recorder","interval","timeout","defaultShared","setTimeout","setInterval","clearTimeout","clearInterval","video","onError","errorMessage","displaySnackbar","stream","removeAttribute","srcObject","play","muted","controls","startTimeout","startTimer","stopTimer","stopTimeout","then","videoBlob","src","currentTime","maxSize","size","document","getElementById","__decorate","Prop","Action","Component","components","DeviceSelect","component","includeVideo","Error","checkCameraAndMicrophonePermissions","console","i18n","constraints","audio","deviceId","getInputDevice","width","ideal","min","max","Promise","all","navigator","mediaDevices","getUserMedia","resolve","audioStream","videoStream","MediaStream","getAudioTracks","getVideoTracks","optsVideo","recorderType","MediaStreamRecorder","mimeType","videoBitsPerSecond","optsAudio","audioBitsPerSecond","videoRecorder","RecordRTC","audioRecorder","startRecording","pauseRecording","resumeRecording","res","stopVideo","stopRecording","stopAudio","getTracks","getBlob","audioBlob","destroy","catch","x","enabled","fileName","save","getBuiltIn","redefineAll","createIteratorConstructor","hasOwn","bind","classof","anObject","isObject","create","createPropertyDescriptor","getIterator","getIteratorMethod","$fetch","Headers","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","getInternalIteratorState","plus","sequences","Array","percentSequence","bytes","RegExp","percentDecode","sequence","decodeURIComponent","deserialize","it","find","replacer","match","serialize","parseSearchParams","attribute","entry","attributes","entries","validateArgumentsLength","passed","required","URLSearchParamsIterator","params","kind","iterator","step","next","done","URLSearchParamsConstructor","iteratorMethod","entryIterator","entryNext","first","init","URLSearchParamsPrototype","append","splice","getAll","found","entriesIndex","sliceIndex","boundFunction","values","fetch","body","headers","mediaStream","config","RecordRTCConfiguration","self","config2","disableLogs","log","version","mediaRecorder","clearRecordedData","record","setState","recordingDuration","handleRecordingDuration","initRecorder","initCallback","GetRecorderType","constructor","warn","_callback","warningLog","__blob","bytesToSize","autoWriteToDisk","getDataURL","dataURL","parameter","DiskStorage","Store","readFile","_blob","postMessage","FileReaderSync","readAsDataURL","_mediaRecorder","Worker","mozGetUserMedia","reader","FileReader","onload","event","target","webWorker","processInWebWorker","onmessage","_function","Blob","worker","onRecordingStopped","onStateChanged","WARNING","returnObject","setRecordingDuration","toURL","getInternalRecorder","invokeSaveAsDialog","getFromDisk","setAdvertisementArray","arrayOfWebPImages","advertisement","duration","image","bufferSize","sampleRate","disableLogsCache","Storage","AudioContextConstructor","close","WhammyRecorder","CanvasRecorder","WebAssemblyRecorder","GifRecorder","StereoAudioRecorder","MediaRecorder","bitsPerSecond","isChrome","isEdge","isOpera","ReadableStream","isMediaRecorderCompatible","isTypeSupported","MultiStreamRecorder","isSafari","MRecordRTC","addStream","_mediaStream","mediaType","gif","numberOfAudioChannels","timeSlice","onTimeStamp","newStream","videoTrack","isFirefox","addTrack","canvas","frameInterval","workerPath","webAssemblyPath","frameRate","bitrate","isSingleRecorder","gifRecorder","quality","blobURL","callback00","webkitURL","_audioDataURL","_videoDataURL","writeToDisk","Fetch","_type","audioDataURL","videoDataURL","gifDataURL","gifBlob","browserFakeUserAgent","window","userAgent","documentElement","appendChild","createElement","captureStream","mozCaptureStream","obj","getContext","drawImage","toDataURL","style","HTMLVideoElement","location","screen","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","lastTime","element","currTime","Date","getTime","timeToCall","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","msCancelAnimationFrame","AudioContext","webkitAudioContext","mozAudioContext","webkitGetUserMedia","indexOf","msSaveBlob","msSaveOrOpenBlob","opera","isElectron","sizes","toPrecision","fileExtension","splitted","fileFullName","round","random","hyperlink","download","dispatchEvent","MouseEvent","view","bubbles","cancelable","process","versions","electron","filter","setSrcObject","mozSrcObject","getSeekableBlob","inputBlob","EBML","Reader","decoder","Decoder","tools","fileReader","ebmlElms","decode","read","refinedMetadataBuf","makeMetadataSeekable","metadatas","cues","metadataSize","newBlob","readAsArrayBuffer","webkitMediaStream","track","appVersion","verOffset","ix","nAgt","fullVersion","parseFloat","majorVersion","substring","isNaN","arrayOfBlobs","updateTimeStamp","timestamps","getMimeType","secondObject","clearRecordedDataCB","isMediaStreamActive","active","ended","getArrayOfBlobs","allStates","recorderHints","canRecordMimeType","ondataavailable","recordingCallback","getNativeBlob","onstart","onpause","onresume","onstop","onerror","looper","manuallyStopped","timeslice","getAllStates","checkForInactiveTracks","jsAudioNode","leftchannel","rightchannel","recording","recordingLength","desiredSampRate","mergeLeftRightBuffers","mergeAudioBuffers","cb","interleaved","leftBuffers","rightBuffers","internalInterleavedLength","interpolateArray","newSampleRate","oldSampleRate","fitCount","newData","springFactor","tmp","before","toFixed","after","ceil","atPoint","linearInterpolate","mergeBuffers","channelBuffer","rLength","Float64Array","lng","interleave","leftChannel","rightChannel","inputIndex","writeUTFBytes","setUint8","interleavedLength","resultingBufferLength","ArrayBuffer","DataView","setUint32","setUint16","volume","setInt16","noWorker","workerURL","terminate","resetVariables","isAudioProcessStarted","byteLength","context","audioInput","createMediaStreamSource","legalBufferValues","JSON","stringify","createJavaScriptNode","createScriptProcessor","connect","intervalsBasedBuffers","left","right","onaudioprocess","disconnect","onAudioProcessDataAvailable","onAudioProcessStarted","inputBuffer","getChannelData","chLeft","Float32Array","chRight","createMediaStreamDestination","destination","htmlElement","html2canvas","isCanvasSupportsStreamCapturing","item","globalCanvas","mediaStreamRecorder","_isChrome","webkitRTCPeerConnection","chrome","chromeVersion","matchArray","useWhammyRecorder","HTMLCanvasElement","CanvasRenderingContext2D","canvasMediaStream","webkitCaptureStream","mdStream","whammy","frames","drawCanvasFrame","getWebPImages","nodeName","framesLength","frame","idx","framesRemaining","onEncodingCallback","webp","compile","isPausedRecording","cloneCanvas","newCanvas","grabMouse","showMousePointer","onrendered","Whammy","Video","drawFrames","paused","isStopDrawing","asyncLoop","o","loop","functionToLoop","dropBlackFrames","_frames","_framesToCheck","_pixTolerance","_frameTolerance","localCanvas","context2d","resultFrames","checkUntilNotBlack","endCheckFrame","sampleColor","r","g","b","maxColorDifference","sqrt","pixTolerance","frameTolerance","doNotCheckNext","f","matchPixCount","endPixCheck","maxPixCount","finishImage","Image","imageData","getImageData","pix","currentColor","colorDifference","concat","cloneNode","onloadedmetadata","_this","WhammyVideo","whammyInWebWorker","ArrayToWebM","info","checkFrames","clusterMaxDuration","doubleToString","frameNumber","clusterTimecode","clusterFrames","clusterDuration","clusterCounter","cluster","getClusterData","generateEBML","map","block","makeSimpleBlock","discardable","invisible","keyframe","lacing","trackNum","timecode","numToBuffer","num","Uint8Array","reverse","strToBuffer","bitsToBuffer","bits","pad","substr","json","ebml","len","zeroes","sizeToString","padded","flags","out","parseWebP","riff","VP8","RIFF","WEBP","frameStart","c","getStrLength","unpadded","parseRIFF","chunks","webm","atob","add","indexedDB","open","db","dbVersion","dbName","request","onsuccess","setVersion","createObjectStore","putInDB","onupgradeneeded","dataBase","dataStoreName","transaction","getFromStore","portionName","objectStore","put","GIFEncoder","script","isHTMLObject","drawVideoFrame","time","clearedRecordedData","lastAnimationFrame","lastFrameTime","onGifPreview","gifEncoder","addFrame","isLoadedMetaData","offsetWidth","offsetHeight","setRepeat","setDelay","setQuality","onGifRecordingStarted","now","bin","autoplay","playsInline","MultiStreamsMixer","arrayOfMediaStreams","elementClass","videos","isStopDrawingFrames","opacity","position","zIndex","top","useGainNode","drawVideosToCanvas","videosLength","fullcanvas","remaining","y","onRender","getMixedStream","mixedVideoStream","getMixedVideoStream","mixedAudioStream","getMixedAudioStream","capturedStream","resetVideoStreams","audioContext","audioSources","gainNode","createGain","gain","audioTracksLength","audioSource","audioDestination","getVideo","streams","startDrawingFrames","appendStreams","releaseStreams","source","clearRect","mixer","getAllVideoTracks","tracks","previewStream","addStreams","getMixer","RecordRTCPromisesHandler","recordRTC","reject","finished","cameraStream","controller","cvs","onplaying","ctx","frameTimeout","cameraTimer","onVideoProcessStarted","_controlledReadableStream","enqueue","arrayBuffer","addEventListener","timebaseDen","realtime","pipeTo","WritableStream","write","arrayOfBuffers","VMenu","scopedSlots","_u","fn","ref","_g","VList","VListItemGroup","selectedDevice","_l","device","VListItem","selectDevice","devices","getDevices","indeterminate","indeterminateIcon","inputIndeterminate","hasError","shouldValidate","hasSuccess","hasColor","watch","$nextTick","genCheckbox","checkboxAttrs","dark","light","LocalStorage","setInputDevice","setVideoInputDevice","getVideoInputDevice","enumerateDevices","inputDevice","channelCount","echoCancellation","deviceType","inputDevices","preventDefault","Comparable","inputValue","falseValue","trueValue","multiple","lazyValue","isDark","appIsDark","isMultiple","isArray","internalValue","valueComparator","isDirty","domProps","checked","blur","change","focus","keydown","isInteractive","validate"],"mappings":"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","file":"assets/js/chunk-f832fd00.7fb9817e.js","sourcesContent":["var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","import './VGrid.sass'\n\nimport Vue, { PropOptions } from 'vue'\nimport mergeData from '../../util/mergeData'\nimport { upperFirst } from '../../util/helpers'\n\n// no xs\nconst breakpoints = ['sm', 'md', 'lg', 'xl']\n\nconst ALIGNMENT = ['start', 'end', 'center']\n\nfunction makeProps (prefix: string, def: () => PropOptions) {\n return breakpoints.reduce((props, val) => {\n props[prefix + upperFirst(val)] = def()\n return props\n }, {} as Dictionary)\n}\n\nconst alignValidator = (str: any) => [...ALIGNMENT, 'baseline', 'stretch'].includes(str)\nconst alignProps = makeProps('align', () => ({\n type: String,\n default: null,\n validator: alignValidator,\n}))\n\nconst justifyValidator = (str: any) => [...ALIGNMENT, 'space-between', 'space-around'].includes(str)\nconst justifyProps = makeProps('justify', () => ({\n type: String,\n default: null,\n validator: justifyValidator,\n}))\n\nconst alignContentValidator = (str: any) => [...ALIGNMENT, 'space-between', 'space-around', 'stretch'].includes(str)\nconst alignContentProps = makeProps('alignContent', () => ({\n type: String,\n default: null,\n validator: alignContentValidator,\n}))\n\nconst propMap = {\n align: Object.keys(alignProps),\n justify: Object.keys(justifyProps),\n alignContent: Object.keys(alignContentProps),\n}\n\nconst classMap = {\n align: 'align',\n justify: 'justify',\n alignContent: 'align-content',\n}\n\nfunction breakpointClass (type: keyof typeof propMap, prop: string, val: string) {\n let className = classMap[type]\n if (val == null) {\n return undefined\n }\n if (prop) {\n // alignSm -> Sm\n const breakpoint = prop.replace(type, '')\n className += `-${breakpoint}`\n }\n // .align-items-sm-center\n className += `-${val}`\n return className.toLowerCase()\n}\n\nconst cache = new Map()\n\nexport default Vue.extend({\n name: 'v-row',\n functional: true,\n props: {\n tag: {\n type: String,\n default: 'div',\n },\n dense: Boolean,\n noGutters: Boolean,\n align: {\n type: String,\n default: null,\n validator: alignValidator,\n },\n ...alignProps,\n justify: {\n type: String,\n default: null,\n validator: justifyValidator,\n },\n ...justifyProps,\n alignContent: {\n type: String,\n default: null,\n validator: alignContentValidator,\n },\n ...alignContentProps,\n },\n render (h, { props, data, children }) {\n // Super-fast memoization based on props, 5x faster than JSON.stringify\n let cacheKey = ''\n for (const prop in props) {\n cacheKey += String((props as any)[prop])\n }\n let classList = cache.get(cacheKey)\n\n if (!classList) {\n classList = []\n // Loop through `align`, `justify`, `alignContent` breakpoint props\n let type: keyof typeof propMap\n for (type in propMap) {\n propMap[type].forEach(prop => {\n const value: string = (props as any)[prop]\n const className = breakpointClass(type, prop, value)\n if (className) classList!.push(className)\n })\n }\n\n classList.push({\n 'no-gutters': props.noGutters,\n 'row--dense': props.dense,\n [`align-${props.align}`]: props.align,\n [`justify-${props.justify}`]: props.justify,\n [`align-content-${props.alignContent}`]: props.alignContent,\n })\n\n cache.set(cacheKey, classList)\n }\n\n return h(\n props.tag,\n mergeData(data, {\n staticClass: 'row',\n class: classList,\n }),\n children\n )\n },\n})\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n","// Styles\nimport '../../styles/components/_selection-controls.sass'\nimport './VRadioGroup.sass'\n\n// Extensions\nimport VInput from '../VInput'\nimport { BaseItemGroup } from '../VItemGroup/VItemGroup'\n\n// Types\nimport mixins from '../../util/mixins'\nimport { PropType } from 'vue'\n\nconst baseMixins = mixins(\n BaseItemGroup,\n VInput\n)\n\n/* @vue/component */\nexport default baseMixins.extend({\n name: 'v-radio-group',\n\n provide () {\n return {\n radioGroup: this,\n }\n },\n\n props: {\n column: {\n type: Boolean,\n default: true,\n },\n height: {\n type: [Number, String],\n default: 'auto',\n },\n name: String,\n row: Boolean,\n // If no value set on VRadio\n // will match valueComparator\n // force default to null\n value: null as unknown as PropType,\n },\n\n computed: {\n classes (): object {\n return {\n ...VInput.options.computed.classes.call(this),\n 'v-input--selection-controls v-input--radio-group': true,\n 'v-input--radio-group--column': this.column && !this.row,\n 'v-input--radio-group--row': this.row,\n }\n },\n },\n\n methods: {\n genDefaultSlot () {\n return this.$createElement('div', {\n staticClass: 'v-input--radio-group__input',\n attrs: {\n id: this.id,\n role: 'radiogroup',\n 'aria-labelledby': this.computedId,\n },\n }, VInput.options.methods.genDefaultSlot.call(this))\n },\n genInputSlot () {\n const render = VInput.options.methods.genInputSlot.call(this)\n\n delete render.data!.on!.click\n\n return render\n },\n genLabel () {\n const label = VInput.options.methods.genLabel.call(this)\n\n if (!label) return null\n\n label.data!.attrs!.id = this.computedId\n // WAI considers this an orphaned label\n delete label.data!.attrs!.for\n label.tag = 'legend'\n\n return label\n },\n onClick: BaseItemGroup.options.methods.onClick,\n },\n\n render (h) {\n const vnode = VInput.options.render.call(this, h)\n\n this._b(vnode.data!, 'div', this.attrs$)\n\n return vnode\n },\n})\n","// Directives\nimport ripple from '../../directives/ripple'\n\n// Types\nimport Vue, { VNode, VNodeData, VNodeDirective } from 'vue'\n\nexport default Vue.extend({\n name: 'rippleable',\n\n directives: { ripple },\n\n props: {\n ripple: {\n type: [Boolean, Object],\n default: true,\n },\n },\n\n methods: {\n genRipple (data: VNodeData = {}): VNode | null {\n if (!this.ripple) return null\n\n data.staticClass = 'v-input--selection-controls__ripple'\n\n data.directives = data.directives || []\n data.directives.push({\n name: 'ripple',\n value: { center: true },\n } as VNodeDirective)\n\n return this.$createElement('div', data)\n },\n },\n})\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to , but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","import './VGrid.sass'\n\nimport Vue, { VNode, PropOptions } from 'vue'\nimport mergeData from '../../util/mergeData'\nimport { upperFirst } from '../../util/helpers'\n\n// no xs\nconst breakpoints = ['sm', 'md', 'lg', 'xl']\n\nconst breakpointProps = (() => {\n return breakpoints.reduce((props, val) => {\n props[val] = {\n type: [Boolean, String, Number],\n default: false,\n }\n return props\n }, {} as Dictionary)\n})()\n\nconst offsetProps = (() => {\n return breakpoints.reduce((props, val) => {\n props['offset' + upperFirst(val)] = {\n type: [String, Number],\n default: null,\n }\n return props\n }, {} as Dictionary)\n})()\n\nconst orderProps = (() => {\n return breakpoints.reduce((props, val) => {\n props['order' + upperFirst(val)] = {\n type: [String, Number],\n default: null,\n }\n return props\n }, {} as Dictionary)\n})()\n\nconst propMap = {\n col: Object.keys(breakpointProps),\n offset: Object.keys(offsetProps),\n order: Object.keys(orderProps),\n}\n\nfunction breakpointClass (type: keyof typeof propMap, prop: string, val: boolean | string | number) {\n let className = type\n if (val == null || val === false) {\n return undefined\n }\n if (prop) {\n const breakpoint = prop.replace(type, '')\n className += `-${breakpoint}`\n }\n // Handling the boolean style prop when accepting [Boolean, String, Number]\n // means Vue will not convert to sm: true for us.\n // Since the default is false, an empty string indicates the prop's presence.\n if (type === 'col' && (val === '' || val === true)) {\n // .col-md\n return className.toLowerCase()\n }\n // .order-md-6\n className += `-${val}`\n return className.toLowerCase()\n}\n\nconst cache = new Map()\n\nexport default Vue.extend({\n name: 'v-col',\n functional: true,\n props: {\n cols: {\n type: [Boolean, String, Number],\n default: false,\n },\n ...breakpointProps,\n offset: {\n type: [String, Number],\n default: null,\n },\n ...offsetProps,\n order: {\n type: [String, Number],\n default: null,\n },\n ...orderProps,\n alignSelf: {\n type: String,\n default: null,\n validator: (str: any) => ['auto', 'start', 'end', 'center', 'baseline', 'stretch'].includes(str),\n },\n tag: {\n type: String,\n default: 'div',\n },\n },\n render (h, { props, data, children, parent }): VNode {\n // Super-fast memoization based on props, 5x faster than JSON.stringify\n let cacheKey = ''\n for (const prop in props) {\n cacheKey += String((props as any)[prop])\n }\n let classList = cache.get(cacheKey)\n\n if (!classList) {\n classList = []\n // Loop through `col`, `offset`, `order` breakpoint props\n let type: keyof typeof propMap\n for (type in propMap) {\n propMap[type].forEach(prop => {\n const value: string | number | boolean = (props as any)[prop]\n const className = breakpointClass(type, prop, value)\n if (className) classList!.push(className)\n })\n }\n\n const hasColClasses = classList.some(className => className.startsWith('col-'))\n\n classList.push({\n // Default to .col if no other col-{bp}-* classes generated nor `cols` specified.\n col: !hasColClasses || !props.cols,\n [`col-${props.cols}`]: props.cols,\n [`offset-${props.offset}`]: props.offset,\n [`order-${props.order}`]: props.order,\n [`align-self-${props.alignSelf}`]: props.alignSelf,\n })\n\n cache.set(cacheKey, classList)\n }\n\n return h(props.tag, mergeData(data, { class: classList }), children)\n },\n})\n","// Styles\nimport './VRadio.sass'\n\n// Components\nimport VRadioGroup from './VRadioGroup'\nimport VLabel from '../VLabel'\nimport VIcon from '../VIcon'\nimport VInput from '../VInput'\n\n// Mixins\nimport BindsAttrs from '../../mixins/binds-attrs'\nimport Colorable from '../../mixins/colorable'\nimport { factory as GroupableFactory } from '../../mixins/groupable'\nimport Rippleable from '../../mixins/rippleable'\nimport Themeable from '../../mixins/themeable'\nimport Selectable, { prevent } from '../../mixins/selectable'\n\n// Utilities\nimport { getSlot } from '../../util/helpers'\n\n// Types\nimport { VNode, VNodeData } from 'vue'\nimport mixins from '../../util/mixins'\nimport { mergeListeners } from '../../util/mergeData'\n\nconst baseMixins = mixins(\n BindsAttrs,\n Colorable,\n Rippleable,\n GroupableFactory('radioGroup'),\n Themeable\n)\n\ninterface options extends InstanceType {\n radioGroup: InstanceType\n}\n\n/* @vue/component */\nexport default baseMixins.extend().extend({\n name: 'v-radio',\n\n inheritAttrs: false,\n\n props: {\n disabled: Boolean,\n id: String,\n label: String,\n name: String,\n offIcon: {\n type: String,\n default: '$radioOff',\n },\n onIcon: {\n type: String,\n default: '$radioOn',\n },\n readonly: Boolean,\n value: {\n default: null,\n },\n },\n\n data: () => ({\n isFocused: false,\n }),\n\n computed: {\n classes (): object {\n return {\n 'v-radio--is-disabled': this.isDisabled,\n 'v-radio--is-focused': this.isFocused,\n ...this.themeClasses,\n ...this.groupClasses,\n }\n },\n computedColor (): string | undefined {\n if (this.isDisabled) return undefined\n return Selectable.options.computed.computedColor.call(this)\n },\n computedIcon (): string {\n return this.isActive\n ? this.onIcon\n : this.offIcon\n },\n computedId (): string {\n return VInput.options.computed.computedId.call(this)\n },\n hasLabel: VInput.options.computed.hasLabel,\n hasState (): boolean {\n return (this.radioGroup || {}).hasState\n },\n isDisabled (): boolean {\n return this.disabled || (\n !!this.radioGroup &&\n this.radioGroup.isDisabled\n )\n },\n isReadonly (): boolean {\n return this.readonly || (\n !!this.radioGroup &&\n this.radioGroup.isReadonly\n )\n },\n computedName (): string {\n if (this.name || !this.radioGroup) {\n return this.name\n }\n\n return this.radioGroup.name || `radio-${this.radioGroup._uid}`\n },\n rippleState (): string | undefined {\n return Selectable.options.computed.rippleState.call(this)\n },\n validationState (): string | undefined {\n return (this.radioGroup || {}).validationState || this.computedColor\n },\n },\n\n methods: {\n genInput (args: any) {\n // We can't actually use the mixin directly because\n // it's made for standalone components, but its\n // genInput method is exactly what we need\n return Selectable.options.methods.genInput.call(this, 'radio', args)\n },\n genLabel () {\n if (!this.hasLabel) return null\n\n return this.$createElement(VLabel, {\n on: {\n // Label shouldn't cause the input to focus\n click: prevent,\n },\n attrs: {\n for: this.computedId,\n },\n props: {\n color: this.validationState,\n focused: this.hasState,\n },\n }, getSlot(this, 'label') || this.label)\n },\n genRadio () {\n const { title, ...radioAttrs } = this.attrs$\n\n return this.$createElement('div', {\n staticClass: 'v-input--selection-controls__input',\n }, [\n this.$createElement(VIcon, this.setTextColor(this.validationState, {\n props: {\n dense: this.radioGroup && this.radioGroup.dense,\n },\n }), this.computedIcon),\n this.genInput({\n name: this.computedName,\n value: this.value,\n ...radioAttrs,\n }),\n this.genRipple(this.setTextColor(this.rippleState)),\n ])\n },\n onFocus (e: Event) {\n this.isFocused = true\n this.$emit('focus', e)\n },\n onBlur (e: Event) {\n this.isFocused = false\n this.$emit('blur', e)\n },\n onChange () {\n if (this.isDisabled || this.isReadonly || this.isActive) return\n\n this.toggle()\n },\n onKeydown: () => {}, // Override default with noop\n },\n\n render (h): VNode {\n const data: VNodeData = {\n staticClass: 'v-radio',\n class: this.classes,\n on: mergeListeners({\n click: this.onChange,\n }, this.listeners$),\n attrs: { title: this.attrs$.title },\n }\n\n return h('div', data, [\n this.genRadio(),\n this.genLabel(),\n ])\n },\n})\n","import { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VRadio } from 'vuetify/lib/components/VRadioGroup';\nimport { VRadioGroup } from 'vuetify/lib/components/VRadioGroup';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\n\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c(VDialog,{attrs:{\"width\":\"400\"},model:{value:(_vm.isTooBig),callback:function ($$v) {_vm.isTooBig=$$v},expression:\"isTooBig\"}},[_c(VCard,[_c(VCardTitle,{staticClass:\"text-h5 grey lighten-2\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"upsess.errorHeading\"))+\" \")]),_c(VCardText,[_c('p',{staticStyle:{\"margin-top\":\"8px\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"upsess.videoTooBig\"))+\" \")])]),_c(VDivider),_c(VCardActions,[_c(VSpacer),_c(VBtn,{staticClass:\"mt-4\",attrs:{\"elevation\":\"0\",\"color\":\"primary\",\"text\":\"\"},on:{\"click\":function($event){_vm.isTooBig = false}}},[_vm._v(\" Ok \")])],1)],1)],1),_c(VRow,[_c(VCol,{attrs:{\"cols\":\"12\",\"md\":\"8\"}},[_c('h3',{staticClass:\"my-4\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.title\"))+\" \")]),_c('div',{staticStyle:{\"position\":\"relative\",\"overflow\":\"hidden\"}},[_c('div',{staticClass:\"video_recorder__wrapper\"},[_c('video',{class:{ video_recorder__flipped: _vm.flipped },attrs:{\"id\":\"video\",\"playsinline\":\"\",\"controls\":\"\"}})]),(_vm.isRecording)?_c('div',{staticClass:\"video_recorder__indicator\"},[_c('div',{staticClass:\"dot\"}),_c('span',[_vm._v(\"REC\")])]):_vm._e(),_c('div',{staticClass:\"video_recorder__timer\",class:{ overtime: _vm.isTimed && _vm.elapsedTime > _vm.expectedLen }},[_vm._v(\" \"+_vm._s(_vm.elapsedTime)+\"s \")])])]),_c(VCol,{attrs:{\"cols\":\"12\",\"md\":\"4\"}},[_c('h4',{staticClass:\"mt-4\"},[_vm._v(\" \"+_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.actions\"))+\" \")]),(_vm.loading)?_c('div',[_vm._v(_vm._s(_vm.$t(\"global.loading\")))]):_c('div',{staticClass:\"mt-2\"},[_c('div',{staticClass:\"d-flex flex-wrap\"},[(!_vm.isRecording || _vm.isPaused)?_c(VBtn,{staticClass:\"mr-4 mt-4\",attrs:{\"elevation\":\"0\"},on:{\"click\":function () { return (_vm.isPaused ? _vm.resume() : _vm.start()); }}},[_c(VIcon,{attrs:{\"left\":\"\"}},[_vm._v(\"mdi-record\")]),_c('span',[_vm._v(_vm._s(_vm.isPaused ? _vm.$t(\"seminars.submissions.videoRecorder.resume\") : _vm.$t(\"seminars.submissions.videoRecorder.start\")))])],1):_vm._e(),(_vm.isRecording && !_vm.isPaused)?_c(VBtn,{staticClass:\"mr-4 mt-4\",attrs:{\"elevation\":\"0\"},on:{\"click\":_vm.pause}},[_c(VIcon,{attrs:{\"left\":\"\"}},[_vm._v(\"mdi-pause\")]),_c('span',[_vm._v(_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.pause\")))])],1):_vm._e(),(_vm.isRecording)?_c(VBtn,{staticClass:\"mr-4 mt-4\",attrs:{\"elevation\":\"0\"},on:{\"click\":_vm.stop}},[_c(VIcon,{attrs:{\"left\":\"\"}},[_vm._v(\"mdi-stop\")]),_c('span',[_vm._v(_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.stop\")))])],1):_vm._e(),(_vm.isActive && !_vm.isRecording)?_c(VBtn,{staticClass:\"mr-4 mt-4\",attrs:{\"elevation\":\"0\"},on:{\"click\":_vm.openUpload}},[_c(VIcon,{attrs:{\"left\":\"\"}},[_vm._v(\"mdi-upload\")]),_c('span',[_vm._v(_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.upload\")))])],1):_vm._e(),(_vm.isActive && !_vm.isRecording)?_c(VBtn,{staticClass:\"mr-4 mt-4\",attrs:{\"elevation\":\"0\"},on:{\"click\":_vm.reset}},[_c(VIcon,{attrs:{\"left\":\"\"}},[_vm._v(\"mdi-restore\")]),_c('span',[_vm._v(_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.reset\")))])],1):_vm._e(),_c(VBtn,{staticClass:\"mt-4\",attrs:{\"elevation\":\"0\"},on:{\"click\":function($event){_vm.flipped = !_vm.flipped}}},[_c(VIcon,{attrs:{\"left\":\"\"}},[_vm._v(\"mdi-flip-horizontal\")]),_c('span',[_vm._v(\" \"+_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.flipVideo\"))+\" \")])],1),(!_vm.isRecording)?_c('div',{staticClass:\"mt-4 d-flex\"},[_c('DeviceSelect',{attrs:{\"type\":\"audio\"}}),_c('div',{staticClass:\"mx-2\"}),_c('DeviceSelect',{attrs:{\"type\":\"video\"}})],1):_vm._e()],1),(_vm.isTimed)?_c('div',{staticClass:\"mt-4\"},[_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.expectedTime\"))+\" \"),_c('b',[_vm._v(_vm._s(_vm.expectedLen)+\"s\")])]),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.maxAllowedTime\"))+\" \"),_c('b',[_vm._v(_vm._s(_vm.maxLen)+\"s\")])])]):_vm._e()])])],1),_c(VDialog,{attrs:{\"max-width\":\"400px\"},model:{value:(_vm.uploadDialog),callback:function ($$v) {_vm.uploadDialog=$$v},expression:\"uploadDialog\"}},[_c(VCard,[_c(VCardTitle,[_vm._v(\" \"+_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.uploadYourPres\"))+\" \")]),_c(VCardText,[(_vm.canShare)?_c(VRadioGroup,{attrs:{\"row\":\"\"},model:{value:(_vm.isShared),callback:function ($$v) {_vm.isShared=$$v},expression:\"isShared\"}},[_c(VRadio,{attrs:{\"label\":_vm.$t('seminars.submissions.videoRecorder.privateVid'),\"value\":false}}),_c(VRadio,{attrs:{\"label\":_vm.$t('seminars.submissions.videoRecorder.sharedVid'),\"value\":true}})],1):_vm._e(),(_vm.isShared)?_c('div',[_c('p',[_vm._v(_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.shared\")))])]):_c('div',[_c('p',[_vm._v(_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.notShared\")))])]),(_vm.canAskForFeedback)?_c('div',{staticClass:\"mt-4\"},[_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.askForFeedback\"))+\" \")]),_c('div',[_vm._v(\" \"+_vm._s(_vm.$t(\"seminars.submissions.videoRecorder.askForFeedbackInfo\"))+\" \")]),_c(VCheckbox,{attrs:{\"label\":_vm.$t('seminars.submissions.videoRecorder.wouldLikeFeedback')},model:{value:(_vm.askForFeedback),callback:function ($$v) {_vm.askForFeedback=$$v},expression:\"askForFeedback\"}})],1):_vm._e()],1),_c(VCardActions,[_c(VBtn,{attrs:{\"elevation\":\"0\"},on:{\"click\":_vm.cancelUpload}},[_c('span',[_vm._v(_vm._s(_vm.$t(\"global.cancel\")))])]),_c('div',{staticClass:\"mx-2\"}),_c(VBtn,{attrs:{\"elevation\":\"0\"},on:{\"click\":_vm.upload}},[_c('span',[_vm._v(_vm._s(_vm.$t(\"global.confirm\")))])])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport Vue from \"vue\";\r\nimport { Component, Prop } from \"vue-property-decorator\";\r\n\r\nimport Recorder from \"@/core/utils/videoRecorder\";\r\nimport DeviceSelect from \"@/views/recorder/components/DeviceSelect.vue\";\r\nimport { Action } from \"vuex-class\";\r\n\r\n@Component({ components: { DeviceSelect } })\r\nexport default class VideoRecorder extends Vue {\r\n @Prop({ default: () => false }) isTimed!: boolean;\r\n @Prop({ default: () => 0 }) expectedLen!: number;\r\n @Prop({ default: () => 0 }) maxLen!: number;\r\n @Prop({ default: () => false }) loading!: boolean;\r\n @Prop({ default: () => true }) canShare!: boolean;\r\n @Prop({ default: () => true }) canAskForFeedback!: boolean;\r\n @Prop({ default: () => false }) defaultShared!: boolean;\r\n @Action(\"displaySnackbar\") displaySnackbar!: (m: string) => void;\r\n\r\n recorder: Recorder = new Recorder();\r\n video: HTMLVideoElement | undefined;\r\n blob: Blob | undefined;\r\n isTooBig = false;\r\n isRecording = false;\r\n isPaused = false;\r\n isActive = false;\r\n flipped = false;\r\n\r\n // time controls\r\n elapsedTime = 0;\r\n interval: any = null;\r\n timeout: any = null;\r\n\r\n startTimeout() {\r\n this.timeout = setTimeout(\r\n this.stop,\r\n (this.maxLen - this.elapsedTime) * 1000,\r\n );\r\n }\r\n startTimer() {\r\n this.interval = setInterval(() => {\r\n this.elapsedTime += 1;\r\n }, 1 * 1000);\r\n }\r\n\r\n stopTimeout() {\r\n clearTimeout(this.timeout);\r\n }\r\n stopTimer() {\r\n clearInterval(this.interval);\r\n }\r\n\r\n async start() {\r\n if (!this.video) return;\r\n\r\n const stream = await this.recorder.start(\r\n {\r\n onError: (errorMessage: string) => this.displaySnackbar(errorMessage),\r\n },\r\n true,\r\n );\r\n if (!stream) return;\r\n this.video.removeAttribute(\"src\");\r\n this.video.srcObject = stream;\r\n this.video.play();\r\n this.video.muted = true;\r\n this.video.controls = false;\r\n this.isRecording = true;\r\n this.isActive = true;\r\n\r\n if (this.isTimed) this.startTimeout();\r\n this.startTimer();\r\n }\r\n\r\n pause() {\r\n this.recorder.pause();\r\n this.isPaused = true;\r\n this.stopTimer();\r\n if (this.isTimed) this.stopTimeout();\r\n }\r\n\r\n resume() {\r\n this.recorder.resume();\r\n this.isPaused = false;\r\n this.startTimer();\r\n if (this.isTimed) this.startTimeout();\r\n }\r\n\r\n stop() {\r\n this.recorder.stop().then(blob => {\r\n if (!this.video || !blob) return;\r\n this.blob = blob.videoBlob;\r\n this.video.muted = false;\r\n (this.video.srcObject as null | MediaStream) = null;\r\n this.video.controls = true;\r\n this.video.src = URL.createObjectURL(this.blob!);\r\n this.isRecording = false;\r\n this.isPaused = false;\r\n\r\n if (this.isTimed) this.stopTimeout();\r\n this.stopTimer();\r\n this.elapsedTime = 0;\r\n });\r\n }\r\n\r\n reset() {\r\n this.recorder.stop();\r\n this.recorder.reset();\r\n this.isActive = false;\r\n if (!this.video) return;\r\n this.video.muted = true;\r\n this.video.pause();\r\n this.video.currentTime = 0;\r\n this.video.removeAttribute(\"src\");\r\n (this.video.srcObject as null | MediaStream) = null;\r\n this.isRecording = false;\r\n this.elapsedTime = 0;\r\n this.stopTimer();\r\n if (this.isTimed) this.stopTimeout();\r\n }\r\n\r\n uploadDialog = false;\r\n isShared = this.defaultShared;\r\n askForFeedback = false;\r\n openUpload() {\r\n this.uploadDialog = true;\r\n }\r\n cancelUpload() {\r\n this.uploadDialog = false;\r\n this.isShared = false;\r\n this.reset();\r\n }\r\n upload() {\r\n if (!this.blob) return;\r\n\r\n const maxSize = 400000000;\r\n // const maxSize = 4000;\r\n\r\n if (this.blob.size > maxSize) {\r\n this.isTooBig = true;\r\n return;\r\n }\r\n\r\n this.$emit(\"upload\", {\r\n blob: this.blob,\r\n isShared: this.isShared,\r\n askForFeedback: this.askForFeedback,\r\n });\r\n this.cancelUpload();\r\n }\r\n\r\n mounted() {\r\n this.video = document.getElementById(\"video\") as HTMLVideoElement;\r\n }\r\n}\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--15-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--15-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VideoRecorder.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--15-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--15-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VideoRecorder.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./VideoRecorder.vue?vue&type=template&id=65b6471d&\"\nimport script from \"./VideoRecorder.vue?vue&type=script&lang=ts&\"\nexport * from \"./VideoRecorder.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import RecordRTC, { MediaStreamRecorder } from \"recordrtc\";\r\nimport i18n from \"@/core/plugins/i18n\";\r\nimport { getInputDevice } from \"@/views/recorder/lib/devices\";\r\n\r\ninterface StartOptions {\r\n onError?: (errorMessage: string) => void;\r\n}\r\nclass VideoRecorder {\r\n stream: MediaStream | undefined;\r\n videoRecorder: RecordRTC | undefined;\r\n audioRecorder: RecordRTC | undefined;\r\n\r\n muted = false;\r\n isRecording: boolean;\r\n isPaused: boolean;\r\n\r\n constructor() {\r\n this.isRecording = false;\r\n this.isPaused = false;\r\n }\r\n\r\n async start(options?: StartOptions, includeVideo: boolean = false) {\r\n if (this.isRecording || this.isPaused)\r\n throw new Error(\"Can't start when already recording or paused.\");\r\n\r\n // Check for camera and/or microphone permissions\r\n try {\r\n await this.checkCameraAndMicrophonePermissions(includeVideo);\r\n } catch (error) {\r\n console.error(\"Error checking recording device permissions:\", error);\r\n if (options?.onError)\r\n if (includeVideo)\r\n // Pass translated message for snackbar\r\n options.onError(i18n.t(\"recording.noDevicePermission\").toString());\r\n else options.onError(i18n.t(\"recording.noDevicePermission\").toString());\r\n\r\n throw error;\r\n }\r\n\r\n // Obtain stream for video and/or audio also set min and max for video resolution\r\n const constraints: MediaStreamConstraints = {\r\n audio: { deviceId: getInputDevice(\"audio\") },\r\n video: includeVideo && {\r\n deviceId: getInputDevice(\"video\"),\r\n width: { ideal: 640, min: 320, max: 1280 },\r\n height: { ideal: 480, min: 240, max: 720 },\r\n },\r\n };\r\n\r\n // Start recording with the obtained stream\r\n try {\r\n const [audioStream, videoStream] = await Promise.all([\r\n navigator.mediaDevices.getUserMedia({ audio: constraints.audio }),\r\n includeVideo\r\n ? navigator.mediaDevices.getUserMedia({ video: constraints.video })\r\n : Promise.resolve(undefined),\r\n ]);\r\n\r\n const stream = new MediaStream([\r\n ...audioStream.getAudioTracks(),\r\n ...(videoStream ? videoStream.getVideoTracks() : []),\r\n ]);\r\n\r\n // Configure video and audio options\r\n const optsVideo: RecordRTC.Options = {\r\n recorderType: MediaStreamRecorder,\r\n mimeType: \"video/mp4\",\r\n type: \"video\",\r\n videoBitsPerSecond: 1000000, // Limit bitrate to decrease video size\r\n };\r\n\r\n const optsAudio: RecordRTC.Options = {\r\n recorderType: MediaStreamRecorder,\r\n mimeType: \"audio/wav\",\r\n type: \"audio\",\r\n audioBitsPerSecond: 128000, // Limit bitrate to decrease audios size\r\n };\r\n\r\n // Setup video and audio recorder\r\n const videoRecorder = includeVideo\r\n ? new RecordRTC(stream, optsVideo)\r\n : undefined;\r\n const audioRecorder = new RecordRTC(stream, optsAudio);\r\n\r\n if (includeVideo) videoRecorder!.startRecording();\r\n audioRecorder.startRecording();\r\n\r\n this.isRecording = true;\r\n this.stream = stream;\r\n this.videoRecorder = videoRecorder;\r\n this.audioRecorder = audioRecorder;\r\n\r\n // Return the stream object\r\n return this.stream;\r\n } catch (error) {\r\n console.error(\"Error while start recording: \", error);\r\n return undefined;\r\n }\r\n }\r\n\r\n async checkCameraAndMicrophonePermissions(\r\n includeVideo: boolean,\r\n ): Promise {\r\n try {\r\n await navigator.mediaDevices.getUserMedia({\r\n audio: { deviceId: getInputDevice(\"audio\") },\r\n video: includeVideo && { deviceId: getInputDevice(\"video\") },\r\n });\r\n } catch (error) {\r\n if (includeVideo)\r\n throw new Error(\r\n \"Camera and microphone permissions are required for recording.\",\r\n );\r\n else throw new Error(\"Microphone permission is required for recording.\");\r\n }\r\n }\r\n\r\n pause() {\r\n this.videoRecorder?.pauseRecording();\r\n this.audioRecorder?.pauseRecording();\r\n this.isPaused = true;\r\n }\r\n resume() {\r\n this.videoRecorder?.resumeRecording();\r\n this.audioRecorder?.resumeRecording();\r\n this.isPaused = false;\r\n }\r\n\r\n stop(): Promise<{ videoBlob?: Blob; audioBlob?: Blob } | undefined> {\r\n return new Promise<{ videoBlob?: Blob; audioBlob?: Blob } | undefined>(\r\n res => {\r\n if (!this.videoRecorder && !this.audioRecorder) {\r\n res(undefined);\r\n return;\r\n }\r\n\r\n const stopVideo = () =>\r\n new Promise(resolve =>\r\n this.videoRecorder?.stopRecording(() => resolve()),\r\n );\r\n\r\n const stopAudio = () =>\r\n new Promise(resolve =>\r\n this.audioRecorder?.stopRecording(() => resolve()),\r\n );\r\n\r\n Promise.all([\r\n this.videoRecorder ? stopVideo() : Promise.resolve(),\r\n stopAudio(),\r\n ])\r\n .then(() => {\r\n if (this.stream) this.stream.getTracks().forEach(t => t.stop());\r\n\r\n this.isRecording = false;\r\n this.isPaused = false;\r\n\r\n const videoBlob = this.videoRecorder?.getBlob();\r\n const audioBlob = this.audioRecorder?.getBlob();\r\n\r\n this.videoRecorder?.destroy();\r\n this.audioRecorder?.destroy();\r\n\r\n this.stream = undefined;\r\n this.videoRecorder = undefined;\r\n this.audioRecorder = undefined;\r\n\r\n res({ videoBlob, audioBlob });\r\n })\r\n .catch(error => {\r\n console.error(\"Error stopping recording:\", error);\r\n res(undefined);\r\n });\r\n },\r\n );\r\n }\r\n\r\n async reset() {\r\n this.videoRecorder?.reset();\r\n this.audioRecorder?.reset();\r\n }\r\n\r\n toggleMuted() {\r\n if (this.muted) {\r\n this.muted = false;\r\n this.stream?.getAudioTracks().forEach(x => (x.enabled = true));\r\n } else {\r\n this.stream?.getAudioTracks().forEach(x => (x.enabled = false));\r\n this.muted = true;\r\n }\r\n }\r\n\r\n async save(fileName: string) {\r\n const videoBlob = this.videoRecorder?.getBlob();\r\n const audioBlob = this.audioRecorder?.getBlob();\r\n\r\n if (videoBlob) await this.videoRecorder?.save(`v_${fileName}`);\r\n\r\n if (audioBlob) await this.audioRecorder?.save(`a_${fileName}`);\r\n }\r\n}\r\n\r\nexport default VideoRecorder;\r\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\r\n\r\n// Last time updated: 2021-03-09 3:20:22 AM UTC\r\n\r\n// ________________\r\n// RecordRTC v5.6.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/RecordRTC\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\n// ____________\r\n// RecordRTC.js\r\n\r\n/**\r\n * {@link https://github.com/muaz-khan/RecordRTC|RecordRTC} is a WebRTC JavaScript library for audio/video as well as screen activity recording. It supports Chrome, Firefox, Opera, Android, and Microsoft Edge. Platforms: Linux, Mac and Windows. \r\n * @summary Record audio, video or screen inside the browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTC\r\n * @class\r\n * @example\r\n * var recorder = RecordRTC(mediaStream or [arrayOfMediaStream], {\r\n * type: 'video', // audio or video or gif or canvas\r\n * recorderType: MediaStreamRecorder || CanvasRecorder || StereoAudioRecorder || Etc\r\n * });\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, desiredSampRate: 16000, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction RecordRTC(mediaStream, config) {\r\n if (!mediaStream) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n config = config || {\r\n type: 'video'\r\n };\r\n\r\n config = new RecordRTCConfiguration(mediaStream, config);\r\n\r\n // a reference to user's recordRTC object\r\n var self = this;\r\n\r\n function startRecording(config2) {\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC version: ', self.version);\r\n }\r\n\r\n if (!!config2) {\r\n // allow users to set options using startRecording method\r\n // config2 is similar to main \"config\" object (second parameter over RecordRTC constructor)\r\n config = new RecordRTCConfiguration(mediaStream, config2);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('started recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n return self;\r\n }\r\n\r\n initRecorder(function() {\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n });\r\n\r\n return self;\r\n }\r\n\r\n function initRecorder(initCallback) {\r\n if (initCallback) {\r\n config.initCallback = function() {\r\n initCallback();\r\n initCallback = config.initCallback = null; // recorder.initRecorder should be call-backed once.\r\n };\r\n }\r\n\r\n var Recorder = new GetRecorderType(mediaStream, config);\r\n\r\n mediaRecorder = new Recorder(mediaStream, config);\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (!config.disableLogs) {\r\n console.log('Initialized recorderType:', mediaRecorder.constructor.name, 'for output-type:', config.type);\r\n }\r\n }\r\n\r\n function stopRecording(callback) {\r\n callback = callback || function() {};\r\n\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state === 'paused') {\r\n self.resumeRecording();\r\n\r\n setTimeout(function() {\r\n stopRecording(callback);\r\n }, 1);\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording' && !config.disableLogs) {\r\n console.warn('Recording state should be: \"recording\", however current state is: ', self.state);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Stopped recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (config.type !== 'gif') {\r\n mediaRecorder.stop(_callback);\r\n } else {\r\n mediaRecorder.stop();\r\n _callback();\r\n }\r\n\r\n setState('stopped');\r\n\r\n function _callback(__blob) {\r\n if (!mediaRecorder) {\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, '');\r\n } else {\r\n callback('');\r\n }\r\n return;\r\n }\r\n\r\n Object.keys(mediaRecorder).forEach(function(key) {\r\n if (typeof mediaRecorder[key] === 'function') {\r\n return;\r\n }\r\n\r\n self[key] = mediaRecorder[key];\r\n });\r\n\r\n var blob = mediaRecorder.blob;\r\n\r\n if (!blob) {\r\n if (__blob) {\r\n mediaRecorder.blob = blob = __blob;\r\n } else {\r\n throw 'Recording failed.';\r\n }\r\n }\r\n\r\n if (blob && !config.disableLogs) {\r\n console.log(blob.type, '->', bytesToSize(blob.size));\r\n }\r\n\r\n if (callback) {\r\n var url;\r\n\r\n try {\r\n url = URL.createObjectURL(blob);\r\n } catch (e) {}\r\n\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, url);\r\n } else {\r\n callback(url);\r\n }\r\n }\r\n\r\n if (!config.autoWriteToDisk) {\r\n return;\r\n }\r\n\r\n getDataURL(function(dataURL) {\r\n var parameter = {};\r\n parameter[config.type + 'Blob'] = dataURL;\r\n DiskStorage.Store(parameter);\r\n });\r\n }\r\n }\r\n\r\n function pauseRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to pause the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('paused');\r\n\r\n mediaRecorder.pause();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Paused recording.');\r\n }\r\n }\r\n\r\n function resumeRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'paused') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to resume the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('recording');\r\n\r\n // not all libs have this method yet\r\n mediaRecorder.resume();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Resumed recording.');\r\n }\r\n }\r\n\r\n function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n }\r\n\r\n function getDataURL(callback, _mediaRecorder) {\r\n if (!callback) {\r\n throw 'Pass a callback function over getDataURL.';\r\n }\r\n\r\n var blob = _mediaRecorder ? _mediaRecorder.blob : (mediaRecorder || {}).blob;\r\n\r\n if (!blob) {\r\n if (!config.disableLogs) {\r\n console.warn('Blob encoder did not finish its job yet.');\r\n }\r\n\r\n setTimeout(function() {\r\n getDataURL(callback, _mediaRecorder);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (typeof Worker !== 'undefined' && !navigator.mozGetUserMedia) {\r\n var webWorker = processInWebWorker(readFile);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback(event.target.result);\r\n };\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n try {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n } catch (e) {}\r\n }\r\n }\r\n\r\n function handleRecordingDuration(counter) {\r\n counter = counter || 0;\r\n\r\n if (self.state === 'paused') {\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (self.state === 'stopped') {\r\n return;\r\n }\r\n\r\n if (counter >= self.recordingDuration) {\r\n stopRecording(self.onRecordingStopped);\r\n return;\r\n }\r\n\r\n counter += 1000; // 1-second\r\n\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n }\r\n\r\n function setState(state) {\r\n if (!self) {\r\n return;\r\n }\r\n\r\n self.state = state;\r\n\r\n if (typeof self.onStateChanged.call === 'function') {\r\n self.onStateChanged.call(self, state);\r\n } else {\r\n self.onStateChanged(state);\r\n }\r\n }\r\n\r\n var WARNING = 'It seems that recorder is destroyed or \"startRecording\" is not invoked for ' + config.type + ' recorder.';\r\n\r\n function warningLog() {\r\n if (config.disableLogs === true) {\r\n return;\r\n }\r\n\r\n console.warn(WARNING);\r\n }\r\n\r\n var mediaRecorder;\r\n\r\n var returnObject = {\r\n /**\r\n * This method starts the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var recorder = RecordRTC(mediaStream, {\r\n * type: 'video'\r\n * });\r\n * recorder.startRecording();\r\n */\r\n startRecording: startRecording,\r\n\r\n /**\r\n * This method stops the recording. It is strongly recommended to get \"blob\" or \"URI\" inside the callback to make sure all recorders finished their job.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * // use either \"this\" or \"recorder\" object; both are identical\r\n * video.src = this.toURL();\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n stopRecording: stopRecording,\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Firefox is unable to pause the recording. Fix it.\r\n * @example\r\n * recorder.pauseRecording(); // pause the recording\r\n * recorder.resumeRecording(); // resume again\r\n */\r\n pauseRecording: pauseRecording,\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.pauseRecording(); // first of all, pause the recording\r\n * recorder.resumeRecording(); // now resume it\r\n */\r\n resumeRecording: resumeRecording,\r\n\r\n /**\r\n * This method initializes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * recorder.initRecorder();\r\n */\r\n initRecorder: initRecorder,\r\n\r\n /**\r\n * Ask RecordRTC to auto-stop the recording after 5 minutes.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var fiveMinutes = 5 * 1000 * 60;\r\n * recorder.setRecordingDuration(fiveMinutes, function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n * \r\n * // or otherwise\r\n * recorder.setRecordingDuration(fiveMinutes).onRecordingStopped(function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n */\r\n setRecordingDuration: function(recordingDuration, callback) {\r\n if (typeof recordingDuration === 'undefined') {\r\n throw 'recordingDuration is required.';\r\n }\r\n\r\n if (typeof recordingDuration !== 'number') {\r\n throw 'recordingDuration must be a number.';\r\n }\r\n\r\n self.recordingDuration = recordingDuration;\r\n self.onRecordingStopped = callback || function() {};\r\n\r\n return {\r\n onRecordingStopped: function(callback) {\r\n self.onRecordingStopped = callback;\r\n }\r\n };\r\n },\r\n\r\n /**\r\n * This method can be used to clear/reset all the recorded data.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Figure out the difference between \"reset\" and \"clearRecordedData\" methods.\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n clearRecordedData: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n mediaRecorder.clearRecordedData();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Cleared old recorded data.');\r\n }\r\n },\r\n\r\n /**\r\n * Get the recorded blob. Use this method inside the \"stopRecording\" callback.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.getBlob();\r\n *\r\n * var file = new File([blob], 'filename.webm', {\r\n * type: 'video/webm'\r\n * });\r\n *\r\n * var formData = new FormData();\r\n * formData.append('file', file); // upload \"File\" object rather than a \"Blob\"\r\n * uploadToServer(formData);\r\n * });\r\n * @returns {Blob} Returns recorded data as \"Blob\" object.\r\n */\r\n getBlob: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return mediaRecorder.blob;\r\n },\r\n\r\n /**\r\n * Get data-URI instead of Blob.\r\n * @param {function} callback - Callback to get the Data-URI.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * recorder.getDataURL(function(dataURI) {\r\n * video.src = dataURI;\r\n * });\r\n * });\r\n */\r\n getDataURL: getDataURL,\r\n\r\n /**\r\n * Get virtual/temporary URL. Usage of this URL is limited to current tab.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * video.src = this.toURL();\r\n * });\r\n * @returns {String} Returns a virtual/temporary URL for the recorded \"Blob\".\r\n */\r\n toURL: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return URL.createObjectURL(mediaRecorder.blob);\r\n },\r\n\r\n /**\r\n * Get internal recording object (i.e. internal module) e.g. MutliStreamRecorder, MediaStreamRecorder, StereoAudioRecorder or WhammyRecorder etc.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var internalRecorder = recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n getInternalRecorder: function() {\r\n return mediaRecorder;\r\n },\r\n\r\n /**\r\n * Invoke save-as dialog to save the recorded blob into your disk.\r\n * @param {string} fileName - Set your own file name.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * this.save('file-name');\r\n *\r\n * // or manually:\r\n * invokeSaveAsDialog(this.getBlob(), 'filename.webm');\r\n * });\r\n */\r\n save: function(fileName) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n invokeSaveAsDialog(mediaRecorder.blob, fileName);\r\n },\r\n\r\n /**\r\n * This method gets a blob from indexed-DB storage.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.getFromDisk(function(dataURL) {\r\n * video.src = dataURL;\r\n * });\r\n */\r\n getFromDisk: function(callback) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n RecordRTC.getFromDisk(config.type, callback);\r\n },\r\n\r\n /**\r\n * This method appends an array of webp images to the recorded video-blob. It takes an \"array\" object.\r\n * @type {Array.}\r\n * @param {Array} arrayOfWebPImages - Array of webp images.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * var arrayOfWebPImages = [];\r\n * arrayOfWebPImages.push({\r\n * duration: index,\r\n * image: 'data:image/webp;base64,...'\r\n * });\r\n * recorder.setAdvertisementArray(arrayOfWebPImages);\r\n */\r\n setAdvertisementArray: function(arrayOfWebPImages) {\r\n config.advertisement = [];\r\n\r\n var length = arrayOfWebPImages.length;\r\n for (var i = 0; i < length; i++) {\r\n config.advertisement.push({\r\n duration: i,\r\n image: arrayOfWebPImages[i]\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * It is equivalent to \"recorder.getBlob()\" method. Usage of \"getBlob\" is recommended, though.\r\n * @property {Blob} blob - Recorded Blob can be accessed using this property.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.blob;\r\n *\r\n * // below one is recommended\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n blob: null,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} bufferSize - Buffer-size used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used this buffer-size: ' + this.bufferSize);\r\n * });\r\n */\r\n bufferSize: 0,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} sampleRate - Sample-rates used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used these sample-rates: ' + this.sampleRate);\r\n * });\r\n */\r\n sampleRate: 0,\r\n\r\n /**\r\n * {recorderType:StereoAudioRecorder} returns ArrayBuffer object.\r\n * @property {ArrayBuffer} buffer - Audio ArrayBuffer, supported only in Chrome.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var arrayBuffer = this.buffer;\r\n * alert(arrayBuffer.byteLength);\r\n * });\r\n */\r\n buffer: null,\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.reset();\r\n * recorder.startRecording();\r\n */\r\n reset: function() {\r\n if (self.state === 'recording' && !config.disableLogs) {\r\n console.warn('Stop an active recorder.');\r\n }\r\n\r\n if (mediaRecorder && typeof mediaRecorder.clearRecordedData === 'function') {\r\n mediaRecorder.clearRecordedData();\r\n }\r\n mediaRecorder = null;\r\n setState('inactive');\r\n self.blob = null;\r\n },\r\n\r\n /**\r\n * This method is called whenever recorder's state changes. Use this as an \"event\".\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.onStateChanged = function(state) {\r\n * console.log('Recorder state: ', state);\r\n * };\r\n */\r\n onStateChanged: function(state) {\r\n if (!config.disableLogs) {\r\n console.log('Recorder state changed:', state);\r\n }\r\n },\r\n\r\n /**\r\n * A recorder can have inactive, recording, paused or stopped states.\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * // this looper function will keep you updated about the recorder's states.\r\n * (function looper() {\r\n * document.querySelector('h1').innerHTML = 'Recorder\\'s state is: ' + recorder.state;\r\n * if(recorder.state === 'stopped') return; // ignore+stop\r\n * setTimeout(looper, 1000); // update after every 3-seconds\r\n * })();\r\n * recorder.startRecording();\r\n */\r\n state: 'inactive',\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n getState: function() {\r\n return self.state;\r\n },\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n destroy: function() {\r\n var disableLogsCache = config.disableLogs;\r\n\r\n config = {\r\n disableLogs: true\r\n };\r\n self.reset();\r\n setState('destroyed');\r\n returnObject = self = null;\r\n\r\n if (Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor.close();\r\n Storage.AudioContextConstructor = null;\r\n }\r\n\r\n config.disableLogs = disableLogsCache;\r\n\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC is destroyed.');\r\n }\r\n },\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n version: '5.6.2'\r\n };\r\n\r\n if (!this) {\r\n self = returnObject;\r\n return returnObject;\r\n }\r\n\r\n // if someone wants to use RecordRTC with the \"new\" keyword.\r\n for (var prop in returnObject) {\r\n this[prop] = returnObject[prop];\r\n }\r\n\r\n self = this;\r\n\r\n return returnObject;\r\n}\r\n\r\nRecordRTC.version = '5.6.2';\r\n\r\nif (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = RecordRTC;\r\n}\r\n\r\nif (typeof define === 'function' && define.amd) {\r\n define('RecordRTC', [], function() {\r\n return RecordRTC;\r\n });\r\n}\n\r\nRecordRTC.getFromDisk = function(type, callback) {\r\n if (!callback) {\r\n throw 'callback is mandatory.';\r\n }\r\n\r\n console.log('Getting recorded ' + (type === 'all' ? 'blobs' : type + ' blob ') + ' from disk!');\r\n DiskStorage.Fetch(function(dataURL, _type) {\r\n if (type !== 'all' && _type === type + 'Blob' && callback) {\r\n callback(dataURL);\r\n }\r\n\r\n if (type === 'all' && callback) {\r\n callback(dataURL, _type.replace('Blob', ''));\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * RecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nRecordRTC.writeToDisk = function(options) {\r\n console.log('Writing recorded blob(s) to disk!');\r\n options = options || {};\r\n if (options.audio && options.video && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.video) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.video && options.gif) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL\r\n });\r\n });\r\n } else if (options.video) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n } else if (options.gif) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n }\r\n};\n\r\n// __________________________\r\n// RecordRTC-Configuration.js\r\n\r\n/**\r\n * {@link RecordRTCConfiguration} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It configures the 2nd parameter passed over {@link RecordRTC} and returns a valid \"config\" object.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCConfiguration\r\n * @class\r\n * @example\r\n * var options = RecordRTCConfiguration(mediaStream, options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, getNativeBlob:true, etc.}\r\n */\r\n\r\nfunction RecordRTCConfiguration(mediaStream, config) {\r\n if (!config.recorderType && !config.type) {\r\n if (!!config.audio && !!config.video) {\r\n config.type = 'video';\r\n } else if (!!config.audio && !config.video) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n if (config.recorderType && !config.type) {\r\n if (config.recorderType === WhammyRecorder || config.recorderType === CanvasRecorder || (typeof WebAssemblyRecorder !== 'undefined' && config.recorderType === WebAssemblyRecorder)) {\r\n config.type = 'video';\r\n } else if (config.recorderType === GifRecorder) {\r\n config.type = 'gif';\r\n } else if (config.recorderType === StereoAudioRecorder) {\r\n config.type = 'audio';\r\n } else if (config.recorderType === MediaStreamRecorder) {\r\n if (getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (!getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (getTracks(mediaStream, 'audio').length && !getTracks(mediaStream, 'video').length) {\r\n config.type = 'audio';\r\n } else {\r\n // config.type = 'UnKnown';\r\n }\r\n }\r\n }\r\n\r\n if (typeof MediaStreamRecorder !== 'undefined' && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (!config.mimeType) {\r\n config.mimeType = 'video/webm';\r\n }\r\n\r\n if (!config.type) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n\r\n if (!config.bitsPerSecond) {\r\n // config.bitsPerSecond = 128000;\r\n }\r\n }\r\n\r\n // consider default type=audio\r\n if (!config.type) {\r\n if (config.mimeType) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n if (!config.type) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n return config;\r\n}\n\r\n// __________________\r\n// GetRecorderType.js\r\n\r\n/**\r\n * {@link GetRecorderType} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It returns best recorder-type available for your browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GetRecorderType\r\n * @class\r\n * @example\r\n * var RecorderType = GetRecorderType(options);\r\n * var recorder = new RecorderType(options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction GetRecorderType(mediaStream, config) {\r\n var recorder;\r\n\r\n // StereoAudioRecorder can work with all three: Edge, Firefox and Chrome\r\n // todo: detect if it is Edge, then auto use: StereoAudioRecorder\r\n if (isChrome || isEdge || isOpera) {\r\n // Media Stream Recording API has not been implemented in chrome yet;\r\n // That's why using WebAudio API to record stereo audio in WAV format\r\n recorder = StereoAudioRecorder;\r\n }\r\n\r\n if (typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype && !isChrome) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n // video recorder (in WebM format)\r\n if (config.type === 'video' && (isChrome || isOpera)) {\r\n recorder = WhammyRecorder;\r\n\r\n if (typeof WebAssemblyRecorder !== 'undefined' && typeof ReadableStream !== 'undefined') {\r\n recorder = WebAssemblyRecorder;\r\n }\r\n }\r\n\r\n // video recorder (in Gif format)\r\n if (config.type === 'gif') {\r\n recorder = GifRecorder;\r\n }\r\n\r\n // html2canvas recording!\r\n if (config.type === 'canvas') {\r\n recorder = CanvasRecorder;\r\n }\r\n\r\n if (isMediaRecorderCompatible() && recorder !== CanvasRecorder && recorder !== GifRecorder && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (getTracks(mediaStream, 'video').length || getTracks(mediaStream, 'audio').length) {\r\n // audio-only recording\r\n if (config.type === 'audio') {\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('audio/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n // else recorder = StereoAudioRecorder;\r\n } else {\r\n // video or screen tracks\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('video/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (mediaStream instanceof Array && mediaStream.length) {\r\n recorder = MultiStreamRecorder;\r\n }\r\n\r\n if (config.recorderType) {\r\n recorder = config.recorderType;\r\n }\r\n\r\n if (!config.disableLogs && !!recorder && !!recorder.name) {\r\n console.log('Using recorderType:', recorder.name || recorder.constructor.name);\r\n }\r\n\r\n if (!recorder && isSafari) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n return recorder;\r\n}\n\r\n// _____________\r\n// MRecordRTC.js\r\n\r\n/**\r\n * MRecordRTC runs on top of {@link RecordRTC} to bring multiple recordings in a single place, by providing simple API.\r\n * @summary MRecordRTC stands for \"Multiple-RecordRTC\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MRecordRTC\r\n * @class\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.addStream(MediaStream);\r\n * recorder.mediaType = {\r\n * audio: true, // or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif: true // or GifRecorder\r\n * };\r\n * // mimeType is optional and should be set only in advance cases.\r\n * recorder.mimeType = {\r\n * audio: 'audio/wav',\r\n * video: 'video/webm',\r\n * gif: 'image/gif'\r\n * };\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC/tree/master/MRecordRTC|MRecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction MRecordRTC(mediaStream) {\r\n\r\n /**\r\n * This method attaches MediaStream object to {@link MRecordRTC}.\r\n * @param {MediaStream} mediaStream - A MediaStream object, either fetched using getUserMedia API, or generated using captureStreamUntilEnded or WebAudio API.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.addStream(MediaStream);\r\n */\r\n this.addStream = function(_mediaStream) {\r\n if (_mediaStream) {\r\n mediaStream = _mediaStream;\r\n }\r\n };\r\n\r\n /**\r\n * This property can be used to set the recording type e.g. audio, or video, or gif, or canvas.\r\n * @property {object} mediaType - {audio: true, video: true, gif: true}\r\n * @memberof MRecordRTC\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.mediaType = {\r\n * audio: true, // TRUE or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // TRUE or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif : true // TRUE or GifRecorder\r\n * };\r\n */\r\n this.mediaType = {\r\n audio: true,\r\n video: true\r\n };\r\n\r\n /**\r\n * This method starts recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.startRecording();\r\n */\r\n this.startRecording = function() {\r\n var mediaType = this.mediaType;\r\n var recorderType;\r\n var mimeType = this.mimeType || {\r\n audio: null,\r\n video: null,\r\n gif: null\r\n };\r\n\r\n if (typeof mediaType.audio !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'audio').length) {\r\n mediaType.audio = false;\r\n }\r\n\r\n if (typeof mediaType.video !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.video = false;\r\n }\r\n\r\n if (typeof mediaType.gif !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.gif = false;\r\n }\r\n\r\n if (!mediaType.audio && !mediaType.video && !mediaType.gif) {\r\n throw 'MediaStream must have either audio or video tracks.';\r\n }\r\n\r\n if (!!mediaType.audio) {\r\n recorderType = null;\r\n if (typeof mediaType.audio === 'function') {\r\n recorderType = mediaType.audio;\r\n }\r\n\r\n this.audioRecorder = new RecordRTC(mediaStream, {\r\n type: 'audio',\r\n bufferSize: this.bufferSize,\r\n sampleRate: this.sampleRate,\r\n numberOfAudioChannels: this.numberOfAudioChannels || 2,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.audio,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp\r\n });\r\n\r\n if (!mediaType.video) {\r\n this.audioRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.video) {\r\n recorderType = null;\r\n if (typeof mediaType.video === 'function') {\r\n recorderType = mediaType.video;\r\n }\r\n\r\n var newStream = mediaStream;\r\n\r\n if (isMediaRecorderCompatible() && !!mediaType.audio && typeof mediaType.audio === 'function') {\r\n var videoTrack = getTracks(mediaStream, 'video')[0];\r\n\r\n if (isFirefox) {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n\r\n if (recorderType && recorderType === WhammyRecorder) {\r\n // Firefox does NOT supports webp-encoding yet\r\n // But Firefox do supports WebAssemblyRecorder\r\n recorderType = MediaStreamRecorder;\r\n }\r\n } else {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n }\r\n }\r\n\r\n this.videoRecorder = new RecordRTC(newStream, {\r\n type: 'video',\r\n video: this.video,\r\n canvas: this.canvas,\r\n frameInterval: this.frameInterval || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.video,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp,\r\n workerPath: this.workerPath,\r\n webAssemblyPath: this.webAssemblyPath,\r\n frameRate: this.frameRate, // used by WebAssemblyRecorder; values: usually 30; accepts any.\r\n bitrate: this.bitrate // used by WebAssemblyRecorder; values: 0 to 1000+\r\n });\r\n\r\n if (!mediaType.audio) {\r\n this.videoRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.audio && !!mediaType.video) {\r\n var self = this;\r\n\r\n var isSingleRecorder = isMediaRecorderCompatible() === true;\r\n\r\n if (mediaType.audio instanceof StereoAudioRecorder && !!mediaType.video) {\r\n isSingleRecorder = false;\r\n } else if (mediaType.audio !== true && mediaType.video !== true && mediaType.audio !== mediaType.video) {\r\n isSingleRecorder = false;\r\n }\r\n\r\n if (isSingleRecorder === true) {\r\n self.audioRecorder = null;\r\n self.videoRecorder.startRecording();\r\n } else {\r\n self.videoRecorder.initRecorder(function() {\r\n self.audioRecorder.initRecorder(function() {\r\n // Both recorders are ready to record things accurately\r\n self.videoRecorder.startRecording();\r\n self.audioRecorder.startRecording();\r\n });\r\n });\r\n }\r\n }\r\n\r\n if (!!mediaType.gif) {\r\n recorderType = null;\r\n if (typeof mediaType.gif === 'function') {\r\n recorderType = mediaType.gif;\r\n }\r\n this.gifRecorder = new RecordRTC(mediaStream, {\r\n type: 'gif',\r\n frameRate: this.frameRate || 200,\r\n quality: this.quality || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.gif\r\n });\r\n this.gifRecorder.startRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording.\r\n * @param {function} callback - Callback function is invoked when all encoders finished their jobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.stopRecording(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n */\r\n this.stopRecording = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (this.audioRecorder) {\r\n this.audioRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'audio');\r\n });\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'video');\r\n });\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'gif');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.pauseRecording();\r\n */\r\n this.pauseRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.pauseRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.pauseRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.pauseRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.resumeRecording();\r\n */\r\n this.resumeRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.resumeRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.resumeRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.resumeRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs.\r\n * @param {function} callback - All recorded blobs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getBlob(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n * // or\r\n * var audioBlob = recorder.getBlob().audio;\r\n * var videoBlob = recorder.getBlob().video;\r\n */\r\n this.getBlob = function(callback) {\r\n var output = {};\r\n\r\n if (this.audioRecorder) {\r\n output.audio = this.audioRecorder.getBlob();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n output.video = this.videoRecorder.getBlob();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n output.gif = this.gifRecorder.getBlob();\r\n }\r\n\r\n if (callback) {\r\n callback(output);\r\n }\r\n\r\n return output;\r\n };\r\n\r\n /**\r\n * Destroy all recorder instances.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n this.destroy = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.destroy();\r\n this.audioRecorder = null;\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.destroy();\r\n this.videoRecorder = null;\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.destroy();\r\n this.gifRecorder = null;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs' DataURLs.\r\n * @param {function} callback - All recorded blobs' DataURLs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getDataURL(function(recording){\r\n * var audioDataURL = recording.audio;\r\n * var videoDataURL = recording.video;\r\n * var gifDataURL = recording.gif;\r\n * });\r\n */\r\n this.getDataURL = function(callback) {\r\n this.getBlob(function(blob) {\r\n if (blob.audio && blob.video) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n audio: _audioDataURL,\r\n video: _videoDataURL\r\n });\r\n });\r\n });\r\n } else if (blob.audio) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n callback({\r\n audio: _audioDataURL\r\n });\r\n });\r\n } else if (blob.video) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n video: _videoDataURL\r\n });\r\n });\r\n }\r\n });\r\n\r\n function getDataURL(blob, callback00) {\r\n if (typeof Worker !== 'undefined') {\r\n var webWorker = processInWebWorker(function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n });\r\n\r\n webWorker.onmessage = function(event) {\r\n callback00(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback00(event.target.result);\r\n };\r\n }\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n var url;\r\n if (typeof URL !== 'undefined') {\r\n url = URL;\r\n } else if (typeof webkitURL !== 'undefined') {\r\n url = webkitURL;\r\n } else {\r\n throw 'Neither URL nor webkitURL detected.';\r\n }\r\n url.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to ask {@link MRecordRTC} to write all recorded blobs into IndexedDB storage.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.writeToDisk();\r\n */\r\n this.writeToDisk = function() {\r\n RecordRTC.writeToDisk({\r\n audio: this.audioRecorder,\r\n video: this.videoRecorder,\r\n gif: this.gifRecorder\r\n });\r\n };\r\n\r\n /**\r\n * This method can be used to invoke a save-as dialog for all recorded blobs.\r\n * @param {object} args - {audio: 'audio-name', video: 'video-name', gif: 'gif-name'}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.save({\r\n * audio: 'audio-file-name',\r\n * video: 'video-file-name',\r\n * gif : 'gif-file-name'\r\n * });\r\n */\r\n this.save = function(args) {\r\n args = args || {\r\n audio: true,\r\n video: true,\r\n gif: true\r\n };\r\n\r\n if (!!args.audio && this.audioRecorder) {\r\n this.audioRecorder.save(typeof args.audio === 'string' ? args.audio : '');\r\n }\r\n\r\n if (!!args.video && this.videoRecorder) {\r\n this.videoRecorder.save(typeof args.video === 'string' ? args.video : '');\r\n }\r\n if (!!args.gif && this.gifRecorder) {\r\n this.gifRecorder.save(typeof args.gif === 'string' ? args.gif : '');\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * This method can be used to get all recorded blobs from IndexedDB storage.\r\n * @param {string} type - 'all' or 'audio' or 'video' or 'gif'\r\n * @param {function} callback - Callback function to get all stored blobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.getFromDisk('all', function(dataURL, type){\r\n * if(type === 'audio') { }\r\n * if(type === 'video') { }\r\n * if(type === 'gif') { }\r\n * });\r\n */\r\nMRecordRTC.getFromDisk = RecordRTC.getFromDisk;\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nMRecordRTC.writeToDisk = RecordRTC.writeToDisk;\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MRecordRTC = MRecordRTC;\r\n}\n\r\nvar browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n(function(that) {\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n})(typeof global !== 'undefined' ? global : null);\n\r\n// _____________________________\r\n// Cross-Browser-Declarations.js\r\n\r\n// animation-frame used in WebM recording\r\n\r\n/*jshint -W079 */\r\nvar requestAnimationFrame = window.requestAnimationFrame;\r\nif (typeof requestAnimationFrame === 'undefined') {\r\n if (typeof webkitRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = webkitRequestAnimationFrame;\r\n } else if (typeof mozRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = mozRequestAnimationFrame;\r\n } else if (typeof msRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = msRequestAnimationFrame;\r\n } else if (typeof requestAnimationFrame === 'undefined') {\r\n // via: https://gist.github.com/paulirish/1579671\r\n var lastTime = 0;\r\n\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = function(callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n var id = setTimeout(function() {\r\n callback(currTime + timeToCall);\r\n }, timeToCall);\r\n lastTime = currTime + timeToCall;\r\n return id;\r\n };\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar cancelAnimationFrame = window.cancelAnimationFrame;\r\nif (typeof cancelAnimationFrame === 'undefined') {\r\n if (typeof webkitCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = webkitCancelAnimationFrame;\r\n } else if (typeof mozCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = mozCancelAnimationFrame;\r\n } else if (typeof msCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = msCancelAnimationFrame;\r\n } else if (typeof cancelAnimationFrame === 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = function(id) {\r\n clearTimeout(id);\r\n };\r\n }\r\n}\r\n\r\n// WebAudio API representer\r\nvar AudioContext = window.AudioContext;\r\n\r\nif (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar URL = window.URL;\r\n\r\nif (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n}\r\n\r\nif (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n}\r\n\r\nvar isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveBlob || !!navigator.msSaveOrOpenBlob);\r\nvar isOpera = !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1;\r\nvar isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && ('netscape' in window) && / rv:/.test(navigator.userAgent);\r\nvar isChrome = (!isOpera && !isEdge && !!navigator.webkitGetUserMedia) || isElectron() || navigator.userAgent.toLowerCase().indexOf('chrome/') !== -1;\r\n\r\nvar isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\nif (isSafari && !isChrome && navigator.userAgent.indexOf('CriOS') !== -1) {\r\n isSafari = false;\r\n isChrome = true;\r\n}\r\n\r\nvar MediaStream = window.MediaStream;\r\n\r\nif (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n}\r\n\r\n/*global MediaStream:true */\r\nif (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n}\r\n\r\n// below function via: http://goo.gl/B3ae8c\r\n/**\r\n * Return human-readable file size.\r\n * @param {number} bytes - Pass bytes and get formatted string.\r\n * @returns {string} - formatted string\r\n * @example\r\n * bytesToSize(1024*1024*5) === '5 GB'\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction bytesToSize(bytes) {\r\n var k = 1000;\r\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n if (bytes === 0) {\r\n return '0 Bytes';\r\n }\r\n var i = parseInt(Math.floor(Math.log(bytes) / Math.log(k)), 10);\r\n return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object. This parameter is required.\r\n * @param {string} fileName - Optional file name e.g. \"Recorded-Video.webm\"\r\n * @example\r\n * invokeSaveAsDialog(blob or file, [optional] fileName);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction invokeSaveAsDialog(file, fileName) {\r\n if (!file) {\r\n throw 'Blob object is required.';\r\n }\r\n\r\n if (!file.type) {\r\n try {\r\n file.type = 'video/webm';\r\n } catch (e) {}\r\n }\r\n\r\n var fileExtension = (file.type || 'video/webm').split('/')[1];\r\n if (fileExtension.indexOf(';') !== -1) {\r\n // extended mimetype, e.g. 'video/webm;codecs=vp8,opus'\r\n fileExtension = fileExtension.split(';')[0];\r\n }\r\n if (fileName && fileName.indexOf('.') !== -1) {\r\n var splitted = fileName.split('.');\r\n fileName = splitted[0];\r\n fileExtension = splitted[1];\r\n }\r\n\r\n var fileFullName = (fileName || (Math.round(Math.random() * 9999999999) + 888888888)) + '.' + fileExtension;\r\n\r\n if (typeof navigator.msSaveOrOpenBlob !== 'undefined') {\r\n return navigator.msSaveOrOpenBlob(file, fileFullName);\r\n } else if (typeof navigator.msSaveBlob !== 'undefined') {\r\n return navigator.msSaveBlob(file, fileFullName);\r\n }\r\n\r\n var hyperlink = document.createElement('a');\r\n hyperlink.href = URL.createObjectURL(file);\r\n hyperlink.download = fileFullName;\r\n\r\n hyperlink.style = 'display:none;opacity:0;color:transparent;';\r\n (document.body || document.documentElement).appendChild(hyperlink);\r\n\r\n if (typeof hyperlink.click === 'function') {\r\n hyperlink.click();\r\n } else {\r\n hyperlink.target = '_blank';\r\n hyperlink.dispatchEvent(new MouseEvent('click', {\r\n view: window,\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n }\r\n\r\n URL.revokeObjectURL(hyperlink.href);\r\n}\r\n\r\n/**\r\n * from: https://github.com/cheton/is-electron/blob/master/index.js\r\n **/\r\nfunction isElectron() {\r\n // Renderer process\r\n if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {\r\n return true;\r\n }\r\n\r\n // Main process\r\n if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {\r\n return true;\r\n }\r\n\r\n // Detect the user agent when the `nodeIntegration` option is set to true\r\n if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTracks(stream, kind) {\r\n if (!stream || !stream.getTracks) {\r\n return [];\r\n }\r\n\r\n return stream.getTracks().filter(function(t) {\r\n return t.kind === (kind || 'audio');\r\n });\r\n}\r\n\r\nfunction setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object.\r\n * @param {function} callback - Callback function.\r\n * @example\r\n * getSeekableBlob(blob or file, callback);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction getSeekableBlob(inputBlob, callback) {\r\n // EBML.js copyrights goes to: https://github.com/legokichi/ts-ebml\r\n if (typeof EBML === 'undefined') {\r\n throw new Error('Please link: https://www.webrtc-experiment.com/EBML.js');\r\n }\r\n\r\n var reader = new EBML.Reader();\r\n var decoder = new EBML.Decoder();\r\n var tools = EBML.tools;\r\n\r\n var fileReader = new FileReader();\r\n fileReader.onload = function(e) {\r\n var ebmlElms = decoder.decode(this.result);\r\n ebmlElms.forEach(function(element) {\r\n reader.read(element);\r\n });\r\n reader.stop();\r\n var refinedMetadataBuf = tools.makeMetadataSeekable(reader.metadatas, reader.duration, reader.cues);\r\n var body = this.result.slice(reader.metadataSize);\r\n var newBlob = new Blob([refinedMetadataBuf, body], {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(newBlob);\r\n };\r\n fileReader.readAsArrayBuffer(inputBlob);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.invokeSaveAsDialog = invokeSaveAsDialog;\r\n RecordRTC.getTracks = getTracks;\r\n RecordRTC.getSeekableBlob = getSeekableBlob;\r\n RecordRTC.bytesToSize = bytesToSize;\r\n RecordRTC.isElectron = isElectron;\r\n}\r\n\r\n// __________ (used to handle stuff like http://goo.gl/xmE5eg) issue #129\r\n// Storage.js\r\n\r\n/**\r\n * Storage is a standalone object used by {@link RecordRTC} to store reusable objects e.g. \"new AudioContext\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * Storage.AudioContext === webkitAudioContext\r\n * @property {webkitAudioContext} AudioContext - Keeps a reference to AudioContext object.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Storage = {};\r\n\r\nif (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n} else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Storage = Storage;\r\n}\n\r\nfunction isMediaRecorderCompatible() {\r\n if (isFirefox || isSafari || isEdge) {\r\n return true;\r\n }\r\n\r\n var nVer = navigator.appVersion;\r\n var nAgt = navigator.userAgent;\r\n var fullVersion = '' + parseFloat(navigator.appVersion);\r\n var majorVersion = parseInt(navigator.appVersion, 10);\r\n var nameOffset, verOffset, ix;\r\n\r\n if (isChrome || isOpera) {\r\n verOffset = nAgt.indexOf('Chrome');\r\n fullVersion = nAgt.substring(verOffset + 7);\r\n }\r\n\r\n // trim the fullVersion string at semicolon/space if present\r\n if ((ix = fullVersion.indexOf(';')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n if ((ix = fullVersion.indexOf(' ')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n majorVersion = parseInt('' + fullVersion, 10);\r\n\r\n if (isNaN(majorVersion)) {\r\n fullVersion = '' + parseFloat(navigator.appVersion);\r\n majorVersion = parseInt(navigator.appVersion, 10);\r\n }\r\n\r\n return majorVersion >= 49;\r\n}\n\r\n// ______________________\r\n// MediaStreamRecorder.js\r\n\r\n/**\r\n * MediaStreamRecorder is an abstraction layer for {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}. It is used by {@link RecordRTC} to record MediaStream(s) in both Chrome and Firefox.\r\n * @summary Runs top over {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://github.com/muaz-khan|Muaz Khan}\r\n * @typedef MediaStreamRecorder\r\n * @class\r\n * @example\r\n * var config = {\r\n * mimeType: 'video/webm', // vp8, vp9, h264, mkv, opus/vorbis\r\n * audioBitsPerSecond : 256 * 8 * 1024,\r\n * videoBitsPerSecond : 256 * 8 * 1024,\r\n * bitsPerSecond: 256 * 8 * 1024, // if this is provided, skip above two\r\n * checkForInactiveTracks: true,\r\n * timeSlice: 1000, // concatenate intervals based blobs\r\n * ondataavailable: function() {} // get intervals based blobs\r\n * }\r\n * var recorder = new MediaStreamRecorder(mediaStream, config);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs:true, initCallback: function, mimeType: \"video/webm\", timeSlice: 1000}\r\n * @throws Will throw an error if first argument \"MediaStream\" is missing. Also throws error if \"MediaRecorder API\" are not supported by the browser.\r\n */\r\n\r\nfunction MediaStreamRecorder(mediaStream, config) {\r\n var self = this;\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n if (typeof MediaRecorder === 'undefined') {\r\n throw 'Your browser does not support the Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.';\r\n }\r\n\r\n config = config || {\r\n // bitsPerSecond: 256 * 8 * 1024,\r\n mimeType: 'video/webm'\r\n };\r\n\r\n if (config.type === 'audio') {\r\n if (getTracks(mediaStream, 'video').length && getTracks(mediaStream, 'audio').length) {\r\n var stream;\r\n if (!!navigator.mozGetUserMedia) {\r\n stream = new MediaStream();\r\n stream.addTrack(getTracks(mediaStream, 'audio')[0]);\r\n } else {\r\n // webkitMediaStream\r\n stream = new MediaStream(getTracks(mediaStream, 'audio'));\r\n }\r\n mediaStream = stream;\r\n }\r\n\r\n if (!config.mimeType || config.mimeType.toString().toLowerCase().indexOf('audio') === -1) {\r\n config.mimeType = isChrome ? 'audio/webm' : 'audio/ogg';\r\n }\r\n\r\n if (config.mimeType && config.mimeType.toString().toLowerCase() !== 'audio/ogg' && !!navigator.mozGetUserMedia) {\r\n // forcing better codecs on Firefox (via #166)\r\n config.mimeType = 'audio/ogg';\r\n }\r\n }\r\n\r\n var arrayOfBlobs = [];\r\n\r\n /**\r\n * This method returns array of blobs. Use only with \"timeSlice\". Its useful to preview recording anytime, without using the \"stop\" method.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var arrayOfBlobs = recorder.getArrayOfBlobs();\r\n * @returns {Array} Returns array of recorded blobs.\r\n */\r\n this.getArrayOfBlobs = function() {\r\n return arrayOfBlobs;\r\n };\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // set defaults\r\n self.blob = null;\r\n self.clearRecordedData();\r\n self.timestamps = [];\r\n allStates = [];\r\n arrayOfBlobs = [];\r\n\r\n var recorderHints = config;\r\n\r\n if (!config.disableLogs) {\r\n console.log('Passing following config over MediaRecorder API.', recorderHints);\r\n }\r\n\r\n if (mediaRecorder) {\r\n // mandatory to make sure Firefox doesn't fails to record streams 3-4 times without reloading the page.\r\n mediaRecorder = null;\r\n }\r\n\r\n if (isChrome && !isMediaRecorderCompatible()) {\r\n // to support video-only recording on stable\r\n recorderHints = 'video/vp8';\r\n }\r\n\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && recorderHints.mimeType) {\r\n if (!MediaRecorder.isTypeSupported(recorderHints.mimeType)) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n\r\n recorderHints.mimeType = config.type === 'audio' ? 'audio/webm' : 'video/webm';\r\n }\r\n }\r\n\r\n // using MediaRecorder API here\r\n try {\r\n mediaRecorder = new MediaRecorder(mediaStream, recorderHints);\r\n\r\n // reset\r\n config.mimeType = recorderHints.mimeType;\r\n } catch (e) {\r\n // chrome-based fallback\r\n mediaRecorder = new MediaRecorder(mediaStream);\r\n }\r\n\r\n // old hack?\r\n if (recorderHints.mimeType && !MediaRecorder.isTypeSupported && 'canRecordMimeType' in mediaRecorder && mediaRecorder.canRecordMimeType(recorderHints.mimeType) === false) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n }\r\n\r\n // Dispatching OnDataAvailable Handler\r\n mediaRecorder.ondataavailable = function(e) {\r\n if (e.data) {\r\n allStates.push('ondataavailable: ' + bytesToSize(e.data.size));\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n if (e.data && e.data.size) {\r\n arrayOfBlobs.push(e.data);\r\n updateTimeStamp();\r\n\r\n if (typeof config.ondataavailable === 'function') {\r\n // intervals based blobs\r\n var blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n config.ondataavailable(blob);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (!e.data || !e.data.size || e.data.size < 100 || self.blob) {\r\n // make sure that stopRecording always getting fired\r\n // even if there is invalid data\r\n if (self.recordingCallback) {\r\n self.recordingCallback(new Blob([], {\r\n type: getMimeType(recorderHints)\r\n }));\r\n self.recordingCallback = null;\r\n }\r\n return;\r\n }\r\n\r\n self.blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n\r\n if (self.recordingCallback) {\r\n self.recordingCallback(self.blob);\r\n self.recordingCallback = null;\r\n }\r\n };\r\n\r\n mediaRecorder.onstart = function() {\r\n allStates.push('started');\r\n };\r\n\r\n mediaRecorder.onpause = function() {\r\n allStates.push('paused');\r\n };\r\n\r\n mediaRecorder.onresume = function() {\r\n allStates.push('resumed');\r\n };\r\n\r\n mediaRecorder.onstop = function() {\r\n allStates.push('stopped');\r\n };\r\n\r\n mediaRecorder.onerror = function(error) {\r\n if (!error) {\r\n return;\r\n }\r\n\r\n if (!error.name) {\r\n error.name = 'UnknownError';\r\n }\r\n\r\n allStates.push('error: ' + error);\r\n\r\n if (!config.disableLogs) {\r\n // via: https://w3c.github.io/mediacapture-record/MediaRecorder.html#exception-summary\r\n if (error.name.toString().toLowerCase().indexOf('invalidstate') !== -1) {\r\n console.error('The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('notsupported') !== -1) {\r\n console.error('MIME type (', recorderHints.mimeType, ') is not supported.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('security') !== -1) {\r\n console.error('MediaRecorder security error', error);\r\n }\r\n\r\n // older code below\r\n else if (error.name === 'OutOfMemory') {\r\n console.error('The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'IllegalStreamModification') {\r\n console.error('A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'OtherRecordingError') {\r\n console.error('Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'GenericError') {\r\n console.error('The UA cannot provide the codec or recording option that has been requested.', error);\r\n } else {\r\n console.error('MediaRecorder Error', error);\r\n }\r\n }\r\n\r\n (function(looper) {\r\n if (!self.manuallyStopped && mediaRecorder && mediaRecorder.state === 'inactive') {\r\n delete config.timeslice;\r\n\r\n // 10 minutes, enough?\r\n mediaRecorder.start(10 * 60 * 1000);\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000);\r\n })();\r\n\r\n if (mediaRecorder.state !== 'inactive' && mediaRecorder.state !== 'stopped') {\r\n mediaRecorder.stop();\r\n }\r\n };\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n updateTimeStamp();\r\n mediaRecorder.start(config.timeSlice);\r\n } else {\r\n // default is 60 minutes; enough?\r\n // use config => {timeSlice: 1000} otherwise\r\n\r\n mediaRecorder.start(3.6e+6);\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback(); // old code\r\n }\r\n };\r\n\r\n /**\r\n * @property {Array} timestamps - Array of time stamps\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * console.log(recorder.timestamps);\r\n */\r\n this.timestamps = [];\r\n\r\n function updateTimeStamp() {\r\n self.timestamps.push(new Date().getTime());\r\n\r\n if (typeof config.onTimeStamp === 'function') {\r\n config.onTimeStamp(self.timestamps[self.timestamps.length - 1], self.timestamps);\r\n }\r\n }\r\n\r\n function getMimeType(secondObject) {\r\n if (mediaRecorder && mediaRecorder.mimeType) {\r\n return mediaRecorder.mimeType;\r\n }\r\n\r\n return secondObject.mimeType || 'video/webm';\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n self.manuallyStopped = true; // used inside the mediaRecorder.onerror\r\n\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.recordingCallback = callback;\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.stop();\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n setTimeout(function() {\r\n self.blob = new Blob(arrayOfBlobs, {\r\n type: getMimeType(config)\r\n });\r\n\r\n self.recordingCallback(self.blob);\r\n }, 100);\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'paused') {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder && mediaRecorder.state === 'recording') {\r\n self.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n arrayOfBlobs = [];\r\n mediaRecorder = null;\r\n self.timestamps = [];\r\n }\r\n\r\n // Reference to \"MediaRecorder\" object\r\n var mediaRecorder;\r\n\r\n /**\r\n * Access to native MediaRecorder API\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @instance\r\n * @example\r\n * var internal = recorder.getInternalRecorder();\r\n * internal.ondataavailable = function() {}; // override\r\n * internal.stream, internal.onpause, internal.onstop, etc.\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n this.getInternalRecorder = function() {\r\n return mediaRecorder;\r\n };\r\n\r\n function isMediaStreamActive() {\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n\r\n\r\n /**\r\n * Get MediaRecorder readonly state.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n if (!mediaRecorder) {\r\n return 'inactive';\r\n }\r\n\r\n return mediaRecorder.state || 'inactive';\r\n };\r\n\r\n // list of all recording states\r\n var allStates = [];\r\n\r\n /**\r\n * Get MediaRecorder all recording states.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getAllStates();\r\n * @returns {Array} Returns all recording states\r\n */\r\n this.getAllStates = function() {\r\n return allStates;\r\n };\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = false; // disable to minimize CPU usage\r\n }\r\n\r\n var self = this;\r\n\r\n // this method checks if media stream is stopped\r\n // or if any track is ended.\r\n (function looper() {\r\n if (!mediaRecorder || config.checkForInactiveTracks === false) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n self.stop();\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000); // check every second\r\n })();\r\n\r\n // for debugging\r\n this.name = 'MediaStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MediaStreamRecorder = MediaStreamRecorder;\r\n}\r\n\r\n// source code from: http://typedarray.org/wp-content/projects/WebAudioRecorder/script.js\r\n// https://github.com/mattdiamond/Recorderjs#license-mit\r\n// ______________________\r\n// StereoAudioRecorder.js\r\n\r\n/**\r\n * StereoAudioRecorder is a standalone class used by {@link RecordRTC} to bring \"stereo\" audio-recording in chrome.\r\n * @summary JavaScript standalone object for stereo audio recording.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef StereoAudioRecorder\r\n * @class\r\n * @example\r\n * var recorder = new StereoAudioRecorder(MediaStream, {\r\n * sampleRate: 44100,\r\n * bufferSize: 4096\r\n * });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {sampleRate: 44100, bufferSize: 4096, numberOfAudioChannels: 1, etc.}\r\n */\r\n\r\nfunction StereoAudioRecorder(mediaStream, config) {\r\n if (!getTracks(mediaStream, 'audio').length) {\r\n throw 'Your stream has no audio tracks.';\r\n }\r\n\r\n config = config || {};\r\n\r\n var self = this;\r\n\r\n // variables\r\n var leftchannel = [];\r\n var rightchannel = [];\r\n var recording = false;\r\n var recordingLength = 0;\r\n var jsAudioNode;\r\n\r\n var numberOfAudioChannels = 2;\r\n\r\n /**\r\n * Set sample rates such as 8K or 16K. Reference: http://stackoverflow.com/a/28977136/552182\r\n * @property {number} desiredSampRate - Desired Bits per sample * 1000\r\n * @memberof StereoAudioRecorder\r\n * @instance\r\n * @example\r\n * var recorder = StereoAudioRecorder(mediaStream, {\r\n * desiredSampRate: 16 * 1000 // bits-per-sample * 1000\r\n * });\r\n */\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n // backward compatibility\r\n if (config.leftChannel === true) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (config.numberOfAudioChannels === 1) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (!numberOfAudioChannels || numberOfAudioChannels < 1) {\r\n numberOfAudioChannels = 2;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('StereoAudioRecorder is set to record number of channels: ' + numberOfAudioChannels);\r\n }\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = true;\r\n }\r\n\r\n function isMediaStreamActive() {\r\n if (config.checkForInactiveTracks === false) {\r\n // always return \"true\"\r\n return true;\r\n }\r\n\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n resetVariables();\r\n\r\n isAudioProcessStarted = isPaused = false;\r\n recording = true;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n looper();\r\n }\r\n };\r\n\r\n function mergeLeftRightBuffers(config, callback) {\r\n function mergeAudioBuffers(config, cb) {\r\n var numberOfAudioChannels = config.numberOfAudioChannels;\r\n\r\n // todo: \"slice(0)\" --- is it causes loop? Should be removed?\r\n var leftBuffers = config.leftBuffers.slice(0);\r\n var rightBuffers = config.rightBuffers.slice(0);\r\n var sampleRate = config.sampleRate;\r\n var internalInterleavedLength = config.internalInterleavedLength;\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n rightBuffers = mergeBuffers(rightBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n rightBuffers = interpolateArray(rightBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n // set sample rate as desired sample rate\r\n if (desiredSampRate) {\r\n sampleRate = desiredSampRate;\r\n }\r\n\r\n // for changing the sampling rate, reference:\r\n // http://stackoverflow.com/a/28977136/552182\r\n function interpolateArray(data, newSampleRate, oldSampleRate) {\r\n var fitCount = Math.round(data.length * (newSampleRate / oldSampleRate));\r\n var newData = [];\r\n var springFactor = Number((data.length - 1) / (fitCount - 1));\r\n newData[0] = data[0];\r\n for (var i = 1; i < fitCount - 1; i++) {\r\n var tmp = i * springFactor;\r\n var before = Number(Math.floor(tmp)).toFixed();\r\n var after = Number(Math.ceil(tmp)).toFixed();\r\n var atPoint = tmp - before;\r\n newData[i] = linearInterpolate(data[before], data[after], atPoint);\r\n }\r\n newData[fitCount - 1] = data[data.length - 1];\r\n return newData;\r\n }\r\n\r\n function linearInterpolate(before, after, atPoint) {\r\n return before + (after - before) * atPoint;\r\n }\r\n\r\n function mergeBuffers(channelBuffer, rLength) {\r\n var result = new Float64Array(rLength);\r\n var offset = 0;\r\n var lng = channelBuffer.length;\r\n\r\n for (var i = 0; i < lng; i++) {\r\n var buffer = channelBuffer[i];\r\n result.set(buffer, offset);\r\n offset += buffer.length;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function interleave(leftChannel, rightChannel) {\r\n var length = leftChannel.length + rightChannel.length;\r\n\r\n var result = new Float64Array(length);\r\n\r\n var inputIndex = 0;\r\n\r\n for (var index = 0; index < length;) {\r\n result[index++] = leftChannel[inputIndex];\r\n result[index++] = rightChannel[inputIndex];\r\n inputIndex++;\r\n }\r\n return result;\r\n }\r\n\r\n function writeUTFBytes(view, offset, string) {\r\n var lng = string.length;\r\n for (var i = 0; i < lng; i++) {\r\n view.setUint8(offset + i, string.charCodeAt(i));\r\n }\r\n }\r\n\r\n // interleave both channels together\r\n var interleaved;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n interleaved = interleave(leftBuffers, rightBuffers);\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n interleaved = leftBuffers;\r\n }\r\n\r\n var interleavedLength = interleaved.length;\r\n\r\n // create wav file\r\n var resultingBufferLength = 44 + interleavedLength * 2;\r\n\r\n var buffer = new ArrayBuffer(resultingBufferLength);\r\n\r\n var view = new DataView(buffer);\r\n\r\n // RIFF chunk descriptor/identifier \r\n writeUTFBytes(view, 0, 'RIFF');\r\n\r\n // RIFF chunk length\r\n // changed \"44\" to \"36\" via #401\r\n view.setUint32(4, 36 + interleavedLength * 2, true);\r\n\r\n // RIFF type \r\n writeUTFBytes(view, 8, 'WAVE');\r\n\r\n // format chunk identifier \r\n // FMT sub-chunk\r\n writeUTFBytes(view, 12, 'fmt ');\r\n\r\n // format chunk length \r\n view.setUint32(16, 16, true);\r\n\r\n // sample format (raw)\r\n view.setUint16(20, 1, true);\r\n\r\n // stereo (2 channels)\r\n view.setUint16(22, numberOfAudioChannels, true);\r\n\r\n // sample rate \r\n view.setUint32(24, sampleRate, true);\r\n\r\n // byte rate (sample rate * block align)\r\n view.setUint32(28, sampleRate * numberOfAudioChannels * 2, true);\r\n\r\n // block align (channel count * bytes per sample) \r\n view.setUint16(32, numberOfAudioChannels * 2, true);\r\n\r\n // bits per sample \r\n view.setUint16(34, 16, true);\r\n\r\n // data sub-chunk\r\n // data chunk identifier \r\n writeUTFBytes(view, 36, 'data');\r\n\r\n // data chunk length \r\n view.setUint32(40, interleavedLength * 2, true);\r\n\r\n // write the PCM samples\r\n var lng = interleavedLength;\r\n var index = 44;\r\n var volume = 1;\r\n for (var i = 0; i < lng; i++) {\r\n view.setInt16(index, interleaved[i] * (0x7FFF * volume), true);\r\n index += 2;\r\n }\r\n\r\n if (cb) {\r\n return cb({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n postMessage({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n if (config.noWorker) {\r\n mergeAudioBuffers(config, function(data) {\r\n callback(data.buffer, data.view);\r\n });\r\n return;\r\n }\r\n\r\n\r\n var webWorker = processInWebWorker(mergeAudioBuffers);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data.buffer, event.data.view);\r\n\r\n // release memory\r\n URL.revokeObjectURL(webWorker.workerURL);\r\n\r\n // kill webworker (or Chrome will kill your page after ~25 calls)\r\n webWorker.terminate();\r\n };\r\n\r\n webWorker.postMessage(config);\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var workerURL = URL.createObjectURL(new Blob([_function.toString(),\r\n ';this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(workerURL);\r\n worker.workerURL = workerURL;\r\n return worker;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n // stop recording\r\n recording = false;\r\n\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: recordingLength,\r\n leftBuffers: leftchannel,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : rightchannel,\r\n noWorker: config.noWorker\r\n }, function(buffer, view) {\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n self.blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n\r\n /**\r\n * @property {ArrayBuffer} buffer - The recorded buffer object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var buffer = recorder.buffer;\r\n * });\r\n */\r\n self.buffer = new ArrayBuffer(view.buffer.byteLength);\r\n\r\n /**\r\n * @property {DataView} view - The recorded data-view object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var view = recorder.view;\r\n * });\r\n */\r\n self.view = view;\r\n\r\n self.sampleRate = desiredSampRate || sampleRate;\r\n self.bufferSize = bufferSize;\r\n\r\n // recorded audio length\r\n self.length = recordingLength;\r\n\r\n isAudioProcessStarted = false;\r\n\r\n if (callback) {\r\n callback(self.blob);\r\n }\r\n });\r\n };\r\n\r\n if (typeof RecordRTC.Storage === 'undefined') {\r\n RecordRTC.Storage = {\r\n AudioContextConstructor: null,\r\n AudioContext: window.AudioContext || window.webkitAudioContext\r\n };\r\n }\r\n\r\n if (!RecordRTC.Storage.AudioContextConstructor || RecordRTC.Storage.AudioContextConstructor.state === 'closed') {\r\n RecordRTC.Storage.AudioContextConstructor = new RecordRTC.Storage.AudioContext();\r\n }\r\n\r\n var context = RecordRTC.Storage.AudioContextConstructor;\r\n\r\n // creates an audio node from the microphone incoming stream\r\n var audioInput = context.createMediaStreamSource(mediaStream);\r\n\r\n var legalBufferValues = [0, 256, 512, 1024, 2048, 4096, 8192, 16384];\r\n\r\n /**\r\n * From the spec: This value controls how frequently the audioprocess event is\r\n * dispatched and how many sample-frames need to be processed each call.\r\n * Lower values for buffer size will result in a lower (better) latency.\r\n * Higher values will be necessary to avoid audio breakup and glitches\r\n * The size of the buffer (in sample-frames) which needs to\r\n * be processed each time onprocessaudio is called.\r\n * Legal values are (256, 512, 1024, 2048, 4096, 8192, 16384).\r\n * @property {number} bufferSize - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * bufferSize: 4096\r\n * });\r\n */\r\n\r\n // \"0\" means, let chrome decide the most accurate buffer-size for current platform.\r\n var bufferSize = typeof config.bufferSize === 'undefined' ? 4096 : config.bufferSize;\r\n\r\n if (legalBufferValues.indexOf(bufferSize) === -1) {\r\n if (!config.disableLogs) {\r\n console.log('Legal values for buffer-size are ' + JSON.stringify(legalBufferValues, null, '\\t'));\r\n }\r\n }\r\n\r\n if (context.createJavaScriptNode) {\r\n jsAudioNode = context.createJavaScriptNode(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else if (context.createScriptProcessor) {\r\n jsAudioNode = context.createScriptProcessor(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else {\r\n throw 'WebAudio API has no support on this browser.';\r\n }\r\n\r\n // connect the stream to the script processor\r\n audioInput.connect(jsAudioNode);\r\n\r\n if (!config.bufferSize) {\r\n bufferSize = jsAudioNode.bufferSize; // device buffer-size\r\n }\r\n\r\n /**\r\n * The sample rate (in sample-frames per second) at which the\r\n * AudioContext handles audio. It is assumed that all AudioNodes\r\n * in the context run at this rate. In making this assumption,\r\n * sample-rate converters or \"varispeed\" processors are not supported\r\n * in real-time processing.\r\n * The sampleRate parameter describes the sample-rate of the\r\n * linear PCM audio data in the buffer in sample-frames per second.\r\n * An implementation must support sample-rates in at least\r\n * the range 22050 to 96000.\r\n * @property {number} sampleRate - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * sampleRate: 44100\r\n * });\r\n */\r\n var sampleRate = typeof config.sampleRate !== 'undefined' ? config.sampleRate : context.sampleRate || 44100;\r\n\r\n if (sampleRate < 22050 || sampleRate > 96000) {\r\n // Ref: http://stackoverflow.com/a/26303918/552182\r\n if (!config.disableLogs) {\r\n console.log('sample-rate must be under range 22050 and 96000.');\r\n }\r\n }\r\n\r\n if (!config.disableLogs) {\r\n if (config.desiredSampRate) {\r\n console.log('Desired sample-rate: ' + config.desiredSampRate);\r\n }\r\n }\r\n\r\n var isPaused = false;\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n if (!recording) {\r\n if (!config.disableLogs) {\r\n console.log('Seems recording has been restarted.');\r\n }\r\n this.record();\r\n return;\r\n }\r\n\r\n isPaused = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n config.checkForInactiveTracks = false;\r\n\r\n if (recording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function resetVariables() {\r\n leftchannel = [];\r\n rightchannel = [];\r\n recordingLength = 0;\r\n isAudioProcessStarted = false;\r\n recording = false;\r\n isPaused = false;\r\n context = null;\r\n\r\n self.leftchannel = leftchannel;\r\n self.rightchannel = rightchannel;\r\n self.numberOfAudioChannels = numberOfAudioChannels;\r\n self.desiredSampRate = desiredSampRate;\r\n self.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n }\r\n\r\n function clearRecordedDataCB() {\r\n if (jsAudioNode) {\r\n jsAudioNode.onaudioprocess = null;\r\n jsAudioNode.disconnect();\r\n jsAudioNode = null;\r\n }\r\n\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n\r\n resetVariables();\r\n }\r\n\r\n // for debugging\r\n this.name = 'StereoAudioRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var isAudioProcessStarted = false;\r\n\r\n function onAudioProcessDataAvailable(e) {\r\n if (isPaused) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n jsAudioNode.disconnect();\r\n recording = false;\r\n }\r\n\r\n if (!recording) {\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n return;\r\n }\r\n\r\n /**\r\n * This method is called on \"onaudioprocess\" event's first invocation.\r\n * @method {function} onAudioProcessStarted\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.onAudioProcessStarted: function() { };\r\n */\r\n if (!isAudioProcessStarted) {\r\n isAudioProcessStarted = true;\r\n if (config.onAudioProcessStarted) {\r\n config.onAudioProcessStarted();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n }\r\n\r\n var left = e.inputBuffer.getChannelData(0);\r\n\r\n // we clone the samples\r\n var chLeft = new Float32Array(left);\r\n leftchannel.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n var right = e.inputBuffer.getChannelData(1);\r\n var chRight = new Float32Array(right);\r\n rightchannel.push(chRight);\r\n }\r\n\r\n recordingLength += bufferSize;\r\n\r\n // export raw PCM\r\n self.recordingLength = recordingLength;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n intervalsBasedBuffers.recordingLength += bufferSize;\r\n intervalsBasedBuffers.left.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n intervalsBasedBuffers.right.push(chRight);\r\n }\r\n }\r\n }\r\n\r\n jsAudioNode.onaudioprocess = onAudioProcessDataAvailable;\r\n\r\n // to prevent self audio to be connected with speakers\r\n if (context.createMediaStreamDestination) {\r\n jsAudioNode.connect(context.createMediaStreamDestination());\r\n } else {\r\n jsAudioNode.connect(context.destination);\r\n }\r\n\r\n // export raw PCM\r\n this.leftchannel = leftchannel;\r\n this.rightchannel = rightchannel;\r\n this.numberOfAudioChannels = numberOfAudioChannels;\r\n this.desiredSampRate = desiredSampRate;\r\n this.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n // helper for intervals based blobs\r\n var intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n\r\n // this looper is used to support intervals based blobs (via timeSlice+ondataavailable)\r\n function looper() {\r\n if (!recording || typeof config.ondataavailable !== 'function' || typeof config.timeSlice === 'undefined') {\r\n return;\r\n }\r\n\r\n if (intervalsBasedBuffers.left.length) {\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: intervalsBasedBuffers.recordingLength,\r\n leftBuffers: intervalsBasedBuffers.left,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : intervalsBasedBuffers.right\r\n }, function(buffer, view) {\r\n var blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n config.ondataavailable(blob);\r\n\r\n setTimeout(looper, config.timeSlice);\r\n });\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n } else {\r\n setTimeout(looper, config.timeSlice);\r\n }\r\n }\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.StereoAudioRecorder = StereoAudioRecorder;\r\n}\r\n\r\n// _________________\r\n// CanvasRecorder.js\r\n\r\n/**\r\n * CanvasRecorder is a standalone class used by {@link RecordRTC} to bring HTML5-Canvas recording into video WebM. It uses HTML2Canvas library and runs top over {@link Whammy}.\r\n * @summary HTML2Canvas recording into video WebM.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef CanvasRecorder\r\n * @class\r\n * @example\r\n * var recorder = new CanvasRecorder(htmlElement, { disableLogs: true, useWhammyRecorder: true });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {HTMLElement} htmlElement - querySelector/getElementById/getElementsByTagName[0]/etc.\r\n * @param {object} config - {disableLogs:true, initCallback: function}\r\n */\r\n\r\nfunction CanvasRecorder(htmlElement, config) {\r\n if (typeof html2canvas === 'undefined') {\r\n throw 'Please link: https://www.webrtc-experiment.com/screenshot.js';\r\n }\r\n\r\n config = config || {};\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n // via DetectRTC.js\r\n var isCanvasSupportsStreamCapturing = false;\r\n ['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function(item) {\r\n if (item in document.createElement('canvas')) {\r\n isCanvasSupportsStreamCapturing = true;\r\n }\r\n });\r\n\r\n var _isChrome = (!!window.webkitRTCPeerConnection || !!window.webkitGetUserMedia) && !!window.chrome;\r\n\r\n var chromeVersion = 50;\r\n var matchArray = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\r\n if (_isChrome && matchArray && matchArray[2]) {\r\n chromeVersion = parseInt(matchArray[2], 10);\r\n }\r\n\r\n if (_isChrome && chromeVersion < 52) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n if (config.useWhammyRecorder) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n var globalCanvas, mediaStreamRecorder;\r\n\r\n if (isCanvasSupportsStreamCapturing) {\r\n if (!config.disableLogs) {\r\n console.log('Your browser supports both MediRecorder API and canvas.captureStream!');\r\n }\r\n\r\n if (htmlElement instanceof HTMLCanvasElement) {\r\n globalCanvas = htmlElement;\r\n } else if (htmlElement instanceof CanvasRenderingContext2D) {\r\n globalCanvas = htmlElement.canvas;\r\n } else {\r\n throw 'Please pass either HTMLCanvasElement or CanvasRenderingContext2D.';\r\n }\r\n } else if (!!navigator.mozGetUserMedia) {\r\n if (!config.disableLogs) {\r\n console.error('Canvas recording is NOT supported in Firefox.');\r\n }\r\n }\r\n\r\n var isRecording;\r\n\r\n /**\r\n * This method records Canvas.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n isRecording = true;\r\n\r\n if (isCanvasSupportsStreamCapturing && !config.useWhammyRecorder) {\r\n // CanvasCaptureMediaStream\r\n var canvasMediaStream;\r\n if ('captureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.captureStream(25); // 25 FPS\r\n } else if ('mozCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.mozCaptureStream(25);\r\n } else if ('webkitCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.webkitCaptureStream(25);\r\n }\r\n\r\n try {\r\n var mdStream = new MediaStream();\r\n mdStream.addTrack(getTracks(canvasMediaStream, 'video')[0]);\r\n canvasMediaStream = mdStream;\r\n } catch (e) {}\r\n\r\n if (!canvasMediaStream) {\r\n throw 'captureStream API are NOT available.';\r\n }\r\n\r\n // Note: Jan 18, 2016 status is that, \r\n // Firefox MediaRecorder API can't record CanvasCaptureMediaStream object.\r\n mediaStreamRecorder = new MediaStreamRecorder(canvasMediaStream, {\r\n mimeType: config.mimeType || 'video/webm'\r\n });\r\n mediaStreamRecorder.record();\r\n } else {\r\n whammy.frames = [];\r\n lastTime = new Date().getTime();\r\n drawCanvasFrame();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n this.getWebPImages = function(callback) {\r\n if (htmlElement.nodeName.toLowerCase() !== 'canvas') {\r\n callback();\r\n return;\r\n }\r\n\r\n var framesLength = whammy.frames.length;\r\n whammy.frames.forEach(function(frame, idx) {\r\n var framesRemaining = framesLength - idx;\r\n if (!config.disableLogs) {\r\n console.log(framesRemaining + '/' + framesLength + ' frames remaining');\r\n }\r\n\r\n if (config.onEncodingCallback) {\r\n config.onEncodingCallback(framesRemaining, framesLength);\r\n }\r\n\r\n var webp = frame.image.toDataURL('image/webp', 1);\r\n whammy.frames[idx].image = webp;\r\n });\r\n\r\n if (!config.disableLogs) {\r\n console.log('Generating WebM');\r\n }\r\n\r\n callback();\r\n };\r\n\r\n /**\r\n * This method stops recording Canvas.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n isRecording = false;\r\n\r\n var that = this;\r\n\r\n if (isCanvasSupportsStreamCapturing && mediaStreamRecorder) {\r\n mediaStreamRecorder.stop(callback);\r\n return;\r\n }\r\n\r\n this.getWebPImages(function() {\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n if (!config.disableLogs) {\r\n console.log('Recording finished!');\r\n }\r\n\r\n that.blob = blob;\r\n\r\n if (that.blob.forEach) {\r\n that.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(that.blob);\r\n }\r\n\r\n whammy.frames = [];\r\n });\r\n });\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.pause();\r\n return;\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.resume();\r\n return;\r\n }\r\n\r\n if (!isRecording) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (isRecording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isRecording = false;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'CanvasRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n function cloneCanvas() {\r\n //create a new canvas\r\n var newCanvas = document.createElement('canvas');\r\n var context = newCanvas.getContext('2d');\r\n\r\n //set dimensions\r\n newCanvas.width = htmlElement.width;\r\n newCanvas.height = htmlElement.height;\r\n\r\n //apply the old canvas to the new one\r\n context.drawImage(htmlElement, 0, 0);\r\n\r\n //return the new canvas\r\n return newCanvas;\r\n }\r\n\r\n function drawCanvasFrame() {\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawCanvasFrame, 500);\r\n }\r\n\r\n if (htmlElement.nodeName.toLowerCase() === 'canvas') {\r\n var duration = new Date().getTime() - lastTime;\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: cloneCanvas(),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n return;\r\n }\r\n\r\n html2canvas(htmlElement, {\r\n grabMouse: typeof config.showMousePointer === 'undefined' || config.showMousePointer,\r\n onrendered: function(canvas) {\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: canvas.toDataURL('image/webp', 1),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n }\r\n });\r\n }\r\n\r\n var lastTime = new Date().getTime();\r\n\r\n var whammy = new Whammy.Video(100);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.CanvasRecorder = CanvasRecorder;\r\n}\n\r\n// _________________\r\n// WhammyRecorder.js\r\n\r\n/**\r\n * WhammyRecorder is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It runs top over {@link Whammy}.\r\n * @summary Video recording feature in Chrome.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WhammyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WhammyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs: true, initCallback: function, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction WhammyRecorder(mediaStream, config) {\r\n\r\n config = config || {};\r\n\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Using frames-interval:', config.frameInterval);\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (!config.width) {\r\n config.width = 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n context = canvas.getContext('2d');\r\n\r\n // setting defaults\r\n if (config.video && config.video instanceof HTMLVideoElement) {\r\n video = config.video.cloneNode();\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n } else {\r\n video = document.createElement('video');\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.onloadedmetadata = function() { // \"onloadedmetadata\" may NOT work in FF?\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n video.width = config.video.width;\r\n video.height = config.video.height;\r\n }\r\n\r\n video.muted = true;\r\n video.play();\r\n\r\n lastTime = new Date().getTime();\r\n whammy = new Whammy.Video();\r\n\r\n if (!config.disableLogs) {\r\n console.log('canvas resolutions', canvas.width, '*', canvas.height);\r\n console.log('video width/height', video.width || canvas.width, '*', video.height || canvas.height);\r\n }\r\n\r\n drawFrames(config.frameInterval);\r\n };\r\n\r\n /**\r\n * Draw and push frames to Whammy\r\n * @param {integer} frameInterval - set minimum interval (in milliseconds) between each time we push a frame to Whammy\r\n */\r\n function drawFrames(frameInterval) {\r\n frameInterval = typeof frameInterval !== 'undefined' ? frameInterval : 10;\r\n\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawFrames, 100);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n if (video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n whammy.frames.push({\r\n duration: duration,\r\n image: canvas.toDataURL('image/webp')\r\n });\r\n\r\n if (!isStopDrawing) {\r\n setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n }\r\n\r\n function asyncLoop(o) {\r\n var i = -1,\r\n length = o.length;\r\n\r\n (function loop() {\r\n i++;\r\n if (i === length) {\r\n o.callback();\r\n return;\r\n }\r\n\r\n // \"setTimeout\" added by Jim McLeod\r\n setTimeout(function() {\r\n o.functionToLoop(loop, i);\r\n }, 1);\r\n })();\r\n }\r\n\r\n\r\n /**\r\n * remove black frames from the beginning to the specified frame\r\n * @param {Array} _frames - array of frames to be checked\r\n * @param {number} _framesToCheck - number of frame until check will be executed (-1 - will drop all frames until frame not matched will be found)\r\n * @param {number} _pixTolerance - 0 - very strict (only black pixel color) ; 1 - all\r\n * @param {number} _frameTolerance - 0 - very strict (only black frame color) ; 1 - all\r\n * @returns {Array} - array of frames\r\n */\r\n // pull#293 by @volodalexey\r\n function dropBlackFrames(_frames, _framesToCheck, _pixTolerance, _frameTolerance, callback) {\r\n var localCanvas = document.createElement('canvas');\r\n localCanvas.width = canvas.width;\r\n localCanvas.height = canvas.height;\r\n var context2d = localCanvas.getContext('2d');\r\n var resultFrames = [];\r\n\r\n var checkUntilNotBlack = _framesToCheck === -1;\r\n var endCheckFrame = (_framesToCheck && _framesToCheck > 0 && _framesToCheck <= _frames.length) ?\r\n _framesToCheck : _frames.length;\r\n var sampleColor = {\r\n r: 0,\r\n g: 0,\r\n b: 0\r\n };\r\n var maxColorDifference = Math.sqrt(\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2)\r\n );\r\n var pixTolerance = _pixTolerance && _pixTolerance >= 0 && _pixTolerance <= 1 ? _pixTolerance : 0;\r\n var frameTolerance = _frameTolerance && _frameTolerance >= 0 && _frameTolerance <= 1 ? _frameTolerance : 0;\r\n var doNotCheckNext = false;\r\n\r\n asyncLoop({\r\n length: endCheckFrame,\r\n functionToLoop: function(loop, f) {\r\n var matchPixCount, endPixCheck, maxPixCount;\r\n\r\n var finishImage = function() {\r\n if (!doNotCheckNext && maxPixCount - matchPixCount <= maxPixCount * frameTolerance) {\r\n // console.log('removed black frame : ' + f + ' ; frame duration ' + _frames[f].duration);\r\n } else {\r\n // console.log('frame is passed : ' + f);\r\n if (checkUntilNotBlack) {\r\n doNotCheckNext = true;\r\n }\r\n resultFrames.push(_frames[f]);\r\n }\r\n loop();\r\n };\r\n\r\n if (!doNotCheckNext) {\r\n var image = new Image();\r\n image.onload = function() {\r\n context2d.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n var imageData = context2d.getImageData(0, 0, canvas.width, canvas.height);\r\n matchPixCount = 0;\r\n endPixCheck = imageData.data.length;\r\n maxPixCount = imageData.data.length / 4;\r\n\r\n for (var pix = 0; pix < endPixCheck; pix += 4) {\r\n var currentColor = {\r\n r: imageData.data[pix],\r\n g: imageData.data[pix + 1],\r\n b: imageData.data[pix + 2]\r\n };\r\n var colorDifference = Math.sqrt(\r\n Math.pow(currentColor.r - sampleColor.r, 2) +\r\n Math.pow(currentColor.g - sampleColor.g, 2) +\r\n Math.pow(currentColor.b - sampleColor.b, 2)\r\n );\r\n // difference in color it is difference in color vectors (r1,g1,b1) <=> (r2,g2,b2)\r\n if (colorDifference <= maxColorDifference * pixTolerance) {\r\n matchPixCount++;\r\n }\r\n }\r\n finishImage();\r\n };\r\n image.src = _frames[f].image;\r\n } else {\r\n finishImage();\r\n }\r\n },\r\n callback: function() {\r\n resultFrames = resultFrames.concat(_frames.slice(endCheckFrame));\r\n\r\n if (resultFrames.length <= 0) {\r\n // at least one last frame should be available for next manipulation\r\n // if total duration of all frames will be < 1000 than ffmpeg doesn't work well...\r\n resultFrames.push(_frames[_frames.length - 1]);\r\n }\r\n callback(resultFrames);\r\n }\r\n });\r\n }\r\n\r\n var isStopDrawing = false;\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n isStopDrawing = true;\r\n\r\n var _this = this;\r\n // analyse of all frames takes some time!\r\n setTimeout(function() {\r\n // e.g. dropBlackFrames(frames, 10, 1, 1) - will cut all 10 frames\r\n // e.g. dropBlackFrames(frames, 10, 0.5, 0.5) - will analyse 10 frames\r\n // e.g. dropBlackFrames(frames, 10) === dropBlackFrames(frames, 10, 0, 0) - will analyse 10 frames with strict black color\r\n dropBlackFrames(whammy.frames, -1, null, null, function(frames) {\r\n whammy.frames = frames;\r\n\r\n // to display advertisement images!\r\n if (config.advertisement && config.advertisement.length) {\r\n whammy.frames = config.advertisement.concat(whammy.frames);\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n _this.blob = blob;\r\n\r\n if (_this.blob.forEach) {\r\n _this.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(_this.blob);\r\n }\r\n });\r\n });\r\n }, 10);\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (isStopDrawing) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (!isStopDrawing) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isStopDrawing = true;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'WhammyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n var video;\r\n var lastTime;\r\n var whammy;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WhammyRecorder = WhammyRecorder;\r\n}\n\r\n// https://github.com/antimatter15/whammy/blob/master/LICENSE\r\n// _________\r\n// Whammy.js\r\n\r\n// todo: Firefox now supports webp for webm containers!\r\n// their MediaRecorder implementation works well!\r\n// should we provide an option to record via Whammy.js or MediaRecorder API is a better solution?\r\n\r\n/**\r\n * Whammy is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It is written by {@link https://github.com/antimatter15|antimatter15}\r\n * @summary A real time javascript webm encoder based on a canvas hack.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef Whammy\r\n * @class\r\n * @example\r\n * var recorder = new Whammy().Video(15);\r\n * recorder.add(context || canvas || dataURL);\r\n * var output = recorder.compile();\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Whammy = (function() {\r\n // a more abstract-ish API\r\n\r\n function WhammyVideo(duration) {\r\n this.frames = [];\r\n this.duration = duration || 1;\r\n this.quality = 0.8;\r\n }\r\n\r\n /**\r\n * Pass Canvas or Context or image/webp(string) to {@link Whammy} encoder.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.add(canvas || context || 'image/webp');\r\n * @param {string} frame - Canvas || Context || image/webp\r\n * @param {number} duration - Stick a duration (in milliseconds)\r\n */\r\n WhammyVideo.prototype.add = function(frame, duration) {\r\n if ('canvas' in frame) { //CanvasRenderingContext2D\r\n frame = frame.canvas;\r\n }\r\n\r\n if ('toDataURL' in frame) {\r\n frame = frame.toDataURL('image/webp', this.quality);\r\n }\r\n\r\n if (!(/^data:image\\/webp;base64,/ig).test(frame)) {\r\n throw 'Input must be formatted properly as a base64 encoded DataURI of type image/webp';\r\n }\r\n this.frames.push({\r\n image: frame,\r\n duration: duration || this.duration\r\n });\r\n };\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n\r\n function whammyInWebWorker(frames) {\r\n function ArrayToWebM(frames) {\r\n var info = checkFrames(frames);\r\n if (!info) {\r\n return [];\r\n }\r\n\r\n var clusterMaxDuration = 30000;\r\n\r\n var EBML = [{\r\n 'id': 0x1a45dfa3, // EBML\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0x4286 // EBMLVersion\r\n }, {\r\n 'data': 1,\r\n 'id': 0x42f7 // EBMLReadVersion\r\n }, {\r\n 'data': 4,\r\n 'id': 0x42f2 // EBMLMaxIDLength\r\n }, {\r\n 'data': 8,\r\n 'id': 0x42f3 // EBMLMaxSizeLength\r\n }, {\r\n 'data': 'webm',\r\n 'id': 0x4282 // DocType\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4287 // DocTypeVersion\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4285 // DocTypeReadVersion\r\n }]\r\n }, {\r\n 'id': 0x18538067, // Segment\r\n 'data': [{\r\n 'id': 0x1549a966, // Info\r\n 'data': [{\r\n 'data': 1e6, //do things in millisecs (num of nanosecs for duration scale)\r\n 'id': 0x2ad7b1 // TimecodeScale\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x4d80 // MuxingApp\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x5741 // WritingApp\r\n }, {\r\n 'data': doubleToString(info.duration),\r\n 'id': 0x4489 // Duration\r\n }]\r\n }, {\r\n 'id': 0x1654ae6b, // Tracks\r\n 'data': [{\r\n 'id': 0xae, // TrackEntry\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0xd7 // TrackNumber\r\n }, {\r\n 'data': 1,\r\n 'id': 0x73c5 // TrackUID\r\n }, {\r\n 'data': 0,\r\n 'id': 0x9c // FlagLacing\r\n }, {\r\n 'data': 'und',\r\n 'id': 0x22b59c // Language\r\n }, {\r\n 'data': 'V_VP8',\r\n 'id': 0x86 // CodecID\r\n }, {\r\n 'data': 'VP8',\r\n 'id': 0x258688 // CodecName\r\n }, {\r\n 'data': 1,\r\n 'id': 0x83 // TrackType\r\n }, {\r\n 'id': 0xe0, // Video\r\n 'data': [{\r\n 'data': info.width,\r\n 'id': 0xb0 // PixelWidth\r\n }, {\r\n 'data': info.height,\r\n 'id': 0xba // PixelHeight\r\n }]\r\n }]\r\n }]\r\n }]\r\n }];\r\n\r\n //Generate clusters (max duration)\r\n var frameNumber = 0;\r\n var clusterTimecode = 0;\r\n while (frameNumber < frames.length) {\r\n\r\n var clusterFrames = [];\r\n var clusterDuration = 0;\r\n do {\r\n clusterFrames.push(frames[frameNumber]);\r\n clusterDuration += frames[frameNumber].duration;\r\n frameNumber++;\r\n } while (frameNumber < frames.length && clusterDuration < clusterMaxDuration);\r\n\r\n var clusterCounter = 0;\r\n var cluster = {\r\n 'id': 0x1f43b675, // Cluster\r\n 'data': getClusterData(clusterTimecode, clusterCounter, clusterFrames)\r\n }; //Add cluster to segment\r\n EBML[1].data.push(cluster);\r\n clusterTimecode += clusterDuration;\r\n }\r\n\r\n return generateEBML(EBML);\r\n }\r\n\r\n function getClusterData(clusterTimecode, clusterCounter, clusterFrames) {\r\n return [{\r\n 'data': clusterTimecode,\r\n 'id': 0xe7 // Timecode\r\n }].concat(clusterFrames.map(function(webp) {\r\n var block = makeSimpleBlock({\r\n discardable: 0,\r\n frame: webp.data.slice(4),\r\n invisible: 0,\r\n keyframe: 1,\r\n lacing: 0,\r\n trackNum: 1,\r\n timecode: Math.round(clusterCounter)\r\n });\r\n clusterCounter += webp.duration;\r\n return {\r\n data: block,\r\n id: 0xa3\r\n };\r\n }));\r\n }\r\n\r\n // sums the lengths of all the frames and gets the duration\r\n\r\n function checkFrames(frames) {\r\n if (!frames[0]) {\r\n postMessage({\r\n error: 'Something went wrong. Maybe WebP format is not supported in the current browser.'\r\n });\r\n return;\r\n }\r\n\r\n var width = frames[0].width,\r\n height = frames[0].height,\r\n duration = frames[0].duration;\r\n\r\n for (var i = 1; i < frames.length; i++) {\r\n duration += frames[i].duration;\r\n }\r\n return {\r\n duration: duration,\r\n width: width,\r\n height: height\r\n };\r\n }\r\n\r\n function numToBuffer(num) {\r\n var parts = [];\r\n while (num > 0) {\r\n parts.push(num & 0xff);\r\n num = num >> 8;\r\n }\r\n return new Uint8Array(parts.reverse());\r\n }\r\n\r\n function strToBuffer(str) {\r\n return new Uint8Array(str.split('').map(function(e) {\r\n return e.charCodeAt(0);\r\n }));\r\n }\r\n\r\n function bitsToBuffer(bits) {\r\n var data = [];\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data.push(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return new Uint8Array(data);\r\n }\r\n\r\n function generateEBML(json) {\r\n var ebml = [];\r\n for (var i = 0; i < json.length; i++) {\r\n var data = json[i].data;\r\n\r\n if (typeof data === 'object') {\r\n data = generateEBML(data);\r\n }\r\n\r\n if (typeof data === 'number') {\r\n data = bitsToBuffer(data.toString(2));\r\n }\r\n\r\n if (typeof data === 'string') {\r\n data = strToBuffer(data);\r\n }\r\n\r\n var len = data.size || data.byteLength || data.length;\r\n var zeroes = Math.ceil(Math.ceil(Math.log(len) / Math.log(2)) / 8);\r\n var sizeToString = len.toString(2);\r\n var padded = (new Array((zeroes * 7 + 7 + 1) - sizeToString.length)).join('0') + sizeToString;\r\n var size = (new Array(zeroes)).join('0') + '1' + padded;\r\n\r\n ebml.push(numToBuffer(json[i].id));\r\n ebml.push(bitsToBuffer(size));\r\n ebml.push(data);\r\n }\r\n\r\n return new Blob(ebml, {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n function toBinStrOld(bits) {\r\n var data = '';\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data += String.fromCharCode(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return data;\r\n }\r\n\r\n function makeSimpleBlock(data) {\r\n var flags = 0;\r\n\r\n if (data.keyframe) {\r\n flags |= 128;\r\n }\r\n\r\n if (data.invisible) {\r\n flags |= 8;\r\n }\r\n\r\n if (data.lacing) {\r\n flags |= (data.lacing << 1);\r\n }\r\n\r\n if (data.discardable) {\r\n flags |= 1;\r\n }\r\n\r\n if (data.trackNum > 127) {\r\n throw 'TrackNumber > 127 not supported';\r\n }\r\n\r\n var out = [data.trackNum | 0x80, data.timecode >> 8, data.timecode & 0xff, flags].map(function(e) {\r\n return String.fromCharCode(e);\r\n }).join('') + data.frame;\r\n\r\n return out;\r\n }\r\n\r\n function parseWebP(riff) {\r\n var VP8 = riff.RIFF[0].WEBP[0];\r\n\r\n var frameStart = VP8.indexOf('\\x9d\\x01\\x2a'); // A VP8 keyframe starts with the 0x9d012a header\r\n for (var i = 0, c = []; i < 4; i++) {\r\n c[i] = VP8.charCodeAt(frameStart + 3 + i);\r\n }\r\n\r\n var width, height, tmp;\r\n\r\n //the code below is literally copied verbatim from the bitstream spec\r\n tmp = (c[1] << 8) | c[0];\r\n width = tmp & 0x3FFF;\r\n tmp = (c[3] << 8) | c[2];\r\n height = tmp & 0x3FFF;\r\n return {\r\n width: width,\r\n height: height,\r\n data: VP8,\r\n riff: riff\r\n };\r\n }\r\n\r\n function getStrLength(string, offset) {\r\n return parseInt(string.substr(offset + 4, 4).split('').map(function(i) {\r\n var unpadded = i.charCodeAt(0).toString(2);\r\n return (new Array(8 - unpadded.length + 1)).join('0') + unpadded;\r\n }).join(''), 2);\r\n }\r\n\r\n function parseRIFF(string) {\r\n var offset = 0;\r\n var chunks = {};\r\n\r\n while (offset < string.length) {\r\n var id = string.substr(offset, 4);\r\n var len = getStrLength(string, offset);\r\n var data = string.substr(offset + 4 + 4, len);\r\n offset += 4 + 4 + len;\r\n chunks[id] = chunks[id] || [];\r\n\r\n if (id === 'RIFF' || id === 'LIST') {\r\n chunks[id].push(parseRIFF(data));\r\n } else {\r\n chunks[id].push(data);\r\n }\r\n }\r\n return chunks;\r\n }\r\n\r\n function doubleToString(num) {\r\n return [].slice.call(\r\n new Uint8Array((new Float64Array([num])).buffer), 0).map(function(e) {\r\n return String.fromCharCode(e);\r\n }).reverse().join('');\r\n }\r\n\r\n var webm = new ArrayToWebM(frames.map(function(frame) {\r\n var webp = parseWebP(parseRIFF(atob(frame.image.slice(23))));\r\n webp.duration = frame.duration;\r\n return webp;\r\n }));\r\n\r\n postMessage(webm);\r\n }\r\n\r\n /**\r\n * Encodes frames in WebM container. It uses WebWorkinvoke to invoke 'ArrayToWebM' method.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.compile(function(blob) {\r\n * // blob.size - blob.type\r\n * });\r\n */\r\n WhammyVideo.prototype.compile = function(callback) {\r\n var webWorker = processInWebWorker(whammyInWebWorker);\r\n\r\n webWorker.onmessage = function(event) {\r\n if (event.data.error) {\r\n console.error(event.data.error);\r\n return;\r\n }\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(this.frames);\r\n };\r\n\r\n return {\r\n /**\r\n * A more abstract-ish API.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * @param {?number} speed - 0.8\r\n * @param {?number} quality - 100\r\n */\r\n Video: WhammyVideo\r\n };\r\n})();\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Whammy = Whammy;\r\n}\n\r\n// ______________ (indexed-db)\r\n// DiskStorage.js\r\n\r\n/**\r\n * DiskStorage is a standalone object used by {@link RecordRTC} to store recorded blobs in IndexedDB storage.\r\n * @summary Writing blobs into IndexedDB.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n * // DiskStorage.dataStoreName = 'recordRTC';\r\n * // DiskStorage.onError = function(error) { };\r\n * @property {function} init - This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @property {function} Fetch - This method fetches stored blobs from IndexedDB.\r\n * @property {function} Store - This method stores blobs in IndexedDB.\r\n * @property {function} onError - This function is invoked for any known/unknown error.\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\n\r\nvar DiskStorage = {\r\n /**\r\n * This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.init();\r\n */\r\n init: function() {\r\n var self = this;\r\n\r\n if (typeof indexedDB === 'undefined' || typeof indexedDB.open === 'undefined') {\r\n console.error('IndexedDB API are not available in this browser.');\r\n return;\r\n }\r\n\r\n var dbVersion = 1;\r\n var dbName = this.dbName || location.href.replace(/\\/|:|#|%|\\.|\\[|\\]/g, ''),\r\n db;\r\n var request = indexedDB.open(dbName, dbVersion);\r\n\r\n function createObjectStore(dataBase) {\r\n dataBase.createObjectStore(self.dataStoreName);\r\n }\r\n\r\n function putInDB() {\r\n var transaction = db.transaction([self.dataStoreName], 'readwrite');\r\n\r\n if (self.videoBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.videoBlob, 'videoBlob');\r\n }\r\n\r\n if (self.gifBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.gifBlob, 'gifBlob');\r\n }\r\n\r\n if (self.audioBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.audioBlob, 'audioBlob');\r\n }\r\n\r\n function getFromStore(portionName) {\r\n transaction.objectStore(self.dataStoreName).get(portionName).onsuccess = function(event) {\r\n if (self.callback) {\r\n self.callback(event.target.result, portionName);\r\n }\r\n };\r\n }\r\n\r\n getFromStore('audioBlob');\r\n getFromStore('videoBlob');\r\n getFromStore('gifBlob');\r\n }\r\n\r\n request.onerror = self.onError;\r\n\r\n request.onsuccess = function() {\r\n db = request.result;\r\n db.onerror = self.onError;\r\n\r\n if (db.setVersion) {\r\n if (db.version !== dbVersion) {\r\n var setVersion = db.setVersion(dbVersion);\r\n setVersion.onsuccess = function() {\r\n createObjectStore(db);\r\n putInDB();\r\n };\r\n } else {\r\n putInDB();\r\n }\r\n } else {\r\n putInDB();\r\n }\r\n };\r\n request.onupgradeneeded = function(event) {\r\n createObjectStore(event.target.result);\r\n };\r\n },\r\n /**\r\n * This method fetches stored blobs from IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n */\r\n Fetch: function(callback) {\r\n this.callback = callback;\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This method stores blobs in IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n */\r\n Store: function(config) {\r\n this.audioBlob = config.audioBlob;\r\n this.videoBlob = config.videoBlob;\r\n this.gifBlob = config.gifBlob;\r\n\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This function is invoked for any known/unknown error.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.onError = function(error){\r\n * alerot( JSON.stringify(error) );\r\n * };\r\n */\r\n onError: function(error) {\r\n console.error(JSON.stringify(error, null, '\\t'));\r\n },\r\n\r\n /**\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.dataStoreName = 'recordRTC';\r\n */\r\n dataStoreName: 'recordRTC',\r\n dbName: null\r\n};\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.DiskStorage = DiskStorage;\r\n}\n\r\n// ______________\r\n// GifRecorder.js\r\n\r\n/**\r\n * GifRecorder is standalone calss used by {@link RecordRTC} to record video or canvas into animated gif.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GifRecorder\r\n * @class\r\n * @example\r\n * var recorder = new GifRecorder(mediaStream || canvas || context, { onGifPreview: function, onGifRecordingStarted: function, width: 1280, height: 720, frameRate: 200, quality: 10 });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object or HTMLCanvasElement or CanvasRenderingContext2D.\r\n * @param {object} config - {disableLogs:true, initCallback: function, width: 320, height: 240, frameRate: 200, quality: 10}\r\n */\r\n\r\nfunction GifRecorder(mediaStream, config) {\r\n if (typeof GIFEncoder === 'undefined') {\r\n var script = document.createElement('script');\r\n script.src = 'https://www.webrtc-experiment.com/gif-recorder.js';\r\n (document.body || document.documentElement).appendChild(script);\r\n }\r\n\r\n config = config || {};\r\n\r\n var isHTMLObject = mediaStream instanceof CanvasRenderingContext2D || mediaStream instanceof HTMLCanvasElement;\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (typeof GIFEncoder === 'undefined') {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isLoadedMetaData) {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isHTMLObject) {\r\n if (!config.width) {\r\n config.width = video.offsetWidth || 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = video.offsetHeight || 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n video.width = config.video.width || 320;\r\n video.height = config.video.height || 240;\r\n }\r\n\r\n // external library to record as GIF images\r\n gifEncoder = new GIFEncoder();\r\n\r\n // void setRepeat(int iter) \r\n // Sets the number of times the set of GIF frames should be played. \r\n // Default is 1; 0 means play indefinitely.\r\n gifEncoder.setRepeat(0);\r\n\r\n // void setFrameRate(Number fps) \r\n // Sets frame rate in frames per second. \r\n // Equivalent to setDelay(1000/fps).\r\n // Using \"setDelay\" instead of \"setFrameRate\"\r\n gifEncoder.setDelay(config.frameRate || 200);\r\n\r\n // void setQuality(int quality) \r\n // Sets quality of color quantization (conversion of images to the \r\n // maximum 256 colors allowed by the GIF specification). \r\n // Lower values (minimum = 1) produce better colors, \r\n // but slow processing significantly. 10 is the default, \r\n // and produces good color mapping at reasonable speeds. \r\n // Values greater than 20 do not yield significant improvements in speed.\r\n gifEncoder.setQuality(config.quality || 10);\r\n\r\n // Boolean start() \r\n // This writes the GIF Header and returns false if it fails.\r\n gifEncoder.start();\r\n\r\n if (typeof config.onGifRecordingStarted === 'function') {\r\n config.onGifRecordingStarted();\r\n }\r\n\r\n startTime = Date.now();\r\n\r\n function drawVideoFrame(time) {\r\n if (self.clearedRecordedData === true) {\r\n return;\r\n }\r\n\r\n if (isPausedRecording) {\r\n return setTimeout(function() {\r\n drawVideoFrame(time);\r\n }, 100);\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (typeof lastFrameTime === undefined) {\r\n lastFrameTime = time;\r\n }\r\n\r\n // ~10 fps\r\n if (time - lastFrameTime < 90) {\r\n return;\r\n }\r\n\r\n if (!isHTMLObject && video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n if (!isHTMLObject) {\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n if (config.onGifPreview) {\r\n config.onGifPreview(canvas.toDataURL('image/png'));\r\n }\r\n\r\n gifEncoder.addFrame(context);\r\n lastFrameTime = time;\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (lastAnimationFrame) {\r\n cancelAnimationFrame(lastAnimationFrame);\r\n }\r\n\r\n endTime = Date.now();\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = new Blob([new Uint8Array(gifEncoder.stream().bin)], {\r\n type: 'image/gif'\r\n });\r\n\r\n callback(this.blob);\r\n\r\n // bug: find a way to clear old recorded blobs\r\n gifEncoder.stream().bin = [];\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n self.clearedRecordedData = true;\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n if (gifEncoder) {\r\n gifEncoder.stream().bin = [];\r\n }\r\n }\r\n\r\n // for debugging\r\n this.name = 'GifRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n if (isHTMLObject) {\r\n if (mediaStream instanceof CanvasRenderingContext2D) {\r\n context = mediaStream;\r\n canvas = context.canvas;\r\n } else if (mediaStream instanceof HTMLCanvasElement) {\r\n context = mediaStream.getContext('2d');\r\n canvas = mediaStream;\r\n }\r\n }\r\n\r\n var isLoadedMetaData = true;\r\n\r\n if (!isHTMLObject) {\r\n var video = document.createElement('video');\r\n video.muted = true;\r\n video.autoplay = true;\r\n video.playsInline = true;\r\n\r\n isLoadedMetaData = false;\r\n video.onloadedmetadata = function() {\r\n isLoadedMetaData = true;\r\n };\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.play();\r\n }\r\n\r\n var lastAnimationFrame = null;\r\n var startTime, endTime, lastFrameTime;\r\n\r\n var gifEncoder;\r\n\r\n var self = this;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.GifRecorder = GifRecorder;\r\n}\n\r\n// Last time updated: 2019-06-21 4:09:42 AM UTC\r\n\r\n// ________________________\r\n// MultiStreamsMixer v1.2.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/MultiStreamsMixer\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\nfunction MultiStreamsMixer(arrayOfMediaStreams, elementClass) {\r\n\r\n var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n (function(that) {\r\n if (typeof RecordRTC !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n })(typeof global !== 'undefined' ? global : null);\r\n\r\n // requires: chrome://flags/#enable-experimental-web-platform-features\r\n\r\n elementClass = elementClass || 'multi-streams-mixer';\r\n\r\n var videos = [];\r\n var isStopDrawingFrames = false;\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n canvas.style.opacity = 0;\r\n canvas.style.position = 'absolute';\r\n canvas.style.zIndex = -1;\r\n canvas.style.top = '-1000em';\r\n canvas.style.left = '-1000em';\r\n canvas.className = elementClass;\r\n (document.body || document.documentElement).appendChild(canvas);\r\n\r\n this.disableLogs = false;\r\n this.frameInterval = 10;\r\n\r\n this.width = 360;\r\n this.height = 240;\r\n\r\n // use gain node to prevent echo\r\n this.useGainNode = true;\r\n\r\n var self = this;\r\n\r\n // _____________________________\r\n // Cross-Browser-Declarations.js\r\n\r\n // WebAudio API representer\r\n var AudioContext = window.AudioContext;\r\n\r\n if (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n }\r\n\r\n /*jshint -W079 */\r\n var URL = window.URL;\r\n\r\n if (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n }\r\n\r\n if (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n }\r\n\r\n var MediaStream = window.MediaStream;\r\n\r\n if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n }\r\n\r\n /*global MediaStream:true */\r\n if (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n }\r\n\r\n var Storage = {};\r\n\r\n if (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n } else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n }\r\n\r\n function setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n }\r\n\r\n this.startDrawingFrames = function() {\r\n drawVideosToCanvas();\r\n };\r\n\r\n function drawVideosToCanvas() {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var videosLength = videos.length;\r\n\r\n var fullcanvas = false;\r\n var remaining = [];\r\n videos.forEach(function(video) {\r\n if (!video.stream) {\r\n video.stream = {};\r\n }\r\n\r\n if (video.stream.fullcanvas) {\r\n fullcanvas = video;\r\n } else {\r\n // todo: video.stream.active or video.stream.live to fix blank frames issues?\r\n remaining.push(video);\r\n }\r\n });\r\n\r\n if (fullcanvas) {\r\n canvas.width = fullcanvas.stream.width;\r\n canvas.height = fullcanvas.stream.height;\r\n } else if (remaining.length) {\r\n canvas.width = videosLength > 1 ? remaining[0].width * 2 : remaining[0].width;\r\n\r\n var height = 1;\r\n if (videosLength === 3 || videosLength === 4) {\r\n height = 2;\r\n }\r\n if (videosLength === 5 || videosLength === 6) {\r\n height = 3;\r\n }\r\n if (videosLength === 7 || videosLength === 8) {\r\n height = 4;\r\n }\r\n if (videosLength === 9 || videosLength === 10) {\r\n height = 5;\r\n }\r\n canvas.height = remaining[0].height * height;\r\n } else {\r\n canvas.width = self.width || 360;\r\n canvas.height = self.height || 240;\r\n }\r\n\r\n if (fullcanvas && fullcanvas instanceof HTMLVideoElement) {\r\n drawImage(fullcanvas);\r\n }\r\n\r\n remaining.forEach(function(video, idx) {\r\n drawImage(video, idx);\r\n });\r\n\r\n setTimeout(drawVideosToCanvas, self.frameInterval);\r\n }\r\n\r\n function drawImage(video, idx) {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var x = 0;\r\n var y = 0;\r\n var width = video.width;\r\n var height = video.height;\r\n\r\n if (idx === 1) {\r\n x = video.width;\r\n }\r\n\r\n if (idx === 2) {\r\n y = video.height;\r\n }\r\n\r\n if (idx === 3) {\r\n x = video.width;\r\n y = video.height;\r\n }\r\n\r\n if (idx === 4) {\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 5) {\r\n x = video.width;\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 6) {\r\n y = video.height * 3;\r\n }\r\n\r\n if (idx === 7) {\r\n x = video.width;\r\n y = video.height * 3;\r\n }\r\n\r\n if (typeof video.stream.left !== 'undefined') {\r\n x = video.stream.left;\r\n }\r\n\r\n if (typeof video.stream.top !== 'undefined') {\r\n y = video.stream.top;\r\n }\r\n\r\n if (typeof video.stream.width !== 'undefined') {\r\n width = video.stream.width;\r\n }\r\n\r\n if (typeof video.stream.height !== 'undefined') {\r\n height = video.stream.height;\r\n }\r\n\r\n context.drawImage(video, x, y, width, height);\r\n\r\n if (typeof video.stream.onRender === 'function') {\r\n video.stream.onRender(context, x, y, width, height, idx);\r\n }\r\n }\r\n\r\n function getMixedStream() {\r\n isStopDrawingFrames = false;\r\n var mixedVideoStream = getMixedVideoStream();\r\n\r\n var mixedAudioStream = getMixedAudioStream();\r\n if (mixedAudioStream) {\r\n mixedAudioStream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).forEach(function(track) {\r\n mixedVideoStream.addTrack(track);\r\n });\r\n }\r\n\r\n var fullcanvas;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (stream.fullcanvas) {\r\n fullcanvas = true;\r\n }\r\n });\r\n\r\n // mixedVideoStream.prototype.appendStreams = appendStreams;\r\n // mixedVideoStream.prototype.resetVideoStreams = resetVideoStreams;\r\n // mixedVideoStream.prototype.clearRecordedData = clearRecordedData;\r\n\r\n return mixedVideoStream;\r\n }\r\n\r\n function getMixedVideoStream() {\r\n resetVideoStreams();\r\n\r\n var capturedStream;\r\n\r\n if ('captureStream' in canvas) {\r\n capturedStream = canvas.captureStream();\r\n } else if ('mozCaptureStream' in canvas) {\r\n capturedStream = canvas.mozCaptureStream();\r\n } else if (!self.disableLogs) {\r\n console.error('Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features');\r\n }\r\n\r\n var videoStream = new MediaStream();\r\n\r\n capturedStream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).forEach(function(track) {\r\n videoStream.addTrack(track);\r\n });\r\n\r\n canvas.stream = videoStream;\r\n\r\n return videoStream;\r\n }\r\n\r\n function getMixedAudioStream() {\r\n // via: @pehrsons\r\n if (!Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor = new Storage.AudioContext();\r\n }\r\n\r\n self.audioContext = Storage.AudioContextConstructor;\r\n\r\n self.audioSources = [];\r\n\r\n if (self.useGainNode === true) {\r\n self.gainNode = self.audioContext.createGain();\r\n self.gainNode.connect(self.audioContext.destination);\r\n self.gainNode.gain.value = 0; // don't hear self\r\n }\r\n\r\n var audioTracksLength = 0;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n return;\r\n }\r\n\r\n audioTracksLength++;\r\n\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n\r\n if (self.useGainNode === true) {\r\n audioSource.connect(self.gainNode);\r\n }\r\n\r\n self.audioSources.push(audioSource);\r\n });\r\n\r\n if (!audioTracksLength) {\r\n // because \"self.audioContext\" is not initialized\r\n // that's why we've to ignore rest of the code\r\n return;\r\n }\r\n\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n self.audioSources.forEach(function(audioSource) {\r\n audioSource.connect(self.audioDestination);\r\n });\r\n return self.audioDestination.stream;\r\n }\r\n\r\n function getVideo(stream) {\r\n var video = document.createElement('video');\r\n\r\n setSrcObject(stream, video);\r\n\r\n video.className = elementClass;\r\n\r\n video.muted = true;\r\n video.volume = 0;\r\n\r\n video.width = stream.width || self.width || 360;\r\n video.height = stream.height || self.height || 240;\r\n\r\n video.play();\r\n\r\n return video;\r\n }\r\n\r\n this.appendStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n streams.forEach(function(stream) {\r\n var newStream = new MediaStream();\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n\r\n newStream.addTrack(stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n })[0]);\r\n }\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n audioSource.connect(self.audioDestination);\r\n\r\n newStream.addTrack(self.audioDestination.stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n })[0]);\r\n }\r\n\r\n arrayOfMediaStreams.push(newStream);\r\n });\r\n };\r\n\r\n this.releaseStreams = function() {\r\n videos = [];\r\n isStopDrawingFrames = true;\r\n\r\n if (self.gainNode) {\r\n self.gainNode.disconnect();\r\n self.gainNode = null;\r\n }\r\n\r\n if (self.audioSources.length) {\r\n self.audioSources.forEach(function(source) {\r\n source.disconnect();\r\n });\r\n self.audioSources = [];\r\n }\r\n\r\n if (self.audioDestination) {\r\n self.audioDestination.disconnect();\r\n self.audioDestination = null;\r\n }\r\n\r\n if (self.audioContext) {\r\n self.audioContext.close();\r\n }\r\n\r\n self.audioContext = null;\r\n\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (canvas.stream) {\r\n canvas.stream.stop();\r\n canvas.stream = null;\r\n }\r\n };\r\n\r\n this.resetVideoStreams = function(streams) {\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n resetVideoStreams(streams);\r\n };\r\n\r\n function resetVideoStreams(streams) {\r\n videos = [];\r\n streams = streams || arrayOfMediaStreams;\r\n\r\n // via: @adrian-ber\r\n streams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n return;\r\n }\r\n\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n });\r\n }\r\n\r\n // for debugging\r\n this.name = 'MultiStreamsMixer';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n this.getMixedStream = getMixedStream;\r\n\r\n}\r\n\r\nif (typeof RecordRTC === 'undefined') {\r\n if (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = MultiStreamsMixer;\r\n }\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n define('MultiStreamsMixer', [], function() {\r\n return MultiStreamsMixer;\r\n });\r\n }\r\n}\n\r\n// ______________________\r\n// MultiStreamRecorder.js\r\n\r\n/*\r\n * Video conference recording, using captureStream API along with WebAudio and Canvas2D API.\r\n */\r\n\r\n/**\r\n * MultiStreamRecorder can record multiple videos in single container.\r\n * @summary Multi-videos recorder.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MultiStreamRecorder\r\n * @class\r\n * @example\r\n * var options = {\r\n * mimeType: 'video/webm'\r\n * }\r\n * var recorder = new MultiStreamRecorder(ArrayOfMediaStreams, options);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams.\r\n * @param {object} config - {disableLogs:true, frameInterval: 1, mimeType: \"video/webm\"}\r\n */\r\n\r\nfunction MultiStreamRecorder(arrayOfMediaStreams, options) {\r\n arrayOfMediaStreams = arrayOfMediaStreams || [];\r\n var self = this;\r\n\r\n var mixer;\r\n var mediaRecorder;\r\n\r\n options = options || {\r\n elementClass: 'multi-streams-mixer',\r\n mimeType: 'video/webm',\r\n video: {\r\n width: 360,\r\n height: 240\r\n }\r\n };\r\n\r\n if (!options.frameInterval) {\r\n options.frameInterval = 10;\r\n }\r\n\r\n if (!options.video) {\r\n options.video = {};\r\n }\r\n\r\n if (!options.video.width) {\r\n options.video.width = 360;\r\n }\r\n\r\n if (!options.video.height) {\r\n options.video.height = 240;\r\n }\r\n\r\n /**\r\n * This method records all MediaStreams.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // github/muaz-khan/MultiStreamsMixer\r\n mixer = new MultiStreamsMixer(arrayOfMediaStreams, options.elementClass || 'multi-streams-mixer');\r\n\r\n if (getAllVideoTracks().length) {\r\n mixer.frameInterval = options.frameInterval || 10;\r\n mixer.width = options.video.width || 360;\r\n mixer.height = options.video.height || 240;\r\n mixer.startDrawingFrames();\r\n }\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n\r\n // record using MediaRecorder API\r\n mediaRecorder = new MediaStreamRecorder(mixer.getMixedStream(), options);\r\n mediaRecorder.record();\r\n };\r\n\r\n function getAllVideoTracks() {\r\n var tracks = [];\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n getTracks(stream, 'video').forEach(function(track) {\r\n tracks.push(track);\r\n });\r\n });\r\n return tracks;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n mediaRecorder.stop(function(blob) {\r\n self.blob = blob;\r\n\r\n callback(blob);\r\n\r\n self.clearRecordedData();\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder = null;\r\n }\r\n\r\n if (mixer) {\r\n mixer.releaseStreams();\r\n mixer = null;\r\n }\r\n };\r\n\r\n /**\r\n * Add extra media-streams to existing recordings.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.addStreams([newAudioStream, newVideoStream]);\r\n */\r\n this.addStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n arrayOfMediaStreams.concat(streams);\r\n\r\n if (!mediaRecorder || !mixer) {\r\n return;\r\n }\r\n\r\n mixer.appendStreams(streams);\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n };\r\n\r\n /**\r\n * Reset videos during live recording. Replace old videos e.g. replace cameras with full-screen.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.resetVideoStreams([newVideo1, newVideo2]);\r\n */\r\n this.resetVideoStreams = function(streams) {\r\n if (!mixer) {\r\n return;\r\n }\r\n\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n mixer.resetVideoStreams(streams);\r\n };\r\n\r\n /**\r\n * Returns MultiStreamsMixer\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * let mixer = recorder.getMixer();\r\n * mixer.appendStreams([newStream]);\r\n */\r\n this.getMixer = function() {\r\n return mixer;\r\n };\r\n\r\n // for debugging\r\n this.name = 'MultiStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MultiStreamRecorder = MultiStreamRecorder;\r\n}\n\r\n// _____________________\r\n// RecordRTC.promises.js\r\n\r\n/**\r\n * RecordRTCPromisesHandler adds promises support in {@link RecordRTC}. Try a {@link https://github.com/muaz-khan/RecordRTC/blob/master/simple-demos/RecordRTCPromisesHandler.html|demo here}\r\n * @summary Promises for {@link RecordRTC}\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCPromisesHandler\r\n * @class\r\n * @example\r\n * var recorder = new RecordRTCPromisesHandler(mediaStream, options);\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n * // Note: You can access all RecordRTC API using \"recorder.recordRTC\" e.g. \r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n * recorder.recordRTC.setRecordingDuration(5000);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n * @throws Will throw an error if \"new\" keyword is not used to initiate \"RecordRTCPromisesHandler\". Also throws error if first argument \"MediaStream\" is missing.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction RecordRTCPromisesHandler(mediaStream, options) {\r\n if (!this) {\r\n throw 'Use \"new RecordRTCPromisesHandler()\"';\r\n }\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n var self = this;\r\n\r\n /**\r\n * @property {Blob} blob - Access/reach the native {@link RecordRTC} object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internal = recorder.recordRTC.getInternalRecorder();\r\n * alert(internal instanceof MediaStreamRecorder);\r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n */\r\n self.recordRTC = new RecordRTC(mediaStream, options);\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.startRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.startRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method stops the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * var blob = recorder.getBlob();\r\n * }).catch(errorCB);\r\n */\r\n this.stopRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.stopRecording(function(url) {\r\n self.blob = self.recordRTC.getBlob();\r\n\r\n if (!self.blob || !self.blob.size) {\r\n reject('Empty blob.', self.blob);\r\n return;\r\n }\r\n\r\n resolve(url);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.pauseRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.pauseRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.pauseRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.resumeRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.resumeRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.resumeRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns data-url for the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getDataURL().then(function(dataURL) {\r\n * window.open(dataURL);\r\n * }).catch(errorCB);;\r\n * }).catch(errorCB);\r\n */\r\n this.getDataURL = function(callback) {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.getDataURL(function(dataURL) {\r\n resolve(dataURL);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getBlob().then(function(blob) {})\r\n * }).catch(errorCB);\r\n */\r\n this.getBlob = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getBlob());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the internal recording object.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internalRecorder = await recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} \r\n */\r\n this.getInternalRecorder = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getInternalRecorder());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.reset();\r\n * recorder.startRecording(); // record again\r\n */\r\n this.reset = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.reset());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.destroy().then(successCB).catch(errorCB);\r\n */\r\n this.destroy = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.destroy());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let state = await recorder.getState();\r\n * // or\r\n * recorder.getState().then(state => { console.log(state); })\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getState());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.stopRecording();\r\n * let blob = recorder.getBlob(); // or \"recorder.recordRTC.blob\"\r\n * invokeSaveAsDialog(blob);\r\n */\r\n this.blob = null;\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTCPromisesHandler\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n this.version = '5.6.2';\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.RecordRTCPromisesHandler = RecordRTCPromisesHandler;\r\n}\n\r\n// ______________________\r\n// WebAssemblyRecorder.js\r\n\r\n/**\r\n * WebAssemblyRecorder lets you create webm videos in JavaScript via WebAssembly. The library consumes raw RGBA32 buffers (4 bytes per pixel) and turns them into a webm video with the given framerate and quality. This makes it compatible out-of-the-box with ImageData from a CANVAS. With realtime mode you can also use webm-wasm for streaming webm videos.\r\n * @summary Video recording feature in Chrome, Firefox and maybe Edge.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WebAssemblyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WebAssemblyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {webAssemblyPath:'webm-wasm.wasm',workerPath: 'webm-worker.js', frameRate: 30, width: 1920, height: 1080, bitrate: 1024, realtime: true}\r\n */\r\nfunction WebAssemblyRecorder(stream, config) {\r\n // based on: github.com/GoogleChromeLabs/webm-wasm\r\n\r\n if (typeof ReadableStream === 'undefined' || typeof WritableStream === 'undefined') {\r\n // because it fixes readable/writable streams issues\r\n console.error('Following polyfill is strongly recommended: https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js');\r\n }\r\n\r\n config = config || {};\r\n\r\n config.width = config.width || 640;\r\n config.height = config.height || 480;\r\n config.frameRate = config.frameRate || 30;\r\n config.bitrate = config.bitrate || 1200;\r\n config.realtime = config.realtime || true;\r\n\r\n function createBufferURL(buffer, type) {\r\n return URL.createObjectURL(new Blob([buffer], {\r\n type: type || ''\r\n }));\r\n }\r\n\r\n var finished;\r\n\r\n function cameraStream() {\r\n return new ReadableStream({\r\n start: function(controller) {\r\n var cvs = document.createElement('canvas');\r\n var video = document.createElement('video');\r\n var first = true;\r\n video.srcObject = stream;\r\n video.muted = true;\r\n video.height = config.height;\r\n video.width = config.width;\r\n video.volume = 0;\r\n video.onplaying = function() {\r\n cvs.width = config.width;\r\n cvs.height = config.height;\r\n var ctx = cvs.getContext('2d');\r\n var frameTimeout = 1000 / config.frameRate;\r\n var cameraTimer = setInterval(function f() {\r\n if (finished) {\r\n clearInterval(cameraTimer);\r\n controller.close();\r\n }\r\n\r\n if (first) {\r\n first = false;\r\n if (config.onVideoProcessStarted) {\r\n config.onVideoProcessStarted();\r\n }\r\n }\r\n\r\n ctx.drawImage(video, 0, 0);\r\n if (controller._controlledReadableStream.state !== 'closed') {\r\n try {\r\n controller.enqueue(\r\n ctx.getImageData(0, 0, config.width, config.height)\r\n );\r\n } catch (e) {}\r\n }\r\n }, frameTimeout);\r\n };\r\n video.play();\r\n }\r\n });\r\n }\r\n\r\n var worker;\r\n\r\n function startRecording(stream, buffer) {\r\n if (!config.workerPath && !buffer) {\r\n finished = false;\r\n\r\n // is it safe to use @latest ?\r\n\r\n fetch(\r\n 'https://unpkg.com/webm-wasm@latest/dist/webm-worker.js'\r\n ).then(function(r) {\r\n r.arrayBuffer().then(function(buffer) {\r\n startRecording(stream, buffer);\r\n });\r\n });\r\n return;\r\n }\r\n\r\n if (!config.workerPath && buffer instanceof ArrayBuffer) {\r\n var blob = new Blob([buffer], {\r\n type: 'text/javascript'\r\n });\r\n config.workerPath = URL.createObjectURL(blob);\r\n }\r\n\r\n if (!config.workerPath) {\r\n console.error('workerPath parameter is missing.');\r\n }\r\n\r\n worker = new Worker(config.workerPath);\r\n\r\n worker.postMessage(config.webAssemblyPath || 'https://unpkg.com/webm-wasm@latest/dist/webm-wasm.wasm');\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === 'READY') {\r\n worker.postMessage({\r\n width: config.width,\r\n height: config.height,\r\n bitrate: config.bitrate || 1200,\r\n timebaseDen: config.frameRate || 30,\r\n realtime: config.realtime\r\n });\r\n\r\n cameraStream().pipeTo(new WritableStream({\r\n write: function(image) {\r\n if (finished) {\r\n console.error('Got image, but recorder is finished!');\r\n return;\r\n }\r\n\r\n worker.postMessage(image.data.buffer, [image.data.buffer]);\r\n }\r\n }));\r\n } else if (!!event.data) {\r\n if (!isPaused) {\r\n arrayOfBuffers.push(event.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n startRecording(stream);\r\n\r\n if (typeof config.initCallback === 'function') {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n var isPaused;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPaused = false;\r\n };\r\n\r\n function terminate(callback) {\r\n if (!worker) {\r\n if (callback) {\r\n callback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Wait for null event data to indicate that the encoding is complete\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === null) {\r\n worker.terminate();\r\n worker = null;\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n });\r\n\r\n worker.postMessage(null);\r\n }\r\n\r\n var arrayOfBuffers = [];\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n finished = true;\r\n\r\n var recorder = this;\r\n\r\n terminate(function() {\r\n recorder.blob = new Blob(arrayOfBuffers, {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(recorder.blob);\r\n });\r\n };\r\n\r\n // for debugging\r\n this.name = 'WebAssemblyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n\r\n // todo: if recording-ON then STOP it first\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WebAssemblyRecorder = WebAssemblyRecorder;\r\n}\n","import { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemGroup } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\n\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c(VMenu,{attrs:{\"offset-y\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c(VBtn,_vm._g({attrs:{\"text\":\"\"}},on),[_c(VIcon,{attrs:{\"left\":\"\"}},[_vm._v(\" \"+_vm._s(_vm.type === \"audio\" ? \"mdi-microphone\" : \"mdi-camera\")+\" \")]),_c('span',[_vm._v(\" \"+_vm._s(_vm.type === \"audio\" ? _vm.$t(\"rec.microphones\") : _vm.$t(\"rec.cameras\"))+\" \")]),_c(VIcon,{attrs:{\"right\":\"\"}},[_vm._v(\"mdi-chevron-down\")])],1)]}}])},[_c(VList,{attrs:{\"dense\":\"\"}},[_c(VListItemGroup,{attrs:{\"value\":_vm.selectedDevice}},_vm._l((_vm.devices),function(device){return _c(VListItem,{key:device.id,attrs:{\"value\":device.id},on:{\"click\":function($event){return _vm.selectDevice(device.id, _vm.type)}}},[(_vm.selectedDevice === device.id)?_c('span',{staticClass:\"green mr-4\",staticStyle:{\"width\":\"8px\",\"height\":\"8px\",\"border-radius\":\"4px\"}}):_vm._e(),_c(VListItemContent,[_vm._v(\" \"+_vm._s(device.name)+\" \")])],1)}),1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\r\nimport Vue from \"vue\";\r\nimport { Component, Prop } from \"vue-property-decorator\";\r\nimport {\r\n Device,\r\n getDevices,\r\n selectDevice,\r\n getInputDevice,\r\n} from \"../lib/devices\";\r\n\r\ntype DeviceType = \"video\" | \"audio\";\r\n\r\n@Component\r\nexport default class DeviceSelect extends Vue {\r\n @Prop({ default: \"audio\" }) type!: \"audio\" | \"video\";\r\n\r\n devices: Device[] = [];\r\n selectedDevice = \"\";\r\n\r\n async get() {\r\n this.devices = await getDevices(this.type);\r\n this.selectedDevice = getInputDevice(this.type);\r\n if (!this.selectedDevice && this.devices.length)\r\n this.selectedDevice = this.devices[0].id;\r\n }\r\n async selectDevice(id: string, type: DeviceType = \"audio\") {\r\n this.selectedDevice = id;\r\n //console.log(type, id, this.devices);\r\n selectDevice(id, type);\r\n }\r\n mounted() {\r\n this.get();\r\n }\r\n}\r\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--15-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--15-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DeviceSelect.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--15-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--15-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DeviceSelect.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./DeviceSelect.vue?vue&type=template&id=e4b77814&\"\nimport script from \"./DeviceSelect.vue?vue&type=script&lang=ts&\"\nexport * from \"./DeviceSelect.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","// Styles\nimport './VCheckbox.sass'\nimport '../../styles/components/_selection-controls.sass'\n\n// Components\nimport VIcon from '../VIcon'\nimport VInput from '../VInput'\n\n// Mixins\nimport Selectable from '../../mixins/selectable'\n\n/* @vue/component */\nexport default Selectable.extend({\n name: 'v-checkbox',\n\n props: {\n indeterminate: Boolean,\n indeterminateIcon: {\n type: String,\n default: '$checkboxIndeterminate',\n },\n offIcon: {\n type: String,\n default: '$checkboxOff',\n },\n onIcon: {\n type: String,\n default: '$checkboxOn',\n },\n },\n\n data () {\n return {\n inputIndeterminate: this.indeterminate,\n }\n },\n\n computed: {\n classes (): object {\n return {\n ...VInput.options.computed.classes.call(this),\n 'v-input--selection-controls': true,\n 'v-input--checkbox': true,\n 'v-input--indeterminate': this.inputIndeterminate,\n }\n },\n computedIcon (): string {\n if (this.inputIndeterminate) {\n return this.indeterminateIcon\n } else if (this.isActive) {\n return this.onIcon\n } else {\n return this.offIcon\n }\n },\n // Do not return undefined if disabled,\n // according to spec, should still show\n // a color when disabled and active\n validationState (): string | undefined {\n if (this.isDisabled && !this.inputIndeterminate) return undefined\n if (this.hasError && this.shouldValidate) return 'error'\n if (this.hasSuccess) return 'success'\n if (this.hasColor !== null) return this.computedColor\n return undefined\n },\n },\n\n watch: {\n indeterminate (val) {\n // https://github.com/vuetifyjs/vuetify/issues/8270\n this.$nextTick(() => (this.inputIndeterminate = val))\n },\n inputIndeterminate (val) {\n this.$emit('update:indeterminate', val)\n },\n isActive () {\n if (!this.indeterminate) return\n this.inputIndeterminate = false\n },\n },\n\n methods: {\n genCheckbox () {\n const { title, ...checkboxAttrs } = this.attrs$\n return this.$createElement('div', {\n staticClass: 'v-input--selection-controls__input',\n }, [\n this.$createElement(VIcon, this.setTextColor(this.validationState, {\n props: {\n dense: this.dense,\n dark: this.dark,\n light: this.light,\n },\n }), this.computedIcon),\n this.genInput('checkbox', {\n ...checkboxAttrs,\n 'aria-checked': this.inputIndeterminate\n ? 'mixed'\n : this.isActive.toString(),\n }),\n this.genRipple(this.setTextColor(this.rippleState)),\n ])\n },\n genDefaultSlot () {\n return [\n this.genCheckbox(),\n this.genLabel(),\n ]\n },\n },\n})\n","import LocalStorage from \"@/core/utils/LocalStorage\";\r\n\r\ntype DeviceType = \"video\" | \"audio\";\r\nexport interface Device {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nexport const selectDevice = (id: string, type: DeviceType = \"audio\") => {\r\n if (type === \"audio\") LocalStorage.setInputDevice(id);\r\n else LocalStorage.setVideoInputDevice(id);\r\n};\r\n\r\nexport const getInputDevice = (type: DeviceType = \"audio\") => {\r\n return type === \"audio\"\r\n ? LocalStorage.getInputDevice()\r\n : LocalStorage.getVideoInputDevice();\r\n};\r\n\r\nexport const getDevices = async (\r\n type: DeviceType = \"audio\",\r\n): Promise => {\r\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\r\n console.log(\"enumerateDevices() not supported.\");\r\n return [];\r\n }\r\n\r\n const inputDevice = getInputDevice();\r\n const constraints: MediaStreamConstraints =\r\n type === \"audio\"\r\n ? {\r\n video: false,\r\n audio: {\r\n channelCount: 1,\r\n echoCancellation: false,\r\n deviceId: inputDevice || undefined,\r\n },\r\n }\r\n : {\r\n audio: false,\r\n video: {\r\n deviceId: inputDevice || undefined,\r\n },\r\n };\r\n\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\r\n stream.getTracks().forEach(t => t.stop());\r\n } catch (error) {\r\n console.warn(\r\n `Warning: Access to ${\r\n type === \"audio\" ? \"microphone\" : \"camera\"\r\n } denied.`,\r\n error,\r\n );\r\n }\r\n\r\n try {\r\n const devices = await navigator.mediaDevices.enumerateDevices();\r\n const deviceType: MediaDeviceKind =\r\n type === \"audio\" ? \"audioinput\" : \"videoinput\";\r\n\r\n const inputDevices = devices\r\n .filter(device => device.kind === deviceType)\r\n .map(device => ({\r\n id: device.deviceId,\r\n name: device.label || `Unknown device (${type})`,\r\n }));\r\n\r\n if (!inputDevice && inputDevices.length > 0)\r\n selectDevice(inputDevices[0].id, type);\r\n\r\n console.log(`Found devices (${type}):`, inputDevices);\r\n\r\n return inputDevices;\r\n } catch (error) {\r\n console.error(\"Error while listing devices:\", error);\r\n return [];\r\n }\r\n};\r\n","// Components\nimport VInput from '../../components/VInput'\n\n// Mixins\nimport Rippleable from '../rippleable'\nimport Comparable from '../comparable'\n\n// Utilities\nimport mixins from '../../util/mixins'\n\nexport function prevent (e: Event) {\n e.preventDefault()\n}\n\n/* @vue/component */\nexport default mixins(\n VInput,\n Rippleable,\n Comparable\n).extend({\n name: 'selectable',\n\n model: {\n prop: 'inputValue',\n event: 'change',\n },\n\n props: {\n id: String,\n inputValue: null as any,\n falseValue: null as any,\n trueValue: null as any,\n multiple: {\n type: Boolean,\n default: null,\n },\n label: String,\n },\n\n data () {\n return {\n hasColor: this.inputValue,\n lazyValue: this.inputValue,\n }\n },\n\n computed: {\n computedColor (): string | undefined {\n if (!this.isActive) return undefined\n if (this.color) return this.color\n if (this.isDark && !this.appIsDark) return 'white'\n return 'primary'\n },\n isMultiple (): boolean {\n return this.multiple === true || (this.multiple === null && Array.isArray(this.internalValue))\n },\n isActive (): boolean {\n const value = this.value\n const input = this.internalValue\n\n if (this.isMultiple) {\n if (!Array.isArray(input)) return false\n\n return input.some(item => this.valueComparator(item, value))\n }\n\n if (this.trueValue === undefined || this.falseValue === undefined) {\n return value\n ? this.valueComparator(value, input)\n : Boolean(input)\n }\n\n return this.valueComparator(input, this.trueValue)\n },\n isDirty (): boolean {\n return this.isActive\n },\n rippleState (): string | undefined {\n return !this.isDisabled && !this.validationState\n ? undefined\n : this.validationState\n },\n },\n\n watch: {\n inputValue (val) {\n this.lazyValue = val\n this.hasColor = val\n },\n },\n\n methods: {\n genLabel () {\n const label = VInput.options.methods.genLabel.call(this)\n\n if (!label) return label\n\n label!.data!.on = {\n // Label shouldn't cause the input to focus\n click: prevent,\n }\n\n return label\n },\n genInput (type: string, attrs: object) {\n return this.$createElement('input', {\n attrs: Object.assign({\n 'aria-checked': this.isActive.toString(),\n disabled: this.isDisabled,\n id: this.computedId,\n role: type,\n type,\n }, attrs),\n domProps: {\n value: this.value,\n checked: this.isActive,\n },\n on: {\n blur: this.onBlur,\n change: this.onChange,\n focus: this.onFocus,\n keydown: this.onKeydown,\n click: prevent,\n },\n ref: 'input',\n })\n },\n onClick (e: Event) {\n this.onChange()\n this.$emit('click', e)\n },\n onChange () {\n if (!this.isInteractive) return\n\n const value = this.value\n let input = this.internalValue\n\n if (this.isMultiple) {\n if (!Array.isArray(input)) {\n input = []\n }\n\n const length = input.length\n\n input = input.filter((item: any) => !this.valueComparator(item, value))\n\n if (input.length === length) {\n input.push(value)\n }\n } else if (this.trueValue !== undefined && this.falseValue !== undefined) {\n input = this.valueComparator(input, this.trueValue) ? this.falseValue : this.trueValue\n } else if (value) {\n input = this.valueComparator(input, value) ? null : value\n } else {\n input = !input\n }\n\n this.validate(true, input)\n this.internalValue = input\n this.hasColor = input\n },\n onFocus (e: FocusEvent) {\n this.isFocused = true\n this.$emit('focus', e)\n },\n onBlur (e: FocusEvent) {\n this.isFocused = false\n this.$emit('blur', e)\n },\n /** @abstract */\n onKeydown (e: Event) {},\n },\n})\n"],"sourceRoot":""}