UNPKG

@kanadi/core

Version:

Multi-Layer CAPTCHA Framework with customizable validators and challenge bundles

67 lines (55 loc) 1.7 kB
import "reflect-metadata"; import { Global, Injectable, Module } from "@nestjs/common"; import { KanadiClient } from "./client"; import { KanadiGatewayController } from "./gateway.controller"; import { KanadiGatewayService } from "./gateway.service"; import type { KanadiGatewayOptions } from "./types"; export function KanadiGateway(options: KanadiGatewayOptions) { return <T extends { new (...args: any[]): {} }>(constructor: T) => { Reflect.defineMetadata("kanadi:gateway:options", options, constructor); const client = new KanadiClient(options.namespace); const validatorInstances = options.validators.map( (ValidatorClass) => new ValidatorClass(), ); client.registerValidators(validatorInstances); if (options.config) { client.registerDatabaseConfigs(options.config); } const EnhancedClass = class extends constructor { constructor(...args: any[]) { const injectedClient = args[0] as KanadiClient; const service = args[1] as KanadiGatewayService; super(injectedClient); if (service) { service.setGatewayHandler(this); } } } as any; Module({ controllers: [KanadiGatewayController], providers: [ { provide: KanadiClient, useValue: client, }, KanadiGatewayService, { provide: constructor, useClass: EnhancedClass, }, ], exports: [KanadiClient, KanadiGatewayService], imports: options.modules || [], })(EnhancedClass); Global()(EnhancedClass); return EnhancedClass; }; } /** * Get gateway options from a class */ export function getGatewayOptions( target: any, ): KanadiGatewayOptions | undefined { return Reflect.getMetadata("kanadi:gateway:options", target); }