UNPKG

@storybooker/azure

Version:

StoryBooker Adapter for interacting with Azure services.

93 lines (91 loc) 3.08 kB
import { SERVICE_NAME } from "@storybooker/core/constants"; import { createPurgeHandler, createRequestHandler } from "@storybooker/core"; import { generatePrefixFromBaseRoute, urlJoin } from "@storybooker/core/utils"; //#region src/functions.ts const DEFAULT_PURGE_SCHEDULE_CRON = "0 0 0 * * *"; /** * Register the Storybooker router with the Azure Functions App. * * - It enabled streaming responses for HTTP functions. * - It registers the HTTP function with provided route and auth-level. * - It registers the Timer function for purge if `purgeScheduleCron` is not `null`. * * @param app Azure Functions App instance * @param options Options for registering the router */ function registerStoryBookerRouter(app, options) { app.setup({ enableHttpStream: true }); const route = options.route || ""; const logger = options.logger ?? console; const requestHandler = createRequestHandler({ ...options, errorParser: options.errorParser ?? parseAzureRestError, logger, prefix: generatePrefixFromBaseRoute(route) || "/" }); logger.log("Registering Storybooker Router (route: %s)", route || "/"); app.http(SERVICE_NAME, { authLevel: options.authLevel, handler: async (httpRequest, context) => { const request = transformHttpRequestToWebRequest(httpRequest); const response = await requestHandler(request, { logger: options.logger ?? context }); return transformWebResponseToHttpResponse(response); }, methods: [ "DELETE", "GET", "PATCH", "POST", "PUT" ], route: urlJoin(route, "{**path}") }); if (options.purgeScheduleCron !== null) { const schedule = options.purgeScheduleCron || DEFAULT_PURGE_SCHEDULE_CRON; const purgeHandler = createPurgeHandler({ database: options.database, errorParser: options.errorParser ?? parseAzureRestError, logger, storage: options.storage }); logger.log("Registering Storybooker Timer-Purge (cron: %s)", schedule); app.timer(`${SERVICE_NAME}-timer_purge`, { handler: async (_timer, context) => purgeHandler({}, { logger: context }), runOnStartup: false, schedule }); } } const parseAzureRestError = (error) => { if (error instanceof Error && error.name === "RestError") { const restError = error; const details = restError.details ?? {}; const message = details["errorMessage"] ?? restError.message; return { errorMessage: `${details["errorCode"] ?? restError.name} (${restError.code ?? restError.statusCode}): ${message}`, errorStatus: restError.statusCode, errorType: "AzureRest" }; } }; function transformHttpRequestToWebRequest(httpRequest) { return new Request(httpRequest.url, { body: httpRequest.body ?? void 0, duplex: "half", headers: new Headers(httpRequest.headers), method: httpRequest.method }); } async function transformWebResponseToHttpResponse(response) { let body = null; if (response.body) body = response.body; else body = await response.text(); return { body, headers: response.headers, status: response.status }; } //#endregion export { registerStoryBookerRouter }; //# sourceMappingURL=functions.js.map