@granular-software/sdk 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -14
- package/dist/adapters/anthropic.d.mts +1 -1
- package/dist/adapters/anthropic.d.ts +1 -1
- package/dist/adapters/langchain.d.mts +1 -1
- package/dist/adapters/langchain.d.ts +1 -1
- package/dist/adapters/mastra.d.mts +1 -1
- package/dist/adapters/mastra.d.ts +1 -1
- package/dist/adapters/openai.d.mts +1 -1
- package/dist/adapters/openai.d.ts +1 -1
- package/dist/cli/index.js +123 -39
- package/dist/index.d.mts +51 -162
- package/dist/index.d.ts +51 -162
- package/dist/index.js +304 -264
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +304 -264
- package/dist/index.mjs.map +1 -1
- package/dist/{types-BOPsFZYi.d.mts → types-C0AVRsVR.d.mts} +85 -31
- package/dist/{types-BOPsFZYi.d.ts → types-C0AVRsVR.d.ts} +85 -31
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/constants.js","../../../node_modules/.bun/node-gyp-build@4.8.4/node_modules/node-gyp-build/node-gyp-build.js","../../../node_modules/.bun/node-gyp-build@4.8.4/node_modules/node-gyp-build/index.js","../../../node_modules/.bun/bufferutil@4.0.9/node_modules/bufferutil/fallback.js","../../../node_modules/.bun/bufferutil@4.0.9/node_modules/bufferutil/index.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/buffer-util.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/limiter.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/permessage-deflate.js","../../../node_modules/.bun/utf-8-validate@6.0.5/node_modules/utf-8-validate/fallback.js","../../../node_modules/.bun/utf-8-validate@6.0.5/node_modules/utf-8-validate/index.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/validation.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/receiver.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/sender.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/event-target.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/extension.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/websocket.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/stream.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/subprotocol.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/websocket-server.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/wrapper.mjs","../src/ws-client.ts","../src/session.ts","../src/endpoints.ts","../src/client.ts"],"names":["load","dir","platform","arch","runtime","abi","require_node_gyp_build","mask","data","require_fallback","Receiver","Sender","URL","WebSocket","key","createWebSocketStream","err","protocol","WebSocketServer","Automerge","docs"],"mappings":"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AAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,C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","file":"index.js","sourcesContent":["'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","var fs = require('fs')\nvar path = require('path')\nvar os = require('os')\n\n// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression'\nvar runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\n\nvar vars = (process.config && process.config.variables) || {}\nvar prebuildsOnly = !!process.env.PREBUILDS_ONLY\nvar abi = process.versions.modules // TODO: support old node where this is undef\nvar runtime = isElectron() ? 'electron' : (isNwjs() ? 'node-webkit' : 'node')\n\nvar arch = process.env.npm_config_arch || os.arch()\nvar platform = process.env.npm_config_platform || os.platform()\nvar libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc')\nvar armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || ''\nvar uv = (process.versions.uv || '').split('.')[0]\n\nmodule.exports = load\n\nfunction load (dir) {\n return runtimeRequire(load.resolve(dir))\n}\n\nload.resolve = load.path = function (dir) {\n dir = path.resolve(dir || '.')\n\n try {\n var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_')\n if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD']\n } catch (err) {}\n\n if (!prebuildsOnly) {\n var release = getFirst(path.join(dir, 'build/Release'), matchBuild)\n if (release) return release\n\n var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild)\n if (debug) return debug\n }\n\n var prebuild = resolve(dir)\n if (prebuild) return prebuild\n\n var nearby = resolve(path.dirname(process.execPath))\n if (nearby) return nearby\n\n var target = [\n 'platform=' + platform,\n 'arch=' + arch,\n 'runtime=' + runtime,\n 'abi=' + abi,\n 'uv=' + uv,\n armv ? 'armv=' + armv : '',\n 'libc=' + libc,\n 'node=' + process.versions.node,\n process.versions.electron ? 'electron=' + process.versions.electron : '',\n typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line\n ].filter(Boolean).join(' ')\n\n throw new Error('No native build was found for ' + target + '\\n loaded from: ' + dir + '\\n')\n\n function resolve (dir) {\n // Find matching \"prebuilds/<platform>-<arch>\" directory\n var tuples = readdirSync(path.join(dir, 'prebuilds')).map(parseTuple)\n var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0]\n if (!tuple) return\n\n // Find most specific flavor first\n var prebuilds = path.join(dir, 'prebuilds', tuple.name)\n var parsed = readdirSync(prebuilds).map(parseTags)\n var candidates = parsed.filter(matchTags(runtime, abi))\n var winner = candidates.sort(compareTags(runtime))[0]\n if (winner) return path.join(prebuilds, winner.file)\n }\n}\n\nfunction readdirSync (dir) {\n try {\n return fs.readdirSync(dir)\n } catch (err) {\n return []\n }\n}\n\nfunction getFirst (dir, filter) {\n var files = readdirSync(dir).filter(filter)\n return files[0] && path.join(dir, files[0])\n}\n\nfunction matchBuild (name) {\n return /\\.node$/.test(name)\n}\n\nfunction parseTuple (name) {\n // Example: darwin-x64+arm64\n var arr = name.split('-')\n if (arr.length !== 2) return\n\n var platform = arr[0]\n var architectures = arr[1].split('+')\n\n if (!platform) return\n if (!architectures.length) return\n if (!architectures.every(Boolean)) return\n\n return { name, platform, architectures }\n}\n\nfunction matchTuple (platform, arch) {\n return function (tuple) {\n if (tuple == null) return false\n if (tuple.platform !== platform) return false\n return tuple.architectures.includes(arch)\n }\n}\n\nfunction compareTuples (a, b) {\n // Prefer single-arch prebuilds over multi-arch\n return a.architectures.length - b.architectures.length\n}\n\nfunction parseTags (file) {\n var arr = file.split('.')\n var extension = arr.pop()\n var tags = { file: file, specificity: 0 }\n\n if (extension !== 'node') return\n\n for (var i = 0; i < arr.length; i++) {\n var tag = arr[i]\n\n if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') {\n tags.runtime = tag\n } else if (tag === 'napi') {\n tags.napi = true\n } else if (tag.slice(0, 3) === 'abi') {\n tags.abi = tag.slice(3)\n } else if (tag.slice(0, 2) === 'uv') {\n tags.uv = tag.slice(2)\n } else if (tag.slice(0, 4) === 'armv') {\n tags.armv = tag.slice(4)\n } else if (tag === 'glibc' || tag === 'musl') {\n tags.libc = tag\n } else {\n continue\n }\n\n tags.specificity++\n }\n\n return tags\n}\n\nfunction matchTags (runtime, abi) {\n return function (tags) {\n if (tags == null) return false\n if (tags.runtime && tags.runtime !== runtime && !runtimeAgnostic(tags)) return false\n if (tags.abi && tags.abi !== abi && !tags.napi) return false\n if (tags.uv && tags.uv !== uv) return false\n if (tags.armv && tags.armv !== armv) return false\n if (tags.libc && tags.libc !== libc) return false\n\n return true\n }\n}\n\nfunction runtimeAgnostic (tags) {\n return tags.runtime === 'node' && tags.napi\n}\n\nfunction compareTags (runtime) {\n // Precedence: non-agnostic runtime, abi over napi, then by specificity.\n return function (a, b) {\n if (a.runtime !== b.runtime) {\n return a.runtime === runtime ? -1 : 1\n } else if (a.abi !== b.abi) {\n return a.abi ? -1 : 1\n } else if (a.specificity !== b.specificity) {\n return a.specificity > b.specificity ? -1 : 1\n } else {\n return 0\n }\n }\n}\n\nfunction isNwjs () {\n return !!(process.versions && process.versions.nw)\n}\n\nfunction isElectron () {\n if (process.versions && process.versions.electron) return true\n if (process.env.ELECTRON_RUN_AS_NODE) return true\n return typeof window !== 'undefined' && window.process && window.process.type === 'renderer'\n}\n\nfunction isAlpine (platform) {\n return platform === 'linux' && fs.existsSync('/etc/alpine-release')\n}\n\n// Exposed for unit tests\n// TODO: move to lib\nload.parseTags = parseTags\nload.matchTags = matchTags\nload.compareTags = compareTags\nload.parseTuple = parseTuple\nload.matchTuple = matchTuple\nload.compareTuples = compareTuples\n","const runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\nif (typeof runtimeRequire.addon === 'function') { // if the platform supports native resolving prefer that\n module.exports = runtimeRequire.addon.bind(runtimeRequire)\n} else { // else use the runtime version here\n module.exports = require('./node-gyp-build.js')\n}\n","'use strict';\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 */\nconst mask = (source, mask, output, offset, length) => {\n for (var 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 */\nconst unmask = (buffer, mask) => {\n // Required until https://github.com/nodejs/node/issues/9006 is resolved.\n const length = buffer.length;\n for (var i = 0; i < length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n};\n\nmodule.exports = { mask, unmask };\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'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","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n * @param {Boolean} [isServer=false] Create the instance in either server or\n * client mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(options, isServer, maxPayload) {\n this._maxPayload = maxPayload | 0;\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._isServer = !!isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0x00) { // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) { // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) { // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80 || // overlong\n buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0 // surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80 || // overlong\n buf[i] === 0xf4 && buf[i + 1] > 0x8f || buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = isValidUTF8;\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\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 {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\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 === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst closeTimeout = 30 * 1000;\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\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 {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * 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 {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch (e) {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate(\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n false,\n opts.maxPayload\n );\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n let chunk;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written and `readable.read()`\n // will return `null`. If instead, the socket is paused, any possible buffered\n // data will be read as a single chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n (chunk = websocket._socket.read()) !== null\n ) {\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* 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","'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","/* 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","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","import * as Automerge from '@automerge/automerge';\nimport type {\n WSClientOptions,\n WSDisconnectInfo,\n WSReconnectErrorInfo,\n RPCRequest,\n RPCResponse,\n SyncMessage,\n RPCRequestFromServer\n} from './types';\n\n// Use global WebSocket if available (Browser, Bun, Deno)\nlet GlobalWebSocket: any = undefined;\nif (typeof globalThis !== 'undefined' && (globalThis as any).WebSocket) {\n GlobalWebSocket = (globalThis as any).WebSocket;\n}\n\n// WebSocket.OPEN is always 1\nconst READY_STATE_OPEN = 1;\nconst TOKEN_REFRESH_LEEWAY_MS = 2 * 60 * 1000;\nconst TOKEN_REFRESH_RETRY_MS = 30 * 1000;\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\n\nexport class WSClient {\n private ws: WebSocket | null = null;\n private url: string;\n private sessionId: string;\n private token: string;\n private messageQueue: Array<{ resolve: (value: unknown) => void; reject: (error: Error) => void; id: string }> = [];\n private syncHandlers: Array<(message: SyncMessage) => void> = [];\n private rpcHandlers: Map<string, (params: unknown) => Promise<unknown>> = new Map();\n private eventHandlers: Map<string, Array<(params: unknown) => void>> = new Map();\n private nextRpcId = 1;\n public doc: Automerge.Doc<Record<string, unknown>> = Automerge.init();\n private syncState: Automerge.SyncState = Automerge.initSyncState();\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private tokenRefreshTimer: ReturnType<typeof setTimeout> | null = null;\n private isExplicitlyDisconnected = false;\n\n private options: WSClientOptions;\n\n constructor(options: WSClientOptions) {\n this.options = options;\n this.url = options.url;\n this.sessionId = options.sessionId;\n this.token = options.token;\n }\n\n private clearTokenRefreshTimer(): void {\n if (this.tokenRefreshTimer) {\n clearTimeout(this.tokenRefreshTimer);\n this.tokenRefreshTimer = null;\n }\n }\n\n private decodeBase64Url(payload: string): string {\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4 || 4)) % 4);\n if (typeof atob === 'function') {\n return atob(padded);\n }\n\n const maybeBuffer = (globalThis as unknown as { Buffer?: { from: (data: string, encoding: string) => { toString: (encoding: string) => string } } }).Buffer;\n if (maybeBuffer) {\n return maybeBuffer.from(padded, 'base64').toString('utf8');\n }\n\n throw new Error('No base64 decoder available');\n }\n\n private getTokenExpiryMs(token: string): number | null {\n const parts = token.split('.');\n if (parts.length < 2) {\n return null;\n }\n\n try {\n const payloadRaw = this.decodeBase64Url(parts[1]);\n const payload = JSON.parse(payloadRaw) as { exp?: number };\n if (typeof payload.exp !== 'number' || !Number.isFinite(payload.exp)) {\n return null;\n }\n return payload.exp * 1000;\n } catch {\n return null;\n }\n }\n\n private scheduleTokenRefresh(): void {\n this.clearTokenRefreshTimer();\n if (!this.options.tokenProvider || this.isExplicitlyDisconnected) {\n return;\n }\n\n const expiresAt = this.getTokenExpiryMs(this.token);\n if (!expiresAt) {\n return;\n }\n\n const refreshInMs = Math.max(1_000, expiresAt - Date.now() - TOKEN_REFRESH_LEEWAY_MS);\n const delay = Math.min(refreshInMs, MAX_TIMER_DELAY_MS);\n this.tokenRefreshTimer = setTimeout(() => {\n void this.refreshTokenInBackground();\n }, delay);\n }\n\n private async refreshTokenInBackground(): Promise<void> {\n if (!this.options.tokenProvider || this.isExplicitlyDisconnected) {\n return;\n }\n\n try {\n const refreshedToken = await this.options.tokenProvider();\n if (typeof refreshedToken !== 'string' || refreshedToken.length === 0) {\n throw new Error('Token provider returned no token');\n }\n this.token = refreshedToken;\n this.scheduleTokenRefresh();\n } catch (error) {\n if (this.isExplicitlyDisconnected) {\n return;\n }\n console.warn('[Granular] Token refresh failed, retrying soon:', error);\n this.clearTokenRefreshTimer();\n this.tokenRefreshTimer = setTimeout(() => {\n void this.refreshTokenInBackground();\n }, TOKEN_REFRESH_RETRY_MS);\n }\n }\n\n private async resolveTokenForConnect(): Promise<string> {\n if (!this.options.tokenProvider) {\n return this.token;\n }\n\n const expiresAt = this.getTokenExpiryMs(this.token);\n const shouldRefresh = expiresAt !== null && expiresAt - Date.now() <= TOKEN_REFRESH_LEEWAY_MS;\n if (!shouldRefresh) {\n return this.token;\n }\n\n try {\n const refreshedToken = await this.options.tokenProvider();\n if (typeof refreshedToken !== 'string' || refreshedToken.length === 0) {\n throw new Error('Token provider returned no token');\n }\n this.token = refreshedToken;\n return refreshedToken;\n } catch (error) {\n if (expiresAt > Date.now()) {\n console.warn('[Granular] Token refresh failed, using current token:', error);\n return this.token;\n }\n throw error;\n }\n }\n\n /**\n * Connect to the WebSocket server\n * @returns {Promise<void>} Resolves when connection is open\n */\n async connect(): Promise<void> {\n const token = await this.resolveTokenForConnect();\n this.isExplicitlyDisconnected = false;\n this.scheduleTokenRefresh();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n // Determine WebSocket implementation\n let WebSocketClass = this.options.WebSocketCtor || GlobalWebSocket;\n\n if (!WebSocketClass) {\n try {\n // Try to load 'ws' dynamically for Node.js environments\n // @ts-ignore\n const wsModule = await import('ws');\n WebSocketClass = wsModule.default || wsModule;\n } catch (e) {\n // Ignore, handled below\n }\n }\n\n if (!WebSocketClass) {\n throw new Error('No WebSocket implementation found. If using Node.js, please install \"ws\" and pass the constructor to the SDK options: { WebSocketCtor: WebSocket }.');\n }\n\n return new Promise((resolve, reject) => {\n try {\n // Construct URL with query parameters\n const wsUrl = new URL(this.url);\n wsUrl.searchParams.set('sessionId', this.sessionId);\n wsUrl.searchParams.set('token', token);\n\n // @ts-ignore - Dynamic class usage\n this.ws = new WebSocketClass(wsUrl.toString()) as WebSocket;\n\n if (!this.ws) throw new Error('Failed to create WebSocket');\n\n // Standardize event handlers\n const socket = this.ws as any;\n if (typeof socket.on === 'function') {\n // Node 'ws' style\n socket.on('open', () => {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emit('open', {});\n resolve();\n });\n socket.on('message', (data: any) => {\n try {\n const message = JSON.parse(data.toString());\n this.handleMessage(message);\n } catch (error) {\n console.error('[Granular] Failed to parse message:', error);\n }\n });\n socket.on('error', (error: any) => {\n this.emit('error', error);\n if (socket.readyState !== READY_STATE_OPEN) {\n reject(error);\n }\n });\n socket.on('close', (code: number, reason: unknown) => {\n this.handleDisconnect({\n code,\n reason: this.normalizeReason(reason),\n // ws does not provide wasClean on Node-style close callback\n wasClean: code === 1000,\n });\n });\n } else {\n // Browser WebSocket style\n this.ws!.onopen = () => {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emit('open', {});\n resolve();\n };\n\n this.ws!.onmessage = (event: MessageEvent) => {\n try {\n const data = event.data;\n const message = JSON.parse(data.toString());\n this.handleMessage(message);\n } catch (error) {\n console.error('[Granular] Failed to parse message:', error);\n }\n };\n\n this.ws!.onerror = (event: Event) => {\n const error = new Error('WebSocket error');\n (error as any).event = event;\n this.emit('error', error);\n if (this.ws?.readyState !== READY_STATE_OPEN) {\n reject(error);\n }\n };\n\n this.ws!.onclose = (event: CloseEvent) => {\n this.handleDisconnect({\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean,\n });\n };\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private normalizeReason(reason: unknown): string | undefined {\n if (reason === null || reason === undefined) return undefined;\n if (typeof reason === 'string') return reason;\n if (typeof reason === 'object' && reason && 'toString' in reason) {\n try {\n const text = String((reason as any).toString());\n return text || undefined;\n } catch {\n return undefined;\n }\n }\n return undefined;\n }\n\n private rejectPending(error: Error): void {\n this.messageQueue.forEach((pending) => pending.reject(error));\n this.messageQueue = [];\n }\n\n private buildDisconnectError(info: WSDisconnectInfo): Error {\n const details = [\n info.code !== undefined ? `code=${info.code}` : undefined,\n info.reason ? `reason=${info.reason}` : undefined,\n ].filter(Boolean).join(', ');\n const suffix = details ? ` (${details})` : '';\n return new Error(`WebSocket disconnected${suffix}`);\n }\n\n private handleDisconnect(close: {\n code?: number;\n reason?: string;\n wasClean?: boolean;\n } = {}): void {\n const reconnectDelayMs = 3000;\n const unexpected = !this.isExplicitlyDisconnected;\n const info: WSDisconnectInfo = {\n code: close.code,\n reason: close.reason,\n wasClean: close.wasClean,\n unexpected,\n timestamp: Date.now(),\n reconnectScheduled: false,\n };\n\n this.ws = null;\n this.emit('close', info);\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (unexpected) {\n const disconnectError = this.buildDisconnectError(info);\n this.rejectPending(disconnectError);\n this.emit('disconnect', info);\n\n info.reconnectScheduled = true;\n info.reconnectDelayMs = reconnectDelayMs;\n\n if (this.options.onUnexpectedClose) {\n try {\n this.options.onUnexpectedClose(info);\n } catch (callbackError) {\n console.error('[Granular] onUnexpectedClose callback failed:', callbackError);\n }\n }\n\n this.reconnectTimer = setTimeout(() => {\n console.log('[Granular] Attempting reconnect...');\n this.connect().catch(error => {\n console.error('[Granular] Reconnect failed:', error);\n const reconnectInfo: WSReconnectErrorInfo = {\n error: error instanceof Error ? error.message : String(error),\n sessionId: this.sessionId,\n timestamp: Date.now(),\n };\n this.emit('reconnect_error', reconnectInfo);\n if (this.options.onReconnectError) {\n try {\n this.options.onReconnectError(reconnectInfo);\n } catch (callbackError) {\n console.error('[Granular] onReconnectError callback failed:', callbackError);\n }\n }\n });\n }, reconnectDelayMs);\n }\n }\n\n private handleMessage(message: unknown): void {\n if (typeof message !== 'object' || message === null) return;\n\n // Debug: Log all incoming messages\n console.log('[Granular DEBUG] Received message:', JSON.stringify(message).slice(0, 500));\n\n // 1. Handle Sync Messages (Automerge)\n if ('type' in message && message.type === 'sync') {\n const syncMessage = message as SyncMessage;\n let bytes: Uint8Array;\n\n try {\n const payload = syncMessage.message || syncMessage.data;\n\n if (typeof payload === 'string') {\n const binaryString = atob(payload);\n const len = binaryString.length;\n bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n } else if (Array.isArray(payload)) {\n bytes = new Uint8Array(payload);\n } else if (payload instanceof Uint8Array) {\n bytes = payload;\n } else {\n return;\n }\n\n console.log('[Granular DEBUG] Applying sync bytes:', bytes.length);\n\n const [newDoc, newSyncState] = Automerge.receiveSyncMessage(\n this.doc,\n this.syncState,\n bytes\n );\n this.doc = newDoc;\n this.syncState = newSyncState;\n\n // DEBUG: Inspect doc after sync\n const docAny = this.doc as any;\n if (docAny.catalog) {\n console.log('[Granular DEBUG] Doc catalog sync applied. Keys in catalog:', Object.keys(docAny.catalog || {}));\n console.log('[Granular DEBUG] RawToolCatalogs:', Object.keys(docAny.catalog.rawToolCatalogs || {}));\n } else {\n console.log('[Granular DEBUG] Doc synced but no catalog yet. Keys in doc:', Object.keys(docAny));\n }\n\n // Notify sync listeners with the new doc\n this.emit('sync', this.doc);\n } catch (e) {\n // Determine if this is a sync protocol error (e.g. wrong format) -> try applyChanges\n // The server broadcasts raw changes using getLastLocalChange, which receiveSyncMessage rejects.\n try {\n console.log('[Granular DEBUG] receiveSyncMessage failed, trying applyChanges...');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [newDoc] = Automerge.applyChanges(this.doc, [bytes!]);\n this.doc = newDoc;\n this.emit('sync', this.doc);\n console.log('[Granular DEBUG] applyChanges succeeded. Doc:', JSON.stringify(Automerge.toJS(this.doc)));\n } catch (applyError) {\n console.warn('[Granular] Failed to apply sync message (both sync & applyChanges)', e, applyError);\n }\n }\n return;\n }\n\n // 1. Handling Automerge Snapshots (Full State)\n if ('type' in message && message.type === 'snapshot') {\n const snapshotMessage = message as { type: string; data: number[] };\n try {\n const bytes = new Uint8Array(snapshotMessage.data);\n console.log('[Granular DEBUG] Loading Automerge session snapshot bytes:', bytes.length);\n this.doc = Automerge.load(bytes);\n this.emit('sync', this.doc);\n console.log('[Granular DEBUG] Automerge session snapshot loaded. Doc:', JSON.stringify(Automerge.toJS(this.doc)));\n } catch (e) {\n console.warn('[Granular] Failed to load snapshot message', e);\n }\n return;\n }\n\n // 1.5 Handle Automerge Changes (Raw)\n if ('type' in message && message.type === 'change') {\n const changeMessage = message as { type: string; data: number[] };\n try {\n const bytes = new Uint8Array(changeMessage.data);\n // console.log('[Granular DEBUG] Applying change bytes:', bytes.length);\n const [newDoc] = Automerge.applyChanges(this.doc, [bytes]);\n this.doc = newDoc;\n this.emit('sync', this.doc);\n // console.log('[Granular DEBUG] Valid change applied. Doc keys:', Object.keys(Automerge.toJS(this.doc)));\n } catch (e) {\n console.warn('[Granular] Failed to apply change message', e);\n }\n return;\n }\n\n // 2. Handle RPC Responses (Results/Errors from calls we made)\n if ('type' in message && (message.type === 'rpc_result' || message.type === 'rpc_error')) {\n const response = message as RPCResponse;\n const pending = this.messageQueue.find((q) => q.id === response.id);\n if (pending) {\n if (response.type === 'rpc_error') {\n pending.reject(\n new Error(`RPC error: ${response.error?.message || 'Unknown error'}`)\n );\n } else {\n pending.resolve(response.result);\n }\n this.messageQueue = this.messageQueue.filter((q) => q.id !== response.id);\n }\n return;\n }\n\n // 3. Handle Incoming RPC Requests (Server calls us, e.g. tool.invoke)\n if ('type' in message && message.type === 'rpc' && 'method' in message && 'id' in message) {\n const request = message as RPCRequestFromServer;\n this.handleIncomingRpc(request).catch((error) => {\n console.error('[Granular] Error handling incoming RPC:', error);\n });\n return;\n }\n\n // 4. Handle Generic Events\n if ('type' in message && typeof message.type === 'string') {\n this.emit(message.type, message);\n }\n }\n\n /**\n * Make an RPC call to the server\n * @param {string} method - RPC method name\n * @param {unknown} params - Request parameters\n * @returns {Promise<unknown>} Response result\n * @throws {Error} If connection is closed or timeout occurs\n */\n async call(method: string, params: unknown): Promise<unknown> {\n if (!this.ws || this.ws.readyState !== READY_STATE_OPEN) {\n throw new Error('WebSocket not connected');\n }\n\n const id = `rpc-${this.nextRpcId++}`;\n const request: RPCRequest = {\n type: 'rpc',\n method,\n params,\n id,\n };\n\n return new Promise((resolve, reject) => {\n this.messageQueue.push({ resolve, reject, id });\n\n this.ws!.send(JSON.stringify(request));\n\n // Timeout after 30 seconds\n setTimeout(() => {\n const pending = this.messageQueue.find((q) => q.id === id);\n if (pending) {\n this.messageQueue = this.messageQueue.filter((q) => q.id !== id);\n reject(new Error(`RPC timeout: ${method}`));\n }\n }, 30000);\n });\n }\n\n private async handleIncomingRpc(request: RPCRequestFromServer): Promise<void> {\n const handler = this.rpcHandlers.get(request.method);\n\n if (!handler) {\n const errorResponse = {\n type: 'rpc_error',\n id: request.id,\n error: {\n code: -32601,\n message: `Method not found: ${request.method}`,\n },\n };\n this.ws?.send(JSON.stringify(errorResponse));\n return;\n }\n\n try {\n const result = await handler(request.params);\n\n // Special case: tool.invoke handlers usually respond via tool.result RPC method manually\n // to support streaming or async flows where the response isn't immediate return value.\n // But if they DO return a value, we can treat it as the result.\n // For now, mirroring existing behavior: tool.invoke handlers are responsible for\n // calling tool.result if they want to.\n\n // If NOT tool.invoke, send standard RPC response\n if (request.method !== 'tool.invoke') {\n const successResponse = {\n type: 'rpc_result',\n id: request.id,\n result,\n };\n this.ws?.send(JSON.stringify(successResponse));\n }\n } catch (error) {\n const errorResponse = {\n type: 'rpc_error',\n id: request.id,\n error: {\n code: -32000,\n message: error instanceof Error ? error.message : 'Unknown error',\n },\n };\n this.ws?.send(JSON.stringify(errorResponse));\n }\n }\n\n /**\n * Subscribe to client events\n * @param {string} event - Event name\n * @param {Function} handler - Event handler\n */\n on(event: string, handler: (params: unknown) => void): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, []);\n }\n this.eventHandlers.get(event)!.push(handler);\n }\n\n /**\n * Register an RPC handler for incoming server requests\n * @param {string} method - RPC method name\n * @param {Function} handler - Handler function\n */\n registerRpcHandler(method: string, handler: (params: unknown) => Promise<unknown>): void {\n this.rpcHandlers.set(method, handler);\n }\n\n /**\n * Unsubscribe from client events\n * @param {string} event - Event name\n * @param {Function} handler - Handler to remove\n */\n off(event: string, handler: (params: unknown) => void): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n this.eventHandlers.set(\n event,\n handlers.filter((h) => h !== handler)\n );\n }\n }\n\n /**\n * Emit an event locally\n * @param {string} event - Event name\n * @param params - Event data\n */\n emit(event: string, params: unknown): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach(handler => handler(params));\n }\n }\n\n /**\n * Disconnect the WebSocket and clear state\n */\n disconnect(): void {\n this.isExplicitlyDisconnected = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.clearTokenRefreshTimer();\n\n if (this.ws) {\n this.ws.close(1000, 'Client disconnect');\n this.ws = null;\n }\n this.rejectPending(new Error('Client explicitly disconnected'));\n this.rpcHandlers.clear();\n this.emit('disconnect', {});\n }\n}\n","import { WSClient } from './ws-client';\nimport type {\n Job,\n JobStatus,\n Prompt,\n ToolWithHandler,\n ToolSchema,\n PublishToolsResult,\n ToolHandler,\n InstanceToolHandler,\n ToolInvokeParams,\n DomainState,\n JobSubmitResult,\n ToolInfo,\n ToolsChangedEvent\n} from './types';\nimport type { Doc } from '@automerge/automerge/slim';\n\n// Re-export types that were previously defined here\nexport { ToolWithHandler, ToolSchema, PublishToolsResult, ToolHandler, InstanceToolHandler, DomainState, JobSubmitResult };\n\nexport class Session {\n protected client: WSClient;\n private clientId: string;\n private jobsMap: Map<string, JobImplementation> = new Map();\n private eventListeners: Map<string, Array<(data: unknown) => void>> = new Map();\n private toolHandlers: Map<string, ToolHandler | InstanceToolHandler> = new Map();\n /** Tracks which tools are instance methods (className set, not static) */\n private instanceTools: Set<string> = new Set();\n private currentDomainRevision: string | null = null;\n /** Local effect registry: name → full ToolWithHandler */\n private effects: Map<string, ToolWithHandler> = new Map();\n /** Last known tools for diffing */\n private lastKnownTools: Map<string, ToolInfo> = new Map();\n\n constructor(client: WSClient, clientId?: string) {\n this.client = client;\n this.clientId = clientId || `client_${Date.now()}`;\n this.setupEventHandlers();\n this.setupToolInvokeHandler();\n }\n\n // --- Public API ---\n\n get document(): Doc<Record<string, unknown>> {\n return this.client.doc;\n }\n\n get domainRevision(): string | null {\n return this.currentDomainRevision;\n }\n\n /**\n * Make a raw RPC call to the session's Durable Object.\n *\n * Use this when you need to call an RPC method that doesn't have a\n * dedicated wrapper method on the Session/Environment class.\n *\n * @param method - RPC method name (e.g. 'domain.fetchPackagePart')\n * @param params - Request parameters\n * @returns The raw RPC response\n *\n * @example\n * ```typescript\n * const result = await env.rpc('domain.fetchPackagePart', {\n * moduleSpecifier: '@sandbox/domain',\n * part: 'types',\n * });\n * ```\n */\n async rpc<T = unknown>(method: string, params: Record<string, unknown> = {}): Promise<T> {\n return this.client.call(method, params) as Promise<T>;\n }\n\n /**\n * Send client hello to establish the session\n */\n async hello(): Promise<{\n ok: boolean;\n environmentId?: string;\n docId?: string;\n graphContainerStatus?: { lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' };\n }> {\n const result = await this.client.call('client.hello', {\n clientId: this.clientId,\n protocolVersion: '2.0',\n });\n return result as {\n ok: boolean;\n environmentId?: string;\n docId?: string;\n graphContainerStatus?: { lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' };\n };\n }\n\n /**\n * Publish tools to the sandbox and register handlers for reverse-RPC.\n *\n * Tools can be:\n * - **Instance methods**: set `className` (handler receives `(objectId, params)`)\n * - **Static methods**: set `className` + `static: true` (handler receives `(params)`)\n * - **Global tools**: omit `className` (handler receives `(params)`)\n *\n * Both `inputSchema` and `outputSchema` accept JSON Schema objects. The\n * `outputSchema` drives the return type in the auto-generated TypeScript\n * class declarations that sandbox code imports from `./sandbox-tools`.\n *\n * This method:\n * 1. Extracts tool schemas (including `outputSchema`) from the provided tools\n * 2. Publishes them via `client.publishRawToolCatalog` RPC\n * 3. Registers handlers locally for `tool.invoke` RPC calls\n * 4. Returns the `domainRevision` needed for job submission\n *\n * @param tools - Array of tools with handlers\n * @param revision - Optional revision string (default: \"1.0.0\")\n * @returns PublishToolsResult with domainRevision\n *\n * @example\n * ```typescript\n * await env.publishTools([\n * {\n * name: 'get_bio',\n * description: 'Get biography of an author',\n * className: 'author',\n * inputSchema: { type: 'object', properties: { detailed: { type: 'boolean' } } },\n * outputSchema: { type: 'object', properties: { bio: { type: 'string' } }, required: ['bio'] },\n * handler: async (id, params) => ({ bio: `Bio of ${id}` }),\n * },\n * ]);\n * ```\n */\n async publishTools(tools: ToolWithHandler[], revision = '1.0.0'): Promise<PublishToolsResult> {\n // 1. Extract schemas (strip handlers)\n const schemas: ToolSchema[] = tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n stability: tool.stability || 'stable',\n provenance: tool.provenance || { source: 'mcp' },\n tags: tool.tags,\n className: tool.className,\n static: tool.static,\n }));\n\n // 2. Publish to server\n const result = await this.client.call('client.publishRawToolCatalog', {\n clientId: this.clientId,\n revision,\n tools: schemas,\n }) as { accepted?: boolean; domainRevision?: string; rejected?: Array<{ name: string; reason: string }> };\n\n if (!result.accepted || !result.domainRevision) {\n throw new Error(`Failed to publish tools: ${JSON.stringify(result.rejected)}`);\n }\n\n // 3. Register handlers for reverse-RPC\n for (const tool of tools) {\n this.toolHandlers.set(tool.name, tool.handler);\n // Track instance methods: className set and not explicitly static\n if (tool.className && !tool.static) {\n this.instanceTools.add(tool.name);\n } else {\n this.instanceTools.delete(tool.name);\n }\n }\n\n // 4. Store domain revision\n this.currentDomainRevision = result.domainRevision;\n\n return {\n accepted: result.accepted,\n domainRevision: result.domainRevision,\n rejected: result.rejected,\n };\n }\n\n /**\n * Publish a single effect (tool) to the sandbox.\n *\n * Adds the effect to the local registry and re-publishes the\n * full tool catalog to the server. If an effect with the same\n * name already exists, it is replaced.\n *\n * @param effect - The effect (tool) to publish\n * @returns PublishToolsResult with domainRevision\n *\n * @example\n * ```typescript\n * await env.publishEffect({\n * name: 'get_bio',\n * description: 'Get biography of an author',\n * className: 'author',\n * inputSchema: { type: 'object', properties: { detailed: { type: 'boolean' } } },\n * handler: async (id, params) => ({ bio: `Bio of ${id}` }),\n * });\n * ```\n */\n async publishEffect(effect: ToolWithHandler): Promise<PublishToolsResult> {\n this.effects.set(effect.name, effect);\n return this._syncEffects();\n }\n\n /**\n * Publish multiple effects (tools) at once.\n *\n * Adds all effects to the local registry and re-publishes the\n * full tool catalog in a single RPC call.\n *\n * @param effects - Array of effects to publish\n * @returns PublishToolsResult with domainRevision\n *\n * @example\n * ```typescript\n * await env.publishEffects([\n * { name: 'get_bio', description: '...', inputSchema: {}, handler: async (id) => ({}) },\n * { name: 'search', description: '...', inputSchema: {}, handler: async (params) => ({}) },\n * ]);\n * ```\n */\n async publishEffects(effects: ToolWithHandler[]): Promise<PublishToolsResult> {\n for (const effect of effects) {\n this.effects.set(effect.name, effect);\n }\n return this._syncEffects();\n }\n\n /**\n * Remove an effect by name and re-publish the remaining catalog.\n *\n * @param name - The name of the effect to remove\n * @returns PublishToolsResult with domainRevision\n */\n async unpublishEffect(name: string): Promise<PublishToolsResult> {\n this.effects.delete(name);\n // Also remove the local handler\n this.toolHandlers.delete(name);\n this.instanceTools.delete(name);\n return this._syncEffects();\n }\n\n /**\n * Remove all effects and publish an empty catalog.\n *\n * @returns PublishToolsResult with domainRevision\n */\n async unpublishAllEffects(): Promise<PublishToolsResult> {\n this.effects.clear();\n this.toolHandlers.clear();\n this.instanceTools.clear();\n return this._syncEffects();\n }\n\n /**\n * Internal: re-publish the full effect catalog to the server.\n * Called after any mutation to the effects Map.\n */\n private async _syncEffects(): Promise<PublishToolsResult> {\n const allEffects = Array.from(this.effects.values());\n return this.publishTools(allEffects);\n }\n\n /**\n * Submit a job to execute code in the sandbox.\n *\n * The code can import typed classes from `./sandbox-tools`:\n * ```typescript\n * import { Author, Book, global_search } from './sandbox-tools';\n *\n * const tolkien = await Author.find({ id: 'tolkien' });\n * const bio = await tolkien.get_bio({ detailed: true });\n * const books = await tolkien.get_books();\n * ```\n *\n * Tool calls (instance methods, static methods, global functions) trigger\n * `tool.invoke` RPC back to this client, where the registered handlers\n * execute locally and return the result to the sandbox.\n */\n async submitJob(code: string, domainRevision?: string): Promise<Job> {\n const revision = domainRevision\n || this.currentDomainRevision\n || (this.client.doc as any)?.domain?.active\n || undefined;\n if (!revision) {\n throw new Error('No domain revision available. Call publishTools() or ensure schema is activated.');\n }\n\n const result = await this.client.call('job.submit', {\n domainRevision: revision,\n code,\n }) as { jobId?: string };\n\n if (!result.jobId) {\n throw new Error('Failed to submit job: no jobId returned');\n }\n\n const job = new JobImplementation(result.jobId, this.client);\n this.jobsMap.set(result.jobId, job);\n return job;\n }\n\n /**\n * Register a handler for a specific tool.\n * @param isInstance - If true, handler will receive (id, params) for instance method dispatch.\n */\n registerToolHandler(name: string, handler: ToolHandler | InstanceToolHandler, isInstance = false): void {\n this.toolHandlers.set(name, handler);\n if (isInstance) {\n this.instanceTools.add(name);\n } else {\n this.instanceTools.delete(name);\n }\n }\n\n /**\n * Respond to a prompt request from the sandbox\n */\n async answerPrompt(promptId: string, answer: unknown): Promise<void> {\n await this.client.call('prompt.answer', { promptId, value: answer });\n }\n\n /**\n * Get the current list of available tools.\n * Consolidates tools from all connected clients.\n */\n getTools(): ToolInfo[] {\n const doc: any = this.client.doc;\n const toolMap = new Map<string, ToolInfo>();\n\n // 1. Seed from domain packages (always present after domain activation)\n const domainPkg = doc.domain?.packages?.domain;\n if (domainPkg?.tools && Array.isArray(domainPkg.tools)) {\n for (const tool of domainPkg.tools) {\n if (!tool?.name) continue;\n toolMap.set(tool.name, {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n className: tool.className || undefined,\n static: tool.static || false,\n ready: false,\n publishedAt: undefined,\n });\n }\n }\n\n // 2. Overlay with live catalogs (has handler readiness info)\n const catalogs = doc.catalog?.rawToolCatalogs || {};\n for (const [clientId, catalog] of Object.entries(catalogs)) {\n const cat = catalog as any;\n if (!cat.tools) continue;\n\n for (const tool of cat.tools) {\n if (!tool?.name) continue;\n const existing = toolMap.get(tool.name);\n // Skip if we already have a newer catalog entry\n if (existing?.publishedAt && cat.publishedAt && existing.publishedAt > cat.publishedAt) continue;\n\n const isLocal = clientId === this.clientId;\n const ready = isLocal\n ? (this.effects.has(tool.name) || this.toolHandlers.has(tool.name) || this.instanceTools.has(tool.name))\n : true;\n\n toolMap.set(tool.name, {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n className: tool.className || existing?.className,\n static: tool.static || existing?.static || false,\n clientId,\n ready,\n publishedAt: cat.publishedAt,\n });\n }\n }\n\n return Array.from(toolMap.values());\n }\n\n /**\n * Subscribe to tool changes (added, removed, updated).\n * @param callback - Function called with change events\n * @returns Unsubscribe function\n */\n onToolsChanged(callback: (event: ToolsChangedEvent) => void): () => void {\n const handler = (data: unknown) => callback(data as ToolsChangedEvent);\n if (!this.eventListeners.has('tools:changed')) {\n this.eventListeners.set('tools:changed', []);\n }\n this.eventListeners.get('tools:changed')!.push(handler);\n\n // Return unsubscribe function\n return () => {\n const listeners = this.eventListeners.get('tools:changed');\n if (listeners) {\n this.eventListeners.set('tools:changed', listeners.filter(h => h !== handler));\n }\n };\n }\n\n /**\n * Get the current domain state and available tools\n */\n async getDomain(): Promise<DomainState> {\n return this.client.call('domain.getSummary', {}) as Promise<DomainState>;\n }\n\n /**\n * Fetch a domain package part from the backend (no fallback).\n */\n private async fetchDomainPart(part: 'types' | 'docs'): Promise<string> {\n const result = await this.client.call('domain.fetchPackagePart', {\n moduleSpecifier: '@sandbox/domain',\n part,\n }) as { content?: string };\n return result?.content ?? '';\n }\n\n /**\n * Get TypeScript class declarations for the current domain (for LLM/code gen).\n */\n async getDomainTypes(): Promise<string> {\n return this.fetchDomainPart('types');\n }\n\n /**\n * Get Markdown documentation for the current domain (human-readable).\n */\n async getDomainDocs(): Promise<string> {\n return this.fetchDomainPart('docs');\n }\n\n /**\n * Get domain documentation for LLMs. Returns types (preferred) or fallback.\n */\n async getDomainDocumentation(): Promise<string> {\n const types = await this.getDomainTypes();\n if (types && (types.includes('export declare class') || types.includes('export async function'))) {\n return types;\n }\n const summary = await this.getDomain();\n return this.generateFallbackDocs(summary);\n }\n\n /**\n * Generate markdown documentation from the domain summary.\n * Class-aware: groups tools by class with property/relationship info.\n */\n private generateFallbackDocs(summary: DomainState): string {\n const classes = (summary as any).classes as Record<string, any> | undefined;\n const globalTools = (summary as any).globalTools as any[] | undefined;\n const tools = summary.tools || [];\n\n // If we have class data, produce class-aware docs\n if (classes && Object.keys(classes).length > 0) {\n let docs = '# Domain Documentation\\n\\n';\n docs += 'Import classes and tools from `./sandbox-tools`:\\n\\n';\n\n const classNames = Object.keys(classes).map(\n (c) => c.charAt(0).toUpperCase() + c.slice(1),\n );\n const globalNames = (globalTools || []).map((t: any) => t.name);\n const allImports = [...classNames, ...globalNames].join(', ');\n docs += `\\`\\`\\`typescript\\nimport { ${allImports} } from \"./sandbox-tools\";\\n\\`\\`\\`\\n\\n`;\n\n for (const [className, cls] of Object.entries(classes)) {\n const TsName = className.charAt(0).toUpperCase() + className.slice(1);\n docs += `## ${TsName}\\n\\n`;\n if (cls.description) docs += `${cls.description}\\n\\n`;\n\n if (cls.properties?.length > 0) {\n docs += '**Properties:**\\n';\n for (const p of cls.properties) {\n docs += `- \\`${p.name}\\`${p.description ? ': ' + p.description : ''}\\n`;\n }\n docs += '\\n';\n }\n\n if (cls.relationships?.length > 0) {\n docs += '**Relationships:**\\n';\n for (const r of cls.relationships) {\n const fModel = r.foreignModel?.charAt(0).toUpperCase() + r.foreignModel?.slice(1);\n docs += `- \\`${r.localSubmodel}\\` → ${fModel} (${r.kind})\\n`;\n }\n docs += '\\n';\n }\n\n if (cls.methods?.length > 0) {\n docs += '**Methods:**\\n';\n for (const m of cls.methods) {\n docs += `- \\`${TsName}.${m.name}(input)\\``;\n if (m.description) docs += `: ${m.description}`;\n docs += '\\n';\n if (m.inputSchema?.properties) {\n docs += ' ```json\\n ' + JSON.stringify(m.inputSchema, null, 2).replace(/\\n/g, '\\n ') + '\\n ```\\n';\n }\n }\n docs += '\\n';\n }\n }\n\n if (globalTools && globalTools.length > 0) {\n docs += '## Global Tools\\n\\n';\n for (const tool of globalTools) {\n docs += `### ${tool.name}\\n\\n`;\n if (tool.description) docs += `${tool.description}\\n\\n`;\n if (tool.inputSchema) {\n docs += '**Input Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.inputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n }\n }\n\n return docs;\n }\n\n // Legacy flat fallback\n if (!tools || tools.length === 0) {\n return 'No tools available in this domain.';\n }\n\n let docs = '# Available Tools\\n\\n';\n docs += 'Import tools from `./sandbox-tools` and call them with await:\\n\\n';\n docs += '```typescript\\nimport { tools } from \"./sandbox-tools\";\\n\\n';\n docs += '// Example:\\n';\n docs += `const result = await tools.${tools[0]?.name || 'example'}(input);\\n`;\n docs += '```\\n\\n';\n\n for (const tool of tools) {\n docs += `## ${tool.name}\\n\\n`;\n if (tool.description) {\n docs += `${tool.description}\\n\\n`;\n }\n if (tool.inputSchema) {\n docs += '**Input Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.inputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n if (tool.outputSchema) {\n docs += '**Output Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.outputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n }\n\n return docs;\n }\n\n /**\n * Close the session and disconnect from the sandbox\n */\n async disconnect(): Promise<void> {\n try {\n await this.client.call('client.goodbye', {\n clientId: this.clientId,\n timestamp: Date.now(),\n });\n } catch (error) {\n // Best-effort goodbye: abrupt network failures can prevent RPC.\n }\n this.client.disconnect();\n }\n\n // --- Event Handling ---\n\n /**\n * Subscribe to session events\n */\n on(event: string, handler: (data: unknown) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(handler);\n }\n\n /**\n * Unsubscribe from session events\n */\n off(event: string, handler: (data: unknown) => void): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n this.eventListeners.set(event, handlers.filter(h => h !== handler));\n }\n }\n\n // --- Internal ---\n\n private setupToolInvokeHandler(): void {\n this.client.registerRpcHandler('tool.invoke', async (params: unknown) => {\n const { callId, toolName, input } = params as ToolInvokeParams;\n\n this.emit('tool:invoke', { callId, toolName, input });\n\n const handler = this.toolHandlers.get(toolName);\n if (!handler) {\n // Send error result back\n await this.client.call('tool.result', {\n callId,\n error: { code: 'TOOL_NOT_FOUND', message: `Tool handler not found: ${toolName}` },\n });\n return;\n }\n\n try {\n let result: unknown;\n // Instance methods receive _objectId from the sandbox runtime\n if (this.instanceTools.has(toolName) && input && typeof input === 'object' && '_objectId' in input) {\n const { _objectId, ...restParams } = input as { _objectId: string;[key: string]: any };\n result = await (handler as InstanceToolHandler)(_objectId, restParams);\n } else {\n result = await (handler as ToolHandler)(input);\n }\n this.emit('tool:result', { callId, result });\n\n // Send result back to sandbox\n await this.client.call('tool.result', {\n callId,\n result,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.emit('tool:result', { callId, error: errorMessage });\n\n await this.client.call('tool.result', {\n callId,\n error: { code: 'TOOL_EXECUTION_FAILED', message: errorMessage },\n });\n }\n });\n }\n\n private setupEventHandlers(): void {\n // Pipe client events to session events\n this.client.on('sync', (doc: unknown) => {\n this.emit('sync', doc);\n this.checkForToolChanges();\n });\n this.client.on('prompt', (prompt: unknown) => this.emit('prompt', prompt));\n this.client.on('disconnect', (payload: unknown) => this.emit('disconnect', payload || {}));\n\n // Job status updates\n this.client.on('job.status', (data: unknown) => {\n this.emit('job:status', data);\n });\n\n // Exec events\n this.client.on('exec.completed', (data: unknown) => {\n this.emit('exec:completed', data);\n });\n this.client.on('exec.progress', (data: unknown) => {\n this.emit('exec:progress', data);\n });\n }\n\n protected emit(event: string, data: unknown): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n handlers.forEach(h => h(data));\n }\n }\n\n /**\n * Check for changes in the tool catalog and emit 'tools:changed' if needed\n */\n private checkForToolChanges() {\n const currentTools = this.getTools();\n const currentMap = new Map(currentTools.map(t => [t.name, t]));\n\n const added: string[] = [];\n const removed: string[] = [];\n\n // Check for added or updated tools\n for (const [name, tool] of currentMap) {\n if (!this.lastKnownTools.has(name)) {\n added.push(name);\n }\n }\n\n // Check for removed tools\n for (const name of this.lastKnownTools.keys()) {\n if (!currentMap.has(name)) {\n removed.push(name);\n }\n }\n\n if (added.length > 0 || removed.length > 0) {\n this.lastKnownTools = currentMap;\n this.emit('tools:changed', {\n tools: currentTools,\n added,\n removed\n });\n }\n }\n}\n\n// --- Job Implementation ---\n\nclass JobImplementation implements Job {\n public id: string;\n public client: WSClient;\n public status: JobStatus = 'queued';\n\n private _resultPromise: Promise<unknown>;\n private _resolveResult!: (value: unknown) => void;\n private _rejectResult!: (reason: unknown) => void;\n private eventListeners: Map<string, Array<(data: unknown) => void>> = new Map();\n\n constructor(id: string, client: WSClient) {\n this.id = id;\n this.client = client;\n\n this._resultPromise = new Promise((resolve, reject) => {\n this._resolveResult = resolve;\n this._rejectResult = reject;\n });\n\n // Listen to exec events\n this.client.on('exec.completed', (data: unknown) => {\n const execData = data as { execId?: string; jobId?: string; result?: unknown; error?: unknown };\n if (execData.execId === id || execData.jobId === id) {\n this.status = 'succeeded';\n this.emit('status', this.status);\n if (execData.error) {\n this._rejectResult(execData.error);\n } else {\n this._resolveResult(execData.result);\n }\n }\n });\n\n this.client.on('exec.progress', (data: unknown) => {\n const progressData = data as { execId?: string; jobId?: string; stdout?: string; stderr?: string };\n if (progressData.execId === id || progressData.jobId === id) {\n if (progressData.stdout) {\n this.emit('stdout', progressData.stdout);\n }\n if (progressData.stderr) {\n this.emit('stderr', progressData.stderr);\n }\n }\n });\n\n // Also listen to specific job events if available\n this.client.on(`job.${id}.status`, (status: unknown) => {\n this.status = status as JobStatus;\n this.emit('status', status);\n });\n\n this.client.on(`job.${id}.stdout`, (line: unknown) => {\n this.emit('stdout', line);\n });\n\n this.client.on(`job.${id}.stderr`, (line: unknown) => {\n this.emit('stderr', line);\n });\n\n this.client.on(`job.${id}.result`, (result: unknown) => {\n this.status = 'succeeded';\n this._resolveResult(result);\n });\n\n this.client.on(`job.${id}.error`, (error: unknown) => {\n this.status = 'failed';\n this._rejectResult(error);\n });\n\n // Listen for job.completed and job.failed events (generic events from backend)\n this.client.on('job.completed', (data: unknown) => {\n const jobData = data as { jobId?: string; result?: unknown };\n if (jobData.jobId === id) {\n this.status = 'succeeded';\n this.emit('status', this.status);\n this._resolveResult(jobData.result);\n }\n });\n\n this.client.on('job.failed', (data: unknown) => {\n const jobData = data as { jobId?: string; error?: unknown };\n if (jobData.jobId === id) {\n this.status = 'failed';\n this.emit('status', this.status);\n this._rejectResult(jobData.error || new Error('Job failed'));\n }\n });\n\n // Live tool call tracking (broadcast by backend to all clients)\n this.client.on('tool.call.start', (data: unknown) => {\n const d = data as { jobId?: string; callId?: string; toolName?: string; input?: unknown; timestamp?: number };\n if (d.jobId === id) {\n this.emit('toolCallStart', { callId: d.callId, toolName: d.toolName, input: d.input, timestamp: d.timestamp });\n }\n });\n\n this.client.on('tool.call.end', (data: unknown) => {\n const d = data as { jobId?: string; callId?: string; toolName?: string; result?: unknown; error?: string; durationMs?: number; timestamp?: number };\n if (d.jobId === id) {\n this.emit('toolCallEnd', { callId: d.callId, toolName: d.toolName, result: d.result, error: d.error, durationMs: d.durationMs, timestamp: d.timestamp });\n }\n });\n }\n\n get result(): Promise<unknown> {\n return this._resultPromise;\n }\n\n on(event: string, handler: (data: unknown) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(handler);\n }\n\n protected emit(event: string, data: unknown): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n handlers.forEach(h => h(data));\n }\n }\n}\n","import type { EndpointMode } from \"./types\";\n\nexport const LOCAL_API_URL = \"ws://localhost:8787/granular\";\nexport const PRODUCTION_API_URL = \"wss://api.granular.dev/v2/ws\";\n\nexport const LOCAL_AUTH_URL = \"http://localhost:3000\";\nexport const PRODUCTION_AUTH_URL = \"https://app.granular.software\";\n\ntype ResolvedEndpointMode = \"local\" | \"production\";\n\nfunction readEnv(name: string): string | undefined {\n if (typeof process === \"undefined\" || !process.env) return undefined;\n return process.env[name];\n}\n\nfunction normalizeMode(value?: string): EndpointMode | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === \"local\") return \"local\";\n if (normalized === \"prod\" || normalized === \"production\") return \"production\";\n if (normalized === \"auto\") return \"auto\";\n return undefined;\n}\n\nfunction isTruthy(value?: string): boolean {\n if (!value) return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\nexport function resolveEndpointMode(explicitMode?: EndpointMode): ResolvedEndpointMode {\n const explicit = normalizeMode(explicitMode);\n if (explicit === \"local\" || explicit === \"production\") {\n return explicit;\n }\n\n const envMode = normalizeMode(readEnv(\"GRANULAR_ENDPOINT_MODE\") || readEnv(\"GRANULAR_ENV\"));\n if (envMode === \"local\" || envMode === \"production\") {\n return envMode;\n }\n\n if (isTruthy(readEnv(\"GRANULAR_USE_LOCAL_ENDPOINTS\")) || isTruthy(readEnv(\"GRANULAR_LOCAL\"))) {\n return \"local\";\n }\n if (isTruthy(readEnv(\"GRANULAR_USE_PRODUCTION_ENDPOINTS\")) || isTruthy(readEnv(\"GRANULAR_PROD\"))) {\n return \"production\";\n }\n\n return readEnv(\"NODE_ENV\") === \"development\" ? \"local\" : \"production\";\n}\n\nexport function resolveApiUrl(explicitApiUrl?: string, mode?: EndpointMode): string {\n if (explicitApiUrl) {\n return explicitApiUrl;\n }\n\n return resolveEndpointMode(mode) === \"local\" ? LOCAL_API_URL : PRODUCTION_API_URL;\n}\n\nexport function resolveAuthUrl(explicitAuthUrl?: string, mode?: EndpointMode): string {\n if (explicitAuthUrl) {\n return explicitAuthUrl;\n }\n\n return resolveEndpointMode(mode) === \"local\" ? LOCAL_AUTH_URL : PRODUCTION_AUTH_URL;\n}\n","import { WSClient } from './ws-client';\nimport { Session, ToolWithHandler, PublishToolsResult } from './session';\nimport { resolveApiUrl } from './endpoints';\nimport type {\n AccessTokenProvider,\n GranularOptions,\n ConnectOptions,\n RecordUserOptions,\n User,\n Subject,\n Sandbox,\n SandboxListResponse,\n CreateSandboxData,\n PermissionProfile,\n PermissionProfileListResponse,\n CreatePermissionProfileData,\n EnvironmentData,\n EnvironmentListResponse,\n CreateEnvironmentData,\n Assignment,\n AssignmentListResponse,\n DeleteResponse,\n GraphQLResult,\n RelationshipInfo,\n ModelRef,\n DefineRelationshipOptions,\n ManifestContent,\n ManifestOperation,\n ManifestPropertySpec,\n ManifestImport,\n RecordObjectOptions,\n RecordObjectResult,\n ToolInfo,\n ToolsChangedEvent,\n WSDisconnectInfo,\n WSReconnectErrorInfo,\n} from './types';\n\n// ── Built-in modules ──\n\n/**\n * Standard modules: base types available via `imports: [{ alias: \"@std\", name: \"standard_modules\" }]`\n */\nconst STANDARD_MODULES_OPERATIONS: ManifestOperation[] = [\n { create: 'entity', has: { id: { value: 'auto-generated' }, createdAt: { value: undefined } } },\n { create: 'class', extends: 'entity', has: {} },\n { create: 'user', extends: 'entity', has: { email: { value: undefined }, firstName: { value: undefined }, lastName: { value: undefined } } },\n { create: 'company', extends: 'entity', has: { name: { value: undefined }, website: { value: undefined } } },\n { create: 'string', has: { value: { value: undefined } } },\n { create: 'number', has: { value: { value: 0 } } },\n { create: 'boolean', has: { value: { value: false } } },\n { create: 'tool_parameter', has: { name: { value: undefined }, type: { value: 'string' }, description: { value: undefined }, required: { value: false } } },\n];\n\n/**\n * Registry of built-in modules that can be imported in manifests\n */\nconst BUILTIN_MODULES: Record<string, ManifestOperation[]> = {\n 'standard_modules': STANDARD_MODULES_OPERATIONS,\n};\n\n/**\n * Environment represents a connected session to a sandbox for a specific user.\n *\n * After connecting, you can:\n * 1. Define your domain ontology via `applyManifest()` (classes, properties, relationships)\n * 2. Record object instances via `recordObject()` (with fields and relationship attachments)\n * 3. Publish tools via `publishTools()` (instance methods, static methods, global tools — with typed I/O)\n * 4. Submit jobs via `submitJob()` that import auto-generated typed classes from `./sandbox-tools`\n * 5. Execute GraphQL queries via `graphql()` (authenticated automatically)\n * 6. List available tools via `getTools()` and listen for updates via `onToolsChanged()`\n *\n * Tool calls from the sandbox automatically invoke your handlers via reverse-RPC.\n *\n * Object IDs are unique per class. Internally, the graph path is `{className}_{id}`\n * (e.g., `author_tolkien`). Use `Environment.toGraphPath()` and\n * `Environment.extractIdFromGraphPath()` for conversions.\n */\nexport class Environment extends Session {\n private envData: EnvironmentData;\n private _apiKey: string;\n private _apiEndpoint: string;\n\n constructor(client: WSClient, envData: EnvironmentData, clientId: string, apiKey: string, apiEndpoint: string) {\n super(client, clientId);\n this.envData = envData;\n this._apiKey = apiKey;\n this._apiEndpoint = apiEndpoint;\n }\n\n /** The environment ID */\n get environmentId(): string {\n return this.envData.environmentId;\n }\n\n /** The sandbox ID */\n get sandboxId(): string {\n return this.envData.sandboxId;\n }\n\n /** The subject ID */\n get subjectId(): string {\n return this.envData.subjectId;\n }\n\n /** The permission profile ID */\n get permissionProfileId(): string {\n return this.envData.permissionProfileId;\n }\n\n /** The GraphQL API endpoint URL */\n get apiEndpoint(): string {\n return this._apiEndpoint;\n }\n\n private getRuntimeBaseUrl(): string {\n try {\n const endpoint = new URL(this._apiEndpoint);\n const graphqlSuffix = '/orchestrator/graphql';\n if (endpoint.pathname.endsWith(graphqlSuffix)) {\n endpoint.pathname = endpoint.pathname.slice(0, -graphqlSuffix.length);\n } else if (endpoint.pathname.endsWith('/graphql')) {\n endpoint.pathname = endpoint.pathname.slice(0, -'/graphql'.length);\n }\n endpoint.search = '';\n endpoint.hash = '';\n return endpoint.toString().replace(/\\/$/, '');\n } catch {\n return this._apiEndpoint.replace(/\\/orchestrator\\/graphql$/, '').replace(/\\/$/, '');\n }\n }\n\n /**\n * Close the session and disconnect from the sandbox.\n *\n * Sends `client.goodbye` over WebSocket first, then issues an HTTP fallback\n * to the runtime goodbye endpoint if no definitive WS-side runtime notify\n * acknowledgement was observed.\n */\n override async disconnect(): Promise<void> {\n let wsNotifiedRuntime = false;\n\n try {\n const goodbye = await this.rpc<{ ok?: boolean; via?: string }>('client.goodbye', {\n timestamp: Date.now(),\n });\n wsNotifiedRuntime = Boolean(goodbye?.ok && goodbye?.via);\n } catch {\n wsNotifiedRuntime = false;\n }\n\n if (!wsNotifiedRuntime) {\n try {\n const runtimeBase = this.getRuntimeBaseUrl();\n await fetch(\n `${runtimeBase}/orchestrator/runtime/environments/${this.environmentId}/session-goodbye`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify({\n reason: 'sdk_disconnect_http_fallback',\n }),\n },\n );\n } catch {\n // Best effort fallback.\n }\n }\n\n this.client.disconnect();\n }\n\n // ==================== GRAPH CONTAINER READINESS ====================\n\n /** The last known graph container status, updated by checkReadiness() or on heartbeat */\n graphContainerStatus: { lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' } | null = null;\n\n /**\n * Check if the graph container is ready and warm.\n *\n * Sends a lightweight heartbeat RPC to the Session DO which internally\n * pings the FalkorDB container. The response includes `graphContainerStatus`,\n * which is stored locally and emitted as a `readiness` event.\n *\n * Use this method to proactively warm the graph container before any\n * GraphQL query that requires it, or to poll the container's state in\n * the background.\n *\n * @returns The current graph container status object\n *\n * @example\n * ```typescript\n * const status = await env.checkReadiness();\n * console.log(status.status); // 'hot' | 'warming' | 'unknown'\n *\n * // Or listen for live updates\n * env.on('readiness', (status) => {\n * console.log('Graph is now:', status.status);\n * });\n * ```\n */\n async checkReadiness(): Promise<{ lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' }> {\n const result = await this.client.call('client.heartbeat', {}) as {\n status?: string;\n timestamp?: number;\n graphContainerStatus?: { lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' };\n };\n\n const containerStatus = result?.graphContainerStatus ?? {\n lastKeepAliveAt: Date.now(),\n status: 'unknown' as const,\n };\n\n this.graphContainerStatus = containerStatus;\n this.emit('readiness', containerStatus);\n return containerStatus;\n }\n\n // ==================== ID ↔ GRAPH PATH MAPPING ====================\n\n /**\n * Convert a class name + real-world ID into a unique graph path.\n *\n * Two objects of *different* classes may share the same real-world ID,\n * so the graph path must incorporate the class to guarantee uniqueness.\n *\n * Format: `{className}_{id}` — deterministic, human-readable.\n *\n * **Convention**: class names should be simple identifiers without\n * underscores (e.g. `author`, `book`). This ensures the prefix is\n * unambiguously parseable by `extractIdFromGraphPath`.\n */\n static toGraphPath(className: string, id: string): string {\n return `${className}_${id}`;\n }\n\n /**\n * Extract the real-world ID from a graph path, given the class name.\n *\n * Strips the `{className}_` prefix. Returns the raw path if the\n * expected prefix is not found.\n */\n static extractIdFromGraphPath(graphPath: string, className: string): string {\n const prefix = `${className}_`;\n return graphPath.startsWith(prefix) ? graphPath.substring(prefix.length) : graphPath;\n }\n\n /**\n * Execute a GraphQL query against the environment's graph.\n * \n * The query uses the Granular graph query language (based on Cypher/GraphQL).\n * Authentication is handled automatically using the SDK's API key.\n * \n * @param query - The GraphQL query string\n * @param variables - Optional variables for the query\n * @returns The query result data\n * \n * @example\n * ```typescript\n * // Read the workspace\n * const result = await env.graphql(\n * `query { model(path: \"workspace\") { path label submodels { path label } } }`\n * );\n * console.log(result.data);\n * \n * // Create a model\n * const created = await env.graphql(\n * `mutation { at(path: \"workspace\") { create_submodel(subpath: \"my_node\", label: \"My Node\", prototype: \"Model\") { model { path label } } } }`\n * );\n * ```\n */\n async graphql<T = any>(query: string, variables?: Record<string, any>): Promise<GraphQLResult<T>> {\n const response = await fetch(this._apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify({\n environmentId: this.environmentId,\n query,\n variables,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GraphQL API Error (${response.status}): ${errorText}`);\n }\n\n return response.json() as Promise<GraphQLResult<T>>;\n }\n\n // ==================== RELATIONSHIP METHODS ====================\n\n /**\n * Define a relationship between two model types.\n * \n * Creates both submodels (if they don't exist) and links them with\n * a RelationshipDef node that encodes cardinality.\n * \n * @example\n * ```typescript\n * // Author has many Books, Book has one Author\n * const rel = await env.defineRelationship({\n * model: 'author',\n * localSubmodel: 'books',\n * localIsMany: true,\n * foreignModel: 'book',\n * foreignSubmodel: 'author',\n * foreignIsMany: false,\n * });\n * console.log(rel.relationship_kind); // \"one_to_many\"\n * ```\n */\n async defineRelationship(options: DefineRelationshipOptions): Promise<RelationshipInfo> {\n const result = await this.graphql<{\n at: {\n define_relationship: RelationshipInfo;\n };\n }>(\n `mutation DefineRelationship(\n $localSubmodel: String!,\n $foreignModel: String!,\n $foreignSubmodel: String!,\n $localIsMany: Boolean!,\n $foreignIsMany: Boolean!,\n $name: String\n ) {\n at(path: \"${options.model}\") {\n define_relationship(\n local_submodel: $localSubmodel\n foreign_model: $foreignModel\n foreign_submodel: $foreignSubmodel\n local_is_many: $localIsMany\n foreign_is_many: $foreignIsMany\n name: $name\n ) {\n name\n local_submodel { path label }\n local_is_many\n foreign_submodel { path label }\n foreign_is_many\n foreign_model { path label }\n relationship_kind\n }\n }\n }`,\n {\n localSubmodel: options.localSubmodel,\n foreignModel: options.foreignModel,\n foreignSubmodel: options.foreignSubmodel,\n localIsMany: options.localIsMany,\n foreignIsMany: options.foreignIsMany,\n name: options.name,\n }\n );\n\n if (result.errors?.length) {\n throw new Error(`defineRelationship failed: ${result.errors[0].message}`);\n }\n\n return result.data!.at.define_relationship;\n }\n\n /**\n * Get all relationships for a model type.\n * \n * @param modelPath - The model type path (e.g., \"author\")\n * @returns Array of relationships from this model's perspective\n * \n * @example\n * ```typescript\n * const rels = await env.getRelationships('author');\n * for (const rel of rels) {\n * console.log(`${rel.local_submodel.path} -> ${rel.foreign_model.path} (${rel.relationship_kind})`);\n * }\n * ```\n */\n async getRelationships(modelPath: string): Promise<RelationshipInfo[]> {\n const result = await this.graphql<{\n model: {\n relationships: RelationshipInfo[];\n };\n }>(\n `query GetRelationships($path: String) {\n model(path: $path) {\n relationships {\n name\n local_submodel { path label }\n local_is_many\n foreign_submodel { path label }\n foreign_is_many\n foreign_model { path label }\n relationship_kind\n }\n }\n }`,\n { path: modelPath }\n );\n\n if (result.errors?.length) {\n throw new Error(`getRelationships failed: ${result.errors[0].message}`);\n }\n\n return result.data?.model?.relationships || [];\n }\n\n /**\n * Attach a target model to a relationship submodel.\n * \n * Handles cardinality automatically:\n * - \"One\" side: sets/replaces the reference\n * - \"Many\" side: adds the target to the collection\n * \n * If the target model doesn't exist, it's created as an instance of the foreign type.\n * Bidirectional sync is automatic.\n * \n * @param modelPath - The model instance path (e.g., \"tolkien\")\n * @param submodelPath - The relationship submodel (e.g., \"books\")\n * @param targetPath - The target model to attach (e.g., \"lord_of_the_rings\")\n * \n * @example\n * ```typescript\n * // Attach a book to an author (many side)\n * await env.attach('tolkien', 'books', 'lord_of_the_rings');\n * // This also automatically sets lord_of_the_rings:author -> tolkien\n * ```\n */\n async attach(modelPath: string, submodelPath: string, targetPath: string): Promise<void> {\n const result = await this.graphql(\n `mutation Attach($target: String!) {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n attach(target: $target) {\n model { path }\n }\n }\n }\n }`,\n { target: targetPath }\n );\n\n if (result.errors?.length) {\n throw new Error(`attach failed: ${result.errors[0].message}`);\n }\n }\n\n /**\n * Detach a target model from a relationship submodel.\n * \n * Handles bidirectional cleanup automatically.\n * \n * @param modelPath - The model instance path\n * @param submodelPath - The relationship submodel\n * @param targetPath - The target to detach (optional for \"one\" side; omit on \"many\" side to detach all)\n * \n * @example\n * ```typescript\n * // Detach a specific book\n * await env.detach('tolkien', 'books', 'lord_of_the_rings');\n * \n * // Detach all books\n * await env.detach('tolkien', 'books');\n * ```\n */\n async detach(modelPath: string, submodelPath: string, targetPath?: string): Promise<void> {\n const targetArg = targetPath ? `target: \"${targetPath}\"` : '';\n const result = await this.graphql(\n `mutation Detach {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n detach(${targetArg}) {\n model { path }\n }\n }\n }\n }`\n );\n\n if (result.errors?.length) {\n throw new Error(`detach failed: ${result.errors[0].message}`);\n }\n }\n\n /**\n * List all related models through a relationship submodel.\n * \n * @param modelPath - The model instance path\n * @param submodelPath - The relationship submodel\n * @returns Array of related model references\n * \n * @example\n * ```typescript\n * const books = await env.listRelated('tolkien', 'books');\n * console.log(books); // [{ path: \"lord_of_the_rings\", label: \"Lord of the Rings\" }, ...]\n * ```\n */\n async listRelated(modelPath: string, submodelPath: string): Promise<ModelRef[]> {\n const result = await this.graphql<{\n at: {\n at: {\n list_related: ModelRef[];\n };\n };\n }>(\n `mutation ListRelated {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n list_related { path label }\n }\n }\n }`\n );\n\n if (result.errors?.length) {\n throw new Error(`listRelated failed: ${result.errors[0].message}`);\n }\n\n return result.data?.at?.at?.list_related || [];\n }\n\n /**\n * Apply a manifest to the current environment's graph.\n * \n * Translates each manifest operation into GraphQL mutations and executes them\n * in order. This is the core mechanism for creating classes, fields, and\n * relationships from a declarative manifest.\n * \n * @param manifest - The manifest content to apply\n * @returns Summary of applied operations\n * \n * @example\n * ```typescript\n * await environment.applyManifest({\n * schemaVersion: 2,\n * name: 'my-app',\n * volumes: [{\n * name: 'schema',\n * scope: 'sandbox',\n * operations: [\n * { create: 'author', extends: 'class', has: { name: { type: 'string' } } },\n * { create: 'book', extends: 'class', has: { title: { type: 'string' } } },\n * { defineRelationship: {\n * left: 'author', right: 'book',\n * leftSubmodel: 'books', rightSubmodel: 'author',\n * leftIsMany: true, rightIsMany: false,\n * }},\n * ],\n * }],\n * });\n * ```\n */\n async applyManifest(manifest: ManifestContent): Promise<{ applied: number; errors: string[] }> {\n const errors: string[] = [];\n let applied = 0;\n\n for (const volume of manifest.volumes) {\n // Build alias map from imports\n const aliasMap: Record<string, string> = {};\n\n // Resolve and apply imports first\n if (volume.imports) {\n for (const imp of volume.imports) {\n aliasMap[imp.alias] = imp.name;\n\n const builtinOps = BUILTIN_MODULES[imp.name];\n if (builtinOps) {\n for (const op of builtinOps) {\n try {\n await this._applyOperation(op, {});\n applied++;\n } catch (err: any) {\n // Ignore \"already exists\" errors from re-applying imports\n if (!err.message?.includes('already exists')) {\n errors.push(`Import ${imp.name} operation failed: ${err.message}`);\n }\n }\n }\n } else {\n errors.push(`Unknown module: \"${imp.name}\" (only built-in modules are supported)`);\n }\n }\n }\n\n // Apply volume operations with alias resolution\n for (const op of volume.operations) {\n try {\n await this._applyOperation(op, aliasMap);\n applied++;\n } catch (err: any) {\n errors.push(`Operation failed: ${err.message}`);\n }\n }\n }\n\n return { applied, errors };\n }\n\n /**\n * Resolve an alias reference like \"@std/class\" → \"class\"\n * Strips the alias prefix, returning the bare model path.\n */\n private _resolveAlias(ref: string, aliasMap: Record<string, string>): string {\n if (!ref.startsWith('@')) return ref;\n const slashIdx = ref.indexOf('/');\n if (slashIdx === -1) return ref;\n const alias = ref.substring(0, slashIdx);\n const symbolName = ref.substring(slashIdx + 1);\n if (aliasMap[alias]) {\n return symbolName; // The import was applied, so the symbol exists at its bare name\n }\n return ref; // Unknown alias, return as-is\n }\n\n /**\n * Apply a single manifest operation via GraphQL\n */\n private async _applyOperation(op: ManifestOperation, aliasMap: Record<string, string>): Promise<void> {\n // 1. Relationship definition (standalone operation)\n if (op.defineRelationship) {\n const rel = op.defineRelationship;\n await this.defineRelationship({\n model: this._resolveAlias(rel.left, aliasMap),\n localSubmodel: rel.leftSubmodel,\n localIsMany: rel.leftIsMany,\n foreignModel: this._resolveAlias(rel.right, aliasMap),\n foreignSubmodel: rel.rightSubmodel,\n foreignIsMany: rel.rightIsMany,\n name: rel.name,\n });\n return;\n }\n\n // 2. Create a new model (optionally extending another)\n if (op.create) {\n const label = op.create.charAt(0).toUpperCase() + op.create.slice(1);\n const extendsRef = op.extends ? this._resolveAlias(op.extends, aliasMap) : undefined;\n const instanceOfRef = op.instanceOf ? this._resolveAlias(op.instanceOf, aliasMap) : undefined;\n\n if (extendsRef) {\n // Create model that extends a parent class\n await this.graphql(\n `mutation { create_model(path: \"${op.create}\", label: \"${label}\") { model { path } } }`\n );\n await this.graphql(\n `mutation { at(path: \"${op.create}\") { add_superclass(superclass: \"${extendsRef}\") { model { path } } } }`\n );\n } else if (instanceOfRef) {\n // Create an instance of a type\n await this.graphql(\n `mutation { at(path: \"${instanceOfRef}\") { instantiate(path: \"${op.create}\", label: \"${label}\") { model { path } } } }`\n );\n } else {\n // Create a standalone model\n await this.graphql(\n `mutation { create_model(path: \"${op.create}\", label: \"${label}\") { model { path } } }`\n );\n }\n\n // Apply fields (has) if present\n if (op.has) {\n await this._applyFields(op.create, op.has);\n }\n return;\n }\n\n // 3. Modify an existing model\n if (op.on) {\n const target = this._resolveAlias(op.on, aliasMap);\n if (op.has) {\n await this._applyFields(target, op.has);\n }\n return;\n }\n }\n\n /**\n * Apply field definitions (has) to a model via GraphQL\n */\n private async _applyFields(modelPath: string, fields: Record<string, ManifestPropertySpec>): Promise<void> {\n for (const [fieldName, spec] of Object.entries(fields)) {\n const fieldLabel = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);\n\n // Create the submodel (field) on the model\n const createResult = await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n create_submodel(subpath: \"${fieldName}\", label: \"${fieldLabel}\") {\n model { path }\n }\n }\n }`\n );\n\n // Set type prototype if provided (e.g. 'string', 'number', 'boolean')\n if (spec.type) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n add_prototype(prototype: \"${spec.type}\") { done }\n }\n }\n }`\n );\n }\n\n // Set description if provided\n if (spec.description) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_description(description: \"${spec.description}\") { done }\n }\n }\n }`\n );\n }\n\n // Set value if provided\n if (spec.value !== undefined && spec.value !== null) {\n if (typeof spec.value === 'string') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_string_value(value: \"${spec.value}\") { done }\n }\n }\n }`\n );\n } else if (typeof spec.value === 'number') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_number_value(value: ${spec.value}) { done }\n }\n }\n }`\n );\n } else if (typeof spec.value === 'boolean') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_boolean_value(value: ${spec.value}) { done }\n }\n }\n }`\n );\n }\n }\n\n // Set reference if provided\n if (spec.ref) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_reference(reference: \"${spec.ref}\") { done }\n }\n }\n }`\n );\n }\n\n // Recurse into nested has\n if (spec.has) {\n await this._applyFields(`${modelPath}:${fieldName}`, spec.has);\n }\n }\n }\n\n // ==================== RECORD OBJECT ====================\n\n /**\n * Create or update an instance of a class in the graph.\n *\n * Uses `instantiate` under the hood, which has find-or-create semantics:\n * if an instance with the given `id` already exists for the class it is\n * returned; otherwise a new instance is created. Fields are then set\n * (overwriting previous values) and relationships are attached.\n *\n * The graph path is derived as `{className}_{id}` to ensure uniqueness\n * across classes (two objects of different classes may share the same\n * real-world ID). Relationship targets are also resolved automatically\n * using the foreign class from the relationship definition.\n *\n * @param options - The object specification\n * @returns The graph path, real-world ID, and creation status\n *\n * @example\n * ```typescript\n * // Create an author with fields\n * const result = await env.recordObject({\n * className: 'author',\n * id: 'tolkien',\n * label: 'J.R.R. Tolkien',\n * fields: { name: 'J.R.R. Tolkien', birth_year: 1892 },\n * relationships: { books: ['lotr', 'silmarillion'] },\n * });\n * // result.path → 'author_tolkien' (internal graph path)\n * // result.id → 'tolkien' (real-world ID)\n * // result.created → true\n * ```\n */\n async recordObject(options: RecordObjectOptions): Promise<RecordObjectResult> {\n const { className, id, label, fields, relationships } = options;\n\n // Derive a unique graph path: className__id\n const graphPath = Environment.toGraphPath(className, id);\n\n // 1. Check if instance already exists\n const existsResult = await this.graphql<{ model: { path: string } | null }>(\n `query { model(path: \"${graphPath}\") { path } }`\n );\n const alreadyExists = !!existsResult.data?.model;\n\n // 2. Instantiate (find-or-create) under the class using the graph path\n const instResult = await this.graphql(\n `mutation {\n at(path: \"${className}\") {\n instantiate(path: \"${graphPath}\"${label ? `, label: \"${label}\"` : ''}) {\n model { path }\n }\n }\n }`\n );\n if (instResult.errors?.length) {\n throw new Error(`recordObject instantiate failed: ${instResult.errors[0].message}`);\n }\n\n const instancePath = instResult.data?.at?.instantiate?.model?.path ?? graphPath;\n\n // 3. Store the real-world ID as a string field (_realId) for later look-up\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n create_submodel(subpath: \"_realId\", label: \"_realId\") {\n model { path }\n }\n }\n }`\n );\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"_realId\") {\n set_string_value(value: \"${id.replace(/\"/g, '\\\\\"')}\") { done }\n }\n }\n }`\n );\n\n // 4. Set scalar field values\n if (fields) {\n for (const [fieldName, value] of Object.entries(fields)) {\n if (value === null) continue;\n\n // Ensure the submodel exists on the instance\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n create_submodel(subpath: \"${fieldName}\", label: \"${fieldName}\") {\n model { path }\n }\n }\n }`\n );\n\n // Set the value based on its JS type\n if (typeof value === 'string') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_string_value(value: \"${value.replace(/\"/g, '\\\\\"')}\") { done }\n }\n }\n }`\n );\n } else if (typeof value === 'number') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_number_value(value: ${value}) { done }\n }\n }\n }`\n );\n } else if (typeof value === 'boolean') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_boolean_value(value: ${value}) { done }\n }\n }\n }`\n );\n }\n }\n }\n\n // 5. Attach relationships — resolve target IDs to graph paths\n if (relationships) {\n // Query the class's relationship definitions once to find foreign class names\n const rels = await this.getRelationships(className);\n const relMap: Record<string, string> = {};\n for (const rel of rels) {\n // Map submodel name → foreign model class name\n // local_submodel.path may be \"className:submodelName\", extract the leaf\n const submodelLeaf = rel.local_submodel.path.includes(':')\n ? rel.local_submodel.path.split(':').pop()!\n : rel.local_submodel.path;\n relMap[submodelLeaf] = rel.foreign_model.path;\n }\n\n for (const [submodelName, targets] of Object.entries(relationships)) {\n const foreignClass = relMap[submodelName];\n const targetList = Array.isArray(targets) ? targets : [targets];\n for (const target of targetList) {\n // Resolve target real-world ID to graph path using the foreign class\n const targetGraphPath = foreignClass\n ? Environment.toGraphPath(foreignClass, target)\n : target; // Fallback to raw ID if relationship not found\n await this.attach(instancePath, submodelName, targetGraphPath);\n }\n }\n }\n\n return { path: instancePath, id, created: !alreadyExists };\n }\n\n // ==================== PUBLISH TOOLS ====================\n\n /**\n * Convenience method: publish tools and get back wrapped result.\n * This is the main entry point for setting up tools.\n * \n * @example\n * ```typescript\n * const tools = [\n * {\n * name: 'get_weather',\n * description: 'Get weather for a city',\n * inputSchema: { type: 'object', properties: { city: { type: 'string' } } },\n * handler: async ({ city }) => ({ temp: 22 }),\n * },\n * ];\n * \n * const { domainRevision } = await environment.publishTools(tools);\n * \n * // Now submit jobs that use those tools\n * const job = await environment.submitJob(`\n * import { Author } from './sandbox-tools';\n * const weather = await Author.get_weather({ city: 'Paris' });\n * return weather;\n * `);\n * \n * const result = await job.result;\n * ```\n */\n async publishTools(tools: ToolWithHandler[], revision = '1.0.0'): Promise<PublishToolsResult> {\n return super.publishTools(tools, revision);\n }\n\n /**\n * Publish a single effect (tool) incrementally.\n *\n * Adds the effect to the local registry and re-publishes the\n * full tool catalog to the server. If an effect with the same\n * name already exists, it is replaced.\n *\n * @example\n * ```typescript\n * await env.publishEffect({\n * name: 'get_bio',\n * description: 'Get biography',\n * inputSchema: { type: 'object', properties: { detailed: { type: 'boolean' } } },\n * handler: async (params) => ({ bio: 'Hello' }),\n * });\n * ```\n */\n async publishEffect(effect: ToolWithHandler): Promise<PublishToolsResult> {\n return super.publishEffect(effect);\n }\n\n /**\n * Publish multiple effects (tools) at once.\n *\n * Adds all effects to the local registry and re-publishes the\n * full tool catalog in a single RPC call.\n */\n async publishEffects(effects: ToolWithHandler[]): Promise<PublishToolsResult> {\n return super.publishEffects(effects);\n }\n\n /**\n * Remove an effect by name and re-publish the remaining catalog.\n */\n async unpublishEffect(name: string): Promise<PublishToolsResult> {\n return super.unpublishEffect(name);\n }\n\n /**\n * Remove all effects and publish an empty catalog.\n */\n async unpublishAllEffects(): Promise<PublishToolsResult> {\n return super.unpublishAllEffects();\n }\n}\n\nexport class Granular {\n private apiKey: string;\n private apiUrl: string;\n private httpUrl: string;\n private tokenProvider?: AccessTokenProvider;\n private WebSocketCtor?: any;\n private onUnexpectedClose?: (info: WSDisconnectInfo) => void;\n private onReconnectError?: (info: WSReconnectErrorInfo) => void;\n\n /** Sandbox-level effect registry: sandboxId → (toolName → ToolWithHandler) */\n private sandboxEffects: Map<string, Map<string, ToolWithHandler>> = new Map();\n /** Active environments tracker: sandboxId → Environment[] */\n private activeEnvironments: Map<string, Environment[]> = new Map();\n\n /**\n * Create a new Granular client\n * @param options - Client configuration\n */\n constructor(options: GranularOptions) {\n const auth = options.token ?? options.apiKey;\n if (!auth) {\n throw new Error('Granular client requires either apiKey or token. Set GRANULAR_API_KEY or GRANULAR_TOKEN, or pass one in options.');\n }\n this.apiKey = auth;\n this.apiUrl = resolveApiUrl(options.apiUrl, options.endpointMode);\n this.tokenProvider = options.tokenProvider;\n this.WebSocketCtor = options.WebSocketCtor;\n this.onUnexpectedClose = options.onUnexpectedClose;\n this.onReconnectError = options.onReconnectError;\n // Convert WebSocket URL to HTTP URL for REST API\n this.httpUrl = this.apiUrl\n .replace(/^wss:\\/\\//, 'https://')\n .replace(/^ws:\\/\\//, 'http://')\n .replace(/\\/ws$/, '');\n }\n\n /**\n * Records/upserts a user and prepares them for sandbox connections\n * \n * @param options - User options\n * @returns The user object to pass to connect()\n * \n * @example\n * ```typescript\n * const user = await granular.recordUser({\n * userId: 'user_123',\n * name: 'John Doe',\n * permissions: ['agent'],\n * });\n * ```\n */\n async recordUser(options: RecordUserOptions): Promise<User> {\n // Create or get subject via control plane\n const subject = await this.request<Subject>('/control/subjects', {\n method: 'POST',\n body: JSON.stringify({\n identityId: options.userId,\n name: options.name,\n email: options.email,\n }),\n });\n\n return {\n subjectId: subject.subjectId,\n identityId: options.userId,\n name: options.name,\n email: options.email,\n permissions: options.permissions || [],\n };\n }\n\n /**\n * Connect to a sandbox and establish a real-time environment session.\n * \n * After connecting, use `environment.publishTools()` to register tools,\n * then `environment.submitJob()` to execute code that uses those tools.\n * \n * @param options - Connection options\n * @returns An active environment session\n * \n * @example\n * ```typescript\n * const user = await granular.recordUser({\n * userId: 'user_123',\n * permissions: ['agent'],\n * });\n * \n * const environment = await granular.connect({\n * sandbox: 'my-sandbox',\n * user,\n * });\n * \n * // Publish tools\n * await environment.publishTools([\n * { name: 'greet', description: 'Say hello', inputSchema: {}, handler: async () => 'Hello!' },\n * ]);\n * \n * // Submit job\n * const job = await environment.submitJob(`\n * import { tools } from './sandbox-tools';\n * return await tools.greet({});\n * `);\n * \n * console.log(await job.result); // 'Hello!'\n * ```\n */\n async connect(options: ConnectOptions): Promise<Environment> {\n const clientId = options.clientId || `client_${Date.now()}`;\n\n // 1. Find or create the sandbox\n const sandbox = await this.findOrCreateSandbox(options.sandbox);\n\n // 2. Ensure permission profiles and assignments exist for each permission\n for (const profileName of options.user.permissions) {\n const profileId = await this.ensurePermissionProfile(sandbox.sandboxId, profileName);\n await this.ensureAssignment(options.user.subjectId, sandbox.sandboxId, profileId);\n }\n\n // 3. Create the environment\n const envData = await this.environments.create(sandbox.sandboxId, {\n subjectId: options.user.subjectId,\n permissionProfileId: null,\n });\n\n // 4. Connect WebSocket using environment ID\n // The API gateway auto-initializes the Durable Object on first connection when using API key auth\n const client = new WSClient({\n url: this.apiUrl,\n sessionId: envData.environmentId,\n token: this.apiKey,\n tokenProvider: this.tokenProvider,\n WebSocketCtor: this.WebSocketCtor,\n onUnexpectedClose: this.onUnexpectedClose,\n onReconnectError: this.onReconnectError,\n });\n\n await client.connect();\n\n // 5. Create environment wrapper and send hello\n // The GraphQL API endpoint goes through the API gateway for authentication\n const graphqlEndpoint = `${this.httpUrl}/orchestrator/graphql`;\n const environment = new Environment(client, envData, clientId, this.apiKey, graphqlEndpoint);\n\n // Track active environment for sandbox-level effects\n if (!this.activeEnvironments.has(sandbox.sandboxId)) {\n this.activeEnvironments.set(sandbox.sandboxId, []);\n }\n this.activeEnvironments.get(sandbox.sandboxId)!.push(environment);\n\n // Remove from active list on disconnect\n environment.on('disconnect', () => {\n const list = this.activeEnvironments.get(sandbox.sandboxId);\n if (list) {\n this.activeEnvironments.set(sandbox.sandboxId, list.filter(e => e !== environment));\n }\n });\n\n await environment.hello();\n\n // Auto-publish any registered sandbox-level effects\n const effects = this.sandboxEffects.get(sandbox.sandboxId);\n if (effects && effects.size > 0) {\n const effectsList = Array.from(effects.values());\n console.log(`[Granular] Auto-publishing ${effectsList.length} effects for sandbox ${sandbox.sandboxId}`);\n await environment.publishEffects(effectsList);\n }\n\n return environment;\n }\n\n // ── Sandbox-Level Effects ──\n\n /**\n * Register an effect (tool) for a specific sandbox.\n * \n * The effect will be automatically published to:\n * 1. Any currently active environments for this sandbox\n * 2. Any new environments created/connected for this sandbox\n * \n * @param sandboxNameOrId - The name or ID of the sandbox\n * @param effect - The tool definition and handler\n */\n async registerEffect(sandboxNameOrId: string, effect: ToolWithHandler): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n\n if (!this.sandboxEffects.has(sandboxId)) {\n this.sandboxEffects.set(sandboxId, new Map());\n }\n this.sandboxEffects.get(sandboxId)!.set(effect.name, effect);\n\n // Sync to active environments\n const activeEnvs = this.activeEnvironments.get(sandboxId) || [];\n for (const env of activeEnvs) {\n await env.publishEffect(effect);\n }\n }\n\n /**\n * Register multiple effects (tools) for a specific sandbox.\n * \n * batch version of `registerEffect`.\n */\n async registerEffects(sandboxNameOrId: string, effects: ToolWithHandler[]): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n\n if (!this.sandboxEffects.has(sandboxId)) {\n this.sandboxEffects.set(sandboxId, new Map());\n }\n const map = this.sandboxEffects.get(sandboxId)!;\n for (const effect of effects) {\n map.set(effect.name, effect);\n }\n\n // Sync to active environments\n const activeEnvs = this.activeEnvironments.get(sandboxId) || [];\n for (const env of activeEnvs) {\n await env.publishEffects(effects);\n }\n }\n\n /**\n * Unregister an effect from a sandbox.\n * \n * Removes it from the local registry and unpublishes it from\n * all active environments.\n */\n async unregisterEffect(sandboxNameOrId: string, name: string): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n\n const map = this.sandboxEffects.get(sandboxId);\n if (map) {\n map.delete(name);\n }\n\n // Sync to active environments\n const activeEnvs = this.activeEnvironments.get(sandboxId) || [];\n for (const env of activeEnvs) {\n await env.unpublishEffect(name);\n }\n }\n\n /**\n * Unregister all effects for a sandbox.\n */\n async unregisterAllEffects(sandboxNameOrId: string): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n\n this.sandboxEffects.delete(sandboxId);\n\n // Sync to active environments\n const activeEnvs = this.activeEnvironments.get(sandboxId) || [];\n for (const env of activeEnvs) {\n await env.unpublishAllEffects();\n }\n }\n\n /**\n * Find a sandbox by name or create it if it doesn't exist\n */\n private async findOrCreateSandbox(nameOrId: string): Promise<Sandbox> {\n try {\n // Try to get by ID first\n const sandbox = await this.sandboxes.get(nameOrId);\n return sandbox;\n } catch {\n // If not found by ID, try to find by name or create\n const sandboxes = await this.sandboxes.list();\n const existing = sandboxes.items.find(s => s.name === nameOrId);\n if (existing) {\n return existing;\n }\n\n // Create new sandbox\n const created = await this.sandboxes.create({ name: nameOrId });\n return created;\n }\n }\n\n /**\n * Ensure a permission profile exists for a sandbox, creating it if needed.\n * If profileName matches an existing profile name, returns its ID.\n * Otherwise, creates a new profile with default allow-all rules.\n */\n private async ensurePermissionProfile(\n sandboxId: string,\n profileName: string\n ): Promise<string> {\n try {\n // Check if profile already exists by name\n const profiles = await this.permissionProfiles.list(sandboxId);\n const existing = profiles.find((p) => p.name === profileName);\n if (existing) {\n return existing.permissionProfileId;\n }\n } catch {\n // Ignore lookup errors, try to create\n }\n\n // Create new profile with default rules (allow all tools)\n const created = await this.permissionProfiles.create(sandboxId, {\n name: profileName,\n rules: {\n tools: { allow: ['*'] },\n resources: { allow: ['*'] },\n },\n });\n return created.permissionProfileId;\n }\n\n /**\n * Ensure an assignment exists for a subject in a sandbox with a permission profile\n */\n private async ensureAssignment(\n subjectId: string,\n sandboxId: string,\n permissionProfileId: string\n ): Promise<void> {\n try {\n const assignments = await this.request<AssignmentListResponse>(\n `/control/subjects/${subjectId}/assignments`\n );\n // Check for ANY assignment in this sandbox\n const existing = assignments.items.find(\n (a) => a.sandboxId === sandboxId\n );\n\n if (existing) {\n // If assignment exists with same profile, we are done\n if (existing.permissionProfileId === permissionProfileId) {\n return;\n }\n\n // If assignment exists but with different profile, delete it first\n // This avoids UNIQUE constraint violation when creating the new one\n await this.request<DeleteResponse>(`/control/assignments/${existing.assignmentId}`, {\n method: 'DELETE'\n });\n }\n } catch {\n // Ignore lookup errors\n }\n\n await this.request<Assignment>(`/control/subjects/${subjectId}/assignments`, {\n method: 'POST',\n body: JSON.stringify({\n sandboxId,\n subjectId,\n permissionProfileId,\n }),\n });\n }\n\n /**\n * Sandbox management API\n */\n get sandboxes() {\n return {\n list: async (): Promise<SandboxListResponse> => {\n return this.request<SandboxListResponse>('/control/sandboxes');\n },\n get: async (id: string): Promise<Sandbox> => {\n return this.request<Sandbox>(`/control/sandboxes/${id}`);\n },\n create: async (data: CreateSandboxData): Promise<Sandbox> => {\n return this.request<Sandbox>('/control/sandboxes', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n update: async (id: string, data: Partial<CreateSandboxData>): Promise<Sandbox> => {\n return this.request<Sandbox>(`/control/sandboxes/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n },\n delete: async (id: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(`/control/sandboxes/${id}`, {\n method: 'DELETE',\n });\n },\n };\n }\n\n /**\n * Permission Profile management for sandboxes\n */\n get permissionProfiles() {\n return {\n list: async (sandboxId: string): Promise<PermissionProfile[]> => {\n const result = await this.request<PermissionProfileListResponse>(\n `/control/sandboxes/${sandboxId}/permission-profiles`\n );\n return result.items;\n },\n get: async (sandboxId: string, profileId: string): Promise<PermissionProfile> => {\n return this.request<PermissionProfile>(\n `/control/sandboxes/${sandboxId}/permission-profiles/${profileId}`\n );\n },\n create: async (\n sandboxId: string,\n data: CreatePermissionProfileData\n ): Promise<PermissionProfile> => {\n return this.request<PermissionProfile>(\n `/control/sandboxes/${sandboxId}/permission-profiles`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n },\n delete: async (sandboxId: string, profileId: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(\n `/control/sandboxes/${sandboxId}/permission-profiles/${profileId}`,\n {\n method: 'DELETE',\n }\n );\n },\n };\n }\n\n /**\n * Environment management\n */\n get environments() {\n return {\n list: async (sandboxId: string): Promise<EnvironmentData[]> => {\n const result = await this.request<EnvironmentListResponse>(\n `/control/sandboxes/${sandboxId}/environments`\n );\n return result.items;\n },\n get: async (environmentId: string): Promise<EnvironmentData> => {\n return this.request<EnvironmentData>(`/control/environments/${environmentId}`);\n },\n create: async (\n sandboxId: string,\n data: CreateEnvironmentData\n ): Promise<EnvironmentData> => {\n return this.request<EnvironmentData>(`/control/sandboxes/${sandboxId}/environments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n delete: async (environmentId: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(`/control/environments/${environmentId}`, {\n method: 'DELETE',\n });\n },\n };\n }\n\n /**\n * Subject management\n */\n get subjects() {\n return {\n get: async (subjectId: string): Promise<Subject> => {\n return this.request<Subject>(`/control/subjects/${subjectId}`);\n },\n listAssignments: async (subjectId: string): Promise<AssignmentListResponse> => {\n return this.request<AssignmentListResponse>(`/control/subjects/${subjectId}/assignments`);\n },\n };\n }\n\n /**\n * @deprecated Use recordUser() instead\n */\n get users() {\n return {\n create: async (data: { id: string; name?: string; email?: string }): Promise<Subject> => {\n return this.request<Subject>('/control/subjects', {\n method: 'POST',\n body: JSON.stringify({\n identityId: data.id,\n name: data.name,\n email: data.email,\n }),\n });\n },\n get: async (id: string): Promise<Subject> => {\n return this.request<Subject>(`/control/subjects/${id}`);\n },\n };\n }\n\n /**\n * Make an authenticated API request\n */\n private async request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.httpUrl}${path}`;\n console.log(`[SDK] Requesting: ${url}`);\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Granular API Error (${response.status}): ${errorText}`);\n }\n\n if (response.status === 204) {\n return { deleted: true } as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/constants.js","../../../node_modules/.bun/node-gyp-build@4.8.4/node_modules/node-gyp-build/node-gyp-build.js","../../../node_modules/.bun/node-gyp-build@4.8.4/node_modules/node-gyp-build/index.js","../../../node_modules/.bun/bufferutil@4.0.9/node_modules/bufferutil/fallback.js","../../../node_modules/.bun/bufferutil@4.0.9/node_modules/bufferutil/index.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/buffer-util.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/limiter.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/permessage-deflate.js","../../../node_modules/.bun/utf-8-validate@6.0.5/node_modules/utf-8-validate/fallback.js","../../../node_modules/.bun/utf-8-validate@6.0.5/node_modules/utf-8-validate/index.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/validation.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/receiver.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/sender.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/event-target.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/extension.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/websocket.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/stream.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/subprotocol.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/lib/websocket-server.js","../../../node_modules/.bun/ws@8.18.3+eb074c07ce2a86fc/node_modules/ws/wrapper.mjs","../src/ws-client.ts","../src/session.ts","../src/endpoints.ts","../src/client.ts"],"names":["load","dir","platform","arch","runtime","abi","require_node_gyp_build","mask","data","require_fallback","Receiver","Sender","URL","WebSocket","key","createWebSocketStream","err","protocol","WebSocketServer","Automerge","docs"],"mappings":"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AAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA;AAAA,MAC7C,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,C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","file":"index.js","sourcesContent":["'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","var fs = require('fs')\nvar path = require('path')\nvar os = require('os')\n\n// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression'\nvar runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\n\nvar vars = (process.config && process.config.variables) || {}\nvar prebuildsOnly = !!process.env.PREBUILDS_ONLY\nvar abi = process.versions.modules // TODO: support old node where this is undef\nvar runtime = isElectron() ? 'electron' : (isNwjs() ? 'node-webkit' : 'node')\n\nvar arch = process.env.npm_config_arch || os.arch()\nvar platform = process.env.npm_config_platform || os.platform()\nvar libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc')\nvar armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || ''\nvar uv = (process.versions.uv || '').split('.')[0]\n\nmodule.exports = load\n\nfunction load (dir) {\n return runtimeRequire(load.resolve(dir))\n}\n\nload.resolve = load.path = function (dir) {\n dir = path.resolve(dir || '.')\n\n try {\n var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_')\n if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD']\n } catch (err) {}\n\n if (!prebuildsOnly) {\n var release = getFirst(path.join(dir, 'build/Release'), matchBuild)\n if (release) return release\n\n var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild)\n if (debug) return debug\n }\n\n var prebuild = resolve(dir)\n if (prebuild) return prebuild\n\n var nearby = resolve(path.dirname(process.execPath))\n if (nearby) return nearby\n\n var target = [\n 'platform=' + platform,\n 'arch=' + arch,\n 'runtime=' + runtime,\n 'abi=' + abi,\n 'uv=' + uv,\n armv ? 'armv=' + armv : '',\n 'libc=' + libc,\n 'node=' + process.versions.node,\n process.versions.electron ? 'electron=' + process.versions.electron : '',\n typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line\n ].filter(Boolean).join(' ')\n\n throw new Error('No native build was found for ' + target + '\\n loaded from: ' + dir + '\\n')\n\n function resolve (dir) {\n // Find matching \"prebuilds/<platform>-<arch>\" directory\n var tuples = readdirSync(path.join(dir, 'prebuilds')).map(parseTuple)\n var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0]\n if (!tuple) return\n\n // Find most specific flavor first\n var prebuilds = path.join(dir, 'prebuilds', tuple.name)\n var parsed = readdirSync(prebuilds).map(parseTags)\n var candidates = parsed.filter(matchTags(runtime, abi))\n var winner = candidates.sort(compareTags(runtime))[0]\n if (winner) return path.join(prebuilds, winner.file)\n }\n}\n\nfunction readdirSync (dir) {\n try {\n return fs.readdirSync(dir)\n } catch (err) {\n return []\n }\n}\n\nfunction getFirst (dir, filter) {\n var files = readdirSync(dir).filter(filter)\n return files[0] && path.join(dir, files[0])\n}\n\nfunction matchBuild (name) {\n return /\\.node$/.test(name)\n}\n\nfunction parseTuple (name) {\n // Example: darwin-x64+arm64\n var arr = name.split('-')\n if (arr.length !== 2) return\n\n var platform = arr[0]\n var architectures = arr[1].split('+')\n\n if (!platform) return\n if (!architectures.length) return\n if (!architectures.every(Boolean)) return\n\n return { name, platform, architectures }\n}\n\nfunction matchTuple (platform, arch) {\n return function (tuple) {\n if (tuple == null) return false\n if (tuple.platform !== platform) return false\n return tuple.architectures.includes(arch)\n }\n}\n\nfunction compareTuples (a, b) {\n // Prefer single-arch prebuilds over multi-arch\n return a.architectures.length - b.architectures.length\n}\n\nfunction parseTags (file) {\n var arr = file.split('.')\n var extension = arr.pop()\n var tags = { file: file, specificity: 0 }\n\n if (extension !== 'node') return\n\n for (var i = 0; i < arr.length; i++) {\n var tag = arr[i]\n\n if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') {\n tags.runtime = tag\n } else if (tag === 'napi') {\n tags.napi = true\n } else if (tag.slice(0, 3) === 'abi') {\n tags.abi = tag.slice(3)\n } else if (tag.slice(0, 2) === 'uv') {\n tags.uv = tag.slice(2)\n } else if (tag.slice(0, 4) === 'armv') {\n tags.armv = tag.slice(4)\n } else if (tag === 'glibc' || tag === 'musl') {\n tags.libc = tag\n } else {\n continue\n }\n\n tags.specificity++\n }\n\n return tags\n}\n\nfunction matchTags (runtime, abi) {\n return function (tags) {\n if (tags == null) return false\n if (tags.runtime && tags.runtime !== runtime && !runtimeAgnostic(tags)) return false\n if (tags.abi && tags.abi !== abi && !tags.napi) return false\n if (tags.uv && tags.uv !== uv) return false\n if (tags.armv && tags.armv !== armv) return false\n if (tags.libc && tags.libc !== libc) return false\n\n return true\n }\n}\n\nfunction runtimeAgnostic (tags) {\n return tags.runtime === 'node' && tags.napi\n}\n\nfunction compareTags (runtime) {\n // Precedence: non-agnostic runtime, abi over napi, then by specificity.\n return function (a, b) {\n if (a.runtime !== b.runtime) {\n return a.runtime === runtime ? -1 : 1\n } else if (a.abi !== b.abi) {\n return a.abi ? -1 : 1\n } else if (a.specificity !== b.specificity) {\n return a.specificity > b.specificity ? -1 : 1\n } else {\n return 0\n }\n }\n}\n\nfunction isNwjs () {\n return !!(process.versions && process.versions.nw)\n}\n\nfunction isElectron () {\n if (process.versions && process.versions.electron) return true\n if (process.env.ELECTRON_RUN_AS_NODE) return true\n return typeof window !== 'undefined' && window.process && window.process.type === 'renderer'\n}\n\nfunction isAlpine (platform) {\n return platform === 'linux' && fs.existsSync('/etc/alpine-release')\n}\n\n// Exposed for unit tests\n// TODO: move to lib\nload.parseTags = parseTags\nload.matchTags = matchTags\nload.compareTags = compareTags\nload.parseTuple = parseTuple\nload.matchTuple = matchTuple\nload.compareTuples = compareTuples\n","const runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\nif (typeof runtimeRequire.addon === 'function') { // if the platform supports native resolving prefer that\n module.exports = runtimeRequire.addon.bind(runtimeRequire)\n} else { // else use the runtime version here\n module.exports = require('./node-gyp-build.js')\n}\n","'use strict';\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 */\nconst mask = (source, mask, output, offset, length) => {\n for (var 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 */\nconst unmask = (buffer, mask) => {\n // Required until https://github.com/nodejs/node/issues/9006 is resolved.\n const length = buffer.length;\n for (var i = 0; i < length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n};\n\nmodule.exports = { mask, unmask };\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'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","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n * @param {Boolean} [isServer=false] Create the instance in either server or\n * client mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(options, isServer, maxPayload) {\n this._maxPayload = maxPayload | 0;\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._isServer = !!isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0x00) { // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) { // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) { // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80 || // overlong\n buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0 // surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80 || // overlong\n buf[i] === 0xf4 && buf[i + 1] > 0x8f || buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = isValidUTF8;\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\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 {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\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 === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst closeTimeout = 30 * 1000;\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\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 {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * 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 {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch (e) {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate(\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n false,\n opts.maxPayload\n );\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n let chunk;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written and `readable.read()`\n // will return `null`. If instead, the socket is paused, any possible buffered\n // data will be read as a single chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n (chunk = websocket._socket.read()) !== null\n ) {\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","/* 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","'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","/* 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","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","import * as Automerge from '@automerge/automerge';\nimport type {\n WSClientOptions,\n WSDisconnectInfo,\n WSReconnectErrorInfo,\n RPCRequest,\n RPCResponse,\n SyncMessage,\n RPCRequestFromServer\n} from './types';\n\n// Use global WebSocket if available (Browser, Bun, Deno)\nlet GlobalWebSocket: any = undefined;\nif (typeof globalThis !== 'undefined' && (globalThis as any).WebSocket) {\n GlobalWebSocket = (globalThis as any).WebSocket;\n}\n\n// WebSocket.OPEN is always 1\nconst READY_STATE_OPEN = 1;\nconst TOKEN_REFRESH_LEEWAY_MS = 2 * 60 * 1000;\nconst TOKEN_REFRESH_RETRY_MS = 30 * 1000;\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\n\nexport class WSClient {\n private ws: WebSocket | null = null;\n private url: string;\n private sessionId: string;\n private token: string;\n private messageQueue: Array<{ resolve: (value: unknown) => void; reject: (error: Error) => void; id: string }> = [];\n private syncHandlers: Array<(message: SyncMessage) => void> = [];\n private rpcHandlers: Map<string, (params: unknown) => Promise<unknown>> = new Map();\n private eventHandlers: Map<string, Array<(params: unknown) => void>> = new Map();\n private nextRpcId = 1;\n public doc: Automerge.Doc<Record<string, unknown>> = Automerge.init();\n private syncState: Automerge.SyncState = Automerge.initSyncState();\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private tokenRefreshTimer: ReturnType<typeof setTimeout> | null = null;\n private isExplicitlyDisconnected = false;\n\n private options: WSClientOptions;\n\n constructor(options: WSClientOptions) {\n this.options = options;\n this.url = options.url;\n this.sessionId = options.sessionId;\n this.token = options.token;\n }\n\n private clearTokenRefreshTimer(): void {\n if (this.tokenRefreshTimer) {\n clearTimeout(this.tokenRefreshTimer);\n this.tokenRefreshTimer = null;\n }\n }\n\n private decodeBase64Url(payload: string): string {\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4 || 4)) % 4);\n if (typeof atob === 'function') {\n return atob(padded);\n }\n\n const maybeBuffer = (globalThis as unknown as { Buffer?: { from: (data: string, encoding: string) => { toString: (encoding: string) => string } } }).Buffer;\n if (maybeBuffer) {\n return maybeBuffer.from(padded, 'base64').toString('utf8');\n }\n\n throw new Error('No base64 decoder available');\n }\n\n private getTokenExpiryMs(token: string): number | null {\n const parts = token.split('.');\n if (parts.length < 2) {\n return null;\n }\n\n try {\n const payloadRaw = this.decodeBase64Url(parts[1]);\n const payload = JSON.parse(payloadRaw) as { exp?: number };\n if (typeof payload.exp !== 'number' || !Number.isFinite(payload.exp)) {\n return null;\n }\n return payload.exp * 1000;\n } catch {\n return null;\n }\n }\n\n private scheduleTokenRefresh(): void {\n this.clearTokenRefreshTimer();\n if (!this.options.tokenProvider || this.isExplicitlyDisconnected) {\n return;\n }\n\n const expiresAt = this.getTokenExpiryMs(this.token);\n if (!expiresAt) {\n return;\n }\n\n const refreshInMs = Math.max(1_000, expiresAt - Date.now() - TOKEN_REFRESH_LEEWAY_MS);\n const delay = Math.min(refreshInMs, MAX_TIMER_DELAY_MS);\n this.tokenRefreshTimer = setTimeout(() => {\n void this.refreshTokenInBackground();\n }, delay);\n }\n\n private async refreshTokenInBackground(): Promise<void> {\n if (!this.options.tokenProvider || this.isExplicitlyDisconnected) {\n return;\n }\n\n try {\n const refreshedToken = await this.options.tokenProvider();\n if (typeof refreshedToken !== 'string' || refreshedToken.length === 0) {\n throw new Error('Token provider returned no token');\n }\n this.token = refreshedToken;\n this.scheduleTokenRefresh();\n } catch (error) {\n if (this.isExplicitlyDisconnected) {\n return;\n }\n console.warn('[Granular] Token refresh failed, retrying soon:', error);\n this.clearTokenRefreshTimer();\n this.tokenRefreshTimer = setTimeout(() => {\n void this.refreshTokenInBackground();\n }, TOKEN_REFRESH_RETRY_MS);\n }\n }\n\n private async resolveTokenForConnect(): Promise<string> {\n if (!this.options.tokenProvider) {\n return this.token;\n }\n\n const expiresAt = this.getTokenExpiryMs(this.token);\n const shouldRefresh = expiresAt !== null && expiresAt - Date.now() <= TOKEN_REFRESH_LEEWAY_MS;\n if (!shouldRefresh) {\n return this.token;\n }\n\n try {\n const refreshedToken = await this.options.tokenProvider();\n if (typeof refreshedToken !== 'string' || refreshedToken.length === 0) {\n throw new Error('Token provider returned no token');\n }\n this.token = refreshedToken;\n return refreshedToken;\n } catch (error) {\n if (expiresAt > Date.now()) {\n console.warn('[Granular] Token refresh failed, using current token:', error);\n return this.token;\n }\n throw error;\n }\n }\n\n /**\n * Connect to the WebSocket server\n * @returns {Promise<void>} Resolves when connection is open\n */\n async connect(): Promise<void> {\n const token = await this.resolveTokenForConnect();\n this.isExplicitlyDisconnected = false;\n this.scheduleTokenRefresh();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n // Determine WebSocket implementation\n let WebSocketClass = this.options.WebSocketCtor || GlobalWebSocket;\n\n if (!WebSocketClass) {\n try {\n // Try to load 'ws' dynamically for Node.js environments\n // @ts-ignore\n const wsModule = await import('ws');\n WebSocketClass = wsModule.default || wsModule;\n } catch (e) {\n // Ignore, handled below\n }\n }\n\n if (!WebSocketClass) {\n throw new Error('No WebSocket implementation found. If using Node.js, please install \"ws\" and pass the constructor to the SDK options: { WebSocketCtor: WebSocket }.');\n }\n\n return new Promise((resolve, reject) => {\n try {\n // Construct URL with query parameters\n const wsUrl = new URL(this.url);\n wsUrl.searchParams.set('sessionId', this.sessionId);\n wsUrl.searchParams.set('token', token);\n\n // @ts-ignore - Dynamic class usage\n this.ws = new WebSocketClass(wsUrl.toString()) as WebSocket;\n\n if (!this.ws) throw new Error('Failed to create WebSocket');\n\n // Standardize event handlers\n const socket = this.ws as any;\n if (typeof socket.on === 'function') {\n // Node 'ws' style\n socket.on('open', () => {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emit('open', {});\n resolve();\n });\n socket.on('message', (data: any) => {\n try {\n const message = JSON.parse(data.toString());\n this.handleMessage(message);\n } catch (error) {\n console.error('[Granular] Failed to parse message:', error);\n }\n });\n socket.on('error', (error: any) => {\n this.emit('error', error);\n if (socket.readyState !== READY_STATE_OPEN) {\n reject(error);\n }\n });\n socket.on('close', (code: number, reason: unknown) => {\n this.handleDisconnect({\n code,\n reason: this.normalizeReason(reason),\n // ws does not provide wasClean on Node-style close callback\n wasClean: code === 1000,\n });\n });\n } else {\n // Browser WebSocket style\n this.ws!.onopen = () => {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.emit('open', {});\n resolve();\n };\n\n this.ws!.onmessage = (event: MessageEvent) => {\n try {\n const data = event.data;\n const message = JSON.parse(data.toString());\n this.handleMessage(message);\n } catch (error) {\n console.error('[Granular] Failed to parse message:', error);\n }\n };\n\n this.ws!.onerror = (event: Event) => {\n const error = new Error('WebSocket error');\n (error as any).event = event;\n this.emit('error', error);\n if (this.ws?.readyState !== READY_STATE_OPEN) {\n reject(error);\n }\n };\n\n this.ws!.onclose = (event: CloseEvent) => {\n this.handleDisconnect({\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean,\n });\n };\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n\n private normalizeReason(reason: unknown): string | undefined {\n if (reason === null || reason === undefined) return undefined;\n if (typeof reason === 'string') return reason;\n if (typeof reason === 'object' && reason && 'toString' in reason) {\n try {\n const text = String((reason as any).toString());\n return text || undefined;\n } catch {\n return undefined;\n }\n }\n return undefined;\n }\n\n private rejectPending(error: Error): void {\n this.messageQueue.forEach((pending) => pending.reject(error));\n this.messageQueue = [];\n }\n\n private buildDisconnectError(info: WSDisconnectInfo): Error {\n const details = [\n info.code !== undefined ? `code=${info.code}` : undefined,\n info.reason ? `reason=${info.reason}` : undefined,\n ].filter(Boolean).join(', ');\n const suffix = details ? ` (${details})` : '';\n return new Error(`WebSocket disconnected${suffix}`);\n }\n\n private handleDisconnect(close: {\n code?: number;\n reason?: string;\n wasClean?: boolean;\n } = {}): void {\n const reconnectDelayMs = 3000;\n const unexpected = !this.isExplicitlyDisconnected;\n const info: WSDisconnectInfo = {\n code: close.code,\n reason: close.reason,\n wasClean: close.wasClean,\n unexpected,\n timestamp: Date.now(),\n reconnectScheduled: false,\n };\n\n this.ws = null;\n this.emit('close', info);\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (unexpected) {\n const disconnectError = this.buildDisconnectError(info);\n this.rejectPending(disconnectError);\n this.emit('disconnect', info);\n\n info.reconnectScheduled = true;\n info.reconnectDelayMs = reconnectDelayMs;\n\n if (this.options.onUnexpectedClose) {\n try {\n this.options.onUnexpectedClose(info);\n } catch (callbackError) {\n console.error('[Granular] onUnexpectedClose callback failed:', callbackError);\n }\n }\n\n this.reconnectTimer = setTimeout(() => {\n console.log('[Granular] Attempting reconnect...');\n this.connect().catch(error => {\n console.error('[Granular] Reconnect failed:', error);\n const reconnectInfo: WSReconnectErrorInfo = {\n error: error instanceof Error ? error.message : String(error),\n sessionId: this.sessionId,\n timestamp: Date.now(),\n };\n this.emit('reconnect_error', reconnectInfo);\n if (this.options.onReconnectError) {\n try {\n this.options.onReconnectError(reconnectInfo);\n } catch (callbackError) {\n console.error('[Granular] onReconnectError callback failed:', callbackError);\n }\n }\n });\n }, reconnectDelayMs);\n }\n }\n\n private handleMessage(message: unknown): void {\n if (typeof message !== 'object' || message === null) return;\n\n // Debug: Log all incoming messages\n console.log('[Granular DEBUG] Received message:', JSON.stringify(message).slice(0, 500));\n\n // 1. Handle Sync Messages (Automerge)\n if ('type' in message && message.type === 'sync') {\n const syncMessage = message as SyncMessage;\n let bytes: Uint8Array;\n\n try {\n const payload = syncMessage.message || syncMessage.data;\n\n if (typeof payload === 'string') {\n const binaryString = atob(payload);\n const len = binaryString.length;\n bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n } else if (Array.isArray(payload)) {\n bytes = new Uint8Array(payload);\n } else if (payload instanceof Uint8Array) {\n bytes = payload;\n } else {\n return;\n }\n\n console.log('[Granular DEBUG] Applying sync bytes:', bytes.length);\n\n const [newDoc, newSyncState] = Automerge.receiveSyncMessage(\n this.doc,\n this.syncState,\n bytes\n );\n this.doc = newDoc;\n this.syncState = newSyncState;\n\n // DEBUG: Inspect doc after sync\n const docAny = this.doc as any;\n if (docAny.catalog) {\n console.log('[Granular DEBUG] Doc catalog sync applied. Keys in catalog:', Object.keys(docAny.catalog || {}));\n console.log('[Granular DEBUG] RawToolCatalogs:', Object.keys(docAny.catalog.rawToolCatalogs || {}));\n } else {\n console.log('[Granular DEBUG] Doc synced but no catalog yet. Keys in doc:', Object.keys(docAny));\n }\n\n // Notify sync listeners with the new doc\n this.emit('sync', this.doc);\n } catch (e) {\n // Determine if this is a sync protocol error (e.g. wrong format) -> try applyChanges\n // The server broadcasts raw changes using getLastLocalChange, which receiveSyncMessage rejects.\n try {\n console.log('[Granular DEBUG] receiveSyncMessage failed, trying applyChanges...');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [newDoc] = Automerge.applyChanges(this.doc, [bytes!]);\n this.doc = newDoc;\n this.emit('sync', this.doc);\n console.log('[Granular DEBUG] applyChanges succeeded. Doc:', JSON.stringify(Automerge.toJS(this.doc)));\n } catch (applyError) {\n console.warn('[Granular] Failed to apply sync message (both sync & applyChanges)', e, applyError);\n }\n }\n return;\n }\n\n // 1. Handling Automerge Snapshots (Full State)\n if ('type' in message && message.type === 'snapshot') {\n const snapshotMessage = message as { type: string; data: number[] };\n try {\n const bytes = new Uint8Array(snapshotMessage.data);\n console.log('[Granular DEBUG] Loading Automerge session snapshot bytes:', bytes.length);\n this.doc = Automerge.load(bytes);\n this.emit('sync', this.doc);\n console.log('[Granular DEBUG] Automerge session snapshot loaded. Doc:', JSON.stringify(Automerge.toJS(this.doc)));\n } catch (e) {\n console.warn('[Granular] Failed to load snapshot message', e);\n }\n return;\n }\n\n // 1.5 Handle Automerge Changes (Raw)\n if ('type' in message && message.type === 'change') {\n const changeMessage = message as { type: string; data: number[] };\n try {\n const bytes = new Uint8Array(changeMessage.data);\n // console.log('[Granular DEBUG] Applying change bytes:', bytes.length);\n const [newDoc] = Automerge.applyChanges(this.doc, [bytes]);\n this.doc = newDoc;\n this.emit('sync', this.doc);\n // console.log('[Granular DEBUG] Valid change applied. Doc keys:', Object.keys(Automerge.toJS(this.doc)));\n } catch (e) {\n console.warn('[Granular] Failed to apply change message', e);\n }\n return;\n }\n\n // 2. Handle RPC Responses (Results/Errors from calls we made)\n if ('type' in message && (message.type === 'rpc_result' || message.type === 'rpc_error')) {\n const response = message as RPCResponse;\n const pending = this.messageQueue.find((q) => q.id === response.id);\n if (pending) {\n if (response.type === 'rpc_error') {\n pending.reject(\n new Error(`RPC error: ${response.error?.message || 'Unknown error'}`)\n );\n } else {\n pending.resolve(response.result);\n }\n this.messageQueue = this.messageQueue.filter((q) => q.id !== response.id);\n }\n return;\n }\n\n // 3. Handle Incoming RPC Requests (Server calls us, e.g. effect.invoke)\n if ('type' in message && message.type === 'rpc' && 'method' in message && 'id' in message) {\n const request = message as RPCRequestFromServer;\n this.handleIncomingRpc(request).catch((error) => {\n console.error('[Granular] Error handling incoming RPC:', error);\n });\n return;\n }\n\n // 4. Handle Generic Events\n if ('type' in message && typeof message.type === 'string') {\n this.emit(message.type, message);\n }\n }\n\n /**\n * Make an RPC call to the server\n * @param {string} method - RPC method name\n * @param {unknown} params - Request parameters\n * @returns {Promise<unknown>} Response result\n * @throws {Error} If connection is closed or timeout occurs\n */\n async call(method: string, params: unknown): Promise<unknown> {\n if (!this.ws || this.ws.readyState !== READY_STATE_OPEN) {\n throw new Error('WebSocket not connected');\n }\n\n const id = `rpc-${this.nextRpcId++}`;\n const request: RPCRequest = {\n type: 'rpc',\n method,\n params,\n id,\n };\n\n return new Promise((resolve, reject) => {\n this.messageQueue.push({ resolve, reject, id });\n\n this.ws!.send(JSON.stringify(request));\n\n // Timeout after 30 seconds\n setTimeout(() => {\n const pending = this.messageQueue.find((q) => q.id === id);\n if (pending) {\n this.messageQueue = this.messageQueue.filter((q) => q.id !== id);\n reject(new Error(`RPC timeout: ${method}`));\n }\n }, 30000);\n });\n }\n\n private async handleIncomingRpc(request: RPCRequestFromServer): Promise<void> {\n const handler = this.rpcHandlers.get(request.method);\n\n if (!handler) {\n const errorResponse = {\n type: 'rpc_error',\n id: request.id,\n error: {\n code: -32601,\n message: `Method not found: ${request.method}`,\n },\n };\n this.ws?.send(JSON.stringify(errorResponse));\n return;\n }\n\n try {\n const result = await handler(request.params);\n\n // Reverse effect invocations usually resolve by returning a value directly.\n // Only tool-era compatibility flows manage their own response frames.\n if (request.method !== 'tool.invoke') {\n const successResponse = {\n type: 'rpc_result',\n id: request.id,\n result,\n };\n this.ws?.send(JSON.stringify(successResponse));\n }\n } catch (error) {\n const errorResponse = {\n type: 'rpc_error',\n id: request.id,\n error: {\n code: -32000,\n message: error instanceof Error ? error.message : 'Unknown error',\n },\n };\n this.ws?.send(JSON.stringify(errorResponse));\n }\n }\n\n /**\n * Subscribe to client events\n * @param {string} event - Event name\n * @param {Function} handler - Event handler\n */\n on(event: string, handler: (params: unknown) => void): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, []);\n }\n this.eventHandlers.get(event)!.push(handler);\n }\n\n /**\n * Register an RPC handler for incoming server requests\n * @param {string} method - RPC method name\n * @param {Function} handler - Handler function\n */\n registerRpcHandler(method: string, handler: (params: unknown) => Promise<unknown>): void {\n this.rpcHandlers.set(method, handler);\n }\n\n /**\n * Unsubscribe from client events\n * @param {string} event - Event name\n * @param {Function} handler - Handler to remove\n */\n off(event: string, handler: (params: unknown) => void): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n this.eventHandlers.set(\n event,\n handlers.filter((h) => h !== handler)\n );\n }\n }\n\n /**\n * Emit an event locally\n * @param {string} event - Event name\n * @param params - Event data\n */\n emit(event: string, params: unknown): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach(handler => handler(params));\n }\n }\n\n /**\n * Disconnect the WebSocket and clear state\n */\n disconnect(): void {\n this.isExplicitlyDisconnected = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.clearTokenRefreshTimer();\n\n if (this.ws) {\n this.ws.close(1000, 'Client disconnect');\n this.ws = null;\n }\n this.rejectPending(new Error('Client explicitly disconnected'));\n this.rpcHandlers.clear();\n this.emit('disconnect', {});\n }\n}\n","import { WSClient } from './ws-client';\nimport type {\n Job,\n JobStatus,\n Prompt,\n ToolWithHandler,\n ToolSchema,\n PublishToolsResult,\n ToolHandler,\n InstanceToolHandler,\n ToolInvokeParams,\n EffectHandlerContext,\n DomainState,\n JobSubmitResult,\n ToolInfo,\n ToolsChangedEvent,\n EffectInfo,\n EffectsChangedEvent,\n} from './types';\nimport type { Doc } from '@automerge/automerge/slim';\n\n// Re-export types that were previously defined here\nexport { ToolWithHandler, ToolSchema, PublishToolsResult, ToolHandler, InstanceToolHandler, DomainState, JobSubmitResult };\n\nexport class Session {\n protected client: WSClient;\n private clientId: string;\n private jobsMap: Map<string, JobImplementation> = new Map();\n private eventListeners: Map<string, Array<(data: unknown) => void>> = new Map();\n private toolHandlers: Map<string, ToolHandler | InstanceToolHandler> = new Map();\n /** Tracks which tools are instance methods (className set, not static) */\n private instanceTools: Set<string> = new Set();\n private currentDomainRevision: string | null = null;\n /** Local effect registry: name → full ToolWithHandler */\n private effects: Map<string, ToolWithHandler> = new Map();\n /** Last known tools for diffing */\n private lastKnownTools: Map<string, ToolInfo> = new Map();\n\n constructor(client: WSClient, clientId?: string) {\n this.client = client;\n this.clientId = clientId || `client_${Date.now()}`;\n this.setupEventHandlers();\n this.setupToolInvokeHandler();\n }\n\n private buildLegacyEffectContext(): EffectHandlerContext {\n return {\n effectClientId: this.clientId,\n sandboxId: '',\n environmentId: '',\n sessionId: '',\n user: {\n subjectId: '',\n },\n };\n }\n\n // --- Public API ---\n\n get document(): Doc<Record<string, unknown>> {\n return this.client.doc;\n }\n\n get domainRevision(): string | null {\n return this.currentDomainRevision;\n }\n\n /**\n * Make a raw RPC call to the session's Durable Object.\n *\n * Use this when you need to call an RPC method that doesn't have a\n * dedicated wrapper method on the Session/Environment class.\n *\n * @param method - RPC method name (e.g. 'domain.fetchPackagePart')\n * @param params - Request parameters\n * @returns The raw RPC response\n *\n * @example\n * ```typescript\n * const result = await env.rpc('domain.fetchPackagePart', {\n * moduleSpecifier: '@sandbox/domain',\n * part: 'types',\n * });\n * ```\n */\n async rpc<T = unknown>(method: string, params: Record<string, unknown> = {}): Promise<T> {\n return this.client.call(method, params) as Promise<T>;\n }\n\n /**\n * Send client hello to establish the session\n */\n async hello(): Promise<{\n ok: boolean;\n environmentId?: string;\n docId?: string;\n graphContainerStatus?: { lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' };\n }> {\n const result = await this.client.call('client.hello', {\n clientId: this.clientId,\n protocolVersion: '2.0',\n });\n return result as {\n ok: boolean;\n environmentId?: string;\n docId?: string;\n graphContainerStatus?: { lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' };\n };\n }\n\n async publishTools(tools: ToolWithHandler[], revision = '1.0.0'): Promise<PublishToolsResult> {\n void tools;\n void revision;\n throw new Error(\n 'Environment-scoped effect publication was removed. Declare effects in the manifest and register live handlers with granular.registerEffects(environment.sandboxId, effects).',\n );\n }\n\n async publishEffect(effect: ToolWithHandler): Promise<PublishToolsResult> {\n void effect;\n throw new Error(\n 'Environment-scoped effect publication was removed. Use granular.registerEffect(environment.sandboxId, effect).',\n );\n }\n\n async publishEffects(effects: ToolWithHandler[]): Promise<PublishToolsResult> {\n void effects;\n throw new Error(\n 'Environment-scoped effect publication was removed. Use granular.registerEffects(environment.sandboxId, effects).',\n );\n }\n\n async unpublishEffect(name: string): Promise<PublishToolsResult> {\n void name;\n throw new Error(\n 'Environment-scoped effect publication was removed. Use granular.unregisterEffect(environment.sandboxId, effectName).',\n );\n }\n\n async unpublishAllEffects(): Promise<PublishToolsResult> {\n throw new Error(\n 'Environment-scoped effect publication was removed. Use granular.unregisterAllEffects(environment.sandboxId).',\n );\n }\n\n /**\n * Submit a job to execute code in the sandbox.\n *\n * The code can import typed classes from `./sandbox-tools`:\n * ```typescript\n * import { Author, Book, global_search } from './sandbox-tools';\n *\n * const tolkien = await Author.find({ id: 'tolkien' });\n * const bio = await tolkien.get_bio({ detailed: true });\n * const books = await tolkien.get_books();\n * ```\n *\n * Effect calls (instance methods, static methods, global functions) trigger\n * `effect.invoke` RPC back to the sandbox effect host, where the registered handlers\n * execute locally and return the result to the sandbox.\n */\n async submitJob(code: string, domainRevision?: string): Promise<Job> {\n const revision = domainRevision\n || this.currentDomainRevision\n || (this.client.doc as any)?.domain?.active\n || undefined;\n if (!revision) {\n throw new Error('No domain revision available. Register live effects or ensure the build schema is activated.');\n }\n\n const result = await this.client.call('job.submit', {\n domainRevision: revision,\n code,\n }) as { jobId?: string };\n\n if (!result.jobId) {\n throw new Error('Failed to submit job: no jobId returned');\n }\n\n const job = new JobImplementation(result.jobId, this.client);\n this.jobsMap.set(result.jobId, job);\n return job;\n }\n\n /**\n * Register a handler for a specific tool.\n * @param isInstance - If true, handler will receive (id, params) for instance method dispatch.\n */\n registerToolHandler(name: string, handler: ToolHandler | InstanceToolHandler, isInstance = false): void {\n this.toolHandlers.set(name, handler);\n if (isInstance) {\n this.instanceTools.add(name);\n } else {\n this.instanceTools.delete(name);\n }\n }\n\n /**\n * Respond to a prompt request from the sandbox\n */\n async answerPrompt(promptId: string, answer: unknown): Promise<void> {\n await this.client.call('prompt.answer', { promptId, value: answer });\n }\n\n /**\n * Get the current list of available effects.\n * Consolidates effect declarations and live availability for the session.\n */\n getEffects(): EffectInfo[] {\n const doc: any = this.client.doc;\n const toolMap = new Map<string, ToolInfo>();\n\n // 1. Seed from domain packages (always present after domain activation)\n const domainPkg = doc.domain?.packages?.domain;\n if (domainPkg?.tools && Array.isArray(domainPkg.tools)) {\n for (const tool of domainPkg.tools) {\n if (!tool?.name) continue;\n toolMap.set(tool.name, {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n className: tool.className || undefined,\n static: tool.static || false,\n ready: false,\n publishedAt: undefined,\n });\n }\n }\n\n // 2. Overlay with live catalogs (has handler readiness info)\n const catalogs = doc.catalog?.rawToolCatalogs || {};\n for (const [clientId, catalog] of Object.entries(catalogs)) {\n const cat = catalog as any;\n if (!cat.tools) continue;\n\n for (const tool of cat.tools) {\n if (!tool?.name) continue;\n const existing = toolMap.get(tool.name);\n // Skip if we already have a newer catalog entry\n if (existing?.publishedAt && cat.publishedAt && existing.publishedAt > cat.publishedAt) continue;\n\n const isLocal = clientId === this.clientId;\n const ready = isLocal\n ? (this.effects.has(tool.name) || this.toolHandlers.has(tool.name) || this.instanceTools.has(tool.name))\n : true;\n\n toolMap.set(tool.name, {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n className: tool.className || existing?.className,\n static: tool.static || existing?.static || false,\n clientId,\n ready,\n publishedAt: cat.publishedAt,\n });\n }\n }\n\n return Array.from(toolMap.values());\n }\n\n /**\n * Backwards-compatible alias for `getEffects()`.\n */\n getTools(): ToolInfo[] {\n return this.getEffects();\n }\n\n /**\n * Subscribe to effect changes (added, removed, updated).\n * @param callback - Function called with change events\n * @returns Unsubscribe function\n */\n onEffectsChanged(callback: (event: EffectsChangedEvent) => void): () => void {\n const handler = (data: unknown) => callback(data as EffectsChangedEvent);\n if (!this.eventListeners.has('effects:changed')) {\n this.eventListeners.set('effects:changed', []);\n }\n this.eventListeners.get('effects:changed')!.push(handler);\n\n return () => {\n const listeners = this.eventListeners.get('effects:changed');\n if (listeners) {\n this.eventListeners.set('effects:changed', listeners.filter(h => h !== handler));\n }\n };\n }\n\n /**\n * Backwards-compatible alias for `onEffectsChanged()`.\n */\n onToolsChanged(callback: (event: ToolsChangedEvent) => void): () => void {\n const handler = (data: unknown) => callback(data as ToolsChangedEvent);\n if (!this.eventListeners.has('tools:changed')) {\n this.eventListeners.set('tools:changed', []);\n }\n this.eventListeners.get('tools:changed')!.push(handler);\n\n // Return unsubscribe function\n return () => {\n const listeners = this.eventListeners.get('tools:changed');\n if (listeners) {\n this.eventListeners.set('tools:changed', listeners.filter(h => h !== handler));\n }\n };\n }\n\n /**\n * Get the current domain state and available tools\n */\n async getDomain(): Promise<DomainState> {\n return this.client.call('domain.getSummary', {}) as Promise<DomainState>;\n }\n\n /**\n * Fetch a domain package part from the backend (no fallback).\n */\n private async fetchDomainPart(part: 'types' | 'docs'): Promise<string> {\n const result = await this.client.call('domain.fetchPackagePart', {\n moduleSpecifier: '@sandbox/domain',\n part,\n }) as { content?: string };\n return result?.content ?? '';\n }\n\n /**\n * Get TypeScript class declarations for the current domain (for LLM/code gen).\n */\n async getDomainTypes(): Promise<string> {\n return this.fetchDomainPart('types');\n }\n\n /**\n * Get Markdown documentation for the current domain (human-readable).\n */\n async getDomainDocs(): Promise<string> {\n return this.fetchDomainPart('docs');\n }\n\n /**\n * Get domain documentation for LLMs. Returns types (preferred) or fallback.\n */\n async getDomainDocumentation(): Promise<string> {\n const types = await this.getDomainTypes();\n if (types && (types.includes('export declare class') || types.includes('export async function'))) {\n return types;\n }\n const summary = await this.getDomain();\n return this.generateFallbackDocs(summary);\n }\n\n /**\n * Generate markdown documentation from the domain summary.\n * Class-aware: groups tools by class with property/relationship info.\n */\n private generateFallbackDocs(summary: DomainState): string {\n const classes = (summary as any).classes as Record<string, any> | undefined;\n const globalTools = (summary as any).globalTools as any[] | undefined;\n const tools = summary.tools || [];\n\n // If we have class data, produce class-aware docs\n if (classes && Object.keys(classes).length > 0) {\n let docs = '# Domain Documentation\\n\\n';\n docs += 'Import classes and tools from `./sandbox-tools`:\\n\\n';\n\n const classNames = Object.keys(classes).map(\n (c) => c.charAt(0).toUpperCase() + c.slice(1),\n );\n const globalNames = (globalTools || []).map((t: any) => t.name);\n const allImports = [...classNames, ...globalNames].join(', ');\n docs += `\\`\\`\\`typescript\\nimport { ${allImports} } from \"./sandbox-tools\";\\n\\`\\`\\`\\n\\n`;\n\n for (const [className, cls] of Object.entries(classes)) {\n const TsName = className.charAt(0).toUpperCase() + className.slice(1);\n docs += `## ${TsName}\\n\\n`;\n if (cls.description) docs += `${cls.description}\\n\\n`;\n\n if (cls.properties?.length > 0) {\n docs += '**Properties:**\\n';\n for (const p of cls.properties) {\n docs += `- \\`${p.name}\\`${p.description ? ': ' + p.description : ''}\\n`;\n }\n docs += '\\n';\n }\n\n if (cls.relationships?.length > 0) {\n docs += '**Relationships:**\\n';\n for (const r of cls.relationships) {\n const fModel = r.foreignModel?.charAt(0).toUpperCase() + r.foreignModel?.slice(1);\n docs += `- \\`${r.localSubmodel}\\` → ${fModel} (${r.kind})\\n`;\n }\n docs += '\\n';\n }\n\n if (cls.methods?.length > 0) {\n docs += '**Methods:**\\n';\n for (const m of cls.methods) {\n docs += `- \\`${TsName}.${m.name}(input)\\``;\n if (m.description) docs += `: ${m.description}`;\n docs += '\\n';\n if (m.inputSchema?.properties) {\n docs += ' ```json\\n ' + JSON.stringify(m.inputSchema, null, 2).replace(/\\n/g, '\\n ') + '\\n ```\\n';\n }\n }\n docs += '\\n';\n }\n }\n\n if (globalTools && globalTools.length > 0) {\n docs += '## Global Effects\\n\\n';\n for (const tool of globalTools) {\n docs += `### ${tool.name}\\n\\n`;\n if (tool.description) docs += `${tool.description}\\n\\n`;\n if (tool.inputSchema) {\n docs += '**Input Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.inputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n }\n }\n\n return docs;\n }\n\n // Legacy flat fallback\n if (!tools || tools.length === 0) {\n return 'No effects available in this domain.';\n }\n\n let docs = '# Available Effects\\n\\n';\n docs += 'Import effects from `./sandbox-tools` and call them with await:\\n\\n';\n docs += '```typescript\\nimport { tools } from \"./sandbox-tools\";\\n\\n';\n docs += '// Example:\\n';\n docs += `const result = await tools.${tools[0]?.name || 'example'}(input);\\n`;\n docs += '```\\n\\n';\n\n for (const tool of tools) {\n docs += `## ${tool.name}\\n\\n`;\n if (tool.description) {\n docs += `${tool.description}\\n\\n`;\n }\n if (tool.inputSchema) {\n docs += '**Input Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.inputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n if (tool.outputSchema) {\n docs += '**Output Schema:**\\n```json\\n';\n docs += JSON.stringify(tool.outputSchema, null, 2);\n docs += '\\n```\\n\\n';\n }\n }\n\n return docs;\n }\n\n /**\n * Close the session and disconnect from the sandbox\n */\n async disconnect(): Promise<void> {\n try {\n await this.client.call('client.goodbye', {\n clientId: this.clientId,\n timestamp: Date.now(),\n });\n } catch (error) {\n // Best-effort goodbye: abrupt network failures can prevent RPC.\n }\n this.client.disconnect();\n }\n\n // --- Event Handling ---\n\n /**\n * Subscribe to session events\n */\n on(event: string, handler: (data: unknown) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(handler);\n }\n\n /**\n * Unsubscribe from session events\n */\n off(event: string, handler: (data: unknown) => void): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n this.eventListeners.set(event, handlers.filter(h => h !== handler));\n }\n }\n\n // --- Internal ---\n\n private setupToolInvokeHandler(): void {\n this.client.registerRpcHandler('tool.invoke', async (params: unknown) => {\n const { callId, toolName, input } = params as ToolInvokeParams;\n\n this.emit('effect:invoke', { callId, effectKey: toolName, toolName, input });\n this.emit('tool:invoke', { callId, toolName, input });\n\n const handler = this.toolHandlers.get(toolName);\n if (!handler) {\n // Send error result back\n await this.client.call('tool.result', {\n callId,\n error: { code: 'TOOL_NOT_FOUND', message: `Tool handler not found: ${toolName}` },\n });\n return;\n }\n\n try {\n let result: unknown;\n const invocationContext = this.buildLegacyEffectContext();\n // Instance methods receive _objectId from the sandbox runtime\n if (this.instanceTools.has(toolName) && input && typeof input === 'object' && '_objectId' in input) {\n const { _objectId, ...restParams } = input as { _objectId: string;[key: string]: any };\n result = await (handler as InstanceToolHandler)(_objectId, restParams, invocationContext);\n } else {\n result = await (handler as ToolHandler)(input, invocationContext);\n }\n this.emit('effect:result', { callId, effectKey: toolName, result });\n this.emit('tool:result', { callId, result });\n\n // Send result back to sandbox\n await this.client.call('tool.result', {\n callId,\n result,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.emit('effect:result', { callId, effectKey: toolName, error: errorMessage });\n this.emit('tool:result', { callId, error: errorMessage });\n\n await this.client.call('tool.result', {\n callId,\n error: { code: 'TOOL_EXECUTION_FAILED', message: errorMessage },\n });\n }\n });\n }\n\n private setupEventHandlers(): void {\n // Pipe client events to session events\n this.client.on('sync', (doc: unknown) => {\n this.emit('sync', doc);\n this.checkForToolChanges();\n });\n this.client.on('prompt', (prompt: unknown) => this.emit('prompt', prompt));\n this.client.on('disconnect', (payload: unknown) => this.emit('disconnect', payload || {}));\n\n // Job status updates\n this.client.on('job.status', (data: unknown) => {\n this.emit('job:status', data);\n });\n\n // Exec events\n this.client.on('exec.completed', (data: unknown) => {\n this.emit('exec:completed', data);\n });\n this.client.on('exec.progress', (data: unknown) => {\n this.emit('exec:progress', data);\n });\n }\n\n protected emit(event: string, data: unknown): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n handlers.forEach(h => h(data));\n }\n }\n\n /**\n * Check for changes in the effect catalog and emit change events if needed.\n */\n private checkForToolChanges() {\n const currentTools = this.getEffects();\n const currentMap = new Map(currentTools.map(t => [t.name, t]));\n\n const added: string[] = [];\n const removed: string[] = [];\n\n // Check for added or updated tools\n for (const [name, tool] of currentMap) {\n if (!this.lastKnownTools.has(name)) {\n added.push(name);\n }\n }\n\n // Check for removed tools\n for (const name of this.lastKnownTools.keys()) {\n if (!currentMap.has(name)) {\n removed.push(name);\n }\n }\n\n if (added.length > 0 || removed.length > 0) {\n this.lastKnownTools = currentMap;\n this.emit('effects:changed', {\n effects: currentTools,\n tools: currentTools,\n added,\n removed\n });\n this.emit('tools:changed', {\n tools: currentTools,\n added,\n removed\n });\n }\n }\n}\n\n// --- Job Implementation ---\n\nclass JobImplementation implements Job {\n public id: string;\n public client: WSClient;\n public status: JobStatus = 'queued';\n\n private _resultPromise: Promise<unknown>;\n private _resolveResult!: (value: unknown) => void;\n private _rejectResult!: (reason: unknown) => void;\n private eventListeners: Map<string, Array<(data: unknown) => void>> = new Map();\n\n constructor(id: string, client: WSClient) {\n this.id = id;\n this.client = client;\n\n this._resultPromise = new Promise((resolve, reject) => {\n this._resolveResult = resolve;\n this._rejectResult = reject;\n });\n\n // Listen to exec events\n this.client.on('exec.completed', (data: unknown) => {\n const execData = data as { execId?: string; jobId?: string; result?: unknown; error?: unknown };\n if (execData.execId === id || execData.jobId === id) {\n this.status = 'succeeded';\n this.emit('status', this.status);\n if (execData.error) {\n this._rejectResult(execData.error);\n } else {\n this._resolveResult(execData.result);\n }\n }\n });\n\n this.client.on('exec.progress', (data: unknown) => {\n const progressData = data as { execId?: string; jobId?: string; stdout?: string; stderr?: string };\n if (progressData.execId === id || progressData.jobId === id) {\n if (progressData.stdout) {\n this.emit('stdout', progressData.stdout);\n }\n if (progressData.stderr) {\n this.emit('stderr', progressData.stderr);\n }\n }\n });\n\n // Also listen to specific job events if available\n this.client.on(`job.${id}.status`, (status: unknown) => {\n this.status = status as JobStatus;\n this.emit('status', status);\n });\n\n this.client.on(`job.${id}.stdout`, (line: unknown) => {\n this.emit('stdout', line);\n });\n\n this.client.on(`job.${id}.stderr`, (line: unknown) => {\n this.emit('stderr', line);\n });\n\n this.client.on(`job.${id}.result`, (result: unknown) => {\n this.status = 'succeeded';\n this._resolveResult(result);\n });\n\n this.client.on(`job.${id}.error`, (error: unknown) => {\n this.status = 'failed';\n this._rejectResult(error);\n });\n\n // Listen for job.completed and job.failed events (generic events from backend)\n this.client.on('job.completed', (data: unknown) => {\n const jobData = data as { jobId?: string; result?: unknown };\n if (jobData.jobId === id) {\n this.status = 'succeeded';\n this.emit('status', this.status);\n this._resolveResult(jobData.result);\n }\n });\n\n this.client.on('job.failed', (data: unknown) => {\n const jobData = data as { jobId?: string; error?: unknown };\n if (jobData.jobId === id) {\n this.status = 'failed';\n this.emit('status', this.status);\n this._rejectResult(jobData.error || new Error('Job failed'));\n }\n });\n\n // Live tool call tracking (broadcast by backend to all clients)\n this.client.on('tool.call.start', (data: unknown) => {\n const d = data as { jobId?: string; callId?: string; toolName?: string; input?: unknown; timestamp?: number };\n if (d.jobId === id) {\n this.emit('toolCallStart', { callId: d.callId, toolName: d.toolName, input: d.input, timestamp: d.timestamp });\n }\n });\n\n this.client.on('tool.call.end', (data: unknown) => {\n const d = data as { jobId?: string; callId?: string; toolName?: string; result?: unknown; error?: string; durationMs?: number; timestamp?: number };\n if (d.jobId === id) {\n this.emit('toolCallEnd', { callId: d.callId, toolName: d.toolName, result: d.result, error: d.error, durationMs: d.durationMs, timestamp: d.timestamp });\n }\n });\n }\n\n get result(): Promise<unknown> {\n return this._resultPromise;\n }\n\n on(event: string, handler: (data: unknown) => void): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, []);\n }\n this.eventListeners.get(event)!.push(handler);\n }\n\n protected emit(event: string, data: unknown): void {\n const handlers = this.eventListeners.get(event);\n if (handlers) {\n handlers.forEach(h => h(data));\n }\n }\n}\n","import type { EndpointMode } from \"./types\";\n\nexport const LOCAL_API_URL = \"ws://localhost:8787/granular\";\nexport const PRODUCTION_API_URL = \"wss://api.granular.dev/v2/ws\";\n\nexport const LOCAL_AUTH_URL = \"http://localhost:3000\";\nexport const PRODUCTION_AUTH_URL = \"https://app.granular.software\";\n\ntype ResolvedEndpointMode = \"local\" | \"production\";\n\nfunction readEnv(name: string): string | undefined {\n if (typeof process === \"undefined\" || !process.env) return undefined;\n return process.env[name];\n}\n\nfunction normalizeMode(value?: string): EndpointMode | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === \"local\") return \"local\";\n if (normalized === \"prod\" || normalized === \"production\") return \"production\";\n if (normalized === \"auto\") return \"auto\";\n return undefined;\n}\n\nfunction isTruthy(value?: string): boolean {\n if (!value) return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\nexport function resolveEndpointMode(explicitMode?: EndpointMode): ResolvedEndpointMode {\n const explicit = normalizeMode(explicitMode);\n if (explicit === \"local\" || explicit === \"production\") {\n return explicit;\n }\n\n const envMode = normalizeMode(readEnv(\"GRANULAR_ENDPOINT_MODE\") || readEnv(\"GRANULAR_ENV\"));\n if (envMode === \"local\" || envMode === \"production\") {\n return envMode;\n }\n\n if (isTruthy(readEnv(\"GRANULAR_USE_LOCAL_ENDPOINTS\")) || isTruthy(readEnv(\"GRANULAR_LOCAL\"))) {\n return \"local\";\n }\n if (isTruthy(readEnv(\"GRANULAR_USE_PRODUCTION_ENDPOINTS\")) || isTruthy(readEnv(\"GRANULAR_PROD\"))) {\n return \"production\";\n }\n\n return readEnv(\"NODE_ENV\") === \"development\" ? \"local\" : \"production\";\n}\n\nexport function resolveApiUrl(explicitApiUrl?: string, mode?: EndpointMode): string {\n if (explicitApiUrl) {\n return explicitApiUrl;\n }\n\n return resolveEndpointMode(mode) === \"local\" ? LOCAL_API_URL : PRODUCTION_API_URL;\n}\n\nexport function resolveAuthUrl(explicitAuthUrl?: string, mode?: EndpointMode): string {\n if (explicitAuthUrl) {\n return explicitAuthUrl;\n }\n\n return resolveEndpointMode(mode) === \"local\" ? LOCAL_AUTH_URL : PRODUCTION_AUTH_URL;\n}\n","import { WSClient } from './ws-client';\nimport { Session, ToolWithHandler, PublishToolsResult } from './session';\nimport { resolveApiUrl } from './endpoints';\nimport type {\n AccessTokenProvider,\n GranularOptions,\n ConnectOptions,\n RecordUserOptions,\n User,\n Subject,\n Sandbox,\n SandboxListResponse,\n CreateSandboxData,\n PermissionProfile,\n PermissionProfileListResponse,\n CreatePermissionProfileData,\n EnvironmentData,\n EnvironmentListResponse,\n CreateEnvironmentData,\n Assignment,\n AssignmentListResponse,\n DeleteResponse,\n GraphQLResult,\n RelationshipInfo,\n ModelRef,\n DefineRelationshipOptions,\n ManifestContent,\n ManifestOperation,\n ManifestPropertySpec,\n ManifestImport,\n RecordObjectOptions,\n RecordObjectResult,\n ToolInfo,\n ToolSchema,\n ToolsChangedEvent,\n WSDisconnectInfo,\n WSReconnectErrorInfo,\n} from './types';\n\n// ── Built-in modules ──\n\n/**\n * Standard modules: base types available via `imports: [{ alias: \"@std\", name: \"standard_modules\" }]`\n */\nconst STANDARD_MODULES_OPERATIONS: ManifestOperation[] = [\n { create: 'entity', has: { id: { value: 'auto-generated' }, createdAt: { value: undefined } } },\n { create: 'class', extends: 'entity', has: {} },\n { create: 'user', extends: 'entity', has: { email: { value: undefined }, firstName: { value: undefined }, lastName: { value: undefined } } },\n { create: 'company', extends: 'entity', has: { name: { value: undefined }, website: { value: undefined } } },\n { create: 'string', has: { value: { value: undefined } } },\n { create: 'number', has: { value: { value: 0 } } },\n { create: 'boolean', has: { value: { value: false } } },\n { create: 'tool_parameter', has: { name: { value: undefined }, type: { value: 'string' }, description: { value: undefined }, required: { value: false } } },\n];\n\n/**\n * Registry of built-in modules that can be imported in manifests\n */\nconst BUILTIN_MODULES: Record<string, ManifestOperation[]> = {\n 'standard_modules': STANDARD_MODULES_OPERATIONS,\n};\n\nfunction computeEffectKey(effect: {\n name: string;\n className?: string | null;\n static?: boolean;\n}): string {\n const attachedClass = effect.className?.trim();\n if (!attachedClass) {\n return `global:${effect.name}`;\n }\n return effect.static\n ? `class:${attachedClass}:static:${effect.name}`\n : `class:${attachedClass}:instance:${effect.name}`;\n}\n\nfunction buildEffectHostUrl(\n apiUrl: string,\n sandboxId: string,\n effectClientId: string,\n clientId: string,\n): string {\n const url = new URL(apiUrl);\n\n if (url.pathname.endsWith('/granular/ws/connect')) {\n url.pathname = url.pathname.replace(/\\/ws\\/connect$/, '/effects/connect');\n } else if (url.pathname.endsWith('/granular')) {\n url.pathname = `${url.pathname.replace(/\\/$/, '')}/effects/connect`;\n } else if (url.pathname.endsWith('/v2/ws/connect')) {\n url.pathname = url.pathname.replace(/\\/ws\\/connect$/, '/effects/connect');\n } else if (url.pathname.endsWith('/v2/ws')) {\n url.pathname = url.pathname.replace(/\\/ws$/, '/effects/connect');\n } else if (url.pathname.endsWith('/ws/connect')) {\n url.pathname = url.pathname.replace(/\\/ws\\/connect$/, '/effects/connect');\n } else if (url.pathname.endsWith('/ws')) {\n url.pathname = url.pathname.replace(/\\/ws$/, '/effects/connect');\n } else {\n url.pathname = '/granular/effects/connect';\n }\n\n url.search = '';\n url.hash = '';\n url.searchParams.set('sandboxId', sandboxId);\n url.searchParams.set('effectClientId', effectClientId);\n url.searchParams.set('clientId', clientId);\n return url.toString();\n}\n\ninterface SandboxEffectHost {\n sandboxId: string;\n effectClientId: string;\n clientId: string;\n wsClient: WSClient;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n}\n\n/**\n * Environment represents a connected session to a sandbox for a specific user.\n *\n * After connecting, you can:\n * 1. Define your domain ontology via `applyManifest()` (classes, properties, relationships)\n * 2. Record object instances via `recordObject()` (with fields and relationship attachments)\n * 3. Register sandbox-scoped effects via `granular.registerEffect()` / `granular.registerEffects()`\n * 4. Submit jobs via `submitJob()` that import auto-generated typed classes from `./sandbox-tools`\n * 5. Execute GraphQL queries via `graphql()` (authenticated automatically)\n * 6. List available effects via `getEffects()` and listen for updates via `onEffectsChanged()`\n *\n * Tool calls from the sandbox automatically invoke your handlers via reverse-RPC.\n *\n * Object IDs are unique per class. Internally, the graph path is `{className}_{id}`\n * (e.g., `author_tolkien`). Use `Environment.toGraphPath()` and\n * `Environment.extractIdFromGraphPath()` for conversions.\n */\nexport class Environment extends Session {\n private envData: EnvironmentData;\n private _apiKey: string;\n private _apiEndpoint: string;\n\n constructor(client: WSClient, envData: EnvironmentData, clientId: string, apiKey: string, apiEndpoint: string) {\n super(client, clientId);\n this.envData = envData;\n this._apiKey = apiKey;\n this._apiEndpoint = apiEndpoint;\n }\n\n /** The environment ID */\n get environmentId(): string {\n return this.envData.environmentId;\n }\n\n /** The sandbox ID */\n get sandboxId(): string {\n return this.envData.sandboxId;\n }\n\n /** The subject ID */\n get subjectId(): string {\n return this.envData.subjectId;\n }\n\n /** The permission profile ID */\n get permissionProfileId(): string {\n return this.envData.permissionProfileId;\n }\n\n /** The GraphQL API endpoint URL */\n get apiEndpoint(): string {\n return this._apiEndpoint;\n }\n\n private getRuntimeBaseUrl(): string {\n try {\n const endpoint = new URL(this._apiEndpoint);\n const graphqlSuffix = '/orchestrator/graphql';\n if (endpoint.pathname.endsWith(graphqlSuffix)) {\n endpoint.pathname = endpoint.pathname.slice(0, -graphqlSuffix.length);\n } else if (endpoint.pathname.endsWith('/graphql')) {\n endpoint.pathname = endpoint.pathname.slice(0, -'/graphql'.length);\n }\n endpoint.search = '';\n endpoint.hash = '';\n return endpoint.toString().replace(/\\/$/, '');\n } catch {\n return this._apiEndpoint.replace(/\\/orchestrator\\/graphql$/, '').replace(/\\/$/, '');\n }\n }\n\n /**\n * Close the session and disconnect from the sandbox.\n *\n * Sends `client.goodbye` over WebSocket first, then issues an HTTP fallback\n * to the runtime goodbye endpoint if no definitive WS-side runtime notify\n * acknowledgement was observed.\n */\n override async disconnect(): Promise<void> {\n let wsNotifiedRuntime = false;\n\n try {\n const goodbye = await this.rpc<{ ok?: boolean; via?: string }>('client.goodbye', {\n timestamp: Date.now(),\n });\n wsNotifiedRuntime = Boolean(goodbye?.ok && goodbye?.via);\n } catch {\n wsNotifiedRuntime = false;\n }\n\n if (!wsNotifiedRuntime) {\n try {\n const runtimeBase = this.getRuntimeBaseUrl();\n await fetch(\n `${runtimeBase}/orchestrator/runtime/environments/${this.environmentId}/session-goodbye`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify({\n reason: 'sdk_disconnect_http_fallback',\n }),\n },\n );\n } catch {\n // Best effort fallback.\n }\n }\n\n this.client.disconnect();\n }\n\n // ==================== GRAPH CONTAINER READINESS ====================\n\n /** The last known graph container status, updated by checkReadiness() or on heartbeat */\n graphContainerStatus: { lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' } | null = null;\n\n /**\n * Check if the graph container is ready and warm.\n *\n * Sends a lightweight heartbeat RPC to the Session DO which internally\n * pings the FalkorDB container. The response includes `graphContainerStatus`,\n * which is stored locally and emitted as a `readiness` event.\n *\n * Use this method to proactively warm the graph container before any\n * GraphQL query that requires it, or to poll the container's state in\n * the background.\n *\n * @returns The current graph container status object\n *\n * @example\n * ```typescript\n * const status = await env.checkReadiness();\n * console.log(status.status); // 'hot' | 'warming' | 'unknown'\n *\n * // Or listen for live updates\n * env.on('readiness', (status) => {\n * console.log('Graph is now:', status.status);\n * });\n * ```\n */\n async checkReadiness(): Promise<{ lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' }> {\n const result = await this.client.call('client.heartbeat', {}) as {\n status?: string;\n timestamp?: number;\n graphContainerStatus?: { lastKeepAliveAt: number; status: 'warming' | 'hot' | 'unknown' };\n };\n\n const containerStatus = result?.graphContainerStatus ?? {\n lastKeepAliveAt: Date.now(),\n status: 'unknown' as const,\n };\n\n this.graphContainerStatus = containerStatus;\n this.emit('readiness', containerStatus);\n return containerStatus;\n }\n\n // ==================== ID ↔ GRAPH PATH MAPPING ====================\n\n /**\n * Convert a class name + real-world ID into a unique graph path.\n *\n * Two objects of *different* classes may share the same real-world ID,\n * so the graph path must incorporate the class to guarantee uniqueness.\n *\n * Format: `{className}_{id}` — deterministic, human-readable.\n *\n * **Convention**: class names should be simple identifiers without\n * underscores (e.g. `author`, `book`). This ensures the prefix is\n * unambiguously parseable by `extractIdFromGraphPath`.\n */\n static toGraphPath(className: string, id: string): string {\n return `${className}_${id}`;\n }\n\n /**\n * Extract the real-world ID from a graph path, given the class name.\n *\n * Strips the `{className}_` prefix. Returns the raw path if the\n * expected prefix is not found.\n */\n static extractIdFromGraphPath(graphPath: string, className: string): string {\n const prefix = `${className}_`;\n return graphPath.startsWith(prefix) ? graphPath.substring(prefix.length) : graphPath;\n }\n\n /**\n * Execute a GraphQL query against the environment's graph.\n * \n * The query uses the Granular graph query language (based on Cypher/GraphQL).\n * Authentication is handled automatically using the SDK's API key.\n * \n * @param query - The GraphQL query string\n * @param variables - Optional variables for the query\n * @returns The query result data\n * \n * @example\n * ```typescript\n * // Read the workspace\n * const result = await env.graphql(\n * `query { model(path: \"workspace\") { path label submodels { path label } } }`\n * );\n * console.log(result.data);\n * \n * // Create a model\n * const created = await env.graphql(\n * `mutation { at(path: \"workspace\") { create_submodel(subpath: \"my_node\", label: \"My Node\", prototype: \"Model\") { model { path label } } } }`\n * );\n * ```\n */\n async graphql<T = any>(query: string, variables?: Record<string, any>): Promise<GraphQLResult<T>> {\n const response = await fetch(this._apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this._apiKey}`,\n },\n body: JSON.stringify({\n environmentId: this.environmentId,\n query,\n variables,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`GraphQL API Error (${response.status}): ${errorText}`);\n }\n\n return response.json() as Promise<GraphQLResult<T>>;\n }\n\n // ==================== RELATIONSHIP METHODS ====================\n\n /**\n * Define a relationship between two model types.\n * \n * Creates both submodels (if they don't exist) and links them with\n * a RelationshipDef node that encodes cardinality.\n * \n * @example\n * ```typescript\n * // Author has many Books, Book has one Author\n * const rel = await env.defineRelationship({\n * model: 'author',\n * localSubmodel: 'books',\n * localIsMany: true,\n * foreignModel: 'book',\n * foreignSubmodel: 'author',\n * foreignIsMany: false,\n * });\n * console.log(rel.relationship_kind); // \"one_to_many\"\n * ```\n */\n async defineRelationship(options: DefineRelationshipOptions): Promise<RelationshipInfo> {\n const result = await this.graphql<{\n at: {\n define_relationship: RelationshipInfo;\n };\n }>(\n `mutation DefineRelationship(\n $localSubmodel: String!,\n $foreignModel: String!,\n $foreignSubmodel: String!,\n $localIsMany: Boolean!,\n $foreignIsMany: Boolean!,\n $name: String\n ) {\n at(path: \"${options.model}\") {\n define_relationship(\n local_submodel: $localSubmodel\n foreign_model: $foreignModel\n foreign_submodel: $foreignSubmodel\n local_is_many: $localIsMany\n foreign_is_many: $foreignIsMany\n name: $name\n ) {\n name\n local_submodel { path label }\n local_is_many\n foreign_submodel { path label }\n foreign_is_many\n foreign_model { path label }\n relationship_kind\n }\n }\n }`,\n {\n localSubmodel: options.localSubmodel,\n foreignModel: options.foreignModel,\n foreignSubmodel: options.foreignSubmodel,\n localIsMany: options.localIsMany,\n foreignIsMany: options.foreignIsMany,\n name: options.name,\n }\n );\n\n if (result.errors?.length) {\n throw new Error(`defineRelationship failed: ${result.errors[0].message}`);\n }\n\n return result.data!.at.define_relationship;\n }\n\n /**\n * Get all relationships for a model type.\n * \n * @param modelPath - The model type path (e.g., \"author\")\n * @returns Array of relationships from this model's perspective\n * \n * @example\n * ```typescript\n * const rels = await env.getRelationships('author');\n * for (const rel of rels) {\n * console.log(`${rel.local_submodel.path} -> ${rel.foreign_model.path} (${rel.relationship_kind})`);\n * }\n * ```\n */\n async getRelationships(modelPath: string): Promise<RelationshipInfo[]> {\n const result = await this.graphql<{\n model: {\n relationships: RelationshipInfo[];\n };\n }>(\n `query GetRelationships($path: String) {\n model(path: $path) {\n relationships {\n name\n local_submodel { path label }\n local_is_many\n foreign_submodel { path label }\n foreign_is_many\n foreign_model { path label }\n relationship_kind\n }\n }\n }`,\n { path: modelPath }\n );\n\n if (result.errors?.length) {\n throw new Error(`getRelationships failed: ${result.errors[0].message}`);\n }\n\n return result.data?.model?.relationships || [];\n }\n\n /**\n * Attach a target model to a relationship submodel.\n * \n * Handles cardinality automatically:\n * - \"One\" side: sets/replaces the reference\n * - \"Many\" side: adds the target to the collection\n * \n * If the target model doesn't exist, it's created as an instance of the foreign type.\n * Bidirectional sync is automatic.\n * \n * @param modelPath - The model instance path (e.g., \"tolkien\")\n * @param submodelPath - The relationship submodel (e.g., \"books\")\n * @param targetPath - The target model to attach (e.g., \"lord_of_the_rings\")\n * \n * @example\n * ```typescript\n * // Attach a book to an author (many side)\n * await env.attach('tolkien', 'books', 'lord_of_the_rings');\n * // This also automatically sets lord_of_the_rings:author -> tolkien\n * ```\n */\n async attach(modelPath: string, submodelPath: string, targetPath: string): Promise<void> {\n const result = await this.graphql(\n `mutation Attach($target: String!) {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n attach(target: $target) {\n model { path }\n }\n }\n }\n }`,\n { target: targetPath }\n );\n\n if (result.errors?.length) {\n throw new Error(`attach failed: ${result.errors[0].message}`);\n }\n }\n\n /**\n * Detach a target model from a relationship submodel.\n * \n * Handles bidirectional cleanup automatically.\n * \n * @param modelPath - The model instance path\n * @param submodelPath - The relationship submodel\n * @param targetPath - The target to detach (optional for \"one\" side; omit on \"many\" side to detach all)\n * \n * @example\n * ```typescript\n * // Detach a specific book\n * await env.detach('tolkien', 'books', 'lord_of_the_rings');\n * \n * // Detach all books\n * await env.detach('tolkien', 'books');\n * ```\n */\n async detach(modelPath: string, submodelPath: string, targetPath?: string): Promise<void> {\n const targetArg = targetPath ? `target: \"${targetPath}\"` : '';\n const result = await this.graphql(\n `mutation Detach {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n detach(${targetArg}) {\n model { path }\n }\n }\n }\n }`\n );\n\n if (result.errors?.length) {\n throw new Error(`detach failed: ${result.errors[0].message}`);\n }\n }\n\n /**\n * List all related models through a relationship submodel.\n * \n * @param modelPath - The model instance path\n * @param submodelPath - The relationship submodel\n * @returns Array of related model references\n * \n * @example\n * ```typescript\n * const books = await env.listRelated('tolkien', 'books');\n * console.log(books); // [{ path: \"lord_of_the_rings\", label: \"Lord of the Rings\" }, ...]\n * ```\n */\n async listRelated(modelPath: string, submodelPath: string): Promise<ModelRef[]> {\n const result = await this.graphql<{\n at: {\n at: {\n list_related: ModelRef[];\n };\n };\n }>(\n `mutation ListRelated {\n at(path: \"${modelPath}\") {\n at(submodel: \"${submodelPath}\") {\n list_related { path label }\n }\n }\n }`\n );\n\n if (result.errors?.length) {\n throw new Error(`listRelated failed: ${result.errors[0].message}`);\n }\n\n return result.data?.at?.at?.list_related || [];\n }\n\n /**\n * Apply a manifest to the current environment's graph.\n * \n * Translates each manifest operation into GraphQL mutations and executes them\n * in order. This is the core mechanism for creating classes, fields, and\n * relationships from a declarative manifest.\n * \n * @param manifest - The manifest content to apply\n * @returns Summary of applied operations\n * \n * @example\n * ```typescript\n * await environment.applyManifest({\n * schemaVersion: 2,\n * name: 'my-app',\n * volumes: [{\n * name: 'schema',\n * scope: 'sandbox',\n * operations: [\n * { create: 'author', extends: 'class', has: { name: { type: 'string' } } },\n * { create: 'book', extends: 'class', has: { title: { type: 'string' } } },\n * { defineRelationship: {\n * left: 'author', right: 'book',\n * leftSubmodel: 'books', rightSubmodel: 'author',\n * leftIsMany: true, rightIsMany: false,\n * }},\n * ],\n * }],\n * });\n * ```\n */\n async applyManifest(manifest: ManifestContent): Promise<{ applied: number; errors: string[] }> {\n const errors: string[] = [];\n let applied = 0;\n\n for (const volume of manifest.volumes) {\n // Build alias map from imports\n const aliasMap: Record<string, string> = {};\n\n // Resolve and apply imports first\n if (volume.imports) {\n for (const imp of volume.imports) {\n aliasMap[imp.alias] = imp.name;\n\n const builtinOps = BUILTIN_MODULES[imp.name];\n if (builtinOps) {\n for (const op of builtinOps) {\n try {\n await this._applyOperation(op, {});\n applied++;\n } catch (err: any) {\n // Ignore \"already exists\" errors from re-applying imports\n if (!err.message?.includes('already exists')) {\n errors.push(`Import ${imp.name} operation failed: ${err.message}`);\n }\n }\n }\n } else {\n errors.push(`Unknown module: \"${imp.name}\" (only built-in modules are supported)`);\n }\n }\n }\n\n // Apply volume operations with alias resolution\n for (const op of volume.operations) {\n try {\n await this._applyOperation(op, aliasMap);\n applied++;\n } catch (err: any) {\n errors.push(`Operation failed: ${err.message}`);\n }\n }\n }\n\n return { applied, errors };\n }\n\n /**\n * Resolve an alias reference like \"@std/class\" → \"class\"\n * Strips the alias prefix, returning the bare model path.\n */\n private _resolveAlias(ref: string, aliasMap: Record<string, string>): string {\n if (!ref.startsWith('@')) return ref;\n const slashIdx = ref.indexOf('/');\n if (slashIdx === -1) return ref;\n const alias = ref.substring(0, slashIdx);\n const symbolName = ref.substring(slashIdx + 1);\n if (aliasMap[alias]) {\n return symbolName; // The import was applied, so the symbol exists at its bare name\n }\n return ref; // Unknown alias, return as-is\n }\n\n /**\n * Apply a single manifest operation via GraphQL\n */\n private async _applyOperation(op: ManifestOperation, aliasMap: Record<string, string>): Promise<void> {\n // 1. Relationship definition (standalone operation)\n if (op.defineRelationship) {\n const rel = op.defineRelationship;\n await this.defineRelationship({\n model: this._resolveAlias(rel.left, aliasMap),\n localSubmodel: rel.leftSubmodel,\n localIsMany: rel.leftIsMany,\n foreignModel: this._resolveAlias(rel.right, aliasMap),\n foreignSubmodel: rel.rightSubmodel,\n foreignIsMany: rel.rightIsMany,\n name: rel.name,\n });\n return;\n }\n\n // 2. Create a new model (optionally extending another)\n if (op.create) {\n const label = op.create.charAt(0).toUpperCase() + op.create.slice(1);\n const extendsRef = op.extends ? this._resolveAlias(op.extends, aliasMap) : undefined;\n const instanceOfRef = op.instanceOf ? this._resolveAlias(op.instanceOf, aliasMap) : undefined;\n\n if (extendsRef) {\n // Create model that extends a parent class\n await this.graphql(\n `mutation { create_model(path: \"${op.create}\", label: \"${label}\") { model { path } } }`\n );\n await this.graphql(\n `mutation { at(path: \"${op.create}\") { add_superclass(superclass: \"${extendsRef}\") { model { path } } } }`\n );\n } else if (instanceOfRef) {\n // Create an instance of a type\n await this.graphql(\n `mutation { at(path: \"${instanceOfRef}\") { instantiate(path: \"${op.create}\", label: \"${label}\") { model { path } } } }`\n );\n } else {\n // Create a standalone model\n await this.graphql(\n `mutation { create_model(path: \"${op.create}\", label: \"${label}\") { model { path } } }`\n );\n }\n\n // Apply fields (has) if present\n if (op.has) {\n await this._applyFields(op.create, op.has);\n }\n return;\n }\n\n // 3. Modify an existing model\n if (op.on) {\n const target = this._resolveAlias(op.on, aliasMap);\n if (op.has) {\n await this._applyFields(target, op.has);\n }\n return;\n }\n }\n\n /**\n * Apply field definitions (has) to a model via GraphQL\n */\n private async _applyFields(modelPath: string, fields: Record<string, ManifestPropertySpec>): Promise<void> {\n for (const [fieldName, spec] of Object.entries(fields)) {\n const fieldLabel = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);\n\n // Create the submodel (field) on the model\n const createResult = await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n create_submodel(subpath: \"${fieldName}\", label: \"${fieldLabel}\") {\n model { path }\n }\n }\n }`\n );\n\n // Set type prototype if provided (e.g. 'string', 'number', 'boolean')\n if (spec.type) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n add_prototype(prototype: \"${spec.type}\") { done }\n }\n }\n }`\n );\n }\n\n // Set description if provided\n if (spec.description) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_description(description: \"${spec.description}\") { done }\n }\n }\n }`\n );\n }\n\n // Set value if provided\n if (spec.value !== undefined && spec.value !== null) {\n if (typeof spec.value === 'string') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_string_value(value: \"${spec.value}\") { done }\n }\n }\n }`\n );\n } else if (typeof spec.value === 'number') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_number_value(value: ${spec.value}) { done }\n }\n }\n }`\n );\n } else if (typeof spec.value === 'boolean') {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_boolean_value(value: ${spec.value}) { done }\n }\n }\n }`\n );\n }\n }\n\n // Set reference if provided\n if (spec.ref) {\n await this.graphql(\n `mutation {\n at(path: \"${modelPath}\") {\n at(submodel: \"${fieldName}\") {\n set_reference(reference: \"${spec.ref}\") { done }\n }\n }\n }`\n );\n }\n\n // Recurse into nested has\n if (spec.has) {\n await this._applyFields(`${modelPath}:${fieldName}`, spec.has);\n }\n }\n }\n\n // ==================== RECORD OBJECT ====================\n\n /**\n * Create or update an instance of a class in the graph.\n *\n * Uses `instantiate` under the hood, which has find-or-create semantics:\n * if an instance with the given `id` already exists for the class it is\n * returned; otherwise a new instance is created. Fields are then set\n * (overwriting previous values) and relationships are attached.\n *\n * The graph path is derived as `{className}_{id}` to ensure uniqueness\n * across classes (two objects of different classes may share the same\n * real-world ID). Relationship targets are also resolved automatically\n * using the foreign class from the relationship definition.\n *\n * @param options - The object specification\n * @returns The graph path, real-world ID, and creation status\n *\n * @example\n * ```typescript\n * // Create an author with fields\n * const result = await env.recordObject({\n * className: 'author',\n * id: 'tolkien',\n * label: 'J.R.R. Tolkien',\n * fields: { name: 'J.R.R. Tolkien', birth_year: 1892 },\n * relationships: { books: ['lotr', 'silmarillion'] },\n * });\n * // result.path → 'author_tolkien' (internal graph path)\n * // result.id → 'tolkien' (real-world ID)\n * // result.created → true\n * ```\n */\n async recordObject(options: RecordObjectOptions): Promise<RecordObjectResult> {\n const { className, id, label, fields, relationships } = options;\n\n // Derive a unique graph path: className__id\n const graphPath = Environment.toGraphPath(className, id);\n\n // 1. Check if instance already exists\n const existsResult = await this.graphql<{ model: { path: string } | null }>(\n `query { model(path: \"${graphPath}\") { path } }`\n );\n const alreadyExists = !!existsResult.data?.model;\n\n // 2. Instantiate (find-or-create) under the class using the graph path\n const instResult = await this.graphql(\n `mutation {\n at(path: \"${className}\") {\n instantiate(path: \"${graphPath}\"${label ? `, label: \"${label}\"` : ''}) {\n model { path }\n }\n }\n }`\n );\n if (instResult.errors?.length) {\n throw new Error(`recordObject instantiate failed: ${instResult.errors[0].message}`);\n }\n\n const instancePath = instResult.data?.at?.instantiate?.model?.path ?? graphPath;\n\n // 3. Store the real-world ID as a string field (_realId) for later look-up\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n create_submodel(subpath: \"_realId\", label: \"_realId\") {\n model { path }\n }\n }\n }`\n );\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"_realId\") {\n set_string_value(value: \"${id.replace(/\"/g, '\\\\\"')}\") { done }\n }\n }\n }`\n );\n\n // 4. Set scalar field values\n if (fields) {\n for (const [fieldName, value] of Object.entries(fields)) {\n if (value === null) continue;\n\n // Ensure the submodel exists on the instance\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n create_submodel(subpath: \"${fieldName}\", label: \"${fieldName}\") {\n model { path }\n }\n }\n }`\n );\n\n // Set the value based on its JS type\n if (typeof value === 'string') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_string_value(value: \"${value.replace(/\"/g, '\\\\\"')}\") { done }\n }\n }\n }`\n );\n } else if (typeof value === 'number') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_number_value(value: ${value}) { done }\n }\n }\n }`\n );\n } else if (typeof value === 'boolean') {\n await this.graphql(\n `mutation {\n at(path: \"${instancePath}\") {\n at(submodel: \"${fieldName}\") {\n set_boolean_value(value: ${value}) { done }\n }\n }\n }`\n );\n }\n }\n }\n\n // 5. Attach relationships — resolve target IDs to graph paths\n if (relationships) {\n // Query the class's relationship definitions once to find foreign class names\n const rels = await this.getRelationships(className);\n const relMap: Record<string, string> = {};\n for (const rel of rels) {\n // Map submodel name → foreign model class name\n // local_submodel.path may be \"className:submodelName\", extract the leaf\n const submodelLeaf = rel.local_submodel.path.includes(':')\n ? rel.local_submodel.path.split(':').pop()!\n : rel.local_submodel.path;\n relMap[submodelLeaf] = rel.foreign_model.path;\n }\n\n for (const [submodelName, targets] of Object.entries(relationships)) {\n const foreignClass = relMap[submodelName];\n const targetList = Array.isArray(targets) ? targets : [targets];\n for (const target of targetList) {\n // Resolve target real-world ID to graph path using the foreign class\n const targetGraphPath = foreignClass\n ? Environment.toGraphPath(foreignClass, target)\n : target; // Fallback to raw ID if relationship not found\n await this.attach(instancePath, submodelName, targetGraphPath);\n }\n }\n }\n\n return { path: instancePath, id, created: !alreadyExists };\n }\n\n // ==================== PUBLISH TOOLS ====================\n\n /**\n * Removed: environment-scoped effect publication is no longer supported.\n */\n async publishTools(tools: ToolWithHandler[], revision = '1.0.0'): Promise<PublishToolsResult> {\n return super.publishTools(tools, revision);\n }\n\n /**\n * Removed: environment-scoped effect publication is no longer supported.\n */\n async publishEffect(effect: ToolWithHandler): Promise<PublishToolsResult> {\n return super.publishEffect(effect);\n }\n\n /**\n * Removed: environment-scoped effect publication is no longer supported.\n */\n async publishEffects(effects: ToolWithHandler[]): Promise<PublishToolsResult> {\n return super.publishEffects(effects);\n }\n\n /**\n * Removed: environment-scoped effect publication is no longer supported.\n */\n async unpublishEffect(name: string): Promise<PublishToolsResult> {\n return super.unpublishEffect(name);\n }\n\n /**\n * Removed: environment-scoped effect publication is no longer supported.\n */\n async unpublishAllEffects(): Promise<PublishToolsResult> {\n return super.unpublishAllEffects();\n }\n}\n\nexport class Granular {\n private apiKey: string;\n private apiUrl: string;\n private httpUrl: string;\n private tokenProvider?: AccessTokenProvider;\n private WebSocketCtor?: any;\n private onUnexpectedClose?: (info: WSDisconnectInfo) => void;\n private onReconnectError?: (info: WSReconnectErrorInfo) => void;\n\n /** Sandbox-level effect registry: sandboxId → (effectKey → ToolWithHandler) */\n private sandboxEffects: Map<string, Map<string, ToolWithHandler>> = new Map();\n /** Live sandbox-scoped effect hosts keyed by sandboxId */\n private sandboxEffectHosts: Map<string, SandboxEffectHost> = new Map();\n /** In-flight host connection promises to avoid duplicate concurrent connects */\n private sandboxEffectHostPromises: Map<string, Promise<SandboxEffectHost>> = new Map();\n\n /**\n * Create a new Granular client\n * @param options - Client configuration\n */\n constructor(options: GranularOptions) {\n const auth = options.token ?? options.apiKey;\n if (!auth) {\n throw new Error('Granular client requires either apiKey or token. Set GRANULAR_API_KEY or GRANULAR_TOKEN, or pass one in options.');\n }\n this.apiKey = auth;\n this.apiUrl = resolveApiUrl(options.apiUrl, options.endpointMode);\n this.tokenProvider = options.tokenProvider;\n this.WebSocketCtor = options.WebSocketCtor;\n this.onUnexpectedClose = options.onUnexpectedClose;\n this.onReconnectError = options.onReconnectError;\n // Convert WebSocket URL to HTTP URL for REST API\n this.httpUrl = this.apiUrl\n .replace(/^wss:\\/\\//, 'https://')\n .replace(/^ws:\\/\\//, 'http://')\n .replace(/\\/ws$/, '');\n }\n\n /**\n * Records/upserts a user and prepares them for sandbox connections\n * \n * @param options - User options\n * @returns The user object to pass to connect()\n * \n * @example\n * ```typescript\n * const user = await granular.recordUser({\n * userId: 'user_123',\n * name: 'John Doe',\n * permissions: ['agent'],\n * });\n * ```\n */\n async recordUser(options: RecordUserOptions): Promise<User> {\n // Create or get subject via control plane\n const subject = await this.request<Subject>('/control/subjects', {\n method: 'POST',\n body: JSON.stringify({\n identityId: options.userId,\n name: options.name,\n email: options.email,\n }),\n });\n\n return {\n subjectId: subject.subjectId,\n identityId: options.userId,\n name: options.name,\n email: options.email,\n permissions: options.permissions || [],\n };\n }\n\n /**\n * Connect to a sandbox and establish a real-time environment session.\n * \n * Effects are registered at the sandbox level via `granular.registerEffect()`\n * or `granular.registerEffects()`. Sessions pick up live availability from\n * the sandbox registry automatically.\n * \n * @param options - Connection options\n * @returns An active environment session\n * \n * @example\n * ```typescript\n * const user = await granular.recordUser({\n * userId: 'user_123',\n * permissions: ['agent'],\n * });\n * \n * const environment = await granular.connect({\n * sandbox: 'my-sandbox',\n * user,\n * });\n * \n * await granular.registerEffect('my-sandbox', {\n * name: 'greet',\n * description: 'Say hello',\n * inputSchema: { type: 'object', properties: {} },\n * handler: async () => 'Hello!',\n * });\n * \n * // Submit job\n * const job = await environment.submitJob(`\n * import { tools } from './sandbox-tools';\n * return await tools.greet({});\n * `);\n * \n * console.log(await job.result); // 'Hello!'\n * ```\n */\n async connect(options: ConnectOptions): Promise<Environment> {\n const clientId = options.clientId || `client_${Date.now()}`;\n\n // 1. Find or create the sandbox\n const sandbox = await this.findOrCreateSandbox(options.sandbox);\n\n // 2. Ensure permission profiles and assignments exist for each permission\n for (const profileName of options.user.permissions) {\n const profileId = await this.ensurePermissionProfile(sandbox.sandboxId, profileName);\n await this.ensureAssignment(options.user.subjectId, sandbox.sandboxId, profileId);\n }\n\n // 3. Create the environment\n const envData = await this.environments.create(sandbox.sandboxId, {\n subjectId: options.user.subjectId,\n permissionProfileId: null,\n });\n\n // Ensure the runtime graph is loaded before opening the session.\n await this.activateEnvironment(envData.environmentId);\n\n const session = await this.request<{\n sessionId: string;\n docId: string;\n wsUrl: string;\n token: string;\n expiresAt: number;\n }>('/ws/sessions', {\n method: 'POST',\n body: JSON.stringify({\n environmentId: envData.environmentId,\n clientId,\n }),\n });\n\n // 4. Connect WebSocket using environment ID\n // The API gateway auto-initializes the Durable Object on first connection when using API key auth\n const client = new WSClient({\n url: session.wsUrl,\n sessionId: session.sessionId,\n token: session.token,\n tokenProvider: this.tokenProvider,\n WebSocketCtor: this.WebSocketCtor,\n onUnexpectedClose: this.onUnexpectedClose,\n onReconnectError: this.onReconnectError,\n });\n\n await client.connect();\n\n // 5. Create environment wrapper and send hello\n // The GraphQL API endpoint goes through the API gateway for authentication\n const graphqlEndpoint = `${this.httpUrl}/orchestrator/graphql`;\n const environment = new Environment(client, envData, clientId, this.apiKey, graphqlEndpoint);\n\n await environment.hello();\n\n return environment;\n }\n\n private async activateEnvironment(environmentId: string): Promise<void> {\n await this.request<{\n environmentId: string;\n status: 'active';\n }>(`/orchestrator/runtime/environments/${environmentId}/activate`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n // ── Sandbox-Level Effects ──\n\n private getSandboxEffectMap(sandboxId: string): Map<string, ToolWithHandler> {\n let effects = this.sandboxEffects.get(sandboxId);\n if (!effects) {\n effects = new Map();\n this.sandboxEffects.set(sandboxId, effects);\n }\n return effects;\n }\n\n private serializeEffect(effect: ToolWithHandler): ToolSchema {\n return {\n effectKey: computeEffectKey(effect),\n name: effect.name,\n description: effect.description,\n inputSchema: effect.inputSchema,\n outputSchema: effect.outputSchema,\n stability: effect.stability || 'stable',\n provenance: effect.provenance || { source: 'custom' },\n tags: effect.tags,\n className: effect.className,\n static: effect.static,\n };\n }\n\n private async publishSandboxEffectCatalog(host: SandboxEffectHost): Promise<void> {\n const effects = Array.from(this.getSandboxEffectMap(host.sandboxId).values()).map((effect) =>\n this.serializeEffect(effect),\n );\n\n await host.wsClient.call('effects.publishCatalog', { effects });\n }\n\n private async syncSandboxEffectCatalog(sandboxId: string): Promise<void> {\n const host = await this.ensureSandboxEffectHost(sandboxId);\n await this.publishSandboxEffectCatalog(host);\n }\n\n private startEffectHostHeartbeat(host: SandboxEffectHost): void {\n if (host.heartbeatTimer) {\n clearInterval(host.heartbeatTimer);\n }\n\n host.wsClient.call('client.heartbeat', {}).catch((error) => {\n console.warn(\n `[Granular] Initial effect host heartbeat failed for sandbox ${host.sandboxId}:`,\n error,\n );\n });\n\n host.heartbeatTimer = setInterval(() => {\n host.wsClient.call('client.heartbeat', {}).catch((error) => {\n console.warn(\n `[Granular] Effect host heartbeat failed for sandbox ${host.sandboxId}:`,\n error,\n );\n });\n }, 10_000);\n }\n\n private stopEffectHostHeartbeat(host?: SandboxEffectHost): void {\n if (!host?.heartbeatTimer) {\n return;\n }\n clearInterval(host.heartbeatTimer);\n host.heartbeatTimer = null;\n }\n\n private async synchronizeEffectHost(host: SandboxEffectHost): Promise<void> {\n await host.wsClient.call('client.hello', {\n clientId: host.clientId,\n protocolVersion: '2.0',\n });\n this.startEffectHostHeartbeat(host);\n await this.publishSandboxEffectCatalog(host);\n }\n\n private async ensureSandboxEffectHost(sandboxId: string): Promise<SandboxEffectHost> {\n const existing = this.sandboxEffectHosts.get(sandboxId);\n if (existing) {\n return existing;\n }\n\n const inflight = this.sandboxEffectHostPromises.get(sandboxId);\n if (inflight) {\n return inflight;\n }\n\n const connectPromise = (async () => {\n const effectClientId = crypto.randomUUID();\n const clientId = `effect-host:${sandboxId}:${effectClientId}`;\n const wsClient = new WSClient({\n url: buildEffectHostUrl(this.apiUrl, sandboxId, effectClientId, clientId),\n sessionId: `effect-host:${effectClientId}`,\n token: this.apiKey,\n tokenProvider: this.tokenProvider,\n WebSocketCtor: this.WebSocketCtor,\n onUnexpectedClose: this.onUnexpectedClose,\n onReconnectError: this.onReconnectError,\n });\n\n const host: SandboxEffectHost = {\n sandboxId,\n effectClientId,\n clientId,\n wsClient,\n heartbeatTimer: null,\n };\n\n wsClient.registerRpcHandler('effect.invoke', async (params: unknown) => {\n const request = params as {\n effectKey: string;\n effectName: string;\n input: any;\n context: any;\n };\n const effect = this.getSandboxEffectMap(sandboxId).get(request.effectKey);\n if (!effect) {\n throw new Error(`Effect handler not found: ${request.effectKey}`);\n }\n\n if (\n effect.className &&\n !effect.static &&\n request.input &&\n typeof request.input === 'object' &&\n '_objectId' in request.input\n ) {\n const { _objectId, ...rest } = request.input as Record<string, unknown> & {\n _objectId: string;\n };\n return (effect.handler as any)(_objectId, rest, request.context);\n }\n\n return (effect.handler as any)(request.input, request.context);\n });\n\n wsClient.on('open', () => {\n void this.synchronizeEffectHost(host).catch((error) => {\n console.error(\n `[Granular] Failed to re-sync effect host for sandbox ${sandboxId}:`,\n error,\n );\n });\n });\n\n wsClient.on('disconnect', () => {\n this.stopEffectHostHeartbeat(host);\n });\n\n await wsClient.connect();\n await this.synchronizeEffectHost(host);\n this.sandboxEffectHosts.set(sandboxId, host);\n return host;\n })();\n\n this.sandboxEffectHostPromises.set(sandboxId, connectPromise);\n try {\n return await connectPromise;\n } finally {\n this.sandboxEffectHostPromises.delete(sandboxId);\n }\n }\n\n private disconnectSandboxEffectHost(sandboxId: string): void {\n const host = this.sandboxEffectHosts.get(sandboxId);\n if (!host) {\n return;\n }\n\n this.stopEffectHostHeartbeat(host);\n host.wsClient.disconnect();\n this.sandboxEffectHosts.delete(sandboxId);\n }\n\n /**\n * Register an effect (tool) for a specific sandbox.\n *\n * @param sandboxNameOrId - The name or ID of the sandbox\n * @param effect - The tool definition and handler\n */\n async registerEffect(sandboxNameOrId: string, effect: ToolWithHandler): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n this.getSandboxEffectMap(sandboxId).set(computeEffectKey(effect), effect);\n await this.syncSandboxEffectCatalog(sandboxId);\n }\n\n /**\n * Register multiple effects (tools) for a specific sandbox.\n * \n * batch version of `registerEffect`.\n */\n async registerEffects(sandboxNameOrId: string, effects: ToolWithHandler[]): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n const map = this.getSandboxEffectMap(sandboxId);\n for (const effect of effects) {\n map.set(computeEffectKey(effect), effect);\n }\n await this.syncSandboxEffectCatalog(sandboxId);\n }\n\n /**\n * Unregister an effect from a sandbox.\n * \n * Removes it from the local sandbox registry and updates the\n * sandbox-scoped live catalog.\n */\n async unregisterEffect(sandboxNameOrId: string, name: string): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n const currentMap = this.sandboxEffects.get(sandboxId);\n if (!currentMap) {\n return;\n }\n\n const nextEntries = Array.from(currentMap.entries()).filter(\n ([effectKey, effect]) => effectKey !== name && effect.name !== name,\n );\n\n if (nextEntries.length === currentMap.size) {\n return;\n }\n\n const nextMap = new Map(nextEntries);\n this.sandboxEffects.set(sandboxId, nextMap);\n\n if (nextMap.size === 0) {\n this.disconnectSandboxEffectHost(sandboxId);\n this.sandboxEffects.delete(sandboxId);\n return;\n }\n\n await this.syncSandboxEffectCatalog(sandboxId);\n }\n\n /**\n * Unregister all effects for a sandbox.\n */\n async unregisterAllEffects(sandboxNameOrId: string): Promise<void> {\n const sandbox = await this.findOrCreateSandbox(sandboxNameOrId);\n const sandboxId = sandbox.sandboxId;\n this.sandboxEffects.delete(sandboxId);\n this.disconnectSandboxEffectHost(sandboxId);\n }\n\n /**\n * Find a sandbox by name or create it if it doesn't exist\n */\n private async findOrCreateSandbox(nameOrId: string): Promise<Sandbox> {\n try {\n // Try to get by ID first\n const sandbox = await this.sandboxes.get(nameOrId);\n return sandbox;\n } catch {\n // If not found by ID, try to find by name or create\n const sandboxes = await this.sandboxes.list();\n const existing = sandboxes.items.find(s => s.name === nameOrId);\n if (existing) {\n return existing;\n }\n\n // Create new sandbox\n const created = await this.sandboxes.create({ name: nameOrId });\n return created;\n }\n }\n\n /**\n * Ensure a permission profile exists for a sandbox, creating it if needed.\n * If profileName matches an existing profile name, returns its ID.\n * Otherwise, creates a new profile with default allow-all rules.\n */\n private async ensurePermissionProfile(\n sandboxId: string,\n profileName: string\n ): Promise<string> {\n try {\n // Check if profile already exists by name\n const profiles = await this.permissionProfiles.list(sandboxId);\n const existing = profiles.find((p) => p.name === profileName);\n if (existing) {\n return existing.permissionProfileId;\n }\n } catch {\n // Ignore lookup errors, try to create\n }\n\n // Create new profile with default rules (allow all tools)\n const created = await this.permissionProfiles.create(sandboxId, {\n name: profileName,\n rules: {\n effects: { allow: ['*'] },\n resources: { allow: ['*'] },\n },\n });\n return created.permissionProfileId;\n }\n\n /**\n * Ensure an assignment exists for a subject in a sandbox with a permission profile\n */\n private async ensureAssignment(\n subjectId: string,\n sandboxId: string,\n permissionProfileId: string\n ): Promise<void> {\n try {\n const assignments = await this.request<AssignmentListResponse>(\n `/control/subjects/${subjectId}/assignments`\n );\n // Check for ANY assignment in this sandbox\n const existing = assignments.items.find(\n (a) => a.sandboxId === sandboxId\n );\n\n if (existing) {\n // If assignment exists with same profile, we are done\n if (existing.permissionProfileId === permissionProfileId) {\n return;\n }\n\n // If assignment exists but with different profile, delete it first\n // This avoids UNIQUE constraint violation when creating the new one\n await this.request<DeleteResponse>(`/control/assignments/${existing.assignmentId}`, {\n method: 'DELETE'\n });\n }\n } catch {\n // Ignore lookup errors\n }\n\n await this.request<Assignment>(`/control/subjects/${subjectId}/assignments`, {\n method: 'POST',\n body: JSON.stringify({\n sandboxId,\n subjectId,\n permissionProfileId,\n }),\n });\n }\n\n /**\n * Sandbox management API\n */\n get sandboxes() {\n return {\n list: async (): Promise<SandboxListResponse> => {\n return this.request<SandboxListResponse>('/control/sandboxes');\n },\n get: async (id: string): Promise<Sandbox> => {\n return this.request<Sandbox>(`/control/sandboxes/${id}`);\n },\n create: async (data: CreateSandboxData): Promise<Sandbox> => {\n return this.request<Sandbox>('/control/sandboxes', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n update: async (id: string, data: Partial<CreateSandboxData>): Promise<Sandbox> => {\n return this.request<Sandbox>(`/control/sandboxes/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n },\n delete: async (id: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(`/control/sandboxes/${id}`, {\n method: 'DELETE',\n });\n },\n };\n }\n\n /**\n * Permission Profile management for sandboxes\n */\n get permissionProfiles() {\n return {\n list: async (sandboxId: string): Promise<PermissionProfile[]> => {\n const result = await this.request<PermissionProfileListResponse>(\n `/control/sandboxes/${sandboxId}/permission-profiles`\n );\n return result.items;\n },\n get: async (sandboxId: string, profileId: string): Promise<PermissionProfile> => {\n return this.request<PermissionProfile>(\n `/control/sandboxes/${sandboxId}/permission-profiles/${profileId}`\n );\n },\n create: async (\n sandboxId: string,\n data: CreatePermissionProfileData\n ): Promise<PermissionProfile> => {\n return this.request<PermissionProfile>(\n `/control/sandboxes/${sandboxId}/permission-profiles`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n },\n delete: async (sandboxId: string, profileId: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(\n `/control/sandboxes/${sandboxId}/permission-profiles/${profileId}`,\n {\n method: 'DELETE',\n }\n );\n },\n };\n }\n\n /**\n * Environment management\n */\n get environments() {\n return {\n list: async (sandboxId: string): Promise<EnvironmentData[]> => {\n const result = await this.request<EnvironmentListResponse>(\n `/control/sandboxes/${sandboxId}/environments`\n );\n return result.items;\n },\n get: async (environmentId: string): Promise<EnvironmentData> => {\n return this.request<EnvironmentData>(`/control/environments/${environmentId}`);\n },\n create: async (\n sandboxId: string,\n data: CreateEnvironmentData\n ): Promise<EnvironmentData> => {\n return this.request<EnvironmentData>(`/control/sandboxes/${sandboxId}/environments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n },\n delete: async (environmentId: string): Promise<DeleteResponse> => {\n return this.request<DeleteResponse>(`/control/environments/${environmentId}`, {\n method: 'DELETE',\n });\n },\n };\n }\n\n /**\n * Subject management\n */\n get subjects() {\n return {\n get: async (subjectId: string): Promise<Subject> => {\n return this.request<Subject>(`/control/subjects/${subjectId}`);\n },\n listAssignments: async (subjectId: string): Promise<AssignmentListResponse> => {\n return this.request<AssignmentListResponse>(`/control/subjects/${subjectId}/assignments`);\n },\n };\n }\n\n /**\n * @deprecated Use recordUser() instead\n */\n get users() {\n return {\n create: async (data: { id: string; name?: string; email?: string }): Promise<Subject> => {\n return this.request<Subject>('/control/subjects', {\n method: 'POST',\n body: JSON.stringify({\n identityId: data.id,\n name: data.name,\n email: data.email,\n }),\n });\n },\n get: async (id: string): Promise<Subject> => {\n return this.request<Subject>(`/control/subjects/${id}`);\n },\n };\n }\n\n /**\n * Make an authenticated API request\n */\n private async request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.httpUrl}${path}`;\n console.log(`[SDK] Requesting: ${url}`);\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Granular API Error (${response.status}): ${errorText}`);\n }\n\n if (response.status === 204) {\n return { deleted: true } as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n"]}
|