1 line
48 KiB
JSON
1 line
48 KiB
JSON
{"ast":null,"code":"/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst {\n Duplex\n} = require('stream');\nconst {\n randomFillSync\n} = require('crypto');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n EMPTY_BUFFER,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n isBlob,\n isValidStatusCode\n} = require('./validation');\nconst {\n mask: applyMask,\n toBuffer\n} = require('./buffer-util');\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\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 if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n this._socket = socket;\n this._firstFragment = true;\n this._compress = false;\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 if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\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 randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n let dataLength;\n if (typeof data === 'string') {\n if ((!options.mask || skipMasking) && options[kByteLength] !== undefined) {\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 let payloadLength = dataLength;\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n target[1] = payloadLength;\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 if (!options.mask) return [target, data];\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 if (skipMasking) return [target, data];\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\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 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 if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\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 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 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 if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\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 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 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 if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\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 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 let byteLength;\n let readOnly;\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 if (this._firstFragment) {\n this._firstFragment = false;\n if (rsv1 && perMessageDeflate && perMessageDeflate.params[perMessageDeflate._isServer ? 'server_no_context_takeover' : 'client_no_context_takeover']) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n if (options.fin) this._firstFragment = true;\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 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 blob.arrayBuffer().then(arrayBuffer => {\n if (this._socket.destroyed) {\n const err = new Error('The socket was closed while the blob was being read');\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 this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\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 }).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 const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\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('The socket was closed while data was being compressed');\n callCallbacks(this, err, cb);\n return;\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 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[]} 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}\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 for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\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}","map":{"version":3,"names":["Duplex","require","randomFillSync","PerMessageDeflate","EMPTY_BUFFER","kWebSocket","NOOP","isBlob","isValidStatusCode","mask","applyMask","toBuffer","kByteLength","Symbol","maskBuffer","Buffer","alloc","RANDOM_POOL_SIZE","randomPool","randomPoolPointer","DEFAULT","DEFLATING","GET_BLOB_DATA","Sender","constructor","socket","extensions","generateMask","_extensions","_generateMask","_maskBuffer","_socket","_firstFragment","_compress","_bufferedBytes","_queue","_state","onerror","undefined","frame","data","options","merge","offset","skipMasking","dataLength","from","length","readOnly","payloadLength","target","allocUnsafe","fin","opcode","rsv1","writeUInt16BE","writeUIntBE","close","code","cb","buf","TypeError","byteLength","RangeError","write","set","enqueue","dispatch","sendFrame","ping","size","getBlobData","pong","send","perMessageDeflate","extensionName","binary","compress","params","_isServer","_threshold","opts","blob","arrayBuffer","then","destroyed","err","Error","process","nextTick","callCallbacks","dequeue","catch","onError","_","shift","Reflect","apply","slice","push","list","cork","uncork","module","exports","sender","i","callback"],"sources":["/Users/shoofle/Projects/the-forest/node_modules/@libsql/isomorphic-ws/node_modules/ws/lib/sender.js"],"sourcesContent":["/* 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[]} 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"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"script","externalDependencies":[]} |