import type { ConnectionOptions } from "nats"; import { type DefaultClient } from "./ServiceClient"; import type { ServiceMessage } from "./ServiceMessage"; import { type HandlerStatsReport, type Stats } from "./ServiceStats"; export interface ServiceInstanceInfo { origin: string; domain: string | null; } export interface ServiceApi { domain: D; handlers: { [name: string]: (arg: never) => Promise>; }; } export interface ServiceConfig, D extends string = T["domain"]> { nats?: ConnectionOptions & { monitorUrl?: string; }; signSalt?: string; responseTimeout?: number; handlers?: { [H in keyof T["handlers"]]: Handler; }; timeLogFilter?: (method: keyof (T["handlers"] & Omit)) => "none" | "compact" | "full"; isHandlerAvailable?: (method: keyof T["handlers"]) => boolean; } export type Handler, H extends keyof T["handlers"], D extends string = T["domain"]> = (arg: Parameters[0], service: Service) => ReturnType; declare class Service, D extends string = T["domain"]> { readonly origin: string; private isClientOnly; private log; private readonly serviceStats; private readonly clientStats; readonly domain: D; private readonly config; private transport; private connection; private readonly handlers; private connected; private timeLogFilter; constructor(domain: D, config?: ServiceConfig); get isConnected(): boolean; get stats(): { origin: string; domain: string | null; service: Record; client: Record; }; getPeers(): Promise; getPeerStats(): Promise; private getConnection; connect(): Promise; disconnect(): Promise; /** * Returns the total time to fulfill a simple request from the client's perspective. This * round trip entails 4 message transfers: * * client -> NATS (request) * NATS -> service (request) * ------------------------- * service -> NATS (response) * NATS -> client (response) * * @returns the latency in milliseconds */ testLatency(): Promise; protected marshalPayload(payload: ServiceMessage): ServiceMessage; protected unmarshalPayload(payload: ServiceMessage): ServiceMessage; /** * * @param domain * @returns */ getClient(): T["handlers"] & DefaultClient; private handleRequest; } export default Service;