diff --git a/lib/Redis.ts b/lib/Redis.ts index 1df870ff5..27183e813 100644 --- a/lib/Redis.ts +++ b/lib/Redis.ts @@ -357,14 +357,15 @@ class Redis extends Commander { * }); * ``` */ - monitor(callback: Callback): Promise { + monitor(callback?: Callback): Promise { const monitorInstance = this.duplicate({ monitor: true, lazyConnect: false, }); return asCallback( - new Promise(function (resolve) { + new Promise(function (resolve, reject) { + monitorInstance.once("error", reject); monitorInstance.once("monitoring", function () { resolve(monitorInstance); }); @@ -443,16 +444,15 @@ class Redis extends Commander { if (!writable) { if (!this.options.enableOfflineQueue) { - command.reject(new Error( - "Stream isn't writeable and enableOfflineQueue options is false" - )); + command.reject( + new Error( + "Stream isn't writeable and enableOfflineQueue options is false" + ) + ); return command.promise; } - if ( - command.name === "quit" && - this.offlineQueue.length === 0 - ) { + if (command.name === "quit" && this.offlineQueue.length === 0) { this.disconnect(); command.resolve(Buffer.from("OK")); return command.promise; diff --git a/lib/redis/event_handler.ts b/lib/redis/event_handler.ts index 8b3b57d03..468a56bb6 100644 --- a/lib/redis/event_handler.ts +++ b/lib/redis/event_handler.ts @@ -230,7 +230,10 @@ export function readyHandler(self) { self.retryAttempts = 0; if (self.options.monitor) { - self.call("monitor"); + self.call("monitor").then( + () => self.setStatus("monitoring"), + (error: Error) => self.emit("error", error) + ); const { sendCommand } = self; self.sendCommand = function (command) { if (Command.checkFlag("VALID_IN_MONITOR_MODE", command.name)) { @@ -244,7 +247,6 @@ export function readyHandler(self) { self.once("close", function () { delete self.sendCommand; }); - self.setStatus("monitoring"); return; } const finalSelect = self.prevCondition diff --git a/package-lock.json b/package-lock.json index 40e006631..b645c4916 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/git": "^10.0.1", "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.5", "@types/lodash.defaults": "^4.2.6", "@types/lodash.isarguments": "^3.1.6", @@ -1109,6 +1110,15 @@ "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", "dev": true }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -10201,6 +10211,15 @@ "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==", "dev": true }, + "@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, "@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", diff --git a/package.json b/package.json index 60135933a..0b8deab1c 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/git": "^10.0.1", "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.5", "@types/lodash.defaults": "^4.2.6", "@types/lodash.isarguments": "^3.1.6", diff --git a/test/functional/monitor.ts b/test/functional/monitor.ts index 6a2cf211e..acb39ee20 100644 --- a/test/functional/monitor.ts +++ b/test/functional/monitor.ts @@ -1,8 +1,10 @@ import Redis from "../../lib/Redis"; -import { expect } from "chai"; +import { expect, use } from "chai"; import * as sinon from "sinon"; import { waitForMonitorReady } from "../helpers/util"; +use(require("chai-as-promised")); + describe("monitor", () => { it("should receive commands", (done) => { const redis = new Redis(); @@ -74,4 +76,17 @@ describe("monitor", () => { }); }); }); + + it("rejects when monitor is disabled", async () => { + await new Redis().acl( + "SETUSER", + "nomonitor", + "reset", + "+info", + ">123456", + "on" + ); + const redis = new Redis({ username: "nomonitor", password: "123456" }); + expect(redis.monitor()).to.eventually.be.rejectedWith(/NOPERM/); + }); });