{"version":3,"file":"29.chunk.js","mappings":"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","sources":["../node_modules/@luxottica/virtual-mirror/src/app/functions/WarmUp.ts","../node_modules/@luxottica/virtual-mirror/src/errors/errors.ts","../node_modules/@luxottica/virtual-mirror/src/constants/DefaultInitializationOptions.ts","../node_modules/@luxottica/virtual-mirror/src/helpers/FeatureConfigHelper.ts","../node_modules/@luxottica/virtual-mirror/src/interfaces/Features.ts","../node_modules/@luxottica/virtual-mirror/src/app/service/FeatureLicensingService.ts","../node_modules/@luxottica/virtual-mirror/src/app/VmCore.tsx","../node_modules/@luxottica/virtual-mirror/src/constants/actions.ts","../node_modules/@luxottica/virtual-mirror/src/reducers/appReducer.ts","../node_modules/@luxottica/virtual-mirror/src/reducers/mirrorReducer.ts","../node_modules/@luxottica/virtual-mirror/src/reducers/userReducer.ts","../node_modules/@luxottica/virtual-mirror/src/reducers/combinedReducers.ts","../node_modules/@luxottica/virtual-mirror/src/helpers/TransitionColorHelper.ts","../node_modules/@luxottica/virtual-mirror/src/remotelog/AppViewSessionKeys.ts","../node_modules/@luxottica/virtual-mirror/src/Store.ts","../node_modules/@luxottica/virtual-mirror/src/constants/DOMEvents.ts","../node_modules/@luxottica/virtual-mirror/src/helpers/CallbackHelper.ts","../node_modules/@luxottica/virtual-mirror/src/app/functions/AnimateOpacity.ts","../node_modules/@luxottica/virtual-mirror/src/helpers/RequestHelper.ts","../node_modules/@luxottica/virtual-mirror/src/constants/Events.ts","../node_modules/@luxottica/virtual-mirror/src/remotelog/VmLogger.ts","../node_modules/@luxottica/virtual-mirror/src/helpers/AdobeHelper.ts","../node_modules/@luxottica/virtual-mirror/src/helpers/AnalyticsHelper.ts","../node_modules/@luxottica/virtual-mirror/src/app/mirror/VmWebCam.ts","../node_modules/@luxottica/virtual-mirror/src/app/functions/Pause.ts","../node_modules/@luxottica/virtual-mirror/src/app/functions/SetTransitionOverrideColor.ts","../node_modules/@luxottica/virtual-mirror/src/Catalogue.ts","../node_modules/@luxottica/virtual-mirror/src/helpers/LocalizationDefaults.ts","../node_modules/@luxottica/virtual-mirror/src/helpers/LocalizationHelper.ts","../node_modules/@luxottica/virtual-mirror/src/interfaces/GestureDetector.ts","../node_modules/@luxottica/virtual-mirror/src/VirtualMirror.ts","../node_modules/@luxottica/virtual-mirror/src/app/functions/GetBipaVersion.ts","../node_modules/@luxottica/virtual-mirror/src/app/functions/SaveBipaEntry.ts","../node_modules/@luxottica/virtual-mirror/src/app/functions/SetTransitionOpacity.ts","../node_modules/@luxottica/virtual-mirror/src/app/functions/RecreateFaceWeb.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/errors/errors.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/constants/DefaultPrivacyLocalization.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/helpers/LocalizationHelper.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/interfaces/PrivacyLocalization.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/helpers/ParameterHelper.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/components/ErrorIcon.tsx","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/components/BipaBiometricForm.tsx","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/components/YesNoCheckbox.tsx","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/components/PrivacyAgreement.tsx","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/helpers/CookieHelper.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/helpers/RequestHelper.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/BipaOverlay.tsx","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/constants/Styling.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/bipa-manager/src/BipaManager.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/constants/Environment.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/config/GlassesApiConfig.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/config/CatalogueApiConfig.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/helpers/UpcAvailabilityResponse/NotAvailable.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/helpers/UpcAvailabilityResponse/Standard.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/CatalogService.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/helpers/UpcAvailabilityResponse/QATool.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/Catalog.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/AssetDecoder.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/remotelog/AppViewSessionKeys.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/constants/AssetNames.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/constants/GltfDefault.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/constants/MockAssetData.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/error/GenericError.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/error/GlassesDownloadError.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/error/GlassesDownloadForbiddenError.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/error/GlassesNotFoundError.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/helpers/AssetHelper.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/GlassesExtractor.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/ZipDownloader.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-glasses/src/GlassesDownloader.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/node_modules/uuid/dist/esm-browser/rng.js","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/node_modules/uuid/dist/esm-browser/regex.js","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/node_modules/uuid/dist/esm-browser/validate.js","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/node_modules/uuid/dist/esm-browser/v4.js","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/model/LogMessage.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/adapter/db/factory/DBRemoteLogFactory.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/config/LogsConfigurationRetriever.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/config/LogsConfig.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/log/producer/RemoteLogService.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/appender/RemoteLogAppender.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/RemoteLogConfig.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/adapter/db/factory/DBAppViewSessionFactory.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/config/VmAnalyticsApiConfig.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/helpers/RequestHelper.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/adapter/rest/AppViewSessionAdapter.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/log/consumer/AppViewSessionConsumer.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/job/AppViewSessionConsumerJob.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/adapter/db/factory/DBBrowserSessionFactory.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/adapter/rest/BrowserSessionAdapter.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/log/consumer/BrowserSessionConsumer.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/job/BrowserSessionConsumerJob.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/adapter/rest/RemoteLogAdapter.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/log/consumer/RemoteLogConsumer.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/job/RemoteLogConsumerJob.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/adapter/db/factory/DBTrackingStatusFactory.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/adapter/rest/TrackingStatusAdapter.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/log/consumer/TrackingStatusConsumer.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/job/TrackingStatusConsumerJob.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/job/JobsStarter.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/log/producer/AppViewSessionService.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/log/producer/BrowserSessionService.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/domain/service/log/producer/TrackingStatusService.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-remotelog/src/RemoteLog.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/mockWebcam/ImageLoader.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/mockWebcam/MockStreamTrack.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/mockWebcam/MockStream.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/mockWebcam/MockBridgeMedia.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/nativeWebcam/AbstractNativeBridge.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/nativeWebcam/NativeBridge.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/nativeWebcam/NativeStreamTrack.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/nativeWebcam/NativeStream.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/nativeWebcam/NativeBridgeMedia.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/adapter/UserMedia.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/mockWebcam/MockVideoStream.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/nativeWebcam/NativeVideoStream.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/adapter/WebCamVideoStream.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/adapter/WebCamStream.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/cameraSets/CameraSets.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/domain/WebCamConstraints.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/error/WebCamAbstractError.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/error/WebCamAccessNotFoundError.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/error/WebCamAccessRejectedError.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/remotelog/AppViewSessionKeys.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/error/WebCamAccessSystemError.ts","../node_modules/@luxottica/virtual-mirror/node_modules/@luxottica/vm-webcam/src/WebCam.ts","../node_modules/@luxottica/virtual-mirror/node_modules/uuid/index.js","../node_modules/@luxottica/virtual-mirror/node_modules/uuid/lib/bytesToUuid.js","../node_modules/@luxottica/virtual-mirror/node_modules/uuid/lib/rng-browser.js","../node_modules/@luxottica/virtual-mirror/node_modules/uuid/v1.js","../node_modules/@luxottica/virtual-mirror/node_modules/uuid/v4.js","../node_modules/@luxottica/vm-eventbus/src/EventBus.ts"],"sourcesContent":["/**\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 */\n\n/* #if _PERFORMANCE_MEASUREMENTS\nimport { dispatchEvent } from '../../helpers/CallbackHelper'\nimport { faceWebPerformanceEvents as PEVFW } from '../../constants/DOMEvents'\n// #endif */\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 //performance analysis code\n /* #if _PERFORMANCE_MEASUREMENTS\n callbacks: {\n onSegmenterInitializeStart: () => (dispatchEvent(PEVFW.onSegmenterInitializeStart)),\n onSegmenterInitializeEnd: () => (dispatchEvent(PEVFW.onSegmenterInitializeEnd))\n }\n // #endif */\n });\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('./Effects')\n .then(({EffectManager}) => {\n EffectManager.addAutomaticEffects();\n });\n });\n };\n","import { Features } from '../interfaces/Features';\n\nclass VtoError extends Error {\n public type: string;\n public adobeErrorParameters: AdobeErrorParameters;\n\n constructor(type: string, errorSource: ErrorSource, message: string) {\n super(message);\n this.type = type;\n this.message = message;\n this.adobeErrorParameters = {\n errorSource: errorSource,\n errorCode: `Vm - ${type}`,\n errorDetails: message\n };\n\n Object.setPrototypeOf(this, VtoError.prototype);\n }\n}\n\nclass InitializationError extends VtoError {\n public static type = 'InitializationError';\n\n constructor() {\n super(InitializationError.type, 'Client', 'failed to initialize component');\n Object.setPrototypeOf(this, InitializationError.prototype);\n }\n}\n\nclass NotInitializedError extends VtoError {\n public static type = 'NotInitializedError';\n\n constructor() {\n super(NotInitializedError.type, 'Client', 'VirtualMirror must be initialized before rendering');\n Object.setPrototypeOf(this, NotInitializedError.prototype);\n }\n}\n\nclass InvalidParametersError extends VtoError {\n public static type = 'InvalidParametersError';\n\n constructor(parameter: string, value: string) {\n super(InvalidParametersError.type, 'Client', `'${parameter}: ${value}' parameter is invalid`);\n Object.setPrototypeOf(this, InvalidParametersError.prototype);\n }\n}\n\nclass InvalidLocaleError extends VtoError {\n public static type = 'InvalidLocaleError';\n\n constructor(locale: string) {\n super(InvalidLocaleError.type, 'Client', `invalid locale: ${locale} - supported format: aa-BB`);\n Object.setPrototypeOf(this, InvalidLocaleError.prototype);\n }\n}\n\nclass RenderingError extends VtoError {\n public static type = 'RenderingError';\n\n constructor(readonly upc: string) {\n super(RenderingError.type, 'Client', `upc ${upc} failed to successfully render`);\n Object.setPrototypeOf(this, RenderingError.prototype);\n }\n}\n\nclass UpcSupportedError extends VtoError {\n public static type = 'UpcSupportedError';\n\n constructor(readonly upc: string) {\n super(UpcSupportedError.type, 'Server', `failed to determine if upc ${upc} is supported`);\n Object.setPrototypeOf(this, UpcSupportedError.prototype);\n }\n}\n\nclass UpcMissingError extends VtoError {\n public static type = 'UpcMissingError';\n\n constructor(readonly upc: string) {\n super(UpcMissingError.type, 'Server', `upc ${upc} could not be found`);\n Object.setPrototypeOf(this, UpcMissingError.prototype);\n }\n}\n\nclass MountComponentError extends VtoError {\n public static type = 'MountComponentError';\n\n constructor(divId: string) {\n super(MountComponentError.type, 'Client', `failed to mount component at divId: ${divId}`);\n Object.setPrototypeOf(this, MountComponentError.prototype);\n }\n}\n\nclass UnmountComponentError extends VtoError {\n public static type = 'UnmountComponentError';\n\n constructor(divId: string) {\n super(UnmountComponentError.type, 'Client', `failed to unmount component at divId: ${divId}`);\n Object.setPrototypeOf(this, UnmountComponentError.prototype);\n }\n}\n\nclass WebcamUnavailableError extends VtoError {\n public static type = 'WebcamUnavailableError';\n\n constructor() {\n super(WebcamUnavailableError.type, 'User', 'webcam support could not be found');\n this.adobeErrorParameters.errorCode = 'Vm - WebcamNotFoundError';\n Object.setPrototypeOf(this, WebcamUnavailableError.prototype);\n }\n}\n\nclass WebcamRejectedError extends VtoError {\n public static type = 'WebcamRejectedError';\n\n constructor() {\n super(WebcamRejectedError.type, 'User', 'webcam access was rejected by user');\n Object.setPrototypeOf(this, WebcamRejectedError.prototype);\n }\n}\n\nclass OpacityError extends VtoError {\n public static type = 'OpacityError';\n\n constructor(message: string) {\n super(OpacityError.type, 'Client', message);\n Object.setPrototypeOf(this, OpacityError.prototype);\n }\n}\n\nclass AnimationError extends VtoError {\n public static type = 'AnimationError';\n\n constructor(message: string) {\n super(AnimationError.type, 'Client', message);\n Object.setPrototypeOf(this, AnimationError.prototype);\n }\n}\n\nclass MissingAuthKeyError extends VtoError {\n public static type = 'MissingAuthKeyError';\n\n constructor() {\n super(MissingAuthKeyError.type, 'Client', 'Virtual Mirror requires a key to work');\n Object.setPrototypeOf(this, MissingAuthKeyError.prototype);\n }\n}\n\nclass FeatureInitializationError extends VtoError {\n public static type = 'FeatureInitializationError';\n\n constructor() {\n super(FeatureInitializationError.type, 'Client', 'Virtual Mirror feature service failed to initialize');\n Object.setPrototypeOf(this, FeatureInitializationError.prototype);\n }\n}\n\nclass FeatureUnavailableError extends VtoError {\n public static type = 'FeatureUnavailableError';\n\n constructor(feature: Features) {\n super(FeatureUnavailableError.type, 'Client', `feature ${feature} is not available for this client`);\n Object.setPrototypeOf(this, FeatureUnavailableError.prototype);\n }\n}\n\nclass FeatureUndefinedError extends VtoError {\n public static type = 'FeatureUndefinedError';\n\n constructor() {\n super(FeatureUndefinedError.type, 'Client', 'Can\\'t get auth for undefined feature');\n Object.setPrototypeOf(this, FeatureUndefinedError.prototype);\n }\n}\n\nclass FeatureServerError extends VtoError {\n public static type = 'FeatureServerError';\n\n constructor(e) {\n super(FeatureServerError.type, 'Server', e.message);\n Object.setPrototypeOf(this, FeatureServerError.prototype);\n }\n}\n\nexport {\n VtoError,\n InitializationError,\n InvalidParametersError,\n InvalidLocaleError,\n NotInitializedError,\n RenderingError,\n UpcSupportedError,\n UpcMissingError,\n MountComponentError,\n UnmountComponentError,\n WebcamUnavailableError,\n WebcamRejectedError,\n OpacityError,\n AnimationError,\n MissingAuthKeyError,\n FeatureInitializationError,\n FeatureUnavailableError,\n FeatureUndefinedError,\n FeatureServerError,\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// eslint-disable-next-line @typescript-eslint/no-explicit-any\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 VM_GESTURE_DETECTION = 'VM_GESTURE_DETECTION',\n VM_DRESSEDON = 'VM_DRESSEDON',\n FASA_OVERRIDE_LABELS = 'FASA_OVERRIDE_LABELS'\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';\nexport const ACTIVATE_VIDEO = 'ACTIVATE_VIDEO';\nexport const DEACTIVATE_VIDEO = 'DEACTIVATE_VIDEO';\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\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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 ActiveVideo?: string;\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 activateVideo: createAction(Actions.ACTIVATE_VIDEO),\n deactivateVideo: createAction(Actions.DEACTIVATE_VIDEO),\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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.ACTIVATE_VIDEO]: (state, action: Action): MirrorStoreState => {\n return {...state, ActiveVideo: action.payload};\n },\n\n [Actions.DEACTIVATE_VIDEO]: (state, action: Action): MirrorStoreState => {\n return {...state, ActiveVideo: ''};\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 VM_OK = 'vm-ok',\n VM_KO = 'vm-ko',\n VM_INIT = '_init',\n VM_INIT_BRAND = '_init_brand',\n VM_INIT_CHANNEL = '_init_channel',\n VM_INIT_LOCALE = '_init_locale',\n VM_CLOSE = '_close',\n VM_FITMEBETTER = '_fitmebetter',\n VM_SCREENSHOT = '_screenshot',\n VM_RENDER = '_render',\n VM_RENDER_TIME = '_render_time_ms',\n VM_UPC_AVAILABILITY = '_upc_availability',\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 onNewTranscodeFile : 'onNewTranscodeFile',\n onEndTranscodeFile : 'onEndTranscodeFile',\n onFPSCount : 'onFPSCount'\n};\n\nexport const glassesRemovalPerformanceEvents = {\n onGlassesPresenceStart : 'onGlassesPresenceStart',\n onGlassesPresenceEnd : 'onGlassesPresenceEnd',\n onDetectInitStart : 'onDetectInitStart',\n onDetectInitEnd : 'onDetectInitEnd',\n onLoadSMModelStart : 'onLoadSMModelStart',\n onLoadSMModelEnd : 'onLoadSMModelEnd',\n onLoadLGModelStart : 'onLoadLGModelStart',\n onLoadLGModelEnd : 'onLoadLGModelEnd',\n};\n\nexport const faceWebPerformanceEvents = {\n onSegmenterInitializeStart : 'onSegmenterInitializeStart',\n onSegmenterInitializeEnd : 'onSegmenterInitializeEnd',\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 if (callbacks.onGesture) { CallbackHelper.onGesture = callbacks.onGesture; }\n if (callbacks.onBufferUpdate) { CallbackHelper.onBufferUpdate = callbacks.onBufferUpdate; }\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 onGesture: () => { return; },\n onBufferUpdate: () => { 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 { loginRequest, LoginReturn } from '@luxottica/vto-microservices';\nimport { VmStore } from '../app/VmCore';\nimport { CallbackHelper } from './CallbackHelper';\n\nconst RequestHelper = {\n login: (environment: MicroserviceEnvironment): Promise => {\n return loginRequest({\n environment: environment,\n accessToken: VmStore.getState().app.auth.accessToken,\n refreshToken: VmStore.getState().app.auth.refreshToken,\n onAuthUpdated: CallbackHelper.onAuthUpdated,\n version: 1\n });\n }\n};\n\nexport {\n RequestHelper\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 { 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) => {\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst sendEvent = (eventName: string, ...params: any) => {\n try {\n if (eventName in analyticsConfig) {\n if (analyticsConfig[eventName] !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\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 { DeviceDetection } from '@luxottica/vm-devicedetection';\nimport { WebCam, WebCamStream } from '@luxottica/vm-webcam';\nimport { AnalyticsHelper } from '../../helpers/AnalyticsHelper';\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 async openWebcamAndPlay(mock = false) {\n AnalyticsHelper.onRequestWebcam();\n let stream;\n \n if(!mock)\n stream = await this.tryToOpenWebCam(1280, 720).catch((reason)=>{AnalyticsHelper.onWebcamDenied(); throw reason;});\n\n AnalyticsHelper.onWebcamAllowed();\n const videoElementClassname = 'mirror-video' + (new DeviceDetection().isiOS() ? '-ios' : '');\n this.initStreamObject({\n target: 'target-mirror-container-wrapper',\n className: videoElementClassname,\n id: 'mirror-video',\n mock\n }, stream);\n await this.play();\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 { 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","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 { MicroserviceEnvironment } from '@luxottica/vto-microservices';\nimport { InvalidLocaleError } from '../errors/errors';\nimport { DeepPartial } from '../interfaces/DeepPartial';\nimport { createLogger } from '../remotelog/VmLogger';\nimport { FeatureLicensingService } from '../app/service/FeatureLicensingService';\nimport { Features } from '../interfaces/Features';\nimport { MissingAuthKeyError } from '../errors/errors';\nimport { \n LocalizationDefaults, \n MirrorTranslation, \n Translation, \n getLocaleRegionFallback\n} from './LocalizationDefaults';\n\nconst logger = createLogger('LocalizationHelper');\n\nexport class LocalizationHelper {\n\n private static baseUrl = 'https://d5nhc6q3o19l2.cloudfront.net';\n private static localeRegEx = new RegExp(/([a-z]{2})-([A-Z]{2}|[0-9]*)/);\n // private static localeIsoRegEx = new RegExp(/([a-z]{2})-[A-Z]{2}/);\n private static formatLocaleRegEx = new RegExp(/([a-z]{2})-([A-Z|a-z]{2})/);\n\n private static localizedTranslations: Translation;\n private static overriddenTranslations: DeepPartial;\n\n private static translationType = 'MIRROR';\n\n public static getString(page: string, key: string): string {\n let text = '';\n\n try {\n text = LocalizationHelper.getStringFromTranslation(page, key, this.localizedTranslations);\n } catch (e) {\n logger.warn(`local translation not found for [${this.translationType}][${page}][${key}] using default`);\n try {\n text = LocalizationHelper.getStringFromTranslation(page, key, LocalizationDefaults.translations);\n } catch (e) {\n logger.warn(`default translation not found for [${this.translationType}][${page}][${key}]`);\n }\n }\n return text;\n }\n\n private static getStringFromTranslation(page: string, key: string, translation: Translation): string {\n const text = (this.overriddenTranslations)?.[this.translationType]?.[page]?.[key];\n \n return (!!text) ? text : translation[this.translationType][page][key];\n }\n\n public static setOverrides(translations: DeepPartial) {\n\n if (!FeatureLicensingService.isInitialized()) {\n throw new MissingAuthKeyError();\n }\n\n const canOvverride = FeatureLicensingService.isFeatureAuthorized(Features.FASA_OVERRIDE_LABELS);\n\n if (canOvverride) {\n this.overriddenTranslations = {\n MIRROR: translations\n };\n return;\n }\n }\n\n public static initializeRemote(\n environment: MicroserviceEnvironment,\n locale: string,\n region: string,\n bipaActive: boolean\n ) {\n return new Promise((resolve, reject) => {\n this.localizationPromise(environment, locale, region, bipaActive)\n .then((localeReturn) => {\n this.localizedTranslations = localeReturn.localTranslations;\n resolve(localeReturn.locale);\n }).catch((error) => {\n reject(error);\n });\n });\n }\n\n private static fetchLocalization = (\n environment: MicroserviceEnvironment,\n locale: string\n ): Promise => {\n\n let textEnv;\n switch (environment) {\n case 'STAGING':\n textEnv = 'dev';\n break;\n case 'ACCEPTANCE':\n textEnv = 'test';\n break;\n case 'PRODUCTION':\n textEnv = 'prod';\n break;\n default:\n break;\n }\n\n const localizationFileUrl = `${LocalizationHelper.baseUrl}/vmmv/v1/${textEnv}/ui/application_${locale}.json`;\n\n return fetch(localizationFileUrl)\n .then((response) => {\n if (response.ok) {\n return response.json();\n } else {\n throw Error(`failed to find localization for locale: ${locale}`);\n }\n }).then((json) => {\n return json;\n });\n };\n\n private static localizationPromise = (\n environment: MicroserviceEnvironment,\n locale: string,\n region: string,\n bipaActive: boolean\n ) => {\n return new Promise<{ locale: string, localTranslations: Translation }>((resolve) => {\n const formattedLocale = LocalizationHelper.cleanLocale(locale, region, bipaActive);\n let resolvedLocale = formattedLocale;\n const localeLanguage = LocalizationHelper.localeRegEx.exec(formattedLocale);\n const language = localeLanguage && localeLanguage[1] || LocalizationDefaults.language;\n\n if (!localeLanguage) {\n const localeError = new InvalidLocaleError(locale);\n logger.error(JSON.stringify(localeError));\n // tslint:disable-next-line: no-console\n console.warn(localeError);\n }\n\n let translationFound = false;\n LocalizationHelper.fetchLocalization(environment, formattedLocale)\n .then((translation) => {\n translationFound = true;\n resolve({\n locale: formattedLocale,\n localTranslations: translation\n });\n }).catch(() => {\n logger.warn(`failed to find localization for locale: ${formattedLocale}, trying with ${getLocaleRegionFallback(region, language)}`);\n }).then(() => {\n resolvedLocale = getLocaleRegionFallback(region, language);\n if (!translationFound) {\n return LocalizationHelper.fetchLocalization(environment, resolvedLocale);\n } else {\n throw Error('break');\n }\n }).then((fallbackTranslation) => {\n translationFound = true;\n resolve({\n locale: resolvedLocale,\n localTranslations: fallbackTranslation\n });\n }).catch(() => {\n if (!translationFound) {\n logger.warn(`failed to find localization language ${language} mapped as locale: ${resolvedLocale}`);\n }\n }).then(() => {\n if (!translationFound) {\n resolvedLocale = LocalizationDefaults.locale;\n return LocalizationHelper.fetchLocalization(environment, resolvedLocale);\n } else {\n throw Error('break');\n }\n }).then((englishTranslation) => {\n translationFound = true;\n resolve({\n locale: resolvedLocale,\n localTranslations: englishTranslation\n });\n }).catch(() => {\n if (!translationFound) {\n logger.warn(\n `failed to find localization for locale: ${resolvedLocale}, falling back to default ${LocalizationDefaults.locale}`\n );\n }\n return Promise.resolve();\n }).then(() => {\n if (!translationFound) {\n resolve({\n locale: resolvedLocale,\n localTranslations: LocalizationDefaults.translations\n });\n }\n });\n });\n };\n\n private static cleanLocale(\n locale: string,\n region: string,\n bipaActive: boolean\n ) {\n\n // virtual-mirror.luxottica.com uses navigator.language to detect locale\n // on iOS navigator.language returns 'it' instead of 'it-IT'\n // this tries to handle the value\n let formattedLocale = locale;\n if (bipaActive && region === 'US'\n && locale !== 'en-US'\n && locale !== 'es-US') {\n logger.warn('invalid locale for privacy policy, reverting to \\'en-US\\'');\n formattedLocale = 'en-US';\n\n } else if (!formattedLocale || formattedLocale.length === 2) {\n formattedLocale = getLocaleRegionFallback(region, formattedLocale) || 'en-US';\n }\n\n formattedLocale = formattedLocale.replace(LocalizationHelper.formatLocaleRegEx, (match, p1, p2) => {\n return [p1, p2.toUpperCase()].join('-');\n });\n return formattedLocale;\n }\n\n public static getDefaults() {\n return LocalizationDefaults.translations.MIRROR;\n }\n\n public static getLocalizationTranslation() {\n return JSON.parse(JSON.stringify(LocalizationHelper.localizedTranslations));\n }\n}","export interface FormattedPose {\n position: {\n x: number;\n y: number;\n z: number;\n };\n rotation: {\n p: number;\n y: number;\n r: number;\n };\n}\n\nexport interface FormattedVector3 {\n x: number;\n y: number;\n z: number;\n}\n\nexport interface FormattedVector2 {\n x: number,\n y: number\n}\n\nexport interface FormattedRotation {\n p: number;\n y: number;\n r: number;\n}\n\nexport const GestureType = {\n // /**\n // * @deprecated - used internally, the integrator will never see this\n // */\n // NO_GESTURE: 'NO_GESTURE', // used only internally\n\n /**\n * User nod the head like a typical western cuture \"yes\".\n * The gesture starts with the user \"watching up\"\n */\n HEAD_NOD: 'HEAD_NOD',\n\n /**\n * User shakes the head like a typical western cuture \"no\"\n */\n HEAD_SHAKE: 'HEAD_SHAKE',\n\n /**\n * User watches twice Left\n */\n HEAD_LEFT: 'HEAD_LEFT',\n\n /**\n * User watches twice Right\n */\n HEAD_RIGHT: 'HEAD_RIGHT',\n\n /**\n * User watches twice Up\n */\n HEAD_UP: 'HEAD_UP',\n\n /**\n * User watches twice Down\n */\n HEAD_DOWN: 'HEAD_DOWN',\n\n /**\n * User tilt head twice on the left\n */\n HEAD_ROLL_LEFT: 'HEAD_ROLL_LEFT',\n\n /**\n * User tilt head twice on the right\n */\n HEAD_ROLL_RIGHT: 'HEAD_ROLL_RIGHT',\n} as const;\nexport type GestureType = keyof typeof GestureType;\n\nexport interface Gesture {\n type: GestureType;\n position: FormattedPose;\n rotation: FormattedRotation;\n positionScreen: FormattedVector2;\n}\n\nexport interface GestureDeadZone {\n p: {\n min: number;\n max: number;\n };\n y: {\n min: number;\n max: number;\n };\n r: {\n min: number;\n max: number;\n };\n}\n\nexport const GestureSimpleType = {\n none: 'none',\n left: 'left',\n center: 'center',\n right: 'right',\n up: 'up',\n down: 'down',\n rollright: 'rollright',\n rollleft: 'rollleft'\n} as const;\nexport type GestureSimpleType = keyof typeof GestureSimpleType;\n\nexport type GestureBufferElement = {\n type: GestureSimpleType,\n date: number; // DateTime\n}\n\nexport type GestureHistoryElement = {\n type: string,\n date: number; // DateTime\n}\n\nexport type GestureDictionary = {\n [key in K]: string[];\n};\n\nexport interface GestureDetectorOptions {\n debounceTime: number;\n deadZone: GestureDeadZone;\n timerInterval: number;\n gestureDictionary: GestureDictionary;\n minimumTriggerRotations: FormattedRotation;\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 { recreateFaceWeb } from './app/functions/RecreateFaceWeb';\nimport { getBipaVersion, GetBipaVersionResponse } from './app/functions/GetBipaVersion';\nimport { pause } from './app/functions/Pause';\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, glassesRemovalPerformanceEvents, faceWebPerformanceEvents } from './constants/DOMEvents';\nimport { UpcMissingError, UpcSupportedError, VtoError } from './errors/errors';\nimport { MirrorTranslation, Translation } 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';\nimport { GestureType, Gesture } from './interfaces/GestureDetector';\n\nlet EffectManager = undefined;\n\nconst VirtualMirror = {\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 import('./app/functions/Initialize').then(({initialize}) => {\n return initialize(params);\n });\n },\n\n overrideLocalization(translation: DeepPartial): void {\n return LocalizationHelper.setOverrides(translation);\n },\n\n getMirrorDefaultLocalization(): MirrorTranslation {\n return LocalizationHelper.getDefaults();\n },\n\n getMirrorLocalization(): Translation {\n return LocalizationHelper.getLocalizationTranslation();\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 async renderMirror(params: RenderMirrorParams): Promise {\n if(params.options.videoSrc){\n const { VideoManager } = await import('./app/functions/VideoInjector');\n await VideoManager.activate(params.options.videoSrc);\n }\n \n const { renderMirror } = await import('./app/functions/RenderMirror');\n return renderMirror(params);\n },\n\n pause(): void {\n return pause();\n },\n\n resume(): Promise {\n return import('./app/functions/Resume').then(({ resume }) => {\n return resume();\n });\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 async activateVideo(videoId: string): Promise {\n const { VideoManager } = await import('./app/functions/VideoInjector');\n await VideoManager.activate(videoId);\n return;\n },\n\n async activateCamera(): Promise {\n const { VideoManager } = await import('./app/functions/VideoInjector');\n await VideoManager.clear();\n return;\n },\n\n getScreenshot(type = 'image/jpeg', quality = 0.9): Promise {\n return import('./app/functions/GetScreenshot').then(({ getScreenshot }) => {\n return getScreenshot(type, quality);\n });\n },\n\n setTransitionOpacity(params: SetTransitionOpacityParams): void {\n setTransitionOpacity(params?.opacity);\n },\n\n refresh(): void {\n recreateFaceWeb();\n },\n\n setTransitionOverrideColor(TransitionLens: TransitionLens): void {\n setTransitionOverrideColor(TransitionLens);\n },\n\n animateOpacity(params: AnimateOpacityParams = { duration: 1000 }): void {\n animateOpacity(params?.duration);\n },\n\n closeMirror(params: { target: string }): Promise {\n return import('./app/functions/CloseMirror').then(({ closeMirror }) => {\n return closeMirror(params?.target);\n });\n },\n\n /**\n * Can be used to warm up effects and recording if you think to use any of those features during the session.\n * The method is internally called by all effects and recording related methods.\n */\n async warmUpEffectsAndRecording(): Promise {\n if (!EffectManager) {\n const data = await import('./app/functions/Effects');\n EffectManager = data.EffectManager;\n }\n return Promise.resolve();\n },\n\n async getEffectStatus(): Promise<{ isActive: boolean, effectId: string }> {\n await this.warmUpEffectsAndRecording();\n return EffectManager.getStatus();\n },\n\n /**\n * @param effectId an identifier that represent a remote setting, settings availability is opaque and should be managed with effects owners.\n * Effects availability is environment dependent, you can find a different set of effects between test and production.\n * @returns a Promise that can fail\n * @example\n let current = 0;\n const effects = [\n 'transitions-demo',\n 'transitions-demo2',\n 'video-demo',\n 'blur-webgl',\n 'solidColor',\n 'foreground-gradient-demo',\n ];\n\n const getNextEffect = () => {\n return effects[current++ % effects.length];\n };\n\n setLoading(true); // mocks integrator's loading screen\n VirtualMirror.activateEffect(getNextEffect())\n .then(() => {\n setLoading(false); // mocks integrator's loading screen\n });\n */\n async activateEffect(effectId: string) {\n await this.warmUpEffectsAndRecording();\n return EffectManager.activate(effectId);\n },\n\n /**\n * When activated an effect can be replaced by calling activateEffect() again or can be removed by calling this method.\n * @returns a promise\n */\n async removeCurrentEffect() { \n await this.warmUpEffectsAndRecording();\n return EffectManager.clear();\n },\n\n /**\n * \n * @param gifLengthMs lenght of the recording in milliseconds, defaults to 5000, limited to 30000\n * @returns a promise containing a Blob with a gif file inside\n * @example\n // automatically download a gif after the generation\n const gifUrl = URL.createObjectURL( await VirtualMirror.recordCanvasAsGif() );\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.href = gifUrl;\n a.download = 'sample.gif';\n a.click();\n URL.revokeObjectURL(gifUrl);\n document.body.removeChild(a);\n */\n async recordCanvasAsGif(gifLengthMs?: number): Promise {\n await this.warmUpEffectsAndRecording();\n return new Promise((resolve, reject)=> {\n try {\n EffectManager.add({pluginId: 'gifRecord', pluginOptions: {lengthMs: gifLengthMs , res: resolve}});\n setTimeout(()=>{EffectManager.remove('gifRecord'); }, gifLengthMs); //1000 ms of spare time\n } catch (e) {\n reject(e);\n }\n });\n },\n\n /**\n * @param videoLengthMs lenght of the recording in milliseconds, defaults to 5000, limited to 30000\n * @returns a promise containing a Blob with a video file inside\n * @example \n // automatically download a video after the generation\n const videoUrl = URL.createObjectURL( await VirtualMirror.recordCanvasAsVideo() );\n const a = document.createElement('a');\n document.body.appendChild(a);\n a.href = videoUrl;\n a.download = 'sample.mp4';\n a.click();\n URL.revokeObjectURL(videoUrl);\n document.body.removeChild(a);\n */\n async recordCanvasAsVideo(videoLengthMs?: number):Promise {\n await this.warmUpEffectsAndRecording();\n return new Promise((resolve, reject)=> {\n try {\n EffectManager.add({pluginId: 'videoRec', pluginOptions: {lengthMs: videoLengthMs, res: resolve}});\n setTimeout(()=>{EffectManager.remove('videoRec'); }, videoLengthMs); //1000 ms of spare time\n } catch (e) {\n reject(e);\n }\n });\n },\n\n /**\n * Check if your browser supports all the minimum technology to run Virtual Mirror\n * \n * @returns true or false wrapped into a promise\n */\n isBrowserSupported(): Promise {\n return import('./app/functions/IsBrowserSupported').then(({ isBrowserSupported }) => {\n return isBrowserSupported();\n });\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 glassesRemovalPerformanceEvents,\n faceWebPerformanceEvents,\n GestureType,\n Gesture,\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","import { vmIsInitialized, VmStore } from '../VmCore';\n\nexport const recreateFaceWeb = (): void => {\n\n if (!vmIsInitialized()) {\n return;\n }\n import('@luxottica/vm-posetracker-faceweb')\n .then(({PoseTracker}) => {\n PoseTracker.recreateFaceWeb({\n verticalFovDeg: 52,\n environment: VmStore.getState().app.environment == 'PRODUCTION' ? 'PRODUCTION' : 'TEST'\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 { 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","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};","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 { 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 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 { 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","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","enum GlassesEnvironment {\n PROD = 'PROD',\n PROD_LEGACY = 'PROD_LEGACY',\n TEST = 'TEST',\n TEST_LEGACY = 'TEST_LEGACY',\n TEST_TRANSITIONS = 'TEST_TRANSITIONS',\n QA_GLTF_PROD = 'QA_GLTF_PROD',\n QA_GLTF_TEST = 'QA_GLTF_TEST',\n QA_B3D_PROD = 'QA_B3D_PROD',\n QA_B3D_TEST = 'QA_B3D_TEST',\n MOCK = 'MOCK',\n // environments for distributor developments\n DISTRIBUTOR_VALIDATION_STAGING = 'DISTRIBUTOR_VALIDATION_STAGING',\n DISTRIBUTOR_APPROVATION_STAGING = 'DISTRIBUTOR_APPROVATION_STAGING',\n DISTRIBUTOR_VALIDATION_PRODUCTION = 'DISTRIBUTOR_VALIDATION_PRODUCTION',\n DISTRIBUTOR_APPROVATION_PRODUCTION = 'DISTRIBUTOR_APPROVATION_PRODUCTION',\n}\n\nexport {\n GlassesEnvironment\n};\n","import { GlassesEnvironment } from '../constants/Environment';\n\ninterface EnvironmentConfig {\n name: string;\n catalogHost: string;\n transitionsEndpoint: string;\n b3dHost: string;\n gltfHost: string;\n gltfPointer: string;\n customDistributorHost: string;\n customDistributorGetPermutation: string;\n customDistributorKey: string;\n assetType: 'ZIPPED' | 'SEPARATE';\n}\n\nconst hosts: {\n [key in GlassesEnvironment]: EnvironmentConfig;\n} = {\n MOCK: {\n name: 'PROD',\n catalogHost: 'https://vmcore-test.luxottica.com/static/',\n transitionsEndpoint: 'https://vmcore-test.luxottica.com/static/api/transition/v3/vocabulary',\n b3dHost: 'https://vmcore-test.luxottica.com/static/',\n gltfHost: 'https://vmcore-test.luxottica.com/static/api/upc/v1',\n gltfPointer: '/pointers/gltf',\n customDistributorHost: 'https://distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'HnqGNWeO.Px2v1cUrm3ffk6gC0OOdTgJRoaOfxClC',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'SEPARATE'\n },\n PROD: {\n name: 'PROD',\n catalogHost: 'https://vmcore.luxottica.com',\n transitionsEndpoint: 'https://vmcore.luxottica.com/api/transition/v3/vocabulary',\n b3dHost: 'https://vmcore.luxottica.com',\n gltfHost: 'https://vmcore.luxottica.com/api/upc/v1',\n gltfPointer: '/pointers/gltf',\n customDistributorHost: 'https://distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'HnqGNWeO.Px2v1cUrm3ffk6gC0OOdTgJRoaOfxClC',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'SEPARATE'\n },\n PROD_LEGACY: {\n name: 'PROD_LEGACY',\n catalogHost: 'https://vmcore.luxottica.com',\n transitionsEndpoint: 'https://vmcore.luxottica.com/api/transition/v3/vocabulary',\n b3dHost: 'https://vto-3d-assets.luxdeepblue.com',\n gltfHost: 'https://vmcore.luxottica.com/api/upc/v1',\n gltfPointer: '/pointers/gltf',\n customDistributorHost: 'https://distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'HnqGNWeO.Px2v1cUrm3ffk6gC0OOdTgJRoaOfxClC',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n TEST: {\n name: 'TEST',\n catalogHost: 'https://vmcore-test.luxottica.com',\n transitionsEndpoint: 'https://vmcore-test.luxottica.com/api/transition/v3/vocabulary',\n b3dHost: 'https://vmcore-test.luxottica.com',\n gltfHost: 'https://vmcore-test.luxottica.com/api/upc/v1',\n gltfPointer: '/pointers/gltf',\n customDistributorHost: 'https://staging-distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'bMhq6JPO.nLtuIsJU61lazsX3pnj10iH0wv2Dr7KA',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n TEST_LEGACY: {\n name: 'TEST_LEGACY',\n catalogHost: 'https://test-api-vtocatalogue.luxdeepblue.com',\n transitionsEndpoint: 'https://vmcore-test.luxottica.com/api/transition/v3/vocabulary',\n b3dHost: 'https://vto-3d-assets-test.luxdeepblue.com',\n gltfHost: 'https://vmcore-test.luxottica.com/api/upc/v1',\n gltfPointer: '/pointers/gltf',\n customDistributorHost: 'https://staging-distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'bMhq6JPO.nLtuIsJU61lazsX3pnj10iH0wv2Dr7KA',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'SEPARATE'\n },\n\n /* \n * Used to point to a static transitions lenses catalog for easier developments\n */\n TEST_TRANSITIONS: {\n name: 'TEST',\n catalogHost: 'https://vmcore-test.luxottica.com',\n transitionsEndpoint: 'https://luxdeepblue.github.io/vm-test-artifacts/api/transition/v3/vocabulary',\n b3dHost: 'https://vmcore-test.luxottica.com',\n gltfHost: 'https://vmcore-test.luxottica.com/api/upc/v1',\n gltfPointer: '/pointers/gltf',\n customDistributorHost: 'https://staging-distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'bMhq6JPO.nLtuIsJU61lazsX3pnj10iH0wv2Dr7KA',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n QA_GLTF_PROD: {\n name: 'QA_PROD',\n catalogHost: 'https://vmcore.luxottica.com',\n transitionsEndpoint: 'https://vmcore.luxottica.com/api/transition/v3/vocabulary',\n b3dHost: 'https://s3.amazonaws.com/vto-3d-assets-qa',\n gltfHost: 'https://gw-api-vtocatalogue.luxdeepblue.com/api/upc/v1',\n gltfPointer: '/pointers/gltf?qa=true',\n customDistributorHost: 'https://distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'HnqGNWeO.Px2v1cUrm3ffk6gC0OOdTgJRoaOfxClC',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n QA_GLTF_TEST: {\n name: 'QA_TEST',\n catalogHost: 'https://test-api-vtocatalogue.luxdeepblue.com',\n transitionsEndpoint: 'https://qa-gw-api-vtocatalogue.luxdeepblue.com/api/transition/v3/vocabulary',\n b3dHost: 'https://s3.amazonaws.com/vto-3d-assets-qa-test',\n gltfHost: 'https://vmcore-test.luxottica.com/api/upc/v1',\n gltfPointer: '/pointers/gltf?qa=true',\n customDistributorHost: 'https://staging-distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'bMhq6JPO.nLtuIsJU61lazsX3pnj10iH0wv2Dr7KA',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n QA_B3D_PROD: {\n name: 'QA_PROD',\n catalogHost: 'https://vmcore.luxottica.com',\n transitionsEndpoint: 'https://vmcore.luxottica.com/api/transition/v3/vocabulary',\n b3dHost: 'https://s3.amazonaws.com/vto-3d-assets-qa',\n gltfHost: 'https://gw-api-vtocatalogue.luxdeepblue.com/api/upc/v1',\n gltfPointer: '/pointers/gltf?qa=true',\n customDistributorHost: 'https://distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'HnqGNWeO.Px2v1cUrm3ffk6gC0OOdTgJRoaOfxClC',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n QA_B3D_TEST: {\n name: 'QA_TEST',\n catalogHost: 'https://test-api-vtocatalogue.luxdeepblue.com',\n transitionsEndpoint: 'https://qa-gw-api-vtocatalogue.luxdeepblue.com/api/transition/v3/vocabulary',\n b3dHost: 'https://s3.amazonaws.com/vto-3d-assets-qa-test',\n gltfHost: 'https://test-api-vtocatalogue.luxdeepblue.com/api/upc/v1',\n gltfPointer: '/pointers/gltf?qa=true',\n customDistributorHost: 'https://staging-distributor-distributor.luxdeepblue.com',\n customDistributorKey: 'bMhq6JPO.nLtuIsJU61lazsX3pnj10iH0wv2Dr7KA',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n // environments for distributor developments\n DISTRIBUTOR_VALIDATION_STAGING: {\n name: 'DISTRIBUTOR_VALIDATION_STAGING',\n catalogHost: 'https://test-api-vtocatalogue.luxdeepblue.com',\n transitionsEndpoint: 'https://qa-gw-api-vtocatalogue.luxdeepblue.com/api/transition/v3/vocabulary',\n b3dHost: 'https://distributor-assets-staging.s3.amazonaws.com/validation',\n gltfHost: '',\n gltfPointer: '',\n customDistributorHost: '',\n customDistributorKey: '',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n DISTRIBUTOR_APPROVATION_STAGING: {\n name: 'DISTRIBUTOR_APPROVATION_STAGING',\n catalogHost: 'https://test-api-vtocatalogue.luxdeepblue.com',\n transitionsEndpoint: 'https://qa-gw-api-vtocatalogue.luxdeepblue.com/api/transition/v3/vocabulary',\n b3dHost: 'https://distributor-assets-staging.s3.amazonaws.com/approvation',\n gltfHost: '',\n gltfPointer: '',\n customDistributorHost: '',\n customDistributorKey: '',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n DISTRIBUTOR_VALIDATION_PRODUCTION: {\n name: 'DISTRIBUTOR_VALIDATION_PRODUCTION',\n catalogHost: 'https://vmcore.luxottica.com',\n transitionsEndpoint: 'https://qa-gw-api-vtocatalogue.luxdeepblue.com/api/transition/v3/vocabulary',\n b3dHost: 'https://distributor-assets-production.s3.amazonaws.com/validation',\n gltfHost: '',\n gltfPointer: '',\n customDistributorHost: '',\n customDistributorKey: '',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n },\n DISTRIBUTOR_APPROVATION_PRODUCTION: {\n name: 'DISTRIBUTOR_APPROVATION_PRODUCTION',\n catalogHost: 'https://vmcore.luxottica.com',\n transitionsEndpoint: 'https://qa-gw-api-vtocatalogue.luxdeepblue.com/api/transition/v3/vocabulary',\n b3dHost: 'https://distributor-assets-production.s3.amazonaws.com/approvation',\n gltfHost: '',\n gltfPointer: '',\n customDistributorHost: '',\n customDistributorKey: '',\n customDistributorGetPermutation: '/api/getPermutation?token=',\n assetType: 'ZIPPED'\n }\n};\n\nconst getEnvironmentConfig = (env: GlassesEnvironment | undefined): EnvironmentConfig => {\n return (env) ? hosts[env] : hosts.PROD;\n};\n\nexport { getEnvironmentConfig, EnvironmentConfig };\n","import { CatalogConfiguration } from '../interfaces/CatalogConfiguration';\nimport { getEnvironmentConfig } from './GlassesApiConfig';\n\n// const upcsAvailabilityAuthenticatedApi = '/authenticated/upc/{upcs}/availability';\nconst upcsAvailabilityApi = '/api/upc/v3/{upcs}/availability';\n\nconst CatalogueApiConfig = {\n getUpcsAvailabilityApiEndpoint(config: CatalogConfiguration, upcString: string): string {\n const envConfig = getEnvironmentConfig(config.env);\n\n //TODO: remove after prod api is complete\n if (config.env.includes('TEST')) {\n return `${envConfig.catalogHost}${upcsAvailabilityApi}`.replace('{upcs}', upcString);\n } else {\n return (!!config.key) ?\n `${envConfig.catalogHost}${upcsAvailabilityApi}`.replace('{upcs}', upcString)\n :\n `${envConfig.catalogHost}${upcsAvailabilityApi}`.replace('{upcs}', upcString);\n }\n },\n\n getTransitionEndpoint(config: CatalogConfiguration): string {\n const envConfig = getEnvironmentConfig(config.env);\n return envConfig.transitionsEndpoint;\n }\n};\n\nexport { CatalogueApiConfig };\n","import { UpcAvailability } from '../../interfaces/UpcAvailability';\n\nexport const notAvailableResponse = (upc: string): UpcAvailability => {\n return {\n upc: upc,\n available: { 256: false, 512: false },\n transitions: { 256: false, 512: false },\n lods: [],\n glassesType: undefined,\n getUpc: () => upc,\n isAvailable: () => false,\n isTransition: () => false,\n };\n};\n","import { CatalogConfiguration } from '../../interfaces/CatalogConfiguration';\nimport { GlassesType, UpcAvailability } from '../../interfaces/UpcAvailability';\n\nconst getGlassesType = (lods: number[], config: CatalogConfiguration, isAvailable: boolean): GlassesType | undefined => {\n // TODO: remove this. To support MOCK env is necessary to return GLTF as glasses type in case the upc is not supported\n return (lods.includes(1) || config.env === 'MOCK' && !isAvailable) ? 'GLTF' : 'B3D';\n};\n\nexport const standardResponse = (catalogResponse: CatalogResponse, upc: string, config: CatalogConfiguration): UpcAvailability => {\n\n const lods = (!!catalogResponse?.lods) ? catalogResponse.lods : [];\n \n const isAvailable = catalogResponse.resolutions.includes('PX_256') || catalogResponse.resolutions.includes('PX_512') || lods.length > 0;\n\n const isTransition = catalogResponse.transitionsResolutions.includes('PX_256')\n || catalogResponse.transitionsResolutions.includes('PX_512');\n \n const glassesType = getGlassesType(lods, config, isAvailable);\n\n return {\n upc: upc,\n available: {\n '256': catalogResponse.resolutions.includes('PX_256'),\n '512': catalogResponse.resolutions.includes('PX_512')\n },\n transitions: {\n '256': catalogResponse.transitionsResolutions.includes('PX_256'),\n '512': catalogResponse.transitionsResolutions.includes('PX_512'),\n },\n lods,\n glassesType,\n getUpc: () => upc,\n isAvailable: () => isAvailable,\n isTransition: () => isTransition,\n };\n};\n","import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { UpcAvailability } from './interfaces/UpcAvailability';\nimport { name, version } from '../package.json';\nimport { TransitionLens } from './interfaces/TransitionLens';\nimport { CatalogConfiguration } from './interfaces/CatalogConfiguration';\nimport { CatalogueApiConfig } from './config/CatalogueApiConfig';\nimport { notAvailableResponse } from './helpers/UpcAvailabilityResponse/NotAvailable';\nimport { qaToolAvailability, qaToolMultipleAvailability } from './helpers/UpcAvailabilityResponse/QATool';\nimport { standardResponse } from './helpers/UpcAvailabilityResponse/Standard';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'CatalogService');\n\nconst fetchCatalogResponse = (\n config: CatalogConfiguration,\n upc: string\n): Promise => {\n\n const apiEndpoint = CatalogueApiConfig.getUpcsAvailabilityApiEndpoint(config, upc);\n const requestInit: RequestInit = {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n ...(config.key && { 'x-api-key': config.key })\n },\n mode: 'cors',\n referrerPolicy: 'unsafe-url',\n };\n return fetch(apiEndpoint, requestInit);\n};\n\nconst CatalogService = {\n getUpcAvailability(\n config: CatalogConfiguration,\n upc: string\n ): Promise {\n\n // inside the QA tool there's no UPC availability API for unpublished assets\n if (config.env.includes('QA')) {\n return Promise.resolve(qaToolAvailability(upc, config));\n }\n\n // otherwise we fetch the answer from remote\n return fetchCatalogResponse(config, upc)\n .then((response)=> {\n if (response.ok) {\n return response.json();\n }\n throw new Error(`catalog failed to respond. Response status: ${response.status}`);\n\n }).then((json: CatalogResponses) => {\n if (!!json[upc]) {\n return standardResponse(json[upc], upc, config);\n }\n return notAvailableResponse(upc);\n });\n },\n\n /**\n * \n * @param config \n * @param upc \n * @returns an array with all the availabilites already extracted from the promise\n */\n getMultipleUpcAvailability(\n config: CatalogConfiguration,\n upc: string\n ): Promise {\n\n // inside the QA tool there's no UPC availability API for unpublished assets\n if (config.env.includes('QA')) {\n return Promise.resolve(qaToolMultipleAvailability(upc, config));\n }\n\n // otherwise we fetch the answer from remote\n return fetchCatalogResponse(config, upc)\n .then((response)=> {\n if (response.ok) {\n return response.json();\n }\n throw new Error(`catalog failed to respond. Response status: ${response.status}`);\n\n }).then((json: CatalogResponses) => {\n\n const upcs = upc.split(',');\n const response: UpcAvailability[] = [];\n upcs.forEach((upc) => {\n if (!!json[upc]) {\n response.push(standardResponse(json[upc], upc, config));\n return;\n }\n response.push(notAvailableResponse(upc));\n });\n\n return response;\n });\n },\n\n downloadTransitionLenses(\n config: CatalogConfiguration,\n ): Promise<{ [name: string]: TransitionLens }> {\n\n const apiEndpoint = CatalogueApiConfig.getTransitionEndpoint(config);\n return fetch(apiEndpoint).then((response) => {\n return response.json();\n }).then((json: (TransitionLens & {name: string})[]) => {\n try {\n const result: {\n [name: string]: TransitionLens\n } = {};\n\n (json).forEach((color) => {\n result[color.name] = color;\n });\n return result;\n\n } catch (e) {\n logger.error(e);\n }\n return {};\n });\n }\n};\n\nexport {\n CatalogService,\n};\n","import { CatalogConfiguration } from '../../interfaces/CatalogConfiguration';\nimport { UpcAvailability } from '../../interfaces/UpcAvailability';\n\n // inside the QA tool every asset is considered fully available\nexport const qaToolAvailability = (upc: string, config: CatalogConfiguration): UpcAvailability => {\n return {\n upc: upc,\n available: { 256: true, 512: true },\n transitions: { 256: true, 512: true },\n lods: [0, 1, 2],\n getUpc: () => upc,\n // we need somehow to split between b3d and gltf files somehow\n glassesType: config.env.includes('GLTF') ? 'GLTF' : 'B3D',\n isAvailable: () => true,\n isTransition: () => true,\n };\n};\n\nexport const qaToolMultipleAvailability = (upc: string, config: CatalogConfiguration): UpcAvailability[] => {\n return upc.split(',').map((upc) => {\n return {\n upc: upc,\n available: { 256: true, 512: true },\n transitions: { 256: true, 512: true },\n lods: [0, 1, 2],\n getUpc: () => upc,\n // we need somehow to split between b3d and gltf files somehow\n glassesType: config.env.includes('GLTF') ? 'GLTF' : 'B3D',\n isAvailable: () => true,\n isTransition: () => true,\n };\n });\n};","import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { UpcAvailability } from './interfaces/UpcAvailability';\nimport { name, version } from '../package.json';\nimport { TransitionLens } from './interfaces/TransitionLens';\nimport { CatalogConfiguration } from './interfaces/CatalogConfiguration';\nimport { CatalogService } from './CatalogService';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'Catalog');\n\nconst Catalog = {\n getUpcAvailability(\n config: CatalogConfiguration,\n upc: string\n ): Promise {\n\n logger.debug('getUpcAvailability for {}', upc);\n return CatalogService.getUpcAvailability(config, upc);\n },\n\n /**\n * This method optimise the network calls\n * @param config { env: GlassesEnvironment; key?: string; } < please always pass your key, it will become mandatory soon\n * @param upcs you can spread out an array of upcs\n * @returns \n */\n getMultipleUpcAvailability(\n config: CatalogConfiguration,\n ...upcs: string[]\n ): Promise {\n\n const upcList = upcs.reduce((previous, current) => {\n return current+','+previous;\n });\n\n logger.debug('getUpcAvailability for {}', upcs);\n return CatalogService.getMultipleUpcAvailability(config, upcList);\n },\n\n // getUpcsAvailability(\n // config: CatalogConfiguration,\n // ...upcs: string[]\n // ): Promise<{ [upc: string]: UpcAvailability }> {\n // return CatalogService.getUpcsAvailability(config, ...upcs);\n // },\n\n downloadTransitionLenses(\n config: CatalogConfiguration\n ): Promise<{ [name: string]: TransitionLens }> {\n\n logger.debug('downloadTransitionLenses');\n return CatalogService.downloadTransitionLenses(config);\n }\n};\n\nexport {\n Catalog,\n};\n","import JSZip from 'jszip';\nimport { BasicGLTFAsset } from './interfaces/BasicGLTFAsset';\n\nexport const AssetDecoder = {\n getArrayBuffer(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onload = () => {\n resolve(reader.result as ArrayBuffer);\n };\n reader.readAsArrayBuffer(blob);\n });\n },\n\n getZippedImage(imagePromise: JSZip.JSZipObject): Promise {\n return imagePromise\n .async('blob')\n .then((blob: Blob) => {\n return AssetDecoder.getImage(blob);\n });\n },\n\n getImage(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const url = URL.createObjectURL(blob);\n const img = new Image();\n img.crossOrigin = '*';\n\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve(img);\n };\n\n img.onerror = (e) => {\n reject(e);\n };\n\n img.src = url;\n });\n },\n\n getImageBase64(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onload = () => {\n resolve('' + reader.result);\n };\n reader.readAsDataURL(blob);\n });\n },\n\n getZippedGLTF(upc: string, gltfPromise: JSZip.JSZipObject): Promise {\n return gltfPromise\n .async('blob')\n .then((blob: Blob) => {\n return AssetDecoder.getGLTFAsset(upc, blob);\n });\n },\n\n getGLTFAsset(upc: string, blob: Blob): Promise {\n return this.getArrayBuffer(blob)\n .then((arrayBuffer) => {\n return Promise.resolve({\n upc,\n arrayBuffer,\n });\n });\n },\n};\n","enum AppViewSessionKeys {\n GLASSES_OK = 'vm-glasses-ok',\n GLASSES_KO = 'vm-glasses-ko',\n GLASSES_DOWNLOAD_SUCCESS_UPC = '_download_success_upc',\n GLASSES_DOWNLOAD_FAILURE_UPC = '_download_failure_upc',\n GLASSES_DOWNLOAD_SUCCESS_TIME = '_download_success_time_ms',\n GLASSES_DOWNLOAD_FAILURE_TIME = '_download_failure_time_ms',\n GLASSES_DOWNLOAD_FALLBACK_SUCCESS_UPC = '_download_fallback_success_upc',\n GLASSES_DOWNLOAD_FALLBACK_FAILURE_UPC = '_download_fallback_failure_upc',\n GLASSES_DOWNLOAD_FALLBACK_SUCCESS_TIME = '_download_fallback_success_time_ms',\n GLASSES_DOWNLOAD_FALLBACK_FAILURE_TIME = '_download_fallback_failure_time_ms',\n}\n\nexport { AppViewSessionKeys };\n","const assetNames = {\n b3d: 'glasses.b3d',\n transparency: 'mult.jpg',\n shadow: 'shadow-crop.jpg',\n lensMap: 'lens-map.png',\n lensBounds: 'bounds.glb',\n glassesLandmarks: 'landmarks.glb',\n color: (index: string | number) => `color-${index}.jpg`,\n};\n\nexport {\n assetNames,\n};\n","/* \nThis has been written during the mocking phase, during the integration of\nLuxottica's GTLF format. Probably will be useful with third parites glasses.\n*/\n\nexport const gltfDefaults = {\n nosepad_type: 'integrated',\n fitting: 'standard',\n flare: 0.025,\n};\n","const MockAssetData: {\n [key: string]: {\n nosepad_type: string,\n flare: number,\n fitting: string,\n lodNumber: number,\n misc: boolean,\n }\n} = {\n 'RB2140ROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.023,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'RB2140ROSETTA002': {\n 'nosepad_type': 'integrated',\n 'flare': 0.023,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'RB3025ROSETTA001': {\n 'nosepad_type': 'floating',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': true\n },\n 'OO9406ROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.024,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'THIRDPARTYROSETTA-NOGROUP': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'THIRDPARTYROSETTA-WGROUP': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'dbyd_dbsu5003_8719154814969': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'unofficial_unsf0146_8719154842764': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'unofficial_unsu0094_8719154843136': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'dbyd_dbsm0029_8719154744198': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'fb-quality': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'fb-standard': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'costa00000001': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'goccia00000001': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'frogskins00000001': {\n 'nosepad_type': 'undefined',\n 'flare': 0.025,\n 'fitting': 'fast',\n 'lodNumber': 1,\n 'misc': false\n },\n 'A03116ROSETTA003': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'DG4315BROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'HC6149ROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'OO9013ROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n '06A2003VROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'OO9102ROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'PO3210SROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'RB3016ROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n '06S4010ROSETTA001': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n 'OO9406ROSETTA002': {\n 'nosepad_type': 'integrated',\n 'flare': 0.025,\n 'fitting': 'standard',\n 'lodNumber': 2,\n 'misc': false\n },\n};\n\nexport {\n MockAssetData,\n};\n","abstract class GenericError extends Error {\n\n private readonly type: string;\n\n public readonly genericError: boolean = true;\n\n constructor(type: string, message: string) {\n super(`${type}: ${message}`);\n this.type = type;\n this.message = message;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n public getType() {\n return this.type;\n }\n\n}\n\nexport { GenericError };\n","import { GenericError } from './GenericError';\n\nclass GlassesDownloadError extends GenericError {\n constructor(readonly upc: string) {\n super('GlassesDownloadError', `glasses for upc ${upc} download failed`);\n }\n}\n\nexport { GlassesDownloadError };\n","import { GenericError } from './GenericError';\n\nclass GlassesDownloadForbiddenError extends GenericError {\n constructor(readonly upc: string) {\n super('GlassesDownloadForbiddenError', `glasses archive for upc ${upc} download forbidden`);\n }\n}\n\nexport { GlassesDownloadForbiddenError };\n","import { GenericError } from './GenericError';\n\nclass GlassesNotFoundError extends GenericError {\n constructor(readonly upc: string) {\n super('GlassesNotFoundError', `glasses archive for upc ${upc} not found`);\n }\n}\n\nexport { GlassesNotFoundError };\n","const isDistributorAsset = (upc: string): boolean => {\n return upc.startsWith('TKN~');\n};\n\nconst isQADistributorAsset = (upc: string): boolean => {\n // sample QA distributor UPC: 0OO9290CP-FRAME_SR005\n const dash = upc.split('-').length > 1;\n const underscore = upc.split('_').length > 1;\n\n return dash && underscore;\n};\n\nconst distributorBasename = (upc: string): string => {\n // sample distributor UPC: 0OO9290CP-FRAME_SR005\n return upc.split('-')[0];\n};\n\n // distributor can use tokens with a / (slash) in the name\n // the / is escaped by VM clients, all the distributor APIs works with the escaped character %2F\n // eg: TKN~0RB4165CP~2RB4165061_601%2F71AB~2AJ1212111_710%2F13AA~NULL~2LSRB4165_1770..AB~NULL~RBCP..55\n // inside the asset zip this slash is replaced with a dash -\nconst distributorFolderName = (upc: string): string => {\n return upc.replace(/(%2F)/gm, '-');\n};\n\nexport { isDistributorAsset, isQADistributorAsset, distributorBasename,\n distributorFolderName\n};\n","import { RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport JSZip from 'jszip';\nimport { name, version } from '../package.json';\nimport { AssetDecoder } from './AssetDecoder';\nimport { AssetResolution } from './interfaces/AssetResolution';\nimport { assetNames } from './constants/AssetNames';\nimport { B3dAsset } from './interfaces/B3dAsset';\nimport { distributorFolderName } from './helpers/AssetHelper';\nimport { BasicGLTFAsset } from './interfaces/BasicGLTFAsset';\nimport { GlassesDownloadError } from './error/GlassesDownloadError';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'GlassesExtractor');\n\nconst ALL_TEXTURES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];\n\nclass GlassesExtractor {\n\n public unzip(\n upc: string,\n glassesZip: Blob,\n resolution: AssetResolution,\n singleTexture: number | undefined,\n ): Promise {\n const colorIndexes = (typeof singleTexture === 'number') ? [singleTexture] : ALL_TEXTURES;\n\n return this.unzipGlasses(\n upc,\n glassesZip,\n colorIndexes,\n resolution);\n }\n\n private unzipGlasses(\n upc: string,\n glassesZip: Blob,\n colorIndexes: number[],\n resolution: AssetResolution\n ): Promise {\n const time1 = performance.now();\n let time2 = 0;\n const jszip = new JSZip();\n return jszip.loadAsync(\n glassesZip\n ).then(() => {\n logger.debug('glasses zip [upc={}] loaded in {} ms', upc, performance.now() - time1);\n time2 = performance.now();\n return this.extractFilesFromZipArchive(jszip, upc, colorIndexes);\n }).then((glassesExtracted: Array) => {\n logger.debug('glasses zip [upc={}] opened in {} ms', upc, performance.now() - time2);\n const glasses = this.createGlassesDataFromExtractedArchive(upc, glassesExtracted, resolution, colorIndexes);\n return glasses;\n });\n }\n\n private extractFilesFromZipArchive(jszip: JSZip, zipUpc: string, colorIndexes: number[]): Promise> {\n const promises: Promise[] = [];\n const folderName: string = distributorFolderName(zipUpc);\n promises.push(this.extractB3D(jszip, folderName));\n promises.push(\n this.extractMult(jszip, folderName),\n this.extractShadow(jszip, folderName),\n this.extractLensMap(jszip, folderName),\n this.extractBoundingBoxes(jszip, folderName),\n this.extractLandmarks(jszip, folderName),\n );\n\n this.extractColors(jszip, folderName, colorIndexes).forEach((promise) => {\n promises.push(promise);\n });\n return Promise.all(promises);\n }\n\n private extractColors(jszip: JSZip, folderName: string, colorIndexes: number[]) {\n const promises: Array> = [];\n colorIndexes.map((i) => {\n const time1 = performance.now();\n const zipFolder = jszip.folder(folderName);\n if (!zipFolder) {\n throw new GlassesDownloadError(`${folderName} folder does not exists`);\n }\n const file = zipFolder.file(assetNames.color(i));\n if (!file) {\n throw new GlassesDownloadError(`${assetNames.color(i)} file does not exists`);\n }\n const colorPromise = AssetDecoder.getZippedImage(file);\n colorPromise.then((color) => {\n const time2 = performance.now();\n const ttime = time2 - time1;\n logger.debug('texture {} extracted in {} ms from upc {}: (length={})', i, ttime, folderName, color.src.length);\n });\n promises.push(colorPromise);\n });\n return promises;\n }\n\n private extractMult(jszip: JSZip, folderName: string) {\n const zipFolder = jszip.folder(folderName);\n if (!zipFolder) {\n throw new GlassesDownloadError(`${folderName} folder does not exists`);\n }\n const file = zipFolder.file(assetNames.transparency);\n if (!file) {\n throw new GlassesDownloadError(`${assetNames.transparency} file does not exists`);\n }\n const multPromise = AssetDecoder.getZippedImage(file);\n const time1 = performance.now();\n multPromise.then((mult) => {\n const time2 = performance.now();\n const ttime = time2 - time1;\n logger.debug('mult extracted in {} ms from upc {}: (length={})', ttime, folderName, mult.src.length);\n });\n return multPromise;\n }\n\n private extractShadow(jszip: JSZip, folderName: string) {\n const zipFolder = jszip.folder(folderName);\n if (!zipFolder) {\n throw new GlassesDownloadError(`${folderName} folder does not exists`);\n }\n const file = zipFolder.file(assetNames.shadow);\n if (!file) {\n throw new GlassesDownloadError(`${assetNames.shadow} file does not exists`);\n }\n const shadowPromise = AssetDecoder.getZippedImage(file);\n const time1 = performance.now();\n shadowPromise.then((shadow) => {\n const time2 = performance.now();\n const ttime = time2 - time1;\n logger.debug('shadow extracted in {} ms from upc {}: (length={})', ttime, folderName, shadow.src.length);\n });\n return shadowPromise;\n }\n\n // lensmaps, boundig boxes, and landmarks are optional and are not always present in zip file\n private extractLensMap(jszip: JSZip, folderName: string) {\n const zipFolder = jszip.folder(folderName);\n if (!zipFolder) {\n throw new GlassesDownloadError(`${folderName} folder does not exists`);\n }\n const lensmapFile = zipFolder.file(assetNames.lensMap);\n if (!!lensmapFile) {\n const lensmapPromise = AssetDecoder.getZippedImage(lensmapFile);\n const time1 = performance.now();\n lensmapPromise.then((lensmap: any) => {\n const time2 = performance.now();\n const ttime = time2 - time1;\n logger.debug('lens map extracted in {} ms from upc {}: (length={})', ttime, folderName, lensmap.byteLength);\n });\n return lensmapPromise;\n }\n return Promise.resolve(undefined);\n }\n\n // lensmaps, boundig boxes, and landmarks are optional and are not always present in zip file\n private extractBoundingBoxes(jszip: JSZip, folderName: string) {\n const zipFolder = jszip.folder(folderName);\n if (!zipFolder) {\n throw new GlassesDownloadError(`${folderName} folder does not exists`);\n }\n const lensBoundsFile = zipFolder.file(assetNames.lensBounds);\n if (!!lensBoundsFile) {\n const lensBoundsPromise = AssetDecoder.getZippedGLTF(folderName, lensBoundsFile);\n const time1 = performance.now();\n lensBoundsPromise.then((bounds: any) => {\n const time2 = performance.now();\n const ttime = time2 - time1;\n logger.debug('lens bounds extracted in {} ms from upc {}: (length={})', ttime, folderName, bounds.byteLength);\n });\n return lensBoundsPromise;\n }\n return Promise.resolve(undefined);\n }\n\n // lensmaps, boundig boxes, and landmarks are optional and are not always present in zip file\n private extractLandmarks(jszip: JSZip, folderName: string) {\n const landmarksFile = jszip.folder(folderName)!.file(assetNames.glassesLandmarks);\n if (!!landmarksFile) {\n const landmarksPromise = AssetDecoder.getZippedGLTF(folderName, landmarksFile);\n const time1 = performance.now();\n landmarksPromise.then((landmarks: any) => {\n const time2 = performance.now();\n const ttime = time2 - time1;\n logger.debug('landmarks extracted in {} ms from upc {}: (length={})', ttime, folderName, landmarks.byteLength);\n });\n return landmarksPromise;\n }\n return Promise.resolve(undefined);\n }\n\n private extractB3D(jszip: JSZip, folderName: string) {\n const b3dPromise = jszip.folder(folderName)!.file(assetNames.b3d)!.async('arraybuffer');\n const time1 = performance.now();\n b3dPromise.then((b3d: any) => {\n const time2 = performance.now();\n const ttime = time2 - time1;\n logger.debug('model extracted in {} ms from upc {}: (length={})', ttime, folderName, b3d.byteLength);\n });\n return b3dPromise;\n }\n\n private createGlassesDataFromExtractedArchive(\n upc: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n glassesExtracted: any[],\n resolution: AssetResolution,\n textureIndexes: number[]\n ): B3dAsset {\n logger.debug('creating glasses from {} items...', glassesExtracted.length);\n const glasses: B3dAsset = {\n objModel: glassesExtracted[0],\n transparency: glassesExtracted[1],\n shadow: glassesExtracted[2],\n lensMap: glassesExtracted[3],\n lensBoundingBox: glassesExtracted[4],\n glassesLandmarks: glassesExtracted[5],\n textures: glassesExtracted.slice(6, 6 + textureIndexes.length),\n upc,\n resolution,\n };\n return glasses;\n }\n\n}\n\nexport { GlassesExtractor };\n","import { RemoteLog, RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../package.json';\nimport { EnvironmentConfig } from './config/GlassesApiConfig';\nimport { GlassesExtractor } from './GlassesExtractor';\nimport { GlassesDownloadError } from './error/GlassesDownloadError';\nimport { GlassesDownloadForbiddenError } from './error/GlassesDownloadForbiddenError';\nimport { GlassesNotFoundError } from './error/GlassesNotFoundError';\nimport { AssetResolution } from './interfaces/AssetResolution';\nimport { B3dAsset } from './interfaces/B3dAsset';\nimport { AppViewSessionKeys } from './remotelog/AppViewSessionKeys';\nimport { distributorBasename, isDistributorAsset, isQADistributorAsset } from './helpers/AssetHelper';\nimport { GenericError } from './error/GenericError';\n/* import { GlassesAsset } from \"./GlassesAsset\"; */\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'ZipDownloader');\n\n/*\n\nSome sample tokens for custom glasses coming from the distributor\n\navailable\nTKN~0RB2140CP~2RB2140P61_902...AA~2AP3031111_954...AA~NULL~1RB00500681_GRIDFK~NULL~50\nTKN~0RB2140CP~2RB2140P61_902...AA~2AP3031111_954...AA~NULL~1RB00500633_GRIDFK~NULL~50\n\nnot available (uses fallback)\nTKN~0RB3592CP~1RB3592061_001...55~NULL~1TE3941A00_A1812.AA~1LSRB3592_2540..AB~NULL~RBCP..55\nTKN~0RB3592CP~1RB3592061_001...50~NULL~1TE3941A00_A1814.AA~1LSRB3592_1766..AA~NULL~RBCP..50\n\nwith slashes (%2F)\nTKN~0RB4165CP~2RB4165061_601%2F71AB~2AJ1212111_710%2F13AA~NULL~2LSRB4165_1770..AB~NULL~RBCP..55\n\nTKN~0RB4165CP~2RB4165061_601%2F71AB~2AJ1212111_710%2F8GAA~NULL~2LSRB4165_1770..AB~NULL~RBCP..55\n\nTKN~0RX6465CP~1RX6465061_2945..51~NULL~1TE4183A00_X523%2FHAA~2064-DE~NULL~RBCP..51~K-MC5~K-RB0\n\n*/\n\n/*\n\nSome sample tokens for custom glasses coming from the distributor\n\navailable\nTKN~0RB2140CP~2RB2140P61_902...AA~2AP3031111_954...AA~NULL~1RB00500681_GRIDFK~NULL~50\nTKN~0RB2140CP~2RB2140P61_902...AA~2AP3031111_954...AA~NULL~1RB00500633_GRIDFK~NULL~50\n\nnot available (uses fallback)\nTKN~0RB3592CP~1RB3592061_001...55~NULL~1TE3941A00_A1812.AA~1LSRB3592_2540..AB~NULL~RBCP..55\nTKN~0RB3592CP~1RB3592061_001...50~NULL~1TE3941A00_A1814.AA~1LSRB3592_1766..AA~NULL~RBCP..50\n\nwith slashes (%2F)\nTKN~0RB4165CP~2RB4165061_601%2F71AB~2AJ1212111_710%2F13AA~NULL~2LSRB4165_1770..AB~NULL~RBCP..55\n\nTKN~0RB4165CP~2RB4165061_601%2F71AB~2AJ1212111_710%2F8GAA~NULL~2LSRB4165_1770..AB~NULL~RBCP..55\n\nTKN~0RX6465CP~1RX6465061_2945..51~NULL~1TE4183A00_X523%2FHAA~2064-DE~NULL~RBCP..51~K-MC5~K-RB0\n\n*/\n\n/*\n\nSome sample tokens for custom glasses coming from the distributor\n\navailable\nTKN~0RB2140CP~2RB2140P61_902...AA~2AP3031111_954...AA~NULL~1RB00500681_GRIDFK~NULL~50\nTKN~0RB2140CP~2RB2140P61_902...AA~2AP3031111_954...AA~NULL~1RB00500633_GRIDFK~NULL~50\n\nnot available (uses fallback)\nTKN~0RB3592CP~1RB3592061_001...55~NULL~1TE3941A00_A1812.AA~1LSRB3592_2540..AB~NULL~RBCP..55\nTKN~0RB3592CP~1RB3592061_001...50~NULL~1TE3941A00_A1814.AA~1LSRB3592_1766..AA~NULL~RBCP..50\n\nwith slashes (%2F)\nTKN~0RB4165CP~2RB4165061_601%2F71AB~2AJ1212111_710%2F13AA~NULL~2LSRB4165_1770..AB~NULL~RBCP..55\n\nTKN~0RB4165CP~2RB4165061_601%2F71AB~2AJ1212111_710%2F8GAA~NULL~2LSRB4165_1770..AB~NULL~RBCP..55\n\nTKN~0RX6465CP~1RX6465061_2945..51~NULL~1TE4183A00_X523%2FHAA~2064-DE~NULL~RBCP..51~K-MC5~K-RB0\n\n*/\n\nclass ZipDownloader {\n private remoteLog: RemoteLog = new RemoteLog();\n private static instance: ZipDownloader;\n\n public static getInstance(): ZipDownloader {\n if (!this.instance) {\n this.instance = new ZipDownloader();\n }\n return this.instance;\n }\n\n public downloadZippedGlasses(\n upc: string,\n resolution: AssetResolution,\n singleTexture: number | undefined,\n envConfig: EnvironmentConfig\n ): Promise {\n return new Promise((resolve, reject) => {\n this.tryToDownload(upc, resolution, envConfig)\n .then((blob) => {\n resolve(new GlassesExtractor().unzip(upc, blob, resolution, singleTexture));\n }).catch((e) => {\n logger.error(e);\n reject(new GlassesDownloadError(upc));\n });\n });\n }\n\n private tryToDownload(upc: string, resolution: AssetResolution, envConfig: EnvironmentConfig) {\n const time1 = performance.now();\n\n let glassesUrl: string;\n let requestOptions: RequestInit;\n\n const customDistributorAsset = isDistributorAsset(upc);\n const qaDistributorAsset = isQADistributorAsset(upc);\n\n if (customDistributorAsset) {\n // custom assets requests requires a token, these asset are distributed through a system\n // that automatically generates combinations of custom assets if not available\n glassesUrl = this.getCustomUrl(upc, envConfig);\n requestOptions = {\n headers: {\n 'x-api-key': envConfig.customDistributorKey\n }\n };\n\n } else if (qaDistributorAsset) {\n // this URL is used locally by people that creates the pieces that\n // are combined by above distributor\n glassesUrl = this.getDistributorUrl(upc, envConfig);\n\n } else {\n // this is the classic b3d asset cdn\n glassesUrl = this.getUrl(upc, resolution, envConfig);\n }\n\n let triedLegacyCustom = true;\n const fetchGlasses = (): Promise => {\n return fetch(glassesUrl, requestOptions)\n .then((response: Response) => {\n if (response.ok) {\n logger.debug('glasses archive {} downloaded', response.url);\n const time2 = performance.now();\n const ttime = time2 - time1;\n this.traceDownloadSuccess(upc, ttime);\n return response.blob();\n } else {\n logger.error('glasses download {} failed: [{} {}]',\n response.url, response.status, response.statusText);\n const time2 = performance.now();\n const ttime = time2 - time1;\n this.traceDownloadFailure(upc, ttime);\n switch (response.status) {\n case 403:\n throw new GlassesDownloadForbiddenError(upc);\n case 404:\n throw new GlassesNotFoundError(upc);\n default:\n throw new GlassesDownloadError(upc);\n }\n }\n })\n .catch((reason: GenericError) => {\n logger.error('glasses download {} error {}', glassesUrl, reason);\n\n // if we are downloading a custom asset (TKN) is worth try to download it from legacy bucket\n if (customDistributorAsset && triedLegacyCustom) {\n triedLegacyCustom = false;\n\n logger.debug('try to download the custom asset from legacy bucket');\n glassesUrl = this.getLegacyUrl(upc, '256', envConfig);\n\n // remove the token from the request because it breaks S3 bucket\n requestOptions = {};\n\n return fetchGlasses();\n } else {\n // is possible that the catched error is already been initialised by above promise\n if (reason.genericError) {\n throw reason;\n }\n throw new GlassesDownloadError(glassesUrl);\n }\n });\n };\n\n return new Promise((resolve, reject) => {\n fetchGlasses()\n .then((blob) => {\n if (!!blob) {\n resolve(blob);\n }\n reject(new GlassesDownloadError(`${upc} returned empty blob`));\n })\n .catch((reason: GenericError) => {\n logger.error('glasses download {} error {}', glassesUrl, reason);\n reject(reason);\n });\n });\n }\n\n private getUrl(upc: string, resolution: AssetResolution, envConfig: EnvironmentConfig): string {\n return `${envConfig.b3dHost}/${resolution}/${upc}.zip`;\n }\n\n private getLegacyUrl(upc: string, resolution: AssetResolution, envConfig: EnvironmentConfig): string {\n return `${envConfig.b3dHost}/${resolution}/${upc}.zip`;\n }\n\n private getCustomUrl(tkn: string, envConfig: EnvironmentConfig): string {\n return `${envConfig.customDistributorHost}${envConfig.customDistributorGetPermutation}${tkn}`;\n }\n\n private getDistributorUrl(upc: string, envConfig: EnvironmentConfig): string {\n const baseName = distributorBasename(upc);\n return `${envConfig.b3dHost}/${baseName}/${upc}.zip`;\n }\n\n private traceDownloadSuccess(upc: string, ttime: number) {\n this.remoteLog.sendAppViewSession(\n {\n statusCode: AppViewSessionKeys.GLASSES_OK + AppViewSessionKeys.GLASSES_DOWNLOAD_SUCCESS_UPC,\n statusText: upc,\n }, {\n statusCode: AppViewSessionKeys.GLASSES_OK + AppViewSessionKeys.GLASSES_DOWNLOAD_SUCCESS_TIME,\n statusText: ttime.toString(),\n },\n );\n }\n\n private traceDownloadFailure(upc: string, ttime: number) {\n this.remoteLog.sendAppViewSession(\n {\n statusCode: AppViewSessionKeys.GLASSES_KO + AppViewSessionKeys.GLASSES_DOWNLOAD_FAILURE_UPC,\n statusText: upc,\n }, {\n statusCode: AppViewSessionKeys.GLASSES_KO + AppViewSessionKeys.GLASSES_DOWNLOAD_FAILURE_TIME,\n statusText: ttime.toString(),\n },\n );\n }\n\n}\n\nexport {\n ZipDownloader,\n};\n","import { RemoteLog, RemoteLogConfig } from '@luxottica/vm-remotelog';\nimport { name, version } from '../package.json';\nimport { AssetDecoder } from './AssetDecoder';\nimport { EnvironmentConfig, getEnvironmentConfig } from './config/GlassesApiConfig';\nimport { assetNames } from './constants/AssetNames';\nimport { GlassesEnvironment } from './constants/Environment';\nimport { gltfDefaults } from './constants/GltfDefault';\nimport { MockAssetData } from './constants/MockAssetData';\nimport { GlassesDownloadError } from './error/GlassesDownloadError';\nimport { GlassesDownloadForbiddenError } from './error/GlassesDownloadForbiddenError';\nimport { GlassesNotFoundError } from './error/GlassesNotFoundError';\nimport { isDistributorAsset } from './helpers/AssetHelper';\nimport { AssetResolution } from './interfaces/AssetResolution';\nimport { B3dAsset } from './interfaces/B3dAsset';\nimport { GltfAssetPointer, GltfLodUrls, GltfResponse, MiscUrl } from './interfaces/GltfAsset';\nimport { AppViewSessionKeys } from './remotelog/AppViewSessionKeys';\nimport { ZipDownloader } from './ZipDownloader';\n\nconst logger = RemoteLogConfig.getInstance().getLoggerInfo(name, version, 'GlassesDownloader');\n\n// temporary mock function for GLTF misc/DC assets\nconst miscUrls = (envConfig: EnvironmentConfig, upc: string): MiscUrl => {\n return {\n boundsUrl: `${envConfig.gltfHost}/${upc}/webGL/${upc}_misc/bounds.glb`,\n landmarksUrl: `${envConfig.gltfHost}/${upc}/webGL/${upc}_misc/landmarks.glb`,\n };\n};\n\nclass GlassesDownloader {\n\n private remoteLog: RemoteLog = new RemoteLog();\n\n public downloadGltfGlasses(options: {\n upc: string,\n glassesEnvironment: GlassesEnvironment,\n landmarksAndBBox?: boolean\n }): Promise {\n \n /*if (options.glassesEnvironment === GlassesEnvironment.MOCK) {\n return Promise.resolve(this.getMockGltfGlassesUrl(options));\n } else {*/\n const envConfig = getEnvironmentConfig(options.glassesEnvironment);\n const gltfUrl = `${envConfig.gltfHost}/${options.upc}${envConfig.gltfPointer}`;\n\n return fetch(gltfUrl).then((response) => {\n if (response.ok) {\n return response.json();\n } else {\n return Promise.reject(new GlassesDownloadError(`${options.upc} - ${response.status}`));\n }\n }).then((json: GltfResponse) => {\n const assetData = json[options.upc];\n\n // at the moment this is the only way we can understand if the catalog gave us an empty response\n // TODO: ask backend team to improve the answer\n if (!assetData.LOD1 && !assetData.LOD2) {\n return Promise.reject(new GlassesDownloadError(`${options.upc} - missing fundamental LOD`));\n }\n\n const result: GltfAssetPointer = {\n upc: options.upc,\n gltfLodUrls: {},\n nosepadType: assetData.nosepadType,\n fitting: assetData.fitting,\n flare: assetData.flare,\n ...(!!assetData.misc && !!options.landmarksAndBBox && { misc: assetData.misc }),\n fittingExplicitOffset: assetData.fittingExplicitOffset\n };\n\n if (!!assetData.LOD0) { result.gltfLodUrls.lod0 = { ...assetData.LOD0 }; }\n if (!!assetData.LOD1) { result.gltfLodUrls.lod1 = { ...assetData.LOD1 }; }\n if (!!assetData.LOD2) { result.gltfLodUrls.lod2 = { ...assetData.LOD2 }; }\n\n return result;\n });\n //}\n }\n\n private getMockGltfGlassesUrl(options: {\n upc: string,\n glassesEnvironment: GlassesEnvironment,\n landmarksAndBBox?: boolean\n }): GltfAssetPointer {\n const envConfig = getEnvironmentConfig(options.glassesEnvironment);\n\n const assetNumLods = MockAssetData[options.upc].lodNumber;\n const gltfLodUrls: GltfLodUrls = {};\n \n if (assetNumLods === 1) {\n // asset without lods (third-party)\n gltfLodUrls.lod1 = {\n gltfUrl: `${envConfig.gltfHost}/${options.upc}/webGL/${options.upc}_LOD0/${options.upc}.gltf`,\n upcSiUrl: `${envConfig.gltfHost}/${options.upc}/webGL/${options.upc}_LOD0/${options.upc}_si.json`\n };\n } else {\n gltfLodUrls.lod1 = {\n gltfUrl: `${envConfig.gltfHost}/${options.upc}/webGL/${options.upc}_LOD1/${options.upc}.gltf`,\n upcSiUrl: `${envConfig.gltfHost}/${options.upc}/webGL/${options.upc}_LOD1/${options.upc}_si.json`\n };\n\n if (assetNumLods >= 2) {\n gltfLodUrls.lod2 = {\n gltfUrl: `${envConfig.gltfHost}/${options.upc}/webGL/${options.upc}_LOD2/${options.upc}.gltf`,\n upcSiUrl: `${envConfig.gltfHost}/${options.upc}/webGL/${options.upc}_LOD2/${options.upc}_si.json`\n };\n }\n }\n\n return {\n upc: options.upc,\n gltfLodUrls: gltfLodUrls,\n nosepadType: (!!MockAssetData[options.upc]?.nosepad_type) ? MockAssetData[options.upc].nosepad_type : gltfDefaults.nosepad_type,\n fitting: (!!MockAssetData[options.upc]?.fitting) ? MockAssetData[options.upc].fitting : gltfDefaults.fitting,\n flare: (!!MockAssetData[options.upc]?.flare) ? MockAssetData[options.upc].flare : gltfDefaults.flare,\n misc: !!MockAssetData[options.upc]?.misc &&\n options.landmarksAndBBox !== undefined &&\n options.landmarksAndBBox ?\n miscUrls(envConfig, options.upc) : undefined,\n };\n }\n\n public downloadGlasses(options: {\n upc: string,\n resolution: AssetResolution,\n glassesEnvironment: GlassesEnvironment,\n lensMap?: boolean,\n lensBoundingBoxes?: boolean,\n glassesLandmarks?: boolean,\n singleTexture?: number,\n }): Promise {\n const envConfig = getEnvironmentConfig(options.glassesEnvironment);\n\n if (this.shouldDownloadZip(options.upc, envConfig)) {\n return this.downloadZippedGlasses(\n options.upc,\n options.resolution,\n options.singleTexture,\n (options.lensMap) ? true : false,\n (options.lensBoundingBoxes) ? true : false,\n (options.glassesLandmarks) ? true : false,\n envConfig\n );\n } else {\n return this.downloadSeparatedGlasses(\n options.upc,\n options.resolution,\n options.singleTexture,\n (options.lensMap) ? true : false,\n (options.lensBoundingBoxes) ? true : false,\n (options.glassesLandmarks) ? true : false,\n envConfig\n );\n }\n }\n\n private shouldDownloadZip(upc: string, envConfig: EnvironmentConfig) {\n return isDistributorAsset(upc) || envConfig.assetType === 'ZIPPED';\n }\n\n private downloadZippedGlasses(\n upc: string,\n resolution: AssetResolution = '512',\n singleTexture: number | undefined,\n lensMap: boolean,\n lensBoundingBoxes: boolean,\n glassesLandmarks: boolean,\n envConfig: EnvironmentConfig\n ): Promise {\n\n // prepare lensmap url\n const lensMapUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.lensMap}`;\n const lensBoundsUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.lensBounds}`;\n const glassesLandmarksUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.glassesLandmarks}`;\n const qaToolEnv = ['QA_B3D_PROD', 'QA_GLTF_PROD', 'QA_B3D_TEST', 'QA_GLTF_TEST', 'QA_PROD', 'QA_TEST'];\n\n const qaTool = qaToolEnv.includes(envConfig.name);\n\n // download the zip and lensmap if present\n return Promise.all([\n ZipDownloader.getInstance().downloadZippedGlasses(upc, resolution, singleTexture, envConfig),\n (lensMap && !qaTool) ? this.downloadB3dAsset(lensMapUrl) : Promise.resolve(new Blob()),\n (lensBoundingBoxes && !qaTool) ? this.downloadB3dAsset(lensBoundsUrl) : Promise.resolve(new Blob()),\n (glassesLandmarks && !qaTool) ? this.downloadB3dAsset(glassesLandmarksUrl) : Promise.resolve(new Blob()),\n ]).then((responses) => {\n // load the glasses image\n return Promise.all([\n Promise.resolve(responses[0]),\n (responses[1].size > 0) ? AssetDecoder.getImage(responses[1]) : undefined,\n (responses[2].size > 0) ? AssetDecoder.getGLTFAsset(upc, responses[2]) : undefined,\n (responses[3].size > 0) ? AssetDecoder.getGLTFAsset(upc, responses[3]) : undefined,\n ]);\n }).then((glassesAndLensMap) => {\n // TODO is necessary to track download success?\n\n // compose the asset with lensmaps\n const glassesAsset = glassesAndLensMap[0];\n //if landmarks and bboxes option are false we set relative field undefined\n glassesAsset.lensBoundingBox = lensBoundingBoxes ? glassesAsset.lensBoundingBox : undefined;\n glassesAsset.glassesLandmarks = glassesLandmarks ? glassesAsset.glassesLandmarks : undefined;\n // NOTE: QA tool still uses zipped glasses, if we are outside QA tool new assets must be unzipped\n if (!qaTool) {\n glassesAsset.lensMap = glassesAndLensMap[1];\n glassesAsset.lensBoundingBox = glassesAndLensMap[2];\n glassesAsset.glassesLandmarks = glassesAndLensMap[3];\n }\n return Promise.resolve(glassesAsset);\n });\n }\n\n private downloadSeparatedGlasses(\n upc: string,\n resolution: AssetResolution,\n singleTexture: number | undefined,\n lensMap: boolean,\n lensBoundingBoxes: boolean,\n glassesLandmarks: boolean,\n envConfig: EnvironmentConfig\n ): Promise {\n\n // const normalizedUpc = normalizeSize(normalizeRemix(upc));\n\n const b3dUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.b3d}`;\n const transparencyUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.transparency}`;\n const shadowUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.shadow}`;\n const lensMapUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.lensMap}`;\n const lensBoundsUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.lensBounds}`;\n const glassesLandmarksUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.glassesLandmarks}`;\n\n const textureIndexes = (singleTexture !== undefined) ?\n [singleTexture] : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];\n const textureUrls = textureIndexes.map((x) => {\n return `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.color(x)}`;\n });\n\n const time1 = performance.now();\n\n return Promise.all([\n this.downloadB3dAsset(b3dUrl),\n this.downloadB3dAsset(transparencyUrl),\n this.downloadB3dAsset(shadowUrl),\n (lensMap) ? this.downloadB3dAsset(lensMapUrl) : Promise.resolve(new Blob()),\n (lensBoundingBoxes) ? this.downloadB3dAsset(lensBoundsUrl) : Promise.resolve(new Blob()),\n (glassesLandmarks) ? this.downloadB3dAsset(glassesLandmarksUrl) : Promise.resolve(new Blob()),\n ...textureUrls.map((url) => this.downloadB3dAsset(url))\n ]).then((responses) => {\n return Promise.all([\n AssetDecoder.getArrayBuffer(responses[0]),\n AssetDecoder.getImage(responses[1]),\n AssetDecoder.getImage(responses[2]),\n (responses[3].size > 0) ? AssetDecoder.getImage(responses[3]) : undefined,\n (responses[4].size > 0) ? AssetDecoder.getGLTFAsset(upc, responses[4]) : undefined,\n (responses[5].size > 0) ? AssetDecoder.getGLTFAsset(upc, responses[5]) : undefined,\n Promise.all(responses.slice(6, responses.length).map((textureResponse) => {\n return AssetDecoder.getImage(textureResponse);\n }))\n ]);\n }).then((assetsResponses) => {\n this.traceDownloadSuccess(upc, performance.now() - time1);\n return {\n upc: upc,\n objModel: assetsResponses[0],\n transparency: assetsResponses[1],\n shadow: assetsResponses[2],\n lensMap: assetsResponses[3],\n lensBoundingBox: assetsResponses[4],\n glassesLandmarks: assetsResponses[5],\n textures: assetsResponses[6],\n resolution: resolution\n };\n }).catch((e) => {\n this.traceDownloadFailure(upc, performance.now() - time1);\n logger.error(e);\n return Promise.reject(e);\n });\n }\n\n // TODO, is this used anymore?\n private glassesArchiveUrls(\n upc: string,\n resolution: AssetResolution,\n singleTexture: number | undefined,\n lensMap: boolean,\n envConfig: EnvironmentConfig\n ): string[] {\n // const normalizedUpc = normalizeSize(normalizeRemix(upc));\n\n const b3dUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.b3d}`;\n const transparencyUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.transparency}`;\n const shadowUrl = `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.shadow}`;\n const lensMapUrl = (lensMap) ? `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.lensMap}` : '';\n\n const textureIndexes = (singleTexture !== undefined) ?\n [singleTexture] : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];\n const textureUrls = textureIndexes.map((x) => {\n return `${envConfig.b3dHost}/${resolution}/${upc}/${assetNames.color(x)}`;\n });\n\n return [\n b3dUrl,\n transparencyUrl,\n shadowUrl,\n lensMapUrl,\n ...textureUrls\n ];\n }\n\n private downloadB3dAsset(glassesAssetUrl: string): Promise {\n return fetch(glassesAssetUrl)\n .then((response: Response) => {\n if (response.ok) {\n return response.blob();\n } else {\n logger.error('b3d asset {} failed: [{} {}]',\n response.url, response.status, response.statusText);\n switch (response.status) {\n case 403:\n return Promise.reject(new GlassesDownloadForbiddenError(glassesAssetUrl));\n case 404:\n return Promise.reject(new GlassesNotFoundError(glassesAssetUrl));\n default:\n return Promise.reject(new GlassesDownloadError(glassesAssetUrl));\n }\n }\n }).catch((e) => {\n logger.error(e);\n return Promise.reject(new GlassesDownloadError(glassesAssetUrl));\n });\n }\n\n // private downloadGltfAsset(glassesAssetUrl: string): Promise {\n // return fetch(glassesAssetUrl)\n // .then((response: Response) => {\n // if (response.ok) {\n // return response.arrayBuffer();\n // } else {\n // logger.error('gltf asset {} failed: [{} {}]',\n // response.url, response.status, response.statusText);\n // switch (response.status) {\n // case 403:\n // return Promise.reject(new GlassesDownloadForbiddenError(glassesAssetUrl));\n // case 404:\n // return Promise.reject(new GlassesNotFoundError(glassesAssetUrl));\n // default:\n // return Promise.reject(new GlassesDownloadError(glassesAssetUrl));\n // }\n // }\n // }).catch((e) => {\n // logger.error(e);\n // return Promise.reject(new GlassesDownloadError(glassesAssetUrl));\n // });\n // }\n\n private traceDownloadSuccess(upc: string, ttime: number) {\n this.remoteLog.sendAppViewSession(\n {\n statusCode: AppViewSessionKeys.GLASSES_OK + AppViewSessionKeys.GLASSES_DOWNLOAD_SUCCESS_UPC,\n statusText: upc,\n }, {\n statusCode: AppViewSessionKeys.GLASSES_OK + AppViewSessionKeys.GLASSES_DOWNLOAD_SUCCESS_TIME,\n statusText: ttime.toString(),\n },\n );\n }\n\n private traceDownloadFailure(upc: string, ttime: number) {\n this.remoteLog.sendAppViewSession(\n {\n statusCode: AppViewSessionKeys.GLASSES_KO + AppViewSessionKeys.GLASSES_DOWNLOAD_FAILURE_UPC,\n statusText: upc,\n }, {\n statusCode: AppViewSessionKeys.GLASSES_KO + AppViewSessionKeys.GLASSES_DOWNLOAD_FAILURE_TIME,\n statusText: ttime.toString(),\n },\n );\n }\n}\n\nexport {\n GlassesDownloader\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;","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 localforage from \"localforage\";\n\nconst dbName = \"db_appviewsession\";\n\nclass DBAppViewSessionFactory {\n\n public static getInstance() {\n if (!DBAppViewSessionFactory.instance) {\n DBAppViewSessionFactory.instance = new DBAppViewSessionFactory();\n }\n return DBAppViewSessionFactory.instance;\n }\n\n private static instance: DBAppViewSessionFactory;\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 { DBAppViewSessionFactory };\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","const sendXhrRequest = (\r\n method: string,\r\n url: string,\r\n body: any,\r\n responseType: XMLHttpRequestResponseType,\r\n responseHeaders: string[] = [],\r\n options: Record = {},\r\n onProgress?: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null\r\n): Promise => {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(method || \"GET\", url);\r\n xhr.responseType = responseType;\r\n for (const header in options) {\r\n if (options[header]) {\r\n xhr.setRequestHeader(header, options[header]);\r\n }\r\n }\r\n\r\n xhr.onload = (e: any) => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n\r\n const responseHeaderValues: {[header: string]: string} = {};\r\n responseHeaders.forEach((header) => {\r\n const responseHeaderValue = xhr.getResponseHeader(header);\r\n if (responseHeaderValue !== null && responseHeaderValue !== undefined) {\r\n responseHeaderValues[header] = responseHeaderValue;\r\n }\r\n });\r\n\r\n resolve({\r\n status: xhr.status,\r\n statusText: xhr.statusText,\r\n response: xhr.response,\r\n headers: responseHeaderValues\r\n });\r\n } else {\r\n reject({\r\n status: xhr.status,\r\n statusText: xhr.statusText,\r\n response: xhr.response\r\n });\r\n }\r\n };\r\n\r\n xhr.onerror = (e) => {\r\n reject({\r\n status: xhr.status,\r\n statusText: xhr.statusText,\r\n response: xhr.response\r\n });\r\n };\r\n\r\n if (xhr.upload && onProgress) {\r\n xhr.upload.onprogress = onProgress;\r\n }\r\n xhr.send(body);\r\n });\r\n};\r\n\r\nexport {\r\n sendXhrRequest\r\n};\r\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 localforage from \"localforage\";\n\nconst dbName = \"db_browsersession\";\n\nclass DBBrowserSessionFactory {\n\n public static getInstance() {\n if (!DBBrowserSessionFactory.instance) {\n DBBrowserSessionFactory.instance = new DBBrowserSessionFactory();\n }\n return DBBrowserSessionFactory.instance;\n }\n\n private static instance: DBBrowserSessionFactory;\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 { DBBrowserSessionFactory };\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 localforage from \"localforage\";\n\nconst dbName = \"db_trackingstatus\";\n\nclass DBTrackingStatusFactory {\n\n public static getInstance() {\n if (!DBTrackingStatusFactory.instance) {\n DBTrackingStatusFactory.instance = new DBTrackingStatusFactory();\n }\n return DBTrackingStatusFactory.instance;\n }\n\n private static instance: DBTrackingStatusFactory;\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 { DBTrackingStatusFactory };\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 { AppViewSessionConsumerJob } from \"./AppViewSessionConsumerJob\";\nimport { BrowserSessionConsumerJob } from \"./BrowserSessionConsumerJob\";\nimport { RemoteLogConsumerJob } from \"./RemoteLogConsumerJob\";\nimport { TrackingStatusConsumerJob } from \"./TrackingStatusConsumerJob\";\n\nclass JobsStarter {\n\n public static getInstance() {\n if (!JobsStarter.instance) {\n JobsStarter.instance = new JobsStarter();\n }\n return JobsStarter.instance;\n }\n\n private static instance: JobsStarter;\n\n public constructor() {\n this.createJobs();\n }\n\n private createJobs() {\n BrowserSessionConsumerJob.getInstance().start();\n AppViewSessionConsumerJob.getInstance().start();\n TrackingStatusConsumerJob.getInstance().start();\n RemoteLogConsumerJob.getInstance().start();\n }\n\n}\n\nexport { JobsStarter };\n","import { v4 as uuid } from \"uuid\";\nimport { DBAppViewSessionFactory } from \"../../../../adapter/db/factory/DBAppViewSessionFactory\";\nimport { LogsConfig } from \"../../../../config/LogsConfig\";\nimport { IRemoteAppViewSession } from \"../../../model/IRemoteAppViewSession\";\n\nclass AppViewSessionService {\n\n public log(message: IRemoteAppViewSession): void {\n const timestamp = this.now();\n LogsConfig.getInstance().isAppViewSessionActive().then((isActive) => {\n if (isActive) {\n this.queueMessage(message, timestamp);\n }\n });\n }\n\n private queueMessage(message: IRemoteAppViewSession, timestamp: string) {\n this.dbInstance().getDB().setItem(uuid(), {\n date: timestamp,\n statusCode: message.statusCode,\n statusText: message.statusText,\n });\n }\n\n private dbInstance() {\n return DBAppViewSessionFactory.getInstance();\n }\n\n private now() {\n return new Date().toISOString();\n }\n\n}\n\nexport { AppViewSessionService };\n","import { v4 as uuid } from \"uuid\";\nimport { DBBrowserSessionFactory } from \"../../../../adapter/db/factory/DBBrowserSessionFactory\";\nimport { LogsConfig } from \"../../../../config/LogsConfig\";\nimport { IRemoteBrowserSession } from \"../../../model/IRemoteBrowserSession\";\n\nclass BrowserSessionService {\n\n public log(message: IRemoteBrowserSession): void {\n const timestamp = this.now();\n LogsConfig.getInstance().isBrowserSessionActive().then((isActive) => {\n if (isActive) {\n this.queueMessage(message, timestamp);\n }\n });\n }\n\n private queueMessage(message: IRemoteBrowserSession, timestamp: string) {\n this.dbInstance().getDB().setItem(uuid(), {\n date: timestamp,\n deviceResolution: message.deviceResolution,\n deviceWebcam: message.deviceWebcam,\n deviceWebgl: message.deviceWebgl,\n });\n }\n\n private dbInstance() {\n return DBBrowserSessionFactory.getInstance();\n }\n\n private now() {\n return new Date().toISOString();\n }\n\n}\n\nexport { BrowserSessionService };\n","import { v4 as uuid } from \"uuid\";\nimport { DBTrackingStatusFactory } from \"../../../../adapter/db/factory/DBTrackingStatusFactory\";\nimport { LogsConfig } from \"../../../../config/LogsConfig\";\nimport { IRemoteTrackingStatus } from \"../../../model/IRemoteTrackingStatus\";\n\nclass TrackingStatusService {\n\n public log(message: IRemoteTrackingStatus): void {\n const timestamp = this.now();\n LogsConfig.getInstance().isTrackingStatusActive().then((isActive) => {\n if (isActive) {\n this.queueMessage(message, timestamp);\n }\n });\n }\n\n private queueMessage(message: IRemoteTrackingStatus, timestamp: string) {\n this.dbInstance().getDB().setItem(uuid(), {\n date: timestamp,\n fps: message.fps,\n trackingCode: message.trackingCode,\n trackingText: message.trackingText,\n });\n }\n\n private dbInstance() {\n return DBTrackingStatusFactory.getInstance();\n }\n\n private now() {\n return new Date().toISOString();\n }\n\n}\n\nexport { TrackingStatusService };\n","import { Logger } from \"@log4js2/core\";\nimport { RemoteLogAppender } from \"./domain/appender/RemoteLogAppender\";\nimport { IRemoteAppViewSession } from \"./domain/model/IRemoteAppViewSession\";\nimport { IRemoteBrowserSession } from \"./domain/model/IRemoteBrowserSession\";\nimport { IRemoteTrackingStatus } from \"./domain/model/IRemoteTrackingStatus\";\nimport { RemoteLogConfig } from \"./domain/RemoteLogConfig\";\nimport { JobsStarter } from \"./domain/service/job/JobsStarter\";\nimport { AppViewSessionService } from \"./domain/service/log/producer/AppViewSessionService\";\nimport { BrowserSessionService } from \"./domain/service/log/producer/BrowserSessionService\";\nimport { TrackingStatusService } from \"./domain/service/log/producer/TrackingStatusService\";\n\nclass RemoteLog {\n\n private browserSessionService = new BrowserSessionService();\n private appViewSessionService = new AppViewSessionService();\n private trackingStatusService = new TrackingStatusService();\n\n public constructor() {\n JobsStarter.getInstance();\n }\n\n public sendBrowserSession(browserSession: IRemoteBrowserSession) {\n this.browserSessionService.log(browserSession);\n }\n\n public sendAppViewSession(...appViewSession: IRemoteAppViewSession[]) {\n appViewSession.forEach((item) => {\n this.appViewSessionService.log(item);\n });\n }\n\n public sendTracking(...trackingStatus: IRemoteTrackingStatus[]) {\n trackingStatus.forEach((item) => {\n this.trackingStatusService.log(item);\n });\n }\n\n public sendFps(...trackingStatus: IRemoteTrackingStatus[]) {\n trackingStatus.forEach((item) => {\n this.trackingStatusService.log(item);\n });\n }\n\n}\n\nexport { RemoteLog, RemoteLogAppender, RemoteLogConfig, Logger };\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\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 this.videoSrc = '';\r\n console.log('no video src defined, showing black image');\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 if (this.videoSrc != '') {\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 } else {\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d')!;\r\n\r\n // Set the canvas size to match the image size\r\n canvas.width = 256;\r\n canvas.height = 256;\r\n\r\n // Draw the image onto the canvas\r\n context.drawImage(this.imageElement, 0, 0);\r\n\r\n // Get the image data\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n const data = imageData.data;\r\n\r\n // Loop through each pixel and set it to black\r\n for (let i = 0; i < data.length; i += 4) {\r\n // Set red, green, and blue components to 0 (black)\r\n data[i] = 0; // Red\r\n data[i + 1] = 0; // Green\r\n data[i + 2] = 0; // Blue\r\n // Alpha component (data[i + 3]) remains unchanged\r\n }\r\n\r\n // Put the modified image data back onto the canvas\r\n context.putImageData(imageData, 0, 0);\r\n\r\n // Convert the canvas to a data URL\r\n const blackDataURL = canvas.toDataURL();\r\n\r\n // Set the modified data URL as the source for the image\r\n this.imageElement.src = blackDataURL;\r\n return Promise.resolve();\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 mock?: boolean\r\n },\r\n stream: MediaStream | NativeStream\r\n ) {\r\n if (this.isMockStream() || options.mock) {\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","export const cameraBlackList = [\n 'Snap Camera'\n];\n\n/**\n * @hidden\n *\n * Handle localized iOS Wide front (main) camera labels. Supported languages:\n * English, German, French, Spanish (spain), Portuguese (brasil), Portuguese (portugal), Italian,\n * Chinese (simplified), Chinese (traditional), Japanese, Russian, Turkish, Dutch, Arabic, Thai, Swedish,\n * Danish, Vietnamese, Norwegian, Polish, Finnish, Indonesian, Hebrew, Greek, Romanian, Hungarian, Czech,\n * Catalan, Slovak, Ukraininan, Croatian, Malay, Hindi.\n */\nexport const iosWideFrontCameraLabelsWhiteList = [\n 'Front Camera',\n 'Frontkamera',\n 'Appareil photo avant',\n 'Forsidekamera',\n '前置相机',\n '前置相機',\n '前面カメラ',\n 'Камера на передней панели',\n 'Cámara frontal',\n 'Ön Kamera',\n 'Camera aan voorzijde',\n 'الكاميرا الأمامية',\n 'กล้องด้านหน้า',\n 'Kamera på framsidan',\n 'Camera mặt trước',\n 'Càmera frontal',\n 'Predná kamera',\n 'Kamera foran',\n 'Przedni aparat',\n 'Etukamera',\n 'Kamera Depan',\n 'Μπροστινή κάμερα',\n 'Cameră față',\n 'Elülső kamera',\n 'Fotocamera (anteriore)',\n 'Přední fotoaparát',\n 'Передня камера',\n 'Prednja kamera',\n 'Kamera Depan',\n 'Câmera Frontal',\n 'Câmara frontal',\n 'מצלמה קדמית',\n 'फ़्रंट कैमरा',\n];","import { CameraFacingMode } from './CameraFacingMode';\nimport { cameraBlackList, iosWideFrontCameraLabelsWhiteList } from '../cameraSets/CameraSets';\nimport { DeviceDetection } from '@luxottica/vm-devicedetection';\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 detector = new DeviceDetection()\n\nclass WebCamConstraints {\n public static getConstraints(\n w: number,\n h: number,\n cameraFacingMode: CameraFacingMode,\n ): Promise {\n\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' && \n !cameraBlackList.includes(device.label) &&\n (!detector.isiOS() || (detector.isiOS() && iosWideFrontCameraLabelsWhiteList.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","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","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 this.forcePermissions({audio: false, video: true}).then(() => {\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\r\n public forcePermissions(\r\n { audio, video } : \r\n { audio: boolean, video: boolean })\r\n : Promise {\r\n const constraints = { audio, video };\r\n return new UserMedia().get().getUserMedia(constraints).then((mediaStream) => {\r\n mediaStream.getTracks().forEach(track => track.stop());\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 listVideoDevices() {\r\n return this.forcePermissions({audio: false, video: true}).then(() => {\r\n const devices = navigator.mediaDevices.enumerateDevices();\r\n \r\n return devices.then((devicesInfo) => {\r\n return devicesInfo.filter((deviceInfo) => {\r\n return deviceInfo.kind === 'videoinput';\r\n });\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","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\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","// 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","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","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"],"names":["warmUp","environment","key","then","_ref","PoseTracker","Promise","_ref2","FeatureLicensingService","initialize","_ref3","EffectManager","addAutomaticEffects","VtoError","constructor","type","errorSource","message","adobeErrorParameters","errorCode","errorDetails","Object","setPrototypeOf","prototype","Error","InitializationError","NotInitializedError","InvalidParametersError","parameter","value","InvalidLocaleError","locale","RenderingError","upc","UpcSupportedError","UpcMissingError","MountComponentError","divId","UnmountComponentError","WebcamUnavailableError","WebcamRejectedError","OpacityError","AnimationError","MissingAuthKeyError","FeatureInitializationError","FeatureUnavailableError","feature","FeatureUndefinedError","FeatureServerError","e","DefaultInitializationOptions","undefined","analyticsConfig","brand","channel","storeId","sessionTimeout","VM_SKIP_AKAMAI_LICENSING_FLAG","window","VMAkamaiLicensingFlag","Features","config","STAGING","baseUrl","overrideAkamai","getAllFeaturesPath","getKeyAuthorizationPath","ACCEPTANCE","console","warn","PRODUCTION","defaultFeatures","Map","localStorage","getItem","getFeatureConfig","currentLicenseKey","featureSupportCache","VmStore","logger","RemoteLogConfig","getLoggerInfo","name","version","isInitialized","currentEnvironment","getFeatureMap","resolve","reject","url","debug","JSON","stringify","featureListUrl","fetch","res","ok","json","status","statusText","featureMap","values","forEach","set","includes","toString","entries","catch","error","licenseKey","shouldReset","getKey","isFeatureAuthorized","features","every","get","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","ACTIVATE_VIDEO","DEACTIVATE_VIDEO","initialState","loading","WEBCAM_ACCESS","INITIALIZATION","POSETRACKER","RENDERING","GLASSES","MESH","privacy","auth","accessToken","refreshToken","AppActions","setEnvironment","createAction","Actions","setAuth","resetAuth","setPrivacyOptions","setLoadingStatus","AppReducer","handleActions","state","action","payload","_objectSpread2","glasses","video","mirrorStatus","mirrorOptions","pluginList","pluginsRequirements","MirrorActions","setMirrorOptions","setMirrorStatus","setMirrorGlasses","setMirrorGlassesData","setMirrorGlassesStatus","setGltfMirrorGlassesStatus","setMesh","setMeshData","setMeshStatus","addPlugin","removePlugin","clearAllPlugins","setPluginsRequirements","activateVideo","deactivateVideo","MirrorReducer","newPluginList","filter","plugin","pluginId","map","index","findIndex","splice","ActiveVideo","videoId","pupillaryDistance","region","source","UserActions","setUser","UserReducer","combineReducers","app","mirror","user","finalOpacity","animationStartTime","animationDuration","AppViewSessionKeys","vmIsInitialized","getState","configureVmStore","enhancer","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","createStore","rootReducer","configureStore","performanceEvents","onEngineStarting","onFirstFrameRendered","onNewAssetRequested","onWaitingForPose","onFirstFrameStarted","onAssetSwitchDone","onNewTransitionRequested","onNewTransitionRendered","onNewTranscodeFile","onEndTranscodeFile","onFPSCount","glassesRemovalPerformanceEvents","onGlassesPresenceStart","onGlassesPresenceEnd","onDetectInitStart","onDetectInitEnd","onLoadSMModelStart","onLoadSMModelEnd","onLoadLGModelStart","onLoadLGModelEnd","faceWebPerformanceEvents","onSegmenterInitializeStart","onSegmenterInitializeEnd","onFaceFoundSet","setPrivacyCallbacks","privacyCallbacks","callback","CallbackHelper","setCallbacks","callbacks","onAuthUpdated","authData","dispatch","call","onFaceFound","onLowEndDeviceDetected","onTransitionAnimation","onTransitionAnimationEnd","onLensChange","onGesture","onBufferUpdate","useBiometricBipa","onDisplayPage","onPrivacyAgree","onPrivacyFail","onPrivacyReject","onPrivacyPolicyClick","onTermsAndConditionsClick","onPrivacyDisplay","onMirrorExperience","transitionLensMap","transitionOpacity","animationEnabled","animateForward","downloadTransitionsPromise","TransitionColorHelper","downloadTransitionColors","VM_TRANSITIONS","downloadPromise","env","Catalog","colorMap","keys","colorName","specificLens","lens","setTransitionOverrideColor","color","OVERRIDE","reset","startAnimation","duration","Date","now","forward","currentOpacity","computePartialAnimation","getTransitionColor","_transitionLensMap","setCurrentLensOpacity","inputOpacity","getCurrentLensOpacity","animationProgress","animateOpacity","transitionAvailable","RequestHelper","loginRequest","Events","PAUSE","RESUME","TOPIC_SCREENSHOT_REQ","TOPIC_SCREENSHOT_RES","adobeConfig","lastInteractionTime","sessionTimeoutMs","vmRemoteLog","RemoteLog","createLogger","loggerName","sendError","sendAppViewSession","statusCode","options","VM_OK","VM_INIT_BRAND","VM_INIT_CHANNEL","VM_INIT_LOCALE","initializeError","VM_KO","VM_INIT","VM_UPC_AVAILABILITY","upcError","orientationChange","landscape","fitMeBetter","VM_FITMEBETTER","fitMeBetterError","close","target","VM_CLOSE","closeError","generateAdobeData","eventParams","errorParams","lensSim","adobeData","location","href","document","referrer","hostname","_adobeConfig","_adobeConfig2","_adobeConfig3","_adobeConfig4","_adobeConfig5","storeRegion","_adobeConfig6","storeCompany","_adobeConfig7","globalStoreId","lensName","eventCode","sendAdobeRequest","data","adobeHost","query","Array","from","encodeURIComponent","join","adobeQuery","abobeHost","method","AdobeHelper","msEnvironment","sendEvent","VM_ANALYTICS","vtoError","adobeErrorData","setSessionTimeout","Infinity","updateInteractionTime","eventName","params","arguments","AnalyticsHelper","onSessionStart","onInitializeSuccess","onInitializeError","onRequestWebcam","onWebcamAllowed","onWebcamDenied","onWebcamUnavailable","onMirrorWasmFailure","onGlassesOn","onGlassesOff","onRender","upcIdLens","upcLensName","onRenderReady","onMirrorRenderFailure","onFitGlasses","onAdjustGlasses","onCloseMirror","onError","onScreenshot","onGlassesRemovalStateChange","info","VmWebCam","this","webCam","WebCam","openWebcamAndPlay","mock","_this","tryToOpenWebCam","reason","stream","videoElementClassname","DeviceDetection","isiOS","initStreamObject","className","id","play","w","h","webCamStream","createStreamObject","closeCurrentMediaStream","pause","deviceDetection","isNativeStream","isAppleiOS13","streamObject","instance","Catalogue","isUpcSupported","result","upcs","isUpcSupportedImproved","downloadTransitionColorCatalogue","featureLicensingInitialization","catalogueEnvironment","featureLicensingEnv","localeMap","de","en","es","fr","it","ja","ko","nl","pl","pt","sv","tr","zh","localeRegionMap","US","EU","AU","getLocaleRegionFallback","language","LocalizationDefaults","translations","MIRROR","GENERIC_ERROR","BUTTON","ERROR","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","page","text","getStringFromTranslation","localizedTranslations","translationType","translation","overriddenTranslations","_this$overriddenTrans","_this$overriddenTrans2","_this$overriddenTrans3","FASA_OVERRIDE_LABELS","bipaActive","localizationPromise","localeReturn","localTranslations","formattedLocale","length","replace","formatLocaleRegEx","match","p1","p2","toUpperCase","parse","RegExp","textEnv","localizationFileUrl","response","cleanLocale","resolvedLocale","localeLanguage","localeRegEx","exec","localeError","translationFound","fetchLocalization","fallbackTranslation","englishTranslation","GestureType","HEAD_NOD","HEAD_SHAKE","HEAD_LEFT","HEAD_RIGHT","HEAD_UP","HEAD_DOWN","HEAD_ROLL_LEFT","HEAD_ROLL_RIGHT","VirtualMirror","overrideLocalization","setOverrides","getMirrorDefaultLocalization","getDefaults","getMirrorLocalization","getLocalizationTranslation","getBipaVersion","VM_GET_BIPA_VERSION","BipaManager","saveBipaEntry","VM_SAVE_BIPA_ENTRY","bipaVersion","formData","firstName","lastName","email","resetBipaState","cookie","renderMirror","videoSrc","VideoManager","activate","getInstance","EventBus","resume","activateCamera","clear","getScreenshot","quality","setTransitionOpacity","opacity","refresh","recreateFaceWeb","verticalFovDeg","TransitionLens","transitionColor","closeMirror","_ref4","warmUpEffectsAndRecording","getEffectStatus","getStatus","activateEffect","effectId","_this2","removeCurrentEffect","_this3","recordCanvasAsGif","gifLengthMs","_this4","add","pluginOptions","lengthMs","setTimeout","remove","recordCanvasAsVideo","videoLengthMs","_this5","isBrowserSupported","_ref5","BipaError","stack","MissingTranslationError","BipaServiceError","BipaSubmissionError","fieldErrors","currentLocalizationText","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","localizationText","NOT_BLANK","SIZE","EMAIL_REGEX","createFieldError","field","objectName","ParameterHelper","bipaForm","trim","push","ErrorIcon","React","width","height","viewBox","fill","cx","cy","r","stroke","strokeWidth","d","x","y","rx","BipaBiometricForm","props","useState","formPrefill","_props$formPrefill","setFirstName","firstNameError","setFirstNameError","_props$formPrefill2","setLastName","lastNameError","setLastNameError","_props$formPrefill3","setEmail","emailError","setEmailError","serverError","setServerError","topInputRef","useRef","useEffect","handleInputChange","element","confirmButtonDisabled","showFieldWarning","BIPA_FORM_ERROR","ref","autoComplete","onChange","placeholder","BIPA_FORM_ERROR_MAIL","BIPA_FORM_MANDATORY_FIELD","onClick","onCancel","current","scrollIntoView","submitBipaFormRequest","onBipaSubmit","errorFields","disabled","YesNoCheckBox","checked","BIPA_NO","tabIndex","event","BIPA_YES","PrivacyAgreement","showGradient","setShowGradient","getElementsByClassName","clientHeight","onScroll","currentTarget","scrollTop","dangerouslySetInnerHTML","__html","htmlFor","BIPA_CITIZEN_QUESTION","isIllinoisUser","onSetIllinoisUser","PRIVACY_AGREEMENT_TEXT","BIPA_FORM_BIPA_AGREEMENT","rel","privacyOptions","termsAndConditions","preventDefault","onSubmit","CookieHelper","setBiometricCookie","agreementType","biometricCookieExists","getBiometricCookieName","localizationBaseUrl","fetchBipaJson","bipaJsonEnv","BipaOverlay","isFirstRender","illinoisUser","setIlliniosUser","currentPage","setCurrentPage","setBipaVersion","onClickSubmit","onClickBipaSubmit","onClickCancel","onUserReject","tokenVersion","loginReturn","all","bipaAgreementRequest","bipaAgreementText","_response$","bipaAgreementVersion","_response$2","renderPage","getCookieName","body","responseData","_responseData$body","title","_responseData$body2","GlassesEnvironment","hosts","MOCK","catalogHost","transitionsEndpoint","b3dHost","gltfHost","gltfPointer","customDistributorHost","customDistributorKey","customDistributorGetPermutation","assetType","PROD","PROD_LEGACY","TEST","TEST_LEGACY","TEST_TRANSITIONS","QA_GLTF_PROD","QA_GLTF_TEST","QA_B3D_PROD","QA_B3D_TEST","DISTRIBUTOR_VALIDATION_STAGING","DISTRIBUTOR_APPROVATION_STAGING","DISTRIBUTOR_VALIDATION_PRODUCTION","DISTRIBUTOR_APPROVATION_PRODUCTION","getEnvironmentConfig","upcsAvailabilityApi","CatalogueApiConfig","upcString","envConfig","notAvailableResponse","available","transitions","lods","glassesType","getUpc","isAvailable","isTransition","standardResponse","catalogResponse","resolutions","transitionsResolutions","getGlassesType","fetchCatalogResponse","apiEndpoint","requestInit","headers","mode","referrerPolicy","CatalogService","qaToolAvailability","split","qaToolMultipleAvailability","getUpcAvailability","getMultipleUpcAvailability","upcList","reduce","previous","downloadTransitionLenses","AssetDecoder","getArrayBuffer","blob","reader","FileReader","onerror","onload","readAsArrayBuffer","getZippedImage","imagePromise","async","getImage","URL","createObjectURL","img","Image","crossOrigin","revokeObjectURL","src","getImageBase64","readAsDataURL","getZippedGLTF","gltfPromise","getGLTFAsset","arrayBuffer","assetNames","gltfDefaults","MockAssetData","GenericError","genericError","GlassesDownloadError","GlassesDownloadForbiddenError","GlassesNotFoundError","isDistributorAsset","startsWith","ALL_TEXTURES","GlassesExtractor","glassesZip","resolution","singleTexture","colorIndexes","unzipGlasses","time1","performance","time2","jszip","JSZip","loadAsync","extractFilesFromZipArchive","glassesExtracted","createGlassesDataFromExtractedArchive","zipUpc","promises","folderName","extractB3D","extractMult","extractShadow","extractLensMap","extractBoundingBoxes","extractLandmarks","extractColors","promise","i","zipFolder","folder","file","colorPromise","ttime","multPromise","mult","shadowPromise","shadow","lensmapFile","lensmapPromise","lensmap","byteLength","lensBoundsFile","lensBoundsPromise","bounds","landmarksFile","landmarksPromise","landmarks","b3dPromise","b3d","textureIndexes","objModel","transparency","lensMap","lensBoundingBox","glassesLandmarks","textures","slice","ZipDownloader","remoteLog","tryToDownload","unzip","glassesUrl","requestOptions","customDistributorAsset","qaDistributorAsset","dash","underscore","isQADistributorAsset","getCustomUrl","getDistributorUrl","getUrl","triedLegacyCustom","fetchGlasses","traceDownloadSuccess","traceDownloadFailure","getLegacyUrl","tkn","baseName","distributorBasename","GLASSES_OK","GLASSES_DOWNLOAD_SUCCESS_UPC","GLASSES_DOWNLOAD_SUCCESS_TIME","GLASSES_KO","GLASSES_DOWNLOAD_FAILURE_UPC","GLASSES_DOWNLOAD_FAILURE_TIME","miscUrls","boundsUrl","landmarksUrl","GlassesDownloader","glassesEnvironment","gltfUrl","assetData","LOD1","LOD2","gltfLodUrls","nosepadType","fitting","flare","misc","landmarksAndBBox","fittingExplicitOffset","LOD0","lod0","lod1","lod2","assetNumLods","lodNumber","upcSiUrl","_a","nosepad_type","_b","_c","_d","shouldDownloadZip","downloadZippedGlasses","lensBoundingBoxes","downloadSeparatedGlasses","lensMapUrl","lensBoundsUrl","glassesLandmarksUrl","qaToolEnv","qaTool","downloadB3dAsset","Blob","responses","size","glassesAndLensMap","glassesAsset","b3dUrl","transparencyUrl","shadowUrl","textureUrls","textureResponse","assetsResponses","glassesAssetUrl","getRandomValues","rnds8","Uint8Array","rng","crypto","bind","msCrypto","uuid","REGEX","byteToHex","substr","arr","offset","toLowerCase","validate","TypeError","buf","rnds","random","LogMessage","level","logName","date","toISOString","DBRemoteLogFactory","db","localforage","LogsConfigurationRetriever","configurationUrl","currentHostname","defaultConfiguration","appviewSessionIsActive","browserSessionIsActive","clientLogIsActive","serverLogIsActive","trackingStatusIsActive","LogsConfig","configuration","getConfiguration","appViewSessionActive","cfg","browserSessionActive","trackingStatusActive","clientLogActive","serverLogActive","RemoteLogService","isServerLogActive","isActive","queueMessage","logMessage","dbInstance","getDB","setItem","getDate","getLevel","getLogName","getMessage","RemoteLogAppender","logService","logEvent","getLogLevel","log","LogLevel","newLogMessage","logLevel","LogAppender","Appender","VM_BROWSERSESSION_UUID","VM_LOGLEVEL_OVERRIDE","defaultLevel","defaultLayout","storage","configured","browserUUID","createSessionId","configureLevel","VMAvailableLogLevels","VMLogLevelsOverrideKey","moduleName","moduleVersion","getLogger","logOverride","logLevelOverride","configureLog4js2","isClientLogActive","logAppenders","configure","appenders","layout","virtualConsole","appender","logAppenderName","currentUuid","newUuid","DBAppViewSessionFactory","VmAnalyticsApiConfig","hostTest","hostProd","appViewSessionApi","browserSessionApi","trackingStatusApi","remoteLogApi","getHostname","host","isDevEnvironment","isDev","sendXhrRequest","responseType","responseHeaders","onProgress","xhr","XMLHttpRequest","header","open","setRequestHeader","responseHeaderValues","responseHeaderValue","getResponseHeader","upload","onprogress","send","AppViewSessionAdapter","sessionId","jsonBody","browserSessionUuid","requestUrl","appViewSessionApiEndpoint","consumeDbRows","dbase","iterate","removeItem","AppViewSessionConsumer","AppViewSessionConsumerJob","started","intervalFunction","setInterval","consume","clearInterval","DBBrowserSessionFactory","VM_BROWSERSESSION_FLAG","storageIdentifier","VM_BROWSERSESSION_ETAG","BrowserSessionAdapter","userAgentData","getUserAgentData","persistedSessionFlag","persistedSessionUuid","device","cpuArchitecture","cpu","architecture","model","dpi","deviceResolution","vendor","webapi","ambientLight","connection","navigator","serviceWorker","share","visibility","webcam","deviceWebcam","enabled","resolutionW","webgl","deviceWebgl","os","parseFloat","userAgent","browserEngineName","engine","browserEngineVersion","browserName","browser","browserVersion","webView","isWebView","browserSessionApiEndpoint","etagsessionId","etag","BrowserSessionConsumer","BrowserSessionConsumerJob","RemoteLogAdapter","remoteLogApiEndpoint","RemoteLogConsumer","RemoteLogConsumerJob","DBTrackingStatusFactory","TrackingStatusAdapter","fps","trackingCode","trackingText","trackingStatusApiEndpoint","TrackingStatusConsumer","TrackingStatusConsumerJob","JobsStarter","createJobs","start","AppViewSessionService","timestamp","isAppViewSessionActive","BrowserSessionService","isBrowserSessionActive","TrackingStatusService","isTrackingStatusActive","browserSessionService","appViewSessionService","trackingStatusService","browserSession","appViewSession","item","trackingStatus","toDataURL","onloadend","MockStreamTrack","label","settings","MockStream","tracks","MockBridgeMedia","constraints","dataUrl","AbstractNativeBridge","NativeBridge","webkit","messageHandlers","closeNativeCam","postMessage","requiredResolution","startNativeCam","pauseNativeCam","resumeNativeCam","_typeof","NativeStreamTrack","NativeStream","NativeBridgeMedia","getRequiredResolution","onStartNativeCam","ideal","UserMedia","mockOptionName","userMedia","mediaDevices","MockVideoStream","targetElement","getElementById","mediaStream","imageElement","appendChild","privateCurrentTime","_this$imageElement","naturalWidth","_this$imageElement2","naturalHeight","listener","playingListener","waitForFrame","imgData","setAttribute","canvas","createElement","context","getContext","drawImage","imageData","getImageData","putImageData","blackDataURL","NativeVideoStream","getVideoTracks","getSettings","onCamFrame","base64","startTimeCounter","WebCamVideoStream","muted","srcObject","currentTime","videoWidth","videoHeight","defaultMuted","addEventListener","removeEventListener","WebCamStream","isMockStream","privateStreamObject","isMediaStream","MediaStream","cameraBlackList","iosWideFrontCameraLabelsWhiteList","defaultContraints","audio","facingMode","max","detector","WebCamConstraints","cameraFacingMode","getDeviceIdConstraints","deviceIds","deviceId","enumerateDevices","devices","kind","WebCamAbstractError","WebCamAccessNotFoundError","WebCamAccessRejectedError","WebCamAccessSystemError","forcePermissions","getConstraints","tryToOpen","getUserMedia","getTracks","track","stop","userMediaPromise","totalWebCamTime","streamOpenedTotalTime","logCloseSucc","devicesInfo","deviceInfo","WEBCAM_OK","WEBCAM_OPENING","userReqPermissionTime","userResPermissionTime","permissionWaitingTime","logOpenSucc","logTrackSettings","constraintName","logOpenFail","mediaStreamId","WEBCAM_CLOSED","WEBCAM_POWERED_TIME","toFixed","WEBCAM_OPENING_TIME","WEBCAM_KO","WEBCAM_KO_REASON_MESS","deviceW","deviceH","wcamfps","frameRate","WEBCAM_SIZE_W","WEBCAM_SIZE_H","WEBCAM_FRAMERATE","Math","round","v1","require","v4","module","exports","bth","_nodeId","_clockseq","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","ii","emitter","evtName","evtData","emit","evtHandler","on","mitt"],"sourceRoot":""}