@kanadi/core
Version:
Multi-Layer CAPTCHA Framework with customizable validators and challenge bundles
67 lines (55 loc) • 1.7 kB
text/typescript
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);
}