src/durableClient/getClient.ts (65 lines of code) (raw):
import { FunctionInput, InvocationContext } from "@azure/functions";
import { DurableClientInput } from "durable-functions";
import { DurableClient } from "./DurableClient";
import { OrchestrationClientInputData } from "./OrchestrationClientInputData";
/** @hidden */
import cloneDeep = require("lodash/cloneDeep");
/** @hidden */
import url = require("url");
import { HttpCreationPayload } from "../http/HttpCreationPayload";
import { HttpManagementPayload } from "../http/HttpManagementPayload";
import { isURL } from "validator";
import { Constants } from "../Constants";
export function getClient(context: InvocationContext): DurableClient {
const foundInput: FunctionInput | undefined = context.options.extraInputs.find(
isDurableClientInput
);
if (!foundInput) {
throw new Error(
"Could not find a registered durable client input binding. Check your extraInputs definition when registering your function."
);
}
const clientInputOptions = foundInput as DurableClientInput;
let clientData = getClientData(context, clientInputOptions);
if (!process.env.WEBSITE_HOSTNAME || process.env.WEBSITE_HOSTNAME.includes("0.0.0.0")) {
clientData = correctClientData(clientData);
}
return new DurableClient(clientData);
}
/** @hidden */
export function isDurableClientInput(input: FunctionInput): boolean {
return input.type === "durableClient" || input.type === "orchestrationClient";
}
/** @hidden */
function getClientData(
context: InvocationContext,
clientInput: DurableClientInput
): OrchestrationClientInputData {
const clientData: unknown = context.extraInputs.get(clientInput);
if (clientData && OrchestrationClientInputData.isOrchestrationClientInputData(clientData)) {
return clientData as OrchestrationClientInputData;
}
throw new Error(
"Received input is not a valid durable client input. Check your extraInputs definition when registering your function."
);
}
/** @hidden */
function correctClientData(clientData: OrchestrationClientInputData): OrchestrationClientInputData {
const returnValue = cloneDeep(clientData);
returnValue.creationUrls = correctUrls(clientData.creationUrls) as HttpCreationPayload;
returnValue.managementUrls = correctUrls(clientData.managementUrls) as HttpManagementPayload;
return returnValue;
}
function correctUrls(obj: { [key: string]: string }): { [key: string]: string } {
const returnValue = cloneDeep(obj);
const keys = Object.getOwnPropertyNames(obj);
keys.forEach((key) => {
const value = obj[key];
if (
isURL(value, {
protocols: ["http", "https"],
require_tld: false,
require_protocol: true,
})
) {
const valueAsUrl = new url.URL(value);
returnValue[key] = value.replace(valueAsUrl.origin, Constants.DefaultLocalOrigin);
}
});
return returnValue;
}