UNPKG

@xapi-js/adaptor-nestjs

Version:
66 lines (65 loc) 3.39 kB
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 };