@minimaltech/node-infra
Version:
Minimal Technology NodeJS Infrastructure - Loopback 4 Framework
108 lines (107 loc) • 3.9 kB
TypeScript
import { BaseHelper } from '../../base/base.helper';
import { ValueOrPromise } from '../../common/types';
import { dayjs } from '../../utilities/date.utility';
import { ListenOptions, ServerOpts, Server as SocketServer, Socket as SocketClient } from 'node:net';
export interface ITcpSocketClient<SocketClientType> {
id: string;
socket: SocketClientType;
state: 'unauthorized' | 'authenticating' | 'authenticated';
subscriptions: Set<string>;
storage: {
connectedAt: dayjs.Dayjs;
authenticatedAt: dayjs.Dayjs | null;
[additionField: symbol | string]: any;
};
}
export interface ITcpSocketServerOptions<SocketServerOptions extends ServerOpts = ServerOpts, SocketServerType extends SocketServer = SocketServer, SocketClientType extends SocketClient = SocketClient> {
scope?: string;
identifier: string;
serverOptions: Partial<SocketServerOptions>;
listenOptions: Partial<ListenOptions>;
authenticateOptions: {
required: boolean;
duration?: number;
};
extraEvents?: Record<string, (opts: {
id: string;
socket: SocketClientType;
args: any;
}) => ValueOrPromise<void>>;
createServerFn: (options: Partial<SocketServerOptions>, connectionListener: (socket: SocketClientType) => void) => SocketServerType;
onServerReady?: (opts: {
server: SocketServerType;
}) => void;
onClientConnected?: (opts: {
id: string;
socket: SocketClientType;
}) => void;
onClientData?: (opts: {
id: string;
socket: SocketClientType;
data: Buffer | string;
}) => void;
onClientClose?: (opts: {
id: string;
socket: SocketClientType;
}) => void;
onClientError?: (opts: {
id: string;
socket: SocketClientType;
error: Error;
}) => void;
}
export declare class BaseNetworkTcpServer<SocketServerOptions extends ServerOpts = ServerOpts, SocketServerType extends SocketServer = SocketServer, SocketClientType extends SocketClient = SocketClient> extends BaseHelper {
protected serverOptions: Partial<SocketServerOptions>;
protected listenOptions: Partial<ListenOptions>;
protected authenticateOptions: {
required: boolean;
duration?: number;
};
protected clients: Record<string, ITcpSocketClient<SocketClientType>>;
protected server: SocketServerType;
protected extraEvents: Record<string, (opts: {
id: string;
socket: SocketClientType;
args: any;
}) => ValueOrPromise<void>>;
protected createServerFn: (options: Partial<SocketServerOptions>, connectionListener: (socket: SocketClientType) => void) => SocketServerType;
protected onServerReady?: (opts: {
server: SocketServerType;
}) => void;
protected onClientConnected?: (opts: {
id: string;
socket: SocketClientType;
}) => void;
protected onClientData?: (opts: {
id: string;
socket: SocketClientType;
data: Buffer | string;
}) => void;
protected onClientClose?: (opts: {
id: string;
socket: SocketClientType;
}) => void;
protected onClientError?: (opts: {
id: string;
socket: SocketClientType;
error: Error;
}) => void;
constructor(opts: ITcpSocketServerOptions<SocketServerOptions, SocketServerType, SocketClientType>);
configure(): void;
onNewConnection(opts: {
socket: SocketClientType;
}): void;
getClients(): Record<string, ITcpSocketClient<SocketClientType>>;
getClient(opts: {
id: string;
}): ITcpSocketClient<SocketClientType>;
getServer(): SocketServerType;
doAuthenticate(opts: {
id: string;
state: 'unauthorized' | 'authenticating' | 'authenticated';
}): void;
emit(opts: {
clientId: string;
payload: Buffer | string;
}): void;
}