From 9ffc9c6bc2b3bf6d7ddf91dee9152c876870493d Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:39:12 -0800 Subject: [PATCH 01/35] Revert node engine change (#1002) --- .github/workflows/test.yml | 6 ++++-- package-lock.json | 6 +++--- package.json | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f586eb9c..7f6b419a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,7 @@ jobs: build: strategy: matrix: - node: [14, 16, 18, 19] + node: [10, 12, 14, 16, 18, 19] os: [ubuntu-22.04] include: # single mac test due to minute multipliers @@ -30,6 +30,8 @@ jobs: with: node-version: ${{ matrix.node }} cache: "npm" + - name: Update node-gyp + run: npm install --global node-gyp@latest - name: Install Windows packages if: runner.os == 'Windows' run: ./win_install.ps1 @@ -37,5 +39,5 @@ jobs: run: npm ci # skipping on windows for now due to Make / mocha exit code issues - name: Test - if: runner.os != 'Windows' + if: runner.os != 'Windows' && matrix.node != 10 run: npm test diff --git a/package-lock.json b/package-lock.json index 88cbb195..b06b0aa3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v2.14.5", + "version": "v2.14.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v2.14.5", + "version": "v2.14.6", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -22,7 +22,7 @@ "toolkit-jsdoc": "^1.0.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.0.0" } }, "node_modules/@babel/parser": { diff --git a/package.json b/package.json index 85cd7683..a4eecba8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rdkafka", - "version": "v2.14.5", + "version": "v2.14.6", "description": "Node.js bindings for librdkafka", "librdkafka": "1.9.2", "main": "lib/index.js", @@ -43,6 +43,6 @@ "nan": "^2.17.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.0.0" } } From 37ec22cc755f6c61bc3518dc39b2e0a773dab213 Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:53:21 -0800 Subject: [PATCH 02/35] Update to librdkafka 2.0.2 (#996) --- CONTRIBUTING.md | 2 ++ README.md | 10 +++++----- config.d.ts | 32 +++++++++++++++++++++----------- deps/librdkafka | 2 +- deps/windows-install.py | 14 +++++--------- errors.d.ts | 2 +- lib/error.js | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 9 files changed, 40 insertions(+), 32 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 648b1c39..c743be6e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -207,6 +207,8 @@ Steps to update: git checkout 063a9ae7a65cebdf1cc128da9815c05f91a2a996 # for version 1.8.2 ``` + If you get an error during that checkout command, double check that the submodule was initialized / cloned! You may need to run `git submodule update --init --recursive` + 1. Update [`config.d.ts`](https://github.com/Blizzard/node-rdkafka/blob/master/config.d.ts) and [`errors.d.ts`](https://github.com/Blizzard/node-rdkafka/blob/master/errors.d.ts) TypeScript definitions by running: ```bash node ci/librdkafka-defs-generator.js diff --git a/README.md b/README.md index 99786f88..5fc24418 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ I am looking for *your* help to make this project even better! If you're interes The `node-rdkafka` library is a high-performance NodeJS client for [Apache Kafka](http://kafka.apache.org/) that wraps the native [librdkafka](https://github.com/edenhill/librdkafka) library. All the complexity of balancing writes across partitions and managing (possibly ever-changing) brokers should be encapsulated in the library. -__This library currently uses `librdkafka` version `1.9.2`.__ +__This library currently uses `librdkafka` version `2.0.2`.__ ## Reference Docs @@ -60,7 +60,7 @@ Using Alpine Linux? Check out the [docs](https://github.com/Blizzard/node-rdkafk ### Windows -Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.1.9.2.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. +Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.0.2.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. Requirements: * [node-gyp for Windows](https://github.com/nodejs/node-gyp#on-windows) @@ -97,7 +97,7 @@ var Kafka = require('node-rdkafka'); ## Configuration -You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v1.9.2/CONFIGURATION.md) +You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.0.2/CONFIGURATION.md) Configuration keys that have the suffix `_cb` are designated as callbacks. Some of these keys are informational and you can choose to opt-in (for example, `dr_cb`). Others are callbacks designed to @@ -132,7 +132,7 @@ You can also get the version of `librdkafka` const Kafka = require('node-rdkafka'); console.log(Kafka.librdkafkaVersion); -// #=> 1.9.2 +// #=> 2.0.2 ``` ## Sending Messages @@ -145,7 +145,7 @@ var producer = new Kafka.Producer({ }); ``` -A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v1.9.2/CONFIGURATION.md) file described previously. +A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.0.2/CONFIGURATION.md) file described previously. The following example illustrates a list with several `librdkafka` options set. diff --git a/config.d.ts b/config.d.ts index b816277e..4b458e58 100644 --- a/config.d.ts +++ b/config.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 1.9.2 file CONFIGURATION.md ====== +// ====== Generated from librdkafka 2.0.2 file CONFIGURATION.md ====== // Code that generated this is a derivative work of the code from Nam Nguyen // https://gist.github.com/ntgn81/066c2c8ec5b4238f85d1e9168a04e3fb @@ -306,6 +306,11 @@ export interface GlobalConfig { */ "open_cb"?: any; + /** + * Address resolution callback (set with rd_kafka_conf_set_resolve_cb()). + */ + "resolve_cb"?: any; + /** * Application opaque (set with rd_kafka_conf_set_opaque()) */ @@ -351,6 +356,13 @@ export interface GlobalConfig { */ "broker.version.fallback"?: string; + /** + * Allow automatic topic creation on the broker when subscribing to or assigning non-existent topics. The broker must also be configured with `auto.create.topics.enable=true` for this configuration to take effect. Note: the default value (true) for the producer is different from the default value (false) for the consumer. Further, the consumer default value is different from the Java consumer (true), and this property is not supported by the Java producer. Requires broker version >= 0.11.0.0, for older broker versions only the broker configuration applies. + * + * @default false + */ + "allow.auto.create.topics"?: boolean; + /** * Protocol used to communicate with brokers. * @@ -446,7 +458,12 @@ export interface GlobalConfig { "ssl.keystore.password"?: string; /** - * Path to OpenSSL engine library. OpenSSL >= 1.1.0 required. + * Comma-separated list of OpenSSL 3.0.x implementation providers. E.g., "default,legacy". + */ + "ssl.providers"?: string; + + /** + * **DEPRECATED** Path to OpenSSL engine library. OpenSSL >= 1.1.x required. DEPRECATED: OpenSSL engine support is deprecated and should be replaced by OpenSSL 3 providers. */ "ssl.engine.location"?: string; @@ -472,7 +489,7 @@ export interface GlobalConfig { /** * Endpoint identification algorithm to validate broker hostname using broker certificate. https - Server (broker) hostname verification as specified in RFC2818. none - No endpoint verification. OpenSSL >= 1.0.2 required. * - * @default none + * @default https */ "ssl.endpoint.identification.algorithm"?: 'none' | 'https'; @@ -638,7 +655,7 @@ export interface ProducerGlobalConfig extends GlobalConfig { "enable.gapless.guarantee"?: boolean; /** - * Maximum number of messages allowed on the producer queue. This queue is shared by all topics and partitions. + * Maximum number of messages allowed on the producer queue. This queue is shared by all topics and partitions. A value of 0 disables this limit. * * @default 100000 */ @@ -918,13 +935,6 @@ export interface ConsumerGlobalConfig extends GlobalConfig { * @default false */ "check.crcs"?: boolean; - - /** - * Allow automatic topic creation on the broker when subscribing to or assigning non-existent topics. The broker must also be configured with `auto.create.topics.enable=true` for this configuraiton to take effect. Note: The default value (false) is different from the Java consumer (true). Requires broker version >= 0.11.0.0, for older broker versions only the broker configuration applies. - * - * @default false - */ - "allow.auto.create.topics"?: boolean; } export interface TopicConfig { diff --git a/deps/librdkafka b/deps/librdkafka index 9b72ca3a..292d2a66 160000 --- a/deps/librdkafka +++ b/deps/librdkafka @@ -1 +1 @@ -Subproject commit 9b72ca3aa6c49f8f57eea02f70aadb1453d3ba1f +Subproject commit 292d2a66b9921b783f08147807992e603c7af059 diff --git a/deps/windows-install.py b/deps/windows-install.py index fa114b78..f282df63 100644 --- a/deps/windows-install.py +++ b/deps/windows-install.py @@ -2,6 +2,8 @@ # read librdkafka version from package.json import json import os +import glob + with open('../package.json') as f: librdkafkaVersion = json.load(f)['librdkafka'] librdkafkaWinSufix = '7' if librdkafkaVersion == '0.11.5' else ''; @@ -62,15 +64,9 @@ def createdir(dir): shutil.copy2(includePath + '/rdkafka.h', depsIncludeDir) shutil.copy2(includePath + '/rdkafkacpp.h', depsIncludeDir) -shutil.copy2(dllPath + '/libcrypto-1_1-x64.dll', buildReleaseDir) -shutil.copy2(dllPath + '/libcurl.dll', buildReleaseDir) -shutil.copy2(dllPath + '/librdkafka.dll', buildReleaseDir) -shutil.copy2(dllPath + '/librdkafkacpp.dll', buildReleaseDir) -shutil.copy2(dllPath + '/libssl-1_1-x64.dll', buildReleaseDir) -shutil.copy2(dllPath + '/msvcp140.dll', buildReleaseDir) -shutil.copy2(dllPath + '/vcruntime140.dll', buildReleaseDir) -shutil.copy2(dllPath + '/zlib1.dll', buildReleaseDir) -shutil.copy2(dllPath + '/zstd.dll', buildReleaseDir) +# copy all the required dlls +for filename in glob.glob(os.path.join(dllPath, '*.dll')): + shutil.copy2(filename, buildReleaseDir) # clean up os.remove(outputFile) diff --git a/errors.d.ts b/errors.d.ts index b300dd79..dd4ec300 100644 --- a/errors.d.ts +++ b/errors.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 1.9.2 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.0.2 file src-cpp/rdkafkacpp.h ====== export const CODES: { ERRORS: { /* Internal errors to rdkafka: */ /** Begin internal error codes (**-200**) */ diff --git a/lib/error.js b/lib/error.js index 27812cf5..9066b907 100644 --- a/lib/error.js +++ b/lib/error.js @@ -27,7 +27,7 @@ LibrdKafkaError.wrap = errorWrap; * @enum {number} * @constant */ -// ====== Generated from librdkafka 1.9.2 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.0.2 file src-cpp/rdkafkacpp.h ====== LibrdKafkaError.codes = { /* Internal errors to rdkafka: */ diff --git a/package-lock.json b/package-lock.json index b06b0aa3..b8823dc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v2.14.6", + "version": "v2.15.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v2.14.6", + "version": "v2.15.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index a4eecba8..9043ca0c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "node-rdkafka", - "version": "v2.14.6", + "version": "v2.15.0", "description": "Node.js bindings for librdkafka", - "librdkafka": "1.9.2", + "librdkafka": "2.0.2", "main": "lib/index.js", "scripts": { "configure": "node-gyp configure", From 76ec9347c5f09746ed5b41b16b2390a58fa1ad44 Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Thu, 4 May 2023 13:17:43 -0700 Subject: [PATCH 03/35] Update to librdkafka 2.1.1 (#1008) --- README.md | 10 +++++----- config.d.ts | 2 +- deps/librdkafka | 2 +- errors.d.ts | 4 +++- lib/error.js | 4 +++- package-lock.json | 4 ++-- package.json | 4 ++-- 7 files changed, 17 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 5fc24418..2a0db086 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ I am looking for *your* help to make this project even better! If you're interes The `node-rdkafka` library is a high-performance NodeJS client for [Apache Kafka](http://kafka.apache.org/) that wraps the native [librdkafka](https://github.com/edenhill/librdkafka) library. All the complexity of balancing writes across partitions and managing (possibly ever-changing) brokers should be encapsulated in the library. -__This library currently uses `librdkafka` version `2.0.2`.__ +__This library currently uses `librdkafka` version `2.1.1`.__ ## Reference Docs @@ -60,7 +60,7 @@ Using Alpine Linux? Check out the [docs](https://github.com/Blizzard/node-rdkafk ### Windows -Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.0.2.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. +Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.1.1.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. Requirements: * [node-gyp for Windows](https://github.com/nodejs/node-gyp#on-windows) @@ -97,7 +97,7 @@ var Kafka = require('node-rdkafka'); ## Configuration -You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.0.2/CONFIGURATION.md) +You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.1.1/CONFIGURATION.md) Configuration keys that have the suffix `_cb` are designated as callbacks. Some of these keys are informational and you can choose to opt-in (for example, `dr_cb`). Others are callbacks designed to @@ -132,7 +132,7 @@ You can also get the version of `librdkafka` const Kafka = require('node-rdkafka'); console.log(Kafka.librdkafkaVersion); -// #=> 2.0.2 +// #=> 2.1.1 ``` ## Sending Messages @@ -145,7 +145,7 @@ var producer = new Kafka.Producer({ }); ``` -A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.0.2/CONFIGURATION.md) file described previously. +A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.1.1/CONFIGURATION.md) file described previously. The following example illustrates a list with several `librdkafka` options set. diff --git a/config.d.ts b/config.d.ts index 4b458e58..83fe1e4c 100644 --- a/config.d.ts +++ b/config.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.0.2 file CONFIGURATION.md ====== +// ====== Generated from librdkafka 2.1.1 file CONFIGURATION.md ====== // Code that generated this is a derivative work of the code from Nam Nguyen // https://gist.github.com/ntgn81/066c2c8ec5b4238f85d1e9168a04e3fb diff --git a/deps/librdkafka b/deps/librdkafka index 292d2a66..c282ba24 160000 --- a/deps/librdkafka +++ b/deps/librdkafka @@ -1 +1 @@ -Subproject commit 292d2a66b9921b783f08147807992e603c7af059 +Subproject commit c282ba2423b2694052393c8edb0399a5ef471b3f diff --git a/errors.d.ts b/errors.d.ts index dd4ec300..c1ef7c26 100644 --- a/errors.d.ts +++ b/errors.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.0.2 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.1.1 file src-cpp/rdkafkacpp.h ====== export const CODES: { ERRORS: { /* Internal errors to rdkafka: */ /** Begin internal error codes (**-200**) */ @@ -126,6 +126,8 @@ export const CODES: { ERRORS: { ERR__NOOP: number, /** No offset to automatically reset to (**-140**) */ ERR__AUTO_OFFSET_RESET: number, + /** Partition log truncation detected (**-139**) */ + ERR__LOG_TRUNCATION: number, /** End internal error codes (**-100**) */ ERR__END: number, diff --git a/lib/error.js b/lib/error.js index 9066b907..a36ab666 100644 --- a/lib/error.js +++ b/lib/error.js @@ -27,7 +27,7 @@ LibrdKafkaError.wrap = errorWrap; * @enum {number} * @constant */ -// ====== Generated from librdkafka 2.0.2 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.1.1 file src-cpp/rdkafkacpp.h ====== LibrdKafkaError.codes = { /* Internal errors to rdkafka: */ @@ -156,6 +156,8 @@ LibrdKafkaError.codes = { ERR__NOOP: -141, /** No offset to automatically reset to */ ERR__AUTO_OFFSET_RESET: -140, + /** Partition log truncation detected */ + ERR__LOG_TRUNCATION: -139, /** End internal error codes */ ERR__END: -100, diff --git a/package-lock.json b/package-lock.json index b8823dc6..782cd3b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v2.15.0", + "version": "v2.16.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v2.15.0", + "version": "v2.16.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 9043ca0c..b50c6a8e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "node-rdkafka", - "version": "v2.15.0", + "version": "v2.16.0", "description": "Node.js bindings for librdkafka", - "librdkafka": "2.0.2", + "librdkafka": "2.1.1", "main": "lib/index.js", "scripts": { "configure": "node-gyp configure", From 8429f0cd84a506efde5919058027f4a7346c201e Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Fri, 26 May 2023 09:55:18 -0700 Subject: [PATCH 04/35] Stop consume loop thread when disconnecting (#1017) --- package-lock.json | 4 ++-- package.json | 2 +- src/kafka-consumer.cc | 17 ++++++++++++----- src/kafka-consumer.h | 2 +- src/workers.cc | 13 +++++++++---- src/workers.h | 2 ++ 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 782cd3b5..4ddfdfc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v2.16.0", + "version": "v2.16.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v2.16.0", + "version": "v2.16.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index b50c6a8e..e5f76835 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rdkafka", - "version": "v2.16.0", + "version": "v2.16.1", "description": "Node.js bindings for librdkafka", "librdkafka": "2.1.1", "main": "lib/index.js", diff --git a/src/kafka-consumer.cc b/src/kafka-consumer.cc index 0c4c07c2..019b0cb6 100644 --- a/src/kafka-consumer.cc +++ b/src/kafka-consumer.cc @@ -92,11 +92,6 @@ Baton KafkaConsumer::Disconnect() { } } - if (m_consume_loop != nullptr) { - delete m_consume_loop; - m_consume_loop = nullptr; - } - m_is_closing = false; return Baton(err); @@ -1192,6 +1187,18 @@ NAN_METHOD(KafkaConsumer::NodeDisconnect) { Nan::Callback *callback = new Nan::Callback(cb); KafkaConsumer* consumer = ObjectWrap::Unwrap(info.This()); + Workers::KafkaConsumerConsumeLoop* consumeLoop = (Workers::KafkaConsumerConsumeLoop*)consumer->m_consume_loop; + if (consumeLoop != nullptr) { + // stop the consume loop + consumeLoop->Close(); + + // cleanup the async worker + consumeLoop->WorkComplete(); + consumeLoop->Destroy(); + + consumer->m_consume_loop = nullptr; + } + Nan::AsyncQueueWorker( new Workers::KafkaConsumerDisconnect(callback, consumer)); info.GetReturnValue().Set(Nan::Null()); diff --git a/src/kafka-consumer.h b/src/kafka-consumer.h index de8f2181..c91590ec 100644 --- a/src/kafka-consumer.h +++ b/src/kafka-consumer.h @@ -98,7 +98,7 @@ class KafkaConsumer : public Connection { int m_partition_cnt; bool m_is_subscribed = false; - void* m_consume_loop; + void* m_consume_loop = nullptr; // Node methods static NAN_METHOD(NodeConnect); diff --git a/src/workers.cc b/src/workers.cc index 3d9b3d7c..55d3dd50 100644 --- a/src/workers.cc +++ b/src/workers.cc @@ -663,6 +663,7 @@ KafkaConsumerConsumeLoop::KafkaConsumerConsumeLoop(Nan::Callback *callback, const int & timeout_sleep_delay_ms) : MessageWorker(callback), consumer(consumer), + m_looping(true), m_timeout_ms(timeout_ms), m_timeout_sleep_delay_ms(timeout_sleep_delay_ms) { uv_thread_create(&thread_event_loop, KafkaConsumerConsumeLoop::ConsumeLoop, (void*)this); @@ -670,6 +671,11 @@ KafkaConsumerConsumeLoop::KafkaConsumerConsumeLoop(Nan::Callback *callback, KafkaConsumerConsumeLoop::~KafkaConsumerConsumeLoop() {} +void KafkaConsumerConsumeLoop::Close() { + m_looping = false; + uv_thread_join(&thread_event_loop); +} + void KafkaConsumerConsumeLoop::Execute(const ExecutionMessageBus& bus) { // ConsumeLoop is used instead } @@ -680,8 +686,7 @@ void KafkaConsumerConsumeLoop::ConsumeLoop(void *arg) { KafkaConsumer* consumer = consumerLoop->consumer; // Do one check here before we move forward - bool looping = true; - while (consumer->IsConnected() && looping) { + while (consumerLoop->m_looping && consumer->IsConnected()) { Baton b = consumer->Consume(consumerLoop->m_timeout_ms); RdKafka::ErrorCode ec = b.err(); if (ec == RdKafka::ERR_NO_ERROR) { @@ -711,7 +716,7 @@ void KafkaConsumerConsumeLoop::ConsumeLoop(void *arg) { default: // Unknown error. We need to break out of this consumerLoop->SetErrorBaton(b); - looping = false; + consumerLoop->m_looping = false; break; } } else if (ec == RdKafka::ERR_UNKNOWN_TOPIC_OR_PART || ec == RdKafka::ERR_TOPIC_AUTHORIZATION_FAILED) { @@ -719,7 +724,7 @@ void KafkaConsumerConsumeLoop::ConsumeLoop(void *arg) { } else { // Unknown error. We need to break out of this consumerLoop->SetErrorBaton(b); - looping = false; + consumerLoop->m_looping = false; } } } diff --git a/src/workers.h b/src/workers.h index dcea2477..d7d5ac8a 100644 --- a/src/workers.h +++ b/src/workers.h @@ -373,6 +373,7 @@ class KafkaConsumerConsumeLoop : public MessageWorker { ~KafkaConsumerConsumeLoop(); static void ConsumeLoop(void *arg); + void Close(); void Execute(const ExecutionMessageBus&); void HandleOKCallback(); void HandleErrorCallback(); @@ -383,6 +384,7 @@ class KafkaConsumerConsumeLoop : public MessageWorker { const int m_timeout_ms; unsigned int m_rand_seed; const int m_timeout_sleep_delay_ms; + bool m_looping; }; class KafkaConsumerConsume : public ErrorAwareWorker { From a8c288d78311fa46c8c1f740e048d7a182ac9226 Mon Sep 17 00:00:00 2001 From: Amila Welihinda Date: Fri, 21 Jul 2023 10:48:49 -0700 Subject: [PATCH 05/35] upgrade examples to es6 (#1029) --- README.md | 70 +++++++++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 2a0db086..2532b952 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ npm install node-rdkafka To use the module, you must `require` it. ```js -var Kafka = require('node-rdkafka'); +const Kafka = require('node-rdkafka'); ``` ## Configuration @@ -140,7 +140,7 @@ console.log(Kafka.librdkafkaVersion); A `Producer` sends messages to Kafka. The `Producer` constructor takes a configuration object, as shown in the following example: ```js -var producer = new Kafka.Producer({ +const producer = new Kafka.Producer({ 'metadata.broker.list': 'kafka-host1:9092,kafka-host2:9092' }); ``` @@ -150,7 +150,7 @@ A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be crea The following example illustrates a list with several `librdkafka` options set. ```js -var producer = new Kafka.Producer({ +const producer = new Kafka.Producer({ 'client.id': 'kafka', 'metadata.broker.list': 'localhost:9092', 'compression.codec': 'gzip', @@ -171,14 +171,14 @@ You can easily use the `Producer` as a writable stream immediately after creatio ```js // Our producer with its Kafka brokers // This call returns a new writable stream to our topic 'topic-name' -var stream = Kafka.Producer.createWriteStream({ +const stream = Kafka.Producer.createWriteStream({ 'metadata.broker.list': 'kafka-host1:9092,kafka-host2:9092' }, {}, { topic: 'topic-name' }); // Writes a message to the stream -var queuedSuccess = stream.write(Buffer.from('Awesome message')); +const queuedSuccess = stream.write(Buffer.from('Awesome message')); if (queuedSuccess) { console.log('We queued our message!'); @@ -190,7 +190,7 @@ if (queuedSuccess) { // NOTE: MAKE SURE TO LISTEN TO THIS IF YOU WANT THE STREAM TO BE DURABLE // Otherwise, any error will bubble up as an uncaught exception. -stream.on('error', function (err) { +stream.on('error', (err) => { // Here's where we'll know if something went wrong sending to Kafka console.error('Error in our kafka stream'); console.error(err); @@ -205,7 +205,7 @@ The Standard API is more performant, particularly when handling high volumes of However, it requires more manual setup to use. The following example illustrates its use: ```js -var producer = new Kafka.Producer({ +const producer = new Kafka.Producer({ 'metadata.broker.list': 'localhost:9092', 'dr_cb': true }); @@ -214,7 +214,7 @@ var producer = new Kafka.Producer({ producer.connect(); // Wait for the ready event before proceeding -producer.on('ready', function() { +producer.on('ready', () => { try { producer.produce( // Topic to send the message to @@ -239,7 +239,7 @@ producer.on('ready', function() { }); // Any errors we encounter, including connection errors -producer.on('event.error', function(err) { +producer.on('event.error', (err) => { console.error('Error from producer'); console.error(err); }) @@ -279,7 +279,7 @@ Some configuration properties that end in `_cb` indicate that an event should be The following example illustrates an event: ```js -var producer = new Kafka.Producer({ +const producer = new Kafka.Producer({ 'client.id': 'my-client', // Specifies an identifier to use to help trace activity in Kafka 'metadata.broker.list': 'localhost:9092', // Connect to a Kafka instance on localhost 'dr_cb': true // Specifies that we want a delivery-report event to be generated @@ -288,7 +288,7 @@ var producer = new Kafka.Producer({ // Poll for events every 100 ms producer.setPollInterval(100); -producer.on('delivery-report', function(err, report) { +producer.on('delivery-report', (err, report) => { // Report of delivery statistics here: // console.log(report); @@ -313,7 +313,7 @@ The following table describes types of events. The higher level producer is a variant of the producer which can propagate callbacks to you upon message delivery. ```js -var producer = new Kafka.HighLevelProducer({ +const producer = new Kafka.HighLevelProducer({ 'metadata.broker.list': 'localhost:9092', }); ``` @@ -330,7 +330,7 @@ producer.produce(topicName, null, Buffer.from('alliance4ever'), null, Date.now() Additionally you can add serializers to modify the value of a produce for a key or value before it is sent over to Kafka. ```js -producer.setValueSerializer(function(value) { +producer.setValueSerializer((value) => { return Buffer.from(JSON.stringify(value)); }); ``` @@ -342,7 +342,7 @@ Otherwise the behavior of the class should be exactly the same. To read messages from Kafka, you use a `KafkaConsumer`. You instantiate a `KafkaConsumer` object as follows: ```js -var consumer = new Kafka.KafkaConsumer({ +const consumer = new Kafka.KafkaConsumer({ 'group.id': 'kafka', 'metadata.broker.list': 'localhost:9092', }, {}); @@ -357,10 +357,10 @@ The `group.id` and `metadata.broker.list` properties are required for a consumer Rebalancing is managed internally by `librdkafka` by default. If you would like to override this functionality, you may provide your own logic as a rebalance callback. ```js -var consumer = new Kafka.KafkaConsumer({ +const consumer = new Kafka.KafkaConsumer({ 'group.id': 'kafka', 'metadata.broker.list': 'localhost:9092', - 'rebalance_cb': function(err, assignment) { + 'rebalance_cb': (err, assignment) => { if (err.code === Kafka.CODES.ERRORS.ERR__ASSIGN_PARTITIONS) { // Note: this can throw when you are disconnected. Take care and wrap it in @@ -385,10 +385,10 @@ var consumer = new Kafka.KafkaConsumer({ When you commit in `node-rdkafka`, the standard way is to queue the commit request up with the next `librdkafka` request to the broker. When doing this, there isn't a way to know the result of the commit. Luckily there is another callback you can listen to to get this information ```js -var consumer = new Kafka.KafkaConsumer({ +const consumer = new Kafka.KafkaConsumer({ 'group.id': 'kafka', 'metadata.broker.list': 'localhost:9092', - 'offset_commit_cb': function(err, topicPartitions) { + 'offset_commit_cb': (err, topicPartitions) => { if (err) { // There was an error committing @@ -426,11 +426,11 @@ The stream API is the easiest way to consume messages. The following example ill ```js // Read from the librdtesting-01 topic... note that this creates a new stream on each call! -var stream = KafkaConsumer.createReadStream(globalConfig, topicConfig, { +const stream = KafkaConsumer.createReadStream(globalConfig, topicConfig, { topics: ['librdtesting-01'] }); -stream.on('data', function(message) { +stream.on('data', (message) => { console.log('Got message'); console.log(message.value.toString()); }); @@ -455,7 +455,7 @@ The following example illustrates flowing mode: consumer.connect(); consumer - .on('ready', function() { + .on('ready', () => { consumer.subscribe(['librdtesting-01']); // Consume from the librdtesting-01 topic. This is what determines @@ -463,7 +463,7 @@ consumer // only a callback) we get messages as soon as they are available. consumer.consume(); }) - .on('data', function(data) { + .on('data', (data) => { // Output the actual message contents console.log(data.value.toString()); }); @@ -474,17 +474,17 @@ The following example illustrates non-flowing mode: consumer.connect(); consumer - .on('ready', function() { + .on('ready', () => { // Subscribe to the librdtesting-01 topic // This makes subsequent consumes read from that topic. consumer.subscribe(['librdtesting-01']); // Read one message every 1000 milliseconds - setInterval(function() { + setInterval(() => { consumer.consume(1); }, 1000); }) - .on('data', function(data) { + .on('data', (data) => { console.log('Message found! Contents below.'); console.log(data.value.toString()); }); @@ -524,15 +524,15 @@ The following table lists events for this API. Some times you find yourself in the situation where you need to know the latest (and earliest) offset for one of your topics. Connected producers and consumers both allow you to query for these through `queryWaterMarkOffsets` like follows: ```js -var timeout = 5000, partition = 0; -consumer.queryWatermarkOffsets('my-topic', partition, timeout, function(err, offsets) { - var high = offsets.highOffset; - var low = offsets.lowOffset; +const timeout = 5000, partition = 0; +consumer.queryWatermarkOffsets('my-topic', partition, timeout, (err, offsets) => { + const high = offsets.highOffset; + const low = offsets.lowOffset; }); -producer.queryWatermarkOffsets('my-topic', partition, timeout, function(err, offsets) { - var high = offsets.highOffset; - var low = offsets.lowOffset; +producer.queryWatermarkOffsets('my-topic', partition, timeout, (err, offsets) => { + const high = offsets.highOffset; + const low = offsets.lowOffset; }); An error will be returned if the client was not connected or the request timed out within the specified interval. @@ -578,12 +578,12 @@ When fetching metadata for a specific topic, if a topic reference does not exist Please see the documentation on `Client.getMetadata` if you want to set configuration parameters, e.g. `acks`, on a topic to produce messages to. ```js -var opts = { +const opts = { topic: 'librdtesting-01', timeout: 10000 }; -producer.getMetadata(opts, function(err, metadata) { +producer.getMetadata(opts, (err, metadata) => { if (err) { console.error('Error getting metadata'); console.error(err); @@ -616,7 +616,7 @@ client.createTopic({ topic: topicName, num_partitions: 1, replication_factor: 1 -}, function(err) { +}, (err) => { // Done! }); ``` From e7e4c6d1acbd3fa508b50a57133e2fa60d3903ac Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Fri, 21 Jul 2023 14:09:42 -0700 Subject: [PATCH 06/35] Update to librdkafka 2.2.0 (#1033) --- README.md | 10 +++++----- config.d.ts | 16 +++++++++++++++- deps/librdkafka | 2 +- errors.d.ts | 2 +- lib/error.js | 2 +- package-lock.json | 4 ++-- package.json | 6 +++--- src/binding.cc | 20 -------------------- 8 files changed, 28 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 2532b952..e5721093 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ I am looking for *your* help to make this project even better! If you're interes The `node-rdkafka` library is a high-performance NodeJS client for [Apache Kafka](http://kafka.apache.org/) that wraps the native [librdkafka](https://github.com/edenhill/librdkafka) library. All the complexity of balancing writes across partitions and managing (possibly ever-changing) brokers should be encapsulated in the library. -__This library currently uses `librdkafka` version `2.1.1`.__ +__This library currently uses `librdkafka` version `2.2.0`.__ ## Reference Docs @@ -60,7 +60,7 @@ Using Alpine Linux? Check out the [docs](https://github.com/Blizzard/node-rdkafk ### Windows -Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.1.1.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. +Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.2.0.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. Requirements: * [node-gyp for Windows](https://github.com/nodejs/node-gyp#on-windows) @@ -97,7 +97,7 @@ const Kafka = require('node-rdkafka'); ## Configuration -You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.1.1/CONFIGURATION.md) +You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.2.0/CONFIGURATION.md) Configuration keys that have the suffix `_cb` are designated as callbacks. Some of these keys are informational and you can choose to opt-in (for example, `dr_cb`). Others are callbacks designed to @@ -132,7 +132,7 @@ You can also get the version of `librdkafka` const Kafka = require('node-rdkafka'); console.log(Kafka.librdkafkaVersion); -// #=> 2.1.1 +// #=> 2.2.0 ``` ## Sending Messages @@ -145,7 +145,7 @@ const producer = new Kafka.Producer({ }); ``` -A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.1.1/CONFIGURATION.md) file described previously. +A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.2.0/CONFIGURATION.md) file described previously. The following example illustrates a list with several `librdkafka` options set. diff --git a/config.d.ts b/config.d.ts index 83fe1e4c..f5c3dc6c 100644 --- a/config.d.ts +++ b/config.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.1.1 file CONFIGURATION.md ====== +// ====== Generated from librdkafka 2.2.0 file CONFIGURATION.md ====== // Code that generated this is a derivative work of the code from Nam Nguyen // https://gist.github.com/ntgn81/066c2c8ec5b4238f85d1e9168a04e3fb @@ -619,6 +619,13 @@ export interface GlobalConfig { */ "client.rack"?: string; + /** + * Controls how the client uses DNS lookups. By default, when the lookup returns multiple IP addresses for a hostname, they will all be attempted for connection before the connection is considered failed. This applies to both bootstrap and advertised servers. If the value is set to `resolve_canonical_bootstrap_servers_only`, each entry will be resolved and expanded into a list of canonical names. NOTE: Default here is different from the Java client's default behavior, which connects only to the first IP address returned for a hostname. + * + * @default use_all_dns_ips + */ + "client.dns.lookup"?: 'use_all_dns_ips' | 'resolve_canonical_bootstrap_servers_only'; + /** * Enables or disables `event.*` emitting. * @@ -858,6 +865,13 @@ export interface ConsumerGlobalConfig extends GlobalConfig { */ "fetch.wait.max.ms"?: number; + /** + * How long to postpone the next fetch request for a topic+partition in case the current fetch queue thresholds (queued.min.messages or queued.max.messages.kbytes) have been exceded. This property may need to be decreased if the queue thresholds are set low and the application is experiencing long (~1s) delays between messages. Low values may increase CPU utilization. + * + * @default 1000 + */ + "fetch.queue.backoff.ms"?: number; + /** * Initial maximum number of bytes per topic+partition to request when fetching messages from the broker. If the client encounters a message larger than this value it will gradually try to increase it until the entire message can be fetched. * diff --git a/deps/librdkafka b/deps/librdkafka index c282ba24..e75de5be 160000 --- a/deps/librdkafka +++ b/deps/librdkafka @@ -1 +1 @@ -Subproject commit c282ba2423b2694052393c8edb0399a5ef471b3f +Subproject commit e75de5be191b6b8e9602efc969f4af64071550de diff --git a/errors.d.ts b/errors.d.ts index c1ef7c26..364fa73c 100644 --- a/errors.d.ts +++ b/errors.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.1.1 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.2.0 file src-cpp/rdkafkacpp.h ====== export const CODES: { ERRORS: { /* Internal errors to rdkafka: */ /** Begin internal error codes (**-200**) */ diff --git a/lib/error.js b/lib/error.js index a36ab666..d0d5eec7 100644 --- a/lib/error.js +++ b/lib/error.js @@ -27,7 +27,7 @@ LibrdKafkaError.wrap = errorWrap; * @enum {number} * @constant */ -// ====== Generated from librdkafka 2.1.1 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.2.0 file src-cpp/rdkafkacpp.h ====== LibrdKafkaError.codes = { /* Internal errors to rdkafka: */ diff --git a/package-lock.json b/package-lock.json index 4ddfdfc8..48de29ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v2.16.1", + "version": "v2.17.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v2.16.1", + "version": "v2.17.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e5f76835..f723a5d7 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "node-rdkafka", - "version": "v2.16.1", + "version": "v2.17.0", "description": "Node.js bindings for librdkafka", - "librdkafka": "2.1.1", + "librdkafka": "2.2.0", "main": "lib/index.js", "scripts": { "configure": "node-gyp configure", @@ -45,4 +45,4 @@ "engines": { "node": ">=6.0.0" } -} +} \ No newline at end of file diff --git a/src/binding.cc b/src/binding.cc index badbc682..de3f61f9 100644 --- a/src/binding.cc +++ b/src/binding.cc @@ -15,21 +15,8 @@ using NodeKafka::KafkaConsumer; using NodeKafka::AdminClient; using NodeKafka::Topic; -using node::AtExit; using RdKafka::ErrorCode; -static void RdKafkaCleanup(void*) { // NOLINT - /* - * Wait for RdKafka to decommission. - * This is not strictly needed but - * allows RdKafka to clean up all its resources before the application - * exits so that memory profilers such as valgrind wont complain about - * memory leaks. - */ - - RdKafka::wait_destroyed(5000); -} - NAN_METHOD(NodeRdKafkaErr2Str) { int points = Nan::To(info[0]).FromJust(); // Cast to error code @@ -74,13 +61,6 @@ void ConstantsInit(v8::Local exports) { } void Init(v8::Local exports, v8::Local m_, void* v_) { -#if NODE_MAJOR_VERSION <= 9 || (NODE_MAJOR_VERSION == 10 && NODE_MINOR_VERSION <= 15) - AtExit(RdKafkaCleanup); -#else - v8::Local context = Nan::GetCurrentContext(); - node::Environment* env = node::GetCurrentEnvironment(context); - AtExit(env, RdKafkaCleanup, NULL); -#endif KafkaConsumer::Init(exports); Producer::Init(exports); AdminClient::Init(exports); From 2b7b1bd8d30b602b36d0116657bd88e365acbcc6 Mon Sep 17 00:00:00 2001 From: riley-pikus <102187295+riley-pikus@users.noreply.github.com> Date: Thu, 26 Oct 2023 13:56:10 -0400 Subject: [PATCH 07/35] Update to librdkafka 2.3.0 (#1047) --- CONTRIBUTING.md | 4 +- README.md | 10 +- config.d.ts | 15 +- deps/librdkafka | 2 +- errors.d.ts | 4 +- lib/error.js | 4 +- package-lock.json | 1271 +++++++++++++++++++++++++++++++++------------ package.json | 4 +- 8 files changed, 950 insertions(+), 364 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c743be6e..db025fe0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -215,12 +215,10 @@ Steps to update: ``` Note: This is ran automatically during CI flows but it's good to run it during the version upgrade pull request. -1. Run `npm install` to build with the new version and fix any build errors that occur. +1. Run `npm install --lockfile-version 2` to build with the new version and fix any build errors that occur. 1. Run unit tests: `npm run test` -1. Run end to end tests: `npm run test:e2e`. This requires running kafka & zookeeper locally. - 1. Update the version numbers referenced in the [`README.md`](https://github.com/Blizzard/node-rdkafka/blob/master/README.md) file to the new version. ## Publishing new npm version diff --git a/README.md b/README.md index e5721093..8408e943 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ I am looking for *your* help to make this project even better! If you're interes The `node-rdkafka` library is a high-performance NodeJS client for [Apache Kafka](http://kafka.apache.org/) that wraps the native [librdkafka](https://github.com/edenhill/librdkafka) library. All the complexity of balancing writes across partitions and managing (possibly ever-changing) brokers should be encapsulated in the library. -__This library currently uses `librdkafka` version `2.2.0`.__ +__This library currently uses `librdkafka` version `2.3.0`.__ ## Reference Docs @@ -60,7 +60,7 @@ Using Alpine Linux? Check out the [docs](https://github.com/Blizzard/node-rdkafk ### Windows -Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.2.0.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. +Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.3.0.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. Requirements: * [node-gyp for Windows](https://github.com/nodejs/node-gyp#on-windows) @@ -97,7 +97,7 @@ const Kafka = require('node-rdkafka'); ## Configuration -You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.2.0/CONFIGURATION.md) +You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.3.0/CONFIGURATION.md) Configuration keys that have the suffix `_cb` are designated as callbacks. Some of these keys are informational and you can choose to opt-in (for example, `dr_cb`). Others are callbacks designed to @@ -132,7 +132,7 @@ You can also get the version of `librdkafka` const Kafka = require('node-rdkafka'); console.log(Kafka.librdkafkaVersion); -// #=> 2.2.0 +// #=> 2.3.0 ``` ## Sending Messages @@ -145,7 +145,7 @@ const producer = new Kafka.Producer({ }); ``` -A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.2.0/CONFIGURATION.md) file described previously. +A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.3.0/CONFIGURATION.md) file described previously. The following example illustrates a list with several `librdkafka` options set. diff --git a/config.d.ts b/config.d.ts index f5c3dc6c..e78a4141 100644 --- a/config.d.ts +++ b/config.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.2.0 file CONFIGURATION.md ====== +// ====== Generated from librdkafka 2.3.0 file CONFIGURATION.md ====== // Code that generated this is a derivative work of the code from Nam Nguyen // https://gist.github.com/ntgn81/066c2c8ec5b4238f85d1e9168a04e3fb @@ -77,9 +77,9 @@ export interface GlobalConfig { "metadata.max.age.ms"?: number; /** - * When a topic loses its leader a new metadata request will be enqueued with this initial interval, exponentially increasing until the topic metadata has been refreshed. This is used to recover quickly from transitioning leader brokers. + * When a topic loses its leader a new metadata request will be enqueued immediately and then with this initial interval, exponentially increasing upto `retry.backoff.max.ms`, until the topic metadata has been refreshed. If not set explicitly, it will be defaulted to `retry.backoff.ms`. This is used to recover quickly from transitioning leader brokers. * - * @default 250 + * @default 100 */ "topic.metadata.refresh.fast.interval.ms"?: number; @@ -704,12 +704,19 @@ export interface ProducerGlobalConfig extends GlobalConfig { "retries"?: number; /** - * The backoff time in milliseconds before retrying a protocol request. + * The backoff time in milliseconds before retrying a protocol request, this is the first backoff time, and will be backed off exponentially until number of retries is exhausted, and it's capped by retry.backoff.max.ms. * * @default 100 */ "retry.backoff.ms"?: number; + /** + * The max backoff time in milliseconds before retrying a protocol request, this is the atmost backoff allowed for exponentially backed off requests. + * + * @default 1000 + */ + "retry.backoff.max.ms"?: number; + /** * The threshold of outstanding not yet transmitted broker requests needed to backpressure the producer's message accumulator. If the number of not yet transmitted requests equals or exceeds this number, produce request creation that would have otherwise been triggered (for example, in accordance with linger.ms) will be delayed. A lower number yields larger and more effective batches. A higher value can improve latency when using compression on slow machines. * diff --git a/deps/librdkafka b/deps/librdkafka index e75de5be..95a542c8 160000 --- a/deps/librdkafka +++ b/deps/librdkafka @@ -1 +1 @@ -Subproject commit e75de5be191b6b8e9602efc969f4af64071550de +Subproject commit 95a542c87c61d2c45b445f91c73dd5442eb04f3c diff --git a/errors.d.ts b/errors.d.ts index 364fa73c..439ec72b 100644 --- a/errors.d.ts +++ b/errors.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.2.0 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.3.0 file src-cpp/rdkafkacpp.h ====== export const CODES: { ERRORS: { /* Internal errors to rdkafka: */ /** Begin internal error codes (**-200**) */ @@ -128,10 +128,8 @@ export const CODES: { ERRORS: { ERR__AUTO_OFFSET_RESET: number, /** Partition log truncation detected (**-139**) */ ERR__LOG_TRUNCATION: number, - /** End internal error codes (**-100**) */ ERR__END: number, - /* Kafka broker errors: */ /** Unknown broker error (**-1**) */ ERR_UNKNOWN: number, diff --git a/lib/error.js b/lib/error.js index d0d5eec7..0f14e1e8 100644 --- a/lib/error.js +++ b/lib/error.js @@ -27,7 +27,7 @@ LibrdKafkaError.wrap = errorWrap; * @enum {number} * @constant */ -// ====== Generated from librdkafka 2.2.0 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.3.0 file src-cpp/rdkafkacpp.h ====== LibrdKafkaError.codes = { /* Internal errors to rdkafka: */ @@ -158,10 +158,8 @@ LibrdKafkaError.codes = { ERR__AUTO_OFFSET_RESET: -140, /** Partition log truncation detected */ ERR__LOG_TRUNCATION: -139, - /** End internal error codes */ ERR__END: -100, - /* Kafka broker errors: */ /** Unknown broker error */ ERR_UNKNOWN: -1, diff --git a/package-lock.json b/package-lock.json index 48de29ed..9a432ac7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,9 +26,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", - "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -37,37 +37,122 @@ "node": ">=6.0.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" } }, "node_modules/@tootallnate/once": { @@ -80,9 +165,9 @@ } }, "node_modules/@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", + "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", "dev": true }, "node_modules/@types/markdown-it": { @@ -96,9 +181,9 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", + "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", "dev": true }, "node_modules/abbrev": { @@ -120,13 +205,11 @@ } }, "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" }, "engines": { @@ -212,9 +295,9 @@ } }, "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -298,32 +381,26 @@ "dev": true }, "node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "unique-filename": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/cacache/node_modules/brace-expansion": { @@ -336,34 +413,49 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/camelcase": { @@ -541,6 +633,20 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -564,6 +670,12 @@ } } }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -582,15 +694,6 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -656,6 +759,12 @@ "domelementtype": "1" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -720,6 +829,12 @@ "node": ">= 0.8.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -762,16 +877,53 @@ "flat": "cli.js" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/fs.realpath": { @@ -781,9 +933,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -867,9 +1019,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/has-flag": { @@ -910,9 +1062,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "node_modules/http-proxy-agent": { @@ -982,12 +1134,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1100,6 +1246,24 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1151,9 +1315,9 @@ } }, "node_modules/jshint": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz", - "integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==", + "version": "2.13.6", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", + "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", "dev": true, "dependencies": { "cli": "~1.0.0", @@ -1236,39 +1400,38 @@ } }, "node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ssri": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/markdown-it": { @@ -1288,9 +1451,9 @@ } }, "node_modules/markdown-it-anchor": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz", - "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==", + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "dev": true, "peerDependencies": { "@types/markdown-it": "*", @@ -1307,9 +1470,9 @@ } }, "node_modules/marked": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", - "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -1337,13 +1500,10 @@ } }, "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { "node": ">=8" } @@ -1360,23 +1520,44 @@ "node": ">= 8" } }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "dependencies": { - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -1389,6 +1570,18 @@ "node": ">= 8" } }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -1401,6 +1594,18 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", @@ -1413,6 +1618,18 @@ "node": ">=8" } }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -1426,6 +1643,18 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -1543,22 +1772,16 @@ "balanced-match": "^1.0.0" } }, - "node_modules/mocha/node_modules/ms": { + "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" }, "node_modules/nanoid": { "version": "3.3.3", @@ -1582,15 +1805,16 @@ } }, "node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dev": true, "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -1716,6 +1940,40 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -1728,12 +1986,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -1790,12 +2042,12 @@ } }, "node_modules/requizzle": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", - "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", "dev": true, "dependencies": { - "lodash": "^4.17.14" + "lodash": "^4.17.21" } }, "node_modules/retry": { @@ -1850,9 +2102,9 @@ "optional": true }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -1891,6 +2143,27 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -1936,15 +2209,24 @@ } }, "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, "dependencies": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/string_decoder": { @@ -1967,6 +2249,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -1979,6 +2276,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2013,26 +2323,38 @@ "dev": true }, "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/tar/node_modules/minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { "yallist": "^4.0.0" @@ -2072,27 +2394,27 @@ "dev": true }, "node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, "dependencies": { - "unique-slug": "^3.0.0" + "unique-slug": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/util-deprecate": { @@ -2148,6 +2470,24 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2232,36 +2572,91 @@ }, "dependencies": { "@babel/parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", - "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } }, "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dev": true, "requires": { - "@gar/promisify": "^1.1.3", "semver": "^7.3.5" } }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } + "optional": true }, "@tootallnate/once": { "version": "2.0.0", @@ -2270,9 +2665,9 @@ "dev": true }, "@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", + "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", "dev": true }, "@types/markdown-it": { @@ -2286,9 +2681,9 @@ } }, "@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", + "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", "dev": true }, "abbrev": { @@ -2307,13 +2702,11 @@ } }, "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" } }, @@ -2375,9 +2768,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -2454,29 +2847,23 @@ "dev": true }, "cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "unique-filename": "^3.0.0" }, "dependencies": { "brace-expansion": { @@ -2489,26 +2876,32 @@ } }, "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true } } }, @@ -2645,6 +3038,17 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2658,6 +3062,14 @@ "dev": true, "requires": { "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "decamelize": { @@ -2672,12 +3084,6 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -2733,6 +3139,12 @@ "domelementtype": "1" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2785,6 +3197,12 @@ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, + "exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -2815,13 +3233,39 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + } + } + }, "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "requires": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } } }, "fs.realpath": { @@ -2831,9 +3275,9 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -2894,9 +3338,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "has-flag": { @@ -2931,9 +3375,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-proxy-agent": { @@ -2988,12 +3432,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3082,6 +3520,16 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3124,9 +3572,9 @@ } }, "jshint": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz", - "integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==", + "version": "2.13.6", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", + "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", "dev": true, "requires": { "cli": "~1.0.0", @@ -3190,33 +3638,32 @@ } }, "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "requires": { "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ssri": "^10.0.0" } }, "markdown-it": { @@ -3241,16 +3688,16 @@ } }, "markdown-it-anchor": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz", - "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==", + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "dev": true, "requires": {} }, "marked": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", - "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true }, "mdurl": { @@ -3269,13 +3716,10 @@ } }, "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true }, "minipass-collect": { "version": "1.0.2", @@ -3284,18 +3728,37 @@ "dev": true, "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "requires": { "encoding": "^0.1.13", - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } } }, "minipass-flush": { @@ -3305,6 +3768,17 @@ "dev": true, "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-pipeline": { @@ -3314,6 +3788,17 @@ "dev": true, "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-sized": { @@ -3323,6 +3808,17 @@ "dev": true, "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minizlib": { @@ -3333,6 +3829,17 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "mkdirp": { @@ -3420,25 +3927,19 @@ } } } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true } } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" }, "nanoid": { "version": "3.3.3", @@ -3453,15 +3954,16 @@ "dev": true }, "node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dev": true, "requires": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -3545,18 +4047,36 @@ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true + } + } + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, "promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -3604,12 +4124,12 @@ "dev": true }, "requizzle": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", - "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", "dev": true, "requires": { - "lodash": "^4.17.14" + "lodash": "^4.17.21" } }, "retry": { @@ -3641,9 +4161,9 @@ "optional": true }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -3675,6 +4195,21 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -3709,12 +4244,20 @@ } }, "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, "requires": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + } } }, "string_decoder": { @@ -3734,6 +4277,17 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -3743,6 +4297,15 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3765,26 +4328,37 @@ "dev": true }, "tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "dependencies": { - "minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "requires": { - "yallist": "^4.0.0" + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } } } @@ -3817,18 +4391,18 @@ "dev": true }, "unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, "requires": { - "unique-slug": "^3.0.0" + "unique-slug": "^4.0.0" } }, "unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -3875,6 +4449,17 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index f723a5d7..2a46024d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "node-rdkafka", "version": "v2.17.0", "description": "Node.js bindings for librdkafka", - "librdkafka": "2.2.0", + "librdkafka": "2.3.0", "main": "lib/index.js", "scripts": { "configure": "node-gyp configure", @@ -45,4 +45,4 @@ "engines": { "node": ">=6.0.0" } -} \ No newline at end of file +} From 0b5987aeecbea413334d7b7ad04b90a10eb006c8 Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Thu, 26 Oct 2023 11:07:28 -0700 Subject: [PATCH 08/35] Version 2.18.0 (#1048) --- .github/workflows/test.yml | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7f6b419a..3a531a38 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,15 +10,15 @@ jobs: build: strategy: matrix: - node: [10, 12, 14, 16, 18, 19] + node: [10, 12, 14, 16, 18, 20] os: [ubuntu-22.04] include: # single mac test due to minute multipliers # https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions - - node: 18 + - node: 20 os: macos-12 # single windows test due to node.js 14 node-gyp / vs 2022 issues - - node: 18 + - node: 20 os: windows-2022 runs-on: ${{ matrix.os }} steps: diff --git a/package.json b/package.json index 2a46024d..32dd9c3c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rdkafka", - "version": "v2.17.0", + "version": "v2.18.0", "description": "Node.js bindings for librdkafka", "librdkafka": "2.3.0", "main": "lib/index.js", From 364eb161ca73720ae9c05b22b0efadcb74b2d530 Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Tue, 16 Apr 2024 09:28:52 -0700 Subject: [PATCH 09/35] Drop support for end-of-life node versions (#1049) --- .github/workflows/npm-publish.yml | 2 +- .github/workflows/test.yml | 4 +- CONTRIBUTING.md | 2 +- README.md | 2 +- package-lock.json | 2680 ++++------------------------- package.json | 12 +- 6 files changed, 314 insertions(+), 2388 deletions(-) diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 206ae618..c8950783 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -16,7 +16,7 @@ jobs: submodules: recursive - uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 registry-url: https://registry.npmjs.org/ cache: "npm" - run: npm ci diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3a531a38..7a5534f2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,7 @@ jobs: build: strategy: matrix: - node: [10, 12, 14, 16, 18, 20] + node: [16, 18, 20, 21] os: [ubuntu-22.04] include: # single mac test due to minute multipliers @@ -39,5 +39,5 @@ jobs: run: npm ci # skipping on windows for now due to Make / mocha exit code issues - name: Test - if: runner.os != 'Windows' && matrix.node != 10 + if: runner.os != 'Windows' run: npm test diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index db025fe0..b40d275c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -215,7 +215,7 @@ Steps to update: ``` Note: This is ran automatically during CI flows but it's good to run it during the version upgrade pull request. -1. Run `npm install --lockfile-version 2` to build with the new version and fix any build errors that occur. +1. Run `npm install` to build with the new version and fix any build errors that occur. 1. Run unit tests: `npm run test` diff --git a/README.md b/README.md index 8408e943..a3bc952a 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Play nice; Play fair. ## Requirements * Apache Kafka >=0.9 -* Node.js >=4 +* Node.js >=16 * Linux/Mac * Windows?! See below * OpenSSL diff --git a/package-lock.json b/package-lock.json index 9a432ac7..a67e6cab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,34 +1,34 @@ { "name": "node-rdkafka", - "version": "v2.17.0", - "lockfileVersion": 2, + "version": "v3.0.0", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v2.17.0", + "version": "v3.0.0", "hasInstallScript": true, "license": "MIT", "dependencies": { "bindings": "^1.3.1", - "nan": "^2.17.0" + "nan": "^2.19.0" }, "devDependencies": { "bluebird": "^3.5.3", - "jsdoc": "^3.4.0", + "jsdoc": "^4.0.2", "jshint": "^2.10.1", "mocha": "^10.2.0", - "node-gyp": "^9.3.1", + "node-gyp": "^10.1.0", "toolkit-jsdoc": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=16" } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -133,6 +133,34 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@jsdoc/salty": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", + "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@npmcli/fs": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", @@ -155,19 +183,10 @@ "node": ">=14" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/@types/linkify-it": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", - "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", "dev": true }, "node_modules/@types/markdown-it": { @@ -181,39 +200,30 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", - "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", "dev": true }, "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { - "humanize-ms": "^1.2.1" + "debug": "^4.3.4" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 14" } }, "node_modules/aggregate-error": { @@ -275,48 +285,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/are-we-there-yet/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -381,17 +349,17 @@ "dev": true }, "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", + "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", - "lru-cache": "^7.7.1", + "lru-cache": "^10.0.1", "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", @@ -400,7 +368,7 @@ "unique-filename": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/cacache/node_modules/brace-expansion": { @@ -413,16 +381,16 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -435,9 +403,9 @@ } }, "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -449,15 +417,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -597,15 +556,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -621,12 +571,6 @@ "date-now": "^0.1.4" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -647,6 +591,27 @@ "node": ">= 8" } }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -670,12 +635,6 @@ } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -688,12 +647,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -893,18 +846,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -917,54 +858,12 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1019,9 +918,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "node_modules/has-flag": { @@ -1033,12 +932,6 @@ "node": ">=8" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1068,39 +961,29 @@ "dev": true }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" + "node": ">= 14" } }, "node_modules/iconv-lite": { @@ -1150,11 +1033,18 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -1241,10 +1131,13 @@ "dev": true }, "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } }, "node_modules/jackspeak": { "version": "2.3.6", @@ -1285,13 +1178,20 @@ "xmlcreate": "^2.0.4" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "node_modules/jsdoc": { - "version": "3.6.11", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz", - "integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", + "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", "dev": true, "dependencies": { - "@babel/parser": "^7.9.4", + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", "@types/markdown-it": "^12.2.3", "bluebird": "^3.7.2", "catharsis": "^0.9.0", @@ -1304,7 +1204,6 @@ "mkdirp": "^1.0.4", "requizzle": "^0.2.3", "strip-json-comments": "^3.1.0", - "taffydb": "2.6.2", "underscore": "~1.13.2" }, "bin": { @@ -1315,9 +1214,9 @@ } }, "node_modules/jshint": { - "version": "2.13.6", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", - "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz", + "integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==", "dev": true, "dependencies": { "cli": "~1.0.0", @@ -1400,38 +1299,34 @@ } }, "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { - "node": ">=12" + "node": "14 || >=16.14" } }, "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", "dev": true, "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", + "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", "ssri": "^10.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/markdown-it": { @@ -1451,9 +1346,9 @@ } }, "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "version": "8.6.5", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz", + "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==", "dev": true, "peerDependencies": { "@types/markdown-it": "*", @@ -1470,9 +1365,9 @@ } }, "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", + "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -1500,36 +1395,24 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-fetch": { @@ -1549,15 +1432,6 @@ "encoding": "^0.1.13" } }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -1772,16 +1646,22 @@ "balanced-match": "^1.0.0" } }, - "node_modules/ms": { + "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==" }, "node_modules/nanoid": { "version": "3.3.3", @@ -1805,43 +1685,88 @@ } }, "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", + "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", "dev": true, "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", + "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", "tar": "^6.1.2", - "which": "^2.0.2" + "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.13 || ^14.13 || >=16" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-path": { @@ -1853,21 +1778,6 @@ "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1950,12 +1860,12 @@ } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -1965,19 +1875,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -1986,6 +1887,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -2042,12 +1952,12 @@ } }, "node_modules/requizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", + "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", "dev": true, "dependencies": { - "lodash": "^4.17.21" + "lodash": "^4.17.14" } }, "node_modules/retry": { @@ -2059,21 +1969,6 @@ "node": ">= 4" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2102,9 +1997,9 @@ "optional": true }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2137,12 +2032,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2165,10 +2054,16 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/smart-buffer": { "version": "4.2.0", @@ -2181,33 +2076,39 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", "dev": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" }, "engines": { - "node": ">= 10" + "node": ">= 14" } }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "node_modules/ssri": { "version": "10.0.5", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", @@ -2220,15 +2121,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -2316,16 +2208,10 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/taffydb": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==", - "dev": true - }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -2363,6 +2249,15 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2417,34 +2312,19 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { - "node-which": "bin/node-which" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/workerpool": { @@ -2569,1959 +2449,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@types/linkify-it": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", - "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", - "dev": true - }, - "@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", - "dev": true, - "requires": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "@types/mdurl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", - "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } - } - }, - "fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "requires": { - "minipass": "^7.0.3" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "dev": true, - "requires": { - "xmlcreate": "^2.0.4" - } - }, - "jsdoc": { - "version": "3.6.11", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz", - "integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==", - "dev": true, - "requires": { - "@babel/parser": "^7.9.4", - "@types/markdown-it": "^12.2.3", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "taffydb": "2.6.2", - "underscore": "~1.13.2" - } - }, - "jshint": { - "version": "2.13.6", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", - "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.21", - "minimatch": "~3.0.2", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", - "dev": true - } - } - }, - "klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, - "requires": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true - } - } - }, - "markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "dev": true, - "requires": {} - }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, - "minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - } - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - } - }, - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true - } - } - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "requizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "requires": { - "minipass": "^7.0.3" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "taffydb": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==", - "dev": true - }, - "tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - } - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toolkit-jsdoc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toolkit-jsdoc/-/toolkit-jsdoc-1.0.0.tgz", - "integrity": "sha512-57bpRaZgZ8M2FUblW3OJVWDfbING/rBvCda/mxXEth6fCp3M1m6/tX+pvXSJyqq24tVzdTYaGM+ZduPlwcDFHw==", - "dev": true - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "dev": true - }, - "unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/package.json b/package.json index 32dd9c3c..e81866ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rdkafka", - "version": "v2.18.0", + "version": "v3.0.0", "description": "Node.js bindings for librdkafka", "librdkafka": "2.3.0", "main": "lib/index.js", @@ -32,17 +32,17 @@ "license": "MIT", "devDependencies": { "bluebird": "^3.5.3", - "jsdoc": "^3.4.0", + "jsdoc": "^4.0.2", "jshint": "^2.10.1", "mocha": "^10.2.0", - "node-gyp": "^9.3.1", + "node-gyp": "^10.1.0", "toolkit-jsdoc": "^1.0.0" }, "dependencies": { "bindings": "^1.3.1", - "nan": "^2.17.0" + "nan": "^2.19.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=16" } -} +} \ No newline at end of file From d20356f6389331c81fa04a2e80a9fd2e8281f9e1 Mon Sep 17 00:00:00 2001 From: Martijn Imhoff Date: Wed, 17 Apr 2024 00:22:20 +0200 Subject: [PATCH 10/35] docs: simplify contributing by adding instructions (#1071) --- .gitignore | 1 + CONTRIBUTING.md | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/.gitignore b/.gitignore index 1b6d3a6a..ee3eed8a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ deps/* .DS_Store .vscode +.idea diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b40d275c..9c916206 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,6 +13,7 @@ so if you feel something is missing feel free to send a pull request. * [Contributor Agreement](#contributor-agreement) [How Can I Contribute?](#how-can-i-contribute) + * [Setting up the repository](#setting-up-the-repository) * [Reporting Bugs](#reporting-bugs) * [Suggesting Enhancements](#suggesting-enhancements) * [Pull Requests](#pull-requests) @@ -37,6 +38,14 @@ Not currently required. ## How can I contribute? +### Setting up the repository + +To set up the library locally, do the following: + +1) Clone this repository. +2) Install librdkafka with `git submodule update --init --recursive` +3) Install the dependencies `npm install` + ### Reporting Bugs Please use __Github Issues__ to report bugs. When filling out an issue report, From a0648d38c6d4c13b4795ac344aef10d9dd8c65fd Mon Sep 17 00:00:00 2001 From: Martijn Imhoff Date: Wed, 17 Apr 2024 00:23:31 +0200 Subject: [PATCH 11/35] docs: add missing rebalance event to consumer events (#1070) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a3bc952a..b4748c5d 100644 --- a/README.md +++ b/README.md @@ -511,6 +511,7 @@ The following table lists events for this API. |`data` | When using the Standard API consumed messages are emitted in this event. | |`partition.eof` | When using Standard API and the configuration option `enable.partition.eof` is set, `partition.eof` events are emitted in this event. The event contains `topic`, `partition` and `offset` properties. | |`warning` | The event is emitted in case of `UNKNOWN_TOPIC_OR_PART` or `TOPIC_AUTHORIZATION_FAILED` errors when consuming in *Flowing mode*. Since the consumer will continue working if the error is still happening, the warning event should reappear after the next metadata refresh. To control the metadata refresh rate set `topic.metadata.refresh.interval.ms` property. Once you resolve the error, you can manually call `getMetadata` to speed up consumer recovery. | +|`rebalance` | The `rebalance` event is emitted when the consumer group is rebalanced.

This event is only emitted if the `rebalance_cb` configuration is set to a function or set to `true` | |`disconnected` | The `disconnected` event is emitted when the broker disconnects.

This event is only emitted when `.disconnect` is called. The wrapper will always try to reconnect otherwise. | |`ready` | The `ready` event is emitted when the `Consumer` is ready to read messages. | |`event` | The `event` event is emitted when `librdkafka` reports an event (if you opted in via the `event_cb` option).| From f594d1138b0435a0e73dd563828faa6dcad39bc3 Mon Sep 17 00:00:00 2001 From: Andrew Stanovsky <102566879+andrewstanovsky@users.noreply.github.com> Date: Thu, 18 Apr 2024 09:12:57 -0700 Subject: [PATCH 12/35] Add setToken API for OAuthBearer authentication flow (#1075) --- examples/oauthbearer-default-flow.md | 80 ++++++++++++++ index.d.ts | 8 +- lib/admin.js | 22 +++- lib/client.js | 19 ++++ lib/kafka-consumer-stream.js | 16 +++ package-lock.json | 159 ++++++++++++--------------- package.json | 4 +- src/admin.cc | 19 ++++ src/connection.cc | 40 +++++++ src/connection.h | 11 +- src/kafka-consumer.cc | 19 ++++ src/producer.cc | 20 ++++ test/binding.spec.js | 2 +- test/consumer.spec.js | 2 +- 14 files changed, 328 insertions(+), 93 deletions(-) create mode 100644 examples/oauthbearer-default-flow.md diff --git a/examples/oauthbearer-default-flow.md b/examples/oauthbearer-default-flow.md new file mode 100644 index 00000000..06cb9aab --- /dev/null +++ b/examples/oauthbearer-default-flow.md @@ -0,0 +1,80 @@ +Producer, Consumer and HighLevelProducer: +```js +/* + * node-rdkafka - Node.js wrapper for RdKafka C/C++ library + * + * Copyright (c) 2016 Blizzard Entertainment + * + * This software may be modified and distributed under the terms + * of the MIT license. See the LICENSE.txt file for details. + */ + +var Kafka = require('../'); + +var token = "your_token"; + +var producer = new Kafka.Producer({ + //'debug' : 'all', + 'metadata.broker.list': 'localhost:9093', + 'security.protocol': 'SASL_SSL', + 'sasl.mechanisms': 'OAUTHBEARER', +}).setOauthBearerToken(token); + +//start the producer +producer.connect(); + +//refresh the token +producer.setOauthBearerToken(token); +``` + +AdminClient: +```js +/* + * node-rdkafka - Node.js wrapper for RdKafka C/C++ library + * + * Copyright (c) 2016 Blizzard Entertainment + * + * This software may be modified and distributed under the terms + * of the MIT license. See the LICENSE.txt file for details. + */ +var Kafka = require('../'); + +var token = "your_token"; + +var admin = Kafka.AdminClient.create({ + 'metadata.broker.list': 'localhost:9093', + 'security.protocol': 'SASL_SSL', + 'sasl.mechanisms': 'OAUTHBEARER', +}, token); + +//refresh the token +admin.refreshOauthBearerToken(token); +``` + +ConsumerStream: +```js +/* + * node-rdkafka - Node.js wrapper for RdKafka C/C++ library + * + * Copyright (c) 2016 Blizzard Entertainment + * + * This software may be modified and distributed under the terms + * of the MIT license. See the LICENSE.txt file for details. + */ +var Kafka = require('../'); + +var token = "your_token"; + +var stream = Kafka.KafkaConsumer.createReadStream({ + 'metadata.broker.list': 'localhost:9093', + 'group.id': 'myGroup', + 'security.protocol': 'SASL_SSL', + 'sasl.mechanisms': 'OAUTHBEARER' + }, {}, { + topics: 'test1', + initOauthBearerToken: token, + }); + +//refresh the token +stream.refreshOauthBearerToken(token.token); +``` diff --git a/index.d.ts b/index.d.ts index d7ce7e61..4cd46ec1 100644 --- a/index.d.ts +++ b/index.d.ts @@ -117,6 +117,7 @@ export interface ReadStreamOptions extends ReadableOptions { autoClose?: boolean; streamAsBatch?: boolean; connectOptions?: any; + initOauthBearerToken?: string; } export interface WriteStreamOptions extends WritableOptions { @@ -137,6 +138,7 @@ export interface ProducerStream extends Writable { export interface ConsumerStream extends Readable { consumer: KafkaConsumer; connect(options: ConsumerGlobalConfig): void; + refreshOauthBearerToken(tokenStr: string): void; close(cb?: () => void): void; } @@ -180,6 +182,8 @@ export abstract class Client extends EventEmitter { connect(metadataOptions?: MetadataOptions, cb?: (err: LibrdKafkaError, data: Metadata) => any): this; + setOauthBearerToken(tokenStr: string): this; + getClient(): any; connectedTime(): number; @@ -330,6 +334,8 @@ export interface NewTopic { } export interface IAdminClient { + refreshOauthBearerToken(tokenStr: string): void; + createTopic(topic: NewTopic, cb?: (err: LibrdKafkaError) => void): void; createTopic(topic: NewTopic, timeout?: number, cb?: (err: LibrdKafkaError) => void): void; @@ -343,5 +349,5 @@ export interface IAdminClient { } export abstract class AdminClient { - static create(conf: GlobalConfig): IAdminClient; + static create(conf: GlobalConfig, initOauthBearerToken?: string): IAdminClient; } diff --git a/lib/admin.js b/lib/admin.js index 773dc957..bbe06084 100644 --- a/lib/admin.js +++ b/lib/admin.js @@ -25,9 +25,13 @@ var shallowCopy = require('./util').shallowCopy; * active handle with the brokers. * */ -function createAdminClient(conf) { +function createAdminClient(conf, initOauthBearerToken) { var client = new AdminClient(conf); + if (initOauthBearerToken) { + client.refreshOauthBearerToken(initOauthBearerToken); + } + // Wrap the error so we throw if it failed with some context LibrdKafkaError.wrap(client.connect(), true); @@ -105,6 +109,22 @@ AdminClient.prototype.disconnect = function() { this._isConnected = false; }; +/** + * Refresh OAuthBearer token, initially provided in factory method. + * Expiry is always set to maximum value, as the callback of librdkafka + * for token refresh is not used. + * + * @param {string} tokenStr - OAuthBearer token string + * @see connection.cc + */ +AdminClient.prototype.refreshOauthBearerToken = function (tokenStr) { + if (!tokenStr || typeof tokenStr !== 'string') { + throw new Error("OAuthBearer token is undefined/empty or not a string"); + } + + this._client.setToken(tokenStr); +}; + /** * Create a topic with a given config. * diff --git a/lib/client.js b/lib/client.js index 9cbd3f9a..354f5446 100644 --- a/lib/client.js +++ b/lib/client.js @@ -229,6 +229,25 @@ Client.prototype.connect = function(metadataOptions, cb) { }; +/** + * Set initial token before any connection is established for oauthbearer authentication flow. + * Expiry is always set to maximum value, as the callback of librdkafka + * for token refresh is not used. + * Call this method again to refresh the token. + * + * @param {string} tokenStr - OAuthBearer token string + * @see connection.cc + * @return {Client} - Returns itself. + */ +Client.prototype.setOauthBearerToken = function (tokenStr) { + if (!tokenStr || typeof tokenStr !== 'string') { + throw new Error("OAuthBearer token is undefined/empty or not a string"); + } + + this._client.setToken(tokenStr); + return this; +}; + /** * Get the native Kafka client. * diff --git a/lib/kafka-consumer-stream.js b/lib/kafka-consumer-stream.js index 0abb5358..ce1fbe95 100644 --- a/lib/kafka-consumer-stream.js +++ b/lib/kafka-consumer-stream.js @@ -112,6 +112,10 @@ function KafkaConsumerStream(consumer, options) { self.push(null); }); + if (options.initOauthBearerToken) { + this.consumer.setOauthBearerToken(options.initOauthBearerToken); + } + // Call connect. Handles potentially being connected already this.connect(this.connectOptions); @@ -123,6 +127,18 @@ function KafkaConsumerStream(consumer, options) { } +/** + * Refresh OAuthBearer token, initially provided in factory method. + * Expiry is always set to maximum value, as the callback of librdkafka + * for token refresh is not used. + * + * @param {string} tokenStr - OAuthBearer token string + * @see connection.cc + */ +KafkaConsumerStream.prototype.refreshOauthBearerToken = function (tokenStr) { + this.consumer.setOauthBearerToken(tokenStr); +}; + /** * Internal stream read method. This method reads message objects. * @param {number} size - This parameter is ignored for our cases. diff --git a/package-lock.json b/package-lock.json index a67e6cab..74b5ad03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v3.0.0", + "version": "v3.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v3.0.0", + "version": "v3.0.1", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -184,9 +184,9 @@ } }, "node_modules/@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", "dev": true }, "node_modules/@types/markdown-it": { @@ -200,9 +200,9 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", "dev": true }, "node_modules/abbrev": { @@ -298,12 +298,15 @@ "dev": true }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bindings": { @@ -635,6 +638,12 @@ } } }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -756,9 +765,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -864,6 +873,20 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -918,9 +941,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/has-flag": { @@ -1214,9 +1237,9 @@ } }, "node_modules/jshint": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.5.tgz", - "integrity": "sha512-dB2n1w3OaQ35PLcBGIWXlszjbPZwsgZoxsg6G8PtNf2cFMC1l0fObkYLUuXqTTdi6tKw4sAjfUseTdmDMHQRcg==", + "version": "2.13.6", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", + "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", "dev": true, "dependencies": { "cli": "~1.0.0", @@ -1346,9 +1369,9 @@ } }, "node_modules/markdown-it-anchor": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz", - "integrity": "sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==", + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", "dev": true, "peerDependencies": { "@types/markdown-it": "*", @@ -1365,9 +1388,9 @@ } }, "node_modules/marked": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", - "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, "bin": { "marked": "bin/marked.js" @@ -1542,9 +1565,9 @@ } }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", "dev": true, "dependencies": { "ansi-colors": "4.1.1", @@ -1554,13 +1577,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -1575,10 +1597,15 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/mocha/node_modules/escape-string-regexp": { @@ -1594,37 +1621,24 @@ } }, "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", @@ -1637,44 +1651,17 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/ms": { + "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/nan": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==" }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -1952,12 +1939,12 @@ } }, "node_modules/requizzle": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", - "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", "dev": true, "dependencies": { - "lodash": "^4.17.14" + "lodash": "^4.17.21" } }, "node_modules/retry": { diff --git a/package.json b/package.json index e81866ea..080a69ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rdkafka", - "version": "v3.0.0", + "version": "v3.0.1", "description": "Node.js bindings for librdkafka", "librdkafka": "2.3.0", "main": "lib/index.js", @@ -45,4 +45,4 @@ "engines": { "node": ">=16" } -} \ No newline at end of file +} diff --git a/src/admin.cc b/src/admin.cc index 1453ad35..b5c7c8f0 100644 --- a/src/admin.cc +++ b/src/admin.cc @@ -49,6 +49,24 @@ Baton AdminClient::Connect() { return Baton(RdKafka::ERR__STATE, errstr); } + if (m_init_oauthToken) { + scoped_shared_write_lock lock(m_connection_lock); + if (m_init_oauthToken) { + std::list emptyList; + std::string token = m_init_oauthToken->token; + int64_t expiry = m_init_oauthToken->expiry; + // needed for initial connection only + m_init_oauthToken.reset(); + + RdKafka::ErrorCode err = m_client->oauthbearer_set_token(token, expiry, + "", emptyList, errstr); + + if (err != RdKafka::ERR_NO_ERROR) { + return Baton(err, errstr); + } + } + } + if (rkqu == NULL) { rkqu = rd_kafka_queue_new(m_client->c_ptr()); } @@ -88,6 +106,7 @@ void AdminClient::Init(v8::Local exports) { Nan::SetPrototypeMethod(tpl, "connect", NodeConnect); Nan::SetPrototypeMethod(tpl, "disconnect", NodeDisconnect); + Nan::SetPrototypeMethod(tpl, "setToken", NodeSetToken); constructor.Reset( (tpl->GetFunction(Nan::GetCurrentContext())).ToLocalChecked()); diff --git a/src/connection.cc b/src/connection.cc index 9de3b3c1..cfb8ba23 100644 --- a/src/connection.cc +++ b/src/connection.cc @@ -7,6 +7,7 @@ * of the MIT license. See the LICENSE.txt file for details. */ +#include #include #include @@ -226,6 +227,45 @@ void Connection::ConfigureCallback(const std::string &string_key, const v8::Loca } // NAN METHODS +NAN_METHOD(Connection::NodeSetToken) +{ + if (info.Length() < 1 || !info[0]->IsString()) { + Nan::ThrowError("Token argument must be a string"); + return; + } + + Nan::Utf8String tk(info[0]); + std::string token = *tk; + // we always set expiry to maximum value in ms, as we don't use refresh callback, + // rdkafka continues sending a token even if it expired. Client code must + // handle token refreshing by calling 'setToken' again when needed. + int64_t expiry = (std::numeric_limits::max)() / 100000; + Connection* obj = ObjectWrap::Unwrap(info.This()); + RdKafka::Handle* handle = obj->m_client; + + if (!handle) { + scoped_shared_write_lock lock(obj->m_connection_lock); + obj->m_init_oauthToken = std::make_unique( + OauthBearerToken{token, expiry}); + info.GetReturnValue().Set(Nan::Null()); + return; + } + + { + scoped_shared_write_lock lock(obj->m_connection_lock); + std::string errstr; + std::list emptyList; + RdKafka::ErrorCode err = handle->oauthbearer_set_token(token, expiry, + "", emptyList, errstr); + + if (err != RdKafka::ERR_NO_ERROR) { + Nan::ThrowError(errstr.c_str()); + return; + } + } + + info.GetReturnValue().Set(Nan::Null()); +} NAN_METHOD(Connection::NodeGetMetadata) { Nan::HandleScope scope; diff --git a/src/connection.h b/src/connection.h index 8c4ac73f..8ee3f052 100644 --- a/src/connection.h +++ b/src/connection.h @@ -45,7 +45,13 @@ namespace NodeKafka { */ class Connection : public Nan::ObjectWrap { - public: + struct OauthBearerToken + { + std::string token; + int64_t expiry; + }; + +public: bool IsConnected(); bool IsClosing(); @@ -82,10 +88,13 @@ class Connection : public Nan::ObjectWrap { Conf* m_tconfig; std::string m_errstr; + std::unique_ptr m_init_oauthToken; + uv_rwlock_t m_connection_lock; RdKafka::Handle* m_client; + static NAN_METHOD(NodeSetToken); static NAN_METHOD(NodeConfigureCallbacks); static NAN_METHOD(NodeGetMetadata); static NAN_METHOD(NodeQueryWatermarkOffsets); diff --git a/src/kafka-consumer.cc b/src/kafka-consumer.cc index 019b0cb6..0f5e32ed 100644 --- a/src/kafka-consumer.cc +++ b/src/kafka-consumer.cc @@ -56,6 +56,24 @@ Baton KafkaConsumer::Connect() { return Baton(RdKafka::ERR__STATE, errstr); } + if (m_init_oauthToken) { + scoped_shared_write_lock lock(m_connection_lock); + if (m_init_oauthToken) { + std::list emptyList; + std::string token = m_init_oauthToken->token; + int64_t expiry = m_init_oauthToken->expiry; + // needed for initial connection only + m_init_oauthToken.reset(); + + RdKafka::ErrorCode err = m_client->oauthbearer_set_token(token, expiry, + "", emptyList, errstr); + + if (err != RdKafka::ERR_NO_ERROR) { + return Baton(err, errstr); + } + } + } + if (m_partitions.size() > 0) { m_client->resume(m_partitions); } @@ -499,6 +517,7 @@ void KafkaConsumer::Init(v8::Local exports) { Nan::SetPrototypeMethod(tpl, "connect", NodeConnect); Nan::SetPrototypeMethod(tpl, "disconnect", NodeDisconnect); + Nan::SetPrototypeMethod(tpl, "setToken", NodeSetToken); Nan::SetPrototypeMethod(tpl, "getMetadata", NodeGetMetadata); Nan::SetPrototypeMethod(tpl, "queryWatermarkOffsets", NodeQueryWatermarkOffsets); // NOLINT Nan::SetPrototypeMethod(tpl, "offsetsForTimes", NodeOffsetsForTimes); diff --git a/src/producer.cc b/src/producer.cc index 04e75688..c8e3e632 100644 --- a/src/producer.cc +++ b/src/producer.cc @@ -66,6 +66,7 @@ void Producer::Init(v8::Local exports) { Nan::SetPrototypeMethod(tpl, "connect", NodeConnect); Nan::SetPrototypeMethod(tpl, "disconnect", NodeDisconnect); + Nan::SetPrototypeMethod(tpl, "setToken", NodeSetToken); Nan::SetPrototypeMethod(tpl, "getMetadata", NodeGetMetadata); Nan::SetPrototypeMethod(tpl, "queryWatermarkOffsets", NodeQueryWatermarkOffsets); // NOLINT Nan::SetPrototypeMethod(tpl, "poll", NodePoll); @@ -183,6 +184,25 @@ Baton Producer::Connect() { return Baton(RdKafka::ERR__STATE, errstr); } + if (m_init_oauthToken) { + scoped_shared_write_lock lock(m_connection_lock); + if (m_init_oauthToken) { + std::list emptyList; + std::string token = m_init_oauthToken->token; + int64_t expiry = m_init_oauthToken->expiry; + // needed for initial connection only + m_init_oauthToken.reset(); + + RdKafka::ErrorCode err = m_client->oauthbearer_set_token(token, expiry, + "", emptyList, errstr); + + if (err != RdKafka::ERR_NO_ERROR) { + return Baton(err, errstr); + } + } + } + + return Baton(RdKafka::ERR_NO_ERROR); } diff --git a/test/binding.spec.js b/test/binding.spec.js index b82c7bc4..117fde1b 100644 --- a/test/binding.spec.js +++ b/test/binding.spec.js @@ -56,7 +56,7 @@ module.exports = { }); }, 'has necessary methods from superclass': function() { - var methods = ['connect', 'disconnect', 'configureCallbacks', 'getMetadata']; + var methods = ['connect', 'disconnect', 'setToken', 'configureCallbacks', 'getMetadata']; methods.forEach(function(m) { t.equal(typeof(client[m]), 'function', 'Client is missing ' + m + ' method'); }); diff --git a/test/consumer.spec.js b/test/consumer.spec.js index 40b52ee4..4fc3bd53 100644 --- a/test/consumer.spec.js +++ b/test/consumer.spec.js @@ -71,7 +71,7 @@ module.exports = { }); }, 'has necessary methods from superclass': function() { - var methods = ['connect', 'disconnect', 'configureCallbacks', 'getMetadata']; + var methods = ['connect', 'disconnect', 'setToken', 'configureCallbacks', 'getMetadata']; methods.forEach(function(m) { t.equal(typeof(client[m]), 'function', 'Client is missing ' + m + ' method'); }); From 020db59aacb80b18fdbe1817032a5045dbccc740 Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:22:30 -0700 Subject: [PATCH 13/35] Update to librdkafka 2.5.0 (#1086) --- README.md | 10 ++++----- config.d.ts | 53 ++++++++++++++++++++++++++++++++--------------- deps/librdkafka | 2 +- errors.d.ts | 4 +++- lib/error.js | 4 +++- package-lock.json | 4 ++-- package.json | 6 +++--- 7 files changed, 53 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index b4748c5d..5e3a15f9 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ I am looking for *your* help to make this project even better! If you're interes The `node-rdkafka` library is a high-performance NodeJS client for [Apache Kafka](http://kafka.apache.org/) that wraps the native [librdkafka](https://github.com/edenhill/librdkafka) library. All the complexity of balancing writes across partitions and managing (possibly ever-changing) brokers should be encapsulated in the library. -__This library currently uses `librdkafka` version `2.3.0`.__ +__This library currently uses `librdkafka` version `2.5.0`.__ ## Reference Docs @@ -60,7 +60,7 @@ Using Alpine Linux? Check out the [docs](https://github.com/Blizzard/node-rdkafk ### Windows -Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.3.0.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. +Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.5.0.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. Requirements: * [node-gyp for Windows](https://github.com/nodejs/node-gyp#on-windows) @@ -97,7 +97,7 @@ const Kafka = require('node-rdkafka'); ## Configuration -You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.3.0/CONFIGURATION.md) +You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.5.0/CONFIGURATION.md) Configuration keys that have the suffix `_cb` are designated as callbacks. Some of these keys are informational and you can choose to opt-in (for example, `dr_cb`). Others are callbacks designed to @@ -132,7 +132,7 @@ You can also get the version of `librdkafka` const Kafka = require('node-rdkafka'); console.log(Kafka.librdkafkaVersion); -// #=> 2.3.0 +// #=> 2.5.0 ``` ## Sending Messages @@ -145,7 +145,7 @@ const producer = new Kafka.Producer({ }); ``` -A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.3.0/CONFIGURATION.md) file described previously. +A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.5.0/CONFIGURATION.md) file described previously. The following example illustrates a list with several `librdkafka` options set. diff --git a/config.d.ts b/config.d.ts index e78a4141..09c69ede 100644 --- a/config.d.ts +++ b/config.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.3.0 file CONFIGURATION.md ====== +// ====== Generated from librdkafka 2.5.0 file CONFIGURATION.md ====== // Code that generated this is a derivative work of the code from Nam Nguyen // https://gist.github.com/ntgn81/066c2c8ec5b4238f85d1e9168a04e3fb @@ -620,12 +620,33 @@ export interface GlobalConfig { "client.rack"?: string; /** - * Controls how the client uses DNS lookups. By default, when the lookup returns multiple IP addresses for a hostname, they will all be attempted for connection before the connection is considered failed. This applies to both bootstrap and advertised servers. If the value is set to `resolve_canonical_bootstrap_servers_only`, each entry will be resolved and expanded into a list of canonical names. NOTE: Default here is different from the Java client's default behavior, which connects only to the first IP address returned for a hostname. + * The backoff time in milliseconds before retrying a protocol request, this is the first backoff time, and will be backed off exponentially until number of retries is exhausted, and it's capped by retry.backoff.max.ms. + * + * @default 100 + */ + "retry.backoff.ms"?: number; + + /** + * The max backoff time in milliseconds before retrying a protocol request, this is the atmost backoff allowed for exponentially backed off requests. + * + * @default 1000 + */ + "retry.backoff.max.ms"?: number; + + /** + * Controls how the client uses DNS lookups. By default, when the lookup returns multiple IP addresses for a hostname, they will all be attempted for connection before the connection is considered failed. This applies to both bootstrap and advertised servers. If the value is set to `resolve_canonical_bootstrap_servers_only`, each entry will be resolved and expanded into a list of canonical names. **WARNING**: `resolve_canonical_bootstrap_servers_only` must only be used with `GSSAPI` (Kerberos) as `sasl.mechanism`, as it's the only purpose of this configuration value. **NOTE**: Default here is different from the Java client's default behavior, which connects only to the first IP address returned for a hostname. * * @default use_all_dns_ips */ "client.dns.lookup"?: 'use_all_dns_ips' | 'resolve_canonical_bootstrap_servers_only'; + /** + * Whether to enable pushing of client metrics to the cluster, if the cluster has a client metrics subscription which matches this client + * + * @default true + */ + "enable.metrics.push"?: boolean; + /** * Enables or disables `event.*` emitting. * @@ -703,20 +724,6 @@ export interface ProducerGlobalConfig extends GlobalConfig { */ "retries"?: number; - /** - * The backoff time in milliseconds before retrying a protocol request, this is the first backoff time, and will be backed off exponentially until number of retries is exhausted, and it's capped by retry.backoff.max.ms. - * - * @default 100 - */ - "retry.backoff.ms"?: number; - - /** - * The max backoff time in milliseconds before retrying a protocol request, this is the atmost backoff allowed for exponentially backed off requests. - * - * @default 1000 - */ - "retry.backoff.max.ms"?: number; - /** * The threshold of outstanding not yet transmitted broker requests needed to backpressure the producer's message accumulator. If the number of not yet transmitted requests equals or exceeds this number, produce request creation that would have otherwise been triggered (for example, in accordance with linger.ms) will be delayed. A lower number yields larger and more effective batches. A higher value can improve latency when using compression on slow machines. * @@ -810,12 +817,24 @@ export interface ConsumerGlobalConfig extends GlobalConfig { "heartbeat.interval.ms"?: number; /** - * Group protocol type. NOTE: Currently, the only supported group protocol type is `consumer`. + * Group protocol type for the `classic` group protocol. NOTE: Currently, the only supported group protocol type is `consumer`. * * @default consumer */ "group.protocol.type"?: string; + /** + * Group protocol to use. Use `classic` for the original protocol and `consumer` for the new protocol introduced in KIP-848. Available protocols: classic or consumer. Default is `classic`, but will change to `consumer` in next releases. + * + * @default classic + */ + "group.protocol"?: 'classic' | 'consumer'; + + /** + * Server side assignor to use. Keep it null to make server select a suitable assignor for the group. Available assignors: uniform or range. Default is null + */ + "group.remote.assignor"?: string; + /** * How often to query for the current client group coordinator. If the currently assigned coordinator is down the configured query interval will be divided by ten to more quickly recover in case of coordinator reassignment. * diff --git a/deps/librdkafka b/deps/librdkafka index 95a542c8..6eaf89fb 160000 --- a/deps/librdkafka +++ b/deps/librdkafka @@ -1 +1 @@ -Subproject commit 95a542c87c61d2c45b445f91c73dd5442eb04f3c +Subproject commit 6eaf89fb124c421b66b43b195879d458a3a31f86 diff --git a/errors.d.ts b/errors.d.ts index 439ec72b..3f182d36 100644 --- a/errors.d.ts +++ b/errors.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.3.0 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.5.0 file src-cpp/rdkafkacpp.h ====== export const CODES: { ERRORS: { /* Internal errors to rdkafka: */ /** Begin internal error codes (**-200**) */ @@ -128,8 +128,10 @@ export const CODES: { ERRORS: { ERR__AUTO_OFFSET_RESET: number, /** Partition log truncation detected (**-139**) */ ERR__LOG_TRUNCATION: number, + /** End internal error codes (**-100**) */ ERR__END: number, + /* Kafka broker errors: */ /** Unknown broker error (**-1**) */ ERR_UNKNOWN: number, diff --git a/lib/error.js b/lib/error.js index 0f14e1e8..ba204896 100644 --- a/lib/error.js +++ b/lib/error.js @@ -27,7 +27,7 @@ LibrdKafkaError.wrap = errorWrap; * @enum {number} * @constant */ -// ====== Generated from librdkafka 2.3.0 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.5.0 file src-cpp/rdkafkacpp.h ====== LibrdKafkaError.codes = { /* Internal errors to rdkafka: */ @@ -158,8 +158,10 @@ LibrdKafkaError.codes = { ERR__AUTO_OFFSET_RESET: -140, /** Partition log truncation detected */ ERR__LOG_TRUNCATION: -139, + /** End internal error codes */ ERR__END: -100, + /* Kafka broker errors: */ /** Unknown broker error */ ERR_UNKNOWN: -1, diff --git a/package-lock.json b/package-lock.json index 74b5ad03..ab680e56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v3.0.1", + "version": "v3.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v3.0.1", + "version": "v3.1.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 080a69ce..54497902 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "node-rdkafka", - "version": "v3.0.1", + "version": "v3.1.0", "description": "Node.js bindings for librdkafka", - "librdkafka": "2.3.0", + "librdkafka": "2.5.0", "main": "lib/index.js", "scripts": { "configure": "node-gyp configure", @@ -45,4 +45,4 @@ "engines": { "node": ">=16" } -} +} \ No newline at end of file From eb73d5bc4ce051cfa5200d4475628eaab4d604b9 Mon Sep 17 00:00:00 2001 From: Tapani Moilanen Date: Tue, 16 Jul 2024 20:25:02 +0300 Subject: [PATCH 14/35] Allow null in consumer commitSync typings (#1082) KafkaConsumer incorrectly requires that commitSync be supplied with a TopicPartitionOffset or an array of TopicPartitionOffsets, when docs say that null can be passed to commit all read offsets. --- index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index 4cd46ec1..ece3c531 100644 --- a/index.d.ts +++ b/index.d.ts @@ -218,7 +218,7 @@ export class KafkaConsumer extends Client { commitMessageSync(msg: TopicPartitionOffset): this; - commitSync(topicPartition: TopicPartitionOffset | TopicPartitionOffset[]): this; + commitSync(topicPartition: TopicPartitionOffset | TopicPartitionOffset[] | null): this; committed(toppars: TopicPartition[], timeout: number, cb: (err: LibrdKafkaError, topicPartitions: TopicPartitionOffset[]) => void): this; committed(timeout: number, cb: (err: LibrdKafkaError, topicPartitions: TopicPartitionOffset[]) => void): this; From d336699fedfa74c1706a7096313fac7c8e97c632 Mon Sep 17 00:00:00 2001 From: Tapani Moilanen Date: Tue, 16 Jul 2024 20:25:25 +0300 Subject: [PATCH 15/35] Export event types for use with abstract Client class (#1083) Without exported event types, they must be duplicated in dependant code to correctly use the abstract `Client` class. --- index.d.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.d.ts b/index.d.ts index ece3c531..43bedfc9 100644 --- a/index.d.ts +++ b/index.d.ts @@ -142,9 +142,9 @@ export interface ConsumerStream extends Readable { close(cb?: () => void): void; } -type KafkaClientEvents = 'disconnected' | 'ready' | 'connection.failure' | 'event.error' | 'event.stats' | 'event.log' | 'event.event' | 'event.throttle'; -type KafkaConsumerEvents = 'data' | 'partition.eof' | 'rebalance' | 'rebalance.error' | 'subscribed' | 'unsubscribed' | 'unsubscribe' | 'offset.commit' | KafkaClientEvents; -type KafkaProducerEvents = 'delivery-report' | KafkaClientEvents; +export type KafkaClientEvents = 'disconnected' | 'ready' | 'connection.failure' | 'event.error' | 'event.stats' | 'event.log' | 'event.event' | 'event.throttle'; +export type KafkaConsumerEvents = 'data' | 'partition.eof' | 'rebalance' | 'rebalance.error' | 'subscribed' | 'unsubscribed' | 'unsubscribe' | 'offset.commit' | KafkaClientEvents; +export type KafkaProducerEvents = 'delivery-report' | KafkaClientEvents; type EventListenerMap = { // ### Client From 42ea8af919273f38c32f6d277ba117925eb9a3eb Mon Sep 17 00:00:00 2001 From: Matteo Gazzetta Date: Thu, 26 Sep 2024 19:48:29 +0200 Subject: [PATCH 16/35] Update librdkafka to 2.5.3 fixes #1093 (#1095) --- README.md | 10 +++++----- config.d.ts | 2 +- deps/librdkafka | 2 +- errors.d.ts | 4 +--- lib/error.js | 4 +--- package-lock.json | 18 +++++++++++------- package.json | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 5e3a15f9..b02cd84b 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ I am looking for *your* help to make this project even better! If you're interes The `node-rdkafka` library is a high-performance NodeJS client for [Apache Kafka](http://kafka.apache.org/) that wraps the native [librdkafka](https://github.com/edenhill/librdkafka) library. All the complexity of balancing writes across partitions and managing (possibly ever-changing) brokers should be encapsulated in the library. -__This library currently uses `librdkafka` version `2.5.0`.__ +__This library currently uses `librdkafka` version `2.5.3`.__ ## Reference Docs @@ -60,7 +60,7 @@ Using Alpine Linux? Check out the [docs](https://github.com/Blizzard/node-rdkafk ### Windows -Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.5.0.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. +Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.5.3.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. Requirements: * [node-gyp for Windows](https://github.com/nodejs/node-gyp#on-windows) @@ -97,7 +97,7 @@ const Kafka = require('node-rdkafka'); ## Configuration -You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.5.0/CONFIGURATION.md) +You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.5.3/CONFIGURATION.md) Configuration keys that have the suffix `_cb` are designated as callbacks. Some of these keys are informational and you can choose to opt-in (for example, `dr_cb`). Others are callbacks designed to @@ -132,7 +132,7 @@ You can also get the version of `librdkafka` const Kafka = require('node-rdkafka'); console.log(Kafka.librdkafkaVersion); -// #=> 2.5.0 +// #=> 2.5.3 ``` ## Sending Messages @@ -145,7 +145,7 @@ const producer = new Kafka.Producer({ }); ``` -A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.5.0/CONFIGURATION.md) file described previously. +A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.5.3/CONFIGURATION.md) file described previously. The following example illustrates a list with several `librdkafka` options set. diff --git a/config.d.ts b/config.d.ts index 09c69ede..465b2154 100644 --- a/config.d.ts +++ b/config.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.5.0 file CONFIGURATION.md ====== +// ====== Generated from librdkafka 2.5.3 file CONFIGURATION.md ====== // Code that generated this is a derivative work of the code from Nam Nguyen // https://gist.github.com/ntgn81/066c2c8ec5b4238f85d1e9168a04e3fb diff --git a/deps/librdkafka b/deps/librdkafka index 6eaf89fb..9416dd80 160000 --- a/deps/librdkafka +++ b/deps/librdkafka @@ -1 +1 @@ -Subproject commit 6eaf89fb124c421b66b43b195879d458a3a31f86 +Subproject commit 9416dd80fb0dba71ff73a8cb4d2b919f54651006 diff --git a/errors.d.ts b/errors.d.ts index 3f182d36..7effc26a 100644 --- a/errors.d.ts +++ b/errors.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.5.0 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.5.3 file src-cpp/rdkafkacpp.h ====== export const CODES: { ERRORS: { /* Internal errors to rdkafka: */ /** Begin internal error codes (**-200**) */ @@ -128,10 +128,8 @@ export const CODES: { ERRORS: { ERR__AUTO_OFFSET_RESET: number, /** Partition log truncation detected (**-139**) */ ERR__LOG_TRUNCATION: number, - /** End internal error codes (**-100**) */ ERR__END: number, - /* Kafka broker errors: */ /** Unknown broker error (**-1**) */ ERR_UNKNOWN: number, diff --git a/lib/error.js b/lib/error.js index ba204896..1795dbfe 100644 --- a/lib/error.js +++ b/lib/error.js @@ -27,7 +27,7 @@ LibrdKafkaError.wrap = errorWrap; * @enum {number} * @constant */ -// ====== Generated from librdkafka 2.5.0 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.5.3 file src-cpp/rdkafkacpp.h ====== LibrdKafkaError.codes = { /* Internal errors to rdkafka: */ @@ -158,10 +158,8 @@ LibrdKafkaError.codes = { ERR__AUTO_OFFSET_RESET: -140, /** Partition log truncation detected */ ERR__LOG_TRUNCATION: -139, - /** End internal error codes */ ERR__END: -100, - /* Kafka broker errors: */ /** Unknown broker error */ ERR_UNKNOWN: -1, diff --git a/package-lock.json b/package-lock.json index ab680e56..cf72815f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -334,12 +334,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -803,10 +804,11 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1122,6 +1124,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -2250,6 +2253,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, diff --git a/package.json b/package.json index 54497902..2991d098 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "node-rdkafka", "version": "v3.1.0", "description": "Node.js bindings for librdkafka", - "librdkafka": "2.5.0", + "librdkafka": "2.5.3", "main": "lib/index.js", "scripts": { "configure": "node-gyp configure", From 8a3d40cee66a9ac5228d709959951a8f59d326a4 Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Thu, 26 Sep 2024 11:01:27 -0700 Subject: [PATCH 17/35] v3.1.1 (#1096) Co-authored-by: garywilb --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cf72815f..e00129af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v3.1.0", + "version": "v3.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v3.1.0", + "version": "v3.1.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 2991d098..de25bce7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rdkafka", - "version": "v3.1.0", + "version": "v3.1.1", "description": "Node.js bindings for librdkafka", "librdkafka": "2.5.3", "main": "lib/index.js", From fd8039e78749260a32509637e34f574dd3b49718 Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:28:04 -0800 Subject: [PATCH 18/35] Use macos-14 for test workflow (#1088) This resolve "The macOS-12 environment is deprecated, consider switching to macOS-13, macOS-14 (macos-latest) or macOS-15." errors --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7a5534f2..be635cfc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,7 @@ jobs: # single mac test due to minute multipliers # https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions - node: 20 - os: macos-12 + os: macos-14 # single windows test due to node.js 14 node-gyp / vs 2022 issues - node: 20 os: windows-2022 From 1b33604c31c16bcd08f738c8124f0533611e7c94 Mon Sep 17 00:00:00 2001 From: Serhii Franchuk <44800855+serj026@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:35:44 +0100 Subject: [PATCH 19/35] Cooperative Rebalance (#1081) --- e2e/both.spec.js | 59 ++++++++++++++ e2e/consumer.spec.js | 39 +++++++++ index.d.ts | 4 + lib/kafka-consumer.js | 48 ++++++++++- src/connection.cc | 12 +++ src/connection.h | 1 + src/kafka-consumer.cc | 181 ++++++++++++++++++++++++++++++++++++++++++ src/kafka-consumer.h | 7 ++ src/producer.cc | 12 --- 9 files changed, 348 insertions(+), 15 deletions(-) diff --git a/e2e/both.spec.js b/e2e/both.spec.js index a8289ec3..4663f3a2 100644 --- a/e2e/both.spec.js +++ b/e2e/both.spec.js @@ -614,6 +614,65 @@ describe('Consumer/Producer', function() { }); }); + describe('Cooperative sticky', function() { + var consumer; + + beforeEach(function(done) { + var grp = 'kafka-mocha-grp-' + crypto.randomBytes(20).toString('hex'); + + var consumerOpts = { + 'metadata.broker.list': kafkaBrokerList, + 'group.id': grp, + 'fetch.wait.max.ms': 1000, + 'session.timeout.ms': 10000, + 'enable.auto.commit': false, + 'debug': 'all', + 'partition.assignment.strategy': 'cooperative-sticky' + }; + + consumer = new Kafka.KafkaConsumer(consumerOpts, { + 'auto.offset.reset': 'largest', + }); + + consumer.connect({}, function(err, d) { + t.ifError(err); + t.equal(typeof d, 'object', 'metadata should be returned'); + done(); + }); + + eventListener(consumer); + }); + + afterEach(function(done) { + consumer.disconnect(function() { + done(); + }); + }); + + it('should be able to produce and consume messages', function (done) { + var key = 'key'; + + crypto.randomBytes(4096, function(ex, buffer) { + producer.setPollInterval(10); + + consumer.on('data', function(message) { + t.equal(buffer.toString(), message.value.toString(), 'invalid message value'); + t.equal(key, message.key, 'invalid message key'); + t.equal(topic, message.topic, 'invalid message topic'); + t.ok(message.offset >= 0, 'invalid message offset'); + done(); + }); + + consumer.subscribe([topic]); + consumer.consume(); + + setTimeout(function() { + producer.produce(topic, null, buffer, key); + }, 2000); + }); + }); + }); + function assert_headers_match(expectedHeaders, messageHeaders) { t.equal(expectedHeaders.length, messageHeaders.length, 'Headers length does not match expected length'); for (var i = 0; i < expectedHeaders.length; i++) { diff --git a/e2e/consumer.spec.js b/e2e/consumer.spec.js index a167483f..972d5af6 100644 --- a/e2e/consumer.spec.js +++ b/e2e/consumer.spec.js @@ -344,4 +344,43 @@ describe('Consumer', function() { }); }); + + describe('rebalance protocol', function () { + var strategies = { + 'undefined': 'EAGER', + 'range': 'EAGER', + 'roundrobin': 'EAGER', + 'cooperative-sticky': 'COOPERATIVE', + }; + + Object.keys(strategies).forEach(function (strategy) { + it('should return ' + strategies[strategy] + ' for ' + strategy, function(done) { + var consumer = new KafkaConsumer({ + ...gcfg, + ...(strategy !== 'undefined' && { 'partition.assignment.strategy': strategy }) + }, {}); + + t.equal(consumer.rebalanceProtocol(), 'NONE'); + + consumer.connect({ timeout: 2000 }, function(err) { + t.ifError(err); + + consumer.subscribe([topic]); + + consumer.on('rebalance', function (err) { + if (err.code === -175) { + t.equal(consumer.rebalanceProtocol(), strategies[strategy]); + consumer.disconnect(done); + } + }); + + consumer.consume(1, function(err) { + t.ifError(err); + }); + }); + + eventListener(consumer); + }); + }); + }); }); diff --git a/index.d.ts b/index.d.ts index 43bedfc9..f1d458fe 100644 --- a/index.d.ts +++ b/index.d.ts @@ -208,6 +208,7 @@ export class KafkaConsumer extends Client { constructor(conf: ConsumerGlobalConfig, topicConf: ConsumerTopicConfig); assign(assignments: Assignment[]): this; + incrementalAssign(assignments: Assignment[]): this; assignments(): Assignment[]; @@ -248,12 +249,15 @@ export class KafkaConsumer extends Client { subscription(): string[]; unassign(): this; + incrementalUnassign(assignments: Assignment[]): this; unsubscribe(): this; offsetsForTimes(topicPartitions: TopicPartitionTime[], timeout: number, cb?: (err: LibrdKafkaError, offsets: TopicPartitionOffset[]) => any): void; offsetsForTimes(topicPartitions: TopicPartitionTime[], cb?: (err: LibrdKafkaError, offsets: TopicPartitionOffset[]) => any): void; + rebalanceProtocol(): string; + static createReadStream(conf: ConsumerGlobalConfig, topicConfig: ConsumerTopicConfig, streamOptions: ReadStreamOptions | number): ConsumerStream; } diff --git a/lib/kafka-consumer.js b/lib/kafka-consumer.js index c479240f..875a3779 100644 --- a/lib/kafka-consumer.js +++ b/lib/kafka-consumer.js @@ -58,12 +58,20 @@ function KafkaConsumer(conf, topicConf) { // Emit the event self.emit('rebalance', err, assignment); - // That's it + // That's it. try { if (err.code === -175 /*ERR__ASSIGN_PARTITIONS*/) { - self.assign(assignment); + if (self.rebalanceProtocol() === 'COOPERATIVE') { + self.incrementalAssign(assignment); + } else { + self.assign(assignment); + } } else if (err.code === -174 /*ERR__REVOKE_PARTITIONS*/) { - self.unassign(); + if (self.rebalanceProtocol() === 'COOPERATIVE') { + self.incrementalUnassign(assignment); + } else { + self.unassign(); + } } } catch (e) { // Ignore exceptions if we are not connected @@ -275,6 +283,40 @@ KafkaConsumer.prototype.unassign = function() { return this; }; +/** + * Assign the consumer specific partitions and topics. Used for + * cooperative rebalancing. + * + * @param {array} assignments - Assignments array. Should contain + * objects with topic and partition set. Assignments are additive. + * @return {Client} - Returns itself + */ +KafkaConsumer.prototype.incrementalAssign = function(assignments) { + this._client.incrementalAssign(TopicPartition.map(assignments)); + return this; +}; + +/** + * Unassign the consumer specific partitions and topics. Used for + * cooperative rebalancing. + * + * @param {array} assignments - Assignments array. Should contain + * objects with topic and partition set. Assignments are subtractive. + * @return {Client} - Returns itself + */ +KafkaConsumer.prototype.incrementalUnassign = function(assignments) { + this._client.incrementalUnassign(TopicPartition.map(assignments)); + return this; +}; + +/** + * Get the type of rebalance protocol used in the consumer group. + * + * @returns "NONE", "COOPERATIVE" or "EAGER". + */ +KafkaConsumer.prototype.rebalanceProtocol = function() { + return this._client.rebalanceProtocol(); +} /** * Get the assignments for the consumer diff --git a/src/connection.cc b/src/connection.cc index cfb8ba23..f76e012f 100644 --- a/src/connection.cc +++ b/src/connection.cc @@ -68,6 +68,18 @@ Connection::~Connection() { } } +Baton Connection::rdkafkaErrorToBaton(RdKafka::Error* error) { + if ( NULL == error) { + return Baton(RdKafka::ERR_NO_ERROR); + } + else { + Baton result(error->code(), error->str(), error->is_fatal(), + error->is_retriable(), error->txn_requires_abort()); + delete error; + return result; + } +} + RdKafka::TopicPartition* Connection::GetPartition(std::string &topic) { return RdKafka::TopicPartition::create(topic, RdKafka::Topic::PARTITION_UA); } diff --git a/src/connection.h b/src/connection.h index 8ee3f052..bba8a7c7 100644 --- a/src/connection.h +++ b/src/connection.h @@ -80,6 +80,7 @@ class Connection : public Nan::ObjectWrap { static Nan::Persistent constructor; static void New(const Nan::FunctionCallbackInfo& info); + static Baton rdkafkaErrorToBaton(RdKafka::Error* error); bool m_has_been_disconnected; bool m_is_closing; diff --git a/src/kafka-consumer.cc b/src/kafka-consumer.cc index 0f5e32ed..89528ceb 100644 --- a/src/kafka-consumer.cc +++ b/src/kafka-consumer.cc @@ -219,6 +219,59 @@ Baton KafkaConsumer::Unassign() { return Baton(RdKafka::ERR_NO_ERROR); } +Baton KafkaConsumer::IncrementalAssign(std::vector partitions) { + if (!IsConnected()) { + return Baton(RdKafka::ERR__STATE, "KafkaConsumer is disconnected"); + } + + RdKafka::KafkaConsumer* consumer = + dynamic_cast(m_client); + + RdKafka::Error* error = consumer->incremental_assign(partitions); + + if (error == NULL) { + m_partition_cnt += partitions.size(); + m_partitions.insert(m_partitions.end(), partitions.begin(), partitions.end()); + } else { + RdKafka::TopicPartition::destroy(partitions); + } + + return rdkafkaErrorToBaton(error); +} + +Baton KafkaConsumer::IncrementalUnassign(std::vector partitions) { + if (!IsClosing() && !IsConnected()) { + return Baton(RdKafka::ERR__STATE); + } + + RdKafka::KafkaConsumer* consumer = + dynamic_cast(m_client); + + RdKafka::Error* error = consumer->incremental_unassign(partitions); + + std::vector delete_partitions; + + if (error == NULL) { + for (unsigned int i = 0; i < partitions.size(); i++) { + for (unsigned int j = 0; j < m_partitions.size(); j++) { + if (partitions[i]->partition() == m_partitions[j]->partition() && + partitions[i]->topic() == m_partitions[j]->topic()) { + delete_partitions.push_back(m_partitions[j]); + m_partitions.erase(m_partitions.begin() + j); + m_partition_cnt--; + break; + } + } + } + } + + RdKafka::TopicPartition::destroy(delete_partitions); + + RdKafka::TopicPartition::destroy(partitions); + + return rdkafkaErrorToBaton(error); +} + Baton KafkaConsumer::Commit(std::vector toppars) { if (!IsConnected()) { return Baton(RdKafka::ERR__STATE); @@ -494,6 +547,17 @@ std::string KafkaConsumer::Name() { return std::string(m_client->name()); } +std::string KafkaConsumer::RebalanceProtocol() { + if (!IsConnected()) { + return std::string("NONE"); + } + + RdKafka::KafkaConsumer* consumer = + dynamic_cast(m_client); + + return consumer->rebalance_protocol(); +} + Nan::Persistent KafkaConsumer::constructor; void KafkaConsumer::Init(v8::Local exports) { @@ -547,7 +611,10 @@ void KafkaConsumer::Init(v8::Local exports) { Nan::SetPrototypeMethod(tpl, "position", NodePosition); Nan::SetPrototypeMethod(tpl, "assign", NodeAssign); Nan::SetPrototypeMethod(tpl, "unassign", NodeUnassign); + Nan::SetPrototypeMethod(tpl, "incrementalAssign", NodeIncrementalAssign); + Nan::SetPrototypeMethod(tpl, "incrementalUnassign", NodeIncrementalUnassign); Nan::SetPrototypeMethod(tpl, "assignments", NodeAssignments); + Nan::SetPrototypeMethod(tpl, "rebalanceProtocol", NodeRebalanceProtocol); Nan::SetPrototypeMethod(tpl, "commit", NodeCommit); Nan::SetPrototypeMethod(tpl, "commitSync", NodeCommitSync); @@ -720,6 +787,12 @@ NAN_METHOD(KafkaConsumer::NodeAssignments) { Conversion::TopicPartition::ToV8Array(consumer->m_partitions)); } +NAN_METHOD(KafkaConsumer::NodeRebalanceProtocol) { + KafkaConsumer* consumer = ObjectWrap::Unwrap(info.This()); + std::string protocol = consumer->RebalanceProtocol(); + info.GetReturnValue().Set(Nan::New(protocol).ToLocalChecked()); +} + NAN_METHOD(KafkaConsumer::NodeAssign) { Nan::HandleScope scope; @@ -798,6 +871,114 @@ NAN_METHOD(KafkaConsumer::NodeUnassign) { info.GetReturnValue().Set(Nan::True()); } +NAN_METHOD(KafkaConsumer::NodeIncrementalAssign) { + Nan::HandleScope scope; + + if (info.Length() < 1 || !info[0]->IsArray()) { + return Nan::ThrowError("Need to specify an array of partitions"); + } + + v8::Local partitions = info[0].As(); + std::vector topic_partitions; + + for (unsigned int i = 0; i < partitions->Length(); ++i) { + v8::Local partition_obj_value; + if (!( + Nan::Get(partitions, i).ToLocal(&partition_obj_value) && + partition_obj_value->IsObject())) { + Nan::ThrowError("Must pass topic-partition objects"); + } + + v8::Local partition_obj = partition_obj_value.As(); + + int64_t partition = GetParameter(partition_obj, "partition", -1); + std::string topic = GetParameter(partition_obj, "topic", ""); + + if (!topic.empty()) { + RdKafka::TopicPartition* part; + + if (partition < 0) { + part = Connection::GetPartition(topic); + } else { + part = Connection::GetPartition(topic, partition); + } + + int64_t offset = GetParameter( + partition_obj, "offset", RdKafka::Topic::OFFSET_INVALID); + if (offset != RdKafka::Topic::OFFSET_INVALID) { + part->set_offset(offset); + } + + topic_partitions.push_back(part); + } + } + + KafkaConsumer* consumer = ObjectWrap::Unwrap(info.This()); + + Baton b = consumer->IncrementalAssign(topic_partitions); + + if (b.err() != RdKafka::ERR_NO_ERROR) { + v8::Local errorObject = b.ToObject(); + Nan::ThrowError(errorObject); + } + + info.GetReturnValue().Set(Nan::True()); +} + +NAN_METHOD(KafkaConsumer::NodeIncrementalUnassign) { + Nan::HandleScope scope; + + if (info.Length() < 1 || !info[0]->IsArray()) { + return Nan::ThrowError("Need to specify an array of partitions"); + } + + v8::Local partitions = info[0].As(); + std::vector topic_partitions; + + for (unsigned int i = 0; i < partitions->Length(); ++i) { + v8::Local partition_obj_value; + if (!( + Nan::Get(partitions, i).ToLocal(&partition_obj_value) && + partition_obj_value->IsObject())) { + Nan::ThrowError("Must pass topic-partition objects"); + } + + v8::Local partition_obj = partition_obj_value.As(); + + int64_t partition = GetParameter(partition_obj, "partition", -1); + std::string topic = GetParameter(partition_obj, "topic", ""); + + if (!topic.empty()) { + RdKafka::TopicPartition* part; + + if (partition < 0) { + part = Connection::GetPartition(topic); + } else { + part = Connection::GetPartition(topic, partition); + } + + int64_t offset = GetParameter( + partition_obj, "offset", RdKafka::Topic::OFFSET_INVALID); + if (offset != RdKafka::Topic::OFFSET_INVALID) { + part->set_offset(offset); + } + + topic_partitions.push_back(part); + } + } + + KafkaConsumer* consumer = ObjectWrap::Unwrap(info.This()); + + Baton b = consumer->IncrementalUnassign(topic_partitions); + + if (b.err() != RdKafka::ERR_NO_ERROR) { + v8::Local errorObject = b.ToObject(); + Nan::ThrowError(errorObject); + } + + info.GetReturnValue().Set(Nan::True()); +} + NAN_METHOD(KafkaConsumer::NodeUnsubscribe) { Nan::HandleScope scope; diff --git a/src/kafka-consumer.h b/src/kafka-consumer.h index c91590ec..dfb45b9a 100644 --- a/src/kafka-consumer.h +++ b/src/kafka-consumer.h @@ -74,9 +74,13 @@ class KafkaConsumer : public Connection { Baton Assign(std::vector); Baton Unassign(); + Baton IncrementalAssign(std::vector); + Baton IncrementalUnassign(std::vector); + Baton Seek(const RdKafka::TopicPartition &partition, int timeout_ms); std::string Name(); + std::string RebalanceProtocol(); Baton Subscribe(std::vector); Baton Consume(int timeout_ms); @@ -106,6 +110,9 @@ class KafkaConsumer : public Connection { static NAN_METHOD(NodeDisconnect); static NAN_METHOD(NodeAssign); static NAN_METHOD(NodeUnassign); + static NAN_METHOD(NodeIncrementalAssign); + static NAN_METHOD(NodeIncrementalUnassign); + static NAN_METHOD(NodeRebalanceProtocol); static NAN_METHOD(NodeAssignments); static NAN_METHOD(NodeUnsubscribe); static NAN_METHOD(NodeCommit); diff --git a/src/producer.cc b/src/producer.cc index c8e3e632..8e20320a 100644 --- a/src/producer.cc +++ b/src/producer.cc @@ -370,18 +370,6 @@ void Producer::ConfigureCallback(const std::string &string_key, const v8::Local< } } -Baton rdkafkaErrorToBaton(RdKafka::Error* error) { - if ( NULL == error) { - return Baton(RdKafka::ERR_NO_ERROR); - } - else { - Baton result(error->code(), error->str(), error->is_fatal(), - error->is_retriable(), error->txn_requires_abort()); - delete error; - return result; - } -} - Baton Producer::InitTransactions(int32_t timeout_ms) { if (!IsConnected()) { return Baton(RdKafka::ERR__STATE); From db229e52c78c4a3dc77123715fc7098e3cd8830e Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Mon, 18 Nov 2024 12:51:19 -0800 Subject: [PATCH 20/35] Update librdkafka to 2.6.0 --- README.md | 10 +- config.d.ts | 2 +- deps/librdkafka | 2 +- errors.d.ts | 698 +++++++++++++++++++++++----------------------- lib/error.js | 10 +- package-lock.json | 4 +- package.json | 4 +- 7 files changed, 368 insertions(+), 362 deletions(-) diff --git a/README.md b/README.md index b02cd84b..b87ec438 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ I am looking for *your* help to make this project even better! If you're interes The `node-rdkafka` library is a high-performance NodeJS client for [Apache Kafka](http://kafka.apache.org/) that wraps the native [librdkafka](https://github.com/edenhill/librdkafka) library. All the complexity of balancing writes across partitions and managing (possibly ever-changing) brokers should be encapsulated in the library. -__This library currently uses `librdkafka` version `2.5.3`.__ +__This library currently uses `librdkafka` version `2.6.0`.__ ## Reference Docs @@ -60,7 +60,7 @@ Using Alpine Linux? Check out the [docs](https://github.com/Blizzard/node-rdkafk ### Windows -Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.5.3.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. +Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.6.0.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. Requirements: * [node-gyp for Windows](https://github.com/nodejs/node-gyp#on-windows) @@ -97,7 +97,7 @@ const Kafka = require('node-rdkafka'); ## Configuration -You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.5.3/CONFIGURATION.md) +You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.6.0/CONFIGURATION.md) Configuration keys that have the suffix `_cb` are designated as callbacks. Some of these keys are informational and you can choose to opt-in (for example, `dr_cb`). Others are callbacks designed to @@ -132,7 +132,7 @@ You can also get the version of `librdkafka` const Kafka = require('node-rdkafka'); console.log(Kafka.librdkafkaVersion); -// #=> 2.5.3 +// #=> 2.6.0 ``` ## Sending Messages @@ -145,7 +145,7 @@ const producer = new Kafka.Producer({ }); ``` -A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.5.3/CONFIGURATION.md) file described previously. +A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.6.0/CONFIGURATION.md) file described previously. The following example illustrates a list with several `librdkafka` options set. diff --git a/config.d.ts b/config.d.ts index 465b2154..493ac807 100644 --- a/config.d.ts +++ b/config.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.5.3 file CONFIGURATION.md ====== +// ====== Generated from librdkafka 2.6.0 file CONFIGURATION.md ====== // Code that generated this is a derivative work of the code from Nam Nguyen // https://gist.github.com/ntgn81/066c2c8ec5b4238f85d1e9168a04e3fb diff --git a/deps/librdkafka b/deps/librdkafka index 9416dd80..7fc5a598 160000 --- a/deps/librdkafka +++ b/deps/librdkafka @@ -1 +1 @@ -Subproject commit 9416dd80fb0dba71ff73a8cb4d2b919f54651006 +Subproject commit 7fc5a59826ee1e1dee3236b1e43180cc22cfb496 diff --git a/errors.d.ts b/errors.d.ts index 7effc26a..c52b120e 100644 --- a/errors.d.ts +++ b/errors.d.ts @@ -1,347 +1,351 @@ -// ====== Generated from librdkafka 2.5.3 file src-cpp/rdkafkacpp.h ====== -export const CODES: { ERRORS: { - /* Internal errors to rdkafka: */ - /** Begin internal error codes (**-200**) */ - ERR__BEGIN: number, - /** Received message is incorrect (**-199**) */ - ERR__BAD_MSG: number, - /** Bad/unknown compression (**-198**) */ - ERR__BAD_COMPRESSION: number, - /** Broker is going away (**-197**) */ - ERR__DESTROY: number, - /** Generic failure (**-196**) */ - ERR__FAIL: number, - /** Broker transport failure (**-195**) */ - ERR__TRANSPORT: number, - /** Critical system resource (**-194**) */ - ERR__CRIT_SYS_RESOURCE: number, - /** Failed to resolve broker (**-193**) */ - ERR__RESOLVE: number, - /** Produced message timed out (**-192**) */ - ERR__MSG_TIMED_OUT: number, - /** Reached the end of the topic+partition queue on - * the broker. Not really an error. - * This event is disabled by default, - * see the `enable.partition.eof` configuration property (**-191**) */ - ERR__PARTITION_EOF: number, - /** Permanent: Partition does not exist in cluster (**-190**) */ - ERR__UNKNOWN_PARTITION: number, - /** File or filesystem error (**-189**) */ - ERR__FS: number, - /** Permanent: Topic does not exist in cluster (**-188**) */ - ERR__UNKNOWN_TOPIC: number, - /** All broker connections are down (**-187**) */ - ERR__ALL_BROKERS_DOWN: number, - /** Invalid argument, or invalid configuration (**-186**) */ - ERR__INVALID_ARG: number, - /** Operation timed out (**-185**) */ - ERR__TIMED_OUT: number, - /** Queue is full (**-184**) */ - ERR__QUEUE_FULL: number, - /** ISR count < required.acks (**-183**) */ - ERR__ISR_INSUFF: number, - /** Broker node update (**-182**) */ - ERR__NODE_UPDATE: number, - /** SSL error (**-181**) */ - ERR__SSL: number, - /** Waiting for coordinator to become available (**-180**) */ - ERR__WAIT_COORD: number, - /** Unknown client group (**-179**) */ - ERR__UNKNOWN_GROUP: number, - /** Operation in progress (**-178**) */ - ERR__IN_PROGRESS: number, - /** Previous operation in progress, wait for it to finish (**-177**) */ - ERR__PREV_IN_PROGRESS: number, - /** This operation would interfere with an existing subscription (**-176**) */ - ERR__EXISTING_SUBSCRIPTION: number, - /** Assigned partitions (rebalance_cb) (**-175**) */ - ERR__ASSIGN_PARTITIONS: number, - /** Revoked partitions (rebalance_cb) (**-174**) */ - ERR__REVOKE_PARTITIONS: number, - /** Conflicting use (**-173**) */ - ERR__CONFLICT: number, - /** Wrong state (**-172**) */ - ERR__STATE: number, - /** Unknown protocol (**-171**) */ - ERR__UNKNOWN_PROTOCOL: number, - /** Not implemented (**-170**) */ - ERR__NOT_IMPLEMENTED: number, - /** Authentication failure (**-169**) */ - ERR__AUTHENTICATION: number, - /** No stored offset (**-168**) */ - ERR__NO_OFFSET: number, - /** Outdated (**-167**) */ - ERR__OUTDATED: number, - /** Timed out in queue (**-166**) */ - ERR__TIMED_OUT_QUEUE: number, - /** Feature not supported by broker (**-165**) */ - ERR__UNSUPPORTED_FEATURE: number, - /** Awaiting cache update (**-164**) */ - ERR__WAIT_CACHE: number, - /** Operation interrupted (**-163**) */ - ERR__INTR: number, - /** Key serialization error (**-162**) */ - ERR__KEY_SERIALIZATION: number, - /** Value serialization error (**-161**) */ - ERR__VALUE_SERIALIZATION: number, - /** Key deserialization error (**-160**) */ - ERR__KEY_DESERIALIZATION: number, - /** Value deserialization error (**-159**) */ - ERR__VALUE_DESERIALIZATION: number, - /** Partial response (**-158**) */ - ERR__PARTIAL: number, - /** Modification attempted on read-only object (**-157**) */ - ERR__READ_ONLY: number, - /** No such entry / item not found (**-156**) */ - ERR__NOENT: number, - /** Read underflow (**-155**) */ - ERR__UNDERFLOW: number, - /** Invalid type (**-154**) */ - ERR__INVALID_TYPE: number, - /** Retry operation (**-153**) */ - ERR__RETRY: number, - /** Purged in queue (**-152**) */ - ERR__PURGE_QUEUE: number, - /** Purged in flight (**-151**) */ - ERR__PURGE_INFLIGHT: number, - /** Fatal error: see RdKafka::Handle::fatal_error() (**-150**) */ - ERR__FATAL: number, - /** Inconsistent state (**-149**) */ - ERR__INCONSISTENT: number, - /** Gap-less ordering would not be guaranteed if proceeding (**-148**) */ - ERR__GAPLESS_GUARANTEE: number, - /** Maximum poll interval exceeded (**-147**) */ - ERR__MAX_POLL_EXCEEDED: number, - /** Unknown broker (**-146**) */ - ERR__UNKNOWN_BROKER: number, - /** Functionality not configured (**-145**) */ - ERR__NOT_CONFIGURED: number, - /** Instance has been fenced (**-144**) */ - ERR__FENCED: number, - /** Application generated error (**-143**) */ - ERR__APPLICATION: number, - /** Assignment lost (**-142**) */ - ERR__ASSIGNMENT_LOST: number, - /** No operation performed (**-141**) */ - ERR__NOOP: number, - /** No offset to automatically reset to (**-140**) */ - ERR__AUTO_OFFSET_RESET: number, - /** Partition log truncation detected (**-139**) */ - ERR__LOG_TRUNCATION: number, - /** End internal error codes (**-100**) */ - ERR__END: number, - /* Kafka broker errors: */ - /** Unknown broker error (**-1**) */ - ERR_UNKNOWN: number, - /** Success (**0**) */ - ERR_NO_ERROR: number, - /** Offset out of range (**1**) */ - ERR_OFFSET_OUT_OF_RANGE: number, - /** Invalid message (**2**) */ - ERR_INVALID_MSG: number, - /** Unknown topic or partition (**3**) */ - ERR_UNKNOWN_TOPIC_OR_PART: number, - /** Invalid message size (**4**) */ - ERR_INVALID_MSG_SIZE: number, - /** Leader not available (**5**) */ - ERR_LEADER_NOT_AVAILABLE: number, - /** Not leader for partition (**6**) */ - ERR_NOT_LEADER_FOR_PARTITION: number, - /** Request timed out (**7**) */ - ERR_REQUEST_TIMED_OUT: number, - /** Broker not available (**8**) */ - ERR_BROKER_NOT_AVAILABLE: number, - /** Replica not available (**9**) */ - ERR_REPLICA_NOT_AVAILABLE: number, - /** Message size too large (**10**) */ - ERR_MSG_SIZE_TOO_LARGE: number, - /** StaleControllerEpochCode (**11**) */ - ERR_STALE_CTRL_EPOCH: number, - /** Offset metadata string too large (**12**) */ - ERR_OFFSET_METADATA_TOO_LARGE: number, - /** Broker disconnected before response received (**13**) */ - ERR_NETWORK_EXCEPTION: number, - /** Coordinator load in progress (**14**) */ - ERR_COORDINATOR_LOAD_IN_PROGRESS: number, -/** Group coordinator load in progress (**14**) */ - ERR_GROUP_LOAD_IN_PROGRESS: number, - /** Coordinator not available (**15**) */ - ERR_COORDINATOR_NOT_AVAILABLE: number, -/** Group coordinator not available (**15**) */ - ERR_GROUP_COORDINATOR_NOT_AVAILABLE: number, - /** Not coordinator (**16**) */ - ERR_NOT_COORDINATOR: number, -/** Not coordinator for group (**16**) */ - ERR_NOT_COORDINATOR_FOR_GROUP: number, - /** Invalid topic (**17**) */ - ERR_TOPIC_EXCEPTION: number, - /** Message batch larger than configured server segment size (**18**) */ - ERR_RECORD_LIST_TOO_LARGE: number, - /** Not enough in-sync replicas (**19**) */ - ERR_NOT_ENOUGH_REPLICAS: number, - /** Message(s) written to insufficient number of in-sync replicas (**20**) */ - ERR_NOT_ENOUGH_REPLICAS_AFTER_APPEND: number, - /** Invalid required acks value (**21**) */ - ERR_INVALID_REQUIRED_ACKS: number, - /** Specified group generation id is not valid (**22**) */ - ERR_ILLEGAL_GENERATION: number, - /** Inconsistent group protocol (**23**) */ - ERR_INCONSISTENT_GROUP_PROTOCOL: number, - /** Invalid group.id (**24**) */ - ERR_INVALID_GROUP_ID: number, - /** Unknown member (**25**) */ - ERR_UNKNOWN_MEMBER_ID: number, - /** Invalid session timeout (**26**) */ - ERR_INVALID_SESSION_TIMEOUT: number, - /** Group rebalance in progress (**27**) */ - ERR_REBALANCE_IN_PROGRESS: number, - /** Commit offset data size is not valid (**28**) */ - ERR_INVALID_COMMIT_OFFSET_SIZE: number, - /** Topic authorization failed (**29**) */ - ERR_TOPIC_AUTHORIZATION_FAILED: number, - /** Group authorization failed (**30**) */ - ERR_GROUP_AUTHORIZATION_FAILED: number, - /** Cluster authorization failed (**31**) */ - ERR_CLUSTER_AUTHORIZATION_FAILED: number, - /** Invalid timestamp (**32**) */ - ERR_INVALID_TIMESTAMP: number, - /** Unsupported SASL mechanism (**33**) */ - ERR_UNSUPPORTED_SASL_MECHANISM: number, - /** Illegal SASL state (**34**) */ - ERR_ILLEGAL_SASL_STATE: number, - /** Unuspported version (**35**) */ - ERR_UNSUPPORTED_VERSION: number, - /** Topic already exists (**36**) */ - ERR_TOPIC_ALREADY_EXISTS: number, - /** Invalid number of partitions (**37**) */ - ERR_INVALID_PARTITIONS: number, - /** Invalid replication factor (**38**) */ - ERR_INVALID_REPLICATION_FACTOR: number, - /** Invalid replica assignment (**39**) */ - ERR_INVALID_REPLICA_ASSIGNMENT: number, - /** Invalid config (**40**) */ - ERR_INVALID_CONFIG: number, - /** Not controller for cluster (**41**) */ - ERR_NOT_CONTROLLER: number, - /** Invalid request (**42**) */ - ERR_INVALID_REQUEST: number, - /** Message format on broker does not support request (**43**) */ - ERR_UNSUPPORTED_FOR_MESSAGE_FORMAT: number, - /** Policy violation (**44**) */ - ERR_POLICY_VIOLATION: number, - /** Broker received an out of order sequence number (**45**) */ - ERR_OUT_OF_ORDER_SEQUENCE_NUMBER: number, - /** Broker received a duplicate sequence number (**46**) */ - ERR_DUPLICATE_SEQUENCE_NUMBER: number, - /** Producer attempted an operation with an old epoch (**47**) */ - ERR_INVALID_PRODUCER_EPOCH: number, - /** Producer attempted a transactional operation in an invalid state (**48**) */ - ERR_INVALID_TXN_STATE: number, - /** Producer attempted to use a producer id which is not - * currently assigned to its transactional id (**49**) */ - ERR_INVALID_PRODUCER_ID_MAPPING: number, - /** Transaction timeout is larger than the maximum - * value allowed by the broker's max.transaction.timeout.ms (**50**) */ - ERR_INVALID_TRANSACTION_TIMEOUT: number, - /** Producer attempted to update a transaction while another - * concurrent operation on the same transaction was ongoing (**51**) */ - ERR_CONCURRENT_TRANSACTIONS: number, - /** Indicates that the transaction coordinator sending a - * WriteTxnMarker is no longer the current coordinator for a - * given producer (**52**) */ - ERR_TRANSACTION_COORDINATOR_FENCED: number, - /** Transactional Id authorization failed (**53**) */ - ERR_TRANSACTIONAL_ID_AUTHORIZATION_FAILED: number, - /** Security features are disabled (**54**) */ - ERR_SECURITY_DISABLED: number, - /** Operation not attempted (**55**) */ - ERR_OPERATION_NOT_ATTEMPTED: number, - /** Disk error when trying to access log file on the disk (**56**) */ - ERR_KAFKA_STORAGE_ERROR: number, - /** The user-specified log directory is not found in the broker config (**57**) */ - ERR_LOG_DIR_NOT_FOUND: number, - /** SASL Authentication failed (**58**) */ - ERR_SASL_AUTHENTICATION_FAILED: number, - /** Unknown Producer Id (**59**) */ - ERR_UNKNOWN_PRODUCER_ID: number, - /** Partition reassignment is in progress (**60**) */ - ERR_REASSIGNMENT_IN_PROGRESS: number, - /** Delegation Token feature is not enabled (**61**) */ - ERR_DELEGATION_TOKEN_AUTH_DISABLED: number, - /** Delegation Token is not found on server (**62**) */ - ERR_DELEGATION_TOKEN_NOT_FOUND: number, - /** Specified Principal is not valid Owner/Renewer (**63**) */ - ERR_DELEGATION_TOKEN_OWNER_MISMATCH: number, - /** Delegation Token requests are not allowed on this connection (**64**) */ - ERR_DELEGATION_TOKEN_REQUEST_NOT_ALLOWED: number, - /** Delegation Token authorization failed (**65**) */ - ERR_DELEGATION_TOKEN_AUTHORIZATION_FAILED: number, - /** Delegation Token is expired (**66**) */ - ERR_DELEGATION_TOKEN_EXPIRED: number, - /** Supplied principalType is not supported (**67**) */ - ERR_INVALID_PRINCIPAL_TYPE: number, - /** The group is not empty (**68**) */ - ERR_NON_EMPTY_GROUP: number, - /** The group id does not exist (**69**) */ - ERR_GROUP_ID_NOT_FOUND: number, - /** The fetch session ID was not found (**70**) */ - ERR_FETCH_SESSION_ID_NOT_FOUND: number, - /** The fetch session epoch is invalid (**71**) */ - ERR_INVALID_FETCH_SESSION_EPOCH: number, - /** No matching listener (**72**) */ - ERR_LISTENER_NOT_FOUND: number, - /** Topic deletion is disabled (**73**) */ - ERR_TOPIC_DELETION_DISABLED: number, - /** Leader epoch is older than broker epoch (**74**) */ - ERR_FENCED_LEADER_EPOCH: number, - /** Leader epoch is newer than broker epoch (**75**) */ - ERR_UNKNOWN_LEADER_EPOCH: number, - /** Unsupported compression type (**76**) */ - ERR_UNSUPPORTED_COMPRESSION_TYPE: number, - /** Broker epoch has changed (**77**) */ - ERR_STALE_BROKER_EPOCH: number, - /** Leader high watermark is not caught up (**78**) */ - ERR_OFFSET_NOT_AVAILABLE: number, - /** Group member needs a valid member ID (**79**) */ - ERR_MEMBER_ID_REQUIRED: number, - /** Preferred leader was not available (**80**) */ - ERR_PREFERRED_LEADER_NOT_AVAILABLE: number, - /** Consumer group has reached maximum size (**81**) */ - ERR_GROUP_MAX_SIZE_REACHED: number, - /** Static consumer fenced by other consumer with same - * group.instance.id (**82**) */ - ERR_FENCED_INSTANCE_ID: number, - /** Eligible partition leaders are not available (**83**) */ - ERR_ELIGIBLE_LEADERS_NOT_AVAILABLE: number, - /** Leader election not needed for topic partition (**84**) */ - ERR_ELECTION_NOT_NEEDED: number, - /** No partition reassignment is in progress (**85**) */ - ERR_NO_REASSIGNMENT_IN_PROGRESS: number, - /** Deleting offsets of a topic while the consumer group is - * subscribed to it (**86**) */ - ERR_GROUP_SUBSCRIBED_TO_TOPIC: number, - /** Broker failed to validate record (**87**) */ - ERR_INVALID_RECORD: number, - /** There are unstable offsets that need to be cleared (**88**) */ - ERR_UNSTABLE_OFFSET_COMMIT: number, - /** Throttling quota has been exceeded (**89**) */ - ERR_THROTTLING_QUOTA_EXCEEDED: number, - /** There is a newer producer with the same transactionalId - * which fences the current one (**90**) */ - ERR_PRODUCER_FENCED: number, - /** Request illegally referred to resource that does not exist (**91**) */ - ERR_RESOURCE_NOT_FOUND: number, - /** Request illegally referred to the same resource twice (**92**) */ - ERR_DUPLICATE_RESOURCE: number, - /** Requested credential would not meet criteria for acceptability (**93**) */ - ERR_UNACCEPTABLE_CREDENTIAL: number, - /** Indicates that the either the sender or recipient of a - * voter-only request is not one of the expected voters (**94**) */ - ERR_INCONSISTENT_VOTER_SET: number, - /** Invalid update version (**95**) */ - ERR_INVALID_UPDATE_VERSION: number, - /** Unable to update finalized features due to server error (**96**) */ - ERR_FEATURE_UPDATE_FAILED: number, - /** Request principal deserialization failed during forwarding (**97**) */ - ERR_PRINCIPAL_DESERIALIZATION_FAILURE: number, -}} \ No newline at end of file +// ====== Generated from librdkafka 2.6.0 file src-cpp/rdkafkacpp.h ====== +export const CODES: { + ERRORS: { + /* Internal errors to rdkafka: */ + /** Begin internal error codes (**-200**) */ + ERR__BEGIN: number, + /** Received message is incorrect (**-199**) */ + ERR__BAD_MSG: number, + /** Bad/unknown compression (**-198**) */ + ERR__BAD_COMPRESSION: number, + /** Broker is going away (**-197**) */ + ERR__DESTROY: number, + /** Generic failure (**-196**) */ + ERR__FAIL: number, + /** Broker transport failure (**-195**) */ + ERR__TRANSPORT: number, + /** Critical system resource (**-194**) */ + ERR__CRIT_SYS_RESOURCE: number, + /** Failed to resolve broker (**-193**) */ + ERR__RESOLVE: number, + /** Produced message timed out (**-192**) */ + ERR__MSG_TIMED_OUT: number, + /** Reached the end of the topic+partition queue on + * the broker. Not really an error. + * This event is disabled by default, + * see the `enable.partition.eof` configuration property (**-191**) */ + ERR__PARTITION_EOF: number, + /** Permanent: Partition does not exist in cluster (**-190**) */ + ERR__UNKNOWN_PARTITION: number, + /** File or filesystem error (**-189**) */ + ERR__FS: number, + /** Permanent: Topic does not exist in cluster (**-188**) */ + ERR__UNKNOWN_TOPIC: number, + /** All broker connections are down (**-187**) */ + ERR__ALL_BROKERS_DOWN: number, + /** Invalid argument, or invalid configuration (**-186**) */ + ERR__INVALID_ARG: number, + /** Operation timed out (**-185**) */ + ERR__TIMED_OUT: number, + /** Queue is full (**-184**) */ + ERR__QUEUE_FULL: number, + /** ISR count < required.acks (**-183**) */ + ERR__ISR_INSUFF: number, + /** Broker node update (**-182**) */ + ERR__NODE_UPDATE: number, + /** SSL error (**-181**) */ + ERR__SSL: number, + /** Waiting for coordinator to become available (**-180**) */ + ERR__WAIT_COORD: number, + /** Unknown client group (**-179**) */ + ERR__UNKNOWN_GROUP: number, + /** Operation in progress (**-178**) */ + ERR__IN_PROGRESS: number, + /** Previous operation in progress, wait for it to finish (**-177**) */ + ERR__PREV_IN_PROGRESS: number, + /** This operation would interfere with an existing subscription (**-176**) */ + ERR__EXISTING_SUBSCRIPTION: number, + /** Assigned partitions (rebalance_cb) (**-175**) */ + ERR__ASSIGN_PARTITIONS: number, + /** Revoked partitions (rebalance_cb) (**-174**) */ + ERR__REVOKE_PARTITIONS: number, + /** Conflicting use (**-173**) */ + ERR__CONFLICT: number, + /** Wrong state (**-172**) */ + ERR__STATE: number, + /** Unknown protocol (**-171**) */ + ERR__UNKNOWN_PROTOCOL: number, + /** Not implemented (**-170**) */ + ERR__NOT_IMPLEMENTED: number, + /** Authentication failure (**-169**) */ + ERR__AUTHENTICATION: number, + /** No stored offset (**-168**) */ + ERR__NO_OFFSET: number, + /** Outdated (**-167**) */ + ERR__OUTDATED: number, + /** Timed out in queue (**-166**) */ + ERR__TIMED_OUT_QUEUE: number, + /** Feature not supported by broker (**-165**) */ + ERR__UNSUPPORTED_FEATURE: number, + /** Awaiting cache update (**-164**) */ + ERR__WAIT_CACHE: number, + /** Operation interrupted (**-163**) */ + ERR__INTR: number, + /** Key serialization error (**-162**) */ + ERR__KEY_SERIALIZATION: number, + /** Value serialization error (**-161**) */ + ERR__VALUE_SERIALIZATION: number, + /** Key deserialization error (**-160**) */ + ERR__KEY_DESERIALIZATION: number, + /** Value deserialization error (**-159**) */ + ERR__VALUE_DESERIALIZATION: number, + /** Partial response (**-158**) */ + ERR__PARTIAL: number, + /** Modification attempted on read-only object (**-157**) */ + ERR__READ_ONLY: number, + /** No such entry / item not found (**-156**) */ + ERR__NOENT: number, + /** Read underflow (**-155**) */ + ERR__UNDERFLOW: number, + /** Invalid type (**-154**) */ + ERR__INVALID_TYPE: number, + /** Retry operation (**-153**) */ + ERR__RETRY: number, + /** Purged in queue (**-152**) */ + ERR__PURGE_QUEUE: number, + /** Purged in flight (**-151**) */ + ERR__PURGE_INFLIGHT: number, + /** Fatal error: see RdKafka::Handle::fatal_error() (**-150**) */ + ERR__FATAL: number, + /** Inconsistent state (**-149**) */ + ERR__INCONSISTENT: number, + /** Gap-less ordering would not be guaranteed if proceeding (**-148**) */ + ERR__GAPLESS_GUARANTEE: number, + /** Maximum poll interval exceeded (**-147**) */ + ERR__MAX_POLL_EXCEEDED: number, + /** Unknown broker (**-146**) */ + ERR__UNKNOWN_BROKER: number, + /** Functionality not configured (**-145**) */ + ERR__NOT_CONFIGURED: number, + /** Instance has been fenced (**-144**) */ + ERR__FENCED: number, + /** Application generated error (**-143**) */ + ERR__APPLICATION: number, + /** Assignment lost (**-142**) */ + ERR__ASSIGNMENT_LOST: number, + /** No operation performed (**-141**) */ + ERR__NOOP: number, + /** No offset to automatically reset to (**-140**) */ + ERR__AUTO_OFFSET_RESET: number, + /** Partition log truncation detected (**-139**) */ + ERR__LOG_TRUNCATION: number, + + /** End internal error codes (**-100**) */ + ERR__END: number, + + /* Kafka broker errors: */ + /** Unknown broker error (**-1**) */ + ERR_UNKNOWN: number, + /** Success (**0**) */ + ERR_NO_ERROR: number, + /** Offset out of range (**1**) */ + ERR_OFFSET_OUT_OF_RANGE: number, + /** Invalid message (**2**) */ + ERR_INVALID_MSG: number, + /** Unknown topic or partition (**3**) */ + ERR_UNKNOWN_TOPIC_OR_PART: number, + /** Invalid message size (**4**) */ + ERR_INVALID_MSG_SIZE: number, + /** Leader not available (**5**) */ + ERR_LEADER_NOT_AVAILABLE: number, + /** Not leader for partition (**6**) */ + ERR_NOT_LEADER_FOR_PARTITION: number, + /** Request timed out (**7**) */ + ERR_REQUEST_TIMED_OUT: number, + /** Broker not available (**8**) */ + ERR_BROKER_NOT_AVAILABLE: number, + /** Replica not available (**9**) */ + ERR_REPLICA_NOT_AVAILABLE: number, + /** Message size too large (**10**) */ + ERR_MSG_SIZE_TOO_LARGE: number, + /** StaleControllerEpochCode (**11**) */ + ERR_STALE_CTRL_EPOCH: number, + /** Offset metadata string too large (**12**) */ + ERR_OFFSET_METADATA_TOO_LARGE: number, + /** Broker disconnected before response received (**13**) */ + ERR_NETWORK_EXCEPTION: number, + /** Coordinator load in progress (**14**) */ + ERR_COORDINATOR_LOAD_IN_PROGRESS: number, + /** Group coordinator load in progress (**14**) */ + ERR_GROUP_LOAD_IN_PROGRESS: number, + /** Coordinator not available (**15**) */ + ERR_COORDINATOR_NOT_AVAILABLE: number, + /** Group coordinator not available (**15**) */ + ERR_GROUP_COORDINATOR_NOT_AVAILABLE: number, + /** Not coordinator (**16**) */ + ERR_NOT_COORDINATOR: number, + /** Not coordinator for group (**16**) */ + ERR_NOT_COORDINATOR_FOR_GROUP: number, + /** Invalid topic (**17**) */ + ERR_TOPIC_EXCEPTION: number, + /** Message batch larger than configured server segment size (**18**) */ + ERR_RECORD_LIST_TOO_LARGE: number, + /** Not enough in-sync replicas (**19**) */ + ERR_NOT_ENOUGH_REPLICAS: number, + /** Message(s) written to insufficient number of in-sync replicas (**20**) */ + ERR_NOT_ENOUGH_REPLICAS_AFTER_APPEND: number, + /** Invalid required acks value (**21**) */ + ERR_INVALID_REQUIRED_ACKS: number, + /** Specified group generation id is not valid (**22**) */ + ERR_ILLEGAL_GENERATION: number, + /** Inconsistent group protocol (**23**) */ + ERR_INCONSISTENT_GROUP_PROTOCOL: number, + /** Invalid group.id (**24**) */ + ERR_INVALID_GROUP_ID: number, + /** Unknown member (**25**) */ + ERR_UNKNOWN_MEMBER_ID: number, + /** Invalid session timeout (**26**) */ + ERR_INVALID_SESSION_TIMEOUT: number, + /** Group rebalance in progress (**27**) */ + ERR_REBALANCE_IN_PROGRESS: number, + /** Commit offset data size is not valid (**28**) */ + ERR_INVALID_COMMIT_OFFSET_SIZE: number, + /** Topic authorization failed (**29**) */ + ERR_TOPIC_AUTHORIZATION_FAILED: number, + /** Group authorization failed (**30**) */ + ERR_GROUP_AUTHORIZATION_FAILED: number, + /** Cluster authorization failed (**31**) */ + ERR_CLUSTER_AUTHORIZATION_FAILED: number, + /** Invalid timestamp (**32**) */ + ERR_INVALID_TIMESTAMP: number, + /** Unsupported SASL mechanism (**33**) */ + ERR_UNSUPPORTED_SASL_MECHANISM: number, + /** Illegal SASL state (**34**) */ + ERR_ILLEGAL_SASL_STATE: number, + /** Unuspported version (**35**) */ + ERR_UNSUPPORTED_VERSION: number, + /** Topic already exists (**36**) */ + ERR_TOPIC_ALREADY_EXISTS: number, + /** Invalid number of partitions (**37**) */ + ERR_INVALID_PARTITIONS: number, + /** Invalid replication factor (**38**) */ + ERR_INVALID_REPLICATION_FACTOR: number, + /** Invalid replica assignment (**39**) */ + ERR_INVALID_REPLICA_ASSIGNMENT: number, + /** Invalid config (**40**) */ + ERR_INVALID_CONFIG: number, + /** Not controller for cluster (**41**) */ + ERR_NOT_CONTROLLER: number, + /** Invalid request (**42**) */ + ERR_INVALID_REQUEST: number, + /** Message format on broker does not support request (**43**) */ + ERR_UNSUPPORTED_FOR_MESSAGE_FORMAT: number, + /** Policy violation (**44**) */ + ERR_POLICY_VIOLATION: number, + /** Broker received an out of order sequence number (**45**) */ + ERR_OUT_OF_ORDER_SEQUENCE_NUMBER: number, + /** Broker received a duplicate sequence number (**46**) */ + ERR_DUPLICATE_SEQUENCE_NUMBER: number, + /** Producer attempted an operation with an old epoch (**47**) */ + ERR_INVALID_PRODUCER_EPOCH: number, + /** Producer attempted a transactional operation in an invalid state (**48**) */ + ERR_INVALID_TXN_STATE: number, + /** Producer attempted to use a producer id which is not + * currently assigned to its transactional id (**49**) */ + ERR_INVALID_PRODUCER_ID_MAPPING: number, + /** Transaction timeout is larger than the maximum + * value allowed by the broker's max.transaction.timeout.ms (**50**) */ + ERR_INVALID_TRANSACTION_TIMEOUT: number, + /** Producer attempted to update a transaction while another + * concurrent operation on the same transaction was ongoing (**51**) */ + ERR_CONCURRENT_TRANSACTIONS: number, + /** Indicates that the transaction coordinator sending a + * WriteTxnMarker is no longer the current coordinator for a + * given producer (**52**) */ + ERR_TRANSACTION_COORDINATOR_FENCED: number, + /** Transactional Id authorization failed (**53**) */ + ERR_TRANSACTIONAL_ID_AUTHORIZATION_FAILED: number, + /** Security features are disabled (**54**) */ + ERR_SECURITY_DISABLED: number, + /** Operation not attempted (**55**) */ + ERR_OPERATION_NOT_ATTEMPTED: number, + /** Disk error when trying to access log file on the disk (**56**) */ + ERR_KAFKA_STORAGE_ERROR: number, + /** The user-specified log directory is not found in the broker config (**57**) */ + ERR_LOG_DIR_NOT_FOUND: number, + /** SASL Authentication failed (**58**) */ + ERR_SASL_AUTHENTICATION_FAILED: number, + /** Unknown Producer Id (**59**) */ + ERR_UNKNOWN_PRODUCER_ID: number, + /** Partition reassignment is in progress (**60**) */ + ERR_REASSIGNMENT_IN_PROGRESS: number, + /** Delegation Token feature is not enabled (**61**) */ + ERR_DELEGATION_TOKEN_AUTH_DISABLED: number, + /** Delegation Token is not found on server (**62**) */ + ERR_DELEGATION_TOKEN_NOT_FOUND: number, + /** Specified Principal is not valid Owner/Renewer (**63**) */ + ERR_DELEGATION_TOKEN_OWNER_MISMATCH: number, + /** Delegation Token requests are not allowed on this connection (**64**) */ + ERR_DELEGATION_TOKEN_REQUEST_NOT_ALLOWED: number, + /** Delegation Token authorization failed (**65**) */ + ERR_DELEGATION_TOKEN_AUTHORIZATION_FAILED: number, + /** Delegation Token is expired (**66**) */ + ERR_DELEGATION_TOKEN_EXPIRED: number, + /** Supplied principalType is not supported (**67**) */ + ERR_INVALID_PRINCIPAL_TYPE: number, + /** The group is not empty (**68**) */ + ERR_NON_EMPTY_GROUP: number, + /** The group id does not exist (**69**) */ + ERR_GROUP_ID_NOT_FOUND: number, + /** The fetch session ID was not found (**70**) */ + ERR_FETCH_SESSION_ID_NOT_FOUND: number, + /** The fetch session epoch is invalid (**71**) */ + ERR_INVALID_FETCH_SESSION_EPOCH: number, + /** No matching listener (**72**) */ + ERR_LISTENER_NOT_FOUND: number, + /** Topic deletion is disabled (**73**) */ + ERR_TOPIC_DELETION_DISABLED: number, + /** Leader epoch is older than broker epoch (**74**) */ + ERR_FENCED_LEADER_EPOCH: number, + /** Leader epoch is newer than broker epoch (**75**) */ + ERR_UNKNOWN_LEADER_EPOCH: number, + /** Unsupported compression type (**76**) */ + ERR_UNSUPPORTED_COMPRESSION_TYPE: number, + /** Broker epoch has changed (**77**) */ + ERR_STALE_BROKER_EPOCH: number, + /** Leader high watermark is not caught up (**78**) */ + ERR_OFFSET_NOT_AVAILABLE: number, + /** Group member needs a valid member ID (**79**) */ + ERR_MEMBER_ID_REQUIRED: number, + /** Preferred leader was not available (**80**) */ + ERR_PREFERRED_LEADER_NOT_AVAILABLE: number, + /** Consumer group has reached maximum size (**81**) */ + ERR_GROUP_MAX_SIZE_REACHED: number, + /** Static consumer fenced by other consumer with same + * group.instance.id (**82**) */ + ERR_FENCED_INSTANCE_ID: number, + /** Eligible partition leaders are not available (**83**) */ + ERR_ELIGIBLE_LEADERS_NOT_AVAILABLE: number, + /** Leader election not needed for topic partition (**84**) */ + ERR_ELECTION_NOT_NEEDED: number, + /** No partition reassignment is in progress (**85**) */ + ERR_NO_REASSIGNMENT_IN_PROGRESS: number, + /** Deleting offsets of a topic while the consumer group is + * subscribed to it (**86**) */ + ERR_GROUP_SUBSCRIBED_TO_TOPIC: number, + /** Broker failed to validate record (**87**) */ + ERR_INVALID_RECORD: number, + /** There are unstable offsets that need to be cleared (**88**) */ + ERR_UNSTABLE_OFFSET_COMMIT: number, + /** Throttling quota has been exceeded (**89**) */ + ERR_THROTTLING_QUOTA_EXCEEDED: number, + /** There is a newer producer with the same transactionalId + * which fences the current one (**90**) */ + ERR_PRODUCER_FENCED: number, + /** Request illegally referred to resource that does not exist (**91**) */ + ERR_RESOURCE_NOT_FOUND: number, + /** Request illegally referred to the same resource twice (**92**) */ + ERR_DUPLICATE_RESOURCE: number, + /** Requested credential would not meet criteria for acceptability (**93**) */ + ERR_UNACCEPTABLE_CREDENTIAL: number, + /** Indicates that the either the sender or recipient of a + * voter-only request is not one of the expected voters (**94**) */ + ERR_INCONSISTENT_VOTER_SET: number, + /** Invalid update version (**95**) */ + ERR_INVALID_UPDATE_VERSION: number, + /** Unable to update finalized features due to server error (**96**) */ + ERR_FEATURE_UPDATE_FAILED: number, + /** Request principal deserialization failed during forwarding (**97**) */ + ERR_PRINCIPAL_DESERIALIZATION_FAILURE: number, + } +} \ No newline at end of file diff --git a/lib/error.js b/lib/error.js index 1795dbfe..963ea2bd 100644 --- a/lib/error.js +++ b/lib/error.js @@ -27,7 +27,7 @@ LibrdKafkaError.wrap = errorWrap; * @enum {number} * @constant */ -// ====== Generated from librdkafka 2.5.3 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.6.0 file src-cpp/rdkafkacpp.h ====== LibrdKafkaError.codes = { /* Internal errors to rdkafka: */ @@ -158,8 +158,10 @@ LibrdKafkaError.codes = { ERR__AUTO_OFFSET_RESET: -140, /** Partition log truncation detected */ ERR__LOG_TRUNCATION: -139, + /** End internal error codes */ ERR__END: -100, + /* Kafka broker errors: */ /** Unknown broker error */ ERR_UNKNOWN: -1, @@ -193,15 +195,15 @@ LibrdKafkaError.codes = { ERR_NETWORK_EXCEPTION: 13, /** Coordinator load in progress */ ERR_COORDINATOR_LOAD_IN_PROGRESS: 14, -/** Group coordinator load in progress */ + /** Group coordinator load in progress */ ERR_GROUP_LOAD_IN_PROGRESS: 14, /** Coordinator not available */ ERR_COORDINATOR_NOT_AVAILABLE: 15, -/** Group coordinator not available */ + /** Group coordinator not available */ ERR_GROUP_COORDINATOR_NOT_AVAILABLE: 15, /** Not coordinator */ ERR_NOT_COORDINATOR: 16, -/** Not coordinator for group */ + /** Not coordinator for group */ ERR_NOT_COORDINATOR_FOR_GROUP: 16, /** Invalid topic */ ERR_TOPIC_EXCEPTION: 17, diff --git a/package-lock.json b/package-lock.json index e00129af..380d8e1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v3.1.1", + "version": "v3.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v3.1.1", + "version": "v3.2.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index de25bce7..ed070f9e 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "node-rdkafka", - "version": "v3.1.1", + "version": "v3.2.0", "description": "Node.js bindings for librdkafka", - "librdkafka": "2.5.3", + "librdkafka": "2.6.0", "main": "lib/index.js", "scripts": { "configure": "node-gyp configure", From 236c876f84b7a7b389bec4f16f28cc1e79f19fd2 Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Mon, 2 Dec 2024 09:24:41 -0800 Subject: [PATCH 21/35] Update librdkafka to 2.6.1 (#1107) --- config.d.ts | 2 +- deps/librdkafka | 2 +- errors.d.ts | 696 +++++++++++++++++++++++----------------------- lib/error.js | 8 +- package-lock.json | 4 +- package.json | 4 +- 6 files changed, 357 insertions(+), 359 deletions(-) diff --git a/config.d.ts b/config.d.ts index 493ac807..416d9430 100644 --- a/config.d.ts +++ b/config.d.ts @@ -1,4 +1,4 @@ -// ====== Generated from librdkafka 2.6.0 file CONFIGURATION.md ====== +// ====== Generated from librdkafka 2.6.1 file CONFIGURATION.md ====== // Code that generated this is a derivative work of the code from Nam Nguyen // https://gist.github.com/ntgn81/066c2c8ec5b4238f85d1e9168a04e3fb diff --git a/deps/librdkafka b/deps/librdkafka index 7fc5a598..cb8c19c4 160000 --- a/deps/librdkafka +++ b/deps/librdkafka @@ -1 +1 @@ -Subproject commit 7fc5a59826ee1e1dee3236b1e43180cc22cfb496 +Subproject commit cb8c19c43011b66c4b08b25e5150455a247e1ff3 diff --git a/errors.d.ts b/errors.d.ts index c52b120e..701af2b8 100644 --- a/errors.d.ts +++ b/errors.d.ts @@ -1,351 +1,349 @@ -// ====== Generated from librdkafka 2.6.0 file src-cpp/rdkafkacpp.h ====== -export const CODES: { - ERRORS: { - /* Internal errors to rdkafka: */ - /** Begin internal error codes (**-200**) */ - ERR__BEGIN: number, - /** Received message is incorrect (**-199**) */ - ERR__BAD_MSG: number, - /** Bad/unknown compression (**-198**) */ - ERR__BAD_COMPRESSION: number, - /** Broker is going away (**-197**) */ - ERR__DESTROY: number, - /** Generic failure (**-196**) */ - ERR__FAIL: number, - /** Broker transport failure (**-195**) */ - ERR__TRANSPORT: number, - /** Critical system resource (**-194**) */ - ERR__CRIT_SYS_RESOURCE: number, - /** Failed to resolve broker (**-193**) */ - ERR__RESOLVE: number, - /** Produced message timed out (**-192**) */ - ERR__MSG_TIMED_OUT: number, - /** Reached the end of the topic+partition queue on - * the broker. Not really an error. - * This event is disabled by default, - * see the `enable.partition.eof` configuration property (**-191**) */ - ERR__PARTITION_EOF: number, - /** Permanent: Partition does not exist in cluster (**-190**) */ - ERR__UNKNOWN_PARTITION: number, - /** File or filesystem error (**-189**) */ - ERR__FS: number, - /** Permanent: Topic does not exist in cluster (**-188**) */ - ERR__UNKNOWN_TOPIC: number, - /** All broker connections are down (**-187**) */ - ERR__ALL_BROKERS_DOWN: number, - /** Invalid argument, or invalid configuration (**-186**) */ - ERR__INVALID_ARG: number, - /** Operation timed out (**-185**) */ - ERR__TIMED_OUT: number, - /** Queue is full (**-184**) */ - ERR__QUEUE_FULL: number, - /** ISR count < required.acks (**-183**) */ - ERR__ISR_INSUFF: number, - /** Broker node update (**-182**) */ - ERR__NODE_UPDATE: number, - /** SSL error (**-181**) */ - ERR__SSL: number, - /** Waiting for coordinator to become available (**-180**) */ - ERR__WAIT_COORD: number, - /** Unknown client group (**-179**) */ - ERR__UNKNOWN_GROUP: number, - /** Operation in progress (**-178**) */ - ERR__IN_PROGRESS: number, - /** Previous operation in progress, wait for it to finish (**-177**) */ - ERR__PREV_IN_PROGRESS: number, - /** This operation would interfere with an existing subscription (**-176**) */ - ERR__EXISTING_SUBSCRIPTION: number, - /** Assigned partitions (rebalance_cb) (**-175**) */ - ERR__ASSIGN_PARTITIONS: number, - /** Revoked partitions (rebalance_cb) (**-174**) */ - ERR__REVOKE_PARTITIONS: number, - /** Conflicting use (**-173**) */ - ERR__CONFLICT: number, - /** Wrong state (**-172**) */ - ERR__STATE: number, - /** Unknown protocol (**-171**) */ - ERR__UNKNOWN_PROTOCOL: number, - /** Not implemented (**-170**) */ - ERR__NOT_IMPLEMENTED: number, - /** Authentication failure (**-169**) */ - ERR__AUTHENTICATION: number, - /** No stored offset (**-168**) */ - ERR__NO_OFFSET: number, - /** Outdated (**-167**) */ - ERR__OUTDATED: number, - /** Timed out in queue (**-166**) */ - ERR__TIMED_OUT_QUEUE: number, - /** Feature not supported by broker (**-165**) */ - ERR__UNSUPPORTED_FEATURE: number, - /** Awaiting cache update (**-164**) */ - ERR__WAIT_CACHE: number, - /** Operation interrupted (**-163**) */ - ERR__INTR: number, - /** Key serialization error (**-162**) */ - ERR__KEY_SERIALIZATION: number, - /** Value serialization error (**-161**) */ - ERR__VALUE_SERIALIZATION: number, - /** Key deserialization error (**-160**) */ - ERR__KEY_DESERIALIZATION: number, - /** Value deserialization error (**-159**) */ - ERR__VALUE_DESERIALIZATION: number, - /** Partial response (**-158**) */ - ERR__PARTIAL: number, - /** Modification attempted on read-only object (**-157**) */ - ERR__READ_ONLY: number, - /** No such entry / item not found (**-156**) */ - ERR__NOENT: number, - /** Read underflow (**-155**) */ - ERR__UNDERFLOW: number, - /** Invalid type (**-154**) */ - ERR__INVALID_TYPE: number, - /** Retry operation (**-153**) */ - ERR__RETRY: number, - /** Purged in queue (**-152**) */ - ERR__PURGE_QUEUE: number, - /** Purged in flight (**-151**) */ - ERR__PURGE_INFLIGHT: number, - /** Fatal error: see RdKafka::Handle::fatal_error() (**-150**) */ - ERR__FATAL: number, - /** Inconsistent state (**-149**) */ - ERR__INCONSISTENT: number, - /** Gap-less ordering would not be guaranteed if proceeding (**-148**) */ - ERR__GAPLESS_GUARANTEE: number, - /** Maximum poll interval exceeded (**-147**) */ - ERR__MAX_POLL_EXCEEDED: number, - /** Unknown broker (**-146**) */ - ERR__UNKNOWN_BROKER: number, - /** Functionality not configured (**-145**) */ - ERR__NOT_CONFIGURED: number, - /** Instance has been fenced (**-144**) */ - ERR__FENCED: number, - /** Application generated error (**-143**) */ - ERR__APPLICATION: number, - /** Assignment lost (**-142**) */ - ERR__ASSIGNMENT_LOST: number, - /** No operation performed (**-141**) */ - ERR__NOOP: number, - /** No offset to automatically reset to (**-140**) */ - ERR__AUTO_OFFSET_RESET: number, - /** Partition log truncation detected (**-139**) */ - ERR__LOG_TRUNCATION: number, +// ====== Generated from librdkafka 2.6.1 file src-cpp/rdkafkacpp.h ====== +export const CODES: { ERRORS: { + /* Internal errors to rdkafka: */ + /** Begin internal error codes (**-200**) */ + ERR__BEGIN: number, + /** Received message is incorrect (**-199**) */ + ERR__BAD_MSG: number, + /** Bad/unknown compression (**-198**) */ + ERR__BAD_COMPRESSION: number, + /** Broker is going away (**-197**) */ + ERR__DESTROY: number, + /** Generic failure (**-196**) */ + ERR__FAIL: number, + /** Broker transport failure (**-195**) */ + ERR__TRANSPORT: number, + /** Critical system resource (**-194**) */ + ERR__CRIT_SYS_RESOURCE: number, + /** Failed to resolve broker (**-193**) */ + ERR__RESOLVE: number, + /** Produced message timed out (**-192**) */ + ERR__MSG_TIMED_OUT: number, + /** Reached the end of the topic+partition queue on + * the broker. Not really an error. + * This event is disabled by default, + * see the `enable.partition.eof` configuration property (**-191**) */ + ERR__PARTITION_EOF: number, + /** Permanent: Partition does not exist in cluster (**-190**) */ + ERR__UNKNOWN_PARTITION: number, + /** File or filesystem error (**-189**) */ + ERR__FS: number, + /** Permanent: Topic does not exist in cluster (**-188**) */ + ERR__UNKNOWN_TOPIC: number, + /** All broker connections are down (**-187**) */ + ERR__ALL_BROKERS_DOWN: number, + /** Invalid argument, or invalid configuration (**-186**) */ + ERR__INVALID_ARG: number, + /** Operation timed out (**-185**) */ + ERR__TIMED_OUT: number, + /** Queue is full (**-184**) */ + ERR__QUEUE_FULL: number, + /** ISR count < required.acks (**-183**) */ + ERR__ISR_INSUFF: number, + /** Broker node update (**-182**) */ + ERR__NODE_UPDATE: number, + /** SSL error (**-181**) */ + ERR__SSL: number, + /** Waiting for coordinator to become available (**-180**) */ + ERR__WAIT_COORD: number, + /** Unknown client group (**-179**) */ + ERR__UNKNOWN_GROUP: number, + /** Operation in progress (**-178**) */ + ERR__IN_PROGRESS: number, + /** Previous operation in progress, wait for it to finish (**-177**) */ + ERR__PREV_IN_PROGRESS: number, + /** This operation would interfere with an existing subscription (**-176**) */ + ERR__EXISTING_SUBSCRIPTION: number, + /** Assigned partitions (rebalance_cb) (**-175**) */ + ERR__ASSIGN_PARTITIONS: number, + /** Revoked partitions (rebalance_cb) (**-174**) */ + ERR__REVOKE_PARTITIONS: number, + /** Conflicting use (**-173**) */ + ERR__CONFLICT: number, + /** Wrong state (**-172**) */ + ERR__STATE: number, + /** Unknown protocol (**-171**) */ + ERR__UNKNOWN_PROTOCOL: number, + /** Not implemented (**-170**) */ + ERR__NOT_IMPLEMENTED: number, + /** Authentication failure (**-169**) */ + ERR__AUTHENTICATION: number, + /** No stored offset (**-168**) */ + ERR__NO_OFFSET: number, + /** Outdated (**-167**) */ + ERR__OUTDATED: number, + /** Timed out in queue (**-166**) */ + ERR__TIMED_OUT_QUEUE: number, + /** Feature not supported by broker (**-165**) */ + ERR__UNSUPPORTED_FEATURE: number, + /** Awaiting cache update (**-164**) */ + ERR__WAIT_CACHE: number, + /** Operation interrupted (**-163**) */ + ERR__INTR: number, + /** Key serialization error (**-162**) */ + ERR__KEY_SERIALIZATION: number, + /** Value serialization error (**-161**) */ + ERR__VALUE_SERIALIZATION: number, + /** Key deserialization error (**-160**) */ + ERR__KEY_DESERIALIZATION: number, + /** Value deserialization error (**-159**) */ + ERR__VALUE_DESERIALIZATION: number, + /** Partial response (**-158**) */ + ERR__PARTIAL: number, + /** Modification attempted on read-only object (**-157**) */ + ERR__READ_ONLY: number, + /** No such entry / item not found (**-156**) */ + ERR__NOENT: number, + /** Read underflow (**-155**) */ + ERR__UNDERFLOW: number, + /** Invalid type (**-154**) */ + ERR__INVALID_TYPE: number, + /** Retry operation (**-153**) */ + ERR__RETRY: number, + /** Purged in queue (**-152**) */ + ERR__PURGE_QUEUE: number, + /** Purged in flight (**-151**) */ + ERR__PURGE_INFLIGHT: number, + /** Fatal error: see RdKafka::Handle::fatal_error() (**-150**) */ + ERR__FATAL: number, + /** Inconsistent state (**-149**) */ + ERR__INCONSISTENT: number, + /** Gap-less ordering would not be guaranteed if proceeding (**-148**) */ + ERR__GAPLESS_GUARANTEE: number, + /** Maximum poll interval exceeded (**-147**) */ + ERR__MAX_POLL_EXCEEDED: number, + /** Unknown broker (**-146**) */ + ERR__UNKNOWN_BROKER: number, + /** Functionality not configured (**-145**) */ + ERR__NOT_CONFIGURED: number, + /** Instance has been fenced (**-144**) */ + ERR__FENCED: number, + /** Application generated error (**-143**) */ + ERR__APPLICATION: number, + /** Assignment lost (**-142**) */ + ERR__ASSIGNMENT_LOST: number, + /** No operation performed (**-141**) */ + ERR__NOOP: number, + /** No offset to automatically reset to (**-140**) */ + ERR__AUTO_OFFSET_RESET: number, + /** Partition log truncation detected (**-139**) */ + ERR__LOG_TRUNCATION: number, - /** End internal error codes (**-100**) */ - ERR__END: number, + /** End internal error codes (**-100**) */ + ERR__END: number, - /* Kafka broker errors: */ - /** Unknown broker error (**-1**) */ - ERR_UNKNOWN: number, - /** Success (**0**) */ - ERR_NO_ERROR: number, - /** Offset out of range (**1**) */ - ERR_OFFSET_OUT_OF_RANGE: number, - /** Invalid message (**2**) */ - ERR_INVALID_MSG: number, - /** Unknown topic or partition (**3**) */ - ERR_UNKNOWN_TOPIC_OR_PART: number, - /** Invalid message size (**4**) */ - ERR_INVALID_MSG_SIZE: number, - /** Leader not available (**5**) */ - ERR_LEADER_NOT_AVAILABLE: number, - /** Not leader for partition (**6**) */ - ERR_NOT_LEADER_FOR_PARTITION: number, - /** Request timed out (**7**) */ - ERR_REQUEST_TIMED_OUT: number, - /** Broker not available (**8**) */ - ERR_BROKER_NOT_AVAILABLE: number, - /** Replica not available (**9**) */ - ERR_REPLICA_NOT_AVAILABLE: number, - /** Message size too large (**10**) */ - ERR_MSG_SIZE_TOO_LARGE: number, - /** StaleControllerEpochCode (**11**) */ - ERR_STALE_CTRL_EPOCH: number, - /** Offset metadata string too large (**12**) */ - ERR_OFFSET_METADATA_TOO_LARGE: number, - /** Broker disconnected before response received (**13**) */ - ERR_NETWORK_EXCEPTION: number, - /** Coordinator load in progress (**14**) */ - ERR_COORDINATOR_LOAD_IN_PROGRESS: number, - /** Group coordinator load in progress (**14**) */ - ERR_GROUP_LOAD_IN_PROGRESS: number, - /** Coordinator not available (**15**) */ - ERR_COORDINATOR_NOT_AVAILABLE: number, - /** Group coordinator not available (**15**) */ - ERR_GROUP_COORDINATOR_NOT_AVAILABLE: number, - /** Not coordinator (**16**) */ - ERR_NOT_COORDINATOR: number, - /** Not coordinator for group (**16**) */ - ERR_NOT_COORDINATOR_FOR_GROUP: number, - /** Invalid topic (**17**) */ - ERR_TOPIC_EXCEPTION: number, - /** Message batch larger than configured server segment size (**18**) */ - ERR_RECORD_LIST_TOO_LARGE: number, - /** Not enough in-sync replicas (**19**) */ - ERR_NOT_ENOUGH_REPLICAS: number, - /** Message(s) written to insufficient number of in-sync replicas (**20**) */ - ERR_NOT_ENOUGH_REPLICAS_AFTER_APPEND: number, - /** Invalid required acks value (**21**) */ - ERR_INVALID_REQUIRED_ACKS: number, - /** Specified group generation id is not valid (**22**) */ - ERR_ILLEGAL_GENERATION: number, - /** Inconsistent group protocol (**23**) */ - ERR_INCONSISTENT_GROUP_PROTOCOL: number, - /** Invalid group.id (**24**) */ - ERR_INVALID_GROUP_ID: number, - /** Unknown member (**25**) */ - ERR_UNKNOWN_MEMBER_ID: number, - /** Invalid session timeout (**26**) */ - ERR_INVALID_SESSION_TIMEOUT: number, - /** Group rebalance in progress (**27**) */ - ERR_REBALANCE_IN_PROGRESS: number, - /** Commit offset data size is not valid (**28**) */ - ERR_INVALID_COMMIT_OFFSET_SIZE: number, - /** Topic authorization failed (**29**) */ - ERR_TOPIC_AUTHORIZATION_FAILED: number, - /** Group authorization failed (**30**) */ - ERR_GROUP_AUTHORIZATION_FAILED: number, - /** Cluster authorization failed (**31**) */ - ERR_CLUSTER_AUTHORIZATION_FAILED: number, - /** Invalid timestamp (**32**) */ - ERR_INVALID_TIMESTAMP: number, - /** Unsupported SASL mechanism (**33**) */ - ERR_UNSUPPORTED_SASL_MECHANISM: number, - /** Illegal SASL state (**34**) */ - ERR_ILLEGAL_SASL_STATE: number, - /** Unuspported version (**35**) */ - ERR_UNSUPPORTED_VERSION: number, - /** Topic already exists (**36**) */ - ERR_TOPIC_ALREADY_EXISTS: number, - /** Invalid number of partitions (**37**) */ - ERR_INVALID_PARTITIONS: number, - /** Invalid replication factor (**38**) */ - ERR_INVALID_REPLICATION_FACTOR: number, - /** Invalid replica assignment (**39**) */ - ERR_INVALID_REPLICA_ASSIGNMENT: number, - /** Invalid config (**40**) */ - ERR_INVALID_CONFIG: number, - /** Not controller for cluster (**41**) */ - ERR_NOT_CONTROLLER: number, - /** Invalid request (**42**) */ - ERR_INVALID_REQUEST: number, - /** Message format on broker does not support request (**43**) */ - ERR_UNSUPPORTED_FOR_MESSAGE_FORMAT: number, - /** Policy violation (**44**) */ - ERR_POLICY_VIOLATION: number, - /** Broker received an out of order sequence number (**45**) */ - ERR_OUT_OF_ORDER_SEQUENCE_NUMBER: number, - /** Broker received a duplicate sequence number (**46**) */ - ERR_DUPLICATE_SEQUENCE_NUMBER: number, - /** Producer attempted an operation with an old epoch (**47**) */ - ERR_INVALID_PRODUCER_EPOCH: number, - /** Producer attempted a transactional operation in an invalid state (**48**) */ - ERR_INVALID_TXN_STATE: number, - /** Producer attempted to use a producer id which is not - * currently assigned to its transactional id (**49**) */ - ERR_INVALID_PRODUCER_ID_MAPPING: number, - /** Transaction timeout is larger than the maximum - * value allowed by the broker's max.transaction.timeout.ms (**50**) */ - ERR_INVALID_TRANSACTION_TIMEOUT: number, - /** Producer attempted to update a transaction while another - * concurrent operation on the same transaction was ongoing (**51**) */ - ERR_CONCURRENT_TRANSACTIONS: number, - /** Indicates that the transaction coordinator sending a - * WriteTxnMarker is no longer the current coordinator for a - * given producer (**52**) */ - ERR_TRANSACTION_COORDINATOR_FENCED: number, - /** Transactional Id authorization failed (**53**) */ - ERR_TRANSACTIONAL_ID_AUTHORIZATION_FAILED: number, - /** Security features are disabled (**54**) */ - ERR_SECURITY_DISABLED: number, - /** Operation not attempted (**55**) */ - ERR_OPERATION_NOT_ATTEMPTED: number, - /** Disk error when trying to access log file on the disk (**56**) */ - ERR_KAFKA_STORAGE_ERROR: number, - /** The user-specified log directory is not found in the broker config (**57**) */ - ERR_LOG_DIR_NOT_FOUND: number, - /** SASL Authentication failed (**58**) */ - ERR_SASL_AUTHENTICATION_FAILED: number, - /** Unknown Producer Id (**59**) */ - ERR_UNKNOWN_PRODUCER_ID: number, - /** Partition reassignment is in progress (**60**) */ - ERR_REASSIGNMENT_IN_PROGRESS: number, - /** Delegation Token feature is not enabled (**61**) */ - ERR_DELEGATION_TOKEN_AUTH_DISABLED: number, - /** Delegation Token is not found on server (**62**) */ - ERR_DELEGATION_TOKEN_NOT_FOUND: number, - /** Specified Principal is not valid Owner/Renewer (**63**) */ - ERR_DELEGATION_TOKEN_OWNER_MISMATCH: number, - /** Delegation Token requests are not allowed on this connection (**64**) */ - ERR_DELEGATION_TOKEN_REQUEST_NOT_ALLOWED: number, - /** Delegation Token authorization failed (**65**) */ - ERR_DELEGATION_TOKEN_AUTHORIZATION_FAILED: number, - /** Delegation Token is expired (**66**) */ - ERR_DELEGATION_TOKEN_EXPIRED: number, - /** Supplied principalType is not supported (**67**) */ - ERR_INVALID_PRINCIPAL_TYPE: number, - /** The group is not empty (**68**) */ - ERR_NON_EMPTY_GROUP: number, - /** The group id does not exist (**69**) */ - ERR_GROUP_ID_NOT_FOUND: number, - /** The fetch session ID was not found (**70**) */ - ERR_FETCH_SESSION_ID_NOT_FOUND: number, - /** The fetch session epoch is invalid (**71**) */ - ERR_INVALID_FETCH_SESSION_EPOCH: number, - /** No matching listener (**72**) */ - ERR_LISTENER_NOT_FOUND: number, - /** Topic deletion is disabled (**73**) */ - ERR_TOPIC_DELETION_DISABLED: number, - /** Leader epoch is older than broker epoch (**74**) */ - ERR_FENCED_LEADER_EPOCH: number, - /** Leader epoch is newer than broker epoch (**75**) */ - ERR_UNKNOWN_LEADER_EPOCH: number, - /** Unsupported compression type (**76**) */ - ERR_UNSUPPORTED_COMPRESSION_TYPE: number, - /** Broker epoch has changed (**77**) */ - ERR_STALE_BROKER_EPOCH: number, - /** Leader high watermark is not caught up (**78**) */ - ERR_OFFSET_NOT_AVAILABLE: number, - /** Group member needs a valid member ID (**79**) */ - ERR_MEMBER_ID_REQUIRED: number, - /** Preferred leader was not available (**80**) */ - ERR_PREFERRED_LEADER_NOT_AVAILABLE: number, - /** Consumer group has reached maximum size (**81**) */ - ERR_GROUP_MAX_SIZE_REACHED: number, - /** Static consumer fenced by other consumer with same - * group.instance.id (**82**) */ - ERR_FENCED_INSTANCE_ID: number, - /** Eligible partition leaders are not available (**83**) */ - ERR_ELIGIBLE_LEADERS_NOT_AVAILABLE: number, - /** Leader election not needed for topic partition (**84**) */ - ERR_ELECTION_NOT_NEEDED: number, - /** No partition reassignment is in progress (**85**) */ - ERR_NO_REASSIGNMENT_IN_PROGRESS: number, - /** Deleting offsets of a topic while the consumer group is - * subscribed to it (**86**) */ - ERR_GROUP_SUBSCRIBED_TO_TOPIC: number, - /** Broker failed to validate record (**87**) */ - ERR_INVALID_RECORD: number, - /** There are unstable offsets that need to be cleared (**88**) */ - ERR_UNSTABLE_OFFSET_COMMIT: number, - /** Throttling quota has been exceeded (**89**) */ - ERR_THROTTLING_QUOTA_EXCEEDED: number, - /** There is a newer producer with the same transactionalId - * which fences the current one (**90**) */ - ERR_PRODUCER_FENCED: number, - /** Request illegally referred to resource that does not exist (**91**) */ - ERR_RESOURCE_NOT_FOUND: number, - /** Request illegally referred to the same resource twice (**92**) */ - ERR_DUPLICATE_RESOURCE: number, - /** Requested credential would not meet criteria for acceptability (**93**) */ - ERR_UNACCEPTABLE_CREDENTIAL: number, - /** Indicates that the either the sender or recipient of a - * voter-only request is not one of the expected voters (**94**) */ - ERR_INCONSISTENT_VOTER_SET: number, - /** Invalid update version (**95**) */ - ERR_INVALID_UPDATE_VERSION: number, - /** Unable to update finalized features due to server error (**96**) */ - ERR_FEATURE_UPDATE_FAILED: number, - /** Request principal deserialization failed during forwarding (**97**) */ - ERR_PRINCIPAL_DESERIALIZATION_FAILURE: number, - } -} \ No newline at end of file + /* Kafka broker errors: */ + /** Unknown broker error (**-1**) */ + ERR_UNKNOWN: number, + /** Success (**0**) */ + ERR_NO_ERROR: number, + /** Offset out of range (**1**) */ + ERR_OFFSET_OUT_OF_RANGE: number, + /** Invalid message (**2**) */ + ERR_INVALID_MSG: number, + /** Unknown topic or partition (**3**) */ + ERR_UNKNOWN_TOPIC_OR_PART: number, + /** Invalid message size (**4**) */ + ERR_INVALID_MSG_SIZE: number, + /** Leader not available (**5**) */ + ERR_LEADER_NOT_AVAILABLE: number, + /** Not leader for partition (**6**) */ + ERR_NOT_LEADER_FOR_PARTITION: number, + /** Request timed out (**7**) */ + ERR_REQUEST_TIMED_OUT: number, + /** Broker not available (**8**) */ + ERR_BROKER_NOT_AVAILABLE: number, + /** Replica not available (**9**) */ + ERR_REPLICA_NOT_AVAILABLE: number, + /** Message size too large (**10**) */ + ERR_MSG_SIZE_TOO_LARGE: number, + /** StaleControllerEpochCode (**11**) */ + ERR_STALE_CTRL_EPOCH: number, + /** Offset metadata string too large (**12**) */ + ERR_OFFSET_METADATA_TOO_LARGE: number, + /** Broker disconnected before response received (**13**) */ + ERR_NETWORK_EXCEPTION: number, + /** Coordinator load in progress (**14**) */ + ERR_COORDINATOR_LOAD_IN_PROGRESS: number, +/** Group coordinator load in progress (**14**) */ + ERR_GROUP_LOAD_IN_PROGRESS: number, + /** Coordinator not available (**15**) */ + ERR_COORDINATOR_NOT_AVAILABLE: number, +/** Group coordinator not available (**15**) */ + ERR_GROUP_COORDINATOR_NOT_AVAILABLE: number, + /** Not coordinator (**16**) */ + ERR_NOT_COORDINATOR: number, +/** Not coordinator for group (**16**) */ + ERR_NOT_COORDINATOR_FOR_GROUP: number, + /** Invalid topic (**17**) */ + ERR_TOPIC_EXCEPTION: number, + /** Message batch larger than configured server segment size (**18**) */ + ERR_RECORD_LIST_TOO_LARGE: number, + /** Not enough in-sync replicas (**19**) */ + ERR_NOT_ENOUGH_REPLICAS: number, + /** Message(s) written to insufficient number of in-sync replicas (**20**) */ + ERR_NOT_ENOUGH_REPLICAS_AFTER_APPEND: number, + /** Invalid required acks value (**21**) */ + ERR_INVALID_REQUIRED_ACKS: number, + /** Specified group generation id is not valid (**22**) */ + ERR_ILLEGAL_GENERATION: number, + /** Inconsistent group protocol (**23**) */ + ERR_INCONSISTENT_GROUP_PROTOCOL: number, + /** Invalid group.id (**24**) */ + ERR_INVALID_GROUP_ID: number, + /** Unknown member (**25**) */ + ERR_UNKNOWN_MEMBER_ID: number, + /** Invalid session timeout (**26**) */ + ERR_INVALID_SESSION_TIMEOUT: number, + /** Group rebalance in progress (**27**) */ + ERR_REBALANCE_IN_PROGRESS: number, + /** Commit offset data size is not valid (**28**) */ + ERR_INVALID_COMMIT_OFFSET_SIZE: number, + /** Topic authorization failed (**29**) */ + ERR_TOPIC_AUTHORIZATION_FAILED: number, + /** Group authorization failed (**30**) */ + ERR_GROUP_AUTHORIZATION_FAILED: number, + /** Cluster authorization failed (**31**) */ + ERR_CLUSTER_AUTHORIZATION_FAILED: number, + /** Invalid timestamp (**32**) */ + ERR_INVALID_TIMESTAMP: number, + /** Unsupported SASL mechanism (**33**) */ + ERR_UNSUPPORTED_SASL_MECHANISM: number, + /** Illegal SASL state (**34**) */ + ERR_ILLEGAL_SASL_STATE: number, + /** Unuspported version (**35**) */ + ERR_UNSUPPORTED_VERSION: number, + /** Topic already exists (**36**) */ + ERR_TOPIC_ALREADY_EXISTS: number, + /** Invalid number of partitions (**37**) */ + ERR_INVALID_PARTITIONS: number, + /** Invalid replication factor (**38**) */ + ERR_INVALID_REPLICATION_FACTOR: number, + /** Invalid replica assignment (**39**) */ + ERR_INVALID_REPLICA_ASSIGNMENT: number, + /** Invalid config (**40**) */ + ERR_INVALID_CONFIG: number, + /** Not controller for cluster (**41**) */ + ERR_NOT_CONTROLLER: number, + /** Invalid request (**42**) */ + ERR_INVALID_REQUEST: number, + /** Message format on broker does not support request (**43**) */ + ERR_UNSUPPORTED_FOR_MESSAGE_FORMAT: number, + /** Policy violation (**44**) */ + ERR_POLICY_VIOLATION: number, + /** Broker received an out of order sequence number (**45**) */ + ERR_OUT_OF_ORDER_SEQUENCE_NUMBER: number, + /** Broker received a duplicate sequence number (**46**) */ + ERR_DUPLICATE_SEQUENCE_NUMBER: number, + /** Producer attempted an operation with an old epoch (**47**) */ + ERR_INVALID_PRODUCER_EPOCH: number, + /** Producer attempted a transactional operation in an invalid state (**48**) */ + ERR_INVALID_TXN_STATE: number, + /** Producer attempted to use a producer id which is not + * currently assigned to its transactional id (**49**) */ + ERR_INVALID_PRODUCER_ID_MAPPING: number, + /** Transaction timeout is larger than the maximum + * value allowed by the broker's max.transaction.timeout.ms (**50**) */ + ERR_INVALID_TRANSACTION_TIMEOUT: number, + /** Producer attempted to update a transaction while another + * concurrent operation on the same transaction was ongoing (**51**) */ + ERR_CONCURRENT_TRANSACTIONS: number, + /** Indicates that the transaction coordinator sending a + * WriteTxnMarker is no longer the current coordinator for a + * given producer (**52**) */ + ERR_TRANSACTION_COORDINATOR_FENCED: number, + /** Transactional Id authorization failed (**53**) */ + ERR_TRANSACTIONAL_ID_AUTHORIZATION_FAILED: number, + /** Security features are disabled (**54**) */ + ERR_SECURITY_DISABLED: number, + /** Operation not attempted (**55**) */ + ERR_OPERATION_NOT_ATTEMPTED: number, + /** Disk error when trying to access log file on the disk (**56**) */ + ERR_KAFKA_STORAGE_ERROR: number, + /** The user-specified log directory is not found in the broker config (**57**) */ + ERR_LOG_DIR_NOT_FOUND: number, + /** SASL Authentication failed (**58**) */ + ERR_SASL_AUTHENTICATION_FAILED: number, + /** Unknown Producer Id (**59**) */ + ERR_UNKNOWN_PRODUCER_ID: number, + /** Partition reassignment is in progress (**60**) */ + ERR_REASSIGNMENT_IN_PROGRESS: number, + /** Delegation Token feature is not enabled (**61**) */ + ERR_DELEGATION_TOKEN_AUTH_DISABLED: number, + /** Delegation Token is not found on server (**62**) */ + ERR_DELEGATION_TOKEN_NOT_FOUND: number, + /** Specified Principal is not valid Owner/Renewer (**63**) */ + ERR_DELEGATION_TOKEN_OWNER_MISMATCH: number, + /** Delegation Token requests are not allowed on this connection (**64**) */ + ERR_DELEGATION_TOKEN_REQUEST_NOT_ALLOWED: number, + /** Delegation Token authorization failed (**65**) */ + ERR_DELEGATION_TOKEN_AUTHORIZATION_FAILED: number, + /** Delegation Token is expired (**66**) */ + ERR_DELEGATION_TOKEN_EXPIRED: number, + /** Supplied principalType is not supported (**67**) */ + ERR_INVALID_PRINCIPAL_TYPE: number, + /** The group is not empty (**68**) */ + ERR_NON_EMPTY_GROUP: number, + /** The group id does not exist (**69**) */ + ERR_GROUP_ID_NOT_FOUND: number, + /** The fetch session ID was not found (**70**) */ + ERR_FETCH_SESSION_ID_NOT_FOUND: number, + /** The fetch session epoch is invalid (**71**) */ + ERR_INVALID_FETCH_SESSION_EPOCH: number, + /** No matching listener (**72**) */ + ERR_LISTENER_NOT_FOUND: number, + /** Topic deletion is disabled (**73**) */ + ERR_TOPIC_DELETION_DISABLED: number, + /** Leader epoch is older than broker epoch (**74**) */ + ERR_FENCED_LEADER_EPOCH: number, + /** Leader epoch is newer than broker epoch (**75**) */ + ERR_UNKNOWN_LEADER_EPOCH: number, + /** Unsupported compression type (**76**) */ + ERR_UNSUPPORTED_COMPRESSION_TYPE: number, + /** Broker epoch has changed (**77**) */ + ERR_STALE_BROKER_EPOCH: number, + /** Leader high watermark is not caught up (**78**) */ + ERR_OFFSET_NOT_AVAILABLE: number, + /** Group member needs a valid member ID (**79**) */ + ERR_MEMBER_ID_REQUIRED: number, + /** Preferred leader was not available (**80**) */ + ERR_PREFERRED_LEADER_NOT_AVAILABLE: number, + /** Consumer group has reached maximum size (**81**) */ + ERR_GROUP_MAX_SIZE_REACHED: number, + /** Static consumer fenced by other consumer with same + * group.instance.id (**82**) */ + ERR_FENCED_INSTANCE_ID: number, + /** Eligible partition leaders are not available (**83**) */ + ERR_ELIGIBLE_LEADERS_NOT_AVAILABLE: number, + /** Leader election not needed for topic partition (**84**) */ + ERR_ELECTION_NOT_NEEDED: number, + /** No partition reassignment is in progress (**85**) */ + ERR_NO_REASSIGNMENT_IN_PROGRESS: number, + /** Deleting offsets of a topic while the consumer group is + * subscribed to it (**86**) */ + ERR_GROUP_SUBSCRIBED_TO_TOPIC: number, + /** Broker failed to validate record (**87**) */ + ERR_INVALID_RECORD: number, + /** There are unstable offsets that need to be cleared (**88**) */ + ERR_UNSTABLE_OFFSET_COMMIT: number, + /** Throttling quota has been exceeded (**89**) */ + ERR_THROTTLING_QUOTA_EXCEEDED: number, + /** There is a newer producer with the same transactionalId + * which fences the current one (**90**) */ + ERR_PRODUCER_FENCED: number, + /** Request illegally referred to resource that does not exist (**91**) */ + ERR_RESOURCE_NOT_FOUND: number, + /** Request illegally referred to the same resource twice (**92**) */ + ERR_DUPLICATE_RESOURCE: number, + /** Requested credential would not meet criteria for acceptability (**93**) */ + ERR_UNACCEPTABLE_CREDENTIAL: number, + /** Indicates that the either the sender or recipient of a + * voter-only request is not one of the expected voters (**94**) */ + ERR_INCONSISTENT_VOTER_SET: number, + /** Invalid update version (**95**) */ + ERR_INVALID_UPDATE_VERSION: number, + /** Unable to update finalized features due to server error (**96**) */ + ERR_FEATURE_UPDATE_FAILED: number, + /** Request principal deserialization failed during forwarding (**97**) */ + ERR_PRINCIPAL_DESERIALIZATION_FAILURE: number, +}} \ No newline at end of file diff --git a/lib/error.js b/lib/error.js index 963ea2bd..71982718 100644 --- a/lib/error.js +++ b/lib/error.js @@ -27,7 +27,7 @@ LibrdKafkaError.wrap = errorWrap; * @enum {number} * @constant */ -// ====== Generated from librdkafka 2.6.0 file src-cpp/rdkafkacpp.h ====== +// ====== Generated from librdkafka 2.6.1 file src-cpp/rdkafkacpp.h ====== LibrdKafkaError.codes = { /* Internal errors to rdkafka: */ @@ -195,15 +195,15 @@ LibrdKafkaError.codes = { ERR_NETWORK_EXCEPTION: 13, /** Coordinator load in progress */ ERR_COORDINATOR_LOAD_IN_PROGRESS: 14, - /** Group coordinator load in progress */ +/** Group coordinator load in progress */ ERR_GROUP_LOAD_IN_PROGRESS: 14, /** Coordinator not available */ ERR_COORDINATOR_NOT_AVAILABLE: 15, - /** Group coordinator not available */ +/** Group coordinator not available */ ERR_GROUP_COORDINATOR_NOT_AVAILABLE: 15, /** Not coordinator */ ERR_NOT_COORDINATOR: 16, - /** Not coordinator for group */ +/** Not coordinator for group */ ERR_NOT_COORDINATOR_FOR_GROUP: 16, /** Invalid topic */ ERR_TOPIC_EXCEPTION: 17, diff --git a/package-lock.json b/package-lock.json index 380d8e1a..83b8eabe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-rdkafka", - "version": "v3.2.0", + "version": "v3.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-rdkafka", - "version": "v3.2.0", + "version": "v3.2.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index ed070f9e..21b7096c 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "node-rdkafka", - "version": "v3.2.0", + "version": "v3.2.1", "description": "Node.js bindings for librdkafka", - "librdkafka": "2.6.0", + "librdkafka": "2.6.1", "main": "lib/index.js", "scripts": { "configure": "node-gyp configure", From a950a56a43d679176209b43ed3e5817d0c1097ac Mon Sep 17 00:00:00 2001 From: Gary Wilber <41303831+GaryWilber@users.noreply.github.com> Date: Mon, 2 Dec 2024 09:45:48 -0800 Subject: [PATCH 22/35] Update librdkafka version in readme (#1108) --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b87ec438..e6af1fc9 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ I am looking for *your* help to make this project even better! If you're interes The `node-rdkafka` library is a high-performance NodeJS client for [Apache Kafka](http://kafka.apache.org/) that wraps the native [librdkafka](https://github.com/edenhill/librdkafka) library. All the complexity of balancing writes across partitions and managing (possibly ever-changing) brokers should be encapsulated in the library. -__This library currently uses `librdkafka` version `2.6.0`.__ +__This library currently uses `librdkafka` version `2.6.1`.__ ## Reference Docs @@ -60,7 +60,7 @@ Using Alpine Linux? Check out the [docs](https://github.com/Blizzard/node-rdkafk ### Windows -Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.6.0.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. +Windows build **is not** compiled from `librdkafka` source but it is rather linked against the appropriate version of [NuGet librdkafka.redist](https://www.nuget.org/packages/librdkafka.redist/) static binary that gets downloaded from `https://globalcdn.nuget.org/packages/librdkafka.redist.2.6.1.nupkg` during installation. This download link can be changed using the environment variable `NODE_RDKAFKA_NUGET_BASE_URL` that defaults to `https://globalcdn.nuget.org/packages/` when it's no set. Requirements: * [node-gyp for Windows](https://github.com/nodejs/node-gyp#on-windows) @@ -97,7 +97,7 @@ const Kafka = require('node-rdkafka'); ## Configuration -You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.6.0/CONFIGURATION.md) +You can pass many configuration options to `librdkafka`. A full list can be found in `librdkafka`'s [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.6.1/CONFIGURATION.md) Configuration keys that have the suffix `_cb` are designated as callbacks. Some of these keys are informational and you can choose to opt-in (for example, `dr_cb`). Others are callbacks designed to @@ -132,7 +132,7 @@ You can also get the version of `librdkafka` const Kafka = require('node-rdkafka'); console.log(Kafka.librdkafkaVersion); -// #=> 2.6.0 +// #=> 2.6.1 ``` ## Sending Messages @@ -145,7 +145,7 @@ const producer = new Kafka.Producer({ }); ``` -A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.6.0/CONFIGURATION.md) file described previously. +A `Producer` requires only `metadata.broker.list` (the Kafka brokers) to be created. The values in this list are separated by commas. For other configuration options, see the [Configuration.md](https://github.com/edenhill/librdkafka/blob/v2.6.1/CONFIGURATION.md) file described previously. The following example illustrates a list with several `librdkafka` options set. From a0ee4af072518547f5652b9994895a49fad2f3cc Mon Sep 17 00:00:00 2001 From: AVVS Date: Fri, 24 Jan 2025 17:33:55 -0800 Subject: [PATCH 23/35] chore: update build scripts --- .semaphore/semaphore.yml | 11 +++++------ package.json | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml index 0b899d6d..f7c85e75 100644 --- a/.semaphore/semaphore.yml +++ b/.semaphore/semaphore.yml @@ -8,16 +8,15 @@ agent: global_job_config: prologue: commands: - - sem-version node 20 - - curl -fsSL https://get.pnpm.io/install.sh | env PNPM_VERSION=8.10.2 sh - - - source /home/semaphore/.bashrc - - pnpm config set store-dir=~/.pnpm-store + - sem-version node --lts + - corepack enable + - corepack install --global pnpm@9.x - checkout - git submodule init - git submodule update - cache restore node-$(checksum pnpm-lock.yaml) - pnpm i --frozen-lockfile --prefer-offline --ignore-scripts - - cache store node-$(checksum pnpm-lock.yaml) $(pnpm config get store-dir) + - cache store node-$(checksum pnpm-lock.yaml) $(pnpm store path) env_vars: - name: BUILD_LIBRDKAFKA value: '0' @@ -45,7 +44,7 @@ blocks: - name: pre-build & publish binaries matrix: - env_var: NODE_VER - values: ["18", "20", "21"] + values: ["22", "23"] - env_var: platform values: ["-rdkafka", "-debian-rdkafka"] commands: diff --git a/package.json b/package.json index da6c5a8b..a6c4eba6 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,6 @@ "nan": "^2.18.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=20.10.0" } } From 0a286b9cebdadd064e35b5bad44d4f8f0d4b4ae0 Mon Sep 17 00:00:00 2001 From: AVVS Date: Fri, 24 Jan 2025 19:05:27 -0800 Subject: [PATCH 24/35] chore: pnpm store path --- ci/build-and-publish.sh | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/build-and-publish.sh b/ci/build-and-publish.sh index 13244685..8e77e2e0 100755 --- a/ci/build-and-publish.sh +++ b/ci/build-and-publish.sh @@ -14,7 +14,7 @@ set -ex if [ x"$CI" = x"true" ]; then cp ~/.env.aws-s3-credentials .env fi -env IMAGE_TAG=${NODE_VER}${platform} UID=${UID} PNPM_STORE="$(pnpm config get store-dir)" docker-compose up -d +env IMAGE_TAG=${NODE_VER}${platform} UID=${UID} PNPM_STORE="$(pnpm store path)" docker-compose up -d env UID=${UID} docker-compose exec -u ${UID} tester pnpm i --frozen-lockfile --prefer-offline --ignore-scripts env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:build env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:package diff --git a/docker-compose.yml b/docker-compose.yml index ba7c42c2..df05db91 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,7 +33,7 @@ services: KAFKA_HEAP_OPTS: "-Xmx512m -Xms512m" tester: - image: makeomatic/node:${IMAGE_TAG:-16-rdkafka-tester} + image: makeomatic/node:${IMAGE_TAG:-22-rdkafka-tester} volumes: - ${PWD}:/src - ${PWD}/ci/npmrc:/usr/local/etc/npmrc:ro From 64b399c02aafc1b921a521690d2a454b525b7827 Mon Sep 17 00:00:00 2001 From: AVVS Date: Fri, 24 Jan 2025 19:13:49 -0800 Subject: [PATCH 25/35] chore: another pnpm store path --- ci/semantic-release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/semantic-release.sh b/ci/semantic-release.sh index 42ce493b..7311e917 100755 --- a/ci/semantic-release.sh +++ b/ci/semantic-release.sh @@ -4,7 +4,7 @@ set -ex if git log --oneline -n 1 | grep -v "chore(release)" > /dev/null; then touch .env - env UID=${UID} PNPM_STORE=$(pnpm config get store-dir) docker-compose --profile tests up -d + env UID=${UID} PNPM_STORE=$(pnpm store path) docker-compose --profile tests up -d docker-compose exec tester pnpm i docker-compose exec tester pnpm binary:build docker-compose exec tester pnpm test From d81c563e1cac849d5badfd75e3740050642ec968 Mon Sep 17 00:00:00 2001 From: AVVS Date: Fri, 24 Jan 2025 21:37:15 -0800 Subject: [PATCH 26/35] chore: rebuild rdkafka --- .semaphore/semaphore.yml | 2 +- docker-compose.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml index f7c85e75..3da1ac98 100644 --- a/.semaphore/semaphore.yml +++ b/.semaphore/semaphore.yml @@ -19,7 +19,7 @@ global_job_config: - cache store node-$(checksum pnpm-lock.yaml) $(pnpm store path) env_vars: - name: BUILD_LIBRDKAFKA - value: '0' + value: '1' blocks: - name: verify diff --git a/docker-compose.yml b/docker-compose.yml index df05db91..9ba2e6d0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,6 +43,7 @@ services: env_file: - .env environment: + - BUILD_RDKAFKA=1 - UV_THREADPOOL_SIZE=16 - CI=true - UID=${UID:-1000} From 14985cea720193ac43d01196a7b2c2876fdbc104 Mon Sep 17 00:00:00 2001 From: AVVS Date: Sun, 26 Jan 2025 00:16:35 -0800 Subject: [PATCH 27/35] fix: update dependencies, fix deprecations --- CONTRIBUTING.md | 2 +- ci/build-and-publish.sh | 2 +- ci/semantic-release.sh | 8 ++-- docker-compose.yml | 4 +- e2e/both.spec.js | 4 +- e2e/consumer.spec.js | 16 ++++---- e2e/groups.spec.js | 7 ++-- lib/client.js | 58 +++++++++++++++------------ lib/error.js | 4 +- lib/kafka-consumer.js | 10 +++-- src/kafka-consumer.cc | 2 +- src/kafka-consumer.h | 2 +- src/workers.cc | 88 ++++++++++++++++++++--------------------- src/workers.h | 6 +-- 14 files changed, 112 insertions(+), 101 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 643444e1..8ec62f7c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -173,7 +173,7 @@ I began using Visual Studio code to develop on `node-rdkafka`. If you use it you ], "defines": [], "macFrameworkPath": [ - "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks" + "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" ], "compilerPath": "/usr/bin/clang", "cStandard": "c11", diff --git a/ci/build-and-publish.sh b/ci/build-and-publish.sh index 8e77e2e0..ad437de4 100755 --- a/ci/build-and-publish.sh +++ b/ci/build-and-publish.sh @@ -15,7 +15,7 @@ if [ x"$CI" = x"true" ]; then cp ~/.env.aws-s3-credentials .env fi env IMAGE_TAG=${NODE_VER}${platform} UID=${UID} PNPM_STORE="$(pnpm store path)" docker-compose up -d -env UID=${UID} docker-compose exec -u ${UID} tester pnpm i --frozen-lockfile --prefer-offline --ignore-scripts +env UID=${UID} docker-compose exec -u ${UID} tester pnpm i --frozen-lockfile --offline --ignore-scripts env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:build env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:package env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:test diff --git a/ci/semantic-release.sh b/ci/semantic-release.sh index 7311e917..217c0393 100755 --- a/ci/semantic-release.sh +++ b/ci/semantic-release.sh @@ -5,10 +5,10 @@ set -ex if git log --oneline -n 1 | grep -v "chore(release)" > /dev/null; then touch .env env UID=${UID} PNPM_STORE=$(pnpm store path) docker-compose --profile tests up -d - docker-compose exec tester pnpm i - docker-compose exec tester pnpm binary:build - docker-compose exec tester pnpm test - docker-compose exec tester pnpm test:e2e + env UID=${UID} docker-compose exec -u ${UID} tester pnpm i --frozen-lockfile --offline --ignore-scripts + env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:build + env UID=${UID} docker-compose exec -u ${UID} tester pnpm test + env UID=${UID} docker-compose exec -u ${UID} tester pnpm test:e2e pnpm semantic-release else echo "skipped commit: `git log --oneline -n 1`" diff --git a/docker-compose.yml b/docker-compose.yml index 9ba2e6d0..b0100339 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3' - services: zookeeper: profiles: ["tests"] @@ -43,7 +41,7 @@ services: env_file: - .env environment: - - BUILD_RDKAFKA=1 + - BUILD_LIBRDKAFKA=1 - UV_THREADPOOL_SIZE=16 - CI=true - UID=${UID:-1000} diff --git a/e2e/both.spec.js b/e2e/both.spec.js index bf342ff3..596c24f5 100644 --- a/e2e/both.spec.js +++ b/e2e/both.spec.js @@ -84,7 +84,7 @@ describe('Consumer/Producer', function() { }); - afterEach(function(done) { + afterEach('disconnect', function(done) { var finished = 0; var called = false; @@ -105,10 +105,12 @@ describe('Consumer/Producer', function() { } consumer.disconnect(function(err) { + console.log('consumer disconnected') maybeDone(err); }); producer.disconnect(function(err) { + console.log('producer disconnected') maybeDone(err); }); }); diff --git a/e2e/consumer.spec.js b/e2e/consumer.spec.js index 972d5af6..3f4790e8 100644 --- a/e2e/consumer.spec.js +++ b/e2e/consumer.spec.js @@ -12,6 +12,7 @@ var crypto = require('crypto'); var eventListener = require('./listener'); var KafkaConsumer = require('../').KafkaConsumer; +var LibrdKafkaError = require('../lib/error'); var kafkaBrokerList = process.env.KAFKA_HOST || 'localhost:9092'; var topic = 'test'; @@ -137,9 +138,8 @@ describe('Consumer', function() { it('should obey the timeout', function(done) { consumer.committed(null, 0, function(err, committed) { - if (!err) { - t.fail(err, 'not null', 'Error should be set for a timeout'); - } + t.ok(err, 'Error should be set for a timeout') + t.equal(err.code, LibrdKafkaError.codes.ERR__TIMED_OUT) done(); }); }); @@ -361,24 +361,24 @@ describe('Consumer', function() { }, {}); t.equal(consumer.rebalanceProtocol(), 'NONE'); - + consumer.connect({ timeout: 2000 }, function(err) { t.ifError(err); - + consumer.subscribe([topic]); - + consumer.on('rebalance', function (err) { if (err.code === -175) { t.equal(consumer.rebalanceProtocol(), strategies[strategy]); consumer.disconnect(done); } }); - + consumer.consume(1, function(err) { t.ifError(err); }); }); - + eventListener(consumer); }); }); diff --git a/e2e/groups.spec.js b/e2e/groups.spec.js index dc099878..0d1117d4 100644 --- a/e2e/groups.spec.js +++ b/e2e/groups.spec.js @@ -7,8 +7,8 @@ * of the MIT license. See the LICENSE.txt file for details. */ -var crypto = require('crypto'); -var t = require('assert'); +var crypto = require('node:crypto'); +var t = require('node:assert'); var Kafka = require('../'); var kafkaBrokerList = process.env.KAFKA_HOST || 'localhost:9092'; @@ -95,7 +95,7 @@ describe('Consumer group/Producer', function() { t.deepStrictEqual(offsets.committed, message.offset, 'Offset read by consumer 2 incorrect'); clearInterval(tt); consumer2.unsubscribe(); - consumer2.disconnect(function() { + consumer2.disconnect(function () { done(); }); } @@ -105,6 +105,7 @@ describe('Consumer group/Producer', function() { consumer2.subscribe([topic]); consumer2.consume(); }); + consumer2.connect(); }); diff --git a/lib/client.js b/lib/client.js index 354f5446..43ad2b60 100644 --- a/lib/client.js +++ b/lib/client.js @@ -9,10 +9,8 @@ module.exports = Client; -var Emitter = require('events').EventEmitter; -var util = require('util'); -var Kafka = require('../librdkafka.js'); -var assert = require('assert'); +var Emitter = require('node:events').EventEmitter; +var util = require('node:util'); var LibrdKafkaError = require('./error'); @@ -309,28 +307,38 @@ Client.prototype.disconnect = function(cb) { if (!this._isDisconnecting && this._client) { this._isDisconnecting = true; - this._client.disconnect(function() { - // this take 5000 milliseconds. Librdkafka needs to make sure the memory - // has been cleaned up before we delete things. @see RdKafka::wait_destroyed - self._client.configureCallbacks(false, self._cb_configs); - - // Broadcast metrics. Gives people one last chance to do something with them - self._isDisconnecting = false; - /** - * Disconnect event. Called after disconnection is finished. - * - * @event Client#disconnected - * @type {object} - * @property {date} connectionOpened - when the connection was opened. - */ - var metricsCopy = Object.assign({}, self.metrics); - self.emit('disconnected', metricsCopy); - if (cb) { - cb(null, metricsCopy); - } - + // NOTE: unless this is scheduled for a next tick - we can be in a loop on c++ side + // where queue of async callbacks is invoked multiple times. there are no checks that + // callback has not been deregistered during processing of the loop + // and it will segfault if .disconnect() is called because it will set consumeLoop to NULL + // and callback will become a null ptr, therefore causing the crash + // scheduling this at the end of the current loop will allow sync c++ loop to finish furst + setImmediate(() => { + this._client.disconnect(function() { + // this take 5000 milliseconds. Librdkafka needs to make sure the memory + // has been cleaned up before we delete things. @see RdKafka::wait_destroyed + self._client.configureCallbacks(false, self._cb_configs); + + // Broadcast metrics. Gives people one last chance to do something with them + self._isDisconnecting = false; + /** + * Disconnect event. Called after disconnection is finished. + * + * @event Client#disconnected + * @type {object} + * @property {date} connectionOpened - when the connection was opened. + */ + var metricsCopy = { ...self.metrics }; + self.emit('disconnected', metricsCopy); + if (cb) { + cb(null, metricsCopy); + } + }); }); - + } else if (this._isDisconnecting && cb) { + self.once('disconnected', (metrics) => cb(null, metrics)); + } else if (!this._client && cb) { + cb(null, { ...self.metrics }); } return self; diff --git a/lib/error.js b/lib/error.js index b847eec9..1cba5cb6 100644 --- a/lib/error.js +++ b/lib/error.js @@ -9,7 +9,7 @@ module.exports = LibrdKafkaError; -var util = require('util'); +var util = require('node:util'); var librdkafka = require('../librdkafka'); util.inherits(LibrdKafkaError, Error); @@ -405,7 +405,7 @@ function LibrdKafkaError(e) { this.origin = 'kafka'; } Error.captureStackTrace(this, this.constructor); - } else if (!util.isError(e)) { + } else if (!util.types.isNativeError(e)) { // This is the better way this.message = e.message; this.code = e.code; diff --git a/lib/kafka-consumer.js b/lib/kafka-consumer.js index 875a3779..e1aa167e 100644 --- a/lib/kafka-consumer.js +++ b/lib/kafka-consumer.js @@ -197,21 +197,23 @@ KafkaConsumer.createReadStream = function(conf, topicConf, streamOptions) { * out * @return {Client} - Returns itself */ -KafkaConsumer.prototype.committed = function(toppars, timeout, cb) { +KafkaConsumer.prototype.committed = function(...args) { + let [toppars, timeout, cb] = args + // We want to be backwards compatible here, and the previous version of // this function took two arguments // If CB is not set, shift to backwards compatible version if (!cb) { - cb = arguments[1]; - timeout = arguments[0]; + cb = args[1]; + timeout = args[0]; toppars = this.assignments(); } else { toppars = toppars || this.assignments(); } - var self = this; this._client.committed(toppars, timeout, function(err, topicPartitions) { + console.log('this._client.committed', err, topicPartitions); if (err) { cb(LibrdKafkaError.create(err)); return; diff --git a/src/kafka-consumer.cc b/src/kafka-consumer.cc index 89528ceb..33e563e2 100644 --- a/src/kafka-consumer.cc +++ b/src/kafka-consumer.cc @@ -1395,7 +1395,7 @@ NAN_METHOD(KafkaConsumer::NodeDisconnect) { // cleanup the async worker consumeLoop->WorkComplete(); consumeLoop->Destroy(); - + consumer->m_consume_loop = nullptr; } diff --git a/src/kafka-consumer.h b/src/kafka-consumer.h index dfb45b9a..16e28c7f 100644 --- a/src/kafka-consumer.h +++ b/src/kafka-consumer.h @@ -103,7 +103,7 @@ class KafkaConsumer : public Connection { bool m_is_subscribed = false; void* m_consume_loop = nullptr; - + // Node methods static NAN_METHOD(NodeConnect); static NAN_METHOD(NodeSubscribe); diff --git a/src/workers.cc b/src/workers.cc index 55d3dd50..9ab4b0c4 100644 --- a/src/workers.cc +++ b/src/workers.cc @@ -66,7 +66,7 @@ void OffsetsForTimes::HandleOKCallback() { argv[0] = Nan::Null(); argv[1] = Conversion::TopicPartition::ToV8Array(m_topic_partitions); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void OffsetsForTimes::HandleErrorCallback() { @@ -75,7 +75,7 @@ void OffsetsForTimes::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } } // namespace Handle @@ -113,7 +113,7 @@ void ConnectionMetadata::HandleOKCallback() { v8::Local argv[argc] = { Nan::Null(), Conversion::Metadata::ToV8Object(m_metadata)}; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); delete m_metadata; } @@ -124,7 +124,7 @@ void ConnectionMetadata::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -171,7 +171,7 @@ void ConnectionQueryWatermarkOffsets::HandleOKCallback() { // This is a big one! v8::Local argv[argc] = { Nan::Null(), offsetsObj}; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void ConnectionQueryWatermarkOffsets::HandleErrorCallback() { @@ -180,7 +180,7 @@ void ConnectionQueryWatermarkOffsets::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -220,7 +220,7 @@ void ProducerConnect::HandleOKCallback() { // Activate the dispatchers producer->ActivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void ProducerConnect::HandleErrorCallback() { @@ -229,7 +229,7 @@ void ProducerConnect::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -258,7 +258,7 @@ void ProducerDisconnect::HandleOKCallback() { // Deactivate the dispatchers producer->DeactivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void ProducerDisconnect::HandleErrorCallback() { @@ -298,7 +298,7 @@ void ProducerFlush::HandleOKCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { Nan::Null() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -335,7 +335,7 @@ void ProducerInitTransactions::HandleOKCallback() { // Activate the dispatchers producer->ActivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void ProducerInitTransactions::HandleErrorCallback() { @@ -344,7 +344,7 @@ void ProducerInitTransactions::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { m_baton.ToTxnObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -380,7 +380,7 @@ void ProducerBeginTransaction::HandleOKCallback() { // Activate the dispatchers producer->ActivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void ProducerBeginTransaction::HandleErrorCallback() { @@ -389,7 +389,7 @@ void ProducerBeginTransaction::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -426,7 +426,7 @@ void ProducerCommitTransaction::HandleOKCallback() { // Activate the dispatchers producer->ActivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void ProducerCommitTransaction::HandleErrorCallback() { @@ -435,7 +435,7 @@ void ProducerCommitTransaction::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { m_baton.ToTxnObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -472,7 +472,7 @@ void ProducerAbortTransaction::HandleOKCallback() { // Activate the dispatchers producer->ActivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void ProducerAbortTransaction::HandleErrorCallback() { @@ -481,7 +481,7 @@ void ProducerAbortTransaction::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { m_baton.ToTxnObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -528,7 +528,7 @@ void ProducerSendOffsetsToTransaction::HandleOKCallback() { // Activate the dispatchers producer->ActivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void ProducerSendOffsetsToTransaction::HandleErrorCallback() { @@ -537,7 +537,7 @@ void ProducerSendOffsetsToTransaction::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { m_baton.ToTxnObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -578,7 +578,7 @@ void KafkaConsumerConnect::HandleOKCallback() { v8::Local argv[argc] = { Nan::Null(), obj }; consumer->ActivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void KafkaConsumerConnect::HandleErrorCallback() { @@ -587,7 +587,7 @@ void KafkaConsumerConnect::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { Nan::Error(ErrorMessage()) }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -622,7 +622,7 @@ void KafkaConsumerDisconnect::HandleOKCallback() { consumer->DeactivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void KafkaConsumerDisconnect::HandleErrorCallback() { @@ -633,7 +633,7 @@ void KafkaConsumerDisconnect::HandleErrorCallback() { consumer->DeactivateDispatchers(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -767,7 +767,7 @@ void KafkaConsumerConsumeLoop::HandleMessageCallback(RdKafka::Message* msg, RdKa delete msg; } - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void KafkaConsumerConsumeLoop::HandleOKCallback() { @@ -780,7 +780,7 @@ void KafkaConsumerConsumeLoop::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { Nan::Error(ErrorMessage()) }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -824,7 +824,7 @@ void KafkaConsumerConsumeNum::Execute() { if (m_messages.size() > eof_event_count) { timeout_ms = 1; } - + // We will only go into this code path when `enable.partition.eof` is set to true // In this case, consumer is also interested in EOF messages, so we return an EOF message m_messages.push_back(message); @@ -872,7 +872,7 @@ void KafkaConsumerConsumeNum::HandleOKCallback() { for (std::vector::iterator it = m_messages.begin(); it != m_messages.end(); ++it) { RdKafka::Message* message = *it; - + switch (message->err()) { case RdKafka::ERR_NO_ERROR: ++returnArrayIndex; @@ -890,7 +890,7 @@ void KafkaConsumerConsumeNum::HandleOKCallback() { Nan::New(message->offset())); Nan::Set(eofEvent, Nan::New("partition").ToLocalChecked(), Nan::New(message->partition())); - + // also store index at which position in the message array this event was emitted // this way, we can later emit it at the right point in time Nan::Set(eofEvent, Nan::New("messageIndex").ToLocalChecked(), @@ -898,7 +898,7 @@ void KafkaConsumerConsumeNum::HandleOKCallback() { Nan::Set(eofEventsArray, eofEventsArrayIndex, eofEvent); } - + delete message; } } @@ -906,7 +906,7 @@ void KafkaConsumerConsumeNum::HandleOKCallback() { argv[1] = returnArray; argv[2] = eofEventsArray; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void KafkaConsumerConsumeNum::HandleErrorCallback() { @@ -923,7 +923,7 @@ void KafkaConsumerConsumeNum::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -972,7 +972,7 @@ void KafkaConsumerConsume::HandleOKCallback() { delete m_message; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void KafkaConsumerConsume::HandleErrorCallback() { @@ -981,7 +981,7 @@ void KafkaConsumerConsume::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -1024,7 +1024,7 @@ void KafkaConsumerCommitted::HandleOKCallback() { argv[0] = Nan::Null(); argv[1] = Conversion::TopicPartition::ToV8Array(m_topic_partitions); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void KafkaConsumerCommitted::HandleErrorCallback() { @@ -1033,7 +1033,7 @@ void KafkaConsumerCommitted::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -1086,7 +1086,7 @@ void KafkaConsumerSeek::HandleOKCallback() { argv[0] = Nan::Null(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void KafkaConsumerSeek::HandleErrorCallback() { @@ -1095,7 +1095,7 @@ void KafkaConsumerSeek::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -1133,7 +1133,7 @@ void AdminClientCreateTopic::HandleOKCallback() { argv[0] = Nan::Null(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void AdminClientCreateTopic::HandleErrorCallback() { @@ -1142,7 +1142,7 @@ void AdminClientCreateTopic::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -1180,7 +1180,7 @@ void AdminClientDeleteTopic::HandleOKCallback() { argv[0] = Nan::Null(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void AdminClientDeleteTopic::HandleErrorCallback() { @@ -1189,7 +1189,7 @@ void AdminClientDeleteTopic::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } /** @@ -1228,7 +1228,7 @@ void AdminClientCreatePartitions::HandleOKCallback() { argv[0] = Nan::Null(); - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } void AdminClientCreatePartitions::HandleErrorCallback() { @@ -1237,7 +1237,7 @@ void AdminClientCreatePartitions::HandleErrorCallback() { const unsigned int argc = 1; v8::Local argv[argc] = { GetErrorObject() }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } } // namespace Workers diff --git a/src/workers.h b/src/workers.h index d7d5ac8a..064873ea 100644 --- a/src/workers.h +++ b/src/workers.h @@ -26,8 +26,8 @@ namespace Workers { class ErrorAwareWorker : public Nan::AsyncWorker { public: - explicit ErrorAwareWorker(Nan::Callback* callback_) : - Nan::AsyncWorker(callback_), + explicit ErrorAwareWorker(Nan::Callback* callback_, const char* resource_name = "ErrorAwareWorker") : + Nan::AsyncWorker(callback_, resource_name), m_baton(RdKafka::ERR_NO_ERROR) {} virtual ~ErrorAwareWorker() {} @@ -39,7 +39,7 @@ class ErrorAwareWorker : public Nan::AsyncWorker { const unsigned int argc = 1; v8::Local argv[argc] = { Nan::Error(ErrorMessage()) }; - callback->Call(argc, argv); + callback->Call(argc, argv, async_resource); } protected: From ca84d43aa6697ee4f39a308733f3090595229a62 Mon Sep 17 00:00:00 2001 From: AVVS Date: Sun, 26 Jan 2025 00:36:38 -0800 Subject: [PATCH 28/35] chore: store dir --- ci/build-and-publish.sh | 2 +- ci/semantic-release.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/build-and-publish.sh b/ci/build-and-publish.sh index ad437de4..e40a9f75 100755 --- a/ci/build-and-publish.sh +++ b/ci/build-and-publish.sh @@ -14,7 +14,7 @@ set -ex if [ x"$CI" = x"true" ]; then cp ~/.env.aws-s3-credentials .env fi -env IMAGE_TAG=${NODE_VER}${platform} UID=${UID} PNPM_STORE="$(pnpm store path)" docker-compose up -d +env IMAGE_TAG=${NODE_VER}${platform} UID=${UID} PNPM_STORE="$(pnpm config get store-dir)" docker-compose up -d env UID=${UID} docker-compose exec -u ${UID} tester pnpm i --frozen-lockfile --offline --ignore-scripts env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:build env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:package diff --git a/ci/semantic-release.sh b/ci/semantic-release.sh index 217c0393..0959ae93 100755 --- a/ci/semantic-release.sh +++ b/ci/semantic-release.sh @@ -4,7 +4,7 @@ set -ex if git log --oneline -n 1 | grep -v "chore(release)" > /dev/null; then touch .env - env UID=${UID} PNPM_STORE=$(pnpm store path) docker-compose --profile tests up -d + env UID=${UID} PNPM_STORE=$(pnpm config get store-dir) docker-compose --profile tests up -d env UID=${UID} docker-compose exec -u ${UID} tester pnpm i --frozen-lockfile --offline --ignore-scripts env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:build env UID=${UID} docker-compose exec -u ${UID} tester pnpm test From 930ec01408283006e30b492f45594c3bcaefb1f6 Mon Sep 17 00:00:00 2001 From: AVVS Date: Sun, 26 Jan 2025 07:14:14 -0800 Subject: [PATCH 29/35] chore: use basedir of store --- ci/build-and-publish.sh | 2 +- ci/semantic-release.sh | 2 +- docker-compose.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ci/build-and-publish.sh b/ci/build-and-publish.sh index e40a9f75..0482c598 100755 --- a/ci/build-and-publish.sh +++ b/ci/build-and-publish.sh @@ -14,7 +14,7 @@ set -ex if [ x"$CI" = x"true" ]; then cp ~/.env.aws-s3-credentials .env fi -env IMAGE_TAG=${NODE_VER}${platform} UID=${UID} PNPM_STORE="$(pnpm config get store-dir)" docker-compose up -d +env IMAGE_TAG=${NODE_VER}${platform} UID=${UID} PNPM_STORE="$(dirname `pnpm store path`)" docker-compose up -d env UID=${UID} docker-compose exec -u ${UID} tester pnpm i --frozen-lockfile --offline --ignore-scripts env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:build env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:package diff --git a/ci/semantic-release.sh b/ci/semantic-release.sh index 0959ae93..b760f7b0 100755 --- a/ci/semantic-release.sh +++ b/ci/semantic-release.sh @@ -4,7 +4,7 @@ set -ex if git log --oneline -n 1 | grep -v "chore(release)" > /dev/null; then touch .env - env UID=${UID} PNPM_STORE=$(pnpm config get store-dir) docker-compose --profile tests up -d + env UID=${UID} PNPM_STORE=$(dirame `pnpm store path`) docker-compose --profile tests up -d env UID=${UID} docker-compose exec -u ${UID} tester pnpm i --frozen-lockfile --offline --ignore-scripts env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:build env UID=${UID} docker-compose exec -u ${UID} tester pnpm test diff --git a/docker-compose.yml b/docker-compose.yml index b0100339..5a958fd0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,7 +41,7 @@ services: env_file: - .env environment: - - BUILD_LIBRDKAFKA=1 + - BUILD_LIBRDKAFKA=0 - UV_THREADPOOL_SIZE=16 - CI=true - UID=${UID:-1000} From 172edcc671b3170392f2917ac00e73aa371dd528 Mon Sep 17 00:00:00 2001 From: AVVS Date: Sun, 26 Jan 2025 07:21:09 -0800 Subject: [PATCH 30/35] chore: typo --- ci/semantic-release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/semantic-release.sh b/ci/semantic-release.sh index b760f7b0..75b5061c 100755 --- a/ci/semantic-release.sh +++ b/ci/semantic-release.sh @@ -4,7 +4,7 @@ set -ex if git log --oneline -n 1 | grep -v "chore(release)" > /dev/null; then touch .env - env UID=${UID} PNPM_STORE=$(dirame `pnpm store path`) docker-compose --profile tests up -d + env UID=${UID} PNPM_STORE=$(dirname `pnpm store path`) docker-compose --profile tests up -d env UID=${UID} docker-compose exec -u ${UID} tester pnpm i --frozen-lockfile --offline --ignore-scripts env UID=${UID} docker-compose exec -u ${UID} tester pnpm binary:build env UID=${UID} docker-compose exec -u ${UID} tester pnpm test From e3db7bb8ffb05b60bed6f87c47bf56898925be34 Mon Sep 17 00:00:00 2001 From: AVVS Date: Sun, 26 Jan 2025 07:27:34 -0800 Subject: [PATCH 31/35] chore: cleanup timeouts --- e2e/both.spec.js | 2 -- lib/kafka-consumer.js | 1 - 2 files changed, 3 deletions(-) diff --git a/e2e/both.spec.js b/e2e/both.spec.js index 596c24f5..e6bc18fb 100644 --- a/e2e/both.spec.js +++ b/e2e/both.spec.js @@ -105,12 +105,10 @@ describe('Consumer/Producer', function() { } consumer.disconnect(function(err) { - console.log('consumer disconnected') maybeDone(err); }); producer.disconnect(function(err) { - console.log('producer disconnected') maybeDone(err); }); }); diff --git a/lib/kafka-consumer.js b/lib/kafka-consumer.js index e1aa167e..0fd5e645 100644 --- a/lib/kafka-consumer.js +++ b/lib/kafka-consumer.js @@ -213,7 +213,6 @@ KafkaConsumer.prototype.committed = function(...args) { } this._client.committed(toppars, timeout, function(err, topicPartitions) { - console.log('this._client.committed', err, topicPartitions); if (err) { cb(LibrdKafkaError.create(err)); return; From 171f1f4c8be0bbbcafda6223daafad167a1c4dd6 Mon Sep 17 00:00:00 2001 From: AVVS Date: Sun, 26 Jan 2025 12:17:38 -0800 Subject: [PATCH 32/35] fix: cleanup consumer messages queue due to possible deadlock --- Makefile | 2 +- docker-compose.yml | 6 +-- e2e/both.spec.js | 119 ++++++++++++++++++++++-------------------- src/callbacks.cc | 1 + src/kafka-consumer.cc | 6 ++- src/workers.cc | 8 +-- src/workers.h | 11 +++- 7 files changed, 85 insertions(+), 68 deletions(-) diff --git a/Makefile b/Makefile index 2742f46f..b11fae49 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ check: node_modules/.dirstamp @$(NODE) util/test-compile.js e2e: $(E2E_TESTS) - ./node_modules/.bin/mocha --exit --timeout 120000 $(TEST_REPORTER) $(E2E_TESTS) $(TEST_OUTPUT) + ./node_modules/.bin/mocha --exit --bail --timeout 30000 $(TEST_REPORTER) $(E2E_TESTS) $(TEST_OUTPUT) define release NEXT_VERSION=$(shell node -pe 'require("semver").inc("$(VERSION)", "$(1)")') diff --git a/docker-compose.yml b/docker-compose.yml index 5a958fd0..eb6839c4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,9 +25,9 @@ services: KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 KAFKA_DEFAULT_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 - KAFKA_NUM_NETWORK_THREADS: 4 - KAFKA_NUM_IO_THREADS: 4 - KAFKA_BACKGROUND_THREADS: 4 + KAFKA_NUM_NETWORK_THREADS: 2 + KAFKA_NUM_IO_THREADS: 2 + KAFKA_BACKGROUND_THREADS: 2 KAFKA_HEAP_OPTS: "-Xmx512m -Xms512m" tester: diff --git a/e2e/both.spec.js b/e2e/both.spec.js index e6bc18fb..1270a769 100644 --- a/e2e/both.spec.js +++ b/e2e/both.spec.js @@ -7,8 +7,8 @@ * of the MIT license. See the LICENSE.txt file for details. */ -var crypto = require('crypto'); -var t = require('assert'); +var crypto = require('node:crypto'); +var t = require('node:assert'); var Kafka = require('../'); var kafkaBrokerList = process.env.KAFKA_HOST || 'localhost:9092'; @@ -37,6 +37,7 @@ describe('Consumer/Producer', function() { } if (finished === 2) { + called = true; done(); } } @@ -47,7 +48,8 @@ describe('Consumer/Producer', function() { 'metadata.broker.list': kafkaBrokerList, 'group.id': grp, 'fetch.wait.max.ms': 1000, - 'session.timeout.ms': 10000, + 'socket.nagle.disable': true, + 'session.timeout.ms': 20000, 'enable.auto.commit': true, 'enable.partition.eof': true, 'debug': 'all' @@ -100,6 +102,7 @@ describe('Consumer/Producer', function() { } if (finished === 2) { + called = true; done(); } } @@ -275,34 +278,36 @@ describe('Consumer/Producer', function() { it('should be able to produce and consume messages: consumeLoop', function(done) { var key = 'key'; - crypto.randomBytes(4096, function(ex, buffer) { - - producer.setPollInterval(10); - - producer.once('delivery-report', function(err, report) { - if (!err) { - t.equal(topic, report.topic, 'invalid delivery-report topic'); - t.equal(key, report.key, 'invalid delivery-report key'); - t.ok(report.offset >= 0, 'invalid delivery-report offset'); - } - }); + const buffer = crypto.randomBytes(4096); - consumer.on('data', function(message) { - t.equal(buffer.toString(), message.value.toString(), 'invalid message value'); - t.equal(key, message.key, 'invalid message key'); - t.equal(topic, message.topic, 'invalid message topic'); - t.ok(message.offset >= 0, 'invalid message offset'); - done(); - }); + producer.setPollInterval(10); - consumer.subscribe([topic]); - consumer.consume(); + producer.once('delivery-report', function(err, report) { + if (!err) { + t.equal(topic, report.topic, 'invalid delivery-report topic'); + t.equal(key, report.key, 'invalid delivery-report key'); + t.ok(report.offset >= 0, 'invalid delivery-report offset'); + } else { + done(err); + } + }); - setTimeout(function() { - producer.produce(topic, null, buffer, key); - }, 2000); + consumer.subscribe([topic]); + consumer.consume(function (err, message) { + if (err) { + return done(err); + } + t.equal(buffer.toString(), message.value.toString(), 'invalid message value'); + t.equal(key, message.key, 'invalid message key'); + t.equal(topic, message.topic, 'invalid message topic'); + t.ok(message.offset >= 0, 'invalid message offset'); + done(); }); + + setTimeout(function() { + producer.produce(topic, null, buffer, key); + }, 2000); }); it('should emit \'partition.eof\' events in consumeLoop', function(done) { @@ -364,7 +369,7 @@ describe('Consumer/Producer', function() { done(); }); } else { - t.ifError(err); + done(err); } }); @@ -499,7 +504,8 @@ describe('Consumer/Producer', function() { 'metadata.broker.list': kafkaBrokerList, 'group.id': grp, 'fetch.wait.max.ms': 1000, - 'session.timeout.ms': 10000, + 'socket.nagle.disable': true, + 'session.timeout.ms': 20000, 'enable.auto.commit': false, 'debug': 'all', 'offset_commit_cb': true @@ -586,7 +592,8 @@ describe('Consumer/Producer', function() { 'metadata.broker.list': kafkaBrokerList, 'group.id': grp, 'fetch.wait.max.ms': 1000, - 'session.timeout.ms': 10000, + 'socket.nagle.disable': true, + 'session.timeout.ms': 20000, 'enable.auto.commit': false, 'debug': 'all', 'offset_commit_cb': function(offset) { @@ -624,7 +631,8 @@ describe('Consumer/Producer', function() { 'metadata.broker.list': kafkaBrokerList, 'group.id': grp, 'fetch.wait.max.ms': 1000, - 'session.timeout.ms': 10000, + 'socket.nagle.disable': true, + 'session.timeout.ms': 20000, 'enable.auto.commit': false, 'debug': 'all', 'partition.assignment.strategy': 'cooperative-sticky' @@ -691,36 +699,35 @@ describe('Consumer/Producer', function() { function run_headers_test(done, headers) { var key = 'key'; - crypto.randomBytes(4096, function(ex, buffer) { - - producer.setPollInterval(10); - - producer.once('delivery-report', function(err, report) { - if (!err) { - t.equal(topic, report.topic, 'invalid delivery-report topic'); - t.equal(key, report.key, 'invalid delivery-report key'); - t.ok(report.offset >= 0, 'invalid delivery-report offset'); - } - }); + const buffer = crypto.randomBytes(4096); - consumer.on('data', function(message) { - t.equal(buffer.toString(), message.value.toString(), 'invalid message value'); - t.equal(key, message.key, 'invalid message key'); - t.equal(topic, message.topic, 'invalid message topic'); - t.ok(message.offset >= 0, 'invalid message offset'); - assert_headers_match(headers, message.headers); - done(); - }); + producer.setPollInterval(10); - consumer.subscribe([topic]); - consumer.consume(); + producer.once('delivery-report', function(err, report) { + if (!err) { + t.equal(topic, report.topic, 'invalid delivery-report topic'); + t.equal(key, report.key, 'invalid delivery-report key'); + t.ok(report.offset >= 0, 'invalid delivery-report offset'); + } + }); - setTimeout(function() { - var timestamp = new Date().getTime(); - producer.produce(topic, null, buffer, key, timestamp, "", headers); - }, 2000); + consumer.subscribe([topic]); + consumer.consume(function (err, message) { + if (err) { + return done(err) + } + t.equal(buffer.toString(), message.value.toString(), 'invalid message value'); + t.equal(key, message.key, 'invalid message key'); + t.equal(topic, message.topic, 'invalid message topic'); + t.ok(message.offset >= 0, 'invalid message offset'); + assert_headers_match(headers, message.headers); + done(); }); - } + setTimeout(function() { + var timestamp = new Date().getTime(); + producer.produce(topic, null, buffer, key, timestamp, "", headers); + }, 2000); + } }); diff --git a/src/callbacks.cc b/src/callbacks.cc index 4dfe2f33..f735d409 100644 --- a/src/callbacks.cc +++ b/src/callbacks.cc @@ -100,6 +100,7 @@ void Dispatcher::Dispatch(const int _argc, Local _argv[]) { for (size_t i=0; i < callbacks.size(); i++) { v8::Local f = Nan::New(callbacks[i]); Nan::Callback cb(f); + // Nan::Call(cb, _argc, _argv); cb.Call(_argc, _argv); } } diff --git a/src/kafka-consumer.cc b/src/kafka-consumer.cc index 33e563e2..22894606 100644 --- a/src/kafka-consumer.cc +++ b/src/kafka-consumer.cc @@ -74,11 +74,12 @@ Baton KafkaConsumer::Connect() { } } + RdKafka::ErrorCode err = RdKafka::ERR_NO_ERROR; if (m_partitions.size() > 0) { - m_client->resume(m_partitions); + err = m_client->resume(m_partitions); } - return Baton(RdKafka::ERR_NO_ERROR); + return Baton(err); } void KafkaConsumer::ActivateDispatchers() { @@ -1399,6 +1400,7 @@ NAN_METHOD(KafkaConsumer::NodeDisconnect) { consumer->m_consume_loop = nullptr; } + printf("Workers::KafkaConsumerDisconnect(callback, consumer)\n"); Nan::AsyncQueueWorker( new Workers::KafkaConsumerDisconnect(callback, consumer)); info.GetReturnValue().Set(Nan::Null()); diff --git a/src/workers.cc b/src/workers.cc index 9ab4b0c4..9ec2d91b 100644 --- a/src/workers.cc +++ b/src/workers.cc @@ -601,7 +601,7 @@ void KafkaConsumerConnect::HandleErrorCallback() { KafkaConsumerDisconnect::KafkaConsumerDisconnect(Nan::Callback *callback, KafkaConsumer* consumer): - ErrorAwareWorker(callback), + ErrorAwareWorker(callback, "KafkaConsumerDisconnectWorker"), consumer(consumer) {} KafkaConsumerDisconnect::~KafkaConsumerDisconnect() {} @@ -661,11 +661,11 @@ KafkaConsumerConsumeLoop::KafkaConsumerConsumeLoop(Nan::Callback *callback, KafkaConsumer* consumer, const int & timeout_ms, const int & timeout_sleep_delay_ms) : - MessageWorker(callback), + MessageWorker(callback, "KafkaConsumerConsumeLoop"), consumer(consumer), - m_looping(true), m_timeout_ms(timeout_ms), - m_timeout_sleep_delay_ms(timeout_sleep_delay_ms) { + m_timeout_sleep_delay_ms(timeout_sleep_delay_ms), + m_looping(true) { uv_thread_create(&thread_event_loop, KafkaConsumerConsumeLoop::ConsumeLoop, (void*)this); } diff --git a/src/workers.h b/src/workers.h index 064873ea..a6147511 100644 --- a/src/workers.h +++ b/src/workers.h @@ -68,8 +68,8 @@ class ErrorAwareWorker : public Nan::AsyncWorker { class MessageWorker : public ErrorAwareWorker { public: - explicit MessageWorker(Nan::Callback* callback_) - : ErrorAwareWorker(callback_), m_asyncdata() { + explicit MessageWorker(Nan::Callback* callback_, const char* resource_name = "MessageWorker") + : ErrorAwareWorker(callback_, resource_name), m_asyncdata() { m_async = new uv_async_t; uv_async_init( uv_default_loop(), @@ -81,6 +81,13 @@ class MessageWorker : public ErrorAwareWorker { } virtual ~MessageWorker() { + if (m_asyncdata.size() > 0) { + for (unsigned int i = 0; i < m_asyncdata.size(); i++) { + delete m_asyncdata[i]; + } + m_asyncdata.clear(); + } + uv_mutex_destroy(&m_async_lock); } From 7d6ed0a00ada310e367df1143bcfbed9cbd2267e Mon Sep 17 00:00:00 2001 From: AVVS Date: Sun, 26 Jan 2025 12:23:57 -0800 Subject: [PATCH 33/35] chore: cleanup printf --- src/kafka-consumer.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/kafka-consumer.cc b/src/kafka-consumer.cc index 22894606..edfceb0e 100644 --- a/src/kafka-consumer.cc +++ b/src/kafka-consumer.cc @@ -1400,7 +1400,6 @@ NAN_METHOD(KafkaConsumer::NodeDisconnect) { consumer->m_consume_loop = nullptr; } - printf("Workers::KafkaConsumerDisconnect(callback, consumer)\n"); Nan::AsyncQueueWorker( new Workers::KafkaConsumerDisconnect(callback, consumer)); info.GetReturnValue().Set(Nan::Null()); From 0b944b21cf66c585980f7e2ffe1a21e763e23fc2 Mon Sep 17 00:00:00 2001 From: AVVS Date: Sun, 26 Jan 2025 12:36:13 -0800 Subject: [PATCH 34/35] chore: extra error logs if present --- e2e/consumer.spec.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/e2e/consumer.spec.js b/e2e/consumer.spec.js index 3f4790e8..76df6204 100644 --- a/e2e/consumer.spec.js +++ b/e2e/consumer.spec.js @@ -74,7 +74,7 @@ describe('Consumer', function() { eventListener(consumer); }); - afterEach(function(done) { + afterEach('disconnect', function(done) { consumer.disconnect(function() { done(); }); @@ -114,7 +114,9 @@ describe('Consumer', function() { consumer.assign([{topic:topic, partition:0}]); consumer.commitSync({topic:topic, partition:0, offset:1000}); consumer.committed(null, 1000, function(err, committed) { - t.ifError(err); + if (err) { + return done(err); + } t.equal(committed.length, 1); t.equal(typeof committed[0], 'object', 'TopicPartition should be an object'); t.deepStrictEqual(committed[0].partition, 0); From 0a87dd947d4f98ad8da544d81186380606400b9a Mon Sep 17 00:00:00 2001 From: AVVS Date: Sun, 26 Jan 2025 12:53:52 -0800 Subject: [PATCH 35/35] chore: extra debug info, higher timeout --- e2e/consumer.spec.js | 2 +- src/workers.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/consumer.spec.js b/e2e/consumer.spec.js index 76df6204..e4b99bfc 100644 --- a/e2e/consumer.spec.js +++ b/e2e/consumer.spec.js @@ -66,7 +66,7 @@ describe('Consumer', function() { beforeEach(function(done) { consumer = new KafkaConsumer(gcfg, {}); - consumer.connect({ timeout: 2000 }, function(err, info) { + consumer.connect({ timeout: 5000 }, function(err, info) { t.ifError(err); done(); }); diff --git a/src/workers.cc b/src/workers.cc index 9ec2d91b..b645f259 100644 --- a/src/workers.cc +++ b/src/workers.cc @@ -998,7 +998,7 @@ KafkaConsumerCommitted::KafkaConsumerCommitted(Nan::Callback *callback, KafkaConsumer* consumer, std::vector & t, const int & timeout_ms) : - ErrorAwareWorker(callback), + ErrorAwareWorker(callback, "node-rdkafka::KafkaConsumerCommitted"), m_consumer(consumer), m_topic_partitions(t), m_timeout_ms(timeout_ms) {}