function parseEndpoints()

in src/deploy/functions/runtimes/discovery/v1alpha1.ts [66:207]


function parseEndpoints(
  manifest: Manifest,
  id: string,
  project: string,
  defaultRegion: string,
  runtime: runtimes.Runtime
): backend.Endpoint[] {
  const allParsed: backend.Endpoint[] = [];
  const prefix = `endpoints[${id}]`;
  const ep = manifest.endpoints[id];

  assertKeyTypes(prefix, ep, {
    region: "array",
    platform: "string",
    entryPoint: "string",
    availableMemoryMb: "number",
    maxInstances: "number",
    minInstances: "number",
    concurrency: "number",
    serviceAccountEmail: "string",
    timeout: "string",
    vpcConnector: "string",
    vpcConnectorEgressSettings: "string",
    labels: "object",
    ingressSettings: "string",
    environmentVariables: "object",
    httpsTrigger: "object",
    eventTrigger: "object",
    scheduleTrigger: "object",
    taskQueueTrigger: "object",
  });
  let triggerCount = 0;
  if (ep.httpsTrigger) {
    triggerCount++;
  }
  if (ep.eventTrigger) {
    triggerCount++;
  }
  if (ep.scheduleTrigger) {
    triggerCount++;
  }
  if (ep.taskQueueTrigger) {
    triggerCount++;
  }
  if (!triggerCount) {
    throw new FirebaseError("Expected trigger in endpoint" + id);
  }
  if (triggerCount > 1) {
    throw new FirebaseError("Multiple triggers defined for endpoint" + id);
  }
  for (const region of ep.region || [defaultRegion]) {
    let triggered: backend.Triggered;
    if (backend.isEventTriggered(ep)) {
      requireKeys(prefix + ".eventTrigger", ep.eventTrigger, "eventType", "eventFilters");
      assertKeyTypes(prefix + ".eventTrigger", ep.eventTrigger, {
        eventFilters: "object",
        eventType: "string",
        retry: "boolean",
        region: "string",
        serviceAccountEmail: "string",
      });
      triggered = { eventTrigger: ep.eventTrigger };
    } else if (backend.isHttpsTriggered(ep)) {
      assertKeyTypes(prefix + ".httpsTrigger", ep.httpsTrigger, {
        invoker: "array",
      });
      triggered = { httpsTrigger: {} };
      copyIfPresent(triggered.httpsTrigger, ep.httpsTrigger, "invoker");
    } else if (backend.isScheduleTriggered(ep)) {
      assertKeyTypes(prefix + ".scheduleTrigger", ep.scheduleTrigger, {
        schedule: "string",
        timeZone: "string",
        retryConfig: "object",
      });
      assertKeyTypes(prefix + ".scheduleTrigger.retryConfig", ep.scheduleTrigger.retryConfig, {
        retryCount: "number",
        maxDoublings: "number",
        minBackoffDuration: "string",
        maxBackoffDuration: "string",
        maxRetryDuration: "string",
      });
      triggered = { scheduleTrigger: ep.scheduleTrigger };
    } else if (backend.isTaskQueueTriggered(ep)) {
      assertKeyTypes(prefix + ".taskQueueTrigger", ep.taskQueueTrigger, {
        rateLimits: "object",
        retryConfig: "object",
        invoker: "array",
      });
      if (ep.taskQueueTrigger.rateLimits) {
        assertKeyTypes(prefix + ".taskQueueTrigger.rateLimits", ep.taskQueueTrigger.rateLimits, {
          maxBurstSize: "number",
          maxConcurrentDispatches: "number",
          maxDispatchesPerSecond: "number",
        });
      }
      if (ep.taskQueueTrigger.retryConfig) {
        assertKeyTypes(prefix + ".taskQueueTrigger.retryConfig", ep.taskQueueTrigger.retryConfig, {
          maxAttempts: "number",
          maxRetryDuration: "string",
          minBackoff: "string",
          maxBackoff: "string",
          maxDoublings: "number",
        });
      }
      triggered = { taskQueueTrigger: ep.taskQueueTrigger };
    } else {
      throw new FirebaseError(
        `Do not recognize trigger type for endpoint ${id}. Try upgrading ` +
          "firebase-tools with npm install -g firebase-tools@latest"
      );
    }

    requireKeys(prefix, ep, "entryPoint");
    const parsed: backend.Endpoint = {
      platform: ep.platform || "gcfv2",
      id,
      region,
      project,
      runtime,
      entryPoint: ep.entryPoint,
      ...triggered,
    };
    copyIfPresent(
      parsed,
      ep,
      "availableMemoryMb",
      "maxInstances",
      "minInstances",
      "concurrency",
      "serviceAccountEmail",
      "timeout",
      "vpcConnector",
      "vpcConnectorEgressSettings",
      "labels",
      "ingressSettings",
      "environmentVariables"
    );
    allParsed.push(parsed);
  }

  return allParsed;
}