You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-07 13:22:56 +03:00
Release 4.0.0-rc.1 (#1648)
* update workflows & README * add .deepsource.toml * fix client.quit, add error events on cluster, fix some "deepsource.io" warnings * Release 4.0.0-rc.1
This commit is contained in:
9
.deepsource.toml
Normal file
9
.deepsource.toml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
version = 1
|
||||||
|
|
||||||
|
[[analyzers]]
|
||||||
|
name = "javascript"
|
||||||
|
enabled = true
|
||||||
|
|
||||||
|
[analyzers.meta]
|
||||||
|
environment = ["nodejs"]
|
||||||
|
dialect = "typescript"
|
3
.github/workflows/benchmark.yml
vendored
3
.github/workflows/benchmark.yml
vendored
@@ -3,7 +3,8 @@ name: Benchmark
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- v4
|
- master
|
||||||
|
- v4.0
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
benchmark:
|
benchmark:
|
||||||
|
3
.github/workflows/documentation.yml
vendored
3
.github/workflows/documentation.yml
vendored
@@ -3,7 +3,8 @@ name: Documentation
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- v4
|
- master
|
||||||
|
- v4.0
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
documentation:
|
documentation:
|
||||||
|
3
.github/workflows/tests.yml
vendored
3
.github/workflows/tests.yml
vendored
@@ -3,7 +3,8 @@ name: Tests
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- v4
|
- master
|
||||||
|
- v4.0
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<a href="https://coveralls.io/github/NodeRedis/node-redis?branch=v4">
|
<a href="https://coveralls.io/github/NodeRedis/node-redis">
|
||||||
<img src="https://coveralls.io/repos/github/NodeRedis/node-redis/badge.svg?branch=v4" alt="Coverage Status"/>
|
<img src="https://coveralls.io/repos/github/NodeRedis/node-redis/badge.svg" alt="Coverage Status"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://www.npmjs.com/package/redis/v/next">
|
<a href="https://www.npmjs.com/package/redis/v/next">
|
||||||
<img src="https://img.shields.io/npm/dm/redis.svg" alt="Downloads"/>
|
<img src="https://img.shields.io/npm/dm/redis.svg" alt="Downloads"/>
|
||||||
|
@@ -298,9 +298,10 @@ export default class RedisClient<M extends RedisModules = RedisModules, S extend
|
|||||||
}
|
}
|
||||||
|
|
||||||
QUIT(): Promise<void> {
|
QUIT(): Promise<void> {
|
||||||
return this.#socket.quit(async () => {
|
return this.#socket.quit(() => {
|
||||||
this.#queue.addEncodedCommand(encodeCommand(['QUIT']));
|
const promise = this.#queue.addEncodedCommand(encodeCommand(['QUIT']));
|
||||||
this.#tick();
|
this.#tick();
|
||||||
|
return promise;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -17,54 +17,40 @@ interface SlotNodes<M extends RedisModules, S extends RedisLuaScripts> {
|
|||||||
clientIterator: IterableIterator<RedisClientType<M, S>> | undefined;
|
clientIterator: IterableIterator<RedisClientType<M, S>> | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OnError = (err: unknown) => void;
|
||||||
|
|
||||||
export default class RedisClusterSlots<M extends RedisModules, S extends RedisLuaScripts> {
|
export default class RedisClusterSlots<M extends RedisModules, S extends RedisLuaScripts> {
|
||||||
readonly #options: RedisClusterOptions;
|
readonly #options: RedisClusterOptions;
|
||||||
|
readonly #onError: OnError;
|
||||||
readonly #nodeByUrl = new Map<string, ClusterNode<M, S>>();
|
readonly #nodeByUrl = new Map<string, ClusterNode<M, S>>();
|
||||||
readonly #slots: Array<SlotNodes<M, S>> = [];
|
readonly #slots: Array<SlotNodes<M, S>> = [];
|
||||||
|
|
||||||
constructor(options: RedisClusterOptions) {
|
constructor(options: RedisClusterOptions, onError: OnError) {
|
||||||
this.#options = options;
|
this.#options = options;
|
||||||
|
this.#onError = onError;
|
||||||
}
|
}
|
||||||
|
|
||||||
async connect(): Promise<void> {
|
async connect(): Promise<void> {
|
||||||
for (const rootNode of this.#options.rootNodes) {
|
for (const rootNode of this.#options.rootNodes) {
|
||||||
try {
|
if (await this.#discoverNodes(rootNode)) return;
|
||||||
await this.#discoverNodes(rootNode);
|
|
||||||
return;
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
// this.emit('error', err);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error('None of the root nodes is available');
|
throw new Error('None of the root nodes is available');
|
||||||
}
|
}
|
||||||
|
|
||||||
async discover(startWith: RedisClientType<M, S>): Promise<void> {
|
async discover(startWith: RedisClientType<M, S>): Promise<void> {
|
||||||
try {
|
if (await this.#discoverNodes(startWith.options?.socket)) return;
|
||||||
await this.#discoverNodes(startWith.options?.socket);
|
|
||||||
return;
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
// this.emit('error', err);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const { client } of this.#nodeByUrl.values()) {
|
for (const { client } of this.#nodeByUrl.values()) {
|
||||||
if (client === startWith) continue;
|
if (client === startWith) continue;
|
||||||
|
|
||||||
try {
|
if (await this.#discoverNodes(client.options?.socket)) return;
|
||||||
await this.#discoverNodes(client.options?.socket);
|
|
||||||
return;
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
// this.emit('error', err);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error('None of the cluster nodes is available');
|
throw new Error('None of the cluster nodes is available');
|
||||||
}
|
}
|
||||||
|
|
||||||
async #discoverNodes(socketOptions?: RedisSocketOptions): Promise<void> {
|
async #discoverNodes(socketOptions?: RedisSocketOptions): Promise<boolean> {
|
||||||
const client = RedisClient.create({
|
const client = RedisClient.create({
|
||||||
socket: socketOptions
|
socket: socketOptions
|
||||||
});
|
});
|
||||||
@@ -73,8 +59,14 @@ export default class RedisClusterSlots<M extends RedisModules, S extends RedisLu
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
await this.#reset(await client.clusterNodes());
|
await this.#reset(await client.clusterNodes());
|
||||||
|
return true;
|
||||||
|
} catch (err) {
|
||||||
|
this.#onError(err);
|
||||||
|
return false;
|
||||||
} finally {
|
} finally {
|
||||||
await client.disconnect(); // TODO: catch error from disconnect?
|
if (client.isOpen) {
|
||||||
|
await client.disconnect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,7 +94,6 @@ export default class RedisClusterSlots<M extends RedisModules, S extends RedisLu
|
|||||||
for (const [url, { client }] of this.#nodeByUrl.entries()) {
|
for (const [url, { client }] of this.#nodeByUrl.entries()) {
|
||||||
if (clientsInUse.has(url)) continue;
|
if (clientsInUse.has(url)) continue;
|
||||||
|
|
||||||
// TODO: ignore error from `.disconnect`?
|
|
||||||
promises.push(client.disconnect());
|
promises.push(client.disconnect());
|
||||||
this.#nodeByUrl.delete(url);
|
this.#nodeByUrl.delete(url);
|
||||||
}
|
}
|
||||||
|
@@ -5,6 +5,7 @@ import RedisClusterSlots, { ClusterNode } from './cluster-slots';
|
|||||||
import { RedisLuaScript, RedisLuaScripts } from './lua-script';
|
import { RedisLuaScript, RedisLuaScripts } from './lua-script';
|
||||||
import { extendWithModulesAndScripts, extendWithDefaultCommands, transformCommandArguments } from './commander';
|
import { extendWithModulesAndScripts, extendWithDefaultCommands, transformCommandArguments } from './commander';
|
||||||
import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command';
|
import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command';
|
||||||
|
import { EventEmitter } from 'events';
|
||||||
|
|
||||||
export interface RedisClusterOptions<M = RedisModules, S = RedisLuaScripts> {
|
export interface RedisClusterOptions<M = RedisModules, S = RedisLuaScripts> {
|
||||||
rootNodes: Array<RedisSocketOptions>;
|
rootNodes: Array<RedisSocketOptions>;
|
||||||
@@ -17,7 +18,7 @@ export interface RedisClusterOptions<M = RedisModules, S = RedisLuaScripts> {
|
|||||||
export type RedisClusterType<M extends RedisModules, S extends RedisLuaScripts> =
|
export type RedisClusterType<M extends RedisModules, S extends RedisLuaScripts> =
|
||||||
WithPlugins<M, S> & RedisCluster;
|
WithPlugins<M, S> & RedisCluster;
|
||||||
|
|
||||||
export default class RedisCluster<M extends RedisModules = RedisModules, S extends RedisLuaScripts = RedisLuaScripts> {
|
export default class RedisCluster<M extends RedisModules = RedisModules, S extends RedisLuaScripts = RedisLuaScripts> extends EventEmitter {
|
||||||
static #extractFirstKey(command: RedisCommand, originalArgs: Array<unknown>, redisArgs: Array<string>): string | undefined {
|
static #extractFirstKey(command: RedisCommand, originalArgs: Array<unknown>, redisArgs: Array<string>): string | undefined {
|
||||||
if (command.FIRST_KEY_INDEX === undefined) {
|
if (command.FIRST_KEY_INDEX === undefined) {
|
||||||
return undefined;
|
return undefined;
|
||||||
@@ -83,8 +84,10 @@ export default class RedisCluster<M extends RedisModules = RedisModules, S exten
|
|||||||
readonly #Multi: new (...args: ConstructorParameters<typeof RedisMultiCommand>) => RedisMultiCommandType<M, S>;
|
readonly #Multi: new (...args: ConstructorParameters<typeof RedisMultiCommand>) => RedisMultiCommandType<M, S>;
|
||||||
|
|
||||||
constructor(options: RedisClusterOptions<M, S>) {
|
constructor(options: RedisClusterOptions<M, S>) {
|
||||||
|
super();
|
||||||
|
|
||||||
this.#options = options;
|
this.#options = options;
|
||||||
this.#slots = new RedisClusterSlots(options);
|
this.#slots = new RedisClusterSlots(options, err => this.emit('error', err));
|
||||||
this.#Multi = RedisMultiCommand.extend(options);
|
this.#Multi = RedisMultiCommand.extend(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -97,12 +97,12 @@ export function transformCommandArguments<T = unknown>(
|
|||||||
export function encodeCommand(args: Array<string>): string {
|
export function encodeCommand(args: Array<string>): string {
|
||||||
const encoded = [
|
const encoded = [
|
||||||
`*${args.length}`,
|
`*${args.length}`,
|
||||||
`$${Buffer.byteLength(args[0])}`,
|
`$${Buffer.byteLength(args[0]).toString()}`,
|
||||||
args[0]
|
args[0]
|
||||||
];
|
];
|
||||||
|
|
||||||
for (let i = 1; i < args.length; i++) {
|
for (let i = 1; i < args.length; i++) {
|
||||||
encoded.push(`$${Buffer.byteLength(args[i])}`, args[i]);
|
encoded.push(`$${Buffer.byteLength(args[i]).toString()}`, args[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return encoded.join('\r\n') + '\r\n';
|
return encoded.join('\r\n') + '\r\n';
|
||||||
|
@@ -12,6 +12,7 @@ export interface QueueCommandOptions {
|
|||||||
|
|
||||||
interface CommandWaitingToBeSent extends CommandWaitingForReply {
|
interface CommandWaitingToBeSent extends CommandWaitingForReply {
|
||||||
encodedCommand: string;
|
encodedCommand: string;
|
||||||
|
byteLength: number;
|
||||||
chainId?: symbol;
|
chainId?: symbol;
|
||||||
abort?: {
|
abort?: {
|
||||||
signal: any; // TODO: `AbortSignal` type is incorrect
|
signal: any; // TODO: `AbortSignal` type is incorrect
|
||||||
@@ -130,6 +131,7 @@ export default class RedisCommandsQueue {
|
|||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const node = new LinkedList.Node<CommandWaitingToBeSent>({
|
const node = new LinkedList.Node<CommandWaitingToBeSent>({
|
||||||
encodedCommand,
|
encodedCommand,
|
||||||
|
byteLength: Buffer.byteLength(encodedCommand),
|
||||||
chainId: options?.chainId,
|
chainId: options?.chainId,
|
||||||
resolve,
|
resolve,
|
||||||
reject
|
reject
|
||||||
@@ -156,7 +158,7 @@ export default class RedisCommandsQueue {
|
|||||||
this.#waitingToBeSent.pushNode(node);
|
this.#waitingToBeSent.pushNode(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.#waitingToBeSentCommandsLength += encodedCommand.length;
|
this.#waitingToBeSentCommandsLength += node.value.byteLength;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,8 +232,12 @@ export default class RedisCommandsQueue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.#pubSubState[inProgressKey] += channelsCounter;
|
this.#pubSubState[inProgressKey] += channelsCounter;
|
||||||
|
|
||||||
|
const encodedCommand = encodeCommand(commandArgs),
|
||||||
|
byteLength = Buffer.byteLength(encodedCommand);
|
||||||
this.#waitingToBeSent.push({
|
this.#waitingToBeSent.push({
|
||||||
encodedCommand: encodeCommand(commandArgs),
|
encodedCommand,
|
||||||
|
byteLength,
|
||||||
channelsCounter,
|
channelsCounter,
|
||||||
resolve: () => {
|
resolve: () => {
|
||||||
this.#pubSubState[inProgressKey] -= channelsCounter;
|
this.#pubSubState[inProgressKey] -= channelsCounter;
|
||||||
@@ -243,6 +249,7 @@ export default class RedisCommandsQueue {
|
|||||||
reject();
|
reject();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
this.#waitingToBeSentCommandsLength += byteLength;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,7 +275,7 @@ export default class RedisCommandsQueue {
|
|||||||
lastCommandChainId: symbol | undefined;
|
lastCommandChainId: symbol | undefined;
|
||||||
for (const command of this.#waitingToBeSent) {
|
for (const command of this.#waitingToBeSent) {
|
||||||
encoded.push(command.encodedCommand);
|
encoded.push(command.encodedCommand);
|
||||||
size += command.encodedCommand.length;
|
size += command.byteLength;
|
||||||
if (size > recommendedSize) {
|
if (size > recommendedSize) {
|
||||||
lastCommandChainId = command.chainId;
|
lastCommandChainId = command.chainId;
|
||||||
break;
|
break;
|
||||||
|
@@ -19,7 +19,7 @@ export function transformArguments(
|
|||||||
isKeyString = typeof key === 'string';
|
isKeyString = typeof key === 'string';
|
||||||
|
|
||||||
if (isKeyString) {
|
if (isKeyString) {
|
||||||
args.push(key as string);
|
args.push(key);
|
||||||
} else {
|
} else {
|
||||||
args.push('""');
|
args.push('""');
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
import { strict as assert } from 'assert';
|
import { strict as assert } from 'assert';
|
||||||
import { isObject } from 'util';
|
|
||||||
import {
|
import {
|
||||||
transformReplyBoolean,
|
transformReplyBoolean,
|
||||||
transformReplyBooleanArray,
|
transformReplyBooleanArray,
|
||||||
|
98
package-lock.json
generated
98
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "redis",
|
"name": "redis",
|
||||||
"version": "4.0.0-rc.0",
|
"version": "4.0.0-rc.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "redis",
|
"name": "redis",
|
||||||
"version": "4.0.0-rc.0",
|
"version": "4.0.0-rc.1",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cluster-key-slot": "1.1.0",
|
"cluster-key-slot": "1.1.0",
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@istanbuljs/nyc-config-typescript": "^1.0.1",
|
"@istanbuljs/nyc-config-typescript": "^1.0.1",
|
||||||
"@types/mocha": "^9.0.0",
|
"@types/mocha": "^9.0.0",
|
||||||
"@types/node": "^16.7.8",
|
"@types/node": "^16.7.10",
|
||||||
"@types/sinon": "^10.0.2",
|
"@types/sinon": "^10.0.2",
|
||||||
"@types/which": "^2.0.1",
|
"@types/which": "^2.0.1",
|
||||||
"@types/yallist": "^4.0.1",
|
"@types/yallist": "^4.0.1",
|
||||||
@@ -642,9 +642,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/graphql": {
|
"node_modules/@octokit/graphql": {
|
||||||
"version": "4.7.0",
|
"version": "4.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
|
||||||
"integrity": "sha512-diY0qMPyQjfu4rDu3kDhJ9qIZadIm4IISO3RJSv9ajYUWJUCO0AykbgzLcg1xclxtXgzY583u3gAv66M6zz5SA==",
|
"integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/request": "^5.6.0",
|
"@octokit/request": "^5.6.0",
|
||||||
@@ -653,18 +653,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/openapi-types": {
|
"node_modules/@octokit/openapi-types": {
|
||||||
"version": "9.7.0",
|
"version": "10.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.0.0.tgz",
|
||||||
"integrity": "sha512-TUJ16DJU8mekne6+KVcMV5g6g/rJlrnIKn7aALG9QrNpnEipFc1xjoarh0PKaAWf2Hf+HwthRKYt+9mCm5RsRg==",
|
"integrity": "sha512-k1iO2zKuEjjRS1EJb4FwSLk+iF6EGp+ZV0OMRViQoWhQ1fZTk9hg1xccZII5uyYoiqcbC73MRBmT45y1vp2PPg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/plugin-paginate-rest": {
|
"node_modules/@octokit/plugin-paginate-rest": {
|
||||||
"version": "2.15.1",
|
"version": "2.16.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.15.1.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.0.tgz",
|
||||||
"integrity": "sha512-47r52KkhQDkmvUKZqXzA1lKvcyJEfYh3TKAIe5+EzMeyDM3d+/s5v11i2gTk8/n6No6DPi3k5Ind6wtDbo/AEg==",
|
"integrity": "sha512-8YYzALPMvEZ35kgy5pdYvQ22Roz+BIuEaedO575GwE2vb/ACDqQn0xQrTJR4tnZCJn7pi8+AWPVjrFDaERIyXQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/types": "^6.24.0"
|
"@octokit/types": "^6.26.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@octokit/core": ">=2"
|
"@octokit/core": ">=2"
|
||||||
@@ -730,12 +730,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/types": {
|
"node_modules/@octokit/types": {
|
||||||
"version": "6.25.0",
|
"version": "6.26.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.25.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.26.0.tgz",
|
||||||
"integrity": "sha512-bNvyQKfngvAd/08COlYIN54nRgxskmejgywodizQNyiKoXmWRAjKup2/LYwm+T9V0gsKH6tuld1gM0PzmOiB4Q==",
|
"integrity": "sha512-RDxZBAFMtqs1ZPnbUu1e7ohPNfoNhTiep4fErY7tZs995BeHu369Vsh5woMIaFbllRWEZBfvTCS4hvDnMPiHrA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/openapi-types": "^9.5.0"
|
"@octokit/openapi-types": "^10.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sindresorhus/is": {
|
"node_modules/@sindresorhus/is": {
|
||||||
@@ -855,9 +855,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "16.7.8",
|
"version": "16.7.10",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.8.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz",
|
||||||
"integrity": "sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg==",
|
"integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/parse-json": {
|
"node_modules/@types/parse-json": {
|
||||||
@@ -1845,9 +1845,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.3.822",
|
"version": "1.3.827",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.822.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.827.tgz",
|
||||||
"integrity": "sha512-k7jG5oYYHxF4jx6PcqwHX3JVME/OjzolqOZiIogi9xtsfsmTjTdie4x88OakYFPEa8euciTgCCzvVNwvmjHb1Q==",
|
"integrity": "sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/emoji-regex": {
|
"node_modules/emoji-regex": {
|
||||||
@@ -4773,9 +4773,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/shiki": {
|
"node_modules/shiki": {
|
||||||
"version": "0.9.8",
|
"version": "0.9.10",
|
||||||
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.8.tgz",
|
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.10.tgz",
|
||||||
"integrity": "sha512-499zQUTjcNTVwwiaPrWldUTXIV3T9HZWxDwE82bY+9GE7P2uD6hpHUTXNbTof3iOG6WT+/062+OMbl0lDoG8WQ==",
|
"integrity": "sha512-xeM7Oc6hY+6iW5O/T5hor8ul7mEprzyl5y4r5zthEHToQNw7MIhREMgU3r2gKDB0NaMLNrkcEQagudCdzE13Lg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"json5": "^2.2.0",
|
"json5": "^2.2.0",
|
||||||
@@ -6164,9 +6164,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@octokit/graphql": {
|
"@octokit/graphql": {
|
||||||
"version": "4.7.0",
|
"version": "4.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
|
||||||
"integrity": "sha512-diY0qMPyQjfu4rDu3kDhJ9qIZadIm4IISO3RJSv9ajYUWJUCO0AykbgzLcg1xclxtXgzY583u3gAv66M6zz5SA==",
|
"integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@octokit/request": "^5.6.0",
|
"@octokit/request": "^5.6.0",
|
||||||
@@ -6175,18 +6175,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@octokit/openapi-types": {
|
"@octokit/openapi-types": {
|
||||||
"version": "9.7.0",
|
"version": "10.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.0.0.tgz",
|
||||||
"integrity": "sha512-TUJ16DJU8mekne6+KVcMV5g6g/rJlrnIKn7aALG9QrNpnEipFc1xjoarh0PKaAWf2Hf+HwthRKYt+9mCm5RsRg==",
|
"integrity": "sha512-k1iO2zKuEjjRS1EJb4FwSLk+iF6EGp+ZV0OMRViQoWhQ1fZTk9hg1xccZII5uyYoiqcbC73MRBmT45y1vp2PPg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@octokit/plugin-paginate-rest": {
|
"@octokit/plugin-paginate-rest": {
|
||||||
"version": "2.15.1",
|
"version": "2.16.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.15.1.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.0.tgz",
|
||||||
"integrity": "sha512-47r52KkhQDkmvUKZqXzA1lKvcyJEfYh3TKAIe5+EzMeyDM3d+/s5v11i2gTk8/n6No6DPi3k5Ind6wtDbo/AEg==",
|
"integrity": "sha512-8YYzALPMvEZ35kgy5pdYvQ22Roz+BIuEaedO575GwE2vb/ACDqQn0xQrTJR4tnZCJn7pi8+AWPVjrFDaERIyXQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@octokit/types": "^6.24.0"
|
"@octokit/types": "^6.26.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@octokit/plugin-request-log": {
|
"@octokit/plugin-request-log": {
|
||||||
@@ -6244,12 +6244,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@octokit/types": {
|
"@octokit/types": {
|
||||||
"version": "6.25.0",
|
"version": "6.26.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.25.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.26.0.tgz",
|
||||||
"integrity": "sha512-bNvyQKfngvAd/08COlYIN54nRgxskmejgywodizQNyiKoXmWRAjKup2/LYwm+T9V0gsKH6tuld1gM0PzmOiB4Q==",
|
"integrity": "sha512-RDxZBAFMtqs1ZPnbUu1e7ohPNfoNhTiep4fErY7tZs995BeHu369Vsh5woMIaFbllRWEZBfvTCS4hvDnMPiHrA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@octokit/openapi-types": "^9.5.0"
|
"@octokit/openapi-types": "^10.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@sindresorhus/is": {
|
"@sindresorhus/is": {
|
||||||
@@ -6360,9 +6360,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "16.7.8",
|
"version": "16.7.10",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.8.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz",
|
||||||
"integrity": "sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg==",
|
"integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/parse-json": {
|
"@types/parse-json": {
|
||||||
@@ -7108,9 +7108,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"electron-to-chromium": {
|
"electron-to-chromium": {
|
||||||
"version": "1.3.822",
|
"version": "1.3.827",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.822.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.827.tgz",
|
||||||
"integrity": "sha512-k7jG5oYYHxF4jx6PcqwHX3JVME/OjzolqOZiIogi9xtsfsmTjTdie4x88OakYFPEa8euciTgCCzvVNwvmjHb1Q==",
|
"integrity": "sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"emoji-regex": {
|
"emoji-regex": {
|
||||||
@@ -9284,9 +9284,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"shiki": {
|
"shiki": {
|
||||||
"version": "0.9.8",
|
"version": "0.9.10",
|
||||||
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.8.tgz",
|
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.10.tgz",
|
||||||
"integrity": "sha512-499zQUTjcNTVwwiaPrWldUTXIV3T9HZWxDwE82bY+9GE7P2uD6hpHUTXNbTof3iOG6WT+/062+OMbl0lDoG8WQ==",
|
"integrity": "sha512-xeM7Oc6hY+6iW5O/T5hor8ul7mEprzyl5y4r5zthEHToQNw7MIhREMgU3r2gKDB0NaMLNrkcEQagudCdzE13Lg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"json5": "^2.2.0",
|
"json5": "^2.2.0",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "redis",
|
"name": "redis",
|
||||||
"version": "4.0.0-rc.0",
|
"version": "4.0.0-rc.1",
|
||||||
"description": "A high performance Redis client.",
|
"description": "A high performance Redis client.",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"database",
|
"database",
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@istanbuljs/nyc-config-typescript": "^1.0.1",
|
"@istanbuljs/nyc-config-typescript": "^1.0.1",
|
||||||
"@types/mocha": "^9.0.0",
|
"@types/mocha": "^9.0.0",
|
||||||
"@types/node": "^16.7.8",
|
"@types/node": "^16.7.10",
|
||||||
"@types/sinon": "^10.0.2",
|
"@types/sinon": "^10.0.2",
|
||||||
"@types/which": "^2.0.1",
|
"@types/which": "^2.0.1",
|
||||||
"@types/yallist": "^4.0.1",
|
"@types/yallist": "^4.0.1",
|
||||||
|
Reference in New Issue
Block a user