export function findService()

in packages/embed/src/index.js [42:100]


export function findService(servicingPlan, bot, requestedVersion = 'default') {
  const traversedVersions = [];
  const logs = [];
  let publicOnly = true;
  const { versions } = servicingPlan;

  if (!versions['default']) {
    throw new Error(`There is no default version specified in the servicing plan.`);
  }

  for (let hop = MAX_VERSION_REDIRECTIONS; hop >= 0; hop--) {
    let service = versions[requestedVersion];

    traversedVersions.push(requestedVersion);

    if (!service || (publicOnly && service.private)) {
      warn(`There is no version "${requestedVersion}" or it is marked as private; falling back to "default".`);

      requestedVersion = 'default';
      publicOnly = true;

      continue;
    }

    const { redirects } = service || {};

    if (redirects) {
      logs.push(`Executing redirection rules of version "${requestedVersion}".`);

      const actualVersion = execRedirectRules(bot, redirects, requestedVersion) || {};

      if (actualVersion) {
        requestedVersion = actualVersion;
        publicOnly = false;
      } else {
        warn(`Version "${requestedVersion}" did not have a fallback plan; falling back to default version.`);

        requestedVersion = 'default';
        publicOnly = true;
      }

      continue;
    }

    log(
      [
        'Selecting version ',
        traversedVersions
          .map(version => (typeof version === 'undefined' ? '<undefined>' : `"${version}"`))
          .join(' -> '),
        '.'
      ].join('')
    );

    return service;
  }

  throw new Error(`Maximum version redirections exceeded. This is probably problem with our servicing plan.`);
}