-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
build(deps-dev): bump vitest from 0.33.0 to 0.34.3 #1248
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 0.33.0 to 0.34.3. - [Release notes](https://github.com/vitest-dev/vitest/releases) - [Commits](https://github.com/vitest-dev/vitest/commits/v0.34.3/packages/vitest) --- updated-dependencies: - dependency-name: vitest dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
dependabot
bot
added
dependencies
Pull requests that update a dependency file
javascript
Pull requests that update Javascript code
labels
Sep 1, 2023
Diff between vitest 0.33.0 and 0.34.3diff --git a/dist/config.cjs b/dist/config.cjs
index v0.33.0..v0.34.3 100644
--- a/dist/config.cjs
+++ b/dist/config.cjs
@@ -14,4 +14,7 @@
"packages/*/test?(s)/**",
"**/*.d.ts",
+ "**/virtual:*",
+ "**/__x00__*",
+ "**/\0*",
"cypress/**",
"test?(s)/**",
@@ -20,4 +23,5 @@
"**/__tests__/**",
"**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc,cypress,tsup,build}.config.*",
+ "**/vitest.{workspace,projects}.[jt]s?(on)",
"**/.{eslint,mocha,prettier}rc.{?(c|m)js,yml}"
];
@@ -29,9 +33,8 @@
reportsDirectory: "./coverage",
exclude: defaultCoverageExcludes,
- reportOnFailure: true,
+ reportOnFailure: false,
reporter: [["text", {}], ["html", {}], ["clover", {}], ["json", {}]],
- // default extensions used by c8, plus '.vue' and '.svelte'
- // see https://github.com/istanbuljs/schema/blob/master/default-extension.js
- extension: [".js", ".cjs", ".mjs", ".ts", ".mts", ".cts", ".tsx", ".jsx", ".vue", ".svelte"]
+ extension: [".js", ".cjs", ".mjs", ".ts", ".mts", ".cts", ".tsx", ".jsx", ".vue", ".svelte"],
+ allowExternal: false
};
const fakeTimersDefaults = {
diff --git a/suppress-warnings.cjs b/suppress-warnings.cjs
index v0.33.0..v0.34.3 100644
--- a/suppress-warnings.cjs
+++ b/suppress-warnings.cjs
@@ -6,4 +6,6 @@
'Custom ESM Loaders is an experimental feature. This feature could change at any time',
'Custom ESM Loaders is an experimental feature and might change at any time',
+ 'VM Modules is an experimental feature and might change at any time',
+ 'VM Modules is an experimental feature. This feature could change at any time',
])
diff --git a/dist/browser.js b/dist/browser.js
index v0.33.0..v0.34.3 100644
--- a/dist/browser.js
+++ b/dist/browser.js
@@ -1,11 +1,7 @@
export { startTests } from '@vitest/runner';
import { setSafeTimers } from '@vitest/utils';
-import { a as resetRunOnceCounter } from './vendor-run-once.1fa85ba7.js';
-export { g as getCoverageProvider, s as startCoverageInsideWorker, a as stopCoverageInsideWorker, t as takeCoverageInsideWorker } from './vendor-coverage.2e41927a.js';
-import './vendor-index.23ac4e13.js';
-import 'pathe';
-import 'std-env';
-import '@vitest/runner/utils';
-import './vendor-global.6795f91f.js';
+import { a as resetRunOnceCounter } from './vendor-run-once.3e5ef7d7.js';
+export { g as getCoverageProvider, s as startCoverageInsideWorker, a as stopCoverageInsideWorker, t as takeCoverageInsideWorker } from './vendor-coverage.78040316.js';
+import './vendor-global.97e4527c.js';
let globalSetup = false;
@@ -18,5 +14,5 @@
setSafeTimers();
if (config.globals)
- (await import('./chunk-integrations-globals.0093e2ed.js')).registerApiGlobally();
+ (await import('./chunk-integrations-globals.7f4b17bf.js')).registerApiGlobally();
}
function setupDefines(defines) {
diff --git a/dist/child.js b/dist/child.js
index v0.33.0..v0.34.3 100644
--- a/dist/child.js
+++ b/dist/child.js
@@ -1,21 +1,32 @@
import { performance } from 'node:perf_hooks';
import v8 from 'node:v8';
-import { c as createBirpc } from './vendor-index.cc463d9e.js';
+import { c as createBirpc } from './vendor-index.b271ebe4.js';
import { parseRegexp } from '@vitest/utils';
-import { s as startViteNode, m as moduleCache, a as mockMap } from './vendor-execute.3576af13.js';
-import { r as rpcDone } from './vendor-rpc.ad5b08c7.js';
+import { l as loadEnvironment } from './vendor-environments.8eb4d407.js';
+import { s as startViteNode, m as moduleCache, a as mockMap } from './vendor-execute.a63e187f.js';
+import { r as rpcDone, c as createSafeRpc } from './vendor-rpc.cbd8e972.js';
import { s as setupInspect } from './vendor-inspector.47fc8cbb.js';
import 'node:url';
+import 'pathe';
+import './vendor-index.0b5b3600.js';
+import 'acorn';
+import 'node:module';
+import 'node:fs';
+import 'node:assert';
+import 'node:process';
+import 'node:path';
+import 'node:util';
+import 'node:console';
+import 'local-pkg';
+import 'node:vm';
import 'vite-node/client';
import 'vite-node/utils';
-import 'pathe';
import '@vitest/utils/error';
-import './vendor-global.6795f91f.js';
import './vendor-paths.84fc7a99.js';
-import 'node:fs';
-import '@vitest/spy';
-import 'node:module';
+import './vendor-global.97e4527c.js';
+import './vendor-base.9c08bbd0.js';
+import 'vite-node/constants';
-function init(ctx) {
+async function init(ctx) {
const { config } = ctx;
process.env.VITEST_WORKER_ID = "1";
@@ -26,6 +37,25 @@
setCancel = resolve;
});
- globalThis.__vitest_environment__ = config.environment;
- globalThis.__vitest_worker__ = {
+ const rpc = createBirpc(
+ {
+ onCancel: setCancel
+ },
+ {
+ eventNames: ["onUserConsoleLog", "onFinished", "onCollected", "onWorkerExit", "onCancel"],
+ serialize: v8.serialize,
+ deserialize: (v) => v8.deserialize(Buffer.from(v)),
+ post(v) {
+ var _a;
+ (_a = process.send) == null ? void 0 : _a.call(process, v);
+ },
+ on(fn) {
+ process.on("message", fn);
+ }
+ }
+ );
+ const environment = await loadEnvironment(ctx.environment.name, ctx.config.root);
+ if (ctx.environment.transformMode)
+ environment.transformMode = ctx.environment.transformMode;
+ const state = {
ctx,
moduleCache,
@@ -33,26 +63,12 @@
mockMap,
onCancel,
+ environment,
durations: {
environment: 0,
prepare: performance.now()
},
- rpc: createBirpc(
- {
- onCancel: setCancel
- },
- {
- eventNames: ["onUserConsoleLog", "onFinished", "onCollected", "onWorkerExit", "onCancel"],
- serialize: v8.serialize,
- deserialize: (v) => v8.deserialize(Buffer.from(v)),
- post(v) {
- var _a;
- (_a = process.send) == null ? void 0 : _a.call(process, v);
- },
- on(fn) {
- process.on("message", fn);
- }
- }
- )
+ rpc: createSafeRpc(rpc)
};
+ globalThis.__vitest_worker__ = state;
if (ctx.invalidates) {
ctx.invalidates.forEach((fsPath) => {
@@ -62,4 +78,5 @@
}
ctx.files.forEach((i) => moduleCache.delete(i));
+ return state;
}
function parsePossibleRegexp(str) {
@@ -77,7 +94,9 @@
const inspectorCleanup = setupInspect(ctx.config);
try {
- init(ctx);
- const { run: run2, executor } = await startViteNode(ctx);
- await run2(ctx.files, ctx.config, ctx.environment, executor);
+ const state = await init(ctx);
+ const { run: run2, executor } = await startViteNode({
+ state
+ });
+ await run2(ctx.files, ctx.config, { environment: state.environment, options: ctx.environment.options }, executor);
await rpcDone();
} finally {
diff --git a/dist/chunk-api-setup.8f785c4a.js b/dist/chunk-api-setup.8f785c4a.js
deleted file mode 100644
index v0.33.0..v0.34.3
--- a/dist/chunk-api-setup.8f785c4a.js
+++ b/dist/chunk-api-setup.8f785c4a.js
@@ -1,4655 +0,0 @@
-import { promises, existsSync } from 'node:fs';
-import { dirname } from 'pathe';
-import { c as createBirpc, i as isPrimitive } from './vendor-index.cc463d9e.js';
-import require$$0$2 from 'stream';
-import require$$0 from 'zlib';
-import require$$0$1 from 'buffer';
-import require$$3 from 'net';
-import require$$4 from 'tls';
-import require$$5 from 'crypto';
-import require$$2 from 'events';
-import require$$1 from 'https';
-import require$$2$1 from 'http';
-import require$$7 from 'url';
-import { g as getDefaultExportFromCjs } from './vendor-_commonjsHelpers.7d1333e8.js';
-import { A as API_PATH } from './vendor-constants.538d9b49.js';
-import './vendor-index.23ac4e13.js';
-import { parseErrorStacktrace } from '@vitest/utils';
-import 'std-env';
-import '@vitest/runner/utils';
-import './vendor-global.6795f91f.js';
-
-async function getModuleGraph(ctx, id) {
- const graph = {};
- const externalized = /* @__PURE__ */ new Set();
- const inlined = /* @__PURE__ */ new Set();
- function clearId(id2) {
- return (id2 == null ? void 0 : id2.replace(/\?v=\w+$/, "")) || "";
- }
- async function get(mod, seen = /* @__PURE__ */ new Map()) {
- if (!mod || !mod.id)
- return;
- if (seen.has(mod))
- return seen.get(mod);
- let id2 = clearId(mod.id);
- seen.set(mod, id2);
- const rewrote = await ctx.vitenode.shouldExternalize(id2);
- if (rewrote) {
- id2 = rewrote;
- externalized.add(id2);
- seen.set(mod, id2);
- } else {
- inlined.add(id2);
- }
- const mods = Array.from(mod.importedModules).filter((i) => i.id && !i.id.includes("/vitest/dist/"));
- graph[id2] = (await Promise.all(mods.map((m) => get(m, seen)))).filter(Boolean);
- return id2;
- }
- await get(ctx.server.moduleGraph.getModuleById(id));
- return {
- graph,
- externalized: Array.from(externalized),
- inlined: Array.from(inlined)
- };
-}
-
-/*! (c) 2020 Andrea Giammarchi */
-
-const {parse: $parse, stringify: $stringify} = JSON;
-const {keys} = Object;
-
-const Primitive = String; // it could be Number
-const primitive = 'string'; // it could be 'number'
-
-const ignore = {};
-const object = 'object';
-
-const noop = (_, value) => value;
-
-const primitives = value => (
- value instanceof Primitive ? Primitive(value) : value
-);
-
-const Primitives = (_, value) => (
- typeof value === primitive ? new Primitive(value) : value
-);
-
-const revive = (input, parsed, output, $) => {
- const lazy = [];
- for (let ke = keys(output), {length} = ke, y = 0; y < length; y++) {
- const k = ke[y];
- const value = output[k];
- if (value instanceof Primitive) {
- const tmp = input[value];
- if (typeof tmp === object && !parsed.has(tmp)) {
- parsed.add(tmp);
- output[k] = ignore;
- lazy.push({k, a: [input, parsed, tmp, $]});
- }
- else
- output[k] = $.call(output, k, tmp);
- }
- else if (output[k] !== ignore)
- output[k] = $.call(output, k, value);
- }
- for (let {length} = lazy, i = 0; i < length; i++) {
- const {k, a} = lazy[i];
- output[k] = $.call(output, k, revive.apply(null, a));
- }
- return output;
-};
-
-const set = (known, input, value) => {
- const index = Primitive(input.push(value) - 1);
- known.set(value, index);
- return index;
-};
-
-const parse$3 = (text, reviver) => {
- const input = $parse(text, Primitives).map(primitives);
- const value = input[0];
- const $ = reviver || noop;
- const tmp = typeof value === object && value ?
- revive(input, new Set, value, $) :
- value;
- return $.call({'': tmp}, '', tmp);
-};
-
-const stringify = (value, replacer, space) => {
- const $ = replacer && typeof replacer === object ?
- (k, v) => (k === '' || -1 < replacer.indexOf(k) ? v : void 0) :
- (replacer || noop);
- const known = new Map;
- const input = [];
- const output = [];
- let i = +set(known, input, $.call({'': value}, '', value));
- let firstRun = !i;
- while (i < input.length) {
- firstRun = true;
- output[i] = $stringify(input[i++], replace, space);
- }
- return '[' + output.join(',') + ']';
- function replace(key, value) {
- if (firstRun) {
- firstRun = !firstRun;
- return value;
- }
- const after = $.call(this, key, value);
- switch (typeof after) {
- case object:
- if (after === null) return after;
- case primitive:
- return known.get(after) || set(known, input, after);
- }
- return after;
- }
-};
-
-var bufferUtil$1 = {exports: {}};
-
-var constants = {
- BINARY_TYPES: ['nodebuffer', 'arraybuffer', 'fragments'],
- EMPTY_BUFFER: Buffer.alloc(0),
- GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',
- kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),
- kListener: Symbol('kListener'),
- kStatusCode: Symbol('status-code'),
- kWebSocket: Symbol('websocket'),
- NOOP: () => {}
-};
-
-var unmask$1;
-var mask;
-
-const { EMPTY_BUFFER: EMPTY_BUFFER$3 } = constants;
-
-const FastBuffer$2 = Buffer[Symbol.species];
-
-/**
- * Merges an array of buffers into a new buffer.
- *
- * @param {Buffer[]} list The array of buffers to concat
- * @param {Number} totalLength The total length of buffers in the list
- * @return {Buffer} The resulting buffer
- * @public
- */
-function concat$1(list, totalLength) {
- if (list.length === 0) return EMPTY_BUFFER$3;
- if (list.length === 1) return list[0];
-
- const target = Buffer.allocUnsafe(totalLength);
- let offset = 0;
-
- for (let i = 0; i < list.length; i++) {
- const buf = list[i];
- target.set(buf, offset);
- offset += buf.length;
- }
-
- if (offset < totalLength) {
- return new FastBuffer$2(target.buffer, target.byteOffset, offset);
- }
-
- return target;
-}
-
-/**
- * Masks a buffer using the given mask.
- *
- * @param {Buffer} source The buffer to mask
- * @param {Buffer} mask The mask to use
- * @param {Buffer} output The buffer where to store the result
- * @param {Number} offset The offset at which to start writing
- * @param {Number} length The number of bytes to mask.
- * @public
- */
-function _mask(source, mask, output, offset, length) {
- for (let i = 0; i < length; i++) {
- output[offset + i] = source[i] ^ mask[i & 3];
- }
-}
-
-/**
- * Unmasks a buffer using the given mask.
- *
- * @param {Buffer} buffer The buffer to unmask
- * @param {Buffer} mask The mask to use
- * @public
- */
-function _unmask(buffer, mask) {
- for (let i = 0; i < buffer.length; i++) {
- buffer[i] ^= mask[i & 3];
- }
-}
-
-/**
- * Converts a buffer to an `ArrayBuffer`.
- *
- * @param {Buffer} buf The buffer to convert
- * @return {ArrayBuffer} Converted buffer
- * @public
- */
-function toArrayBuffer$1(buf) {
- if (buf.length === buf.buffer.byteLength) {
- return buf.buffer;
- }
-
- return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);
-}
-
-/**
- * Converts `data` to a `Buffer`.
- *
- * @param {*} data The data to convert
- * @return {Buffer} The buffer
- * @throws {TypeError}
- * @public
- */
-function toBuffer$2(data) {
- toBuffer$2.readOnly = true;
-
- if (Buffer.isBuffer(data)) return data;
-
- let buf;
-
- if (data instanceof ArrayBuffer) {
- buf = new FastBuffer$2(data);
- } else if (ArrayBuffer.isView(data)) {
- buf = new FastBuffer$2(data.buffer, data.byteOffset, data.byteLength);
- } else {
- buf = Buffer.from(data);
- toBuffer$2.readOnly = false;
- }
-
- return buf;
-}
-
-bufferUtil$1.exports = {
- concat: concat$1,
- mask: _mask,
- toArrayBuffer: toArrayBuffer$1,
- toBuffer: toBuffer$2,
- unmask: _unmask
-};
-
-/* istanbul ignore else */
-if (!process.env.WS_NO_BUFFER_UTIL) {
- try {
- const bufferUtil = require('bufferutil');
-
- mask = bufferUtil$1.exports.mask = function (source, mask, output, offset, length) {
- if (length < 48) _mask(source, mask, output, offset, length);
- else bufferUtil.mask(source, mask, output, offset, length);
- };
-
- unmask$1 = bufferUtil$1.exports.unmask = function (buffer, mask) {
- if (buffer.length < 32) _unmask(buffer, mask);
- else bufferUtil.unmask(buffer, mask);
- };
- } catch (e) {
- // Continue regardless of the error.
- }
-}
-
-var bufferUtilExports = bufferUtil$1.exports;
-
-const kDone = Symbol('kDone');
-const kRun = Symbol('kRun');
-
-/**
- * A very simple job queue with adjustable concurrency. Adapted from
- * https://github.com/STRML/async-limiter
- */
-let Limiter$1 = class Limiter {
- /**
- * Creates a new `Limiter`.
- *
- * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed
- * to run concurrently
- */
- constructor(concurrency) {
- this[kDone] = () => {
- this.pending--;
- this[kRun]();
- };
- this.concurrency = concurrency || Infinity;
- this.jobs = [];
- this.pending = 0;
- }
-
- /**
- * Adds a job to the queue.
- *
- * @param {Function} job The job to run
- * @public
- */
- add(job) {
- this.jobs.push(job);
- this[kRun]();
- }
-
- /**
- * Removes a job from the queue and runs it if possible.
- *
- * @private
- */
- [kRun]() {
- if (this.pending === this.concurrency) return;
-
- if (this.jobs.length) {
- const job = this.jobs.shift();
-
- this.pending++;
- job(this[kDone]);
- }
- }
-};
-
-var limiter = Limiter$1;
-
-const zlib = require$$0;
-
-const bufferUtil = bufferUtilExports;
-const Limiter = limiter;
-const { kStatusCode: kStatusCode$2 } = constants;
-
-const FastBuffer$1 = Buffer[Symbol.species];
-const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);
-const kPerMessageDeflate = Symbol('permessage-deflate');
-const kTotalLength = Symbol('total-length');
-const kCallback = Symbol('callback');
-const kBuffers = Symbol('buffers');
-const kError$1 = Symbol('error');
-
-//
-// We limit zlib concurrency, which prevents severe memory fragmentation
-// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913
-// and https://github.com/websockets/ws/issues/1202
-//
-// Intentionally global; it's the global thread pool that's an issue.
-//
-let zlibLimiter;
-
-/**
- * permessage-deflate implementation.
- */
-let PerMessageDeflate$4 = class PerMessageDeflate {
- /**
- * Creates a PerMessageDeflate instance.
- *
- * @param {Object} [options] Configuration options
- * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support
- * for, or request, a custom client window size
- * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/
- * acknowledge disabling of client context takeover
- * @param {Number} [options.concurrencyLimit=10] The number of concurrent
- * calls to zlib
- * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the
- * use of a custom server window size
- * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept
- * disabling of server context takeover
- * @param {Number} [options.threshold=1024] Size (in bytes) below which
- * messages should not be compressed if context takeover is disabled
- * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on
- * deflate
- * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on
- * inflate
- * @param {Boolean} [isServer=false] Create the instance in either server or
- * client mode
- * @param {Number} [maxPayload=0] The maximum allowed message length
- */
- constructor(options, isServer, maxPayload) {
- this._maxPayload = maxPayload | 0;
- this._options = options || {};
- this._threshold =
- this._options.threshold !== undefined ? this._options.threshold : 1024;
- this._isServer = !!isServer;
- this._deflate = null;
- this._inflate = null;
-
- this.params = null;
-
- if (!zlibLimiter) {
- const concurrency =
- this._options.concurrencyLimit !== undefined
- ? this._options.concurrencyLimit
- : 10;
- zlibLimiter = new Limiter(concurrency);
- }
- }
-
- /**
- * @type {String}
- */
- static get extensionName() {
- return 'permessage-deflate';
- }
-
- /**
- * Create an extension negotiation offer.
- *
- * @return {Object} Extension parameters
- * @public
- */
- offer() {
- const params = {};
-
- if (this._options.serverNoContextTakeover) {
- params.server_no_context_takeover = true;
- }
- if (this._options.clientNoContextTakeover) {
- params.client_no_context_takeover = true;
- }
- if (this._options.serverMaxWindowBits) {
- params.server_max_window_bits = this._options.serverMaxWindowBits;
- }
- if (this._options.clientMaxWindowBits) {
- params.client_max_window_bits = this._options.clientMaxWindowBits;
- } else if (this._options.clientMaxWindowBits == null) {
- params.client_max_window_bits = true;
- }
-
- return params;
- }
-
- /**
- * Accept an extension negotiation offer/response.
- *
- * @param {Array} configurations The extension negotiation offers/reponse
- * @return {Object} Accepted configuration
- * @public
- */
- accept(configurations) {
- configurations = this.normalizeParams(configurations);
-
- this.params = this._isServer
- ? this.acceptAsServer(configurations)
- : this.acceptAsClient(configurations);
-
- return this.params;
- }
-
- /**
- * Releases all resources used by the extension.
- *
- * @public
- */
- cleanup() {
- if (this._inflate) {
- this._inflate.close();
- this._inflate = null;
- }
-
- if (this._deflate) {
- const callback = this._deflate[kCallback];
-
- this._deflate.close();
- this._deflate = null;
-
- if (callback) {
- callback(
- new Error(
- 'The deflate stream was closed while data was being processed'
- )
- );
- }
- }
- }
-
- /**
- * Accept an extension negotiation offer.
- *
- * @param {Array} offers The extension negotiation offers
- * @return {Object} Accepted configuration
- * @private
- */
- acceptAsServer(offers) {
- const opts = this._options;
- const accepted = offers.find((params) => {
- if (
- (opts.serverNoContextTakeover === false &&
- params.server_no_context_takeover) ||
- (params.server_max_window_bits &&
- (opts.serverMaxWindowBits === false ||
- (typeof opts.serverMaxWindowBits === 'number' &&
- opts.serverMaxWindowBits > params.server_max_window_bits))) ||
- (typeof opts.clientMaxWindowBits === 'number' &&
- !params.client_max_window_bits)
- ) {
- return false;
- }
-
- return true;
- });
-
- if (!accepted) {
- throw new Error('None of the extension offers can be accepted');
- }
-
- if (opts.serverNoContextTakeover) {
- accepted.server_no_context_takeover = true;
- }
- if (opts.clientNoContextTakeover) {
- accepted.client_no_context_takeover = true;
- }
- if (typeof opts.serverMaxWindowBits === 'number') {
- accepted.server_max_window_bits = opts.serverMaxWindowBits;
- }
- if (typeof opts.clientMaxWindowBits === 'number') {
- accepted.client_max_window_bits = opts.clientMaxWindowBits;
- } else if (
- accepted.client_max_window_bits === true ||
- opts.clientMaxWindowBits === false
- ) {
- delete accepted.client_max_window_bits;
- }
-
- return accepted;
- }
-
- /**
- * Accept the extension negotiation response.
- *
- * @param {Array} response The extension negotiation response
- * @return {Object} Accepted configuration
- * @private
- */
- acceptAsClient(response) {
- const params = response[0];
-
- if (
- this._options.clientNoContextTakeover === false &&
- params.client_no_context_takeover
- ) {
- throw new Error('Unexpected parameter "client_no_context_takeover"');
- }
-
- if (!params.client_max_window_bits) {
- if (typeof this._options.clientMaxWindowBits === 'number') {
- params.client_max_window_bits = this._options.clientMaxWindowBits;
- }
- } else if (
- this._options.clientMaxWindowBits === false ||
- (typeof this._options.clientMaxWindowBits === 'number' &&
- params.client_max_window_bits > this._options.clientMaxWindowBits)
- ) {
- throw new Error(
- 'Unexpected or invalid parameter "client_max_window_bits"'
- );
- }
-
- return params;
- }
-
- /**
- * Normalize parameters.
- *
- * @param {Array} configurations The extension negotiation offers/reponse
- * @return {Array} The offers/response with normalized parameters
- * @private
- */
- normalizeParams(configurations) {
- configurations.forEach((params) => {
- Object.keys(params).forEach((key) => {
- let value = params[key];
-
- if (value.length > 1) {
- throw new Error(`Parameter "${key}" must have only a single value`);
- }
-
- value = value[0];
-
- if (key === 'client_max_window_bits') {
- if (value !== true) {
- const num = +value;
- if (!Number.isInteger(num) || num < 8 || num > 15) {
- throw new TypeError(
- `Invalid value for parameter "${key}": ${value}`
- );
- }
- value = num;
- } else if (!this._isServer) {
- throw new TypeError(
- `Invalid value for parameter "${key}": ${value}`
- );
- }
- } else if (key === 'server_max_window_bits') {
- const num = +value;
- if (!Number.isInteger(num) || num < 8 || num > 15) {
- throw new TypeError(
- `Invalid value for parameter "${key}": ${value}`
- );
- }
- value = num;
- } else if (
- key === 'client_no_context_takeover' ||
- key === 'server_no_context_takeover'
- ) {
- if (value !== true) {
- throw new TypeError(
- `Invalid value for parameter "${key}": ${value}`
- );
- }
- } else {
- throw new Error(`Unknown parameter "${key}"`);
- }
-
- params[key] = value;
- });
- });
-
- return configurations;
- }
-
- /**
- * Decompress data. Concurrency limited.
- *
- * @param {Buffer} data Compressed data
- * @param {Boolean} fin Specifies whether or not this is the last fragment
- * @param {Function} callback Callback
- * @public
- */
- decompress(data, fin, callback) {
- zlibLimiter.add((done) => {
- this._decompress(data, fin, (err, result) => {
- done();
- callback(err, result);
- });
- });
- }
-
- /**
- * Compress data. Concurrency limited.
- *
- * @param {(Buffer|String)} data Data to compress
- * @param {Boolean} fin Specifies whether or not this is the last fragment
- * @param {Function} callback Callback
- * @public
- */
- compress(data, fin, callback) {
- zlibLimiter.add((done) => {
- this._compress(data, fin, (err, result) => {
- done();
- callback(err, result);
- });
- });
- }
-
- /**
- * Decompress data.
- *
- * @param {Buffer} data Compressed data
- * @param {Boolean} fin Specifies whether or not this is the last fragment
- * @param {Function} callback Callback
- * @private
- */
- _decompress(data, fin, callback) {
- const endpoint = this._isServer ? 'client' : 'server';
-
- if (!this._inflate) {
- const key = `${endpoint}_max_window_bits`;
- const windowBits =
- typeof this.params[key] !== 'number'
- ? zlib.Z_DEFAULT_WINDOWBITS
- : this.params[key];
-
- this._inflate = zlib.createInflateRaw({
- ...this._options.zlibInflateOptions,
- windowBits
- });
- this._inflate[kPerMessageDeflate] = this;
- this._inflate[kTotalLength] = 0;
- this._inflate[kBuffers] = [];
- this._inflate.on('error', inflateOnError);
- this._inflate.on('data', inflateOnData);
- }
-
- this._inflate[kCallback] = callback;
-
- this._inflate.write(data);
- if (fin) this._inflate.write(TRAILER);
-
- this._inflate.flush(() => {
- const err = this._inflate[kError$1];
-
- if (err) {
- this._inflate.close();
- this._inflate = null;
- callback(err);
- return;
- }
-
- const data = bufferUtil.concat(
- this._inflate[kBuffers],
- this._inflate[kTotalLength]
- );
-
- if (this._inflate._readableState.endEmitted) {
- this._inflate.close();
- this._inflate = null;
- } else {
- this._inflate[kTotalLength] = 0;
- this._inflate[kBuffers] = [];
-
- if (fin && this.params[`${endpoint}_no_context_takeover`]) {
- this._inflate.reset();
- }
- }
-
- callback(null, data);
- });
- }
-
- /**
- * Compress data.
- *
- * @param {(Buffer|String)} data Data to compress
- * @param {Boolean} fin Specifies whether or not this is the last fragment
- * @param {Function} callback Callback
- * @private
- */
- _compress(data, fin, callback) {
- const endpoint = this._isServer ? 'server' : 'client';
-
- if (!this._deflate) {
- const key = `${endpoint}_max_window_bits`;
- const windowBits =
- typeof this.params[key] !== 'number'
- ? zlib.Z_DEFAULT_WINDOWBITS
- : this.params[key];
-
- this._deflate = zlib.createDeflateRaw({
- ...this._options.zlibDeflateOptions,
- windowBits
- });
-
- this._deflate[kTotalLength] = 0;
- this._deflate[kBuffers] = [];
-
- this._deflate.on('data', deflateOnData);
- }
-
- this._deflate[kCallback] = callback;
-
- this._deflate.write(data);
- this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {
- if (!this._deflate) {
- //
- // The deflate stream was closed while data was being processed.
- //
- return;
- }
-
- let data = bufferUtil.concat(
- this._deflate[kBuffers],
- this._deflate[kTotalLength]
- );
-
- if (fin) {
- data = new FastBuffer$1(data.buffer, data.byteOffset, data.length - 4);
- }
-
- //
- // Ensure that the callback will not be called again in
- // `PerMessageDeflate#cleanup()`.
- //
- this._deflate[kCallback] = null;
-
- this._deflate[kTotalLength] = 0;
- this._deflate[kBuffers] = [];
-
- if (fin && this.params[`${endpoint}_no_context_takeover`]) {
- this._deflate.reset();
- }
-
- callback(null, data);
- });
- }
-};
-
-var permessageDeflate = PerMessageDeflate$4;
-
-/**
- * The listener of the `zlib.DeflateRaw` stream `'data'` event.
- *
- * @param {Buffer} chunk A chunk of data
- * @private
- */
-function deflateOnData(chunk) {
- this[kBuffers].push(chunk);
- this[kTotalLength] += chunk.length;
-}
-
-/**
- * The listener of the `zlib.InflateRaw` stream `'data'` event.
- *
- * @param {Buffer} chunk A chunk of data
- * @private
- */
-function inflateOnData(chunk) {
- this[kTotalLength] += chunk.length;
-
- if (
- this[kPerMessageDeflate]._maxPayload < 1 ||
- this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload
- ) {
- this[kBuffers].push(chunk);
- return;
- }
-
- this[kError$1] = new RangeError('Max payload size exceeded');
- this[kError$1].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';
- this[kError$1][kStatusCode$2] = 1009;
- this.removeListener('data', inflateOnData);
- this.reset();
-}
-
-/**
- * The listener of the `zlib.InflateRaw` stream `'error'` event.
- *
- * @param {Error} err The emitted error
- * @private
- */
-function inflateOnError(err) {
- //
- // There is no need to call `Zlib#close()` as the handle is automatically
- // closed when an error is emitted.
- //
- this[kPerMessageDeflate]._inflate = null;
- err[kStatusCode$2] = 1007;
- this[kCallback](err);
-}
-
-var validation = {exports: {}};
-
-var isValidUTF8_1;
-
-const { isUtf8 } = require$$0$1;
-
-//
-// Allowed token characters:
-//
-// '!', '#', '$', '%', '&', ''', '*', '+', '-',
-// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'
-//
-// tokenChars[32] === 0 // ' '
-// tokenChars[33] === 1 // '!'
-// tokenChars[34] === 0 // '"'
-// ...
-//
-// prettier-ignore
-const tokenChars$2 = [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31
- 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127
-];
-
-/**
- * Checks if a status code is allowed in a close frame.
- *
- * @param {Number} code The status code
- * @return {Boolean} `true` if the status code is valid, else `false`
- * @public
- */
-function isValidStatusCode$2(code) {
- return (
- (code >= 1000 &&
- code <= 1014 &&
- code !== 1004 &&
- code !== 1005 &&
- code !== 1006) ||
- (code >= 3000 && code <= 4999)
- );
-}
-
-/**
- * Checks if a given buffer contains only correct UTF-8.
- * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by
- * Markus Kuhn.
- *
- * @param {Buffer} buf The buffer to check
- * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`
- * @public
- */
-function _isValidUTF8(buf) {
- const len = buf.length;
- let i = 0;
-
- while (i < len) {
- if ((buf[i] & 0x80) === 0) {
- // 0xxxxxxx
- i++;
- } else if ((buf[i] & 0xe0) === 0xc0) {
- // 110xxxxx 10xxxxxx
- if (
- i + 1 === len ||
- (buf[i + 1] & 0xc0) !== 0x80 ||
- (buf[i] & 0xfe) === 0xc0 // Overlong
- ) {
- return false;
- }
-
- i += 2;
- } else if ((buf[i] & 0xf0) === 0xe0) {
- // 1110xxxx 10xxxxxx 10xxxxxx
- if (
- i + 2 >= len ||
- (buf[i + 1] & 0xc0) !== 0x80 ||
- (buf[i + 2] & 0xc0) !== 0x80 ||
- (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong
- (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)
- ) {
- return false;
- }
-
- i += 3;
- } else if ((buf[i] & 0xf8) === 0xf0) {
- // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- if (
- i + 3 >= len ||
- (buf[i + 1] & 0xc0) !== 0x80 ||
- (buf[i + 2] & 0xc0) !== 0x80 ||
- (buf[i + 3] & 0xc0) !== 0x80 ||
- (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong
- (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||
- buf[i] > 0xf4 // > U+10FFFF
- ) {
- return false;
- }
-
- i += 4;
- } else {
- return false;
- }
- }
-
- return true;
-}
-
-validation.exports = {
- isValidStatusCode: isValidStatusCode$2,
- isValidUTF8: _isValidUTF8,
- tokenChars: tokenChars$2
-};
-
-if (isUtf8) {
- isValidUTF8_1 = validation.exports.isValidUTF8 = function (buf) {
- return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);
- };
-} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {
- try {
- const isValidUTF8 = require('utf-8-validate');
-
- isValidUTF8_1 = validation.exports.isValidUTF8 = function (buf) {
- return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);
- };
- } catch (e) {
- // Continue regardless of the error.
- }
-}
-
-var validationExports = validation.exports;
-
-const { Writable } = require$$0$2;
-
-const PerMessageDeflate$3 = permessageDeflate;
-const {
- BINARY_TYPES: BINARY_TYPES$1,
- EMPTY_BUFFER: EMPTY_BUFFER$2,
- kStatusCode: kStatusCode$1,
- kWebSocket: kWebSocket$2
-} = constants;
-const { concat, toArrayBuffer, unmask } = bufferUtilExports;
-const { isValidStatusCode: isValidStatusCode$1, isValidUTF8 } = validationExports;
-
-const FastBuffer = Buffer[Symbol.species];
-const GET_INFO = 0;
-const GET_PAYLOAD_LENGTH_16 = 1;
-const GET_PAYLOAD_LENGTH_64 = 2;
-const GET_MASK = 3;
-const GET_DATA = 4;
-const INFLATING = 5;
-
-/**
- * HyBi Receiver implementation.
- *
- * @extends Writable
- */
-let Receiver$1 = class Receiver extends Writable {
- /**
- * Creates a Receiver instance.
- *
- * @param {Object} [options] Options object
- * @param {String} [options.binaryType=nodebuffer] The type for binary data
- * @param {Object} [options.extensions] An object containing the negotiated
- * extensions
- * @param {Boolean} [options.isServer=false] Specifies whether to operate in
- * client or server mode
- * @param {Number} [options.maxPayload=0] The maximum allowed message length
- * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
- * not to skip UTF-8 validation for text and close messages
- */
- constructor(options = {}) {
- super();
-
- this._binaryType = options.binaryType || BINARY_TYPES$1[0];
- this._extensions = options.extensions || {};
- this._isServer = !!options.isServer;
- this._maxPayload = options.maxPayload | 0;
- this._skipUTF8Validation = !!options.skipUTF8Validation;
- this[kWebSocket$2] = undefined;
-
- this._bufferedBytes = 0;
- this._buffers = [];
-
- this._compressed = false;
- this._payloadLength = 0;
- this._mask = undefined;
- this._fragmented = 0;
- this._masked = false;
- this._fin = false;
- this._opcode = 0;
-
- this._totalPayloadLength = 0;
- this._messageLength = 0;
- this._fragments = [];
-
- this._state = GET_INFO;
- this._loop = false;
- }
-
- /**
- * Implements `Writable.prototype._write()`.
- *
- * @param {Buffer} chunk The chunk of data to write
- * @param {String} encoding The character encoding of `chunk`
- * @param {Function} cb Callback
- * @private
- */
- _write(chunk, encoding, cb) {
- if (this._opcode === 0x08 && this._state == GET_INFO) return cb();
-
- this._bufferedBytes += chunk.length;
- this._buffers.push(chunk);
- this.startLoop(cb);
- }
-
- /**
- * Consumes `n` bytes from the buffered data.
- *
- * @param {Number} n The number of bytes to consume
- * @return {Buffer} The consumed bytes
- * @private
- */
- consume(n) {
- this._bufferedBytes -= n;
-
- if (n === this._buffers[0].length) return this._buffers.shift();
-
- if (n < this._buffers[0].length) {
- const buf = this._buffers[0];
- this._buffers[0] = new FastBuffer(
- buf.buffer,
- buf.byteOffset + n,
- buf.length - n
- );
-
- return new FastBuffer(buf.buffer, buf.byteOffset, n);
- }
-
- const dst = Buffer.allocUnsafe(n);
-
- do {
- const buf = this._buffers[0];
- const offset = dst.length - n;
-
- if (n >= buf.length) {
- dst.set(this._buffers.shift(), offset);
- } else {
- dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);
- this._buffers[0] = new FastBuffer(
- buf.buffer,
- buf.byteOffset + n,
- buf.length - n
- );
- }
-
- n -= buf.length;
- } while (n > 0);
-
- return dst;
- }
-
- /**
- * Starts the parsing loop.
- *
- * @param {Function} cb Callback
- * @private
- */
- startLoop(cb) {
- let err;
- this._loop = true;
-
- do {
- switch (this._state) {
- case GET_INFO:
- err = this.getInfo();
- break;
- case GET_PAYLOAD_LENGTH_16:
- err = this.getPayloadLength16();
- break;
- case GET_PAYLOAD_LENGTH_64:
- err = this.getPayloadLength64();
- break;
- case GET_MASK:
- this.getMask();
- break;
- case GET_DATA:
- err = this.getData(cb);
- break;
- default:
- // `INFLATING`
- this._loop = false;
- return;
- }
- } while (this._loop);
-
- cb(err);
- }
-
- /**
- * Reads the first two bytes of a frame.
- *
- * @return {(RangeError|undefined)} A possible error
- * @private
- */
- getInfo() {
- if (this._bufferedBytes < 2) {
- this._loop = false;
- return;
- }
-
- const buf = this.consume(2);
-
- if ((buf[0] & 0x30) !== 0x00) {
- this._loop = false;
- return error(
- RangeError,
- 'RSV2 and RSV3 must be clear',
- true,
- 1002,
- 'WS_ERR_UNEXPECTED_RSV_2_3'
- );
- }
-
- const compressed = (buf[0] & 0x40) === 0x40;
-
- if (compressed && !this._extensions[PerMessageDeflate$3.extensionName]) {
- this._loop = false;
- return error(
- RangeError,
- 'RSV1 must be clear',
- true,
- 1002,
- 'WS_ERR_UNEXPECTED_RSV_1'
- );
- }
-
- this._fin = (buf[0] & 0x80) === 0x80;
- this._opcode = buf[0] & 0x0f;
- this._payloadLength = buf[1] & 0x7f;
-
- if (this._opcode === 0x00) {
- if (compressed) {
- this._loop = false;
- return error(
- RangeError,
- 'RSV1 must be clear',
- true,
- 1002,
- 'WS_ERR_UNEXPECTED_RSV_1'
- );
- }
-
- if (!this._fragmented) {
- this._loop = false;
- return error(
- RangeError,
- 'invalid opcode 0',
- true,
- 1002,
- 'WS_ERR_INVALID_OPCODE'
- );
- }
-
- this._opcode = this._fragmented;
- } else if (this._opcode === 0x01 || this._opcode === 0x02) {
- if (this._fragmented) {
- this._loop = false;
- return error(
- RangeError,
- `invalid opcode ${this._opcode}`,
- true,
- 1002,
- 'WS_ERR_INVALID_OPCODE'
- );
- }
-
- this._compressed = compressed;
- } else if (this._opcode > 0x07 && this._opcode < 0x0b) {
- if (!this._fin) {
- this._loop = false;
- return error(
- RangeError,
- 'FIN must be set',
- true,
- 1002,
- 'WS_ERR_EXPECTED_FIN'
- );
- }
-
- if (compressed) {
- this._loop = false;
- return error(
- RangeError,
- 'RSV1 must be clear',
- true,
- 1002,
- 'WS_ERR_UNEXPECTED_RSV_1'
- );
- }
-
- if (
- this._payloadLength > 0x7d ||
- (this._opcode === 0x08 && this._payloadLength === 1)
- ) {
- this._loop = false;
- return error(
- RangeError,
- `invalid payload length ${this._payloadLength}`,
- true,
- 1002,
- 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'
- );
- }
- } else {
- this._loop = false;
- return error(
- RangeError,
- `invalid opcode ${this._opcode}`,
- true,
- 1002,
- 'WS_ERR_INVALID_OPCODE'
- );
- }
-
- if (!this._fin && !this._fragmented) this._fragmented = this._opcode;
- this._masked = (buf[1] & 0x80) === 0x80;
-
- if (this._isServer) {
- if (!this._masked) {
- this._loop = false;
- return error(
- RangeError,
- 'MASK must be set',
- true,
- 1002,
- 'WS_ERR_EXPECTED_MASK'
- );
- }
- } else if (this._masked) {
- this._loop = false;
- return error(
- RangeError,
- 'MASK must be clear',
- true,
- 1002,
- 'WS_ERR_UNEXPECTED_MASK'
- );
- }
-
- if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;
- else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;
- else return this.haveLength();
- }
-
- /**
- * Gets extended payload length (7+16).
- *
- * @return {(RangeError|undefined)} A possible error
- * @private
- */
- getPayloadLength16() {
- if (this._bufferedBytes < 2) {
- this._loop = false;
- return;
- }
-
- this._payloadLength = this.consume(2).readUInt16BE(0);
- return this.haveLength();
- }
-
- /**
- * Gets extended payload length (7+64).
- *
- * @return {(RangeError|undefined)} A possible error
- * @private
- */
- getPayloadLength64() {
- if (this._bufferedBytes < 8) {
- this._loop = false;
- return;
- }
-
- const buf = this.consume(8);
- const num = buf.readUInt32BE(0);
-
- //
- // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned
- // if payload length is greater than this number.
- //
- if (num > Math.pow(2, 53 - 32) - 1) {
- this._loop = false;
- return error(
- RangeError,
- 'Unsupported WebSocket frame: payload length > 2^53 - 1',
- false,
- 1009,
- 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'
- );
- }
-
- this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);
- return this.haveLength();
- }
-
- /**
- * Payload length has been read.
- *
- * @return {(RangeError|undefined)} A possible error
- * @private
- */
- haveLength() {
- if (this._payloadLength && this._opcode < 0x08) {
- this._totalPayloadLength += this._payloadLength;
- if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {
- this._loop = false;
- return error(
- RangeError,
- 'Max payload size exceeded',
- false,
- 1009,
- 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'
- );
- }
- }
-
- if (this._masked) this._state = GET_MASK;
- else this._state = GET_DATA;
- }
-
- /**
- * Reads mask bytes.
- *
- * @private
- */
- getMask() {
- if (this._bufferedBytes < 4) {
- this._loop = false;
- return;
- }
-
- this._mask = this.consume(4);
- this._state = GET_DATA;
- }
-
- /**
- * Reads data bytes.
- *
- * @param {Function} cb Callback
- * @return {(Error|RangeError|undefined)} A possible error
- * @private
- */
- getData(cb) {
- let data = EMPTY_BUFFER$2;
-
- if (this._payloadLength) {
- if (this._bufferedBytes < this._payloadLength) {
- this._loop = false;
- return;
- }
-
- data = this.consume(this._payloadLength);
-
- if (
- this._masked &&
- (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0
- ) {
- unmask(data, this._mask);
- }
- }
-
- if (this._opcode > 0x07) return this.controlMessage(data);
-
- if (this._compressed) {
- this._state = INFLATING;
- this.decompress(data, cb);
- return;
- }
-
- if (data.length) {
- //
- // This message is not compressed so its length is the sum of the payload
- // length of all fragments.
- //
- this._messageLength = this._totalPayloadLength;
- this._fragments.push(data);
- }
-
- return this.dataMessage();
- }
-
- /**
- * Decompresses data.
- *
- * @param {Buffer} data Compressed data
- * @param {Function} cb Callback
- * @private
- */
- decompress(data, cb) {
- const perMessageDeflate = this._extensions[PerMessageDeflate$3.extensionName];
-
- perMessageDeflate.decompress(data, this._fin, (err, buf) => {
- if (err) return cb(err);
-
- if (buf.length) {
- this._messageLength += buf.length;
- if (this._messageLength > this._maxPayload && this._maxPayload > 0) {
- return cb(
- error(
- RangeError,
- 'Max payload size exceeded',
- false,
- 1009,
- 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'
- )
- );
- }
-
- this._fragments.push(buf);
- }
-
- const er = this.dataMessage();
- if (er) return cb(er);
-
- this.startLoop(cb);
- });
- }
-
- /**
- * Handles a data message.
- *
- * @return {(Error|undefined)} A possible error
- * @private
- */
- dataMessage() {
- if (this._fin) {
- const messageLength = this._messageLength;
- const fragments = this._fragments;
-
- this._totalPayloadLength = 0;
- this._messageLength = 0;
- this._fragmented = 0;
- this._fragments = [];
-
- if (this._opcode === 2) {
- let data;
-
- if (this._binaryType === 'nodebuffer') {
- data = concat(fragments, messageLength);
- } else if (this._binaryType === 'arraybuffer') {
- data = toArrayBuffer(concat(fragments, messageLength));
- } else {
- data = fragments;
- }
-
- this.emit('message', data, true);
- } else {
- const buf = concat(fragments, messageLength);
-
- if (!this._skipUTF8Validation && !isValidUTF8(buf)) {
- this._loop = false;
- return error(
- Error,
- 'invalid UTF-8 sequence',
- true,
- 1007,
- 'WS_ERR_INVALID_UTF8'
- );
- }
-
- this.emit('message', buf, false);
- }
- }
-
- this._state = GET_INFO;
- }
-
- /**
- * Handles a control message.
- *
- * @param {Buffer} data Data to handle
- * @return {(Error|RangeError|undefined)} A possible error
- * @private
- */
- controlMessage(data) {
- if (this._opcode === 0x08) {
- this._loop = false;
-
- if (data.length === 0) {
- this.emit('conclude', 1005, EMPTY_BUFFER$2);
- this.end();
- } else {
- const code = data.readUInt16BE(0);
-
- if (!isValidStatusCode$1(code)) {
- return error(
- RangeError,
- `invalid status code ${code}`,
- true,
- 1002,
- 'WS_ERR_INVALID_CLOSE_CODE'
- );
- }
-
- const buf = new FastBuffer(
- data.buffer,
- data.byteOffset + 2,
- data.length - 2
- );
-
- if (!this._skipUTF8Validation && !isValidUTF8(buf)) {
- return error(
- Error,
- 'invalid UTF-8 sequence',
- true,
- 1007,
- 'WS_ERR_INVALID_UTF8'
- );
- }
-
- this.emit('conclude', code, buf);
- this.end();
- }
- } else if (this._opcode === 0x09) {
- this.emit('ping', data);
- } else {
- this.emit('pong', data);
- }
-
- this._state = GET_INFO;
- }
-};
-
-var receiver = Receiver$1;
-
-/**
- * Builds an error object.
- *
- * @param {function(new:Error|RangeError)} ErrorCtor The error constructor
- * @param {String} message The error message
- * @param {Boolean} prefix Specifies whether or not to add a default prefix to
- * `message`
- * @param {Number} statusCode The status code
- * @param {String} errorCode The exposed error code
- * @return {(Error|RangeError)} The error
- * @private
- */
-function error(ErrorCtor, message, prefix, statusCode, errorCode) {
- const err = new ErrorCtor(
- prefix ? `Invalid WebSocket frame: ${message}` : message
- );
-
- Error.captureStackTrace(err, error);
- err.code = errorCode;
- err[kStatusCode$1] = statusCode;
- return err;
-}
-
-/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^net|tls$" }] */
-const { randomFillSync } = require$$5;
-
-const PerMessageDeflate$2 = permessageDeflate;
-const { EMPTY_BUFFER: EMPTY_BUFFER$1 } = constants;
-const { isValidStatusCode } = validationExports;
-const { mask: applyMask, toBuffer: toBuffer$1 } = bufferUtilExports;
-
-const kByteLength = Symbol('kByteLength');
-const maskBuffer = Buffer.alloc(4);
-
-/**
- * HyBi Sender implementation.
- */
-let Sender$1 = class Sender {
- /**
- * Creates a Sender instance.
- *
- * @param {(net.Socket|tls.Socket)} socket The connection socket
- * @param {Object} [extensions] An object containing the negotiated extensions
- * @param {Function} [generateMask] The function used to generate the masking
- * key
- */
- constructor(socket, extensions, generateMask) {
- this._extensions = extensions || {};
-
- if (generateMask) {
- this._generateMask = generateMask;
- this._maskBuffer = Buffer.alloc(4);
- }
-
- this._socket = socket;
-
- this._firstFragment = true;
- this._compress = false;
-
- this._bufferedBytes = 0;
- this._deflating = false;
- this._queue = [];
- }
-
- /**
- * Frames a piece of data according to the HyBi WebSocket protocol.
- *
- * @param {(Buffer|String)} data The data to frame
- * @param {Object} options Options object
- * @param {Boolean} [options.fin=false] Specifies whether or not to set the
- * FIN bit
- * @param {Function} [options.generateMask] The function used to generate the
- * masking key
- * @param {Boolean} [options.mask=false] Specifies whether or not to mask
- * `data`
- * @param {Buffer} [options.maskBuffer] The buffer used to store the masking
- * key
- * @param {Number} options.opcode The opcode
- * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be
- * modified
- * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the
- * RSV1 bit
- * @return {(Buffer|String)[]} The framed data
- * @public
- */
- static frame(data, options) {
- let mask;
- let merge = false;
- let offset = 2;
- let skipMasking = false;
-
- if (options.mask) {
- mask = options.maskBuffer || maskBuffer;
-
- if (options.generateMask) {
- options.generateMask(mask);
- } else {
- randomFillSync(mask, 0, 4);
- }
-
- skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;
- offset = 6;
- }
-
- let dataLength;
-
- if (typeof data === 'string') {
- if (
- (!options.mask || skipMasking) &&
- options[kByteLength] !== undefined
- ) {
- dataLength = options[kByteLength];
- } else {
- data = Buffer.from(data);
- dataLength = data.length;
- }
- } else {
- dataLength = data.length;
- merge = options.mask && options.readOnly && !skipMasking;
- }
-
- let payloadLength = dataLength;
-
- if (dataLength >= 65536) {
- offset += 8;
- payloadLength = 127;
- } else if (dataLength > 125) {
- offset += 2;
- payloadLength = 126;
- }
-
- const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);
-
- target[0] = options.fin ? options.opcode | 0x80 : options.opcode;
- if (options.rsv1) target[0] |= 0x40;
-
- target[1] = payloadLength;
-
- if (payloadLength === 126) {
- target.writeUInt16BE(dataLength, 2);
- } else if (payloadLength === 127) {
- target[2] = target[3] = 0;
- target.writeUIntBE(dataLength, 4, 6);
- }
-
- if (!options.mask) return [target, data];
-
- target[1] |= 0x80;
- target[offset - 4] = mask[0];
- target[offset - 3] = mask[1];
- target[offset - 2] = mask[2];
- target[offset - 1] = mask[3];
-
- if (skipMasking) return [target, data];
-
- if (merge) {
- applyMask(data, mask, target, offset, dataLength);
- return [target];
- }
-
- applyMask(data, mask, data, 0, dataLength);
- return [target, data];
- }
-
- /**
- * Sends a close message to the other peer.
- *
- * @param {Number} [code] The status code component of the body
- * @param {(String|Buffer)} [data] The message component of the body
- * @param {Boolean} [mask=false] Specifies whether or not to mask the message
- * @param {Function} [cb] Callback
- * @public
- */
- close(code, data, mask, cb) {
- let buf;
-
- if (code === undefined) {
- buf = EMPTY_BUFFER$1;
- } else if (typeof code !== 'number' || !isValidStatusCode(code)) {
- throw new TypeError('First argument must be a valid error code number');
- } else if (data === undefined || !data.length) {
- buf = Buffer.allocUnsafe(2);
- buf.writeUInt16BE(code, 0);
- } else {
- const length = Buffer.byteLength(data);
-
- if (length > 123) {
- throw new RangeError('The message must not be greater than 123 bytes');
- }
-
- buf = Buffer.allocUnsafe(2 + length);
- buf.writeUInt16BE(code, 0);
-
- if (typeof data === 'string') {
- buf.write(data, 2);
- } else {
- buf.set(data, 2);
- }
- }
-
- const options = {
- [kByteLength]: buf.length,
- fin: true,
- generateMask: this._generateMask,
- mask,
- maskBuffer: this._maskBuffer,
- opcode: 0x08,
- readOnly: false,
- rsv1: false
- };
-
- if (this._deflating) {
- this.enqueue([this.dispatch, buf, false, options, cb]);
- } else {
- this.sendFrame(Sender.frame(buf, options), cb);
- }
- }
-
- /**
- * Sends a ping message to the other peer.
- *
- * @param {*} data The message to send
- * @param {Boolean} [mask=false] Specifies whether or not to mask `data`
- * @param {Function} [cb] Callback
- * @public
- */
- ping(data, mask, cb) {
- let byteLength;
- let readOnly;
-
- if (typeof data === 'string') {
- byteLength = Buffer.byteLength(data);
- readOnly = false;
- } else {
- data = toBuffer$1(data);
- byteLength = data.length;
- readOnly = toBuffer$1.readOnly;
- }
-
- if (byteLength > 125) {
- throw new RangeError('The data size must not be greater than 125 bytes');
- }
-
- const options = {
- [kByteLength]: byteLength,
- fin: true,
- generateMask: this._generateMask,
- mask,
- maskBuffer: this._maskBuffer,
- opcode: 0x09,
- readOnly,
- rsv1: false
- };
-
- if (this._deflating) {
- this.enqueue([this.dispatch, data, false, options, cb]);
- } else {
- this.sendFrame(Sender.frame(data, options), cb);
- }
- }
-
- /**
- * Sends a pong message to the other peer.
- *
- * @param {*} data The message to send
- * @param {Boolean} [mask=false] Specifies whether or not to mask `data`
- * @param {Function} [cb] Callback
- * @public
- */
- pong(data, mask, cb) {
- let byteLength;
- let readOnly;
-
- if (typeof data === 'string') {
- byteLength = Buffer.byteLength(data);
- readOnly = false;
- } else {
- data = toBuffer$1(data);
- byteLength = data.length;
- readOnly = toBuffer$1.readOnly;
- }
-
- if (byteLength > 125) {
- throw new RangeError('The data size must not be greater than 125 bytes');
- }
-
- const options = {
- [kByteLength]: byteLength,
- fin: true,
- generateMask: this._generateMask,
- mask,
- maskBuffer: this._maskBuffer,
- opcode: 0x0a,
- readOnly,
- rsv1: false
- };
-
- if (this._deflating) {
- this.enqueue([this.dispatch, data, false, options, cb]);
- } else {
- this.sendFrame(Sender.frame(data, options), cb);
- }
- }
-
- /**
- * Sends a data message to the other peer.
- *
- * @param {*} data The message to send
- * @param {Object} options Options object
- * @param {Boolean} [options.binary=false] Specifies whether `data` is binary
- * or text
- * @param {Boolean} [options.compress=false] Specifies whether or not to
- * compress `data`
- * @param {Boolean} [options.fin=false] Specifies whether the fragment is the
- * last one
- * @param {Boolean} [options.mask=false] Specifies whether or not to mask
- * `data`
- * @param {Function} [cb] Callback
- * @public
- */
- send(data, options, cb) {
- const perMessageDeflate = this._extensions[PerMessageDeflate$2.extensionName];
- let opcode = options.binary ? 2 : 1;
- let rsv1 = options.compress;
-
- let byteLength;
- let readOnly;
-
- if (typeof data === 'string') {
- byteLength = Buffer.byteLength(data);
- readOnly = false;
- } else {
- data = toBuffer$1(data);
- byteLength = data.length;
- readOnly = toBuffer$1.readOnly;
- }
-
- if (this._firstFragment) {
- this._firstFragment = false;
- if (
- rsv1 &&
- perMessageDeflate &&
- perMessageDeflate.params[
- perMessageDeflate._isServer
- ? 'server_no_context_takeover'
- : 'client_no_context_takeover'
- ]
- ) {
- rsv1 = byteLength >= perMessageDeflate._threshold;
- }
- this._compress = rsv1;
- } else {
- rsv1 = false;
- opcode = 0;
- }
-
- if (options.fin) this._firstFragment = true;
-
- if (perMessageDeflate) {
- const opts = {
- [kByteLength]: byteLength,
- fin: options.fin,
- generateMask: this._generateMask,
- mask: options.mask,
- maskBuffer: this._maskBuffer,
- opcode,
- readOnly,
- rsv1
- };
-
- if (this._deflating) {
- this.enqueue([this.dispatch, data, this._compress, opts, cb]);
- } else {
- this.dispatch(data, this._compress, opts, cb);
- }
- } else {
- this.sendFrame(
- Sender.frame(data, {
- [kByteLength]: byteLength,
- fin: options.fin,
- generateMask: this._generateMask,
- mask: options.mask,
- maskBuffer: this._maskBuffer,
- opcode,
- readOnly,
- rsv1: false
- }),
- cb
- );
- }
- }
-
- /**
- * Dispatches a message.
- *
- * @param {(Buffer|String)} data The message to send
- * @param {Boolean} [compress=false] Specifies whether or not to compress
- * `data`
- * @param {Object} options Options object
- * @param {Boolean} [options.fin=false] Specifies whether or not to set the
- * FIN bit
- * @param {Function} [options.generateMask] The function used to generate the
- * masking key
- * @param {Boolean} [options.mask=false] Specifies whether or not to mask
- * `data`
- * @param {Buffer} [options.maskBuffer] The buffer used to store the masking
- * key
- * @param {Number} options.opcode The opcode
- * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be
- * modified
- * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the
- * RSV1 bit
- * @param {Function} [cb] Callback
- * @private
- */
- dispatch(data, compress, options, cb) {
- if (!compress) {
- this.sendFrame(Sender.frame(data, options), cb);
- return;
- }
-
- const perMessageDeflate = this._extensions[PerMessageDeflate$2.extensionName];
-
- this._bufferedBytes += options[kByteLength];
- this._deflating = true;
- perMessageDeflate.compress(data, options.fin, (_, buf) => {
- if (this._socket.destroyed) {
- const err = new Error(
- 'The socket was closed while data was being compressed'
- );
-
- if (typeof cb === 'function') cb(err);
-
- for (let i = 0; i < this._queue.length; i++) {
- const params = this._queue[i];
- const callback = params[params.length - 1];
-
- if (typeof callback === 'function') callback(err);
- }
-
- return;
- }
-
- this._bufferedBytes -= options[kByteLength];
- this._deflating = false;
- options.readOnly = false;
- this.sendFrame(Sender.frame(buf, options), cb);
- this.dequeue();
- });
- }
-
- /**
- * Executes queued send operations.
- *
- * @private
- */
- dequeue() {
- while (!this._deflating && this._queue.length) {
- const params = this._queue.shift();
-
- this._bufferedBytes -= params[3][kByteLength];
- Reflect.apply(params[0], this, params.slice(1));
- }
- }
-
- /**
- * Enqueues a send operation.
- *
- * @param {Array} params Send operation parameters.
- * @private
- */
- enqueue(params) {
- this._bufferedBytes += params[3][kByteLength];
- this._queue.push(params);
- }
-
- /**
- * Sends a frame.
- *
- * @param {Buffer[]} list The frame to send
- * @param {Function} [cb] Callback
- * @private
- */
- sendFrame(list, cb) {
- if (list.length === 2) {
- this._socket.cork();
- this._socket.write(list[0]);
- this._socket.write(list[1], cb);
- this._socket.uncork();
- } else {
- this._socket.write(list[0], cb);
- }
- }
-};
-
-var sender = Sender$1;
-
-const { kForOnEventAttribute: kForOnEventAttribute$1, kListener: kListener$1 } = constants;
-
-const kCode = Symbol('kCode');
-const kData = Symbol('kData');
-const kError = Symbol('kError');
-const kMessage = Symbol('kMessage');
-const kReason = Symbol('kReason');
-const kTarget = Symbol('kTarget');
-const kType = Symbol('kType');
-const kWasClean = Symbol('kWasClean');
-
-/**
- * Class representing an event.
- */
-class Event {
- /**
- * Create a new `Event`.
- *
- * @param {String} type The name of the event
- * @throws {TypeError} If the `type` argument is not specified
- */
- constructor(type) {
- this[kTarget] = null;
- this[kType] = type;
- }
-
- /**
- * @type {*}
- */
- get target() {
- return this[kTarget];
- }
-
- /**
- * @type {String}
- */
- get type() {
- return this[kType];
- }
-}
-
-Object.defineProperty(Event.prototype, 'target', { enumerable: true });
-Object.defineProperty(Event.prototype, 'type', { enumerable: true });
-
-/**
- * Class representing a close event.
- *
- * @extends Event
- */
-class CloseEvent extends Event {
- /**
- * Create a new `CloseEvent`.
- *
- * @param {String} type The name of the event
- * @param {Object} [options] A dictionary object that allows for setting
- * attributes via object members of the same name
- * @param {Number} [options.code=0] The status code explaining why the
- * connection was closed
- * @param {String} [options.reason=''] A human-readable strin (too long so truncated)
Command detailsnpm diff --diff=vitest@0.33.0 --diff=vitest@0.34.3 --diff-unified=2 See also the Reported by ybiquitous/npm-diff-action@v1.4.1 (Node.js 18.17.1 and npm 10.0.0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
dependencies
Pull requests that update a dependency file
javascript
Pull requests that update Javascript code
0 participants
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Bumps vitest from 0.33.0 to 0.34.3.
Release notes
Sourced from vitest's releases.
... (truncated)
Commits
bf83936
chore: release v0.34.3b42cf36
fix(jsdom): correctly resolve buffer on typed arrays (#3998)00c432f
fix: report file error as a <failure> on JUnit (#3997)18ae07a
chore: cleanup typos, remove any in VM executor (#3994)c03faa2
feat(coverage): addallowExternal
option (#3894)5704b34
feat(vitest): export all reporters invitest/reporters
(#3980)20263d9
fix: add workspace config files to default coverage excludes (#3973)5eb8561
fix: should remove mockPath from callstack whether success or failed (#3971)74dc596
fix(vitest): correctly resolve optimizer status (#3992)41e828f
chore: release v0.34.2Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase
.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebase
will rebase this PR@dependabot recreate
will recreate this PR, overwriting any edits that have been made to it@dependabot merge
will merge this PR after your CI passes on it@dependabot squash and merge
will squash and merge this PR after your CI passes on it@dependabot cancel merge
will cancel a previously requested merge and block automerging@dependabot reopen
will reopen this PR if it is closed@dependabot close
will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually@dependabot show <dependency name> ignore conditions
will show all of the ignore conditions of the specified dependency@dependabot ignore this major version
will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor version
will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependency
will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)