UNPKG

@minimaltech/node-infra

Version:

Minimal Technology NodeJS Infrastructure - Loopback 4 Framework

108 lines (107 loc) 3.9 kB
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; }