"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.startSession = startSession;
exports.stopSession = stopSession;

function _os() {
  const data = _interopRequireDefault(require("os"));

  _os = function () {
    return data;
  };

  return data;
}

function _ApiV() {
  const data = _interopRequireDefault(require("./ApiV2"));

  _ApiV = function () {
    return data;
  };

  return data;
}

function _Config() {
  const data = _interopRequireDefault(require("./Config"));

  _Config = function () {
    return data;
  };

  return data;
}

function _Logger() {
  const data = _interopRequireDefault(require("./Logger"));

  _Logger = function () {
    return data;
  };

  return data;
}

function UrlUtils() {
  const data = _interopRequireWildcard(require("./UrlUtils"));

  UrlUtils = function () {
    return data;
  };

  return data;
}

function _User() {
  const data = _interopRequireDefault(require("./User"));

  _User = function () {
    return data;
  };

  return data;
}

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const UPDATE_FREQUENCY_SECS = 20;
let keepUpdating = true; // TODO notify www when a project is started, and every N seconds afterwards

async function startSession(projectRoot, exp, platform, forceUpdate = false) {
  if (forceUpdate) {
    keepUpdating = true;
  }

  if (!_Config().default.offline && keepUpdating) {
    // TODO(anp) if the user has configured device ids, then notify for those too
    let authSession = await _User().default.getSessionAsync();

    if (!authSession) {
      // NOTE(brentvatne) let's just bail out in this case for now
      // throw new Error('development sessions can only be initiated for logged in users');
      return;
    }

    try {
      let url;

      if (platform === 'native') {
        url = await UrlUtils().constructManifestUrlAsync(projectRoot);
      } else if (platform === 'web') {
        url = await UrlUtils().constructWebAppUrlAsync(projectRoot);
      } else {
        throw new Error(`Unsupported platform: ${platform}`);
      }

      let apiClient = _ApiV().default.clientForUser(authSession);

      await apiClient.postAsync('development-sessions/notify-alive', {
        data: {
          session: {
            description: `${exp.name} on ${_os().default.hostname()}`,
            hostname: _os().default.hostname(),
            platform,
            config: {
              // TODO: if icons are specified, upload a url for them too so people can distinguish
              description: exp.description,
              name: exp.name,
              slug: exp.slug,
              primaryColor: exp.primaryColor
            },
            url,
            source: 'desktop'
          }
        }
      });
    } catch (e) {
      _Logger().default.global.debug(e, `Error updating dev session: ${e}`);
    }

    setTimeout(() => startSession(projectRoot, exp, platform), UPDATE_FREQUENCY_SECS * 1000);
  }
}

function stopSession() {
  keepUpdating = false;
}
//# sourceMappingURL=__sourcemaps__/DevSession.js.map