UNPKG

@redpc/core

Version:

Remoted Procedure Call (RedPC) - A javascript RPC library written with TypeScript

99 lines (79 loc) 2.88 kB
import { RpcError } from "errors"; import { ContractReference, KnownTransports } from "../types"; import { IEndpointContext } from "./IEndpointContext"; import { IInterceptor } from "./IInterceptor"; import { IInterceptorProvider } from "./IInterceptorProvider"; import { ITransport } from "./ITransport"; import { ITransportProvider } from "./ITransportProvider"; type ContextFactory<TCtx extends IEndpointContext> = new ( contextDomain: string, transportProvider: ITransportProvider, interceptorProvider: IInterceptorProvider ) => TCtx; export class ContextDomain<TCtx extends IEndpointContext> implements ITransportProvider, IInterceptorProvider { private ctx: Record<string, TCtx>; private transports: Record<string, ITransport>; private interceptors: Record<string, IInterceptor>; constructor( private factory: ContextFactory<TCtx> ) { this.ctx = {}; this.transports = {}; this.interceptors = {}; } public getInterceptor(name: string): IInterceptor { const result = this.interceptors[name]; if (typeof result === 'undefined') { throw new RpcError(`Couldn't find a interceptor with the name of "${name}".`); } return result; } public addInterceptor(interceptor: IInterceptor, name?: string): void { this.interceptors[name ?? interceptor.getName()] = interceptor; } public getTransport( name: KnownTransports, customDriverName?: string ): ITransport { let fullName = name; if (customDriverName) { fullName += `/${customDriverName}`; } const result = this.transports[fullName]; if (typeof result === 'undefined') { throw new RpcError(`Couldn't find a transport with the name of "${fullName}".`); } return result; } public addTransport( transport: ITransport, name?: KnownTransports, customDriverName?: string ): void { let fullName = name ?? transport.getName(); if (customDriverName) { fullName += `/${customDriverName}`; } else if (transport.getCustomDriverName) { fullName += `/${transport.getCustomDriverName()}`; } this.transports[fullName] = transport; } public getContext( name?: string ): TCtx { if (typeof name === 'undefined') { name = 'default'; } let instance = this.ctx[name]; if (typeof instance === 'undefined') { instance = new this.factory(name, this, this); this.ctx[name] = instance; } return instance; } public clear( name: string ): void { delete this.ctx[name]; } }