@aimee-blue/ab-service-kit
Version:
Aimee Blue Service Template
1 lines • 4.55 kB
Source Map (JSON)
{"version":3,"sources":["../../src/shared/kit.ts"],"names":["makeSocketEpic","epic"],"mappings":";;;;;;;AAwHO,MAAMA,cAAc,GAA2BC,IAAxB,IAAuCA,IAA9D","sourcesContent":["import yargs from 'yargs';\nimport express from 'express';\nimport WebSocket from 'ws';\nimport { Observable, ObservedValueOf } from 'rxjs';\nimport { IncomingMessage } from 'http';\nimport * as Joi from 'joi';\nimport { IAction } from './action';\nimport { TaggedLogger, BasicLogger } from './logging';\n\nexport interface ICommandLineArgs {\n http: boolean;\n watch: boolean;\n cert?: string;\n key?: string;\n host?: string;\n port: number;\n envFile?: string;\n}\n\nexport type ServiceDeps<D> = {\n logger: BasicLogger;\n} & D;\n\nexport type EndpointsHandler<D> = (\n app: express.Express,\n deps: ServiceDeps<D>\n) => Promise<void>;\n\nexport interface IServiceConfig<D = {}> {\n defaultPort: number;\n\n logger?: () => Promise<BasicLogger>;\n buildDeps?: () => Promise<D>;\n\n endpoints?: EndpointsHandler<D>;\n sockets?: (deps: ServiceDeps<D>) => Promise<ISocketEpicsMap>;\n background?: (deps: ServiceDeps<D>) => Promise<BackgroundEpic[]>;\n spy?: (\n spy: ReturnType<typeof import('rxjs-spy').create>,\n deps: ServiceDeps<D>\n ) => Promise<void>;\n\n argsBuilder?: ArgsBuilder;\n serviceConfigModuleId?: string;\n watchPatterns?: string[];\n\n shouldUseDefaultBackgroundOperations?: boolean;\n shouldUseDefaultEndpoints?: boolean;\n shouldLoadEnvFiles?: boolean;\n}\n\nexport interface IBackgroundEpicContext {\n logger: TaggedLogger;\n}\n\nexport interface IBackgroundEpic<\n I extends IAction = IAction,\n O extends IAction = IAction,\n D = {},\n R extends unknown[] = unknown[]\n> {\n (\n events: Observable<IAction | I>,\n ctx: IBackgroundEpicContext & D,\n ...args: R\n ): Observable<O>;\n buildDeps?: () => D;\n}\n\nexport type BackgroundEpic<\n I extends IAction = IAction,\n O extends IAction = IAction,\n D = {}\n> = IBackgroundEpic<I, O, D>;\n\nexport interface ISocketEpicsMap {\n [path: string]: AnySocketEpic;\n}\n\nexport interface ISocketEpicAttributes<\n O extends IAction | Buffer = IAction | Buffer,\n D = {}\n> {\n send?: (socket: WebSocket, data: O) => Promise<void>;\n actionSchemaByType?: (type: string) => Joi.ObjectSchema | null;\n logOnConnection?: (\n socket: WebSocket,\n request: IncomingMessage & { id: string }\n ) => { [key: string]: string | undefined };\n\n completedSocketWarningTimeout?: number;\n completedSocketWaitTimeout?: number;\n watchModeDetachBehaviour?: 'disconnect' | 'unsubscribe';\n debugStats?: boolean;\n buildDeps?: () => D;\n}\n\nexport interface ISocketEpicContext {\n id: string;\n request: IncomingMessage & { id: string };\n binary: Observable<Buffer>;\n subscribe: () => Observable<IAction>;\n publish: () => (events: Observable<IAction>) => Observable<never>;\n logger: TaggedLogger;\n takeUntilClosed: () => <T>(stream: Observable<T>) => Observable<T>;\n}\n\nexport interface ISocketEpic<\n I extends IAction = IAction,\n O extends IAction | Buffer = IAction | Buffer,\n D = {},\n R extends unknown[] = unknown[]\n> extends ISocketEpicAttributes<O, D> {\n (\n commands: Observable<IAction | I>,\n ctx: ISocketEpicContext & D,\n ...args: R\n ): Observable<O>;\n}\n\nexport const makeSocketEpic = <E extends ISocketEpic>(epic: E): E => epic;\n\nexport type AnySocketEpic = SocketEpic;\n\nexport type AnyEpic<\n T extends IAction = IAction,\n O extends IAction | Buffer = IAction | Buffer,\n R extends unknown[] = unknown[]\n> = (\n commands: Observable<IAction | T>,\n ctx: IBackgroundEpicContext | ISocketEpicContext,\n ...args: R\n) => Observable<O>;\n\nexport type SocketEpic<\n I extends IAction = IAction,\n O extends IAction | Buffer = IAction | Buffer,\n D = {},\n R extends unknown[] = unknown[]\n> = ISocketEpic<I, O, D, R>;\n\ntype ArgsBuilder = (\n args: yargs.Argv<ICommandLineArgs>\n) => yargs.Argv<ICommandLineArgs>;\n\nexport type InputOfEpic<E extends AnyEpic> = ObservedValueOf<Parameters<E>[0]>;\nexport type OutputOfEpic<E extends AnyEpic> = ObservedValueOf<ReturnType<E>>;\nexport type DependenciesOfBackgroundEpic<E extends BackgroundEpic> = Exclude<\n Parameters<E>[1],\n IBackgroundEpicContext\n> extends never\n ? {}\n : Exclude<Parameters<E>[1], IBackgroundEpicContext>;\nexport type DependenciesOfSocketEpic<E extends SocketEpic> = Exclude<\n Parameters<E>[1],\n ISocketEpicContext\n> extends never\n ? {}\n : Exclude<Parameters<E>[1], ISocketEpicContext>;\n"],"file":"kit.js"}