@synet/patterns
Version:
Robust, battle-tested collection of stable patterns used in Synet packages
89 lines (88 loc) • 2.35 kB
TypeScript
import type { RealtimeEvent, Topic } from "../common/realtime-event";
export interface ClientConnectedEventData {
clientId: string;
topic: Topic;
timestamp: Date;
metadata?: Record<string, unknown>;
}
export interface ClientDisconnectedEventData {
clientId: string;
topics: Topic[];
timestamp: Date;
}
export interface MessageReceivedEventData {
clientId: string;
message: Record<string, unknown>;
timestamp: Date;
}
export type ServerEventType = "client.connected" | "client.disconnected" | "message.received";
/**
* Server statistics
*/
export interface RealtimeServerStats {
connectedClients: number;
totalTopics: number;
messagesSent: number;
messagesReceived: number;
uptime: number;
averageLatency?: number;
}
/**
* Configuration options for RealtimeServer
*/
export interface RealtimeServerOptions<TTransportOptions = unknown> {
/**
* Authentication configuration
*/
authToken?: string;
auth?: {
enabled: boolean;
validateToken?: (token: string) => Promise<boolean>;
extractClaims?: (token: string) => Promise<Record<string, unknown>>;
};
/**
* Client connection limits
*/
limits?: {
maxConnections?: number;
maxTopicsPerClient?: number;
messageRateLimit?: number;
};
/**
* Transport-specific options
*/
transportOptions?: TTransportOptions;
}
/**
* SERVER-SIDE: Broadcast events to connected clients
*/
export interface RealtimeServer<TEvent extends RealtimeEvent = RealtimeEvent> {
/**
* Start the server
*/
start(): Promise<void>;
/**
* Stop the server
*/
stop(): Promise<void>;
/**
* Broadcast an event to all subscribers of a topic
* @param topic Target topic
* @param event Event to broadcast
*/
broadcast(topic: Topic, event: TEvent): Promise<void>;
/**
* Send event to specific client (optional feature)
* @param clientId Target client ID
* @param event Event to send
*/
sendToClient?(clientId: string, event: TEvent): Promise<void>;
/**
* Get server stats
*/
getStats(): RealtimeServerStats;
/**
* Register event listeners for server events
*/
on<T extends ServerEventType>(event: T, handler: (data: unknown) => void): void;
}