@principal-ai/control-tower-core 0.1.24 → 0.2.0

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.
Files changed (117) hide show
  1. package/dist/abstractions/AuthAdapter.d.ts +1 -1
  2. package/dist/abstractions/AuthAdapter.d.ts.map +1 -1
  3. package/dist/abstractions/DefaultLockManager.d.ts +2 -2
  4. package/dist/abstractions/DefaultLockManager.d.ts.map +1 -1
  5. package/dist/abstractions/DefaultLockManager.js +7 -8
  6. package/dist/abstractions/DefaultPresenceManager.d.ts +4 -4
  7. package/dist/abstractions/DefaultPresenceManager.d.ts.map +1 -1
  8. package/dist/abstractions/DefaultPresenceManager.js +25 -25
  9. package/dist/abstractions/DefaultRoomManager.d.ts +3 -3
  10. package/dist/abstractions/DefaultRoomManager.d.ts.map +1 -1
  11. package/dist/abstractions/DefaultRoomManager.js +6 -4
  12. package/dist/abstractions/EventEmitter.d.ts.map +1 -1
  13. package/dist/abstractions/LockManager.d.ts +1 -1
  14. package/dist/abstractions/LockManager.d.ts.map +1 -1
  15. package/dist/abstractions/LockManager.js +1 -1
  16. package/dist/abstractions/PresenceExtension.d.ts +2 -2
  17. package/dist/abstractions/PresenceExtension.d.ts.map +1 -1
  18. package/dist/abstractions/PresenceManager.d.ts +1 -1
  19. package/dist/abstractions/PresenceManager.d.ts.map +1 -1
  20. package/dist/abstractions/PresenceManager.js +5 -5
  21. package/dist/abstractions/RoomManager.d.ts +2 -2
  22. package/dist/abstractions/RoomManager.d.ts.map +1 -1
  23. package/dist/abstractions/StorageAdapter.d.ts +4 -4
  24. package/dist/abstractions/StorageAdapter.d.ts.map +1 -1
  25. package/dist/abstractions/TransportAdapter.d.ts +4 -4
  26. package/dist/abstractions/TransportAdapter.d.ts.map +1 -1
  27. package/dist/abstractions/index.d.ts +11 -11
  28. package/dist/abstractions/index.d.ts.map +1 -1
  29. package/dist/abstractions/index.js +9 -9
  30. package/dist/adapters/mock/MockAuthAdapter.d.ts +2 -2
  31. package/dist/adapters/mock/MockAuthAdapter.d.ts.map +1 -1
  32. package/dist/adapters/mock/MockAuthAdapter.js +13 -11
  33. package/dist/adapters/mock/MockRTCDataChannel.d.ts +83 -0
  34. package/dist/adapters/mock/MockRTCDataChannel.d.ts.map +1 -0
  35. package/dist/adapters/mock/MockRTCDataChannel.js +146 -0
  36. package/dist/adapters/mock/MockRTCPeerConnection.d.ts +168 -0
  37. package/dist/adapters/mock/MockRTCPeerConnection.d.ts.map +1 -0
  38. package/dist/adapters/mock/MockRTCPeerConnection.js +449 -0
  39. package/dist/adapters/mock/MockStorageAdapter.d.ts +1 -1
  40. package/dist/adapters/mock/MockStorageAdapter.d.ts.map +1 -1
  41. package/dist/adapters/mock/MockStorageAdapter.js +18 -18
  42. package/dist/adapters/mock/MockTransportAdapter.d.ts +2 -2
  43. package/dist/adapters/mock/MockTransportAdapter.d.ts.map +1 -1
  44. package/dist/adapters/mock/MockTransportAdapter.js +38 -38
  45. package/dist/adapters/mock/index.d.ts +5 -3
  46. package/dist/adapters/mock/index.d.ts.map +1 -1
  47. package/dist/adapters/mock/index.js +10 -5
  48. package/dist/adapters/webrtc/WebRTCSignalingAdapter.d.ts +135 -0
  49. package/dist/adapters/webrtc/WebRTCSignalingAdapter.d.ts.map +1 -0
  50. package/dist/adapters/webrtc/WebRTCSignalingAdapter.js +368 -0
  51. package/dist/adapters/webrtc/index.d.ts +2 -0
  52. package/dist/adapters/webrtc/index.d.ts.map +1 -0
  53. package/dist/adapters/webrtc/index.js +5 -0
  54. package/dist/adapters/websocket/BrowserWebSocketTransportAdapter.d.ts +75 -0
  55. package/dist/adapters/websocket/BrowserWebSocketTransportAdapter.d.ts.map +1 -0
  56. package/dist/adapters/websocket/BrowserWebSocketTransportAdapter.js +231 -0
  57. package/dist/adapters/websocket/WebSocketClientTransportAdapter.d.ts +3 -3
  58. package/dist/adapters/websocket/WebSocketClientTransportAdapter.d.ts.map +1 -1
  59. package/dist/adapters/websocket/WebSocketClientTransportAdapter.js +38 -38
  60. package/dist/adapters/websocket/WebSocketServerTransportAdapter.d.ts +7 -7
  61. package/dist/adapters/websocket/WebSocketServerTransportAdapter.d.ts.map +1 -1
  62. package/dist/adapters/websocket/WebSocketServerTransportAdapter.js +94 -91
  63. package/dist/adapters/websocket/browser.d.ts +2 -0
  64. package/dist/adapters/websocket/browser.d.ts.map +1 -0
  65. package/dist/adapters/websocket/browser.js +6 -0
  66. package/dist/adapters/websocket/index.d.ts +3 -2
  67. package/dist/adapters/websocket/index.d.ts.map +1 -1
  68. package/dist/adapters/websocket/index.js +7 -3
  69. package/dist/adapters/websocket/node.d.ts +3 -0
  70. package/dist/adapters/websocket/node.d.ts.map +1 -0
  71. package/dist/adapters/websocket/node.js +8 -0
  72. package/dist/client/BaseClient.d.ts +6 -6
  73. package/dist/client/BaseClient.d.ts.map +1 -1
  74. package/dist/client/BaseClient.js +86 -72
  75. package/dist/client/ClientBuilder.d.ts +5 -5
  76. package/dist/client/ClientBuilder.d.ts.map +1 -1
  77. package/dist/client/ClientBuilder.js +3 -3
  78. package/dist/client/PresenceClient.d.ts +4 -4
  79. package/dist/client/PresenceClient.d.ts.map +1 -1
  80. package/dist/client/PresenceClient.js +30 -30
  81. package/dist/client/index.d.ts +3 -3
  82. package/dist/client/index.d.ts.map +1 -1
  83. package/dist/index.d.ts +7 -6
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +27 -19
  86. package/dist/index.js.map +27 -23
  87. package/dist/index.mjs +1590 -558
  88. package/dist/index.mjs.map +27 -23
  89. package/dist/server/BaseServer.d.ts +13 -13
  90. package/dist/server/BaseServer.d.ts.map +1 -1
  91. package/dist/server/BaseServer.js +224 -143
  92. package/dist/server/ExperimentalAPI.d.ts +7 -7
  93. package/dist/server/ExperimentalAPI.d.ts.map +1 -1
  94. package/dist/server/ExperimentalAPI.js +22 -22
  95. package/dist/server/ServerBuilder.d.ts +11 -11
  96. package/dist/server/ServerBuilder.d.ts.map +1 -1
  97. package/dist/server/ServerBuilder.js +10 -10
  98. package/dist/server/index.d.ts +3 -3
  99. package/dist/server/index.d.ts.map +1 -1
  100. package/dist/server/index.js +3 -3
  101. package/dist/types/auth.d.ts.map +1 -1
  102. package/dist/types/events.d.ts +10 -10
  103. package/dist/types/events.d.ts.map +1 -1
  104. package/dist/types/experimental.d.ts +2 -2
  105. package/dist/types/experimental.d.ts.map +1 -1
  106. package/dist/types/experimental.js +1 -1
  107. package/dist/types/index.d.ts +7 -7
  108. package/dist/types/index.d.ts.map +1 -1
  109. package/dist/types/index.js +2 -2
  110. package/dist/types/lock.d.ts +2 -2
  111. package/dist/types/lock.d.ts.map +1 -1
  112. package/dist/types/presence.d.ts +3 -3
  113. package/dist/types/presence.d.ts.map +1 -1
  114. package/dist/types/room.d.ts +4 -4
  115. package/dist/types/room.d.ts.map +1 -1
  116. package/dist/types/room.js +2 -2
  117. package/package.json +15 -7
package/dist/index.js.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../node_modules/ws/lib/constants.js", "../node_modules/ws/lib/buffer-util.js", "../node_modules/ws/lib/limiter.js", "../node_modules/ws/lib/permessage-deflate.js", "../node_modules/ws/lib/validation.js", "../node_modules/ws/lib/receiver.js", "../node_modules/ws/lib/sender.js", "../node_modules/ws/lib/event-target.js", "../node_modules/ws/lib/extension.js", "../node_modules/ws/lib/websocket.js", "../node_modules/ws/lib/stream.js", "../node_modules/ws/lib/subprotocol.js", "../node_modules/ws/lib/websocket-server.js", "../src/types/room.ts", "../src/types/experimental.ts", "../src/abstractions/EventEmitter.ts", "../src/abstractions/RoomManager.ts", "../src/abstractions/LockManager.ts", "../src/abstractions/DefaultRoomManager.ts", "../src/abstractions/DefaultLockManager.ts", "../src/abstractions/PresenceManager.ts", "../src/abstractions/DefaultPresenceManager.ts", "../src/adapters/mock/MockTransportAdapter.ts", "../src/adapters/mock/MockStorageAdapter.ts", "../src/adapters/mock/MockAuthAdapter.ts", "../node_modules/ws/wrapper.mjs", "../src/adapters/websocket/WebSocketServerTransportAdapter.ts", "../src/adapters/websocket/WebSocketClientTransportAdapter.ts", "../src/client/BaseClient.ts", "../src/client/ClientBuilder.ts", "../src/client/PresenceClient.ts", "../src/server/ExperimentalAPI.ts", "../src/server/BaseServer.ts", "../src/server/ServerBuilder.ts"],
3
+ "sources": ["../node_modules/ws/lib/constants.js", "../node_modules/ws/lib/buffer-util.js", "../node_modules/ws/lib/limiter.js", "../node_modules/ws/lib/permessage-deflate.js", "../node_modules/ws/lib/validation.js", "../node_modules/ws/lib/receiver.js", "../node_modules/ws/lib/sender.js", "../node_modules/ws/lib/event-target.js", "../node_modules/ws/lib/extension.js", "../node_modules/ws/lib/websocket.js", "../node_modules/ws/lib/stream.js", "../node_modules/ws/lib/subprotocol.js", "../node_modules/ws/lib/websocket-server.js", "../src/abstractions/LockManager.ts", "../src/abstractions/DefaultLockManager.ts", "../src/abstractions/PresenceManager.ts", "../src/abstractions/DefaultPresenceManager.ts", "../src/abstractions/RoomManager.ts", "../src/abstractions/DefaultRoomManager.ts", "../src/abstractions/EventEmitter.ts", "../src/adapters/mock/MockAuthAdapter.ts", "../src/adapters/mock/MockRTCDataChannel.ts", "../src/adapters/mock/MockRTCPeerConnection.ts", "../src/adapters/mock/MockStorageAdapter.ts", "../src/adapters/mock/MockTransportAdapter.ts", "../src/adapters/webrtc/WebRTCSignalingAdapter.ts", "../node_modules/ws/wrapper.mjs", "../src/adapters/websocket/WebSocketClientTransportAdapter.ts", "../src/adapters/websocket/WebSocketServerTransportAdapter.ts", "../src/adapters/websocket/BrowserWebSocketTransportAdapter.ts", "../src/types/room.ts", "../src/client/BaseClient.ts", "../src/client/ClientBuilder.ts", "../src/client/PresenceClient.ts", "../src/types/experimental.ts", "../src/server/ExperimentalAPI.ts", "../src/server/BaseServer.ts", "../src/server/ServerBuilder.ts"],
4
4
  "sourcesContent": [
5
5
  "'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n",
6
6
  "'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n",
@@ -15,29 +15,33 @@
15
15
  "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n",
16
16
  "'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n",
17
17
  "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate(\n this.options.perMessageDeflate,\n true,\n this.options.maxPayload\n );\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n",
18
- "import type { Event } from './events.js';\nimport type { Lock } from './lock.js';\n\nexport type RoomPermission = 'read' | 'write' | 'admin';\n\nexport interface Room {\n id: string;\n name: string;\n createdAt: number;\n maxUsers?: number;\n maxHistory?: number;\n permissions?: RoomPermission[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface RoomUser {\n id: string;\n username: string;\n email?: string;\n joinedAt: number;\n lastActivity: number;\n permissions: RoomPermission[];\n status: UserStatus;\n metadata?: Record<string, unknown>;\n}\n\nexport type UserStatus = 'online' | 'away' | 'offline';\n\nexport interface RoomState {\n room: Room;\n users: Map<string, RoomUser>;\n eventHistory: Array<Event>;\n locks: Map<string, Lock>;\n}\n\n/**\n * Serializable version of RoomState for JSON transmission over WebSocket\n * Maps are converted to plain objects for JSON compatibility\n */\nexport interface SerializableRoomState {\n room: Room;\n users: Record<string, RoomUser>;\n eventHistory: Array<Event>;\n locks: Record<string, Lock>;\n}\n\n/**\n * Convert RoomState with Maps to a serializable format for JSON transmission\n */\nexport function serializeRoomState(state: RoomState): SerializableRoomState {\n return {\n room: state.room,\n users: Object.fromEntries(state.users),\n eventHistory: state.eventHistory,\n locks: Object.fromEntries(state.locks)\n };\n}\n\n/**\n * Convert serialized RoomState back to proper RoomState with Maps\n */\nexport function deserializeRoomState(serialized: SerializableRoomState): RoomState {\n return {\n room: serialized.room,\n users: new Map(Object.entries(serialized.users)),\n eventHistory: serialized.eventHistory,\n locks: new Map(Object.entries(serialized.locks))\n };\n}\n\nexport interface RoomConfig {\n name?: string;\n maxUsers?: number;\n maxHistory?: number;\n permissions?: RoomPermission[];\n requireAuth?: boolean;\n allowAnonymous?: boolean;\n persistHistory?: boolean;\n metadata?: Record<string, unknown>;\n}",
19
- "/**\n * Experimental API Types\n *\n * ⚠️ WARNING: Types in this file are experimental and may change or be removed\n * without major version bumps. Use only for prototyping and internal tooling.\n *\n * For production use, submit a feature request to graduate these APIs:\n * @see docs/FEATURE_REQUEST_TEMPLATE.md\n */\n\nimport type { ConnectedClient } from '../server/BaseServer.js';\n\n/**\n * Configuration for experimental features\n */\nexport interface ExperimentalFeatureConfig {\n /**\n * Enable experimental broadcast APIs\n *\n * ⚠️ DEVELOPMENT USE ONLY\n * Allows use of server.experimental.broadcast() and related methods\n *\n * @default false\n */\n enableBroadcast?: boolean;\n\n /**\n * Enable runtime warnings for experimental API usage\n *\n * When true, logs warnings each time an experimental API is called\n * Useful for tracking experimental API usage in development\n *\n * @default true\n */\n warnOnExperimentalUse?: boolean;\n\n /**\n * Track experimental API usage metrics\n *\n * When true, emits events for experimental API calls that can be\n * monitored to understand usage patterns\n *\n * @default false\n */\n trackUsageMetrics?: boolean;\n}\n\n/**\n * Client predicate function for filtering broadcasts\n *\n * @param client - The connected client to evaluate\n * @returns true if the client should receive the broadcast\n *\n * @example\n * // Broadcast only to admin users\n * const isAdmin: ClientPredicate = (client) => {\n * return getUserRole(client.userId) === 'admin';\n * };\n */\nexport type ClientPredicate = (client: ConnectedClient) => boolean;\n\n/**\n * Result of a broadcast operation\n */\nexport interface BroadcastResult {\n /**\n * Number of clients that successfully received the message\n */\n sent: number;\n\n /**\n * Number of clients that failed to receive the message\n */\n failed: number;\n\n /**\n * Errors that occurred during broadcast\n */\n errors: Array<{\n clientId: string;\n error: Error;\n }>;\n\n /**\n * Total time taken to complete the broadcast (milliseconds)\n */\n durationMs: number;\n}\n\n/**\n * Options for broadcast operations\n */\nexport interface BroadcastOptions {\n /**\n * Whether to continue broadcasting even if some sends fail\n *\n * @default true\n */\n continueOnError?: boolean;\n\n /**\n * Timeout for each individual send operation (milliseconds)\n *\n * @default 5000\n */\n sendTimeout?: number;\n\n /**\n * Whether to include detailed error information in the result\n *\n * @default false\n */\n includeErrors?: boolean;\n}\n\n/**\n * Experimental API usage metrics event\n */\nexport interface ExperimentalUsageEvent {\n /**\n * The experimental method that was called\n */\n method: 'broadcast' | 'broadcastAuthenticated' | 'broadcastWhere' | 'sendToUsers';\n\n /**\n * Message type being broadcast\n */\n messageType: string;\n\n /**\n * Number of recipients\n */\n recipientCount: number;\n\n /**\n * Timestamp of the call\n */\n timestamp: number;\n\n /**\n * Size of the message payload (bytes)\n */\n payloadSize?: number;\n}\n\n/**\n * Error thrown when experimental features are not enabled\n */\nexport class ExperimentalFeatureError extends Error {\n constructor(\n public readonly feature: string,\n public readonly configKey: keyof ExperimentalFeatureConfig\n ) {\n super(\n `Experimental feature '${feature}' is not enabled.\\n\\n` +\n `To enable, set '${String(configKey)}: true' in your server configuration:\\n\\n` +\n ` const server = new ServerBuilder()\\n` +\n ` .withExperimentalFeatures({ ${String(configKey)}: true })\\n` +\n ` .build();\\n\\n` +\n `⚠️ WARNING: Experimental APIs are for development only.\\n` +\n `For production use, submit a feature request:\\n` +\n `https://github.com/your-org/control-tower-core/issues/new\\n\\n` +\n `See docs/EXPERIMENTAL_BROADCAST.md for details.`\n );\n this.name = 'ExperimentalFeatureError';\n }\n}\n",
20
- "// 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}",
21
- "import type {\n Room,\n RoomUser,\n RoomState,\n RoomConfig,\n Event\n} from '../types/index.js';\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}",
22
- "import type {\n Lock,\n LockRequest,\n LockState\n} from '../types/index.js';\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}",
23
- "import type {\n Room,\n RoomUser,\n RoomState,\n RoomConfig,\n Event\n} from '../types/index.js';\nimport { RoomManager } from './RoomManager.js';\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}",
24
- "import type {\n Lock,\n LockRequest,\n LockQueueItem\n} from '../types/index.js';\nimport { LockManager } from './LockManager.js';\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}",
25
- "/**\n * Presence Manager Abstract Class\n *\n * Manages global user presence tracking independent of room membership.\n * Supports multi-device connections, activity monitoring, and grace periods.\n */\n\nimport type {\n UserPresence,\n DeviceInfo,\n PresenceStatus,\n PresenceConfig,\n PresenceChangeEvent,\n ActivityUpdate\n} from '../types/presence.js';\n\n/**\n * Abstract class for managing user presence\n *\n * Implementations should handle:\n * - Multi-device tracking per user\n * - Activity/heartbeat monitoring\n * - Grace period for disconnects\n * - Presence state persistence (if needed)\n */\nexport abstract class PresenceManager {\n protected config: Required<PresenceConfig>;\n\n constructor(config?: PresenceConfig) {\n // Set defaults\n this.config = {\n enabled: config?.enabled ?? false,\n heartbeatInterval: config?.heartbeatInterval ?? 30000,\n awayThreshold: config?.awayThreshold ?? 2,\n disconnectThreshold: config?.disconnectThreshold ?? 3,\n gracePeriod: config?.gracePeriod ?? 30000,\n trackDeviceActivity: config?.trackDeviceActivity ?? true,\n broadcastPresenceUpdates: config?.broadcastPresenceUpdates ?? true\n };\n }\n\n /**\n * Register a new device connection for a user\n *\n * @param userId - User identifier\n * @param deviceId - Device/client identifier\n * @param deviceInfo - Optional device metadata\n * @returns The updated user presence\n */\n abstract connectDevice(\n userId: string,\n deviceId: string,\n deviceInfo?: Partial<DeviceInfo>\n ): Promise<UserPresence>;\n\n /**\n * Unregister a device connection\n *\n * May trigger grace period if this is the user's last device.\n *\n * @param userId - User identifier\n * @param deviceId - Device/client identifier\n * @returns The updated user presence, or null if user is completely offline\n */\n abstract disconnectDevice(\n userId: string,\n deviceId: string\n ): Promise<UserPresence | null>;\n\n /**\n * Update activity timestamp for a device\n *\n * Used for heartbeats and activity tracking.\n *\n * @param update - Activity update information\n * @returns The updated user presence\n */\n abstract updateActivity(update: ActivityUpdate): Promise<UserPresence>;\n\n /**\n * Get presence state for a user\n *\n * @param userId - User identifier\n * @returns User presence, or null if not found\n */\n abstract getUserPresence(userId: string): Promise<UserPresence | null>;\n\n /**\n * Get presence state for multiple users\n *\n * @param userIds - Array of user identifiers\n * @returns Map of userId to UserPresence\n */\n abstract getUsersPresence(userIds: string[]): Promise<Map<string, UserPresence>>;\n\n /**\n * Get all online users\n *\n * @returns Array of user presences with status 'online'\n */\n abstract getOnlineUsers(): Promise<UserPresence[]>;\n\n /**\n * Get all devices for a user\n *\n * @param userId - User identifier\n * @returns Array of device info\n */\n abstract getUserDevices(userId: string): Promise<DeviceInfo[]>;\n\n /**\n * Manually set user status\n *\n * @param userId - User identifier\n * @param status - New presence status\n * @returns The updated user presence\n */\n abstract setUserStatus(userId: string, status: PresenceStatus): Promise<UserPresence>;\n\n /**\n * Check for stale connections and update presence accordingly\n *\n * This should be called periodically to:\n * - Mark idle devices as 'away'\n * - Disconnect devices that haven't sent heartbeats\n * - Expire grace periods\n *\n * @returns Array of presence change events\n */\n abstract processHeartbeats(): Promise<PresenceChangeEvent[]>;\n\n /**\n * Clear all presence data\n *\n * Useful for testing and cleanup.\n */\n abstract clear(): Promise<void>;\n\n /**\n * Get configuration\n */\n getConfig(): Readonly<Required<PresenceConfig>> {\n return { ...this.config };\n }\n\n /**\n * Check if presence tracking is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n /**\n * Calculate presence status based on device states\n *\n * Helper method for implementations to determine overall user status.\n *\n * @param devices - Map of devices for a user\n * @param now - Current timestamp\n * @returns Calculated presence status\n */\n protected calculatePresenceStatus(\n devices: Map<string, DeviceInfo>,\n now: number = Date.now()\n ): PresenceStatus {\n if (devices.size === 0) {\n return 'offline';\n }\n\n const heartbeatTimeout = this.config.heartbeatInterval * this.config.awayThreshold;\n\n // Check if ANY device is active (within heartbeat threshold)\n for (const device of devices.values()) {\n const timeSinceActivity = now - device.lastActivity;\n if (timeSinceActivity < heartbeatTimeout) {\n return 'online';\n }\n }\n\n // All devices are idle\n return 'away';\n }\n\n /**\n * Check if a device should be disconnected due to missed heartbeats\n *\n * @param device - Device info\n * @param now - Current timestamp\n * @returns true if device should be disconnected\n */\n protected shouldDisconnectDevice(\n device: DeviceInfo,\n now: number = Date.now()\n ): boolean {\n const timeout = this.config.heartbeatInterval * this.config.disconnectThreshold;\n return (now - device.lastActivity) > timeout;\n }\n}\n",
26
- "/**\n * Default In-Memory Presence Manager\n *\n * Reference implementation of PresenceManager using in-memory storage.\n * Suitable for single-server deployments and development.\n *\n * For multi-server deployments, implement a custom PresenceManager\n * backed by Redis or another shared data store.\n */\n\nimport { PresenceManager } from './PresenceManager.js';\nimport type {\n UserPresence,\n DeviceInfo,\n PresenceStatus,\n PresenceConfig,\n PresenceChangeEvent,\n ActivityUpdate\n} from '../types/presence.js';\nimport type { PresenceExtension, ExtendedUserPresence } from './PresenceExtension.js';\nimport type { BaseServer } from '../server/BaseServer.js';\n\n/**\n * Grace period entry for tracking disconnected users\n */\ninterface GracePeriodEntry {\n userId: string;\n disconnectedAt: number;\n previousPresence: UserPresence;\n}\n\nexport class DefaultPresenceManager<TExtendedData = Record<string, unknown>> extends PresenceManager {\n private userPresences = new Map<string, UserPresence>();\n private deviceToUser = new Map<string, string>();\n private gracePeriodEntries = new Map<string, GracePeriodEntry>();\n private extensions: PresenceExtension<TExtendedData>[] = [];\n private server?: BaseServer;\n\n constructor(config?: PresenceConfig & {\n extensions?: PresenceExtension<TExtendedData>[];\n }) {\n super(config);\n this.extensions = config?.extensions || [];\n }\n\n /**\n * Set server reference for auto-broadcasting\n *\n * This is called automatically by ServerBuilder.\n * @internal\n */\n setServer(server: BaseServer): void {\n this.server = server;\n }\n\n /**\n * Initialize all extensions\n * @internal\n */\n async initializeExtensions(): Promise<void> {\n for (const ext of this.extensions) {\n await ext.initialize?.();\n }\n }\n\n /**\n * Destroy all extensions\n * @internal\n */\n async destroyExtensions(): Promise<void> {\n for (const ext of this.extensions) {\n await ext.destroy?.();\n }\n }\n\n async connectDevice(\n userId: string,\n deviceId: string,\n deviceInfo?: Partial<DeviceInfo>\n ): Promise<UserPresence> {\n const now = Date.now();\n const isFirstDevice = !this.userPresences.has(userId) && !this.gracePeriodEntries.has(userId);\n\n // Check if user is in grace period (reconnecting)\n const gracePeriodEntry = this.gracePeriodEntries.get(userId);\n if (gracePeriodEntry) {\n // Restore from grace period\n this.gracePeriodEntries.delete(userId);\n const presence = gracePeriodEntry.previousPresence;\n\n // Add the new device\n const device: DeviceInfo = {\n deviceId,\n type: deviceInfo?.type,\n connectedAt: now,\n lastActivity: now,\n metadata: deviceInfo?.metadata\n };\n\n presence.devices.set(deviceId, device);\n presence.status = 'online';\n presence.lastActivity = now;\n\n this.userPresences.set(userId, presence);\n this.deviceToUser.set(deviceId, userId);\n\n // Call extension hooks\n if (isFirstDevice) {\n for (const ext of this.extensions) {\n await ext.onUserOnline?.(userId, deviceId, deviceInfo?.metadata || {});\n }\n } else {\n for (const ext of this.extensions) {\n await ext.onDeviceConnected?.(userId, deviceId, deviceInfo?.metadata || {});\n }\n }\n\n // Auto-broadcast\n if (this.config.broadcastPresenceUpdates && this.server) {\n const experimental = (this.server as any).experimental;\n await experimental?.broadcastAuthenticated({\n type: 'presence:user_online',\n payload: {\n userId,\n deviceId,\n status: 'online',\n timestamp: now\n }\n });\n }\n\n return presence;\n }\n\n // Get or create user presence\n let presence = this.userPresences.get(userId);\n const wasOnline = presence !== undefined;\n\n if (!presence) {\n // New user\n presence = {\n userId,\n status: 'online',\n devices: new Map(),\n firstConnectedAt: now,\n lastActivity: now,\n metadata: {}\n };\n this.userPresences.set(userId, presence);\n }\n\n // Add device\n const device: DeviceInfo = {\n deviceId,\n type: deviceInfo?.type,\n connectedAt: now,\n lastActivity: now,\n metadata: deviceInfo?.metadata\n };\n\n presence.devices.set(deviceId, device);\n presence.status = this.calculatePresenceStatus(presence.devices, now);\n presence.lastActivity = now;\n\n this.deviceToUser.set(deviceId, userId);\n\n // Call extension hooks\n if (!wasOnline) {\n for (const ext of this.extensions) {\n await ext.onUserOnline?.(userId, deviceId, deviceInfo?.metadata || {});\n }\n } else {\n for (const ext of this.extensions) {\n await ext.onDeviceConnected?.(userId, deviceId, deviceInfo?.metadata || {});\n }\n }\n\n // Auto-broadcast if user came online\n if (!wasOnline && this.config.broadcastPresenceUpdates && this.server) {\n const experimental = (this.server as any).experimental;\n await experimental?.broadcastAuthenticated({\n type: 'presence:user_online',\n payload: {\n userId,\n deviceId,\n status: 'online',\n timestamp: now\n }\n });\n }\n\n return presence;\n }\n\n async disconnectDevice(\n userId: string,\n deviceId: string\n ): Promise<UserPresence | null> {\n const presence = this.userPresences.get(userId);\n if (!presence) {\n return null;\n }\n\n // Remove device\n presence.devices.delete(deviceId);\n this.deviceToUser.delete(deviceId);\n\n const now = Date.now();\n const isLastDevice = presence.devices.size === 0;\n\n // If no devices left, start grace period\n if (isLastDevice) {\n // Call extension hooks for user going offline\n for (const ext of this.extensions) {\n await ext.onUserOffline?.(userId, deviceId);\n }\n\n // Auto-broadcast user offline\n if (this.config.broadcastPresenceUpdates && this.server) {\n const experimental = (this.server as any).experimental;\n await experimental?.broadcastAuthenticated({\n type: 'presence:user_offline',\n payload: {\n userId,\n deviceId,\n status: 'offline',\n timestamp: now,\n gracePeriod: this.config.gracePeriod\n }\n });\n }\n\n if (this.config.gracePeriod > 0) {\n // Move to grace period\n this.gracePeriodEntries.set(userId, {\n userId,\n disconnectedAt: now,\n previousPresence: presence\n });\n this.userPresences.delete(userId);\n return null;\n } else {\n // No grace period, remove completely\n this.userPresences.delete(userId);\n return null;\n }\n }\n\n // Still has devices - call device disconnected hook\n for (const ext of this.extensions) {\n await ext.onDeviceDisconnected?.(userId, deviceId);\n }\n\n // Still has devices, update status\n presence.status = this.calculatePresenceStatus(presence.devices, now);\n\n // Update lastActivity to most recent device activity\n let mostRecentActivity = 0;\n for (const device of presence.devices.values()) {\n if (device.lastActivity > mostRecentActivity) {\n mostRecentActivity = device.lastActivity;\n }\n }\n presence.lastActivity = mostRecentActivity;\n\n return presence;\n }\n\n async updateActivity(update: ActivityUpdate): Promise<UserPresence> {\n const { userId, deviceId, timestamp, activityType } = update;\n\n const presence = this.userPresences.get(userId);\n if (!presence) {\n throw new Error(`User ${userId} not found in presence system`);\n }\n\n const device = presence.devices.get(deviceId);\n if (!device) {\n throw new Error(`Device ${deviceId} not found for user ${userId}`);\n }\n\n // Update device activity\n device.lastActivity = timestamp;\n\n // Update user activity\n if (timestamp > presence.lastActivity) {\n presence.lastActivity = timestamp;\n }\n\n // Recalculate status\n const previousStatus = presence.status;\n presence.status = this.calculatePresenceStatus(presence.devices, timestamp);\n\n // Call extension hooks\n for (const ext of this.extensions) {\n await ext.onActivity?.(userId, deviceId, activityType || 'heartbeat');\n }\n\n return presence;\n }\n\n async getUserPresence(userId: string): Promise<ExtendedUserPresence<TExtendedData> | null> {\n const basePresence = this.userPresences.get(userId);\n if (!basePresence) {\n return null;\n }\n\n // Merge extended data from all extensions\n if (this.extensions.length > 0) {\n const extendedData: Record<string, unknown> = {};\n for (const ext of this.extensions) {\n const data = await ext.getExtendedData?.(userId);\n if (data) {\n Object.assign(extendedData, data);\n }\n }\n\n return {\n ...basePresence,\n extended: extendedData as TExtendedData\n };\n }\n\n return basePresence;\n }\n\n async getUsersPresence(userIds: string[]): Promise<Map<string, UserPresence>> {\n const result = new Map<string, UserPresence>();\n\n for (const userId of userIds) {\n const presence = this.userPresences.get(userId);\n if (presence) {\n result.set(userId, presence);\n }\n }\n\n return result;\n }\n\n async getOnlineUsers(): Promise<ExtendedUserPresence<TExtendedData>[]> {\n const online: ExtendedUserPresence<TExtendedData>[] = [];\n\n for (const presence of this.userPresences.values()) {\n if (presence.status === 'online') {\n // Check visibility with extensions\n let visible = true;\n for (const ext of this.extensions) {\n const shouldShow = await ext.shouldBeVisible?.(presence.userId);\n if (shouldShow === false) {\n visible = false;\n break;\n }\n }\n\n if (visible) {\n // Get full presence with extended data\n const fullPresence = await this.getUserPresence(presence.userId);\n if (fullPresence) {\n online.push(fullPresence);\n }\n }\n }\n }\n\n return online;\n }\n\n async getUserDevices(userId: string): Promise<DeviceInfo[]> {\n const presence = this.userPresences.get(userId);\n if (!presence) {\n return [];\n }\n\n return Array.from(presence.devices.values());\n }\n\n async setUserStatus(userId: string, status: PresenceStatus): Promise<UserPresence> {\n const presence = this.userPresences.get(userId);\n if (!presence) {\n throw new Error(`User ${userId} not found in presence system`);\n }\n\n presence.status = status;\n return presence;\n }\n\n async processHeartbeats(): Promise<PresenceChangeEvent[]> {\n const now = Date.now();\n const changes: PresenceChangeEvent[] = [];\n\n // Process active presences\n for (const [userId, presence] of this.userPresences.entries()) {\n const devicesToRemove: string[] = [];\n\n // Check each device for timeout\n for (const [deviceId, device] of presence.devices.entries()) {\n if (this.shouldDisconnectDevice(device, now)) {\n devicesToRemove.push(deviceId);\n }\n }\n\n // Remove timed-out devices\n for (const deviceId of devicesToRemove) {\n presence.devices.delete(deviceId);\n this.deviceToUser.delete(deviceId);\n }\n\n // Update status after removing devices\n const previousStatus = presence.status;\n const newStatus = this.calculatePresenceStatus(presence.devices, now);\n\n if (newStatus !== previousStatus) {\n presence.status = newStatus;\n changes.push({\n userId,\n previousStatus,\n status: newStatus,\n timestamp: now,\n reason: 'heartbeat_timeout'\n });\n }\n\n // If no devices left, move to grace period\n if (presence.devices.size === 0) {\n if (this.config.gracePeriod > 0) {\n this.gracePeriodEntries.set(userId, {\n userId,\n disconnectedAt: now,\n previousPresence: presence\n });\n }\n this.userPresences.delete(userId);\n }\n }\n\n // Process grace period expirations\n const expiredGracePeriods: string[] = [];\n\n for (const [userId, entry] of this.gracePeriodEntries.entries()) {\n const gracePeriodElapsed = now - entry.disconnectedAt;\n\n if (gracePeriodElapsed > this.config.gracePeriod) {\n expiredGracePeriods.push(userId);\n\n changes.push({\n userId,\n previousStatus: entry.previousPresence.status,\n status: 'offline',\n timestamp: now,\n reason: 'grace_period_expired'\n });\n }\n }\n\n // Remove expired grace period entries\n for (const userId of expiredGracePeriods) {\n this.gracePeriodEntries.delete(userId);\n }\n\n return changes;\n }\n\n async clear(): Promise<void> {\n // Destroy extensions first\n await this.destroyExtensions();\n\n this.userPresences.clear();\n this.deviceToUser.clear();\n this.gracePeriodEntries.clear();\n }\n\n /**\n * Get count of users in grace period (useful for monitoring)\n */\n getGracePeriodCount(): number {\n return this.gracePeriodEntries.size;\n }\n\n /**\n * Get total connected device count\n */\n getConnectedDeviceCount(): number {\n return this.deviceToUser.size;\n }\n\n /**\n * Get total unique user count\n */\n getUniqueUserCount(): number {\n return this.userPresences.size + this.gracePeriodEntries.size;\n }\n}\n",
27
- "import type { ITransportAdapter } from '../../abstractions/TransportAdapter.js';\nimport type {\n ConnectionState,\n ConnectionOptions,\n Message,\n MessageHandler,\n ErrorHandler,\n CloseHandler\n} from '../../types/index.js';\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 private connectionAttempts: number = 0;\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 this.connectionAttempts++;\n\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, bypassConnectionCheck: boolean = false): void {\n if (!bypassConnectionCheck && 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\n getConnectionAttempts(): number {\n return this.connectionAttempts;\n }\n\n resetConnectionAttempts(): void {\n this.connectionAttempts = 0;\n }\n\n // Additional test helper methods for two-tier architecture testing\n /**\n * Simulate a client connection with authentication state\n * Note: This bypasses the connected state check for testing purposes\n */\n async simulateConnection(clientId: string, options: {\n authenticated?: boolean;\n userId?: string;\n metadata?: Record<string, unknown>;\n } = {}): Promise<void> {\n // Set transport to connected state if not already\n if (this.state !== 'connected') {\n this.state = 'connected';\n }\n\n const message = {\n id: `conn-${clientId}`,\n type: 'connection',\n payload: {\n clientId,\n authenticated: options.authenticated ?? false,\n userId: options.userId,\n metadata: options.metadata\n },\n timestamp: Date.now()\n };\n\n // Use simulateMessage with bypass flag\n this.simulateMessage(message, true);\n }\n\n /**\n * Simulate a client disconnection\n */\n async simulateDisconnect(clientId: string, reason: string = 'Normal closure'): Promise<void> {\n // Send a disconnect message to the server for this specific client\n const message = {\n id: `disconnect-${clientId}`,\n type: 'disconnect',\n payload: {\n clientId,\n reason\n },\n timestamp: Date.now()\n };\n\n this.simulateMessage(message, true);\n }\n\n /**\n * Simulate sending a message from a client to the server\n * Properly wraps the message with clientId in payload for server routing\n *\n * @param clientId - The client sending the message\n * @param messageType - The message type (e.g., 'join_room', 'leave_room', 'broadcast_event')\n * @param messagePayload - The message payload\n */\n async simulateClientMessage(\n clientId: string,\n messageType: string,\n messagePayload: Record<string, unknown> = {}\n ): Promise<void> {\n const message: Message = {\n id: `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n type: 'server_message',\n payload: {\n clientId,\n type: messageType,\n ...messagePayload\n },\n timestamp: Date.now()\n };\n\n this.simulateMessage(message, true);\n }\n\n /**\n * Get all messages sent to a specific client\n * This filters the message queue for messages addressed to the given client\n */\n getSentMessages(clientId: string): any[] {\n return this.messageQueue\n .filter(msg => {\n const payload = msg.payload as any;\n return payload?.clientId === clientId;\n })\n .map(msg => {\n const { clientId: _, ...rest } = msg.payload as any;\n return rest;\n });\n }\n\n /**\n * Simulate an incoming message from the server to the client\n * This is used in client tests to mock server responses\n * @param message - The message to send to the client\n */\n simulateIncomingMessage(message: any): void {\n // Ensure message has required Message fields\n const fullMessage: Message = {\n id: message.id || `msg-${Date.now()}`,\n type: message.type,\n payload: message.payload || {},\n timestamp: message.timestamp || Date.now()\n };\n\n this.messageHandlers.forEach(handler => handler(fullMessage));\n }\n}",
28
- "import type { IStorageAdapter, StorageOperation } from '../../abstractions/StorageAdapter.js';\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}",
29
- "import type { IAuthAdapter } from '../../abstractions/AuthAdapter.js';\nimport type { TokenPayload } from '../../types/index.js';\n\nexport class MockAuthAdapter implements IAuthAdapter {\n private tokens: Map<string, TokenPayload> = new Map();\n private revokedTokens: Set<string> = new Set();\n private simulateLatency: number = 0;\n private shouldFailAuth: boolean = false;\n private tokenCounter: number = 0;\n private currentToken: string | null = null;\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\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 getCurrentToken(): string | null {\n return this.currentToken;\n }\n\n isAuthRequired(): boolean {\n return false; // Mock adapter doesn't require auth by default\n }\n\n getAuthTimeout(): number {\n return 10000; // 10 seconds for testing\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 /**\n * Create and store a test token for a user\n */\n async createTestToken(userId: string, options?: {\n permissions?: string[];\n metadata?: Record<string, unknown>;\n expiresIn?: number;\n }): Promise<string> {\n const payload: TokenPayload = {\n userId,\n permissions: options?.permissions ?? ['read', 'write'],\n metadata: options?.metadata,\n expiresAt: options?.expiresIn ? Date.now() + options.expiresIn : undefined\n };\n const token = await this.generateToken(payload);\n this.currentToken = token;\n return token;\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 this.currentToken = null;\n }\n\n setFailAuth(fail: boolean): void {\n this.shouldFailAuth = fail;\n }\n\n setCurrentToken(token: string | null): void {\n this.currentToken = token;\n }\n}\n",
18
+ "import type { Lock, LockRequest, LockState } from \"../types/index.js\";\n\nexport abstract class LockManager {\n\tprotected lockState: LockState = {\n\t\tlocks: new Map(),\n\t\tqueue: new Map(),\n\t\tuserLocks: new Map(),\n\t};\n\n\tabstract acquireLock(\n\t\tuserId: string,\n\t\tusername: string,\n\t\trequest: LockRequest,\n\t): Promise<Lock>;\n\tabstract releaseLock(lockId: string): Promise<void>;\n\tabstract releaseUserLocks(userId: string): Promise<void>;\n\tabstract getLock(path: string): Promise<Lock | null>;\n\tabstract getUserLocks(userId: string): Promise<Lock[]>;\n\tabstract getAllLocks(): Promise<Lock[]>;\n\tabstract isLocked(path: string): Promise<boolean>;\n\tabstract getQueueLength(path: string): Promise<number>;\n\tabstract extendLock(lockId: string, ttl: number): Promise<Lock>;\n\tabstract addToQueue(\n\t\tuserId: string,\n\t\tusername: string,\n\t\trequest: LockRequest,\n\t): Promise<void>;\n\tabstract removeFromQueue(path: string, userId: string): Promise<void>;\n}\n",
19
+ "import type { Lock, LockQueueItem, LockRequest } from \"../types/index.js\";\nimport { LockManager } from \"./LockManager.js\";\n\nexport class DefaultLockManager extends LockManager {\n\tasync acquireLock(\n\t\tuserId: string,\n\t\tusername: string,\n\t\trequest: LockRequest,\n\t): Promise<Lock> {\n\t\tconst {\n\t\t\tpath,\n\t\t\ttype = \"file\",\n\t\t\tpriority = \"normal\",\n\t\t\tttl,\n\t\t\tbranch,\n\t\t\tmetadata,\n\t\t} = request;\n\n\t\t// Check if user already has a lock on this path\n\t\tconst userLocks = this.lockState.userLocks.get(userId) || new Set();\n\t\tif (userLocks.has(path)) {\n\t\t\tthrow new Error(`User ${username} already has a lock on ${path}`);\n\t\t}\n\n\t\t// Check if path is already locked\n\t\tconst existingLock = await this.getLock(path);\n\t\tif (existingLock) {\n\t\t\t// Add to queue\n\t\t\tawait this.addToQueue(userId, username, request);\n\t\t\tthrow new Error(\n\t\t\t\t`Path ${path} is already locked by ${existingLock.username}, added to queue`,\n\t\t\t);\n\t\t}\n\n\t\t// Generate lock ID\n\t\tconst lockId = this.generateId();\n\n\t\t// Create lock\n\t\tconst lock: Lock = {\n\t\t\tid: lockId,\n\t\t\ttype,\n\t\t\tpath,\n\t\t\tuserId,\n\t\t\tusername,\n\t\t\tacquiredAt: Date.now(),\n\t\t\texpiresAt: ttl ? Date.now() + ttl : undefined,\n\t\t\tpriority,\n\t\t\tbranch,\n\t\t\tmetadata,\n\t\t};\n\n\t\t// Store lock\n\t\tthis.lockState.locks.set(lockId, lock);\n\t\tthis.lockState.userLocks.set(userId, userLocks.add(path));\n\n\t\treturn lock;\n\t}\n\n\tasync releaseLock(lockId: string): Promise<void> {\n\t\tconst lock = this.lockState.locks.get(lockId);\n\t\tif (!lock) {\n\t\t\tthrow new Error(`Lock ${lockId} not found`);\n\t\t}\n\n\t\t// Remove from user locks\n\t\tconst userLocks = this.lockState.userLocks.get(lock.userId);\n\t\tif (userLocks) {\n\t\t\tuserLocks.delete(lock.path);\n\t\t\tif (userLocks.size === 0) {\n\t\t\t\tthis.lockState.userLocks.delete(lock.userId);\n\t\t\t}\n\t\t}\n\n\t\t// Remove lock\n\t\tthis.lockState.locks.delete(lockId);\n\n\t\t// Process queue for this path\n\t\tawait this.processQueue(lock.path);\n\t}\n\n\tasync releaseUserLocks(userId: string): Promise<void> {\n\t\tconst userLocks = this.lockState.userLocks.get(userId);\n\t\tif (!userLocks) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lockIds = Array.from(this.lockState.locks.entries())\n\t\t\t.filter(([, lock]) => lock.userId === userId)\n\t\t\t.map(([lockId]) => lockId);\n\n\t\tfor (const lockId of lockIds) {\n\t\t\tawait this.releaseLock(lockId);\n\t\t}\n\t}\n\n\tasync getLock(path: string): Promise<Lock | null> {\n\t\tfor (const lock of this.lockState.locks.values()) {\n\t\t\tif (lock.path === path) {\n\t\t\t\treturn lock;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tasync getUserLocks(userId: string): Promise<Lock[]> {\n\t\treturn Array.from(this.lockState.locks.values()).filter(\n\t\t\t(lock) => lock.userId === userId,\n\t\t);\n\t}\n\n\tasync getAllLocks(): Promise<Lock[]> {\n\t\treturn Array.from(this.lockState.locks.values());\n\t}\n\n\tasync isLocked(path: string): Promise<boolean> {\n\t\treturn (await this.getLock(path)) !== null;\n\t}\n\n\tasync getQueueLength(path: string): Promise<number> {\n\t\tconst queue = this.lockState.queue.get(path);\n\t\treturn queue ? queue.length : 0;\n\t}\n\n\tasync extendLock(lockId: string, ttl: number): Promise<Lock> {\n\t\tconst lock = this.lockState.locks.get(lockId);\n\t\tif (!lock) {\n\t\t\tthrow new Error(`Lock ${lockId} not found`);\n\t\t}\n\n\t\tlock.expiresAt = Date.now() + ttl;\n\t\treturn lock;\n\t}\n\n\tasync addToQueue(\n\t\tuserId: string,\n\t\tusername: string,\n\t\trequest: LockRequest,\n\t): Promise<void> {\n\t\tconst { path } = request;\n\t\tconst queue = this.lockState.queue.get(path) || [];\n\n\t\tconst queueItem: LockQueueItem = {\n\t\t\t...request,\n\t\t\tuserId,\n\t\t\tusername,\n\t\t\trequestedAt: Date.now(),\n\t\t\tresolve: () => {},\n\t\t\treject: () => {},\n\t\t};\n\n\t\tqueue.push(queueItem);\n\t\tthis.lockState.queue.set(path, queue);\n\t}\n\n\tasync removeFromQueue(path: string, userId: string): Promise<void> {\n\t\tconst queue = this.lockState.queue.get(path);\n\t\tif (!queue) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst index = queue.findIndex((item) => item.userId === userId);\n\t\tif (index !== -1) {\n\t\t\tqueue.splice(index, 1);\n\t\t\tif (queue.length === 0) {\n\t\t\t\tthis.lockState.queue.delete(path);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate generateId(): string {\n\t\treturn Math.random().toString(36).substring(2) + Date.now().toString(36);\n\t}\n\n\tprivate async processQueue(path: string): Promise<void> {\n\t\tconst queue = this.lockState.queue.get(path);\n\t\tif (!queue || queue.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Process first item in queue\n\t\tconst item = queue.shift()!;\n\t\tif (queue.length === 0) {\n\t\t\tthis.lockState.queue.delete(path);\n\t\t}\n\n\t\ttry {\n\t\t\tconst lock = await this.acquireLock(item.userId, item.username, {\n\t\t\t\tpath: item.path,\n\t\t\t\ttype: item.type,\n\t\t\t\tpriority: item.priority,\n\t\t\t\tttl: item.ttl,\n\t\t\t\tbranch: item.branch,\n\t\t\t\tmetadata: item.metadata,\n\t\t\t});\n\n\t\t\titem.resolve(lock);\n\t\t} catch (error) {\n\t\t\titem.reject(error as Error);\n\t\t}\n\t}\n}\n",
20
+ "/**\n * Presence Manager Abstract Class\n *\n * Manages global user presence tracking independent of room membership.\n * Supports multi-device connections, activity monitoring, and grace periods.\n */\n\nimport type {\n\tActivityUpdate,\n\tDeviceInfo,\n\tPresenceChangeEvent,\n\tPresenceConfig,\n\tPresenceStatus,\n\tUserPresence,\n} from \"../types/presence.js\";\n\n/**\n * Abstract class for managing user presence\n *\n * Implementations should handle:\n * - Multi-device tracking per user\n * - Activity/heartbeat monitoring\n * - Grace period for disconnects\n * - Presence state persistence (if needed)\n */\nexport abstract class PresenceManager {\n\tprotected config: Required<PresenceConfig>;\n\n\tconstructor(config?: PresenceConfig) {\n\t\t// Set defaults\n\t\tthis.config = {\n\t\t\tenabled: config?.enabled ?? false,\n\t\t\theartbeatInterval: config?.heartbeatInterval ?? 30000,\n\t\t\tawayThreshold: config?.awayThreshold ?? 2,\n\t\t\tdisconnectThreshold: config?.disconnectThreshold ?? 3,\n\t\t\tgracePeriod: config?.gracePeriod ?? 30000,\n\t\t\ttrackDeviceActivity: config?.trackDeviceActivity ?? true,\n\t\t\tbroadcastPresenceUpdates: config?.broadcastPresenceUpdates ?? true,\n\t\t};\n\t}\n\n\t/**\n\t * Register a new device connection for a user\n\t *\n\t * @param userId - User identifier\n\t * @param deviceId - Device/client identifier\n\t * @param deviceInfo - Optional device metadata\n\t * @returns The updated user presence\n\t */\n\tabstract connectDevice(\n\t\tuserId: string,\n\t\tdeviceId: string,\n\t\tdeviceInfo?: Partial<DeviceInfo>,\n\t): Promise<UserPresence>;\n\n\t/**\n\t * Unregister a device connection\n\t *\n\t * May trigger grace period if this is the user's last device.\n\t *\n\t * @param userId - User identifier\n\t * @param deviceId - Device/client identifier\n\t * @returns The updated user presence, or null if user is completely offline\n\t */\n\tabstract disconnectDevice(\n\t\tuserId: string,\n\t\tdeviceId: string,\n\t): Promise<UserPresence | null>;\n\n\t/**\n\t * Update activity timestamp for a device\n\t *\n\t * Used for heartbeats and activity tracking.\n\t *\n\t * @param update - Activity update information\n\t * @returns The updated user presence\n\t */\n\tabstract updateActivity(update: ActivityUpdate): Promise<UserPresence>;\n\n\t/**\n\t * Get presence state for a user\n\t *\n\t * @param userId - User identifier\n\t * @returns User presence, or null if not found\n\t */\n\tabstract getUserPresence(userId: string): Promise<UserPresence | null>;\n\n\t/**\n\t * Get presence state for multiple users\n\t *\n\t * @param userIds - Array of user identifiers\n\t * @returns Map of userId to UserPresence\n\t */\n\tabstract getUsersPresence(\n\t\tuserIds: string[],\n\t): Promise<Map<string, UserPresence>>;\n\n\t/**\n\t * Get all online users\n\t *\n\t * @returns Array of user presences with status 'online'\n\t */\n\tabstract getOnlineUsers(): Promise<UserPresence[]>;\n\n\t/**\n\t * Get all devices for a user\n\t *\n\t * @param userId - User identifier\n\t * @returns Array of device info\n\t */\n\tabstract getUserDevices(userId: string): Promise<DeviceInfo[]>;\n\n\t/**\n\t * Manually set user status\n\t *\n\t * @param userId - User identifier\n\t * @param status - New presence status\n\t * @returns The updated user presence\n\t */\n\tabstract setUserStatus(\n\t\tuserId: string,\n\t\tstatus: PresenceStatus,\n\t): Promise<UserPresence>;\n\n\t/**\n\t * Check for stale connections and update presence accordingly\n\t *\n\t * This should be called periodically to:\n\t * - Mark idle devices as 'away'\n\t * - Disconnect devices that haven't sent heartbeats\n\t * - Expire grace periods\n\t *\n\t * @returns Array of presence change events\n\t */\n\tabstract processHeartbeats(): Promise<PresenceChangeEvent[]>;\n\n\t/**\n\t * Clear all presence data\n\t *\n\t * Useful for testing and cleanup.\n\t */\n\tabstract clear(): Promise<void>;\n\n\t/**\n\t * Get configuration\n\t */\n\tgetConfig(): Readonly<Required<PresenceConfig>> {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Check if presence tracking is enabled\n\t */\n\tisEnabled(): boolean {\n\t\treturn this.config.enabled;\n\t}\n\n\t/**\n\t * Calculate presence status based on device states\n\t *\n\t * Helper method for implementations to determine overall user status.\n\t *\n\t * @param devices - Map of devices for a user\n\t * @param now - Current timestamp\n\t * @returns Calculated presence status\n\t */\n\tprotected calculatePresenceStatus(\n\t\tdevices: Map<string, DeviceInfo>,\n\t\tnow: number = Date.now(),\n\t): PresenceStatus {\n\t\tif (devices.size === 0) {\n\t\t\treturn \"offline\";\n\t\t}\n\n\t\tconst heartbeatTimeout =\n\t\t\tthis.config.heartbeatInterval * this.config.awayThreshold;\n\n\t\t// Check if ANY device is active (within heartbeat threshold)\n\t\tfor (const device of devices.values()) {\n\t\t\tconst timeSinceActivity = now - device.lastActivity;\n\t\t\tif (timeSinceActivity < heartbeatTimeout) {\n\t\t\t\treturn \"online\";\n\t\t\t}\n\t\t}\n\n\t\t// All devices are idle\n\t\treturn \"away\";\n\t}\n\n\t/**\n\t * Check if a device should be disconnected due to missed heartbeats\n\t *\n\t * @param device - Device info\n\t * @param now - Current timestamp\n\t * @returns true if device should be disconnected\n\t */\n\tprotected shouldDisconnectDevice(\n\t\tdevice: DeviceInfo,\n\t\tnow: number = Date.now(),\n\t): boolean {\n\t\tconst timeout =\n\t\t\tthis.config.heartbeatInterval * this.config.disconnectThreshold;\n\t\treturn now - device.lastActivity > timeout;\n\t}\n}\n",
21
+ "/**\n * Default In-Memory Presence Manager\n *\n * Reference implementation of PresenceManager using in-memory storage.\n * Suitable for single-server deployments and development.\n *\n * For multi-server deployments, implement a custom PresenceManager\n * backed by Redis or another shared data store.\n */\n\nimport type { BaseServer } from \"../server/BaseServer.js\";\nimport type {\n\tActivityUpdate,\n\tDeviceInfo,\n\tPresenceChangeEvent,\n\tPresenceConfig,\n\tPresenceStatus,\n\tUserPresence,\n} from \"../types/presence.js\";\nimport type {\n\tExtendedUserPresence,\n\tPresenceExtension,\n} from \"./PresenceExtension.js\";\nimport { PresenceManager } from \"./PresenceManager.js\";\n\n/**\n * Grace period entry for tracking disconnected users\n */\ninterface GracePeriodEntry {\n\tuserId: string;\n\tdisconnectedAt: number;\n\tpreviousPresence: UserPresence;\n}\n\nexport class DefaultPresenceManager<\n\tTExtendedData = Record<string, unknown>,\n> extends PresenceManager {\n\tprivate userPresences = new Map<string, UserPresence>();\n\tprivate deviceToUser = new Map<string, string>();\n\tprivate gracePeriodEntries = new Map<string, GracePeriodEntry>();\n\tprivate extensions: PresenceExtension<TExtendedData>[] = [];\n\tprivate server?: BaseServer;\n\n\tconstructor(\n\t\tconfig?: PresenceConfig & {\n\t\t\textensions?: PresenceExtension<TExtendedData>[];\n\t\t},\n\t) {\n\t\tsuper(config);\n\t\tthis.extensions = config?.extensions || [];\n\t}\n\n\t/**\n\t * Set server reference for auto-broadcasting\n\t *\n\t * This is called automatically by ServerBuilder.\n\t * @internal\n\t */\n\tsetServer(server: BaseServer): void {\n\t\tthis.server = server;\n\t}\n\n\t/**\n\t * Initialize all extensions\n\t * @internal\n\t */\n\tasync initializeExtensions(): Promise<void> {\n\t\tfor (const ext of this.extensions) {\n\t\t\tawait ext.initialize?.();\n\t\t}\n\t}\n\n\t/**\n\t * Destroy all extensions\n\t * @internal\n\t */\n\tasync destroyExtensions(): Promise<void> {\n\t\tfor (const ext of this.extensions) {\n\t\t\tawait ext.destroy?.();\n\t\t}\n\t}\n\n\tasync connectDevice(\n\t\tuserId: string,\n\t\tdeviceId: string,\n\t\tdeviceInfo?: Partial<DeviceInfo>,\n\t): Promise<UserPresence> {\n\t\tconst now = Date.now();\n\t\tconst isFirstDevice =\n\t\t\t!this.userPresences.has(userId) && !this.gracePeriodEntries.has(userId);\n\n\t\t// Check if user is in grace period (reconnecting)\n\t\tconst gracePeriodEntry = this.gracePeriodEntries.get(userId);\n\t\tif (gracePeriodEntry) {\n\t\t\t// Restore from grace period\n\t\t\tthis.gracePeriodEntries.delete(userId);\n\t\t\tconst presence = gracePeriodEntry.previousPresence;\n\n\t\t\t// Add the new device\n\t\t\tconst device: DeviceInfo = {\n\t\t\t\tdeviceId,\n\t\t\t\ttype: deviceInfo?.type,\n\t\t\t\tconnectedAt: now,\n\t\t\t\tlastActivity: now,\n\t\t\t\tmetadata: deviceInfo?.metadata,\n\t\t\t};\n\n\t\t\tpresence.devices.set(deviceId, device);\n\t\t\tpresence.status = \"online\";\n\t\t\tpresence.lastActivity = now;\n\n\t\t\tthis.userPresences.set(userId, presence);\n\t\t\tthis.deviceToUser.set(deviceId, userId);\n\n\t\t\t// Call extension hooks\n\t\t\tif (isFirstDevice) {\n\t\t\t\tfor (const ext of this.extensions) {\n\t\t\t\t\tawait ext.onUserOnline?.(\n\t\t\t\t\t\tuserId,\n\t\t\t\t\t\tdeviceId,\n\t\t\t\t\t\tdeviceInfo?.metadata || {},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const ext of this.extensions) {\n\t\t\t\t\tawait ext.onDeviceConnected?.(\n\t\t\t\t\t\tuserId,\n\t\t\t\t\t\tdeviceId,\n\t\t\t\t\t\tdeviceInfo?.metadata || {},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Auto-broadcast\n\t\t\tif (this.config.broadcastPresenceUpdates && this.server) {\n\t\t\t\tconst experimental = (this.server as any).experimental;\n\t\t\t\tawait experimental?.broadcastAuthenticated({\n\t\t\t\t\ttype: \"presence:user_online\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tuserId,\n\t\t\t\t\t\tdeviceId,\n\t\t\t\t\t\tstatus: \"online\",\n\t\t\t\t\t\ttimestamp: now,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn presence;\n\t\t}\n\n\t\t// Get or create user presence\n\t\tlet presence = this.userPresences.get(userId);\n\t\tconst wasOnline = presence !== undefined;\n\n\t\tif (!presence) {\n\t\t\t// New user\n\t\t\tpresence = {\n\t\t\t\tuserId,\n\t\t\t\tstatus: \"online\",\n\t\t\t\tdevices: new Map(),\n\t\t\t\tfirstConnectedAt: now,\n\t\t\t\tlastActivity: now,\n\t\t\t\tmetadata: {},\n\t\t\t};\n\t\t\tthis.userPresences.set(userId, presence);\n\t\t}\n\n\t\t// Add device\n\t\tconst device: DeviceInfo = {\n\t\t\tdeviceId,\n\t\t\ttype: deviceInfo?.type,\n\t\t\tconnectedAt: now,\n\t\t\tlastActivity: now,\n\t\t\tmetadata: deviceInfo?.metadata,\n\t\t};\n\n\t\tpresence.devices.set(deviceId, device);\n\t\tpresence.status = this.calculatePresenceStatus(presence.devices, now);\n\t\tpresence.lastActivity = now;\n\n\t\tthis.deviceToUser.set(deviceId, userId);\n\n\t\t// Call extension hooks\n\t\tif (!wasOnline) {\n\t\t\tfor (const ext of this.extensions) {\n\t\t\t\tawait ext.onUserOnline?.(userId, deviceId, deviceInfo?.metadata || {});\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const ext of this.extensions) {\n\t\t\t\tawait ext.onDeviceConnected?.(\n\t\t\t\t\tuserId,\n\t\t\t\t\tdeviceId,\n\t\t\t\t\tdeviceInfo?.metadata || {},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Auto-broadcast if user came online\n\t\tif (!wasOnline && this.config.broadcastPresenceUpdates && this.server) {\n\t\t\tconst experimental = (this.server as any).experimental;\n\t\t\tawait experimental?.broadcastAuthenticated({\n\t\t\t\ttype: \"presence:user_online\",\n\t\t\t\tpayload: {\n\t\t\t\t\tuserId,\n\t\t\t\t\tdeviceId,\n\t\t\t\t\tstatus: \"online\",\n\t\t\t\t\ttimestamp: now,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\treturn presence;\n\t}\n\n\tasync disconnectDevice(\n\t\tuserId: string,\n\t\tdeviceId: string,\n\t): Promise<UserPresence | null> {\n\t\tconst presence = this.userPresences.get(userId);\n\t\tif (!presence) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Remove device\n\t\tpresence.devices.delete(deviceId);\n\t\tthis.deviceToUser.delete(deviceId);\n\n\t\tconst now = Date.now();\n\t\tconst isLastDevice = presence.devices.size === 0;\n\n\t\t// If no devices left, start grace period\n\t\tif (isLastDevice) {\n\t\t\t// Call extension hooks for user going offline\n\t\t\tfor (const ext of this.extensions) {\n\t\t\t\tawait ext.onUserOffline?.(userId, deviceId);\n\t\t\t}\n\n\t\t\t// Auto-broadcast user offline\n\t\t\tif (this.config.broadcastPresenceUpdates && this.server) {\n\t\t\t\tconst experimental = (this.server as any).experimental;\n\t\t\t\tawait experimental?.broadcastAuthenticated({\n\t\t\t\t\ttype: \"presence:user_offline\",\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tuserId,\n\t\t\t\t\t\tdeviceId,\n\t\t\t\t\t\tstatus: \"offline\",\n\t\t\t\t\t\ttimestamp: now,\n\t\t\t\t\t\tgracePeriod: this.config.gracePeriod,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this.config.gracePeriod > 0) {\n\t\t\t\t// Move to grace period\n\t\t\t\tthis.gracePeriodEntries.set(userId, {\n\t\t\t\t\tuserId,\n\t\t\t\t\tdisconnectedAt: now,\n\t\t\t\t\tpreviousPresence: presence,\n\t\t\t\t});\n\t\t\t\tthis.userPresences.delete(userId);\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\t// No grace period, remove completely\n\t\t\t\tthis.userPresences.delete(userId);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// Still has devices - call device disconnected hook\n\t\tfor (const ext of this.extensions) {\n\t\t\tawait ext.onDeviceDisconnected?.(userId, deviceId);\n\t\t}\n\n\t\t// Still has devices, update status\n\t\tpresence.status = this.calculatePresenceStatus(presence.devices, now);\n\n\t\t// Update lastActivity to most recent device activity\n\t\tlet mostRecentActivity = 0;\n\t\tfor (const device of presence.devices.values()) {\n\t\t\tif (device.lastActivity > mostRecentActivity) {\n\t\t\t\tmostRecentActivity = device.lastActivity;\n\t\t\t}\n\t\t}\n\t\tpresence.lastActivity = mostRecentActivity;\n\n\t\treturn presence;\n\t}\n\n\tasync updateActivity(update: ActivityUpdate): Promise<UserPresence> {\n\t\tconst { userId, deviceId, timestamp, activityType } = update;\n\n\t\tconst presence = this.userPresences.get(userId);\n\t\tif (!presence) {\n\t\t\tthrow new Error(`User ${userId} not found in presence system`);\n\t\t}\n\n\t\tconst device = presence.devices.get(deviceId);\n\t\tif (!device) {\n\t\t\tthrow new Error(`Device ${deviceId} not found for user ${userId}`);\n\t\t}\n\n\t\t// Update device activity\n\t\tdevice.lastActivity = timestamp;\n\n\t\t// Update user activity\n\t\tif (timestamp > presence.lastActivity) {\n\t\t\tpresence.lastActivity = timestamp;\n\t\t}\n\n\t\t// Recalculate status\n\t\tconst previousStatus = presence.status;\n\t\tpresence.status = this.calculatePresenceStatus(presence.devices, timestamp);\n\n\t\t// Call extension hooks\n\t\tfor (const ext of this.extensions) {\n\t\t\tawait ext.onActivity?.(userId, deviceId, activityType || \"heartbeat\");\n\t\t}\n\n\t\treturn presence;\n\t}\n\n\tasync getUserPresence(\n\t\tuserId: string,\n\t): Promise<ExtendedUserPresence<TExtendedData> | null> {\n\t\tconst basePresence = this.userPresences.get(userId);\n\t\tif (!basePresence) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Merge extended data from all extensions\n\t\tif (this.extensions.length > 0) {\n\t\t\tconst extendedData: Record<string, unknown> = {};\n\t\t\tfor (const ext of this.extensions) {\n\t\t\t\tconst data = await ext.getExtendedData?.(userId);\n\t\t\t\tif (data) {\n\t\t\t\t\tObject.assign(extendedData, data);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...basePresence,\n\t\t\t\textended: extendedData as TExtendedData,\n\t\t\t};\n\t\t}\n\n\t\treturn basePresence;\n\t}\n\n\tasync getUsersPresence(\n\t\tuserIds: string[],\n\t): Promise<Map<string, UserPresence>> {\n\t\tconst result = new Map<string, UserPresence>();\n\n\t\tfor (const userId of userIds) {\n\t\t\tconst presence = this.userPresences.get(userId);\n\t\t\tif (presence) {\n\t\t\t\tresult.set(userId, presence);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tasync getOnlineUsers(): Promise<ExtendedUserPresence<TExtendedData>[]> {\n\t\tconst online: ExtendedUserPresence<TExtendedData>[] = [];\n\n\t\tfor (const presence of this.userPresences.values()) {\n\t\t\tif (presence.status === \"online\") {\n\t\t\t\t// Check visibility with extensions\n\t\t\t\tlet visible = true;\n\t\t\t\tfor (const ext of this.extensions) {\n\t\t\t\t\tconst shouldShow = await ext.shouldBeVisible?.(presence.userId);\n\t\t\t\t\tif (shouldShow === false) {\n\t\t\t\t\t\tvisible = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (visible) {\n\t\t\t\t\t// Get full presence with extended data\n\t\t\t\t\tconst fullPresence = await this.getUserPresence(presence.userId);\n\t\t\t\t\tif (fullPresence) {\n\t\t\t\t\t\tonline.push(fullPresence);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn online;\n\t}\n\n\tasync getUserDevices(userId: string): Promise<DeviceInfo[]> {\n\t\tconst presence = this.userPresences.get(userId);\n\t\tif (!presence) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn Array.from(presence.devices.values());\n\t}\n\n\tasync setUserStatus(\n\t\tuserId: string,\n\t\tstatus: PresenceStatus,\n\t): Promise<UserPresence> {\n\t\tconst presence = this.userPresences.get(userId);\n\t\tif (!presence) {\n\t\t\tthrow new Error(`User ${userId} not found in presence system`);\n\t\t}\n\n\t\tpresence.status = status;\n\t\treturn presence;\n\t}\n\n\tasync processHeartbeats(): Promise<PresenceChangeEvent[]> {\n\t\tconst now = Date.now();\n\t\tconst changes: PresenceChangeEvent[] = [];\n\n\t\t// Process active presences\n\t\tfor (const [userId, presence] of this.userPresences.entries()) {\n\t\t\tconst devicesToRemove: string[] = [];\n\n\t\t\t// Check each device for timeout\n\t\t\tfor (const [deviceId, device] of presence.devices.entries()) {\n\t\t\t\tif (this.shouldDisconnectDevice(device, now)) {\n\t\t\t\t\tdevicesToRemove.push(deviceId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove timed-out devices\n\t\t\tfor (const deviceId of devicesToRemove) {\n\t\t\t\tpresence.devices.delete(deviceId);\n\t\t\t\tthis.deviceToUser.delete(deviceId);\n\t\t\t}\n\n\t\t\t// Update status after removing devices\n\t\t\tconst previousStatus = presence.status;\n\t\t\tconst newStatus = this.calculatePresenceStatus(presence.devices, now);\n\n\t\t\tif (newStatus !== previousStatus) {\n\t\t\t\tpresence.status = newStatus;\n\t\t\t\tchanges.push({\n\t\t\t\t\tuserId,\n\t\t\t\t\tpreviousStatus,\n\t\t\t\t\tstatus: newStatus,\n\t\t\t\t\ttimestamp: now,\n\t\t\t\t\treason: \"heartbeat_timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If no devices left, move to grace period\n\t\t\tif (presence.devices.size === 0) {\n\t\t\t\tif (this.config.gracePeriod > 0) {\n\t\t\t\t\tthis.gracePeriodEntries.set(userId, {\n\t\t\t\t\t\tuserId,\n\t\t\t\t\t\tdisconnectedAt: now,\n\t\t\t\t\t\tpreviousPresence: presence,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.userPresences.delete(userId);\n\t\t\t}\n\t\t}\n\n\t\t// Process grace period expirations\n\t\tconst expiredGracePeriods: string[] = [];\n\n\t\tfor (const [userId, entry] of this.gracePeriodEntries.entries()) {\n\t\t\tconst gracePeriodElapsed = now - entry.disconnectedAt;\n\n\t\t\tif (gracePeriodElapsed > this.config.gracePeriod) {\n\t\t\t\texpiredGracePeriods.push(userId);\n\n\t\t\t\tchanges.push({\n\t\t\t\t\tuserId,\n\t\t\t\t\tpreviousStatus: entry.previousPresence.status,\n\t\t\t\t\tstatus: \"offline\",\n\t\t\t\t\ttimestamp: now,\n\t\t\t\t\treason: \"grace_period_expired\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Remove expired grace period entries\n\t\tfor (const userId of expiredGracePeriods) {\n\t\t\tthis.gracePeriodEntries.delete(userId);\n\t\t}\n\n\t\treturn changes;\n\t}\n\n\tasync clear(): Promise<void> {\n\t\t// Destroy extensions first\n\t\tawait this.destroyExtensions();\n\n\t\tthis.userPresences.clear();\n\t\tthis.deviceToUser.clear();\n\t\tthis.gracePeriodEntries.clear();\n\t}\n\n\t/**\n\t * Get count of users in grace period (useful for monitoring)\n\t */\n\tgetGracePeriodCount(): number {\n\t\treturn this.gracePeriodEntries.size;\n\t}\n\n\t/**\n\t * Get total connected device count\n\t */\n\tgetConnectedDeviceCount(): number {\n\t\treturn this.deviceToUser.size;\n\t}\n\n\t/**\n\t * Get total unique user count\n\t */\n\tgetUniqueUserCount(): number {\n\t\treturn this.userPresences.size + this.gracePeriodEntries.size;\n\t}\n}\n",
22
+ "import type {\n\tEvent,\n\tRoom,\n\tRoomConfig,\n\tRoomState,\n\tRoomUser,\n} from \"../types/index.js\";\n\nexport abstract class RoomManager {\n\tprotected rooms = new Map<string, RoomState>();\n\n\tabstract createRoom(id: string, config: RoomConfig): Promise<Room>;\n\tabstract deleteRoom(id: string): Promise<void>;\n\tabstract joinRoom(roomId: string, user: RoomUser): Promise<void>;\n\tabstract leaveRoom(roomId: string, userId: string): Promise<void>;\n\tabstract broadcastToRoom(\n\t\troomId: string,\n\t\tevent: Event,\n\t\texcludeUserId?: string,\n\t): Promise<void>;\n\tabstract getRoomState(roomId: string): Promise<RoomState | null>;\n\tabstract getUsersInRoom(roomId: string): Promise<RoomUser[]>;\n\tabstract addEventToHistory(roomId: string, event: Event): Promise<void>;\n\tabstract getEventHistory(roomId: string, limit?: number): Promise<Event[]>;\n\tabstract updateUserStatus(\n\t\troomId: string,\n\t\tuserId: string,\n\t\tstatus: RoomUser[\"status\"],\n\t): Promise<void>;\n}\n",
23
+ "import type {\n\tEvent,\n\tRoom,\n\tRoomConfig,\n\tRoomState,\n\tRoomUser,\n} from \"../types/index.js\";\nimport { RoomManager } from \"./RoomManager.js\";\n\nexport class DefaultRoomManager extends RoomManager {\n\tasync createRoom(id: string, config: RoomConfig): Promise<Room> {\n\t\tconst room: Room = {\n\t\t\tid,\n\t\t\tname: config.name || id,\n\t\t\tcreatedAt: Date.now(),\n\t\t\tmaxUsers: config.maxUsers,\n\t\t\tmaxHistory: config.maxHistory,\n\t\t\tpermissions: config.permissions,\n\t\t\tmetadata: config.metadata || {},\n\t\t};\n\n\t\tconst roomState: RoomState = {\n\t\t\troom,\n\t\t\tusers: new Map(),\n\t\t\teventHistory: [],\n\t\t\tlocks: new Map(),\n\t\t};\n\n\t\tthis.rooms.set(id, roomState);\n\t\treturn room;\n\t}\n\n\tasync deleteRoom(id: string): Promise<void> {\n\t\tthis.rooms.delete(id);\n\t}\n\n\tasync joinRoom(roomId: string, user: RoomUser): Promise<void> {\n\t\tconst roomState = this.rooms.get(roomId);\n\t\tif (!roomState) {\n\t\t\tthrow new Error(`Room ${roomId} not found`);\n\t\t}\n\n\t\tif (\n\t\t\troomState.room.maxUsers &&\n\t\t\troomState.users.size >= roomState.room.maxUsers\n\t\t) {\n\t\t\tthrow new Error(`Room ${roomId} is full`);\n\t\t}\n\n\t\troomState.users.set(user.id, user);\n\t}\n\n\tasync leaveRoom(roomId: string, userId: string): Promise<void> {\n\t\tconst roomState = this.rooms.get(roomId);\n\t\tif (!roomState) {\n\t\t\treturn; // Room doesn't exist, nothing to do\n\t\t}\n\n\t\troomState.users.delete(userId);\n\t}\n\n\tasync broadcastToRoom(\n\t\troomId: string,\n\t\tevent: Event,\n\t\t_excludeUserId?: string,\n\t): Promise<void> {\n\t\tconst roomState = this.rooms.get(roomId);\n\t\tif (!roomState) {\n\t\t\tthrow new Error(`Room ${roomId} not found`);\n\t\t}\n\n\t\t// In a real implementation, this would broadcast to connected clients\n\t\t// For now, we'll just store the event in history\n\t\tawait this.addEventToHistory(roomId, event);\n\t}\n\n\tasync getRoomState(roomId: string): Promise<RoomState | null> {\n\t\treturn this.rooms.get(roomId) || null;\n\t}\n\n\tasync getUsersInRoom(roomId: string): Promise<RoomUser[]> {\n\t\tconst roomState = this.rooms.get(roomId);\n\t\tif (!roomState) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn Array.from(roomState.users.values());\n\t}\n\n\tasync addEventToHistory(roomId: string, event: Event): Promise<void> {\n\t\tconst roomState = this.rooms.get(roomId);\n\t\tif (!roomState) {\n\t\t\tthrow new Error(`Room ${roomId} not found`);\n\t\t}\n\n\t\troomState.eventHistory.push(event);\n\n\t\t// Trim history if needed\n\t\tif (\n\t\t\troomState.room.maxHistory &&\n\t\t\troomState.eventHistory.length > roomState.room.maxHistory\n\t\t) {\n\t\t\troomState.eventHistory = roomState.eventHistory.slice(\n\t\t\t\t-roomState.room.maxHistory,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync getEventHistory(roomId: string, limit?: number): Promise<Event[]> {\n\t\tconst roomState = this.rooms.get(roomId);\n\t\tif (!roomState) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst history = roomState.eventHistory;\n\t\treturn limit ? history.slice(-limit) : history;\n\t}\n\n\tasync updateUserStatus(\n\t\troomId: string,\n\t\tuserId: string,\n\t\tstatus: RoomUser[\"status\"],\n\t): Promise<void> {\n\t\tconst roomState = this.rooms.get(roomId);\n\t\tif (!roomState) {\n\t\t\tthrow new Error(`Room ${roomId} not found`);\n\t\t}\n\n\t\tconst user = roomState.users.get(userId);\n\t\tif (user) {\n\t\t\tuser.status = status;\n\t\t\tuser.lastActivity = Date.now();\n\t\t}\n\t}\n}\n",
24
+ "// 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\t// Use unknown type for storage, will be cast appropriately when called\n\tprivate listeners = new Map<keyof TEvents, Set<EventListener<EventData>>>();\n\tprivate onceListeners = new Map<\n\t\tkeyof TEvents,\n\t\tSet<EventListener<EventData>>\n\t>();\n\n\ton<K extends keyof TEvents>(\n\t\tevent: K,\n\t\tlistener: EventListener<TEvents[K]>,\n\t): UnsubscribeFn {\n\t\tif (!this.listeners.has(event)) {\n\t\t\tthis.listeners.set(event, new Set());\n\t\t}\n\t\tthis.listeners.get(event)!.add(listener as EventListener<EventData>);\n\n\t\treturn () => this.off(event, listener);\n\t}\n\n\tonce<K extends keyof TEvents>(\n\t\tevent: K,\n\t\tlistener: EventListener<TEvents[K]>,\n\t): UnsubscribeFn {\n\t\tif (!this.onceListeners.has(event)) {\n\t\t\tthis.onceListeners.set(event, new Set());\n\t\t}\n\t\tthis.onceListeners.get(event)!.add(listener as EventListener<EventData>);\n\n\t\treturn () => this.off(event, listener);\n\t}\n\n\toff<K extends keyof TEvents>(\n\t\tevent: K,\n\t\tlistener: EventListener<TEvents[K]>,\n\t): void {\n\t\tthis.listeners.get(event)?.delete(listener as EventListener<EventData>);\n\t\tthis.onceListeners.get(event)?.delete(listener as EventListener<EventData>);\n\t}\n\n\tasync emit<K extends keyof TEvents>(\n\t\tevent: K,\n\t\tdata: TEvents[K],\n\t): Promise<void> {\n\t\tconst listeners = this.listeners.get(event);\n\t\tconst onceListeners = this.onceListeners.get(event);\n\n\t\tif (onceListeners) {\n\t\t\tconst listenersToCall = Array.from(onceListeners);\n\t\t\tthis.onceListeners.delete(event);\n\t\t\tfor (const listener of listenersToCall) {\n\t\t\t\tawait listener(data);\n\t\t\t}\n\t\t}\n\n\t\tif (listeners) {\n\t\t\tfor (const listener of Array.from(listeners)) {\n\t\t\t\tawait listener(data);\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveAllListeners(event?: keyof TEvents): void {\n\t\tif (event) {\n\t\t\tthis.listeners.delete(event);\n\t\t\tthis.onceListeners.delete(event);\n\t\t} else {\n\t\t\tthis.listeners.clear();\n\t\t\tthis.onceListeners.clear();\n\t\t}\n\t}\n\n\tlistenerCount(event: keyof TEvents): number {\n\t\tconst regular = this.listeners.get(event)?.size ?? 0;\n\t\tconst once = this.onceListeners.get(event)?.size ?? 0;\n\t\treturn regular + once;\n\t}\n}\n",
25
+ "import type { IAuthAdapter } from \"../../abstractions/AuthAdapter.js\";\nimport type { TokenPayload } from \"../../types/index.js\";\n\nexport class MockAuthAdapter implements IAuthAdapter {\n\tprivate tokens: Map<string, TokenPayload> = new Map();\n\tprivate revokedTokens: Set<string> = new Set();\n\tprivate simulateLatency: number = 0;\n\tprivate shouldFailAuth: boolean = false;\n\tprivate tokenCounter: number = 0;\n\tprivate currentToken: string | null = null;\n\n\tconstructor(options?: {\n\t\tsimulateLatency?: number;\n\t\tshouldFailAuth?: boolean;\n\t}) {\n\t\tthis.simulateLatency = options?.simulateLatency ?? 0;\n\t\tthis.shouldFailAuth = options?.shouldFailAuth ?? false;\n\t}\n\n\tasync validateToken(token: string): Promise<TokenPayload> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailAuth) {\n\t\t\tthrow new Error(\"Mock auth validation failed\");\n\t\t}\n\n\t\tif (this.revokedTokens.has(token)) {\n\t\t\tthrow new Error(\"Token has been revoked\");\n\t\t}\n\n\t\tconst payload = this.tokens.get(token);\n\t\tif (!payload) {\n\t\t\tthrow new Error(\"Invalid token\");\n\t\t}\n\n\t\t// Check expiration\n\t\tif (payload.expiresAt && payload.expiresAt < Date.now()) {\n\t\t\tthis.tokens.delete(token);\n\t\t\tthrow new Error(\"Token expired\");\n\t\t}\n\n\t\treturn payload;\n\t}\n\n\tasync generateToken(payload: TokenPayload): Promise<string> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailAuth) {\n\t\t\tthrow new Error(\"Mock token generation failed\");\n\t\t}\n\n\t\tconst token = `mock-token-${++this.tokenCounter}`;\n\n\t\t// Set default expiration to 1 hour if not specified\n\t\tconst expiresAt = payload.expiresAt ?? Date.now() + 3600000;\n\n\t\tthis.tokens.set(token, { ...payload, expiresAt });\n\t\treturn token;\n\t}\n\n\tasync refreshToken(token: string): Promise<string> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailAuth) {\n\t\t\tthrow new Error(\"Mock token refresh failed\");\n\t\t}\n\n\t\tconst payload = await this.validateToken(token);\n\n\t\t// Revoke old token\n\t\tawait this.revokeToken(token);\n\n\t\t// Generate new token with extended expiration\n\t\tconst newPayload = {\n\t\t\t...payload,\n\t\t\texpiresAt: Date.now() + 3600000, // 1 hour from now\n\t\t};\n\n\t\treturn this.generateToken(newPayload);\n\t}\n\n\tasync revokeToken(token: string): Promise<void> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailAuth) {\n\t\t\tthrow new Error(\"Mock token revocation failed\");\n\t\t}\n\n\t\tthis.tokens.delete(token);\n\t\tthis.revokedTokens.add(token);\n\t}\n\n\tgetCurrentToken(): string | null {\n\t\treturn this.currentToken;\n\t}\n\n\tisAuthRequired(): boolean {\n\t\treturn false; // Mock adapter doesn't require auth by default\n\t}\n\n\tgetAuthTimeout(): number {\n\t\treturn 10000; // 10 seconds for testing\n\t}\n\n\t// Test helper methods\n\tprivate async simulateDelay(): Promise<void> {\n\t\tif (this.simulateLatency > 0) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, this.simulateLatency));\n\t\t}\n\t}\n\n\t/**\n\t * Create and store a test token for a user\n\t */\n\tasync createTestToken(\n\t\tuserId: string,\n\t\toptions?: {\n\t\t\tpermissions?: string[];\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t\texpiresIn?: number;\n\t\t},\n\t): Promise<string> {\n\t\tconst payload: TokenPayload = {\n\t\t\tuserId,\n\t\t\tpermissions: options?.permissions ?? [\"read\", \"write\"],\n\t\t\tmetadata: options?.metadata,\n\t\t\texpiresAt: options?.expiresIn\n\t\t\t\t? Date.now() + options.expiresIn\n\t\t\t\t: undefined,\n\t\t};\n\t\tconst token = await this.generateToken(payload);\n\t\tthis.currentToken = token;\n\t\treturn token;\n\t}\n\n\tgetTokenCount(): number {\n\t\treturn this.tokens.size;\n\t}\n\n\tgetRevokedTokenCount(): number {\n\t\treturn this.revokedTokens.size;\n\t}\n\n\tclearTokens(): void {\n\t\tthis.tokens.clear();\n\t\tthis.revokedTokens.clear();\n\t\tthis.currentToken = null;\n\t}\n\n\tsetFailAuth(fail: boolean): void {\n\t\tthis.shouldFailAuth = fail;\n\t}\n\n\tsetCurrentToken(token: string | null): void {\n\t\tthis.currentToken = token;\n\t}\n}\n",
26
+ "/**\n * Mock RTCDataChannel for simulation testing\n *\n * Simulates WebRTC data channel behavior without actual network I/O.\n * Supports linking two channels for bidirectional message passing.\n */\n\nexport type RTCDataChannelState = \"connecting\" | \"open\" | \"closing\" | \"closed\";\n\nexport interface MockRTCDataChannelConfig {\n\t/**\n\t * Simulated message delivery latency (ms)\n\t * @default 1\n\t */\n\tsimulateLatency?: number;\n\n\t/**\n\t * Maximum message size in bytes\n\t * @default 262144 (256 KB)\n\t */\n\tmaxMessageSize?: number;\n}\n\nexport class MockRTCDataChannel {\n\tpublic readonly label: string;\n\tpublic readonly ordered: boolean;\n\tpublic readonly id: number;\n\n\tprivate _readyState: RTCDataChannelState = \"connecting\";\n\tprivate _bufferedAmount = 0;\n\tprivate _linkedChannel: MockRTCDataChannel | null = null;\n\tprivate messageQueue: Array<string | ArrayBuffer> = [];\n\tprivate config: Required<MockRTCDataChannelConfig>;\n\tprivate static channelIdCounter = 0;\n\n\t// Event handlers\n\tpublic onopen: (() => void) | null = null;\n\tpublic onclose: (() => void) | null = null;\n\tpublic onerror: ((event: { error: Error }) => void) | null = null;\n\tpublic onmessage: ((event: { data: string | ArrayBuffer }) => void) | null =\n\t\tnull;\n\tpublic onbufferedamountlow: (() => void) | null = null;\n\n\tpublic bufferedAmountLowThreshold = 0;\n\n\tconstructor(\n\t\tlabel: string,\n\t\toptions?: { ordered?: boolean; id?: number },\n\t\tconfig?: MockRTCDataChannelConfig,\n\t) {\n\t\tthis.label = label;\n\t\tthis.ordered = options?.ordered ?? true;\n\t\tthis.id = options?.id ?? MockRTCDataChannel.channelIdCounter++;\n\t\tthis.config = {\n\t\t\tsimulateLatency: config?.simulateLatency ?? 1,\n\t\t\tmaxMessageSize: config?.maxMessageSize ?? 262144,\n\t\t};\n\t}\n\n\tget readyState(): RTCDataChannelState {\n\t\treturn this._readyState;\n\t}\n\n\tget bufferedAmount(): number {\n\t\treturn this._bufferedAmount;\n\t}\n\n\t/**\n\t * Send data to the linked peer channel\n\t */\n\tsend(data: string | ArrayBuffer): void {\n\t\tif (this._readyState !== \"open\") {\n\t\t\tthrow new Error(`Cannot send on channel in state: ${this._readyState}`);\n\t\t}\n\n\t\tconst size = typeof data === \"string\" ? data.length : data.byteLength;\n\n\t\tif (size > this.config.maxMessageSize) {\n\t\t\tthrow new Error(\n\t\t\t\t`Message size ${size} exceeds maximum ${this.config.maxMessageSize}`,\n\t\t\t);\n\t\t}\n\n\t\tthis._bufferedAmount += size;\n\n\t\t// Deliver to linked channel\n\t\tif (this._linkedChannel && this._linkedChannel._readyState === \"open\") {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._bufferedAmount -= size;\n\n\t\t\t\t// Check buffered amount low threshold\n\t\t\t\tif (this._bufferedAmount <= this.bufferedAmountLowThreshold) {\n\t\t\t\t\tthis.onbufferedamountlow?.();\n\t\t\t\t}\n\n\t\t\t\tthis._linkedChannel?.onmessage?.({ data });\n\t\t\t}, this.config.simulateLatency);\n\t\t} else {\n\t\t\t// Queue for later delivery when channel opens\n\t\t\tthis.messageQueue.push(data);\n\t\t}\n\t}\n\n\t/**\n\t * Close the data channel\n\t */\n\tclose(): void {\n\t\tif (this._readyState === \"closed\" || this._readyState === \"closing\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._readyState = \"closing\";\n\n\t\tsetTimeout(() => {\n\t\t\tthis._readyState = \"closed\";\n\t\t\tthis.onclose?.();\n\n\t\t\t// Notify linked channel\n\t\t\tif (this._linkedChannel && this._linkedChannel._readyState !== \"closed\") {\n\t\t\t\tthis._linkedChannel._handleRemoteClose();\n\t\t\t}\n\t\t}, this.config.simulateLatency);\n\t}\n\n\t// Internal methods (called by MockRTCPeerConnection)\n\n\t/**\n\t * Link this channel to a remote channel for message passing\n\t * @internal\n\t */\n\t_linkChannel(channel: MockRTCDataChannel): void {\n\t\tthis._linkedChannel = channel;\n\n\t\t// Deliver any queued messages once linked and both are open\n\t\tif (this._readyState === \"open\" && channel._readyState === \"open\") {\n\t\t\tthis._flushQueue();\n\t\t}\n\t}\n\n\t/**\n\t * Open the channel (called when peer connection is established)\n\t * @internal\n\t */\n\t_open(): void {\n\t\tif (this._readyState === \"connecting\") {\n\t\t\tthis._readyState = \"open\";\n\t\t\tthis.onopen?.();\n\n\t\t\t// Flush queued messages\n\t\t\tif (this._linkedChannel?._readyState === \"open\") {\n\t\t\t\tthis._flushQueue();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handle remote channel closing\n\t * @internal\n\t */\n\t_handleRemoteClose(): void {\n\t\tif (this._readyState !== \"closed\" && this._readyState !== \"closing\") {\n\t\t\tthis._readyState = \"closed\";\n\t\t\tthis.onclose?.();\n\t\t}\n\t}\n\n\t/**\n\t * Get the linked channel (for testing)\n\t * @internal\n\t */\n\t_getLinkedChannel(): MockRTCDataChannel | null {\n\t\treturn this._linkedChannel;\n\t}\n\n\t/**\n\t * Flush queued messages to linked channel\n\t */\n\tprivate _flushQueue(): void {\n\t\tfor (const data of this.messageQueue) {\n\t\t\tconst size = typeof data === \"string\" ? data.length : data.byteLength;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._bufferedAmount -= size;\n\t\t\t\tthis._linkedChannel?.onmessage?.({ data });\n\t\t\t}, this.config.simulateLatency);\n\t\t}\n\t\tthis.messageQueue = [];\n\t}\n\n\t/**\n\t * Reset the channel ID counter (for testing)\n\t */\n\tstatic resetIdCounter(): void {\n\t\tMockRTCDataChannel.channelIdCounter = 0;\n\t}\n}\n",
27
+ "/**\n * Mock RTCPeerConnection for simulation testing\n *\n * Simulates WebRTC peer connection behavior without actual network I/O.\n * Supports linking two mock connections for bidirectional testing.\n */\n\nimport {\n\tMockRTCDataChannel,\n\ttype MockRTCDataChannelConfig,\n} from \"./MockRTCDataChannel.js\";\n\nexport interface MockRTCPeerConnectionConfig {\n\t/**\n\t * Simulated latency for operations (ms)\n\t * @default 10\n\t */\n\tsimulateLatency?: number;\n\n\t/**\n\t * Probability of ICE failure (0-1)\n\t * @default 0\n\t */\n\ticeFailureProbability?: number;\n\n\t/**\n\t * Simulated ICE gathering time (ms)\n\t * @default 50\n\t */\n\ticeGatheringTime?: number;\n\n\t/**\n\t * Whether to auto-generate ICE candidates\n\t * @default true\n\t */\n\tautoGenerateIceCandidates?: boolean;\n\n\t/**\n\t * Number of ICE candidates to generate\n\t * @default 3\n\t */\n\ticeCandidateCount?: number;\n\n\t/**\n\t * Configuration for data channels\n\t */\n\tdataChannelConfig?: MockRTCDataChannelConfig;\n}\n\nexport type RTCSignalingState =\n\t| \"stable\"\n\t| \"have-local-offer\"\n\t| \"have-remote-offer\"\n\t| \"have-local-pranswer\"\n\t| \"have-remote-pranswer\"\n\t| \"closed\";\n\nexport type RTCIceConnectionState =\n\t| \"new\"\n\t| \"checking\"\n\t| \"connected\"\n\t| \"completed\"\n\t| \"disconnected\"\n\t| \"failed\"\n\t| \"closed\";\n\nexport type RTCIceGatheringState = \"new\" | \"gathering\" | \"complete\";\n\nexport type RTCPeerConnectionState =\n\t| \"new\"\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"disconnected\"\n\t| \"failed\"\n\t| \"closed\";\n\nexport interface MockICECandidate {\n\tcandidate: string;\n\tsdpMid: string | null;\n\tsdpMLineIndex: number | null;\n\tusernameFragment: string | null;\n}\n\nexport interface MockSessionDescription {\n\ttype: \"offer\" | \"answer\" | \"pranswer\" | \"rollback\";\n\tsdp: string;\n}\n\nexport class MockRTCPeerConnection {\n\t// State\n\tprivate _signalingState: RTCSignalingState = \"stable\";\n\tprivate _iceConnectionState: RTCIceConnectionState = \"new\";\n\tprivate _iceGatheringState: RTCIceGatheringState = \"new\";\n\tprivate _connectionState: RTCPeerConnectionState = \"new\";\n\n\t// Descriptions\n\tprivate _localDescription: MockSessionDescription | null = null;\n\tprivate _remoteDescription: MockSessionDescription | null = null;\n\tprivate _pendingLocalDescription: MockSessionDescription | null = null;\n\tprivate _pendingRemoteDescription: MockSessionDescription | null = null;\n\n\t// ICE candidates\n\tprivate _localCandidates: MockICECandidate[] = [];\n\tprivate _remoteCandidates: MockICECandidate[] = [];\n\tprivate _pendingRemoteCandidates: MockICECandidate[] = [];\n\n\t// Data channels\n\tprivate _dataChannels: Map<string, MockRTCDataChannel> = new Map();\n\n\t// Event handlers\n\tpublic onicecandidate:\n\t\t| ((event: { candidate: MockICECandidate | null }) => void)\n\t\t| null = null;\n\tpublic onicecandidateerror:\n\t\t| ((event: { errorCode: number; errorText: string }) => void)\n\t\t| null = null;\n\tpublic oniceconnectionstatechange: (() => void) | null = null;\n\tpublic onicegatheringstatechange: (() => void) | null = null;\n\tpublic onconnectionstatechange: (() => void) | null = null;\n\tpublic onsignalingstatechange: (() => void) | null = null;\n\tpublic ondatachannel:\n\t\t| ((event: { channel: MockRTCDataChannel }) => void)\n\t\t| null = null;\n\tpublic onnegotiationneeded: (() => void) | null = null;\n\n\t// Linked peer for simulation\n\tprivate _linkedPeer: MockRTCPeerConnection | null = null;\n\n\t// Configuration\n\tprivate config: Required<\n\t\tOmit<MockRTCPeerConnectionConfig, \"dataChannelConfig\">\n\t> & {\n\t\tdataChannelConfig?: MockRTCDataChannelConfig;\n\t};\n\tprivate offerCounter = 0;\n\tprivate iceUfrag: string;\n\tprivate icePwd: string;\n\n\tconstructor(config?: MockRTCPeerConnectionConfig) {\n\t\tthis.config = {\n\t\t\tsimulateLatency: config?.simulateLatency ?? 10,\n\t\t\ticeFailureProbability: config?.iceFailureProbability ?? 0,\n\t\t\ticeGatheringTime: config?.iceGatheringTime ?? 50,\n\t\t\tautoGenerateIceCandidates: config?.autoGenerateIceCandidates ?? true,\n\t\t\ticeCandidateCount: config?.iceCandidateCount ?? 3,\n\t\t\tdataChannelConfig: config?.dataChannelConfig,\n\t\t};\n\n\t\t// Generate random ICE credentials\n\t\tthis.iceUfrag = \"mock\" + Math.random().toString(36).substring(2, 6);\n\t\tthis.icePwd = \"mock\" + Math.random().toString(36).substring(2, 26);\n\t}\n\n\t// Getters\n\tget signalingState(): RTCSignalingState {\n\t\treturn this._signalingState;\n\t}\n\n\tget iceConnectionState(): RTCIceConnectionState {\n\t\treturn this._iceConnectionState;\n\t}\n\n\tget iceGatheringState(): RTCIceGatheringState {\n\t\treturn this._iceGatheringState;\n\t}\n\n\tget connectionState(): RTCPeerConnectionState {\n\t\treturn this._connectionState;\n\t}\n\n\tget localDescription(): MockSessionDescription | null {\n\t\treturn this._localDescription;\n\t}\n\n\tget remoteDescription(): MockSessionDescription | null {\n\t\treturn this._remoteDescription;\n\t}\n\n\tget pendingLocalDescription(): MockSessionDescription | null {\n\t\treturn this._pendingLocalDescription;\n\t}\n\n\tget pendingRemoteDescription(): MockSessionDescription | null {\n\t\treturn this._pendingRemoteDescription;\n\t}\n\n\tget currentLocalDescription(): MockSessionDescription | null {\n\t\treturn this._localDescription;\n\t}\n\n\tget currentRemoteDescription(): MockSessionDescription | null {\n\t\treturn this._remoteDescription;\n\t}\n\n\t/**\n\t * Link two MockRTCPeerConnections for bidirectional testing.\n\t * When linked, data channels automatically connect to the peer.\n\t */\n\tstatic createLinkedPair(\n\t\tconfigA?: MockRTCPeerConnectionConfig,\n\t\tconfigB?: MockRTCPeerConnectionConfig,\n\t): [MockRTCPeerConnection, MockRTCPeerConnection] {\n\t\tconst peerA = new MockRTCPeerConnection(configA);\n\t\tconst peerB = new MockRTCPeerConnection(configB);\n\n\t\tpeerA._linkedPeer = peerB;\n\t\tpeerB._linkedPeer = peerA;\n\n\t\treturn [peerA, peerB];\n\t}\n\n\t/**\n\t * Create an SDP offer\n\t */\n\tasync createOffer(): Promise<MockSessionDescription> {\n\t\tif (this._signalingState === \"closed\") {\n\t\t\tthrow new Error(\"Cannot create offer on closed connection\");\n\t\t}\n\n\t\tawait this.simulateDelay();\n\n\t\tthis.offerCounter++;\n\t\tconst sdp = this.generateMockSDP(\"offer\");\n\n\t\treturn {\n\t\t\ttype: \"offer\",\n\t\t\tsdp,\n\t\t};\n\t}\n\n\t/**\n\t * Create an SDP answer\n\t */\n\tasync createAnswer(): Promise<MockSessionDescription> {\n\t\tif (this._signalingState !== \"have-remote-offer\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot create answer in signaling state: ${this._signalingState}`,\n\t\t\t);\n\t\t}\n\n\t\tawait this.simulateDelay();\n\n\t\tconst sdp = this.generateMockSDP(\"answer\");\n\n\t\treturn {\n\t\t\ttype: \"answer\",\n\t\t\tsdp,\n\t\t};\n\t}\n\n\t/**\n\t * Set local description (offer or answer)\n\t */\n\tasync setLocalDescription(\n\t\tdescription?: MockSessionDescription,\n\t): Promise<void> {\n\t\tif (this._signalingState === \"closed\") {\n\t\t\tthrow new Error(\"Cannot set local description on closed connection\");\n\t\t}\n\n\t\tawait this.simulateDelay();\n\n\t\t// If no description provided, create one automatically\n\t\tif (!description) {\n\t\t\tif (this._signalingState === \"have-remote-offer\") {\n\t\t\t\tdescription = await this.createAnswer();\n\t\t\t} else {\n\t\t\t\tdescription = await this.createOffer();\n\t\t\t}\n\t\t}\n\n\t\tthis._localDescription = description;\n\t\tthis._pendingLocalDescription = null;\n\n\t\t// Update signaling state\n\t\tif (description.type === \"offer\") {\n\t\t\tthis._signalingState = \"have-local-offer\";\n\t\t} else if (description.type === \"answer\") {\n\t\t\tthis._signalingState = \"stable\";\n\t\t\t// Answerer also needs to start ICE connection\n\t\t\tthis.startIceConnection();\n\t\t}\n\n\t\tthis.onsignalingstatechange?.();\n\n\t\t// Start ICE gathering\n\t\tif (this.config.autoGenerateIceCandidates) {\n\t\t\tthis.startIceGathering();\n\t\t}\n\t}\n\n\t/**\n\t * Set remote description (offer or answer from peer)\n\t */\n\tasync setRemoteDescription(\n\t\tdescription: MockSessionDescription,\n\t): Promise<void> {\n\t\tif (this._signalingState === \"closed\") {\n\t\t\tthrow new Error(\"Cannot set remote description on closed connection\");\n\t\t}\n\n\t\tawait this.simulateDelay();\n\n\t\tthis._remoteDescription = description;\n\t\tthis._pendingRemoteDescription = null;\n\n\t\t// Update signaling state\n\t\tif (description.type === \"offer\") {\n\t\t\tthis._signalingState = \"have-remote-offer\";\n\t\t} else if (description.type === \"answer\") {\n\t\t\tthis._signalingState = \"stable\";\n\n\t\t\t// Start ICE connection after answer is set\n\t\t\tthis.startIceConnection();\n\t\t}\n\n\t\tthis.onsignalingstatechange?.();\n\n\t\t// Process any pending ICE candidates\n\t\tfor (const candidate of this._pendingRemoteCandidates) {\n\t\t\tthis._remoteCandidates.push(candidate);\n\t\t}\n\t\tthis._pendingRemoteCandidates = [];\n\n\t\t// If we received an offer, check for incoming data channels from linked peer\n\t\tif (description.type === \"offer\" && this._linkedPeer) {\n\t\t\tthis.receiveDataChannelsFromPeer();\n\t\t}\n\t}\n\n\t/**\n\t * Add ICE candidate from peer\n\t */\n\tasync addIceCandidate(candidate?: MockICECandidate | null): Promise<void> {\n\t\tif (this._signalingState === \"closed\") {\n\t\t\tthrow new Error(\"Cannot add ICE candidate on closed connection\");\n\t\t}\n\n\t\t// Null candidate signals end of candidates\n\t\tif (!candidate) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Queue candidates if remote description not set yet\n\t\tif (!this._remoteDescription) {\n\t\t\tthis._pendingRemoteCandidates.push(candidate);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.simulateDelay();\n\n\t\tthis._remoteCandidates.push(candidate);\n\n\t\t// Simulate ICE checking\n\t\tif (this._iceConnectionState === \"new\") {\n\t\t\tthis._iceConnectionState = \"checking\";\n\t\t\tthis.oniceconnectionstatechange?.();\n\t\t}\n\t}\n\n\t/**\n\t * Create a data channel\n\t */\n\tcreateDataChannel(\n\t\tlabel: string,\n\t\toptions?: { ordered?: boolean; id?: number },\n\t): MockRTCDataChannel {\n\t\tif (this._signalingState === \"closed\") {\n\t\t\tthrow new Error(\"Cannot create data channel on closed connection\");\n\t\t}\n\n\t\tconst channel = new MockRTCDataChannel(\n\t\t\tlabel,\n\t\t\toptions,\n\t\t\tthis.config.dataChannelConfig,\n\t\t);\n\t\tthis._dataChannels.set(label, channel);\n\n\t\t// Trigger negotiation needed\n\t\tsetTimeout(() => {\n\t\t\tthis.onnegotiationneeded?.();\n\t\t}, 0);\n\n\t\treturn channel;\n\t}\n\n\t/**\n\t * Close the peer connection\n\t */\n\tclose(): void {\n\t\tif (this._signalingState === \"closed\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._signalingState = \"closed\";\n\t\tthis._iceConnectionState = \"closed\";\n\t\tthis._connectionState = \"closed\";\n\n\t\t// Close all data channels\n\t\tfor (const channel of this._dataChannels.values()) {\n\t\t\tchannel.close();\n\t\t}\n\t\tthis._dataChannels.clear();\n\n\t\tthis.onsignalingstatechange?.();\n\t\tthis.oniceconnectionstatechange?.();\n\t\tthis.onconnectionstatechange?.();\n\t}\n\n\t/**\n\t * Get statistics (mock implementation)\n\t */\n\tasync getStats(): Promise<Map<string, unknown>> {\n\t\treturn new Map([\n\t\t\t[\n\t\t\t\t\"peer-connection\",\n\t\t\t\t{\n\t\t\t\t\ttype: \"peer-connection\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdataChannelsOpened: this._dataChannels.size,\n\t\t\t\t\tlocalCandidates: this._localCandidates.length,\n\t\t\t\t\tremoteCandidates: this._remoteCandidates.length,\n\t\t\t\t\tsignalingState: this._signalingState,\n\t\t\t\t\ticeConnectionState: this._iceConnectionState,\n\t\t\t\t\tconnectionState: this._connectionState,\n\t\t\t\t},\n\t\t\t],\n\t\t]);\n\t}\n\n\t/**\n\t * Restart ICE (mock implementation)\n\t */\n\trestartIce(): void {\n\t\t// Generate new ICE credentials\n\t\tthis.iceUfrag = \"mock\" + Math.random().toString(36).substring(2, 6);\n\t\tthis.icePwd = \"mock\" + Math.random().toString(36).substring(2, 26);\n\n\t\t// Clear existing candidates\n\t\tthis._localCandidates = [];\n\t\tthis._remoteCandidates = [];\n\n\t\t// Reset ICE states\n\t\tthis._iceGatheringState = \"new\";\n\t\tthis._iceConnectionState = \"new\";\n\n\t\tthis.onicegatheringstatechange?.();\n\t\tthis.oniceconnectionstatechange?.();\n\t}\n\n\t// Test helper methods\n\n\t/**\n\t * Get all data channels\n\t */\n\tgetDataChannels(): Map<string, MockRTCDataChannel> {\n\t\treturn new Map(this._dataChannels);\n\t}\n\n\t/**\n\t * Get local ICE candidates\n\t */\n\tgetLocalCandidates(): MockICECandidate[] {\n\t\treturn [...this._localCandidates];\n\t}\n\n\t/**\n\t * Get remote ICE candidates\n\t */\n\tgetRemoteCandidates(): MockICECandidate[] {\n\t\treturn [...this._remoteCandidates];\n\t}\n\n\t/**\n\t * Get the linked peer (for testing)\n\t */\n\tgetLinkedPeer(): MockRTCPeerConnection | null {\n\t\treturn this._linkedPeer;\n\t}\n\n\t/**\n\t * Manually trigger connection established (for testing)\n\t */\n\t_forceConnected(): void {\n\t\tthis._iceConnectionState = \"connected\";\n\t\tthis._connectionState = \"connected\";\n\t\tthis.oniceconnectionstatechange?.();\n\t\tthis.onconnectionstatechange?.();\n\n\t\t// Open all data channels\n\t\tfor (const channel of this._dataChannels.values()) {\n\t\t\tchannel._open();\n\t\t}\n\t}\n\n\t// Private methods\n\n\tprivate async simulateDelay(): Promise<void> {\n\t\tif (this.config.simulateLatency > 0) {\n\t\t\tawait new Promise((resolve) =>\n\t\t\t\tsetTimeout(resolve, this.config.simulateLatency),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate generateMockSDP(type: \"offer\" | \"answer\"): string {\n\t\tconst sessionId = Date.now();\n\t\tconst version = this.offerCounter;\n\n\t\t// Generate SDP with data channel info\n\t\tconst lines = [\n\t\t\t\"v=0\",\n\t\t\t`o=- ${sessionId} ${version} IN IP4 127.0.0.1`,\n\t\t\t\"s=-\",\n\t\t\t\"t=0 0\",\n\t\t\t\"a=group:BUNDLE 0\",\n\t\t\t\"a=extmap-allow-mixed\",\n\t\t\t\"a=msid-semantic: WMS\",\n\t\t\t\"m=application 9 UDP/DTLS/SCTP webrtc-datachannel\",\n\t\t\t\"c=IN IP4 0.0.0.0\",\n\t\t\t`a=ice-ufrag:${this.iceUfrag}`,\n\t\t\t`a=ice-pwd:${this.icePwd}`,\n\t\t\t\"a=ice-options:trickle\",\n\t\t\t\"a=fingerprint:sha-256 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00\",\n\t\t\ttype === \"offer\" ? \"a=setup:actpass\" : \"a=setup:active\",\n\t\t\t\"a=mid:0\",\n\t\t\t\"a=sctp-port:5000\",\n\t\t\t\"a=max-message-size:262144\",\n\t\t];\n\n\t\treturn lines.join(\"\\r\\n\") + \"\\r\\n\";\n\t}\n\n\tprivate startIceGathering(): void {\n\t\tif (this._iceGatheringState !== \"new\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._iceGatheringState = \"gathering\";\n\t\tthis.onicegatheringstatechange?.();\n\n\t\t// Simulate generating ICE candidates\n\t\tconst candidateDelay =\n\t\t\tthis.config.iceGatheringTime / this.config.iceCandidateCount;\n\n\t\tfor (let i = 0; i < this.config.iceCandidateCount; i++) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (this._signalingState === \"closed\") return;\n\n\t\t\t\t// Simulate ICE failure\n\t\t\t\tif (Math.random() < this.config.iceFailureProbability) {\n\t\t\t\t\tthis.onicecandidateerror?.({\n\t\t\t\t\t\terrorCode: 701,\n\t\t\t\t\t\terrorText: \"Simulated ICE failure\",\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst candidate: MockICECandidate = {\n\t\t\t\t\tcandidate: `candidate:${i} 1 udp ${2000000000 - i * 100} 192.168.1.${100 + i} ${50000 + i} typ host generation 0 ufrag ${this.iceUfrag}`,\n\t\t\t\t\tsdpMid: \"0\",\n\t\t\t\t\tsdpMLineIndex: 0,\n\t\t\t\t\tusernameFragment: this.iceUfrag,\n\t\t\t\t};\n\n\t\t\t\tthis._localCandidates.push(candidate);\n\t\t\t\tthis.onicecandidate?.({ candidate });\n\n\t\t\t\t// Last candidate - signal gathering complete\n\t\t\t\tif (i === this.config.iceCandidateCount - 1) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (this._signalingState === \"closed\") return;\n\n\t\t\t\t\t\tthis._iceGatheringState = \"complete\";\n\t\t\t\t\t\tthis.onicegatheringstatechange?.();\n\t\t\t\t\t\tthis.onicecandidate?.({ candidate: null });\n\t\t\t\t\t}, this.config.simulateLatency);\n\t\t\t\t}\n\t\t\t}, candidateDelay * i);\n\t\t}\n\t}\n\n\tprivate startIceConnection(): void {\n\t\t// Simulate ICE connection establishment\n\t\tthis._iceConnectionState = \"checking\";\n\t\tthis._connectionState = \"connecting\";\n\t\tthis.oniceconnectionstatechange?.();\n\t\tthis.onconnectionstatechange?.();\n\n\t\tsetTimeout(() => {\n\t\t\tif (this._signalingState === \"closed\") return;\n\n\t\t\t// Simulate connection success\n\t\t\tthis._iceConnectionState = \"connected\";\n\t\t\tthis._connectionState = \"connected\";\n\n\t\t\tthis.oniceconnectionstatechange?.();\n\t\t\tthis.onconnectionstatechange?.();\n\n\t\t\t// Open data channels and link with peer\n\t\t\tthis.openDataChannels();\n\t\t}, this.config.iceGatheringTime + this.config.simulateLatency);\n\t}\n\n\tprivate openDataChannels(): void {\n\t\t// Open local data channels\n\t\tfor (const channel of this._dataChannels.values()) {\n\t\t\tchannel._open();\n\t\t}\n\n\t\t// If linked, connect data channels\n\t\tif (this._linkedPeer) {\n\t\t\tfor (const [label, localChannel] of this._dataChannels) {\n\t\t\t\tconst remoteChannel = this._linkedPeer._dataChannels.get(label);\n\t\t\t\tif (remoteChannel) {\n\t\t\t\t\tlocalChannel._linkChannel(remoteChannel);\n\t\t\t\t\tremoteChannel._linkChannel(localChannel);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Also open peer's data channels\n\t\t\tfor (const channel of this._linkedPeer._dataChannels.values()) {\n\t\t\t\tif (channel.readyState === \"connecting\") {\n\t\t\t\t\tchannel._open();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate receiveDataChannelsFromPeer(): void {\n\t\tif (!this._linkedPeer) return;\n\n\t\t// Create matching data channels for any channels the peer has that we don't\n\t\tfor (const [label, peerChannel] of this._linkedPeer._dataChannels) {\n\t\t\tif (!this._dataChannels.has(label)) {\n\t\t\t\tconst localChannel = new MockRTCDataChannel(\n\t\t\t\t\tlabel,\n\t\t\t\t\t{ ordered: peerChannel.ordered, id: peerChannel.id },\n\t\t\t\t\tthis.config.dataChannelConfig,\n\t\t\t\t);\n\t\t\t\tthis._dataChannels.set(label, localChannel);\n\n\t\t\t\t// Link the channels\n\t\t\t\tlocalChannel._linkChannel(peerChannel);\n\t\t\t\tpeerChannel._linkChannel(localChannel);\n\n\t\t\t\t// Notify via ondatachannel\n\t\t\t\tthis.ondatachannel?.({ channel: localChannel });\n\t\t\t}\n\t\t}\n\t}\n}\n",
28
+ "import type {\n\tIStorageAdapter,\n\tStorageOperation,\n} from \"../../abstractions/StorageAdapter.js\";\n\ninterface StorageItem {\n\tvalue: unknown;\n\texpiresAt?: number;\n}\n\nexport class MockStorageAdapter implements IStorageAdapter {\n\tprivate storage: Map<string, StorageItem> = new Map();\n\tprivate simulateLatency: number = 0;\n\tprivate shouldFailOperations: boolean = false;\n\n\tconstructor(options?: {\n\t\tsimulateLatency?: number;\n\t\tshouldFailOperations?: boolean;\n\t}) {\n\t\tthis.simulateLatency = options?.simulateLatency ?? 0;\n\t\tthis.shouldFailOperations = options?.shouldFailOperations ?? false;\n\t}\n\n\tasync get<T>(key: string): Promise<T | null> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailOperations) {\n\t\t\tthrow new Error(\"Mock storage operation failed\");\n\t\t}\n\n\t\tconst item = this.storage.get(key);\n\t\tif (!item) return null;\n\n\t\t// Check expiration\n\t\tif (item.expiresAt && item.expiresAt < Date.now()) {\n\t\t\tthis.storage.delete(key);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn item.value as T;\n\t}\n\n\tasync set<T>(key: string, value: T, ttl?: number): Promise<void> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailOperations) {\n\t\t\tthrow new Error(\"Mock storage operation failed\");\n\t\t}\n\n\t\tconst item: StorageItem = {\n\t\t\tvalue,\n\t\t\texpiresAt: ttl ? Date.now() + ttl : undefined,\n\t\t};\n\n\t\tthis.storage.set(key, item);\n\t}\n\n\tasync delete(key: string): Promise<void> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailOperations) {\n\t\t\tthrow new Error(\"Mock storage operation failed\");\n\t\t}\n\n\t\tthis.storage.delete(key);\n\t}\n\n\tasync exists(key: string): Promise<boolean> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailOperations) {\n\t\t\tthrow new Error(\"Mock storage operation failed\");\n\t\t}\n\n\t\tconst item = this.storage.get(key);\n\t\tif (!item) return false;\n\n\t\t// Check expiration\n\t\tif (item.expiresAt && item.expiresAt < Date.now()) {\n\t\t\tthis.storage.delete(key);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tasync scan(pattern: string): Promise<string[]> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailOperations) {\n\t\t\tthrow new Error(\"Mock storage operation failed\");\n\t\t}\n\n\t\t// Convert pattern to regex (simple glob to regex conversion)\n\t\tconst regexPattern = pattern\n\t\t\t.replace(/\\*/g, \".*\")\n\t\t\t.replace(/\\?/g, \".\")\n\t\t\t.replace(/\\[!/g, \"[^\")\n\t\t\t.replace(/\\[/g, \"[\")\n\t\t\t.replace(/\\]/g, \"]\");\n\n\t\tconst regex = new RegExp(`^${regexPattern}$`);\n\t\tconst keys: string[] = [];\n\n\t\tfor (const [key, item] of this.storage.entries()) {\n\t\t\t// Skip expired items\n\t\t\tif (item.expiresAt && item.expiresAt < Date.now()) {\n\t\t\t\tthis.storage.delete(key);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (regex.test(key)) {\n\t\t\t\tkeys.push(key);\n\t\t\t}\n\t\t}\n\n\t\treturn keys;\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailOperations) {\n\t\t\tthrow new Error(\"Mock storage operation failed\");\n\t\t}\n\n\t\tthis.storage.clear();\n\t}\n\n\tasync transaction<T>(operations: StorageOperation[]): Promise<T> {\n\t\tawait this.simulateDelay();\n\n\t\tif (this.shouldFailOperations) {\n\t\t\tthrow new Error(\"Mock storage operation failed\");\n\t\t}\n\n\t\tconst results: unknown[] = [];\n\t\tconst rollback: (() => void)[] = [];\n\n\t\ttry {\n\t\t\tfor (const op of operations) {\n\t\t\t\tswitch (op.type) {\n\t\t\t\t\tcase \"get\": {\n\t\t\t\t\t\tconst value = await this.get(op.key);\n\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"set\": {\n\t\t\t\t\t\tconst oldValue = await this.get(op.key);\n\t\t\t\t\t\tawait this.set(op.key, op.value, op.ttl);\n\t\t\t\t\t\trollback.push(() => {\n\t\t\t\t\t\t\tif (oldValue !== null) {\n\t\t\t\t\t\t\t\tthis.storage.set(op.key, { value: oldValue });\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.storage.delete(op.key);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tresults.push(true);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"delete\": {\n\t\t\t\t\t\tconst oldValue = await this.get(op.key);\n\t\t\t\t\t\tawait this.delete(op.key);\n\t\t\t\t\t\trollback.push(() => {\n\t\t\t\t\t\t\tif (oldValue !== null) {\n\t\t\t\t\t\t\t\tthis.storage.set(op.key, { value: oldValue });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tresults.push(true);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"exists\": {\n\t\t\t\t\t\tconst exists = await this.exists(op.key);\n\t\t\t\t\t\tresults.push(exists);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn results as T;\n\t\t} catch (error) {\n\t\t\t// Rollback on error\n\t\t\tfor (const rollbackFn of rollback.reverse()) {\n\t\t\t\trollbackFn();\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// Test helper methods\n\tprivate async simulateDelay(): Promise<void> {\n\t\tif (this.simulateLatency > 0) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, this.simulateLatency));\n\t\t}\n\t}\n\n\tgetSize(): number {\n\t\treturn this.storage.size;\n\t}\n\n\tgetRawStorage(): Map<string, StorageItem> {\n\t\treturn new Map(this.storage);\n\t}\n\n\tsetFailOperations(fail: boolean): void {\n\t\tthis.shouldFailOperations = fail;\n\t}\n}\n",
29
+ "import type { ITransportAdapter } from \"../../abstractions/TransportAdapter.js\";\nimport type {\n\tCloseHandler,\n\tConnectionOptions,\n\tConnectionState,\n\tErrorHandler,\n\tMessage,\n\tMessageHandler,\n} from \"../../types/index.js\";\n\nexport class MockTransportAdapter implements ITransportAdapter {\n\tprivate state: ConnectionState = \"disconnected\";\n\tprivate messageHandlers: Set<MessageHandler> = new Set();\n\tprivate errorHandlers: Set<ErrorHandler> = new Set();\n\tprivate closeHandlers: Set<CloseHandler> = new Set();\n\tprivate messageQueue: Message[] = [];\n\tprivate simulateLatency: number = 0;\n\tprivate shouldFailConnection: boolean = false;\n\tprivate connectedUrl: string | null = null;\n\tprivate connectionAttempts: number = 0;\n\n\tconstructor(options?: {\n\t\tsimulateLatency?: number;\n\t\tshouldFailConnection?: boolean;\n\t}) {\n\t\tthis.simulateLatency = options?.simulateLatency ?? 0;\n\t\tthis.shouldFailConnection = options?.shouldFailConnection ?? false;\n\t}\n\n\tasync connect(url: string, _options?: ConnectionOptions): Promise<void> {\n\t\tthis.connectionAttempts++;\n\n\t\tif (this.shouldFailConnection) {\n\t\t\tthis.state = \"disconnected\";\n\t\t\tconst error = new Error(\"Mock connection failed\");\n\t\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\t\t\tthrow error;\n\t\t}\n\n\t\tthis.state = \"connecting\";\n\t\tthis.connectedUrl = url;\n\n\t\t// Simulate connection delay\n\t\tif (this.simulateLatency > 0) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, this.simulateLatency));\n\t\t}\n\n\t\tthis.state = \"connected\";\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.state === \"disconnected\") return;\n\n\t\tthis.state = \"disconnecting\";\n\n\t\t// Simulate disconnect delay\n\t\tif (this.simulateLatency > 0) {\n\t\t\tawait new Promise((resolve) =>\n\t\t\t\tsetTimeout(resolve, this.simulateLatency / 2),\n\t\t\t);\n\t\t}\n\n\t\tthis.state = \"disconnected\";\n\t\tthis.connectedUrl = null;\n\t\tthis.closeHandlers.forEach((handler) => handler(1000, \"Normal closure\"));\n\t\tthis.messageQueue = [];\n\t}\n\n\tasync send(message: Message): Promise<void> {\n\t\tif (this.state !== \"connected\") {\n\t\t\tthrow new Error(\"Not connected\");\n\t\t}\n\n\t\t// Simulate send latency\n\t\tif (this.simulateLatency > 0) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, this.simulateLatency));\n\t\t}\n\n\t\tthis.messageQueue.push(message);\n\t}\n\n\tonMessage(handler: MessageHandler): void {\n\t\tthis.messageHandlers.add(handler);\n\t}\n\n\tonError(handler: ErrorHandler): void {\n\t\tthis.errorHandlers.add(handler);\n\t}\n\n\tonClose(handler: CloseHandler): void {\n\t\tthis.closeHandlers.add(handler);\n\t}\n\n\tgetState(): ConnectionState {\n\t\treturn this.state;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.state === \"connected\";\n\t}\n\n\t// Test helper methods\n\tsimulateMessage(\n\t\tmessage: Message,\n\t\tbypassConnectionCheck: boolean = false,\n\t): void {\n\t\tif (!bypassConnectionCheck && this.state !== \"connected\") {\n\t\t\tthrow new Error(\"Cannot simulate message when not connected\");\n\t\t}\n\t\tthis.messageHandlers.forEach((handler) => handler(message));\n\t}\n\n\tsimulateError(error: Error): void {\n\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\t}\n\n\tsimulateClose(code: number, reason: string): void {\n\t\tthis.state = \"disconnected\";\n\t\tthis.closeHandlers.forEach((handler) => handler(code, reason));\n\t}\n\n\tgetMessageQueue(): Message[] {\n\t\treturn [...this.messageQueue];\n\t}\n\n\tclearMessageQueue(): void {\n\t\tthis.messageQueue = [];\n\t}\n\n\tgetConnectedUrl(): string | null {\n\t\treturn this.connectedUrl;\n\t}\n\n\tgetConnectionAttempts(): number {\n\t\treturn this.connectionAttempts;\n\t}\n\n\tresetConnectionAttempts(): void {\n\t\tthis.connectionAttempts = 0;\n\t}\n\n\t// Additional test helper methods for two-tier architecture testing\n\t/**\n\t * Simulate a client connection with authentication state\n\t * Note: This bypasses the connected state check for testing purposes\n\t */\n\tasync simulateConnection(\n\t\tclientId: string,\n\t\toptions: {\n\t\t\tauthenticated?: boolean;\n\t\t\tuserId?: string;\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t} = {},\n\t): Promise<void> {\n\t\t// Set transport to connected state if not already\n\t\tif (this.state !== \"connected\") {\n\t\t\tthis.state = \"connected\";\n\t\t}\n\n\t\tconst message = {\n\t\t\tid: `conn-${clientId}`,\n\t\t\ttype: \"connection\",\n\t\t\tpayload: {\n\t\t\t\tclientId,\n\t\t\t\tauthenticated: options.authenticated ?? false,\n\t\t\t\tuserId: options.userId,\n\t\t\t\tmetadata: options.metadata,\n\t\t\t},\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\t// Use simulateMessage with bypass flag\n\t\tthis.simulateMessage(message, true);\n\t}\n\n\t/**\n\t * Simulate a client disconnection\n\t */\n\tasync simulateDisconnect(\n\t\tclientId: string,\n\t\treason: string = \"Normal closure\",\n\t): Promise<void> {\n\t\t// Send a disconnect message to the server for this specific client\n\t\tconst message = {\n\t\t\tid: `disconnect-${clientId}`,\n\t\t\ttype: \"disconnect\",\n\t\t\tpayload: {\n\t\t\t\tclientId,\n\t\t\t\treason,\n\t\t\t},\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tthis.simulateMessage(message, true);\n\t}\n\n\t/**\n\t * Simulate sending a message from a client to the server\n\t * Properly wraps the message with clientId in payload for server routing\n\t *\n\t * @param clientId - The client sending the message\n\t * @param messageType - The message type (e.g., 'join_room', 'leave_room', 'broadcast_event')\n\t * @param messagePayload - The message payload\n\t */\n\tasync simulateClientMessage(\n\t\tclientId: string,\n\t\tmessageType: string,\n\t\tmessagePayload: Record<string, unknown> = {},\n\t): Promise<void> {\n\t\tconst message: Message = {\n\t\t\tid: `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n\t\t\ttype: \"server_message\",\n\t\t\tpayload: {\n\t\t\t\tclientId,\n\t\t\t\ttype: messageType,\n\t\t\t\t...messagePayload,\n\t\t\t},\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tthis.simulateMessage(message, true);\n\t}\n\n\t/**\n\t * Get all messages sent to a specific client\n\t * This filters the message queue for messages addressed to the given client\n\t */\n\tgetSentMessages(clientId: string): any[] {\n\t\treturn this.messageQueue\n\t\t\t.filter((msg) => {\n\t\t\t\tconst payload = msg.payload as any;\n\t\t\t\treturn payload?.clientId === clientId;\n\t\t\t})\n\t\t\t.map((msg) => {\n\t\t\t\tconst { clientId: _, ...rest } = msg.payload as any;\n\t\t\t\treturn rest;\n\t\t\t});\n\t}\n\n\t/**\n\t * Simulate an incoming message from the server to the client\n\t * This is used in client tests to mock server responses\n\t * @param message - The message to send to the client\n\t */\n\tsimulateIncomingMessage(message: any): void {\n\t\t// Ensure message has required Message fields\n\t\tconst fullMessage: Message = {\n\t\t\tid: message.id || `msg-${Date.now()}`,\n\t\t\ttype: message.type,\n\t\t\tpayload: message.payload || {},\n\t\t\ttimestamp: message.timestamp || Date.now(),\n\t\t};\n\n\t\tthis.messageHandlers.forEach((handler) => handler(fullMessage));\n\t}\n}\n",
30
+ "/**\n * WebRTC Signaling Adapter\n *\n * Manages WebRTC peer connections using Control Tower for signaling.\n * Supports both mock connections (for testing) and real WebRTC.\n */\n\nimport type { BaseClient } from \"../../client/BaseClient.js\";\nimport type { Event } from \"../../types/index.js\";\nimport type { MockRTCDataChannel } from \"../mock/MockRTCDataChannel.js\";\nimport {\n\ttype MockICECandidate,\n\tMockRTCPeerConnection,\n\ttype MockRTCPeerConnectionConfig,\n} from \"../mock/MockRTCPeerConnection.js\";\n\nexport interface WebRTCSignalingConfig {\n\t/**\n\t * Use mock WebRTC (for testing) or real WebRTC (for production)\n\t * @default true\n\t */\n\tuseMock?: boolean;\n\n\t/**\n\t * ICE servers configuration (for real WebRTC)\n\t */\n\ticeServers?: Array<{ urls: string | string[] }>;\n\n\t/**\n\t * Mock configuration (for testing)\n\t */\n\tmockConfig?: MockRTCPeerConnectionConfig;\n\n\t/**\n\t * Data channel label for peer connections\n\t * @default 'data'\n\t */\n\tdataChannelLabel?: string;\n\n\t/**\n\t * Enable ordered delivery for data channels\n\t * @default true\n\t */\n\torderedDelivery?: boolean;\n}\n\nexport type PeerConnectionState =\n\t| \"new\"\n\t| \"connecting\"\n\t| \"connected\"\n\t| \"disconnected\"\n\t| \"failed\";\n\nexport interface PeerConnection {\n\tpeerId: string;\n\tconnection: MockRTCPeerConnection;\n\tdataChannel: MockRTCDataChannel | null;\n\tstate: PeerConnectionState;\n\tcreatedAt: number;\n\tconnectedAt?: number;\n}\n\nexport interface WebRTCSignalingEvents {\n\tpeerConnected: { peerId: string; dataChannel: MockRTCDataChannel };\n\tpeerDisconnected: { peerId: string };\n\tpeerMessage: { peerId: string; data: string | ArrayBuffer };\n\tpeerError: { peerId: string; error: Error };\n\tsignalingStateChange: { peerId: string; state: PeerConnectionState };\n}\n\n/**\n * WebRTC Signaling Adapter\n *\n * Manages WebRTC peer connections using Control Tower for signaling.\n */\nexport class WebRTCSignalingAdapter {\n\tprivate client: BaseClient;\n\tprivate config: Required<\n\t\tOmit<WebRTCSignalingConfig, \"iceServers\" | \"mockConfig\">\n\t> & {\n\t\ticeServers?: Array<{ urls: string | string[] }>;\n\t\tmockConfig?: MockRTCPeerConnectionConfig;\n\t};\n\tprivate peers: Map<string, PeerConnection> = new Map();\n\tprivate eventUnsubscribers: Array<() => void> = [];\n\n\t// Event handlers\n\tpublic onPeerConnected:\n\t\t| ((peerId: string, dataChannel: MockRTCDataChannel) => void)\n\t\t| null = null;\n\tpublic onPeerDisconnected: ((peerId: string) => void) | null = null;\n\tpublic onPeerMessage:\n\t\t| ((peerId: string, data: string | ArrayBuffer) => void)\n\t\t| null = null;\n\tpublic onError: ((peerId: string, error: Error) => void) | null = null;\n\tpublic onStateChange:\n\t\t| ((peerId: string, state: PeerConnectionState) => void)\n\t\t| null = null;\n\n\tconstructor(client: BaseClient, config?: WebRTCSignalingConfig) {\n\t\tthis.client = client;\n\t\tthis.config = {\n\t\t\tuseMock: config?.useMock ?? true,\n\t\t\ticeServers: config?.iceServers,\n\t\t\tmockConfig: config?.mockConfig,\n\t\t\tdataChannelLabel: config?.dataChannelLabel ?? \"data\",\n\t\t\torderedDelivery: config?.orderedDelivery ?? true,\n\t\t};\n\n\t\tthis.setupSignalingListeners();\n\t}\n\n\t/**\n\t * Initiate a WebRTC connection to a peer\n\t */\n\tasync connectToPeer(peerId: string): Promise<void> {\n\t\tif (this.peers.has(peerId)) {\n\t\t\tthrow new Error(`Already connected or connecting to peer: ${peerId}`);\n\t\t}\n\n\t\tconst connection = this.createPeerConnection();\n\t\tconst peerState: PeerConnection = {\n\t\t\tpeerId,\n\t\t\tconnection,\n\t\t\tdataChannel: null,\n\t\t\tstate: \"new\",\n\t\t\tcreatedAt: Date.now(),\n\t\t};\n\t\tthis.peers.set(peerId, peerState);\n\n\t\t// Set up connection handlers\n\t\tthis.setupConnectionHandlers(peerState);\n\n\t\t// Create data channel (offerer creates the channel)\n\t\tconst dataChannel = connection.createDataChannel(\n\t\t\tthis.config.dataChannelLabel,\n\t\t\t{\n\t\t\t\tordered: this.config.orderedDelivery,\n\t\t\t},\n\t\t);\n\t\tpeerState.dataChannel = dataChannel;\n\t\tthis.setupDataChannelHandlers(peerState, dataChannel);\n\n\t\t// Update state\n\t\tthis.updatePeerState(peerState, \"connecting\");\n\n\t\t// Create and send offer\n\t\tconst offer = await connection.createOffer();\n\t\tawait connection.setLocalDescription(offer);\n\n\t\tawait this.sendSignal(peerId, \"webrtc:offer\", {\n\t\t\tsdp: offer.sdp,\n\t\t\ttype: offer.type,\n\t\t});\n\t}\n\n\t/**\n\t * Disconnect from a peer\n\t */\n\tdisconnectFromPeer(peerId: string): void {\n\t\tconst peer = this.peers.get(peerId);\n\t\tif (!peer) return;\n\n\t\t// Notify peer of disconnect\n\t\tthis.sendSignal(peerId, \"webrtc:disconnect\", {}).catch(() => {\n\t\t\t// Ignore errors when sending disconnect notification\n\t\t});\n\n\t\tpeer.dataChannel?.close();\n\t\tpeer.connection.close();\n\n\t\tthis.updatePeerState(peer, \"disconnected\");\n\t\tthis.peers.delete(peerId);\n\t\tthis.onPeerDisconnected?.(peerId);\n\t}\n\n\t/**\n\t * Send data to a peer via DataChannel\n\t */\n\tsendToPeer(peerId: string, data: string | ArrayBuffer): void {\n\t\tconst peer = this.peers.get(peerId);\n\t\tif (!peer || !peer.dataChannel) {\n\t\t\tthrow new Error(`No data channel to peer: ${peerId}`);\n\t\t}\n\n\t\tif (peer.dataChannel.readyState !== \"open\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Data channel not open for peer: ${peerId} (state: ${peer.dataChannel.readyState})`,\n\t\t\t);\n\t\t}\n\n\t\tpeer.dataChannel.send(data);\n\t}\n\n\t/**\n\t * Broadcast data to all connected peers\n\t */\n\tbroadcastToPeers(data: string | ArrayBuffer): void {\n\t\tfor (const peerId of this.getConnectedPeers()) {\n\t\t\ttry {\n\t\t\t\tthis.sendToPeer(peerId, data);\n\t\t\t} catch (error) {\n\t\t\t\t// Log but don't throw - continue broadcasting to other peers\n\t\t\t\tconsole.warn(`Failed to send to peer ${peerId}:`, error);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get connected peer IDs\n\t */\n\tgetConnectedPeers(): string[] {\n\t\treturn Array.from(this.peers.entries())\n\t\t\t.filter(([_, peer]) => peer.state === \"connected\")\n\t\t\t.map(([peerId]) => peerId);\n\t}\n\n\t/**\n\t * Get all peer IDs (including connecting/disconnected)\n\t */\n\tgetAllPeers(): string[] {\n\t\treturn Array.from(this.peers.keys());\n\t}\n\n\t/**\n\t * Get peer connection state\n\t */\n\tgetPeerState(peerId: string): PeerConnectionState | null {\n\t\treturn this.peers.get(peerId)?.state ?? null;\n\t}\n\n\t/**\n\t * Get peer connection info\n\t */\n\tgetPeerInfo(peerId: string): PeerConnection | null {\n\t\treturn this.peers.get(peerId) ?? null;\n\t}\n\n\t/**\n\t * Check if connected to a peer\n\t */\n\tisConnectedToPeer(peerId: string): boolean {\n\t\treturn this.peers.get(peerId)?.state === \"connected\";\n\t}\n\n\t/**\n\t * Disconnect from all peers and clean up\n\t */\n\tdispose(): void {\n\t\t// Disconnect from all peers\n\t\tfor (const peerId of this.getAllPeers()) {\n\t\t\tthis.disconnectFromPeer(peerId);\n\t\t}\n\n\t\t// Unsubscribe from client events\n\t\tfor (const unsubscribe of this.eventUnsubscribers) {\n\t\t\tunsubscribe();\n\t\t}\n\t\tthis.eventUnsubscribers = [];\n\t}\n\n\t// Private methods\n\n\tprivate createPeerConnection(): MockRTCPeerConnection {\n\t\tif (this.config.useMock) {\n\t\t\treturn new MockRTCPeerConnection(this.config.mockConfig);\n\t\t} else {\n\t\t\t// For real WebRTC, we would return RTCPeerConnection here\n\t\t\t// For now, always use mock\n\t\t\tthrow new Error(\"Real WebRTC not yet implemented. Use useMock: true\");\n\t\t}\n\t}\n\n\tprivate setupSignalingListeners(): void {\n\t\tconst unsubscribe = this.client.on(\"event_received\", ({ event }) => {\n\t\t\tthis.handleSignalingMessage(event).catch((error) => {\n\t\t\t\tconsole.error(\"Error handling signaling message:\", error);\n\t\t\t});\n\t\t});\n\n\t\tthis.eventUnsubscribers.push(unsubscribe);\n\t}\n\n\tprivate async handleSignalingMessage(event: Event): Promise<void> {\n\t\t// Cast to unknown first, then to Record to handle WebRTC event types which aren't in the base Event union\n\t\tconst eventAny = event as unknown as Record<string, unknown>;\n\t\tconst type = eventAny.type as string;\n\t\tconst fromUserId = (eventAny.metadata as Record<string, unknown>)?.userId as\n\t\t\t| string\n\t\t\t| undefined;\n\t\tconst myUserId = this.client.getUserId();\n\n\t\t// Ignore own messages\n\t\tif (!fromUserId || fromUserId === myUserId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = eventAny.data as Record<string, unknown> | undefined;\n\n\t\t// Check if this message is targeted at us\n\t\tconst targetPeerId = data?.targetPeerId as string | undefined;\n\t\tif (targetPeerId && targetPeerId !== myUserId) {\n\t\t\treturn; // Not for us\n\t\t}\n\n\t\tswitch (type) {\n\t\t\tcase \"webrtc:offer\":\n\t\t\t\tawait this.handleOffer(fromUserId, data ?? {});\n\t\t\t\tbreak;\n\t\t\tcase \"webrtc:answer\":\n\t\t\t\tawait this.handleAnswer(fromUserId, data ?? {});\n\t\t\t\tbreak;\n\t\t\tcase \"webrtc:ice_candidate\":\n\t\t\t\tawait this.handleIceCandidate(fromUserId, data ?? {});\n\t\t\t\tbreak;\n\t\t\tcase \"webrtc:disconnect\":\n\t\t\t\tthis.handlePeerDisconnect(fromUserId);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate async handleOffer(\n\t\tpeerId: string,\n\t\tdata: Record<string, unknown>,\n\t): Promise<void> {\n\t\t// Check if we already have a connection to this peer\n\t\tif (this.peers.has(peerId)) {\n\t\t\t// Could be a renegotiation - for now, reject duplicate offers\n\t\t\tconsole.warn(\n\t\t\t\t`Received offer from peer ${peerId} but already have a connection`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Create peer connection for incoming offer\n\t\tconst connection = this.createPeerConnection();\n\t\tconst peerState: PeerConnection = {\n\t\t\tpeerId,\n\t\t\tconnection,\n\t\t\tdataChannel: null,\n\t\t\tstate: \"connecting\",\n\t\t\tcreatedAt: Date.now(),\n\t\t};\n\t\tthis.peers.set(peerId, peerState);\n\n\t\tthis.setupConnectionHandlers(peerState);\n\n\t\t// Handle incoming data channel from the offerer\n\t\tconnection.ondatachannel = (event: { channel: MockRTCDataChannel }) => {\n\t\t\tpeerState.dataChannel = event.channel;\n\t\t\tthis.setupDataChannelHandlers(peerState, event.channel);\n\t\t};\n\n\t\t// Set remote description (the offer)\n\t\tawait connection.setRemoteDescription({\n\t\t\ttype: \"offer\",\n\t\t\tsdp: data.sdp as string,\n\t\t});\n\n\t\t// Create and send answer\n\t\tconst answer = await connection.createAnswer();\n\t\tawait connection.setLocalDescription(answer);\n\n\t\tawait this.sendSignal(peerId, \"webrtc:answer\", {\n\t\t\tsdp: answer.sdp,\n\t\t\ttype: answer.type,\n\t\t});\n\t}\n\n\tprivate async handleAnswer(\n\t\tpeerId: string,\n\t\tdata: Record<string, unknown>,\n\t): Promise<void> {\n\t\tconst peer = this.peers.get(peerId);\n\t\tif (!peer) {\n\t\t\tconsole.warn(`Received answer from unknown peer: ${peerId}`);\n\t\t\treturn;\n\t\t}\n\n\t\tawait peer.connection.setRemoteDescription({\n\t\t\ttype: \"answer\",\n\t\t\tsdp: data.sdp as string,\n\t\t});\n\t}\n\n\tprivate async handleIceCandidate(\n\t\tpeerId: string,\n\t\tdata: Record<string, unknown>,\n\t): Promise<void> {\n\t\tconst peer = this.peers.get(peerId);\n\t\tif (!peer) {\n\t\t\tconsole.warn(`Received ICE candidate from unknown peer: ${peerId}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst candidate = data.candidate as MockICECandidate;\n\t\tif (candidate) {\n\t\t\tawait peer.connection.addIceCandidate(candidate);\n\t\t}\n\t}\n\n\tprivate handlePeerDisconnect(peerId: string): void {\n\t\tconst peer = this.peers.get(peerId);\n\t\tif (!peer) return;\n\n\t\tpeer.dataChannel?.close();\n\t\tpeer.connection.close();\n\n\t\tthis.updatePeerState(peer, \"disconnected\");\n\t\tthis.peers.delete(peerId);\n\t\tthis.onPeerDisconnected?.(peerId);\n\t}\n\n\tprivate setupConnectionHandlers(peer: PeerConnection): void {\n\t\tconst connection = peer.connection;\n\n\t\t// ICE candidate handler - send to peer via signaling\n\t\tconnection.onicecandidate = (event: {\n\t\t\tcandidate: MockICECandidate | null;\n\t\t}) => {\n\t\t\tif (event.candidate) {\n\t\t\t\tthis.sendSignal(peer.peerId, \"webrtc:ice_candidate\", {\n\t\t\t\t\tcandidate: event.candidate,\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tconsole.error(\"Failed to send ICE candidate:\", error);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\t// Connection state change\n\t\tconnection.onconnectionstatechange = () => {\n\t\t\tconst state = connection.connectionState;\n\n\t\t\tif (state === \"connected\") {\n\t\t\t\tpeer.connectedAt = Date.now();\n\t\t\t\tthis.updatePeerState(peer, \"connected\");\n\t\t\t} else if (state === \"disconnected\" || state === \"closed\") {\n\t\t\t\tthis.updatePeerState(peer, \"disconnected\");\n\t\t\t\tthis.peers.delete(peer.peerId);\n\t\t\t\tthis.onPeerDisconnected?.(peer.peerId);\n\t\t\t} else if (state === \"failed\") {\n\t\t\t\tthis.updatePeerState(peer, \"failed\");\n\t\t\t\tthis.onError?.(peer.peerId, new Error(\"Connection failed\"));\n\t\t\t}\n\t\t};\n\n\t\t// ICE connection state (for error handling)\n\t\tconnection.oniceconnectionstatechange = () => {\n\t\t\tif (connection.iceConnectionState === \"failed\") {\n\t\t\t\tthis.updatePeerState(peer, \"failed\");\n\t\t\t\tthis.onError?.(peer.peerId, new Error(\"ICE connection failed\"));\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate setupDataChannelHandlers(\n\t\tpeer: PeerConnection,\n\t\tchannel: MockRTCDataChannel,\n\t): void {\n\t\tchannel.onopen = () => {\n\t\t\tthis.updatePeerState(peer, \"connected\");\n\t\t\tpeer.connectedAt = Date.now();\n\t\t\tthis.onPeerConnected?.(peer.peerId, channel);\n\t\t};\n\n\t\tchannel.onclose = () => {\n\t\t\tif (peer.state === \"connected\") {\n\t\t\t\tthis.updatePeerState(peer, \"disconnected\");\n\t\t\t\tthis.onPeerDisconnected?.(peer.peerId);\n\t\t\t}\n\t\t};\n\n\t\tchannel.onerror = (event: { error: Error }) => {\n\t\t\tthis.onError?.(peer.peerId, event.error);\n\t\t};\n\n\t\tchannel.onmessage = (event: { data: string | ArrayBuffer }) => {\n\t\t\tthis.onPeerMessage?.(peer.peerId, event.data);\n\t\t};\n\t}\n\n\tprivate updatePeerState(\n\t\tpeer: PeerConnection,\n\t\tstate: PeerConnectionState,\n\t): void {\n\t\tconst oldState = peer.state;\n\t\tpeer.state = state;\n\n\t\tif (oldState !== state) {\n\t\t\tthis.onStateChange?.(peer.peerId, state);\n\t\t}\n\t}\n\n\tprivate async sendSignal(\n\t\tpeerId: string,\n\t\ttype: string,\n\t\tdata: Record<string, unknown>,\n\t): Promise<void> {\n\t\tconst myUserId = this.client.getUserId();\n\t\tconst roomId = this.client.getCurrentRoomId();\n\n\t\tif (!roomId) {\n\t\t\tthrow new Error(\"Cannot send WebRTC signal: not in a room\");\n\t\t}\n\n\t\t// Create a WebRTC signaling event\n\t\t// Cast to Event since WebRTC types extend the base event pattern\n\t\tconst signalEvent = {\n\t\t\tid: `webrtc-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n\t\t\ttype,\n\t\t\ttimestamp: Date.now(),\n\t\t\tuserId: myUserId || \"\",\n\t\t\troomId,\n\t\t\tdata: {\n\t\t\t\t...data,\n\t\t\t\ttargetPeerId: peerId,\n\t\t\t},\n\t\t\tmetadata: {\n\t\t\t\tuserId: myUserId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\troomId,\n\t\t\t},\n\t\t} as unknown as Event;\n\n\t\tawait this.client.broadcast(signalEvent);\n\t}\n}\n",
30
31
  "import createWebSocketStream from './lib/stream.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport { createWebSocketStream, Receiver, Sender, WebSocket, WebSocketServer };\nexport default WebSocket;\n",
31
- "import type { ITransportAdapter } from '../../abstractions/TransportAdapter.js';\nimport type { IAuthAdapter } from '../../abstractions/AuthAdapter.js';\nimport type {\n ConnectionState,\n ConnectionOptions,\n Message,\n MessageHandler,\n ErrorHandler,\n CloseHandler\n} from '../../types/index.js';\nimport type { Server as HttpServer } from 'http';\nimport type { Server as HttpsServer } from 'https';\nimport type { IncomingMessage } from 'http';\nimport { WebSocketServer, WebSocket } from 'ws';\n\ninterface ClientConnection {\n id: string;\n ws: WebSocket;\n userId?: string;\n authenticated: boolean;\n metadata?: Record<string, unknown>;\n authTimeout?: NodeJS.Timeout;\n connectedAt: number;\n}\n\nexport interface WebSocketServerTransportConfig {\n authTimeout?: number;\n closeOnAuthFailure?: boolean;\n requireAuth?: boolean;\n}\n\nexport class WebSocketServerTransportAdapter 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 \n // Standalone mode properties\n private wss?: WebSocketServer;\n private serverUrl?: string;\n \n // Integration mode properties\n private attachedServer?: HttpServer | HttpsServer;\n private attachedWss?: WebSocketServer;\n private webSocketPath?: string;\n \n // Client management\n private clients = new Map<string, ClientConnection>();\n private mode: 'standalone' | 'integration' = 'standalone';\n \n // Authentication\n private authAdapter?: IAuthAdapter;\n private config: WebSocketServerTransportConfig;\n\n constructor(config?: WebSocketServerTransportConfig) {\n this.config = {\n authTimeout: config?.authTimeout ?? 5000,\n closeOnAuthFailure: config?.closeOnAuthFailure ?? false,\n requireAuth: config?.requireAuth ?? false,\n ...config\n };\n }\n\n // Set the auth adapter\n setAuthAdapter(auth: IAuthAdapter): void {\n this.authAdapter = auth;\n // Use auth adapter's preference only if requireAuth is not already true\n // This allows explicit requireAuth: true in config to take precedence\n if (auth.isAuthRequired && !this.config.requireAuth) {\n this.config.requireAuth = auth.isAuthRequired();\n }\n // For authTimeout, use adapter's value if not explicitly set (not matching default)\n if (auth.getAuthTimeout && this.config.authTimeout === 5000) {\n this.config.authTimeout = auth.getAuthTimeout();\n }\n }\n\n // Standalone mode implementation\n async connect(url: string, _options?: ConnectionOptions): Promise<void> {\n if (this.state === 'connected' || this.state === 'connecting') {\n throw new Error('Already connected or connecting');\n }\n\n this.state = 'connecting';\n this.serverUrl = url;\n this.mode = 'standalone';\n\n try {\n // Extract port from URL\n const urlObj = new URL(url);\n const port = parseInt(urlObj.port) || (urlObj.protocol === 'wss:' ? 443 : 80);\n\n // Create WebSocket server\n this.wss = new WebSocketServer({ port });\n\n this.wss.on('connection', (ws, req) => {\n this.handleConnection(ws, req);\n });\n\n this.wss.on('error', (error) => {\n this.errorHandlers.forEach(handler => handler(error));\n });\n\n this.wss.on('close', () => {\n this.state = 'disconnected';\n this.closeHandlers.forEach(handler => handler(1000, 'Server closed'));\n });\n\n this.state = 'connected';\n } catch (error) {\n this.state = 'disconnected';\n throw error;\n }\n }\n\n // Integration mode implementation\n async attach(server: HttpServer | HttpsServer, path: string = '/ws'): Promise<void> {\n if (this.state === 'connected' || this.state === 'connecting') {\n throw new Error('Already connected or connecting');\n }\n\n this.state = 'connecting';\n this.attachedServer = server;\n this.webSocketPath = path;\n this.mode = 'integration';\n\n try {\n // Create WebSocket server attached to the existing HTTP server\n this.wss = new WebSocketServer({ \n server, \n path,\n perMessageDeflate: false\n });\n\n this.wss.on('connection', (ws, req) => {\n this.handleConnection(ws, req);\n });\n\n this.wss.on('error', (error) => {\n this.errorHandlers.forEach(handler => handler(error));\n });\n\n this.state = 'connected';\n } catch (error) {\n this.state = 'disconnected';\n throw error;\n }\n }\n\n async attachToWebSocketServer(wss: WebSocketServer): Promise<void> {\n if (this.state === 'connected' || this.state === 'connecting') {\n throw new Error('Already connected or connecting');\n }\n\n this.state = 'connecting';\n this.attachedWss = wss;\n this.mode = 'integration';\n\n try {\n this.wss = wss;\n\n this.wss.on('connection', (ws, req) => {\n this.handleConnection(ws, req);\n });\n\n this.wss.on('error', (error) => {\n this.errorHandlers.forEach(handler => handler(error));\n });\n\n this.state = 'connected';\n } catch (error) {\n this.state = 'disconnected';\n throw error;\n }\n }\n\n private async handleConnection(ws: WebSocket, req: IncomingMessage): Promise<void> {\n const clientId = this.generateId();\n\n // Step 1: Try token authentication via Authorization header\n let authenticated = false;\n let userId: string | undefined;\n let metadata: Record<string, unknown> | undefined;\n\n if (this.authAdapter && req.headers.authorization) {\n const token = this.extractBearerToken(req.headers.authorization as string);\n if (token) {\n try {\n const tokenPayload = await this.authAdapter.validateToken(token);\n authenticated = true;\n userId = tokenPayload.userId;\n metadata = tokenPayload.metadata;\n } catch {\n // Header auth failed but don't reject connection yet\n // Client can still authenticate via message\n }\n }\n }\n\n // Step 2: Create client with auth state\n const client: ClientConnection = {\n id: clientId,\n ws,\n authenticated,\n userId,\n metadata,\n connectedAt: Date.now()\n };\n \n this.clients.set(clientId, client);\n \n // Step 3: Set up message handling\n ws.on('message', (data) => {\n this.handleClientMessage(clientId, data);\n });\n\n ws.on('error', (error) => {\n this.errorHandlers.forEach(handler => handler(error));\n });\n\n ws.on('close', (_code, _reason) => {\n // Clear auth timeout if exists\n if (client.authTimeout) {\n clearTimeout(client.authTimeout);\n }\n this.clients.delete(clientId);\n });\n \n // Step 4: Set auth timeout if not authenticated and auth is required\n if (!authenticated && this.config.requireAuth && this.authAdapter) {\n client.authTimeout = setTimeout(() => {\n if (!client.authenticated) {\n ws.close(1008, 'Authentication timeout');\n this.clients.delete(clientId);\n }\n }, this.config.authTimeout);\n }\n \n // Step 5: Notify about connection (with auth status)\n const connectionMessage: Message = {\n id: this.generateId(),\n type: 'connection',\n payload: {\n clientId,\n authenticated,\n userId: client.userId,\n metadata: client.metadata\n },\n timestamp: Date.now()\n };\n \n this.messageHandlers.forEach(handler => handler(connectionMessage));\n }\n \n private async handleClientMessage(clientId: string, data: Buffer | ArrayBuffer | Buffer[]): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) return;\n\n try {\n const message = JSON.parse(data.toString()) as Message;\n\n // Special handling for authentication messages\n if (message.type === 'authenticate' && !client.authenticated && this.authAdapter) {\n await this.handleAuthMessage(client, message);\n return;\n }\n\n // Reject messages from unauthenticated clients if auth is required\n if (this.config.requireAuth && !client.authenticated) {\n this.sendToClient(client, {\n id: this.generateId(),\n type: 'error',\n payload: { error: 'Authentication required' },\n timestamp: Date.now()\n });\n return;\n }\n \n // Add clientId to message payload for routing\n const enrichedMessage = {\n ...message,\n payload: {\n ...(message.payload as object),\n clientId\n }\n };\n \n this.messageHandlers.forEach(handler => handler(enrichedMessage));\n } catch (error) {\n this.errorHandlers.forEach(handler => handler(error as Error));\n }\n }\n \n private async handleAuthMessage(client: ClientConnection, message: Message): Promise<void> {\n if (!this.authAdapter) {\n this.sendToClient(client, {\n id: this.generateId(),\n type: 'auth_result',\n payload: { success: false, error: 'No auth adapter configured' },\n timestamp: Date.now()\n });\n return;\n }\n\n const payload = message.payload as Record<string, unknown>;\n\n // Token-based authentication only\n if (!payload.token || typeof payload.token !== 'string') {\n this.sendToClient(client, {\n id: this.generateId(),\n type: 'auth_result',\n payload: { success: false, error: 'Token required for authentication' },\n timestamp: Date.now()\n });\n return;\n }\n\n try {\n const tokenPayload = await this.authAdapter.validateToken(payload.token);\n\n // Clear auth timeout\n if (client.authTimeout) {\n clearTimeout(client.authTimeout);\n client.authTimeout = undefined;\n }\n\n // Update client state\n client.authenticated = true;\n client.userId = tokenPayload.userId;\n client.metadata = tokenPayload.metadata;\n\n // Send success response\n this.sendToClient(client, {\n id: this.generateId(),\n type: 'auth_result',\n payload: {\n success: true,\n userId: client.userId\n },\n timestamp: Date.now()\n });\n\n // Notify handlers about authentication\n const authMessage: Message = {\n id: this.generateId(),\n type: 'client_authenticated',\n payload: {\n clientId: client.id,\n userId: client.userId,\n metadata: client.metadata\n },\n timestamp: Date.now()\n };\n\n this.messageHandlers.forEach(handler => handler(authMessage));\n } catch (error) {\n this.sendToClient(client, {\n id: this.generateId(),\n type: 'auth_result',\n payload: {\n success: false,\n error: (error as Error).message\n },\n timestamp: Date.now()\n });\n\n // Optionally close connection on auth failure\n if (this.config.closeOnAuthFailure) {\n client.ws.close(1008, 'Authentication failed');\n this.clients.delete(client.id);\n }\n }\n }\n \n private extractBearerToken(authHeader: string): string | null {\n if (authHeader.startsWith('Bearer ')) {\n return authHeader.substring(7);\n }\n return null;\n }\n \n private sendToClient(client: ClientConnection, message: Message): void {\n if (client.ws.readyState === WebSocket.OPEN) {\n client.ws.send(JSON.stringify(message));\n }\n }\n\n async disconnect(): Promise<void> {\n if (this.state === 'disconnected') {\n return;\n }\n\n this.state = 'disconnecting';\n\n // Close all client connections\n for (const [_clientId, client] of this.clients) {\n try {\n if (client.authTimeout) {\n clearTimeout(client.authTimeout);\n }\n client.ws.close(1000, 'Server shutting down');\n } catch {\n // Ignore errors when closing individual connections\n }\n }\n this.clients.clear();\n\n // Close the WebSocket server (only if we created it)\n if (this.wss && this.mode === 'standalone') {\n await new Promise<void>((resolve) => {\n this.wss!.close(() => resolve());\n });\n }\n\n this.state = 'disconnected';\n this.wss = undefined;\n this.attachedServer = undefined;\n this.attachedWss = undefined;\n }\n\n async send(message: Message): Promise<void> {\n if (this.state !== 'connected') {\n throw new Error('Not connected');\n }\n\n // Extract clientId from message payload for routing\n const payload = message.payload as { clientId?: string; [key: string]: unknown };\n const { clientId, ...clientMessage } = payload;\n\n if (!clientId) {\n throw new Error('Message must contain clientId in payload for routing');\n }\n\n const client = this.clients.get(clientId);\n if (!client) {\n throw new Error(`Client ${clientId} not found`);\n }\n\n if (client.ws.readyState !== WebSocket.OPEN) {\n throw new Error(`Client ${clientId} connection is not open`);\n }\n\n // Fully unwrap the server_message envelope\n // The server_message wrapper is used internally for routing between BaseServer and transport\n // We need to extract the actual message from inside the wrapper before sending to the client\n const messageToSend = message.type === 'server_message' && clientMessage.type\n ? {\n id: message.id,\n type: clientMessage.type as string,\n payload: clientMessage.payload || ((): Record<string, unknown> => {\n // If there's no explicit payload field, use all remaining fields except 'type'\n const { type, ...rest } = clientMessage;\n return rest;\n })(),\n timestamp: message.timestamp\n }\n : {\n ...message,\n payload: clientMessage\n };\n\n client.ws.send(JSON.stringify(messageToSend));\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 // Utility methods\n getConnectedClients(): ClientConnection[] {\n return Array.from(this.clients.values());\n }\n \n getAuthenticatedClients(): ClientConnection[] {\n return Array.from(this.clients.values()).filter(c => c.authenticated);\n }\n\n getClientCount(): number {\n return this.clients.size;\n }\n\n getMode(): 'standalone' | 'integration' {\n return this.mode;\n }\n \n isAuthRequired(): boolean {\n return this.config.requireAuth ?? false;\n }\n\n private generateId(): string {\n return Math.random().toString(36).substring(2) + Date.now().toString(36);\n }\n}",
32
- "import type { ITransportAdapter } from '../../abstractions/TransportAdapter.js';\nimport type {\n ConnectionState,\n ConnectionOptions,\n Message,\n MessageHandler,\n ErrorHandler,\n CloseHandler\n} from '../../types/index.js';\nimport { WebSocket } from 'ws';\n\nexport interface WebSocketClientConfig {\n /**\n * Additional headers to send with the WebSocket connection request\n */\n headers?: Record<string, string>;\n\n /**\n * Connection timeout in milliseconds\n * @default 30000\n */\n connectionTimeout?: number;\n\n /**\n * Enable automatic ping/pong for connection health checks\n * @default true\n */\n enableHeartbeat?: boolean;\n\n /**\n * Heartbeat interval in milliseconds\n * @default 30000\n */\n heartbeatInterval?: number;\n}\n\n/**\n * WebSocket client transport adapter for connecting to remote WebSocket servers.\n *\n * This adapter creates an outgoing WebSocket connection and is intended for use\n * with BaseClient. For server-side operations (accepting incoming connections),\n * use WebSocketServerTransportAdapter instead.\n *\n * @example\n * ```typescript\n * const transport = new WebSocketClientTransportAdapter();\n * const client = new ClientBuilder()\n * .withTransport(transport)\n * .build();\n *\n * await client.connect('ws://localhost:3000');\n * ```\n */\nexport class WebSocketClientTransportAdapter implements ITransportAdapter {\n private ws?: WebSocket;\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 config: Required<WebSocketClientConfig>;\n private heartbeatTimer?: NodeJS.Timeout;\n private connectionTimer?: NodeJS.Timeout;\n\n constructor(config?: WebSocketClientConfig) {\n this.config = {\n headers: config?.headers ?? {},\n connectionTimeout: config?.connectionTimeout ?? 30000,\n enableHeartbeat: config?.enableHeartbeat ?? true,\n heartbeatInterval: config?.heartbeatInterval ?? 30000\n };\n }\n\n async connect(url: string, options?: ConnectionOptions): Promise<void> {\n if (this.state === 'connected' || this.state === 'connecting') {\n throw new Error('Already connected or connecting');\n }\n\n this.state = 'connecting';\n\n return new Promise<void>((resolve, reject) => {\n try {\n // Create WebSocket client connection\n const wsOptions: any = {};\n\n // Add custom headers if provided\n if (Object.keys(this.config.headers).length > 0) {\n wsOptions.headers = this.config.headers;\n }\n\n this.ws = new WebSocket(url, wsOptions);\n\n // Set up connection timeout\n this.connectionTimer = setTimeout(() => {\n if (this.state === 'connecting') {\n this.ws?.terminate();\n this.state = 'disconnected';\n const error = new Error('Connection timeout');\n this.errorHandlers.forEach(handler => handler(error));\n reject(error);\n }\n }, this.config.connectionTimeout);\n\n // Handle connection open\n this.ws.on('open', () => {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = undefined;\n }\n\n this.state = 'connected';\n\n // Start heartbeat if enabled\n if (this.config.enableHeartbeat) {\n this.startHeartbeat();\n }\n\n resolve();\n });\n\n // Handle incoming messages\n this.ws.on('message', (data: Buffer | ArrayBuffer | Buffer[]) => {\n try {\n const message = JSON.parse(data.toString()) as Message;\n this.messageHandlers.forEach(handler => handler(message));\n } catch (error) {\n this.errorHandlers.forEach(handler => handler(error as Error));\n }\n });\n\n // Handle errors\n this.ws.on('error', (error: Error) => {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = undefined;\n }\n\n this.errorHandlers.forEach(handler => handler(error));\n\n // If error occurs during connection, reject the promise\n if (this.state === 'connecting') {\n this.state = 'disconnected';\n reject(error);\n }\n });\n\n // Handle connection close\n this.ws.on('close', (code: number, reason: Buffer) => {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = undefined;\n }\n\n this.stopHeartbeat();\n\n const wasConnected = this.state === 'connected';\n this.state = 'disconnected';\n\n if (wasConnected) {\n this.closeHandlers.forEach(handler => handler(code, reason.toString()));\n }\n });\n\n // Handle pong responses for heartbeat\n if (this.config.enableHeartbeat) {\n this.ws.on('pong', () => {\n // Connection is alive\n });\n }\n } catch (error) {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = undefined;\n }\n this.state = 'disconnected';\n reject(error);\n }\n });\n }\n\n async disconnect(): Promise<void> {\n if (this.state === 'disconnected') {\n return;\n }\n\n this.state = 'disconnecting';\n this.stopHeartbeat();\n\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer);\n this.connectionTimer = undefined;\n }\n\n if (this.ws) {\n // Close with normal closure code\n this.ws.close(1000, 'Client disconnecting');\n\n // Wait for close event or timeout\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n this.ws?.terminate();\n resolve();\n }, 5000);\n\n const onClose = () => {\n clearTimeout(timeout);\n resolve();\n };\n\n this.ws?.once('close', onClose);\n });\n\n this.ws = undefined;\n }\n\n this.state = 'disconnected';\n }\n\n async send(message: Message): Promise<void> {\n if (this.state !== 'connected') {\n throw new Error('Not connected');\n }\n\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket connection is not open');\n }\n\n try {\n const data = JSON.stringify(message);\n this.ws.send(data);\n } catch (error) {\n this.errorHandlers.forEach(handler => handler(error as Error));\n throw error;\n }\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' && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get the underlying WebSocket instance\n * Useful for advanced use cases\n */\n getWebSocket(): WebSocket | undefined {\n return this.ws;\n }\n\n /**\n * Set custom headers for the WebSocket connection\n * Must be called before connect()\n */\n setHeaders(headers: Record<string, string>): void {\n if (this.state !== 'disconnected') {\n throw new Error('Cannot set headers while connected');\n }\n this.config.headers = { ...this.config.headers, ...headers };\n }\n\n /**\n * Add an authorization header for authentication\n * Must be called before connect()\n */\n setAuthToken(token: string): void {\n this.setHeaders({ Authorization: `Bearer ${token}` });\n }\n\n // Private methods\n\n private startHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n }\n\n this.heartbeatTimer = setInterval(() => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n // Send an actual heartbeat message instead of just a WebSocket ping\n // This ensures the server processes it and updates presence activity\n const heartbeatMessage: Message = {\n id: `heartbeat-${Date.now()}`,\n type: 'heartbeat',\n payload: { timestamp: Date.now() },\n timestamp: Date.now()\n };\n this.ws.send(JSON.stringify(heartbeatMessage));\n }\n }, this.config.heartbeatInterval);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = undefined;\n }\n }\n}\n",
33
- "import type {\n ConnectionState,\n ConnectionOptions,\n Message,\n Event,\n RoomState,\n RoomUser,\n LockRequest,\n Lock,\n AuthenticatePayload,\n AuthenticateResult\n} from '../types/index.js';\nimport type { SerializableRoomState } from '../types/room.js';\nimport { deserializeRoomState } from '../types/room.js';\nimport type { ITransportAdapter } from '../abstractions/TransportAdapter.js';\nimport type { IAuthAdapter } from '../abstractions/AuthAdapter.js';\nimport type { IStorageAdapter } from '../abstractions/StorageAdapter.js';\nimport { TypedEventEmitter } from '../abstractions/EventEmitter.js';\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 authenticated: { userId: string };\n authentication_failed: { error: 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 lastToken: string | 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 /**\n * Connect to the server with an optional authentication token.\n *\n * @param url The WebSocket URL to connect to\n * @param token Optional JWT token for authentication\n */\n async connect(url: string, token?: string): 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.lastToken = token || null;\n\n try {\n // Use provided token or try to get existing token from auth adapter\n let tokenToApply = token || null;\n\n if (!tokenToApply && this.auth && typeof this.auth.getCurrentToken === 'function') {\n tokenToApply = this.auth.getCurrentToken();\n }\n\n if (tokenToApply) {\n this.authToken = tokenToApply;\n\n // Try to validate and get user info from token\n if (this.auth) {\n try {\n const payload = await this.auth.validateToken(tokenToApply);\n this.userId = payload.userId;\n } catch {\n // Token validation failed locally, server will validate\n }\n }\n\n // Apply token to transport if it supports it\n if (typeof (this.transport as any).setAuthToken === 'function') {\n (this.transport as any).setAuthToken(tokenToApply);\n }\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.lastToken || undefined);\n }\n\n // Authentication\n /**\n * Send an authenticate message to the server with the current token.\n * This must be called after connect() to complete the authentication handshake.\n *\n * @param options Optional authentication options including deviceId and metadata\n * @throws Error if client is not connected or no auth token is available\n */\n async authenticate(options?: Omit<AuthenticatePayload, 'token'>): Promise<void> {\n if (this.connectionState !== 'connected') {\n throw new Error('Client must be connected to authenticate');\n }\n\n if (!this.authToken) {\n throw new Error('No auth token available. Connect with credentials first.');\n }\n\n const payload: AuthenticatePayload = {\n token: this.authToken,\n ...options\n };\n\n const message: Message = {\n id: this.generateId(),\n type: 'authenticate',\n payload,\n timestamp: Date.now()\n };\n\n await this.transport.send(message);\n // Response will be handled in handleMessage via auth_result\n }\n\n /**\n * Check if the client has an auth token available.\n */\n hasAuthToken(): boolean {\n return this.authToken !== null;\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 'auth_result':\n await this.handleAuthResult(message.payload as AuthenticateResult);\n break;\n case 'room_joined':\n await this.handleRoomJoined(message.payload as { roomId: string; state: SerializableRoomState });\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 handleAuthResult(payload: AuthenticateResult): Promise<void> {\n if (payload.success) {\n if (payload.userId) {\n this.userId = payload.userId;\n }\n await this.emit('authenticated', { userId: this.userId || '' });\n } else {\n await this.emit('authentication_failed', { error: payload.error || 'Authentication failed' });\n }\n }\n\n private async handleRoomJoined(payload: { roomId: string; state: SerializableRoomState }): Promise<void> {\n this.currentRoomId = payload.roomId;\n\n // Deserialize the plain objects back to Maps\n const roomState = deserializeRoomState(payload.state);\n this.currentRoomState = roomState;\n\n await this.emit('room_joined', { roomId: payload.roomId, state: roomState });\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}",
34
- "import type { ITransportAdapter } from '../abstractions/TransportAdapter.js';\nimport type { IAuthAdapter } from '../abstractions/AuthAdapter.js';\nimport type { IStorageAdapter } from '../abstractions/StorageAdapter.js';\nimport { BaseClient, type ClientConfig } from './BaseClient.js';\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}",
35
- "/**\n * Presence Client Helper\n *\n * Simplifies client-side presence integration for web/Electron applications.\n * Automatically handles connection, authentication, and presence event forwarding.\n */\n\nimport { BaseClient, type ClientConfig } from './BaseClient.js';\nimport { TypedEventEmitter } from '../abstractions/EventEmitter.js';\nimport type { UserPresence } from '../types/presence.js';\n\nexport interface PresenceClientConfig {\n /**\n * Base client configuration\n * Provide the full client config including transport and auth adapters\n */\n clientConfig: ClientConfig;\n\n /**\n * WebSocket URL to connect to\n */\n wsUrl: string;\n\n /**\n * Automatically connect on construction\n * @default false\n */\n autoConnect?: boolean;\n\n /**\n * Automatically reconnect on disconnect\n * @default true\n */\n autoReconnect?: boolean;\n\n /**\n * Global presence room ID\n * @default '__global_presence__'\n */\n globalRoomId?: string;\n}\n\nexport interface PresenceClientEvents {\n /**\n * User came online\n */\n userOnline: { userId: string; devices: unknown[] };\n\n /**\n * User went offline\n */\n userOffline: { userId: string };\n\n /**\n * User's presence status changed\n */\n statusChanged: { userId: string; status: string; statusMessage?: string };\n\n /**\n * Connected to presence system\n */\n connected: {};\n\n /**\n * Disconnected from presence system\n */\n disconnected: {};\n\n /**\n * Error occurred\n */\n error: { error: Error };\n\n [key: string]: unknown;\n}\n\n/**\n * High-level presence client for easy integration\n *\n * Example:\n * ```typescript\n * import { PresenceClient } from '@principal-ai/control-tower-core';\n * import { WebSocketClientTransportAdapter } from '@principal-ai/control-tower-core';\n * import { ClientBuilder } from '@principal-ai/control-tower-core';\n *\n * const transport = new WebSocketClientTransportAdapter();\n *\n * const client = new ClientBuilder()\n * .withTransport(transport)\n * .build();\n *\n * const presence = new PresenceClient({\n * clientConfig: client,\n * wsUrl: 'ws://localhost:3000/ws',\n * autoConnect: true,\n * autoReconnect: true\n * });\n *\n * presence.on('userOnline', (data) => {\n * console.log(`${data.userId} came online`);\n * });\n *\n * presence.on('userOffline', (data) => {\n * console.log(`${data.userId} went offline`);\n * });\n * ```\n */\nexport class PresenceClient extends TypedEventEmitter<PresenceClientEvents> {\n private client: BaseClient;\n private wsUrl: string;\n private autoReconnectEnabled: boolean;\n private globalRoomId: string;\n private reconnectTimeout?: NodeJS.Timeout;\n\n constructor(config: PresenceClientConfig) {\n super();\n\n this.wsUrl = config.wsUrl;\n this.autoReconnectEnabled = config.autoReconnect ?? true;\n this.globalRoomId = config.globalRoomId ?? '__global_presence__';\n\n // Create base client\n this.client = new BaseClient(config.clientConfig);\n\n this.setupEventForwarding();\n\n if (config.autoConnect) {\n void this.connect();\n }\n }\n\n /**\n * Connect to the presence system\n */\n async connect(): Promise<void> {\n try {\n // Connect base client\n await this.client.connect(this.wsUrl);\n\n // Join global presence room\n await this.client.joinRoom(this.globalRoomId);\n\n await this.emit('connected', {});\n } catch (error) {\n await this.emit('error', { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Disconnect from the presence system\n */\n async disconnect(): Promise<void> {\n // Disable auto-reconnect\n this.autoReconnectEnabled = false;\n\n // Clear any pending reconnect\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n try {\n // Leave global presence room\n await this.client.leaveRoom();\n\n // Disconnect\n await this.client.disconnect();\n\n await this.emit('disconnected', {});\n } catch (error) {\n await this.emit('error', { error: error as Error });\n }\n }\n\n /**\n * Get all online users\n *\n * Note: This requires a corresponding API endpoint on your server.\n */\n async getOnlineUsers(): Promise<UserPresence[]> {\n // This assumes you have a REST API endpoint for fetching online users\n // You can customize this based on your server implementation\n throw new Error(\n 'getOnlineUsers() requires a REST API endpoint. ' +\n 'Implement this method based on your server API.'\n );\n }\n\n /**\n * Set user status\n *\n * Note: This requires a corresponding API endpoint on your server.\n */\n async setStatus(status: 'online' | 'away', message?: string): Promise<void> {\n // This assumes you have a REST API endpoint for setting status\n // You can customize this based on your server implementation\n throw new Error(\n 'setStatus() requires a REST API endpoint. ' +\n 'Implement this method based on your server API.'\n );\n }\n\n /**\n * Set visibility\n *\n * Note: This requires a corresponding API endpoint on your server.\n */\n async setVisibility(visible: boolean): Promise<void> {\n // This assumes you have a REST API endpoint for setting visibility\n // You can customize this based on your server implementation\n throw new Error(\n 'setVisibility() requires a REST API endpoint. ' +\n 'Implement this method based on your server API.'\n );\n }\n\n /**\n * Get the underlying BaseClient\n */\n getClient(): BaseClient {\n return this.client;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n // BaseClient doesn't expose getState(), so we check internal state via a workaround\n // In practice, you can track connection state via events\n return (this.client as any).connectionState === 'connected';\n }\n\n /**\n * Set up event forwarding from BaseClient\n * @private\n */\n private setupEventForwarding(): void {\n // Forward presence events with simplified API\n this.client.on('presence:user_online', (data) => {\n if (data && typeof data === 'object') {\n const payload = data as { userId: string; devices?: unknown[] };\n void this.emit('userOnline', {\n userId: payload.userId,\n devices: payload.devices || []\n });\n }\n });\n\n this.client.on('presence:user_offline', (data) => {\n if (data && typeof data === 'object') {\n const payload = data as { userId: string };\n void this.emit('userOffline', { userId: payload.userId });\n }\n });\n\n this.client.on('presence:status_changed', (data) => {\n if (data && typeof data === 'object') {\n const payload = data as { userId: string; status: string; statusMessage?: string };\n void this.emit('statusChanged', {\n userId: payload.userId,\n status: payload.status,\n statusMessage: payload.statusMessage\n });\n }\n });\n\n // Handle disconnection\n this.client.on('disconnected', () => {\n void this.emit('disconnected', {});\n\n // Auto-reconnect if enabled\n if (this.autoReconnectEnabled) {\n this.reconnectTimeout = setTimeout(() => {\n void this.connect().catch((error) => {\n void this.emit('error', { error: error as Error });\n });\n }, 5000);\n }\n });\n\n // Forward errors\n this.client.on('error', (data) => {\n if (data && typeof data === 'object' && 'error' in data) {\n const payload = data as { error: Error };\n void this.emit('error', { error: payload.error });\n }\n });\n }\n}\n",
36
- "/**\n * Experimental Broadcast APIs\n *\n * ⚠️ DEVELOPMENT USE ONLY\n *\n * This namespace provides experimental broadcast methods for rapid prototyping\n * and internal tooling. These APIs may change or be removed without major version bumps.\n *\n * For production use, submit a feature request to graduate these APIs to first-class APIs.\n *\n * @see docs/EXPERIMENTAL_BROADCAST.md\n * @see docs/FEATURE_REQUEST_TEMPLATE.md\n */\n\nimport type { Message } from '../types/index.js';\nimport type {\n ExperimentalFeatureConfig,\n ClientPredicate,\n BroadcastResult,\n BroadcastOptions,\n ExperimentalUsageEvent\n} from '../types/experimental.js';\nimport { ExperimentalFeatureError } from '../types/experimental.js';\nimport type { ConnectedClient } from './BaseServer.js';\n\n/**\n * Experimental API namespace\n *\n * Provides broadcast methods that bypass normal room isolation.\n * Requires explicit opt-in via configuration.\n */\nexport class ExperimentalAPI {\n private readonly config: ExperimentalFeatureConfig;\n private readonly logger?: { warn: (message: string, ...args: unknown[]) => void };\n private readonly emitMetric?: (event: ExperimentalUsageEvent) => void;\n private readonly getClients: () => ConnectedClient[];\n private readonly sendToClient: (clientId: string, message: Record<string, unknown>) => Promise<void>;\n\n constructor(options: {\n config: ExperimentalFeatureConfig;\n logger?: { warn: (message: string, ...args: unknown[]) => void };\n emitMetric?: (event: ExperimentalUsageEvent) => void;\n getClients: () => ConnectedClient[];\n sendToClient: (clientId: string, message: Record<string, unknown>) => Promise<void>;\n }) {\n this.config = options.config;\n this.logger = options.logger;\n this.emitMetric = options.emitMetric;\n this.getClients = options.getClients;\n this.sendToClient = options.sendToClient;\n }\n\n /**\n * Broadcasts a message to all connected clients\n *\n * ⚠️ WARNING: This bypasses room isolation and sends to every connected client.\n *\n * @experimental\n * @param message - Message to broadcast\n * @param options - Broadcast options\n * @returns Broadcast result with success/failure counts\n *\n * @throws {ExperimentalFeatureError} If experimental.enableBroadcast is not enabled\n *\n * @example\n * ```typescript\n * await server.experimental.broadcast({\n * type: 'system:announcement',\n * data: { message: 'Server maintenance in 5 minutes' }\n * });\n * ```\n */\n async broadcast(\n message: Omit<Message, 'id' | 'timestamp'>,\n options?: BroadcastOptions\n ): Promise<BroadcastResult> {\n this.ensureEnabled('broadcast', 'enableBroadcast');\n this.warnIfEnabled('broadcast()');\n\n const clients = this.getClients();\n\n const result = await this.broadcastToClients(clients, message, options);\n\n this.trackUsage('broadcast', message.type, clients.length, message.payload);\n\n return result;\n }\n\n /**\n * Broadcasts a message to all authenticated clients\n *\n * Skips unauthenticated connections. Useful for user-specific notifications.\n *\n * @experimental\n * @param message - Message to broadcast\n * @param options - Broadcast options\n * @returns Broadcast result with success/failure counts\n *\n * @throws {ExperimentalFeatureError} If experimental.enableBroadcast is not enabled\n *\n * @example\n * ```typescript\n * await server.experimental.broadcastAuthenticated({\n * type: 'presence:user_online',\n * data: { userId: 'alice', status: 'online' }\n * });\n * ```\n */\n async broadcastAuthenticated(\n message: Omit<Message, 'id' | 'timestamp'>,\n options?: BroadcastOptions\n ): Promise<BroadcastResult> {\n this.ensureEnabled('broadcastAuthenticated', 'enableBroadcast');\n this.warnIfEnabled('broadcastAuthenticated()');\n\n const clients = this.getClients().filter(client => client.authenticated);\n\n const result = await this.broadcastToClients(clients, message, options);\n\n this.trackUsage('broadcastAuthenticated', message.type, clients.length, message.payload);\n\n return result;\n }\n\n /**\n * Broadcasts a message to clients matching a predicate function\n *\n * Allows custom filtering logic for targeted broadcasts.\n *\n * @experimental\n * @param predicate - Function to filter clients\n * @param message - Message to broadcast\n * @param options - Broadcast options\n * @returns Broadcast result with success/failure counts\n *\n * @throws {ExperimentalFeatureError} If experimental.enableBroadcast is not enabled\n *\n * @example\n * ```typescript\n * // Broadcast only to admin users\n * await server.experimental.broadcastWhere(\n * (client) => getUserRole(client.userId) === 'admin',\n * {\n * type: 'admin:alert',\n * data: { message: 'Critical system event' }\n * }\n * );\n * ```\n */\n async broadcastWhere(\n predicate: ClientPredicate,\n message: Omit<Message, 'id' | 'timestamp'>,\n options?: BroadcastOptions\n ): Promise<BroadcastResult> {\n this.ensureEnabled('broadcastWhere', 'enableBroadcast');\n this.warnIfEnabled('broadcastWhere()');\n\n const clients = this.getClients().filter(predicate);\n\n const result = await this.broadcastToClients(clients, message, options);\n\n this.trackUsage('broadcastWhere', message.type, clients.length, message.payload);\n\n return result;\n }\n\n /**\n * Sends a message to specific users by their user IDs\n *\n * Useful for direct notifications and cross-room messaging.\n *\n * @experimental\n * @param userIds - Array of user IDs to send to\n * @param message - Message to send\n * @param options - Broadcast options\n * @returns Broadcast result with success/failure counts\n *\n * @throws {ExperimentalFeatureError} If experimental.enableBroadcast is not enabled\n *\n * @example\n * ```typescript\n * await server.experimental.sendToUsers(\n * ['user123', 'user456'],\n * {\n * type: 'notification:mention',\n * data: { mentionedBy: 'alice', context: 'issue-42' }\n * }\n * );\n * ```\n */\n async sendToUsers(\n userIds: string[],\n message: Omit<Message, 'id' | 'timestamp'>,\n options?: BroadcastOptions\n ): Promise<BroadcastResult> {\n this.ensureEnabled('sendToUsers', 'enableBroadcast');\n this.warnIfEnabled('sendToUsers()');\n\n const userIdSet = new Set(userIds);\n const clients = this.getClients().filter(client => userIdSet.has(client.userId));\n\n const result = await this.broadcastToClients(clients, message, options);\n\n this.trackUsage('sendToUsers', message.type, clients.length, message.payload);\n\n return result;\n }\n\n // Private helper methods\n\n private ensureEnabled(\n feature: string,\n configKey: keyof ExperimentalFeatureConfig\n ): void {\n if (!this.config[configKey]) {\n throw new ExperimentalFeatureError(feature, configKey);\n }\n }\n\n private warnIfEnabled(method: string): void {\n if (this.config.warnOnExperimentalUse !== false) {\n this.logger?.warn(\n `⚠️ Experimental API: server.experimental.${method} is for development only. ` +\n `See docs/EXPERIMENTAL_BROADCAST.md for details.`\n );\n }\n }\n\n private trackUsage(\n method: 'broadcast' | 'broadcastAuthenticated' | 'broadcastWhere' | 'sendToUsers',\n messageType: string,\n recipientCount: number,\n payload?: unknown\n ): void {\n if (this.config.trackUsageMetrics && this.emitMetric) {\n const payloadSize = payload ? JSON.stringify(payload).length : undefined;\n\n this.emitMetric({\n method,\n messageType,\n recipientCount,\n timestamp: Date.now(),\n payloadSize\n });\n }\n }\n\n private async broadcastToClients(\n clients: ConnectedClient[],\n message: Omit<Message, 'id' | 'timestamp'>,\n options?: BroadcastOptions\n ): Promise<BroadcastResult> {\n const startTime = Date.now();\n const opts = {\n continueOnError: options?.continueOnError ?? true,\n sendTimeout: options?.sendTimeout ?? 5000,\n includeErrors: options?.includeErrors ?? false\n };\n\n const fullMessage: Message = {\n id: this.generateId(),\n timestamp: Date.now(),\n type: message.type,\n payload: message.payload\n };\n\n let sent = 0;\n let failed = 0;\n const errors: Array<{ clientId: string; error: Error }> = [];\n\n const sendPromises = clients.map(async (client) => {\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Send timeout')), opts.sendTimeout);\n });\n\n // Convert Message to Record<string, unknown> for sendToClient\n const messageRecord: Record<string, unknown> = {\n id: fullMessage.id,\n type: fullMessage.type,\n payload: fullMessage.payload,\n timestamp: fullMessage.timestamp\n };\n\n // Race between send and timeout\n await Promise.race([\n this.sendToClient(client.id, messageRecord),\n timeoutPromise\n ]);\n\n sent++;\n } catch (error) {\n failed++;\n if (opts.includeErrors) {\n errors.push({\n clientId: client.id,\n error: error as Error\n });\n }\n\n if (!opts.continueOnError) {\n throw error;\n }\n }\n });\n\n await Promise.all(sendPromises);\n\n return {\n sent,\n failed,\n errors,\n durationMs: Date.now() - startTime\n };\n }\n\n private generateId(): string {\n return `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n",
37
- "import type {\n Message,\n Event,\n Room,\n RoomUser,\n RoomConfig,\n Lock,\n LockRequest,\n ExperimentalFeatureConfig,\n ExperimentalUsageEvent\n} from '../types/index.js';\nimport { serializeRoomState } from '../types/room.js';\nimport type { ITransportAdapter } from '../abstractions/TransportAdapter.js';\nimport type { IAuthAdapter } from '../abstractions/AuthAdapter.js';\nimport type { IStorageAdapter } from '../abstractions/StorageAdapter.js';\nimport type { RoomManager } from '../abstractions/RoomManager.js';\nimport type { LockManager } from '../abstractions/LockManager.js';\nimport type { PresenceManager } from '../abstractions/PresenceManager.js';\nimport { TypedEventEmitter } from '../abstractions/EventEmitter.js';\nimport { ExperimentalAPI } from './ExperimentalAPI.js';\nimport type { Server as HttpServer } from 'http';\nimport type { Server as HttpsServer } from 'https';\nimport type { WebSocketServer } from 'ws';\n\nexport interface ServerConfig {\n transport: ITransportAdapter;\n auth?: IAuthAdapter;\n storage?: IStorageAdapter;\n roomManager: RoomManager;\n lockManager: LockManager;\n presenceManager?: PresenceManager;\n defaultRoomConfig?: Partial<RoomConfig>;\n httpServer?: HttpServer | HttpsServer;\n webSocketPath?: string;\n webSocketServer?: WebSocketServer;\n experimental?: ExperimentalFeatureConfig;\n}\n\nexport interface ConnectedClient {\n id: string;\n userId: string;\n /**\n * Set of room IDs the client is currently in\n *\n * Multi-room support: A client can be in multiple rooms simultaneously.\n * This enables the two-tier architecture where clients can maintain\n * global presence while participating in multiple repository rooms.\n */\n roomIds: Set<string>;\n /**\n * Legacy single-room accessor for backward compatibility\n *\n * Returns the first room the client is in, or null if not in any rooms.\n *\n * @deprecated Use roomIds for multi-room support\n */\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; metadata?: Record<string, unknown> };\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 experimental_usage: ExperimentalUsageEvent;\n // Presence events\n presence_changed: { userId: string; status: string; timestamp: number };\n presence_device_connected: { userId: string; deviceId: string; timestamp: number };\n presence_device_disconnected: { userId: string; deviceId: string; timestamp: number };\n presence_activity: { userId: string; deviceId: string; timestamp: number };\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 presenceManager?: PresenceManager;\n private config: ServerConfig;\n\n private clients = new Map<string, ConnectedClient>();\n private clientMessageHandlers = new Map<string, (message: Message) => Promise<void>>();\n private clientUserMap = new Map<string, string>(); // clientId -> userId\n private userClientMap = new Map<string, Set<string>>(); // userId -> Set<clientId>\n private running = false;\n private initialized = false;\n private mode: 'standalone' | 'integration';\n private heartbeatIntervalId?: NodeJS.Timeout;\n\n /**\n * Experimental APIs namespace\n *\n * ⚠️ WARNING: Experimental features are for development only.\n * APIs may change or be removed without major version bumps.\n *\n * @see docs/EXPERIMENTAL_BROADCAST.md\n */\n public readonly experimental: ExperimentalAPI;\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 this.presenceManager = config.presenceManager;\n\n // Initialize experimental API namespace\n this.experimental = new ExperimentalAPI({\n config: config.experimental || {\n enableBroadcast: false,\n warnOnExperimentalUse: true,\n trackUsageMetrics: false\n },\n logger: console,\n emitMetric: (event: ExperimentalUsageEvent) => {\n void this.emit('experimental_usage', event);\n },\n getClients: () => Array.from(this.clients.values()),\n sendToClient: (clientId: string, message: Record<string, unknown>) => this.sendToClient(clientId, message)\n });\n\n // Determine mode based on configuration\n this.mode = (config.httpServer || config.webSocketServer) ? 'integration' : 'standalone';\n\n // Connect auth adapter to transport if both exist and transport supports it\n if (this.auth && this.transport) {\n const transportWithAuth = this.transport as ITransportAdapter & { setAuthAdapter?: (auth: IAuthAdapter) => void };\n if (typeof transportWithAuth.setAuthAdapter === 'function') {\n transportWithAuth.setAuthAdapter(this.auth);\n }\n }\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 // Start heartbeat processor if presence is enabled\n if (this.presenceManager?.isEnabled()) {\n this.startHeartbeatProcessor();\n }\n }\n\n /**\n * Start periodic heartbeat processing for presence management\n */\n private startHeartbeatProcessor(): void {\n if (!this.presenceManager) {\n return;\n }\n\n const config = this.presenceManager.getConfig();\n const interval = config.heartbeatInterval;\n\n this.heartbeatIntervalId = setInterval(async () => {\n try {\n const changes = await this.presenceManager!.processHeartbeats();\n\n // Emit presence change events\n for (const change of changes) {\n await this.emit('presence_changed', {\n userId: change.userId,\n status: change.status,\n timestamp: change.timestamp\n });\n\n // Broadcast presence updates if enabled\n if (config.broadcastPresenceUpdates) {\n await this.experimental.broadcastAuthenticated({\n type: 'presence:status_changed',\n payload: {\n userId: change.userId,\n status: change.status,\n previousStatus: change.previousStatus,\n reason: change.reason\n }\n });\n }\n }\n } catch (error) {\n await this.emit('error', {\n error: error as Error,\n context: 'heartbeat_processor'\n });\n }\n }, interval);\n }\n\n /**\n * Stop heartbeat processor\n */\n private stopHeartbeatProcessor(): void {\n if (this.heartbeatIntervalId) {\n clearInterval(this.heartbeatIntervalId);\n this.heartbeatIntervalId = undefined;\n }\n }\n\n // Server Lifecycle\n async start(port?: number): Promise<void> {\n if (this.mode === 'integration') {\n throw new Error('Cannot use start() in integration mode. Use initialize() instead.');\n }\n\n if (!port) {\n throw new Error('Port is required for standalone mode');\n }\n\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 this.initialized = 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 initialize(): Promise<void> {\n if (this.mode === 'standalone') {\n throw new Error('Cannot use initialize() in standalone mode. Use start() instead.');\n }\n\n if (this.initialized) {\n throw new Error('Server is already initialized');\n }\n\n try {\n const transport = this.transport as ITransportAdapter & { \n attach?: (server: HttpServer | HttpsServer, path?: string) => Promise<void>; \n attachToWebSocketServer?: (wss: WebSocketServer) => Promise<void> \n };\n \n if (this.config.webSocketServer) {\n // Attach to existing WebSocket server\n if (typeof transport.attachToWebSocketServer === 'function') {\n await transport.attachToWebSocketServer(this.config.webSocketServer);\n } else {\n throw new Error('Transport adapter does not support attachToWebSocketServer');\n }\n } else if (this.config.httpServer) {\n // Attach to existing HTTP server\n if (typeof transport.attach === 'function') {\n await transport.attach(this.config.httpServer, this.config.webSocketPath || '/ws');\n } else {\n throw new Error('Transport adapter does not support attach');\n }\n } else {\n throw new Error('Either httpServer or webSocketServer must be provided in integration mode');\n }\n\n this.running = true;\n this.initialized = true;\n await this.emit('started', { port: 0 }); // Port 0 indicates integration mode\n } catch (error) {\n await this.emit('error', { error: error as Error, context: 'server_initialize' });\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 // Stop heartbeat processor\n this.stopHeartbeatProcessor();\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 this.clientUserMap.clear();\n this.userClientMap.clear();\n\n // Clear presence data\n if (this.presenceManager) {\n await this.presenceManager.clear();\n }\n\n await this.emit('stopped', {});\n }\n\n // Client Management\n private async handleTransportMessage(message: Message): Promise<void> {\n // Handle special transport messages\n if (message.type === 'connection') {\n await this.handleConnectionMessage(message);\n return;\n }\n \n if (message.type === 'client_authenticated') {\n await this.handleClientAuthenticatedMessage(message);\n return;\n }\n\n if (message.type === 'disconnect') {\n const payload = message.payload as { clientId: string; reason?: string };\n await this.disconnectClient(payload.clientId, payload.reason || 'Client disconnected');\n return;\n }\n\n // Transport messages contain clientId in the payload for routing\n const payload = message.payload as { clientId?: string; type?: string; [key: string]: unknown };\n const { clientId, type, ...clientMessage } = payload;\n\n const clientMsg: Message = {\n id: message.id,\n type: type || message.type, // Use inner type if present, otherwise outer 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 handleConnectionMessage(message: Message): Promise<void> {\n const payload = message.payload as {\n clientId: string;\n authenticated: boolean;\n userId?: string;\n metadata?: Record<string, unknown>;\n };\n\n // Add the client with initial auth state\n const roomIds = new Set<string>();\n const client: ConnectedClient = {\n id: payload.clientId,\n userId: payload.userId || '',\n roomIds,\n get roomId() {\n return roomIds.size > 0 ? (roomIds.values().next().value || null) : null;\n },\n authenticated: payload.authenticated,\n connectedAt: Date.now()\n };\n\n this.clients.set(payload.clientId, client);\n this.clientMessageHandlers.set(payload.clientId, this.createClientMessageHandler(payload.clientId));\n\n await this.emit('client_connected', { client });\n\n // Register with presence manager if authenticated\n if (payload.authenticated && this.presenceManager?.isEnabled() && payload.userId) {\n try {\n await this.presenceManager.connectDevice(payload.userId, payload.clientId, {\n connectedAt: Date.now(),\n lastActivity: Date.now(),\n metadata: payload.metadata\n });\n\n await this.emit('presence_device_connected', {\n userId: payload.userId,\n deviceId: payload.clientId,\n timestamp: Date.now()\n });\n\n // Broadcast presence update\n const presenceConfig = this.presenceManager.getConfig();\n if (presenceConfig.broadcastPresenceUpdates) {\n await this.experimental.broadcastAuthenticated({\n type: 'presence:user_online',\n payload: {\n userId: payload.userId,\n deviceId: payload.clientId,\n status: 'online'\n }\n });\n }\n } catch (error) {\n await this.emit('error', {\n error: error as Error,\n context: 'presence_connect_device'\n });\n }\n }\n\n if (payload.authenticated) {\n await this.emit('client_authenticated', {\n clientId: payload.clientId,\n userId: payload.userId || '',\n metadata: payload.metadata\n });\n }\n }\n\n private async handleClientAuthenticatedMessage(message: Message): Promise<void> {\n const payload = message.payload as {\n clientId: string;\n userId: string;\n metadata?: Record<string, unknown>;\n };\n\n const client = this.clients.get(payload.clientId);\n if (client) {\n client.authenticated = true;\n client.userId = payload.userId;\n\n // Auto-update client mappings\n this.clientUserMap.set(payload.clientId, payload.userId);\n if (!this.userClientMap.has(payload.userId)) {\n this.userClientMap.set(payload.userId, new Set());\n }\n this.userClientMap.get(payload.userId)!.add(payload.clientId);\n\n await this.emit('client_authenticated', {\n clientId: payload.clientId,\n userId: payload.userId,\n metadata: payload.metadata\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 roomIds = new Set<string>();\n const client: ConnectedClient = {\n id: clientId,\n userId: '',\n roomIds,\n get roomId() {\n return roomIds.size > 0 ? (roomIds.values().next().value || null) : null;\n },\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 // Auto-clean client mappings\n if (client.userId) {\n this.clientUserMap.delete(clientId);\n const clientSet = this.userClientMap.get(client.userId);\n if (clientSet) {\n clientSet.delete(clientId);\n if (clientSet.size === 0) {\n this.userClientMap.delete(client.userId);\n }\n }\n }\n\n // Unregister from presence manager\n if (this.presenceManager?.isEnabled() && client.userId) {\n try {\n const presence = await this.presenceManager.disconnectDevice(client.userId, clientId);\n\n await this.emit('presence_device_disconnected', {\n userId: client.userId,\n deviceId: clientId,\n timestamp: Date.now()\n });\n\n // Broadcast presence update if user went offline or into grace period\n const presenceConfig = this.presenceManager.getConfig();\n if (presenceConfig.broadcastPresenceUpdates && (!presence || presence.status === 'offline')) {\n await this.experimental.broadcastAuthenticated({\n type: 'presence:user_offline',\n payload: {\n userId: client.userId,\n deviceId: clientId,\n status: presence?.status || 'offline',\n gracePeriod: presenceConfig.gracePeriod\n }\n });\n }\n } catch (error) {\n await this.emit('error', {\n error: error as Error,\n context: 'presence_disconnect_device'\n });\n }\n }\n\n // Leave all rooms the client is in\n for (const roomId of client.roomIds) {\n await this.roomManager.leaveRoom(roomId, client.userId);\n await this.emit('client_left_room', { clientId, 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 // Auto-update presence activity on ANY message\n if (this.presenceManager?.isEnabled() && client.userId && client.authenticated) {\n await this.updatePresenceActivity(client.userId, clientId, 'message');\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, message.payload as { roomId?: string });\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 // Presence activity already updated automatically above\n break;\n case 'heartbeat':\n // Heartbeat messages are used to keep presence activity updated\n // The activity is already tracked above (line ~570), so we just acknowledge\n await this.sendToClient(clientId, { type: 'heartbeat_ack', 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', {\n clientId,\n userId: tokenPayload.userId,\n metadata: tokenPayload.metadata\n });\n }\n\n await this.sendToClient(clientId, { type: 'auth_result', success: true, userId: tokenPayload.userId });\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 // Check if already in the room\n if (client.roomIds.has(payload.roomId)) {\n await this.sendToClient(clientId, { type: 'error', error: 'Already in this room' });\n return;\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.roomIds.add(payload.roomId);\n\n await this.emit('client_joined_room', { clientId, roomId: payload.roomId });\n\n // Get updated room state after joining (so it includes the current user)\n const updatedRoomState = await this.roomManager.getRoomState(payload.roomId);\n if (!updatedRoomState) {\n throw new Error('Failed to get updated room state after joining');\n }\n\n // Convert Maps to plain objects for JSON serialization\n const serializableState = serializeRoomState(updatedRoomState);\n\n // Send room state to client\n await this.sendToClient(clientId, {\n type: 'room_joined',\n roomId: payload.roomId,\n state: serializableState\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, payload?: { roomId?: string }): Promise<void> {\n const client = this.clients.get(clientId);\n if (!client) {\n return;\n }\n\n // If roomId is specified, leave that specific room\n // Otherwise, leave all rooms (backward compatibility)\n const roomsToLeave = payload?.roomId\n ? [payload.roomId]\n : Array.from(client.roomIds);\n\n if (roomsToLeave.length === 0) {\n return;\n }\n\n for (const roomId of roomsToLeave) {\n if (!client.roomIds.has(roomId)) {\n continue;\n }\n\n await this.roomManager.leaveRoom(roomId, client.userId);\n client.roomIds.delete(roomId);\n\n await this.emit('client_left_room', { clientId, roomId });\n await this.sendToClient(clientId, { type: 'room_left', roomId });\n }\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.roomIds.has(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.roomIds.has(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 all rooms the client is in\n for (const roomId of client.roomIds) {\n await this.roomManager.broadcastToRoom(roomId, {\n id: this.generateId(),\n type: 'lock_status',\n timestamp: Date.now(),\n userId: client.userId,\n roomId,\n data: { lockId: payload.lockId, action: 'released' },\n metadata: { userId: client.userId, timestamp: Date.now(), 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\n getMode(): 'standalone' | 'integration' {\n return this.mode;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Update presence activity for a user's device\n *\n * @param userId - User identifier\n * @param deviceId - Device/client identifier\n * @param activityType - Type of activity\n */\n private async updatePresenceActivity(\n userId: string,\n deviceId: string,\n activityType: 'heartbeat' | 'message' | 'user_action'\n ): Promise<void> {\n if (!this.presenceManager?.isEnabled()) {\n return;\n }\n\n try {\n await this.presenceManager.updateActivity({\n userId,\n deviceId,\n timestamp: Date.now(),\n activityType\n });\n\n await this.emit('presence_activity', {\n userId,\n deviceId,\n timestamp: Date.now()\n });\n } catch (error) {\n // Don't throw, just log the error\n await this.emit('error', {\n error: error as Error,\n context: 'presence_update_activity'\n });\n }\n }\n\n /**\n * Get presence manager (if configured)\n */\n getPresenceManager(): PresenceManager | undefined {\n return this.presenceManager;\n }\n\n /**\n * Get user ID from client ID\n *\n * @param clientId - Client identifier\n * @returns User ID, or undefined if not found or not authenticated\n */\n getUserIdFromClientId(clientId: string): string | undefined {\n return this.clientUserMap.get(clientId);\n }\n\n /**\n * Get all client IDs for a user\n *\n * A user may have multiple connected devices/clients.\n *\n * @param userId - User identifier\n * @returns Array of client IDs\n */\n getClientIdsForUser(userId: string): string[] {\n return Array.from(this.userClientMap.get(userId) || []);\n }\n\n /**\n * Get device ID from client ID\n *\n * In Control Tower architecture, clientId === deviceId\n *\n * @param clientId - Client identifier\n * @returns Device ID (same as clientId)\n */\n getDeviceIdFromClientId(clientId: string): string {\n return clientId;\n }\n}",
38
- "import type { ITransportAdapter } from '../abstractions/TransportAdapter.js';\nimport type { IAuthAdapter } from '../abstractions/AuthAdapter.js';\nimport type { IStorageAdapter } from '../abstractions/StorageAdapter.js';\nimport type { RoomManager } from '../abstractions/RoomManager.js';\nimport type { LockManager } from '../abstractions/LockManager.js';\nimport type { PresenceManager } from '../abstractions/PresenceManager.js';\nimport { DefaultPresenceManager } from '../abstractions/DefaultPresenceManager.js';\nimport type { RoomConfig, ExperimentalFeatureConfig } from '../types/index.js';\nimport { BaseServer, type ServerConfig } from './BaseServer.js';\nimport type { Server as HttpServer } from 'http';\nimport type { Server as HttpsServer } from 'https';\nimport type { WebSocketServer } from 'ws';\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 presenceManager?: PresenceManager;\n private defaultRoomConfig?: Partial<RoomConfig>;\n private httpServer?: HttpServer | HttpsServer;\n private webSocketPath?: string;\n private webSocketServer?: WebSocketServer;\n private experimentalFeatures?: ExperimentalFeatureConfig;\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 /**\n * Configure presence management for global user tracking\n *\n * Enables two-tier connection architecture where users maintain\n * global presence while participating in multiple rooms.\n *\n * @param presenceManager - PresenceManager implementation\n */\n withPresenceManager(presenceManager: PresenceManager): this {\n this.presenceManager = presenceManager;\n return this;\n }\n\n withDefaultRoomConfig(config: Partial<RoomConfig>): this {\n this.defaultRoomConfig = config;\n return this;\n }\n\n withHttpServer(server: HttpServer | HttpsServer): this {\n this.httpServer = server;\n return this;\n }\n\n withWebSocketPath(path: string): this {\n this.webSocketPath = path;\n return this;\n }\n\n withWebSocketServer(wss: WebSocketServer): this {\n this.webSocketServer = wss;\n return this;\n }\n\n /**\n * Enable experimental features\n *\n * ⚠️ WARNING: Experimental features are for development only.\n * APIs may change or be removed without major version bumps.\n *\n * @see docs/EXPERIMENTAL_BROADCAST.md\n */\n withExperimentalFeatures(features: ExperimentalFeatureConfig): this {\n this.experimentalFeatures = features;\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 presenceManager: this.presenceManager,\n defaultRoomConfig: this.defaultRoomConfig || {\n maxUsers: 50,\n maxHistory: 100,\n permissions: ['read' as const, 'write' as const]\n },\n httpServer: this.httpServer,\n webSocketPath: this.webSocketPath,\n webSocketServer: this.webSocketServer,\n experimental: this.experimentalFeatures || {\n enableBroadcast: false,\n warnOnExperimentalUse: true,\n trackUsageMetrics: false\n }\n };\n\n const server = new BaseServer(config);\n\n // Auto-link presence manager to server for broadcasting\n if (this.presenceManager instanceof DefaultPresenceManager) {\n this.presenceManager.setServer(server);\n }\n\n // Auto-wire presence extension hooks to server events\n if (this.presenceManager instanceof DefaultPresenceManager) {\n this.wirePresenceExtensionHooks(server, this.presenceManager);\n }\n\n return server;\n }\n\n /**\n * Wire presence extension hooks to server events\n * @private\n */\n private wirePresenceExtensionHooks(\n server: BaseServer,\n presenceManager: DefaultPresenceManager<any>\n ): void {\n // Initialize extensions when server starts\n server.on('started', async () => {\n await presenceManager.initializeExtensions();\n });\n\n // Wire room join/leave events to presence extensions\n server.on('client_joined_room', async ({ clientId, roomId }) => {\n const userId = server.getUserIdFromClientId(clientId);\n if (userId && presenceManager.isEnabled()) {\n // Call onRoomJoined for all extensions\n const extensions = (presenceManager as any).extensions;\n if (extensions) {\n for (const ext of extensions) {\n await ext.onRoomJoined?.(userId, roomId, clientId);\n }\n }\n }\n });\n\n server.on('client_left_room', async ({ clientId, roomId }) => {\n const userId = server.getUserIdFromClientId(clientId);\n if (userId && presenceManager.isEnabled()) {\n // Call onRoomLeft for all extensions\n const extensions = (presenceManager as any).extensions;\n if (extensions) {\n for (const ext of extensions) {\n await ext.onRoomLeft?.(userId, roomId, clientId);\n }\n }\n }\n });\n\n // Destroy extensions when server stops\n server.on('stopped', async () => {\n await presenceManager.destroyExtensions();\n });\n }\n}"
32
+ "import { WebSocket } from \"ws\";\nimport type { ITransportAdapter } from \"../../abstractions/TransportAdapter.js\";\nimport type {\n\tCloseHandler,\n\tConnectionOptions,\n\tConnectionState,\n\tErrorHandler,\n\tMessage,\n\tMessageHandler,\n} from \"../../types/index.js\";\n\nexport interface WebSocketClientConfig {\n\t/**\n\t * Additional headers to send with the WebSocket connection request\n\t */\n\theaders?: Record<string, string>;\n\n\t/**\n\t * Connection timeout in milliseconds\n\t * @default 30000\n\t */\n\tconnectionTimeout?: number;\n\n\t/**\n\t * Enable automatic ping/pong for connection health checks\n\t * @default true\n\t */\n\tenableHeartbeat?: boolean;\n\n\t/**\n\t * Heartbeat interval in milliseconds\n\t * @default 30000\n\t */\n\theartbeatInterval?: number;\n}\n\n/**\n * WebSocket client transport adapter for connecting to remote WebSocket servers.\n *\n * This adapter creates an outgoing WebSocket connection and is intended for use\n * with BaseClient. For server-side operations (accepting incoming connections),\n * use WebSocketServerTransportAdapter instead.\n *\n * @example\n * ```typescript\n * const transport = new WebSocketClientTransportAdapter();\n * const client = new ClientBuilder()\n * .withTransport(transport)\n * .build();\n *\n * await client.connect('ws://localhost:3000');\n * ```\n */\nexport class WebSocketClientTransportAdapter implements ITransportAdapter {\n\tprivate ws?: WebSocket;\n\tprivate state: ConnectionState = \"disconnected\";\n\tprivate messageHandlers: Set<MessageHandler> = new Set();\n\tprivate errorHandlers: Set<ErrorHandler> = new Set();\n\tprivate closeHandlers: Set<CloseHandler> = new Set();\n\tprivate config: Required<WebSocketClientConfig>;\n\tprivate heartbeatTimer?: NodeJS.Timeout;\n\tprivate connectionTimer?: NodeJS.Timeout;\n\n\tconstructor(config?: WebSocketClientConfig) {\n\t\tthis.config = {\n\t\t\theaders: config?.headers ?? {},\n\t\t\tconnectionTimeout: config?.connectionTimeout ?? 30000,\n\t\t\tenableHeartbeat: config?.enableHeartbeat ?? true,\n\t\t\theartbeatInterval: config?.heartbeatInterval ?? 30000,\n\t\t};\n\t}\n\n\tasync connect(url: string, options?: ConnectionOptions): Promise<void> {\n\t\tif (this.state === \"connected\" || this.state === \"connecting\") {\n\t\t\tthrow new Error(\"Already connected or connecting\");\n\t\t}\n\n\t\tthis.state = \"connecting\";\n\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// Create WebSocket client connection\n\t\t\t\tconst wsOptions: any = {};\n\n\t\t\t\t// Add custom headers if provided\n\t\t\t\tif (Object.keys(this.config.headers).length > 0) {\n\t\t\t\t\twsOptions.headers = this.config.headers;\n\t\t\t\t}\n\n\t\t\t\tthis.ws = new WebSocket(url, wsOptions);\n\n\t\t\t\t// Set up connection timeout\n\t\t\t\tthis.connectionTimer = setTimeout(() => {\n\t\t\t\t\tif (this.state === \"connecting\") {\n\t\t\t\t\t\tthis.ws?.terminate();\n\t\t\t\t\t\tthis.state = \"disconnected\";\n\t\t\t\t\t\tconst error = new Error(\"Connection timeout\");\n\t\t\t\t\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t}, this.config.connectionTimeout);\n\n\t\t\t\t// Handle connection open\n\t\t\t\tthis.ws.on(\"open\", () => {\n\t\t\t\t\tif (this.connectionTimer) {\n\t\t\t\t\t\tclearTimeout(this.connectionTimer);\n\t\t\t\t\t\tthis.connectionTimer = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.state = \"connected\";\n\n\t\t\t\t\t// Start heartbeat if enabled\n\t\t\t\t\tif (this.config.enableHeartbeat) {\n\t\t\t\t\t\tthis.startHeartbeat();\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\n\t\t\t\t// Handle incoming messages\n\t\t\t\tthis.ws.on(\"message\", (data: Buffer | ArrayBuffer | Buffer[]) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst message = JSON.parse(data.toString()) as Message;\n\t\t\t\t\t\tthis.messageHandlers.forEach((handler) => handler(message));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.errorHandlers.forEach((handler) => handler(error as Error));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Handle errors\n\t\t\t\tthis.ws.on(\"error\", (error: Error) => {\n\t\t\t\t\tif (this.connectionTimer) {\n\t\t\t\t\t\tclearTimeout(this.connectionTimer);\n\t\t\t\t\t\tthis.connectionTimer = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\n\t\t\t\t\t// If error occurs during connection, reject the promise\n\t\t\t\t\tif (this.state === \"connecting\") {\n\t\t\t\t\t\tthis.state = \"disconnected\";\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Handle connection close\n\t\t\t\tthis.ws.on(\"close\", (code: number, reason: Buffer) => {\n\t\t\t\t\tif (this.connectionTimer) {\n\t\t\t\t\t\tclearTimeout(this.connectionTimer);\n\t\t\t\t\t\tthis.connectionTimer = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.stopHeartbeat();\n\n\t\t\t\t\tconst wasConnected = this.state === \"connected\";\n\t\t\t\t\tthis.state = \"disconnected\";\n\n\t\t\t\t\tif (wasConnected) {\n\t\t\t\t\t\tthis.closeHandlers.forEach((handler) =>\n\t\t\t\t\t\t\thandler(code, reason.toString()),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Handle pong responses for heartbeat\n\t\t\t\tif (this.config.enableHeartbeat) {\n\t\t\t\t\tthis.ws.on(\"pong\", () => {\n\t\t\t\t\t\t// Connection is alive\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (this.connectionTimer) {\n\t\t\t\t\tclearTimeout(this.connectionTimer);\n\t\t\t\t\tthis.connectionTimer = undefined;\n\t\t\t\t}\n\t\t\t\tthis.state = \"disconnected\";\n\t\t\t\treject(error);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.state === \"disconnected\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.state = \"disconnecting\";\n\t\tthis.stopHeartbeat();\n\n\t\tif (this.connectionTimer) {\n\t\t\tclearTimeout(this.connectionTimer);\n\t\t\tthis.connectionTimer = undefined;\n\t\t}\n\n\t\tif (this.ws) {\n\t\t\t// Close with normal closure code\n\t\t\tthis.ws.close(1000, \"Client disconnecting\");\n\n\t\t\t// Wait for close event or timeout\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tthis.ws?.terminate();\n\t\t\t\t\tresolve();\n\t\t\t\t}, 5000);\n\n\t\t\t\tconst onClose = () => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tthis.ws?.once(\"close\", onClose);\n\t\t\t});\n\n\t\t\tthis.ws = undefined;\n\t\t}\n\n\t\tthis.state = \"disconnected\";\n\t}\n\n\tasync send(message: Message): Promise<void> {\n\t\tif (this.state !== \"connected\") {\n\t\t\tthrow new Error(\"Not connected\");\n\t\t}\n\n\t\tif (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n\t\t\tthrow new Error(\"WebSocket connection is not open\");\n\t\t}\n\n\t\ttry {\n\t\t\tconst data = JSON.stringify(message);\n\t\t\tthis.ws.send(data);\n\t\t} catch (error) {\n\t\t\tthis.errorHandlers.forEach((handler) => handler(error as Error));\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tonMessage(handler: MessageHandler): void {\n\t\tthis.messageHandlers.add(handler);\n\t}\n\n\tonError(handler: ErrorHandler): void {\n\t\tthis.errorHandlers.add(handler);\n\t}\n\n\tonClose(handler: CloseHandler): void {\n\t\tthis.closeHandlers.add(handler);\n\t}\n\n\tgetState(): ConnectionState {\n\t\treturn this.state;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.state === \"connected\" && this.ws?.readyState === WebSocket.OPEN;\n\t}\n\n\t/**\n\t * Get the underlying WebSocket instance\n\t * Useful for advanced use cases\n\t */\n\tgetWebSocket(): WebSocket | undefined {\n\t\treturn this.ws;\n\t}\n\n\t/**\n\t * Set custom headers for the WebSocket connection\n\t * Must be called before connect()\n\t */\n\tsetHeaders(headers: Record<string, string>): void {\n\t\tif (this.state !== \"disconnected\") {\n\t\t\tthrow new Error(\"Cannot set headers while connected\");\n\t\t}\n\t\tthis.config.headers = { ...this.config.headers, ...headers };\n\t}\n\n\t/**\n\t * Add an authorization header for authentication\n\t * Must be called before connect()\n\t */\n\tsetAuthToken(token: string): void {\n\t\tthis.setHeaders({ Authorization: `Bearer ${token}` });\n\t}\n\n\t// Private methods\n\n\tprivate startHeartbeat(): void {\n\t\tif (this.heartbeatTimer) {\n\t\t\tclearInterval(this.heartbeatTimer);\n\t\t}\n\n\t\tthis.heartbeatTimer = setInterval(() => {\n\t\t\tif (this.ws && this.ws.readyState === WebSocket.OPEN) {\n\t\t\t\t// Send an actual heartbeat message instead of just a WebSocket ping\n\t\t\t\t// This ensures the server processes it and updates presence activity\n\t\t\t\tconst heartbeatMessage: Message = {\n\t\t\t\t\tid: `heartbeat-${Date.now()}`,\n\t\t\t\t\ttype: \"heartbeat\",\n\t\t\t\t\tpayload: { timestamp: Date.now() },\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tthis.ws.send(JSON.stringify(heartbeatMessage));\n\t\t\t}\n\t\t}, this.config.heartbeatInterval);\n\t}\n\n\tprivate stopHeartbeat(): void {\n\t\tif (this.heartbeatTimer) {\n\t\t\tclearInterval(this.heartbeatTimer);\n\t\t\tthis.heartbeatTimer = undefined;\n\t\t}\n\t}\n}\n",
33
+ "import type { Server as HttpServer, IncomingMessage } from \"http\";\nimport type { Server as HttpsServer } from \"https\";\nimport { WebSocket, WebSocketServer } from \"ws\";\nimport type { IAuthAdapter } from \"../../abstractions/AuthAdapter.js\";\nimport type { ITransportAdapter } from \"../../abstractions/TransportAdapter.js\";\nimport type {\n\tCloseHandler,\n\tConnectionOptions,\n\tConnectionState,\n\tErrorHandler,\n\tMessage,\n\tMessageHandler,\n} from \"../../types/index.js\";\n\ninterface ClientConnection {\n\tid: string;\n\tws: WebSocket;\n\tuserId?: string;\n\tauthenticated: boolean;\n\tmetadata?: Record<string, unknown>;\n\tauthTimeout?: NodeJS.Timeout;\n\tconnectedAt: number;\n}\n\nexport interface WebSocketServerTransportConfig {\n\tauthTimeout?: number;\n\tcloseOnAuthFailure?: boolean;\n\trequireAuth?: boolean;\n}\n\nexport class WebSocketServerTransportAdapter implements ITransportAdapter {\n\tprivate state: ConnectionState = \"disconnected\";\n\tprivate messageHandlers: Set<MessageHandler> = new Set();\n\tprivate errorHandlers: Set<ErrorHandler> = new Set();\n\tprivate closeHandlers: Set<CloseHandler> = new Set();\n\n\t// Standalone mode properties\n\tprivate wss?: WebSocketServer;\n\tprivate serverUrl?: string;\n\n\t// Integration mode properties\n\tprivate attachedServer?: HttpServer | HttpsServer;\n\tprivate attachedWss?: WebSocketServer;\n\tprivate webSocketPath?: string;\n\n\t// Client management\n\tprivate clients = new Map<string, ClientConnection>();\n\tprivate mode: \"standalone\" | \"integration\" = \"standalone\";\n\n\t// Authentication\n\tprivate authAdapter?: IAuthAdapter;\n\tprivate config: WebSocketServerTransportConfig;\n\n\tconstructor(config?: WebSocketServerTransportConfig) {\n\t\tthis.config = {\n\t\t\tauthTimeout: config?.authTimeout ?? 5000,\n\t\t\tcloseOnAuthFailure: config?.closeOnAuthFailure ?? false,\n\t\t\trequireAuth: config?.requireAuth ?? false,\n\t\t\t...config,\n\t\t};\n\t}\n\n\t// Set the auth adapter\n\tsetAuthAdapter(auth: IAuthAdapter): void {\n\t\tthis.authAdapter = auth;\n\t\t// Use auth adapter's preference only if requireAuth is not already true\n\t\t// This allows explicit requireAuth: true in config to take precedence\n\t\tif (auth.isAuthRequired && !this.config.requireAuth) {\n\t\t\tthis.config.requireAuth = auth.isAuthRequired();\n\t\t}\n\t\t// For authTimeout, use adapter's value if not explicitly set (not matching default)\n\t\tif (auth.getAuthTimeout && this.config.authTimeout === 5000) {\n\t\t\tthis.config.authTimeout = auth.getAuthTimeout();\n\t\t}\n\t}\n\n\t// Standalone mode implementation\n\tasync connect(url: string, _options?: ConnectionOptions): Promise<void> {\n\t\tif (this.state === \"connected\" || this.state === \"connecting\") {\n\t\t\tthrow new Error(\"Already connected or connecting\");\n\t\t}\n\n\t\tthis.state = \"connecting\";\n\t\tthis.serverUrl = url;\n\t\tthis.mode = \"standalone\";\n\n\t\ttry {\n\t\t\t// Extract port from URL\n\t\t\tconst urlObj = new URL(url);\n\t\t\tconst port =\n\t\t\t\tparseInt(urlObj.port) || (urlObj.protocol === \"wss:\" ? 443 : 80);\n\n\t\t\t// Create WebSocket server\n\t\t\tthis.wss = new WebSocketServer({ port });\n\n\t\t\tthis.wss.on(\"connection\", (ws, req) => {\n\t\t\t\tthis.handleConnection(ws, req);\n\t\t\t});\n\n\t\t\tthis.wss.on(\"error\", (error) => {\n\t\t\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\t\t\t});\n\n\t\t\tthis.wss.on(\"close\", () => {\n\t\t\t\tthis.state = \"disconnected\";\n\t\t\t\tthis.closeHandlers.forEach((handler) => handler(1000, \"Server closed\"));\n\t\t\t});\n\n\t\t\tthis.state = \"connected\";\n\t\t} catch (error) {\n\t\t\tthis.state = \"disconnected\";\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// Integration mode implementation\n\tasync attach(\n\t\tserver: HttpServer | HttpsServer,\n\t\tpath: string = \"/ws\",\n\t): Promise<void> {\n\t\tif (this.state === \"connected\" || this.state === \"connecting\") {\n\t\t\tthrow new Error(\"Already connected or connecting\");\n\t\t}\n\n\t\tthis.state = \"connecting\";\n\t\tthis.attachedServer = server;\n\t\tthis.webSocketPath = path;\n\t\tthis.mode = \"integration\";\n\n\t\ttry {\n\t\t\t// Create WebSocket server attached to the existing HTTP server\n\t\t\tthis.wss = new WebSocketServer({\n\t\t\t\tserver,\n\t\t\t\tpath,\n\t\t\t\tperMessageDeflate: false,\n\t\t\t});\n\n\t\t\tthis.wss.on(\"connection\", (ws, req) => {\n\t\t\t\tthis.handleConnection(ws, req);\n\t\t\t});\n\n\t\t\tthis.wss.on(\"error\", (error) => {\n\t\t\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\t\t\t});\n\n\t\t\tthis.state = \"connected\";\n\t\t} catch (error) {\n\t\t\tthis.state = \"disconnected\";\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync attachToWebSocketServer(wss: WebSocketServer): Promise<void> {\n\t\tif (this.state === \"connected\" || this.state === \"connecting\") {\n\t\t\tthrow new Error(\"Already connected or connecting\");\n\t\t}\n\n\t\tthis.state = \"connecting\";\n\t\tthis.attachedWss = wss;\n\t\tthis.mode = \"integration\";\n\n\t\ttry {\n\t\t\tthis.wss = wss;\n\n\t\t\tthis.wss.on(\"connection\", (ws, req) => {\n\t\t\t\tthis.handleConnection(ws, req);\n\t\t\t});\n\n\t\t\tthis.wss.on(\"error\", (error) => {\n\t\t\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\t\t\t});\n\n\t\t\tthis.state = \"connected\";\n\t\t} catch (error) {\n\t\t\tthis.state = \"disconnected\";\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate async handleConnection(\n\t\tws: WebSocket,\n\t\treq: IncomingMessage,\n\t): Promise<void> {\n\t\tconst clientId = this.generateId();\n\n\t\t// Step 1: Try token authentication via Authorization header\n\t\tlet authenticated = false;\n\t\tlet userId: string | undefined;\n\t\tlet metadata: Record<string, unknown> | undefined;\n\n\t\tif (this.authAdapter && req.headers.authorization) {\n\t\t\tconst token = this.extractBearerToken(\n\t\t\t\treq.headers.authorization as string,\n\t\t\t);\n\t\t\tif (token) {\n\t\t\t\ttry {\n\t\t\t\t\tconst tokenPayload = await this.authAdapter.validateToken(token);\n\t\t\t\t\tauthenticated = true;\n\t\t\t\t\tuserId = tokenPayload.userId;\n\t\t\t\t\tmetadata = tokenPayload.metadata;\n\t\t\t\t} catch {\n\t\t\t\t\t// Header auth failed but don't reject connection yet\n\t\t\t\t\t// Client can still authenticate via message\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Step 2: Create client with auth state\n\t\tconst client: ClientConnection = {\n\t\t\tid: clientId,\n\t\t\tws,\n\t\t\tauthenticated,\n\t\t\tuserId,\n\t\t\tmetadata,\n\t\t\tconnectedAt: Date.now(),\n\t\t};\n\n\t\tthis.clients.set(clientId, client);\n\n\t\t// Step 3: Set up message handling\n\t\tws.on(\"message\", (data) => {\n\t\t\tthis.handleClientMessage(clientId, data);\n\t\t});\n\n\t\tws.on(\"error\", (error) => {\n\t\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\t\t});\n\n\t\tws.on(\"close\", (_code, _reason) => {\n\t\t\t// Clear auth timeout if exists\n\t\t\tif (client.authTimeout) {\n\t\t\t\tclearTimeout(client.authTimeout);\n\t\t\t}\n\t\t\tthis.clients.delete(clientId);\n\t\t});\n\n\t\t// Step 4: Set auth timeout if not authenticated and auth is required\n\t\tif (!authenticated && this.config.requireAuth && this.authAdapter) {\n\t\t\tclient.authTimeout = setTimeout(() => {\n\t\t\t\tif (!client.authenticated) {\n\t\t\t\t\tws.close(1008, \"Authentication timeout\");\n\t\t\t\t\tthis.clients.delete(clientId);\n\t\t\t\t}\n\t\t\t}, this.config.authTimeout);\n\t\t}\n\n\t\t// Step 5: Notify about connection (with auth status)\n\t\tconst connectionMessage: Message = {\n\t\t\tid: this.generateId(),\n\t\t\ttype: \"connection\",\n\t\t\tpayload: {\n\t\t\t\tclientId,\n\t\t\t\tauthenticated,\n\t\t\t\tuserId: client.userId,\n\t\t\t\tmetadata: client.metadata,\n\t\t\t},\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tthis.messageHandlers.forEach((handler) => handler(connectionMessage));\n\t}\n\n\tprivate async handleClientMessage(\n\t\tclientId: string,\n\t\tdata: Buffer | ArrayBuffer | Buffer[],\n\t): Promise<void> {\n\t\tconst client = this.clients.get(clientId);\n\t\tif (!client) return;\n\n\t\ttry {\n\t\t\tconst message = JSON.parse(data.toString()) as Message;\n\n\t\t\t// Special handling for authentication messages\n\t\t\tif (\n\t\t\t\tmessage.type === \"authenticate\" &&\n\t\t\t\t!client.authenticated &&\n\t\t\t\tthis.authAdapter\n\t\t\t) {\n\t\t\t\tawait this.handleAuthMessage(client, message);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reject messages from unauthenticated clients if auth is required\n\t\t\tif (this.config.requireAuth && !client.authenticated) {\n\t\t\t\tthis.sendToClient(client, {\n\t\t\t\t\tid: this.generateId(),\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tpayload: { error: \"Authentication required\" },\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Add clientId to message payload for routing\n\t\t\tconst enrichedMessage = {\n\t\t\t\t...message,\n\t\t\t\tpayload: {\n\t\t\t\t\t...(message.payload as object),\n\t\t\t\t\tclientId,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.messageHandlers.forEach((handler) => handler(enrichedMessage));\n\t\t} catch (error) {\n\t\t\tthis.errorHandlers.forEach((handler) => handler(error as Error));\n\t\t}\n\t}\n\n\tprivate async handleAuthMessage(\n\t\tclient: ClientConnection,\n\t\tmessage: Message,\n\t): Promise<void> {\n\t\tif (!this.authAdapter) {\n\t\t\tthis.sendToClient(client, {\n\t\t\t\tid: this.generateId(),\n\t\t\t\ttype: \"auth_result\",\n\t\t\t\tpayload: { success: false, error: \"No auth adapter configured\" },\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = message.payload as Record<string, unknown>;\n\n\t\t// Token-based authentication only\n\t\tif (!payload.token || typeof payload.token !== \"string\") {\n\t\t\tthis.sendToClient(client, {\n\t\t\t\tid: this.generateId(),\n\t\t\t\ttype: \"auth_result\",\n\t\t\t\tpayload: { success: false, error: \"Token required for authentication\" },\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst tokenPayload = await this.authAdapter.validateToken(payload.token);\n\n\t\t\t// Clear auth timeout\n\t\t\tif (client.authTimeout) {\n\t\t\t\tclearTimeout(client.authTimeout);\n\t\t\t\tclient.authTimeout = undefined;\n\t\t\t}\n\n\t\t\t// Update client state\n\t\t\tclient.authenticated = true;\n\t\t\tclient.userId = tokenPayload.userId;\n\t\t\tclient.metadata = tokenPayload.metadata;\n\n\t\t\t// Send success response\n\t\t\tthis.sendToClient(client, {\n\t\t\t\tid: this.generateId(),\n\t\t\t\ttype: \"auth_result\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tuserId: client.userId,\n\t\t\t\t},\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\t// Notify handlers about authentication\n\t\t\tconst authMessage: Message = {\n\t\t\t\tid: this.generateId(),\n\t\t\t\ttype: \"client_authenticated\",\n\t\t\t\tpayload: {\n\t\t\t\t\tclientId: client.id,\n\t\t\t\t\tuserId: client.userId,\n\t\t\t\t\tmetadata: client.metadata,\n\t\t\t\t},\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\n\t\t\tthis.messageHandlers.forEach((handler) => handler(authMessage));\n\t\t} catch (error) {\n\t\t\tthis.sendToClient(client, {\n\t\t\t\tid: this.generateId(),\n\t\t\t\ttype: \"auth_result\",\n\t\t\t\tpayload: {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: (error as Error).message,\n\t\t\t\t},\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\t// Optionally close connection on auth failure\n\t\t\tif (this.config.closeOnAuthFailure) {\n\t\t\t\tclient.ws.close(1008, \"Authentication failed\");\n\t\t\t\tthis.clients.delete(client.id);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate extractBearerToken(authHeader: string): string | null {\n\t\tif (authHeader.startsWith(\"Bearer \")) {\n\t\t\treturn authHeader.substring(7);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate sendToClient(client: ClientConnection, message: Message): void {\n\t\tif (client.ws.readyState === WebSocket.OPEN) {\n\t\t\tclient.ws.send(JSON.stringify(message));\n\t\t}\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.state === \"disconnected\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.state = \"disconnecting\";\n\n\t\t// Close all client connections\n\t\tfor (const [_clientId, client] of this.clients) {\n\t\t\ttry {\n\t\t\t\tif (client.authTimeout) {\n\t\t\t\t\tclearTimeout(client.authTimeout);\n\t\t\t\t}\n\t\t\t\tclient.ws.close(1000, \"Server shutting down\");\n\t\t\t} catch {\n\t\t\t\t// Ignore errors when closing individual connections\n\t\t\t}\n\t\t}\n\t\tthis.clients.clear();\n\n\t\t// Close the WebSocket server (only if we created it)\n\t\tif (this.wss && this.mode === \"standalone\") {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tthis.wss!.close(() => resolve());\n\t\t\t});\n\t\t}\n\n\t\tthis.state = \"disconnected\";\n\t\tthis.wss = undefined;\n\t\tthis.attachedServer = undefined;\n\t\tthis.attachedWss = undefined;\n\t}\n\n\tasync send(message: Message): Promise<void> {\n\t\tif (this.state !== \"connected\") {\n\t\t\tthrow new Error(\"Not connected\");\n\t\t}\n\n\t\t// Extract clientId from message payload for routing\n\t\tconst payload = message.payload as {\n\t\t\tclientId?: string;\n\t\t\t[key: string]: unknown;\n\t\t};\n\t\tconst { clientId, ...clientMessage } = payload;\n\n\t\tif (!clientId) {\n\t\t\tthrow new Error(\"Message must contain clientId in payload for routing\");\n\t\t}\n\n\t\tconst client = this.clients.get(clientId);\n\t\tif (!client) {\n\t\t\tthrow new Error(`Client ${clientId} not found`);\n\t\t}\n\n\t\tif (client.ws.readyState !== WebSocket.OPEN) {\n\t\t\tthrow new Error(`Client ${clientId} connection is not open`);\n\t\t}\n\n\t\t// Fully unwrap the server_message envelope\n\t\t// The server_message wrapper is used internally for routing between BaseServer and transport\n\t\t// We need to extract the actual message from inside the wrapper before sending to the client\n\t\tconst messageToSend =\n\t\t\tmessage.type === \"server_message\" && clientMessage.type\n\t\t\t\t? {\n\t\t\t\t\t\tid: message.id,\n\t\t\t\t\t\ttype: clientMessage.type as string,\n\t\t\t\t\t\tpayload:\n\t\t\t\t\t\t\tclientMessage.payload ||\n\t\t\t\t\t\t\t((): Record<string, unknown> => {\n\t\t\t\t\t\t\t\t// If there's no explicit payload field, use all remaining fields except 'type'\n\t\t\t\t\t\t\t\tconst { type, ...rest } = clientMessage;\n\t\t\t\t\t\t\t\treturn rest;\n\t\t\t\t\t\t\t})(),\n\t\t\t\t\t\ttimestamp: message.timestamp,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\t...message,\n\t\t\t\t\t\tpayload: clientMessage,\n\t\t\t\t\t};\n\n\t\tclient.ws.send(JSON.stringify(messageToSend));\n\t}\n\n\tonMessage(handler: MessageHandler): void {\n\t\tthis.messageHandlers.add(handler);\n\t}\n\n\tonError(handler: ErrorHandler): void {\n\t\tthis.errorHandlers.add(handler);\n\t}\n\n\tonClose(handler: CloseHandler): void {\n\t\tthis.closeHandlers.add(handler);\n\t}\n\n\tgetState(): ConnectionState {\n\t\treturn this.state;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.state === \"connected\";\n\t}\n\n\t// Utility methods\n\tgetConnectedClients(): ClientConnection[] {\n\t\treturn Array.from(this.clients.values());\n\t}\n\n\tgetAuthenticatedClients(): ClientConnection[] {\n\t\treturn Array.from(this.clients.values()).filter((c) => c.authenticated);\n\t}\n\n\tgetClientCount(): number {\n\t\treturn this.clients.size;\n\t}\n\n\tgetMode(): \"standalone\" | \"integration\" {\n\t\treturn this.mode;\n\t}\n\n\tisAuthRequired(): boolean {\n\t\treturn this.config.requireAuth ?? false;\n\t}\n\n\tprivate generateId(): string {\n\t\treturn Math.random().toString(36).substring(2) + Date.now().toString(36);\n\t}\n}\n",
34
+ "import type { ITransportAdapter } from \"../../abstractions/TransportAdapter.js\";\nimport type {\n\tCloseHandler,\n\tConnectionOptions,\n\tConnectionState,\n\tErrorHandler,\n\tMessage,\n\tMessageHandler,\n} from \"../../types/index.js\";\n\nexport interface BrowserWebSocketConfig {\n\t/**\n\t * Connection timeout in milliseconds\n\t * @default 30000\n\t */\n\tconnectionTimeout?: number;\n\n\t/**\n\t * Enable automatic ping/pong for connection health checks\n\t * @default true\n\t */\n\tenableHeartbeat?: boolean;\n\n\t/**\n\t * Heartbeat interval in milliseconds\n\t * @default 30000\n\t */\n\theartbeatInterval?: number;\n\n\t/**\n\t * Authorization token for WebSocket connection\n\t */\n\tauthToken?: string;\n}\n\n/**\n * Browser-compatible WebSocket transport adapter using native WebSocket API\n *\n * This adapter is designed for use in browser environments (Electron renderer, React, etc.)\n * and uses the native browser WebSocket API instead of the 'ws' npm package.\n *\n * For Node.js environments, use WebSocketClientTransportAdapter instead.\n *\n * @example\n * ```typescript\n * const transport = new BrowserWebSocketTransportAdapter();\n * const client = new ClientBuilder()\n * .withTransport(transport)\n * .build();\n *\n * await client.connect('ws://localhost:3000');\n * ```\n */\nexport class BrowserWebSocketTransportAdapter implements ITransportAdapter {\n\tprivate ws?: WebSocket; // Native browser WebSocket\n\tprivate state: ConnectionState = \"disconnected\";\n\tprivate messageHandlers: Set<MessageHandler> = new Set();\n\tprivate errorHandlers: Set<ErrorHandler> = new Set();\n\tprivate closeHandlers: Set<CloseHandler> = new Set();\n\tprivate config: Omit<Required<BrowserWebSocketConfig>, \"authToken\"> & {\n\t\tauthToken?: string;\n\t};\n\tprivate heartbeatTimer?: number; // Browser uses number for setTimeout\n\tprivate connectionTimer?: number;\n\tprivate authToken?: string;\n\n\tconstructor(config?: BrowserWebSocketConfig) {\n\t\tthis.config = {\n\t\t\tconnectionTimeout: config?.connectionTimeout ?? 30000,\n\t\t\tenableHeartbeat: config?.enableHeartbeat ?? true,\n\t\t\theartbeatInterval: config?.heartbeatInterval ?? 30000,\n\t\t\tauthToken: config?.authToken,\n\t\t};\n\t\tthis.authToken = config?.authToken;\n\t}\n\n\t/**\n\t * Set authentication token for WebSocket connection\n\t * Note: Browser WebSocket doesn't support custom headers directly,\n\t * so we'll send auth token in first message after connection\n\t */\n\tsetAuthToken(token: string): void {\n\t\tthis.authToken = token;\n\t}\n\n\tasync connect(url: string, _options?: ConnectionOptions): Promise<void> {\n\t\tif (this.state === \"connected\" || this.state === \"connecting\") {\n\t\t\tthrow new Error(\"Already connected or connecting\");\n\t\t}\n\n\t\tthis.state = \"connecting\";\n\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\t// For browser WebSocket, we append auth token as query param if needed\n\t\t\t\t// This is a workaround since browser WebSocket doesn't support custom headers\n\t\t\t\tconst wsUrl = this.authToken\n\t\t\t\t\t? `${url}${url.includes(\"?\") ? \"&\" : \"?\"}token=${encodeURIComponent(this.authToken)}`\n\t\t\t\t\t: url;\n\n\t\t\t\t// Create native browser WebSocket\n\t\t\t\tthis.ws = new WebSocket(wsUrl);\n\n\t\t\t\t// Set up connection timeout\n\t\t\t\tthis.connectionTimer = window.setTimeout(() => {\n\t\t\t\t\tif (this.state === \"connecting\") {\n\t\t\t\t\t\tthis.ws?.close();\n\t\t\t\t\t\tthis.state = \"disconnected\";\n\t\t\t\t\t\tconst error = new Error(\"Connection timeout\");\n\t\t\t\t\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t}, this.config.connectionTimeout);\n\n\t\t\t\t// Handle connection open\n\t\t\t\tthis.ws.onopen = () => {\n\t\t\t\t\tif (this.connectionTimer) {\n\t\t\t\t\t\tclearTimeout(this.connectionTimer);\n\t\t\t\t\t\tthis.connectionTimer = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.state = \"connected\";\n\n\t\t\t\t\t// Start heartbeat if enabled\n\t\t\t\t\tif (this.config.enableHeartbeat) {\n\t\t\t\t\t\tthis.startHeartbeat();\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\t// Handle incoming messages\n\t\t\t\tthis.ws.onmessage = (event: MessageEvent) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst message = JSON.parse(event.data) as Message;\n\t\t\t\t\t\tthis.messageHandlers.forEach((handler) => handler(message));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst err = new Error(`Failed to parse message: ${error}`);\n\t\t\t\t\t\tthis.errorHandlers.forEach((handler) => handler(err));\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Handle errors\n\t\t\t\tthis.ws.onerror = (_event: Event) => {\n\t\t\t\t\tif (this.connectionTimer) {\n\t\t\t\t\t\tclearTimeout(this.connectionTimer);\n\t\t\t\t\t\tthis.connectionTimer = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst error = new Error(\"WebSocket error occurred\");\n\t\t\t\t\tthis.errorHandlers.forEach((handler) => handler(error));\n\n\t\t\t\t\tif (this.state === \"connecting\") {\n\t\t\t\t\t\tthis.state = \"disconnected\";\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Handle connection close\n\t\t\t\tthis.ws.onclose = (event: CloseEvent) => {\n\t\t\t\t\tif (this.connectionTimer) {\n\t\t\t\t\t\tclearTimeout(this.connectionTimer);\n\t\t\t\t\t\tthis.connectionTimer = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.stopHeartbeat();\n\n\t\t\t\t\tconst wasConnected = this.state === \"connected\";\n\t\t\t\t\tconst wasConnecting = this.state === \"connecting\";\n\t\t\t\t\tthis.state = \"disconnected\";\n\n\t\t\t\t\tif (wasConnected) {\n\t\t\t\t\t\tthis.closeHandlers.forEach((handler) =>\n\t\t\t\t\t\t\thandler(event.code, event.reason || \"Connection closed\"),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (wasConnecting) {\n\t\t\t\t\t\treject(new Error(`Connection closed: ${event.reason}`));\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tif (this.connectionTimer) {\n\t\t\t\t\tclearTimeout(this.connectionTimer);\n\t\t\t\t\tthis.connectionTimer = undefined;\n\t\t\t\t}\n\t\t\t\tthis.state = \"disconnected\";\n\t\t\t\treject(error);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.state === \"disconnected\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.state = \"disconnecting\";\n\t\tthis.stopHeartbeat();\n\n\t\tif (this.connectionTimer) {\n\t\t\tclearTimeout(this.connectionTimer);\n\t\t\tthis.connectionTimer = undefined;\n\t\t}\n\n\t\tif (this.ws) {\n\t\t\t// Close with normal closure code\n\t\t\tthis.ws.close(1000, \"Client disconnecting\");\n\n\t\t\t// Wait for close event or timeout\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tresolve();\n\t\t\t\t}, 5000);\n\n\t\t\t\tconst onClose = () => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tif (this.ws) {\n\t\t\t\t\tthis.ws.addEventListener(\"close\", onClose, { once: true });\n\t\t\t\t} else {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.ws = undefined;\n\t\t}\n\n\t\tthis.state = \"disconnected\";\n\t}\n\n\tasync send(message: Message): Promise<void> {\n\t\tif (this.state !== \"connected\") {\n\t\t\tthrow new Error(\"Not connected\");\n\t\t}\n\n\t\tif (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n\t\t\tthrow new Error(\"WebSocket connection is not open\");\n\t\t}\n\n\t\ttry {\n\t\t\tconst data = JSON.stringify(message);\n\t\t\tthis.ws.send(data);\n\t\t} catch (error) {\n\t\t\tthis.errorHandlers.forEach((handler) => handler(error as Error));\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tonMessage(handler: MessageHandler): void {\n\t\tthis.messageHandlers.add(handler);\n\t}\n\n\tonError(handler: ErrorHandler): void {\n\t\tthis.errorHandlers.add(handler);\n\t}\n\n\tonClose(handler: CloseHandler): void {\n\t\tthis.closeHandlers.add(handler);\n\t}\n\n\tgetState(): ConnectionState {\n\t\treturn this.state;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.state === \"connected\" && this.ws?.readyState === WebSocket.OPEN;\n\t}\n\n\t/**\n\t * Get the underlying WebSocket instance\n\t * Useful for advanced use cases\n\t */\n\tgetWebSocket(): WebSocket | undefined {\n\t\treturn this.ws;\n\t}\n\n\t// Private methods\n\n\tprivate startHeartbeat(): void {\n\t\tif (this.heartbeatTimer) {\n\t\t\tclearInterval(this.heartbeatTimer);\n\t\t}\n\n\t\tthis.heartbeatTimer = window.setInterval(() => {\n\t\t\tif (this.ws && this.ws.readyState === WebSocket.OPEN) {\n\t\t\t\t// Send an actual heartbeat message instead of just a WebSocket ping\n\t\t\t\t// This ensures the server processes it and updates presence activity\n\t\t\t\tconst heartbeatMessage: Message = {\n\t\t\t\t\tid: `heartbeat-${Date.now()}`,\n\t\t\t\t\ttype: \"heartbeat\",\n\t\t\t\t\tpayload: { timestamp: Date.now() },\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tthis.ws.send(JSON.stringify(heartbeatMessage));\n\t\t\t}\n\t\t}, this.config.heartbeatInterval);\n\t}\n\n\tprivate stopHeartbeat(): void {\n\t\tif (this.heartbeatTimer) {\n\t\t\tclearInterval(this.heartbeatTimer);\n\t\t\tthis.heartbeatTimer = undefined;\n\t\t}\n\t}\n}\n",
35
+ "import type { Event } from \"./events.js\";\nimport type { Lock } from \"./lock.js\";\n\nexport type RoomPermission = \"read\" | \"write\" | \"admin\";\n\nexport interface Room {\n\tid: string;\n\tname: string;\n\tcreatedAt: number;\n\tmaxUsers?: number;\n\tmaxHistory?: number;\n\tpermissions?: RoomPermission[];\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface RoomUser {\n\tid: string;\n\tusername: string;\n\temail?: string;\n\tjoinedAt: number;\n\tlastActivity: number;\n\tpermissions: RoomPermission[];\n\tstatus: UserStatus;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport type UserStatus = \"online\" | \"away\" | \"offline\";\n\nexport interface RoomState {\n\troom: Room;\n\tusers: Map<string, RoomUser>;\n\teventHistory: Array<Event>;\n\tlocks: Map<string, Lock>;\n}\n\n/**\n * Serializable version of RoomState for JSON transmission over WebSocket\n * Maps are converted to plain objects for JSON compatibility\n */\nexport interface SerializableRoomState {\n\troom: Room;\n\tusers: Record<string, RoomUser>;\n\teventHistory: Array<Event>;\n\tlocks: Record<string, Lock>;\n}\n\n/**\n * Convert RoomState with Maps to a serializable format for JSON transmission\n */\nexport function serializeRoomState(state: RoomState): SerializableRoomState {\n\treturn {\n\t\troom: state.room,\n\t\tusers: Object.fromEntries(state.users),\n\t\teventHistory: state.eventHistory,\n\t\tlocks: Object.fromEntries(state.locks),\n\t};\n}\n\n/**\n * Convert serialized RoomState back to proper RoomState with Maps\n */\nexport function deserializeRoomState(\n\tserialized: SerializableRoomState,\n): RoomState {\n\treturn {\n\t\troom: serialized.room,\n\t\tusers: new Map(Object.entries(serialized.users)),\n\t\teventHistory: serialized.eventHistory,\n\t\tlocks: new Map(Object.entries(serialized.locks)),\n\t};\n}\n\nexport interface RoomConfig {\n\tname?: string;\n\tmaxUsers?: number;\n\tmaxHistory?: number;\n\tpermissions?: RoomPermission[];\n\trequireAuth?: boolean;\n\tallowAnonymous?: boolean;\n\tpersistHistory?: boolean;\n\tmetadata?: Record<string, unknown>;\n}\n",
36
+ "import type { IAuthAdapter } from \"../abstractions/AuthAdapter.js\";\nimport { TypedEventEmitter } from \"../abstractions/EventEmitter.js\";\nimport type { IStorageAdapter } from \"../abstractions/StorageAdapter.js\";\nimport type { ITransportAdapter } from \"../abstractions/TransportAdapter.js\";\nimport type {\n\tAuthenticatePayload,\n\tAuthenticateResult,\n\tConnectionOptions,\n\tConnectionState,\n\tEvent,\n\tLock,\n\tLockRequest,\n\tMessage,\n\tRoomState,\n\tRoomUser,\n} from \"../types/index.js\";\nimport type { SerializableRoomState } from \"../types/room.js\";\nimport { deserializeRoomState } from \"../types/room.js\";\n\nexport interface ClientConfig {\n\ttransport: ITransportAdapter;\n\tauth?: IAuthAdapter;\n\tstorage?: IStorageAdapter;\n\treconnection?: {\n\t\tenabled: boolean;\n\t\tmaxAttempts: number;\n\t\tinitialDelay: number;\n\t\tmaxDelay: number;\n\t\tbackoffFactor: number;\n\t};\n}\n\nexport interface ClientEvents {\n\tconnected: { url: string };\n\tauthenticated: { userId: string };\n\tauthentication_failed: { error: string };\n\tdisconnected: { code: number; reason: string };\n\treconnecting: { attempt: number; delay: number };\n\treconnected: { url: string };\n\terror: { error: Error };\n\troom_joined: { roomId: string; state: RoomState };\n\troom_left: { roomId: string };\n\tevent_received: { event: Event };\n\tlock_acquired: { lock: Lock };\n\tlock_released: { lockId: string };\n\tlock_denied: { request: LockRequest; reason: string };\n\tpresence_updated: { users: RoomUser[] };\n\t[key: string]: unknown;\n}\n\nexport class BaseClient extends TypedEventEmitter<ClientEvents> {\n\tprivate transport: ITransportAdapter;\n\tprivate auth?: IAuthAdapter;\n\tprivate storage?: IStorageAdapter;\n\tprivate config: ClientConfig;\n\n\tprivate connectionState: ConnectionState = \"disconnected\";\n\tprivate currentRoomId: string | null = null;\n\tprivate currentRoomState: RoomState | null = null;\n\tprivate authToken: string | null = null;\n\tprivate userId: string | null = null;\n\n\t// Reconnection state\n\tprivate reconnectAttempts = 0;\n\tprivate reconnectTimer: NodeJS.Timeout | null = null;\n\tprivate lastConnectionUrl: string | null = null;\n\tprivate lastToken: string | null = null;\n\n\tconstructor(config: ClientConfig) {\n\t\tsuper();\n\t\tthis.config = config;\n\t\tthis.transport = config.transport;\n\t\tthis.auth = config.auth;\n\t\tthis.storage = config.storage;\n\n\t\t// Set up transport event handlers\n\t\tthis.transport.onMessage(this.handleMessage.bind(this));\n\t\tthis.transport.onError(this.handleError.bind(this));\n\t\tthis.transport.onClose(this.handleClose.bind(this));\n\t}\n\n\t// Connection Management\n\t/**\n\t * Connect to the server with an optional authentication token.\n\t *\n\t * @param url The WebSocket URL to connect to\n\t * @param token Optional JWT token for authentication\n\t */\n\tasync connect(url: string, token?: string): Promise<void> {\n\t\tif (this.connectionState !== \"disconnected\") {\n\t\t\tthrow new Error(\"Client is already connected or connecting\");\n\t\t}\n\n\t\tthis.connectionState = \"connecting\";\n\t\tthis.lastConnectionUrl = url;\n\t\tthis.lastToken = token || null;\n\n\t\ttry {\n\t\t\t// Use provided token or try to get existing token from auth adapter\n\t\t\tlet tokenToApply = token || null;\n\n\t\t\tif (\n\t\t\t\t!tokenToApply &&\n\t\t\t\tthis.auth &&\n\t\t\t\ttypeof this.auth.getCurrentToken === \"function\"\n\t\t\t) {\n\t\t\t\ttokenToApply = this.auth.getCurrentToken();\n\t\t\t}\n\n\t\t\tif (tokenToApply) {\n\t\t\t\tthis.authToken = tokenToApply;\n\n\t\t\t\t// Try to validate and get user info from token\n\t\t\t\tif (this.auth) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst payload = await this.auth.validateToken(tokenToApply);\n\t\t\t\t\t\tthis.userId = payload.userId;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Token validation failed locally, server will validate\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply token to transport if it supports it\n\t\t\t\tif (typeof (this.transport as any).setAuthToken === \"function\") {\n\t\t\t\t\t(this.transport as any).setAuthToken(tokenToApply);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst options: ConnectionOptions = {\n\t\t\t\turl,\n\t\t\t\treconnect: false, // We handle reconnection ourselves\n\t\t\t\t...this.config.reconnection,\n\t\t\t};\n\n\t\t\tawait this.transport.connect(url, options);\n\t\t\tthis.connectionState = \"connected\";\n\n\t\t\tawait this.emit(\"connected\", { url });\n\t\t} catch (error) {\n\t\t\tthis.connectionState = \"disconnected\";\n\t\t\tawait this.emit(\"error\", { error: error as Error });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.connectionState === \"disconnected\") {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.connectionState = \"disconnecting\";\n\n\t\t// Clear reconnection timer\n\t\tif (this.reconnectTimer) {\n\t\t\tclearTimeout(this.reconnectTimer);\n\t\t\tthis.reconnectTimer = null;\n\t\t}\n\n\t\t// Leave room if joined\n\t\tif (this.currentRoomId) {\n\t\t\tawait this.leaveRoom();\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.transport.disconnect();\n\t\t} finally {\n\t\t\tthis.connectionState = \"disconnected\";\n\t\t\tthis.currentRoomId = null;\n\t\t\tthis.currentRoomState = null;\n\t\t\tthis.authToken = null;\n\t\t\tthis.userId = null;\n\t\t\tthis.reconnectAttempts = 0;\n\n\t\t\tawait this.emit(\"disconnected\", {\n\t\t\t\tcode: 1000,\n\t\t\t\treason: \"Client disconnected\",\n\t\t\t});\n\t\t}\n\t}\n\n\tasync reconnect(): Promise<void> {\n\t\tif (!this.lastConnectionUrl) {\n\t\t\tthrow new Error(\"No previous connection to reconnect to\");\n\t\t}\n\n\t\tif (this.connectionState !== \"disconnected\") {\n\t\t\tawait this.disconnect();\n\t\t}\n\n\t\tawait this.connect(this.lastConnectionUrl, this.lastToken || undefined);\n\t}\n\n\t// Authentication\n\t/**\n\t * Send an authenticate message to the server with the current token.\n\t * This must be called after connect() to complete the authentication handshake.\n\t *\n\t * @param options Optional authentication options including deviceId and metadata\n\t * @throws Error if client is not connected or no auth token is available\n\t */\n\tasync authenticate(\n\t\toptions?: Omit<AuthenticatePayload, \"token\">,\n\t): Promise<void> {\n\t\tif (this.connectionState !== \"connected\") {\n\t\t\tthrow new Error(\"Client must be connected to authenticate\");\n\t\t}\n\n\t\tif (!this.authToken) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No auth token available. Connect with credentials first.\",\n\t\t\t);\n\t\t}\n\n\t\tconst payload: AuthenticatePayload = {\n\t\t\ttoken: this.authToken,\n\t\t\t...options,\n\t\t};\n\n\t\tconst message: Message = {\n\t\t\tid: this.generateId(),\n\t\t\ttype: \"authenticate\",\n\t\t\tpayload,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tawait this.transport.send(message);\n\t\t// Response will be handled in handleMessage via auth_result\n\t}\n\n\t/**\n\t * Check if the client has an auth token available.\n\t */\n\thasAuthToken(): boolean {\n\t\treturn this.authToken !== null;\n\t}\n\n\t// Room Management\n\tasync joinRoom(roomId: string): Promise<void> {\n\t\tif (this.connectionState !== \"connected\") {\n\t\t\tthrow new Error(\"Client must be connected to join a room\");\n\t\t}\n\n\t\tif (this.currentRoomId) {\n\t\t\tawait this.leaveRoom();\n\t\t}\n\n\t\tconst message: Message = {\n\t\t\tid: this.generateId(),\n\t\t\ttype: \"join_room\",\n\t\t\tpayload: { roomId, token: this.authToken },\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tawait this.transport.send(message);\n\t\t// Response will be handled in handleMessage\n\t}\n\n\tasync leaveRoom(): Promise<void> {\n\t\tif (!this.currentRoomId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst message: Message = {\n\t\t\tid: this.generateId(),\n\t\t\ttype: \"leave_room\",\n\t\t\tpayload: { roomId: this.currentRoomId },\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tawait this.transport.send(message);\n\t\t// Response will be handled in handleMessage\n\n\t\tthis.currentRoomId = null;\n\t\tthis.currentRoomState = null;\n\t}\n\n\t// Event Operations\n\tasync broadcast(event: Event): Promise<void> {\n\t\tif (this.connectionState !== \"connected\" || !this.currentRoomId) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Client must be connected and in a room to broadcast events\",\n\t\t\t);\n\t\t}\n\n\t\tconst message: Message = {\n\t\t\tid: this.generateId(),\n\t\t\ttype: \"broadcast_event\",\n\t\t\tpayload: { event, roomId: this.currentRoomId },\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tawait this.transport.send(message);\n\t}\n\n\t// Lock Operations\n\tasync requestLock(request: LockRequest): Promise<void> {\n\t\tif (this.connectionState !== \"connected\" || !this.currentRoomId) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Client must be connected and in a room to request locks\",\n\t\t\t);\n\t\t}\n\n\t\tconst message: Message = {\n\t\t\tid: this.generateId(),\n\t\t\ttype: \"request_lock\",\n\t\t\tpayload: { request, roomId: this.currentRoomId },\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tawait this.transport.send(message);\n\t}\n\n\tasync releaseLock(lockId: string): Promise<void> {\n\t\tif (this.connectionState !== \"connected\" || !this.currentRoomId) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Client must be connected and in a room to release locks\",\n\t\t\t);\n\t\t}\n\n\t\tconst message: Message = {\n\t\t\tid: this.generateId(),\n\t\t\ttype: \"release_lock\",\n\t\t\tpayload: { lockId, roomId: this.currentRoomId },\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tawait this.transport.send(message);\n\t}\n\n\t// State Getters\n\tgetConnectionState(): ConnectionState {\n\t\treturn this.connectionState;\n\t}\n\n\tgetRoomState(): RoomState | null {\n\t\treturn this.currentRoomState;\n\t}\n\n\tgetPresence(): RoomUser[] {\n\t\treturn this.currentRoomState\n\t\t\t? Array.from(this.currentRoomState.users.values())\n\t\t\t: [];\n\t}\n\n\tgetCurrentRoomId(): string | null {\n\t\treturn this.currentRoomId;\n\t}\n\n\tgetUserId(): string | null {\n\t\treturn this.userId;\n\t}\n\n\t// Private Methods\n\tprivate async handleMessage(message: Message): Promise<void> {\n\t\ttry {\n\t\t\tswitch (message.type) {\n\t\t\t\tcase \"auth_result\":\n\t\t\t\t\tawait this.handleAuthResult(message.payload as AuthenticateResult);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"room_joined\":\n\t\t\t\t\tawait this.handleRoomJoined(\n\t\t\t\t\t\tmessage.payload as { roomId: string; state: SerializableRoomState },\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"room_left\":\n\t\t\t\t\tawait this.handleRoomLeft(message.payload as { roomId: string });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"event_broadcast\":\n\t\t\t\t\tawait this.handleEventBroadcast(message.payload as { event: Event });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"lock_acquired\":\n\t\t\t\t\tawait this.handleLockAcquired(message.payload as { lock: Lock });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"lock_released\":\n\t\t\t\t\tawait this.handleLockReleased(message.payload as { lockId: string });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"lock_denied\":\n\t\t\t\t\tawait this.handleLockDenied(\n\t\t\t\t\t\tmessage.payload as { request: LockRequest; reason: string },\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"presence_updated\":\n\t\t\t\t\tawait this.handlePresenceUpdated(\n\t\t\t\t\t\tmessage.payload as { users: RoomUser[] },\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"error\":\n\t\t\t\t\tawait this.handleServerError(message.payload as { error: string });\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait this.emit(\"error\", { error: error as Error });\n\t\t\t// Error is already emitted, no additional handling needed\n\t\t}\n\t}\n\n\tprivate async handleError(error: Error): Promise<void> {\n\t\tawait this.emit(\"error\", { error });\n\t}\n\n\tprivate async handleClose(code: number, reason: string): Promise<void> {\n\t\tconst wasConnected = this.connectionState === \"connected\";\n\t\tthis.connectionState = \"disconnected\";\n\n\t\tif (wasConnected) {\n\t\t\tawait this.emit(\"disconnected\", { code, reason });\n\n\t\t\t// Attempt reconnection if enabled\n\t\t\tif (this.config.reconnection?.enabled && this.lastConnectionUrl) {\n\t\t\t\tthis.scheduleReconnect();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async handleAuthResult(payload: AuthenticateResult): Promise<void> {\n\t\tif (payload.success) {\n\t\t\tif (payload.userId) {\n\t\t\t\tthis.userId = payload.userId;\n\t\t\t}\n\t\t\tawait this.emit(\"authenticated\", { userId: this.userId || \"\" });\n\t\t} else {\n\t\t\tawait this.emit(\"authentication_failed\", {\n\t\t\t\terror: payload.error || \"Authentication failed\",\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async handleRoomJoined(payload: {\n\t\troomId: string;\n\t\tstate: SerializableRoomState;\n\t}): Promise<void> {\n\t\tthis.currentRoomId = payload.roomId;\n\n\t\t// Deserialize the plain objects back to Maps\n\t\tconst roomState = deserializeRoomState(payload.state);\n\t\tthis.currentRoomState = roomState;\n\n\t\tawait this.emit(\"room_joined\", {\n\t\t\troomId: payload.roomId,\n\t\t\tstate: roomState,\n\t\t});\n\t}\n\n\tprivate async handleRoomLeft(payload: { roomId: string }): Promise<void> {\n\t\tif (this.currentRoomId === payload.roomId) {\n\t\t\tthis.currentRoomId = null;\n\t\t\tthis.currentRoomState = null;\n\t\t}\n\t\tawait this.emit(\"room_left\", payload);\n\t}\n\n\tprivate async handleEventBroadcast(payload: { event: Event }): Promise<void> {\n\t\tawait this.emit(\"event_received\", payload);\n\t}\n\n\tprivate async handleLockAcquired(payload: { lock: Lock }): Promise<void> {\n\t\tawait this.emit(\"lock_acquired\", payload);\n\t}\n\n\tprivate async handleLockReleased(payload: { lockId: string }): Promise<void> {\n\t\tawait this.emit(\"lock_released\", payload);\n\t}\n\n\tprivate async handleLockDenied(payload: {\n\t\trequest: LockRequest;\n\t\treason: string;\n\t}): Promise<void> {\n\t\tawait this.emit(\"lock_denied\", payload);\n\t}\n\n\tprivate async handlePresenceUpdated(payload: {\n\t\tusers: RoomUser[];\n\t}): Promise<void> {\n\t\tif (this.currentRoomState) {\n\t\t\t// Convert array back to Map\n\t\t\tthis.currentRoomState.users = new Map(\n\t\t\t\tpayload.users.map((user) => [user.id, user]),\n\t\t\t);\n\t\t}\n\t\tawait this.emit(\"presence_updated\", payload);\n\t}\n\n\tprivate async handleServerError(payload: { error: string }): Promise<void> {\n\t\tconst error = new Error(payload.error);\n\t\tawait this.emit(\"error\", { error });\n\t}\n\n\tprivate async scheduleReconnect(): Promise<void> {\n\t\tif (\n\t\t\t!this.config.reconnection ||\n\t\t\tthis.reconnectAttempts >= this.config.reconnection.maxAttempts\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst delay = Math.min(\n\t\t\tthis.config.reconnection.initialDelay *\n\t\t\t\tMath.pow(\n\t\t\t\t\tthis.config.reconnection.backoffFactor,\n\t\t\t\t\tthis.reconnectAttempts,\n\t\t\t\t),\n\t\t\tthis.config.reconnection.maxDelay,\n\t\t);\n\n\t\tthis.reconnectAttempts++;\n\n\t\tawait this.emit(\"reconnecting\", { attempt: this.reconnectAttempts, delay });\n\n\t\tthis.reconnectTimer = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tawait this.reconnect();\n\t\t\t\tthis.reconnectAttempts = 0;\n\t\t\t\tawait this.emit(\"reconnected\", { url: this.lastConnectionUrl! });\n\t\t\t} catch {\n\t\t\t\t// Reconnection failed, schedule next attempt\n\t\t\t\tthis.scheduleReconnect();\n\t\t\t}\n\t\t}, delay);\n\t}\n\n\tprivate generateId(): string {\n\t\treturn Math.random().toString(36).substring(2) + Date.now().toString(36);\n\t}\n}\n",
37
+ "import type { IAuthAdapter } from \"../abstractions/AuthAdapter.js\";\nimport type { IStorageAdapter } from \"../abstractions/StorageAdapter.js\";\nimport type { ITransportAdapter } from \"../abstractions/TransportAdapter.js\";\nimport { BaseClient, type ClientConfig } from \"./BaseClient.js\";\n\nexport class ClientBuilder {\n\tprivate transport?: ITransportAdapter;\n\tprivate auth?: IAuthAdapter;\n\tprivate storage?: IStorageAdapter;\n\tprivate reconnection?: ClientConfig[\"reconnection\"];\n\n\twithTransport(transport: ITransportAdapter): this {\n\t\tthis.transport = transport;\n\t\treturn this;\n\t}\n\n\twithAuth(auth: IAuthAdapter): this {\n\t\tthis.auth = auth;\n\t\treturn this;\n\t}\n\n\twithStorage(storage: IStorageAdapter): this {\n\t\tthis.storage = storage;\n\t\treturn this;\n\t}\n\n\twithReconnection(config: NonNullable<ClientConfig[\"reconnection\"]>): this {\n\t\tthis.reconnection = config;\n\t\treturn this;\n\t}\n\n\tbuild(): BaseClient {\n\t\tif (!this.transport) {\n\t\t\tthrow new Error(\"Transport adapter is required\");\n\t\t}\n\n\t\tconst config: ClientConfig = {\n\t\t\ttransport: this.transport,\n\t\t\tauth: this.auth,\n\t\t\tstorage: this.storage,\n\t\t\treconnection: this.reconnection || {\n\t\t\t\tenabled: true,\n\t\t\t\tmaxAttempts: 5,\n\t\t\t\tinitialDelay: 1000,\n\t\t\t\tmaxDelay: 30000,\n\t\t\t\tbackoffFactor: 2,\n\t\t\t},\n\t\t};\n\n\t\treturn new BaseClient(config);\n\t}\n}\n",
38
+ "/**\n * Presence Client Helper\n *\n * Simplifies client-side presence integration for web/Electron applications.\n * Automatically handles connection, authentication, and presence event forwarding.\n */\n\nimport { TypedEventEmitter } from \"../abstractions/EventEmitter.js\";\nimport type { UserPresence } from \"../types/presence.js\";\nimport { BaseClient, type ClientConfig } from \"./BaseClient.js\";\n\nexport interface PresenceClientConfig {\n\t/**\n\t * Base client configuration\n\t * Provide the full client config including transport and auth adapters\n\t */\n\tclientConfig: ClientConfig;\n\n\t/**\n\t * WebSocket URL to connect to\n\t */\n\twsUrl: string;\n\n\t/**\n\t * Automatically connect on construction\n\t * @default false\n\t */\n\tautoConnect?: boolean;\n\n\t/**\n\t * Automatically reconnect on disconnect\n\t * @default true\n\t */\n\tautoReconnect?: boolean;\n\n\t/**\n\t * Global presence room ID\n\t * @default '__global_presence__'\n\t */\n\tglobalRoomId?: string;\n}\n\nexport interface PresenceClientEvents {\n\t/**\n\t * User came online\n\t */\n\tuserOnline: { userId: string; devices: unknown[] };\n\n\t/**\n\t * User went offline\n\t */\n\tuserOffline: { userId: string };\n\n\t/**\n\t * User's presence status changed\n\t */\n\tstatusChanged: { userId: string; status: string; statusMessage?: string };\n\n\t/**\n\t * Connected to presence system\n\t */\n\tconnected: {};\n\n\t/**\n\t * Disconnected from presence system\n\t */\n\tdisconnected: {};\n\n\t/**\n\t * Error occurred\n\t */\n\terror: { error: Error };\n\n\t[key: string]: unknown;\n}\n\n/**\n * High-level presence client for easy integration\n *\n * Example:\n * ```typescript\n * import { PresenceClient } from '@principal-ai/control-tower-core';\n * import { WebSocketClientTransportAdapter } from '@principal-ai/control-tower-core';\n * import { ClientBuilder } from '@principal-ai/control-tower-core';\n *\n * const transport = new WebSocketClientTransportAdapter();\n *\n * const client = new ClientBuilder()\n * .withTransport(transport)\n * .build();\n *\n * const presence = new PresenceClient({\n * clientConfig: client,\n * wsUrl: 'ws://localhost:3000/ws',\n * autoConnect: true,\n * autoReconnect: true\n * });\n *\n * presence.on('userOnline', (data) => {\n * console.log(`${data.userId} came online`);\n * });\n *\n * presence.on('userOffline', (data) => {\n * console.log(`${data.userId} went offline`);\n * });\n * ```\n */\nexport class PresenceClient extends TypedEventEmitter<PresenceClientEvents> {\n\tprivate client: BaseClient;\n\tprivate wsUrl: string;\n\tprivate autoReconnectEnabled: boolean;\n\tprivate globalRoomId: string;\n\tprivate reconnectTimeout?: NodeJS.Timeout;\n\n\tconstructor(config: PresenceClientConfig) {\n\t\tsuper();\n\n\t\tthis.wsUrl = config.wsUrl;\n\t\tthis.autoReconnectEnabled = config.autoReconnect ?? true;\n\t\tthis.globalRoomId = config.globalRoomId ?? \"__global_presence__\";\n\n\t\t// Create base client\n\t\tthis.client = new BaseClient(config.clientConfig);\n\n\t\tthis.setupEventForwarding();\n\n\t\tif (config.autoConnect) {\n\t\t\tvoid this.connect();\n\t\t}\n\t}\n\n\t/**\n\t * Connect to the presence system\n\t */\n\tasync connect(): Promise<void> {\n\t\ttry {\n\t\t\t// Connect base client\n\t\t\tawait this.client.connect(this.wsUrl);\n\n\t\t\t// Join global presence room\n\t\t\tawait this.client.joinRoom(this.globalRoomId);\n\n\t\t\tawait this.emit(\"connected\", {});\n\t\t} catch (error) {\n\t\t\tawait this.emit(\"error\", { error: error as Error });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from the presence system\n\t */\n\tasync disconnect(): Promise<void> {\n\t\t// Disable auto-reconnect\n\t\tthis.autoReconnectEnabled = false;\n\n\t\t// Clear any pending reconnect\n\t\tif (this.reconnectTimeout) {\n\t\t\tclearTimeout(this.reconnectTimeout);\n\t\t\tthis.reconnectTimeout = undefined;\n\t\t}\n\n\t\ttry {\n\t\t\t// Leave global presence room\n\t\t\tawait this.client.leaveRoom();\n\n\t\t\t// Disconnect\n\t\t\tawait this.client.disconnect();\n\n\t\t\tawait this.emit(\"disconnected\", {});\n\t\t} catch (error) {\n\t\t\tawait this.emit(\"error\", { error: error as Error });\n\t\t}\n\t}\n\n\t/**\n\t * Get all online users\n\t *\n\t * Note: This requires a corresponding API endpoint on your server.\n\t */\n\tasync getOnlineUsers(): Promise<UserPresence[]> {\n\t\t// This assumes you have a REST API endpoint for fetching online users\n\t\t// You can customize this based on your server implementation\n\t\tthrow new Error(\n\t\t\t\"getOnlineUsers() requires a REST API endpoint. \" +\n\t\t\t\t\"Implement this method based on your server API.\",\n\t\t);\n\t}\n\n\t/**\n\t * Set user status\n\t *\n\t * Note: This requires a corresponding API endpoint on your server.\n\t */\n\tasync setStatus(status: \"online\" | \"away\", message?: string): Promise<void> {\n\t\t// This assumes you have a REST API endpoint for setting status\n\t\t// You can customize this based on your server implementation\n\t\tthrow new Error(\n\t\t\t\"setStatus() requires a REST API endpoint. \" +\n\t\t\t\t\"Implement this method based on your server API.\",\n\t\t);\n\t}\n\n\t/**\n\t * Set visibility\n\t *\n\t * Note: This requires a corresponding API endpoint on your server.\n\t */\n\tasync setVisibility(visible: boolean): Promise<void> {\n\t\t// This assumes you have a REST API endpoint for setting visibility\n\t\t// You can customize this based on your server implementation\n\t\tthrow new Error(\n\t\t\t\"setVisibility() requires a REST API endpoint. \" +\n\t\t\t\t\"Implement this method based on your server API.\",\n\t\t);\n\t}\n\n\t/**\n\t * Get the underlying BaseClient\n\t */\n\tgetClient(): BaseClient {\n\t\treturn this.client;\n\t}\n\n\t/**\n\t * Check if connected\n\t */\n\tisConnected(): boolean {\n\t\t// BaseClient doesn't expose getState(), so we check internal state via a workaround\n\t\t// In practice, you can track connection state via events\n\t\treturn (this.client as any).connectionState === \"connected\";\n\t}\n\n\t/**\n\t * Set up event forwarding from BaseClient\n\t * @private\n\t */\n\tprivate setupEventForwarding(): void {\n\t\t// Forward presence events with simplified API\n\t\tthis.client.on(\"presence:user_online\", (data) => {\n\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\tconst payload = data as { userId: string; devices?: unknown[] };\n\t\t\t\tvoid this.emit(\"userOnline\", {\n\t\t\t\t\tuserId: payload.userId,\n\t\t\t\t\tdevices: payload.devices || [],\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthis.client.on(\"presence:user_offline\", (data) => {\n\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\tconst payload = data as { userId: string };\n\t\t\t\tvoid this.emit(\"userOffline\", { userId: payload.userId });\n\t\t\t}\n\t\t});\n\n\t\tthis.client.on(\"presence:status_changed\", (data) => {\n\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\tconst payload = data as {\n\t\t\t\t\tuserId: string;\n\t\t\t\t\tstatus: string;\n\t\t\t\t\tstatusMessage?: string;\n\t\t\t\t};\n\t\t\t\tvoid this.emit(\"statusChanged\", {\n\t\t\t\t\tuserId: payload.userId,\n\t\t\t\t\tstatus: payload.status,\n\t\t\t\t\tstatusMessage: payload.statusMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Handle disconnection\n\t\tthis.client.on(\"disconnected\", () => {\n\t\t\tvoid this.emit(\"disconnected\", {});\n\n\t\t\t// Auto-reconnect if enabled\n\t\t\tif (this.autoReconnectEnabled) {\n\t\t\t\tthis.reconnectTimeout = setTimeout(() => {\n\t\t\t\t\tvoid this.connect().catch((error) => {\n\t\t\t\t\t\tvoid this.emit(\"error\", { error: error as Error });\n\t\t\t\t\t});\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t});\n\n\t\t// Forward errors\n\t\tthis.client.on(\"error\", (data) => {\n\t\t\tif (data && typeof data === \"object\" && \"error\" in data) {\n\t\t\t\tconst payload = data as { error: Error };\n\t\t\t\tvoid this.emit(\"error\", { error: payload.error });\n\t\t\t}\n\t\t});\n\t}\n}\n",
39
+ "/**\n * Experimental API Types\n *\n * ⚠️ WARNING: Types in this file are experimental and may change or be removed\n * without major version bumps. Use only for prototyping and internal tooling.\n *\n * For production use, submit a feature request to graduate these APIs:\n * @see docs/FEATURE_REQUEST_TEMPLATE.md\n */\n\nimport type { ConnectedClient } from \"../server/BaseServer.js\";\n\n/**\n * Configuration for experimental features\n */\nexport interface ExperimentalFeatureConfig {\n\t/**\n\t * Enable experimental broadcast APIs\n\t *\n\t * ⚠️ DEVELOPMENT USE ONLY\n\t * Allows use of server.experimental.broadcast() and related methods\n\t *\n\t * @default false\n\t */\n\tenableBroadcast?: boolean;\n\n\t/**\n\t * Enable runtime warnings for experimental API usage\n\t *\n\t * When true, logs warnings each time an experimental API is called\n\t * Useful for tracking experimental API usage in development\n\t *\n\t * @default true\n\t */\n\twarnOnExperimentalUse?: boolean;\n\n\t/**\n\t * Track experimental API usage metrics\n\t *\n\t * When true, emits events for experimental API calls that can be\n\t * monitored to understand usage patterns\n\t *\n\t * @default false\n\t */\n\ttrackUsageMetrics?: boolean;\n}\n\n/**\n * Client predicate function for filtering broadcasts\n *\n * @param client - The connected client to evaluate\n * @returns true if the client should receive the broadcast\n *\n * @example\n * // Broadcast only to admin users\n * const isAdmin: ClientPredicate = (client) => {\n * return getUserRole(client.userId) === 'admin';\n * };\n */\nexport type ClientPredicate = (client: ConnectedClient) => boolean;\n\n/**\n * Result of a broadcast operation\n */\nexport interface BroadcastResult {\n\t/**\n\t * Number of clients that successfully received the message\n\t */\n\tsent: number;\n\n\t/**\n\t * Number of clients that failed to receive the message\n\t */\n\tfailed: number;\n\n\t/**\n\t * Errors that occurred during broadcast\n\t */\n\terrors: Array<{\n\t\tclientId: string;\n\t\terror: Error;\n\t}>;\n\n\t/**\n\t * Total time taken to complete the broadcast (milliseconds)\n\t */\n\tdurationMs: number;\n}\n\n/**\n * Options for broadcast operations\n */\nexport interface BroadcastOptions {\n\t/**\n\t * Whether to continue broadcasting even if some sends fail\n\t *\n\t * @default true\n\t */\n\tcontinueOnError?: boolean;\n\n\t/**\n\t * Timeout for each individual send operation (milliseconds)\n\t *\n\t * @default 5000\n\t */\n\tsendTimeout?: number;\n\n\t/**\n\t * Whether to include detailed error information in the result\n\t *\n\t * @default false\n\t */\n\tincludeErrors?: boolean;\n}\n\n/**\n * Experimental API usage metrics event\n */\nexport interface ExperimentalUsageEvent {\n\t/**\n\t * The experimental method that was called\n\t */\n\tmethod:\n\t\t| \"broadcast\"\n\t\t| \"broadcastAuthenticated\"\n\t\t| \"broadcastWhere\"\n\t\t| \"sendToUsers\";\n\n\t/**\n\t * Message type being broadcast\n\t */\n\tmessageType: string;\n\n\t/**\n\t * Number of recipients\n\t */\n\trecipientCount: number;\n\n\t/**\n\t * Timestamp of the call\n\t */\n\ttimestamp: number;\n\n\t/**\n\t * Size of the message payload (bytes)\n\t */\n\tpayloadSize?: number;\n}\n\n/**\n * Error thrown when experimental features are not enabled\n */\nexport class ExperimentalFeatureError extends Error {\n\tconstructor(\n\t\tpublic readonly feature: string,\n\t\tpublic readonly configKey: keyof ExperimentalFeatureConfig,\n\t) {\n\t\tsuper(\n\t\t\t`Experimental feature '${feature}' is not enabled.\\n\\n` +\n\t\t\t\t`To enable, set '${String(configKey)}: true' in your server configuration:\\n\\n` +\n\t\t\t\t` const server = new ServerBuilder()\\n` +\n\t\t\t\t` .withExperimentalFeatures({ ${String(configKey)}: true })\\n` +\n\t\t\t\t` .build();\\n\\n` +\n\t\t\t\t`⚠️ WARNING: Experimental APIs are for development only.\\n` +\n\t\t\t\t`For production use, submit a feature request:\\n` +\n\t\t\t\t`https://github.com/your-org/control-tower-core/issues/new\\n\\n` +\n\t\t\t\t`See docs/EXPERIMENTAL_BROADCAST.md for details.`,\n\t\t);\n\t\tthis.name = \"ExperimentalFeatureError\";\n\t}\n}\n",
40
+ "/**\n * Experimental Broadcast APIs\n *\n * ⚠️ DEVELOPMENT USE ONLY\n *\n * This namespace provides experimental broadcast methods for rapid prototyping\n * and internal tooling. These APIs may change or be removed without major version bumps.\n *\n * For production use, submit a feature request to graduate these APIs to first-class APIs.\n *\n * @see docs/EXPERIMENTAL_BROADCAST.md\n * @see docs/FEATURE_REQUEST_TEMPLATE.md\n */\n\nimport type {\n\tBroadcastOptions,\n\tBroadcastResult,\n\tClientPredicate,\n\tExperimentalFeatureConfig,\n\tExperimentalUsageEvent,\n} from \"../types/experimental.js\";\nimport { ExperimentalFeatureError } from \"../types/experimental.js\";\nimport type { Message } from \"../types/index.js\";\nimport type { ConnectedClient } from \"./BaseServer.js\";\n\n/**\n * Experimental API namespace\n *\n * Provides broadcast methods that bypass normal room isolation.\n * Requires explicit opt-in via configuration.\n */\nexport class ExperimentalAPI {\n\tprivate readonly config: ExperimentalFeatureConfig;\n\tprivate readonly logger?: {\n\t\twarn: (message: string, ...args: unknown[]) => void;\n\t};\n\tprivate readonly emitMetric?: (event: ExperimentalUsageEvent) => void;\n\tprivate readonly getClients: () => ConnectedClient[];\n\tprivate readonly sendToClient: (\n\t\tclientId: string,\n\t\tmessage: Record<string, unknown>,\n\t) => Promise<void>;\n\n\tconstructor(options: {\n\t\tconfig: ExperimentalFeatureConfig;\n\t\tlogger?: { warn: (message: string, ...args: unknown[]) => void };\n\t\temitMetric?: (event: ExperimentalUsageEvent) => void;\n\t\tgetClients: () => ConnectedClient[];\n\t\tsendToClient: (\n\t\t\tclientId: string,\n\t\t\tmessage: Record<string, unknown>,\n\t\t) => Promise<void>;\n\t}) {\n\t\tthis.config = options.config;\n\t\tthis.logger = options.logger;\n\t\tthis.emitMetric = options.emitMetric;\n\t\tthis.getClients = options.getClients;\n\t\tthis.sendToClient = options.sendToClient;\n\t}\n\n\t/**\n\t * Broadcasts a message to all connected clients\n\t *\n\t * ⚠️ WARNING: This bypasses room isolation and sends to every connected client.\n\t *\n\t * @experimental\n\t * @param message - Message to broadcast\n\t * @param options - Broadcast options\n\t * @returns Broadcast result with success/failure counts\n\t *\n\t * @throws {ExperimentalFeatureError} If experimental.enableBroadcast is not enabled\n\t *\n\t * @example\n\t * ```typescript\n\t * await server.experimental.broadcast({\n\t * type: 'system:announcement',\n\t * data: { message: 'Server maintenance in 5 minutes' }\n\t * });\n\t * ```\n\t */\n\tasync broadcast(\n\t\tmessage: Omit<Message, \"id\" | \"timestamp\">,\n\t\toptions?: BroadcastOptions,\n\t): Promise<BroadcastResult> {\n\t\tthis.ensureEnabled(\"broadcast\", \"enableBroadcast\");\n\t\tthis.warnIfEnabled(\"broadcast()\");\n\n\t\tconst clients = this.getClients();\n\n\t\tconst result = await this.broadcastToClients(clients, message, options);\n\n\t\tthis.trackUsage(\"broadcast\", message.type, clients.length, message.payload);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Broadcasts a message to all authenticated clients\n\t *\n\t * Skips unauthenticated connections. Useful for user-specific notifications.\n\t *\n\t * @experimental\n\t * @param message - Message to broadcast\n\t * @param options - Broadcast options\n\t * @returns Broadcast result with success/failure counts\n\t *\n\t * @throws {ExperimentalFeatureError} If experimental.enableBroadcast is not enabled\n\t *\n\t * @example\n\t * ```typescript\n\t * await server.experimental.broadcastAuthenticated({\n\t * type: 'presence:user_online',\n\t * data: { userId: 'alice', status: 'online' }\n\t * });\n\t * ```\n\t */\n\tasync broadcastAuthenticated(\n\t\tmessage: Omit<Message, \"id\" | \"timestamp\">,\n\t\toptions?: BroadcastOptions,\n\t): Promise<BroadcastResult> {\n\t\tthis.ensureEnabled(\"broadcastAuthenticated\", \"enableBroadcast\");\n\t\tthis.warnIfEnabled(\"broadcastAuthenticated()\");\n\n\t\tconst clients = this.getClients().filter((client) => client.authenticated);\n\n\t\tconst result = await this.broadcastToClients(clients, message, options);\n\n\t\tthis.trackUsage(\n\t\t\t\"broadcastAuthenticated\",\n\t\t\tmessage.type,\n\t\t\tclients.length,\n\t\t\tmessage.payload,\n\t\t);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Broadcasts a message to clients matching a predicate function\n\t *\n\t * Allows custom filtering logic for targeted broadcasts.\n\t *\n\t * @experimental\n\t * @param predicate - Function to filter clients\n\t * @param message - Message to broadcast\n\t * @param options - Broadcast options\n\t * @returns Broadcast result with success/failure counts\n\t *\n\t * @throws {ExperimentalFeatureError} If experimental.enableBroadcast is not enabled\n\t *\n\t * @example\n\t * ```typescript\n\t * // Broadcast only to admin users\n\t * await server.experimental.broadcastWhere(\n\t * (client) => getUserRole(client.userId) === 'admin',\n\t * {\n\t * type: 'admin:alert',\n\t * data: { message: 'Critical system event' }\n\t * }\n\t * );\n\t * ```\n\t */\n\tasync broadcastWhere(\n\t\tpredicate: ClientPredicate,\n\t\tmessage: Omit<Message, \"id\" | \"timestamp\">,\n\t\toptions?: BroadcastOptions,\n\t): Promise<BroadcastResult> {\n\t\tthis.ensureEnabled(\"broadcastWhere\", \"enableBroadcast\");\n\t\tthis.warnIfEnabled(\"broadcastWhere()\");\n\n\t\tconst clients = this.getClients().filter(predicate);\n\n\t\tconst result = await this.broadcastToClients(clients, message, options);\n\n\t\tthis.trackUsage(\n\t\t\t\"broadcastWhere\",\n\t\t\tmessage.type,\n\t\t\tclients.length,\n\t\t\tmessage.payload,\n\t\t);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Sends a message to specific users by their user IDs\n\t *\n\t * Useful for direct notifications and cross-room messaging.\n\t *\n\t * @experimental\n\t * @param userIds - Array of user IDs to send to\n\t * @param message - Message to send\n\t * @param options - Broadcast options\n\t * @returns Broadcast result with success/failure counts\n\t *\n\t * @throws {ExperimentalFeatureError} If experimental.enableBroadcast is not enabled\n\t *\n\t * @example\n\t * ```typescript\n\t * await server.experimental.sendToUsers(\n\t * ['user123', 'user456'],\n\t * {\n\t * type: 'notification:mention',\n\t * data: { mentionedBy: 'alice', context: 'issue-42' }\n\t * }\n\t * );\n\t * ```\n\t */\n\tasync sendToUsers(\n\t\tuserIds: string[],\n\t\tmessage: Omit<Message, \"id\" | \"timestamp\">,\n\t\toptions?: BroadcastOptions,\n\t): Promise<BroadcastResult> {\n\t\tthis.ensureEnabled(\"sendToUsers\", \"enableBroadcast\");\n\t\tthis.warnIfEnabled(\"sendToUsers()\");\n\n\t\tconst userIdSet = new Set(userIds);\n\t\tconst clients = this.getClients().filter((client) =>\n\t\t\tuserIdSet.has(client.userId),\n\t\t);\n\n\t\tconst result = await this.broadcastToClients(clients, message, options);\n\n\t\tthis.trackUsage(\n\t\t\t\"sendToUsers\",\n\t\t\tmessage.type,\n\t\t\tclients.length,\n\t\t\tmessage.payload,\n\t\t);\n\n\t\treturn result;\n\t}\n\n\t// Private helper methods\n\n\tprivate ensureEnabled(\n\t\tfeature: string,\n\t\tconfigKey: keyof ExperimentalFeatureConfig,\n\t): void {\n\t\tif (!this.config[configKey]) {\n\t\t\tthrow new ExperimentalFeatureError(feature, configKey);\n\t\t}\n\t}\n\n\tprivate warnIfEnabled(method: string): void {\n\t\tif (this.config.warnOnExperimentalUse !== false) {\n\t\t\tthis.logger?.warn(\n\t\t\t\t`⚠️ Experimental API: server.experimental.${method} is for development only. ` +\n\t\t\t\t\t`See docs/EXPERIMENTAL_BROADCAST.md for details.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate trackUsage(\n\t\tmethod:\n\t\t\t| \"broadcast\"\n\t\t\t| \"broadcastAuthenticated\"\n\t\t\t| \"broadcastWhere\"\n\t\t\t| \"sendToUsers\",\n\t\tmessageType: string,\n\t\trecipientCount: number,\n\t\tpayload?: unknown,\n\t): void {\n\t\tif (this.config.trackUsageMetrics && this.emitMetric) {\n\t\t\tconst payloadSize = payload ? JSON.stringify(payload).length : undefined;\n\n\t\t\tthis.emitMetric({\n\t\t\t\tmethod,\n\t\t\t\tmessageType,\n\t\t\t\trecipientCount,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tpayloadSize,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async broadcastToClients(\n\t\tclients: ConnectedClient[],\n\t\tmessage: Omit<Message, \"id\" | \"timestamp\">,\n\t\toptions?: BroadcastOptions,\n\t): Promise<BroadcastResult> {\n\t\tconst startTime = Date.now();\n\t\tconst opts = {\n\t\t\tcontinueOnError: options?.continueOnError ?? true,\n\t\t\tsendTimeout: options?.sendTimeout ?? 5000,\n\t\t\tincludeErrors: options?.includeErrors ?? false,\n\t\t};\n\n\t\tconst fullMessage: Message = {\n\t\t\tid: this.generateId(),\n\t\t\ttimestamp: Date.now(),\n\t\t\ttype: message.type,\n\t\t\tpayload: message.payload,\n\t\t};\n\n\t\tlet sent = 0;\n\t\tlet failed = 0;\n\t\tconst errors: Array<{ clientId: string; error: Error }> = [];\n\n\t\tconst sendPromises = clients.map(async (client) => {\n\t\t\ttry {\n\t\t\t\t// Create timeout promise\n\t\t\t\tconst timeoutPromise = new Promise<never>((_, reject) => {\n\t\t\t\t\tsetTimeout(() => reject(new Error(\"Send timeout\")), opts.sendTimeout);\n\t\t\t\t});\n\n\t\t\t\t// Convert Message to Record<string, unknown> for sendToClient\n\t\t\t\tconst messageRecord: Record<string, unknown> = {\n\t\t\t\t\tid: fullMessage.id,\n\t\t\t\t\ttype: fullMessage.type,\n\t\t\t\t\tpayload: fullMessage.payload,\n\t\t\t\t\ttimestamp: fullMessage.timestamp,\n\t\t\t\t};\n\n\t\t\t\t// Race between send and timeout\n\t\t\t\tawait Promise.race([\n\t\t\t\t\tthis.sendToClient(client.id, messageRecord),\n\t\t\t\t\ttimeoutPromise,\n\t\t\t\t]);\n\n\t\t\t\tsent++;\n\t\t\t} catch (error) {\n\t\t\t\tfailed++;\n\t\t\t\tif (opts.includeErrors) {\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tclientId: client.id,\n\t\t\t\t\t\terror: error as Error,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (!opts.continueOnError) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tawait Promise.all(sendPromises);\n\n\t\treturn {\n\t\t\tsent,\n\t\t\tfailed,\n\t\t\terrors,\n\t\t\tdurationMs: Date.now() - startTime,\n\t\t};\n\t}\n\n\tprivate generateId(): string {\n\t\treturn `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\t}\n}\n",
41
+ "import type { Server as HttpServer } from \"http\";\nimport type { Server as HttpsServer } from \"https\";\nimport type { WebSocketServer } from \"ws\";\nimport type { IAuthAdapter } from \"../abstractions/AuthAdapter.js\";\nimport { TypedEventEmitter } from \"../abstractions/EventEmitter.js\";\nimport type { LockManager } from \"../abstractions/LockManager.js\";\nimport type { PresenceManager } from \"../abstractions/PresenceManager.js\";\nimport type { RoomManager } from \"../abstractions/RoomManager.js\";\nimport type { IStorageAdapter } from \"../abstractions/StorageAdapter.js\";\nimport type { ITransportAdapter } from \"../abstractions/TransportAdapter.js\";\nimport type {\n\tEvent,\n\tExperimentalFeatureConfig,\n\tExperimentalUsageEvent,\n\tLock,\n\tLockRequest,\n\tMessage,\n\tRoom,\n\tRoomConfig,\n\tRoomUser,\n} from \"../types/index.js\";\nimport { serializeRoomState } from \"../types/room.js\";\nimport { ExperimentalAPI } from \"./ExperimentalAPI.js\";\n\nexport interface ServerConfig {\n\ttransport: ITransportAdapter;\n\tauth?: IAuthAdapter;\n\tstorage?: IStorageAdapter;\n\troomManager: RoomManager;\n\tlockManager: LockManager;\n\tpresenceManager?: PresenceManager;\n\tdefaultRoomConfig?: Partial<RoomConfig>;\n\thttpServer?: HttpServer | HttpsServer;\n\twebSocketPath?: string;\n\twebSocketServer?: WebSocketServer;\n\texperimental?: ExperimentalFeatureConfig;\n}\n\nexport interface ConnectedClient {\n\tid: string;\n\tuserId: string;\n\t/**\n\t * Set of room IDs the client is currently in\n\t *\n\t * Multi-room support: A client can be in multiple rooms simultaneously.\n\t * This enables the two-tier architecture where clients can maintain\n\t * global presence while participating in multiple repository rooms.\n\t */\n\troomIds: Set<string>;\n\t/**\n\t * Legacy single-room accessor for backward compatibility\n\t *\n\t * Returns the first room the client is in, or null if not in any rooms.\n\t *\n\t * @deprecated Use roomIds for multi-room support\n\t */\n\troomId: string | null;\n\tauthenticated: boolean;\n\tconnectedAt: number;\n}\n\nexport interface ServerEvents {\n\tstarted: { port: number };\n\tstopped: {}; // eslint-disable-line @typescript-eslint/no-empty-object-type\n\tclient_connected: { client: ConnectedClient };\n\tclient_disconnected: { clientId: string; reason: string };\n\tclient_authenticated: {\n\t\tclientId: string;\n\t\tuserId: string;\n\t\tmetadata?: Record<string, unknown>;\n\t};\n\troom_created: { room: Room };\n\troom_deleted: { roomId: string };\n\tclient_joined_room: { clientId: string; roomId: string };\n\tclient_left_room: { clientId: string; roomId: string };\n\tevent_broadcast: { roomId: string; event: Event; fromClientId: string };\n\tlock_acquired: { lock: Lock; clientId: string };\n\tlock_released: { lockId: string; clientId: string };\n\terror: { error: Error; context?: string };\n\texperimental_usage: ExperimentalUsageEvent;\n\t// Presence events\n\tpresence_changed: { userId: string; status: string; timestamp: number };\n\tpresence_device_connected: {\n\t\tuserId: string;\n\t\tdeviceId: string;\n\t\ttimestamp: number;\n\t};\n\tpresence_device_disconnected: {\n\t\tuserId: string;\n\t\tdeviceId: string;\n\t\ttimestamp: number;\n\t};\n\tpresence_activity: { userId: string; deviceId: string; timestamp: number };\n\t[key: string]: unknown;\n}\n\nexport class BaseServer extends TypedEventEmitter<ServerEvents> {\n\tprivate transport: ITransportAdapter;\n\tprivate auth?: IAuthAdapter;\n\tprivate storage?: IStorageAdapter;\n\tprivate roomManager: RoomManager;\n\tprivate lockManager: LockManager;\n\tprivate presenceManager?: PresenceManager;\n\tprivate config: ServerConfig;\n\n\tprivate clients = new Map<string, ConnectedClient>();\n\tprivate clientMessageHandlers = new Map<\n\t\tstring,\n\t\t(message: Message) => Promise<void>\n\t>();\n\tprivate clientUserMap = new Map<string, string>(); // clientId -> userId\n\tprivate userClientMap = new Map<string, Set<string>>(); // userId -> Set<clientId>\n\tprivate running = false;\n\tprivate initialized = false;\n\tprivate mode: \"standalone\" | \"integration\";\n\tprivate heartbeatIntervalId?: NodeJS.Timeout;\n\n\t/**\n\t * Experimental APIs namespace\n\t *\n\t * ⚠️ WARNING: Experimental features are for development only.\n\t * APIs may change or be removed without major version bumps.\n\t *\n\t * @see docs/EXPERIMENTAL_BROADCAST.md\n\t */\n\tpublic readonly experimental: ExperimentalAPI;\n\n\tconstructor(config: ServerConfig) {\n\t\tsuper();\n\t\tthis.config = config;\n\t\tthis.transport = config.transport;\n\t\tthis.auth = config.auth;\n\t\tthis.storage = config.storage;\n\t\tthis.roomManager = config.roomManager;\n\t\tthis.lockManager = config.lockManager;\n\t\tthis.presenceManager = config.presenceManager;\n\n\t\t// Initialize experimental API namespace\n\t\tthis.experimental = new ExperimentalAPI({\n\t\t\tconfig: config.experimental || {\n\t\t\t\tenableBroadcast: false,\n\t\t\t\twarnOnExperimentalUse: true,\n\t\t\t\ttrackUsageMetrics: false,\n\t\t\t},\n\t\t\tlogger: console,\n\t\t\temitMetric: (event: ExperimentalUsageEvent) => {\n\t\t\t\tvoid this.emit(\"experimental_usage\", event);\n\t\t\t},\n\t\t\tgetClients: () => Array.from(this.clients.values()),\n\t\t\tsendToClient: (clientId: string, message: Record<string, unknown>) =>\n\t\t\t\tthis.sendToClient(clientId, message),\n\t\t});\n\n\t\t// Determine mode based on configuration\n\t\tthis.mode =\n\t\t\tconfig.httpServer || config.webSocketServer\n\t\t\t\t? \"integration\"\n\t\t\t\t: \"standalone\";\n\n\t\t// Connect auth adapter to transport if both exist and transport supports it\n\t\tif (this.auth && this.transport) {\n\t\t\tconst transportWithAuth = this.transport as ITransportAdapter & {\n\t\t\t\tsetAuthAdapter?: (auth: IAuthAdapter) => void;\n\t\t\t};\n\t\t\tif (typeof transportWithAuth.setAuthAdapter === \"function\") {\n\t\t\t\ttransportWithAuth.setAuthAdapter(this.auth);\n\t\t\t}\n\t\t}\n\n\t\t// Set up transport event handlers\n\t\tthis.transport.onMessage(this.handleTransportMessage.bind(this));\n\t\tthis.transport.onError(this.handleTransportError.bind(this));\n\t\tthis.transport.onClose(this.handleTransportClose.bind(this));\n\n\t\t// Start heartbeat processor if presence is enabled\n\t\tif (this.presenceManager?.isEnabled()) {\n\t\t\tthis.startHeartbeatProcessor();\n\t\t}\n\t}\n\n\t/**\n\t * Start periodic heartbeat processing for presence management\n\t */\n\tprivate startHeartbeatProcessor(): void {\n\t\tif (!this.presenceManager) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst config = this.presenceManager.getConfig();\n\t\tconst interval = config.heartbeatInterval;\n\n\t\tthis.heartbeatIntervalId = setInterval(async () => {\n\t\t\ttry {\n\t\t\t\tconst changes = await this.presenceManager!.processHeartbeats();\n\n\t\t\t\t// Emit presence change events\n\t\t\t\tfor (const change of changes) {\n\t\t\t\t\tawait this.emit(\"presence_changed\", {\n\t\t\t\t\t\tuserId: change.userId,\n\t\t\t\t\t\tstatus: change.status,\n\t\t\t\t\t\ttimestamp: change.timestamp,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Broadcast presence updates if enabled\n\t\t\t\t\tif (config.broadcastPresenceUpdates) {\n\t\t\t\t\t\tawait this.experimental.broadcastAuthenticated({\n\t\t\t\t\t\t\ttype: \"presence:status_changed\",\n\t\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\t\tuserId: change.userId,\n\t\t\t\t\t\t\t\tstatus: change.status,\n\t\t\t\t\t\t\t\tpreviousStatus: change.previousStatus,\n\t\t\t\t\t\t\t\treason: change.reason,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tawait this.emit(\"error\", {\n\t\t\t\t\terror: error as Error,\n\t\t\t\t\tcontext: \"heartbeat_processor\",\n\t\t\t\t});\n\t\t\t}\n\t\t}, interval);\n\t}\n\n\t/**\n\t * Stop heartbeat processor\n\t */\n\tprivate stopHeartbeatProcessor(): void {\n\t\tif (this.heartbeatIntervalId) {\n\t\t\tclearInterval(this.heartbeatIntervalId);\n\t\t\tthis.heartbeatIntervalId = undefined;\n\t\t}\n\t}\n\n\t// Server Lifecycle\n\tasync start(port?: number): Promise<void> {\n\t\tif (this.mode === \"integration\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot use start() in integration mode. Use initialize() instead.\",\n\t\t\t);\n\t\t}\n\n\t\tif (!port) {\n\t\t\tthrow new Error(\"Port is required for standalone mode\");\n\t\t}\n\n\t\tif (this.running) {\n\t\t\tthrow new Error(\"Server is already running\");\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.transport.connect(`ws://localhost:${port}`, {\n\t\t\t\turl: `ws://localhost:${port}`,\n\t\t\t});\n\t\t\tthis.running = true;\n\t\t\tthis.initialized = true;\n\t\t\tawait this.emit(\"started\", { port });\n\t\t} catch (error) {\n\t\t\tawait this.emit(\"error\", {\n\t\t\t\terror: error as Error,\n\t\t\t\tcontext: \"server_start\",\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tif (this.mode === \"standalone\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot use initialize() in standalone mode. Use start() instead.\",\n\t\t\t);\n\t\t}\n\n\t\tif (this.initialized) {\n\t\t\tthrow new Error(\"Server is already initialized\");\n\t\t}\n\n\t\ttry {\n\t\t\tconst transport = this.transport as ITransportAdapter & {\n\t\t\t\tattach?: (\n\t\t\t\t\tserver: HttpServer | HttpsServer,\n\t\t\t\t\tpath?: string,\n\t\t\t\t) => Promise<void>;\n\t\t\t\tattachToWebSocketServer?: (wss: WebSocketServer) => Promise<void>;\n\t\t\t};\n\n\t\t\tif (this.config.webSocketServer) {\n\t\t\t\t// Attach to existing WebSocket server\n\t\t\t\tif (typeof transport.attachToWebSocketServer === \"function\") {\n\t\t\t\t\tawait transport.attachToWebSocketServer(this.config.webSocketServer);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Transport adapter does not support attachToWebSocketServer\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (this.config.httpServer) {\n\t\t\t\t// Attach to existing HTTP server\n\t\t\t\tif (typeof transport.attach === \"function\") {\n\t\t\t\t\tawait transport.attach(\n\t\t\t\t\t\tthis.config.httpServer,\n\t\t\t\t\t\tthis.config.webSocketPath || \"/ws\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Transport adapter does not support attach\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Either httpServer or webSocketServer must be provided in integration mode\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.running = true;\n\t\t\tthis.initialized = true;\n\t\t\tawait this.emit(\"started\", { port: 0 }); // Port 0 indicates integration mode\n\t\t} catch (error) {\n\t\t\tawait this.emit(\"error\", {\n\t\t\t\terror: error as Error,\n\t\t\t\tcontext: \"server_initialize\",\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tif (!this.running) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.running = false;\n\n\t\t// Stop heartbeat processor\n\t\tthis.stopHeartbeatProcessor();\n\n\t\t// Disconnect all clients\n\t\tfor (const [clientId] of Array.from(this.clients)) {\n\t\t\tawait this.disconnectClient(clientId, \"Server shutting down\");\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.transport.disconnect();\n\t\t} catch (error) {\n\t\t\tawait this.emit(\"error\", {\n\t\t\t\terror: error as Error,\n\t\t\t\tcontext: \"server_stop\",\n\t\t\t});\n\t\t}\n\n\t\tthis.clients.clear();\n\t\tthis.clientMessageHandlers.clear();\n\t\tthis.clientUserMap.clear();\n\t\tthis.userClientMap.clear();\n\n\t\t// Clear presence data\n\t\tif (this.presenceManager) {\n\t\t\tawait this.presenceManager.clear();\n\t\t}\n\n\t\tawait this.emit(\"stopped\", {});\n\t}\n\n\t// Client Management\n\tprivate async handleTransportMessage(message: Message): Promise<void> {\n\t\t// Handle special transport messages\n\t\tif (message.type === \"connection\") {\n\t\t\tawait this.handleConnectionMessage(message);\n\t\t\treturn;\n\t\t}\n\n\t\tif (message.type === \"client_authenticated\") {\n\t\t\tawait this.handleClientAuthenticatedMessage(message);\n\t\t\treturn;\n\t\t}\n\n\t\tif (message.type === \"disconnect\") {\n\t\t\tconst payload = message.payload as { clientId: string; reason?: string };\n\t\t\tawait this.disconnectClient(\n\t\t\t\tpayload.clientId,\n\t\t\t\tpayload.reason || \"Client disconnected\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Transport messages contain clientId in the payload for routing\n\t\tconst payload = message.payload as {\n\t\t\tclientId?: string;\n\t\t\ttype?: string;\n\t\t\t[key: string]: unknown;\n\t\t};\n\t\tconst { clientId, type, ...clientMessage } = payload;\n\n\t\tconst clientMsg: Message = {\n\t\t\tid: message.id,\n\t\t\ttype: type || message.type, // Use inner type if present, otherwise outer type\n\t\t\tpayload: clientMessage,\n\t\t\ttimestamp: message.timestamp,\n\t\t};\n\n\t\tif (!clientId) {\n\t\t\tawait this.emit(\"error\", {\n\t\t\t\terror: new Error(\"Message missing clientId\"),\n\t\t\t\tcontext: \"transport_message\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst handler = this.clientMessageHandlers.get(clientId);\n\t\tif (handler) {\n\t\t\tawait handler(clientMsg);\n\t\t} else {\n\t\t\tawait this.emit(\"error\", {\n\t\t\t\terror: new Error(`No handler for client ${clientId}`),\n\t\t\t\tcontext: \"transport_message\",\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async handleConnectionMessage(message: Message): Promise<void> {\n\t\tconst payload = message.payload as {\n\t\t\tclientId: string;\n\t\t\tauthenticated: boolean;\n\t\t\tuserId?: string;\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t};\n\n\t\t// Add the client with initial auth state\n\t\tconst roomIds = new Set<string>();\n\t\tconst client: ConnectedClient = {\n\t\t\tid: payload.clientId,\n\t\t\tuserId: payload.userId || \"\",\n\t\t\troomIds,\n\t\t\tget roomId() {\n\t\t\t\treturn roomIds.size > 0 ? roomIds.values().next().value || null : null;\n\t\t\t},\n\t\t\tauthenticated: payload.authenticated,\n\t\t\tconnectedAt: Date.now(),\n\t\t};\n\n\t\tthis.clients.set(payload.clientId, client);\n\t\tthis.clientMessageHandlers.set(\n\t\t\tpayload.clientId,\n\t\t\tthis.createClientMessageHandler(payload.clientId),\n\t\t);\n\n\t\tawait this.emit(\"client_connected\", { client });\n\n\t\t// Register with presence manager if authenticated\n\t\tif (\n\t\t\tpayload.authenticated &&\n\t\t\tthis.presenceManager?.isEnabled() &&\n\t\t\tpayload.userId\n\t\t) {\n\t\t\ttry {\n\t\t\t\tawait this.presenceManager.connectDevice(\n\t\t\t\t\tpayload.userId,\n\t\t\t\t\tpayload.clientId,\n\t\t\t\t\t{\n\t\t\t\t\t\tconnectedAt: Date.now(),\n\t\t\t\t\t\tlastActivity: Date.now(),\n\t\t\t\t\t\tmetadata: payload.metadata,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tawait this.emit(\"presence_device_connected\", {\n\t\t\t\t\tuserId: payload.userId,\n\t\t\t\t\tdeviceId: payload.clientId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\n\t\t\t\t// Broadcast presence update\n\t\t\t\tconst presenceConfig = this.presenceManager.getConfig();\n\t\t\t\tif (presenceConfig.broadcastPresenceUpdates) {\n\t\t\t\t\tawait this.experimental.broadcastAuthenticated({\n\t\t\t\t\t\ttype: \"presence:user_online\",\n\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\tuserId: payload.userId,\n\t\t\t\t\t\t\tdeviceId: payload.clientId,\n\t\t\t\t\t\t\tstatus: \"online\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tawait this.emit(\"error\", {\n\t\t\t\t\terror: error as Error,\n\t\t\t\t\tcontext: \"presence_connect_device\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (payload.authenticated) {\n\t\t\tawait this.emit(\"client_authenticated\", {\n\t\t\t\tclientId: payload.clientId,\n\t\t\t\tuserId: payload.userId || \"\",\n\t\t\t\tmetadata: payload.metadata,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async handleClientAuthenticatedMessage(\n\t\tmessage: Message,\n\t): Promise<void> {\n\t\tconst payload = message.payload as {\n\t\t\tclientId: string;\n\t\t\tuserId: string;\n\t\t\tmetadata?: Record<string, unknown>;\n\t\t};\n\n\t\tconst client = this.clients.get(payload.clientId);\n\t\tif (client) {\n\t\t\tclient.authenticated = true;\n\t\t\tclient.userId = payload.userId;\n\n\t\t\t// Auto-update client mappings\n\t\t\tthis.clientUserMap.set(payload.clientId, payload.userId);\n\t\t\tif (!this.userClientMap.has(payload.userId)) {\n\t\t\t\tthis.userClientMap.set(payload.userId, new Set());\n\t\t\t}\n\t\t\tthis.userClientMap.get(payload.userId)!.add(payload.clientId);\n\n\t\t\tawait this.emit(\"client_authenticated\", {\n\t\t\t\tclientId: payload.clientId,\n\t\t\t\tuserId: payload.userId,\n\t\t\t\tmetadata: payload.metadata,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async handleTransportError(error: Error): Promise<void> {\n\t\tawait this.emit(\"error\", { error, context: \"transport\" });\n\t}\n\n\tprivate async handleTransportClose(\n\t\t_code: number,\n\t\t_reason: string,\n\t): Promise<void> {\n\t\t// Transport close means server is shutting down\n\t\tif (this.running) {\n\t\t\tawait this.stop();\n\t\t}\n\t}\n\n\tprivate async addClient(clientId: string): Promise<void> {\n\t\tconst roomIds = new Set<string>();\n\t\tconst client: ConnectedClient = {\n\t\t\tid: clientId,\n\t\t\tuserId: \"\",\n\t\t\troomIds,\n\t\t\tget roomId() {\n\t\t\t\treturn roomIds.size > 0 ? roomIds.values().next().value || null : null;\n\t\t\t},\n\t\t\tauthenticated: false,\n\t\t\tconnectedAt: Date.now(),\n\t\t};\n\n\t\tthis.clients.set(clientId, client);\n\n\t\t// Set up message handler for this client\n\t\tthis.clientMessageHandlers.set(\n\t\t\tclientId,\n\t\t\tthis.createClientMessageHandler(clientId),\n\t\t);\n\n\t\tawait this.emit(\"client_connected\", { client });\n\t}\n\n\tprivate async disconnectClient(\n\t\tclientId: string,\n\t\treason: string,\n\t): Promise<void> {\n\t\tconst client = this.clients.get(clientId);\n\t\tif (!client) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Auto-clean client mappings\n\t\tif (client.userId) {\n\t\t\tthis.clientUserMap.delete(clientId);\n\t\t\tconst clientSet = this.userClientMap.get(client.userId);\n\t\t\tif (clientSet) {\n\t\t\t\tclientSet.delete(clientId);\n\t\t\t\tif (clientSet.size === 0) {\n\t\t\t\t\tthis.userClientMap.delete(client.userId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Unregister from presence manager\n\t\tif (this.presenceManager?.isEnabled() && client.userId) {\n\t\t\ttry {\n\t\t\t\tconst presence = await this.presenceManager.disconnectDevice(\n\t\t\t\t\tclient.userId,\n\t\t\t\t\tclientId,\n\t\t\t\t);\n\n\t\t\t\tawait this.emit(\"presence_device_disconnected\", {\n\t\t\t\t\tuserId: client.userId,\n\t\t\t\t\tdeviceId: clientId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t});\n\n\t\t\t\t// Broadcast presence update if user went offline or into grace period\n\t\t\t\tconst presenceConfig = this.presenceManager.getConfig();\n\t\t\t\tif (\n\t\t\t\t\tpresenceConfig.broadcastPresenceUpdates &&\n\t\t\t\t\t(!presence || presence.status === \"offline\")\n\t\t\t\t) {\n\t\t\t\t\tawait this.experimental.broadcastAuthenticated({\n\t\t\t\t\t\ttype: \"presence:user_offline\",\n\t\t\t\t\t\tpayload: {\n\t\t\t\t\t\t\tuserId: client.userId,\n\t\t\t\t\t\t\tdeviceId: clientId,\n\t\t\t\t\t\t\tstatus: presence?.status || \"offline\",\n\t\t\t\t\t\t\tgracePeriod: presenceConfig.gracePeriod,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tawait this.emit(\"error\", {\n\t\t\t\t\terror: error as Error,\n\t\t\t\t\tcontext: \"presence_disconnect_device\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Leave all rooms the client is in\n\t\tfor (const roomId of client.roomIds) {\n\t\t\tawait this.roomManager.leaveRoom(roomId, client.userId);\n\t\t\tawait this.emit(\"client_left_room\", { clientId, roomId });\n\t\t}\n\n\t\t// Release all locks held by this client\n\t\tawait this.lockManager.releaseUserLocks(client.userId);\n\n\t\t// Clean up\n\t\tthis.clients.delete(clientId);\n\t\tthis.clientMessageHandlers.delete(clientId);\n\n\t\tawait this.emit(\"client_disconnected\", { clientId, reason });\n\t}\n\n\tprivate createClientMessageHandler(\n\t\tclientId: string,\n\t): (message: Message) => Promise<void> {\n\t\treturn async (message: Message) => {\n\t\t\ttry {\n\t\t\t\tconst client = this.clients.get(clientId);\n\t\t\t\tif (!client) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Auto-update presence activity on ANY message\n\t\t\t\tif (\n\t\t\t\t\tthis.presenceManager?.isEnabled() &&\n\t\t\t\t\tclient.userId &&\n\t\t\t\t\tclient.authenticated\n\t\t\t\t) {\n\t\t\t\t\tawait this.updatePresenceActivity(client.userId, clientId, \"message\");\n\t\t\t\t}\n\n\t\t\t\tswitch (message.type) {\n\t\t\t\t\tcase \"authenticate\":\n\t\t\t\t\t\tawait this.handleAuthenticate(\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\tmessage.payload as { token: string },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"join_room\":\n\t\t\t\t\t\tawait this.handleJoinRoom(\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\tmessage.payload as { roomId: string; token?: string },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"leave_room\":\n\t\t\t\t\t\tawait this.handleLeaveRoom(\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\tmessage.payload as { roomId?: string },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"broadcast_event\":\n\t\t\t\t\t\tawait this.handleBroadcastEvent(\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\tmessage.payload as { event: Event; roomId: string },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"request_lock\":\n\t\t\t\t\t\tawait this.handleLockRequest(\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\tmessage.payload as { request: LockRequest; roomId: string },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"release_lock\":\n\t\t\t\t\t\tawait this.handleLockRelease(\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\tmessage.payload as { lockId: string },\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"ping\":\n\t\t\t\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\t\t\t\ttype: \"pong\",\n\t\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// Presence activity already updated automatically above\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"heartbeat\":\n\t\t\t\t\t\t// Heartbeat messages are used to keep presence activity updated\n\t\t\t\t\t\t// The activity is already tracked above (line ~570), so we just acknowledge\n\t\t\t\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\t\t\t\ttype: \"heartbeat_ack\",\n\t\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\t\terror: `Unknown message type: ${message.type}`,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\terror: (error as Error).message,\n\t\t\t\t});\n\t\t\t\tawait this.emit(\"error\", {\n\t\t\t\t\terror: error as Error,\n\t\t\t\t\tcontext: `client_${clientId}`,\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n\n\t// Message Handlers\n\tprivate async handleAuthenticate(\n\t\tclientId: string,\n\t\tpayload: { token: string },\n\t): Promise<void> {\n\t\tif (!this.auth) {\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"auth_result\",\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Authentication not configured\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst tokenPayload = await this.auth.validateToken(payload.token);\n\t\t\tconst client = this.clients.get(clientId);\n\t\t\tif (client) {\n\t\t\t\tclient.userId = tokenPayload.userId;\n\t\t\t\tclient.authenticated = true;\n\n\t\t\t\t// Update client-user mappings so getUserIdFromClientId works\n\t\t\t\tthis.clientUserMap.set(clientId, tokenPayload.userId);\n\t\t\t\tif (!this.userClientMap.has(tokenPayload.userId)) {\n\t\t\t\t\tthis.userClientMap.set(tokenPayload.userId, new Set());\n\t\t\t\t}\n\t\t\t\tthis.userClientMap.get(tokenPayload.userId)!.add(clientId);\n\n\t\t\t\tawait this.emit(\"client_authenticated\", {\n\t\t\t\t\tclientId,\n\t\t\t\t\tuserId: tokenPayload.userId,\n\t\t\t\t\tmetadata: tokenPayload.metadata,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"auth_result\",\n\t\t\t\tsuccess: true,\n\t\t\t\tuserId: tokenPayload.userId,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"auth_result\",\n\t\t\t\tsuccess: false,\n\t\t\t\terror: (error as Error).message,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async handleJoinRoom(\n\t\tclientId: string,\n\t\tpayload: { roomId: string; token?: string },\n\t): Promise<void> {\n\t\tconst client = this.clients.get(clientId);\n\t\tif (!client) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Authenticate if token provided\n\t\tif (payload.token && !client.authenticated) {\n\t\t\tawait this.handleAuthenticate(clientId, { token: payload.token });\n\t\t}\n\n\t\tif (!client.authenticated) {\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"error\",\n\t\t\t\terror: \"Authentication required to join room\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Check if already in the room\n\t\t\tif (client.roomIds.has(payload.roomId)) {\n\t\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\terror: \"Already in this room\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Get or create room\n\t\t\tlet roomState = await this.roomManager.getRoomState(payload.roomId);\n\t\t\tif (!roomState) {\n\t\t\t\tconst roomConfig = {\n\t\t\t\t\t...this.config.defaultRoomConfig,\n\t\t\t\t\tid: payload.roomId,\n\t\t\t\t};\n\t\t\t\tconst room = await this.roomManager.createRoom(\n\t\t\t\t\tpayload.roomId,\n\t\t\t\t\troomConfig,\n\t\t\t\t);\n\t\t\t\troomState = await this.roomManager.getRoomState(payload.roomId);\n\t\t\t\tawait this.emit(\"room_created\", { room });\n\t\t\t}\n\n\t\t\tif (!roomState) {\n\t\t\t\tthrow new Error(\"Failed to create or get room state\");\n\t\t\t}\n\n\t\t\t// Join room\n\t\t\tconst user: RoomUser = {\n\t\t\t\tid: client.userId,\n\t\t\t\tusername: client.userId, // TODO: Get from auth token\n\t\t\t\tstatus: \"online\",\n\t\t\t\tjoinedAt: Date.now(),\n\t\t\t\tlastActivity: Date.now(),\n\t\t\t\tpermissions: roomState.room.permissions || [\"read\", \"write\"],\n\t\t\t};\n\n\t\t\tawait this.roomManager.joinRoom(payload.roomId, user);\n\t\t\tclient.roomIds.add(payload.roomId);\n\n\t\t\tawait this.emit(\"client_joined_room\", {\n\t\t\t\tclientId,\n\t\t\t\troomId: payload.roomId,\n\t\t\t});\n\n\t\t\t// Get updated room state after joining (so it includes the current user)\n\t\t\tconst updatedRoomState = await this.roomManager.getRoomState(\n\t\t\t\tpayload.roomId,\n\t\t\t);\n\t\t\tif (!updatedRoomState) {\n\t\t\t\tthrow new Error(\"Failed to get updated room state after joining\");\n\t\t\t}\n\n\t\t\t// Convert Maps to plain objects for JSON serialization\n\t\t\tconst serializableState = serializeRoomState(updatedRoomState);\n\n\t\t\t// Send room state to client\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"room_joined\",\n\t\t\t\troomId: payload.roomId,\n\t\t\t\tstate: serializableState,\n\t\t\t});\n\n\t\t\t// Send event history\n\t\t\tconst history = await this.roomManager.getEventHistory(\n\t\t\t\tpayload.roomId,\n\t\t\t\t50,\n\t\t\t);\n\t\t\tif (history.length > 0) {\n\t\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\t\ttype: \"event_history\",\n\t\t\t\t\tevents: history,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"error\",\n\t\t\t\terror: (error as Error).message,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async handleLeaveRoom(\n\t\tclientId: string,\n\t\tpayload?: { roomId?: string },\n\t): Promise<void> {\n\t\tconst client = this.clients.get(clientId);\n\t\tif (!client) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If roomId is specified, leave that specific room\n\t\t// Otherwise, leave all rooms (backward compatibility)\n\t\tconst roomsToLeave = payload?.roomId\n\t\t\t? [payload.roomId]\n\t\t\t: Array.from(client.roomIds);\n\n\t\tif (roomsToLeave.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const roomId of roomsToLeave) {\n\t\t\tif (!client.roomIds.has(roomId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tawait this.roomManager.leaveRoom(roomId, client.userId);\n\t\t\tclient.roomIds.delete(roomId);\n\n\t\t\tawait this.emit(\"client_left_room\", { clientId, roomId });\n\t\t\tawait this.sendToClient(clientId, { type: \"room_left\", roomId });\n\t\t}\n\t}\n\n\tprivate async handleBroadcastEvent(\n\t\tclientId: string,\n\t\tpayload: { event: Event; roomId: string },\n\t): Promise<void> {\n\t\tconst client = this.clients.get(clientId);\n\t\tif (!client || !client.roomIds.has(payload.roomId)) {\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"error\",\n\t\t\t\terror: \"Not in specified room\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Add metadata to event\n\t\tconst enrichedEvent = {\n\t\t\t...payload.event,\n\t\t\tmetadata: {\n\t\t\t\t...payload.event.metadata,\n\t\t\t\tuserId: client.userId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\troomId: payload.roomId,\n\t\t\t},\n\t\t};\n\n\t\t// Add to history\n\t\tawait this.roomManager.addEventToHistory(payload.roomId, enrichedEvent);\n\n\t\t// Broadcast to room\n\t\tawait this.roomManager.broadcastToRoom(\n\t\t\tpayload.roomId,\n\t\t\tenrichedEvent,\n\t\t\tclient.userId,\n\t\t);\n\n\t\tawait this.emit(\"event_broadcast\", {\n\t\t\troomId: payload.roomId,\n\t\t\tevent: enrichedEvent,\n\t\t\tfromClientId: clientId,\n\t\t});\n\t}\n\n\tprivate async handleLockRequest(\n\t\tclientId: string,\n\t\tpayload: { request: LockRequest; roomId: string },\n\t): Promise<void> {\n\t\tconst client = this.clients.get(clientId);\n\t\tif (!client || !client.roomIds.has(payload.roomId)) {\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"error\",\n\t\t\t\terror: \"Not in specified room\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst lock = await this.lockManager.acquireLock(\n\t\t\t\tclient.userId,\n\t\t\t\tclient.userId,\n\t\t\t\tpayload.request,\n\t\t\t);\n\t\t\tawait this.emit(\"lock_acquired\", { lock, clientId });\n\n\t\t\tawait this.sendToClient(clientId, { type: \"lock_acquired\", lock });\n\n\t\t\t// Broadcast lock status to room\n\t\t\tawait this.roomManager.broadcastToRoom(payload.roomId, {\n\t\t\t\tid: this.generateId(),\n\t\t\t\ttype: \"lock_status\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tuserId: client.userId,\n\t\t\t\troomId: payload.roomId,\n\t\t\t\tdata: { lock, action: \"acquired\" },\n\t\t\t\tmetadata: {\n\t\t\t\t\tuserId: client.userId,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\troomId: payload.roomId,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"lock_denied\",\n\t\t\t\trequest: payload.request,\n\t\t\t\treason: (error as Error).message,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async handleLockRelease(\n\t\tclientId: string,\n\t\tpayload: { lockId: string },\n\t): Promise<void> {\n\t\tconst client = this.clients.get(clientId);\n\t\tif (!client) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.lockManager.releaseLock(payload.lockId);\n\t\t\tawait this.emit(\"lock_released\", { lockId: payload.lockId, clientId });\n\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"lock_released\",\n\t\t\t\tlockId: payload.lockId,\n\t\t\t});\n\n\t\t\t// Broadcast lock status to all rooms the client is in\n\t\t\tfor (const roomId of client.roomIds) {\n\t\t\t\tawait this.roomManager.broadcastToRoom(roomId, {\n\t\t\t\t\tid: this.generateId(),\n\t\t\t\t\ttype: \"lock_status\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tuserId: client.userId,\n\t\t\t\t\troomId,\n\t\t\t\t\tdata: { lockId: payload.lockId, action: \"released\" },\n\t\t\t\t\tmetadata: { userId: client.userId, timestamp: Date.now(), roomId },\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait this.sendToClient(clientId, {\n\t\t\t\ttype: \"error\",\n\t\t\t\terror: (error as Error).message,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Utility Methods\n\tprivate async sendToClient(\n\t\tclientId: string,\n\t\tmessage: Record<string, unknown>,\n\t): Promise<void> {\n\t\tconst transportMessage: Message = {\n\t\t\tid: this.generateId(),\n\t\t\ttype: \"server_message\",\n\t\t\tpayload: { clientId, ...message },\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tawait this.transport.send(transportMessage);\n\t}\n\n\tprivate generateId(): string {\n\t\treturn Math.random().toString(36).substring(2) + Date.now().toString(36);\n\t}\n\n\t// Public API for external management\n\tasync createRoom(roomId: string, config: RoomConfig): Promise<Room> {\n\t\tconst room = await this.roomManager.createRoom(roomId, config);\n\t\tawait this.emit(\"room_created\", { room });\n\t\treturn room;\n\t}\n\n\tasync deleteRoom(roomId: string): Promise<void> {\n\t\tawait this.roomManager.deleteRoom(roomId);\n\t\tawait this.emit(\"room_deleted\", { roomId });\n\t}\n\n\tgetConnectedClients(): ConnectedClient[] {\n\t\treturn Array.from(this.clients.values());\n\t}\n\n\tgetClient(clientId: string): ConnectedClient | null {\n\t\treturn this.clients.get(clientId) || null;\n\t}\n\n\tisRunning(): boolean {\n\t\treturn this.running;\n\t}\n\n\tgetMode(): \"standalone\" | \"integration\" {\n\t\treturn this.mode;\n\t}\n\n\tisInitialized(): boolean {\n\t\treturn this.initialized;\n\t}\n\n\t/**\n\t * Update presence activity for a user's device\n\t *\n\t * @param userId - User identifier\n\t * @param deviceId - Device/client identifier\n\t * @param activityType - Type of activity\n\t */\n\tprivate async updatePresenceActivity(\n\t\tuserId: string,\n\t\tdeviceId: string,\n\t\tactivityType: \"heartbeat\" | \"message\" | \"user_action\",\n\t): Promise<void> {\n\t\tif (!this.presenceManager?.isEnabled()) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.presenceManager.updateActivity({\n\t\t\t\tuserId,\n\t\t\t\tdeviceId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tactivityType,\n\t\t\t});\n\n\t\t\tawait this.emit(\"presence_activity\", {\n\t\t\t\tuserId,\n\t\t\t\tdeviceId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\t// Don't throw, just log the error\n\t\t\tawait this.emit(\"error\", {\n\t\t\t\terror: error as Error,\n\t\t\t\tcontext: \"presence_update_activity\",\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Get presence manager (if configured)\n\t */\n\tgetPresenceManager(): PresenceManager | undefined {\n\t\treturn this.presenceManager;\n\t}\n\n\t/**\n\t * Get user ID from client ID\n\t *\n\t * @param clientId - Client identifier\n\t * @returns User ID, or undefined if not found or not authenticated\n\t */\n\tgetUserIdFromClientId(clientId: string): string | undefined {\n\t\treturn this.clientUserMap.get(clientId);\n\t}\n\n\t/**\n\t * Get all client IDs for a user\n\t *\n\t * A user may have multiple connected devices/clients.\n\t *\n\t * @param userId - User identifier\n\t * @returns Array of client IDs\n\t */\n\tgetClientIdsForUser(userId: string): string[] {\n\t\treturn Array.from(this.userClientMap.get(userId) || []);\n\t}\n\n\t/**\n\t * Get device ID from client ID\n\t *\n\t * In Control Tower architecture, clientId === deviceId\n\t *\n\t * @param clientId - Client identifier\n\t * @returns Device ID (same as clientId)\n\t */\n\tgetDeviceIdFromClientId(clientId: string): string {\n\t\treturn clientId;\n\t}\n}\n",
42
+ "import type { Server as HttpServer } from \"http\";\nimport type { Server as HttpsServer } from \"https\";\nimport type { WebSocketServer } from \"ws\";\nimport type { IAuthAdapter } from \"../abstractions/AuthAdapter.js\";\nimport { DefaultPresenceManager } from \"../abstractions/DefaultPresenceManager.js\";\nimport type { LockManager } from \"../abstractions/LockManager.js\";\nimport type { PresenceManager } from \"../abstractions/PresenceManager.js\";\nimport type { RoomManager } from \"../abstractions/RoomManager.js\";\nimport type { IStorageAdapter } from \"../abstractions/StorageAdapter.js\";\nimport type { ITransportAdapter } from \"../abstractions/TransportAdapter.js\";\nimport type { ExperimentalFeatureConfig, RoomConfig } from \"../types/index.js\";\nimport { BaseServer, type ServerConfig } from \"./BaseServer.js\";\n\nexport class ServerBuilder {\n\tprivate transport?: ITransportAdapter;\n\tprivate auth?: IAuthAdapter;\n\tprivate storage?: IStorageAdapter;\n\tprivate roomManager?: RoomManager;\n\tprivate lockManager?: LockManager;\n\tprivate presenceManager?: PresenceManager;\n\tprivate defaultRoomConfig?: Partial<RoomConfig>;\n\tprivate httpServer?: HttpServer | HttpsServer;\n\tprivate webSocketPath?: string;\n\tprivate webSocketServer?: WebSocketServer;\n\tprivate experimentalFeatures?: ExperimentalFeatureConfig;\n\n\twithTransport(transport: ITransportAdapter): this {\n\t\tthis.transport = transport;\n\t\treturn this;\n\t}\n\n\twithAuth(auth: IAuthAdapter): this {\n\t\tthis.auth = auth;\n\t\treturn this;\n\t}\n\n\twithStorage(storage: IStorageAdapter): this {\n\t\tthis.storage = storage;\n\t\treturn this;\n\t}\n\n\twithRoomManager(roomManager: RoomManager): this {\n\t\tthis.roomManager = roomManager;\n\t\treturn this;\n\t}\n\n\twithLockManager(lockManager: LockManager): this {\n\t\tthis.lockManager = lockManager;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Configure presence management for global user tracking\n\t *\n\t * Enables two-tier connection architecture where users maintain\n\t * global presence while participating in multiple rooms.\n\t *\n\t * @param presenceManager - PresenceManager implementation\n\t */\n\twithPresenceManager(presenceManager: PresenceManager): this {\n\t\tthis.presenceManager = presenceManager;\n\t\treturn this;\n\t}\n\n\twithDefaultRoomConfig(config: Partial<RoomConfig>): this {\n\t\tthis.defaultRoomConfig = config;\n\t\treturn this;\n\t}\n\n\twithHttpServer(server: HttpServer | HttpsServer): this {\n\t\tthis.httpServer = server;\n\t\treturn this;\n\t}\n\n\twithWebSocketPath(path: string): this {\n\t\tthis.webSocketPath = path;\n\t\treturn this;\n\t}\n\n\twithWebSocketServer(wss: WebSocketServer): this {\n\t\tthis.webSocketServer = wss;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Enable experimental features\n\t *\n\t * ⚠️ WARNING: Experimental features are for development only.\n\t * APIs may change or be removed without major version bumps.\n\t *\n\t * @see docs/EXPERIMENTAL_BROADCAST.md\n\t */\n\twithExperimentalFeatures(features: ExperimentalFeatureConfig): this {\n\t\tthis.experimentalFeatures = features;\n\t\treturn this;\n\t}\n\n\tbuild(): BaseServer {\n\t\tif (!this.transport) {\n\t\t\tthrow new Error(\"Transport adapter is required\");\n\t\t}\n\n\t\tif (!this.roomManager) {\n\t\t\tthrow new Error(\"Room manager is required\");\n\t\t}\n\n\t\tif (!this.lockManager) {\n\t\t\tthrow new Error(\"Lock manager is required\");\n\t\t}\n\n\t\tconst config: ServerConfig = {\n\t\t\ttransport: this.transport,\n\t\t\tauth: this.auth,\n\t\t\tstorage: this.storage,\n\t\t\troomManager: this.roomManager,\n\t\t\tlockManager: this.lockManager,\n\t\t\tpresenceManager: this.presenceManager,\n\t\t\tdefaultRoomConfig: this.defaultRoomConfig || {\n\t\t\t\tmaxUsers: 50,\n\t\t\t\tmaxHistory: 100,\n\t\t\t\tpermissions: [\"read\" as const, \"write\" as const],\n\t\t\t},\n\t\t\thttpServer: this.httpServer,\n\t\t\twebSocketPath: this.webSocketPath,\n\t\t\twebSocketServer: this.webSocketServer,\n\t\t\texperimental: this.experimentalFeatures || {\n\t\t\t\tenableBroadcast: false,\n\t\t\t\twarnOnExperimentalUse: true,\n\t\t\t\ttrackUsageMetrics: false,\n\t\t\t},\n\t\t};\n\n\t\tconst server = new BaseServer(config);\n\n\t\t// Auto-link presence manager to server for broadcasting\n\t\tif (this.presenceManager instanceof DefaultPresenceManager) {\n\t\t\tthis.presenceManager.setServer(server);\n\t\t}\n\n\t\t// Auto-wire presence extension hooks to server events\n\t\tif (this.presenceManager instanceof DefaultPresenceManager) {\n\t\t\tthis.wirePresenceExtensionHooks(server, this.presenceManager);\n\t\t}\n\n\t\treturn server;\n\t}\n\n\t/**\n\t * Wire presence extension hooks to server events\n\t * @private\n\t */\n\tprivate wirePresenceExtensionHooks(\n\t\tserver: BaseServer,\n\t\tpresenceManager: DefaultPresenceManager<any>,\n\t): void {\n\t\t// Initialize extensions when server starts\n\t\tserver.on(\"started\", async () => {\n\t\t\tawait presenceManager.initializeExtensions();\n\t\t});\n\n\t\t// Wire room join/leave events to presence extensions\n\t\tserver.on(\"client_joined_room\", async ({ clientId, roomId }) => {\n\t\t\tconst userId = server.getUserIdFromClientId(clientId);\n\t\t\tif (userId && presenceManager.isEnabled()) {\n\t\t\t\t// Call onRoomJoined for all extensions\n\t\t\t\tconst extensions = (presenceManager as any).extensions;\n\t\t\t\tif (extensions) {\n\t\t\t\t\tfor (const ext of extensions) {\n\t\t\t\t\t\tawait ext.onRoomJoined?.(userId, roomId, clientId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tserver.on(\"client_left_room\", async ({ clientId, roomId }) => {\n\t\t\tconst userId = server.getUserIdFromClientId(clientId);\n\t\t\tif (userId && presenceManager.isEnabled()) {\n\t\t\t\t// Call onRoomLeft for all extensions\n\t\t\t\tconst extensions = (presenceManager as any).extensions;\n\t\t\t\tif (extensions) {\n\t\t\t\t\tfor (const ext of extensions) {\n\t\t\t\t\t\tawait ext.onRoomLeft?.(userId, roomId, clientId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Destroy extensions when server stops\n\t\tserver.on(\"stopped\", async () => {\n\t\t\tawait presenceManager.destroyExtensions();\n\t\t});\n\t}\n}\n"
39
43
  ],
40
- "mappings": "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",
41
- "debugId": "7440D2EF100457BA64756E2164756E21",
44
+ "mappings": "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",
45
+ "debugId": "DF2836EA38C8D2CE64756E2164756E21",
42
46
  "names": []
43
47
  }