@zauthx402/sdk 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/ws/lib/constants.js","../../../node_modules/node-gyp-build/node-gyp-build.js","../../../node_modules/node-gyp-build/index.js","../../../node_modules/bufferutil/fallback.js","../../../node_modules/bufferutil/index.js","../node_modules/ws/lib/buffer-util.js","../node_modules/ws/lib/limiter.js","../node_modules/ws/lib/permessage-deflate.js","../../../node_modules/utf-8-validate/fallback.js","../../../node_modules/utf-8-validate/index.js","../node_modules/ws/lib/validation.js","../node_modules/ws/lib/receiver.js","../node_modules/ws/lib/sender.js","../node_modules/ws/lib/event-target.js","../node_modules/ws/lib/extension.js","../node_modules/ws/lib/websocket.js","../node_modules/ws/lib/stream.js","../node_modules/ws/lib/subprotocol.js","../node_modules/ws/lib/websocket-server.js","../node_modules/ws/wrapper.mjs","../src/types/config.ts","../src/client.ts","../src/types/x402.ts","../src/utils.ts","../src/validator.ts","../src/refund.ts","../src/middleware/express.ts"],"names":["exports","dir","platform","arch","runtime","abi","require_node_gyp_build","mask","data","require_fallback","Receiver","Sender","URL","WebSocket","key","createWebSocketStream","err","protocol","WebSocketServer","incomingPaymentHeader"],"mappings":"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AAA,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,CAAA;AAAA,MAAG,CAAA;AAAA,MAAG,CAAA;A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","file":"index.mjs","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","/**\n * Configuration types for the zauthSDK\n */\n\nimport type { X402Network } from './x402.js';\nimport type { RefundReason, ValidationResult } from './events.js';\n\n/**\n * Main SDK configuration\n */\nexport interface ZauthConfig {\n /**\n * Your zauthx402 API key\n * Get this from https://zauthx402.com/dashboard\n */\n apiKey: string;\n\n /**\n * API endpoint for zauthx402 service\n * @default 'https://back.zauthx402.com'\n */\n apiEndpoint?: string;\n\n /**\n * SDK mode: provider (hosting x402 endpoints)\n */\n mode: 'provider';\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean;\n\n /**\n * Environment name for grouping events\n * @default process.env.NODE_ENV || 'development'\n */\n environment?: string;\n\n /**\n * Event batching configuration\n */\n batching?: BatchingConfig;\n\n /**\n * Response validation configuration (provider mode)\n */\n validation?: ValidationConfig;\n\n /**\n * Refund configuration (provider mode)\n */\n refund?: RefundConfig;\n\n /**\n * Telemetry configuration\n */\n telemetry?: TelemetryConfig;\n}\n\n/**\n * Event batching configuration\n */\nexport interface BatchingConfig {\n /**\n * Maximum events to batch before sending\n * @default 10\n */\n maxBatchSize?: number;\n\n /**\n * Maximum time to wait before sending batch (ms)\n * @default 5000\n */\n maxBatchWaitMs?: number;\n\n /**\n * Retry failed batches\n * @default true\n */\n retry?: boolean;\n\n /**\n * Max retry attempts\n * @default 3\n */\n maxRetries?: number;\n}\n\n/**\n * Response validation configuration\n */\nexport interface ValidationConfig {\n /**\n * JSON schema for valid responses\n * If provided, responses will be validated against this schema\n */\n responseSchema?: Record<string, unknown>;\n\n /**\n * Custom validator function\n * Return ValidationResult with valid=true if response is meaningful\n */\n customValidator?: (response: unknown, statusCode: number) => ValidationResult;\n\n /**\n * Minimum response size to consider meaningful (bytes)\n * @default 2 (i.e., not empty \"{}\" or \"[]\")\n */\n minResponseSize?: number;\n\n /**\n * Fields that must be present in response\n */\n requiredFields?: string[];\n\n /**\n * Fields that must NOT be present (error indicators)\n */\n errorFields?: string[];\n\n /**\n * Consider empty arrays/objects as invalid\n * @default true\n */\n rejectEmptyCollections?: boolean;\n}\n\n/**\n * Refund configuration (provider mode)\n * Supports global settings and per-endpoint overrides\n */\nexport interface RefundConfig {\n /**\n * Enable automatic refunds (master switch)\n * @default false\n */\n enabled?: boolean;\n\n /**\n * Signer for refund transactions (viem Account or private key string)\n * Should be a hot wallet with limited funds\n * Can also be set via ZAUTH_REFUND_PRIVATE_KEY env var\n */\n signer?: RefundSigner;\n\n /**\n * Private key for refund transactions (deprecated, use signer)\n * @deprecated Use signer instead\n */\n privateKey?: string;\n\n /**\n * Default network for refunds (can be overridden per-endpoint)\n * @default 'base'\n */\n network?: X402Network;\n\n /**\n * Global refund triggers\n */\n triggers?: RefundTriggers;\n\n /**\n * Maximum refund amount in USD per transaction (global default)\n * @default 1.00\n */\n maxRefundUsd?: number;\n\n /**\n * Daily refund cap in USD (optional safety limit)\n */\n dailyCapUsd?: number;\n\n /**\n * Monthly refund cap in USD (optional safety limit)\n */\n monthlyCapUsd?: number;\n\n /**\n * Per-endpoint refund configuration overrides\n * Key is URL pattern (supports * wildcard)\n */\n endpoints?: Record<string, EndpointRefundConfig>;\n\n /**\n * Polling configuration for checking pending refunds\n */\n polling?: RefundPollingConfig;\n\n /**\n * Callback when a refund is executed\n */\n onRefund?: (refund: ExecutedRefund) => void | Promise<void>;\n\n /**\n * Callback when a refund fails\n */\n onRefundError?: (error: RefundError) => void | Promise<void>;\n}\n\n/**\n * Signer type - can be a viem Account or private key string\n */\nexport type RefundSigner =\n | string // Private key hex string\n | { address: string; signTransaction: (tx: unknown) => Promise<string> }; // viem-like Account\n\n/**\n * What triggers an automatic refund\n */\nexport interface RefundTriggers {\n /** Refund on 5xx server errors */\n serverError?: boolean;\n /** Refund on request timeout */\n timeout?: boolean;\n /** Refund on empty/meaningless response */\n emptyResponse?: boolean;\n /** Refund when response doesn't match expected schema */\n schemaValidation?: boolean;\n /** Minimum meaningfulness score - refund if below this */\n minMeaningfulness?: number;\n}\n\n/**\n * Per-endpoint refund configuration\n */\nexport interface EndpointRefundConfig {\n /** Override enabled for this endpoint (null = use global) */\n enabled?: boolean;\n /** Override max refund for this endpoint */\n maxRefundUsd?: number;\n /** Override triggers for this endpoint */\n triggers?: Partial<RefundTriggers>;\n /** Custom matcher for this endpoint */\n shouldRefund?: (response: unknown, statusCode: number, validationResult: ValidationResult) => boolean;\n /** Plain text description of expected response shape for AI validation */\n expectedResponse?: string;\n}\n\n/**\n * Polling configuration for checking pending refunds\n */\nexport interface RefundPollingConfig {\n /** Enable polling (defaults to true if refunds enabled) */\n enabled?: boolean;\n /** Polling interval in milliseconds @default 30000 */\n intervalMs?: number;\n /** Max refunds to process per poll @default 10 */\n batchSize?: number;\n}\n\n/**\n * Successfully executed refund\n */\nexport interface ExecutedRefund {\n refundId: string;\n requestId: string;\n url: string;\n amountUsd: number;\n amountRaw: string;\n txHash: string;\n network: X402Network;\n recipient: string;\n reason: RefundReason;\n executedAt: string;\n}\n\n/**\n * Refund execution error\n */\nexport interface RefundError {\n refundId: string;\n url: string;\n amountUsd: number;\n error: string;\n retryable: boolean;\n}\n\n/**\n * Condition that triggers a refund (legacy - use RefundTriggers)\n * @deprecated Use RefundTriggers instead\n */\nexport interface RefundCondition {\n reason: RefundReason;\n enabled: boolean;\n /** Additional matcher for this condition */\n matcher?: (response: unknown, statusCode: number) => boolean;\n}\n\n/**\n * Telemetry configuration\n */\nexport interface TelemetryConfig {\n /**\n * Include request body in events\n * @default true\n */\n includeRequestBody?: boolean;\n\n /**\n * Include response body in events\n * @default true\n */\n includeResponseBody?: boolean;\n\n /**\n * Maximum body size to include (bytes)\n * Bodies larger than this will be truncated\n * @default 10000\n */\n maxBodySize?: number;\n\n /**\n * Headers to redact from events\n * @default ['authorization', 'cookie', 'x-api-key']\n */\n redactHeaders?: string[];\n\n /**\n * Fields to redact from request/response bodies\n * Supports dot notation (e.g., 'user.password')\n */\n redactFields?: string[];\n\n /**\n * Sample rate for events (0-1)\n * 1 = send all events, 0.1 = send 10% of events\n * @default 1\n */\n sampleRate?: number;\n}\n\n/**\n * Provider middleware configuration\n */\nexport interface ProviderMiddlewareConfig extends ZauthConfig {\n mode: 'provider';\n\n /**\n * URL patterns to monitor\n * If not specified, monitors all routes\n */\n includeRoutes?: string[];\n\n /**\n * URL patterns to exclude from monitoring\n */\n excludeRoutes?: string[];\n\n /**\n * Skip monitoring for health check endpoints\n * @default true\n */\n skipHealthChecks?: boolean;\n}\n\n\n/**\n * Resolved configuration with all defaults applied\n */\n/** Resolved validation config - some fields remain optional */\nexport type ResolvedValidationConfig = {\n responseSchema?: Record<string, unknown>;\n customValidator?: (response: unknown, statusCode: number) => ValidationResult;\n minResponseSize: number;\n requiredFields: string[];\n errorFields: string[];\n rejectEmptyCollections: boolean;\n};\n\n/** Resolved refund config */\nexport interface ResolvedRefundConfig {\n enabled: boolean;\n signer?: RefundSigner;\n privateKey?: string;\n network: X402Network;\n triggers: Required<RefundTriggers>;\n maxRefundUsd: number;\n dailyCapUsd?: number;\n monthlyCapUsd?: number;\n endpoints: Record<string, EndpointRefundConfig>;\n polling: Required<RefundPollingConfig>;\n onRefund?: (refund: ExecutedRefund) => void | Promise<void>;\n onRefundError?: (error: RefundError) => void | Promise<void>;\n}\n\nexport interface ResolvedConfig {\n apiKey: string;\n apiEndpoint: string;\n mode: 'provider';\n debug: boolean;\n environment: string;\n batching: Required<BatchingConfig>;\n validation: ResolvedValidationConfig;\n refund: ResolvedRefundConfig;\n telemetry: Required<TelemetryConfig>;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: Omit<ResolvedConfig, 'apiKey' | 'mode'> = {\n apiEndpoint: process.env.ZAUTH_API_ENDPOINT || 'https://back.zauthx402.com',\n debug: false,\n environment: process.env.NODE_ENV || 'development',\n batching: {\n maxBatchSize: 10,\n maxBatchWaitMs: 5000,\n retry: true,\n maxRetries: 3,\n },\n validation: {\n minResponseSize: 2,\n requiredFields: [],\n errorFields: ['error', 'errors'],\n rejectEmptyCollections: true,\n },\n refund: {\n enabled: false,\n privateKey: process.env.ZAUTH_REFUND_PRIVATE_KEY,\n network: 'base',\n triggers: {\n serverError: true,\n timeout: true,\n emptyResponse: true,\n schemaValidation: false,\n minMeaningfulness: 0.3,\n },\n maxRefundUsd: 1.00,\n endpoints: {},\n polling: {\n enabled: true,\n intervalMs: 30000,\n batchSize: 10,\n },\n },\n telemetry: {\n includeRequestBody: true,\n includeResponseBody: true,\n maxBodySize: 10000,\n redactHeaders: ['authorization', 'cookie', 'x-api-key', 'x-payment'],\n redactFields: [],\n sampleRate: 1,\n },\n};\n\n/**\n * Resolve configuration by merging with defaults\n */\nexport function resolveConfig(config: ZauthConfig): ResolvedConfig {\n // Deep merge refund config\n const refundConfig: ResolvedRefundConfig = {\n enabled: config.refund?.enabled ?? DEFAULT_CONFIG.refund.enabled,\n signer: config.refund?.signer,\n privateKey: config.refund?.privateKey ?? DEFAULT_CONFIG.refund.privateKey,\n network: config.refund?.network ?? DEFAULT_CONFIG.refund.network,\n triggers: {\n ...DEFAULT_CONFIG.refund.triggers,\n ...config.refund?.triggers,\n },\n maxRefundUsd: config.refund?.maxRefundUsd ?? DEFAULT_CONFIG.refund.maxRefundUsd,\n dailyCapUsd: config.refund?.dailyCapUsd,\n monthlyCapUsd: config.refund?.monthlyCapUsd,\n endpoints: config.refund?.endpoints ?? DEFAULT_CONFIG.refund.endpoints,\n polling: {\n ...DEFAULT_CONFIG.refund.polling,\n ...config.refund?.polling,\n },\n onRefund: config.refund?.onRefund,\n onRefundError: config.refund?.onRefundError,\n };\n\n return {\n apiKey: config.apiKey,\n apiEndpoint: config.apiEndpoint || DEFAULT_CONFIG.apiEndpoint,\n mode: config.mode,\n debug: config.debug ?? DEFAULT_CONFIG.debug,\n environment: config.environment || DEFAULT_CONFIG.environment,\n batching: {\n ...DEFAULT_CONFIG.batching,\n ...config.batching,\n },\n validation: {\n ...DEFAULT_CONFIG.validation,\n ...config.validation,\n },\n refund: refundConfig,\n telemetry: {\n ...DEFAULT_CONFIG.telemetry,\n ...config.telemetry,\n },\n };\n}\n","/**\n * ZauthClient - API client for zauthx402 service\n * Handles event batching and submission\n */\n\nimport type {\n ZauthConfig,\n ResolvedConfig,\n ZauthEvent,\n EventBatch,\n EventSubmitResponse,\n PendingRefundsResponse,\n ConfirmRefundRequest,\n ConfirmRefundResponse,\n RejectRefundRequest,\n RejectRefundResponse,\n} from './types/index.js';\nimport { resolveConfig } from './types/config.js';\n\nconst SDK_VERSION = '0.1.0';\n\n/**\n * Generate a unique event ID\n */\nfunction generateEventId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Generate a unique batch ID\n */\nfunction generateBatchId(): string {\n return `batch-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * ZauthClient handles communication with the zauthx402 API\n */\nexport class ZauthClient {\n private config: ResolvedConfig;\n private eventQueue: ZauthEvent[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private isFlushing = false;\n\n constructor(config: ZauthConfig) {\n if (!config.apiKey) {\n throw new Error('zauthSDK: apiKey is required');\n }\n this.config = resolveConfig(config);\n this.log('Client initialized', { mode: this.config.mode, environment: this.config.environment });\n }\n\n /**\n * Debug logger\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[zauthSDK]', ...args);\n }\n }\n\n /**\n * Create base event with common fields\n */\n createEventBase<T extends ZauthEvent['type']>(type: T): { eventId: string; timestamp: string; type: T; apiKey: string; sdkVersion: string } {\n return {\n eventId: generateEventId(),\n timestamp: new Date().toISOString(),\n type,\n apiKey: this.config.apiKey,\n sdkVersion: SDK_VERSION,\n };\n }\n\n /**\n * Queue an event for batched submission\n */\n queueEvent(event: ZauthEvent): void {\n this.eventQueue.push(event);\n this.log('Event queued', { type: event.type, eventId: event.eventId, queueSize: this.eventQueue.length });\n\n // Flush if batch size reached\n if (this.eventQueue.length >= this.config.batching.maxBatchSize) {\n this.flush();\n return;\n }\n\n // Start flush timer if not already running\n if (!this.flushTimer) {\n this.flushTimer = setTimeout(() => {\n this.flush();\n }, this.config.batching.maxBatchWaitMs);\n }\n }\n\n /**\n * Send an event immediately (bypasses batching)\n */\n async sendEvent(event: ZauthEvent): Promise<EventSubmitResponse> {\n return this.submitBatch([event]);\n }\n\n /**\n * Flush queued events\n */\n async flush(): Promise<void> {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.eventQueue.length === 0 || this.isFlushing) {\n return;\n }\n\n this.isFlushing = true;\n const events = [...this.eventQueue];\n this.eventQueue = [];\n\n try {\n await this.submitBatch(events);\n } catch (error) {\n // Re-queue failed events if retry is enabled\n if (this.config.batching.retry) {\n this.log('Batch failed, re-queuing events', { count: events.length });\n this.eventQueue.unshift(...events);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Submit a batch of events to the API\n */\n private async submitBatch(events: ZauthEvent[], retryCount = 0): Promise<EventSubmitResponse> {\n const batch: EventBatch = {\n events,\n batchId: generateBatchId(),\n sentAt: new Date().toISOString(),\n };\n\n this.log('Submitting batch', { batchId: batch.batchId, eventCount: events.length });\n\n try {\n const response = await fetch(`${this.config.apiEndpoint}/api/sdk/events`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n 'X-SDK-Version': SDK_VERSION,\n 'X-Environment': this.config.environment,\n },\n body: JSON.stringify(batch),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`API error ${response.status}: ${errorText}`);\n }\n\n const result = await response.json() as EventSubmitResponse;\n this.log('Batch submitted', { batchId: batch.batchId, accepted: result.accepted });\n return result;\n\n } catch (error) {\n this.log('Batch submission failed', { batchId: batch.batchId, error: (error as Error).message });\n\n // Retry logic\n if (this.config.batching.retry && retryCount < this.config.batching.maxRetries) {\n const delay = Math.min(1000 * Math.pow(2, retryCount), 10000);\n this.log('Retrying batch', { batchId: batch.batchId, retryCount: retryCount + 1, delay });\n await new Promise(resolve => setTimeout(resolve, delay));\n return this.submitBatch(events, retryCount + 1);\n }\n\n throw error;\n }\n }\n\n /**\n * Check endpoint status from zauthx402 registry\n */\n async checkEndpoint(url: string): Promise<{\n verified: boolean;\n working: boolean;\n meaningful: boolean;\n lastChecked?: string;\n uptime?: number;\n }> {\n try {\n const response = await fetch(`${this.config.apiEndpoint}/api/verification/check`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify({ url }),\n });\n\n if (!response.ok) {\n return { verified: false, working: false, meaningful: false };\n }\n\n const data = await response.json() as Record<string, unknown>;\n return {\n verified: data.verified as boolean ?? false,\n working: data.working as boolean ?? false,\n meaningful: data.meaningful as boolean ?? false,\n lastChecked: data.checkedAt as string | undefined,\n uptime: data.uptime as number | undefined,\n };\n } catch {\n return { verified: false, working: false, meaningful: false };\n }\n }\n\n /**\n * Request a refund for a bad response\n */\n async requestRefund(params: {\n url: string;\n requestEventId: string;\n paymentEventId: string;\n reason: string;\n details?: string;\n }): Promise<{ approved: boolean; refundId?: string; message?: string }> {\n try {\n const response = await fetch(`${this.config.apiEndpoint}/api/sdk/refund/request`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n },\n body: JSON.stringify(params),\n });\n\n const data = await response.json() as Record<string, unknown>;\n return {\n approved: data.approved as boolean ?? false,\n refundId: data.refundId as string | undefined,\n message: data.message as string | undefined,\n };\n } catch {\n return { approved: false, message: 'Failed to request refund' };\n }\n }\n\n /**\n * Get resolved configuration\n */\n getConfig(): ResolvedConfig {\n return this.config;\n }\n\n // ============================================\n // Refund Methods\n // ============================================\n\n /**\n * Get pending refunds that need to be executed\n * These are refunds that the server has approved based on bad response detection\n */\n async getPendingRefunds(limit = 10): Promise<PendingRefundsResponse> {\n try {\n const response = await fetch(`${this.config.apiEndpoint}/api/sdk/refunds/pending`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n 'X-SDK-Version': SDK_VERSION,\n },\n body: JSON.stringify({ limit }),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n this.log('Failed to get pending refunds', { status: response.status, error: errorText });\n return { refunds: [], total: 0, stats: { todayRefundedCents: 0, monthRefundedCents: 0 } };\n }\n\n const data = await response.json() as PendingRefundsResponse;\n this.log('Got pending refunds', { count: data.refunds.length, total: data.total });\n return data;\n\n } catch (error) {\n this.log('Error getting pending refunds', { error: (error as Error).message });\n return { refunds: [], total: 0, stats: { todayRefundedCents: 0, monthRefundedCents: 0 } };\n }\n }\n\n /**\n * Confirm that a refund was successfully executed\n */\n async confirmRefund(request: ConfirmRefundRequest): Promise<ConfirmRefundResponse> {\n try {\n const response = await fetch(`${this.config.apiEndpoint}/api/sdk/refunds/confirm`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n 'X-SDK-Version': SDK_VERSION,\n },\n body: JSON.stringify(request),\n });\n\n const data = await response.json() as ConfirmRefundResponse;\n\n if (data.success) {\n this.log('Refund confirmed', { refundId: request.refundId, txHash: request.txHash });\n } else {\n this.log('Refund confirmation failed', { refundId: request.refundId, status: data.status });\n }\n\n return data;\n\n } catch (error) {\n this.log('Error confirming refund', { refundId: request.refundId, error: (error as Error).message });\n return {\n success: false,\n refundId: request.refundId,\n status: 'ERROR',\n message: (error as Error).message,\n };\n }\n }\n\n /**\n * Reject/skip a pending refund\n */\n async rejectRefund(request: RejectRefundRequest): Promise<RejectRefundResponse> {\n try {\n const response = await fetch(`${this.config.apiEndpoint}/api/sdk/refunds/reject`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n 'X-SDK-Version': SDK_VERSION,\n },\n body: JSON.stringify(request),\n });\n\n const data = await response.json() as RejectRefundResponse;\n this.log('Refund rejected', { refundId: request.refundId, reason: request.reason });\n return data;\n\n } catch (error) {\n this.log('Error rejecting refund', { refundId: request.refundId, error: (error as Error).message });\n return {\n success: false,\n refundId: request.refundId,\n status: 'ERROR',\n };\n }\n }\n\n /**\n * Update provider's refund configuration on the server\n */\n async updateRefundConfig(config: {\n enabled?: boolean;\n maxRefundUsdCents?: number;\n dailyCapCents?: number;\n monthlyCapCents?: number;\n triggers?: {\n serverError?: boolean;\n timeout?: boolean;\n emptyResponse?: boolean;\n schemaValidation?: boolean;\n minMeaningfulness?: number;\n };\n }): Promise<{ success: boolean; message?: string }> {\n try {\n const response = await fetch(`${this.config.apiEndpoint}/api/sdk/refunds/config`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.config.apiKey,\n 'X-SDK-Version': SDK_VERSION,\n },\n body: JSON.stringify(config),\n });\n\n const data = await response.json() as { success: boolean; message?: string };\n this.log('Refund config updated', { success: data.success });\n return data;\n\n } catch (error) {\n this.log('Error updating refund config', { error: (error as Error).message });\n return { success: false, message: (error as Error).message };\n }\n }\n\n /**\n * Get refund history/stats\n */\n async getRefundStats(days = 30): Promise<{\n totalRefunds: number;\n totalAmountCents: number;\n byReason: Record<string, number>;\n byEndpoint: Record<string, { count: number; amountCents: number }>;\n dailyTotals: Array<{ date: string; count: number; amountCents: number }>;\n }> {\n try {\n const response = await fetch(`${this.config.apiEndpoint}/api/sdk/refunds/stats?days=${days}`, {\n headers: {\n 'X-API-Key': this.config.apiKey,\n 'X-SDK-Version': SDK_VERSION,\n },\n });\n\n if (!response.ok) {\n return {\n totalRefunds: 0,\n totalAmountCents: 0,\n byReason: {},\n byEndpoint: {},\n dailyTotals: [],\n };\n }\n\n return await response.json() as {\n totalRefunds: number;\n totalAmountCents: number;\n byReason: Record<string, number>;\n byEndpoint: Record<string, { count: number; amountCents: number }>;\n dailyTotals: Array<{ date: string; count: number; amountCents: number }>;\n };\n\n } catch (error) {\n this.log('Error getting refund stats', { error: (error as Error).message });\n return {\n totalRefunds: 0,\n totalAmountCents: 0,\n byReason: {},\n byEndpoint: {},\n dailyTotals: [],\n };\n }\n }\n\n /**\n * Shutdown client gracefully\n */\n async shutdown(): Promise<void> {\n this.log('Shutting down client');\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n}\n\n/**\n * Create a new ZauthClient instance\n */\nexport function createClient(config: ZauthConfig): ZauthClient {\n return new ZauthClient(config);\n}\n","/**\n * Implementation-agnostic x402 types\n * These types are designed to work with any x402 implementation\n * (coinbase/@x402, custom implementations, etc.)\n */\n\n/**\n * Supported blockchain networks\n */\nexport type X402Network =\n | 'base'\n | 'base-sepolia'\n | 'solana'\n | 'solana-devnet'\n | 'solana-testnet'\n | string; // Allow custom networks\n\n/**\n * Payment scheme type\n */\nexport type X402Scheme = 'exact' | string;\n\n/**\n * x402 Version\n */\nexport type X402Version = 1 | 2;\n\n/**\n * Payment requirement from a 402 response\n */\nexport interface X402PaymentRequirement {\n scheme: X402Scheme;\n network: X402Network;\n payTo: string;\n asset: string;\n amount?: string;\n maxAmountRequired?: string;\n resource?: string;\n description?: string;\n extra?: Record<string, unknown>;\n}\n\n/**\n * 402 response body structure (V1)\n */\nexport interface X402ResponseV1 {\n x402Version: 1;\n accepts: X402PaymentRequirement[];\n resource?: string;\n}\n\n/**\n * 402 response body structure (V2)\n */\nexport interface X402ResponseV2 {\n x402Version: 2;\n paymentRequirements: X402PaymentRequirement[];\n}\n\n/**\n * Union of all 402 response formats\n */\nexport type X402Response = X402ResponseV1 | X402ResponseV2;\n\n/**\n * Payment payload sent in X-PAYMENT header\n */\nexport interface X402PaymentPayload {\n x402Version: X402Version;\n scheme: X402Scheme;\n network: X402Network;\n payload: unknown;\n}\n\n/**\n * Payment response header structure\n */\nexport interface X402PaymentResponse {\n success: boolean;\n transaction?: string;\n txSignature?: string;\n signature?: string;\n amount?: string;\n paidAmount?: string;\n network?: X402Network;\n payer?: string;\n from?: string;\n error?: string;\n}\n\n/**\n * Normalized payment info extracted from various x402 implementations\n */\nexport interface X402PaymentInfo {\n transactionHash: string | null;\n amountPaid: string | null;\n amountPaidUsdc: string | null;\n network: X402Network | null;\n payTo: string | null;\n asset: string | null;\n}\n\n/**\n * Helper to parse 402 response (works with V1 and V2)\n */\nexport function parseX402Response(body: unknown): X402Response | null {\n if (!body || typeof body !== 'object') {\n return null;\n }\n\n const data = body as Record<string, unknown>;\n\n // V2 format\n if (data.x402Version === 2 && Array.isArray(data.paymentRequirements)) {\n return data as unknown as X402ResponseV2;\n }\n\n // V1 format with explicit version\n if (data.x402Version === 1 && Array.isArray(data.accepts)) {\n return data as unknown as X402ResponseV1;\n }\n\n // V1 format without version field (common in older implementations)\n if (Array.isArray(data.accepts)) {\n return {\n x402Version: 1,\n accepts: data.accepts as X402PaymentRequirement[],\n resource: data.resource as string | undefined,\n };\n }\n\n // Direct V1 format (single payment requirement, no accepts array)\n if (\n typeof data.scheme === 'string' &&\n typeof data.network === 'string' &&\n typeof data.payTo === 'string'\n ) {\n return {\n x402Version: 1,\n accepts: [data as unknown as X402PaymentRequirement],\n };\n }\n\n return null;\n}\n\n/**\n * Extract payment requirements from any x402 response format\n */\nexport function getPaymentRequirements(\n response: X402Response\n): X402PaymentRequirement[] {\n if (response.x402Version === 2) {\n return (response as X402ResponseV2).paymentRequirements;\n }\n return (response as X402ResponseV1).accepts;\n}\n\n/**\n * Extract price in USDC (6 decimals) from payment requirement\n */\nexport function getPriceUsdc(requirement: X402PaymentRequirement): string | null {\n const amount = requirement.amount || requirement.maxAmountRequired;\n if (!amount) return null;\n\n try {\n const value = BigInt(amount);\n return (Number(value) / 1_000_000).toFixed(6);\n } catch {\n return null;\n }\n}\n\n/**\n * Decode X-PAYMENT-RESPONSE header\n */\nexport function decodePaymentResponse(\n header: string\n): X402PaymentResponse | null {\n try {\n const decoded = Buffer.from(header, 'base64').toString('utf-8');\n return JSON.parse(decoded) as X402PaymentResponse;\n } catch {\n return null;\n }\n}\n\n/**\n * Encode payment payload for X-PAYMENT header\n */\nexport function encodePaymentPayload(payload: X402PaymentPayload): string {\n return Buffer.from(JSON.stringify(payload)).toString('base64');\n}\n","/**\n * Utility functions for zauthSDK\n */\n\nimport type { TelemetryConfig } from './types/config.js';\n\n/**\n * USDC has 6 decimals, so 1 USDC = 1,000,000 base units\n */\nexport const USDC_DECIMALS = 1_000_000;\n\n/**\n * Convert base units to USDC decimal string\n */\nexport function baseUnitsToUsdc(baseUnits: string | number): string {\n return (Number(baseUnits) / USDC_DECIMALS).toFixed(6);\n}\n\n/**\n * Extract base URL without query parameters\n */\nexport function getBaseUrl(url: string): string {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return url;\n }\n}\n\n/**\n * Parse query parameters from URL\n */\nexport function parseQueryParams(url: string): Record<string, string> {\n try {\n const parsed = new URL(url);\n const params: Record<string, string> = {};\n parsed.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n return params;\n } catch {\n return {};\n }\n}\n\n/**\n * Redact sensitive headers\n */\nexport function redactHeaders(\n headers: Record<string, string | string[] | undefined>,\n redactList: string[]\n): Record<string, string> {\n const result: Record<string, string> = {};\n const redactSet = new Set(redactList.map(h => h.toLowerCase()));\n\n for (const [key, value] of Object.entries(headers)) {\n if (value === undefined) continue;\n const headerValue = Array.isArray(value) ? value.join(', ') : value;\n\n if (redactSet.has(key.toLowerCase())) {\n result[key] = '[REDACTED]';\n } else {\n result[key] = headerValue;\n }\n }\n\n return result;\n}\n\n/**\n * Redact sensitive fields from an object\n */\nexport function redactFields(\n obj: unknown,\n fields: string[]\n): unknown {\n if (!obj || typeof obj !== 'object' || fields.length === 0) {\n return obj;\n }\n\n const fieldSet = new Set(fields);\n\n function redactRecursive(current: unknown, path: string): unknown {\n if (!current || typeof current !== 'object') {\n return current;\n }\n\n if (Array.isArray(current)) {\n return current.map((item, i) => redactRecursive(item, `${path}[${i}]`));\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(current)) {\n const fullPath = path ? `${path}.${key}` : key;\n\n if (fieldSet.has(key) || fieldSet.has(fullPath)) {\n result[key] = '[REDACTED]';\n } else if (typeof value === 'object' && value !== null) {\n result[key] = redactRecursive(value, fullPath);\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n return redactRecursive(obj, '');\n}\n\n/**\n * Truncate body to max size\n */\nexport function truncateBody(body: unknown, maxSize: number): unknown {\n if (body === undefined || body === null) {\n return body;\n }\n\n const str = typeof body === 'string' ? body : JSON.stringify(body);\n\n if (str.length <= maxSize) {\n return body;\n }\n\n // For strings, truncate directly\n if (typeof body === 'string') {\n return str.slice(0, maxSize) + '...[TRUNCATED]';\n }\n\n // For objects, try to parse truncated JSON or return indicator\n return { _truncated: true, _originalSize: str.length, _preview: str.slice(0, 200) };\n}\n\n/**\n * Process body for telemetry (redact + truncate)\n */\nexport function processBody(\n body: unknown,\n config: TelemetryConfig\n): unknown {\n if (body === undefined || body === null) {\n return body;\n }\n\n let processed: unknown = body;\n\n // Redact fields\n if (config.redactFields && config.redactFields.length > 0) {\n processed = redactFields(processed, config.redactFields);\n }\n\n // Truncate\n if (config.maxBodySize) {\n processed = truncateBody(processed, config.maxBodySize);\n }\n\n return processed;\n}\n\n/**\n * Calculate byte size of a value\n */\nexport function getByteSize(value: unknown): number {\n if (value === undefined || value === null) {\n return 0;\n }\n\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n return Buffer.byteLength(str, 'utf8');\n}\n\n/**\n * Check if should sample this event\n */\nexport function shouldSample(sampleRate: number): boolean {\n if (sampleRate >= 1) return true;\n if (sampleRate <= 0) return false;\n return Math.random() < sampleRate;\n}\n\n/**\n * Safe JSON parse\n */\nexport function safeJsonParse(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return null;\n }\n}\n\n/**\n * Check if response body indicates an error\n */\nexport function hasErrorIndicators(\n body: unknown,\n errorFields: string[] = ['error', 'errors']\n): boolean {\n if (!body || typeof body !== 'object') {\n return false;\n }\n\n const obj = body as Record<string, unknown>;\n\n for (const field of errorFields) {\n if (field in obj && obj[field] !== undefined && obj[field] !== null) {\n // Check if the field has actual content\n const value = obj[field];\n if (typeof value === 'string' && value.length > 0) return true;\n if (typeof value === 'object' && Object.keys(value as object).length > 0) return true;\n if (typeof value === 'boolean' && value === true) return true;\n }\n }\n\n // Check for ok: false or success: false\n if (obj.ok === false || obj.success === false) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if body is empty or minimal\n */\nexport function isEmptyResponse(body: unknown, minSize: number = 2): boolean {\n if (body === undefined || body === null || body === '') {\n return true;\n }\n\n if (typeof body === 'string') {\n return body.trim().length < minSize;\n }\n\n if (typeof body === 'object') {\n // Empty object or array\n if (Array.isArray(body)) {\n return body.length === 0;\n }\n return Object.keys(body).length === 0;\n }\n\n return false;\n}\n\n/**\n * Payment info extracted from headers or request\n */\nexport interface ExtractedPaymentInfo {\n paymentHeader: string | null;\n paymentResponse: {\n transactionHash: string | null;\n amountPaid: string | null;\n amountPaidUsdc: string | null;\n network: string | null;\n payTo: string | null;\n asset: string | null;\n payer: string | null;\n } | null;\n}\n\n/**\n * Extract payment info from response headers\n */\nexport function extractPaymentFromHeaders(headers: Record<string, string | string[] | undefined>): ExtractedPaymentInfo {\n const getHeader = (name: string): string | null => {\n const value = headers[name] || headers[name.toLowerCase()];\n if (!value) return null;\n return Array.isArray(value) ? value[0] : value;\n };\n\n const paymentHeader = getHeader('X-PAYMENT') || getHeader('Payment-Signature');\n const paymentResponseHeader = getHeader('X-PAYMENT-RESPONSE') || getHeader('Payment-Response');\n\n // Try to parse X-PAYMENT-RESPONSE header as JSON\n let paymentResponse: ExtractedPaymentInfo['paymentResponse'] = null;\n if (paymentResponseHeader) {\n try {\n const parsed = JSON.parse(paymentResponseHeader);\n paymentResponse = {\n transactionHash: parsed.transactionHash || parsed.txHash || parsed.hash || null,\n amountPaid: parsed.amountPaid || parsed.amount || null,\n amountPaidUsdc: parsed.amountPaidUsdc || parsed.amountUsdc || null,\n network: parsed.network || parsed.chain || null,\n payTo: parsed.payTo || parsed.recipient || parsed.to || null,\n asset: parsed.asset || parsed.token || null,\n payer: parsed.payer || parsed.from || parsed.sender || null,\n };\n } catch {\n // Header is not JSON, might be a reference or signature\n }\n }\n\n return {\n paymentHeader,\n paymentResponse,\n };\n}\n\n/**\n * Extract payment info from Express request object (x402 middleware attaches this)\n */\nexport function extractPaymentFromRequest(req: Record<string, unknown>): ExtractedPaymentInfo['paymentResponse'] | null {\n // Check common locations where x402 middleware might attach payment info\n const paymentInfo = req.paymentInfo || req.x402Payment || req.payment;\n if (!paymentInfo || typeof paymentInfo !== 'object') {\n return null;\n }\n\n const info = paymentInfo as Record<string, unknown>;\n return {\n transactionHash: (info.transactionHash || info.txHash || info.hash || null) as string | null,\n amountPaid: (info.amountPaid || info.amount || null) as string | null,\n amountPaidUsdc: (info.amountPaidUsdc || info.amountUsdc || null) as string | null,\n network: (info.network || info.chain || null) as string | null,\n payTo: (info.payTo || info.recipient || info.to || null) as string | null,\n asset: (info.asset || info.token || null) as string | null,\n payer: (info.payer || info.from || info.sender || null) as string | null,\n };\n}\n\n/**\n * Decode X-PAYMENT header to extract payer info\n * The X-PAYMENT header contains a base64-encoded JSON with payment details\n *\n * x402 V2 format: {\"x402Version\":2,\"payload\":{\"authorization\":{\"from\":\"0x...\"}}}\n * x402 V1 format: varies\n */\nexport function decodePaymentHeader(paymentHeader: string | null): { payer: string | null; amount: string | null; network: string | null } | null {\n if (!paymentHeader) return null;\n\n try {\n // Try to decode as base64 first\n let decoded: string;\n try {\n // Use Buffer for Node.js compatibility\n if (typeof Buffer !== 'undefined') {\n decoded = Buffer.from(paymentHeader, 'base64').toString('utf-8');\n } else {\n decoded = atob(paymentHeader);\n }\n } catch {\n // Not base64, try as JSON directly\n decoded = paymentHeader;\n }\n\n const parsed = JSON.parse(decoded);\n\n // x402 V2 format: payload.authorization.from\n // x402 V1 format: varies\n const payer =\n parsed.payload?.authorization?.from || // x402 V2\n parsed.payer ||\n parsed.from ||\n parsed.payload?.from ||\n parsed.x?.signature?.address ||\n null;\n\n const amount =\n parsed.payload?.authorization?.value || // x402 V2\n parsed.amount ||\n parsed.payload?.amount ||\n null;\n\n const network =\n parsed.payload?.authorization?.network || // x402 V2\n parsed.network ||\n parsed.payload?.network ||\n null;\n\n return { payer, amount, network };\n } catch {\n // Could not decode payment header\n return null;\n }\n}\n\n/**\n * Detect x402 version from response\n */\nexport function detectX402Version(body: unknown): 1 | 2 | null {\n if (!body || typeof body !== 'object') {\n return null;\n }\n\n const obj = body as Record<string, unknown>;\n\n if (obj.x402Version === 2) return 2;\n if (obj.x402Version === 1) return 1;\n if (obj.paymentRequirements) return 2;\n if (obj.accepts || (obj.scheme && obj.network && obj.payTo)) return 1;\n\n return null;\n}\n","/**\n * Response validator for determining if responses are \"meaningful\"\n */\n\nimport type { ValidationConfig } from './types/config.js';\nimport type { ValidationResult, ValidationCheck } from './types/events.js';\nimport { isEmptyResponse, hasErrorIndicators } from './utils.js';\n\n/**\n * Validate a response against configured rules\n */\nexport function validateResponse(\n body: unknown,\n statusCode: number,\n config: ValidationConfig\n): ValidationResult {\n const checks: ValidationCheck[] = [];\n let meaningfulnessScore = 1.0;\n\n // Check 1: Status code\n const isSuccessStatus = statusCode >= 200 && statusCode < 300;\n checks.push({\n name: 'status_code',\n passed: isSuccessStatus,\n message: isSuccessStatus ? 'Success status code' : `Non-success status: ${statusCode}`,\n });\n if (!isSuccessStatus) {\n meaningfulnessScore -= 0.3;\n }\n\n // Check 2: Not empty\n const isEmpty = isEmptyResponse(body, config.minResponseSize ?? 2);\n checks.push({\n name: 'not_empty',\n passed: !isEmpty,\n message: isEmpty ? 'Response is empty or too small' : 'Response has content',\n });\n if (isEmpty) {\n meaningfulnessScore -= 0.4;\n }\n\n // Check 3: No error indicators\n const hasErrors = hasErrorIndicators(body, config.errorFields);\n checks.push({\n name: 'no_error_fields',\n passed: !hasErrors,\n message: hasErrors ? 'Response contains error indicators' : 'No error indicators found',\n });\n if (hasErrors) {\n meaningfulnessScore -= 0.3;\n }\n\n // Check 4: Required fields present\n if (config.requiredFields && config.requiredFields.length > 0) {\n const missingFields: string[] = [];\n\n if (body && typeof body === 'object' && !Array.isArray(body)) {\n const obj = body as Record<string, unknown>;\n for (const field of config.requiredFields) {\n if (!(field in obj) || obj[field] === undefined || obj[field] === null) {\n missingFields.push(field);\n }\n }\n } else {\n missingFields.push(...config.requiredFields);\n }\n\n const hasRequired = missingFields.length === 0;\n checks.push({\n name: 'required_fields',\n passed: hasRequired,\n message: hasRequired\n ? 'All required fields present'\n : `Missing fields: ${missingFields.join(', ')}`,\n });\n if (!hasRequired) {\n meaningfulnessScore -= 0.2;\n }\n }\n\n // Check 5: Empty collections\n if (config.rejectEmptyCollections && body && typeof body === 'object') {\n const hasEmptyCollection = checkEmptyCollections(body);\n checks.push({\n name: 'non_empty_collections',\n passed: !hasEmptyCollection,\n message: hasEmptyCollection\n ? 'Response contains empty arrays or objects'\n : 'Collections have content',\n });\n if (hasEmptyCollection) {\n meaningfulnessScore -= 0.1;\n }\n }\n\n // Check 6: Custom validator\n if (config.customValidator) {\n try {\n const customResult = config.customValidator(body, statusCode);\n checks.push(...customResult.checks);\n if (!customResult.valid) {\n meaningfulnessScore -= 0.3;\n }\n } catch (error) {\n checks.push({\n name: 'custom_validator',\n passed: false,\n message: `Custom validator error: ${(error as Error).message}`,\n });\n }\n }\n\n // Normalize score\n meaningfulnessScore = Math.max(0, Math.min(1, meaningfulnessScore));\n\n // Determine overall validity\n const valid = meaningfulnessScore >= 0.5 && isSuccessStatus && !isEmpty;\n\n // Build reason if not valid\n let reason: string | undefined;\n if (!valid) {\n const failedChecks = checks.filter(c => !c.passed);\n reason = failedChecks.map(c => c.message).join('; ');\n }\n\n return {\n valid,\n checks,\n meaningfulnessScore,\n reason,\n };\n}\n\n/**\n * Check if object has empty collections at top level\n */\nfunction checkEmptyCollections(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n // Check if the object itself is empty\n if (Array.isArray(obj)) {\n return obj.length === 0;\n }\n\n const entries = Object.entries(obj as Record<string, unknown>);\n if (entries.length === 0) {\n return true;\n }\n\n // Check top-level values for empty arrays/objects (common pattern)\n for (const [, value] of entries) {\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n if (value && typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length === 0) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Simple schema validator (basic implementation)\n * For production, consider using ajv or zod\n */\nexport function validateSchema(\n body: unknown,\n schema: Record<string, unknown>\n): ValidationResult {\n const checks: ValidationCheck[] = [];\n\n // Basic type check\n const expectedType = schema.type as string;\n const actualType = Array.isArray(body) ? 'array' : typeof body;\n\n if (expectedType && expectedType !== actualType) {\n checks.push({\n name: 'type',\n passed: false,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n return {\n valid: false,\n checks,\n meaningfulnessScore: 0,\n reason: `Type mismatch: expected ${expectedType}`,\n };\n }\n\n checks.push({\n name: 'type',\n passed: true,\n message: `Type is ${actualType}`,\n });\n\n // Check required properties for objects\n if (schema.required && Array.isArray(schema.required) && typeof body === 'object' && body !== null) {\n const obj = body as Record<string, unknown>;\n const missing = (schema.required as string[]).filter(prop => !(prop in obj));\n\n if (missing.length > 0) {\n checks.push({\n name: 'required_properties',\n passed: false,\n message: `Missing required: ${missing.join(', ')}`,\n });\n return {\n valid: false,\n checks,\n meaningfulnessScore: 0.3,\n reason: `Missing required properties: ${missing.join(', ')}`,\n };\n }\n\n checks.push({\n name: 'required_properties',\n passed: true,\n message: 'All required properties present',\n });\n }\n\n return {\n valid: true,\n checks,\n meaningfulnessScore: 1.0,\n };\n}\n\n/**\n * Create a validator from a JSON schema\n */\nexport function createSchemaValidator(\n schema: Record<string, unknown>\n): (body: unknown, statusCode: number) => ValidationResult {\n return (body: unknown, _statusCode: number) => validateSchema(body, schema);\n}\n","/**\n * Refund handler for automatic refunds on bad responses\n *\n * This is an OPTIONAL feature that requires:\n * 1. viem package installed\n * 2. Provider's hot wallet private key configured\n *\n * The refund flow:\n * 1. SDK detects bad response (via validator)\n * 2. SDK reports to zauthx402 service\n * 3. If service approves, SDK triggers refund using provider's hot wallet\n */\n\nimport type { RefundConfig } from './types/config.js';\nimport type { RefundEvent, RefundReason, ValidationResult } from './types/events.js';\nimport type { X402Network } from './types/x402.js';\nimport { ZauthClient } from './client.js';\n\n/**\n * Refund request parameters\n */\nexport interface RefundRequest {\n /** Original payment transaction hash */\n paymentTxHash: string;\n /** Amount to refund (in base units) */\n amount: string;\n /** Recipient address (original payer) */\n refundTo: string;\n /** Asset address (e.g., USDC contract) */\n asset: string;\n /** Network */\n network: X402Network;\n /** Reason for refund */\n reason: RefundReason;\n /** Additional details */\n details?: string;\n /** Request event ID for tracking */\n requestEventId: string;\n /** Payment event ID for tracking */\n paymentEventId: string;\n /** Endpoint URL */\n url: string;\n}\n\n/**\n * Refund result\n */\nexport interface RefundResult {\n success: boolean;\n transactionHash?: string;\n error?: string;\n}\n\n/**\n * RefundHandler manages automatic refunds for providers\n */\nexport class RefundHandler {\n private config: RefundConfig;\n private client: ZauthClient;\n private viemAvailable = false;\n\n constructor(config: RefundConfig, client: ZauthClient) {\n this.config = config;\n this.client = client;\n\n // Check if viem is available\n this.checkViemAvailability();\n }\n\n private async checkViemAvailability(): Promise<void> {\n try {\n await import('viem');\n this.viemAvailable = true;\n } catch {\n this.viemAvailable = false;\n if (this.config.enabled) {\n console.warn(\n '[zauthSDK] Refunds are enabled but viem is not installed. ' +\n 'Install viem to enable automatic refunds: npm install viem'\n );\n }\n }\n }\n\n /**\n * Check if refunds are available\n */\n isAvailable(): boolean {\n return this.config.enabled === true && this.viemAvailable && !!this.getPrivateKey();\n }\n\n /**\n * Get private key from config or env\n */\n private getPrivateKey(): string | undefined {\n return this.config.privateKey || process.env.ZAUTH_REFUND_PRIVATE_KEY;\n }\n\n /**\n * Check if a response should trigger a refund\n */\n shouldRefund(validationResult: ValidationResult, statusCode: number): RefundReason | null {\n if (!this.config.enabled) {\n return null;\n }\n\n const triggers = this.config.triggers;\n if (!triggers) {\n return null;\n }\n\n // Check server error\n if (triggers.serverError && statusCode >= 500) {\n return 'server_error';\n }\n\n // Check empty response\n if (triggers.emptyResponse) {\n const isEmpty = validationResult.checks.some(c => c.name === 'not_empty' && !c.passed);\n if (isEmpty) {\n return 'empty_response';\n }\n }\n\n // Check schema validation\n if (triggers.schemaValidation && !validationResult.valid) {\n return 'schema_validation_failed';\n }\n\n // Check meaningfulness threshold\n if (triggers.minMeaningfulness !== undefined) {\n if (validationResult.meaningfulnessScore < triggers.minMeaningfulness) {\n return 'invalid_response';\n }\n }\n\n return null;\n }\n\n /**\n * Process a refund\n */\n async processRefund(request: RefundRequest): Promise<RefundResult> {\n if (!this.isAvailable()) {\n return { success: false, error: 'Refunds not available' };\n }\n\n const privateKey = this.getPrivateKey();\n if (!privateKey) {\n return { success: false, error: 'No private key configured' };\n }\n\n // Check max refund amount\n const maxRefundUsd = this.config.maxRefundUsd ?? 1.00;\n const maxRefundBaseUnits = BigInt(Math.floor(maxRefundUsd * 1_000_000));\n const requestAmount = BigInt(request.amount);\n if (requestAmount > maxRefundBaseUnits) {\n return {\n success: false,\n error: `Refund amount ${request.amount} exceeds max ${maxRefundBaseUnits}`,\n };\n }\n\n // Check with service first (now using polling-based system)\n const approval = await this.client.requestRefund({\n url: request.url,\n requestEventId: request.requestEventId,\n paymentEventId: request.paymentEventId,\n reason: request.reason,\n details: request.details,\n });\n\n if (!approval.approved) {\n return { success: false, error: approval.message || 'Service denied refund' };\n }\n\n // Execute the refund based on network\n try {\n const result = await this.executeRefund(request, privateKey);\n\n // Report refund event\n if (result.success && result.transactionHash) {\n const refundEvent: RefundEvent = {\n ...this.client.createEventBase('refund'),\n type: 'refund',\n requestEventId: request.requestEventId,\n paymentEventId: request.paymentEventId,\n url: request.url,\n refundTransactionHash: result.transactionHash,\n amountRefunded: request.amount,\n amountRefundedUsdc: (Number(request.amount) / 1_000_000).toFixed(6),\n refundTo: request.refundTo,\n reason: request.reason,\n details: request.details,\n };\n this.client.queueEvent(refundEvent);\n }\n\n return result;\n } catch (error) {\n return { success: false, error: (error as Error).message };\n }\n }\n\n /**\n * Execute the actual refund transaction\n */\n private async executeRefund(request: RefundRequest, privateKey: string): Promise<RefundResult> {\n // Dynamically import viem\n const viem = await import('viem');\n const { createWalletClient, http, parseAbi } = viem;\n const { privateKeyToAccount } = await import('viem/accounts');\n const { base, baseSepolia } = await import('viem/chains');\n\n // Determine chain\n const chain = request.network === 'base-sepolia' ? baseSepolia : base;\n\n // Create account from private key\n const normalizedKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;\n const account = privateKeyToAccount(normalizedKey as `0x${string}`);\n\n // Create wallet client\n const client = createWalletClient({\n account,\n chain,\n transport: http(),\n });\n\n // ERC20 transfer ABI\n const erc20Abi = parseAbi([\n 'function transfer(address to, uint256 amount) returns (bool)',\n ]);\n\n // Execute transfer\n const hash = await client.writeContract({\n address: request.asset as `0x${string}`,\n abi: erc20Abi,\n functionName: 'transfer',\n args: [request.refundTo as `0x${string}`, BigInt(request.amount)],\n });\n\n return { success: true, transactionHash: hash };\n }\n}\n\n/**\n * Create a refund handler\n */\nexport function createRefundHandler(config: RefundConfig, client: ZauthClient): RefundHandler {\n return new RefundHandler(config, client);\n}\n\n// ============================================\n// Refund Executor - WebSocket-based refund execution\n// ============================================\n\nimport type {\n ResolvedRefundConfig,\n EndpointRefundConfig,\n ExecutedRefund,\n RefundError,\n} from './types/config.js';\nimport type { PendingRefund } from './types/events.js';\n\n// WebSocket implementation - resolved at runtime\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WebSocketImpl: any = typeof WebSocket !== 'undefined' ? WebSocket : null;\n\nasync function getWebSocket(): Promise<typeof WebSocket | null> {\n if (WebSocketImpl) return WebSocketImpl;\n\n // Node.js environment - dynamically import ws\n try {\n const ws = await import('ws');\n WebSocketImpl = ws.default || ws;\n return WebSocketImpl;\n } catch {\n return null;\n }\n}\n\n/**\n * RefundExecutor handles real-time refund notifications via WebSocket\n * This is the bulletproof refund system where:\n * 1. SDK sends events to backend\n * 2. Backend analyzes, creates refund requests, stores in Redis\n * 3. Backend pushes refunds to SDK via WebSocket in real-time\n * 4. SDK executes refunds and confirms via WebSocket\n * 5. If SDK disconnects, pending refunds are resent on reconnect\n */\nexport class RefundExecutor {\n private client: ZauthClient;\n private config: ResolvedRefundConfig;\n private debug: boolean;\n private ws: InstanceType<typeof WebSocket> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectAttempts = 0;\n private baseReconnectDelay = 1000;\n private persistentRetryDelay = 60000; // 60s in persistent phase\n private fastPhaseAttempts = 5; // Switch to persistent after 5 attempts\n private isShuttingDown = false;\n private pingInterval: ReturnType<typeof setInterval> | null = null;\n\n // Track daily/monthly totals locally for quick cap checks\n private todayRefundedCents = 0;\n private monthRefundedCents = 0;\n private lastCapResetDate = new Date().toISOString().split('T')[0]; // YYYY-MM-DD\n private lastCapResetMonth = new Date().toISOString().slice(0, 7); // YYYY-MM\n\n constructor(client: ZauthClient, config: ResolvedRefundConfig, debug = false) {\n this.client = client;\n this.config = config;\n this.debug = debug;\n }\n\n /**\n * Start the WebSocket connection for refund notifications\n */\n start(): void {\n if (!this.config.enabled) {\n this.log('Refund executor not enabled');\n return;\n }\n\n if (!this.config.signer && !this.config.privateKey) {\n this.log('Refund executor requires signer or privateKey');\n return;\n }\n\n this.log('Starting refund executor (WebSocket mode)', {\n maxRefundUsd: this.config.maxRefundUsd,\n });\n\n this.connect();\n }\n\n /**\n * Connect to the WebSocket server\n */\n private async connect(): Promise<void> {\n if (this.isShuttingDown) {\n return;\n }\n\n const WS = await getWebSocket();\n if (!WS) {\n this.log('WebSocket not available - install \"ws\" package for Node.js');\n return;\n }\n\n const clientConfig = this.client.getConfig();\n const wsEndpoint = clientConfig.apiEndpoint\n .replace('https://', 'wss://')\n .replace('http://', 'ws://');\n\n const wsUrl = `${wsEndpoint}/ws/refunds?apiKey=${encodeURIComponent(clientConfig.apiKey)}`;\n\n // Only log on first connection attempt\n if (this.reconnectAttempts === 0) {\n this.log('Connecting to refund WebSocket', { endpoint: wsEndpoint });\n }\n\n try {\n this.ws = new WS(wsUrl);\n\n this.ws.onopen = () => {\n if (this.reconnectAttempts > 0) {\n this.log('WebSocket reconnected');\n } else {\n this.log('WebSocket connected');\n }\n this.reconnectAttempts = 0;\n\n // Start ping interval to keep connection alive\n this.pingInterval = setInterval(() => {\n if (this.ws?.readyState === 1 /* WebSocket.OPEN */) {\n this.ws.send(JSON.stringify({ type: 'ping' }));\n }\n }, 30000);\n };\n\n this.ws.onmessage = (event) => {\n // Handle both string and Buffer (Node.js ws returns Buffer)\n const data = typeof event.data === 'string'\n ? event.data\n : event.data.toString();\n this.handleMessage(data);\n };\n\n this.ws.onclose = (event) => {\n // Only log on first disconnect, not on every retry failure\n if (this.reconnectAttempts === 0) {\n this.log('WebSocket disconnected', { code: event.code, reason: event.reason });\n }\n this.cleanup();\n this.scheduleReconnect();\n };\n\n this.ws.onerror = () => {\n // Silence error logs during retries — onclose handles reconnection\n };\n\n } catch (error) {\n this.scheduleReconnect();\n }\n }\n\n /**\n * Handle incoming WebSocket messages\n */\n private async handleMessage(data: string): Promise<void> {\n try {\n const msg = JSON.parse(data);\n\n switch (msg.type) {\n case 'connected':\n this.log('Registered with server', { providerId: msg.providerId });\n break;\n\n case 'refund_required':\n this.log('Refund required', { refundId: msg.refund.id, amount: msg.refund.amountUsd });\n await this.processSingleRefund(msg.refund);\n break;\n\n case 'confirmation_ack':\n this.log('Refund confirmation acknowledged', { refundId: msg.refundId, status: msg.status });\n break;\n\n case 'rejection_ack':\n this.log('Refund rejection acknowledged', { refundId: msg.refundId });\n break;\n\n case 'pong':\n // Server responded to ping\n break;\n\n default:\n this.log('Unknown message type', { type: msg.type });\n }\n } catch (error) {\n this.log('Error parsing WebSocket message', { error: (error as Error).message });\n }\n }\n\n /**\n * Process a single pending refund\n */\n private async processSingleRefund(refund: PendingRefund): Promise<void> {\n try {\n // Check endpoint-specific config\n const endpointConfig = this.getEndpointConfig(refund.url);\n\n // Check if refunds are enabled for this endpoint\n if (endpointConfig?.enabled === false) {\n this.log('Refunds disabled for endpoint', { url: refund.url });\n this.sendMessage({\n type: 'refund_rejected',\n refundId: refund.id,\n reason: 'OTHER',\n note: 'Refunds disabled for this endpoint',\n });\n return;\n }\n\n // Check max refund amount\n const maxUsd = endpointConfig?.maxRefundUsd ?? this.config.maxRefundUsd;\n if (refund.amountUsd > maxUsd) {\n this.log('Refund exceeds max', { refundId: refund.id, amountUsd: refund.amountUsd, maxUsd });\n this.sendMessage({\n type: 'refund_rejected',\n refundId: refund.id,\n reason: 'EXCEEDED_CAP',\n note: `Amount ${refund.amountUsd} exceeds max ${maxUsd}`,\n });\n return;\n }\n\n // Reset caps if date/month has changed\n const today = new Date().toISOString().split('T')[0];\n const thisMonth = new Date().toISOString().slice(0, 7);\n if (today !== this.lastCapResetDate) {\n this.todayRefundedCents = 0;\n this.lastCapResetDate = today;\n }\n if (thisMonth !== this.lastCapResetMonth) {\n this.monthRefundedCents = 0;\n this.lastCapResetMonth = thisMonth;\n }\n\n // Check daily cap\n if (this.config.dailyCapUsd) {\n const dailyCapCents = Math.floor(this.config.dailyCapUsd * 100);\n if (this.todayRefundedCents + refund.amountCents > dailyCapCents) {\n this.log('Daily cap exceeded', { refundId: refund.id });\n this.sendMessage({\n type: 'refund_rejected',\n refundId: refund.id,\n reason: 'EXCEEDED_CAP',\n note: 'Daily refund cap exceeded',\n });\n return;\n }\n }\n\n // Check monthly cap\n if (this.config.monthlyCapUsd) {\n const monthlyCapCents = Math.floor(this.config.monthlyCapUsd * 100);\n if (this.monthRefundedCents + refund.amountCents > monthlyCapCents) {\n this.log('Monthly cap exceeded', { refundId: refund.id });\n this.sendMessage({\n type: 'refund_rejected',\n refundId: refund.id,\n reason: 'EXCEEDED_CAP',\n note: 'Monthly refund cap exceeded',\n });\n return;\n }\n }\n\n // Execute the refund\n const result = await this.executeRefundTx(refund);\n\n if (result.success) {\n // Confirm via WebSocket\n this.sendMessage({\n type: 'refund_confirmed',\n refundId: refund.id,\n txHash: result.txHash,\n network: refund.network,\n amountRaw: result.amountRaw,\n token: 'USDC',\n gasCostCents: result.gasCostCents,\n });\n\n // Update local stats\n this.todayRefundedCents += refund.amountCents;\n this.monthRefundedCents += refund.amountCents;\n\n // Callback\n if (this.config.onRefund) {\n const executedRefund: ExecutedRefund = {\n refundId: refund.id,\n requestId: refund.sdkRequestEventId || '',\n url: refund.url,\n amountUsd: refund.amountUsd,\n amountRaw: result.amountRaw!,\n txHash: result.txHash!,\n network: refund.network,\n recipient: refund.recipientAddress,\n reason: refund.reason,\n executedAt: new Date().toISOString(),\n };\n await this.config.onRefund(executedRefund);\n }\n\n } else {\n this.log('Refund execution failed', { refundId: refund.id, error: result.error });\n\n // Don't reject on retryable errors - server will resend on reconnect\n if (!result.retryable) {\n this.sendMessage({\n type: 'refund_rejected',\n refundId: refund.id,\n reason: 'OTHER',\n note: result.error || 'Execution failed',\n });\n }\n\n // Callback\n if (this.config.onRefundError) {\n const refundError: RefundError = {\n refundId: refund.id,\n url: refund.url,\n amountUsd: refund.amountUsd,\n error: result.error || 'Unknown error',\n retryable: result.retryable ?? true,\n };\n await this.config.onRefundError(refundError);\n }\n }\n\n } catch (error) {\n this.log('Error processing refund', { refundId: refund.id, error: (error as Error).message });\n\n if (this.config.onRefundError) {\n await this.config.onRefundError({\n refundId: refund.id,\n url: refund.url,\n amountUsd: refund.amountUsd,\n error: (error as Error).message,\n retryable: true,\n });\n }\n }\n }\n\n /**\n * Send message via WebSocket\n */\n private sendMessage(msg: unknown): void {\n if (this.ws?.readyState === 1 /* WebSocket.OPEN */) {\n this.ws.send(JSON.stringify(msg));\n } else {\n this.log('Cannot send message - WebSocket not connected');\n }\n }\n\n /**\n * Schedule reconnection with two-phase strategy:\n * - Fast phase: exponential backoff (1s, 2s, 4s, 8s, 16s) for quick recovery\n * - Persistent phase: fixed 60s interval, retries indefinitely until reconnected\n */\n private scheduleReconnect(): void {\n if (this.isShuttingDown) {\n return;\n }\n\n let delay: number;\n if (this.reconnectAttempts < this.fastPhaseAttempts) {\n // Fast phase: exponential backoff\n delay = this.baseReconnectDelay * Math.pow(2, this.reconnectAttempts);\n } else {\n // Persistent phase: fixed interval\n if (this.reconnectAttempts === this.fastPhaseAttempts) {\n this.log('Server unreachable, retrying every 60s');\n }\n delay = this.persistentRetryDelay;\n }\n\n this.reconnectAttempts++;\n\n this.reconnectTimer = setTimeout(() => {\n this.connect();\n }, delay);\n }\n\n /**\n * Cleanup resources\n */\n private cleanup(): void {\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n }\n\n /**\n * Stop the WebSocket connection\n */\n stop(): void {\n this.isShuttingDown = true;\n\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n this.cleanup();\n\n if (this.ws) {\n this.ws.close(1000, 'Shutdown');\n this.ws = null;\n }\n\n this.log('Refund executor stopped');\n }\n\n /**\n * Execute a refund transaction on-chain\n */\n private async executeRefundTx(refund: PendingRefund): Promise<{\n success: boolean;\n txHash?: string;\n amountRaw?: string;\n gasCostCents?: number;\n error?: string;\n retryable?: boolean;\n }> {\n const network = refund.network;\n\n // Convert USD to token amount (USDC has 6 decimals)\n const amountRaw = String(Math.floor(refund.amountUsd * 1_000_000));\n\n try {\n if (network.startsWith('eip155:') || network === 'base' || network === 'ethereum') {\n return await this.executeEvmRefund(refund, amountRaw);\n } else if (network === 'solana' || network.startsWith('solana:')) {\n return await this.executeSolanaRefund(refund, amountRaw);\n } else {\n return {\n success: false,\n error: `Unsupported network: ${network}`,\n retryable: false,\n };\n }\n } catch (error) {\n return {\n success: false,\n error: (error as Error).message,\n retryable: true,\n };\n }\n }\n\n /**\n * Execute EVM refund (Base, Ethereum, etc.)\n */\n private async executeEvmRefund(refund: PendingRefund, amountRaw: string): Promise<{\n success: boolean;\n txHash?: string;\n amountRaw?: string;\n gasCostCents?: number;\n error?: string;\n retryable?: boolean;\n }> {\n const signer = this.config.signer || this.config.privateKey;\n if (!signer) {\n return { success: false, error: 'No signer configured', retryable: false };\n }\n\n try {\n // Dynamic import viem\n const { createWalletClient, http } = await import('viem');\n const { privateKeyToAccount } = await import('viem/accounts');\n const { base } = await import('viem/chains');\n\n // USDC contract address on Base\n const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';\n\n // Get account from signer\n const account = typeof signer === 'string'\n ? privateKeyToAccount(signer as `0x${string}`)\n : signer as ReturnType<typeof privateKeyToAccount>;\n\n // Create wallet client\n const client = createWalletClient({\n account,\n chain: base,\n transport: http(),\n });\n\n // ERC20 transfer ABI\n const erc20Abi = [\n {\n name: 'transfer',\n type: 'function',\n inputs: [\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n outputs: [{ type: 'bool' }],\n },\n ] as const;\n\n // Send transaction\n const hash = await client.writeContract({\n address: USDC_BASE,\n abi: erc20Abi,\n functionName: 'transfer',\n args: [refund.recipientAddress as `0x${string}`, BigInt(amountRaw)],\n });\n\n this.log('EVM refund sent', { txHash: hash, to: refund.recipientAddress, amount: amountRaw });\n\n return {\n success: true,\n txHash: hash,\n amountRaw,\n gasCostCents: 1, // TODO: Calculate actual gas cost\n };\n\n } catch (error) {\n this.log('EVM refund failed', { error: (error as Error).message });\n return {\n success: false,\n error: (error as Error).message,\n retryable: true,\n };\n }\n }\n\n /**\n * Execute Solana refund\n */\n private async executeSolanaRefund(_refund: PendingRefund, _amountRaw: string): Promise<{\n success: boolean;\n txHash?: string;\n amountRaw?: string;\n gasCostCents?: number;\n error?: string;\n retryable?: boolean;\n }> {\n // TODO: Implement Solana refund\n return {\n success: false,\n error: 'Solana refunds not yet implemented',\n retryable: false,\n };\n }\n\n /**\n * Get endpoint-specific config by matching URL patterns\n */\n private getEndpointConfig(url: string): EndpointRefundConfig | undefined {\n for (const [pattern, config] of Object.entries(this.config.endpoints)) {\n // Support * wildcard in patterns\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$');\n if (regex.test(url)) {\n return config;\n }\n }\n return undefined;\n }\n\n /**\n * Debug logger\n */\n private log(...args: unknown[]): void {\n if (this.debug) {\n console.log('[zauthSDK:refund]', ...args);\n }\n }\n}\n\n/**\n * Create a refund executor for WebSocket-based refunds\n */\nexport function createRefundExecutor(\n client: ZauthClient,\n config: ResolvedRefundConfig,\n debug = false\n): RefundExecutor {\n return new RefundExecutor(client, config, debug);\n}\n","/**\n * Express middleware for x402 providers\n *\n * This middleware observes requests and responses without interfering\n * with your existing x402 implementation (coinbase/@x402, custom, etc.)\n *\n * Usage:\n * import { createZauthMiddleware } from '@zauthx402/sdk/middleware';\n *\n * app.use(createZauthMiddleware({\n * apiKey: 'your-api-key',\n * mode: 'provider'\n * }));\n *\n * // Your existing x402 middleware and routes continue to work unchanged\n * app.use(x402Middleware(...));\n * app.get('/api/paid', ...);\n */\n\nimport type { Request, Response, NextFunction, RequestHandler } from 'express';\nimport type { ProviderMiddlewareConfig } from '../types/config.js';\nimport type { RequestEvent, ResponseEvent } from '../types/events.js';\nimport { ZauthClient } from '../client.js';\nimport { validateResponse } from '../validator.js';\nimport { RefundExecutor, createRefundExecutor } from '../refund.js';\nimport {\n getBaseUrl,\n parseQueryParams,\n redactHeaders,\n processBody,\n getByteSize,\n shouldSample,\n extractPaymentFromHeaders,\n extractPaymentFromRequest,\n decodePaymentHeader,\n baseUnitsToUsdc,\n} from '../utils.js';\n\n/**\n * Middleware options\n */\nexport interface ZauthMiddlewareOptions extends ProviderMiddlewareConfig {\n /**\n * Custom function to determine if a route should be monitored\n */\n shouldMonitor?: (req: Request) => boolean;\n}\n\n/**\n * Create zauth monitoring middleware for Express\n * Returns both the middleware and a cleanup function\n */\nexport function createZauthMiddleware(options: ZauthMiddlewareOptions): RequestHandler & {\n shutdown: () => Promise<void>;\n refundExecutor?: RefundExecutor;\n} {\n const client = new ZauthClient(options);\n const config = client.getConfig();\n\n // Build route matchers\n const includePatterns = options.includeRoutes?.map(p => new RegExp(p)) || [];\n const excludePatterns = options.excludeRoutes?.map(p => new RegExp(p)) || [];\n\n // Initialize refund executor if refunds are enabled\n let refundExecutor: RefundExecutor | undefined;\n if (config.refund.enabled && (config.refund.signer || config.refund.privateKey)) {\n refundExecutor = createRefundExecutor(client, config.refund, config.debug);\n refundExecutor.start();\n if (config.debug) {\n console.log('[zauthSDK] Refund executor started');\n }\n }\n\n /**\n * Check if route should be monitored\n */\n function shouldMonitorRoute(req: Request): boolean {\n // Custom override\n if (options.shouldMonitor) {\n return options.shouldMonitor(req);\n }\n\n const path = req.path;\n\n // Skip health checks if configured\n if (options.skipHealthChecks !== false) {\n if (path === '/health' || path === '/healthz' || path === '/ready' || path === '/_health') {\n return false;\n }\n }\n\n // Check excludes first\n for (const pattern of excludePatterns) {\n if (pattern.test(path)) {\n return false;\n }\n }\n\n // If includes specified, must match one\n if (includePatterns.length > 0) {\n for (const pattern of includePatterns) {\n if (pattern.test(path)) {\n return true;\n }\n }\n return false;\n }\n\n // Default: monitor all\n return true;\n }\n\n /**\n * The middleware function\n */\n const zauthMiddleware = function(req: Request, res: Response, next: NextFunction): void {\n // Check if should monitor\n if (!shouldMonitorRoute(req)) {\n next();\n return;\n }\n\n // Check sampling\n if (!shouldSample(config.telemetry.sampleRate)) {\n next();\n return;\n }\n\n const startTime = Date.now();\n\n // Build full URL\n const protocol = req.protocol;\n const host = req.get('host') || 'unknown';\n const fullUrl = `${protocol}://${host}${req.originalUrl}`;\n\n // Extract payment header from incoming request\n const incomingPaymentHeader = extractPaymentFromHeaders(req.headers as Record<string, string>).paymentHeader;\n\n // Debug: log incoming payment header\n if (config.debug && incomingPaymentHeader) {\n console.log('[zauthSDK:provider] Incoming X-PAYMENT header found for', fullUrl);\n console.log('[zauthSDK:provider] Header (first 100 chars):', incomingPaymentHeader.substring(0, 100));\n }\n\n // Create request event\n const requestEvent: RequestEvent = {\n ...client.createEventBase('request'),\n type: 'request',\n url: fullUrl,\n baseUrl: getBaseUrl(fullUrl),\n method: req.method,\n headers: redactHeaders(req.headers as Record<string, string>, config.telemetry.redactHeaders),\n queryParams: parseQueryParams(fullUrl),\n body: config.telemetry.includeRequestBody\n ? processBody(req.body, config.telemetry)\n : undefined,\n requestSize: getByteSize(req.body),\n sourceIp: req.ip || req.socket.remoteAddress,\n userAgent: req.get('user-agent'),\n paymentHeader: incomingPaymentHeader || undefined,\n };\n\n // Queue request event\n client.queueEvent(requestEvent);\n\n // Capture original response methods\n const originalJson = res.json.bind(res);\n const originalSend = res.send.bind(res);\n const originalEnd = res.end.bind(res);\n\n let responseSent = false;\n\n /**\n * Handle response capture\n */\n function captureResponse(body: unknown): void {\n if (responseSent) return;\n responseSent = true;\n\n const responseTime = Date.now() - startTime;\n const statusCode = res.statusCode;\n\n // Validate response\n const validationResult = validateResponse(body, statusCode, config.validation);\n\n // Extract payment response from response headers\n const { paymentResponse: headerPaymentResponse } = extractPaymentFromHeaders(\n res.getHeaders() as Record<string, string>\n );\n\n // Also check the request object (x402 middleware may attach payment info there)\n const reqPaymentInfo = extractPaymentFromRequest(req as unknown as Record<string, unknown>);\n\n // Try to decode payer from request's X-PAYMENT header\n const incomingPaymentHeader = requestEvent.paymentHeader;\n const decodedPayment = decodePaymentHeader(incomingPaymentHeader || null);\n\n // Debug: log decoded payment info\n if (config.debug && decodedPayment?.payer) {\n console.log('[zauthSDK:provider] Decoded payer from X-PAYMENT:', decodedPayment.payer);\n }\n\n // Also try to extract from X-PAYMENT-RESPONSE header on response (from facilitator)\n const xPaymentResponseHeader = res.getHeader('payment-response') || res.getHeader('x-payment-response');\n\n // Debug: log response headers for paid endpoints\n if (config.debug && fullUrl.includes('/api/paid')) {\n console.log('[zauthSDK:provider] Response headers for', fullUrl);\n const headers = res.getHeaders();\n Object.keys(headers).forEach(key => {\n const val = headers[key];\n console.log(` ${key}: ${typeof val === 'string' ? val.substring(0, 80) : val}`);\n });\n }\n\n let facilitatorResponse: { payer?: string; transaction?: string; network?: string } | null = null;\n if (xPaymentResponseHeader && typeof xPaymentResponseHeader === 'string') {\n try {\n const decoded = Buffer.from(xPaymentResponseHeader, 'base64').toString('utf-8');\n facilitatorResponse = JSON.parse(decoded);\n if (config.debug) {\n console.log('[zauthSDK:provider] Decoded facilitator response:', JSON.stringify(facilitatorResponse));\n }\n } catch {\n // Not valid base64 JSON\n }\n }\n\n // Merge payment info from all sources (prioritize facilitator response)\n let paymentResponse = reqPaymentInfo || headerPaymentResponse;\n\n // If we have facilitator response with payer, use that\n if (facilitatorResponse?.payer) {\n // Get default amount from config if available\n const defaultAmount = (options as unknown as Record<string, unknown>).defaultPaymentAmountUsdc as string | undefined;\n paymentResponse = {\n transactionHash: facilitatorResponse.transaction || null,\n amountPaid: null, // Amount not in facilitator response\n amountPaidUsdc: defaultAmount || null,\n network: facilitatorResponse.network || 'base',\n payTo: null,\n asset: 'USDC',\n payer: facilitatorResponse.payer,\n };\n }\n // Otherwise if we have decoded payment header, use that\n else if (!paymentResponse && decodedPayment?.payer && incomingPaymentHeader) {\n const defaultAmount = (options as unknown as Record<string, unknown>).defaultPaymentAmountUsdc as string | undefined;\n // decodedPayment.amount is in base units, convert to USDC\n const amountUsdc = decodedPayment.amount\n ? baseUnitsToUsdc(decodedPayment.amount)\n : defaultAmount || null;\n paymentResponse = {\n transactionHash: null,\n amountPaid: decodedPayment.amount,\n amountPaidUsdc: amountUsdc,\n network: decodedPayment.network || 'base',\n payTo: null,\n asset: 'USDC',\n payer: decodedPayment.payer,\n };\n if (config.debug) {\n console.log('[zauthSDK:provider] Created paymentResponse from X-PAYMENT header:', {\n payer: paymentResponse.payer,\n amountUsdc: paymentResponse.amountPaidUsdc,\n });\n }\n }\n\n // Fill in missing payer from decoded payment header\n if (paymentResponse && !paymentResponse.payer && decodedPayment?.payer) {\n paymentResponse = { ...paymentResponse, payer: decodedPayment.payer };\n }\n\n // If we have payment info, emit a separate payment event for tracking\n if (paymentResponse && (paymentResponse.transactionHash || paymentResponse.payer)) {\n const paymentEvent = {\n ...client.createEventBase('payment'),\n type: 'payment' as const,\n requestEventId: requestEvent.eventId,\n url: fullUrl,\n network: paymentResponse.network || 'base',\n transactionHash: paymentResponse.transactionHash || '',\n amountPaid: paymentResponse.amountPaid || '0',\n amountPaidUsdc: paymentResponse.amountPaidUsdc || '0',\n payTo: paymentResponse.payTo || '',\n asset: paymentResponse.asset || 'USDC',\n payer: paymentResponse.payer || '',\n scheme: 'exact',\n };\n client.queueEvent(paymentEvent);\n }\n\n // Look up expectedResponse from refund endpoint config\n let expectedResponse: string | undefined;\n if (config.refund.endpoints) {\n const requestPath = req.path;\n for (const [pattern, endpointConfig] of Object.entries(config.refund.endpoints)) {\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$');\n if (regex.test(requestPath) || regex.test(fullUrl)) {\n expectedResponse = endpointConfig.expectedResponse;\n break;\n }\n }\n }\n\n // Create response event\n const responseEvent: ResponseEvent = {\n ...client.createEventBase('response'),\n type: 'response',\n requestEventId: requestEvent.eventId,\n url: fullUrl,\n statusCode,\n headers: redactHeaders(\n res.getHeaders() as Record<string, string>,\n config.telemetry.redactHeaders\n ),\n body: config.telemetry.includeResponseBody\n ? processBody(body, config.telemetry)\n : undefined,\n responseSize: getByteSize(body),\n responseTimeMs: responseTime,\n success: validationResult.valid,\n meaningful: validationResult.meaningfulnessScore >= 0.7,\n validationResult,\n paymentResponse: paymentResponse || undefined,\n errorMessage: validationResult.reason,\n expectedResponse,\n };\n\n // Queue response event\n client.queueEvent(responseEvent);\n }\n\n // Override res.json\n res.json = function (body: unknown): Response {\n captureResponse(body);\n return originalJson(body);\n };\n\n // Override res.send\n res.send = function (body: unknown): Response {\n // Try to parse as JSON for validation\n if (typeof body === 'string') {\n try {\n captureResponse(JSON.parse(body));\n } catch {\n captureResponse(body);\n }\n } else {\n captureResponse(body);\n }\n return originalSend(body);\n };\n\n // Override res.end for cases where neither json nor send is used\n res.end = function (chunk?: unknown, encoding?: BufferEncoding | (() => void), callback?: () => void): Response {\n if (!responseSent && chunk) {\n const body = typeof chunk === 'string' ? chunk : chunk?.toString();\n try {\n captureResponse(JSON.parse(body || ''));\n } catch {\n captureResponse(body);\n }\n } else if (!responseSent) {\n captureResponse(null);\n }\n\n // Handle overloaded signatures\n if (typeof encoding === 'function') {\n return originalEnd(chunk, encoding);\n }\n if (encoding) {\n return originalEnd(chunk, encoding, callback);\n }\n return originalEnd(chunk, callback);\n };\n\n // Handle errors\n res.on('error', (error: Error) => {\n if (!responseSent) {\n captureResponse({ error: error.message });\n }\n });\n\n next();\n };\n\n // Attach shutdown function and refund executor to middleware\n const middlewareWithExtras = zauthMiddleware as RequestHandler & {\n shutdown: () => Promise<void>;\n refundExecutor?: RefundExecutor;\n };\n\n middlewareWithExtras.shutdown = async () => {\n if (refundExecutor) {\n refundExecutor.stop();\n }\n await client.shutdown();\n };\n\n middlewareWithExtras.refundExecutor = refundExecutor;\n\n return middlewareWithExtras;\n}\n\n/**\n * Create middleware with simpler configuration\n */\nexport function zauthProvider(\n apiKey: string,\n options?: Partial<Omit<ZauthMiddlewareOptions, 'apiKey' | 'mode'>>\n): RequestHandler & { shutdown: () => Promise<void>; refundExecutor?: RefundExecutor } {\n return createZauthMiddleware({\n apiKey,\n mode: 'provider',\n ...options,\n });\n}\n\n/**\n * Re-export RefundExecutor for direct access\n */\nexport { RefundExecutor } from '../refund.js';\n"]}