@principal-ai/control-tower-core 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abstractions/TransportAdapter.d.ts +0 -5
- package/dist/abstractions/TransportAdapter.d.ts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +5 -20
- package/dist/index.mjs +1402 -0
- package/dist/index.mjs.map +21 -0
- package/dist/server/BaseServer.d.ts +1 -12
- package/dist/server/BaseServer.d.ts.map +1 -1
- package/dist/server/BaseServer.js +0 -55
- package/dist/server/ServerBuilder.d.ts +0 -9
- package/dist/server/ServerBuilder.d.ts.map +1 -1
- package/dist/server/ServerBuilder.js +1 -16
- package/package.json +2 -5
- package/dist/adapters/websocket/WebSocketTransportAdapter.d.ts +0 -40
- package/dist/adapters/websocket/WebSocketTransportAdapter.d.ts.map +0 -1
- package/dist/adapters/websocket/WebSocketTransportAdapter.js +0 -204
- package/dist/adapters/websocket/index.d.ts +0 -2
- package/dist/adapters/websocket/index.d.ts.map +0 -1
- package/dist/adapters/websocket/index.js +0 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/abstractions/EventEmitter.ts", "../src/abstractions/RoomManager.ts", "../src/abstractions/LockManager.ts", "../src/abstractions/DefaultRoomManager.ts", "../src/abstractions/DefaultLockManager.ts", "../src/adapters/mock/MockTransportAdapter.ts", "../src/adapters/mock/MockStorageAdapter.ts", "../src/adapters/mock/MockAuthAdapter.ts", "../src/client/BaseClient.ts", "../src/client/ClientBuilder.ts", "../src/server/BaseServer.ts", "../src/server/ServerBuilder.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"// EventData represents any type of data that can be emitted as an event\nexport type EventData = unknown;\n\nexport type EventListener<T = EventData> = (data: T) => void | Promise<void>;\nexport type UnsubscribeFn = () => void;\n\nexport class TypedEventEmitter<TEvents extends Record<string, EventData>> {\n // Use unknown type for storage, will be cast appropriately when called\n private listeners = new Map<keyof TEvents, Set<EventListener<EventData>>>();\n private onceListeners = new Map<keyof TEvents, Set<EventListener<EventData>>>();\n\n on<K extends keyof TEvents>(\n event: K,\n listener: EventListener<TEvents[K]>\n ): UnsubscribeFn {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener as EventListener<EventData>);\n\n return () => this.off(event, listener);\n }\n\n once<K extends keyof TEvents>(\n event: K,\n listener: EventListener<TEvents[K]>\n ): UnsubscribeFn {\n if (!this.onceListeners.has(event)) {\n this.onceListeners.set(event, new Set());\n }\n this.onceListeners.get(event)!.add(listener as EventListener<EventData>);\n\n return () => this.off(event, listener);\n }\n\n off<K extends keyof TEvents>(\n event: K,\n listener: EventListener<TEvents[K]>\n ): void {\n this.listeners.get(event)?.delete(listener as EventListener<EventData>);\n this.onceListeners.get(event)?.delete(listener as EventListener<EventData>);\n }\n\n async emit<K extends keyof TEvents>(\n event: K,\n data: TEvents[K]\n ): Promise<void> {\n const listeners = this.listeners.get(event);\n const onceListeners = this.onceListeners.get(event);\n\n if (onceListeners) {\n const listenersToCall = Array.from(onceListeners);\n this.onceListeners.delete(event);\n for (const listener of listenersToCall) {\n await listener(data);\n }\n }\n\n if (listeners) {\n for (const listener of Array.from(listeners)) {\n await listener(data);\n }\n }\n }\n\n removeAllListeners(event?: keyof TEvents): void {\n if (event) {\n this.listeners.delete(event);\n this.onceListeners.delete(event);\n } else {\n this.listeners.clear();\n this.onceListeners.clear();\n }\n }\n\n listenerCount(event: keyof TEvents): number {\n const regular = this.listeners.get(event)?.size ?? 0;\n const once = this.onceListeners.get(event)?.size ?? 0;\n return regular + once;\n }\n}",
|
|
6
|
+
"import type {\n Room,\n RoomUser,\n RoomState,\n RoomConfig,\n Event\n} from '../types';\n\nexport abstract class RoomManager {\n protected rooms = new Map<string, RoomState>();\n\n abstract createRoom(id: string, config: RoomConfig): Promise<Room>;\n abstract deleteRoom(id: string): Promise<void>;\n abstract joinRoom(roomId: string, user: RoomUser): Promise<void>;\n abstract leaveRoom(roomId: string, userId: string): Promise<void>;\n abstract broadcastToRoom(roomId: string, event: Event, excludeUserId?: string): Promise<void>;\n abstract getRoomState(roomId: string): Promise<RoomState | null>;\n abstract getUsersInRoom(roomId: string): Promise<RoomUser[]>;\n abstract addEventToHistory(roomId: string, event: Event): Promise<void>;\n abstract getEventHistory(roomId: string, limit?: number): Promise<Event[]>;\n abstract updateUserStatus(roomId: string, userId: string, status: RoomUser['status']): Promise<void>;\n}",
|
|
7
|
+
"import type {\n Lock,\n LockRequest,\n LockState\n} from '../types';\n\nexport abstract class LockManager {\n protected lockState: LockState = {\n locks: new Map(),\n queue: new Map(),\n userLocks: new Map()\n };\n\n abstract acquireLock(userId: string, username: string, request: LockRequest): Promise<Lock>;\n abstract releaseLock(lockId: string): Promise<void>;\n abstract releaseUserLocks(userId: string): Promise<void>;\n abstract getLock(path: string): Promise<Lock | null>;\n abstract getUserLocks(userId: string): Promise<Lock[]>;\n abstract getAllLocks(): Promise<Lock[]>;\n abstract isLocked(path: string): Promise<boolean>;\n abstract getQueueLength(path: string): Promise<number>;\n abstract extendLock(lockId: string, ttl: number): Promise<Lock>;\n abstract addToQueue(userId: string, username: string, request: LockRequest): Promise<void>;\n abstract removeFromQueue(path: string, userId: string): Promise<void>;\n}",
|
|
8
|
+
"import type {\n Room,\n RoomUser,\n RoomState,\n RoomConfig,\n Event\n} from '../types';\nimport { RoomManager } from './RoomManager';\n\nexport class DefaultRoomManager extends RoomManager {\n async createRoom(id: string, config: RoomConfig): Promise<Room> {\n const room: Room = {\n id,\n name: config.name || id,\n createdAt: Date.now(),\n maxUsers: config.maxUsers,\n maxHistory: config.maxHistory,\n permissions: config.permissions,\n metadata: config.metadata || {}\n };\n\n const roomState: RoomState = {\n room,\n users: new Map(),\n eventHistory: [],\n locks: new Map()\n };\n\n this.rooms.set(id, roomState);\n return room;\n }\n\n async deleteRoom(id: string): Promise<void> {\n this.rooms.delete(id);\n }\n\n async joinRoom(roomId: string, user: RoomUser): Promise<void> {\n const roomState = this.rooms.get(roomId);\n if (!roomState) {\n throw new Error(`Room ${roomId} not found`);\n }\n\n if (roomState.room.maxUsers && roomState.users.size >= roomState.room.maxUsers) {\n throw new Error(`Room ${roomId} is full`);\n }\n\n roomState.users.set(user.id, user);\n }\n\n async leaveRoom(roomId: string, userId: string): Promise<void> {\n const roomState = this.rooms.get(roomId);\n if (!roomState) {\n return; // Room doesn't exist, nothing to do\n }\n\n roomState.users.delete(userId);\n }\n\n async broadcastToRoom(roomId: string, event: Event, _excludeUserId?: string): Promise<void> {\n const roomState = this.rooms.get(roomId);\n if (!roomState) {\n throw new Error(`Room ${roomId} not found`);\n }\n\n // In a real implementation, this would broadcast to connected clients\n // For now, we'll just store the event in history\n await this.addEventToHistory(roomId, event);\n }\n\n async getRoomState(roomId: string): Promise<RoomState | null> {\n return this.rooms.get(roomId) || null;\n }\n\n async getUsersInRoom(roomId: string): Promise<RoomUser[]> {\n const roomState = this.rooms.get(roomId);\n if (!roomState) {\n return [];\n }\n\n return Array.from(roomState.users.values());\n }\n\n async addEventToHistory(roomId: string, event: Event): Promise<void> {\n const roomState = this.rooms.get(roomId);\n if (!roomState) {\n throw new Error(`Room ${roomId} not found`);\n }\n\n roomState.eventHistory.push(event);\n\n // Trim history if needed\n if (roomState.room.maxHistory && roomState.eventHistory.length > roomState.room.maxHistory) {\n roomState.eventHistory = roomState.eventHistory.slice(-roomState.room.maxHistory);\n }\n }\n\n async getEventHistory(roomId: string, limit?: number): Promise<Event[]> {\n const roomState = this.rooms.get(roomId);\n if (!roomState) {\n return [];\n }\n\n const history = roomState.eventHistory;\n return limit ? history.slice(-limit) : history;\n }\n\n async updateUserStatus(roomId: string, userId: string, status: RoomUser['status']): Promise<void> {\n const roomState = this.rooms.get(roomId);\n if (!roomState) {\n throw new Error(`Room ${roomId} not found`);\n }\n\n const user = roomState.users.get(userId);\n if (user) {\n user.status = status;\n user.lastActivity = Date.now();\n }\n }\n}",
|
|
9
|
+
"import type {\n Lock,\n LockRequest,\n LockQueueItem\n} from '../types';\nimport { LockManager } from './LockManager';\n\nexport class DefaultLockManager extends LockManager {\n async acquireLock(userId: string, username: string, request: LockRequest): Promise<Lock> {\n const { path, type = 'file', priority = 'normal', ttl, branch, metadata } = request;\n\n // Check if user already has a lock on this path\n const userLocks = this.lockState.userLocks.get(userId) || new Set();\n if (userLocks.has(path)) {\n throw new Error(`User ${username} already has a lock on ${path}`);\n }\n\n // Check if path is already locked\n const existingLock = await this.getLock(path);\n if (existingLock) {\n // Add to queue\n await this.addToQueue(userId, username, request);\n throw new Error(`Path ${path} is already locked by ${existingLock.username}, added to queue`);\n }\n\n // Generate lock ID\n const lockId = this.generateId();\n\n // Create lock\n const lock: Lock = {\n id: lockId,\n type,\n path,\n userId,\n username,\n acquiredAt: Date.now(),\n expiresAt: ttl ? Date.now() + ttl : undefined,\n priority,\n branch,\n metadata\n };\n\n // Store lock\n this.lockState.locks.set(lockId, lock);\n this.lockState.userLocks.set(userId, userLocks.add(path));\n\n return lock;\n }\n\n async releaseLock(lockId: string): Promise<void> {\n const lock = this.lockState.locks.get(lockId);\n if (!lock) {\n throw new Error(`Lock ${lockId} not found`);\n }\n\n // Remove from user locks\n const userLocks = this.lockState.userLocks.get(lock.userId);\n if (userLocks) {\n userLocks.delete(lock.path);\n if (userLocks.size === 0) {\n this.lockState.userLocks.delete(lock.userId);\n }\n }\n\n // Remove lock\n this.lockState.locks.delete(lockId);\n\n // Process queue for this path\n await this.processQueue(lock.path);\n }\n\n async releaseUserLocks(userId: string): Promise<void> {\n const userLocks = this.lockState.userLocks.get(userId);\n if (!userLocks) {\n return;\n }\n\n const lockIds = Array.from(this.lockState.locks.entries())\n .filter(([, lock]) => lock.userId === userId)\n .map(([lockId]) => lockId);\n\n for (const lockId of lockIds) {\n await this.releaseLock(lockId);\n }\n }\n\n async getLock(path: string): Promise<Lock | null> {\n for (const lock of this.lockState.locks.values()) {\n if (lock.path === path) {\n return lock;\n }\n }\n return null;\n }\n\n async getUserLocks(userId: string): Promise<Lock[]> {\n return Array.from(this.lockState.locks.values())\n .filter(lock => lock.userId === userId);\n }\n\n async getAllLocks(): Promise<Lock[]> {\n return Array.from(this.lockState.locks.values());\n }\n\n async isLocked(path: string): Promise<boolean> {\n return await this.getLock(path) !== null;\n }\n\n async getQueueLength(path: string): Promise<number> {\n const queue = this.lockState.queue.get(path);\n return queue ? queue.length : 0;\n }\n\n async extendLock(lockId: string, ttl: number): Promise<Lock> {\n const lock = this.lockState.locks.get(lockId);\n if (!lock) {\n throw new Error(`Lock ${lockId} not found`);\n }\n\n lock.expiresAt = Date.now() + ttl;\n return lock;\n }\n\n async addToQueue(userId: string, username: string, request: LockRequest): Promise<void> {\n const { path } = request;\n const queue = this.lockState.queue.get(path) || [];\n\n const queueItem: LockQueueItem = {\n ...request,\n userId,\n username,\n requestedAt: Date.now(),\n resolve: () => {},\n reject: () => {}\n };\n\n queue.push(queueItem);\n this.lockState.queue.set(path, queue);\n }\n\n async removeFromQueue(path: string, userId: string): Promise<void> {\n const queue = this.lockState.queue.get(path);\n if (!queue) {\n return;\n }\n\n const index = queue.findIndex(item => item.userId === userId);\n if (index !== -1) {\n queue.splice(index, 1);\n if (queue.length === 0) {\n this.lockState.queue.delete(path);\n }\n }\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n }\n\n private async processQueue(path: string): Promise<void> {\n const queue = this.lockState.queue.get(path);\n if (!queue || queue.length === 0) {\n return;\n }\n\n // Process first item in queue\n const item = queue.shift()!;\n if (queue.length === 0) {\n this.lockState.queue.delete(path);\n }\n\n try {\n const lock = await this.acquireLock(item.userId, item.username, {\n path: item.path,\n type: item.type,\n priority: item.priority,\n ttl: item.ttl,\n branch: item.branch,\n metadata: item.metadata\n });\n\n item.resolve(lock);\n } catch (error) {\n item.reject(error as Error);\n }\n }\n}",
|
|
10
|
+
"import type { ITransportAdapter } from '../../abstractions/TransportAdapter';\nimport type {\n ConnectionState,\n ConnectionOptions,\n Message,\n MessageHandler,\n ErrorHandler,\n CloseHandler\n} from '../../types';\n\nexport class MockTransportAdapter implements ITransportAdapter {\n private state: ConnectionState = 'disconnected';\n private messageHandlers: Set<MessageHandler> = new Set();\n private errorHandlers: Set<ErrorHandler> = new Set();\n private closeHandlers: Set<CloseHandler> = new Set();\n private messageQueue: Message[] = [];\n private simulateLatency: number = 0;\n private shouldFailConnection: boolean = false;\n private connectedUrl: string | null = null;\n\n constructor(options?: {\n simulateLatency?: number;\n shouldFailConnection?: boolean;\n }) {\n this.simulateLatency = options?.simulateLatency ?? 0;\n this.shouldFailConnection = options?.shouldFailConnection ?? false;\n }\n\n async connect(url: string, _options?: ConnectionOptions): Promise<void> {\n if (this.shouldFailConnection) {\n this.state = 'disconnected';\n const error = new Error('Mock connection failed');\n this.errorHandlers.forEach(handler => handler(error));\n throw error;\n }\n\n this.state = 'connecting';\n this.connectedUrl = url;\n\n // Simulate connection delay\n if (this.simulateLatency > 0) {\n await new Promise(resolve => setTimeout(resolve, this.simulateLatency));\n }\n\n this.state = 'connected';\n }\n\n async disconnect(): Promise<void> {\n if (this.state === 'disconnected') return;\n\n this.state = 'disconnecting';\n\n // Simulate disconnect delay\n if (this.simulateLatency > 0) {\n await new Promise(resolve => setTimeout(resolve, this.simulateLatency / 2));\n }\n\n this.state = 'disconnected';\n this.connectedUrl = null;\n this.closeHandlers.forEach(handler => handler(1000, 'Normal closure'));\n this.messageQueue = [];\n }\n\n async send(message: Message): Promise<void> {\n if (this.state !== 'connected') {\n throw new Error('Not connected');\n }\n\n // Simulate send latency\n if (this.simulateLatency > 0) {\n await new Promise(resolve => setTimeout(resolve, this.simulateLatency));\n }\n\n this.messageQueue.push(message);\n }\n\n onMessage(handler: MessageHandler): void {\n this.messageHandlers.add(handler);\n }\n\n onError(handler: ErrorHandler): void {\n this.errorHandlers.add(handler);\n }\n\n onClose(handler: CloseHandler): void {\n this.closeHandlers.add(handler);\n }\n\n getState(): ConnectionState {\n return this.state;\n }\n\n isConnected(): boolean {\n return this.state === 'connected';\n }\n\n // Test helper methods\n simulateMessage(message: Message): void {\n if (this.state !== 'connected') {\n throw new Error('Cannot simulate message when not connected');\n }\n this.messageHandlers.forEach(handler => handler(message));\n }\n\n simulateError(error: Error): void {\n this.errorHandlers.forEach(handler => handler(error));\n }\n\n simulateClose(code: number, reason: string): void {\n this.state = 'disconnected';\n this.closeHandlers.forEach(handler => handler(code, reason));\n }\n\n getMessageQueue(): Message[] {\n return [...this.messageQueue];\n }\n\n clearMessageQueue(): void {\n this.messageQueue = [];\n }\n\n getConnectedUrl(): string | null {\n return this.connectedUrl;\n }\n}",
|
|
11
|
+
"import type { IStorageAdapter, StorageOperation } from '../../abstractions/StorageAdapter';\n\ninterface StorageItem {\n value: unknown;\n expiresAt?: number;\n}\n\nexport class MockStorageAdapter implements IStorageAdapter {\n private storage: Map<string, StorageItem> = new Map();\n private simulateLatency: number = 0;\n private shouldFailOperations: boolean = false;\n\n constructor(options?: {\n simulateLatency?: number;\n shouldFailOperations?: boolean;\n }) {\n this.simulateLatency = options?.simulateLatency ?? 0;\n this.shouldFailOperations = options?.shouldFailOperations ?? false;\n }\n\n async get<T>(key: string): Promise<T | null> {\n await this.simulateDelay();\n\n if (this.shouldFailOperations) {\n throw new Error('Mock storage operation failed');\n }\n\n const item = this.storage.get(key);\n if (!item) return null;\n\n // Check expiration\n if (item.expiresAt && item.expiresAt < Date.now()) {\n this.storage.delete(key);\n return null;\n }\n\n return item.value as T;\n }\n\n async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n await this.simulateDelay();\n\n if (this.shouldFailOperations) {\n throw new Error('Mock storage operation failed');\n }\n\n const item: StorageItem = {\n value,\n expiresAt: ttl ? Date.now() + ttl : undefined\n };\n\n this.storage.set(key, item);\n }\n\n async delete(key: string): Promise<void> {\n await this.simulateDelay();\n\n if (this.shouldFailOperations) {\n throw new Error('Mock storage operation failed');\n }\n\n this.storage.delete(key);\n }\n\n async exists(key: string): Promise<boolean> {\n await this.simulateDelay();\n\n if (this.shouldFailOperations) {\n throw new Error('Mock storage operation failed');\n }\n\n const item = this.storage.get(key);\n if (!item) return false;\n\n // Check expiration\n if (item.expiresAt && item.expiresAt < Date.now()) {\n this.storage.delete(key);\n return false;\n }\n\n return true;\n }\n\n async scan(pattern: string): Promise<string[]> {\n await this.simulateDelay();\n\n if (this.shouldFailOperations) {\n throw new Error('Mock storage operation failed');\n }\n\n // Convert pattern to regex (simple glob to regex conversion)\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.')\n .replace(/\\[!/g, '[^')\n .replace(/\\[/g, '[')\n .replace(/\\]/g, ']');\n\n const regex = new RegExp(`^${regexPattern}$`);\n const keys: string[] = [];\n\n for (const [key, item] of this.storage.entries()) {\n // Skip expired items\n if (item.expiresAt && item.expiresAt < Date.now()) {\n this.storage.delete(key);\n continue;\n }\n\n if (regex.test(key)) {\n keys.push(key);\n }\n }\n\n return keys;\n }\n\n async clear(): Promise<void> {\n await this.simulateDelay();\n\n if (this.shouldFailOperations) {\n throw new Error('Mock storage operation failed');\n }\n\n this.storage.clear();\n }\n\n async transaction<T>(operations: StorageOperation[]): Promise<T> {\n await this.simulateDelay();\n\n if (this.shouldFailOperations) {\n throw new Error('Mock storage operation failed');\n }\n\n const results: unknown[] = [];\n const rollback: (() => void)[] = [];\n\n try {\n for (const op of operations) {\n switch (op.type) {\n case 'get': {\n const value = await this.get(op.key);\n results.push(value);\n break;\n }\n case 'set': {\n const oldValue = await this.get(op.key);\n await this.set(op.key, op.value, op.ttl);\n rollback.push(() => {\n if (oldValue !== null) {\n this.storage.set(op.key, { value: oldValue });\n } else {\n this.storage.delete(op.key);\n }\n });\n results.push(true);\n break;\n }\n case 'delete': {\n const oldValue = await this.get(op.key);\n await this.delete(op.key);\n rollback.push(() => {\n if (oldValue !== null) {\n this.storage.set(op.key, { value: oldValue });\n }\n });\n results.push(true);\n break;\n }\n case 'exists': {\n const exists = await this.exists(op.key);\n results.push(exists);\n break;\n }\n }\n }\n\n return results as T;\n } catch (error) {\n // Rollback on error\n for (const rollbackFn of rollback.reverse()) {\n rollbackFn();\n }\n throw error;\n }\n }\n\n // Test helper methods\n private async simulateDelay(): Promise<void> {\n if (this.simulateLatency > 0) {\n await new Promise(resolve => setTimeout(resolve, this.simulateLatency));\n }\n }\n\n getSize(): number {\n return this.storage.size;\n }\n\n getRawStorage(): Map<string, StorageItem> {\n return new Map(this.storage);\n }\n\n setFailOperations(fail: boolean): void {\n this.shouldFailOperations = fail;\n }\n}",
|
|
12
|
+
"import type { IAuthAdapter } from '../../abstractions/AuthAdapter';\nimport type {\n TokenPayload,\n AuthResult,\n Credentials\n} from '../../types';\n\nexport class MockAuthAdapter implements IAuthAdapter {\n private tokens: Map<string, TokenPayload> = new Map();\n private revokedTokens: Set<string> = new Set();\n private users: Map<string, { password: string; payload: TokenPayload }> = new Map();\n private simulateLatency: number = 0;\n private shouldFailAuth: boolean = false;\n private tokenCounter: number = 0;\n\n constructor(options?: {\n simulateLatency?: number;\n shouldFailAuth?: boolean;\n }) {\n this.simulateLatency = options?.simulateLatency ?? 0;\n this.shouldFailAuth = options?.shouldFailAuth ?? false;\n\n // Add some default test users\n this.addUser('testuser', 'password123', {\n userId: 'user-1',\n email: 'test@example.com',\n username: 'testuser',\n permissions: ['read', 'write']\n });\n\n this.addUser('admin', 'admin123', {\n userId: 'user-admin',\n email: 'admin@example.com',\n username: 'admin',\n permissions: ['read', 'write', 'admin']\n });\n }\n\n async validateToken(token: string): Promise<TokenPayload> {\n await this.simulateDelay();\n\n if (this.shouldFailAuth) {\n throw new Error('Mock auth validation failed');\n }\n\n if (this.revokedTokens.has(token)) {\n throw new Error('Token has been revoked');\n }\n\n const payload = this.tokens.get(token);\n if (!payload) {\n throw new Error('Invalid token');\n }\n\n // Check expiration\n if (payload.expiresAt && payload.expiresAt < Date.now()) {\n this.tokens.delete(token);\n throw new Error('Token expired');\n }\n\n return payload;\n }\n\n async generateToken(payload: TokenPayload): Promise<string> {\n await this.simulateDelay();\n\n if (this.shouldFailAuth) {\n throw new Error('Mock token generation failed');\n }\n\n const token = `mock-token-${++this.tokenCounter}`;\n\n // Set default expiration to 1 hour if not specified\n const expiresAt = payload.expiresAt ?? Date.now() + 3600000;\n\n this.tokens.set(token, { ...payload, expiresAt });\n return token;\n }\n\n async refreshToken(token: string): Promise<string> {\n await this.simulateDelay();\n\n if (this.shouldFailAuth) {\n throw new Error('Mock token refresh failed');\n }\n\n const payload = await this.validateToken(token);\n\n // Revoke old token\n await this.revokeToken(token);\n\n // Generate new token with extended expiration\n const newPayload = {\n ...payload,\n expiresAt: Date.now() + 3600000 // 1 hour from now\n };\n\n return this.generateToken(newPayload);\n }\n\n async revokeToken(token: string): Promise<void> {\n await this.simulateDelay();\n\n if (this.shouldFailAuth) {\n throw new Error('Mock token revocation failed');\n }\n\n this.tokens.delete(token);\n this.revokedTokens.add(token);\n }\n\n async authenticate(credentials: Credentials): Promise<AuthResult> {\n await this.simulateDelay();\n\n if (this.shouldFailAuth) {\n throw new Error('Mock authentication failed');\n }\n\n switch (credentials.type) {\n case 'password': {\n if (!credentials.username || !credentials.password) {\n throw new Error('Username and password required');\n }\n\n const user = this.users.get(credentials.username);\n if (!user || user.password !== credentials.password) {\n throw new Error('Invalid credentials');\n }\n\n const token = await this.generateToken(user.payload);\n const refreshToken = `refresh-${token}`;\n this.tokens.set(refreshToken, user.payload);\n\n return {\n token,\n refreshToken,\n user: user.payload,\n expiresIn: 3600\n };\n }\n\n case 'token': {\n if (!credentials.token) {\n throw new Error('Token required');\n }\n\n const payload = await this.validateToken(credentials.token);\n return {\n token: credentials.token,\n user: payload,\n expiresIn: 3600\n };\n }\n\n case 'oauth': {\n // Simulate OAuth flow\n if (!credentials.code) {\n throw new Error('OAuth code required');\n }\n\n // Create a mock OAuth user\n const payload: TokenPayload = {\n userId: `oauth-user-${Date.now()}`,\n email: 'oauth@example.com',\n username: 'oauthuser',\n permissions: ['read', 'write']\n };\n\n const token = await this.generateToken(payload);\n return {\n token,\n user: payload,\n expiresIn: 3600\n };\n }\n\n default:\n throw new Error('Unsupported credential type');\n }\n }\n\n // Test helper methods\n private async simulateDelay(): Promise<void> {\n if (this.simulateLatency > 0) {\n await new Promise(resolve => setTimeout(resolve, this.simulateLatency));\n }\n }\n\n addUser(username: string, password: string, payload: TokenPayload): void {\n this.users.set(username, { password, payload });\n }\n\n removeUser(username: string): void {\n this.users.delete(username);\n }\n\n getTokenCount(): number {\n return this.tokens.size;\n }\n\n getRevokedTokenCount(): number {\n return this.revokedTokens.size;\n }\n\n clearTokens(): void {\n this.tokens.clear();\n this.revokedTokens.clear();\n }\n\n setFailAuth(fail: boolean): void {\n this.shouldFailAuth = fail;\n }\n}",
|
|
13
|
+
"import type {\n ConnectionState,\n ConnectionOptions,\n Message,\n Event,\n RoomState,\n RoomUser,\n LockRequest,\n Lock,\n Credentials\n} from '../types';\nimport type { ITransportAdapter } from '../abstractions/TransportAdapter';\nimport type { IAuthAdapter } from '../abstractions/AuthAdapter';\nimport type { IStorageAdapter } from '../abstractions/StorageAdapter';\nimport { TypedEventEmitter } from '../abstractions/EventEmitter';\n\nexport interface ClientConfig {\n transport: ITransportAdapter;\n auth?: IAuthAdapter;\n storage?: IStorageAdapter;\n reconnection?: {\n enabled: boolean;\n maxAttempts: number;\n initialDelay: number;\n maxDelay: number;\n backoffFactor: number;\n };\n}\n\nexport interface ClientEvents {\n connected: { url: string };\n disconnected: { code: number; reason: string };\n reconnecting: { attempt: number; delay: number };\n reconnected: { url: string };\n error: { error: Error };\n room_joined: { roomId: string; state: RoomState };\n room_left: { roomId: string };\n event_received: { event: Event };\n lock_acquired: { lock: Lock };\n lock_released: { lockId: string };\n lock_denied: { request: LockRequest; reason: string };\n presence_updated: { users: RoomUser[] };\n [key: string]: unknown;\n}\n\nexport class BaseClient extends TypedEventEmitter<ClientEvents> {\n private transport: ITransportAdapter;\n private auth?: IAuthAdapter;\n private storage?: IStorageAdapter;\n private config: ClientConfig;\n\n private connectionState: ConnectionState = 'disconnected';\n private currentRoomId: string | null = null;\n private currentRoomState: RoomState | null = null;\n private authToken: string | null = null;\n private userId: string | null = null;\n\n // Reconnection state\n private reconnectAttempts = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private lastConnectionUrl: string | null = null;\n private lastCredentials: Credentials | null = null;\n\n constructor(config: ClientConfig) {\n super();\n this.config = config;\n this.transport = config.transport;\n this.auth = config.auth;\n this.storage = config.storage;\n\n // Set up transport event handlers\n this.transport.onMessage(this.handleMessage.bind(this));\n this.transport.onError(this.handleError.bind(this));\n this.transport.onClose(this.handleClose.bind(this));\n }\n\n // Connection Management\n async connect(url: string, credentials?: Credentials): Promise<void> {\n if (this.connectionState !== 'disconnected') {\n throw new Error('Client is already connected or connecting');\n }\n\n this.connectionState = 'connecting';\n this.lastConnectionUrl = url;\n this.lastCredentials = credentials || null;\n\n try {\n // Authenticate if credentials provided and auth adapter available\n if (credentials && this.auth) {\n const authResult = await this.auth.authenticate(credentials);\n this.authToken = authResult.token;\n this.userId = authResult.user.userId;\n }\n\n const options: ConnectionOptions = {\n url,\n reconnect: false, // We handle reconnection ourselves\n ...this.config.reconnection\n };\n\n await this.transport.connect(url, options);\n this.connectionState = 'connected';\n\n await this.emit('connected', { url });\n } catch (error) {\n this.connectionState = 'disconnected';\n await this.emit('error', { error: error as Error });\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.connectionState === 'disconnected') {\n return;\n }\n\n this.connectionState = 'disconnecting';\n\n // Clear reconnection timer\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n // Leave room if joined\n if (this.currentRoomId) {\n await this.leaveRoom();\n }\n\n try {\n await this.transport.disconnect();\n } finally {\n this.connectionState = 'disconnected';\n this.currentRoomId = null;\n this.currentRoomState = null;\n this.authToken = null;\n this.userId = null;\n this.reconnectAttempts = 0;\n\n await this.emit('disconnected', { code: 1000, reason: 'Client disconnected' });\n }\n }\n\n async reconnect(): Promise<void> {\n if (!this.lastConnectionUrl) {\n throw new Error('No previous connection to reconnect to');\n }\n\n if (this.connectionState !== 'disconnected') {\n await this.disconnect();\n }\n\n await this.connect(this.lastConnectionUrl, this.lastCredentials || undefined);\n }\n\n // Room Management\n async joinRoom(roomId: string): Promise<void> {\n if (this.connectionState !== 'connected') {\n throw new Error('Client must be connected to join a room');\n }\n\n if (this.currentRoomId) {\n await this.leaveRoom();\n }\n\n const message: Message = {\n id: this.generateId(),\n type: 'join_room',\n payload: { roomId, token: this.authToken },\n timestamp: Date.now()\n };\n\n await this.transport.send(message);\n // Response will be handled in handleMessage\n }\n\n async leaveRoom(): Promise<void> {\n if (!this.currentRoomId) {\n return;\n }\n\n const message: Message = {\n id: this.generateId(),\n type: 'leave_room',\n payload: { roomId: this.currentRoomId },\n timestamp: Date.now()\n };\n\n await this.transport.send(message);\n // Response will be handled in handleMessage\n\n this.currentRoomId = null;\n this.currentRoomState = null;\n }\n\n // Event Operations\n async broadcast(event: Event): Promise<void> {\n if (this.connectionState !== 'connected' || !this.currentRoomId) {\n throw new Error('Client must be connected and in a room to broadcast events');\n }\n\n const message: Message = {\n id: this.generateId(),\n type: 'broadcast_event',\n payload: { event, roomId: this.currentRoomId },\n timestamp: Date.now()\n };\n\n await this.transport.send(message);\n }\n\n // Lock Operations\n async requestLock(request: LockRequest): Promise<void> {\n if (this.connectionState !== 'connected' || !this.currentRoomId) {\n throw new Error('Client must be connected and in a room to request locks');\n }\n\n const message: Message = {\n id: this.generateId(),\n type: 'request_lock',\n payload: { request, roomId: this.currentRoomId },\n timestamp: Date.now()\n };\n\n await this.transport.send(message);\n }\n\n async releaseLock(lockId: string): Promise<void> {\n if (this.connectionState !== 'connected' || !this.currentRoomId) {\n throw new Error('Client must be connected and in a room to release locks');\n }\n\n const message: Message = {\n id: this.generateId(),\n type: 'release_lock',\n payload: { lockId, roomId: this.currentRoomId },\n timestamp: Date.now()\n };\n\n await this.transport.send(message);\n }\n\n // State Getters\n getConnectionState(): ConnectionState {\n return this.connectionState;\n }\n\n getRoomState(): RoomState | null {\n return this.currentRoomState;\n }\n\n getPresence(): RoomUser[] {\n return this.currentRoomState ? Array.from(this.currentRoomState.users.values()) : [];\n }\n\n getCurrentRoomId(): string | null {\n return this.currentRoomId;\n }\n\n getUserId(): string | null {\n return this.userId;\n }\n\n // Private Methods\n private async handleMessage(message: Message): Promise<void> {\n try {\n switch (message.type) {\n case 'room_joined':\n await this.handleRoomJoined(message.payload as { roomId: string; state: RoomState });\n break;\n case 'room_left':\n await this.handleRoomLeft(message.payload as { roomId: string });\n break;\n case 'event_broadcast':\n await this.handleEventBroadcast(message.payload as { event: Event });\n break;\n case 'lock_acquired':\n await this.handleLockAcquired(message.payload as { lock: Lock });\n break;\n case 'lock_released':\n await this.handleLockReleased(message.payload as { lockId: string });\n break;\n case 'lock_denied':\n await this.handleLockDenied(message.payload as { request: LockRequest; reason: string });\n break;\n case 'presence_updated':\n await this.handlePresenceUpdated(message.payload as { users: RoomUser[] });\n break;\n case 'error':\n await this.handleServerError(message.payload as { error: string });\n break;\n }\n } catch (error) {\n await this.emit('error', { error: error as Error });\n // Error is already emitted, no additional handling needed\n }\n }\n\n private async handleError(error: Error): Promise<void> {\n await this.emit('error', { error });\n }\n\n private async handleClose(code: number, reason: string): Promise<void> {\n const wasConnected = this.connectionState === 'connected';\n this.connectionState = 'disconnected';\n\n if (wasConnected) {\n await this.emit('disconnected', { code, reason });\n\n // Attempt reconnection if enabled\n if (this.config.reconnection?.enabled && this.lastConnectionUrl) {\n this.scheduleReconnect();\n }\n }\n }\n\n private async handleRoomJoined(payload: { roomId: string; state: RoomState }): Promise<void> {\n this.currentRoomId = payload.roomId;\n this.currentRoomState = payload.state;\n await this.emit('room_joined', payload);\n }\n\n private async handleRoomLeft(payload: { roomId: string }): Promise<void> {\n if (this.currentRoomId === payload.roomId) {\n this.currentRoomId = null;\n this.currentRoomState = null;\n }\n await this.emit('room_left', payload);\n }\n\n private async handleEventBroadcast(payload: { event: Event }): Promise<void> {\n await this.emit('event_received', payload);\n }\n\n private async handleLockAcquired(payload: { lock: Lock }): Promise<void> {\n await this.emit('lock_acquired', payload);\n }\n\n private async handleLockReleased(payload: { lockId: string }): Promise<void> {\n await this.emit('lock_released', payload);\n }\n\n private async handleLockDenied(payload: { request: LockRequest; reason: string }): Promise<void> {\n await this.emit('lock_denied', payload);\n }\n\n private async handlePresenceUpdated(payload: { users: RoomUser[] }): Promise<void> {\n if (this.currentRoomState) {\n // Convert array back to Map\n this.currentRoomState.users = new Map(payload.users.map(user => [user.id, user]));\n }\n await this.emit('presence_updated', payload);\n }\n\n private async handleServerError(payload: { error: string }): Promise<void> {\n const error = new Error(payload.error);\n await this.emit('error', { error });\n }\n\n private async scheduleReconnect(): Promise<void> {\n if (!this.config.reconnection || this.reconnectAttempts >= this.config.reconnection.maxAttempts) {\n return;\n }\n\n const delay = Math.min(\n this.config.reconnection.initialDelay * Math.pow(this.config.reconnection.backoffFactor, this.reconnectAttempts),\n this.config.reconnection.maxDelay\n );\n\n this.reconnectAttempts++;\n\n await this.emit('reconnecting', { attempt: this.reconnectAttempts, delay });\n\n this.reconnectTimer = setTimeout(async () => {\n try {\n await this.reconnect();\n this.reconnectAttempts = 0;\n await this.emit('reconnected', { url: this.lastConnectionUrl! });\n } catch {\n // Reconnection failed, schedule next attempt\n this.scheduleReconnect();\n }\n }, delay);\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n }\n}",
|
|
14
|
+
"import type { ITransportAdapter } from '../abstractions/TransportAdapter';\nimport type { IAuthAdapter } from '../abstractions/AuthAdapter';\nimport type { IStorageAdapter } from '../abstractions/StorageAdapter';\nimport { BaseClient, type ClientConfig } from './BaseClient';\n\nexport class ClientBuilder {\n private transport?: ITransportAdapter;\n private auth?: IAuthAdapter;\n private storage?: IStorageAdapter;\n private reconnection?: ClientConfig['reconnection'];\n\n withTransport(transport: ITransportAdapter): this {\n this.transport = transport;\n return this;\n }\n\n withAuth(auth: IAuthAdapter): this {\n this.auth = auth;\n return this;\n }\n\n withStorage(storage: IStorageAdapter): this {\n this.storage = storage;\n return this;\n }\n\n withReconnection(config: NonNullable<ClientConfig['reconnection']>): this {\n this.reconnection = config;\n return this;\n }\n\n build(): BaseClient {\n if (!this.transport) {\n throw new Error('Transport adapter is required');\n }\n\n const config: ClientConfig = {\n transport: this.transport,\n auth: this.auth,\n storage: this.storage,\n reconnection: this.reconnection || {\n enabled: true,\n maxAttempts: 5,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffFactor: 2\n }\n };\n\n return new BaseClient(config);\n }\n}",
|
|
15
|
+
"import type {\n Message,\n Event,\n Room,\n RoomUser,\n RoomConfig,\n Lock,\n LockRequest\n} from '../types';\nimport type { ITransportAdapter } from '../abstractions/TransportAdapter';\nimport type { IAuthAdapter } from '../abstractions/AuthAdapter';\nimport type { IStorageAdapter } from '../abstractions/StorageAdapter';\nimport type { RoomManager } from '../abstractions/RoomManager';\nimport type { LockManager } from '../abstractions/LockManager';\nimport { TypedEventEmitter } from '../abstractions/EventEmitter';\n\nexport interface ServerConfig {\n transport: ITransportAdapter;\n auth?: IAuthAdapter;\n storage?: IStorageAdapter;\n roomManager: RoomManager;\n lockManager: LockManager;\n defaultRoomConfig?: Partial<RoomConfig>;\n}\n\nexport interface ConnectedClient {\n id: string;\n userId: string;\n roomId: string | null;\n authenticated: boolean;\n connectedAt: number;\n}\n\nexport interface ServerEvents {\n started: { port: number };\n stopped: {}; // eslint-disable-line @typescript-eslint/no-empty-object-type\n client_connected: { client: ConnectedClient };\n client_disconnected: { clientId: string; reason: string };\n client_authenticated: { clientId: string; userId: string };\n room_created: { room: Room };\n room_deleted: { roomId: string };\n client_joined_room: { clientId: string; roomId: string };\n client_left_room: { clientId: string; roomId: string };\n event_broadcast: { roomId: string; event: Event; fromClientId: string };\n lock_acquired: { lock: Lock; clientId: string };\n lock_released: { lockId: string; clientId: string };\n error: { error: Error; context?: string };\n [key: string]: unknown;\n}\n\nexport class BaseServer extends TypedEventEmitter<ServerEvents> {\n private transport: ITransportAdapter;\n private auth?: IAuthAdapter;\n private storage?: IStorageAdapter;\n private roomManager: RoomManager;\n private lockManager: LockManager;\n private config: ServerConfig;\n\n private clients = new Map<string, ConnectedClient>();\n private clientMessageHandlers = new Map<string, (message: Message) => Promise<void>>();\n private running = false;\n\n constructor(config: ServerConfig) {\n super();\n this.config = config;\n this.transport = config.transport;\n this.auth = config.auth;\n this.storage = config.storage;\n this.roomManager = config.roomManager;\n this.lockManager = config.lockManager;\n\n // Set up transport event handlers\n this.transport.onMessage(this.handleTransportMessage.bind(this));\n this.transport.onError(this.handleTransportError.bind(this));\n this.transport.onClose(this.handleTransportClose.bind(this));\n }\n\n // Server Lifecycle\n async start(port: number): Promise<void> {\n if (this.running) {\n throw new Error('Server is already running');\n }\n\n try {\n await this.transport.connect(`ws://localhost:${port}`, { url: `ws://localhost:${port}` });\n this.running = true;\n await this.emit('started', { port });\n } catch (error) {\n await this.emit('error', { error: error as Error, context: 'server_start' });\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n if (!this.running) {\n return;\n }\n\n this.running = false;\n\n // Disconnect all clients\n for (const [clientId] of Array.from(this.clients)) {\n await this.disconnectClient(clientId, 'Server shutting down');\n }\n\n try {\n await this.transport.disconnect();\n } catch (error) {\n await this.emit('error', { error: error as Error, context: 'server_stop' });\n }\n\n this.clients.clear();\n this.clientMessageHandlers.clear();\n\n await this.emit('stopped', {});\n }\n\n // Client Management\n private async handleTransportMessage(message: Message): Promise<void> {\n // Transport messages contain clientId in the payload for routing\n const payload = message.payload as { clientId?: string; [key: string]: unknown };\n const { clientId, ...clientMessage } = payload;\n\n const clientMsg: Message = {\n id: message.id,\n type: message.type,\n payload: clientMessage,\n timestamp: message.timestamp\n };\n\n if (!clientId) {\n await this.emit('error', {\n error: new Error('Message missing clientId'),\n context: 'transport_message'\n });\n return;\n }\n\n const handler = this.clientMessageHandlers.get(clientId);\n if (handler) {\n await handler(clientMsg);\n } else {\n await this.emit('error', {\n error: new Error(`No handler for client ${clientId}`),\n context: 'transport_message'\n });\n }\n }\n\n private async handleTransportError(error: Error): Promise<void> {\n await this.emit('error', { error, context: 'transport' });\n }\n\n private async handleTransportClose(_code: number, _reason: string): Promise<void> {\n // Transport close means server is shutting down\n if (this.running) {\n await this.stop();\n }\n }\n\n private async addClient(clientId: string): Promise<void> {\n const client: ConnectedClient = {\n id: clientId,\n userId: '',\n roomId: null,\n authenticated: false,\n connectedAt: Date.now()\n };\n\n this.clients.set(clientId, client);\n\n // Set up message handler for this client\n this.clientMessageHandlers.set(clientId, this.createClientMessageHandler(clientId));\n\n await this.emit('client_connected', { client });\n }\n\n private async disconnectClient(clientId: string, reason: string): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) {\n return;\n }\n\n // Leave room if in one\n if (client.roomId) {\n await this.roomManager.leaveRoom(client.roomId, client.userId);\n await this.emit('client_left_room', { clientId, roomId: client.roomId });\n }\n\n // Release all locks held by this client\n await this.lockManager.releaseUserLocks(client.userId);\n\n // Clean up\n this.clients.delete(clientId);\n this.clientMessageHandlers.delete(clientId);\n\n await this.emit('client_disconnected', { clientId, reason });\n }\n\n private createClientMessageHandler(clientId: string): (message: Message) => Promise<void> {\n return async (message: Message) => {\n try {\n const client = this.clients.get(clientId);\n if (!client) {\n return;\n }\n\n switch (message.type) {\n case 'authenticate':\n await this.handleAuthenticate(clientId, message.payload as { token: string });\n break;\n case 'join_room':\n await this.handleJoinRoom(clientId, message.payload as { roomId: string; token?: string });\n break;\n case 'leave_room':\n await this.handleLeaveRoom(clientId);\n break;\n case 'broadcast_event':\n await this.handleBroadcastEvent(clientId, message.payload as { event: Event; roomId: string });\n break;\n case 'request_lock':\n await this.handleLockRequest(clientId, message.payload as { request: LockRequest; roomId: string });\n break;\n case 'release_lock':\n await this.handleLockRelease(clientId, message.payload as { lockId: string });\n break;\n case 'ping':\n await this.sendToClient(clientId, { type: 'pong', timestamp: Date.now() });\n break;\n default:\n await this.sendToClient(clientId, {\n type: 'error',\n error: `Unknown message type: ${message.type}`\n });\n }\n } catch (error) {\n await this.sendToClient(clientId, {\n type: 'error',\n error: (error as Error).message\n });\n await this.emit('error', { error: error as Error, context: `client_${clientId}` });\n }\n };\n }\n\n // Message Handlers\n private async handleAuthenticate(clientId: string, payload: { token: string }): Promise<void> {\n if (!this.auth) {\n await this.sendToClient(clientId, { type: 'auth_result', success: false, error: 'Authentication not configured' });\n return;\n }\n\n try {\n const tokenPayload = await this.auth.validateToken(payload.token);\n const client = this.clients.get(clientId);\n if (client) {\n client.userId = tokenPayload.userId;\n client.authenticated = true;\n await this.emit('client_authenticated', { clientId, userId: tokenPayload.userId });\n }\n\n await this.sendToClient(clientId, { type: 'auth_result', success: true });\n } catch (error) {\n await this.sendToClient(clientId, { type: 'auth_result', success: false, error: (error as Error).message });\n }\n }\n\n private async handleJoinRoom(clientId: string, payload: { roomId: string; token?: string }): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) {\n return;\n }\n\n // Authenticate if token provided\n if (payload.token && !client.authenticated) {\n await this.handleAuthenticate(clientId, { token: payload.token });\n }\n\n if (!client.authenticated) {\n await this.sendToClient(clientId, { type: 'error', error: 'Authentication required to join room' });\n return;\n }\n\n try {\n // Leave current room if any\n if (client.roomId) {\n await this.roomManager.leaveRoom(client.roomId, client.userId);\n await this.emit('client_left_room', { clientId, roomId: client.roomId });\n }\n\n // Get or create room\n let roomState = await this.roomManager.getRoomState(payload.roomId);\n if (!roomState) {\n const roomConfig = { ...this.config.defaultRoomConfig, id: payload.roomId };\n const room = await this.roomManager.createRoom(payload.roomId, roomConfig);\n roomState = await this.roomManager.getRoomState(payload.roomId);\n await this.emit('room_created', { room });\n }\n\n if (!roomState) {\n throw new Error('Failed to create or get room state');\n }\n\n // Join room\n const user: RoomUser = {\n id: client.userId,\n username: client.userId, // TODO: Get from auth token\n status: 'online',\n joinedAt: Date.now(),\n lastActivity: Date.now(),\n permissions: roomState.room.permissions || ['read', 'write']\n };\n\n await this.roomManager.joinRoom(payload.roomId, user);\n client.roomId = payload.roomId;\n\n await this.emit('client_joined_room', { clientId, roomId: payload.roomId });\n\n // Send room state to client\n await this.sendToClient(clientId, {\n type: 'room_joined',\n roomId: payload.roomId,\n state: roomState\n });\n\n // Send event history\n const history = await this.roomManager.getEventHistory(payload.roomId, 50);\n if (history.length > 0) {\n await this.sendToClient(clientId, {\n type: 'event_history',\n events: history\n });\n }\n\n } catch (error) {\n await this.sendToClient(clientId, { type: 'error', error: (error as Error).message });\n }\n }\n\n private async handleLeaveRoom(clientId: string): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client || !client.roomId) {\n return;\n }\n\n const roomId = client.roomId;\n await this.roomManager.leaveRoom(roomId, client.userId);\n client.roomId = null;\n\n await this.emit('client_left_room', { clientId, roomId });\n\n await this.sendToClient(clientId, { type: 'room_left', roomId });\n }\n\n private async handleBroadcastEvent(clientId: string, payload: { event: Event; roomId: string }): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client || client.roomId !== payload.roomId) {\n await this.sendToClient(clientId, { type: 'error', error: 'Not in specified room' });\n return;\n }\n\n // Add metadata to event\n const enrichedEvent = {\n ...payload.event,\n metadata: {\n ...payload.event.metadata,\n userId: client.userId,\n timestamp: Date.now(),\n roomId: payload.roomId\n }\n };\n\n // Add to history\n await this.roomManager.addEventToHistory(payload.roomId, enrichedEvent);\n\n // Broadcast to room\n await this.roomManager.broadcastToRoom(payload.roomId, enrichedEvent, client.userId);\n\n await this.emit('event_broadcast', {\n roomId: payload.roomId,\n event: enrichedEvent,\n fromClientId: clientId\n });\n }\n\n private async handleLockRequest(clientId: string, payload: { request: LockRequest; roomId: string }): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client || client.roomId !== payload.roomId) {\n await this.sendToClient(clientId, { type: 'error', error: 'Not in specified room' });\n return;\n }\n\n try {\n const lock = await this.lockManager.acquireLock(client.userId, client.userId, payload.request);\n await this.emit('lock_acquired', { lock, clientId });\n\n await this.sendToClient(clientId, { type: 'lock_acquired', lock });\n\n // Broadcast lock status to room\n await this.roomManager.broadcastToRoom(payload.roomId, {\n id: this.generateId(),\n type: 'lock_status',\n timestamp: Date.now(),\n userId: client.userId,\n roomId: payload.roomId,\n data: { lock, action: 'acquired' },\n metadata: { userId: client.userId, timestamp: Date.now(), roomId: payload.roomId }\n });\n } catch (error) {\n await this.sendToClient(clientId, { type: 'lock_denied', request: payload.request, reason: (error as Error).message });\n }\n }\n\n private async handleLockRelease(clientId: string, payload: { lockId: string }): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) {\n return;\n }\n\n try {\n await this.lockManager.releaseLock(payload.lockId);\n await this.emit('lock_released', { lockId: payload.lockId, clientId });\n\n await this.sendToClient(clientId, { type: 'lock_released', lockId: payload.lockId });\n\n // Broadcast lock status to room if client is in one\n if (client.roomId) {\n await this.roomManager.broadcastToRoom(client.roomId, {\n id: this.generateId(),\n type: 'lock_status',\n timestamp: Date.now(),\n userId: client.userId,\n roomId: client.roomId,\n data: { lockId: payload.lockId, action: 'released' },\n metadata: { userId: client.userId, timestamp: Date.now(), roomId: client.roomId }\n });\n }\n } catch (error) {\n await this.sendToClient(clientId, { type: 'error', error: (error as Error).message });\n }\n }\n\n // Utility Methods\n private async sendToClient(clientId: string, message: Record<string, unknown>): Promise<void> {\n const transportMessage: Message = {\n id: this.generateId(),\n type: 'server_message',\n payload: { clientId, ...message },\n timestamp: Date.now()\n };\n\n await this.transport.send(transportMessage);\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n }\n\n // Public API for external management\n async createRoom(roomId: string, config: RoomConfig): Promise<Room> {\n const room = await this.roomManager.createRoom(roomId, config);\n await this.emit('room_created', { room });\n return room;\n }\n\n async deleteRoom(roomId: string): Promise<void> {\n await this.roomManager.deleteRoom(roomId);\n await this.emit('room_deleted', { roomId });\n }\n\n getConnectedClients(): ConnectedClient[] {\n return Array.from(this.clients.values());\n }\n\n getClient(clientId: string): ConnectedClient | null {\n return this.clients.get(clientId) || null;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}",
|
|
16
|
+
"import type { ITransportAdapter } from '../abstractions/TransportAdapter';\nimport type { IAuthAdapter } from '../abstractions/AuthAdapter';\nimport type { IStorageAdapter } from '../abstractions/StorageAdapter';\nimport type { RoomManager } from '../abstractions/RoomManager';\nimport type { LockManager } from '../abstractions/LockManager';\nimport type { RoomConfig } from '../types';\nimport { BaseServer, type ServerConfig } from './BaseServer';\n\nexport class ServerBuilder {\n private transport?: ITransportAdapter;\n private auth?: IAuthAdapter;\n private storage?: IStorageAdapter;\n private roomManager?: RoomManager;\n private lockManager?: LockManager;\n private defaultRoomConfig?: Partial<RoomConfig>;\n\n withTransport(transport: ITransportAdapter): this {\n this.transport = transport;\n return this;\n }\n\n withAuth(auth: IAuthAdapter): this {\n this.auth = auth;\n return this;\n }\n\n withStorage(storage: IStorageAdapter): this {\n this.storage = storage;\n return this;\n }\n\n withRoomManager(roomManager: RoomManager): this {\n this.roomManager = roomManager;\n return this;\n }\n\n withLockManager(lockManager: LockManager): this {\n this.lockManager = lockManager;\n return this;\n }\n\n withDefaultRoomConfig(config: Partial<RoomConfig>): this {\n this.defaultRoomConfig = config;\n return this;\n }\n\n build(): BaseServer {\n if (!this.transport) {\n throw new Error('Transport adapter is required');\n }\n\n if (!this.roomManager) {\n throw new Error('Room manager is required');\n }\n\n if (!this.lockManager) {\n throw new Error('Lock manager is required');\n }\n\n const config: ServerConfig = {\n transport: this.transport,\n auth: this.auth,\n storage: this.storage,\n roomManager: this.roomManager,\n lockManager: this.lockManager,\n defaultRoomConfig: this.defaultRoomConfig || {\n maxUsers: 50,\n maxHistory: 100,\n permissions: ['read' as const, 'write' as const]\n }\n };\n\n return new BaseServer(config);\n }\n}"
|
|
17
|
+
],
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "FFED7FD7481F9AA464756E2164756E21",
|
|
20
|
+
"names": []
|
|
21
|
+
}
|
|
@@ -5,9 +5,6 @@ import type { IStorageAdapter } from '../abstractions/StorageAdapter';
|
|
|
5
5
|
import type { RoomManager } from '../abstractions/RoomManager';
|
|
6
6
|
import type { LockManager } from '../abstractions/LockManager';
|
|
7
7
|
import { TypedEventEmitter } from '../abstractions/EventEmitter';
|
|
8
|
-
import type { Server as HttpServer } from 'http';
|
|
9
|
-
import type { Server as HttpsServer } from 'https';
|
|
10
|
-
import type { WebSocketServer } from 'ws';
|
|
11
8
|
export interface ServerConfig {
|
|
12
9
|
transport: ITransportAdapter;
|
|
13
10
|
auth?: IAuthAdapter;
|
|
@@ -15,9 +12,6 @@ export interface ServerConfig {
|
|
|
15
12
|
roomManager: RoomManager;
|
|
16
13
|
lockManager: LockManager;
|
|
17
14
|
defaultRoomConfig?: Partial<RoomConfig>;
|
|
18
|
-
httpServer?: HttpServer | HttpsServer;
|
|
19
|
-
webSocketPath?: string;
|
|
20
|
-
webSocketServer?: WebSocketServer;
|
|
21
15
|
}
|
|
22
16
|
export interface ConnectedClient {
|
|
23
17
|
id: string;
|
|
@@ -85,11 +79,8 @@ export declare class BaseServer extends TypedEventEmitter<ServerEvents> {
|
|
|
85
79
|
private clients;
|
|
86
80
|
private clientMessageHandlers;
|
|
87
81
|
private running;
|
|
88
|
-
private initialized;
|
|
89
|
-
private mode;
|
|
90
82
|
constructor(config: ServerConfig);
|
|
91
|
-
start(port
|
|
92
|
-
initialize(): Promise<void>;
|
|
83
|
+
start(port: number): Promise<void>;
|
|
93
84
|
stop(): Promise<void>;
|
|
94
85
|
private handleTransportMessage;
|
|
95
86
|
private handleTransportError;
|
|
@@ -110,7 +101,5 @@ export declare class BaseServer extends TypedEventEmitter<ServerEvents> {
|
|
|
110
101
|
getConnectedClients(): ConnectedClient[];
|
|
111
102
|
getClient(clientId: string): ConnectedClient | null;
|
|
112
103
|
isRunning(): boolean;
|
|
113
|
-
getMode(): 'standalone' | 'integration';
|
|
114
|
-
isInitialized(): boolean;
|
|
115
104
|
}
|
|
116
105
|
//# sourceMappingURL=BaseServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseServer.d.ts","sourceRoot":"","sources":["../../src/server/BaseServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,KAAK,EACL,IAAI,EAEJ,UAAU,EACV,IAAI,EAEL,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseServer.d.ts","sourceRoot":"","sources":["../../src/server/BaseServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,15 +5,12 @@ export class BaseServer extends TypedEventEmitter {
|
|
|
5
5
|
this.clients = new Map();
|
|
6
6
|
this.clientMessageHandlers = new Map();
|
|
7
7
|
this.running = false;
|
|
8
|
-
this.initialized = false;
|
|
9
8
|
this.config = config;
|
|
10
9
|
this.transport = config.transport;
|
|
11
10
|
this.auth = config.auth;
|
|
12
11
|
this.storage = config.storage;
|
|
13
12
|
this.roomManager = config.roomManager;
|
|
14
13
|
this.lockManager = config.lockManager;
|
|
15
|
-
// Determine mode based on configuration
|
|
16
|
-
this.mode = (config.httpServer || config.webSocketServer) ? 'integration' : 'standalone';
|
|
17
14
|
// Set up transport event handlers
|
|
18
15
|
this.transport.onMessage(this.handleTransportMessage.bind(this));
|
|
19
16
|
this.transport.onError(this.handleTransportError.bind(this));
|
|
@@ -21,19 +18,12 @@ export class BaseServer extends TypedEventEmitter {
|
|
|
21
18
|
}
|
|
22
19
|
// Server Lifecycle
|
|
23
20
|
async start(port) {
|
|
24
|
-
if (this.mode === 'integration') {
|
|
25
|
-
throw new Error('Cannot use start() in integration mode. Use initialize() instead.');
|
|
26
|
-
}
|
|
27
|
-
if (!port) {
|
|
28
|
-
throw new Error('Port is required for standalone mode');
|
|
29
|
-
}
|
|
30
21
|
if (this.running) {
|
|
31
22
|
throw new Error('Server is already running');
|
|
32
23
|
}
|
|
33
24
|
try {
|
|
34
25
|
await this.transport.connect(`ws://localhost:${port}`, { url: `ws://localhost:${port}` });
|
|
35
26
|
this.running = true;
|
|
36
|
-
this.initialized = true;
|
|
37
27
|
await this.emit('started', { port });
|
|
38
28
|
}
|
|
39
29
|
catch (error) {
|
|
@@ -41,45 +31,6 @@ export class BaseServer extends TypedEventEmitter {
|
|
|
41
31
|
throw error;
|
|
42
32
|
}
|
|
43
33
|
}
|
|
44
|
-
async initialize() {
|
|
45
|
-
if (this.mode === 'standalone') {
|
|
46
|
-
throw new Error('Cannot use initialize() in standalone mode. Use start() instead.');
|
|
47
|
-
}
|
|
48
|
-
if (this.initialized) {
|
|
49
|
-
throw new Error('Server is already initialized');
|
|
50
|
-
}
|
|
51
|
-
try {
|
|
52
|
-
const transport = this.transport;
|
|
53
|
-
if (this.config.webSocketServer) {
|
|
54
|
-
// Attach to existing WebSocket server
|
|
55
|
-
if (typeof transport.attachToWebSocketServer === 'function') {
|
|
56
|
-
await transport.attachToWebSocketServer(this.config.webSocketServer);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
throw new Error('Transport adapter does not support attachToWebSocketServer');
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
else if (this.config.httpServer) {
|
|
63
|
-
// Attach to existing HTTP server
|
|
64
|
-
if (typeof transport.attach === 'function') {
|
|
65
|
-
await transport.attach(this.config.httpServer, this.config.webSocketPath || '/ws');
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
throw new Error('Transport adapter does not support attach');
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
throw new Error('Either httpServer or webSocketServer must be provided in integration mode');
|
|
73
|
-
}
|
|
74
|
-
this.running = true;
|
|
75
|
-
this.initialized = true;
|
|
76
|
-
await this.emit('started', { port: 0 }); // Port 0 indicates integration mode
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
await this.emit('error', { error: error, context: 'server_initialize' });
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
34
|
async stop() {
|
|
84
35
|
if (!this.running) {
|
|
85
36
|
return;
|
|
@@ -413,10 +364,4 @@ export class BaseServer extends TypedEventEmitter {
|
|
|
413
364
|
isRunning() {
|
|
414
365
|
return this.running;
|
|
415
366
|
}
|
|
416
|
-
getMode() {
|
|
417
|
-
return this.mode;
|
|
418
|
-
}
|
|
419
|
-
isInitialized() {
|
|
420
|
-
return this.initialized;
|
|
421
|
-
}
|
|
422
367
|
}
|
|
@@ -5,9 +5,6 @@ import type { RoomManager } from '../abstractions/RoomManager';
|
|
|
5
5
|
import type { LockManager } from '../abstractions/LockManager';
|
|
6
6
|
import type { RoomConfig } from '../types';
|
|
7
7
|
import { BaseServer } from './BaseServer';
|
|
8
|
-
import type { Server as HttpServer } from 'http';
|
|
9
|
-
import type { Server as HttpsServer } from 'https';
|
|
10
|
-
import type { WebSocketServer } from 'ws';
|
|
11
8
|
export declare class ServerBuilder {
|
|
12
9
|
private transport?;
|
|
13
10
|
private auth?;
|
|
@@ -15,18 +12,12 @@ export declare class ServerBuilder {
|
|
|
15
12
|
private roomManager?;
|
|
16
13
|
private lockManager?;
|
|
17
14
|
private defaultRoomConfig?;
|
|
18
|
-
private httpServer?;
|
|
19
|
-
private webSocketPath?;
|
|
20
|
-
private webSocketServer?;
|
|
21
15
|
withTransport(transport: ITransportAdapter): this;
|
|
22
16
|
withAuth(auth: IAuthAdapter): this;
|
|
23
17
|
withStorage(storage: IStorageAdapter): this;
|
|
24
18
|
withRoomManager(roomManager: RoomManager): this;
|
|
25
19
|
withLockManager(lockManager: LockManager): this;
|
|
26
20
|
withDefaultRoomConfig(config: Partial<RoomConfig>): this;
|
|
27
|
-
withHttpServer(server: HttpServer | HttpsServer): this;
|
|
28
|
-
withWebSocketPath(path: string): this;
|
|
29
|
-
withWebSocketServer(wss: WebSocketServer): this;
|
|
30
21
|
build(): BaseServer;
|
|
31
22
|
}
|
|
32
23
|
//# sourceMappingURL=ServerBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerBuilder.d.ts","sourceRoot":"","sources":["../../src/server/ServerBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAqB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ServerBuilder.d.ts","sourceRoot":"","sources":["../../src/server/ServerBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAqB,MAAM,cAAc,CAAC;AAE7D,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAC,CAAoB;IACtC,OAAO,CAAC,IAAI,CAAC,CAAe;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAkB;IAClC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAEhD,aAAa,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAKjD,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKlC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAK3C,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAK/C,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAK/C,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAKxD,KAAK,IAAI,UAAU;CA4BpB"}
|
|
@@ -24,18 +24,6 @@ export class ServerBuilder {
|
|
|
24
24
|
this.defaultRoomConfig = config;
|
|
25
25
|
return this;
|
|
26
26
|
}
|
|
27
|
-
withHttpServer(server) {
|
|
28
|
-
this.httpServer = server;
|
|
29
|
-
return this;
|
|
30
|
-
}
|
|
31
|
-
withWebSocketPath(path) {
|
|
32
|
-
this.webSocketPath = path;
|
|
33
|
-
return this;
|
|
34
|
-
}
|
|
35
|
-
withWebSocketServer(wss) {
|
|
36
|
-
this.webSocketServer = wss;
|
|
37
|
-
return this;
|
|
38
|
-
}
|
|
39
27
|
build() {
|
|
40
28
|
if (!this.transport) {
|
|
41
29
|
throw new Error('Transport adapter is required');
|
|
@@ -56,10 +44,7 @@ export class ServerBuilder {
|
|
|
56
44
|
maxUsers: 50,
|
|
57
45
|
maxHistory: 100,
|
|
58
46
|
permissions: ['read', 'write']
|
|
59
|
-
}
|
|
60
|
-
httpServer: this.httpServer,
|
|
61
|
-
webSocketPath: this.webSocketPath,
|
|
62
|
-
webSocketServer: this.webSocketServer
|
|
47
|
+
}
|
|
63
48
|
};
|
|
64
49
|
return new BaseServer(config);
|
|
65
50
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@principal-ai/control-tower-core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Centralized, runtime-agnostic library for real-time collaboration and synchronization",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -38,15 +38,12 @@
|
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@eslint/js": "^9.36.0",
|
|
40
40
|
"@types/bun": "latest",
|
|
41
|
-
"@types/ws": "^8.18.1",
|
|
42
41
|
"@typescript-eslint/eslint-plugin": "^8.44.0",
|
|
43
42
|
"@typescript-eslint/parser": "^8.44.0",
|
|
44
43
|
"eslint": "^9.36.0",
|
|
45
44
|
"typescript": "^5.3.3"
|
|
46
45
|
},
|
|
47
|
-
"dependencies": {
|
|
48
|
-
"ws": "^8.18.3"
|
|
49
|
-
},
|
|
46
|
+
"dependencies": {},
|
|
50
47
|
"engines": {
|
|
51
48
|
"bun": ">=1.0.0"
|
|
52
49
|
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import type { ITransportAdapter } from '../../abstractions/TransportAdapter';
|
|
2
|
-
import type { ConnectionState, ConnectionOptions, Message, MessageHandler, ErrorHandler, CloseHandler } from '../../types';
|
|
3
|
-
import type { Server as HttpServer } from 'http';
|
|
4
|
-
import type { Server as HttpsServer } from 'https';
|
|
5
|
-
import { WebSocketServer, WebSocket } from 'ws';
|
|
6
|
-
interface ClientConnection {
|
|
7
|
-
id: string;
|
|
8
|
-
ws: WebSocket;
|
|
9
|
-
userId?: string;
|
|
10
|
-
}
|
|
11
|
-
export declare class WebSocketTransportAdapter implements ITransportAdapter {
|
|
12
|
-
private state;
|
|
13
|
-
private messageHandlers;
|
|
14
|
-
private errorHandlers;
|
|
15
|
-
private closeHandlers;
|
|
16
|
-
private wss?;
|
|
17
|
-
private serverUrl?;
|
|
18
|
-
private attachedServer?;
|
|
19
|
-
private attachedWss?;
|
|
20
|
-
private webSocketPath?;
|
|
21
|
-
private clients;
|
|
22
|
-
private mode;
|
|
23
|
-
connect(url: string, _options?: ConnectionOptions): Promise<void>;
|
|
24
|
-
attach(server: HttpServer | HttpsServer, path?: string): Promise<void>;
|
|
25
|
-
attachToWebSocketServer(wss: WebSocketServer): Promise<void>;
|
|
26
|
-
private handleConnection;
|
|
27
|
-
disconnect(): Promise<void>;
|
|
28
|
-
send(message: Message): Promise<void>;
|
|
29
|
-
onMessage(handler: MessageHandler): void;
|
|
30
|
-
onError(handler: ErrorHandler): void;
|
|
31
|
-
onClose(handler: CloseHandler): void;
|
|
32
|
-
getState(): ConnectionState;
|
|
33
|
-
isConnected(): boolean;
|
|
34
|
-
getConnectedClients(): ClientConnection[];
|
|
35
|
-
getClientCount(): number;
|
|
36
|
-
getMode(): 'standalone' | 'integration';
|
|
37
|
-
private generateId;
|
|
38
|
-
}
|
|
39
|
-
export {};
|
|
40
|
-
//# sourceMappingURL=WebSocketTransportAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketTransportAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/websocket/WebSocketTransportAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,YAAY,EACZ,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEhD,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,yBAA0B,YAAW,iBAAiB;IACjE,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,aAAa,CAAgC;IAGrD,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,SAAS,CAAC,CAAS;IAG3B,OAAO,CAAC,cAAc,CAAC,CAA2B;IAClD,OAAO,CAAC,WAAW,CAAC,CAAkB;IACtC,OAAO,CAAC,aAAa,CAAC,CAAS;IAG/B,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,IAAI,CAA8C;IAGpD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCjE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,EAAE,IAAI,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC7E,uBAAuB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BlE,OAAO,CAAC,gBAAgB;IAqClB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3B,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B3C,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIxC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIpC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIpC,QAAQ,IAAI,eAAe;IAI3B,WAAW,IAAI,OAAO;IAKtB,mBAAmB,IAAI,gBAAgB,EAAE;IAIzC,cAAc,IAAI,MAAM;IAIxB,OAAO,IAAI,YAAY,GAAG,aAAa;IAIvC,OAAO,CAAC,UAAU;CAGnB"}
|