diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index fa37d6624..b7e526e27 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -37,10 +37,19 @@ jobs: - uses: actions/checkout@v3 with: submodules: recursive + - uses: actions/setup-python@v4 + with: + python-version: '3.11' - name: Setup Windows SDK uses: GuillaumeFalourd/setup-windows10-sdk-action@v1.11 with: sdk-version: 17763 + - name: Setup NuGet.exe + uses: nuget/setup-nuget@v1 + with: + nuget-version: latest + - run: nuget restore aerospike.sln + working-directory: aerospike-client-c\vs\ - name: Setup node uses: actions/setup-node@v3 with: @@ -56,10 +65,10 @@ jobs: $NodeModulesPath = $NodeDirPath + "\node_modules\npm\node_modules\@npmcli\run-script" } cd $NodeModulesPath - npm install node-gyp@9.x + npm install node-gyp@10.x - name: Install nodejs Client shell: pwsh - run: npm install --unsafe-perm --build-from-source + run: npm ci --unsafe-perm --build-from-source # - name: Test nodejs client # run: npm test # env: diff --git a/README.md b/README.md index 07d7ff7b7..a5c45f73a 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,11 @@ The Aerospike Node.js client is a Node.js add-on module, written using V8. The client is compatible with Node.js 20 (Upcoming LTS) and 18 (LTS). It supports the following operating systems: - RHEL 8/9 -- Debian 10 (x86_64 architecture only) - Debian 11 - Amazon Linux 2023 - Ubuntu 20.04/22.04 (Focal Fossa, Jammy Jellyfish) - Many Linux distributions compatible with one of the above OS releases. -- macOS versions 11/12/13 are also supported. (Node.js 14 install unavailable on M1 Mac systems) +- macOS 12/13 The client is compatible with arm64, aarch64, and x86_64 architectures. @@ -72,7 +71,7 @@ record using the Aerospike database. ```js const Aerospike = require('aerospike') -// INSERT HOSTNAME AND PORT NUMBER OF AEROPSIKE SERVER NODE HERE! +// INSERT HOSTNAME AND PORT NUMBER OF AEROSPIKE SERVER NODE HERE! const config = { hosts: '192.168.33.10:3000', } diff --git a/aerospike-client-c b/aerospike-client-c index a45aa32de..15bb8f8fd 160000 --- a/aerospike-client-c +++ b/aerospike-client-c @@ -1 +1 @@ -Subproject commit a45aa32de45c145ea0d0381b73f5df3d74648557 +Subproject commit 15bb8f8fdff24acf0d25a5668b51328f3af640bc diff --git a/aerospike-client-c.ini b/aerospike-client-c.ini index ae66a1201..bd900a48e 100644 --- a/aerospike-client-c.ini +++ b/aerospike-client-c.ini @@ -1,3 +1,3 @@ # Version number of the dependencies package for C client (Windows only) -AEROSPIKE_C_DEPS_VERSION=1.0.1 +AEROSPIKE_C_DEPS_VERSION=1.0.2 diff --git a/aerospike-client-c.sha256 b/aerospike-client-c.sha256 index 88260ba85..c103da3ff 100644 --- a/aerospike-client-c.sha256 +++ b/aerospike-client-c.sha256 @@ -1 +1 @@ -3ef446436aa0b97dc952ab5f90141f7e2c7ff8254d545edb82654e490189d80a aerospike-client-c-dependencies.1.0.1.zip +BB7AEB63571E63FD6C9CD042DC1810743DF9C8F122C91EAFB705C2E08B87733A aerospike-client-c-dependencies.1.0.2.zip diff --git a/binding.gyp b/binding.gyp index fcc379236..e9fcc6dc5 100644 --- a/binding.gyp +++ b/binding.gyp @@ -145,6 +145,8 @@ 'src/main/enums/exp_enum.cc', 'src/main/enums/batch_type.cc', 'src/main/enums/privilege_code.cc', + 'src/main/enums/exp_read_flags.cc', + 'src/main/enums/exp_write_flags.cc', 'src/main/stats.cc', 'src/main/util/conversions.cc', 'src/main/util/conversions_batch.cc', diff --git a/docker/Dockerfile.alpine b/docker/Dockerfile.alpine deleted file mode 100644 index a7856dc30..000000000 --- a/docker/Dockerfile.alpine +++ /dev/null @@ -1,47 +0,0 @@ -# This Dockerfile demonstrates how to build the Aerospike Node.js client on -# Alpine Linux. Since there is no pre-build package for the Aerospike C Client -# SDK for Alpine Linux, this Dockerfile first builds the C Client SDK from source -# (a submodule for the Node.js client), then builds the Node.js client using it. -# Stage 2 install the Node.js client into the final Docker image, to keep the size of -# that image minimal (i.e. no build dependencies). -# -# Note: The AS_NODEJS_VERSION must use version 4.0.3 and up since this is where the -# C client submodule was introduced. - -# Stage 1: Build Aerospike C client and Node.js client -FROM node:lts-alpine as as-node-builder -WORKDIR /src - -ENV AS_NODEJS_VERSION v5.0.1 - -RUN apk update -RUN apk add --no-cache \ - build-base \ - linux-headers \ - bash \ - libuv-dev \ - openssl-dev \ - lua5.1-dev \ - zlib-dev \ - git \ - python3 - -RUN git clone --branch ${AS_NODEJS_VERSION} --recursive https://github.com/aerospike/aerospike-client-nodejs -# TODO: build-command.sh might be broken for alpine in some versions, use latest version when it's in git -COPY build-commands.sh /src/aerospike-client-nodejs/scripts/build-commands.sh - -RUN cd /src/aerospike-client-nodejs \ - && /src/aerospike-client-nodejs/scripts/build-c-client.sh \ - && npm install /src/aerospike-client-nodejs --unsafe-perm --build-from-source - -# Stage 2: Deploy Aerospike Node.js Runtime only -FROM node:lts-alpine -WORKDIR /src - -RUN apk add --no-cache \ - zlib \ - openssl - -COPY --from=as-node-builder /src/aerospike-client-nodejs/ aerospike-client-nodejs/ - -RUN npm install /src/aerospike-client-nodejs \ No newline at end of file diff --git a/docker/Dockerfile.bullseye-slim b/docker/Dockerfile.bullseye-slim deleted file mode 100644 index 8b15169f5..000000000 --- a/docker/Dockerfile.bullseye-slim +++ /dev/null @@ -1,18 +0,0 @@ -# This Dockerfile demonstrates how to use the Aerospike Node.js client on -# bullseye-slim (Debian 11) using the pre-built package and minimal prerequirements. -# -# Note: The AS_NODEJS_VERSION must use version 4.0.3 and up since this is where -# the C client submodule was introduced. - -# Stage 1: Install Node.js Client Dependencies -FROM node:lts-bullseye-slim as installer -WORKDIR /src - -ENV AS_NODEJS_VERSION v5.0.1 - -RUN apt update -y -RUN apt install -y \ - openssl \ - zlib1g - -RUN npm install aerospike@${AS_NODEJS_VERSION} diff --git a/docker/Dockerfile.lambda b/docker/Dockerfile.lambda deleted file mode 100644 index 1eb9dbe43..000000000 --- a/docker/Dockerfile.lambda +++ /dev/null @@ -1,44 +0,0 @@ -# This Dockerfile demonstrates how to build the Aerospike Node.js client on -# Amazon Linux 2 for AWS Lambda. Since there is no pre-built package for the -# Aerospike C Client SDK for Amazon Linux 2, this Dockerfile uses a multi-stage -# approach to building the client to minimize the final image size. -# -# Note: The AS_NODEJS_VERSION must use version 4.0.3 and up since this is where -# the C client submodule was introduced. - -# Stage 1: Build Aerospike C Client & Node.js Client -FROM public.ecr.aws/lambda/nodejs:16 as builder -WORKDIR /src - -ENV AS_NODEJS_VERSION v5.0.1 - -RUN yum update -y -RUN yum install -y \ - gcc-c++ \ - linux-headers \ - libuv-devel \ - lua5.1-devel \ - openssl11-devel \ - zlib-devel \ - python3 \ - make \ - wget \ - tar \ - git - -RUN git clone --branch ${AS_NODEJS_VERSION} --recursive https://github.com/aerospike/aerospike-client-nodejs aerospike -RUN cd /src/aerospike \ - && /src/aerospike/scripts/build-c-client.sh \ - && npm install /src/aerospike --unsafe-perm --build-from-source - -# Stage 2: Install Node.js Client Dependencies -FROM public.ecr.aws/lambda/nodejs:16 as installer -WORKDIR /src - -COPY --from=builder /src/aerospike ./aerospike - -RUN yum update -y -RUN yum install -y \ - openssl11 \ - zlib -RUN npm install /src/aerospike \ No newline at end of file diff --git a/docker/Dockerfile.ubuntu22.04 b/docker/Dockerfile.ubuntu22.04 deleted file mode 100644 index 59a6d0872..000000000 --- a/docker/Dockerfile.ubuntu22.04 +++ /dev/null @@ -1,45 +0,0 @@ -# This Dockerfile demonstrates how to build the Aerospike Node.js client on -# Ubuntu 22.04. Since there is no pre-built package for the Aerospike C Client SDK -# for Ubuntu 22.04 yet, this Dockerfile uses a multi-stage approach to building the -# client to minimize the final image size. -# -# Note: The AS_NODEJS_VERSION must use version 4.0.3 and up since this is where -# the C client submodule was introduced. - -# Stage 1: Build Aerospike C Client & Node.js Client -FROM sitespeedio/node:ubuntu-22.04-nodejs-16.15.0 as builder -WORKDIR /src - -ENV AS_NODEJS_VERSION v5.0.1 - -RUN apt update -y -RUN apt install -y \ - libc6-dev \ - libssl-dev \ - autoconf \ - automake \ - libtool \ - g++ \ - zlib1g-dev \ - liblua5.1-0-dev \ - ncurses-dev \ - python3 \ - wget \ - git \ - make - -RUN git clone --branch ${AS_NODEJS_VERSION} --recursive https://github.com/aerospike/aerospike-client-nodejs aerospike -RUN cd /src/aerospike \ - && /src/aerospike/scripts/build-c-client.sh \ - && npm install /src/aerospike --unsafe-perm --build-from-source - -# Stage 2: Install Node.js Client Dependencies -FROM sitespeedio/node:ubuntu-22.04-nodejs-16.15.0 as installer -WORKDIR /src - -COPY --from=builder /src/aerospike ./aerospike - -RUN apt update -y -RUN apt install -y \ - zlib1g -RUN npm install /src/aerospike diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..33b48ad90 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,7 @@ +# Docker Examples + +The docker files that were previously located in this directory have been moved to +the [Nodejs-Client-Examples](https://github.com/aerospike-examples/nodejs-client-examples) directory. + +Files in this directory are not intended for production use, but rather to demonstrate the steps +necessary to install and build the client on various systems. \ No newline at end of file diff --git a/docs/overview.md b/docs/overview.md index 9c67cf178..e736bf954 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -94,7 +94,7 @@ The following is very simple example of how to write and read a record from Aero ```js const Aerospike = require('aerospike') -// INSERT HOSTNAME AND PORT NUMBER OF AEROPSIKE SERVER NODE HERE! +// INSERT HOSTNAME AND PORT NUMBER OF AEROSPIKE SERVER NODE HERE! const config = { hosts: '192.168.33.10:3000', } diff --git a/lib/client.js b/lib/client.js index d2432afb3..cff231723 100644 --- a/lib/client.js +++ b/lib/client.js @@ -321,7 +321,7 @@ Client.prototype.contextFromBase64 = function (serializedContext) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -357,7 +357,7 @@ Client.prototype.changePassword = function (user, password, policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -367,7 +367,7 @@ Client.prototype.changePassword = function (user, password, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -419,7 +419,7 @@ Client.prototype.createUser = function (user, password, roles, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -456,7 +456,7 @@ Client.prototype.createRole = function (roleName, privileges, policy, whitelist, * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -466,7 +466,7 @@ Client.prototype.createRole = function (roleName, privileges, policy, whitelist, * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -505,7 +505,7 @@ Client.prototype.dropRole = function (roleName, policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -515,7 +515,7 @@ Client.prototype.dropRole = function (roleName, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -555,7 +555,7 @@ Client.prototype.dropUser = function (user, policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -565,7 +565,7 @@ Client.prototype.dropUser = function (user, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -604,7 +604,7 @@ Client.prototype.grantPrivileges = function (roleName, privileges, policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -614,7 +614,7 @@ Client.prototype.grantPrivileges = function (roleName, privileges, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -655,7 +655,7 @@ Client.prototype.grantRoles = function (user, roles, policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -665,7 +665,7 @@ Client.prototype.grantRoles = function (user, roles, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -701,7 +701,7 @@ Client.prototype.queryRole = async function (roleName, policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -711,7 +711,7 @@ Client.prototype.queryRole = async function (roleName, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -747,7 +747,7 @@ Client.prototype.queryRoles = function (policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -757,7 +757,7 @@ Client.prototype.queryRoles = function (policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -793,7 +793,7 @@ Client.prototype.queryUser = function (user, policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -803,7 +803,7 @@ Client.prototype.queryUser = function (user, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -838,7 +838,7 @@ Client.prototype.queryUsers = function (policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -848,7 +848,7 @@ Client.prototype.queryUsers = function (policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -886,7 +886,7 @@ Client.prototype.revokePrivileges = function (roleName, privileges, policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -896,7 +896,7 @@ Client.prototype.revokePrivileges = function (roleName, privileges, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -936,7 +936,7 @@ Client.prototype.revokeRoles = function (user, roles, policy) { * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -946,7 +946,7 @@ Client.prototype.revokeRoles = function (user, roles, policy) { * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -986,7 +986,7 @@ Client.prototype.setQuotas = function (roleName, readQuota, writeQuota, policy) * * @example * - * const Aerospike = require('./lib/aerospike') + * const Aerospike = require('aerospike') * * function wait (ms) { * return new Promise(resolve => setTimeout(resolve, ms)) @@ -996,7 +996,7 @@ Client.prototype.setQuotas = function (roleName, readQuota, writeQuota, policy) * let client * try { * client = await Aerospike.connect({ - * hosts: '172.17.0.2:3000', + * hosts: '192.168.33.10:3000', * policies: { * write : new Aerospike.WritePolicy({socketTimeout : 1, totalTimeout : 1}), * }, @@ -1089,27 +1089,35 @@ Client.prototype.removeSeedHost = function (hostname, port) { * new Key('test', 'demo', 'key3') * ] * - * Aerospike.connect(config, (error, client) => { - * if (error) throw error - * client.batchExists(keys, (error, results) => { - * if (error) throw error + * ;(async () => { + * // Establishes a connection to the server + * let client = await Aerospike.connect(config); + * + * // Place some records for demonstration + * await client.put(keys[0], {example: 30}) + * await client.put(keys[1], {example: 35}) + * await client.put(keys[2], {example: 40}) + * + * let results = await client.batchExists(keys) * results.forEach((result) => { - * switch (result.status) { - * case Aerospike.status.OK: - * console.log("Record found") - * break - * case Aerospike.status.ERR_RECORD_NOT_FOUND: - * console.log("Record not found") - * break - * default: - * // error while reading record - * console.log("Other error") - * break - * } + * switch (result.status) { + * case Aerospike.status.OK: + * console.log("Record found") + * break + * case Aerospike.status.ERR_RECORD_NOT_FOUND: + * console.log("Record not found") + * break + * default: + * // error while reading record + * console.log("Other error") + * break + * } * }) - * client.close() - * }) - * }) + * + * // Close the connection to the server + * await client.close(); + * })(); + * * */ Client.prototype.batchExists = function (keys, policy, callback) { @@ -1157,27 +1165,34 @@ Client.prototype.batchExists = function (keys, policy, callback) { * new Key('test', 'demo', 'key3') * ] * - * Aerospike.connect(config, (error, client) => { - * if (error) throw error - * client.batchGet(keys, (error, results) => { - * if (error) throw error + * ;(async () => { + * // Establishes a connection to the server + * let client = await Aerospike.connect(config); + * + * // Place some records for demonstration + * await client.put(keys[0], {example: 30}) + * await client.put(keys[1], {example: 35}) + * await client.put(keys[2], {example: 40}) + * + * let results = await client.batchGet(keys) * results.forEach((result) => { - * switch (result.status) { - * case Aerospike.status.OK: - * console.log("Record found") - * break - * case Aerospike.status.ERR_RECORD_NOT_FOUND: - * console.log("Record not found") - * break - * default: - * // error while reading record - * console.log("Other error") - * break - * } + * switch (result.status) { + * case Aerospike.status.OK: + * console.log("Record found") + * break + * case Aerospike.status.ERR_RECORD_NOT_FOUND: + * console.log("Record not found") + * break + * default: + * // error while reading record + * console.log("Other error") + * break + * } * }) - * client.close() - * }) - * }) + * + * // Close the connection to the server + * await client.close(); + * })(); * */ Client.prototype.batchGet = function (keys, policy, callback) { @@ -1220,6 +1235,7 @@ Client.prototype.batchGet = function (keys, policy, callback) { * @since v2.0 * * @example + * * const Aerospike = require('aerospike') * const batchType = Aerospike.batchType * const op = Aerospike.operations @@ -1235,36 +1251,51 @@ Client.prototype.batchGet = function (keys, policy, callback) { * * var batchRecords = [ * { type: batchType.BATCH_READ, - * key: new Aerospike.Key('test', 'demo', 'key1'), bins: ['i', 's'] }, + * key: new Aerospike.Key('test', 'demo', 'key1'), bins: ['example'] }, * { type: batchType.BATCH_READ, * key: new Aerospike.Key('test', 'demo', 'key2'), readAllBins: true }, * { type: batchType.BATCH_READ, * key: new Aerospike.Key('test', 'demo', 'key3'), * ops:[ - * op.read('blob-bin') - * ]} + * op.read('example') + * ]}, + * { type: batchType.BATCH_READ, + * key: new Aerospike.Key('test', 'demo', 'key4')} * ] - * Aerospike.connect(config, (error, client) => { - * if (error) throw error - * client.batchRead(batchRecords, (error, results) => { - * if (error) throw error + * + * + * ;(async () => { + * // Establishes a connection to the server + * let client = await Aerospike.connect(config); + * + * // Place some records for demonstration + * await client.put(batchRecords[0].key, {example: 30}) + * await client.put(batchRecords[1].key, {example: 35}) + * await client.put(batchRecords[2].key, {example: 40}) + * await client.put(batchRecords[3].key, {example: 45}) + * + * let results = await client.batchRead(batchRecords) * results.forEach((result) => { - * switch (result.status) { - * case Aerospike.status.OK: - * console.log("Record found") - * break - * case Aerospike.status.ERR_RECORD_NOT_FOUND: - * console.log("Record not found") - * break - * default: - * // error while reading record - * console.log("Other error") - * break - * } + * + * switch (result.status) { + * case Aerospike.status.OK: + * console.log("Record found") + * // Since the fourth record didn't specify bins to read, + * // the fourth record will return no bins, eventhough the batchRead succeeded. + * console.log(result.record.bins) + * break + * case Aerospike.status.ERR_RECORD_NOT_FOUND: + * console.log("Record not found") + * break + * default: + * // error while reading record + * console.log("Other error") + * break + * } * }) - * client.close() - * }) - * }) + * // Close the connection to the server + * await client.close(); + * })(); */ Client.prototype.batchRead = function (records, policy, callback) { if (typeof policy === 'function') { @@ -1298,41 +1329,109 @@ Client.prototype.batchRead = function (records, policy, callback) { * * @since v5.0.0 * - * @example
datatype
option set to Aerospike.indexDataType.GEO2DSPHERE
.
@@ -1997,6 +2114,61 @@ Client.prototype.createGeo2DSphereIndex = function (options, policy, callback) {
return this.createIndex(options, policy, callback)
}
+/**
+ * @function Client#createBlobIndex
+ *
+ * @summary Creates a blob secondary index index.
+ *
+ * @description This is a short-hand for calling {@link Client#createIndex}
+ * with the datatype
option set to Aerospike.indexDataType.BLOB
.
+ *
+ * @param {Object} options - Options for creating the index.
+ * @param {string} options.ns - The namespace on which the index is to be created.
+ * @param {string} options.set - The set on which the index is to be created.
+ * @param {string} options.bin - The name of the bin which values are to be indexed.
+ * @param {string} options.index - The name of the index to be created.
+ * @param {module:aerospike.indexType} [options.type] - Type of index to be
+ * created based on the type of values stored in the bin. This option needs to
+ * be specified if the bin to be indexed contains list or map values and the
+ * individual entries of the list or keys/values of the map should be indexed.
+ * @param {InfoPolicy} [policy] - The Info Policy to use for this operation.
+ * @param {jobCallback} [callback] - The function to call when the operation completes.
+ *
+ * @returns {?Promise} - If no callback function is passed, the function
+ * returns a Promise that will resolve to an {@link IndexJob} instance.
+ *
+ * @see {@link Client#indexCreate}
+ *
+ * @example
+ *
+ * const Aerospike = require('aerospike')
+ * // INSERT HOSTNAME AND PORT NUMBER OF AEROSPIKE SERVER NODE HERE!
+ * var config = {
+ * hosts: '192.168.33.10:3000',
+ * }
+ *
+ * Aerospike.connect(config, (error, client) => {
+ * if (error) throw error
+ *
+ * var binName = 'location'
+ * var indexName = 'locationIndex'
+ * var options = { ns: 'test',
+ * set: 'demo',
+ * bin: binName,
+ * index: indexName }
+ *
+ * client.createBlobIndex(options, function (error) {
+ * if (error) throw error
+ * console.info('SI %s on %s was created successfully', indexName, binName)
+ * client.close()
+ * })
+ * })
+ */
+Client.prototype.createBlobIndex = function (options, policy, callback) {
+ options.datatype = as.indexDataType.BLOB
+ return this.createIndex(options, policy, callback)
+}
+
/**
* @function Client#apply
*
diff --git a/lib/config.js b/lib/config.js
index 12afacf37..042202b31 100644
--- a/lib/config.js
+++ b/lib/config.js
@@ -400,6 +400,42 @@ class Config {
this.maxConnsPerNode = config.maxConnsPerNode
}
+ /**
+ * @name Config#maxErrorRate
+ *
+ * @summary Maximum number of errors allowed per node per error_rate_window before backoff algorithm returns
+ * AEROSPIKE_MAX_ERROR_RATE for database commands to that node. If max_error_rate is zero, there is no error limit.
+ * The counted error types are any error that causes the connection to close (socket errors and client timeouts),
+ * server device overload and server timeouts.
+ *
+ * The application should backoff or reduce the transaction load until AEROSPIKE_MAX_ERROR_RATE stops being returned.
+ *
+ * @description If the backoff algorithm has been activated, transactions will fail with {@link
+ * module:aerospike/status.AEROSPIKE_MAX_ERROR_RATE|AEROSPIKE_MAX_ERROR_RATE} until the {@link Config#errorRateWindow} has passed and the
+ * error count has been reset.
+ *
+ * @type {number}
+ *
+ * @default 100
+ */
+ if (Number.isInteger(config.maxErrorRate)) {
+ this.maxErrorRate = config.maxErrorRate
+ }
+
+ /**
+ * @name Config#errorRateWindow
+ *
+ * @summary The number of cluster tend iterations that defines the window for {@link Config#maxErrorRate} to be surpassed. One tend iteration is defined
+ * as {@link Config#tendInterval} plus the time to tend all nodes. At the end of the window, the error count is reset to zero and backoff state is removed on all nodes.
+ *
+ * @type {number}
+ *
+ * @default 1
+ */
+ if (Number.isInteger(config.errorRateWindow)) {
+ this.errorRateWindow = config.errorRateWindow
+ }
+
/**
* @name Config#minConnsPerNode
*
diff --git a/lib/exp.js b/lib/exp.js
index b6a853719..933f97b23 100644
--- a/lib/exp.js
+++ b/lib/exp.js
@@ -18,6 +18,8 @@
const as = require('bindings')('aerospike.node')
const exp = as.exp
+const writeFlags = as.expWriteFlags
+const readFlags = as.expReadFlags
const BIN_TYPE_UNDEF = 0
/**
@@ -430,6 +432,8 @@ exports.setName = _metaExp(exp.ops.SET_NAME)
* Create expression that returns record size on disk. If server storage-engine is
* memory, then zero is returned. This expression usually evaluates quickly
* because record meta data is cached in memory.
+ * Requires server version between 5.3.0 inclusive and 7.0 exclusive.
+ * Use {@link #recordSize} for server version 7.0+.
*
* @function
* @return {AerospikeExp} integer value Uncompressed storage size of the record.
@@ -489,13 +493,25 @@ exports.isTombstone = _metaExp(exp.ops.IS_TOMBSTONE)
* storage-engine is memory or data-in-memory is true, otherwise returns 0.
* This expression usually evaluates quickly because record meta data is cached
* in memory.
- * Requires server version 5.3.0+.
+ * Requires server version between 5.3.0 inclusive and 7.0 exclusive.
+ * Use {@link #recordSize} for server version 7.0+.
*
* @function
* @return {AerospikeExp} integer value memory size of the record.
*/
exports.memorySize = _metaExp(exp.ops.MEMORY_SIZE)
+/**
+ * Create expression that returns the record size. This expression usually evaluates
+ * quickly because record meta data is cached in memory.
+ * Requires server version 7.0+. This expression replaces {@link #deviceSize} and
+ * {@link #memorySize} since those older expressions are equivalent on server version 7.0+.
+ *
+ * @function
+ * @return {AerospikeExp} integer value size of the record in Megabytes.
+ */
+exports.recordSize = _metaExp(exp.ops.RECORD_SIZE)
+
/**
* Create expression that returns record digest modulo as integer.
*
@@ -1010,3 +1026,67 @@ exports.bit = require('./exp_bit')
* @summary HyperLogLog expressions.
*/
exports.hll = require('./exp_hll')
+
+/**
+ *
+ * @readonly
+ * @enum {number}
+ * @description Expression read bit flags. Use BITWISE OR to combine flags.
+ */
+exports.expReadFlags = {
+ /**
+ * Default.
+ * @const {number}
+ */
+ DEFAULT: readFlags.DEFAULT,
+
+ /**
+ * Ignore failures caused by the expression resolving to unknown or a non-bin type.
+ * @const {number}
+ */
+ EVAL_NO_FAIL: readFlags.EVAL_NO_FAIL
+}
+
+/**
+ *
+ * @readonly
+ * @enum {number}
+ * @description Expression write bit flags. Use BITWISE OR to combine flags.
+ */
+exports.expWriteFlags = {
+ /**
+ * Default.
+ * @const {number}
+ */
+ DEFAULT: writeFlags.DEFAULT,
+
+ /**
+ * If bin does not exist, a new bin will be created.
+ * @const {number}
+ */
+ CREATE_ONLY: writeFlags.CREATE_ONLY,
+
+ /**
+ * If bin exists, the bin will be overwritten.
+ * @const {number}
+ */
+ UPDATE_ONLY: writeFlags.UPDATE_ONLY,
+
+ /**
+ * If expression results in nil value, then delete the bin.
+ * @const {number}
+ */
+ ALLOW_DELETE: writeFlags.ALLOW_DELETE,
+
+ /**
+ * Do not raise error if operation is denied.
+ * @const {number}
+ */
+ POLICY_NO_FAIL: writeFlags.POLICY_NO_FAIL,
+
+ /**
+ * Ignore failures caused by the expression resolving to unknown or a non-bin type.
+ * @const {number}
+ */
+ EVAL_NO_FAIL: writeFlags.EVAL_NO_FAIL
+}
diff --git a/lib/exp_operations.js b/lib/exp_operations.js
index 5ab142db7..c0c88bc93 100644
--- a/lib/exp_operations.js
+++ b/lib/exp_operations.js
@@ -48,7 +48,7 @@
* op.incr('b', 10),
* exp.operations.read(tempBin,
* exp.add(exp.binInt('b'), exp.binInt('b')),
- * 0),
+ * exp.expReadFlags.DEFAULT),
* op.read('a'),
* op.read('b')
* ]
@@ -96,6 +96,9 @@ exports.ExpOperation = ExpOperation
* @summary Read the value of the bin.
*
* @param {string} bin - The name of the bin.
+ * @param {string} name - The name of bin to store expression result
+ * @param {AerospikeExp} exp - The expression to evaluate
+ * @param flags - Expression read flags. flags
must be an integer. See {@link exp.expReadFlags} for more information.
* @returns {Operation} Operation that can be passed to the {@link Client#operate} command.
*/
exports.read = function (bin, exp, flags) {
@@ -107,6 +110,9 @@ exports.read = function (bin, exp, flags) {
*
* @param {string} bin - The name of the bin.
* @param {any} value - The value to set the bin to.
+ * @param {string} binName - The variable name of read expression result. This name can be used as the bin name when retrieving bin results from the record.
+ * @param {AerospikeExp} exp - The expression to evaluate
+ * @param flags - Expression write flags. flags
must be an integer. See {@link exp.expWriteFlags} for more information.
* @returns {Operation} Operation that can be passed to the {@link Client#operate} command.
*/
exports.write = function (bin, exp, flags) {
diff --git a/lib/filter.js b/lib/filter.js
index 0c820786e..3cfd362ee 100644
--- a/lib/filter.js
+++ b/lib/filter.js
@@ -110,6 +110,10 @@ function dataTypeOf (value) {
case 'double':
return as.indexDataType.NUMERIC
default:
+ if (Buffer.isBuffer(value)) {
+ return as.indexDataType.BLOB
+ }
+
throw new TypeError('Unknown data type for filter value.')
}
}
diff --git a/lib/maps.js b/lib/maps.js
index 0b9c40987..49dec454d 100644
--- a/lib/maps.js
+++ b/lib/maps.js
@@ -1275,3 +1275,54 @@ exports.getByRankRange = function (bin, rank, count, returnType) {
op.returnType = returnType
return op
}
+
+/**
+ * @summary Creates map create operation.
+ *
+ *
+ * @param {string} bin - bin name.
+ * @param {number} order - map order.
+ * @param {persistIndex} count - if true, persist map index. A map index improves lookup performance, but requires more storage.
+ * A map index can be created for a top-level ordered map only. Nested and unordered map indexes are not supported.
+ * @param {number} ctx - optional path to nested map. If not defined, the top-level map is used.
+ *
+ * @returns {Object} Operation that can be passed to the {@link Client#operate} command.
+ *
+ * @example
+ *
+ * const Aerospike = require('aerospike')
+ * const maps = Aerospike.maps
+ * const key = new Aerospike.Key('test', 'demo', 'mapKey')
+ *
+ * // INSERT HOSTNAME AND PORT NUMBER OF AEROSPIKE SERVER NODE HERE!
+ * var config = {
+ * hosts: '192.168.33.10:3000',
+ * // Timeouts disabled, latency dependent on server location. Configure as needed.
+ * policies: {
+ * operate : new Aerospike.OperatePolicy({socketTimeout : 0, totalTimeout : 0})
+ * }
+ * }
+ *
+ * Aerospike.connect(config).then(async client => {
+ * let ops = [
+ * maps.create('map', maps.order.KEY_ORDERED, true)
+ * ]
+ * let result = await client.operate(key, ops)
+ * console.log(result.bins) // => { map: null }
+ * let record = await client.get(key)
+ * console.log(record.bins) // => { map: {} }
+ *
+ * await client.remove(key)
+ * client.close()
+ * })
+ */
+exports.create = function (bin, order, persistIndex = false, ctx) {
+ const op = new MapOperation(opcodes.MAP_CREATE, bin)
+ op.order = order
+ op.persistIndex = persistIndex
+ if (ctx === undefined) {
+ return op
+ }
+
+ return op.withContext(ctx)
+}
diff --git a/package-lock.json b/package-lock.json
index 42991f5e4..ccd1f906d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "aerospike",
- "version": "5.8.0",
+ "version": "5.9.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "aerospike",
- "version": "5.8.0",
+ "version": "5.9.0",
"cpu": [
"x64",
"arm64"
@@ -83,18 +83,18 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz",
- "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==",
+ "version": "7.23.2",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz",
+ "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz",
- "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==",
+ "version": "7.23.2",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz",
+ "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
@@ -102,10 +102,10 @@
"@babel/generator": "^7.23.0",
"@babel/helper-compilation-targets": "^7.22.15",
"@babel/helper-module-transforms": "^7.23.0",
- "@babel/helpers": "^7.23.0",
+ "@babel/helpers": "^7.23.2",
"@babel/parser": "^7.23.0",
"@babel/template": "^7.22.15",
- "@babel/traverse": "^7.23.0",
+ "@babel/traverse": "^7.23.2",
"@babel/types": "^7.23.0",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
@@ -308,13 +308,13 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.23.1",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz",
- "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==",
+ "version": "7.23.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz",
+ "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==",
"dev": true,
"dependencies": {
"@babel/template": "^7.22.15",
- "@babel/traverse": "^7.23.0",
+ "@babel/traverse": "^7.23.2",
"@babel/types": "^7.23.0"
},
"engines": {
@@ -362,9 +362,9 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz",
- "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==",
+ "version": "7.23.2",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
+ "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.22.13",
@@ -553,9 +553,9 @@
"dev": true
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.19",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
- "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+ "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
"dev": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@@ -970,9 +970,9 @@
"dev": true
},
"node_modules/browserslist": {
- "version": "4.21.11",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz",
- "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==",
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
+ "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
"dev": true,
"funding": [
{
@@ -989,8 +989,8 @@
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001538",
- "electron-to-chromium": "^1.4.526",
+ "caniuse-lite": "^1.0.30001541",
+ "electron-to-chromium": "^1.4.535",
"node-releases": "^2.0.13",
"update-browserslist-db": "^1.0.13"
},
@@ -1045,13 +1045,14 @@
}
},
"node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
"dev": true,
"dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -1076,9 +1077,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001539",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz",
- "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==",
+ "version": "1.0.30001561",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz",
+ "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==",
"dev": true,
"funding": [
{
@@ -1096,18 +1097,18 @@
]
},
"node_modules/chai": {
- "version": "4.3.8",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz",
- "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==",
+ "version": "4.3.10",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz",
+ "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==",
"dev": true,
"dependencies": {
"assertion-error": "^1.1.0",
- "check-error": "^1.0.2",
- "deep-eql": "^4.1.2",
- "get-func-name": "^2.0.0",
- "loupe": "^2.3.1",
+ "check-error": "^1.0.3",
+ "deep-eql": "^4.1.3",
+ "get-func-name": "^2.0.2",
+ "loupe": "^2.3.6",
"pathval": "^1.1.1",
- "type-detect": "^4.0.5"
+ "type-detect": "^4.0.8"
},
"engines": {
"node": ">=4"
@@ -1128,10 +1129,13 @@
}
},
"node_modules/check-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
"dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.2"
+ },
"engines": {
"node": "*"
}
@@ -1364,9 +1368,9 @@
}
},
"node_modules/define-data-property": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz",
- "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+ "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.1",
@@ -1438,9 +1442,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.530",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.530.tgz",
- "integrity": "sha512-rsJ9O8SCI4etS8TBsXuRfHa2eZReJhnGf5MHZd3Vo05PukWHKXhk3VQGbHHnDLa8nZz9woPCpLCMQpLGgkGNRA==",
+ "version": "1.4.578",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.578.tgz",
+ "integrity": "sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -1493,26 +1497,26 @@
}
},
"node_modules/es-abstract": {
- "version": "1.22.2",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz",
- "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==",
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
+ "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
"dev": true,
"dependencies": {
"array-buffer-byte-length": "^1.0.0",
"arraybuffer.prototype.slice": "^1.0.2",
"available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
+ "call-bind": "^1.0.5",
"es-set-tostringtag": "^2.0.1",
"es-to-primitive": "^1.2.1",
"function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.1",
+ "get-intrinsic": "^1.2.2",
"get-symbol-description": "^1.0.0",
"globalthis": "^1.0.3",
"gopd": "^1.0.1",
- "has": "^1.0.3",
"has-property-descriptors": "^1.0.0",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
+ "hasown": "^2.0.0",
"internal-slot": "^1.0.5",
"is-array-buffer": "^3.0.2",
"is-callable": "^1.2.7",
@@ -1522,7 +1526,7 @@
"is-string": "^1.0.7",
"is-typed-array": "^1.1.12",
"is-weakref": "^1.0.2",
- "object-inspect": "^1.12.3",
+ "object-inspect": "^1.13.1",
"object-keys": "^1.1.1",
"object.assign": "^4.1.4",
"regexp.prototype.flags": "^1.5.1",
@@ -1536,7 +1540,7 @@
"typed-array-byte-offset": "^1.0.0",
"typed-array-length": "^1.0.4",
"unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.11"
+ "which-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
@@ -1546,26 +1550,26 @@
}
},
"node_modules/es-set-tostringtag": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
- "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
+ "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "has-tostringtag": "^1.0.0"
+ "get-intrinsic": "^1.2.2",
+ "has-tostringtag": "^1.0.0",
+ "hasown": "^2.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-shim-unscopables": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
- "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
"dev": true,
"dependencies": {
- "has": "^1.0.3"
+ "hasown": "^2.0.0"
}
},
"node_modules/es-to-primitive": {
@@ -1991,12 +1995,12 @@
}
},
"node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.4",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
- "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
"dev": true,
"dependencies": {
- "is-core-module": "^2.9.0",
+ "is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
@@ -2374,12 +2378,12 @@
}
},
"node_modules/flat-cache": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz",
- "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz",
+ "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==",
"dev": true,
"dependencies": {
- "flatted": "^3.2.7",
+ "flatted": "^3.2.9",
"keyv": "^4.5.3",
"rimraf": "^3.0.2"
},
@@ -2510,10 +2514,13 @@
}
},
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/function.prototype.name": {
"version": "1.1.6",
@@ -2595,15 +2602,15 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
- "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
"dev": true,
"dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
+ "function-bind": "^1.1.2",
"has-proto": "^1.0.1",
- "has-symbols": "^1.0.3"
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -2728,13 +2735,10 @@
}
},
"node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
+ "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
"dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
"engines": {
"node": ">= 0.4.0"
}
@@ -2758,12 +2762,12 @@
}
},
"node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.1.1"
+ "get-intrinsic": "^1.2.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -2829,6 +2833,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -2994,13 +3010,13 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/internal-slot": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
- "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
+ "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
"dev": true,
"dependencies": {
- "get-intrinsic": "^1.2.0",
- "has": "^1.0.3",
+ "get-intrinsic": "^1.2.2",
+ "hasown": "^2.0.0",
"side-channel": "^1.0.4"
},
"engines": {
@@ -3085,12 +3101,12 @@
}
},
"node_modules/is-core-module": {
- "version": "2.13.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
- "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
"dev": true,
"dependencies": {
- "has": "^1.0.3"
+ "hasown": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -3326,9 +3342,9 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"node_modules/istanbul-lib-coverage": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
- "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.1.tgz",
+ "integrity": "sha512-opCrKqbthmq3SKZ10mFMQG9dk3fTa3quaOLD35kJa5ejwZHd9xAr+kLuziiZz2cG32s4lMZxNdmdcEQnTDP4+g==",
"dev": true,
"engines": {
"node": ">=8"
@@ -3603,9 +3619,9 @@
}
},
"node_modules/keyv": {
- "version": "4.5.3",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
- "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
"dependencies": {
"json-buffer": "3.0.1"
@@ -3780,12 +3796,12 @@
}
},
"node_modules/loupe": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
- "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
"dev": true,
"dependencies": {
- "get-func-name": "^2.0.0"
+ "get-func-name": "^2.0.1"
}
},
"node_modules/lru-cache": {
@@ -4542,9 +4558,9 @@
}
},
"node_modules/object-inspect": {
- "version": "1.12.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
- "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -5176,9 +5192,9 @@
}
},
"node_modules/punycode": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
- "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
"engines": {
"node": ">=6"
@@ -5384,9 +5400,9 @@
"dev": true
},
"node_modules/resolve": {
- "version": "1.22.6",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",
- "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==",
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
"dev": true,
"dependencies": {
"is-core-module": "^2.13.0",
@@ -5522,6 +5538,21 @@
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
},
+ "node_modules/set-function-length": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
+ "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/set-function-name": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
@@ -5723,9 +5754,9 @@
}
},
"node_modules/spdx-license-ids": {
- "version": "3.0.15",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz",
- "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==",
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
+ "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
"dev": true
},
"node_modules/sprintf-js": {
@@ -6429,13 +6460,13 @@
"dev": true
},
"node_modules/which-typed-array": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
- "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
+ "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
"dev": true,
"dependencies": {
"available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
+ "call-bind": "^1.0.4",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
"has-tostringtag": "^1.0.0"
diff --git a/package.json b/package.json
index ef73e0666..fe749294e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "aerospike",
- "version": "5.8.0",
+ "version": "5.9.0",
"description": "Aerospike Client Library",
"keywords": [
"aerospike",
diff --git a/scripts/build-package.ps1 b/scripts/build-package.ps1
index f5ed6f579..36afce550 100644
--- a/scripts/build-package.ps1
+++ b/scripts/build-package.ps1
@@ -35,6 +35,17 @@ function build_nodejs_client {
build_nodejs_client v18
+Copy-Item -Recurse build\release\* lib\binding\node-v108-win32-x64
+Remove-Item .\lib\binding\node-v108-win32-x64\obj
+Remove-Item .\lib\binding\node-v108-win32-x64\aerospike.pdb
+Remove-Item .\lib\binding\node-v108-win32-x64\aerospike.ipdb
+Remove-Item .\lib\binding\node-v108-win32-x64\aerospike.iobj
+
build_nodejs_client v20
+Copy-Item -Recurse build\release\* lib\binding\node-v115-win32-x64
+Remove-Item -Recurse .\lib\binding\node-v115-win32-x64\obj
+Remove-Item .\lib\binding\node-v115-win32-x64\aerospike.pdb
+Remove-Item .\lib\binding\node-v115-win32-x64\aerospike.ipdb
+Remove-Item .\lib\binding\node-v115-win32-x64\aerospike.iobj
nvm use v18.12.1
diff --git a/src/include/enums.h b/src/include/enums.h
index 66815551d..6aff4cdfa 100644
--- a/src/include/enums.h
+++ b/src/include/enums.h
@@ -41,3 +41,6 @@ v8::Local