{"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"}