@fedify/nestjs
Version:
Integrate Fedify with Nest.js
111 lines (110 loc) • 3.91 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
let _nestjs_common = require("@nestjs/common");
let _fedify_fedify = require("@fedify/fedify");
let node_buffer = require("node:buffer");
//#region src/fedify.constants.ts
const FEDIFY_FEDERATION = "FEDIFY_FEDERATION";
//#endregion
//#region \0@oxc-project+runtime@0.122.0/helpers/decorate.js
function __decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
//#endregion
//#region src/fedify.module.ts
var _FedifyModule;
let FedifyModule = _FedifyModule = class FedifyModule {
static forRoot(options) {
return {
module: _FedifyModule,
providers: [{
provide: FEDIFY_FEDERATION,
useFactory: () => {
const federationOptions = { ...options };
federationOptions.kv = options.kv || new _fedify_fedify.MemoryKvStore();
return (0, _fedify_fedify.createFederation)(federationOptions);
}
}],
exports: [FEDIFY_FEDERATION],
global: true
};
}
};
FedifyModule = _FedifyModule = __decorate([(0, _nestjs_common.Module)({})], FedifyModule);
//#endregion
//#region src/fedify.middleware.ts
function integrateFederation(federation, contextDataFactory) {
let FedifyIntegrationMiddleware = class FedifyIntegrationMiddleware {
async use(req, res, next) {
let notFound = false;
let notAcceptable = false;
const contextData = await contextDataFactory(req, res);
const webRequest = fromERequest(req);
const response = await federation.fetch(webRequest, {
contextData,
onNotFound: () => {
notFound = true;
next();
return new Response("Not found", { status: 404 });
},
onNotAcceptable: () => {
notAcceptable = true;
next();
return new Response("Not acceptable", {
status: 406,
headers: {
"Content-Type": "text/plain",
Vary: "Accept"
}
});
}
});
if (notFound || notAcceptable && req.route != null) return;
await setEResponse(res, response);
next();
}
};
FedifyIntegrationMiddleware = __decorate([(0, _nestjs_common.Injectable)()], FedifyIntegrationMiddleware);
return FedifyIntegrationMiddleware;
}
function fromERequest(req) {
const url = `${req.protocol}://${req.host ?? req.header("Host")}${req.url}`;
const headers = new Headers();
for (const [key, value] of Object.entries(req.headers)) if (Array.isArray(value)) for (const v of value) headers.append(key, v);
else if (typeof value === "string") headers.append(key, value);
return new Request(url, {
method: req.method,
headers,
duplex: "half",
body: req.method === "GET" || req.method === "HEAD" ? void 0 : req.body && typeof req.body === "object" && !node_buffer.Buffer.isBuffer(req.body) ? JSON.stringify(req.body) : req.body
});
}
function setEResponse(res, response) {
res.status(response.status);
response.headers.forEach((value, key) => res.setHeader(key, value));
if (response.body == null) return Promise.resolve();
const body = response.body;
return new Promise((resolve) => {
const reader = body.getReader();
reader.read().then(function read({ done, value }) {
if (done) {
reader.releaseLock();
resolve();
return;
}
res.write(node_buffer.Buffer.from(value));
reader.read().then(read);
});
});
}
//#endregion
exports.FEDIFY_FEDERATION = FEDIFY_FEDERATION;
Object.defineProperty(exports, "FedifyModule", {
enumerable: true,
get: function() {
return FedifyModule;
}
});
exports.integrateFederation = integrateFederation;