export function attach()

in src/backend/EnvironmentWrapper.js [16:111]


export function attach(
  hook: DevToolsHook,
  rendererID: number,
  environment: RelayEnvironment,
  global: Object
): EnvironmentWrapper {
  let pendingEventsQueue = [];
  const store = environment.getStore();

  const originalLog = environment.__log;
  environment.__log = event => {
    originalLog(event);
    // TODO(damassart): Make this a modular function
    if (pendingEventsQueue !== null) {
      pendingEventsQueue.push(event);
    } else {
      hook.emit('environment.event', {
        id: rendererID,
        data: event,
        eventType: 'environment',
      });
    }
  };

  const storeOriginalLog = store.__log;
  // TODO(damassart): Make this cleaner
  store.__log = event => {
    if (storeOriginalLog !== null) {
      storeOriginalLog(event);
    }
    switch (event.name) {
      case 'store.gc':
        // references is a Set, but we can't serialize Sets,
        // so we convert references to an Array
        event.references = Array.from(event.references);
        hook.emit('environment.event', {
          id: rendererID,
          data: event,
          eventType: 'store',
        });
        break;
      case 'store.notify.complete':
        event.invalidatedRecordIDs = Array.from(event.invalidatedRecordIDs);
        hook.emit('environment.event', {
          id: rendererID,
          data: event,
          eventType: 'store',
        });
        break;
      default:
        hook.emit('environment.event', {
          id: rendererID,
          data: event,
          eventType: 'store',
        });
        break;
    }
  };

  function cleanup() {
    // We don't patch any methods so there is no cleanup.
    environment.__log = originalLog;
    store.__log = storeOriginalLog;
  }

  function sendStoreRecords() {
    const records = store.getSource().toJSON();
    hook.emit('environment.store', {
      name: 'refresh.store',
      id: rendererID,
      records,
    });
  }

  function flushInitialOperations() {
    // TODO(damassart): Make this a modular function
    if (pendingEventsQueue != null) {
      pendingEventsQueue.forEach(pendingEvent => {
        hook.emit('environment.event', {
          id: rendererID,
          envName: environment.configName,
          data: pendingEvent,
          eventType: 'environment',
        });
      });
      pendingEventsQueue = null;
    }
    this.sendStoreRecords();
  }

  return {
    cleanup,
    sendStoreRecords,
    flushInitialOperations,
  };
}