import type * as T from '../types' export class Middleware { constructor() {} private static async execute( middlewares: T.RageFW_MiddlewareFunction[], args: T.RageFW_ClientArgs, ): Promise { for (let i = 0; i < middlewares.length; i++) { const result = await middlewares[i](...args) if (typeof result === 'boolean' && !result) return { success: result, id: i } if (typeof result !== 'boolean' && !result.success) return { ...result, id: i } } return { success: true, } } public static async process( middlewareOptions: T.RageFW_MiddlewareOptions, callback: T.RageFW_ClientCallback, args: T.RageFW_ClientArgs, ) { if (Array.isArray(middlewareOptions)) { const middlewaresResponse = await Middleware.execute( middlewareOptions, args, ) if (middlewaresResponse.success) return await callback(...args) } else { const middlewaresResponse = await Middleware.execute( middlewareOptions.executables, args, ) if (middlewaresResponse.success) { return await callback(...args) } else { middlewareOptions.onError( middlewaresResponse.message ?? 'Middleware with id ' + middlewaresResponse.id + ' failed', ) } } } }