import { IHTTPRoute } from './interfaces'; import { CancellablePromise, ICancellablePromise, IReadonlyList, IReadonlySet, TAbortStrategy } from '@lifaon/observables'; import { HTTPMethod, IHTTPRouteOptions, IHTTPRouteResolveCallbackNormalizedOptions, IHTTPRouteResolveCallbackOptions, THTTPRouteResolveCallback } from './types'; import { HTTP_ROUTE_PRIVATE, IHTTPRouteInternal, IHTTPRoutePrivate } from './privates'; import { ConstructHTTPRoute } from './constructor'; import { Route } from '../../core/route/implementation'; import { IRouteOptions, TRouteResolveCallback } from '../../core/route/types'; import { IResolvableTree } from '../../core/resolvable-tree/interfaces'; import { $super } from '../../misc/instance/snippets'; /** CONSTRUCTOR FUNCTIONS **/ export function CreateHTTPRouteResolver(): THTTPRouteResolveCallback { return function (this: IHTTPRoute, options: IHTTPRouteResolveCallbackNormalizedOptions): ICancellablePromise { const instance: IHTTPRoute = this; const privates: IHTTPRoutePrivate = (instance as IHTTPRouteInternal)[HTTP_ROUTE_PRIVATE]; const normalizedOptions: IHTTPRouteResolveCallbackNormalizedOptions = options; return CancellablePromise.try(() => { return (privates.methods === null) || privates.methods.has(normalizedOptions.method); }, normalizedOptions) .then((resolved: boolean) => { return resolved && (privates.resolve.call(instance, normalizedOptions) as ICancellablePromise); }); }; } const HTTP_ROUTE_RESOLVER = CreateHTTPRouteResolver(); /** METHODS **/ /* GETTERS/SETTERS */ export function HTTPRouteGetMethods(instance: IHTTPRoute): IReadonlySet | null { return (instance as IHTTPRouteInternal)[HTTP_ROUTE_PRIVATE].methods; } /* METHODS */ /** CLASS **/ export class HTTPRoute extends Route implements IHTTPRoute { constructor(path: string, options: IHTTPRouteOptions = {}) { const _options: IRouteOptions = { ...options, resolve: HTTP_ROUTE_RESOLVER as TRouteResolveCallback, }; super(path, _options); ConstructHTTPRoute(this, path, options); } get children(): IReadonlyList { return $super(this, Route).get('children'); // return super['children'] as IReadonlyList; } get methods(): IReadonlySet | null { return HTTPRouteGetMethods(this); } resolve(options: IHTTPRouteResolveCallbackOptions): ICancellablePromise { return super.resolve(options); } }