{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/ts/config/production/Config.ts","webpack:///./src/ts/helpers/SilentLoginHelper.ts","webpack:///./src/ts/helpers/LoggerHelper.ts","webpack:///./src/ts/helpers/RedirectHelper.ts","webpack:///./src/ts/meetnow/meetnow.less","webpack:///./src/ts/config/BaseConfig.ts","webpack:///./src/ts/models/SharedTypes.ts","webpack:///./src/ts/rest/MeetingsApiClientUtils.ts","webpack:///./src/ts/helpers/UrlHelper.ts","webpack:///./src/ts/meetnow/index.ts","webpack:///./src/ts/meetnow/MeetNowEdgeHandler.ts","webpack:///./src/ts/meetnow/FallbackFlow.ts","webpack:///./src/ts/helpers/SkypeTokenHelper.ts","webpack:///./src/ts/rest/BaseRestClient.ts","webpack:///./src/ts/helpers/CookieHelper.ts","webpack:///./src/ts/rest/MeetingsApiClient.ts","webpack:///./src/ts/meetnow/MeetNowSettings.ts","webpack:///./src/ts/helpers/ErrorHelper.ts","webpack:///./src/ts/helpers/DateHelper.ts","webpack:///./src/ts/meetnow/meetnow.less?b8ca","webpack:///./src/ts/helpers/EnvironmentHelper.ts","webpack:///./vendor/silentLogin.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","3","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","BaseConfig_1","silentLogin","deferral","startTime","Date","getTime","SKYPE","login","Silent","SyncTasks","Defer","init","config_1","setCallback","response","skypetoken","resolve","expiration","expires_in","error","reject","errorDescription","error_description","load","promise","done","logger","status","LoggerHelper_1","Success","duration","fail","Fail","SilentLoginStatus","CommonProperty","_logger","webjs_sdk_1","getLogger","_commonProperties","_sessionStartDate","_wasLoggedIn","_wasUnifiedView","_prefix","getSessionId","event","priority","Normal","_this","_log","network","navigation","action","sessionStarted","wasPreLoggedin","useUnifiedView","sessionIntermediateStep","wasLoggedIn","undefined","sessionFinished","sessionDurationInMs","DateHelper_1","meetNowFallbackFlow","getCorrelationId","correlationIdFromQuery","UrlHelper_1","getQueryParameterAsString","setName","eventProperties","setType","setCommonProperties","keys","forEach","piiKind","setPropertyWithPii","setProperty","EnvironmentHelper_1","env","setProperties","properties","propertyPrefix","setPiiProperties","piiProperties","NotSet","type","_onError","message","file","line","col","LoggerHelper","ariaTenantId","prefix","logging","ariaTenant","this","initialize","canSendStatEvent","enableAutoUserSession","onerror","removeEventListener","flushAndTeardown","addEventListener","skypeToken","isGuest","initCommonProperty","UserId","SkypeTokenHelper_1","Identity","String","MsaCidHex","setEventPriority","Array","isArray","logEvent","url","params","form","document","body","appendChild","submit","createElement","method","style","display","map_1","curry_1","input","config","cookies","skype","path","maxAge","domain","csrf","client_id","redirect_uri","urls","ecs","api","profile","huddle","meetings","invite","channels","captcha","lang","flowId","rand","app","faq","redirectUri","state","encodeURIComponent","logout","s4lWeb","webSubDomain","threadId","inviteId","skypeId","channelId","botLogin","botId","useBotLauncherQueryParam","loginUri","download","downloadAndroid","downloadDesktop","cookiePolicy","skypeCom","join","launcher","skypeUri","sessionId","origin","intentUri","fallbackUri","universalUri","shortId","inviteLauncher","offSkypeInviteId","botLauncher","channelLauncher","doLauncher","meetNowJoinLauncher","source","exp","video","mic","Themes","AppIds","Actions","width","height","model","id","longId","resource","transform","_a","errResp","statusCode","simplerestclients_1","RetryCountedWithBackoff","DoNotRetry","UrlHelper","webSubdomainForRedirect","getQueryParameters","getWebClientUrl","includes","allowedParameters","map","param","getQueryParameter","filter","pair","location","search","substr","split","decodeURIComponent","reduce","prev","current","pathname","replace","pop","ErrorHelper_1","ShortIdFromUrl","require","container","getElementById","removeAttribute","settings_1","MeetNowSettings_1","MeetNowEdgeAriaTenantId","SilentLoginHelper_1","then","loginResult","IsLoggedIn","IsUnsupportedPlatformOrBrowser","addSkypeIdAndMsaCidHexCommonProperties","eventType","MeetNowEdgeHandler_1","FallbackFlow_1","catch","silentLoginError","generalError","joinLink","meeting","ShortId","GenericData","ThreadId","settings","MeetingsApiClient_1","createGuestMeeting","title","DefaultMeetingTitle","MeetNowEdgeNumberOfFetchRetries","localizedGuestDefaultName","getAttribute","_b","meetnowGuest","displayName","createAuthenticatedMeeting","SkypeToken","SharedTypes_1","Meetings","getConversation","conversion","conversationServiceModel","meetnowGuestServiceModel","completionType","isNewJoinFlowFromJoinLink","webClientRedirectParams","skypeid","CookieHelper_1","getCookie","singleValue","msacidhex","High","queryParams","MeetNowEdgeAllowedQueryParameters","RedirectHelper_1","fallbackCorrelationId","getAllowedQueryParameters","find","triggerFallbackFlow","reason","showErrorMessage","handleReloadButton","handleNavigateToWebClientButton","pageTitle","querySelector","fallbackSection","reloadPageButton","preventDefault","reload","goToSkypeButton","href","parseSkypeToken","token","parts","header","JSON","parse","atob","payload","signature","e","tokenContent","cid","toUpperCase","unwrap","resp","contentType","acceptType","options","genericEventPath","customPropertiesProvider","eventPriority","endTime","responseUrl","_endpointUrl","eventUrl","responseTime","statusText","host","custom","__extends","BaseRestClient","apiPath","performApiGetDetailed","_super","networkCallback","objToPost","performApiPostDetailed","objToPatch","performApiPatchDetailed","objToPut","performApiPutDetailed","objToDelete","performApiDeleteDetailed","CookieHelper","hasCookie","cookieValuesObject","now","Math","round","TS","TM","cookieObjectToString","getExpirationDate","toUTCString","optionsString","cookie","setCookie","separatorPos","indexOf","substring","trim","parseCookieValues","cookieObject","cookieSeparator","cookieObjectKeys","cookieValue","cookieObjectKey","splitCookieValue","splitParams","seconds","MeetingsApiClient","retries","joinThread","headers","solution","challengeId","azureRegion","performApiPost","customErrorHandler","performApiGet","MeetingsApiClientUtils_1","createMeeting","BaseRestClient_1","allowedQueryParameters","currentSettings","MeetNowSettings","MeetNowEdgeJoinApiHost","rootElement","Error","dataset","parsedSettings","headerLocString","descriptionLocString","pageTitleLocString","emoticonPath","InviteIdFromUrl","TooManyUsers","Busy","InviteNotFound","JoinDisabled","Generic","BotNotFound","BotTooManyContacts","ChannelNotFound","ErrorHelper","arg","displayableError","webResponse","description","getErrorFromWebErrorResponse","startDate","endDate","valueOf","content","locals","OperatingSystems","Browsers","osRegExps","WinPhone","WinRT","Win","iOS","MacOS","Android","ChromeOS","Linux","DeviceTypes","browserRegExps","Opera","EdgeOld","Edge","MSIE","Chrome","Firefox","Safari","Facebook","EnvironmentHelper","minimumVersion","getBrowserName","version","getSafariBrowserVersion","major","minor","iOSVersionMatches","_uaParser","getUA","match","RegExp","osInformation","getOS","detectedOs","_getOsFallback","navigator","userAgent","maxTouchPoints","browserName","getBrowser","_getBrowserNameFallback","parseInt","bugfix","isSafariBrowserVersionAtLeast","Ubuntu","Desktop","AndroidX86","Mobile","Unknown","WebOS","Tizen","Other","_currentBrowserSupportsQuickJoinOnWeb","_screen","screen","_navigator","language","userLanguage","_os","_browser","knownInAppBrowsers","android","Chromium","Yandex","ios","SafariMobile","mac","windows","others","quickJoinFlowSupportedBrowsers","customUaParser","_quickJoinFlowSupportedBrowsers","ua_parser_js_1","getSupportedBrowsersDefault","currentBrowser","currentOs","supportedBrowsers","osKey","browserKey","getDeviceType","isQuickWebJoinSupported","getScreenResolution","getLanguage","platform","isIOSInAppBrowserFlow","isSafariBrowserEligibleForMeetingGuestFlow","ancestorElement","callback","loginDomains","ssoLoginDomains","originCheckMap","iFrameReference","timeoutObj","originCheckHosts","eventRegistered","processing","logEnabled","_messageListener","_destroySilentLogin","_callCallback","_handleTimeout","_getFrameSource","qa","live","isSsoCompatible","debug","tokens","prop","stringify","console","log","originCheckPassed","ex","receivedState","attr","clearTimeout","removeChild","timestamp","domainMap","query","response_type","partner","_accept","_nc","str","k","_createQuery","attachEvent","callbackFunction","protocol","_validateSettings","setTimeout","head","getElementsByTagName","frameBorder","visibility","floor","random","setAttribute","getSkypetoken","getFullResponse"],"mappings":"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","file":"js/meetnow.c3ab30dcc3effb0425ce.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t3: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://join.secure.skypeassets.com/static/14.475\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([\"Pbvb\",0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import config, { Config, CookieConfig } from '../BaseConfig';\r\n\r\nconst override: Partial = {\r\n};\r\n\r\n// Export here should mirror parent, so webpack can do his magic with alias\r\nexport { Config, CookieConfig };\r\nexport default { ...config, ...override };\r\n","import config from 'config';\r\nimport * as SyncTasks from 'synctasks';\r\nimport { logger, SilentLoginStatus } from './LoggerHelper';\r\n\r\nexport interface SilentLoginResult {\r\n skypetoken: string;\r\n expiration: number;\r\n}\r\n\r\nexport const silentLoginAsync = () => {\r\n const initLogin = (): SyncTasks.Promise => {\r\n\r\n const silentLogin = (window as any).SKYPE.login.Silent;\r\n const deferral = SyncTasks.Defer();\r\n\r\n silentLogin.init(config.silentLogin)\r\n .setCallback((response: any) => {\r\n if (response && response.skypetoken) {\r\n deferral.resolve({ skypetoken: response.skypetoken, expiration: response.expires_in });\r\n return;\r\n }\r\n if (response && response.error) {\r\n deferral.reject({ error: response.error, errorDescription: response.error_description || '' });\r\n return;\r\n }\r\n deferral.reject();\r\n })\r\n .load();\r\n\r\n return deferral.promise();\r\n };\r\n\r\n const startTime = new Date().getTime();\r\n\r\n return initLogin()\r\n .done(() => logger.silentLogin({ status: SilentLoginStatus.Success, duration: new Date().getTime() - startTime }))\r\n .fail((response) => logger.silentLogin({\r\n status: SilentLoginStatus.Fail,\r\n duration: new Date().getTime() - startTime,\r\n error: response.error,\r\n errorDescription: response.errorDescription,\r\n }));\r\n};\r\n","import { AWTEventPriority, AWTEventProperties, AWTLogger, AWTLogManager, AWTPiiKind, AWTPropertyType } from '@aria/webjs-sdk';\r\nimport Config from 'config';\r\nimport { Dictionary } from '../models/SharedTypes';\r\nimport { getDiffInMS } from './DateHelper';\r\nimport { browser, deviceType, os } from './EnvironmentHelper';\r\nimport { getMsaCidHexFromSkypeToken, getSkypeIdFromSkypeToken } from './SkypeTokenHelper';\r\nimport { UrlHelper } from './UrlHelper';\r\n\r\nexport interface NetworkEvent {\r\n host: string;\r\n path: string;\r\n url: string;\r\n method: string;\r\n statusCode: number;\r\n statusText?: string;\r\n responseTime: number;\r\n custom?: any;\r\n}\r\n\r\nexport type NavigationEventType = 'push' | 'pop';\r\nexport interface NavigationEvent {\r\n view: string;\r\n type: NavigationEventType;\r\n isRoot: boolean;\r\n}\r\n\r\nexport interface SessionStartedEvent {\r\n useUnifiedView: boolean;\r\n wasPreLoggedin: boolean;\r\n}\r\n\r\nexport interface SessionFinishedEvent {\r\n useUnifiedView?: boolean;\r\n sessionDurationInMs?: number;\r\n completionType: string;\r\n wasLoggedIn?: boolean;\r\n}\r\n\r\nexport interface SessionIntermediateEvent {\r\n useUnifiedView?: boolean;\r\n wasLoggedIn?: boolean;\r\n eventType: string;\r\n}\r\n\r\nexport interface ActionEvent {\r\n name: string;\r\n}\r\n\r\nexport enum SilentLoginStatus {\r\n Success = 'success',\r\n Fail = 'fail',\r\n}\r\nexport interface SilentLoginEvent {\r\n status: SilentLoginStatus;\r\n duration: number;\r\n error?: string;\r\n errorDescription?: string;\r\n}\r\n\r\nexport interface FallbackFlowEvent {\r\n message: string;\r\n reason: string;\r\n}\r\n\r\nconst defaultPrefix = 'ui_';\r\n\r\nexport enum CommonProperty {\r\n SkypeId = 'UserInfo.SkypeId',\r\n ThreadId = 'Meeting.ThreadId',\r\n ShortId = 'Meeting.ShortId',\r\n InviteSkypeId = 'Invite.SkypeId',\r\n BotId = 'Bot.BotId',\r\n ChannelId = 'Channel.ChannelId',\r\n EntryPoint = 'Page.EntryPoint',\r\n CorrelationId = 'Page.CorrelationId',\r\n Source = 'Page.Source',\r\n Profile = 'Profile.SkypeId',\r\n IsLoggedIn = 'UserInfo.IsLoggedIn',\r\n UserId = 'UserInfo.Id',\r\n MsaCidHex = 'MSACIDHEX',\r\n IsUnsupportedPlatformOrBrowser = 'IsUnsupportedPlatformOrBrowser',\r\n}\r\n\r\nexport interface Property {\r\n key: CommonProperty;\r\n value: string | number | boolean | Date;\r\n piiKind?: AWTPiiKind;\r\n type?: AWTPropertyType;\r\n}\r\n\r\nclass LoggerHelper {\r\n private _logger: AWTLogger = AWTLogManager.getLogger();\r\n private _commonProperties: Dictionary = {};\r\n private _sessionStartDate: Date = new Date();\r\n private _wasLoggedIn: boolean = false;\r\n private _wasUnifiedView: boolean = false;\r\n private _prefix: string = defaultPrefix;\r\n\r\n init(ariaTenantId = Config.logging.ariaTenant, prefix?: string) {\r\n if (prefix) {\r\n this._prefix = prefix;\r\n }\r\n\r\n AWTLogManager.initialize(ariaTenantId, {\r\n canSendStatEvent: () => false,\r\n enableAutoUserSession: true,\r\n });\r\n\r\n window.onerror = this._onError;\r\n\r\n // Current implementation of the flushAndTeardown method has wrong context when used as callback\r\n // therefore asynchronous pending events would be lost, let's fix it\r\n window.removeEventListener('beforeunload', AWTLogManager.flushAndTeardown);\r\n window.addEventListener('beforeunload', AWTLogManager.flushAndTeardown.bind(AWTLogManager));\r\n }\r\n\r\n getSessionId = () => this._logger.getSessionId();\r\n\r\n public initCommonProperty(property: Property) {\r\n this._commonProperties[property.key] = property;\r\n }\r\n\r\n public addSkypeIdAndMsaCidHexCommonProperties(skypeToken: string | undefined, isGuest: boolean) {\r\n this.initCommonProperty({\r\n key: CommonProperty.UserId,\r\n value: getSkypeIdFromSkypeToken(skypeToken) || '',\r\n piiKind: isGuest ? AWTPiiKind.NotSet : AWTPiiKind.Identity, // guest skypeId is not considered PII as it's anonymous and valid for 24 hours\r\n type: AWTPropertyType.String,\r\n });\r\n\r\n this.initCommonProperty({\r\n key: CommonProperty.MsaCidHex,\r\n value: getMsaCidHexFromSkypeToken(skypeToken) || '',\r\n piiKind: AWTPiiKind.NotSet,\r\n type: AWTPropertyType.String,\r\n });\r\n }\r\n\r\n error = (event: Error, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'error', 'Error');\r\n }\r\n\r\n network = (event: NetworkEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'network_event', 'Network');\r\n }\r\n\r\n navigation = (event: NavigationEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'navigation', 'Navigation');\r\n }\r\n\r\n action = (event: ActionEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'action', 'Action');\r\n }\r\n\r\n silentLogin = (event: SilentLoginEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'silent_login', 'SilentLogin');\r\n }\r\n\r\n sessionStarted = (event: SessionStartedEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._sessionStartDate = new Date();\r\n this._wasLoggedIn = event.wasPreLoggedin;\r\n this._wasUnifiedView = event.useUnifiedView;\r\n this._log(event, priority, 'session_started', 'SessionStarted');\r\n }\r\n\r\n sessionIntermediateStep = (event: SessionIntermediateEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n event.wasLoggedIn = event.wasLoggedIn === undefined ? this._wasLoggedIn : event.wasLoggedIn;\r\n event.useUnifiedView = this._wasUnifiedView;\r\n this._log(event, priority, 'session_intermediate', 'SessionIntermediateEvent');\r\n }\r\n\r\n sessionFinished = (event: SessionFinishedEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n event.sessionDurationInMs = getDiffInMS(this._sessionStartDate);\r\n event.wasLoggedIn = this._wasLoggedIn;\r\n event.useUnifiedView = this._wasUnifiedView;\r\n\r\n this._log(event, priority, 'session_finished', 'SessionFinished');\r\n }\r\n\r\n meetNowFallbackFlow = (event: FallbackFlowEvent) => {\r\n this._log(event, AWTEventPriority.Normal, 'fallback_flow_started', 'FallbackFlowStarted');\r\n }\r\n\r\n getCorrelationId = () => {\r\n const correlationIdFromQuery = UrlHelper.getQueryParameterAsString('correlationId');\r\n if (correlationIdFromQuery) {\r\n return correlationIdFromQuery;\r\n }\r\n\r\n return this.getSessionId();\r\n }\r\n\r\n private setName = (eventProperties: AWTEventProperties, name: string) => {\r\n eventProperties.setName(this._prefix + name);\r\n eventProperties.setType(name);\r\n }\r\n\r\n private setCommonProperties = (eventProperties: AWTEventProperties) => {\r\n Object.keys(this._commonProperties).forEach((key) => {\r\n const property = (this._commonProperties as any)[key] as Property;\r\n if (property.piiKind) {\r\n eventProperties.setPropertyWithPii(property.key, property.value, property.piiKind);\r\n } else {\r\n eventProperties.setProperty(property.key, property.value);\r\n }\r\n });\r\n eventProperties.setProperty('DeviceInfo.Custom.Os', os);\r\n eventProperties.setProperty('DeviceInfo.Custom.Browser', browser);\r\n eventProperties.setProperty('DeviceInfo.Custom.DeviceType', deviceType);\r\n eventProperties.setProperty('Config.Env', Config.env);\r\n eventProperties.setProperty('Source', UrlHelper.getQueryParameterAsString('source'));\r\n eventProperties.setProperty('Exp', UrlHelper.getQueryParameterAsString('exp'));\r\n eventProperties.setProperty('Call', UrlHelper.getQueryParameterAsString('call'));\r\n eventProperties.setProperty('Video', UrlHelper.getQueryParameterAsString('video'));\r\n eventProperties.setProperty('Mic', UrlHelper.getQueryParameterAsString('mic'));\r\n eventProperties.setProperty('CorrelationId', this.getCorrelationId());\r\n eventProperties.setProperty('session_id', this.getCorrelationId()); // this is used as an actor in Interana\r\n }\r\n\r\n private setProperties = (eventProperties: AWTEventProperties, properties: any, propertyPrefix: string) => {\r\n Object.keys(properties).forEach((property) => {\r\n if (typeof properties[property] === 'object' && properties[property]) {\r\n this.setProperties(eventProperties, properties[property], propertyPrefix + '.' + property);\r\n } else {\r\n eventProperties.setProperty(propertyPrefix + '.' + property, properties[property]);\r\n }\r\n });\r\n }\r\n\r\n private setPiiProperties = (eventProperties: AWTEventProperties, piiProperties: Property[], propertyPrefix: string) => {\r\n piiProperties.forEach((property: Property) => {\r\n eventProperties.setPropertyWithPii(propertyPrefix + '.' + property.key, property.value, property.piiKind || AWTPiiKind.NotSet, property.type);\r\n });\r\n }\r\n\r\n private _onError = (message: any, file: any, line: any, col: any, error: any) => {\r\n this._log({\r\n message,\r\n file,\r\n line,\r\n col,\r\n error,\r\n }, AWTEventPriority.Normal, 'js_onerror', 'Error');\r\n }\r\n\r\n private _log(event: any, priority: AWTEventPriority, name: string, propertyPrefix: string, piiProperties?: Property[]) {\r\n const eventProperties = new AWTEventProperties();\r\n eventProperties.setEventPriority(priority);\r\n this.setName(eventProperties, name);\r\n this.setCommonProperties(eventProperties);\r\n this.setProperties(eventProperties, event, propertyPrefix);\r\n\r\n if (piiProperties && Array.isArray(piiProperties)) {\r\n this.setPiiProperties(eventProperties, piiProperties, propertyPrefix);\r\n }\r\n\r\n this._logger.logEvent(eventProperties);\r\n }\r\n}\r\n\r\nexport const logger = new LoggerHelper();\r\n","import curry from 'lodash/curry';\r\nimport map from 'lodash/map';\r\n\r\nexport const doPostRedirect = (url: string, params: object) => {\r\n const form = buildForm(url, params);\r\n\r\n document.body.appendChild(form);\r\n form.submit();\r\n};\r\n\r\n/**\r\n * This helper is not using React to render the \"utility form\" because on Meet Now Edge page, React is not included in the package.\r\n *\r\n * @param url\r\n * @param params\r\n */\r\nexport const buildForm = (url: string, params: object): HTMLFormElement => {\r\n const form = document.createElement('form');\r\n form.method = 'POST';\r\n form.style.display = 'none';\r\n form.action = url;\r\n\r\n addParameters(form, params);\r\n\r\n return form;\r\n};\r\n\r\nexport const addParameters = (form: HTMLFormElement, params: object) => {\r\n map(params, addParameter(form));\r\n};\r\n\r\nexport const addParameter = curry((form: HTMLFormElement, value: string, key: string) => {\r\n const input = document.createElement('input');\r\n input.type = 'hidden';\r\n input.name = key;\r\n input.value = value;\r\n\r\n form.appendChild(input);\r\n});\r\n","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".largeSpinner{height:36px;width:36px;margin-top:40px}.largeSpinner .spinner{height:100%;position:relative;width:100%}.largeSpinner .spinner .circle{height:16%;left:42%;top:42%;width:16%;position:absolute}.largeSpinner .spinner .circle div{height:100%;position:absolute;width:100%}.largeSpinner .spinner .circle .position{top:-250%}.largeSpinner .spinner .circle .shape{background-color:#0078ca;border-radius:50%;overflow:hidden}.largeSpinner .spinner.small .circle{height:24%;left:38%;top:38%;width:24%}.largeSpinner .spinner.small .circle .position{top:-150%}.largeSpinner .spinner.blue .circle .shape{background-color:#0078ca}.largeSpinner .spinner.blue .circle .shape:after{border-color:#0078ca}.largeSpinner .spinner.white .circle .shape{background-color:#fff}.largeSpinner .spinner.white .circle .shape:after{border-color:#fff}.largeSpinner .spinner .circle .rotate,.largeSpinner .spinner .circle .scale{-webkit-animation-direction:normal;animation-direction:normal;-webkit-animation-duration:1.4s;animation-duration:1.4s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear}.largeSpinner .spinner .circle.one .rotate{-webkit-animation-name:spinner-one-rotate;animation-name:spinner-one-rotate}.largeSpinner .spinner .circle.one .scale{-webkit-animation-name:spinner-one-scale;animation-name:spinner-one-scale}.largeSpinner .spinner .circle.two .rotate{-webkit-animation-name:spinner-two-rotate;animation-name:spinner-two-rotate}.largeSpinner .spinner .circle.two .scale{-webkit-animation-name:spinner-two-scale;animation-name:spinner-two-scale}.largeSpinner .spinner .circle.three .rotate{-webkit-animation-name:spinner-three-rotate;animation-name:spinner-three-rotate}.largeSpinner .spinner .circle.three .scale{-webkit-animation-name:spinner-three-scale;animation-name:spinner-three-scale}.largeSpinner .spinner .circle.four .rotate{-webkit-animation-name:spinner-four-rotate;animation-name:spinner-four-rotate}.largeSpinner .spinner .circle.four .scale{-webkit-animation-name:spinner-four-scale;animation-name:spinner-four-scale}.largeSpinner .spinner.small .circle.one .rotate{-webkit-animation-name:spinner-small-one-rotate;animation-name:spinner-small-one-rotate}.largeSpinner .spinner.small .circle.one .scale{-webkit-animation-name:spinner-small-one-scale;animation-name:spinner-small-one-scale}.largeSpinner .spinner.small .circle.two .rotate{-webkit-animation-name:spinner-small-two-rotate;animation-name:spinner-small-two-rotate}.largeSpinner .spinner.small .circle.two .scale{-webkit-animation-name:spinner-small-two-scale;animation-name:spinner-small-two-scale}.largeSpinner .spinner.small .circle.three .rotate{-webkit-animation-name:spinner-small-three-rotate;animation-name:spinner-small-three-rotate}.largeSpinner .spinner.small .circle.three .scale{-webkit-animation-name:spinner-small-three-scale;animation-name:spinner-small-three-scale}.largeSpinner .spinner.small .circle.four .rotate{-webkit-animation-name:spinner-small-four-rotate;animation-name:spinner-small-four-rotate}.largeSpinner .spinner.small .circle.four .scale{-webkit-animation-name:spinner-small-four-scale;animation-name:spinner-small-four-scale}@-webkit-keyframes spinner-one-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.65,.21,.25,.76);animation-timing-function:cubic-bezier(.65,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-one-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.65,.21,.25,.76);animation-timing-function:cubic-bezier(.65,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes spinner-one-scale{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}33.33%{-webkit-transform:scale(.35);transform:scale(.35);-webkit-animation-timing-function:cubic-bezier(.33,0,1,1);animation-timing-function:cubic-bezier(.33,0,1,1)}52.38%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.8,0,.78,1);animation-timing-function:cubic-bezier(.8,0,.78,1)}72.62%{-webkit-transform:scale(1.15);transform:scale(1.15);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes spinner-one-scale{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}33.33%{-webkit-transform:scale(.35);transform:scale(.35);-webkit-animation-timing-function:cubic-bezier(.33,0,1,1);animation-timing-function:cubic-bezier(.33,0,1,1)}52.38%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.8,0,.78,1);animation-timing-function:cubic-bezier(.8,0,.78,1)}72.62%{-webkit-transform:scale(1.15);transform:scale(1.15);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes spinner-two-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.76,.21,.25,.76);animation-timing-function:cubic-bezier(.76,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-two-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.76,.21,.25,.76);animation-timing-function:cubic-bezier(.76,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes spinner-two-scale{0%{-webkit-transform:scale(.96);transform:scale(.96);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}4.76%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}38.1%{-webkit-transform:scale(.35);transform:scale(.35);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}57.14%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes spinner-two-scale{0%{-webkit-transform:scale(.96);transform:scale(.96);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}4.76%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}38.1%{-webkit-transform:scale(.35);transform:scale(.35);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}57.14%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes spinner-three-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.88,.21,.25,.76);animation-timing-function:cubic-bezier(.88,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-three-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.88,.21,.25,.76);animation-timing-function:cubic-bezier(.88,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes spinner-three-scale{0%{-webkit-transform:scale(.96);transform:scale(.96);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}9.52%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}42.86%{-webkit-transform:scale(.35);transform:scale(.35);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}61.9%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes spinner-three-scale{0%{-webkit-transform:scale(.96);transform:scale(.96);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}9.52%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}42.86%{-webkit-transform:scale(.35);transform:scale(.35);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}61.9%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes spinner-four-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(1,.2,.25,.76);animation-timing-function:cubic-bezier(1,.2,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-four-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(1,.2,.25,.76);animation-timing-function:cubic-bezier(1,.2,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes spinner-four-scale{0%{-webkit-transform:scale(.96);transform:scale(.96);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}14.29%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}47.62%{-webkit-transform:scale(.35);transform:scale(.35);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}66.67%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}to{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}}@keyframes spinner-four-scale{0%{-webkit-transform:scale(.96);transform:scale(.96);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}14.29%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}47.62%{-webkit-transform:scale(.35);transform:scale(.35);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}66.67%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}to{-webkit-transform:scale(.45);transform:scale(.45);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}}@-webkit-keyframes spinner-small-one-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.65,.21,.25,.76);animation-timing-function:cubic-bezier(.65,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-small-one-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.65,.21,.25,.76);animation-timing-function:cubic-bezier(.65,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes spinner-small-one-scale{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}33.33%{-webkit-transform:scale(.6);transform:scale(.6);-webkit-animation-timing-function:cubic-bezier(.33,0,1,1);animation-timing-function:cubic-bezier(.33,0,1,1)}52.38%{-webkit-transform:scale(.7);transform:scale(.7);-webkit-animation-timing-function:cubic-bezier(.8,0,.78,1);animation-timing-function:cubic-bezier(.8,0,.78,1)}72.62%{-webkit-transform:scale(1.1);transform:scale(1.1);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes spinner-small-one-scale{0%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}33.33%{-webkit-transform:scale(.6);transform:scale(.6);-webkit-animation-timing-function:cubic-bezier(.33,0,1,1);animation-timing-function:cubic-bezier(.33,0,1,1)}52.38%{-webkit-transform:scale(.7);transform:scale(.7);-webkit-animation-timing-function:cubic-bezier(.8,0,.78,1);animation-timing-function:cubic-bezier(.8,0,.78,1)}72.62%{-webkit-transform:scale(1.1);transform:scale(1.1);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes spinner-small-two-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.76,.21,.25,.76);animation-timing-function:cubic-bezier(.76,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-small-two-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.76,.21,.25,.76);animation-timing-function:cubic-bezier(.76,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes spinner-small-two-scale{0%{-webkit-transform:scale(1);transform:scale(1)}4.76%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}38.1%{-webkit-transform:scale(.6);transform:scale(.6);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}57.14%{-webkit-transform:scale(.7);transform:scale(.7);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes spinner-small-two-scale{0%{-webkit-transform:scale(1);transform:scale(1)}4.76%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}38.1%{-webkit-transform:scale(.6);transform:scale(.6);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}57.14%{-webkit-transform:scale(.7);transform:scale(.7);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes spinner-small-three-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.88,.21,.25,.76);animation-timing-function:cubic-bezier(.88,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-small-three-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(.88,.21,.25,.76);animation-timing-function:cubic-bezier(.88,.21,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes spinner-small-three-scale{0%{-webkit-transform:scale(1);transform:scale(1)}9.52%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}42.86%{-webkit-transform:scale(.6);transform:scale(.6);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}61.9%{-webkit-transform:scale(.7);transform:scale(.7);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes spinner-small-three-scale{0%{-webkit-transform:scale(1);transform:scale(1)}9.52%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}42.86%{-webkit-transform:scale(.6);transform:scale(.6);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}61.9%{-webkit-transform:scale(.7);transform:scale(.7);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.8);transform:scale(.8);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes spinner-small-four-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(1,.2,.25,.76);animation-timing-function:cubic-bezier(1,.2,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-small-four-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);-webkit-animation-timing-function:cubic-bezier(1,.2,.25,.76);animation-timing-function:cubic-bezier(1,.2,.25,.76)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes spinner-small-four-scale{0%{-webkit-transform:scale(1);transform:scale(1)}14.29%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}47.62%{-webkit-transform:scale(.6);transform:scale(.6);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}66.67%{-webkit-transform:scale(.7);transform:scale(.7);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.5);transform:scale(.5);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes spinner-small-four-scale{0%{-webkit-transform:scale(1);transform:scale(1)}14.29%{-webkit-transform:scale(1);transform:scale(1);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}47.62%{-webkit-transform:scale(.6);transform:scale(.6);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}66.67%{-webkit-transform:scale(.7);transform:scale(.7);-webkit-animation-timing-function:cubic-bezier(.33,0,.67,1);animation-timing-function:cubic-bezier(.33,0,.67,1)}72.62%{-webkit-transform:scale(.5);transform:scale(.5);-webkit-animation-timing-function:cubic-bezier(.33,0,0,1);animation-timing-function:cubic-bezier(.33,0,0,1)}to{-webkit-transform:scale(1);transform:scale(1)}}body{background-color:#2b2c33;color:#fff}#meetnowContainer{width:calc(100vw - 20px);height:calc(100vh - 20px);-webkit-box-align:center;-ms-flex-align:center;align-items:center;overflow:hidden;padding:10px}#fallbackSection,#meetnowContainer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}#fallbackSection{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.actionButtons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-top:10px}@media only screen and (max-width:767px){.actionButtons{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.splashScreen{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:200px;margin:0 30px}.splashScreen .headerText{font-size:24px;margin-top:30px}.button{color:#fff;background-color:#0078ca;box-sizing:border-box;border:1px solid transparent;border-radius:100px;cursor:pointer;display:inline-block;font-size:16px;font-weight:600;line-height:24px;position:relative;text-align:center;text-decoration:none!important;word-wrap:break-word;padding:12px 30px;margin:10px 20px}.button:active,.button:focus,.button:hover{background-color:#0b64a4}.microsoftLogo{position:absolute;left:0;right:0;bottom:60px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.microsoftLogo img{width:112px;height:24px}.disclaimer{position:fixed;bottom:10px}.disclaimer .disclaimerText{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.disclaimer .disclaimerText .callDisabledIcon{display:-webkit-box;display:-ms-flexbox;display:flex;margin-right:5px;padding-bottom:1px}html[dir=rtl] .disclaimer .disclaimerText .callDisabledIcon{margin-right:0;margin-left:5px}.disclaimer .disclaimerText .callDisabledIcon img{height:16px}@-webkit-keyframes blink{0%{opacity:.2}20%{opacity:1}to{opacity:.2}}@keyframes blink{0%{opacity:.2}20%{opacity:1}to{opacity:.2}}\", \"\"]);\n\n// exports\n","import { Actions } from '../models/SharedTypes';\r\n\r\nexport interface CookieConfig {\r\n name: string;\r\n key?: string;\r\n path?: string;\r\n maxAge?: number;\r\n domain?: string;\r\n}\r\n\r\nexport interface S4LParameters {\r\n threadId?: string;\r\n inviteId?: string;\r\n skypeId?: string;\r\n channelId?: string;\r\n}\r\n\r\nexport interface Config {\r\n env: 'dev' | 'latest' | 'qa' | 'dogfood' | 'production';\r\n cookies: {\r\n skype: CookieConfig;\r\n csrf: CookieConfig;\r\n };\r\n silentLogin: {\r\n env: string;\r\n client_id: string;\r\n redirect_uri: string;\r\n };\r\n logging: {\r\n ariaTenant: string;\r\n };\r\n urls: {\r\n ecs: string,\r\n api: {\r\n profile: string;\r\n huddle: string;\r\n meetings: string;\r\n invite: string;\r\n channels: string;\r\n captcha: (lang: string, flowId: string, rand: string) => string;\r\n }\r\n app: {\r\n faq: string;\r\n login: (redirectUri: string, state: string) => string;\r\n logout: (redirectUri: string, state: string) => string;\r\n s4lWeb: (params: S4LParameters, webSubDomain?: string) => string;\r\n botLogin: (botId: string, useBotLauncherQueryParam?: boolean) => string;\r\n download: string;\r\n downloadAndroid: (threadId?: string) => string;\r\n downloadDesktop: string; // Remove once we have access to goLink CMS, the first one should be enough\r\n cookiePolicy: string;\r\n skypeCom: string,\r\n join: string,\r\n },\r\n launcher: {\r\n skypeUri: (action: Actions, threadId: string, sessionId: string, origin: string) => string;\r\n intentUri: (action: Actions, threadId: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n universalUri: (shortId: string, sessionId: string) => string;\r\n },\r\n inviteLauncher: {\r\n skypeUri: (skypeId: string, sessionId: string, offSkypeInviteId: string, origin: string) => string;\r\n intentUri: (skypeId: string, sessionId: string, offSkypeInviteId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n botLauncher: {\r\n skypeUri: (botId: string, sessionId: string, origin: string) => string;\r\n intentUri: (botId: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n channelLauncher: {\r\n skypeUri: (channelId: string, sessionId: string, origin: string) => string;\r\n intentUri: (channelId: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n doLauncher: {\r\n skypeUri: (action: Actions, skypeId: string, sessionId: string, origin: string) => string;\r\n intentUri: (action: Actions, skypeId: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n meetNowJoinLauncher: {\r\n skypeUri: (action: Actions, source: string, exp: string, call: string, video: string, mic: string, sessionId: string, origin: string) => string;\r\n intentUri: (action: Actions, source: string, exp: string, call: string, video: string, mic: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n };\r\n}\r\n\r\nconst config: Config = {\r\n env: 'production',\r\n cookies: {\r\n skype: {\r\n name: 'SC',\r\n path: '/',\r\n maxAge: 3600 * 24 * 90, // 90 days\r\n domain: '.skype.com',\r\n },\r\n csrf: {\r\n name: 'x-csrf-token',\r\n },\r\n },\r\n logging: {\r\n ariaTenant: '36f18b389f2543c0b54bf5c5555e3587-e50b4ede-9173-4805-ab3a-7c8564e50b52-6674',\r\n },\r\n silentLogin: {\r\n env: 'live',\r\n client_id: '371752',\r\n redirect_uri: 'https://join.skype.com',\r\n },\r\n urls: {\r\n ecs: 'https://a.config.skype.com',\r\n api: {\r\n profile: 'https://profile.skype.com/profile',\r\n huddle: 'https://join.skype.com/api',\r\n meetings: 'https://api.join.skype.com',\r\n invite: 'https://inviteconnector.skype.com',\r\n channels: 'https://channels.skype.com',\r\n captcha: (lang: string, flowId: string, rand: string) =>\r\n `https://client.hip.live.com/GetHIP/GetWLSPHIP0/WLSPHIP0?mkt=${ lang }&fid=${ flowId }&id=skypeguest&type=visual&rnd=${ rand }`,\r\n },\r\n app: {\r\n faq: 'https://go.skype.com/faq.invites',\r\n login: (redirectUri: string, state: string) =>\r\n `https://login.skype.com/login?client_id=578134&redirect_uri=${ encodeURIComponent(redirectUri) }&state=${ state }`,\r\n logout: (redirectUri: string, state: string) =>\r\n `https://login.skype.com/logout?client_id=578134&redirect_uri=${ encodeURIComponent(redirectUri) }&state=${ state }`,\r\n s4lWeb: (params, webSubDomain) => {\r\n const url = `https://${ !!webSubDomain ? `${ webSubDomain }.` : '' }web.skype.com`;\r\n if (params.threadId) {\r\n return `${ url }/${ params.threadId }`;\r\n }\r\n\r\n if (params.inviteId && params.skypeId) {\r\n return `${ url }/8:${ params.skypeId }?inviteId=${ params.inviteId }`;\r\n }\r\n\r\n if (params.channelId) {\r\n return `${ url }/channel/${ params.channelId }`;\r\n }\r\n\r\n return url;\r\n },\r\n botLogin: (botId: string, useBotLauncherQueryParam?: boolean) => {\r\n const loginUri = `https://login.skype.com/login?client_id=708557&redirect_uri=https%3A%2F%2Fjoin.skype.com%2Fbot%2F${ botId }`;\r\n if (useBotLauncherQueryParam) {\r\n return loginUri + '?botsLauncher=true';\r\n }\r\n\r\n return loginUri;\r\n },\r\n download: 'https://go.skype.com/spaces.getskype',\r\n downloadAndroid: (threadId?: string) =>\r\n `https://play.google.com/store/apps/details?id=com.skype.raider&referrer=${threadId && encodeURIComponent(\r\n `utm_source=invite&utm_thread=${threadId}`)}`,\r\n downloadDesktop: 'https://go.skype.com/download-skype/',\r\n cookiePolicy: 'https://go.skype.com/privacy',\r\n skypeCom: 'https://www.skype.com',\r\n join: 'https://join.skype.com',\r\n },\r\n launcher: {\r\n skypeUri: (action, threadId, sessionId, origin) => `skype:?${ action }&threadId=${ threadId }&correlationId=${ sessionId }&origin=${ origin }`,\r\n intentUri: (action, threadId, sessionId, origin, fallbackUri) =>\r\n `intent://?${ action }&threadId=${ threadId }&correlationId=${ sessionId }&origin=${ origin }`\r\n + `#Intent;scheme=skype;package=com.skype.raider;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n universalUri: (shortId, sessionId) => `https://www.skype.com/meetnow/${ shortId }?fallback=true&correlationId=${sessionId}`,\r\n },\r\n inviteLauncher: {\r\n skypeUri: (skypeId, sessionId, offSkypeInviteId, origin) =>\r\n `skype:${ skypeId }?chat&correlationId=${ sessionId }&utm_source=buddy&utm_content=${ offSkypeInviteId }&origin=${ origin }`,\r\n intentUri: (skypeId, sessionId, offSkypeInviteId, origin, fallbackUri) =>\r\n `intent://${ skypeId }?chat&correlationId=${ sessionId }&utm_source=buddy&utm_content=${ offSkypeInviteId }&origin=${ origin }`\r\n + `#Intent;scheme=skype;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n botLauncher: {\r\n skypeUri: (botId, sessionId, origin) => `skype:${ botId }?chat&correlationId=${ sessionId }&origin=${ origin }`,\r\n intentUri: (botId, sessionId, origin, fallbackUri) =>\r\n `intent://${ botId }?chat&correlationId=${ sessionId }&origin=${ origin }#Intent;scheme=skype;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n channelLauncher: {\r\n skypeUri: (channelId, sessionId, origin) => `skype:?channel=${ encodeURIComponent(channelId) }&correlationId=${ sessionId }&origin=${ origin }`,\r\n intentUri: (channelId, sessionId, origin, fallbackUri) =>\r\n `intent://?channel=${ encodeURIComponent(channelId) }&correlationId=${ sessionId }&origin=${ origin }`\r\n + `#Intent;scheme=skype;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n doLauncher: {\r\n skypeUri: (action, skypeId, sessionId, origin) =>\r\n `skype:${ skypeId }?${ action }&correlationId=${ sessionId }&origin=${ origin }`,\r\n intentUri: (action, skypeId, sessionId, origin, fallbackUri) =>\r\n `intent://${ skypeId }?${ action }&correlationId=${ sessionId }&origin=${ origin }`\r\n + `#Intent;scheme=skype;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n meetNowJoinLauncher: {\r\n skypeUri: (action, source, exp, call, video, mic, sessionId, origin) =>\r\n `skype:?action=${ action }&source=${ source }&exp=${ exp }&correlationId=${ sessionId }&origin=${ origin }&call=${ call }&video=${ video}&mic=${ mic }`,\r\n intentUri: (action, source, exp, call, video, mic, sessionId, origin, fallbackUri) =>\r\n `intent://?action=${ action }&source=${ source }&exp=${ exp }&correlationId=${ sessionId }&origin=${ origin }&call=${ call }&video=${ video}&mic=${ mic }`\r\n + `#Intent;scheme=skype;package=com.skype.raider;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n },\r\n};\r\n\r\nexport default config;\r\n","export interface Dictionary {\r\n [index: string]: T;\r\n}\r\n\r\nexport enum Themes {\r\n Teams = 'teams',\r\n Light = 'light',\r\n}\r\n\r\nexport enum AppIds {\r\n Meetings = 'wl',\r\n OffSkypeInvites = 'oi',\r\n}\r\n\r\nexport enum Actions {\r\n Chat = 'chat',\r\n Call = 'call',\r\n MeetNowJoin = 'meetnowjoin',\r\n}\r\n\r\nexport interface Dimension { width: number; height: number; }\r\nexport const defaultDimension: Dimension = { width: 0, height: 0 };\r\nexport const mainContentId = 'mainContent';\r\nexport const COUNTRY_CHINA = 'cn';\r\n","import { ErrorHandlingType, WebErrorResponse } from 'simplerestclients';\r\nimport { ConversationServiceModel, RawConversationServiceModel } from '../models/ConversationServiceModel';\r\n\r\ntype Transform = (model: RawConversationServiceModel) => ConversationServiceModel;\r\n\r\nfunction transform(model: RawConversationServiceModel): ConversationServiceModel {\r\n return {\r\n action: 'Chat',\r\n flowId: model.flowId,\r\n id: model.longId,\r\n resource: model.threadId,\r\n };\r\n}\r\n\r\nexport const transformWrapper = (shortId: string): Transform =>\r\n (model: RawConversationServiceModel): ConversationServiceModel => ({\r\n ...transform(model),\r\n shortId,\r\n });\r\n\r\nconst shouldRetry = (statusCode: number): boolean =>\r\n statusCode === 0 || (statusCode >= 500 && statusCode < 600);\r\n\r\n// @todo: add logging if needed\r\nexport const customErrorHandler = ({ }, errResp: WebErrorResponse): ErrorHandlingType =>\r\n shouldRetry(errResp.statusCode) ? ErrorHandlingType.RetryCountedWithBackoff : ErrorHandlingType.DoNotRetry;\r\n","import config from 'config';\r\nimport { S4LParameters } from '../config/BaseConfig';\r\nimport { Dictionary } from '../models/SharedTypes';\r\nimport { displayableErrors } from './ErrorHelper';\r\nimport { logger } from './LoggerHelper';\r\n\r\ninterface KeyValuePair {\r\n key: string;\r\n value: string;\r\n}\r\n\r\nexport class UrlHelper {\r\n\r\n static getWebClientUrl(params: S4LParameters, webSubdomainForRedirect?: string | undefined) {\r\n // Websubdomain allow us to try out the integration with different version of webshell\r\n // Current up to date list is available: candidate, preview, dev, alpha, beta\r\n const { webSubDomain } = UrlHelper.getQueryParameters() as Dictionary;\r\n\r\n // webSubDomain passed by query param takes precedence to ECS config\r\n return config.urls.app.s4lWeb(params, webSubDomain || webSubdomainForRedirect);\r\n }\r\n\r\n static getWebClientUrlWithCorrelationId(params: S4LParameters, webSubdomainForRedirect?: string | undefined) {\r\n const url = UrlHelper.getWebClientUrl(params, webSubdomainForRedirect);\r\n\r\n return `${url}${url.includes('?') ? '&' : '?'}correlationId=${logger.getCorrelationId()}`;\r\n }\r\n\r\n static getAllowedQueryParameters(allowedParameters: string[]): KeyValuePair[] {\r\n return allowedParameters\r\n .map((param: string) => ({\r\n key: param,\r\n value: UrlHelper.getQueryParameter(param),\r\n } as KeyValuePair))\r\n .filter((pair: KeyValuePair) => pair.value);\r\n }\r\n\r\n static getQueryParameters() {\r\n if (!location.search || location.search.length < 1) {\r\n return {} as Dictionary;\r\n }\r\n\r\n return location.search\r\n .substr(1)\r\n .split('&')\r\n .map((value) => {\r\n const split = value.split('=');\r\n return {\r\n key: decodeURIComponent(split[0]),\r\n value: decodeURIComponent(split[1] || ''),\r\n } as KeyValuePair;\r\n })\r\n .reduce((prev, current) => {\r\n if (!!prev[current.key]) {\r\n const prevValue = prev[current.key];\r\n if (typeof prevValue === 'string') {\r\n prev[current.key] = [prev[current.key] as string];\r\n }\r\n (prev[current.key] as string[]).push(current.value);\r\n } else {\r\n prev[current.key] = current.value;\r\n }\r\n return prev;\r\n }, {} as Dictionary);\r\n }\r\n\r\n static getQueryParameter(key: string): string | string[] {\r\n return UrlHelper.getQueryParameters()[key];\r\n }\r\n\r\n static getQueryParameterAsString(key: string): string {\r\n return `${UrlHelper.getQueryParameter(key) || ''}`;\r\n }\r\n\r\n static getShortIdFromUrl(): string {\r\n const pathName = window.location.pathname.replace(/\\/+$/, '');\r\n const pathParts = pathName.split('/');\r\n const shortId = pathParts.pop();\r\n\r\n if (!shortId) {\r\n throw displayableErrors.ShortIdFromUrl;\r\n }\r\n\r\n return shortId;\r\n }\r\n}\r\n","import '../../../vendor/silentLogin';\r\nimport { canJoinOnWeb } from '../helpers/EnvironmentHelper';\r\nimport { CommonProperty, logger } from '../helpers/LoggerHelper';\r\nimport { silentLoginAsync, SilentLoginResult } from '../helpers/SilentLoginHelper';\r\nimport { triggerFallbackFlow } from './FallbackFlow';\r\nimport './meetnow.less';\r\nimport { processMeetNowEdgeAuthenticatedRequest, processMeetNowEdgeGuestRequest } from './MeetNowEdgeHandler';\r\nimport getMeetNowSettings from './MeetNowSettings';\r\n\r\nconst stopInitialContentBlinking = () => {\r\n const container = document.getElementById('meetnowContainer');\r\n if (container) {\r\n container.removeAttribute('style');\r\n }\r\n};\r\n\r\ntry {\r\n stopInitialContentBlinking();\r\n\r\n const settings = getMeetNowSettings();\r\n logger.init(settings.MeetNowEdgeAriaTenantId, 'meetnow_edge_');\r\n logger.sessionStarted({ useUnifiedView: false, wasPreLoggedin: false });\r\n\r\n silentLoginAsync()\r\n .then((loginResult: SilentLoginResult | undefined) => {\r\n try {\r\n if (!loginResult || !loginResult.skypetoken) {\r\n logger.initCommonProperty({ key: CommonProperty.IsLoggedIn, value: false });\r\n logger.initCommonProperty({\r\n key: CommonProperty.IsUnsupportedPlatformOrBrowser,\r\n value: canJoinOnWeb,\r\n });\r\n logger.sessionIntermediateStep({ eventType: 'silentLoginFinished' });\r\n processMeetNowEdgeGuestRequest(settings);\r\n } else {\r\n logger.initCommonProperty({ key: CommonProperty.IsLoggedIn, value: true });\r\n logger.initCommonProperty({\r\n key: CommonProperty.IsUnsupportedPlatformOrBrowser,\r\n value: canJoinOnWeb,\r\n });\r\n logger.addSkypeIdAndMsaCidHexCommonProperties(loginResult.skypetoken, false);\r\n\r\n logger.sessionIntermediateStep({ eventType: 'silentLoginFinished' });\r\n processMeetNowEdgeAuthenticatedRequest(settings, loginResult);\r\n }\r\n } catch (error) {\r\n triggerFallbackFlow(error, 'error from a regular flow');\r\n }\r\n })\r\n .catch((silentLoginError) => {\r\n logger.initCommonProperty({ key: CommonProperty.IsLoggedIn, value: false });\r\n logger.initCommonProperty({\r\n key: CommonProperty.IsUnsupportedPlatformOrBrowser,\r\n value: canJoinOnWeb,\r\n });\r\n logger.sessionIntermediateStep({ eventType: 'silentLoginFinished' });\r\n try {\r\n processMeetNowEdgeGuestRequest(settings);\r\n } catch (error) {\r\n triggerFallbackFlow(error, `silent login failure: ${silentLoginError.error}`);\r\n }\r\n })\r\n .catch((generalError) => {\r\n // It is possible that in async flow try/catch above won't actually catch an error so this is a precaution\r\n triggerFallbackFlow(generalError, 'Error triggered by guest flow after a failed silent login');\r\n });\r\n} catch (error) {\r\n triggerFallbackFlow(error, 'general error');\r\n}\r\n","import { AWTEventPriority, AWTPiiKind, AWTPropertyType } from '@aria/webjs-sdk';\r\nimport config from 'config';\r\nimport curry from 'lodash/curry';\r\nimport { CookieHelper } from '../helpers/CookieHelper';\r\nimport { CommonProperty, logger } from '../helpers/LoggerHelper';\r\nimport { doPostRedirect } from '../helpers/RedirectHelper';\r\nimport { SilentLoginResult } from '../helpers/SilentLoginHelper';\r\nimport { getMsaCidHexFromSkypeToken, getSkypeIdFromSkypeToken } from '../helpers/SkypeTokenHelper';\r\nimport { UrlHelper } from '../helpers/UrlHelper';\r\nimport { ConversationServiceModel } from '../models/ConversationServiceModel';\r\nimport {\r\n CreateMeetingServiceModel,\r\n MeetnowGuestServiceModel,\r\n WebClientRedirectParams,\r\n} from '../models/GuestUserServiceModel';\r\nimport { AppIds } from '../models/SharedTypes';\r\nimport MeetingsApiClient from '../rest/MeetingsApiClient';\r\nimport { triggerFallbackFlow } from './FallbackFlow';\r\nimport { IMeetNowSettings } from './MeetNowSettings';\r\n\r\nexport const getShortIdFromJoinLink = (joinLink: string): string => joinLink.split('/').pop() || '';\r\n\r\nexport const getSource = () => {\r\n const source = UrlHelper.getQueryParameter('source');\r\n return source ? `${source}` : undefined;\r\n};\r\n\r\nexport const logShortIdAndThreadId = (meeting: CreateMeetingServiceModel): CreateMeetingServiceModel => {\r\n logger.initCommonProperty({\r\n key: CommonProperty.ShortId,\r\n value: getShortIdFromJoinLink(meeting.joinLink),\r\n piiKind: AWTPiiKind.GenericData,\r\n type: AWTPropertyType.String,\r\n });\r\n logger.initCommonProperty({\r\n key: CommonProperty.ThreadId,\r\n value: meeting.threadId,\r\n piiKind: AWTPiiKind.GenericData,\r\n type: AWTPropertyType.String,\r\n });\r\n\r\n return meeting;\r\n};\r\n\r\nexport const logUserId = (meeting: MeetnowGuestServiceModel): MeetnowGuestServiceModel => {\r\n logger.addSkypeIdAndMsaCidHexCommonProperties(meeting.skypetoken, true);\r\n\r\n return meeting;\r\n};\r\n\r\nexport const createConversationServiceModel = (meeting: CreateMeetingServiceModel): ConversationServiceModel => {\r\n return {\r\n shortId: getShortIdFromJoinLink(meeting.joinLink),\r\n resource: meeting.threadId,\r\n id: '',\r\n flowId: '',\r\n action: '',\r\n };\r\n};\r\n\r\nexport const createGuestMeeting = (settings: IMeetNowSettings, source = 'HuddleUi') => {\r\n return MeetingsApiClient.createGuestMeeting({ title: settings.DefaultMeetingTitle, source }, settings.MeetNowEdgeNumberOfFetchRetries);\r\n};\r\n\r\nexport const createMeetnowGuest = (settings: IMeetNowSettings, source = 'HuddleUi') => {\r\n const localizedGuestDefaultName = document.getElementById('meetnowContainer')?.getAttribute('data-guest-user-localized-text') ?? 'Guest user';\r\n return MeetingsApiClient.meetnowGuest({\r\n displayName: localizedGuestDefaultName,\r\n source,\r\n }, settings.MeetNowEdgeNumberOfFetchRetries);\r\n};\r\n\r\nexport const createAuthenticatedMeeting = (settings: IMeetNowSettings, loginResult: SilentLoginResult, source = 'HuddleUi') => {\r\n return MeetingsApiClient\r\n .createAuthenticatedMeeting({ title: settings.DefaultMeetingTitle, SkypeToken: loginResult.skypetoken, source }, settings.MeetNowEdgeNumberOfFetchRetries);\r\n};\r\n\r\nexport const getThreadId = curry((settings: IMeetNowSettings, shortId: string) => {\r\n const params = {\r\n shortId,\r\n type: AppIds.Meetings,\r\n };\r\n\r\n return MeetingsApiClient\r\n .getConversation(params, settings.MeetNowEdgeNumberOfFetchRetries)\r\n .then((conversion) => {\r\n logger.initCommonProperty({\r\n key: CommonProperty.ThreadId,\r\n value: conversion.resource,\r\n piiKind: AWTPiiKind.GenericData,\r\n type: AWTPropertyType.String,\r\n });\r\n return conversion;\r\n })\r\n .then((conversion) => ({ shortId, ...conversion }));\r\n});\r\n\r\nexport const buildWebClientRedirectParamsForAuthenticatedFlow =\r\n curry((loginResult: SilentLoginResult, conversationServiceModel: ConversationServiceModel): WebClientRedirectParams => {\r\n return {\r\n threadId: conversationServiceModel.resource,\r\n shortId: conversationServiceModel.shortId,\r\n skypetoken: loginResult.skypetoken,\r\n skypeId: getSkypeIdFromSkypeToken(loginResult.skypetoken) || '',\r\n };\r\n });\r\n\r\nexport const buildWebClientRedirectParamsFromMeetnowGuestServiceModel = (meetnowGuestServiceModel: MeetnowGuestServiceModel): WebClientRedirectParams => {\r\n return {\r\n skypetoken: meetnowGuestServiceModel.skypetoken,\r\n skypeId: meetnowGuestServiceModel.skypeId,\r\n threadId: meetnowGuestServiceModel.threadId,\r\n shortId: getShortIdFromJoinLink(meetnowGuestServiceModel.joinLink),\r\n };\r\n};\r\nexport const redirectToSkypeClient = curry((\r\n settings: IMeetNowSettings,\r\n completionType: string,\r\n action: string,\r\n isNewJoinFlowFromJoinLink: boolean,\r\n webClientRedirectParams: WebClientRedirectParams): void => {\r\n const params = {\r\n skypetoken: webClientRedirectParams.skypetoken,\r\n expires_in: 24 * 3600,\r\n skypeid: webClientRedirectParams.skypeId,\r\n state: CookieHelper.getCookie(config.cookies.csrf).singleValue,\r\n msacidhex: getMsaCidHexFromSkypeToken(webClientRedirectParams.skypetoken) || '',\r\n };\r\n\r\n logger.sessionFinished({ completionType }, AWTEventPriority.High);\r\n\r\n const queryParams = `action=${action}&${buildRedirectQueryParameters(settings.MeetNowEdgeAllowedQueryParameters, logger.getCorrelationId(), isNewJoinFlowFromJoinLink)}`;\r\n doPostRedirect(`${UrlHelper.getWebClientUrl({ threadId: webClientRedirectParams.threadId })}?${queryParams}`, params);\r\n});\r\n\r\nexport const buildRedirectQueryParameters = (allowedParameters: string[], fallbackCorrelationId: string, isNewJoinFlowFromJoinLink = false): string => {\r\n const params = UrlHelper.getAllowedQueryParameters(allowedParameters);\r\n\r\n if (!params.find((param) => param.key === 'correlationId')) {\r\n params.push({ key: 'correlationId', value: fallbackCorrelationId });\r\n }\r\n\r\n if (isNewJoinFlowFromJoinLink) {\r\n params.push({ key: 'source', value: 'NewJoinLinkFlow' });\r\n }\r\n\r\n return params\r\n .map((param) => `${encodeURIComponent(param.key)}=${encodeURIComponent(param.value)}`)\r\n .join('&');\r\n};\r\n\r\nexport const processMeetNowEdgeGuestRequest = (settings: IMeetNowSettings): void => {\r\n createMeetnowGuest(settings, getSource())\r\n .then(logShortIdAndThreadId)\r\n .then(logUserId)\r\n .then(buildWebClientRedirectParamsFromMeetnowGuestServiceModel)\r\n .then(redirectToSkypeClient(settings, 'MeetNowEdgeIntegration', 'createmeetnow', false))\r\n .catch((error) => triggerFallbackFlow(error, 'processMeetNowEdgeGuestRequest failure'));\r\n};\r\n\r\nexport const processMeetNowEdgeAuthenticatedRequest = (settings: IMeetNowSettings, loginResult: SilentLoginResult): void => {\r\n createAuthenticatedMeeting(settings, loginResult, getSource())\r\n .then(logShortIdAndThreadId)\r\n .then(createConversationServiceModel)\r\n .then(buildWebClientRedirectParamsForAuthenticatedFlow(loginResult))\r\n .then(redirectToSkypeClient(settings, 'MeetNowEdgeIntegration', 'createmeetnow', false))\r\n .catch((error) => triggerFallbackFlow(error, 'processMeetNowEdgeAuthenticatedRequest failure'));\r\n};\r\n","import Config from 'config';\r\nimport { logger } from '../helpers/LoggerHelper';\r\n\r\nexport const triggerFallbackFlow = (error: Error, reason: string) => {\r\n logger.init(Config.logging.ariaTenant, 'meetnow_edge_');\r\n logger.meetNowFallbackFlow({ message: error.message, reason });\r\n\r\n showErrorMessage();\r\n handleReloadButton();\r\n handleNavigateToWebClientButton();\r\n};\r\n\r\nconst showErrorMessage = () => {\r\n const pageTitle = document.querySelector('.splashScreen');\r\n if (pageTitle) {\r\n pageTitle.style.display = 'none';\r\n }\r\n\r\n const fallbackSection = document.getElementById('fallbackSection');\r\n if (fallbackSection) {\r\n fallbackSection.style.display = 'block';\r\n }\r\n};\r\n\r\nconst handleReloadButton = () => {\r\n const reloadPageButton = document.getElementById('reloadPageButton');\r\n if (reloadPageButton) {\r\n reloadPageButton.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n logger.action({ name: 'reloadFallback' });\r\n window.location.reload();\r\n });\r\n }\r\n};\r\n\r\nconst handleNavigateToWebClientButton = () => {\r\n const goToSkypeButton = document.getElementById('goToSkypeButton');\r\n if (goToSkypeButton) {\r\n goToSkypeButton.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n logger.action({ name: 'goToSkypeFallback' });\r\n window.location.href = Config.urls.app.s4lWeb({});\r\n });\r\n }\r\n};\r\n","export interface SkypeTokenContentHeader {\r\n alg: string;\r\n kid: string;\r\n typ: string;\r\n}\r\n\r\nexport interface SkypeTokenContentPayload {\r\n aat: number;\r\n cid: string;\r\n csi: string;\r\n exp: number;\r\n iat: number;\r\n scp: number;\r\n skypeid: string;\r\n}\r\n\r\nexport interface SkypeTokenContent {\r\n header: SkypeTokenContentHeader;\r\n payload: SkypeTokenContentPayload;\r\n signature: string;\r\n}\r\n\r\nexport function parseSkypeToken(token: string | undefined): SkypeTokenContent | undefined {\r\n if (!token) {\r\n return;\r\n }\r\n\r\n const parts = token.split('.');\r\n if (parts.length !== 3) {\r\n return;\r\n }\r\n\r\n try {\r\n const header: SkypeTokenContentHeader = JSON.parse(atob(parts[0]));\r\n const payload: SkypeTokenContentPayload = JSON.parse(atob(parts[1]));\r\n const signature = parts[2];\r\n\r\n if (!payload.skypeid) {\r\n return;\r\n }\r\n\r\n return { header, payload, signature };\r\n } catch (e) {\r\n return;\r\n }\r\n}\r\n\r\nexport function getSkypeIdFromSkypeToken(token: string | undefined): string | undefined {\r\n const tokenContent = parseSkypeToken(token);\r\n if (tokenContent) {\r\n return tokenContent.payload.skypeid;\r\n }\r\n\r\n return;\r\n}\r\n\r\nexport function getMsaCidHexFromSkypeToken(token: string | undefined): string | undefined {\r\n const tokenContent = parseSkypeToken(token);\r\n if (tokenContent && tokenContent.payload && tokenContent.payload.cid) {\r\n return tokenContent.payload.cid.toUpperCase();\r\n }\r\n\r\n return;\r\n}\r\n","import { AWTEventPriority } from '@aria/webjs-sdk';\r\nimport { ApiCallOptions as BaseApiCallOptions, GenericRestClient, WebResponse } from 'simplerestclients';\r\nimport * as SyncTasks from 'synctasks';\r\nimport { logger } from '../helpers/LoggerHelper';\r\n\r\nexport interface EventProperties {\r\n priority?: AWTEventPriority;\r\n genericEventPath?: string; // Override default path for telemtry if it contains sensitive information\r\n customPropertiesProvider?: ((response: WebResponse) => any); // Append any custom field from response to the event\r\n}\r\n\r\nexport interface ApiCallOptions extends BaseApiCallOptions {\r\n eventProperties?: EventProperties;\r\n}\r\n\r\nconst unwrap: (resp: WebResponse) => T = (resp) => resp.body;\r\nexport class BaseRestClient extends GenericRestClient {\r\n protected _defaultOptions: ApiCallOptions = {\r\n contentType: 'application/json',\r\n acceptType: 'application/json',\r\n };\r\n\r\n performApiGet(apiPath: string, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiGetDetailed(apiPath, options).then(unwrap);\r\n }\r\n\r\n performApiGetDetailed(apiPath: string, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiGetDetailed(apiPath, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n performApiPost(apiPath: string, objToPost: any, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiPostDetailed(apiPath, objToPost, options).then(unwrap);\r\n }\r\n\r\n performApiPostDetailed(apiPath: string, objToPost: any, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiPostDetailed(apiPath, objToPost, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n performApiPatch(apiPath: string, objToPatch: any, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiPatchDetailed(apiPath, objToPatch, options).then(unwrap);\r\n }\r\n\r\n performApiPatchDetailed(apiPath: string, objToPatch: any, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiPatchDetailed(apiPath, objToPatch, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n performApiPut(apiPath: string, objToPut: any, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiPutDetailed(apiPath, objToPut, options).then(unwrap);\r\n }\r\n\r\n performApiPutDetailed(apiPath: string, objToPut: any, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiPutDetailed(apiPath, objToPut, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n performApiDelete(apiPath: string, objToDelete?: any, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiDeleteDetailed(apiPath, objToDelete, options).then(unwrap);\r\n }\r\n\r\n performApiDeleteDetailed(apiPath: string, objToDelete: any, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiDeleteDetailed(apiPath, objToDelete, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n protected networkCallback = (startTime: number, options?: ApiCallOptions): ((response: WebResponse) => void) => {\r\n const eventProperties = options && options.eventProperties;\r\n const genericEventPath = eventProperties && eventProperties.genericEventPath;\r\n const customPropertiesProvider = eventProperties && eventProperties.customPropertiesProvider;\r\n const eventPriority = eventProperties && eventProperties.priority;\r\n return (response: WebResponse) => {\r\n const endTime = new Date().getTime();\r\n const responseUrl = genericEventPath ? this._endpointUrl + genericEventPath : response.url;\r\n const eventUrl = responseUrl ? responseUrl.split('?', 1).join('') : responseUrl;\r\n const path = eventUrl ? eventUrl.replace(this._endpointUrl, '') : eventUrl;\r\n logger.network({\r\n method: response.method,\r\n responseTime: endTime - startTime,\r\n statusCode: response.statusCode,\r\n statusText: response.statusText,\r\n url: eventUrl,\r\n host: this._endpointUrl,\r\n path,\r\n custom: customPropertiesProvider ? customPropertiesProvider(response) : undefined,\r\n }, eventPriority);\r\n };\r\n }\r\n}\r\n","import { CookieConfig } from 'config';\r\nimport { Dictionary } from '../models/SharedTypes';\r\n\r\nconst defaultValueSeparator = ':';\r\n\r\nexport class CookieHelper {\r\n\r\n /**\r\n * Get the cookie\r\n *\r\n * param {string} name\r\n *\r\n * @return {object}\r\n */\r\n static getCookie(config: CookieConfig) {\r\n return (CookieHelper.hasCookie(config) === true) ? CookieHelper.parse()[config.name] : {};\r\n }\r\n\r\n /**\r\n * Set the cookie\r\n *\r\n * @param {string}\r\n *\r\n * @return void\r\n */\r\n static setCookie(config: CookieConfig, cookieValuesObject: object ) {\r\n const now = Math.round(Date.now() / 1000); // seconds\r\n let value = cookieValuesObject as any;\r\n\r\n // We have to add TS if cookie does not exist\r\n if (CookieHelper.hasCookie(config) === false) {\r\n value.TS = now;\r\n }\r\n\r\n // we need to add modification timestamp\r\n value.TM = now;\r\n\r\n value = CookieHelper.cookieObjectToString(value);\r\n\r\n const options = [];\r\n if (config.domain) {\r\n options.push('domain=' + config.domain);\r\n }\r\n if (config.path) {\r\n options.push('path=' + config.path);\r\n }\r\n if (config.maxAge) {\r\n options.push('expires=' + CookieHelper.getExpirationDate(config.maxAge).toUTCString());\r\n }\r\n\r\n const optionsString = options.length ? ';' + options.join(';') : '';\r\n\r\n document.cookie = config.name + '=' + value + optionsString;\r\n }\r\n\r\n /**\r\n * If cookie is present\r\n *\r\n * @return boolean\r\n */\r\n static hasCookie(config: CookieConfig) {\r\n return CookieHelper.parse().hasOwnProperty(config.name);\r\n }\r\n\r\n /**\r\n * Get cookie value\r\n *\r\n * @param {string} key\r\n *\r\n * @return {string} key value\r\n */\r\n static getCookieValue(config: CookieConfig, key: string = 'singleValue') {\r\n const params = CookieHelper.getCookie(config);\r\n\r\n return params && params[key] ? params[key] : undefined;\r\n }\r\n\r\n /**\r\n * Set cookie value\r\n *\r\n * @param {string} key\r\n * @param {string} value\r\n *\r\n */\r\n static setCookieValue(config: CookieConfig, value: string, key = 'singleValue') {\r\n const params = CookieHelper.getCookie(config);\r\n params[config.key || key] = value;\r\n\r\n CookieHelper.setCookie(config, params);\r\n }\r\n\r\n /**\r\n *\r\n */\r\n static removeCookie(config: CookieConfig) {\r\n if (!CookieHelper.hasCookie(config)) {\r\n return;\r\n }\r\n\r\n CookieHelper.setCookie({ name: config.name }, {});\r\n }\r\n\r\n /**\r\n * Parse document.cookie to JSON\r\n *\r\n * @example {'SC': 'LC=en:CCY=EUR', 'SWA':'webapp'}\r\n *\r\n *\r\n * @return {object}\r\n */\r\n static parse() {\r\n if (!document.cookie) {\r\n return {};\r\n }\r\n\r\n const cookies: any = {};\r\n document.cookie.split(';').forEach((cookie) => {\r\n const separatorPos = cookie.indexOf('=');\r\n\r\n const key = cookie.substring(0, separatorPos).trim();\r\n const value = cookie.substring(separatorPos + 1).trim();\r\n cookies[key] = CookieHelper.parseCookieValues(value);\r\n });\r\n\r\n return cookies;\r\n }\r\n /**\r\n * Turns object to string\r\n *\r\n * @param {object} cookieObject\r\n * @param {string} cookieSeparator\r\n *\r\n * @return {string}\r\n */\r\n private static cookieObjectToString(cookieObject: object, cookieSeparator = defaultValueSeparator) {\r\n const cookieObjectKeys = Object.keys(cookieObject);\r\n const cookieValue: string[] = [];\r\n\r\n if (cookieObject.hasOwnProperty('singleValue')) {\r\n return (cookieObject as any).singleValue;\r\n }\r\n\r\n cookieObjectKeys.forEach((cookieObjectKey) => {\r\n cookieValue.push(cookieObjectKey + '=' + (cookieObject as any)[cookieObjectKey]);\r\n });\r\n\r\n return cookieValue.join(cookieSeparator);\r\n }\r\n\r\n /**\r\n * Parse cookie values into JSON\r\n *\r\n * @example {'LC':'en','CCY':'EUR'}\r\n *\r\n * @param {string} cookieSeparator\r\n *\r\n * @return {object}\r\n */\r\n private static parseCookieValues(cookieValue: string, cookieSeparator = defaultValueSeparator) {\r\n const params: Dictionary = {};\r\n\r\n cookieValue.split(cookieSeparator).forEach((splitCookieValue) => {\r\n let splitParams: string[];\r\n if (splitCookieValue.indexOf('=') !== -1) {\r\n splitParams = splitCookieValue.split('=');\r\n } else {\r\n splitParams = ['singleValue', splitCookieValue];\r\n }\r\n\r\n params[splitParams[0].trim()] = splitParams[1].trim();\r\n });\r\n return params;\r\n }\r\n\r\n /**\r\n * Get the date object for expiration\r\n *\r\n * @param {int} seconds Number of seconds to add\r\n *\r\n * @return {Date}\r\n */\r\n private static getExpirationDate(seconds: number) {\r\n return new Date((seconds * 1000) + Date.now());\r\n }\r\n}\r\n","import config from 'config';\r\nimport * as SyncTasks from 'synctasks';\r\nimport { CaptchaSolution } from '../components/common/Captcha';\r\nimport { logger } from '../helpers/LoggerHelper';\r\nimport { ConversationPayload, ConversationServiceModel, RawConversationServiceModel } from '../models/ConversationServiceModel';\r\nimport {\r\n CreateAuthenticatedMeetingPayloadMeetingsApi,\r\n CreateMeetingPayloadMeetingsApi,\r\n CreateMeetingServiceModel,\r\n GuestJoinPayloadMeetingsApi,\r\n GuestUserServiceModel,\r\n MeetnowGuestServiceModel,\r\n} from '../models/GuestUserServiceModel';\r\nimport { BaseRestClient } from './BaseRestClient';\r\nimport { customErrorHandler, transformWrapper } from './MeetingsApiClientUtils';\r\n\r\nconst SessionIdHeaderKey = 'x-sessionId';\r\nconst SupportsCaptchaHeader = 'X-Skype-SupportsCaptcha';\r\nconst CaptchaSolutionHeader = 'X-Skype-CaptchaSolution';\r\nconst CaptchaChallengeIdHeader = 'X-Skype-CaptchaChallengeId';\r\nconst CaptchaAzureRegionHeader = 'X-Skype-CaptchaAzureRegion';\r\n\r\nclass MeetingsApiClient extends BaseRestClient {\r\n joinAsGuest(\r\n payload: T,\r\n retries: number = 0,\r\n joinThread: boolean = false,\r\n captcha?: CaptchaSolution | undefined,\r\n customPropertiesProvider?: () => object): SyncTasks.Promise {\r\n const genericEventPath = joinThread ?\r\n `/v1/threads/{threadId}/members` : `/v1/meetings/{shortId}/members`;\r\n const apiPath = joinThread ?\r\n `/v1/threads/${payload.threadId}/members` : `/v1/meetings/${payload.shortId}/members`;\r\n const headers: { [key: string]: string } = {};\r\n headers[SessionIdHeaderKey] = logger.getCorrelationId();\r\n if (captcha?.solution) {\r\n headers[SupportsCaptchaHeader] = 'yes';\r\n headers[CaptchaSolutionHeader] = captcha.solution;\r\n headers[CaptchaChallengeIdHeader] = captcha.challengeId;\r\n headers[CaptchaAzureRegionHeader] = captcha.azureRegion;\r\n }\r\n\r\n return this.performApiPost(\r\n apiPath,\r\n {\r\n displayName: payload.displayName,\r\n },\r\n {\r\n customErrorHandler,\r\n eventProperties: {\r\n genericEventPath,\r\n customPropertiesProvider,\r\n },\r\n retries,\r\n headers,\r\n });\r\n }\r\n\r\n getConversation(payload: ConversationPayload, retries: number = 0): SyncTasks.Promise {\r\n const shortId = payload.shortId;\r\n const headers: { [key: string]: string } = {};\r\n headers[SessionIdHeaderKey] = logger.getCorrelationId();\r\n\r\n return this.performApiGet(\r\n `/v1/meetings/${ shortId }`,\r\n {\r\n customErrorHandler,\r\n eventProperties: {\r\n genericEventPath: '/v1/meetings/{shortId}',\r\n },\r\n retries,\r\n headers,\r\n },\r\n ).then(transformWrapper(shortId));\r\n }\r\n\r\n createGuestMeeting(payload: CreateMeetingPayloadMeetingsApi, retries: number = 0): SyncTasks.Promise {\r\n return this.createMeeting('/v1/meetnow/createjoinlinkguest', payload, retries);\r\n }\r\n\r\n createAuthenticatedMeeting(payload: CreateAuthenticatedMeetingPayloadMeetingsApi, retries: number = 0): SyncTasks.Promise {\r\n return this.createMeeting('/v1/meetnow/createjoinlink', payload, retries);\r\n }\r\n\r\n meetnowGuest(payload: CreateMeetingPayloadMeetingsApi, retries: number = 0): SyncTasks.Promise {\r\n return this.createMeeting('/v1/meetnow/guest', payload, retries);\r\n }\r\n\r\n private createMeeting(path: string, payload: CreateMeetingPayloadMeetingsApi, retries: number): SyncTasks.Promise {\r\n const headers: { [key: string]: string } = {};\r\n headers[SessionIdHeaderKey] = logger.getCorrelationId();\r\n\r\n return this.performApiPost(\r\n path,\r\n payload,\r\n {\r\n customErrorHandler,\r\n eventProperties: {\r\n genericEventPath: path,\r\n },\r\n retries,\r\n headers,\r\n },\r\n );\r\n }\r\n}\r\n\r\nexport default new MeetingsApiClient(config.urls.api.meetings);\r\n","export interface IMeetNowSettings {\r\n MeetNowEdgeJoinApiHost: string;\r\n MeetNowEdgeNumberOfFetchRetries: number;\r\n MeetNowEdgeAriaTenantId: string;\r\n MeetNowEdgeAllowedQueryParameters: string[];\r\n DefaultMeetingTitle: string;\r\n}\r\n\r\nconst rootElementId = 'meetnowContainer';\r\nconst settingsDataAttributeName = 'meetnowEdgeSettings';\r\nconst allowedQueryParameters = ['source', 'exp', 'correlationId', 'call', 'video', 'mic'];\r\nconst defaultMeetingTitle = 'Meet Now';\r\n\r\nlet settings: MeetNowSettings;\r\n\r\nconst init = () => {\r\n const rootElement = document.getElementById(rootElementId);\r\n if (rootElement) {\r\n const data = rootElement.dataset[settingsDataAttributeName] || '';\r\n const parsedSettings = JSON.parse(data) as IMeetNowSettings;\r\n settings = new MeetNowSettings(parsedSettings);\r\n } else {\r\n throw new Error('Config not found.');\r\n }\r\n};\r\n\r\nclass MeetNowSettings implements IMeetNowSettings {\r\n private readonly settings: IMeetNowSettings;\r\n\r\n constructor(currentSettings: IMeetNowSettings) {\r\n this.settings = currentSettings;\r\n }\r\n\r\n get MeetNowEdgeAriaTenantId() {\r\n return this.settings.MeetNowEdgeAriaTenantId;\r\n }\r\n get MeetNowEdgeJoinApiHost() {\r\n return this.settings.MeetNowEdgeJoinApiHost;\r\n }\r\n get MeetNowEdgeNumberOfFetchRetries() {\r\n return this.settings.MeetNowEdgeNumberOfFetchRetries;\r\n }\r\n get MeetNowEdgeAllowedQueryParameters() {\r\n return allowedQueryParameters;\r\n }\r\n get DefaultMeetingTitle() {\r\n return defaultMeetingTitle;\r\n }\r\n}\r\n\r\nconst getMeetNowSettings = (): MeetNowSettings => {\r\n if (settings) {\r\n return settings;\r\n }\r\n\r\n init();\r\n return settings;\r\n};\r\n\r\nexport default getMeetNowSettings;\r\n","import { WebErrorResponse } from 'simplerestclients';\r\n\r\nexport interface DisplayableError extends Error {\r\n headerLocString: string;\r\n descriptionLocString: string;\r\n pageTitleLocString: string;\r\n emoticonPath?: string;\r\n}\r\n\r\nexport const displayableErrors = {\r\n ShortIdFromUrl: {\r\n name: 'ShortIdFromUrl',\r\n message: 'Cannot retrieve the shortId from url.',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'txt_not_found_page_redirect',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n InviteIdFromUrl: {\r\n name: 'InviteIdFromUrl',\r\n message: 'Cannot retrieve the inviteId from url.',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'txt_not_found_page_redirect',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n TooManyUsers: {\r\n name: 'TooManyUsers',\r\n message: 'TooManyUsers',\r\n headerLocString: 'hdr_toomanyusers_page_oops',\r\n descriptionLocString: 'txt_toomanyusers_page_explanation',\r\n emoticonPath: '/images/emoticons/busy.png',\r\n pageTitleLocString: 'hdr_toomanyusers_page_title',\r\n } as DisplayableError,\r\n Busy: {\r\n name: 'Busy',\r\n message: 'Busy',\r\n headerLocString: 'hdr_busy_page_oops',\r\n descriptionLocString: 'txt_busy_page_explanation',\r\n pageTitleLocString: 'hdr_busy_page_title',\r\n emoticonPath: '/images/emoticons/busy.png',\r\n } as DisplayableError,\r\n InviteNotFound: {\r\n name: 'InviteNotFound',\r\n message: 'InviteNotFound',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'txt_not_found_offskypeinvite_page_redirect',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/busy.png',\r\n } as DisplayableError,\r\n JoinDisabled: {\r\n name: 'JoinDisabled',\r\n message: 'JoinDisabled',\r\n headerLocString: 'hdr_joindisabled_page_oops',\r\n descriptionLocString: 'txt_joindisabled_page_explanation',\r\n pageTitleLocString: 'hdr_joindisabled_page_title',\r\n emoticonPath: '/images/emoticons/busy.png',\r\n } as DisplayableError,\r\n Generic: {\r\n name: 'Generic',\r\n message: 'Generic error',\r\n headerLocString: 'hdr_error_page_oops',\r\n descriptionLocString: 'txt_error_page_explanation',\r\n pageTitleLocString: 'hdr_error_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n BotNotFound: {\r\n name: 'BotIdFromUrl',\r\n message: 'Cannot retrieve the bot id from url.',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'bot_not_found',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n BotTooManyContacts: {\r\n name: 'BotTooManyContacts',\r\n message: 'BotTooManyContacts',\r\n headerLocString: 'bot_problem_page_oops',\r\n descriptionLocString: 'bot_too_many_contacts_page_redirect',\r\n pageTitleLocString: 'bot_too_many_contacts_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n ChannelNotFound: {\r\n name: 'ChannelIdFromUrl',\r\n message: 'Cannot retrieve the channel short id from url.',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'channels.channel_not_found',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n};\r\n\r\nexport class ErrorHelper {\r\n\r\n static convertToGenericDisplayableError(error: Error): DisplayableError {\r\n return {\r\n ...error,\r\n headerLocString: 'hdr_error_page_oops',\r\n descriptionLocString: 'txt_error_page_explanation',\r\n pageTitleLocString: 'hdr_error_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n };\r\n }\r\n\r\n static isDisplayableError(arg: any): arg is DisplayableError {\r\n return (arg as DisplayableError).headerLocString !== undefined && (arg as DisplayableError).descriptionLocString !== undefined;\r\n }\r\n\r\n static enrichErrorFromWebResponse(displayableError: DisplayableError, webResponse: WebErrorResponse, description?: string): DisplayableError {\r\n return {\r\n ...displayableError,\r\n ...ErrorHelper.getErrorFromWebErrorResponse(webResponse, description),\r\n };\r\n }\r\n\r\n private static getErrorFromWebErrorResponse(response: WebErrorResponse, description?: string): Error {\r\n return {\r\n name: description || `Request failed`,\r\n message: `${response.method} request failed: ${response.statusCode} ${response.statusText}`,\r\n };\r\n }\r\n}\r\n","export const getDiffInMS = (startDate: Date, endDate = new Date()): number => endDate.valueOf() - startDate.valueOf();\r\n","\nvar content = require(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./meetnow.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./meetnow.less\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./meetnow.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","import UAParser from 'ua-parser-js';\r\nimport { QuickJoinFlowSupportedBrowsers } from '../contexts/EcsContext';\r\nimport { Dictionary } from '../models/SharedTypes';\r\n\r\nexport enum OperatingSystems {\r\n WinPhone = 'Windows Phone',\r\n WinRT = 'Windows RT',\r\n Win = 'Windows',\r\n iOS = 'iOS',\r\n MacOS = 'Mac OS',\r\n Android = 'Android',\r\n AndroidX86 = 'Android -x86',\r\n ChromeOS = 'ChromeOS',\r\n Linux = 'Linux',\r\n Tizen = 'Tizen',\r\n Ubuntu = 'Ubuntu',\r\n WebOS = 'WebOS',\r\n Unknown = 'Unknown',\r\n}\r\n\r\nexport enum Browsers {\r\n AndroidBrowser = 'Android Browser',\r\n Avast = 'Avast',\r\n AVG = 'AVG',\r\n Bolt = 'Bolt',\r\n ChromeWebView = 'Chrome WebView',\r\n Chrome = 'Chrome',\r\n Chromium = 'Chromium',\r\n Dolphin = 'Dolphin',\r\n EdgeOld = 'EdgeOld',\r\n Edge = 'Edge',\r\n Electron = 'Electron',\r\n Facebook = 'Facebook',\r\n Firefox = 'Firefox',\r\n Instagram = 'Instagram',\r\n Kindle = 'Kindle',\r\n Opera = 'Opera',\r\n OperaMini = 'Opera Mini',\r\n OperaMobile = 'Opera Mobile',\r\n MSIE = 'IE',\r\n Mozilla = 'Mozilla',\r\n Safari = 'Safari',\r\n SafariMobile = 'Mobile Safari',\r\n PhantomJS = 'PhantomJS',\r\n SamsungBrowser = 'Samsung Browser',\r\n SkypeShell = 'SkypeShell',\r\n Tesla = 'Tesla',\r\n Tizen = 'Tizen Browser',\r\n Yandex = 'Yandex',\r\n WeChat = 'WeChat',\r\n Baidu = 'baidu',\r\n Unknown = 'Unknown',\r\n}\r\n\r\nconst osRegExps: Dictionary = {};\r\nosRegExps[OperatingSystems.WinPhone] = /windows\\sphone/i;\r\nosRegExps[OperatingSystems.WinRT] = /arm;/i;\r\nosRegExps[OperatingSystems.Win] = /(windows|win32)/i;\r\nosRegExps[OperatingSystems.iOS] = /(iPad|iPhone|iPod)/i;\r\nosRegExps[OperatingSystems.MacOS] = /(macintosh|mac os x)/i;\r\nosRegExps[OperatingSystems.Android] = /android/i;\r\nosRegExps[OperatingSystems.ChromeOS] = /CrOS/i;\r\nosRegExps[OperatingSystems.Linux] = /(linux|x11)/i;\r\n\r\nconst browserRegExps: Dictionary = {};\r\nbrowserRegExps[Browsers.Opera] = /(OPR\\/|Opera)/i;\r\nbrowserRegExps[Browsers.EdgeOld] = /Edge/i;\r\nbrowserRegExps[Browsers.Edge] = /Edg/i;\r\nbrowserRegExps[Browsers.MSIE] = /Trident/i;\r\nbrowserRegExps[Browsers.Chrome] = /Chrome/i;\r\nbrowserRegExps[Browsers.Firefox] = /Firefox/i;\r\nbrowserRegExps[Browsers.Safari] = /Safari/i;\r\nbrowserRegExps[Browsers.Facebook] = /(FBAN|FBAV)/i;\r\n\r\nexport interface IBrowserVersion {\r\n major: number;\r\n minor: number;\r\n bugfix?: number;\r\n}\r\n\r\nexport enum DeviceTypes {\r\n Desktop = 'desktop',\r\n Mobile = 'mobile',\r\n Other = 'other',\r\n}\r\n\r\nexport class EnvironmentHelper {\r\n\r\n /**\r\n * Returns the Operating System the code is executed in\r\n *\r\n * @return {string}\r\n */\r\n static getOS = (): OperatingSystems => {\r\n const osInformation = EnvironmentHelper._uaParser.getOS();\r\n const detectedOs = osInformation?.name as OperatingSystems ?? EnvironmentHelper._getOsFallback(EnvironmentHelper._uaParser.getUA() || window.navigator.userAgent);\r\n // iPads send by default MacOS user agent to so correctly detect iPad we use this trick\r\n if (detectedOs === OperatingSystems.MacOS && (navigator?.maxTouchPoints ?? 0) > 1) {\r\n return OperatingSystems.iOS;\r\n }\r\n\r\n return detectedOs;\r\n }\r\n\r\n /**\r\n * Returns the browser name\r\n *\r\n * @return {string}\r\n */\r\n static getBrowserName = (): Browsers => {\r\n const browserName = EnvironmentHelper._uaParser.getBrowser();\r\n return browserName?.name as Browsers ?? EnvironmentHelper._getBrowserNameFallback(EnvironmentHelper._uaParser.getUA() || window.navigator.userAgent);\r\n }\r\n\r\n static getSafariBrowserVersion = (): IBrowserVersion | undefined => {\r\n const version = EnvironmentHelper._uaParser.getUA().match(/version\\/(\\d+)\\.(\\d+)(\\.(\\d+))?/i);\r\n\r\n if (!version) {\r\n return;\r\n }\r\n\r\n return {\r\n major: parseInt(version[1], 10),\r\n minor: parseInt(version[2], 10),\r\n bugfix: parseInt(version[4], 10) || undefined,\r\n };\r\n }\r\n\r\n static isSafariBrowserVersionAtLeast(minimumVersion: IBrowserVersion): boolean {\r\n if (EnvironmentHelper.getBrowserName() !== Browsers.Safari) {\r\n return false;\r\n }\r\n\r\n const version = EnvironmentHelper.getSafariBrowserVersion();\r\n\r\n if (!version) {\r\n return false;\r\n }\r\n\r\n return version.major > minimumVersion.major\r\n || (version.major === minimumVersion.major && version.minor >= minimumVersion.minor);\r\n }\r\n\r\n static isSafariBrowserEligibleForMeetingGuestFlow = (): boolean => {\r\n return EnvironmentHelper.isSafariBrowserVersionAtLeast({\r\n major: 13,\r\n minor: 1,\r\n });\r\n }\r\n\r\n /**\r\n * Returns the device type\r\n *\r\n * @return {string}\r\n */\r\n static getDeviceType = (): DeviceTypes => {\r\n switch (EnvironmentHelper.getOS()) {\r\n case OperatingSystems.Win:\r\n case OperatingSystems.MacOS:\r\n case OperatingSystems.WinRT:\r\n case OperatingSystems.ChromeOS:\r\n case OperatingSystems.Linux:\r\n case OperatingSystems.Ubuntu:\r\n return DeviceTypes.Desktop;\r\n\r\n case OperatingSystems.WinPhone:\r\n case OperatingSystems.iOS:\r\n case OperatingSystems.Android:\r\n case OperatingSystems.AndroidX86:\r\n return DeviceTypes.Mobile;\r\n\r\n case OperatingSystems.Unknown:\r\n case OperatingSystems.WebOS:\r\n case OperatingSystems.Tizen:\r\n default:\r\n return DeviceTypes.Other;\r\n }\r\n }\r\n\r\n static isQuickWebJoinSupported = (): boolean => {\r\n return EnvironmentHelper._currentBrowserSupportsQuickJoinOnWeb();\r\n }\r\n\r\n /**\r\n * Returns current screen resolution\r\n *\r\n * @return {string}\r\n */\r\n static getScreenResolution = (_screen = window.screen) => {\r\n if (_screen.width == null || typeof _screen.width === 'undefined' ||\r\n _screen.height == null || typeof _screen.height === 'undefined') {\r\n\r\n return 'Unknown';\r\n }\r\n\r\n return _screen.width + 'x' + _screen.height;\r\n }\r\n\r\n /**\r\n * Returns language from the browser\r\n *\r\n * @return {string}\r\n */\r\n static getLanguage = (_navigator = window.navigator) => {\r\n const lang = _navigator.language || (_navigator as any).userLanguage;\r\n\r\n if (lang !== undefined && lang.length > 2) {\r\n return lang.substr(0, 2);\r\n }\r\n\r\n return lang;\r\n }\r\n\r\n /**\r\n * Returns the iOS version\r\n * Based on detectDevice can returns iPhone/iPad or just version number\r\n *\r\n * @return {string}\r\n */\r\n static getIOSVersion() {\r\n\r\n const iOSVersionMatches = EnvironmentHelper._uaParser.getUA().match(\r\n new RegExp('(iPhone OS|CPU OS)' + ' ([\\\\d_]+)'),\r\n );\r\n\r\n if (iOSVersionMatches) {\r\n return iOSVersionMatches[2].replace(/_/g, '.');\r\n }\r\n\r\n return 'Unknown';\r\n }\r\n\r\n static isIOSInAppBrowserFlow = (_os: OperatingSystems = os, _browser: Browsers = browser): boolean => {\r\n const knownInAppBrowsers = [\r\n Browsers.Facebook,\r\n ];\r\n\r\n return _os === OperatingSystems.iOS && knownInAppBrowsers.indexOf(browser) > -1;\r\n }\r\n\r\n static getSupportedBrowsersDefault = (): QuickJoinFlowSupportedBrowsers => {\r\n return {\r\n android: [Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n ios: [Browsers.Safari, Browsers.SafariMobile, Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n mac: [Browsers.Safari, Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n windows: [Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.EdgeOld, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n others: [Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n };\r\n }\r\n\r\n static updateEnvironmentSettings = (quickJoinFlowSupportedBrowsers?: QuickJoinFlowSupportedBrowsers, customUaParser?: UAParser) => {\r\n EnvironmentHelper._quickJoinFlowSupportedBrowsers = quickJoinFlowSupportedBrowsers ?? EnvironmentHelper._quickJoinFlowSupportedBrowsers;\r\n if (customUaParser) {\r\n EnvironmentHelper._uaParser = customUaParser;\r\n }\r\n }\r\n\r\n private static _uaParser = new UAParser();\r\n private static _quickJoinFlowSupportedBrowsers = EnvironmentHelper.getSupportedBrowsersDefault();\r\n\r\n private static _currentBrowserSupportsQuickJoinOnWeb = (): boolean => {\r\n const currentBrowser = EnvironmentHelper.getBrowserName();\r\n const currentOs = EnvironmentHelper.getOS();\r\n const supportedBrowsers = EnvironmentHelper._quickJoinFlowSupportedBrowsers;\r\n switch (currentOs) {\r\n case OperatingSystems.Android:\r\n case OperatingSystems.AndroidX86:\r\n case OperatingSystems.ChromeOS:\r\n return supportedBrowsers.android.includes(currentBrowser);\r\n\r\n case OperatingSystems.iOS:\r\n return supportedBrowsers.ios.includes(currentBrowser);\r\n\r\n case OperatingSystems.MacOS:\r\n return supportedBrowsers.mac.includes(currentBrowser);\r\n\r\n case OperatingSystems.Win:\r\n case OperatingSystems.WinRT:\r\n return supportedBrowsers.windows.includes(currentBrowser);\r\n\r\n default:\r\n return supportedBrowsers.others.includes(currentBrowser);\r\n }\r\n }\r\n\r\n private static _getOsFallback = (userAgent: string): OperatingSystems => {\r\n for (const osKey in osRegExps) {\r\n if (userAgent.match(osRegExps[osKey])) {\r\n // iPads send by default MacOS user agent to so correctly detect iPad we use this trick\r\n if (osKey === OperatingSystems.MacOS && (navigator?.maxTouchPoints ?? 0) > 1) {\r\n return OperatingSystems.iOS;\r\n }\r\n\r\n return osKey as OperatingSystems;\r\n }\r\n }\r\n\r\n return OperatingSystems.Unknown;\r\n }\r\n\r\n private static _getBrowserNameFallback = (userAgent: string): Browsers => {\r\n for (const browserKey in browserRegExps) {\r\n if (userAgent.match(browserRegExps[browserKey])) {\r\n return browserKey as Browsers;\r\n }\r\n }\r\n\r\n return Browsers.Unknown;\r\n }\r\n}\r\n\r\n// PlatformVersion: Helpers.Environment.pureOSVersion,\r\n// Platform: Helpers.Environment.platform,\r\n// Language: Helpers.Environment.language,\r\n// ScreenResolution: Helpers.Environment.screenResolution\r\n\r\nexport const os = EnvironmentHelper.getOS();\r\nexport const browser = EnvironmentHelper.getBrowserName();\r\nexport const deviceType = EnvironmentHelper.getDeviceType();\r\nexport const canJoinOnWeb = EnvironmentHelper.isQuickWebJoinSupported();\r\nexport const screenResolution = EnvironmentHelper.getScreenResolution();\r\nexport const deviceLanguage = EnvironmentHelper.getLanguage();\r\nexport const platform = window.navigator.platform;\r\nexport const isIOSInAppBrowserFlow = EnvironmentHelper.isIOSInAppBrowserFlow();\r\nexport const isSafariBrowserEligibleForMeetingGuestFlow = EnvironmentHelper.isSafariBrowserEligibleForMeetingGuestFlow();\r\nexport const getSupportedBrowsersDefault = EnvironmentHelper.getSupportedBrowsersDefault();\r\n","/**\r\n * @copyright © Microsoft. All rights reserved.\r\n *\r\n * Skype Silent Login SDK\r\n */\r\n(function() {\r\n \"use strict\";\r\n\r\n if (typeof window.SKYPE === \"undefined\") {\r\n window.SKYPE = {};\r\n }\r\n window.SKYPE.login = window.SKYPE.login || {};\r\n\r\n window.SKYPE.login.Silent = (function() {\r\n var loginDomains = {\r\n qa: \"https://a.qa.lw.skype.net\",\r\n live: \"https://a.lw.skype.com\"\r\n },\r\n ssoLoginDomains = {\r\n qa: \"https://a.qalogin.skype.net\",\r\n live: \"https://a.login.skype.com\"\r\n },\r\n originCheckMap = {\r\n qa: [\"https://a.qa.lw.skype.net\", \"https://a.qalogin.skype.net\"],\r\n live: [\"https://a.lw.skype.com\", \"https://a.login.skype.com\"]\r\n },\r\n endpoint = \"/login/silent\", // Silent login endpoint uri\r\n endpointVersion = \"1.0\", // Endpoint version\r\n iFrameReference = null, // iFrame object reference\r\n ancestorElement, // iFrame's ancestor\r\n callback, // Callback function\r\n response = {}, // Response object\r\n timeout = 5000, // Timeout for the call in ms\r\n timeoutObj = null, // Timeout reference\r\n host = null, // Selected login hostname\r\n originCheckHosts = null, // Array of hosts for postmessage origin check\r\n state = \"\", // State passed through the silent login\r\n eventRegistered = false, // Post message event listener registered\r\n processing = false, // Processing the Silent login request\r\n logEnabled = null; // Debug logging enabled\r\n\r\n /**\r\n * Settings object. will be overriden by init()\r\n */\r\n var settings = {\r\n env: \"live\",\r\n client_id: null,\r\n redirect_uri: null,\r\n isSsoCompatible: false\r\n };\r\n\r\n /**\r\n * Simple debug logger\r\n *\r\n * @param string message Logged message\r\n * @param Object debug Optional debug data\r\n *\r\n * @return void\r\n */\r\n var _log = function(message, debug) {\r\n if (logEnabled === null) {\r\n logEnabled = (window.location.host.match(/^(pre|dev|qa).*\\.net$/) || document.cookie.indexOf(\"debug\") > -1 || window.location.search.indexOf(\"debug\") > -1);\r\n }\r\n if (!logEnabled) {\r\n return;\r\n }\r\n try {\r\n if (typeof debug === \"object\") {\r\n var tokens = [];\r\n\r\n for (var prop in debug) {\r\n if (prop === \"skypetoken\") {\r\n // Hide the skypetoken from console\r\n tokens.push(prop + \": \" + \"\");\r\n } else {\r\n tokens.push(prop + \": \" + JSON.stringify(debug[prop]));\r\n }\r\n }\r\n\r\n message += \" - \" + tokens.join(\", \");\r\n } else if (typeof debug === \"string\") {\r\n message += \" - \" + debug;\r\n }\r\n message = \"[silentlogin.js] - \" + message;\r\n console.log(message);\r\n } catch (e) {}\r\n };\r\n\r\n /**\r\n * Post message event listener\r\n *\r\n * @return void\r\n */\r\n var _messageListener = function(e) {\r\n _log(\"Received message from \" + e.origin);\r\n\r\n // Verify the message origin\r\n var originCheckPassed = false;\r\n\r\n if (!originCheckHosts) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < originCheckHosts.length; i++) {\r\n if (e.origin === originCheckHosts[i]) {\r\n originCheckPassed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!originCheckPassed) {\r\n return;\r\n }\r\n\r\n var data = e.data;\r\n\r\n // If the postMessage sends just a string, try to JSON parse it\r\n if (typeof e.data === \"string\") {\r\n try {\r\n data = JSON.parse(e.data);\r\n } catch (ex) {}\r\n }\r\n _log(\"Message data\", data);\r\n\r\n // Verify the message state\r\n var receivedState = data.state || null;\r\n if (state !== receivedState) {\r\n _log(\"State \" + receivedState + \" doesn't match the last submitted state \" + state);\r\n return;\r\n }\r\n // Response is trusted\r\n window.clearTimeout(timeoutObj);\r\n // Clone the response data\r\n response = {};\r\n for (var attr in data) {\r\n if (data.hasOwnProperty(attr)) {\r\n response[attr] = data[attr];\r\n }\r\n }\r\n\r\n _callCallback();\r\n };\r\n\r\n /**\r\n * Create the silent login iframe and start loading\r\n *\r\n * @return void\r\n */\r\n var _createSilentLogin = function(source) {\r\n _destroySilentLogin();\r\n if (typeof ancestorElement === \"undefined\") {\r\n // Use body as the ancestor, but when it's not available yet, use head instead.\r\n // document.head is not available in IE8, so fallback is to get it by tag name.\r\n ancestorElement = document.body || document.head || document.getElementsByTagName('head')[0];\r\n }\r\n iFrameReference = document.createElement(\"iframe\");\r\n iFrameReference.frameBorder = 0;\r\n iFrameReference.width = \"1px\";\r\n iFrameReference.height = \"1px\";\r\n iFrameReference.style.display = \"none\";\r\n iFrameReference.style.visibility = \"hidden\";\r\n iFrameReference.id = \"silentLoginFrame\" + Math.floor((Math.random() * 10) + 1);\r\n iFrameReference.setAttribute(\"src\", source);\r\n ancestorElement.appendChild(iFrameReference);\r\n _log(\"Created iFrame: \" + source);\r\n };\r\n\r\n /**\r\n * Destroy the silent login iframe\r\n *\r\n * @return void\r\n */\r\n var _destroySilentLogin = function() {\r\n if (iFrameReference) {\r\n ancestorElement.removeChild(iFrameReference);\r\n iFrameReference = null;\r\n }\r\n };\r\n\r\n /**\r\n * Verify if the provided settings are valid. Initialize the redirect uri if missing.\r\n *\r\n * @return void\r\n */\r\n var _validateSettings = function() {\r\n if (!settings.client_id) {\r\n throw \"[silentlogin.js] client_id not initialized. Call init() first.\";\r\n }\r\n\r\n if (!settings.redirect_uri) {\r\n // If redirect_uri not set, use the page location (without parameters)\r\n settings.redirect_uri = window.location.protocol + \"//\" + window.location.host + window.location.pathname;\r\n }\r\n };\r\n\r\n /**\r\n * Check if the browser supports postMessage and JSON.parse\r\n *\r\n * @return boolean\r\n */\r\n var _isSupportedBrowser = function() {\r\n return (\"postMessage\" in window) && (typeof JSON === \"object\" && JSON.parse);\r\n };\r\n\r\n /**\r\n * Call the callback function and pass the response object to it.\r\n *\r\n * @return void\r\n */\r\n var _callCallback = function() {\r\n _log(\"Calling callback function\", response);\r\n\r\n // No longer processing request. Unlock.\r\n processing = false;\r\n\r\n if (typeof callback === \"function\") {\r\n callback(response);\r\n }\r\n };\r\n\r\n /**\r\n * Handle timeout event and call the callback function.\r\n *\r\n * @return void\r\n */\r\n var _handleTimeout = function() {\r\n _destroySilentLogin();\r\n response = {};\r\n response.error = \"timeout\";\r\n _callCallback();\r\n };\r\n\r\n /**\r\n * Serialize object into query parameters\r\n *\r\n * @param Object query Object holding the parameters to serialize\r\n * @return string Serialized query string\r\n */\r\n var _createQuery = function(query) {\r\n var str = [];\r\n for (var k in query) {\r\n if (query.hasOwnProperty(k)) {\r\n str.push(encodeURIComponent(k) + \"=\" + encodeURIComponent(query[k]));\r\n }\r\n }\r\n return str.join(\"&\");\r\n };\r\n\r\n /**\r\n * Get the iFrame source url\r\n *\r\n * @return string Frame url\r\n */\r\n var _getFrameSource = function() {\r\n var timestamp = new Date().getTime(),\r\n domainMap = settings.isSsoCompatible ? ssoLoginDomains : loginDomains;\r\n\r\n state = \"silentloginsdk_\" + timestamp;\r\n var query = {\r\n response_type: \"postmessage\",\r\n client_id: settings.client_id,\r\n partner: \"999\",\r\n redirect_uri: settings.redirect_uri,\r\n state: state,\r\n _accept: endpointVersion,\r\n _nc: timestamp\r\n };\r\n\r\n originCheckHosts = originCheckMap[settings.env] || originCheckMap.live;\r\n host = domainMap[settings.env] || domainMap.live;\r\n return host + endpoint + \"?\" + _createQuery(query);\r\n };\r\n\r\n /**\r\n * Initialize the Silent login before using it\r\n *\r\n * Pass in the settings object:\r\n *
\r\n         * {\r\n         *  env: \"\", // Skype environment to be used: Live (default), QA. Optional.\r\n         *  client_id: , // Client id of your application. Mandatory.\r\n         *  redirect_uri: , // Redirect uri of your application. If left empty, will be autodetected from current location. (Optional, recommended)\r\n         * }\r\n         * 
\r\n *\r\n * @param Object options Silent login options\r\n * @return SKYPE.login.Silent\r\n */\r\n var init = function(options) {\r\n if (typeof options === \"object\") {\r\n options = options || {};\r\n // If callback function passed into init method, set it correctly\r\n if (options.hasOwnProperty(\"callback\")) {\r\n setCallback(options.callback);\r\n }\r\n // Copy overrides to settings\r\n for (var k in settings) {\r\n if (options.hasOwnProperty(k)) {\r\n settings[k] = options[k];\r\n }\r\n }\r\n }\r\n // Register the message listener\r\n if (!eventRegistered) {\r\n eventRegistered = true;\r\n if (!window.addEventListener) {\r\n window.attachEvent(\"onmessage\", _messageListener);\r\n } else {\r\n window.addEventListener(\"message\", _messageListener, false);\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Set the callback function, which will be called once we get the result.\r\n * Note the function parameter will contain the response object.\r\n *\r\n * @param function callbackFunction Callback function\r\n * @return SKYPE.login.Silent\r\n */\r\n var setCallback = function(callbackFunction) {\r\n if (typeof callbackFunction === \"function\") {\r\n callback = callbackFunction;\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Trigger loading the Silent login iFrame. Registered callback will be called once finished.\r\n *\r\n * @return void\r\n */\r\n var load = function() {\r\n // Prevent multiple simultaneous calls\r\n if (processing) {\r\n return;\r\n }\r\n _validateSettings();\r\n processing = true;\r\n // If this browser doesn't support postMessage, we're done.\r\n if (!_isSupportedBrowser()) {\r\n response = {error: \"unsupported_browser\"};\r\n _callCallback();\r\n return;\r\n }\r\n // Initialize timer\r\n window.clearTimeout(timeoutObj);\r\n timeoutObj = window.setTimeout(_handleTimeout, timeout);\r\n // Start loading the iFrame\r\n _createSilentLogin(_getFrameSource());\r\n };\r\n\r\n /**\r\n * Get the Skypetoken from response or null if not provided\r\n *\r\n * @return string|null Skypetoken or null\r\n */\r\n var getSkypetoken = function() {\r\n return response.skypetoken || null;\r\n };\r\n\r\n /**\r\n * Get the full response object\r\n *\r\n * @return Object Response object\r\n */\r\n var getFullResponse = function() {\r\n return response;\r\n };\r\n\r\n return {\r\n init: init,\r\n setCallback: setCallback,\r\n load: load,\r\n getSkypetoken: getSkypetoken,\r\n getFullResponse: getFullResponse\r\n };\r\n }());\r\n}());\r\n"],"sourceRoot":""}