| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | Object.defineProperty(exports, '__esModule', { value: true });const utils = require('@sentry/utils');const localForage = require('localforage');const debugBuild = require('./debug-build.js');const WINDOW = utils.GLOBAL_OBJ ;/** * cache offline errors and send when connected * @deprecated The offline integration has been deprecated in favor of the offline transport wrapper. * * http://docs.sentry.io/platforms/javascript/configuration/transports/#offline-caching */class Offline  {  /**   * @inheritDoc   */   static __initStatic() {this.id = 'Offline';}  /**   * @inheritDoc   */  /**   * the current hub instance   */  /**   * maximum number of events to store while offline   */  /**   * event cache   */  /**   * @inheritDoc   */   constructor(options = {}) {    this.name = Offline.id;    this.maxStoredEvents = options.maxStoredEvents || 30; // set a reasonable default    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access    this.offlineEventStore = localForage.default.createInstance({      name: 'sentry/offlineEventStore',    });  }  /**   * @inheritDoc   */   setupOnce(addGlobalEventProcessor, getCurrentHub) {    this.hub = getCurrentHub();    if ('addEventListener' in WINDOW) {      WINDOW.addEventListener('online', () => {        void this._sendEvents().catch(() => {          debugBuild.DEBUG_BUILD && utils.logger.warn('could not send cached events');        });      });    }    const eventProcessor = event => {      // eslint-disable-next-line deprecation/deprecation      if (this.hub && this.hub.getIntegration(Offline)) {        // cache if we are positively offline        if ('navigator' in WINDOW && 'onLine' in WINDOW.navigator && !WINDOW.navigator.onLine) {          debugBuild.DEBUG_BUILD && utils.logger.log('Event dropped due to being a offline - caching instead');          void this._cacheEvent(event)            .then((_event) => this._enforceMaxEvents())            .catch((_error) => {              debugBuild.DEBUG_BUILD && utils.logger.warn('could not cache event while offline');            });          // return null on success or failure, because being offline will still result in an error          return null;        }      }      return event;    };    eventProcessor.id = this.name;    addGlobalEventProcessor(eventProcessor);    // if online now, send any events stored in a previous offline session    if ('navigator' in WINDOW && 'onLine' in WINDOW.navigator && WINDOW.navigator.onLine) {      void this._sendEvents().catch(() => {        debugBuild.DEBUG_BUILD && utils.logger.warn('could not send cached events');      });    }  }  /**   * cache an event to send later   * @param event an event   */   async _cacheEvent(event) {    return this.offlineEventStore.setItem(utils.uuid4(), utils.normalize(event));  }  /**   * purge excess events if necessary   */   async _enforceMaxEvents() {    const events = [];    return this.offlineEventStore      .iterate((event, cacheKey, _index) => {        // aggregate events        events.push({ cacheKey, event });      })      .then(        () =>          // this promise resolves when the iteration is finished          this._purgeEvents(            // purge all events past maxStoredEvents in reverse chronological order            events              .sort((a, b) => (b.event.timestamp || 0) - (a.event.timestamp || 0))              .slice(this.maxStoredEvents < events.length ? this.maxStoredEvents : events.length)              .map(event => event.cacheKey),          ),      )      .catch((_error) => {        debugBuild.DEBUG_BUILD && utils.logger.warn('could not enforce max events');      });  }  /**   * purge event from cache   */   async _purgeEvent(cacheKey) {    return this.offlineEventStore.removeItem(cacheKey);  }  /**   * purge events from cache   */   async _purgeEvents(cacheKeys) {    // trail with .then to ensure the return type as void and not void|void[]    return Promise.all(cacheKeys.map(cacheKey => this._purgeEvent(cacheKey))).then();  }  /**   * send all events   */   async _sendEvents() {    return this.offlineEventStore.iterate((event, cacheKey, _index) => {      if (this.hub) {        this.hub.captureEvent(event);        void this._purgeEvent(cacheKey).catch((_error) => {          debugBuild.DEBUG_BUILD && utils.logger.warn('could not purge event from cache');        });      } else {        debugBuild.DEBUG_BUILD && utils.logger.warn('no hub found - could not send cached event');      }    });  }} Offline.__initStatic();exports.Offline = Offline;//# sourceMappingURL=offline.js.map
 |