{"version":3,"file":"EmbraceUserManager.cjs","names":["diag","EMBRACE_USER_ID_STORAGE_KEY","EMBRACE_USER_STORAGE_KEY_DEPRECATED","isUser","KEY_ENDUSER_PSEUDO_ID","isUserId","generateUUID","EMBRACE_EXTERNAL_USER_ID_KEY"],"sources":["../../../src/managers/EmbraceUserManager/EmbraceUserManager.ts"],"sourcesContent":["import type { DiagLogger } from '@opentelemetry/api';\nimport { diag } from '@opentelemetry/api';\nimport type { UserManagerInternal } from '../../api-users/index.ts';\nimport { KEY_ENDUSER_PSEUDO_ID } from '../../api-users/index.ts';\nimport { generateUUID } from '../../utils/index.ts';\nimport {\n  EMBRACE_EXTERNAL_USER_ID_KEY,\n  EMBRACE_USER_ID_STORAGE_KEY,\n  EMBRACE_USER_STORAGE_KEY_DEPRECATED,\n} from './constants.ts';\nimport type { EmbraceUserManagerArgs } from './types.ts';\nimport { isUser, isUserId } from './types.ts';\n\nexport class EmbraceUserManager implements UserManagerInternal {\n  private readonly _diag: DiagLogger;\n  private readonly _storage: Storage;\n  private _embraceUserId: string | null = null;\n\n  public constructor({\n    diag: diagParam,\n    storage = window.localStorage,\n  }: EmbraceUserManagerArgs = {}) {\n    this._diag =\n      diagParam ??\n      diag.createComponentLogger({\n        namespace: 'EmbraceUserManager',\n      });\n    this._storage = storage;\n    this._migrateOldLocalStorageKey();\n    this._initialSetup();\n  }\n\n  // No need to make this API more complicated by returning string | null\n  // embraceUserId should never be null at this point, but just in case defaulting to a new one if is not present\n  public getEmbraceUserId(): string {\n    return this._embraceUserId || this._generateNewEmbraceUserId();\n  }\n\n  public setEmbraceUserId(userId: string) {\n    this._embraceUserId = userId;\n\n    try {\n      this._storage.setItem(EMBRACE_USER_ID_STORAGE_KEY, userId);\n    } catch (e) {\n      this._diag.warn(\n        'Failed to persist user object for storage, keeping it in-memory only',\n        e,\n      );\n    }\n  }\n\n  public clearEmbraceUserId() {\n    this._embraceUserId = null;\n\n    try {\n      this._storage.removeItem(EMBRACE_USER_ID_STORAGE_KEY);\n    } catch (e) {\n      this._diag.warn('Failed to remove embrace user in storage', e);\n    }\n  }\n\n  // TODO: remove this by 01/08/2025. Two months should be enough time for users to migrate to the new storage key.\n  private _migrateOldLocalStorageKey() {\n    // Since we migrated from storing a User in localStorage to just the user id,\n    // we need to check if the old storage key exists and migrate it.\n    try {\n      const oldUserStorage = this._storage.getItem(\n        EMBRACE_USER_STORAGE_KEY_DEPRECATED,\n      );\n\n      if (oldUserStorage) {\n        const user: unknown = JSON.parse(oldUserStorage);\n        if (isUser(user)) {\n          this._diag.debug('Migrating old user data from storage');\n          this._storage.setItem(\n            EMBRACE_USER_ID_STORAGE_KEY,\n            user[KEY_ENDUSER_PSEUDO_ID],\n          );\n          this._storage.removeItem(EMBRACE_USER_STORAGE_KEY_DEPRECATED);\n        } else {\n          this._diag.warn(\n            'Invalid user data found in storage, clearing old user data',\n          );\n          this._storage.removeItem(EMBRACE_USER_STORAGE_KEY_DEPRECATED);\n        }\n      }\n    } catch (e) {\n      this._diag.warn('Failed to get old user data from storage', e);\n    }\n  }\n\n  private _initialSetup() {\n    try {\n      const embraceUserId = this._storage.getItem(EMBRACE_USER_ID_STORAGE_KEY);\n      if (!embraceUserId) {\n        this._diag.debug(\n          'No existing user found in storage, creating a new one',\n        );\n      } else if (isUserId(embraceUserId)) {\n        this._embraceUserId = embraceUserId;\n      } else {\n        this._diag.warn('Invalid embrace user id, generating a new one');\n        this.clearEmbraceUserId();\n      }\n    } catch (e) {\n      this._diag.warn(\n        'Failed to get embrace user id from storage, defaulting to a new one',\n        e,\n      );\n    }\n\n    if (!this._embraceUserId) {\n      this._embraceUserId = this._generateNewEmbraceUserId();\n    }\n  }\n\n  private _generateNewEmbraceUserId() {\n    const newUserId = generateUUID();\n    this.setEmbraceUserId(newUserId);\n\n    return newUserId;\n  }\n\n  // This is the external user id that can be set by the user\n  public getUserId(): string | null {\n    try {\n      return this._storage.getItem(EMBRACE_EXTERNAL_USER_ID_KEY);\n    } catch (e) {\n      this._diag.warn('Failed to retrieve user id from storage', e);\n      return null;\n    }\n  }\n\n  // Use storage as source of truth so multiple tabs can share the same user id\n  public setUserId(userId: string): void {\n    try {\n      this._storage.setItem(EMBRACE_EXTERNAL_USER_ID_KEY, userId);\n    } catch (e) {\n      this._diag.warn('Failed to store user id', e);\n    }\n  }\n\n  public clearUserId(): void {\n    try {\n      this._storage.removeItem(EMBRACE_EXTERNAL_USER_ID_KEY);\n    } catch (e) {\n      this._diag.warn('Failed to clear user id', e);\n    }\n  }\n}\n"],"mappings":";;;;;;;;AAaA,IAAa,qBAAb,MAA+D;CAC7D;CACA;CACA,iBAAwC;CAExC,YAAmB,EACjB,MAAM,WACN,UAAU,OAAO,iBACS,EAAE,EAAE;AAC9B,OAAK,QACH,aACAA,mBAAAA,KAAK,sBAAsB,EACzB,WAAW,sBACZ,CAAC;AACJ,OAAK,WAAW;AAChB,OAAK,4BAA4B;AACjC,OAAK,eAAe;;CAKtB,mBAAkC;AAChC,SAAO,KAAK,kBAAkB,KAAK,2BAA2B;;CAGhE,iBAAwB,QAAgB;AACtC,OAAK,iBAAiB;AAEtB,MAAI;AACF,QAAK,SAAS,QAAQC,8CAAAA,6BAA6B,OAAO;WACnD,GAAG;AACV,QAAK,MAAM,KACT,wEACA,EACD;;;CAIL,qBAA4B;AAC1B,OAAK,iBAAiB;AAEtB,MAAI;AACF,QAAK,SAAS,WAAWA,8CAAAA,4BAA4B;WAC9C,GAAG;AACV,QAAK,MAAM,KAAK,4CAA4C,EAAE;;;CAKlE,6BAAqC;AAGnC,MAAI;GACF,MAAM,iBAAiB,KAAK,SAAS,QACnCC,8CAAAA,oCACD;AAED,OAAI,gBAAgB;IAClB,MAAM,OAAgB,KAAK,MAAM,eAAe;AAChD,QAAIC,0CAAAA,OAAO,KAAK,EAAE;AAChB,UAAK,MAAM,MAAM,uCAAuC;AACxD,UAAK,SAAS,QACZF,8CAAAA,6BACA,KAAKG,0CAAAA,uBACN;AACD,UAAK,SAAS,WAAWF,8CAAAA,oCAAoC;WACxD;AACL,UAAK,MAAM,KACT,6DACD;AACD,UAAK,SAAS,WAAWA,8CAAAA,oCAAoC;;;WAG1D,GAAG;AACV,QAAK,MAAM,KAAK,4CAA4C,EAAE;;;CAIlE,gBAAwB;AACtB,MAAI;GACF,MAAM,gBAAgB,KAAK,SAAS,QAAQD,8CAAAA,4BAA4B;AACxE,OAAI,CAAC,cACH,MAAK,MAAM,MACT,wDACD;YACQI,0CAAAA,SAAS,cAAc,CAChC,MAAK,iBAAiB;QACjB;AACL,SAAK,MAAM,KAAK,gDAAgD;AAChE,SAAK,oBAAoB;;WAEpB,GAAG;AACV,QAAK,MAAM,KACT,uEACA,EACD;;AAGH,MAAI,CAAC,KAAK,eACR,MAAK,iBAAiB,KAAK,2BAA2B;;CAI1D,4BAAoC;EAClC,MAAM,YAAYC,2BAAAA,cAAc;AAChC,OAAK,iBAAiB,UAAU;AAEhC,SAAO;;CAIT,YAAkC;AAChC,MAAI;AACF,UAAO,KAAK,SAAS,QAAQC,8CAAAA,6BAA6B;WACnD,GAAG;AACV,QAAK,MAAM,KAAK,2CAA2C,EAAE;AAC7D,UAAO;;;CAKX,UAAiB,QAAsB;AACrC,MAAI;AACF,QAAK,SAAS,QAAQA,8CAAAA,8BAA8B,OAAO;WACpD,GAAG;AACV,QAAK,MAAM,KAAK,2BAA2B,EAAE;;;CAIjD,cAA2B;AACzB,MAAI;AACF,QAAK,SAAS,WAAWA,8CAAAA,6BAA6B;WAC/C,GAAG;AACV,QAAK,MAAM,KAAK,2BAA2B,EAAE"}