{"version":3,"file":"metadata.cjs","sourceRoot":"","sources":["../../../src/backup-and-sync/syncing/metadata.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAwC;AAMxC;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,UAAU,sBAAsB,CAAI,EAC9C,OAAO,EACP,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,SAAS,GAWV;IACC,MAAM,UAAU,GAAG,aAAa,EAAE,KAAK,CAAC;IACxC,MAAM,cAAc,GAAG,aAAa,EAAE,aAAa,CAAC;IACpD,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,KAAK,CAAC;IACpD,MAAM,oBAAoB,GAAG,mBAAmB,EAAE,aAAa,CAAC;IAEhE,MAAM,WAAW,GAAG,IAAA,yBAAS,EAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAE5D,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,sCAAsC;IACtD,CAAC;IAED,MAAM,uBAAuB,GAC3B,cAAc,KAAK,SAAS;QAC5B,oBAAoB,KAAK,SAAS;QAClC,cAAc,GAAG,oBAAoB,CAAC;IAExC,2DAA2D;IAC3D,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAE3E,IAAI,CAAC,uBAAuB,IAAI,CAAC,aAAa,CAAC,IAAI,uBAAuB,EAAE,CAAC;QAC3E,0DAA0D;QAC1D,MAAM,gBAAgB,CAAC,gBAAqB,CAAC,CAAC;QAE9C,mCAAmC;QACnC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,oBAAoB,CAAC;gBAC3B,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,0DAA0D;IAC1E,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,+EAA+E;AAC9F,CAAC;AArDD,wDAqDC","sourcesContent":["import deepEqual from 'fast-deep-equal';\n\nimport type { BackupAndSyncAnalyticsAction } from '../analytics';\nimport type { ProfileId } from '../authentication';\nimport type { BackupAndSyncContext } from '../types';\n\n/**\n * Compares metadata between local and user storage, applying the most recent version.\n *\n * @param options - Configuration object for metadata comparison.\n * @param options.context - The backup and sync context containing controller and messenger.\n * @param options.localMetadata - The local metadata object.\n * @param options.localMetadata.value - The local metadata value.\n * @param options.localMetadata.lastUpdatedAt - The local metadata timestamp.\n * @param options.userStorageMetadata - The user storage metadata object.\n * @param options.userStorageMetadata.value - The user storage metadata value.\n * @param options.userStorageMetadata.lastUpdatedAt - The user storage metadata timestamp.\n * @param options.applyLocalUpdate - Function to apply the user storage value locally.\n * @param options.validateUserStorageValue - Function to validate user storage data.\n * @param options.analytics - Optional analytics configuration for tracking updates.\n * @param options.analytics.action - The analytics action for the event.\n * @param options.analytics.profileId - The profile ID for analytics.\n * @returns Promise resolving to true if local data should be pushed to user storage.\n */\nexport async function compareAndSyncMetadata<T>({\n  context,\n  localMetadata,\n  userStorageMetadata,\n  applyLocalUpdate,\n  validateUserStorageValue,\n  analytics,\n}: {\n  context: BackupAndSyncContext;\n  localMetadata?: { value?: T; lastUpdatedAt?: number };\n  userStorageMetadata?: { value?: T; lastUpdatedAt?: number };\n  applyLocalUpdate: (value: T) => Promise<void> | void;\n  validateUserStorageValue: (value: T | undefined) => boolean;\n  analytics?: {\n    action: BackupAndSyncAnalyticsAction;\n    profileId: ProfileId;\n  };\n}): Promise<boolean> {\n  const localValue = localMetadata?.value;\n  const localTimestamp = localMetadata?.lastUpdatedAt;\n  const userStorageValue = userStorageMetadata?.value;\n  const userStorageTimestamp = userStorageMetadata?.lastUpdatedAt;\n\n  const isSameValue = deepEqual(localValue, userStorageValue);\n\n  if (isSameValue) {\n    return false; // No sync needed, values are the same\n  }\n\n  const isUserStorageMoreRecent =\n    localTimestamp !== undefined &&\n    userStorageTimestamp !== undefined &&\n    localTimestamp < userStorageTimestamp;\n\n  // Validate user storage value using the provided validator\n  const isUserStorageValueValid = validateUserStorageValue(userStorageValue);\n\n  if ((isUserStorageMoreRecent || !localMetadata) && isUserStorageValueValid) {\n    // User storage is more recent and valid, apply it locally\n    await applyLocalUpdate(userStorageValue as T);\n\n    // Emit analytics event if provided\n    if (analytics) {\n      context.emitAnalyticsEventFn({\n        action: analytics.action,\n        profileId: analytics.profileId,\n      });\n    }\n\n    return false; // Don't push to user storage since we just pulled from it\n  }\n\n  return true; // Local is more recent or user storage is invalid, should push to user storage\n}\n"]}