{"version":3,"sources":["../node_modules/@luxottica/vm-eventbus/node_modules/uuid/dist/esm-browser/rng.js","../node_modules/@luxottica/vm-eventbus/node_modules/uuid/dist/esm-browser/regex.js","../node_modules/@luxottica/vm-eventbus/node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/@luxottica/vm-eventbus/node_modules/uuid/dist/esm-browser/validate.js","../node_modules/@luxottica/vm-eventbus/node_modules/uuid/dist/esm-browser/v4.js","../../src/domain/model/LogMessage.ts","../../src/adapter/db/factory/DBRemoteLogFactory.ts","../../src/config/LogsConfigurationRetriever.ts","../../src/config/LogsConfig.ts","../../src/domain/service/log/producer/RemoteLogService.ts","../../src/domain/appender/RemoteLogAppender.ts","../../src/domain/RemoteLogConfig.ts","../../src/domain/service/config/VmAnalyticsApiConfig.ts","../../src/adapter/rest/AppViewSessionAdapter.ts","../../src/domain/service/log/consumer/AppViewSessionConsumer.ts","../../src/domain/service/job/AppViewSessionConsumerJob.ts","../../src/adapter/rest/BrowserSessionAdapter.ts","../../src/domain/service/log/consumer/BrowserSessionConsumer.ts","../../src/domain/service/job/BrowserSessionConsumerJob.ts","../../src/adapter/rest/RemoteLogAdapter.ts","../../src/domain/service/log/consumer/RemoteLogConsumer.ts","../../src/domain/service/job/RemoteLogConsumerJob.ts","../../src/adapter/rest/TrackingStatusAdapter.ts","../../src/domain/service/log/consumer/TrackingStatusConsumer.ts","../../src/domain/service/job/TrackingStatusConsumerJob.ts","../../src/EventBus.ts","../node_modules/uuid/index.js","../node_modules/uuid/v1.js","../node_modules/uuid/v4.js","../node_modules/current-device/es/index.js","../../src/app/functions/WarmUp.ts","../../src/errors/errors.ts","../../src/constants/DefaultInitializationOptions.ts","../../src/helpers/FeatureConfigHelper.ts","../../src/interfaces/Features.ts","../../src/app/service/FeatureLicensingService.ts","../../src/app/VmCore.tsx","../../src/constants/actions.ts","../../src/reducers/appReducer.ts","../../src/reducers/mirrorReducer.ts","../../src/reducers/userReducer.ts","../../src/reducers/combinedReducers.ts","../../src/helpers/TransitionColorHelper.ts","../../src/remotelog/AppViewSessionKeys.ts","../../src/Store.ts","../../src/constants/DOMEvents.ts","../../src/helpers/CallbackHelper.ts","../../src/app/functions/AnimateOpacity.ts","../../src/remotelog/VmLogger.ts","../../src/helpers/AdobeHelper.ts","../../src/helpers/AnalyticsHelper.ts","../../src/app/functions/CloseMirror.ts","../../src/helpers/RequestHelper.ts","../../src/constants/Events.ts","../../src/app/functions/GetScreenshot.ts","../../src/helpers/LocalizationDefaults.ts","../../src/helpers/LocalizationHelper.ts","../../src/helpers/SupportedFeaturesHelper.ts","../../src/helpers/InitializationHelper.ts","../../src/app/mirror/FpsCounter.ts","../../src/constants/DefaultEnvironmentOptions.ts","../../src/interfaces/MirrorOptions.ts","../../src/constants/DefaultPrivacyOptions.ts","../../src/constants/DefaultRenderingOptions.ts","../../src/constants/DefaultTrackingOptions.ts","../../src/helpers/ParameterHelper.ts","../../src/app/functions/Initialize.ts","../../src/app/mirror/VmWebCam.ts","../../src/app/functions/Pause.ts","../../src/app/functions/RenderMirror.ts","../../src/app/functions/Resume.ts","../../src/app/functions/SetTransitionOverrideColor.ts","../../src/Catalogue.ts","../../src/VirtualMirror.ts","../../src/app/functions/GetBipaVersion.ts","../../src/app/functions/SaveBipaEntry.ts","../../src/app/functions/SetTransitionOpacity.ts","../../src/app/functions/IsBrowserSupported.ts","../node_modules/@luxottica/vto-microservices/node_modules/uuid/dist/esm-browser/rng.js","../node_modules/@luxottica/vto-microservices/node_modules/uuid/dist/esm-browser/regex.js","../node_modules/@luxottica/vto-microservices/node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/@luxottica/vto-microservices/node_modules/uuid/dist/esm-browser/validate.js","../node_modules/@luxottica/vto-microservices/node_modules/uuid/dist/esm-browser/v4.js","../../src/config/Config.ts","../../src/error/errors.ts","../../src/request/RefreshRequest.ts","../../src/request/BipaRequest.ts","../../src/request/LoginRequest.ts","../../src/constants/DefaultPrivacyLocalization.ts","../../src/interfaces/PrivacyLocalization.ts","../../src/components/ErrorIcon.tsx","../../src/components/BipaBiometricForm.tsx","../../src/components/YesNoCheckbox.tsx","../../src/components/PrivacyAgreement.tsx","../../src/helpers/CookieHelper.ts","../../src/BipaOverlay.tsx","../../src/constants/Styling.ts","../../src/BipaManager.ts","../node_modules/pubsub-js/src/pubsub.js","../../src/domain/mockWebcam/ImageLoader.ts","../../src/domain/mockWebcam/MockStreamTrack.ts","../../src/domain/mockWebcam/MockStream.ts","../../src/domain/mockWebcam/MockBridgeMedia.ts","../../src/domain/nativeWebcam/AbstractNativeBridge.ts","../../src/domain/nativeWebcam/NativeBridge.ts","../../src/domain/nativeWebcam/NativeStreamTrack.ts","../../src/domain/nativeWebcam/NativeStream.ts","../../src/domain/nativeWebcam/NativeBridgeMedia.ts","../../src/domain/adapter/UserMedia.ts","../../src/domain/mockWebcam/MockVideoStream.ts","../../src/domain/nativeWebcam/NativeVideoStream.ts","../../src/domain/adapter/WebCamVideoStream.ts","../../src/domain/adapter/WebCamStream.ts","../../src/domain/WebCamConstraints.ts","../../src/error/WebCamAbstractError.ts","../../src/error/WebCamAccessNotFoundError.ts","../../src/error/WebCamAccessRejectedError.ts","../../src/error/WebCamAccessSystemError.ts","../../src/WebCam.ts","../node_modules/uuid/lib/rng-browser.js","../node_modules/uuid/lib/bytesToUuid.js"],"names":["getRandomValues","rnds8","Uint8Array","rng","crypto","bind","msCrypto","Error","validate","uuid","REGEX","test","byteToHex","i","push","toString","substr","stringify","arr","offset","arguments","length","undefined","toLowerCase","TypeError","v4","options","buf","rnds","random","level","logName","message","date","Date","toISOString","this","db","createInstance","name","DBRemoteLogFactory","instance","configurationUrl","currentHostname","window","location","hostname","Promise","resolve","fetch","headers","method","then","res","ok","json","defaultConfiguration","config","appviewSessionIsActive","browserSessionIsActive","clientLogIsActive","serverLogIsActive","trackingStatusIsActive","catch","e","configuration","getConfiguration","appViewSessionActive","cfg","reason","browserSessionActive","trackingStatusActive","clientLogActive","serverLogActive","LogsConfig","getInstance","isServerLogActive","isActive","queueMessage","logMessage","dbInstance","getDB","setItem","getDate","getLevel","getLogName","getMessage","logService","logEvent","getLogLevel","log","FATAL","ERROR","error","newLogMessage","WARN","INFO","DEBUG","TRACE","logLevel","logger","VM_BROWSERSESSION_UUID","VM_LOGLEVEL_OVERRIDE","defaultLevel","defaultLayout","storage","localStorage","configured","browserUUID","createSessionId","configureLevel","VMAvailableLogLevels","VMLogLevelsOverrideKey","moduleName","moduleVersion","loggerName","join","logOverride","getItem","logLevelOverride","console","warn","configureLog4js2","isClientLogActive","value","logAppenders","appenders","layout","virtualConsole","map","appender","logAppenderName","debug","currentUuid","newUuid","RemoteLogConfig","getLoggerInfo","version","storageIdentifier","info","EventBus","emitter","constructor","evtName","evtData","JSON","emit","evtHandler","on","v1","require","module","exports","_nodeId","_clockseq","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","Array","ii","_typeof","Symbol","iterator","obj","prototype","previousDevice","device","changeOrientationList","documentElement","document","userAgent","navigator","television","includes","haystack","needle","indexOf","find","hasClass","className","match","RegExp","addClass","currentClassNames","replace","removeClass","handleOrientation","landscape","walkOnChangeOrientationList","setOrientationCache","newOrientation","index","macos","ios","iphone","ipod","ipad","windows","iPadOS13Up","platform","maxTouchPoints","android","androidPhone","androidTablet","blackberry","blackberryPhone","blackberryTablet","windowsPhone","windowsTablet","fxos","fxosPhone","fxosTablet","meego","cordova","protocol","nodeWebkit","process","mobile","tablet","desktop","portrait","screen","orientation","Object","hasOwnProperty","call","type","Math","abs","innerHeight","innerWidth","noConflict","onChangeOrientation","cb","orientationEvent","findMatch","addEventListener","attachEvent","os","warmUp","environment","key","PoseTracker","FeatureLicensingService","PluginManager","VtoError","errorSource","errorCode","errorDetails","InitializationError","NotInitializedError","InvalidParametersError","InvalidLocaleError","RenderingError","UpcSupportedError","UpcMissingError","MountComponentError","UnmountComponentError","WebcamUnavailableError","WebcamRejectedError","OpacityError","AnimationError","MissingAuthKeyError","FeatureInitializationError","FeatureUnavailableError","FeatureUndefinedError","FeatureServerError","DefaultInitializationOptions","analyticsConfig","brand","channel","storeId","locale","sessionTimeout","VM_SKIP_AKAMAI_LICENSING_FLAG","Features","STAGING","overrideAkamai","getAllFeaturesPath","getKeyAuthorizationPath","ACCEPTANCE","PRODUCTION","defaultFeatures","Map","getFeatureConfig","VmStore","isInitialized","currentEnvironment","getFeatureMap","currentLicenseKey","featureListUrl","reject","featureMap","feature","initialize","shouldReset","licenseKey","featureSupportCache","getKey","isFeatureAuthorized","features","SET_ENVIRONMENT","SET_AUTH","RESET_AUTH","SET_LOADING_STATUS","SET_PRIVACY_OPTIONS","SET_USER","SET_MIRROR_OPTIONS","SET_MIRROR_STATUS","SET_MIRROR_GLASSES","SET_MIRROR_GLASSES_DATA","SET_MIRROR_GLASSES_STATUS","SET_GLTF_MIRROR_GLASSES_STATUS","SET_MESH","SET_MESH_DATA","SET_MESH_STATUS","ADD_PLUGIN","REMOVE_PLUGIN","CLEAR_ALL_PLUGINS","SET_PLUGINS_REQUIREMENTS","initialState","loading","WEBCAM_ACCESS","INITIALIZATION","POSETRACKER","RENDERING","GLASSES","MESH","privacy","auth","accessToken","refreshToken","AppActions","setEnvironment","createAction","setAuth","resetAuth","setPrivacyOptions","setLoadingStatus","AppReducer","handleActions","action","payload","state","glasses","video","mirrorStatus","mirrorOptions","pluginList","pluginsRequirements","MirrorActions","setMirrorOptions","setMirrorStatus","setMirrorGlasses","setMirrorGlassesData","setMirrorGlassesStatus","setGltfMirrorGlassesStatus","setMesh","setMeshData","setMeshStatus","addPlugin","removePlugin","clearAllPlugins","setPluginsRequirements","MirrorReducer","newPluginList","plugin","upc","status","videoId","pupillaryDistance","region","source","UserActions","setUser","UserReducer","combineReducers","app","mirror","user","AppViewSessionKeys","vmIsInitialized","configureVmStore","enhancer","createStore","rootReducer","configureStore","performanceEvents","onEngineStarting","onFirstFrameRendered","onNewAssetRequested","onWaitingForPose","onFirstFrameStarted","onAssetSwitchDone","onNewTransitionRequested","onNewTransitionRendered","onFPSCount","onFaceFoundSet","useBiometricBipa","CallbackHelper","onFaceFound","onLowEndDeviceDetected","onTransitionAnimation","onTransitionAnimationEnd","onLensChange","onAuthUpdated","onDisplayPage","onPrivacyAgree","onPrivacyFail","onPrivacyReject","onPrivacyPolicyClick","onTermsAndConditionsClick","onPrivacyDisplay","onMirrorExperience","transitionLensMap","transitionOpacity","animationEnabled","animateForward","downloadTransitionsPromise","TransitionColorHelper","downloadTransitionColors","downloadPromise","Catalog","colorMap","lens","setTransitionOverrideColor","reset","finalOpacity","startAnimation","animationDuration","animationStartTime","forward","duration","computePartialAnimation","getTransitionColor","setCurrentLensOpacity","getCurrentLensOpacity","animationProgress","animateOpacity","vmRemoteLog","createLogger","sendAppViewSession","statusCode","statusText","target","generateAdobeData","adobeData","adobeConfig","eventParams","lensSim","errorParams","sendAdobeRequest","data","adobeHost","query","encodeURIComponent","adobeQuery","abobeHost","entries","AdobeHelper","msEnvironment","vtoError","adobeErrorData","eventCode","updateInteractionTime","lastInteractionTime","sendEvent","eventName","params","AnalyticsHelper","onSessionStart","onInitializeSuccess","onInitializeError","onRequestWebcam","onWebcamAllowed","onWebcamDenied","onWebcamUnavailable","onMirrorWasmFailure","onGlassesOn","onGlassesOff","onRender","upcIdLens","upcLensName","onRenderReady","lensName","onMirrorRenderFailure","onFitGlasses","onAdjustGlasses","onCloseMirror","onError","onScreenshot","onGlassesRemovalStateChange","closeMirror","container","ReactDOM","unmountComponentError","RequestHelper","loginRequest","Events","PAUSE","RESUME","TOPIC_SCREENSHOT_REQ","TOPIC_SCREENSHOT_RES","getScreenshot","quality","promise","subscriber","imgURI","width","height","h","PubSub","isPublished","localeMap","de","en","es","fr","it","ja","ko","nl","pl","pt","sv","tr","zh","localeRegionMap","US","EU","AU","getLocaleRegionFallback","localesMap","LocalizationDefaults","language","translations","MIRROR","GENERIC_ERROR","BUTTON","SUBTEXT","PERMISSION_ERROR","WEBCAM_ERROR","MANUAL_START","TEXT","GUIDANCE","DEFAULT","LOOK_DOWN","LOOK_LEFT","LOOK_RIGHT","LOOK_UP","MOVE_CLOSER","MOVE_FARTHER","STAY_STILL","TILT_LEFT","TILT_RIGHT","UNKNOWN","UI","DESKTOP_TAP_TO_FREEZE","FIT_ME_BETTER","TAP_TO_FREEZE","USE_TWO_FINGERS","LocalizationHelper","text","translation","localeReturn","formattedLocale","bipaActive","p2","textEnv","localizationFileUrl","response","resolvedLocale","localeLanguage","localeError","translationFound","localTranslations","fallbackTranslation","englishTranslation","SupportedFeaturesHelper","devicedetection","wasmSupport","webcamAccess","webcamAvailable","webglRendering","isWebView","InitializationHelper","initOptions","privacyOptions","userStore","result","supportedFeatures","FpsCounter","fpsQueue","reduce","sum","performance","t0","t1","RevealFX","DefaultAssetEnvironmentOptions","DefaultPrivacyOptions","privacyPolicy","termsAndConditions","bipaPrefill","firstName","lastName","email","localizationText","DefaultRenderingOptions","revealFX","checkError","hideGlasses","showMesh","meshColor","DefaultTrackingOptions","inspect","recoveryLimit","areaSize","areaOffset","depthRange","axisRange","fittedPointsRatio","fov","minimumFaceSizeRatio","edgeDetectionPercentage","standstill","timeLimit","positionVariance","axisVariance","onPoseTrack","ParameterHelper","initializationParams","privacyCallbacks","inputOptions","size","faceRatio","transitionColor","videoResolution","glassesResolution","glassesType","evaluationThreshold","rendering","globalDebugMethods","plugins","stopGlassesDetectionAfterMs","nosePosition","enabled","touches","tracking","fittingModel","targetElement","clientWidth","element","meshOptions","errorListenerAdded","event","sendError","validatedParams","storeRegion","storeCompany","globalStoreId","setSessionTimeout","sessionTimeoutMs","setCallbacks","callbacks","setPrivacyCallbacks","initReturn","userId","VmWebCam","webCam","tryToOpenWebCam","w","createStreamObject","deviceDetection","webCamStream","streamObject","getUpcAvailability","renderMirror","glassesConfig","env","upcAvailability","mergedOptions","GlassesEnvironment","renderMirrorPromise","glassesEnvironment","upcMissingError","MirrorAsyncRoot","mountComponentError","Catalogue","upcs","catalogueEnvironment","featureLicensingEnv","VirtualMirror","overrideLocalization","getMirrorDefaultLocalization","getBipaVersion","saveBipaEntry","bipaVersion","formData","resetBipaState","pause","resume","fitMeBetter","setTransitionOpacity","opacity","getPlugins","getPluginStatus","pluginId","pluginOptions","isBrowserSupported","envHost","envMap","loginFaUrl","loginVmUrl","refreshUrl","bipaTextUrl","bipaSubmitFormUrl","videoSessionUrl","enrichUrl","vtoUrl","additionalInfoUrl","poseExtractionUrl","statusUrl","pdStatusUrl","profileUrl","measurementUrl","getConfig","MicroserviceError","EnvironmentError","InvalidInputError","LocaleError","RequestError","TimeoutError","parseJsonResponse","refreshRequest","request","url","body","refresh_token","refreshReturn","err","bipaAgreementFetch","bipaAgreementUrl","Authorization","bipaAgreementRequest","bipaAgreementResponse","refreshResponse","bipaDescription","bipaUrls","description","BIPA_AGREEMENT","submitBipaFormFetch","bipaSubmitUrl","submitBipaFormRequest","submitBipaResponse","loginType","rememberMe","authData","BipaError","MissingTranslationError","BipaServiceError","BipaSubmissionError","PrivacyLocalizationKey","DefaultPrivacyLocalization","PRIVACY_AGREEMENT_TITLE","PRIVACY_FIRST_AGREEMENT","PRIVACY_IMPLICIT_AGREEMENT","PRIVACY_IMPLICIT_TERMS_AND_CONDITIONS","PRIVACY_IMPLICIT_TERMS_PRIVACY_CONJUNCTION","PRIVACY_IMPLICIT_PRIVACY_POLICY","PRIVACY_BUTTON_SUBMIT","PRIVACY_BUTTON_CANCEL","BIPA_FORM_TITLE","BIPA_CITIZEN_DECLARATION","BIPA_FORM_SUBTITLE","BIPA_FORM_NAME","BIPA_FORM_SURNAME","BIPA_FORM_EMAIL","BIPA_IMPLICIT_AGREEMENT","BIPA_IMPLICIT_TERMS_AND_CONDITIONS","BIPA_IMPLICIT_TERMS_PRIVACY_CONJUNCTION","BIPA_IMPLICIT_PRIVACY_POLICY","BIPA_FORM_IMPLICIT_AGREEMENT","BIPA_FORM_BUTTON_SUBMIT","BIPA_FORM_BUTTON_CANCEL","BIPA_SERVER_ERROR","currentLocalizationText","NOT_BLANK","SIZE","EMAIL_REGEX","createFieldError","field","objectName","fieldErrors","bipaForm","ErrorIcon","viewBox","fill","cx","cy","r","stroke","strokeWidth","d","x","y","rx","BipaBiometricForm","props","useState","setFirstName","firstNameError","setFirstNameError","setLastName","lastNameError","setLastNameError","setEmail","emailError","setEmailError","serverError","setServerError","topInputRef","useRef","useEffect","handleInputChange","dispatch","confirmButtonDisabled","showFieldWarning","id","ref","autoComplete","onChange","placeholder","React","onClick","onCancel","errorFields","disabled","YesNoCheckBox","tabIndex","checked","PrivacyAgreement","showGradient","setShowGradient","onScroll","dangerouslySetInnerHTML","__html","htmlFor","isIllinoisUser","rel","href","onSubmit","CookieHelper","setBiometricCookie","biometricCookieExists","agreementType","getBiometricCookieName","localizationBaseUrl","fetchBipaJson","bipaJsonEnv","BipaOverlay","isFirstRender","illinoisUser","setIlliniosUser","currentPage","setCurrentPage","setBipaVersion","onClickSubmit","onClickBipaSubmit","onClickCancel","loginReturn","bipaAgreementText","bipaAgreementVersion","BIPA_FORM_BIPA_AGREEMENT","onSetIllinoisUser","formPrefill","onBipaSubmit","renderPage","BipaManager","getCookieName","responseData","root","factory","messages","lastUid","ALL_SUBSCRIBING_MSG","hasKeys","throwException","ex","callSubscriberWithDelayedExceptions","setTimeout","callSubscriberWithImmediateExceptions","deliverMessage","originalMessage","matchedMessage","immediateExceptions","s","subscribers","callSubscriber","createDeliveryFunction","topic","String","position","lastIndexOf","hasDirectSubscribersFor","Boolean","messageHasSubscribers","found","publish","sync","deliver","publishSync","subscribe","func","token","subscribeAll","subscribeOnce","unsubscribe","apply","clearAllSubscriptions","clearSubscriptions","m","countSubscriptions","count","getSubscriptions","list","t","descendantTopicExists","isTopic","isToken","isFunction","toDataURL","blob","reader","MockStreamTrack","MockStream","MockBridgeMedia","videoSrc","AbstractNativeBridge","NativeBridge","NativeStreamTrack","resolution","NativeStream","NativeBridgeMedia","requiredResolution","getRequiredResolution","constraints","UserMedia","MockVideoStream","imageElement","listener","playingListener","NativeVideoStream","mediaStream","getVideoTracks","getSettings","WebCamVideoStream","WebCamStream","isMediaStream","privateStreamObject","stream","MediaStream","defaultContraints","audio","facingMode","ideal","max","cameraBlackList","WebCamConstraints","deviceId","devices","WebCamAbstractError","WebCamAccessNotFoundError","WebCamAccessRejectedError","WebCamAccessSystemError","WebCam","totalWebCamTime","track","devicesInfo","deviceInfo","get","getUserMedia","permissionWaitingTime","mediaStreamId","deviceW","deviceH","wcamfps","userResPermissionTime","userReqPermissionTime","bth"],"mappings":"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","file":"2.chunk.js","sourcesContent":["// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","export class LogMessage {\n\n public level: string;\n public logName: string;\n public message: string;\n public date: string = new Date().toISOString();\n\n constructor(level: string, logName: string, message: string) {\n this.level = level;\n this.message = message;\n this.logName = logName;\n }\n\n public getLevel() {\n return this.level;\n }\n\n public getLogName() {\n return this.logName;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public getDate() {\n return this.date;\n }\n\n}\n","import localforage from \"localforage\";\n\nconst dbName = \"db_remotelog\";\n\nclass DBRemoteLogFactory {\n\n public static getInstance() {\n if (!DBRemoteLogFactory.instance) {\n DBRemoteLogFactory.instance = new DBRemoteLogFactory();\n }\n return DBRemoteLogFactory.instance;\n }\n\n private static instance: DBRemoteLogFactory;\n private db: LocalForage;\n\n private constructor() {\n this.db = localforage.createInstance({ name: dbName });\n }\n\n public getDB(): LocalForage {\n return this.db;\n }\n\n public getLogsTableName() {\n return \"logs\";\n }\n\n}\n\nexport { DBRemoteLogFactory };\n","import { ILogsConfiguration } from \"./LogsConfiguration.js\";\n\nclass LogsConfigurationRetriever {\n\n private configurationUrl = \"https://vmcore.luxottica.com/static/config/remotelog/configuration.json\";\n private currentHostname = window.location.hostname;\n\n public getConfiguration(): Promise {\n return new Promise(\n (resolve) => {\n fetch(this.configurationUrl,\n {\n headers: { \"Accept\": \"application/json\", \"Accept-Encoding\": \"gzip\" },\n method: \"GET\",\n },\n ).then((res) => {\n if (res.ok) {\n return res.json();\n } else {\n resolve(this.defaultConfiguration());\n }\n },\n ).then((json) => {\n if (json[this.currentHostname]) {\n const config: ILogsConfiguration = {\n appviewSessionIsActive: json[this.currentHostname].appviewSessionIsActive,\n browserSessionIsActive: json[this.currentHostname].browserSessionIsActive,\n clientLogIsActive: json[this.currentHostname].clientLogIsActive,\n serverLogIsActive: json[this.currentHostname].serverLogIsActive,\n trackingStatusIsActive: json[this.currentHostname].trackingStatusIsActive,\n };\n resolve(config);\n } else {\n resolve(this.defaultConfiguration());\n }\n },\n ).catch((e) => {\n resolve(this.defaultConfiguration());\n });\n },\n );\n }\n\n private defaultConfiguration(): ILogsConfiguration {\n return {\n appviewSessionIsActive: false,\n browserSessionIsActive: false,\n clientLogIsActive: false,\n serverLogIsActive: false,\n trackingStatusIsActive: false,\n };\n }\n\n}\n\nexport { LogsConfigurationRetriever };\n","import { LogsConfigurationRetriever } from \"./LogsConfigurationRetriever\";\n\nclass LogsConfig {\n\n public static getInstance() {\n if (!LogsConfig.instance) {\n LogsConfig.instance = new LogsConfig();\n }\n return LogsConfig.instance;\n }\n\n private static instance: LogsConfig;\n\n private appViewSessionActive: Promise;\n private browserSessionActive: Promise;\n private trackingStatusActive: Promise;\n private clientLogActive: Promise;\n private serverLogActive: Promise;\n\n private configuration = new LogsConfigurationRetriever().getConfiguration();\n\n public constructor() {\n this.appViewSessionActive = new Promise((resolve) => {\n this.configuration\n .then((cfg) => {\n resolve(cfg.appviewSessionIsActive);\n })\n .catch((reason) => {\n resolve(true);\n });\n });\n this.browserSessionActive = new Promise((resolve) => {\n this.configuration\n .then((cfg) => {\n resolve(cfg.browserSessionIsActive);\n })\n .catch((reason) => {\n resolve(true);\n });\n });\n this.trackingStatusActive = new Promise((resolve) => {\n this.configuration\n .then((cfg) => {\n resolve(cfg.trackingStatusIsActive);\n })\n .catch((reason) => {\n resolve(true);\n });\n });\n this.clientLogActive = new Promise((resolve) => {\n this.configuration\n .then((cfg) => {\n resolve(cfg.clientLogIsActive);\n })\n .catch((reason) => {\n resolve(true);\n });\n });\n this.serverLogActive = new Promise((resolve) => {\n this.configuration\n .then((cfg) => {\n resolve(cfg.serverLogIsActive);\n })\n .catch((reason) => {\n resolve(true);\n });\n });\n }\n\n public async isAppViewSessionActive() {\n return this.appViewSessionActive;\n }\n\n public async isBrowserSessionActive() {\n return this.browserSessionActive;\n }\n\n public async isTrackingStatusActive() {\n return this.trackingStatusActive;\n }\n\n public async isServerLogActive() {\n return this.serverLogActive;\n }\n\n public async isClientLogActive() {\n return this.clientLogActive;\n }\n\n}\n\nexport { LogsConfig };\n","import { v4 as uuid } from \"uuid\";\nimport { DBRemoteLogFactory } from \"../../../../adapter/db/factory/DBRemoteLogFactory\";\nimport { LogsConfig } from \"../../../../config/LogsConfig\";\nimport { LogMessage } from \"../../../model/LogMessage\";\n\nclass RemoteLogService {\n\n public log(message: LogMessage): void {\n LogsConfig.getInstance().isServerLogActive().then((isActive) => {\n if (isActive) {\n this.queueMessage(message);\n }\n });\n }\n\n private queueMessage(logMessage: LogMessage) {\n this.dbInstance().getDB().setItem(uuid(), {\n date: logMessage.getDate(),\n level: logMessage.getLevel(),\n logName: logMessage.getLogName(),\n message: logMessage.getMessage(),\n });\n }\n\n private dbInstance() {\n return DBRemoteLogFactory.getInstance();\n }\n\n}\n\nexport { RemoteLogService };\n","import { Appender, ILogEvent, LogAppender, LogLevel } from \"@log4js2/core\";\nimport { LogMessage } from \"../model/LogMessage\";\nimport { RemoteLogService } from \"../service/log/producer/RemoteLogService\";\n\n@Appender(\"RemoteLogAppender\")\nclass RemoteLogAppender extends LogAppender<{}> {\n\n private logService = new RemoteLogService();\n\n public static get appenderName(): string {\n return \"RemoteLogAppender\";\n }\n\n public append(logEvent: ILogEvent) {\n if (logEvent && logEvent.level && logEvent.level <= this.getLogLevel()) {\n this.log(logEvent);\n }\n }\n\n private log(logEvent: ILogEvent) {\n switch (logEvent.level) {\n case LogLevel.FATAL:\n case LogLevel.ERROR: {\n if (logEvent.error) {\n this.logService.log(this.newLogMessage(\"E\", logEvent));\n } else {\n this.logService.log(this.newLogMessage(\"E\", logEvent));\n }\n break;\n }\n case LogLevel.WARN: {\n this.logService.log(this.newLogMessage(\"W\", logEvent));\n break;\n }\n case LogLevel.INFO: {\n this.logService.log(this.newLogMessage(\"I\", logEvent));\n break;\n }\n case LogLevel.DEBUG:\n case LogLevel.TRACE: {\n break;\n }\n default:\n break;\n }\n }\n\n private newLogMessage(logLevel: string, logEvent: ILogEvent) {\n return new LogMessage(logLevel, logEvent.logger || \"\", logEvent.message || \"\");\n }\n}\n\nexport { RemoteLogAppender };\n","import { configure, getLogger, LogAppender, LogLevel } from \"@log4js2/core\";\nimport { v4 as uuid } from \"uuid\";\nimport { LogsConfig } from \"../config/LogsConfig\";\nimport { RemoteLogAppender } from \"./appender/RemoteLogAppender\";\n\nconst VM_BROWSERSESSION_UUID = \"vm.browsersessionuuid.20200120\";\nconst VM_LOGLEVEL_OVERRIDE = \"vm.loglevel.override\";\n\nconst defaultLevel = LogLevel.DEBUG;\nconst defaultVirtualConsole = false;\nconst defaultLayout = \"%d [%p] %c - %m\";\n\nclass RemoteLogConfig {\n\n public static getInstance() {\n if (!RemoteLogConfig.instance) {\n RemoteLogConfig.instance = new RemoteLogConfig();\n }\n return RemoteLogConfig.instance;\n }\n\n private static instance: RemoteLogConfig;\n\n private storage = window.localStorage;\n private configured = false;\n\n private browserUUID: string = \"\";\n\n public static get storageIdentifier() {\n return VM_BROWSERSESSION_UUID;\n }\n\n private constructor() {\n this.createSessionId();\n this.configureLevel(defaultLevel);\n (window as any).VMAvailableLogLevels = LogLevel;\n (window as any).VMLogLevelsOverrideKey = VM_LOGLEVEL_OVERRIDE;\n }\n\n public getLogger(moduleName: string, moduleVersion: string, loggerName: string) {\n return getLogger([moduleName, moduleVersion, loggerName].join(\".\"));\n }\n\n public getLoggerInfo(moduleName: string, moduleVersion: string, loggerName: string) {\n return getLogger([moduleName, moduleVersion, loggerName].join(\".\"));\n }\n\n public get currentUuid() {\n return this.browserUUID;\n }\n\n private configureLevel(logLevel: LogLevel) {\n const logOverride = this.storage.getItem(VM_LOGLEVEL_OVERRIDE);\n if (logOverride !== null) {\n const logLevelOverride = logOverride as unknown as LogLevel;\n // tslint:disable-next-line: no-console\n console.warn(\"overriding loglevel with localstorage one ->\", logLevelOverride);\n this.configureLog4js2([\"Console\", RemoteLogAppender], logLevelOverride);\n } else {\n try {\n const isActive = LogsConfig.getInstance().isClientLogActive();\n this.configureLog4js2([\"Console\", RemoteLogAppender], LogLevel.INFO);\n isActive.then((value) => {\n this.configureLog4js2([\"Console\", RemoteLogAppender], value ? LogLevel.INFO : LogLevel.ERROR);\n this.configured = true;\n }).catch((e) => {\n // tslint:disable-next-line: no-console\n console.error(e);\n });\n } catch (e) {\n // tslint:disable-next-line: no-console\n console.error(e);\n this.configureLog4js2([\"Console\", RemoteLogAppender], defaultLevel);\n }\n }\n }\n\n private configureLog4js2(logAppenders: Array, logLevel: LogLevel) {\n if (!this.configured) {\n configure({\n appenders: logAppenders,\n layout: defaultLayout,\n level: logLevel,\n virtualConsole: defaultVirtualConsole,\n });\n const appenders = logAppenders.map((appender) => this.logAppenderName(appender));\n // tslint:disable-next-line: no-console\n console.debug(`appenders : ${appenders}\nlayout : ${defaultLayout}\nlevel : ${logLevel}\nvirtual console : ${defaultVirtualConsole}`);\n }\n }\n\n private logAppenderName(appender: string | typeof LogAppender): string {\n let name = \"n.a\";\n switch (typeof appender) {\n case \"string\":\n name = \"Console\";\n break;\n case \"function\":\n name = \"RemoteLogAppender\";\n break;\n default:\n name = \"n.a.[\" + typeof appender + \"]\";\n break;\n }\n return name;\n }\n\n private createSessionId() {\n let currentUuid = this.storage.getItem(VM_BROWSERSESSION_UUID);\n if (!currentUuid) {\n const newUuid = uuid();\n if (newUuid) {\n this.storage.setItem(VM_BROWSERSESSION_UUID, newUuid);\n currentUuid = newUuid;\n }\n }\n this.browserUUID = currentUuid || \"cantcreateuuid\";\n }\n\n}\n\nexport { RemoteLogConfig };\n","import { name, version } from \"../../../../package.json\";\nimport { RemoteLogConfig } from \"../../RemoteLogConfig\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"VmAnalyticsApiConfig\");\n\nexport class VmAnalyticsApiConfig {\n\n private hostTest = \"https://vmcore-test.luxottica.com\";\n private hostProd = \"https://vmcore.luxottica.com\";\n private appViewSessionApi = \"/api/appviewsession\";\n private browserSessionApi = \"/api/browsersession\";\n private trackingStatusApi = \"/api/trackingstatus\";\n private remoteLogApi = \"/api/remotelog\";\n private currentHostname = window.location.hostname;\n\n public get appViewSessionApiEndpoint() {\n return this.getHostname() + this.appViewSessionApi;\n }\n\n public get browserSessionApiEndpoint() {\n return this.getHostname() + this.browserSessionApi;\n }\n\n public get trackingStatusApiEndpoint() {\n return this.getHostname() + this.trackingStatusApi;\n }\n\n public get remoteLogApiEndpoint() {\n return this.getHostname() + this.remoteLogApi;\n }\n\n private getHostname() {\n const host = this.isDevEnvironment() ? this.hostTest : this.hostProd;\n logger.debug(\"analytics api hostname: {}\", host);\n return host;\n }\n\n private isDevEnvironment() {\n const isDev = this.currentHostname === \"localhost\";\n logger.debug(\"is dev environment: {}\", isDev);\n return isDev;\n }\n}\n","import { name, version } from \"../../../package.json\";\nimport { IRemoteAppViewSession } from \"../../domain/model/IRemoteAppViewSession\";\nimport { RemoteLogConfig } from \"../../domain/RemoteLogConfig\";\nimport { VmAnalyticsApiConfig } from \"../../domain/service/config/VmAnalyticsApiConfig\";\nimport { sendXhrRequest } from \"../../helpers/RequestHelper\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"AppViewSessionAdapter\");\n\nclass AppViewSessionAdapter implements LogAdapter {\n\n private config = new VmAnalyticsApiConfig();\n\n public log(message: IRemoteAppViewSession): Promise {\n const sessionId = RemoteLogConfig.getInstance().currentUuid;\n if (sessionId) {\n const jsonBody = JSON.stringify({\n browserSessionUuid: sessionId,\n date: new Date().toISOString(),\n statusCode: message.statusCode,\n statusText: message.statusText,\n });\n\n const requestUrl = this.config.appViewSessionApiEndpoint;\n return sendXhrRequest(\n \"POST\",\n requestUrl,\n jsonBody,\n \"\",\n [],\n {\n \"Accept\": \"application/json\",\n \"Content-type\": \"application/json\",\n // \"Referrer-Policy\": \"unsafe-url\"\n },\n ).catch((e) => {\n return Promise.reject(e);\n });\n\n } else {\n logger.warn(\"sessionId not available\");\n return Promise.reject();\n }\n }\n}\n\nexport { AppViewSessionAdapter };\n","import { name, version } from \"../../../../../package.json\";\nimport { DBAppViewSessionFactory } from \"../../../../adapter/db/factory/DBAppViewSessionFactory\";\nimport { AppViewSessionAdapter } from \"../../../../adapter/rest/AppViewSessionAdapter\";\nimport { IRemoteAppViewSession } from \"../../../model/IRemoteAppViewSession\";\nimport { RemoteLogConfig } from \"../../../RemoteLogConfig\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"AppViewSessionConsumer\");\n\nconst dbInstance = () => {\n return DBAppViewSessionFactory.getInstance();\n};\n\nconst messageAdapter = () => {\n return new AppViewSessionAdapter();\n};\n\nconst consumeDbRows = () => {\n const dbase = dbInstance().getDB();\n\n dbase.iterate((\n value: IRemoteAppViewSession,\n key: string\n ) => {\n // if (value === null) {\n // console.error(\"undefined: \", { key });\n // }\n messageAdapter().log({\n statusCode: value.statusCode,\n statusText: value.statusText\n }).then(() => {\n logger.debug(\"consumed stored log message: {}\", JSON.stringify(value));\n // console.info(\"consumed: \", {key, value});\n return dbase.removeItem(key);\n }).catch(() => {\n // console.error(\"failed: \", { key });\n });\n }).then(() => {\n logger.debug(\"all logs consumed from local indexdb\");\n });\n};\n\nclass AppViewSessionConsumer {\n public consume() {\n const time1 = window.performance.now();\n consumeDbRows();\n const time2 = window.performance.now();\n logger.debug(\"logs consumed in {} ms\", time2 - time1);\n }\n}\n\nexport { AppViewSessionConsumer };\n","import { name, version } from \"../../../../package.json\";\nimport { RemoteLogConfig } from \"../../RemoteLogConfig\";\nimport { AppViewSessionConsumer } from \"../log/consumer/AppViewSessionConsumer\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"AppViewSessionConsumerJob\");\n\nclass AppViewSessionConsumerJob {\n\n public static getInstance() {\n if (!AppViewSessionConsumerJob.instance) {\n AppViewSessionConsumerJob.instance = new AppViewSessionConsumerJob();\n }\n return AppViewSessionConsumerJob.instance;\n }\n\n private static instance: AppViewSessionConsumerJob;\n private started: boolean = false;\n private intervalFunction: any;\n\n private constructor() {\n logger.debug(\"remote log consumer job created\");\n }\n\n public start(): void {\n if (this.started === true) {\n logger.debug(\"already started\");\n } else {\n logger.debug(\"start to consume logs\");\n this.started = true;\n this.intervalFunction = window.setInterval(new AppViewSessionConsumer().consume, 3000);\n }\n }\n\n public stop(): void {\n if (this.intervalFunction) {\n window.clearInterval(this.intervalFunction);\n }\n }\n\n}\n\nexport { AppViewSessionConsumerJob };\n","import { DeviceDetection } from \"@luxottica/vm-devicedetection\";\nimport { name, version } from \"../../../package.json\";\nimport { IRemoteBrowserSession } from \"../../domain/model/IRemoteBrowserSession\";\nimport { RemoteLogConfig } from \"../../domain/RemoteLogConfig\";\nimport { VmAnalyticsApiConfig } from \"../../domain/service/config/VmAnalyticsApiConfig\";\nimport { sendXhrRequest } from \"../../helpers/RequestHelper\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"BrowserSessionAdapter\");\n\nconst VM_BROWSERSESSION_FLAG = RemoteLogConfig.storageIdentifier + \".flag\";\nconst VM_BROWSERSESSION_ETAG = RemoteLogConfig.storageIdentifier + \".etag\";\n\nclass BrowserSessionAdapter implements LogAdapter {\n\n private config = new VmAnalyticsApiConfig();\n private storage = window.localStorage;\n\n public log(message: IRemoteBrowserSession): Promise {\n const deviceDetection: DeviceDetection = new DeviceDetection();\n const userAgentData = deviceDetection.getUserAgentData();\n const persistedSessionFlag = this.storage.getItem(VM_BROWSERSESSION_FLAG);\n const persistedSessionUuid = RemoteLogConfig.getInstance().currentUuid;\n\n if (persistedSessionFlag) {\n logger.info(\"skip (session id already created)\");\n return Promise.resolve(false);\n } else {\n if (persistedSessionUuid) {\n const jsonBody = JSON.stringify({\n browserSessionUuid: persistedSessionUuid,\n date: message.date,\n device: {\n cpuArchitecture: userAgentData.cpu.architecture,\n model: userAgentData.device.model,\n resolution: {\n dpi: message.deviceResolution.dpi,\n h: message.deviceResolution.h,\n w: message.deviceResolution.w,\n },\n type: userAgentData.device.type,\n vendor: userAgentData.device.vendor,\n webapi: {\n ambientLight: \"ondevicelight\" in window,\n connection: \"connection\" in navigator,\n serviceWorker: \"serviceWorker\" in navigator,\n share: \"share\" in navigator,\n visibility: \"hidden\" in document,\n },\n webcam: {\n available: message.deviceWebcam.enabled,\n resolutionW: message.deviceWebcam.resolution,\n },\n webgl: {\n version: message.deviceWebgl.version,\n },\n },\n os: {\n name: userAgentData.os.name,\n version: parseFloat(userAgentData.os.version!),\n },\n userAgent: {\n browserEngineName: userAgentData.engine.name,\n browserEngineVersion: parseFloat(userAgentData.engine.version!),\n browserName: userAgentData.browser.name,\n browserVersion: parseFloat(userAgentData.browser.version!),\n webView: deviceDetection.isWebView(),\n },\n });\n\n const requestUrl = this.config.browserSessionApiEndpoint;\n return sendXhrRequest(\n \"POST\",\n requestUrl,\n jsonBody,\n \"\",\n [\"etag\"],\n {\n \"Accept\": \"application/json\",\n \"Content-type\": \"application/json\",\n // \"Referrer-Policy\": \"unsafe-url\"\n },\n ).then((response) => {\n const etagsessionId = response.headers.etag;\n this.storage.setItem(VM_BROWSERSESSION_FLAG, \"true\");\n this.storage.setItem(VM_BROWSERSESSION_ETAG, etagsessionId ? etagsessionId.slice(-1, 1) : \"n.a.\");\n return true;\n }).catch((e) => {\n return Promise.reject(e);\n });\n\n } else {\n logger.warn(\"persistent session uuid not available\");\n return Promise.reject(\"persistent session uuid not available\");\n }\n }\n }\n\n}\n\nexport { BrowserSessionAdapter };\n","import { name, version } from \"../../../../../package.json\";\nimport { DBBrowserSessionFactory } from \"../../../../adapter/db/factory/DBBrowserSessionFactory\";\nimport { BrowserSessionAdapter } from \"../../../../adapter/rest/BrowserSessionAdapter\";\nimport { IRemoteBrowserSession } from \"../../../model/IRemoteBrowserSession\";\nimport { RemoteLogConfig } from \"../../../RemoteLogConfig\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"BrowserSessionConsumer\");\n\nconst dbInstance = () => {\n return DBBrowserSessionFactory.getInstance();\n};\n\nconst messageAdapter = () => {\n return new BrowserSessionAdapter();\n};\n\nconst consumeDbRows = () => {\n const dbase = dbInstance().getDB();\n\n dbase.iterate((\n value: IRemoteBrowserSession,\n key: string\n ) => {\n // if (value === null) {\n // console.error(\"undefined: \", { key });\n // }\n messageAdapter().log({\n date: value.date,\n deviceResolution: value.deviceResolution,\n deviceWebcam: value.deviceWebcam,\n deviceWebgl: value.deviceWebgl,\n }).then(() => {\n logger.debug(\"consumed stored log message: {}\", JSON.stringify(value));\n // console.info(\"consumed: \", {key, value});\n return dbase.removeItem(key);\n }).catch(() => {\n // console.error(\"failed: \", { key });\n });\n }).then(() => {\n logger.debug(\"all logs consumed from local indexdb\");\n });\n};\n\nclass BrowserSessionConsumer {\n\n public consume() {\n const time1 = window.performance.now();\n consumeDbRows();\n const time2 = window.performance.now();\n logger.debug(\"logs consumed in {} ms\", time2 - time1);\n }\n\n}\n\nexport { BrowserSessionConsumer };\n","import { name, version } from \"../../../../package.json\";\nimport { RemoteLogConfig } from \"../../RemoteLogConfig\";\nimport { BrowserSessionConsumer } from \"../log/consumer/BrowserSessionConsumer\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"BrowserSessionConsumerJob\");\n\nclass BrowserSessionConsumerJob {\n\n public static getInstance() {\n if (!BrowserSessionConsumerJob.instance) {\n BrowserSessionConsumerJob.instance = new BrowserSessionConsumerJob();\n }\n return BrowserSessionConsumerJob.instance;\n }\n\n private static instance: BrowserSessionConsumerJob;\n private started: boolean = false;\n private intervalFunction: any;\n\n private constructor() {\n logger.debug(\"remote log consumer job created\");\n }\n\n public start(): void {\n if (this.started === true) {\n logger.debug(\"already started\");\n } else {\n logger.debug(\"start to consume logs\");\n this.started = true;\n this.intervalFunction = window.setInterval(new BrowserSessionConsumer().consume, 3000);\n }\n }\n\n public stop(): void {\n if (this.intervalFunction) {\n window.clearInterval(this.intervalFunction);\n }\n }\n\n}\n\nexport { BrowserSessionConsumerJob };\n","import { name, version } from \"../../../package.json\";\nimport { LogMessage } from \"../../domain/model/LogMessage\";\nimport { RemoteLogConfig } from \"../../domain/RemoteLogConfig\";\nimport { VmAnalyticsApiConfig } from \"../../domain/service/config/VmAnalyticsApiConfig\";\nimport { sendXhrRequest } from \"../../helpers/RequestHelper\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"RemoteLogAdapter\");\n\nclass RemoteLogAdapter implements LogAdapter {\n\n private config = new VmAnalyticsApiConfig();\n\n public log(logMessage: LogMessage): Promise {\n try {\n const sessionId = RemoteLogConfig.getInstance().currentUuid;\n if (sessionId) {\n const jsonBody = JSON.stringify({\n browserSessionUuid: sessionId,\n date: new Date().toISOString(),\n level: logMessage.getLevel(),\n logName: logMessage.getLogName(),\n message: logMessage.getMessage(),\n });\n\n const requestUrl = this.config.remoteLogApiEndpoint;\n\n return sendXhrRequest(\n \"POST\",\n requestUrl,\n jsonBody,\n \"\",\n [],\n {\n \"Accept\": \"application/json\",\n \"Content-type\": \"application/json\",\n // \"Referrer-Policy\": \"unsafe-url\"\n },\n ).catch((e) => {\n return Promise.reject(e);\n });\n\n } else {\n console.warn(\"sessionId not available\");\n return Promise.reject(\"sessionId not available\");\n }\n } catch (e) {\n return Promise.reject(e);\n }\n }\n}\n\nexport { RemoteLogAdapter };\n","import { name, version } from \"../../../../../package.json\";\nimport { DBRemoteLogFactory } from \"../../../../adapter/db/factory/DBRemoteLogFactory\";\nimport { RemoteLogAdapter } from \"../../../../adapter/rest/RemoteLogAdapter\";\nimport { LogMessage } from \"../../../model/LogMessage\";\nimport { RemoteLogConfig } from \"../../../RemoteLogConfig\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"RemoteLogConsumer\");\n\nconst dbInstance = () => {\n return DBRemoteLogFactory.getInstance();\n};\n\nconst messageAdapter = () => {\n return new RemoteLogAdapter();\n};\n\nconst consumeDbRows = () => {\n const dbase = dbInstance().getDB();\n\n dbase.iterate((\n value: LogMessage,\n key: string\n ) => {\n if (value === null) {\n // console.error(\"undefined: \", { key });\n }\n messageAdapter().log(\n new LogMessage(value.level, value.logName, value.message)\n ).then(() => {\n logger.debug(\"consumed stored log message: {}\", JSON.stringify(value));\n // console.info(\"consumed: \", {key, value});\n return dbase.removeItem(key);\n }).catch(() => {\n // console.error(\"failed: \", { key });\n });\n }).then(() => {\n logger.debug(\"all logs consumed from local indexdb\");\n });\n};\n\nclass RemoteLogConsumer {\n\n public consume() {\n const time1 = window.performance.now();\n consumeDbRows();\n const time2 = window.performance.now();\n logger.debug(\"logs consumed in {} ms\", time2 - time1);\n }\n\n}\n\nexport { RemoteLogConsumer };\n","import { name, version } from \"../../../../package.json\";\nimport { RemoteLogConfig } from \"../../RemoteLogConfig\";\nimport { RemoteLogConsumer } from \"../log/consumer/RemoteLogConsumer\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"RemoteLogConsumerJob\");\n\nclass RemoteLogConsumerJob {\n\n public static getInstance() {\n if (!RemoteLogConsumerJob.instance) {\n RemoteLogConsumerJob.instance = new RemoteLogConsumerJob();\n }\n return RemoteLogConsumerJob.instance;\n }\n\n private static instance: RemoteLogConsumerJob;\n private started: boolean = false;\n private intervalFunction: any;\n\n private constructor() {\n logger.debug(\"remote log consumer job created\");\n }\n\n public start(): void {\n if (this.started === true) {\n logger.debug(\"already started\");\n } else {\n logger.debug(\"start to consume logs\");\n this.started = true;\n this.intervalFunction = window.setInterval(new RemoteLogConsumer().consume, 5000);\n }\n }\n\n public stop(): void {\n if (this.intervalFunction) {\n window.clearInterval(this.intervalFunction);\n }\n }\n\n}\n\nexport { RemoteLogConsumerJob };\n","import { name, version } from \"../../../package.json\";\nimport { IRemoteTrackingStatus } from \"../../domain/model/IRemoteTrackingStatus\";\nimport { RemoteLogConfig } from \"../../domain/RemoteLogConfig\";\nimport { VmAnalyticsApiConfig } from \"../../domain/service/config/VmAnalyticsApiConfig\";\nimport { sendXhrRequest } from \"../../helpers/RequestHelper\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"TrackingStatusAdapter\");\n\nclass TrackingStatusAdapter implements LogAdapter {\n\n private config = new VmAnalyticsApiConfig();\n\n public log(message: IRemoteTrackingStatus): Promise {\n const sessionId = RemoteLogConfig.getInstance().currentUuid;\n if (sessionId) {\n let jsonBody;\n if (message.fps) {\n jsonBody = JSON.stringify({\n browserSessionUuid: sessionId,\n date: new Date().toISOString(),\n fps: message.fps,\n });\n } else {\n jsonBody = JSON.stringify({\n browserSessionUuid: sessionId,\n date: new Date().toISOString(),\n trackingCode: message.trackingCode,\n trackingText: message.trackingText,\n });\n }\n const requestUrl = this.config.trackingStatusApiEndpoint;\n\n return sendXhrRequest(\n \"POST\",\n requestUrl,\n jsonBody,\n \"\",\n [],\n {\n \"Accept\": \"application/json\",\n \"Content-type\": \"application/json\",\n // \"Referrer-Policy\": \"unsafe-url\"\n },\n ).catch((e) => {\n return Promise.reject(e);\n });\n\n } else {\n console.warn(\"sessionId not available\");\n return Promise.reject(\"sessionId not available\");\n }\n }\n}\n\nexport { TrackingStatusAdapter };\n","import { name, version } from \"../../../../../package.json\";\nimport { DBTrackingStatusFactory } from \"../../../../adapter/db/factory/DBTrackingStatusFactory\";\nimport { TrackingStatusAdapter } from \"../../../../adapter/rest/TrackingStatusAdapter\";\nimport { IRemoteTrackingStatus } from \"../../../model/IRemoteTrackingStatus.js\";\nimport { RemoteLogConfig } from \"../../../RemoteLogConfig\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"TrackingStatusConsumer\");\n\nconst dbInstance = () => {\n return DBTrackingStatusFactory.getInstance();\n};\n\nconst messageAdapter = () => {\n return new TrackingStatusAdapter();\n};\n\nconst consumeDbRows = () => {\n const dbase = dbInstance().getDB();\n\n dbase.iterate((\n value: IRemoteTrackingStatus,\n key: string\n ) => {\n // if (value === null) {\n // console.error(\"undefined: \", { key });\n // }\n messageAdapter().log({\n fps: value.fps,\n trackingCode: value.trackingCode,\n trackingText: value.trackingText,\n }).then(() => {\n logger.debug(\"consumed stored log message: {}\", JSON.stringify(value));\n // console.info(\"consumed: \", {key, value});\n return dbase.removeItem(key);\n }).catch(() => {\n // console.error(\"failed: \", { key });\n });\n }).then(() => {\n logger.debug(\"all logs consumed from local indexdb\");\n });\n};\n\nclass TrackingStatusConsumer {\n\n public consume() {\n const time1 = window.performance.now();\n consumeDbRows();\n const time2 = window.performance.now();\n logger.debug(\"logs consumed in {} ms\", time2 - time1);\n }\n\n}\n\nexport { TrackingStatusConsumer };\n","import { name, version } from \"../../../../package.json\";\nimport { RemoteLogConfig } from \"../../RemoteLogConfig\";\nimport { TrackingStatusConsumer } from \"../log/consumer/TrackingStatusConsumer\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"TrackingStatusConsumerJob\");\n\nclass TrackingStatusConsumerJob {\n\n public static getInstance() {\n if (!TrackingStatusConsumerJob.instance) {\n TrackingStatusConsumerJob.instance = new TrackingStatusConsumerJob();\n }\n return TrackingStatusConsumerJob.instance;\n }\n\n private static instance: TrackingStatusConsumerJob;\n private started: boolean = false;\n private intervalFunction: any;\n\n private constructor() {\n logger.debug(\"remote log consumer job created\");\n }\n\n public start(): void {\n if (this.started === true) {\n logger.debug(\"already started\");\n } else {\n logger.debug(\"start to consume logs\");\n this.started = true;\n this.intervalFunction = window.setInterval(new TrackingStatusConsumer().consume, 3000);\n }\n }\n\n public stop(): void {\n if (this.intervalFunction) {\n window.clearInterval(this.intervalFunction);\n }\n }\n\n}\n\nexport { TrackingStatusConsumerJob };\n","import { RemoteLogConfig } from \"@luxottica/vm-remotelog\";\nimport mitt from \"mitt\";\nimport { name, version } from \"../package.json\";\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, \"EventBus\");\n\nclass EventBus {\n\n public static publish(evtName: string, evtData: any) {\n logger.debug(\"publishing event '{}': {}\", evtName, JSON.stringify(evtData));\n EventBus.emitter.emit(evtName, evtData);\n logger.debug(\"published event '{}': {}\", evtName, JSON.stringify(evtData));\n }\n\n public static register(evtName: string, evtHandler: any) {\n logger.debug(\"registering event '{}': {}\", evtName, JSON.stringify(evtHandler));\n EventBus.emitter.on(evtName, evtHandler);\n logger.debug(\"registered event '{}': {}\", evtName, JSON.stringify(evtHandler));\n }\n\n private static emitter: mitt.Emitter = mitt();\n\n constructor() {\n logger.info(\"event bus initialized: {}\", EventBus.emitter.constructor.name);\n }\n\n}\n\nexport { EventBus };\n","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n// Save the previous value of the device variable.\nvar previousDevice = window.device;\n\nvar device = {};\n\nvar changeOrientationList = [];\n\n// Add device as a global object.\nwindow.device = device;\n\n// The element.\nvar documentElement = window.document.documentElement;\n\n// The client user agent string.\n// Lowercase, so we can use the more efficient indexOf(), instead of Regex\nvar userAgent = window.navigator.userAgent.toLowerCase();\n\n// Detectable television devices.\nvar television = ['googletv', 'viera', 'smarttv', 'internet.tv', 'netcast', 'nettv', 'appletv', 'boxee', 'kylo', 'roku', 'dlnadoc', 'pov_tv', 'hbbtv', 'ce-html'];\n\n// Main functions\n// --------------\n\ndevice.macos = function () {\n return find('mac');\n};\n\ndevice.ios = function () {\n return device.iphone() || device.ipod() || device.ipad();\n};\n\ndevice.iphone = function () {\n return !device.windows() && find('iphone');\n};\n\ndevice.ipod = function () {\n return find('ipod');\n};\n\ndevice.ipad = function () {\n var iPadOS13Up = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n return find('ipad') || iPadOS13Up;\n};\n\ndevice.android = function () {\n return !device.windows() && find('android');\n};\n\ndevice.androidPhone = function () {\n return device.android() && find('mobile');\n};\n\ndevice.androidTablet = function () {\n return device.android() && !find('mobile');\n};\n\ndevice.blackberry = function () {\n return find('blackberry') || find('bb10');\n};\n\ndevice.blackberryPhone = function () {\n return device.blackberry() && !find('tablet');\n};\n\ndevice.blackberryTablet = function () {\n return device.blackberry() && find('tablet');\n};\n\ndevice.windows = function () {\n return find('windows');\n};\n\ndevice.windowsPhone = function () {\n return device.windows() && find('phone');\n};\n\ndevice.windowsTablet = function () {\n return device.windows() && find('touch') && !device.windowsPhone();\n};\n\ndevice.fxos = function () {\n return (find('(mobile') || find('(tablet')) && find(' rv:');\n};\n\ndevice.fxosPhone = function () {\n return device.fxos() && find('mobile');\n};\n\ndevice.fxosTablet = function () {\n return device.fxos() && find('tablet');\n};\n\ndevice.meego = function () {\n return find('meego');\n};\n\ndevice.cordova = function () {\n return window.cordova && location.protocol === 'file:';\n};\n\ndevice.nodeWebkit = function () {\n return _typeof(window.process) === 'object';\n};\n\ndevice.mobile = function () {\n return device.androidPhone() || device.iphone() || device.ipod() || device.windowsPhone() || device.blackberryPhone() || device.fxosPhone() || device.meego();\n};\n\ndevice.tablet = function () {\n return device.ipad() || device.androidTablet() || device.blackberryTablet() || device.windowsTablet() || device.fxosTablet();\n};\n\ndevice.desktop = function () {\n return !device.tablet() && !device.mobile();\n};\n\ndevice.television = function () {\n var i = 0;\n while (i < television.length) {\n if (find(television[i])) {\n return true;\n }\n i++;\n }\n return false;\n};\n\ndevice.portrait = function () {\n if (screen.orientation && Object.prototype.hasOwnProperty.call(window, 'onorientationchange')) {\n return includes(screen.orientation.type, 'portrait');\n }\n if (device.ios() && Object.prototype.hasOwnProperty.call(window, 'orientation')) {\n return Math.abs(window.orientation) !== 90;\n }\n return window.innerHeight / window.innerWidth > 1;\n};\n\ndevice.landscape = function () {\n if (screen.orientation && Object.prototype.hasOwnProperty.call(window, 'onorientationchange')) {\n return includes(screen.orientation.type, 'landscape');\n }\n if (device.ios() && Object.prototype.hasOwnProperty.call(window, 'orientation')) {\n return Math.abs(window.orientation) === 90;\n }\n return window.innerHeight / window.innerWidth < 1;\n};\n\n// Public Utility Functions\n// ------------------------\n\n// Run device.js in noConflict mode,\n// returning the device variable to its previous owner.\ndevice.noConflict = function () {\n window.device = previousDevice;\n return this;\n};\n\n// Private Utility Functions\n// -------------------------\n\n// Check if element exists\nfunction includes(haystack, needle) {\n return haystack.indexOf(needle) !== -1;\n}\n\n// Simple UA string search\nfunction find(needle) {\n return includes(userAgent, needle);\n}\n\n// Check if documentElement already has a given class.\nfunction hasClass(className) {\n return documentElement.className.match(new RegExp(className, 'i'));\n}\n\n// Add one or more CSS classes to the element.\nfunction addClass(className) {\n var currentClassNames = null;\n if (!hasClass(className)) {\n currentClassNames = documentElement.className.replace(/^\\s+|\\s+$/g, '');\n documentElement.className = currentClassNames + ' ' + className;\n }\n}\n\n// Remove single CSS class from the element.\nfunction removeClass(className) {\n if (hasClass(className)) {\n documentElement.className = documentElement.className.replace(' ' + className, '');\n }\n}\n\n// HTML Element Handling\n// ---------------------\n\n// Insert the appropriate CSS class based on the _user_agent.\n\nif (device.ios()) {\n if (device.ipad()) {\n addClass('ios ipad tablet');\n } else if (device.iphone()) {\n addClass('ios iphone mobile');\n } else if (device.ipod()) {\n addClass('ios ipod mobile');\n }\n} else if (device.macos()) {\n addClass('macos desktop');\n} else if (device.android()) {\n if (device.androidTablet()) {\n addClass('android tablet');\n } else {\n addClass('android mobile');\n }\n} else if (device.blackberry()) {\n if (device.blackberryTablet()) {\n addClass('blackberry tablet');\n } else {\n addClass('blackberry mobile');\n }\n} else if (device.windows()) {\n if (device.windowsTablet()) {\n addClass('windows tablet');\n } else if (device.windowsPhone()) {\n addClass('windows mobile');\n } else {\n addClass('windows desktop');\n }\n} else if (device.fxos()) {\n if (device.fxosTablet()) {\n addClass('fxos tablet');\n } else {\n addClass('fxos mobile');\n }\n} else if (device.meego()) {\n addClass('meego mobile');\n} else if (device.nodeWebkit()) {\n addClass('node-webkit');\n} else if (device.television()) {\n addClass('television');\n} else if (device.desktop()) {\n addClass('desktop');\n}\n\nif (device.cordova()) {\n addClass('cordova');\n}\n\n// Orientation Handling\n// --------------------\n\n// Handle device orientation changes.\nfunction handleOrientation() {\n if (device.landscape()) {\n removeClass('portrait');\n addClass('landscape');\n walkOnChangeOrientationList('landscape');\n } else {\n removeClass('landscape');\n addClass('portrait');\n walkOnChangeOrientationList('portrait');\n }\n setOrientationCache();\n}\n\nfunction walkOnChangeOrientationList(newOrientation) {\n for (var index = 0; index < changeOrientationList.length; index++) {\n changeOrientationList[index](newOrientation);\n }\n}\n\ndevice.onChangeOrientation = function (cb) {\n if (typeof cb == 'function') {\n changeOrientationList.push(cb);\n }\n};\n\n// Detect whether device supports orientationchange event,\n// otherwise fall back to the resize event.\nvar orientationEvent = 'resize';\nif (Object.prototype.hasOwnProperty.call(window, 'onorientationchange')) {\n orientationEvent = 'orientationchange';\n}\n\n// Listen for changes in orientation.\nif (window.addEventListener) {\n window.addEventListener(orientationEvent, handleOrientation, false);\n} else if (window.attachEvent) {\n window.attachEvent(orientationEvent, handleOrientation);\n} else {\n window[orientationEvent] = handleOrientation;\n}\n\nhandleOrientation();\n\n// Public functions to get the current value of type, os, or orientation\n// ---------------------------------------------------------------------\n\nfunction findMatch(arr) {\n for (var i = 0; i < arr.length; i++) {\n if (device[arr[i]]()) {\n return arr[i];\n }\n }\n return 'unknown';\n}\n\ndevice.type = findMatch(['mobile', 'tablet', 'desktop']);\ndevice.os = findMatch(['ios', 'iphone', 'ipad', 'ipod', 'android', 'blackberry', 'macos', 'windows', 'fxos', 'meego', 'television']);\n\nfunction setOrientationCache() {\n device.orientation = findMatch(['portrait', 'landscape']);\n}\n\nsetOrientationCache();\n\nexport default device;","/**\n * This method can be used to download and load in memory heavy parts of VM libraries, like for example the pose estimation webassembly\n * It does not return a promise even if internally it will produce some network calls.\n * You can call this method when your page is ready for the interactions.\n * @param environment 'STAGING' | 'ACCEPTANCE' | 'PRODUCTION'\n */\nexport const warmUp: (environment: MicroserviceEnvironment, key?: string) => void = (environment, key) => {\n if (!environment) {\n environment = 'PRODUCTION';\n }\n import('@luxottica/vm-posetracker-faceweb')\n .then(({PoseTracker}) => {\n PoseTracker.warmUp({environment: environment == 'PRODUCTION' ? 'PRODUCTION' : 'TEST'});\n });\n\n // this part tries to initialise and download huge part of automatic plugins (eg glasses removal)\n // we are betting that having the automatic plugins early initialised would lead to better loading time in some cases\n if (!key) { return; }\n import('../service/FeatureLicensingService')\n .then(({ FeatureLicensingService }) => {\n return FeatureLicensingService.initialize(\n key,\n environment\n );\n })\n .then(() => {\n import('./Plugins')\n .then(({PluginManager}) => {\n PluginManager.addAutomaticEffects();\n });\n });\n };\n","import { FieldError } from '../interfaces/FieldError';\n\nclass BipaError extends Error {\n public type: string;\n\n constructor(type: string, message: string, error?: Error) {\n super(message);\n this.type = type;\n this.name = type;\n this.message = message;\n this.stack = error?.stack;\n\n Object.setPrototypeOf(this, BipaError.prototype);\n }\n}\n\nclass MissingTranslationError extends BipaError {\n public static type = 'MissingTranslationError';\n\n constructor(locale: string) {\n super(MissingTranslationError.type, `translation missing for locale: ${locale}`);\n Object.setPrototypeOf(this, MissingTranslationError.prototype);\n }\n}\n\nclass PrivacyError extends BipaError {\n public static type = 'PrivacyError';\n\n constructor(message: string, error?: Error) {\n super(PrivacyError.type, message, error);\n Object.setPrototypeOf(this, PrivacyError.prototype);\n }\n}\n\nclass BipaServiceError extends BipaError {\n public static type = 'BipaServiceError';\n\n constructor(message: string, error?: Error) {\n super(BipaServiceError.type, message, error);\n Object.setPrototypeOf(this, BipaServiceError.prototype);\n }\n}\n\nclass BipaSubmissionError extends BipaError {\n public static type = 'BipaSubmissionError';\n public fieldErrors: FieldError[];\n\n constructor(message: string, fieldErrors?: FieldError[], error?: Error) {\n super(BipaSubmissionError.type, message, error);\n this.fieldErrors = fieldErrors;\n Object.setPrototypeOf(this, BipaSubmissionError.prototype);\n }\n}\n\nexport {\n MissingTranslationError,\n PrivacyError,\n BipaServiceError,\n BipaSubmissionError\n};\n","import { InitializationOptions } from '../interfaces/InitializationTypes';\n\nexport const DefaultInitializationOptions: InitializationOptions = {\n key: undefined,\n analyticsConfig: {},\n brand: undefined,\n channel: undefined,\n storeId: undefined,\n locale: 'en-US',\n environment: 'PRODUCTION',\n sessionTimeout: false\n};\n","import { Features } from '../interfaces/Features';\n\nconst VM_SKIP_AKAMAI_LICENSING_FLAG = 'vm.akamai.licensing.skip';\n(window as any).VMAkamaiLicensingFlag = VM_SKIP_AKAMAI_LICENSING_FLAG;\n\nconst config = {\n STAGING: {\n get baseUrl() {\n if (overrideAkamai()) {\n return 'https://test-gateway-vtoprofile.luxdeepblue.com/services/vtomoduleprotection/public/v1/';\n } else {\n return 'https://test-gateway-vtoprofile.luxdeepblue.com/services/vtomoduleprotection/public/v1/';\n }\n },\n getAllFeaturesPath: 'get-functionalities/',\n getKeyAuthorizationPath: 'key-authorized/',\n },\n ACCEPTANCE: {\n get baseUrl() {\n // tslint:disable-next-line: no-console\n console.warn('backoffice for feature licensing development env will be changed soon');\n if (overrideAkamai()) {\n return 'https://acceptance-gateway-vtoprofile.luxdeepblue.com/services/vtomoduleprotection/public/v1/';\n } else {\n return 'https://vmcore-test.luxottica.com/services/vtomoduleprotection/public/v1/';\n }\n },\n getAllFeaturesPath: 'get-functionalities/',\n getKeyAuthorizationPath: 'key-authorized/',\n },\n PRODUCTION: {\n get baseUrl() {\n if (overrideAkamai()) {\n return 'https://gateway-vtoprofile.luxdeepblue.com/services/vtomoduleprotection/public/v1/';\n } else {\n return 'https://vmcore.luxottica.com/services/vtomoduleprotection/public/v1/';\n }\n },\n getAllFeaturesPath: 'get-functionalities/',\n getKeyAuthorizationPath: 'key-authorized/',\n }\n};\n\nconst defaultFeatures: Map = new Map([]);\n\nconst overrideAkamai = (): boolean => {\n if (!!window && !!window.localStorage) {\n return window.localStorage.getItem(VM_SKIP_AKAMAI_LICENSING_FLAG) === 'true';\n } else {\n return false;\n }\n};\n\nconst getFeatureConfig = (environment: MicroserviceEnvironment) => {\n return config[environment];\n};\n\nexport {\n getFeatureConfig,\n defaultFeatures,\n};\n","enum Features {\n VM_TRANSITIONS = 'VM_TRANSITIONS',\n VM_SCREENSHOT = 'VM_SCREENSHOT',\n VM_MOVE_GLASSES = 'VM_MOVE_GLASSES',\n VM_ANALYTICS = 'VM_ANALYTICS',\n VM_TAP_TO_PAUSE = 'VM_TAP_TO_PAUSE',\n VM_BIPA = 'VM_BIPA',\n VM_GET_BIPA_VERSION = 'VM_GET_BIPA_VERSION',\n VM_SAVE_BIPA_ENTRY = 'VM_SAVE_BIPA_ENTRY',\n VM_SIZE_IMPROVEMENT = 'VM_SIZE_IMPROVEMENT',\n VM_GLOBAL_DEBUG_METHODS = 'VM_GLOBAL_DEBUG_METHODS',\n VM_EFFECTS = 'VM_EFFECTS',\n VM_GLASSES_REMOVAL = 'VM_GLASSES_REMOVAL'\n}\n\nexport {\n Features,\n};\n","import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { MicroserviceEnvironment } from '@luxottica/vto-microservices';\nimport { name, version } from '../../../package.json';\nimport { DefaultInitializationOptions } from '../../constants/DefaultInitializationOptions';\nimport { FeatureInitializationError, FeatureServerError, MissingAuthKeyError } from '../../errors/errors';\nimport { defaultFeatures, getFeatureConfig } from '../../helpers/FeatureConfigHelper';\nimport { Features } from '../../interfaces/Features';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'FeatureLicensingService');\n\nlet isInitialized = false;\nlet currentLicenseKey: string;\nlet currentEnvironment: MicroserviceEnvironment = DefaultInitializationOptions.environment;\nlet featureSupportCache: Map;\n\nconst featureListUrl = (): string => {\n if (currentLicenseKey === undefined) {\n throw new MissingAuthKeyError();\n }\n\n const config = getFeatureConfig(currentEnvironment);\n logger.debug('Getting feature list for key {} using config {}', currentLicenseKey, JSON.stringify(config));\n return `${config.baseUrl}${config.getAllFeaturesPath}${currentLicenseKey}`;\n};\n\nconst getFeatureMap = (): Promise> => {\n return new Promise((resolve, reject) => {\n try {\n const url = featureListUrl();\n resolve(url);\n } catch (e) {\n reject(e);\n }\n\n }).then((url: string) => {\n return fetch(url);\n\n }).then((res) => {\n return (res.ok) ? res.json() : Promise.reject(new FeatureServerError(`${res.status} - ${res.statusText}`));\n\n }).then((json: string[]) => {\n const featureMap = new Map();\n Object.values(Features).forEach((feature) => {\n featureMap.set(feature, json.includes(feature.toString()));\n });\n logger.debug('client feature list has been imported {}', [...featureMap.entries()]);\n return featureMap;\n\n }).catch((e) => {\n const error = (e instanceof MissingAuthKeyError || e instanceof FeatureServerError) ? e : new FeatureServerError(e.message);\n logger.error(error);\n throw error;\n });\n};\n\nconst reset = () => {\n isInitialized = false;\n return getFeatureMap().then((featureMap) => {\n featureSupportCache = featureMap;\n isInitialized = true;\n }).catch((e: Error) => {\n featureSupportCache = defaultFeatures;\n throw e;\n });\n};\n\nconst FeatureLicensingService = {\n initialize: (\n licenseKey: string,\n environment: MicroserviceEnvironment\n ): Promise => {\n\n let shouldReset = false;\n\n if (!isInitialized) {\n shouldReset = true;\n }\n\n if (!!licenseKey && licenseKey !== currentLicenseKey) {\n currentLicenseKey = licenseKey;\n shouldReset = true;\n }\n if (!!environment && environment !== currentEnvironment) {\n currentEnvironment = environment;\n shouldReset = true;\n }\n\n return (shouldReset) ? reset() : Promise.resolve();\n },\n\n isInitialized: (): boolean => { return isInitialized; },\n\n getKey: (): string => {\n return currentLicenseKey;\n },\n\n isFeatureAuthorized(...features: Features[]): boolean {\n if (!!features && !!featureSupportCache) {\n return features.every(feature => !!featureSupportCache.get(feature));\n } else {\n throw new FeatureInitializationError();\n }\n }\n};\n\nexport {\n FeatureLicensingService\n};\n","import { AnyAction, Store } from 'redux';\nimport { configureStore, RootState } from '../Store';\n\nlet VmStore: Store;\n\nconst vmIsInitialized = (): boolean => {\n return VmStore !== undefined && VmStore.getState().app.loading.INITIALIZATION === true;\n};\n\nconst configureVmStore = () => {\n VmStore = configureStore();\n};\n\nexport {\n VmStore,\n vmIsInitialized,\n configureVmStore\n};\n","export const SET_ENVIRONMENT = 'SET_ENVIRONMENT';\nexport const SET_AUTH = 'SET_AUTH';\nexport const RESET_AUTH = 'RESET_AUTH';\n\nexport const SET_LOADING_STATUS = 'SET_LOADING_STATUS';\nexport const SET_PRIVACY_OPTIONS = 'SET_PRIVACY_OPTIONS';\n\nexport const SET_USER = 'SET_USER';\n\nexport const SET_VIDEO_STATUS = 'SET_VIDEO_STATUS';\n\nexport const SET_MIRROR_OPTIONS = 'SET_MIRROR_OPTIONS';\nexport const SET_MIRROR_STATUS = 'SET_MIRROR_STATUS';\nexport const SET_MIRROR_GLASSES = 'SET_MIRROR_GLASSES';\nexport const SET_MIRROR_GLASSES_DATA = 'SET_MIRROR_GLASSES_DATA';\nexport const SET_MIRROR_GLASSES_STATUS = 'SET_MIRROR_GLASSES_STATUS';\nexport const SET_GLTF_MIRROR_GLASSES_STATUS = 'SET_GLTF_MIRROR_GLASSES_STATUS';\nexport const SET_MESH = 'SET_MESH';\nexport const SET_MESH_DATA = 'SET_MESH_DATA';\nexport const SET_MESH_STATUS = 'SET_MESH_STATUS';\n\nexport const ADD_PLUGIN = 'ADD_PLUGIN';\nexport const REMOVE_PLUGIN = 'REMOVE_PLUGIN';\nexport const CLEAR_ALL_PLUGINS = 'CLEAR_ALL_PLUGINS';\nexport const SET_PLUGINS_REQUIREMENTS = 'SET_PLUGINS_REQUIREMENTS';\n","import { Action, createAction, handleActions } from 'redux-actions';\nimport * as Actions from '../constants/actions';\nimport { PrivacyOptions } from '../interfaces/InitializationTypes';\n\nconst initialState: AppStoreState = {\n environment: 'PRODUCTION',\n loading: {\n WEBCAM_ACCESS: false,\n INITIALIZATION: false,\n POSETRACKER: false,\n RENDERING: false,\n GLASSES: false,\n MESH: false\n },\n privacy: { },\n auth: {\n accessToken: undefined,\n refreshToken: undefined\n }\n};\n\nexport const AppActions = {\n setEnvironment: createAction(Actions.SET_ENVIRONMENT),\n setAuth: createAction(Actions.SET_AUTH),\n resetAuth: createAction(Actions.RESET_AUTH),\n setPrivacyOptions: createAction(Actions.SET_PRIVACY_OPTIONS),\n setLoadingStatus: createAction<{type: AppLoadingType, status: boolean}>(Actions.SET_LOADING_STATUS),\n};\n\nexport const AppReducer = handleActions({\n\n [Actions.SET_ENVIRONMENT]: (state, action: Action): AppStoreState => {\n return (!!action.payload) ? {\n ...state,\n environment: action.payload\n } : {\n ...state\n };\n },\n\n [Actions.SET_AUTH]: (state, action: Action): AppStoreState => {\n if (!!action.payload.accessToken && !!action.payload.refreshToken) {\n return {\n ...state,\n auth: {\n accessToken: action.payload.accessToken,\n refreshToken: action.payload.refreshToken,\n }\n };\n } else {\n return {\n ...state\n };\n }\n },\n\n [Actions.RESET_AUTH]: (state): AppStoreState => {\n return {\n ...state,\n auth: {\n accessToken: undefined,\n refreshToken: undefined,\n }\n };\n },\n\n [Actions.SET_PRIVACY_OPTIONS]: (state, action: Action): AppStoreState => {\n return {\n ...state,\n privacy: {\n ...action.payload\n }\n };\n },\n\n [Actions.SET_LOADING_STATUS]: (state, action: Action<{type: AppLoadingType, status: boolean}>): AppStoreState => {\n return {\n ...state,\n loading: {\n ...state.loading,\n [action.payload.type]: action.payload.status\n }\n };\n },\n\n}, initialState);\n","import { MeshVideoData } from '@luxottica/vm-vtoserver-client';\nimport { Action, createAction, handleActions } from 'redux-actions';\nimport * as Actions from '../constants/actions';\nimport { MeshOptions, MirrorInternalOptions, VmPluginDescriptor } from '../interfaces/MirrorOptions';\nimport { VmPluginRequirements } from '../interfaces/PluginInterface';\n\nexport interface MirrorStoreState {\n glasses: MirrorB3dAsset | MirrorGltfAsset | {upc: string; status: AssetStatus};\n video: MirrorVideoData | {videoId: string; status: AssetStatus};\n mirrorOptions: MirrorInternalOptions;\n mirrorStatus: MirrorStatus;\n pluginList: VmPluginDescriptor[];\n pluginsRequirements: VmPluginRequirements;\n}\n\nconst initialState: MirrorStoreState = {\n glasses: undefined,\n video: undefined,\n mirrorStatus: 'LOADING',\n mirrorOptions: undefined,\n pluginList: [],\n pluginsRequirements: undefined,\n};\n\nexport const MirrorActions = {\n setMirrorOptions: createAction(Actions.SET_MIRROR_OPTIONS),\n setMirrorStatus: createAction(Actions.SET_MIRROR_STATUS),\n setMirrorGlasses: createAction<{ upc: string, type: GlassesType }>(Actions.SET_MIRROR_GLASSES),\n setMirrorGlassesData: createAction(Actions.SET_MIRROR_GLASSES_DATA),\n setMirrorGlassesStatus: createAction<{ upc: string, status: AssetStatus }>(Actions.SET_MIRROR_GLASSES_STATUS),\n setGltfMirrorGlassesStatus: createAction<{ upc: string, status: AssetStatus }>(Actions.SET_GLTF_MIRROR_GLASSES_STATUS),\n setMesh: createAction(Actions.SET_MESH),\n setMeshData: createAction(Actions.SET_MESH_DATA),\n setMeshStatus: createAction<{upc: string, status: AssetStatus}>(Actions.SET_MESH_STATUS),\n addPlugin: createAction(Actions.ADD_PLUGIN),\n removePlugin: createAction(Actions.REMOVE_PLUGIN),\n clearAllPlugins: createAction(Actions.CLEAR_ALL_PLUGINS),\n setPluginsRequirements: createAction(Actions.SET_PLUGINS_REQUIREMENTS),\n};\n\nexport const MirrorReducer = handleActions({\n\n [Actions.SET_PLUGINS_REQUIREMENTS]: (state, action: Action): MirrorStoreState => {\n return {\n ...state,\n pluginsRequirements: action.payload\n };\n },\n\n [Actions.CLEAR_ALL_PLUGINS]: (state, action: Action): MirrorStoreState => {\n const newPluginList = state.pluginList.filter((plugin) => action.payload.includes(plugin.pluginId));\n return {\n ...state,\n pluginList: newPluginList\n };\n },\n\n [Actions.ADD_PLUGIN]: (state, action: Action): MirrorStoreState => {\n if (state.pluginList.map((plugin) => plugin.pluginId).includes(action.payload.pluginId)) {\n const index = state.pluginList.findIndex((plugin) => plugin.pluginId === action.payload.pluginId);\n const newPluginList = [...state.pluginList];\n newPluginList[index] = action.payload;\n return {\n ...state,\n pluginList: newPluginList\n };\n } else {\n return {\n ...state,\n pluginList: [\n ...state.pluginList,\n action.payload\n ]\n };\n }\n },\n\n [Actions.REMOVE_PLUGIN]: (state, action: Action): MirrorStoreState => {\n if (state.pluginList.map((plugin) => plugin.pluginId).includes(action.payload)) {\n const index = state.pluginList.findIndex((plugin) => plugin.pluginId === action.payload);\n const newPluginList = [...state.pluginList];\n newPluginList.splice(index, 1);\n return {\n ...state,\n pluginList: newPluginList\n };\n } else {\n return state;\n }\n },\n\n [Actions.SET_MIRROR_OPTIONS]: (state, action: Action): MirrorStoreState => {\n return {\n ...state,\n mirrorOptions: action.payload,\n };\n },\n\n [Actions.SET_MIRROR_STATUS]: (state, action: Action): MirrorStoreState => {\n return {\n ...state,\n mirrorStatus: action.payload,\n };\n },\n\n [Actions.SET_MIRROR_GLASSES]: (state, action: Action<{ upc: string, type: GlassesType }>): MirrorStoreState => {\n return {\n ...state,\n glasses: {\n upc: action.payload.upc,\n type: action.payload.type,\n status: 'LOADING'\n }\n };\n },\n\n [Actions.SET_MIRROR_GLASSES_DATA]: (state, action: Action): MirrorStoreState => {\n return {\n ...state,\n glasses: action.payload,\n };\n },\n\n [Actions.SET_MIRROR_GLASSES_STATUS]: (state, action: Action<{upc: string, status: AssetStatus}>): MirrorStoreState => {\n return {\n ...state,\n glasses: {\n ...state.glasses,\n upc: action.payload.upc,\n status: action.payload.status\n },\n };\n },\n\n [Actions.SET_GLTF_MIRROR_GLASSES_STATUS]: (state, action: Action<{upc: string, status: AssetStatus}>): MirrorStoreState => {\n\n return (action.payload.upc === state.glasses.upc) ? {\n ...state,\n glasses: {\n ...state.glasses,\n upc: action.payload.upc,\n status: action.payload.status\n },\n } : {\n ...state\n };\n },\n\n [Actions.SET_MESH]: (state, action: Action): MirrorStoreState => {\n return {\n ...state,\n video: {\n videoId: action.payload.videoId,\n pupillaryDistance: action.payload.pupillaryDistance,\n status: 'LOADING'\n }\n };\n },\n\n [Actions.SET_MESH_DATA]: (state, action: Action): MirrorStoreState => {\n return {\n ...state,\n video: {\n ...state.video,\n ...action.payload,\n status: 'READY'\n },\n };\n },\n\n [Actions.SET_MESH_STATUS]: (state, action: Action<{videoId: string, status: AssetStatus}>): MirrorStoreState => {\n return {\n ...state,\n video: {\n ...state.video,\n videoId: action.payload.videoId,\n status: action.payload.status\n },\n };\n },\n}, initialState);\n","import { Action, createAction, handleActions } from 'redux-actions';\nimport * as Actions from '../constants/actions';\n\nconst initialState: UserStoreState = {\n locale: 'en-US',\n region: undefined,\n source: undefined,\n brand: undefined,\n storeId: undefined,\n channel: undefined,\n};\n\nexport const UserActions = {\n setUser: createAction(Actions.SET_USER),\n};\n\nexport const UserReducer = handleActions({\n\n [Actions.SET_USER]: (state, action: Action) => {\n return {\n ...state,\n ...action.payload\n };\n },\n\n}, initialState);\n","import { combineReducers } from 'redux';\nimport { RootState } from '../Store';\nimport { AppReducer } from './appReducer';\nimport { MirrorReducer } from './mirrorReducer';\nimport { UserReducer } from './userReducer';\n\nexport default combineReducers({\n app: AppReducer,\n mirror: MirrorReducer,\n user: UserReducer,\n});\n","import { Catalog, CatalogConfiguration, GlassesEnvironment } from '@luxottica/vm-glasses';\nimport { FeatureLicensingService } from '../app/service/FeatureLicensingService';\nimport { Features } from '../interfaces/Features';\nimport { CallbackHelper } from './CallbackHelper';\n\nlet transitionLensMap: TransitionLenses = {};\nlet transitionOpacity = 0.0;\nlet finalOpacity: number;\n\nlet animationEnabled = false;\nlet animateForward = false;\nlet animationStartTime: number;\nlet animationDuration: number;\n\nconst computePartialAnimation = (\n forward: boolean,\n duration: number,\n currentOpacity: number\n): number => {\n return forward ?\n Date.now() - (duration * currentOpacity)\n :\n Date.now() - (duration * (1 - currentOpacity));\n};\n\n// cache previous results\nconst downloadTransitionsPromise: {\n [K in GlassesEnvironment]?: ReturnType<(typeof Catalog)['downloadTransitionLenses']>\n} = {};\n\nconst TransitionColorHelper = {\n downloadTransitionColors: (config: CatalogConfiguration): Promise<{\n [name: string]: TransitionLens;\n } | void> => {\n\n // silently block transitions feature on unauthorised keys\n if (!FeatureLicensingService.isFeatureAuthorized(Features.VM_TRANSITIONS)) {\n transitionLensMap = {};\n return Promise.resolve();\n }\n\n // cache previous results\n const downloadPromise = downloadTransitionsPromise[config.env] || Catalog.downloadTransitionLenses(config);\n downloadTransitionsPromise[config.env] = downloadPromise;\n \n // map colors for internal use\n return downloadPromise.then((colorMap) => {\n Object.keys(colorMap).map((colorName) => {\n transitionLensMap[colorName] = colorMap[colorName];\n });\n return colorMap;\n });\n },\n\n // why to download the catalog again to trigger a callback??????? this requires an explanation from Massimiliano\n onLensChange: (config: CatalogConfiguration, specificLens: string) => {\n Catalog.downloadTransitionLenses(config).then((colorMap) => {\n Object.keys(colorMap).map((colorName) => {\n transitionLensMap[colorName] = colorMap[colorName];\n });\n\n const lens = colorMap[specificLens] ? colorMap[specificLens] : undefined;\n CallbackHelper.onLensChange(lens);\n });\n },\n\n setTransitionOverrideColor: (color: TransitionLens) => {\n transitionLensMap.OVERRIDE = color;\n CallbackHelper.onLensChange(color);\n },\n\n reset: () => {\n animationEnabled = false;\n finalOpacity = undefined;\n },\n\n startAnimation: (duration: number) => {\n if (!animationEnabled) {\n animationEnabled = true;\n animationDuration = duration;\n animateForward = transitionOpacity < 0.5;\n animationStartTime = (transitionOpacity % 1 === 0) ?\n Date.now() : computePartialAnimation(animateForward, animationDuration, transitionOpacity);\n finalOpacity = undefined;\n }\n },\n\n getTransitionColor: (colorName: string): TransitionLens => {\n return transitionLensMap?.[colorName];\n },\n\n setCurrentLensOpacity: (inputOpacity: number): void => {\n TransitionColorHelper.reset();\n transitionOpacity = inputOpacity;\n },\n\n getCurrentLensOpacity: (): number => {\n if (finalOpacity !== undefined || !animationEnabled) {\n return transitionOpacity;\n\n } else {\n let animationProgress = (Date.now() - animationStartTime) / animationDuration;\n if (animationProgress >= 1.0) {\n animationProgress = 1.0;\n animationEnabled = false;\n }\n transitionOpacity = (animateForward) ? animationProgress : (1.0 - animationProgress);\n if (animationProgress === 1.0) {\n finalOpacity = transitionOpacity;\n CallbackHelper.onTransitionAnimationEnd(finalOpacity);\n }\n\n CallbackHelper.onTransitionAnimation(transitionOpacity);\n return transitionOpacity;\n }\n }\n};\n\nexport { TransitionColorHelper };\n","enum AppViewSessionKeys {\n WEBCAM_OK = 'vm-webcam-ok',\n WEBCAM_KO = 'vm-webcam-ko',\n WEBCAM_KO_REASON_MESS = 'vm-webcam-ko_reason_mess',\n WEBCAM_SIZE_W = '_webcam_size_w',\n WEBCAM_SIZE_H = '_webcam_size_h',\n WEBCAM_FRAMERATE = '_webcam_framerate',\n WEBCAM_OPENED = '_webcam_opened',\n WEBCAM_CLOSED = '_webcam_closed',\n WEBCAM_OPENING = '_webcam_opening',\n WEBCAM_OPENING_TIME = '_webcam_opening_time_s',\n WEBCAM_POWERED_TIME = '_webcam_powered_time_s',\n}\n\nexport { AppViewSessionKeys };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { compose, createStore, Store } from 'redux';\nimport rootReducer from './reducers/combinedReducers';\nimport { MirrorStoreState } from './reducers/mirrorReducer';\n\nexport interface RootState {\n app: AppStoreState;\n user: UserStoreState;\n mirror: MirrorStoreState;\n}\n\nexport function configureStore(initialState?: RootState): Store {\n const composeEnhancers =\n typeof window === 'object' &&\n (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?\n (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\n name: 'virtual-mirror'\n }) : compose;\n\n const enhancer = composeEnhancers();\n return createStore(rootReducer, initialState, enhancer) as Store;\n}\n","export const performanceEvents = {\n onEngineStarting : 'onEngineStarting',\n onFirstFrameRendered : 'onFirstFrameRendered',\n onNewAssetRequested : 'onNewAssetRequested',\n onWaitingForPose : 'onWaitingForPose',\n onFirstFrameStarted : 'onFirstFrameStarted',\n onAssetSwitchDone : 'onAssetSwitchDone',\n onNewTransitionRequested : 'onNewTransitionRequested',\n onNewTransitionRendered : 'onNewTransitionRendered',\n onFPSCount : 'onFPSCount'\n};\n\nexport const DOMDefaultTarget = () => document.querySelector('body');\n","import { VmStore } from '../app/VmCore';\nimport { DOMDefaultTarget } from '../constants/DOMEvents';\nimport { AuthenticationOptions, MirrorCallbacks, PrivacyCallbacks } from '../interfaces/InitializationTypes';\nimport { AppActions } from '../reducers/appReducer';\n\nexport * from '../constants/DOMEvents';\nexport {\n CallbackHelper,\n useBiometricBipa,\n setPrivacyCallbacks,\n setCallbacks\n};\n\nlet onFaceFoundSet = false;\n\nexport const dispatchEvent = (domEvent, details = {}) => {\n DOMDefaultTarget().dispatchEvent(new CustomEvent(domEvent, details));\n};\n\nconst setPrivacyCallbacks = (\n privacyCallbacks: PrivacyCallbacks\n) => {\n if (privacyCallbacks) {\n for (const callback in privacyCallbacks) {\n if (privacyCallbacks[callback]) {\n CallbackHelper[callback] = privacyCallbacks[callback];\n }\n }\n }\n};\n\nconst setCallbacks = (\n callbacks: MirrorCallbacks\n) => {\n CallbackHelper.onAuthUpdated = (authData: AuthenticationOptions) => {\n VmStore.dispatch(AppActions.setAuth(authData));\n callbacks?.onAuthUpdated?.(authData);\n };\n\n if (callbacks) {\n if (callbacks.onFaceFound) { \n onFaceFoundSet = true;\n CallbackHelper.onFaceFound = callbacks.onFaceFound;\n }\n if (callbacks.onLowEndDeviceDetected) { CallbackHelper.onLowEndDeviceDetected = callbacks.onLowEndDeviceDetected; }\n if (callbacks.onTransitionAnimation) { CallbackHelper.onTransitionAnimation = callbacks.onTransitionAnimation; }\n if (callbacks.onTransitionAnimationEnd) { CallbackHelper.onTransitionAnimationEnd = callbacks.onTransitionAnimationEnd; }\n if (callbacks.onLensChange) { CallbackHelper.onLensChange = callbacks.onLensChange; }\n }\n};\n\nconst useBiometricBipa = (): boolean => {\n return onFaceFoundSet;\n};\n\nconst CallbackHelper: MirrorCallbacks & PrivacyCallbacks = {\n onFaceFound: () => { return; },\n onLowEndDeviceDetected: () => { return; },\n onTransitionAnimation: () => { return; },\n onTransitionAnimationEnd: () => { return; },\n onLensChange: () => { return; },\n onAuthUpdated: () => { return; },\n onDisplayPage: () => { return; },\n onPrivacyAgree: () => { return; },\n onPrivacyFail: () => { return; },\n onPrivacyReject: () => { return; },\n onPrivacyPolicyClick: undefined,\n onTermsAndConditionsClick: undefined,\n onPrivacyDisplay: () => { return; },\n onMirrorExperience: () => { return; },\n};\n","import { AnimationError } from '../../errors/errors';\nimport { TransitionColorHelper } from '../../helpers/TransitionColorHelper';\nimport { vmIsInitialized, VmStore } from '../VmCore';\n\nconst animateOpacity = (duration = 1000): void => {\n if (!vmIsInitialized()) {\n return;\n }\n\n if (VmStore?.getState().mirror.mirrorStatus === 'TRACKING') {\n\n if (!(VmStore.getState().mirror.glasses as MirrorB3dAsset).transitionAvailable) {\n const error = new AnimationError('animateOpacity cannot be triggered when transition is not available for this asset');\n throw error;\n }\n\n if (duration === undefined || typeof duration !== 'number' || duration <= 0) {\n const error = new AnimationError('animateOpacity cannot be triggered when duration value is invalid');\n throw error;\n }\n\n TransitionColorHelper.startAnimation(duration);\n } else {\n const error = new AnimationError('animateOpacity cannot be triggered when mirror is not rendering');\n throw error;\n }\n};\n\nexport {\n animateOpacity\n};\n","import { RemoteLog, RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../../package.json';\nimport { InitializationOptions } from '../interfaces/InitializationTypes';\nimport { SupportedFeatures } from '../interfaces/SupportedFeatures';\nimport { AppViewSessionKeys } from './AppViewSessionKeys';\n\nconst vmRemoteLog = new RemoteLog();\n\nconst createLogger = (loggerName: string) => {\n return RemoteLogConfig.getInstance().getLoggerInfo(name, version, loggerName);\n};\n\nconst sendBrowserSession = (supportedFeatures: SupportedFeatures) => {\n vmRemoteLog.sendBrowserSession({\n deviceResolution: {\n dpi: 0,\n h: window.screen.height,\n w: window.screen.width,\n },\n deviceWebcam: {\n enabled: supportedFeatures.webcamAccess,\n resolution: 0,\n },\n deviceWebgl: { version: 2 },\n });\n};\n\nconst sendError = (e) => {\n vmRemoteLog.sendAppViewSession({\n statusCode: '99-error',\n statusText: e.message\n });\n};\n\nconst sendAppViewSession = {\n initialize: (options: InitializationOptions) => {\n vmRemoteLog.sendAppViewSession(\n {\n statusCode: AppViewSessionKeys.VM_OK + AppViewSessionKeys.VM_INIT_BRAND,\n statusText: options.brand,\n },\n {\n statusCode: AppViewSessionKeys.VM_OK + AppViewSessionKeys.VM_INIT_CHANNEL,\n statusText: options.channel,\n },\n {\n statusCode: AppViewSessionKeys.VM_OK + AppViewSessionKeys.VM_INIT_LOCALE,\n statusText: options.locale,\n },\n );\n },\n\n initializeError: (options: InitializationOptions) => {\n vmRemoteLog.sendAppViewSession({\n statusCode: AppViewSessionKeys.VM_KO + AppViewSessionKeys.VM_INIT,\n statusText: options.channel,\n });\n },\n\n upc: (upc: string) => {\n vmRemoteLog.sendAppViewSession({\n statusCode: AppViewSessionKeys.VM_OK + AppViewSessionKeys.VM_UPC_AVAILABILITY,\n statusText: upc,\n });\n },\n\n upcError: (upc: string) => {\n vmRemoteLog.sendAppViewSession({\n statusCode: AppViewSessionKeys.VM_KO + AppViewSessionKeys.VM_UPC_AVAILABILITY,\n statusText: upc,\n });\n },\n \n orientationChange: (landscape: boolean) => {\n vmRemoteLog.sendAppViewSession({\n statusCode: 'orientation change',\n statusText: landscape ? 'landscape' : 'portrait'\n });\n },\n\n fitMeBetter: () => {\n vmRemoteLog.sendAppViewSession({\n statusCode: AppViewSessionKeys.VM_OK + AppViewSessionKeys.VM_FITMEBETTER,\n statusText: '',\n });\n },\n\n fitMeBetterError: () => {\n vmRemoteLog.sendAppViewSession({\n statusCode: AppViewSessionKeys.VM_KO + AppViewSessionKeys.VM_FITMEBETTER,\n statusText: '',\n });\n },\n\n close: (target: string) => {\n vmRemoteLog.sendAppViewSession({\n statusCode: AppViewSessionKeys.VM_OK + AppViewSessionKeys.VM_CLOSE,\n statusText: target,\n });\n },\n\n closeError: (target: string) => {\n vmRemoteLog.sendAppViewSession({\n statusCode: AppViewSessionKeys.VM_KO + AppViewSessionKeys.VM_CLOSE,\n statusText: target,\n });\n },\n};\n\nexport {\n createLogger,\n sendBrowserSession,\n sendError,\n sendAppViewSession\n};","import { MicroserviceEnvironment } from '@luxottica/vto-microservices';\nimport { version } from '../../package.json';\nimport { FeatureLicensingService } from '../app/service/FeatureLicensingService';\nimport { FeatureInitializationError, VtoError } from '../errors/errors';\nimport { Features } from '../interfaces/Features';\nimport { AdobeConfig } from '../interfaces/InitializationTypes';\nimport { createLogger } from '../remotelog/VmLogger';\n\nlet adobeConfig: AdobeConfig;\nlet environment: 'DEVELOPMENT' | 'PRODUCTION';\n\nconst logger = createLogger('AdobeHelper');\n\nconst generateAdobeData = (\n eventParams: AdobeEventParameters,\n errorParams?: AdobeErrorParameters\n): AdobeData => {\n const adobeData = new Map();\n adobeData.set('AQB', '1');\n adobeData.set('ndh', '1');\n adobeData.set('ns', 'luxottica');\n adobeData.set('g', window.location.href);\n adobeData.set('r', document.referrer);\n adobeData.set('ch', 'VirtualMirror');\n adobeData.set('server', window.location.hostname);\n adobeData.set('c1', adobeConfig?.channel);\n adobeData.set('c2', adobeConfig?.storeId);\n adobeData.set('c3', adobeConfig?.brand);\n adobeData.set('c4', adobeConfig?.locale);\n adobeData.set('c5', eventParams.upc);\n adobeData.set('c6', adobeConfig?.storeRegion);\n adobeData.set('c7', adobeConfig?.storeCompany);\n adobeData.set('c8', adobeConfig?.globalStoreId);\n adobeData.set('c9', version);\n\n let lensSim;\n if (!!eventParams.lensName && FeatureLicensingService.isFeatureAuthorized(Features.VM_TRANSITIONS)) {\n lensSim = 'transition';\n } else if (!!eventParams.upc) {\n lensSim = 'standard';\n } else {\n lensSim = 'undefined';\n }\n adobeData.set('c11', lensSim);\n\n if (errorParams) {\n adobeData.set('v1', errorParams.errorSource);\n adobeData.set('v2', errorParams.errorCode);\n adobeData.set('v3', errorParams.errorDetails);\n adobeData.set('v5', eventParams.upc);\n }\n\n adobeData.set('events', eventParams.eventCode);\n adobeData.set('pageName', 'VirtualMirror');\n\n adobeData.set('AQE', '1');\n return adobeData;\n};\n\nconst sendAdobeRequest = (data: AdobeData) => {\n const adobeHost = (environment === 'PRODUCTION')\n ? 'https://luxottica.d2.sc.omtrdc.net/b/ss/lux-virtualmirror-prod/1?'\n : 'https://luxottica.d2.sc.omtrdc.net/b/ss/lux-virtualmirror-dev/1?';\n\n const query = Array.from(data.keys())\n .filter((key) => data.get(key) !== undefined)\n .map((key) => encodeURIComponent(key) + '=' + encodeURIComponent(data.get(key)))\n .join('&');\n\n const adobeQuery = `${adobeHost}${query}`;\n\n logger.debug('sending adobe analytics event: {}', JSON.stringify({\n abobeHost: adobeHost,\n entries: [...data.entries()]\n }));\n\n return fetch(adobeQuery, {\n method: 'POST'\n }).catch((e) => {\n logger.warn('failed to post analytics event {}', JSON.stringify(e));\n });\n};\n\nconst AdobeHelper = {\n initialize: (config: AdobeConfig, msEnvironment: MicroserviceEnvironment) => {\n adobeConfig = config;\n environment = (msEnvironment === 'PRODUCTION') ? 'PRODUCTION' : 'DEVELOPMENT';\n },\n sendEvent: (eventParams: AdobeEventParameters) => {\n if (FeatureLicensingService.isFeatureAuthorized(Features.VM_ANALYTICS)) {\n try {\n const adobeData = generateAdobeData(eventParams);\n sendAdobeRequest(adobeData);\n } catch (e) {\n logger.error(e);\n }\n }\n },\n sendError: (vtoError: VtoError, upc?: string) => {\n if (!FeatureLicensingService.isInitialized()) {\n throw new FeatureInitializationError();\n }\n if (FeatureLicensingService.isFeatureAuthorized(Features.VM_ANALYTICS)) {\n try {\n if ([\n 'InitializationError',\n 'InvalidParametersError',\n 'UpcSupportedError',\n 'UpcMissingError',\n 'WebcamUnavailableError',\n 'WebcamRejectedError',\n 'MountComponentError',\n 'UnmountComponentError'\n ].includes(vtoError?.type)) {\n const adobeErrorData = generateAdobeData({\n eventCode: 'event8',\n upc: upc\n }, vtoError.adobeErrorParameters);\n sendAdobeRequest(adobeErrorData);\n }\n } catch (e) {\n logger.error(e);\n }\n }\n }\n};\n\nexport { AdobeHelper };\n","import { GrAction } from '@luxottica/vm-plugin-glasses-removal/build/types/src/interfaces/GlassesRemovalConfig';\nimport { InitializationError, WebcamRejectedError, WebcamUnavailableError } from '../errors/errors';\nimport { AnalyticsConfig } from '../interfaces/AnalyticsConfig';\nimport { AdobeConfig } from '../interfaces/InitializationTypes';\nimport { AdobeHelper } from './AdobeHelper';\n\nlet analyticsConfig: AnalyticsConfig;\nlet lastInteractionTime: number;\nlet sessionTimeoutMs: number;\nconst FIVE_MINUTES = 5 * 60 * 1000;\n\nconst setSessionTimeout = (sessionTimeout: boolean) => {\n sessionTimeoutMs = sessionTimeout ? FIVE_MINUTES : Infinity;\n};\n\nconst updateInteractionTime = () => {\n if (lastInteractionTime) {\n lastInteractionTime = Date.now();\n }\n};\n\n// below method should use this signature but does not work due to a typescript check\n// const sendEvent = (eventName: keyof AnalyticsConfig, ...params: any) => {\nconst sendEvent = (eventName: string, ...params: any) => {\n try {\n if (eventName in analyticsConfig) {\n if (analyticsConfig[eventName] !== undefined) {\n analyticsConfig[eventName]!(...params);\n }\n }\n } catch (e) {\n // tslint:disable-next-line: no-console\n console.error('Analytics Event Failed', eventName, e);\n }\n};\n\nconst AnalyticsHelper = {\n initialize: (\n environment: MicroserviceEnvironment,\n config: AnalyticsConfig = {},\n adobeConfig: AdobeConfig,\n ) => {\n updateInteractionTime();\n analyticsConfig = config;\n AdobeHelper.initialize(adobeConfig, environment);\n },\n onSessionStart: () => {\n if (!lastInteractionTime || (Date.now() - lastInteractionTime > sessionTimeoutMs)) {\n lastInteractionTime = Date.now();\n AdobeHelper.sendEvent({ eventCode: 'event1' });\n sendEvent('onSessionStart');\n }\n },\n onInitializeSuccess: () => {\n updateInteractionTime();\n sendEvent('onInitializeSuccess');\n },\n onInitializeError: () => {\n updateInteractionTime();\n AdobeHelper.sendError(new InitializationError());\n sendEvent('onInitializeError');\n },\n onRequestWebcam: () => {\n updateInteractionTime();\n AdobeHelper.sendEvent({\n eventCode: 'event2' });\n sendEvent('onRequestWebcam');\n },\n onWebcamAllowed: () => {\n updateInteractionTime();\n AdobeHelper.sendEvent({\n eventCode: 'event3' });\n sendEvent('onWebcamAllowed');\n },\n onWebcamDenied: () => {\n updateInteractionTime();\n AdobeHelper.sendError(new WebcamRejectedError());\n sendEvent('onWebcamDenied');\n },\n onWebcamUnavailable: () => {\n updateInteractionTime();\n AdobeHelper.sendError(new WebcamUnavailableError());\n sendEvent('onWebcamUnavailable');\n },\n onMirrorWasmFailure: () => {\n updateInteractionTime();\n sendEvent('onMirrorWasmFailure');\n },\n onGlassesOn: () => {\n updateInteractionTime() ;\n sendEvent('onGlassesOn');\n },\n onGlassesOff: () => {\n updateInteractionTime();\n sendEvent('onGlassesOff');\n },\n onRender: (upc: string, lensName?: string) => {\n updateInteractionTime();\n const upcIdLens = upcLensName(upc, lensName);\n sendEvent('onRender', upcIdLens);\n },\n onRenderReady: (upc: string, lensName?: string) => {\n updateInteractionTime();\n const upcIdLens = upcLensName(upc, lensName);\n AdobeHelper.sendEvent({\n eventCode: (!!upcIdLens) ? `event4:${upcIdLens}` : 'event4',\n upc: upcIdLens,\n lensName: lensName\n });\n sendEvent('onRenderReady', upcIdLens);\n },\n onMirrorRenderFailure: (upc: string, lensName?: string) => {\n updateInteractionTime();\n const upcIdLens = upcLensName(upc, lensName);\n sendEvent('onMirrorRenderFailure', upcIdLens);\n },\n onFitGlasses: (upc: string, lensName?: string) => {\n updateInteractionTime();\n const upcIdLens = upcLensName(upc, lensName);\n AdobeHelper.sendEvent({\n eventCode: (!!upcIdLens) ? `event5:${upcIdLens}` : 'event5',\n upc: upcIdLens,\n lensName: lensName\n });\n sendEvent('onFitGlasses');\n },\n onAdjustGlasses: (upc: string, lensName?: string) => {\n updateInteractionTime();\n const upcIdLens = upcLensName(upc, lensName);\n AdobeHelper.sendEvent({\n eventCode: (!!upcIdLens) ? `event6:${upcIdLens}` : 'event6',\n upc: upcIdLens,\n lensName: lensName\n });\n sendEvent('onAdjustGlasses'); // TODO: should this have upc?\n },\n onCloseMirror: () => {\n updateInteractionTime();\n AdobeHelper.sendEvent({ eventCode: 'event7' });\n sendEvent('onCloseMirror');\n },\n onError: () => {\n updateInteractionTime();\n sendEvent('onError');\n },\n onScreenshot: (upc: string, lensName?: string) => {\n updateInteractionTime();\n const upcIdLens = upcLensName(upc, lensName);\n AdobeHelper.sendEvent({\n eventCode: (!!upcIdLens) ? `event9:${upcIdLens}` : 'event9',\n upc: upcIdLens,\n lensName: lensName\n });\n sendEvent('onScreenshot');\n },\n onGlassesRemovalStateChange: (info: GrAction) => {\n updateInteractionTime();\n sendEvent('onGlassesRemovalStateChange', info);\n }\n};\n\nconst upcLensName = (upc: string, lensName?: string) => {\n return (!!lensName) ? `${upc}_${lensName}` : upc;\n};\n\nexport {\n setSessionTimeout,\n AnalyticsHelper\n};\n","import ReactDOM from 'react-dom';\nimport { UnmountComponentError } from '../../errors/errors';\nimport { AdobeHelper } from '../../helpers/AdobeHelper';\nimport { AnalyticsHelper } from '../../helpers/AnalyticsHelper';\nimport { AppActions } from '../../reducers/appReducer';\nimport { createLogger, sendAppViewSession } from '../../remotelog/VmLogger';\nimport { VmStore } from '../VmCore';\n\nconst logger = createLogger('CloseMirror');\n\nconst resetLoadingStatus = () => {\n VmStore.dispatch(AppActions.setLoadingStatus({ type: 'WEBCAM_ACCESS', status: false }));\n VmStore.dispatch(AppActions.setLoadingStatus({ type: 'RENDERING', status: false }));\n VmStore.dispatch(AppActions.setLoadingStatus({ type: 'POSETRACKER', status: false }));\n};\n\n// we return a promise because it's easy to keep this backwards compatibility here\n// but sneaky on client code\nconst closeMirror = (target: string): Promise => {\n try {\n // reset all loading statuses, this will display the loading screen again on a new VM instance\n resetLoadingStatus();\n AnalyticsHelper.onCloseMirror();\n logger.debug('closing mirror for target div {}', target);\n const container = document.getElementById(target);\n\n if (ReactDOM.unmountComponentAtNode(container)) {\n logger.debug('closed mirror for target div {}', target);\n sendAppViewSession.close(target);\n\n } else {\n logger.debug('closing mirror for target div {} failed', target);\n sendAppViewSession.closeError(target);\n const unmountComponentError = new UnmountComponentError(target);\n AdobeHelper.sendError(unmountComponentError);\n return Promise.reject(unmountComponentError);\n }\n return Promise.resolve();\n } catch (e) {\n logger.debug('closing mirror for target div {} failed: {}', target, e.message);\n const unmountComponentError = new UnmountComponentError(target);\n try {\n AdobeHelper.sendError(unmountComponentError);\n } catch (e) {\n return Promise.reject(e);\n }\n return Promise.reject(unmountComponentError);\n }\n};\n\nexport {\n closeMirror\n};\n","import { MicroserviceEnvironment } from '@luxottica/vto-microservices';\nimport { AgreementType } from '../constants/AgreementType';\nimport { MissingTranslationError } from '../errors/errors';\nimport { PrivacyLocalization } from '../interfaces/PrivacyLocalization';\n\nconst localizationBaseUrl = 'https://d5nhc6q3o19l2.cloudfront.net';\n\nconst fetchBipaJson = (\n agreementType: AgreementType,\n environment: MicroserviceEnvironment,\n locale: string\n): Promise => {\n if (agreementType === AgreementType.BASIC) {\n const localizationFileUrl = `${localizationBaseUrl}/vmmv/v1/${bipaJsonEnv(environment)}/privacy/application_${locale}.json`;\n return fetch(localizationFileUrl).then((response) => {\n if (response.ok) {\n return response.json();\n } else {\n throw new MissingTranslationError(locale);\n }\n });\n\n } else {\n const localizationFileUrl = `${localizationBaseUrl}/frame-advisor/v2/${bipaJsonEnv(environment)}/privacy/privacy_${locale}.json`;\n return fetch(localizationFileUrl).then((response) => {\n if (response.ok) {\n return response.json() as PrivacyLocalization;\n } else {\n throw new MissingTranslationError(locale);\n }\n });\n }\n\n};\n\nconst bipaJsonEnv = (environment: MicroserviceEnvironment): 'dev' | 'prod' | 'test' => {\n switch (environment) {\n case 'STAGING':\n return 'dev';\n\n case 'PRODUCTION':\n return 'prod';\n\n case 'ACCEPTANCE':\n default:\n return 'test';\n }\n};\n\nexport {\n fetchBipaJson\n};\n","const Events = {\n PAUSE: 'vm_pause_event',\n RESUME: 'vm_resume_event',\n TOPIC_SCREENSHOT_REQ: 'TOPIC_SCREENSHOT_REQ',\n TOPIC_SCREENSHOT_RES: 'TOPIC_SCREENSHOT_RES',\n};\n\nexport {\n Events,\n};\n","import { GlScreenshot } from '@luxottica/vm-renderer-threejs';\nimport PubSub from 'pubsub-js';\nimport { Events } from '../../constants/Events';\nimport { FeatureUnavailableError } from '../../errors/errors';\nimport { AnalyticsHelper } from '../../helpers/AnalyticsHelper';\nimport { Features } from '../../interfaces/Features';\nimport { Screenshot } from '../../interfaces/Screenshot';\nimport { createLogger } from '../../remotelog/VmLogger';\nimport { FeatureLicensingService } from '../service/FeatureLicensingService';\nimport { VmStore } from '../VmCore';\n\nconst logger = createLogger('GetScreenshot');\n\nconst getScreenshot = (type = 'image/jpeg', quality = 0.9): Promise => {\n if (!FeatureLicensingService.isFeatureAuthorized(Features.VM_SCREENSHOT)) {\n return Promise.reject(new FeatureUnavailableError(Features.VM_SCREENSHOT));\n }\n \n let subscriber: (topicName: string, functionF: (mess: string, data: Screenshot) => void) => void;\n const promise = new Promise((resolve) => {\n subscriber = PubSub.subscribe(Events.TOPIC_SCREENSHOT_RES, (mess: string, data: GlScreenshot) => {\n AnalyticsHelper.onScreenshot(\n VmStore.getState().mirror.glasses.upc,\n VmStore.getState().mirror.mirrorOptions.transitionColor\n );\n logger.debug('message reveived from topic {}: total img bytes {}', mess, data.imgURI.length);\n resolve({ imgURI: data.imgURI, width: data.w, height: data.h });\n });\n logger.debug('subscription for {}: {}', Events.TOPIC_SCREENSHOT_RES, subscriber);\n });\n promise.then(() => {\n if (subscriber) {\n PubSub.unsubscribe(subscriber);\n logger.debug('unsubscribed for {}: {}', Events.TOPIC_SCREENSHOT_RES, subscriber);\n }\n });\n const isPublished = PubSub.publish(Events.TOPIC_SCREENSHOT_REQ, {type, quality});\n logger.debug('published screenshot request on {}: {}', Events.TOPIC_SCREENSHOT_REQ, isPublished);\n return promise;\n};\n\nexport {\n getScreenshot\n};\n","const defaultLocale = 'en-US';\nconst defaultLanguage = 'en';\n\nconst localeMap = {\n de: 'de-DE',\n en: 'en-US',\n es: 'es-ES',\n fr: 'fr-FR',\n it: 'it-IT',\n ja: 'ja-JP',\n ko: 'ko-KR',\n nl: 'nl-NL',\n pl: 'pl-PL',\n pt: 'pt-PT',\n sv: 'sv-SE',\n tr: 'tr-TR',\n zh: 'zh-CN',\n};\n\nconst localeRegionMap = {\n US: {\n en: 'en-US',\n },\n EU: {\n en: 'en-EU',\n },\n AU: {\n en: 'en-AU',\n }\n};\n\nconst getLocaleRegionFallback = (region: string, language: string) => {\n const localesMap = {\n ...localeMap,\n ...localeRegionMap[region],\n };\n const locale = localesMap[language] || localeRegionMap[region].en;\n return locale;\n};\n\ndeclare interface MirrorTranslation {\n GENERIC_ERROR: {\n ERROR: string,\n BUTTON: string,\n SUBTEXT: string\n };\n PERMISSION_ERROR: {\n ERROR: string,\n SUBTEXT: string,\n };\n WEBCAM_ERROR: {\n ERROR: string,\n SUBTEXT: string,\n };\n MANUAL_START: {\n BUTTON: string,\n TEXT: string,\n };\n GUIDANCE: {\n UNKNOWN: string,\n DEFAULT: string,\n MOVE_CLOSER: string,\n MOVE_FARTHER: string,\n STAY_STILL: string,\n LOOK_UP: string,\n LOOK_RIGHT: string,\n LOOK_DOWN: string,\n LOOK_LEFT: string,\n TILT_LEFT: string,\n TILT_RIGHT: string,\n GLASSES?: string,\n };\n UI: {\n FIT_ME_BETTER?: string,\n USE_TWO_FINGERS: string,\n TAP_TO_FREEZE: string,\n DESKTOP_TAP_TO_FREEZE: string\n };\n}\n\ndeclare interface Translation {\n MIRROR: MirrorTranslation;\n}\n\nconst defaultTranslations: Translation = {\n\tMIRROR: {\n GENERIC_ERROR: {\n BUTTON: 'Continue',\n ERROR: 'An error occured',\n SUBTEXT: 'Please check your camera permissions and try to reload the page.'\n },\n PERMISSION_ERROR: {\n ERROR: 'You must allow access to your camera to use Virtual Mirror.',\n SUBTEXT: 'Click on your browser Share or Allow button to enable your webcam.'\n },\n WEBCAM_ERROR: {\n ERROR: 'We could not detect your webcam.',\n SUBTEXT: 'Enable webcam access in your browser and refresh the page to continue.'\n },\n MANUAL_START: {\n BUTTON: 'Start the experience',\n TEXT: 'You are probably in Low Power Mode. The experience may be degraded.'\n },\n GUIDANCE: {\n DEFAULT: 'Place your head in the middle of the screen',\n GLASSES: 'Please remove your glasses',\n LOOK_DOWN: 'Look down',\n LOOK_LEFT: 'Look to your left',\n LOOK_RIGHT: 'Look to your right',\n LOOK_UP: 'Look up',\n MOVE_CLOSER: 'Move closer to the oval',\n MOVE_FARTHER: 'Move farther from the screen',\n STAY_STILL: 'Good, stay still while fitting glasses',\n TILT_LEFT: 'Tilt to your left',\n TILT_RIGHT: 'Tilt to your right',\n UNKNOWN: 'Is anyone there?'\n },\n UI: {\n DESKTOP_TAP_TO_FREEZE: 'Hold to freeze the screen or drag the pointer along the nose to adjust the frames',\n FIT_ME_BETTER: 'Fit me better',\n TAP_TO_FREEZE: 'Tap and hold to freeze the screen',\n USE_TWO_FINGERS: 'Use two fingers to adjust on the nose'\n },\n\t}\n};\n\nconst LocalizationDefaults = {\n locale: defaultLocale,\n language: defaultLanguage,\n translations: defaultTranslations,\n};\n\nexport {\n LocalizationDefaults,\n Translation,\n MirrorTranslation,\n getLocaleRegionFallback\n};\n","import { DefaultPrivacyLocalization } from '../constants/DefaultPrivacyLocalization';\nimport { PrivacyLocalization, PrivacyLocalizationKey } from '../interfaces/PrivacyLocalization';\n\nlet currentLocalizationText: PrivacyLocalization;\n\nconst LocalizationHelper = {\n setText: (localizationText: PrivacyLocalization): void => {\n currentLocalizationText = {\n ...currentLocalizationText,\n ...DefaultPrivacyLocalization,\n ...localizationText\n };\n },\n\n getText: (key: PrivacyLocalizationKey): string => {\n return (!!currentLocalizationText[key]) ? currentLocalizationText[key] : '';\n }\n};\n\nexport {\n LocalizationHelper\n};","import { DeviceDetection } from '@luxottica/vm-devicedetection';\nimport { SupportedFeatures } from '../interfaces/SupportedFeatures';\nimport { AnalyticsHelper } from './AnalyticsHelper';\n\nexport class SupportedFeaturesHelper {\n public static getSupportedFeatures() {\n return new Promise((resolve, reject) => {\n const devicedetection = new DeviceDetection();\n return devicedetection.isVideoInputDeviceAvailable().then((available) => {\n if (!available) {\n AnalyticsHelper.onWebcamUnavailable();\n }\n resolve({\n wasmSupport: devicedetection.isWebAssemblySupported(),\n webcamAccess: devicedetection.isUserMediaSupported(),\n webcamAvailable: available,\n webglRendering: devicedetection.isWebGlSupported(),\n isWebView: devicedetection.isWebView(),\n });\n }).catch((error) => {\n reject(error);\n });\n });\n }\n}\n","import { VtoError } from '../errors/errors';\nimport { InitializationOptions } from '../interfaces/InitializationTypes';\nimport { SupportedFeatures } from '../interfaces/SupportedFeatures';\nimport { LocalizationHelper } from './LocalizationHelper';\nimport { SupportedFeaturesHelper } from './SupportedFeaturesHelper';\n\nexport class InitializationHelper {\n\n public static initialize(\n initOptions: InitializationOptions,\n privacyOptions: PrivacyOptions\n ): Promise<{\n userStore: UserStoreState,\n supportedFeatures: SupportedFeatures\n }> {\n return Promise.all([\n LocalizationHelper.initializeRemote(\n initOptions.environment,\n initOptions.locale,\n privacyOptions.region,\n privacyOptions.bipaActive),\n SupportedFeaturesHelper.getSupportedFeatures()\n ]).then((result) => {\n return {\n userStore: {\n locale: result[0],\n region: privacyOptions.region,\n source: privacyOptions.source,\n brand: initOptions.brand,\n storeId: initOptions.storeId,\n channel: initOptions.channel,\n },\n supportedFeatures: result[1]\n };\n }).catch((error: VtoError) => {\n throw error;\n });\n }\n}\n","class FpsCounter {\n private fpsQueue: number[];\n private processStartTime: number;\n public static fpsQueueLength = 30;\n\n constructor() {\n this.fpsQueue = new Array(FpsCounter.fpsQueueLength).fill(0);\n }\n\n public get fps() {\n return this.fpsQueue.reduce((sum, value) => sum + value) / this.fpsQueue.length;\n }\n\n private static calcFps(t0, t1): number {\n return (!(t0 && t1)) ? 0 : 1 / ((t1 - t0) / 1000);\n }\n\n public tick() {\n this.fpsQueue.shift();\n this.fpsQueue.push(FpsCounter.calcFps(this.processStartTime, performance.now()));\n this.processStartTime = performance.now();\n }\n}\n\nexport { FpsCounter };\n","import type { VtoServerEnvironment } from '@luxottica/vm-vtoserver-client';\nimport type { AssetEnvironmentOptions, EnvironmentName } from '../interfaces/MirrorOptions';\n\nconst DefaultAssetEnvironmentOptions: AssetEnvironmentOptions = {\n glasses: 'PROD' as EnvironmentName,\n video: 'PRODUCTION' as VtoServerEnvironment,\n};\n\nexport { DefaultAssetEnvironmentOptions };\n","import { AssetResolution, GlassesEnvironment } from '@luxottica/vm-glasses';\nimport { TrackingOptions } from '@luxottica/vm-posetracker-faceweb';\nimport { GlRenderDebugOptions } from '@luxottica/vm-renderer-threejs';\nimport { VtoServerEnvironment } from '@luxottica/vm-vtoserver-client';\n\ninterface MirrorOptions {\n width?: number;\n height?: number;\n transitionColor?: string;\n videoResolution?: number;\n glassesResolution?: AssetResolution;\n device?: DeviceOptions;\n nosePosition?: NosePositionOptions;\n rendering?: RenderingOptions;\n plugins?: PluginOptions;\n tracking?: TrackingOptions;\n fittingModel?: MeshOptions;\n environment?: AssetEnvironmentOptions;\n}\n\ninterface MirrorInternalOptions extends Required {\n glassesType: GlassesType;\n}\n\ninterface DeviceOptions {\n evaluationThreshold: number;\n}\n\ninterface MeshOptions {\n videoId?: string;\n pupillaryDistance?: number;\n}\n\ninterface VmPluginDescriptor {\n pluginId: string;\n pluginOptions: any; \n}\n\ninterface AssetEnvironmentOptions {\n glasses?: GlassesEnvironment;\n video?: VtoServerEnvironment;\n}\n\ninterface NosePositionOptions {\n enabled: boolean;\n touches?: number;\n}\n\nenum RevealFX {\n OFF = 'OFF',\n STANDARD = 'STANDARD',\n}\n\ninterface RenderingOptions {\n debug: GlRenderDebugOptions;\n revealFX?: RevealFX;\n}\n\ninterface PluginOptions {\n debug?: boolean;\n stopGlassesDetectionAfterMs?: number;\n}\n\nexport {\n AssetEnvironmentOptions,\n MirrorOptions,\n RenderingOptions,\n PluginOptions,\n MeshOptions,\n NosePositionOptions,\n GlassesEnvironment as EnvironmentName,\n RevealFX,\n MirrorInternalOptions,\n VmPluginDescriptor,\n};\n","import { PrivacyOptions } from '../interfaces/InitializationTypes';\n\nexport const DefaultPrivacyOptions: PrivacyOptions = {\n bipaActive: false,\n region: undefined,\n source: undefined,\n privacyPolicy: undefined,\n termsAndConditions: undefined,\n bipaPrefill: {\n firstName: undefined,\n lastName: undefined,\n email: undefined,\n },\n localizationText: undefined,\n};\n","import { RenderingOptions, RevealFX } from '../interfaces/MirrorOptions';\n\nconst DefaultRenderingOptions: RenderingOptions = {\n revealFX: RevealFX.OFF,\n debug: {\n checkError: false,\n hideGlasses: false,\n showMesh: false,\n meshColor: [0, 1, 0, 0.5],\n }\n};\n\nexport { DefaultRenderingOptions };\n","const DefaultTrackingOptions: TrackingOptions = {\n debug: false,\n inspect: false,\n recoveryLimit: 1,\n areaSize: 1,\n areaOffset: [0, 0],\n depthRange: [100, 2000],\n axisRange: [7, 50, 7],\n fittedPointsRatio: 0.25,\n fov: 52.0,\n minimumFaceSizeRatio: 0.3,\n edgeDetectionPercentage: [0.15, 0.1, 0.1, 0.1], // top, right, bottom, left\n standstill: {\n timeLimit: 1500,\n positionVariance: 50,\n axisVariance: 8,\n depthRange: [150, 500]\n },\n onPoseTrack: () => { return; },\n};\n\nexport { DefaultTrackingOptions };\n","import { BipaFormData } from '../interfaces/BipaFormData';\nimport { FieldError } from '../interfaces/FieldError';\n\nconst NOT_BLANK = 'NotBlank';\nconst SIZE = 'Size';\nconst PATTERN = 'Pattern';\n\nconst EMAIL_REGEX = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n\nconst createFieldError = (field: string, message: string): FieldError => { return { objectName: 'bipaConsentPublic', field, message }; };\n\nconst ParameterHelper = {\n validateBipaForm: (bipaForm: BipaFormData): FieldError[] => {\n const fieldErrors: FieldError[] = [];\n\n if (!bipaForm?.firstName) { \n fieldErrors.push(createFieldError('firstName', NOT_BLANK));\n } else if (!!bipaForm?.firstName && bipaForm.firstName.trim().length < 2) {\n fieldErrors.push(createFieldError('firstName', SIZE));\n }\n\n if (!bipaForm?.lastName) { \n fieldErrors.push(createFieldError('lastName', NOT_BLANK));\n } else if (!!bipaForm?.lastName && bipaForm.lastName.trim().length < 2) {\n fieldErrors.push(createFieldError('lastName', SIZE));\n }\n\n if (!bipaForm?.email) { \n fieldErrors.push(createFieldError('email', NOT_BLANK));\n } else if (!!bipaForm?.email && bipaForm.email.trim().length < 2) {\n fieldErrors.push(createFieldError('email', SIZE));\n } else if (!!bipaForm?.email && !bipaForm.email.trim().match(EMAIL_REGEX)) {\n fieldErrors.push(createFieldError('email', PATTERN));\n }\n\n return fieldErrors;\n }\n};\n\nexport {\n ParameterHelper\n};\n","import { FeatureUnavailableError } from '../../errors/errors';\nimport { AnalyticsHelper, setSessionTimeout } from '../../helpers/AnalyticsHelper';\nimport { setCallbacks, setPrivacyCallbacks } from '../../helpers/CallbackHelper';\nimport { InitializationHelper } from '../../helpers/InitializationHelper';\nimport { ParameterHelper } from '../../helpers/ParameterHelper';\nimport { Features } from '../../interfaces/Features';\nimport { InitializationParams, InitializationReturns } from '../../interfaces/InitializationTypes';\nimport { AppActions } from '../../reducers/appReducer';\nimport { UserActions } from '../../reducers/userReducer';\nimport { createLogger, sendAppViewSession, sendError } from '../../remotelog/VmLogger';\nimport { FeatureLicensingService } from '../service/FeatureLicensingService';\nimport { configureVmStore, VmStore } from '../VmCore';\nimport { warmUp } from './WarmUp';\n\nconst logger = createLogger('Initialize');\n\nlet errorListenerAdded = false;\n\nconst initialize = (params: InitializationParams): Promise => {\n\n if (!params.options.environment) {\n params.options.environment = 'PRODUCTION';\n }\n\n if (!errorListenerAdded) {\n window.addEventListener('error', (event) => { sendError(event.error); });\n errorListenerAdded = true;\n }\n\n return FeatureLicensingService.initialize(\n params.options.key,\n params.options.environment\n ).then(() => {\n\n const validatedParams = ParameterHelper.mergeInitializationParams(params);\n if (validatedParams.privacy.bipaActive && !FeatureLicensingService.isFeatureAuthorized(Features.VM_BIPA)) {\n throw new FeatureUnavailableError(Features.VM_BIPA);\n }\n\n const options = validatedParams.options;\n\n AnalyticsHelper.initialize(\n options.environment,\n options.analyticsConfig, {\n brand: options.brand,\n channel: options.channel,\n locale: options.locale,\n storeId: options.storeId,\n storeRegion: options.storeRegion,\n storeCompany: options.storeCompany,\n globalStoreId: options.globalStoreId,\n }\n );\n setSessionTimeout(options.sessionTimeout);\n\n logger.debug('initializing virtual mirror [channel={},brand={},locale={},storeId={}]',\n options.channel, options.brand, options.locale, options.storeId);\n\n return Promise.all([\n InitializationHelper.initialize(validatedParams.options, validatedParams.privacy),\n Promise.resolve(options)\n ]);\n\n }).then((initReturn) => {\n if (VmStore === undefined) {\n configureVmStore();\n }\n\n setCallbacks(params.options.callbacks);\n setPrivacyCallbacks(params.privacyCallbacks);\n\n const userStore = initReturn[0].userStore;\n const supportedFeatures = initReturn[0].supportedFeatures;\n const options = initReturn[1];\n\n if (options.environment !== VmStore.getState().app.environment) {\n VmStore.dispatch(AppActions.resetAuth());\n }\n\n VmStore.dispatch(AppActions.setAuth({ accessToken: params.auth?.accessToken, refreshToken: params.auth?.accessToken }));\n VmStore.dispatch(AppActions.setEnvironment(options.environment));\n VmStore.dispatch(AppActions.setPrivacyOptions(params.privacy));\n VmStore.dispatch(AppActions.setLoadingStatus({ type: 'INITIALIZATION', status: true }));\n VmStore.dispatch(UserActions.setUser(userStore));\n\n logger.info('virtual mirror initialized with options {}', JSON.stringify(options));\n AnalyticsHelper.onInitializeSuccess();\n sendAppViewSession.initialize(options);\n\n // warm up the posetracker\n warmUp(options.environment, options.key);\n return {\n userId: undefined,\n locale: userStore.locale,\n supportedFeatures: supportedFeatures,\n };\n\n }).catch((e) => {\n logger.error('virtual mirror initialization failed with options {} [{}]', JSON.stringify(params.options), JSON.stringify(e));\n AnalyticsHelper.onInitializeError();\n sendAppViewSession.initializeError(params.options);\n throw e;\n });\n};\n\nexport {\n initialize\n};\n","import { DeviceDetection } from '@luxottica/vm-devicedetection';\nimport { WebCam, WebCamStream } from '@luxottica/vm-webcam';\nimport { createLogger } from '../../remotelog/VmLogger';\n\nconst logger = createLogger('VmWebCam');\n\nexport class VmWebCam {\n private webCam: WebCam;\n private webCamStream: WebCamStream;\n private static instance: VmWebCam;\n\n constructor() {\n this.webCam = new WebCam();\n }\n\n public static getInstance() {\n if (!VmWebCam.instance) {\n VmWebCam.instance = new VmWebCam();\n }\n return VmWebCam.instance;\n }\n\n public tryToOpenWebCam(w, h) {\n return this.webCam.tryToOpenWebCam(w, h, 'user');\n }\n\n public initStreamObject(options, stream) {\n this.webCamStream = this.createStreamObject(options, stream);\n }\n\n public closeCurrentMediaStream() {\n this.webCam.closeCurrentMediaStream();\n }\n\n public pause() {\n const deviceDetection = new DeviceDetection();\n if (!this.webCamStream.isNativeStream() && deviceDetection.isAppleiOS13()) {\n logger.warn('Can\\'t pause Webcam on iOS 13 device due a bug that would freeze video stream on resume playing');\n return;\n }\n this.webCamStream.streamObject.pause();\n }\n\n public play() {\n return this.webCamStream.streamObject.play();\n }\n\n public get stream() {\n return this.webCamStream;\n }\n\n private createStreamObject(options, stream) {\n return this.webCam.createStreamObject(options, stream);\n }\n}\n","import { EventBus } from '@luxottica/vm-eventbus';\nimport { Events } from '../../constants/Events';\nimport { VmWebCam } from '../mirror/VmWebCam';\nimport { vmIsInitialized } from '../VmCore';\n\nconst pause = (): void => {\n if (!vmIsInitialized()) {\n return;\n } else {\n VmWebCam.getInstance().pause();\n EventBus.publish(Events.PAUSE, {});\n }\n};\n\nexport {\n pause\n};\n","import { Catalog, CatalogConfiguration, GlassesEnvironment, UpcAvailability } from '@luxottica/vm-glasses';\nimport { DefaultAssetEnvironmentOptions } from '../../constants/DefaultEnvironmentOptions';\nimport { DefaultTrackingOptions } from '../../constants/DefaultTrackingOptions';\nimport { MountComponentError, NotInitializedError, UpcMissingError } from '../../errors/errors';\nimport { AdobeHelper } from '../../helpers/AdobeHelper';\nimport { AnalyticsHelper } from '../../helpers/AnalyticsHelper';\nimport { ParameterHelper } from '../../helpers/ParameterHelper';\nimport { MirrorInternalOptions } from '../../interfaces/MirrorOptions';\nimport { RenderMirrorParams } from '../../interfaces/RenderingTypes';\nimport { MirrorActions } from '../../reducers/mirrorReducer';\nimport { createLogger, sendAppViewSession } from '../../remotelog/VmLogger';\nimport { vmIsInitialized, VmStore } from '../VmCore';\nimport { TransitionColorHelper } from '../../helpers/TransitionColorHelper';\nimport { FeatureLicensingService } from '../service/FeatureLicensingService';\n\nconst logger = createLogger('RenderMirror');\n\nconst getUpcAvailability = (\n glassesConfig: CatalogConfiguration,\n upc: string\n): Promise => {\n return Catalog.getUpcAvailability(glassesConfig, upc);\n};\n\nconst isDistributorEnv = (glassesEnvironment: GlassesEnvironment): boolean => {\n return glassesEnvironment === GlassesEnvironment.DISTRIBUTOR_APPROVATION_PRODUCTION ||\n glassesEnvironment === GlassesEnvironment.DISTRIBUTOR_APPROVATION_STAGING ||\n glassesEnvironment === GlassesEnvironment.DISTRIBUTOR_VALIDATION_PRODUCTION ||\n glassesEnvironment === GlassesEnvironment.DISTRIBUTOR_VALIDATION_STAGING;\n};\n\nconst renderMirror = (\n params: RenderMirrorParams\n): Promise => {\n if (!vmIsInitialized()) {\n return Promise.reject(new NotInitializedError());\n }\n\n const { target, upc, options } = params;\n\n AnalyticsHelper.onSessionStart();\n\n // ALWAYS USE THIS OBJECT TO ACCESS GLASSES'S ENVIRONMENT NAME\n const glassesConfig: CatalogConfiguration = {\n // IMPORTANT\n // This toUpperCase has been added to quick go in production on Jun 27th 2022 on Oakley configurator\n // The configutator wrongly return lowercase environments and now is too late to release a client side fix\n env: (!!options?.environment?.glasses) ? options.environment.glasses.toUpperCase() as GlassesEnvironment : DefaultAssetEnvironmentOptions.glasses\n };\n\n return Promise.all([\n getUpcAvailability(glassesConfig, upc),\n // get new colors if the user is trying to render transitions lenses, trust the helper for the cache\n !!options && options.transitionColor && TransitionColorHelper.downloadTransitionColors({\n key: FeatureLicensingService.getKey(),\n env: glassesConfig.env\n })\n ]).then((result) => {\n const upcAvailability: UpcAvailability = result[0];\n // TODO: improve glasses type management\n const glassesType: GlassesType = upcAvailability.glassesType; // (options.glassesType) ? options.glassesType : 'B3D';\n const mergedOptions = ParameterHelper.mergeMirrorOptions(target, glassesType, options);\n \n // TODO: leave for mock env\n if (glassesConfig.env === GlassesEnvironment.MOCK) {\n logger.debug('rendering virtual mirror for upc {} on target {}', upc, target);\n sendAppViewSession.upc(upc);\n \n return renderMirrorPromise(target, upcAvailability, mergedOptions);\n\n } else {\n if (glassesType === 'B3D' && (upcAvailability.available[256] || upcAvailability.available[512] || isDistributorEnv(glassesConfig.env))\n || glassesType === 'GLTF' && (!!upcAvailability.lods.includes(1) || !!upcAvailability.lods.includes(2))) {\n logger.debug('rendering virtual mirror for upc {} on target {}', upc, target);\n sendAppViewSession.upc(upc);\n \n return renderMirrorPromise(target, upcAvailability, mergedOptions);\n \n } else {\n logger.warn('rendering virtual mirror not possible: upc {} isn\\'t supported', upc);\n sendAppViewSession.upcError(upc);\n const upcMissingError = new UpcMissingError(upc);\n AdobeHelper.sendError(upcMissingError, upc);\n throw upcMissingError;\n }\n }\n });\n};\n\nconst renderMirrorPromise = (\n target: string,\n upcAvailability: UpcAvailability,\n mirrorOptions: Required\n): Promise => {\n\n return new Promise((resolve, reject) => {\n import(/* webpackChunkName: \"MirrorAsyncRoot\" */ '../mirror/MirrorAsyncRoot')\n .then(({ MirrorAsyncRoot: MirrorAsyncRoot }) => {\n VmStore.dispatch(MirrorActions.setMirrorOptions(mirrorOptions));\n \n logger.debug('vm default tracking options: {}', JSON.stringify(DefaultTrackingOptions));\n logger.debug('vm mirror options: {}', JSON.stringify(mirrorOptions));\n logger.debug('mounting render mirror component on div {}', target);\n \n try {\n const container = document.getElementById(target);\n if (container) {\n MirrorAsyncRoot.mountMirror(\n container,\n VmStore,\n upcAvailability,\n resolve,\n reject,\n mirrorOptions);\n } else {\n const mountComponentError = new MountComponentError(target);\n AdobeHelper.sendError(mountComponentError);\n reject(mountComponentError);\n }\n } catch (e) {\n const mountComponentError = new MountComponentError(target);\n AdobeHelper.sendError(mountComponentError);\n reject(mountComponentError);\n }\n }).catch((e) => {\n logger.error(e);\n const mountComponentError = new MountComponentError(target);\n AdobeHelper.sendError(mountComponentError);\n reject(mountComponentError);\n });\n });\n};\n\nexport {\n renderMirror,\n};\n","import { EventBus } from '@luxottica/vm-eventbus';\nimport { Events } from '../../constants/Events';\nimport { NotInitializedError } from '../../errors/errors';\nimport { createLogger } from '../../remotelog/VmLogger';\nimport { VmWebCam } from '../mirror/VmWebCam';\nimport { vmIsInitialized } from '../VmCore';\n\nconst logger = createLogger('Resume');\n\nconst resume = (): Promise => {\n if (!vmIsInitialized()) {\n return Promise.reject(new NotInitializedError());\n } else {\n return VmWebCam.getInstance().play().then(() => {\n EventBus.publish(Events.RESUME, {});\n }).catch((e) => {\n logger.error(e);\n });\n }\n};\n\nexport {\n resume\n};\n","import { TransitionColorHelper } from '../../helpers/TransitionColorHelper';\nimport { createLogger } from '../../remotelog/VmLogger';\n\nconst logger = createLogger('SetTransitionOverrideColor');\n\nconst setTransitionOverrideColor = (transitionColor: TransitionLens): void => {\n logger.debug('setting new override color', transitionColor);\n TransitionColorHelper.setTransitionOverrideColor(transitionColor);\n};\n\nexport {\n setTransitionOverrideColor\n};\n","import { Catalog, CatalogConfiguration, GlassesEnvironment, UpcAvailability } from '@luxottica/vm-glasses';\nimport { MicroserviceEnvironment } from '@luxottica/vto-microservices';\nimport { FeatureLicensingService } from './app/service/FeatureLicensingService';\nimport { Features } from './interfaces/Features';\n\nclass Catalogue {\n\n private static config: CatalogConfiguration;\n\n private static featureLicensingInitialization;\n\n private constructor(env: GlassesEnvironment) {\n Catalogue.config = { env };\n }\n public static build(\n {catalogueEnvironment, featureLicensingEnv, key}:\n {\n catalogueEnvironment?: GlassesEnvironment,\n featureLicensingEnv?: MicroserviceEnvironment\n key: string\n }): Catalogue {\n\n this.featureLicensingInitialization = FeatureLicensingService.initialize(key, !!featureLicensingEnv ? featureLicensingEnv : 'PRODUCTION');\n\n return new Catalogue(!!catalogueEnvironment ? catalogueEnvironment : 'PROD' as GlassesEnvironment);\n }\n\n /**\n * Please do not use this method, use isUpcSupportedImproved() instead\n * @param upcs \n * @returns \n */\n public isUpcSupported(...upcs: string[]): { [upc: string]: Promise; } {\n const result: { [upc: string]: Promise; } = {};\n upcs.forEach(upc => {\n result[upc] = Catalog.getUpcAvailability(Catalogue.config, upc);\n });\n\n return result;\n }\n\n /**\n * This method optimise the network calls\n * @param upcs a spreaded array with all the upcs you want to check\n * @returns \n * \n * @example const catalogueUpcs = await VirtualMirrorCatalogue.build({\n key: 'YOUR-LICENSING-KEY',\n }).isUpcSupportedImproved(...upcs)\n \n console.log(catalogueUpcs[0].getUpc())\n console.log(catalogueUpcs[0].isTransition())\n console.log(catalogueUpcs[0].isAvailable())\n */\n public isUpcSupportedImproved(...upcs: string[]): Promise {\n return Catalog.getMultipleUpcAvailability(Catalogue.config, ...upcs);\n }\n\n public downloadTransitionColorCatalogue(): Promise<{\n [name: string]: TransitionLens;\n }> {\n return Catalogue.featureLicensingInitialization\n .then(() => {\n if (FeatureLicensingService.isFeatureAuthorized(Features.VM_TRANSITIONS)) {\n return Catalog.downloadTransitionLenses(Catalogue.config);\n } else {\n return Promise.resolve({});\n }\n });\n }\n}\n\nexport { Catalogue, UpcAvailability };\n","import { AgreementType, BipaFormData, BipaManager, BipaPage, PrivacyLocalization, PrivacyLocalizationKey } from '@luxottica/bipa-manager';\nimport { MicroserviceEnvironment } from '@luxottica/vto-microservices';\nimport { GlassesEnvironment, UpcAvailability, TransitionLens, TransitionLensState, TransitionLensStep, TransitionLensType } from '@luxottica/vm-glasses';\nimport { version } from '../package.json';\nimport { warmUp } from './app/functions/WarmUp';\nimport { animateOpacity } from './app/functions/AnimateOpacity';\nimport { isBrowserSupported } from './app/functions/IsBrowserSupported';\nimport { closeMirror } from './app/functions/CloseMirror';\nimport { getBipaVersion, GetBipaVersionResponse } from './app/functions/GetBipaVersion';\nimport { getScreenshot } from './app/functions/GetScreenshot';\nimport { initialize } from './app/functions/Initialize';\nimport { pause } from './app/functions/Pause';\nimport { renderMirror } from './app/functions/RenderMirror';\nimport { resume } from './app/functions/Resume';\nimport { saveBipaEntry, SaveBipaEntryParams } from './app/functions/SaveBipaEntry';\nimport { setTransitionOpacity } from './app/functions/SetTransitionOpacity';\nimport { setTransitionOverrideColor } from './app/functions/SetTransitionOverrideColor';\nimport { Catalogue } from './Catalogue';\nimport { performanceEvents } from './constants/DOMEvents';\nimport { UpcMissingError, UpcSupportedError, VtoError } from './errors/errors';\nimport { MirrorTranslation } from './helpers/LocalizationDefaults';\nimport { LocalizationHelper } from './helpers/LocalizationHelper';\nimport { DeepPartial } from './interfaces/DeepPartial';\nimport { InitializationOptions, InitializationParams, InitializationReturns, PrivacyOptions } from './interfaces/InitializationTypes';\nimport { AnimateOpacityParams, RenderMirrorParams, SetTransitionOpacityParams } from './interfaces/RenderingTypes';\nimport { Screenshot } from './interfaces/Screenshot';\nimport { SupportedFeatures } from './interfaces/SupportedFeatures';\n\nconst VirtualMirror = {\n\n plugins: undefined,\n\n version(): string {\n return 'v' + version;\n },\n\n /**\n * This method can be used to download and load in memory heavy parts of VM libraries, like for example the pose estimation webassembly\n * It does not return a promise even if internally it will produce some network calls.\n * You can call this method when your page is ready for the interactions.\n * \n * This method is also called internally by VirtualMirror.initialize()\n * \n * @param environment 'STAGING' | 'ACCEPTANCE' | 'PRODUCTION' - defaults to 'PRODUCTION'\n * @param key the license key, if you pass the license key here VM will try to warm up those components that usually are licensed\n */\n warmUp(environment?: MicroserviceEnvironment, key?: string): void {\n warmUp(environment, key);\n },\n\n initialize(params: InitializationParams): Promise {\n return initialize(params);\n },\n\n overrideLocalization(translation: DeepPartial): void {\n return LocalizationHelper.setOverrides(translation);\n },\n\n getMirrorDefaultLocalization(): MirrorTranslation {\n return LocalizationHelper.getDefaults();\n },\n\n // ***\n // BIPA FUNCTIONS\n // ***\n\n getBipaVersion(): Promise {\n return getBipaVersion();\n },\n\n saveBipaEntry(params: SaveBipaEntryParams): Promise {\n return saveBipaEntry(params);\n },\n\n resetBipaState(): void {\n document.cookie = `${BipaManager.getCookieName(AgreementType.BASIC)}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;\n document.cookie = `${BipaManager.getCookieName(AgreementType.BIOMETRIC)}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;\n },\n\n // ***\n // RENDER FUNCTIONS\n // ***\n\n renderMirror(params: RenderMirrorParams): Promise {\n return renderMirror(params);\n },\n\n pause(): void {\n return pause();\n },\n\n resume(): Promise {\n return resume();\n },\n\n /**\n * @deprecated The method should not be used and will be removed in the next major version 10.0.0\n */\n fitMeBetter(): Promise {\n console.error('Virtual Mirror does not expose Fit Me Better anymore. Please consider remove any reference to this method');\n return Promise.resolve();\n },\n\n getScreenshot(type = 'image/jpeg', quality = 0.9): Promise {\n return getScreenshot(type, quality);\n },\n\n setTransitionOpacity(params: SetTransitionOpacityParams): void {\n return setTransitionOpacity(params?.opacity);\n },\n\n setTransitionOverrideColor(TransitionLens: TransitionLens): void {\n return setTransitionOverrideColor(TransitionLens);\n },\n\n animateOpacity(params: AnimateOpacityParams = { duration: 1000 }): void {\n return animateOpacity(params?.duration);\n },\n\n closeMirror(params: { target: string }): Promise {\n return closeMirror(params?.target);\n },\n\n getPlugins() {\n if (!this.plugins) {\n return import('./app/functions/Plugins').then((plugins) => {\n this.plugins = plugins;\n return plugins;\n });\n }\n\n return Promise.resolve(this.plugins);\n },\n\n getPluginStatus(): Promise<{\n pluginId: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pluginOptions: any;\n }[]> {\n return this.getPlugins().then(({ PluginManager }) => {\n return PluginManager.getStatus();\n });\n },\n\n addPlugin(pluginId: string, pluginOptions?: any) {\n return this.getPlugins().then(({ PluginManager }) => {\n PluginManager.add({ pluginId, pluginOptions });\n });\n },\n\n removePlugin(pluginId: string) {\n return this.getPlugins().then(({ PluginManager }) => {\n PluginManager.remove(pluginId);\n });\n },\n\n /**\n * Check if your browser supports all the minimum technology to run Virtual Mirror\n * \n * @returns \n */\n isBrowserSupported(): Promise {\n return isBrowserSupported();\n },\n};\n\nexport {\n VirtualMirror,\n RenderMirrorParams,\n Catalogue as VirtualMirrorCatalogue,\n GlassesEnvironment,\n MicroserviceEnvironment,\n UpcAvailability,\n VtoError,\n VtoError as VmAbstractError,\n UpcMissingError,\n UpcSupportedError,\n Screenshot,\n SupportedFeatures,\n InitializationParams,\n InitializationOptions,\n InitializationReturns,\n PrivacyOptions,\n BipaPage,\n BipaFormData,\n PrivacyLocalization,\n PrivacyLocalizationKey,\n TransitionLens,\n TransitionLensType,\n TransitionLensState,\n TransitionLensStep,\n performanceEvents\n};\n","import { BipaManager } from '@luxottica/bipa-manager';\nimport { FeatureUnavailableError, NotInitializedError } from '../../errors/errors';\nimport { CallbackHelper } from '../../helpers/CallbackHelper';\nimport { RequestHelper } from '../../helpers/RequestHelper';\nimport { Features } from '../../interfaces/Features';\nimport { FeatureLicensingService } from '../service/FeatureLicensingService';\nimport { vmIsInitialized, VmStore } from '../VmCore';\n\ninterface GetBipaVersionResponse {\n version: number;\n description: string;\n text: string;\n}\n\nconst getBipaVersion = (): Promise => {\n if (!vmIsInitialized()) {\n return Promise.reject(new NotInitializedError());\n }\n\n if (!FeatureLicensingService.isFeatureAuthorized(Features.VM_GET_BIPA_VERSION)) {\n return Promise.reject(new FeatureUnavailableError(Features.VM_GET_BIPA_VERSION));\n }\n\n return RequestHelper.login(\n VmStore.getState().app.environment\n ).then(() => {\n return BipaManager.getBipaVersion({\n environment: VmStore.getState().app.environment,\n locale: VmStore.getState().user.locale,\n accessToken: VmStore.getState().app.auth.accessToken,\n refreshToken: VmStore.getState().app.auth.refreshToken,\n onAuthUpdated: CallbackHelper.onAuthUpdated\n });\n });\n};\n\nexport {\n getBipaVersion,\n GetBipaVersionResponse\n};\n","import { BipaManager } from '@luxottica/bipa-manager';\nimport { FeatureUnavailableError, NotInitializedError } from '../../errors/errors';\nimport { CallbackHelper } from '../../helpers/CallbackHelper';\nimport { RequestHelper } from '../../helpers/RequestHelper';\nimport { Features } from '../../interfaces/Features';\nimport { FeatureLicensingService } from '../service/FeatureLicensingService';\nimport { vmIsInitialized, VmStore } from '../VmCore';\n\ninterface SaveBipaEntryParams {\n firstName: string;\n lastName: string;\n email: string;\n bipaVersion: number;\n}\n\nconst saveBipaEntry = (\n params: SaveBipaEntryParams\n): Promise => {\n if (!vmIsInitialized()) {\n return Promise.reject(new NotInitializedError());\n }\n\n if (!FeatureLicensingService.isFeatureAuthorized(Features.VM_SAVE_BIPA_ENTRY)) {\n return Promise.reject(new FeatureUnavailableError(Features.VM_SAVE_BIPA_ENTRY));\n }\n\n return RequestHelper.login(\n VmStore.getState().app.environment\n ).then(() => {\n return BipaManager.saveBipaEntry({\n environment: VmStore.getState().app.environment,\n source: VmStore.getState().app.privacy.source,\n accessToken: VmStore.getState().app.auth.accessToken,\n refreshToken: VmStore.getState().app.auth.refreshToken,\n bipaVersion: params.bipaVersion,\n formData: {\n firstName: params.firstName,\n lastName: params.lastName,\n email: params.email\n },\n onAuthUpdated: CallbackHelper.onAuthUpdated\n });\n });\n};\n\nexport {\n saveBipaEntry,\n SaveBipaEntryParams\n};\n","import { NotInitializedError, OpacityError } from '../../errors/errors';\nimport { TransitionColorHelper } from '../../helpers/TransitionColorHelper';\nimport { vmIsInitialized } from '../VmCore';\n\nconst setTransitionOpacity = (opacity = 0): void => {\n if (!vmIsInitialized()) {\n throw new NotInitializedError();\n }\n \n if (opacity !== undefined) {\n if (typeof opacity !== 'number' || opacity < 0 || opacity > 1) {\n const error = new OpacityError('opacity must be a number between 0 and 1');\n throw error;\n }\n TransitionColorHelper.setCurrentLensOpacity(opacity);\n\n } else {\n const error = new OpacityError('opacity cannot be set when mirror is not initialized');\n throw error;\n }\n};\n\nexport {\n setTransitionOpacity\n};\n","export const isBrowserSupported: () => Promise = () => {\n return import('../../helpers/SupportedFeaturesHelper')\n .then(({ SupportedFeaturesHelper }) => {\n return SupportedFeaturesHelper.getSupportedFeatures();\n })\n .then((supportedFeatures): Promise => {\n return Promise.resolve(\n supportedFeatures.wasmSupport &&\n supportedFeatures.webcamAccess &&\n supportedFeatures.webcamAvailable &&\n supportedFeatures.webglRendering\n );\n });\n};\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import { MicroserviceEnvironment } from '../constants/MicroserviceEnvironment';\nimport { ApiConfig } from '../interfaces/ApiConfig';\n\nconst envHost: Record = {\n STAGING: 'https://test-gateway-vtoprofile.luxdeepblue.com',\n ACCEPTANCE: 'https://acceptance-gateway-vtoprofile.luxdeepblue.com',\n PRODUCTION: 'https://gateway-vtoprofile.luxdeepblue.com'\n};\n\nconst envMap: Record = {\n STAGING: {\n loginFaUrl: `${envHost.STAGING}/auth/fradv/token`,\n loginVmUrl: `${envHost.STAGING}/auth/vm/token`,\n refreshUrl: `${envHost.STAGING}/auth/refresh`,\n bipaTextUrl: `${envHost.STAGING}/services/vtobipams/public/v2/bipa/version`,\n bipaSubmitFormUrl: `${envHost.STAGING}/services/vtobipams/public/v1/bipa-consent`,\n videoSessionUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v3/video`,\n enrichUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v1/ml-enrich`,\n vtoUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v1/basel-mesh`,\n additionalInfoUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v1/additional-info`,\n poseExtractionUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v1/poses-extraction`,\n statusUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v2/status`,\n pdStatusUrl: `${envHost.STAGING}/services/vtomedicalinfoms/public/v1/pupillary-distance/status`,\n profileUrl: `${envHost.STAGING}/services/vtovideoprofilems/public/v3/get-video-profile`,\n measurementUrl: `${envHost.STAGING}/services/vtomedicalinfoms/public/v2/pupillary-distance`,\n },\n ACCEPTANCE: {\n loginFaUrl: `${envHost.ACCEPTANCE}/auth/fradv/token`,\n loginVmUrl: `${envHost.ACCEPTANCE}/auth/vm/token`,\n refreshUrl: `${envHost.ACCEPTANCE}/auth/refresh`,\n bipaTextUrl: `${envHost.ACCEPTANCE}/services/vtobipams/public/v2/bipa/version`,\n bipaSubmitFormUrl: `${envHost.ACCEPTANCE}/services/vtobipams/public/v1/bipa-consent`,\n videoSessionUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v3/video`,\n enrichUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v1/ml-enrich`,\n vtoUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v1/basel-mesh`,\n additionalInfoUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v1/additional-info`,\n poseExtractionUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v1/poses-extraction`,\n statusUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v2/status`,\n pdStatusUrl: `${envHost.ACCEPTANCE}/services/vtomedicalinfoms/public/v1/pupillary-distance/status`,\n profileUrl: `${envHost.ACCEPTANCE}/services/vtovideoprofilems/public/v3/get-video-profile`,\n measurementUrl: `${envHost.ACCEPTANCE}/services/vtomedicalinfoms/public/v2/pupillary-distance`,\n },\n PRODUCTION: {\n loginFaUrl: `${envHost.PRODUCTION}/auth/fradv/token`,\n loginVmUrl: `${envHost.PRODUCTION}/auth/vm/token`,\n refreshUrl: `${envHost.PRODUCTION}/auth/refresh`,\n bipaTextUrl: `${envHost.PRODUCTION}/services/vtobipams/public/v2/bipa/version`,\n bipaSubmitFormUrl: `${envHost.PRODUCTION}/services/vtobipams/public/v1/bipa-consent`,\n videoSessionUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v3/video`,\n enrichUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v1/ml-enrich`,\n vtoUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v1/basel-mesh`,\n additionalInfoUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v1/additional-info`,\n poseExtractionUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v1/poses-extraction`,\n statusUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v2/status`,\n pdStatusUrl: `${envHost.PRODUCTION}/services/vtomedicalinfoms/public/v1/pupillary-distance/status`,\n profileUrl: `${envHost.PRODUCTION}/services/vtovideoprofilems/public/v3/get-video-profile`,\n measurementUrl: `${envHost.PRODUCTION}/services/vtomedicalinfoms/public/v2/pupillary-distance`,\n }\n};\n\nconst getConfig = (env: MicroserviceEnvironment, param: keyof ApiConfig): string => {\n return envMap[env][param];\n};\n\nexport {\n getConfig\n};\n","class MicroserviceError extends Error {\n public type: string;\n\n constructor(type: string, message: string, error?: Error) {\n super(message);\n this.type = type;\n this.name = type;\n this.message = message;\n this.stack = error?.stack;\n\n Object.setPrototypeOf(this, MicroserviceError.prototype);\n }\n}\n\nclass EnvironmentError extends MicroserviceError {\n public static type = 'EnvironmentError';\n\n constructor(readonly env: string) {\n super(EnvironmentError.type, `microservice environment ${env} is not valid`);\n Object.setPrototypeOf(this, EnvironmentError.prototype);\n }\n}\n\nclass InvalidInputError extends MicroserviceError {\n public static type = 'InputError';\n\n constructor(message: string, error?: Error) {\n super(InvalidInputError.type, message, error);\n Object.setPrototypeOf(this, InvalidInputError.prototype);\n }\n}\n\nclass LocaleError extends MicroserviceError {\n public static type = 'LocaleError';\n\n constructor(readonly locale: string) {\n super(LocaleError.type, `bipa agreement text cannot be found for locale ${locale}`);\n Object.setPrototypeOf(this, LocaleError.prototype);\n }\n}\n\nclass RequestError extends MicroserviceError {\n public static type = 'RequestError';\n\n constructor(message: string, error?: Error) {\n super(RequestError.type, message, error);\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n\nclass TimeoutError extends MicroserviceError {\n public static type = 'TimeoutError';\n\n constructor(duration: number) {\n super(TimeoutError.type, `request has timed out after ${duration}ms`);\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\nexport {\n InvalidInputError,\n EnvironmentError,\n LocaleError,\n RequestError,\n TimeoutError\n};\n","import { getConfig } from '../config/Config';\nimport { RefreshResponse, RefreshReturn } from '../interfaces/Refresh';\nimport { VtoRequest } from '../interfaces/Request';\n\nconst refreshRequest = (\n request: VtoRequest\n): Promise => {\n\n const url = getConfig(request.environment, 'refreshUrl');\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n refresh_token: request.refreshToken\n })\n\n }).then(response => {\n if (response.ok) {\n return response.json();\n } else {\n return response.json().catch(() => {\n throw new Error(`${response.status}: ${response.statusText}`);\n }).then((json) => {\n throw new Error(JSON.stringify(json));\n });\n }\n\n }).then((json: RefreshResponse) => {\n // logger.debug(json);\n const refreshReturn = {\n accessToken: json.access_token,\n refreshToken: json.refresh_token\n };\n if (!!request.onAuthUpdated) { request.onAuthUpdated(refreshReturn); }\n return refreshReturn;\n\n }).catch(err => {\n // logger.error(err);\n throw(err);\n\n });\n};\n\nexport {\n refreshRequest\n};\n","import { getConfig } from '../config/Config';\nimport { LocaleError } from '../error/errors';\nimport { parseJsonResponse } from '../helpers/RequestHelper';\nimport { BipaAgreementRequestData, BipaAgreementResponse, BipaAgreementReturn, BipaTextResponse, SubmitBipaFormRequestData } from '../interfaces/Bipa';\nimport { refreshRequest } from './RefreshRequest';\n\nconst bipaAgreementFetch = (\n request: BipaAgreementRequestData\n): Promise => {\n const bipaAgreementUrl = getConfig(request.environment, 'bipaTextUrl');\n\n return fetch(bipaAgreementUrl, {\n method: 'GET',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`,\n },\n });\n};\n\nconst bipaAgreementRequest = (\n request: BipaAgreementRequestData\n): Promise => {\n\n let bipaVersion: number;\n let bipaDescription: string;\n\n return bipaAgreementFetch(request).then((bipaAgreementResponse) => {\n if (bipaAgreementResponse.status === 401) {\n return refreshRequest(request).then((refreshResponse) => {\n return bipaAgreementFetch({\n ...request,\n accessToken: refreshResponse.accessToken,\n refreshToken: refreshResponse.refreshToken\n });\n });\n } else {\n return bipaAgreementResponse;\n }\n\n }).then((response) => {\n return parseJsonResponse(response);\n\n }).then((json: BipaTextResponse) => {\n bipaVersion = json.version;\n bipaDescription = json.description;\n\n const bipaUrls = JSON.parse(json.jsonUrl);\n if (!!bipaUrls[request.locale]) {\n return fetch(bipaUrls[request.locale]);\n } else {\n throw new LocaleError(request.locale);\n }\n\n }).then((response) => {\n return parseJsonResponse(response);\n\n }).then((bipaAgreementResponse: BipaAgreementResponse) => {\n return {\n version: bipaVersion,\n description: bipaDescription,\n text: bipaAgreementResponse.BIPA_AGREEMENT,\n };\n });\n};\n\nconst submitBipaFormFetch = (\n request: SubmitBipaFormRequestData\n): Promise => {\n const bipaSubmitUrl = getConfig(request.environment, 'bipaSubmitFormUrl');\n\n return fetch(bipaSubmitUrl, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.accessToken}`,\n },\n body: `{ \"bipaVersion\": ${request.bipaVersion}, \"channel\": \"${request.source}\", \"firstName\": \"${request.firstName}\", \"lastName\": \"${request.lastName}\", \"email\": \"${request.email}\" }`\n });\n};\n\nconst submitBipaFormRequest = (\n request: SubmitBipaFormRequestData\n): Promise => {\n\n return submitBipaFormFetch(request).then((submitBipaResponse) => {\n if (submitBipaResponse.status === 401) {\n return refreshRequest(request).then((refreshResponse) => {\n return submitBipaFormFetch({\n ...request,\n accessToken: refreshResponse.accessToken,\n refreshToken: refreshResponse.refreshToken\n });\n });\n } else {\n return submitBipaResponse;\n }\n });\n};\n\nexport {\n bipaAgreementRequest,\n submitBipaFormRequest\n};\n","import { getConfig } from '../config/Config';\nimport { LoginRequestData, LoginResponse, LoginReturn } from '../interfaces/Login';\n\nconst loginRequest = (\n request: LoginRequestData\n): Promise => {\n\n if (!!request.accessToken && !!request.refreshToken) {\n return Promise.resolve({\n accessToken: request.accessToken,\n refreshToken: request.refreshToken\n });\n\n } else {\n const loginType = (request.version === 1) ? 'loginVmUrl' : 'loginFaUrl';\n const url = getConfig(request.environment, loginType);\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': '*/*',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ rememberMe: true })\n }).then((response) => {\n if (response.ok) {\n return response.json();\n } else {\n return response.json().catch(() => {\n throw new Error(`${response.status}: ${response.statusText}`);\n }).then((json) => {\n throw new Error(JSON.stringify(json));\n });\n }\n }).then((json: LoginResponse) => {\n const authData = {\n accessToken: json.access_token,\n refreshToken: json.refresh_token\n };\n request.onAuthUpdated?.(authData);\n return authData;\n });\n }\n};\n\nexport {\n loginRequest\n};","import { PrivacyLocalization } from '../interfaces/PrivacyLocalization';\n\nexport const DefaultPrivacyLocalization: PrivacyLocalization = {\n PRIVACY_AGREEMENT_TITLE: 'Biometric data consent',\n PRIVACY_FIRST_AGREEMENT: 'We need your consent to record your face\\'s biometric data and proceed with our eyewear suggestion experience. We will not store any of your information in our database and once the process is finished, we will delete all of your personal data.',\n PRIVACY_IMPLICIT_AGREEMENT: 'By continuing you accept',\n PRIVACY_IMPLICIT_TERMS_AND_CONDITIONS: 'Terms and Conditions',\n PRIVACY_IMPLICIT_TERMS_PRIVACY_CONJUNCTION: ' and ',\n PRIVACY_IMPLICIT_PRIVACY_POLICY: 'Privacy Policy',\n PRIVACY_BUTTON_SUBMIT: 'Submit',\n PRIVACY_BUTTON_CANCEL: 'Cancel',\n BIPA_FORM_TITLE: 'Biometric data consent',\n BIPA_CITIZEN_DECLARATION: 'I declare I\\'m an Illinois citizen',\n BIPA_FORM_SUBTITLE: 'Due to some Illinois regulations we need to ask you some information, please fill in your details below.',\n BIPA_FORM_NAME: 'Name',\n BIPA_FORM_SURNAME: 'Surname',\n BIPA_FORM_EMAIL: 'E-mail',\n BIPA_IMPLICIT_AGREEMENT: 'By continuing you accept',\n BIPA_IMPLICIT_TERMS_AND_CONDITIONS: 'Terms and Conditions',\n BIPA_IMPLICIT_TERMS_PRIVACY_CONJUNCTION: ' and ',\n BIPA_IMPLICIT_PRIVACY_POLICY: 'Privacy Policy',\n BIPA_FORM_IMPLICIT_AGREEMENT: 'By continuing you accept Luxottica\\'s Terms and Conditions and below BIPA Notice.',\n BIPA_FORM_BUTTON_SUBMIT: 'Submit',\n BIPA_FORM_BUTTON_CANCEL: 'Cancel',\n BIPA_SERVER_ERROR: 'There was a problem with the server, please check insered informations or network connection'\n};\n","enum PrivacyLocalizationKey {\n PRIVACY_AGREEMENT_TITLE = 'PRIVACY_AGREEMENT_TITLE',\n PRIVACY_AGREEMENT_TEXT = 'PRIVACY_AGREEMENT_TEXT',\n PRIVACY_FIRST_AGREEMENT = 'PRIVACY_FIRST_AGREEMENT',\n PRIVACY_IMPLICIT_AGREEMENT = 'PRIVACY_IMPLICIT_AGREEMENT',\n PRIVACY_IMPLICIT_TERMS_AND_CONDITIONS = 'PRIVACY_IMPLICIT_TERMS_AND_CONDITIONS',\n PRIVACY_IMPLICIT_TERMS_PRIVACY_CONJUNCTION = 'PRIVACY_IMPLICIT_TERMS_PRIVACY_CONJUNCTION',\n PRIVACY_IMPLICIT_PRIVACY_POLICY = 'PRIVACY_IMPLICIT_PRIVACY_POLICY',\n PRIVACY_BUTTON_SUBMIT = 'PRIVACY_BUTTON_SUBMIT',\n PRIVACY_BUTTON_CANCEL = 'PRIVACY_BUTTON_CANCEL',\n BIPA_CITIZEN_DECLARATION = 'BIPA_CITIZEN_DECLARATION',\n BIPA_CITIZEN_QUESTION = 'BIPA_CITIZEN_QUESTION',\n BIPA_FORM_TITLE = 'BIPA_FORM_TITLE',\n BIPA_FORM_SUBTITLE = 'BIPA_FORM_SUBTITLE',\n BIPA_FORM_NAME = 'BIPA_FORM_NAME',\n BIPA_FORM_SURNAME = 'BIPA_FORM_SURNAME',\n BIPA_FORM_EMAIL = 'BIPA_FORM_EMAIL',\n BIPA_FORM_ERROR = 'BIPA_FORM_ERROR',\n BIPA_FORM_ERROR_MAIL = 'BIPA_FORM_ERROR_MAIL',\n BIPA_FORM_MANDATORY_FIELD = 'BIPA_FORM_MANDATORY_FIELD',\n BIPA_IMPLICIT_AGREEMENT = 'BIPA_IMPLICIT_AGREEMENT',\n BIPA_IMPLICIT_TERMS_AND_CONDITIONS = 'BIPA_IMPLICIT_TERMS_AND_CONDITIONS',\n BIPA_IMPLICIT_TERMS_PRIVACY_CONJUNCTION = 'BIPA_IMPLICIT_TERMS_PRIVACY_CONJUNCTION',\n BIPA_IMPLICIT_PRIVACY_POLICY = 'BIPA_IMPLICIT_PRIVACY_POLICY',\n BIPA_FORM_IMPLICIT_AGREEMENT = 'BIPA_FORM_IMPLICIT_AGREEMENT',\n BIPA_FORM_BIPA_AGREEMENT = 'BIPA_FORM_BIPA_AGREEMENT',\n BIPA_FORM_BUTTON_SUBMIT = 'BIPA_FORM_BUTTON_SUBMIT',\n BIPA_FORM_BUTTON_CANCEL = 'BIPA_FORM_BUTTON_CANCEL',\n BIPA_NO = 'BIPA_NO',\n BIPA_SERVER_ERROR = 'BIPA_SERVER_ERROR',\n BIPA_YES = 'BIPA_YES',\n}\n\ntype PrivacyLocalization = {\n [key in PrivacyLocalizationKey]?: string;\n}\n\nexport {\n PrivacyLocalizationKey,\n PrivacyLocalization\n};\n","import React from 'react';\n\nconst ErrorIcon = () => {\n return (\n \n \n \n \n \n );\n};\n\nexport {\n ErrorIcon\n};\n","import { MicroserviceEnvironment, submitBipaFormRequest } from '@luxottica/vto-microservices';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { BipaServiceError } from '../errors/errors';\nimport { LocalizationHelper } from '../helpers/LocalizationHelper';\nimport { ParameterHelper } from '../helpers/ParameterHelper';\nimport { BipaCallbacks } from '../interfaces/BipaCallbacks';\nimport { BipaFormData } from '../interfaces/BipaFormData';\nimport { PrivacyLocalizationKey } from '../interfaces/PrivacyLocalization';\nimport { BipaPrivacyOptions } from '../interfaces/PrivacyOptions';\nimport './BipaBiometricForm.scss';\nimport { ErrorIcon } from './ErrorIcon';\n\ninterface BipaBiometricFormProps {\n source: string;\n environment: MicroserviceEnvironment;\n accessToken: string;\n refreshToken: string;\n bipaVersion: number;\n formPrefill?: Partial;\n privacyOptions: BipaPrivacyOptions;\n callbacks: BipaCallbacks;\n onBipaSubmit: (formData: BipaFormData) => void;\n onCancel: () => void;\n onError: (e: Error) => void;\n}\n\nconst BipaBiometricForm = (props: BipaBiometricFormProps) => {\n\n const [firstName, setFirstName] = useState((!!props.formPrefill?.firstName) ? props.formPrefill.firstName : '');\n const [firstNameError, setFirstNameError] = useState(false);\n\n const [lastName, setLastName] = useState((!!props.formPrefill?.lastName) ? props.formPrefill.lastName : '');\n const [lastNameError, setLastNameError] = useState(false);\n\n const [email, setEmail] = useState((!!props.formPrefill?.email) ? props.formPrefill.email : '');\n const [emailError, setEmailError] = useState(false);\n\n const [serverError, setServerError] = useState(false);\n\n const topInputRef = useRef(undefined);\n\n useEffect(() => {\n props.callbacks?.onDisplayPage?.('BIOMETRIC_FORM');\n }, []);\n\n const onSubmitForm = () => {\n const formData = {\n firstName: firstName,\n lastName: lastName,\n email: email\n };\n\n if (!serverError) { setServerError(false); }\n\n const fieldErrors = ParameterHelper.validateBipaForm(formData).map(error => error.field);\n\n if (!firstName) { setFirstNameError(true); }\n if (!lastName) { setLastNameError(true); }\n if (!email) { setEmailError(true); }\n\n if (!firstName || !lastName || !email) {\n topInputRef.current.scrollIntoView();\n\n } else if (fieldErrors.length > 0) {\n if (fieldErrors.includes('firstName')) { setFirstNameError(true); }\n if (fieldErrors.includes('lastName')) { setLastNameError(true); }\n if (fieldErrors.includes('email')) { setEmailError(true); }\n topInputRef.current.scrollIntoView();\n\n } else {\n submitBipaFormRequest({\n source: props.source,\n environment: props.environment,\n accessToken: props.accessToken,\n refreshToken: props.refreshToken,\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n bipaVersion: props.bipaVersion,\n onAuthUpdated: props.callbacks.onAuthUpdated\n }).then((response) => {\n if (response.ok) {\n props.onBipaSubmit(formData);\n } else if (response.status < 404) {\n response.json().then((json) => {\n const errorFields: string[] = (!!json?.fieldErrors) ? json.fieldErrors.map(error => error.field) : [];\n console.info(errorFields);\n \n if (errorFields.includes('firstName')) { setFirstNameError(true); }\n if (errorFields.includes('lastName')) { setLastNameError(true); }\n if (errorFields.includes('email')) { setEmailError(true); }\n });\n } else {\n setServerError(true);\n props.onError(new BipaServiceError(`failed to submit bipa form due to response=${response.status} ${response.statusText}`));\n }\n }).catch((e) => {\n setServerError(true);\n props.onError(e);\n });\n }\n };\n\n const handleInputChange = (\n element: React.ChangeEvent,\n dispatch: React.Dispatch>\n ) => {\n if (!!element.target.value && element.target.value !== '') {\n dispatch(element.target.value);\n } else {\n dispatch('');\n }\n };\n\n const confirmButtonDisabled = firstName === undefined || firstName === ''\n || lastName === undefined || lastName === ''\n || email === undefined || email === '';\n const showFieldWarning = firstNameError || lastNameError || emailError;\n\n return (\n
\n\n
\n

{LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_FORM_TITLE)}

\n\n

{LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_FORM_SUBTITLE)}

\n\n { showFieldWarning &&\n

{LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_FORM_ERROR)}

\n }\n\n { serverError &&\n

{LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_SERVER_ERROR)}

\n }\n\n
\n {\n setFirstNameError(false);\n handleInputChange(element, setFirstName);\n }}\n placeholder={LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_FORM_NAME)}/>\n { firstNameError && }\n
\n
\n {\n setLastNameError(false);\n handleInputChange(element, setLastName);\n }}\n placeholder={LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_FORM_SURNAME)}/>\n { lastNameError && }\n
\n
\n {\n setEmailError(false);\n handleInputChange(element, setEmail);\n }}\n placeholder={LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_FORM_EMAIL)}/>\n { emailError && }\n
\n { emailError &&
{LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_FORM_ERROR_MAIL)}
}\n
{LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_FORM_MANDATORY_FIELD)}
\n
\n\n
\n
\n \n\n \n
\n
\n
\n );\n};\n\nexport {\n BipaBiometricForm\n};\n","import React from 'react';\nimport { LocalizationHelper } from '../helpers/LocalizationHelper';\nimport { PrivacyLocalizationKey } from '../interfaces/PrivacyLocalization';\nimport './YesNoCheckBox.scss';\n\ninterface YesNoCheckBoxProps {\n tabIndex: number;\n checked: boolean;\n onChange: (checked: boolean) => void;\n}\n\nconst YesNoCheckBox = (props: YesNoCheckBoxProps) => {\n\n return (\n
\n {LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_NO)}\n \n {LocalizationHelper.getText(PrivacyLocalizationKey.BIPA_YES)}\n
\n );\n};\n\nexport {\n YesNoCheckBox\n};\n","import React, { useEffect, useState } from 'react';\nimport { LocalizationHelper } from '../helpers/LocalizationHelper';\nimport { BipaCallbacks } from '../interfaces/BipaCallbacks';\nimport { PrivacyLocalizationKey } from '../interfaces/PrivacyLocalization';\nimport { BipaPrivacyOptions } from '../interfaces/PrivacyOptions';\n\nimport './PrivacyAgreement.scss';\nimport { YesNoCheckBox } from './YesNoCheckbox';\n\ninterface PrivacyAgreementProps {\n region: string,\n isIllinoisUser: boolean;\n privacyOptions: BipaPrivacyOptions;\n callbacks: BipaCallbacks;\n onSetIllinoisUser: (isIllinois: boolean) => void;\n onSubmit: () => void;\n onCancel: () => void;\n}\n\nconst PrivacyAgreement = (props: PrivacyAgreementProps) => {\n \n const [showGradient, setShowGradient] = useState(true);\n\n useEffect(() => {\n props.callbacks?.onDisplayPage?.('PRIVACY');\n\n try {\n if (document.getElementsByClassName('scrollable-container')[0].clientHeight >= document.getElementsByClassName('scrollable-content')[0].clientHeight) {\n setShowGradient(false);\n }\n } catch (e) { }\n }, []);\n\n const trackScrolling = (e: React.UIEvent) => {\n if (e.currentTarget.scrollTop < 2) {\n !showGradient && setShowGradient(true);\n } else {\n showGradient && setShowGradient(false);\n }\n };\n\n return (\n
\n\n
\n\n
\n\n

{LocalizationHelper.getText(PrivacyLocalizationKey.PRIVACY_AGREEMENT_TITLE)}

\n\n \n\n {props.region === 'US' &&\n <>\n
\n \n
\n\n
\n { props.onSetIllinoisUser(checked); }}/>\n
\n \n }\n\n \n\n {props.region === 'US' &&\n \n }\n\n
\n
\n\n
\n
\n\n \n
\n );\n};\n\nexport {\n PrivacyAgreement\n};\n","import { AgreementType } from '../constants/AgreementType';\n\nconst BASIC_COOKIE_NAME = 'BasicImageConsent=true';\nconst BIOMETRIC_COOKIE_NAME = 'MlProcessImageConsent=true';\nconst COOKIE_PATH = 'path=/';\n\nconst CookieHelper = {\n setBiometricCookie: (agreementType: AgreementType): void => {\n if (!CookieHelper.biometricCookieExists(agreementType)) {\n document.cookie = `${CookieHelper.getBiometricCookieName(agreementType)};${COOKIE_PATH}`;\n }\n },\n\n biometricCookieExists: (agreementType: AgreementType): boolean => {\n if (agreementType === AgreementType.BASIC) {\n return document.cookie.includes(CookieHelper.getBiometricCookieName(AgreementType.BASIC))\n || document.cookie.includes(CookieHelper.getBiometricCookieName(AgreementType.BIOMETRIC));\n\n } else if (agreementType === AgreementType.BIOMETRIC) {\n return document.cookie.includes(CookieHelper.getBiometricCookieName(AgreementType.BIOMETRIC));\n\n } else {\n return false;\n }\n },\n\n getBiometricCookieName: (agreementType: AgreementType): string => {\n return agreementType === AgreementType.BIOMETRIC ? BIOMETRIC_COOKIE_NAME : BASIC_COOKIE_NAME;\n }\n};\n\nexport {\n CookieHelper\n};","import { bipaAgreementRequest, loginRequest, MicroserviceEnvironment } from '@luxottica/vto-microservices';\nimport React, { useEffect, useRef, useState } from 'react';\nimport './BipaOverlay.scss';\nimport { BipaBiometricForm } from './components/BipaBiometricForm';\nimport { PrivacyAgreement } from './components/PrivacyAgreement';\nimport { AgreementType } from './constants/AgreementType';\nimport { ROOT_STYLE_NAME } from './constants/Styling';\nimport { CookieHelper } from './helpers/CookieHelper';\nimport { LocalizationHelper } from './helpers/LocalizationHelper';\nimport { fetchBipaJson } from './helpers/RequestHelper';\nimport { BipaCallbacks } from './interfaces/BipaCallbacks';\nimport { BipaFormData } from './interfaces/BipaFormData';\nimport { BipaPage } from './interfaces/BipaPage';\nimport { BipaPrivacyOptions } from './interfaces/PrivacyOptions';\n\ninterface BipaOverlayProps {\n type: AgreementType;\n environment: MicroserviceEnvironment;\n tokenVersion: 1 | 2;\n accessToken: string;\n refreshToken: string;\n locale: string;\n region: string;\n source: string;\n formPrefill?: Partial;\n privacy: BipaPrivacyOptions;\n callbacks: BipaCallbacks;\n}\n\nconst BipaOverlay = (props: BipaOverlayProps) => {\n\n const isFirstRender = useRef(true);\n\n const [illinoisUser, setIlliniosUser] = useState(false);\n const [currentPage, setCurrentPage] = useState(undefined);\n const [bipaVersion, setBipaVersion] = useState(undefined);\n\n const onClickSubmit = () => {\n if (illinoisUser) {\n setCurrentPage('BIOMETRIC_FORM');\n } else {\n CookieHelper.setBiometricCookie(props.type);\n props.callbacks.onSubmit();\n }\n };\n\n const onClickBipaSubmit = (formData: BipaFormData) => {\n CookieHelper.setBiometricCookie(props.type);\n props.callbacks.onSubmit(formData);\n };\n\n const onClickCancel = () => {\n props.callbacks.onUserReject();\n };\n\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n\n loginRequest({\n environment: props.environment,\n version: props.tokenVersion,\n accessToken: props.accessToken,\n refreshToken: props.refreshToken,\n onAuthUpdated: props.callbacks.onAuthUpdated\n }).then((loginReturn) => {\n return Promise.all([\n fetchBipaJson(props.type, props.environment, props.locale),\n (props.region === 'US') ? bipaAgreementRequest({\n locale: props.locale,\n environment: props.environment,\n accessToken: loginReturn.accessToken,\n refreshToken: loginReturn.refreshToken,\n onAuthUpdated: props.callbacks.onAuthUpdated\n }) : Promise.resolve(undefined)\n ]);\n }).then((response) => {\n const bipaAgreementText = (!!response?.[1]?.text) ? response[1].text : undefined;\n const bipaAgreementVersion = (!!response?.[1]?.version) ? response[1].version : undefined;\n \n LocalizationHelper.setText({\n ...response[0],\n BIPA_FORM_BIPA_AGREEMENT: bipaAgreementText,\n ...props.privacy.localizationText,\n });\n setBipaVersion(bipaAgreementVersion);\n setCurrentPage('PRIVACY');\n }).catch((e) => {\n props.callbacks.onError(e);\n });\n }\n }, []);\n\n const renderPage = (props: BipaOverlayProps, currentPage: BipaPage) => {\n if (currentPage === 'PRIVACY') {\n return (\n { setIlliniosUser(isIllinoisUser); }}\n onSubmit={onClickSubmit}\n onCancel={onClickCancel}/>\n );\n } else if (currentPage === 'BIOMETRIC_FORM') {\n return (\n setCurrentPage('PRIVACY')}\n onError={props.callbacks.onError}/>\n );\n }\n };\n\n return (\n
\n
\n {renderPage(props, currentPage)}\n
\n
\n );\n};\n\nexport {\n BipaOverlay,\n BipaOverlayProps\n};\n","const ROOT_STYLE_NAME = 'bipa-overlay-root-style';\n\nexport {\n ROOT_STYLE_NAME\n};\n","import { bipaAgreementRequest, BipaAgreementReturn, MicroserviceEnvironment, submitBipaFormRequest } from '@luxottica/vto-microservices';\nimport { BipaOverlay, BipaOverlayProps } from './BipaOverlay';\nimport { AgreementType } from './constants/AgreementType';\nimport { BipaSubmissionError } from './errors/errors';\nimport { CookieHelper } from './helpers/CookieHelper';\nimport { ParameterHelper } from './helpers/ParameterHelper';\nimport { BipaCallbacks } from './interfaces/BipaCallbacks';\nimport { BipaVersionParameters, SaveBipaEntryParameters } from './interfaces/BipaConfiguration';\nimport { BipaFormData } from './interfaces/BipaFormData';\nimport { BipaPage } from './interfaces/BipaPage';\nimport { PrivacyLocalization, PrivacyLocalizationKey } from './interfaces/PrivacyLocalization';\nimport { BipaPrivacyOptions } from './interfaces/PrivacyOptions';\n\nconst BipaManager = {\n getCookieName: (agreementType: AgreementType): string => {\n return CookieHelper.getBiometricCookieName(agreementType);\n },\n\n biometricCookieExists: (agreementType: AgreementType): boolean => {\n return CookieHelper.biometricCookieExists(agreementType);\n },\n\n getBipaVersion: (config: BipaVersionParameters): Promise => {\n return bipaAgreementRequest({\n locale: config.locale,\n environment: config.environment,\n accessToken: config.accessToken,\n refreshToken: config.refreshToken,\n onAuthUpdated: config.onAuthUpdated\n });\n },\n\n saveBipaEntry: (\n config: SaveBipaEntryParameters\n ): Promise => {\n const fieldErrors = ParameterHelper.validateBipaForm(config.formData);\n if (fieldErrors.length > 0) {\n return Promise.reject(new BipaSubmissionError('failed client-side bipa form validation', fieldErrors));\n }\n\n return submitBipaFormRequest({\n environment: config.environment,\n accessToken: config.accessToken,\n refreshToken: config.refreshToken,\n onAuthUpdated: config.onAuthUpdated,\n bipaVersion: config.bipaVersion,\n source: config.source,\n firstName: config.formData.firstName,\n lastName: config.formData.lastName,\n email: config.formData.email\n }).then((response) => {\n return response.json().then((json) => {\n return {\n response: response,\n body: json\n };\n });\n }).then((responseData) => {\n if (responseData.response.ok) {\n return responseData.response;\n } else {\n return (!!responseData.body?.title && !!responseData.body?.message) ?\n Promise.reject(new BipaSubmissionError(`${responseData.body.title}: ${responseData.body.message}`, responseData.body.fieldErrors))\n :\n Promise.reject(new BipaSubmissionError('failed to contact bipa server', undefined));\n }\n }).catch((e) => {\n if (e instanceof BipaSubmissionError) {\n throw e;\n } else {\n throw new BipaSubmissionError('failed to contact bipa server', undefined);\n }\n });\n }\n};\n\nexport {\n AgreementType,\n MicroserviceEnvironment,\n BipaManager,\n BipaVersionParameters,\n SaveBipaEntryParameters,\n BipaPage,\n BipaOverlay,\n BipaOverlayProps,\n BipaFormData,\n BipaPrivacyOptions,\n PrivacyLocalization,\n PrivacyLocalizationKey,\n BipaCallbacks,\n};\n","/**\n * Copyright (c) 2010,2011,2012,2013,2014 Morgan Roderick http://roderick.dk\n * License: MIT - http://mrgnrdrck.mit-license.org\n *\n * https://github.com/mroderick/PubSubJS\n */\n\n(function (root, factory){\n 'use strict';\n\n var PubSub = {};\n\n if (root.PubSub) {\n PubSub = root.PubSub;\n console.warn(\"PubSub already loaded, using existing version\");\n } else {\n root.PubSub = PubSub;\n factory(PubSub);\n }\n // CommonJS and Node.js module support\n if (typeof exports === 'object'){\n if (module !== undefined && module.exports) {\n exports = module.exports = PubSub; // Node.js specific `module.exports`\n }\n exports.PubSub = PubSub; // CommonJS module 1.1.1 spec\n module.exports = exports = PubSub; // CommonJS\n }\n // AMD support\n /* eslint-disable no-undef */\n else if (typeof define === 'function' && define.amd){\n define(function() { return PubSub; });\n /* eslint-enable no-undef */\n }\n\n}(( typeof window === 'object' && window ) || this, function (PubSub){\n 'use strict';\n\n var messages = {},\n lastUid = -1,\n ALL_SUBSCRIBING_MSG = '*';\n\n function hasKeys(obj){\n var key;\n\n for (key in obj){\n if ( Object.prototype.hasOwnProperty.call(obj, key) ){\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns a function that throws the passed exception, for use as argument for setTimeout\n * @alias throwException\n * @function\n * @param { Object } ex An Error object\n */\n function throwException( ex ){\n return function reThrowException(){\n throw ex;\n };\n }\n\n function callSubscriberWithDelayedExceptions( subscriber, message, data ){\n try {\n subscriber( message, data );\n } catch( ex ){\n setTimeout( throwException( ex ), 0);\n }\n }\n\n function callSubscriberWithImmediateExceptions( subscriber, message, data ){\n subscriber( message, data );\n }\n\n function deliverMessage( originalMessage, matchedMessage, data, immediateExceptions ){\n var subscribers = messages[matchedMessage],\n callSubscriber = immediateExceptions ? callSubscriberWithImmediateExceptions : callSubscriberWithDelayedExceptions,\n s;\n\n if ( !Object.prototype.hasOwnProperty.call( messages, matchedMessage ) ) {\n return;\n }\n\n for (s in subscribers){\n if ( Object.prototype.hasOwnProperty.call(subscribers, s)){\n callSubscriber( subscribers[s], originalMessage, data );\n }\n }\n }\n\n function createDeliveryFunction( message, data, immediateExceptions ){\n return function deliverNamespaced(){\n var topic = String( message ),\n position = topic.lastIndexOf( '.' );\n\n // deliver the message as it is now\n deliverMessage(message, message, data, immediateExceptions);\n\n // trim the hierarchy and deliver message to each level\n while( position !== -1 ){\n topic = topic.substr( 0, position );\n position = topic.lastIndexOf('.');\n deliverMessage( message, topic, data, immediateExceptions );\n }\n\n deliverMessage(message, ALL_SUBSCRIBING_MSG, data, immediateExceptions);\n };\n }\n\n function hasDirectSubscribersFor( message ) {\n var topic = String( message ),\n found = Boolean(Object.prototype.hasOwnProperty.call( messages, topic ) && hasKeys(messages[topic]));\n\n return found;\n }\n\n function messageHasSubscribers( message ){\n var topic = String( message ),\n found = hasDirectSubscribersFor(topic) || hasDirectSubscribersFor(ALL_SUBSCRIBING_MSG),\n position = topic.lastIndexOf( '.' );\n\n while ( !found && position !== -1 ){\n topic = topic.substr( 0, position );\n position = topic.lastIndexOf( '.' );\n found = hasDirectSubscribersFor(topic);\n }\n\n return found;\n }\n\n function publish( message, data, sync, immediateExceptions ){\n message = (typeof message === 'symbol') ? message.toString() : message;\n\n var deliver = createDeliveryFunction( message, data, immediateExceptions ),\n hasSubscribers = messageHasSubscribers( message );\n\n if ( !hasSubscribers ){\n return false;\n }\n\n if ( sync === true ){\n deliver();\n } else {\n setTimeout( deliver, 0 );\n }\n return true;\n }\n\n /**\n * Publishes the message, passing the data to it's subscribers\n * @function\n * @alias publish\n * @param { String } message The message to publish\n * @param {} data The data to pass to subscribers\n * @return { Boolean }\n */\n PubSub.publish = function( message, data ){\n return publish( message, data, false, PubSub.immediateExceptions );\n };\n\n /**\n * Publishes the message synchronously, passing the data to it's subscribers\n * @function\n * @alias publishSync\n * @param { String } message The message to publish\n * @param {} data The data to pass to subscribers\n * @return { Boolean }\n */\n PubSub.publishSync = function( message, data ){\n return publish( message, data, true, PubSub.immediateExceptions );\n };\n\n /**\n * Subscribes the passed function to the passed message. Every returned token is unique and should be stored if you need to unsubscribe\n * @function\n * @alias subscribe\n * @param { String } message The message to subscribe to\n * @param { Function } func The function to call when a new message is published\n * @return { String }\n */\n PubSub.subscribe = function( message, func ){\n if ( typeof func !== 'function'){\n return false;\n }\n\n message = (typeof message === 'symbol') ? message.toString() : message;\n\n // message is not registered yet\n if ( !Object.prototype.hasOwnProperty.call( messages, message ) ){\n messages[message] = {};\n }\n\n // forcing token as String, to allow for future expansions without breaking usage\n // and allow for easy use as key names for the 'messages' object\n var token = 'uid_' + String(++lastUid);\n messages[message][token] = func;\n\n // return token for unsubscribing\n return token;\n };\n\n PubSub.subscribeAll = function( func ){\n return PubSub.subscribe(ALL_SUBSCRIBING_MSG, func);\n };\n\n /**\n * Subscribes the passed function to the passed message once\n * @function\n * @alias subscribeOnce\n * @param { String } message The message to subscribe to\n * @param { Function } func The function to call when a new message is published\n * @return { PubSub }\n */\n PubSub.subscribeOnce = function( message, func ){\n var token = PubSub.subscribe( message, function(){\n // before func apply, unsubscribe message\n PubSub.unsubscribe( token );\n func.apply( this, arguments );\n });\n return PubSub;\n };\n\n /**\n * Clears all subscriptions\n * @function\n * @public\n * @alias clearAllSubscriptions\n */\n PubSub.clearAllSubscriptions = function clearAllSubscriptions(){\n messages = {};\n };\n\n /**\n * Clear subscriptions by the topic\n * @function\n * @public\n * @alias clearAllSubscriptions\n * @return { int }\n */\n PubSub.clearSubscriptions = function clearSubscriptions(topic){\n var m;\n for (m in messages){\n if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0){\n delete messages[m];\n }\n }\n };\n\n /**\n Count subscriptions by the topic\n * @function\n * @public\n * @alias countSubscriptions\n * @return { Array }\n */\n PubSub.countSubscriptions = function countSubscriptions(topic){\n var m;\n // eslint-disable-next-line no-unused-vars\n var token;\n var count = 0;\n for (m in messages) {\n if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0) {\n for (token in messages[m]) {\n count++;\n }\n break;\n }\n }\n return count;\n };\n\n\n /**\n Gets subscriptions by the topic\n * @function\n * @public\n * @alias getSubscriptions\n */\n PubSub.getSubscriptions = function getSubscriptions(topic){\n var m;\n var list = [];\n for (m in messages){\n if (Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0){\n list.push(m);\n }\n }\n return list;\n };\n\n /**\n * Removes subscriptions\n *\n * - When passed a token, removes a specific subscription.\n *\n\t * - When passed a function, removes all subscriptions for that function\n *\n\t * - When passed a topic, removes all subscriptions for that topic (hierarchy)\n * @function\n * @public\n * @alias subscribeOnce\n * @param { String | Function } value A token, function or topic to unsubscribe from\n * @example // Unsubscribing with a token\n * var token = PubSub.subscribe('mytopic', myFunc);\n * PubSub.unsubscribe(token);\n * @example // Unsubscribing with a function\n * PubSub.unsubscribe(myFunc);\n * @example // Unsubscribing from a topic\n * PubSub.unsubscribe('mytopic');\n */\n PubSub.unsubscribe = function(value){\n var descendantTopicExists = function(topic) {\n var m;\n for ( m in messages ){\n if ( Object.prototype.hasOwnProperty.call(messages, m) && m.indexOf(topic) === 0 ){\n // a descendant of the topic exists:\n return true;\n }\n }\n\n return false;\n },\n isTopic = typeof value === 'string' && ( Object.prototype.hasOwnProperty.call(messages, value) || descendantTopicExists(value) ),\n isToken = !isTopic && typeof value === 'string',\n isFunction = typeof value === 'function',\n result = false,\n m, message, t;\n\n if (isTopic){\n PubSub.clearSubscriptions(value);\n return;\n }\n\n for ( m in messages ){\n if ( Object.prototype.hasOwnProperty.call( messages, m ) ){\n message = messages[m];\n\n if ( isToken && message[value] ){\n delete message[value];\n result = value;\n // tokens are unique, so we can just stop here\n break;\n }\n\n if (isFunction) {\n for ( t in message ){\n if (Object.prototype.hasOwnProperty.call(message, t) && message[t] === value){\n delete message[t];\n result = true;\n }\n }\n }\n }\n }\n\n return result;\n };\n}));\n","const toDataURL = (url: string) => {\r\n return fetch(url)\r\n .then(response => response.blob())\r\n .then(blob => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onloadend = () => resolve(reader.result);\r\n reader.onerror = reject;\r\n reader.readAsDataURL(blob);\r\n });\r\n });\r\n};\r\n\r\nexport { toDataURL };\r\n","import uuid from 'uuid';\r\nimport { IMockStreamTrack, MockTrackSettings } from './IMockStreamTrack';\r\n\r\nclass MockStreamTrack implements IMockStreamTrack {\r\n public readonly id: string;\r\n public readonly label: string;\r\n private settings: MockTrackSettings;\r\n\r\n constructor() {\r\n this.id = uuid();\r\n this.label = 'mock-stream-track';\r\n this.settings = {};\r\n }\r\n\r\n public getSettings() {\r\n return this.settings;\r\n }\r\n \r\n public stop() {\r\n return;\r\n }\r\n}\r\n\r\nexport { MockStreamTrack };\r\n","import uuid from 'uuid';\r\nimport { IMockStream } from './IMockStream';\r\nimport { MockStreamTrack } from './MockStreamTrack';\r\n\r\nclass MockStream implements IMockStream {\r\n public readonly id: string;\r\n private tracks: MockStreamTrack[] = [];\r\n\r\n constructor(resolution?: any | undefined) {\r\n this.id = uuid();\r\n this.tracks.push(new MockStreamTrack());\r\n }\r\n public getTracks(): any[] {\r\n return this.tracks;\r\n }\r\n public getVideoTracks(): any[] {\r\n return this.tracks;\r\n }\r\n}\r\n\r\nexport { MockStream };\r\n","import { toDataURL } from './ImageLoader';\r\nimport { IMockBridgeMedia } from './IMockBridgeMedia';\r\nimport { MockStream } from './MockStream';\r\n\r\nclass MockBridgeMedia implements IMockBridgeMedia {\r\n\r\n public getUserMedia(constraints: MediaStreamConstraints): Promise {\r\n // const requiredResolution: any = this.getRequiredResolution(constraints);\r\n\r\n return new Promise ((resolve, reject) => {\r\n const videoSrc = localStorage.getItem('vm.mock.videoSrc');\r\n if (videoSrc === null) {\r\n reject(new Error('video src undefined'));\r\n } else {\r\n return toDataURL(\r\n videoSrc\r\n ).then((dataUrl) => {\r\n console.log('RESULT OK');\r\n resolve(new MockStream());\r\n }).catch((e) => {\r\n console.error(e);\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { MockBridgeMedia };\r\n","// tslint:disable-next-line:interface-name\ndeclare interface NativeBridgeParameters {\n resolution: {\n width: number;\n height: number;\n };\n}\n\nabstract class AbstractNativeBridge {\n public static isNativeBridgePresent: () => boolean;\n public abstract onStartNativeCam: ((resolution: any, error: any) => void) | undefined;\n public abstract onCamFrame: ((base64: string) => void) | undefined;\n public abstract close: () => void;\n public abstract pause: () => void;\n public abstract resume: () => void;\n public abstract start: (requiredResolution: NativeBridgeParameters) => void;\n}\n\nexport { AbstractNativeBridge, NativeBridgeParameters };\n","import { AbstractNativeBridge, NativeBridgeParameters } from './AbstractNativeBridge';\n\ndeclare global {\n // tslint:disable-next-line:interface-name\n interface Window {\n webkit: any;\n NativeBridge: NativeBridge;\n }\n}\n\nclass NativeBridge extends AbstractNativeBridge {\n\n public static isNativeBridgePresent(): boolean {\n return (\n typeof window.webkit === 'object' &&\n typeof(window.webkit.messageHandlers) === 'object' &&\n typeof(window.webkit.messageHandlers.startNativeCam) === 'object'\n );\n }\n\n public onStartNativeCam: ((resolution: any, error: any) => void) | undefined;\n public onCamFrame: ((base64: string) => void) | undefined;\n\n public close = (): void => {\n window.webkit.messageHandlers.closeNativeCam.postMessage(undefined);\n }\n\n public start = (requiredResolution: NativeBridgeParameters): void => {\n window.webkit.messageHandlers.startNativeCam.postMessage(requiredResolution);\n }\n\n public pause = (): void => {\n // in old versions of native bridge there's no pause/resume support\n if (window.webkit.messageHandlers.pauseNativeCam) {\n window.webkit.messageHandlers.pauseNativeCam.postMessage(undefined);\n }\n }\n\n public resume = (): void => {\n // in old versions of native bridge there's no pause/resume support\n if (window.webkit.messageHandlers.resumeNativeCam) {\n window.webkit.messageHandlers.resumeNativeCam.postMessage(undefined);\n }\n }\n}\n\nexport { NativeBridge };\n","import uuid from 'uuid';\nimport { INativeStreamTrack, NativeTrackSettings } from './INativeStreamTrack';\n\nclass NativeStreamTrack implements INativeStreamTrack {\n public readonly id: string;\n public readonly label: string;\n private settings: NativeTrackSettings;\n\n constructor(resolution: {width: number, height: number}) {\n this.id = uuid();\n this.label = 'native-stream-track';\n this.settings = {\n height: resolution.height,\n width: resolution.width,\n };\n }\n public getSettings() {\n return this.settings;\n }\n public stop() {\n window.NativeBridge.close();\n }\n}\n\nexport { NativeStreamTrack };\n","import uuid from 'uuid';\r\nimport { INativeStream } from './INativeStream';\r\nimport { NativeStreamTrack } from './NativeStreamTrack';\r\n\r\nclass NativeStream implements INativeStream {\r\n public readonly id: string;\r\n private tracks: NativeStreamTrack[] = [];\r\n\r\n constructor(resolution?: any | undefined) {\r\n this.id = uuid();\r\n this.tracks.push(new NativeStreamTrack(resolution));\r\n }\r\n\r\n public getTracks(): any[] {\r\n return this.tracks;\r\n }\r\n\r\n public getVideoTracks(): any[] {\r\n return this.tracks;\r\n }\r\n}\r\n\r\nexport { NativeStream };\r\n","import { RemoteLog, RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../../../package.json';\nimport { NativeBridgeParameters } from './AbstractNativeBridge.js';\nimport { INativeBridgeMedia } from './INativeBridgeMedia';\nimport { NativeBridge } from './NativeBridge';\nimport { NativeStream } from './NativeStream';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'NativeBridgeMedia');\n\nclass NativeBridgeMedia implements INativeBridgeMedia {\n private remoteLog = new RemoteLog();\n\n public getUserMedia(constraints: MediaStreamConstraints): Promise {\n logger.info('opening Native Camera with {}', JSON.stringify(constraints));\n\n const requiredResolution: any = this.getRequiredResolution(constraints);\n\n return new Promise ((resolve, reject) => {\n window.NativeBridge = new NativeBridge();\n window.NativeBridge.start(requiredResolution);\n window.NativeBridge.onStartNativeCam = (resolution: any, error: any) => {\n if (error) {\n const message = 'Error starting Native Camera -> ' + JSON.stringify(error);\n logger.error(message);\n this.remoteLog.sendAppViewSession({\n statusCode: 'webcam-stream-error',\n statusText: message,\n });\n reject(error);\n } else {\n logger.info('Started Native Camera');\n this.remoteLog.sendAppViewSession({\n statusCode: 'webcam-stream',\n statusText: 'Started Native Camera',\n });\n resolve(new NativeStream(resolution));\n }\n window.NativeBridge.onStartNativeCam = undefined;\n };\n });\n }\n\n private getRequiredResolution(constraints: MediaStreamConstraints): NativeBridgeParameters | null {\n // tslint:disable-next-line:no-unnecessary-initializer\n let requiredResolution: NativeBridgeParameters | null = null;\n\n if (constraints &&\n constraints.video &&\n typeof (constraints.video) !== 'boolean' &&\n constraints.video.width &&\n constraints.video.height) {\n const width = (typeof (constraints.video.width) === 'number') ?\n constraints.video!.width :\n constraints.video.width.ideal;\n\n const height = (typeof (constraints.video.height) === 'number') ?\n constraints.video!.height :\n constraints.video.height.ideal;\n\n requiredResolution = {\n resolution: {\n height: height!,\n width: width!,\n },\n };\n }\n return requiredResolution;\n }\n}\n\nexport { NativeBridgeMedia };\n","import { MockBridgeMedia } from '../mockWebcam/MockBridgeMedia';\r\nimport { NativeBridgeMedia } from '../nativeWebcam/NativeBridgeMedia';\r\nimport { IUserMedia } from './IUserMedia';\r\nimport { WebCamStream } from './WebCamStream';\r\n\r\nclass UserMedia implements IUserMedia {\r\n private userMedia: any;\r\n private readonly mockOptionName = 'vm.mock.video';\r\n\r\n constructor() {\r\n\r\n if (localStorage.getItem(this.mockOptionName) === 'true') { // mock enabled\r\n this.userMedia = new MockBridgeMedia();\r\n } else {\r\n this.userMedia = navigator.mediaDevices || new NativeBridgeMedia();\r\n }\r\n }\r\n\r\n public get(): MediaDevices | NativeBridgeMedia | MockBridgeMedia {\r\n return this.userMedia;\r\n }\r\n}\r\n\r\nexport { UserMedia };\r\n","import { toDataURL } from './ImageLoader';\r\nimport { MockStream } from './MockStream';\r\n\r\nclass MockVideoStream {\r\n\r\n private videoSrc: string;\r\n\r\n private imageElement: HTMLImageElement;\r\n private privateCurrentTime = 0;\r\n private mediaStream: MockStream;\r\n\r\n private playingListener: any[] = [];\r\n\r\n public get currentTime(): number {\r\n this.privateCurrentTime++;\r\n return this.privateCurrentTime;\r\n }\r\n\r\n public get videoWidth(): number {\r\n return this.imageElement?.naturalWidth;\r\n }\r\n\r\n public get videoHeight(): number {\r\n return this.imageElement?.naturalHeight;\r\n }\r\n\r\n public get defaultMuted(): boolean {\r\n // tslint:disable-next-line:no-console\r\n console.debug('This is a mock context, defaultMuted will always return true');\r\n return true;\r\n }\r\n\r\n public set defaultMuted(value: boolean) {\r\n // tslint:disable-next-line:no-console\r\n console.debug('This is a mock context, is not possible to set mute a video stream');\r\n }\r\n\r\n public get width(): number {\r\n return this.imageElement.naturalWidth;\r\n }\r\n\r\n public set width(value: number) {\r\n // tslint:disable-next-line:no-console\r\n console.debug('This is a mock context, not possible to set image width');\r\n }\r\n\r\n public get height(): number {\r\n return this.imageElement.naturalHeight;\r\n }\r\n\r\n public set height(value: number) {\r\n // tslint:disable-next-line:no-console\r\n console.debug('This is a mock context, not possible to set image height');\r\n }\r\n\r\n constructor(\r\n options: {\r\n target: string,\r\n id?: string,\r\n className?: string,\r\n }\r\n ) {\r\n\r\n const videoSrc = localStorage.getItem('vm.mock.videoSrc');\r\n if (!!videoSrc) {\r\n this.videoSrc = videoSrc;\r\n } else {\r\n throw new Error('no video src defined');\r\n }\r\n\r\n const targetElement = document.getElementById(options.target);\r\n if (!targetElement) {\r\n throw new Error('Impossible to start mock video on undefined element -> ' + options.target);\r\n }\r\n\r\n this.mediaStream = new MockStream();\r\n this.imageElement = new Image();\r\n this.imageElement.id = options.id || '';\r\n this.imageElement.className = options.className || '';\r\n\r\n targetElement.appendChild(this.imageElement);\r\n }\r\n\r\n // tslint:disable-next-line:max-line-length\r\n public addEventListener(\r\n type: string,\r\n listener: EventListenerOrEventListenerObject | any,\r\n options?: boolean | AddEventListenerOptions | undefined\r\n ) {\r\n if (type === 'playing') {\r\n this.playingListener.push(listener);\r\n } else {\r\n listener();\r\n }\r\n }\r\n\r\n // tslint:disable-next-line:max-line-length\r\n public removeEventListener(\r\n type: string, listener: EventListenerOrEventListenerObject,\r\n options?: boolean | EventListenerOptions | undefined\r\n ) {\r\n if (type === 'playing') {\r\n this.playingListener = [];\r\n }\r\n }\r\n\r\n public play(): Promise {\r\n return new Promise((resolve, reject) => {\r\n this.waitForFrame().then(() => {\r\n for (const listener of this.playingListener) {\r\n listener();\r\n }\r\n resolve();\r\n }).catch(() => {\r\n reject();\r\n });\r\n });\r\n }\r\n\r\n public pause(): void {\r\n console.debug('This is a mock context, not possible to pause');\r\n\r\n }\r\n\r\n public close(): void {\r\n console.debug('This is a mock context, not possible to close');\r\n }\r\n\r\n public get image() {\r\n return this.imageElement;\r\n }\r\n\r\n private waitForFrame(): Promise {\r\n return toDataURL(this.videoSrc).then((imgData) => {\r\n try {\r\n this.imageElement.setAttribute('src', imgData as string);\r\n } catch (error) {\r\n throw error;\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport { MockVideoStream };\r\n","import { NativeStream } from './NativeStream';\n\nclass NativeVideoStream {\n private imageElement: any;\n private privateCurrentTime = 0;\n private mediaStream: NativeStream;\n\n private playingListener: any[] = [];\n\n public get currentTime(): number {\n return this.privateCurrentTime;\n }\n\n public get videoWidth(): number {\n return this.imageElement.width;\n }\n\n public get videoHeight(): number {\n return this.imageElement.height;\n }\n\n public get defaultMuted(): boolean {\n // tslint:disable-next-line:no-console\n console.debug('This is a native context, defaultMuted will always return true');\n return true;\n }\n\n public set defaultMuted(value: boolean) {\n // tslint:disable-next-line:no-console\n console.debug('This is a native context, is not possible to set mute a video stream');\n }\n\n public get width(): number {\n return this.imageElement.width;\n }\n\n public set width(value: number) {\n // tslint:disable-next-line:no-console\n console.debug('This is a native context, not possible to set image width');\n }\n\n public get height(): number {\n return this.imageElement.height;\n }\n\n public set height(value: number) {\n // tslint:disable-next-line:no-console\n console.debug('This is a native context, not possible to set image height');\n }\n\n constructor(options: {\n target: string,\n id?: string,\n className?: string,\n },\n mediaStream: NativeStream) {\n\n this.mediaStream = mediaStream;\n this.imageElement = new Image();\n\n this.imageElement.width = this.mediaStream.getVideoTracks()[0].getSettings().width;\n this.imageElement.height = this.mediaStream.getVideoTracks()[0].getSettings().height;\n\n window.NativeBridge.onCamFrame = (base64: string) => {\n this.imageElement.src = base64;\n };\n }\n\n // tslint:disable-next-line:max-line-length\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject | any, options?: boolean | AddEventListenerOptions | undefined) {\n if (type === 'playing') {\n this.playingListener.push(listener);\n } else {\n listener();\n }\n }\n\n // tslint:disable-next-line:max-line-length\n public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions | undefined) {\n if (type === 'playing') {\n this.playingListener = [];\n }\n // mock\n }\n\n public play(): Promise {\n return new Promise((resolve, reject) => {\n window.NativeBridge.resume();\n this.waitForFrame()\n .then(() => {\n this.startTimeCounter();\n for (const listener of this.playingListener) {\n listener();\n }\n resolve();\n })\n .catch(() => {\n reject();\n });\n });\n }\n\n public pause(): void {\n window.NativeBridge.pause();\n }\n\n public close(): void {\n window.NativeBridge.close();\n }\n\n public get image() {\n return this.imageElement;\n }\n\n private waitForFrame(): Promise {\n return new Promise((resolve, reject) => {\n this.imageElement.onload = () => {\n resolve();\n };\n this.imageElement.onerror = () => {\n reject();\n };\n });\n }\n\n private startTimeCounter() {\n this.imageElement.onload = () => { this.privateCurrentTime++; };\n }\n}\n\nexport { NativeVideoStream };\n","declare global {\n // tslint:disable-next-line:interface-name\n interface Element {\n setAttribute(name: string, value: null): void;\n }\n}\n\nclass WebCamVideoStream {\n private video: HTMLVideoElement;\n\n public get currentTime(): number {\n return this.video.currentTime;\n }\n\n public get videoWidth(): number {\n return this.video.videoWidth;\n }\n\n public get videoHeight(): number {\n return this.video.videoHeight;\n }\n\n public get defaultMuted(): boolean {\n return this.video.defaultMuted;\n }\n\n public set defaultMuted(value: boolean) {\n this.video.defaultMuted = value;\n }\n\n public get width(): number {\n return this.video.width;\n }\n\n public set width(value: number) {\n this.video.width = value;\n }\n\n public get height(): number {\n return this.video.height;\n }\n\n public set height(value: number) {\n this.video.height = value;\n }\n\n constructor(options: {\n target: string,\n id?: string,\n className?: string,\n },\n mediaStream: MediaStream) {\n\n const targetElement = document.getElementById(options.target);\n if (!targetElement) {\n throw new Error('Impossible to start video on undefined element -> ' + options.target);\n }\n this.video = document.createElement('video');\n this.video.id = options.id || '';\n this.video.className = options.className || '';\n this.video.muted = true;\n this.video.setAttribute('playsinline', null);\n this.video.srcObject = mediaStream;\n\n targetElement.appendChild(this.video);\n }\n\n // tslint:disable-next-line:max-line-length\n public addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined) {\n this.video.addEventListener(type, listener, options);\n }\n\n // tslint:disable-next-line:max-line-length\n public removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions | undefined) {\n this.video.removeEventListener(type, listener, options);\n }\n\n public play(): Promise {\n return this.video.play();\n }\n\n public pause(): void {\n this.video.pause();\n }\n\n public get image() {\n return this.video;\n }\n}\n\nexport { WebCamVideoStream };\n","import { MockVideoStream } from '../mockWebcam/MockVideoStream';\r\nimport { NativeStream } from '../nativeWebcam/NativeStream';\r\nimport { NativeVideoStream } from '../nativeWebcam/NativeVideoStream';\r\nimport { WebCamVideoStream } from './WebCamVideoStream';\r\n\r\nclass WebCamStream {\r\n private readonly mockOptionName = 'vm.mock.video';\r\n private privateStreamObject: WebCamVideoStream | NativeVideoStream | MockVideoStream;\r\n\r\n constructor( \r\n options: {\r\n target: string,\r\n id?: string,\r\n className?: string,\r\n },\r\n stream: MediaStream | NativeStream\r\n ) {\r\n if (this.isMockStream()) {\r\n this.privateStreamObject = new MockVideoStream(options);\r\n } else if (this.isMediaStream(stream)) {\r\n this.privateStreamObject = new WebCamVideoStream(options, stream as MediaStream);\r\n } else {\r\n this.privateStreamObject = new NativeVideoStream(options, stream as NativeStream);\r\n }\r\n }\r\n\r\n public get streamObject(): WebCamVideoStream | NativeVideoStream | MockVideoStream {\r\n return this.privateStreamObject;\r\n }\r\n\r\n public close() {\r\n if (this.privateStreamObject.constructor.name === WebCamVideoStream.name) {\r\n this.privateStreamObject.pause();\r\n } else {\r\n (this.privateStreamObject as NativeVideoStream).close();\r\n }\r\n }\r\n\r\n public isMockStream(): boolean {\r\n return localStorage.getItem(this.mockOptionName) === 'true';\r\n }\r\n\r\n public isNativeStream(): boolean {\r\n return this.privateStreamObject.constructor.name === NativeStream.name;\r\n }\r\n\r\n private isMediaStream(stream: MediaStream | NativeStream): boolean {\r\n return stream.constructor.name === MediaStream.name;\r\n }\r\n}\r\n\r\nexport { WebCamStream };\r\n","import { CameraFacingMode } from './CameraFacingMode';\n\nconst defaultContraints = {\n audio: false,\n video: {\n facingMode: 'user',\n height: { ideal: 720, max: 1080 },\n width: { ideal: 1280, max: 1920 },\n },\n};\n\nconst cameraBlackList = [\n 'Snap Camera',\n];\n\nclass WebCamConstraints {\n\n public static getConstraints(\n w: number,\n h: number,\n cameraFacingMode: CameraFacingMode,\n ): Promise {\n return WebCamConstraints.getDeviceIdConstraints().then((deviceIds) => {\n return {\n ...defaultContraints,\n audio: false,\n video: {\n deviceId: deviceIds,\n facingMode: cameraFacingMode,\n height: { ...defaultContraints.video.height, ideal: h },\n width: { ...defaultContraints.video.width, ideal: w },\n },\n };\n });\n }\n\n // Filter out blacklisted cameras, for example we don't use want to use Snap Camera\n // The method leverage on navigator.mediaDevices and\n // there are two possible reasons for navigator.mediaDevices to not available:\n // 1 - the browser does not support webcams\n // 2 - the browser got a NativeBridge available\n // both points are handled by errors and NativeBridge so should be safe to return undefined in such cases\n private static getDeviceIdConstraints(): Promise {\n return navigator.mediaDevices && navigator.mediaDevices.enumerateDevices().then((devices) => {\n return devices.filter((device) => {\n return device.kind === 'videoinput' && !cameraBlackList.includes(device.label);\n }).map((device) => device.deviceId);\n }) || Promise.resolve(undefined);\n }\n}\n\nexport { WebCamConstraints, defaultContraints };\n","abstract class WebCamAbstractError extends Error {\n public type: string;\n\n constructor(type: string, message: string, error?: Error) {\n super(message);\n this.type = type;\n this.name = type;\n this.message = message;\n this.stack = error?.stack;\n\n Object.setPrototypeOf(this, WebCamAbstractError.prototype);\n }\n}\n\nexport { WebCamAbstractError };\n","import { WebCamAbstractError } from './WebCamAbstractError';\n\nclass WebCamAccessNotFoundError extends WebCamAbstractError {\n public static type = 'WebCamAccessNotFoundError';\n\n constructor(error?: Error) {\n super(WebCamAccessNotFoundError.type, 'webcam not found', error);\n Object.setPrototypeOf(this, WebCamAccessNotFoundError.prototype);\n }\n}\n\nexport { WebCamAccessNotFoundError };\n","import { WebCamAbstractError } from './WebCamAbstractError';\n\nclass WebCamAccessRejectedError extends WebCamAbstractError {\n public static type = 'WebCamAccessRejectedError';\n\n constructor(error?: Error) {\n super(WebCamAccessRejectedError.type, 'webcam access was rejected', error);\n Object.setPrototypeOf(this, WebCamAccessRejectedError.prototype);\n }\n}\n\nexport { WebCamAccessRejectedError };\n","import { WebCamAbstractError } from './WebCamAbstractError';\n\nclass WebCamAccessSystemError extends WebCamAbstractError {\n public static type = 'WebCamAccessSystemError';\n\n constructor(error?: Error) {\n super(WebCamAccessSystemError.type, 'webcam access was rejected', error);\n Object.setPrototypeOf(this, WebCamAccessSystemError.prototype);\n }\n}\n\nexport { WebCamAccessSystemError };\n","import { RemoteLog, RemoteLogConfig } from '@luxottica/vm-remotelog';\r\nimport { name, version } from '../package.json';\r\nimport { UserMedia } from './domain/adapter/UserMedia';\r\nimport { WebCamStream } from './domain/adapter/WebCamStream';\r\nimport { CameraFacingMode } from './domain/CameraFacingMode';\r\nimport { MockStream } from './domain/mockWebcam/MockStream';\r\nimport { NativeStream } from './domain/nativeWebcam/NativeStream';\r\nimport { NativeStreamTrack } from './domain/nativeWebcam/NativeStreamTrack';\r\nimport { WebCamConstraints } from './domain/WebCamConstraints';\r\nimport { WebCamAbstractError } from './error/WebCamAbstractError';\r\nimport { WebCamAccessNotFoundError } from './error/WebCamAccessNotFoundError';\r\nimport { WebCamAccessRejectedError } from './error/WebCamAccessRejectedError';\r\nimport { WebCamAccessSystemError } from './error/WebCamAccessSystemError';\r\nimport { AppViewSessionKeys } from './remotelog/AppViewSessionKeys';\r\n\r\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'WebCam');\r\n\r\nclass WebCam {\r\n\r\n private remoteLog = new RemoteLog();\r\n\r\n private userMediaPromise: Promise | undefined;\r\n private userReqPermissionTime = 0;\r\n private userResPermissionTime = 0;\r\n\r\n public tryToOpenWebCam(\r\n w: number,\r\n h: number,\r\n cameraFacingMode: CameraFacingMode,\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n WebCamConstraints.getConstraints(w, h, cameraFacingMode).then((constraints) => {\r\n this.tryToOpen(constraints)\r\n .then((mediaStream) => resolve(mediaStream))\r\n .catch((reason) => {\r\n switch (reason.name) {\r\n case 'AbortError':\r\n case 'NotReadableError':\r\n reject(new WebCamAccessSystemError());\r\n case 'NotFoundError':\r\n case 'TypeError':\r\n case 'OverconstrainedError':\r\n reject(new WebCamAccessNotFoundError());\r\n case 'NotAllowedError':\r\n case 'SecurityError':\r\n reject(new WebCamAccessRejectedError());\r\n default:\r\n reject(new WebCamAccessSystemError());\r\n }\r\n });\r\n });\r\n });\r\n }\r\n\r\n public closeCurrentMediaStream(): void {\r\n if (this.userMediaPromise) {\r\n this.userMediaPromise.then((mediaStream) => {\r\n try {\r\n mediaStream.getTracks().forEach((track: MediaStreamTrack | NativeStreamTrack) => {\r\n const totalWebCamTime = this.streamOpenedTotalTime();\r\n logger.info('closing webcam mediastream {} track {} [after {} secs]',\r\n mediaStream.id, track.label, totalWebCamTime);\r\n track.stop();\r\n this.logCloseSucc(mediaStream.id, totalWebCamTime);\r\n });\r\n } catch (error) {\r\n logger.warn('error closing mediastream {} tracks', mediaStream.id);\r\n }\r\n }).catch((reason) => {\r\n logger.warn('error closing mediastream: {}', reason);\r\n });\r\n }\r\n }\r\n\r\n public listMediaDevices() {\r\n const devices = navigator.mediaDevices.enumerateDevices();\r\n devices.then((devicesInfo) => {\r\n devicesInfo.forEach((deviceInfo) => {\r\n logger.info('found {}: {}', deviceInfo.deviceId, deviceInfo.label);\r\n });\r\n });\r\n }\r\n\r\n public createStreamObject(\r\n options: { target: string, id?: string, className?: string },\r\n stream: MediaStream | NativeStream,\r\n ): WebCamStream {\r\n return new WebCamStream(options, stream);\r\n }\r\n\r\n private tryToOpen(\r\n constraints: MediaStreamConstraints,\r\n ): Promise {\r\n\r\n logger.info('try to open webcam fow with constraints {}', JSON.stringify(constraints));\r\n this.remoteLog.sendAppViewSession(\r\n {\r\n statusCode: AppViewSessionKeys.WEBCAM_OK + AppViewSessionKeys.WEBCAM_OPENING,\r\n statusText: JSON.stringify(constraints),\r\n },\r\n );\r\n\r\n this.userReqPermissionTime = performance.now();\r\n this.userMediaPromise = new UserMedia().get().getUserMedia(constraints);\r\n\r\n this.userMediaPromise.then((mediaStream) => {\r\n this.userResPermissionTime = performance.now();\r\n\r\n const permissionWaitingTime = this.permissionWaitingTime();\r\n logger.info('webcam opened in {} secs [mediastream id: {}]', permissionWaitingTime, mediaStream.id);\r\n\r\n this.logOpenSucc(mediaStream.id, permissionWaitingTime);\r\n\r\n mediaStream.getVideoTracks().map((track) => {\r\n this.logTrackSettings(track);\r\n });\r\n\r\n }).catch((reason: any) => { // TODO: MediaStreamError has been depricated\r\n logger.warn('webcam not opened after {} secs ([{}] {})',\r\n this.permissionWaitingTime(), reason.name, reason.message);\r\n if (reason.constraintName) {\r\n logger.warn('failed constraint: {}' + reason.constraintName);\r\n }\r\n this.logOpenFail(reason);\r\n });\r\n\r\n return this.userMediaPromise;\r\n }\r\n\r\n private logCloseSucc(mediaStreamId: string, totalWebCamTime: number) {\r\n this.remoteLog.sendAppViewSession(\r\n {\r\n statusCode: AppViewSessionKeys.WEBCAM_OK + AppViewSessionKeys.WEBCAM_CLOSED,\r\n statusText: mediaStreamId,\r\n },\r\n {\r\n statusCode: AppViewSessionKeys.WEBCAM_OK + AppViewSessionKeys.WEBCAM_POWERED_TIME,\r\n statusText: totalWebCamTime ? totalWebCamTime.toFixed(2) : 'n.a.',\r\n },\r\n );\r\n }\r\n\r\n private logOpenSucc(mediaStreamId: string, permissionWaitingTime: number) {\r\n this.remoteLog.sendAppViewSession(\r\n {\r\n statusCode: AppViewSessionKeys.WEBCAM_OK,\r\n statusText: mediaStreamId,\r\n },\r\n );\r\n this.remoteLog.sendAppViewSession(\r\n {\r\n statusCode: AppViewSessionKeys.WEBCAM_OK + AppViewSessionKeys.WEBCAM_OPENING_TIME,\r\n statusText: permissionWaitingTime ? permissionWaitingTime.toFixed(2) : 'n.a.',\r\n },\r\n );\r\n }\r\n\r\n private logOpenFail(reason: any) { // TODO: MediaStreamError has been depricated\r\n this.remoteLog.sendAppViewSession(\r\n {\r\n statusCode: AppViewSessionKeys.WEBCAM_KO,\r\n statusText: reason.name,\r\n },\r\n {\r\n statusCode: AppViewSessionKeys.WEBCAM_KO_REASON_MESS,\r\n statusText: reason.name + ': ' + reason.message,\r\n },\r\n );\r\n }\r\n\r\n private logTrackSettings(track: MediaStreamTrack | NativeStreamTrack) {\r\n if (track && track.getSettings()) {\r\n const deviceW = track.getSettings().width;\r\n const deviceH = track.getSettings().height;\r\n const wcamfps = track.getSettings().frameRate;\r\n logger.info('webcam mediastream track available \\'{}\\' [id {} - w {} - h {} - framerate {}]',\r\n track.label, track.id, deviceW, deviceH, wcamfps);\r\n this.remoteLog.sendAppViewSession(\r\n {\r\n statusCode: AppViewSessionKeys.WEBCAM_OK + AppViewSessionKeys.WEBCAM_SIZE_W,\r\n statusText: deviceW ? deviceW.toString() : 'n.a.',\r\n }, {\r\n statusCode: AppViewSessionKeys.WEBCAM_OK + AppViewSessionKeys.WEBCAM_SIZE_H,\r\n statusText: deviceH ? deviceH.toString() : 'n.a.',\r\n }, {\r\n statusCode: AppViewSessionKeys.WEBCAM_OK + AppViewSessionKeys.WEBCAM_FRAMERATE,\r\n statusText: wcamfps ? Math.round(wcamfps).toString() : 'n.a.',\r\n },\r\n );\r\n }\r\n }\r\n\r\n private streamOpenedTotalTime(): number {\r\n return this.userResPermissionTime === 0 ? 0 : (performance.now() - this.userResPermissionTime) / 1000;\r\n }\r\n\r\n private permissionWaitingTime(): number {\r\n return this.userReqPermissionTime === 0 ? 0 : (performance.now() - this.userReqPermissionTime) / 1000;\r\n }\r\n\r\n}\r\n\r\nexport {\r\n WebCam,\r\n WebCamAbstractError,\r\n WebCamAccessNotFoundError,\r\n WebCamAccessRejectedError,\r\n WebCamAccessSystemError,\r\n WebCamStream,\r\n NativeStream,\r\n CameraFacingMode,\r\n};\r\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n"],"sourceRoot":""}