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;
}