UNPKG

@fedify/nestjs

Version:

Integrate Fedify with Nest.js

65 lines (61 loc) 1.92 kB
import { Injectable, Module } from "@nestjs/common"; import { MemoryKvStore, createFederation } from "@fedify/fedify"; import { Request } from "express"; //#region fedify.constants.ts const FEDIFY_FEDERATION = "FEDIFY_FEDERATION"; //#endregion //#region fedify.module.ts var FedifyModule = @Module({}) class FedifyModule { static forRoot(options) { const providers = [{ provide: FEDIFY_FEDERATION, useFactory: () => { const federationOptions = { ...options }; federationOptions.kv = options.kv || new MemoryKvStore(); const federation = createFederation(federationOptions); return federation; } }]; return { module: FedifyModule, providers, exports: [FEDIFY_FEDERATION], global: true }; } }; //#endregion //#region fedify.middleware.ts function integrateFederation(federation, contextDataFactory) { @Injectable() class FedifyIntegrationMiddleware { async use(req, res, next) { try { const contextData = await contextDataFactory(req, res); const url = new URL(req.url, `${req.protocol}://${req.get("host")}`); const headers = new Headers(); Object.entries(req.headers).forEach(([key, value]) => { if (value) headers.set(key, Array.isArray(value) ? value.join(", ") : value.toString()); }); const webRequest = new Request(url.toString(), { method: req.method, headers, body: ["GET", "HEAD"].includes(req.method) ? void 0 : JSON.stringify(req.body) }); const response = await federation.fetch(webRequest, { contextData }); if (response) { response.headers.forEach((value, key) => { res.setHeader(key, value); }); res.status(response.status); const body = await response.text(); res.send(body); } else next(); } catch (error) { next(error); } } } return FedifyIntegrationMiddleware; } //#endregion export { FEDIFY_FEDERATION, FedifyModule, integrateFederation };