import { Observable, Subscribable } from "rxjs"; import * as PM from "./private/model"; export interface EventListener { on: (event: string, listener: (...args: PM.Any[]) => void) => this; removeListener: (event: string, listener: (...args: PM.Any[]) => void) => this; } export interface EventEmitter { emit(event: string, ...args: PM.Any[]): void | boolean; } export type CombinedEventEmitter = EventListener & EventEmitter; export interface Emitters { emitter: EventEmitter; listener: EventListener; } export type EmittersResolver = () => Emitters; export type ProviderOnEventResolver, ACA extends PM.DefACA = PM.DefACA> = (...args: ACA) => { payload: PM.Payload; emitter: EventEmitter; }; export type ClientOnEventResolver, ACA extends PM.DefACA = PM.DefACA> = (...args: ACA) => { payload: PM.Payload; }; export interface CallOptions, ACA extends PM.DefACA = PM.DefACA> { timeoutMs: number; finishPromise?: Promise; listenChannel?: string; notificationWrapper?: (fn: (...args: PM.Any[]) => R) => R; serialization?: "jsan" | "msgpackr"; onEventResolver?: ClientOnEventResolver; logger?: Logger; } export type LoggerFn = (...args: PM.Any[]) => void; export interface Logger { error: LoggerFn; warn: LoggerFn; info: LoggerFn; verbose: LoggerFn; debug: LoggerFn; } interface ScanResult { ApiImpl: API; ApiImplArgs: { [K in keyof API]: API[K] extends (...args: infer IN) => Observable | Promise | SubscribableLike ? IN : never; }; ApiImplReturns: { [K in keyof API]: API[K] extends (...args: infer IN) => Observable | Promise | SubscribableLike ? OUT : never; }; ApiClient: PM.DropFunctionsContext; } export type ScanService, A extends Actions>(actions: A, ...rest: infer A) => infer R; } ? I[RN1] : never; }) extends never ? { [d in RN]: (...args: PM.Any[]) => PM.Any; } : { [d in RN]: (...args: PM.Any[]) => PM.Any; }, RN extends string = "register", API extends Parameters[0] = Parameters[0]> = ScanResult; export type ActionContext = Readonly<{ args: Readonly; }>; type ActionTypeString = T & { in: IN; out: OUT; outType: T; }; export type SubscribableLike = PM.NoExtraProperties<{ subscribeLike: Subscribable["subscribe"]; }>; export declare const ActionType: { readonly Promise: () => ActionTypeString<"promise", IN, OUT>; readonly Observable: () => ActionTypeString<"observable", IN, OUT>; readonly SubscribableLike: () => ActionTypeString<"subscribableLike", IN, OUT>; }; export type ApiDefinition = { [K in Extract]: T[K] extends ActionTypeString ? ActionTypeString : never; }; export type Actions, ACA extends PM.DefACA | void = void> = { [K in Extract]: AD[K] extends ActionTypeString ? OUT_WRAP extends "promise" ? (this: void | (ACA extends PM.DefACA ? ActionContext : void), arg: IN) => Promise : OUT_WRAP extends "observable" ? (this: void | (ACA extends PM.DefACA ? ActionContext : void), arg: IN) => Observable : OUT_WRAP extends "subscribableLike" ? (this: void | (ACA extends PM.DefACA ? ActionContext : void), arg: IN) => SubscribableLike : never : never; }; export interface CreateServiceRegisterOptions, ACA extends PM.DefACA | void = void> { onEventResolver?: ProviderOnEventResolver>; logger?: Logger; } export interface CreateServiceReturn, ACA extends PM.DefACA | void = void> { register: >(actions: A, eventEmitter: CombinedEventEmitter, options?: CreateServiceRegisterOptions) => { deregister: () => void; resourcesStat: () => { subscriptionsCount: number; }; }; call: >, N extends keyof A = keyof A>(name: N, options: CallOptions>, emitters: Emitters | EmittersResolver) => A[N]; caller: (emitters: Emitters | EmittersResolver, defaultOptions?: CallOptions>) => >, N extends keyof A = keyof A>(name: N, options?: CallOptions>) => A[N]; } export interface CreateServiceInput> { channel: string; apiDefinition: AD; callTimeoutMs?: number; logger?: Logger; } export type CreateServiceOptions> = Readonly>, "logger"> & { logger: PM.InternalLogger; }>; export {};