@fedify/nestjs
Version:
Integrate Fedify with Nest.js
65 lines (61 loc) • 1.92 kB
JavaScript
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 = ({}) 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) {
() 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 };