@xapi-js/adaptor-nestjs
Version:
NestJS adaptor for X-API.
66 lines (65 loc) • 3.39 kB
JavaScript
import { Injectable, Logger } from "@nestjs/common";
import { decodeRoot, decodeXapiWire, encodeRoot, encodeXapiWire, isXapiRoot, parse, write, xapiBodyToBytes, xapiContentType, xapiContentTypeMatches } from "@xapi-js/core";
import { map } from "rxjs";
//#region \0@oxc-project+runtime@0.139.0/helpers/esm/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/xapi-request-interceptor.ts
var _XapiRequestInterceptor;
let XapiRequestInterceptor = _XapiRequestInterceptor = class XapiRequestInterceptor {
constructor(schemaOrOptions, options) {
this.logger = new Logger(_XapiRequestInterceptor.name);
if (schemaOrOptions && "kind" in schemaOrOptions) {
this.schema = schemaOrOptions;
this.options = options;
} else this.options = schemaOrOptions;
}
async intercept(context, next) {
const request = context.switchToHttp().getRequest();
this.logger.debug(`XapiRequestInterceptor Intercepting request: ${request.method} ${request.url}`);
const codec = this.options?.codec;
if (xapiContentTypeMatches(request.headers["content-type"], codec) && request.body) {
const root = codec === void 0 ? parse(request.body) : decodeXapiWire(xapiBodyToBytes(request.body), codec);
request.body = this.schema ? decodeRoot(this.schema, root) : root;
}
return next.handle();
}
};
XapiRequestInterceptor = _XapiRequestInterceptor = __decorate([Injectable()], XapiRequestInterceptor);
//#endregion
//#region src/xapi-response-interceptor.ts
var _XapiResponseInterceptor;
let XapiResponseInterceptor = _XapiResponseInterceptor = class XapiResponseInterceptor {
constructor(schemaOrOptions, options) {
this.logger = new Logger(_XapiResponseInterceptor.name);
if (schemaOrOptions && "kind" in schemaOrOptions) {
this.schema = schemaOrOptions;
this.options = options;
} else this.options = schemaOrOptions;
}
intercept(context, next) {
this.logger.debug(`XapiResponseInterceptor Intercepting response`);
const codec = this.options?.codec;
const http = typeof context.switchToHttp === "function" ? context.switchToHttp() : void 0;
const response = http && typeof http.getResponse === "function" ? http.getResponse() : void 0;
if (codec !== void 0 && typeof response?.setHeader === "function") response.setHeader("Content-Type", xapiContentType(codec));
return next.handle().pipe(map((value) => {
const root = this.schema ? encodeRoot(this.schema, value) : value;
if (!isXapiRoot(root)) throw new Error("Handler did not return an XapiRoot instance");
try {
return codec === void 0 ? write(root) : encodeXapiWire(root, codec);
} catch (error) {
this.logger.error(`Failed to serialize XapiRoot with codec: ${error}`);
throw error;
}
}));
}
};
XapiResponseInterceptor = _XapiResponseInterceptor = __decorate([Injectable()], XapiResponseInterceptor);
//#endregion
export { XapiRequestInterceptor, XapiResponseInterceptor };