From 7a521a2ae9929c7ddbfda720deaf65e42be694fc Mon Sep 17 00:00:00 2001 From: Ben Hughes Date: Wed, 14 Feb 2024 13:45:10 -0500 Subject: [PATCH] Use sock.destroy() instead of end() on timeout, 1.2.4-NOTION.1 Unifies error handling/resetting state in error() --- lib/memjs/server.d.ts.map | 2 +- lib/memjs/server.js | 14 +++++++------- package-lock.json | 4 ++-- package.json | 2 +- src/memjs/server.ts | 12 ++++++------ 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/memjs/server.d.ts.map b/lib/memjs/server.d.ts.map index 31f9e76..6128b8f 100644 --- a/lib/memjs/server.d.ts.map +++ b/lib/memjs/server.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/memjs/server.ts"],"names":[],"mappings":";AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAKL,OAAO,EACR,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,aAAK,GAAG,GAAG,MAAM,CAAC;AAElB,MAAM,WAAW,iBAAiB;IAChC,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACtB;AAED,qBAAa,MAAO,SAAQ,MAAM,CAAC,YAAY;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAA;KAAE,CAAC;IACzD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;KAAE,CAAC;IACnD,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;gBAG9B,IAAI,EAAE,MAAM,EAEZ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAoClC,SAAS,CAAC,IAAI,EAAE,iBAAiB;IAIjC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB;IAI7C,OAAO,CAAC,QAAQ,EAAE,OAAO;IAczB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe;IAIvC,KAAK,CAAC,GAAG,EAAE,KAAK;IAiBhB,QAAQ;IAKR,QAAQ;IAMR,cAAc,CAAC,OAAO,EAAE,MAAM;IAO9B,eAAe,CAAC,OAAO,EAAE,MAAM;IAyB/B,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,iBAAiB;IA2FzC,KAAK,CAAC,IAAI,EAAE,MAAM;IAelB,SAAS,CAAC,IAAI,EAAE,MAAM;IAMtB,KAAK;IAML,QAAQ;IAIR,cAAc;CAGf"} \ No newline at end of file +{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/memjs/server.ts"],"names":[],"mappings":";AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAKL,OAAO,EACR,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,aAAK,GAAG,GAAG,MAAM,CAAC;AAElB,MAAM,WAAW,iBAAiB;IAChC,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACtB;AAED,qBAAa,MAAO,SAAQ,MAAM,CAAC,YAAY;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC,iBAAiB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAA;KAAE,CAAC;IACzD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;KAAE,CAAC;IACnD,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;gBAG9B,IAAI,EAAE,MAAM,EAEZ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAoClC,SAAS,CAAC,IAAI,EAAE,iBAAiB;IAIjC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB;IAI7C,OAAO,CAAC,QAAQ,EAAE,OAAO;IAczB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe;IAIvC,KAAK,CAAC,GAAG,EAAE,KAAK;IAmBhB,QAAQ;IAKR,QAAQ;IAMR,cAAc,CAAC,OAAO,EAAE,MAAM;IAO9B,eAAe,CAAC,OAAO,EAAE,MAAM;IAyB/B,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,iBAAiB;IA2FzC,KAAK,CAAC,IAAI,EAAE,MAAM;IAelB,SAAS,CAAC,IAAI,EAAE,MAAM;IAMtB,KAAK;IAQL,QAAQ;IAIR,cAAc;CAGf"} \ No newline at end of file diff --git a/lib/memjs/server.js b/lib/memjs/server.js index 5c23615..3663474 100644 --- a/lib/memjs/server.js +++ b/lib/memjs/server.js @@ -66,12 +66,14 @@ class Server extends events_1.default.EventEmitter { } error(err) { const errcalls = this.errorCallbacks; + // reset all states except host, port, options, username, password + this.responseBuffer = Buffer.from([]); + this.connected = false; + this.timeoutSet = false; this.connectCallbacks = []; this.responseCallbacks = {}; this.requestTimeouts = []; this.errorCallbacks = {}; - this.timeoutSet = false; - this.responseBuffer = Buffer.from([]); if (this._socket) { this._socket.destroy(); delete this._socket; @@ -223,6 +225,8 @@ class Server extends events_1.default.EventEmitter { } close() { if (this._socket) { + // TODO: this should probably be destroy() in at least some, if not all, + // cases. this._socket.end(); } } @@ -248,10 +252,6 @@ const timeoutHandler = function (server, sock) { const soonestTimeout = server.requestTimeouts[0]; if (soonestTimeout <= now) { // timeout occurred! - sock.end(); - server.connected = false; - server._socket = undefined; - server.timeoutSet = false; server.error(new Error("socket timed out waiting on response.")); } else { @@ -262,4 +262,4 @@ const timeoutHandler = function (server, sock) { }); } }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbWpzL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4Q0FBc0I7QUFDdEIsb0RBQTRCO0FBQzVCLG1DQU1pQjtBQTBCakIsTUFBYSxNQUFPLFNBQVEsZ0JBQU0sQ0FBQyxZQUFZO0lBZ0I3QyxZQUNFLElBQVk7SUFDWixnR0FBZ0c7SUFDaEcsSUFBc0IsRUFDdEIsUUFBaUIsRUFDakIsUUFBaUIsRUFDakIsT0FBZ0M7UUFFaEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUU7WUFDbEMsT0FBTyxFQUFFLEdBQUc7WUFDWixTQUFTLEVBQUUsS0FBSztZQUNoQixjQUFjLEVBQUUsRUFBRTtTQUNuQixDQUFrQixDQUFDO1FBQ3BCLElBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssU0FBUztZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQ2pDO1lBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFX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LENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5ldCBmcm9tIFwibmV0XCI7XG5pbXBvcnQgZXZlbnRzIGZyb20gXCJldmVudHNcIjtcbmltcG9ydCB7XG4gIG1ha2VSZXF1ZXN0QnVmZmVyLFxuICBwYXJzZU1lc3NhZ2UsXG4gIG1lcmdlLFxuICB0aW1lc3RhbXAsXG4gIE1lc3NhZ2UsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyT3B0aW9ucyB7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAga2VlcEFsaXZlOiBib29sZWFuO1xuICBrZWVwQWxpdmVEZWxheTogbnVtYmVyO1xuICBjb25udGltZW91dDogbnVtYmVyO1xuICB1c2VybmFtZT86IHN0cmluZztcbiAgcGFzc3dvcmQ/OiBzdHJpbmc7XG59XG5cbnR5cGUgU2VxID0gbnVtYmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9uQ29ubmVjdENhbGxiYWNrIHtcbiAgKHNvY2tldDogbmV0LlNvY2tldCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25SZXNwb25zZUNhbGxiYWNrIHtcbiAgKG1lc3NhZ2U6IE1lc3NhZ2UpOiB2b2lkO1xuICBxdWlldD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25FcnJvckNhbGxiYWNrIHtcbiAgKGVycm9yOiBFcnJvcik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgcmVzcG9uc2VCdWZmZXI6IEJ1ZmZlcjtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgdGltZW91dFNldDogYm9vbGVhbjtcbiAgY29ubmVjdENhbGxiYWNrczogT25Db25uZWN0Q2FsbGJhY2tbXTtcbiAgcmVzcG9uc2VDYWxsYmFja3M6IHsgW3NlcTogc3RyaW5nXTogT25SZXNwb25zZUNhbGxiYWNrIH07XG4gIHJlcXVlc3RUaW1lb3V0czogbnVtYmVyW107XG4gIGVycm9yQ2FsbGJhY2tzOiB7IFtzZXE6IHN0cmluZ106IE9uRXJyb3JDYWxsYmFjayB9O1xuICBvcHRpb25zOiBTZXJ2ZXJPcHRpb25zO1xuICB1c2VybmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwYXNzd29yZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIF9zb2NrZXQ6IG5ldC5Tb2NrZXQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdDogc3RyaW5nLFxuICAgIC8qIFRPRE86IGFsbG93aW5nIHBvcnQgdG8gYmUgc3RyaW5nIG9yIHVuZGVmaW5lZCBpcyB1c2VkIGJ5IHRoZSB0ZXN0cywgYnV0IHNlZW1zIGJhZCBvdmVyYWxsLiAqL1xuICAgIHBvcnQ/OiBzdHJpbmcgfCBudW1iZXIsXG4gICAgdXNlcm5hbWU/OiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8U2VydmVyT3B0aW9ucz5cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3BvbnNlQnVmZmVyID0gQnVmZmVyLmZyb20oW10pO1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMudGltZW91dFNldCA9IGZhbHNlO1xuICAgIHRoaXMuY29ubmVjdENhbGxiYWNrcyA9IFtdO1xuICAgIHRoaXMucmVzcG9uc2VDYWxsYmFja3MgPSB7fTtcbiAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cyA9IFtdO1xuICAgIHRoaXMuZXJyb3JDYWxsYmFja3MgPSB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSBtZXJnZShvcHRpb25zIHx8IHt9LCB7XG4gICAgICB0aW1lb3V0OiAwLjUsXG4gICAgICBrZWVwQWxpdmU6IGZhbHNlLFxuICAgICAga2VlcEFsaXZlRGVsYXk6IDMwLFxuICAgIH0pIGFzIFNlcnZlck9wdGlvbnM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5vcHRpb25zLmNvbm50aW1lb3V0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5jb25udGltZW91dCA9PT0gbnVsbFxuICAgICkge1xuICAgICAgdGhpcy5vcHRpb25zLmNvbm50aW1lb3V0ID0gMiAqIHRoaXMub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgICB0aGlzLnVzZXJuYW1lID1cbiAgICAgIHVzZXJuYW1lIHx8XG4gICAgICB0aGlzLm9wdGlvbnMudXNlcm5hbWUgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk1FTUNBQ0hJRVJfVVNFUk5BTUUgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk1FTUNBQ0hFX1VTRVJOQU1FO1xuICAgIHRoaXMucGFzc3dvcmQgPVxuICAgICAgcGFzc3dvcmQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5wYXNzd29yZCB8fFxuICAgICAgcHJvY2Vzcy5lbnYuTUVNQ0FDSElFUl9QQVNTV09SRCB8fFxuICAgICAgcHJvY2Vzcy5lbnYuTUVNQ0FDSEVfUEFTU1dPUkQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvbkNvbm5lY3QoZnVuYzogT25Db25uZWN0Q2FsbGJhY2spIHtcbiAgICB0aGlzLmNvbm5lY3RDYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfVxuXG4gIG9uUmVzcG9uc2Uoc2VxOiBTZXEsIGZ1bmM6IE9uUmVzcG9uc2VDYWxsYmFjaykge1xuICAgIHRoaXMucmVzcG9uc2VDYWxsYmFja3Nbc2VxXSA9IGZ1bmM7XG4gIH1cblxuICByZXNwb25kKHJlc3BvbnNlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnJlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlLmhlYWRlci5vcGFxdWVdO1xuICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgIC8vIGluIGNhc2Ugb2YgYXV0aGVudGljYXRpb24sIG5vIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGJhY2socmVzcG9uc2UpO1xuICAgIGlmICghY2FsbGJhY2sucXVpZXQgfHwgcmVzcG9uc2UuaGVhZGVyLnRvdGFsQm9keUxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMucmVzcG9uc2VDYWxsYmFja3NbcmVzcG9uc2UuaGVhZGVyLm9wYXF1ZV07XG4gICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5zaGlmdCgpO1xuICAgICAgZGVsZXRlIHRoaXMuZXJyb3JDYWxsYmFja3NbcmVzcG9uc2UuaGVhZGVyLm9wYXF1ZV07XG4gICAgfVxuICB9XG5cbiAgb25FcnJvcihzZXE6IFNlcSwgZnVuYzogT25FcnJvckNhbGxiYWNrKSB7XG4gICAgdGhpcy5lcnJvckNhbGxiYWNrc1tzZXFdID0gZnVuYztcbiAgfVxuXG4gIGVycm9yKGVycjogRXJyb3IpIHtcbiAgICBjb25zdCBlcnJjYWxscyA9IHRoaXMuZXJyb3JDYWxsYmFja3M7XG4gICAgdGhpcy5jb25uZWN0Q2FsbGJhY2tzID0gW107XG4gICAgdGhpcy5yZXNwb25zZUNhbGxiYWNrcyA9IHt9O1xuICAgIHRoaXMucmVxdWVzdFRpbWVvdXRzID0gW107XG4gICAgdGhpcy5lcnJvckNhbGxiYWNrcyA9IHt9O1xuICAgIHRoaXMudGltZW91dFNldCA9IGZhbHNlO1xuICAgIHRoaXMucmVzcG9uc2VCdWZmZXIgPSBCdWZmZXIuZnJvbShbXSk7XG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zb2NrZXQ7XG4gICAgfVxuICAgIGZvciAobGV0IGVycmNhbGwgb2YgT2JqZWN0LnZhbHVlcyhlcnJjYWxscykpIHtcbiAgICAgIGVycmNhbGwoZXJyKTtcbiAgICB9XG4gIH1cblxuICBsaXN0U2FzbCgpIHtcbiAgICBjb25zdCBidWYgPSBtYWtlUmVxdWVzdEJ1ZmZlcigweDIwLCBcIlwiLCBcIlwiLCBcIlwiKTtcbiAgICB0aGlzLndyaXRlU0FTTChidWYpO1xuICB9XG5cbiAgc2FzbEF1dGgoKSB7XG4gICAgY29uc3QgYXV0aFN0ciA9IFwiXFx4MDBcIiArIHRoaXMudXNlcm5hbWUgKyBcIlxceDAwXCIgKyB0aGlzLnBhc3N3b3JkO1xuICAgIGNvbnN0IGJ1ZiA9IG1ha2VSZXF1ZXN0QnVmZmVyKDB4MjEsIFwiUExBSU5cIiwgXCJcIiwgYXV0aFN0cik7XG4gICAgdGhpcy53cml0ZVNBU0woYnVmKTtcbiAgfVxuXG4gIGFwcGVuZFRvQnVmZmVyKGRhdGFCdWY6IEJ1ZmZlcikge1xuICAgIGNvbnN0IG9sZCA9IHRoaXMucmVzcG9uc2VCdWZmZXI7XG4gICAgdGhpcy5yZXNwb25zZUJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhvbGQubGVuZ3RoICsgZGF0YUJ1Zi5sZW5ndGgpO1xuICAgIG9sZC5jb3B5KHRoaXMucmVzcG9uc2VCdWZmZXIsIDApO1xuICAgIGRhdGFCdWYuY29weSh0aGlzLnJlc3BvbnNlQnVmZmVyLCBvbGQubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZUJ1ZmZlcjtcbiAgfVxuICByZXNwb25zZUhhbmRsZXIoZGF0YUJ1ZjogQnVmZmVyKSB7XG4gICAgbGV0IHJlc3BvbnNlOiBNZXNzYWdlIHwgZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gcGFyc2VNZXNzYWdlKHRoaXMuYXBwZW5kVG9CdWZmZXIoZGF0YUJ1ZikpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlc3BMZW5ndGg6IG51bWJlcjtcbiAgICB3aGlsZSAocmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXIub3Bjb2RlID09PSAweDIwKSB7XG4gICAgICAgIHRoaXMuc2FzbEF1dGgoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuaGVhZGVyLnN0YXR1cyA9PT0gKDB4MjAgYXMgYW55KSAvKiBUT0RPOiB3dGY/ICovKSB7XG4gICAgICAgIHRoaXMuZXJyb3IobmV3IEVycm9yKFwiTWVtY2FjaGVkIHNlcnZlciBhdXRoZW50aWNhdGlvbiBmYWlsZWQhXCIpKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuaGVhZGVyLm9wY29kZSA9PT0gMHgyMSkge1xuICAgICAgICB0aGlzLmVtaXQoXCJhdXRoZW50aWNhdGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNwb25kKHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIHJlc3BMZW5ndGggPSByZXNwb25zZS5oZWFkZXIudG90YWxCb2R5TGVuZ3RoICsgMjQ7XG4gICAgICB0aGlzLnJlc3BvbnNlQnVmZmVyID0gdGhpcy5yZXNwb25zZUJ1ZmZlci5zbGljZShyZXNwTGVuZ3RoKTtcbiAgICAgIHJlc3BvbnNlID0gcGFyc2VNZXNzYWdlKHRoaXMucmVzcG9uc2VCdWZmZXIpO1xuICAgIH1cbiAgfVxuICBzb2NrKHNhc2w6IGJvb2xlYW4sIGdvOiBPbkNvbm5lY3RDYWxsYmFjaykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKCFzZWxmLl9zb2NrZXQpIHtcbiAgICAgIC8vIENBU0UgMTogY29tcGxldGVseSBuZXcgc29ja2V0XG4gICAgICBzZWxmLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5yZXNwb25zZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFtdKTtcbiAgICAgIHNlbGYuX3NvY2tldCA9IG5ldC5jb25uZWN0KFxuICAgICAgICAvKiBUT0RPOiBhbGxvd2luZyBwb3J0IHRvIGJlIHN0cmluZyBvciB1bmRlZmluZWQgaXMgdXNlZCBieSB0aGUgdGVzdHMsIGJ1dCBzZWVtcyBiYWQgb3ZlcmFsbC4gKi9cbiAgICAgICAgdHlwZW9mIHRoaXMucG9ydCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gcGFyc2VJbnQodGhpcy5wb3J0LCAxMClcbiAgICAgICAgICA6IHRoaXMucG9ydCB8fCAxMTIxMSxcbiAgICAgICAgdGhpcy5ob3N0LFxuICAgICAgICBmdW5jdGlvbiAodGhpczogbmV0LlNvY2tldCkge1xuICAgICAgICAgIC8vIFNBU0wgYXV0aGVudGljYXRpb24gaGFuZGxlclxuICAgICAgICAgIHNlbGYub25jZShcImF1dGhlbnRpY2F0ZWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3NvY2tldCkge1xuICAgICAgICAgICAgICBjb25zdCBzb2NrZXQgPSBzZWxmLl9zb2NrZXQ7XG4gICAgICAgICAgICAgIHNlbGYuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgLy8gY2FuY2VsIGNvbm5lY3Rpb24gdGltZW91dFxuICAgICAgICAgICAgICBzZWxmLl9zb2NrZXQuc2V0VGltZW91dCgwKTtcbiAgICAgICAgICAgICAgc2VsZi50aW1lb3V0U2V0ID0gZmFsc2U7XG4gICAgICAgICAgICAgIC8vIHJ1biBhY3R1YWwgcmVxdWVzdChzKVxuICAgICAgICAgICAgICBnbyhzZWxmLl9zb2NrZXQpO1xuICAgICAgICAgICAgICBzZWxmLmNvbm5lY3RDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgICAgICBjYihzb2NrZXQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgc2VsZi5jb25uZWN0Q2FsbGJhY2tzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBzZXR1cCByZXNwb25zZSBoYW5kbGVyXG4gICAgICAgICAgdGhpcy5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGFCdWYpIHtcbiAgICAgICAgICAgIHNlbGYucmVzcG9uc2VIYW5kbGVyKGRhdGFCdWYpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8ga2ljayBvZiBTQVNMIGlmIG5lZWRlZFxuICAgICAgICAgIGlmIChzZWxmLnVzZXJuYW1lICYmIHNlbGYucGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHNlbGYubGlzdFNhc2woKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5lbWl0KFwiYXV0aGVudGljYXRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIHNldHVwIGVycm9yIGhhbmRsZXJcbiAgICAgIHNlbGYuX3NvY2tldC5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBzZWxmLmVycm9yKGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZWxmLl9zb2NrZXQub24oXCJjbG9zZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLmVycm9yQ2FsbGJhY2tzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2VsZi5lcnJvcihuZXcgRXJyb3IoXCJzb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseS5cIikpO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHNlbGYucmVzcG9uc2VCdWZmZXIgPSBCdWZmZXIuZnJvbShbXSk7XG4gICAgICAgIGlmIChzZWxmLnRpbWVvdXRTZXQpIHtcbiAgICAgICAgICBzZWxmLl9zb2NrZXQ/LnNldFRpbWVvdXQoMCk7XG4gICAgICAgICAgc2VsZi50aW1lb3V0U2V0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5fc29ja2V0ID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHNldHVwIGNvbm5lY3Rpb24gdGltZW91dCBoYW5kbGVyXG4gICAgICBzZWxmLnRpbWVvdXRTZXQgPSB0cnVlO1xuICAgICAgc2VsZi5fc29ja2V0LnNldFRpbWVvdXQoXG4gICAgICAgIHNlbGYub3B0aW9ucy5jb25udGltZW91dCAqIDEwMDAsXG4gICAgICAgIGZ1bmN0aW9uICh0aGlzOiBuZXQuU29ja2V0KSB7XG4gICAgICAgICAgc2VsZi50aW1lb3V0U2V0ID0gZmFsc2U7XG4gICAgICAgICAgaWYgKCFzZWxmLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgICAgIHNlbGYuX3NvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHNlbGYuZXJyb3IobmV3IEVycm9yKFwic29ja2V0IHRpbWVkIG91dCBjb25uZWN0aW5nIHRvIHNlcnZlci5cIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gdXNlIFRDUCBrZWVwLWFsaXZlXG4gICAgICBzZWxmLl9zb2NrZXQuc2V0S2VlcEFsaXZlKFxuICAgICAgICBzZWxmLm9wdGlvbnMua2VlcEFsaXZlLFxuICAgICAgICBzZWxmLm9wdGlvbnMua2VlcEFsaXZlRGVsYXkgKiAxMDAwXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIXNlbGYuY29ubmVjdGVkICYmICFzYXNsKSB7XG4gICAgICAvLyBDQVNFIDI6IHNvY2tldCBleGlzdHMsIGJ1dCBzdGlsbCBjb25uZWN0aW5nIC8gYXV0aGVudGljYXRpbmdcbiAgICAgIHNlbGYub25Db25uZWN0KGdvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ0FTRSAzOiBzb2NrZXQgZXhpc3RzIGFuZCBjb25uZWN0ZWQgLyByZWFkeSB0byB1c2VcbiAgICAgIGdvKHNlbGYuX3NvY2tldCk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGUoYmxvYjogQnVmZmVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBNYXRoLnJvdW5kKHNlbGYub3B0aW9ucy50aW1lb3V0ICogMTAwMCk7XG4gICAgdGhpcy5zb2NrKGZhbHNlLCBmdW5jdGlvbiAocykge1xuICAgICAgcy53cml0ZShibG9iKTtcbiAgICAgIHNlbGYucmVxdWVzdFRpbWVvdXRzLnB1c2godGltZXN0YW1wKCkgKyBkZWFkbGluZSk7XG4gICAgICBpZiAoIXNlbGYudGltZW91dFNldCkge1xuICAgICAgICBzZWxmLnRpbWVvdXRTZXQgPSB0cnVlO1xuICAgICAgICBzLnNldFRpbWVvdXQoZGVhZGxpbmUsIGZ1bmN0aW9uICh0aGlzOiBuZXQuU29ja2V0KSB7XG4gICAgICAgICAgdGltZW91dEhhbmRsZXIoc2VsZiwgdGhpcyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgd3JpdGVTQVNMKGJsb2I6IEJ1ZmZlcikge1xuICAgIHRoaXMuc29jayh0cnVlLCBmdW5jdGlvbiAocykge1xuICAgICAgcy53cml0ZShibG9iKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHRoaXMuX3NvY2tldC5lbmQoKTtcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCI8U2VydmVyIFwiICsgdGhpcy5ob3N0ICsgXCI6XCIgKyB0aGlzLnBvcnQgKyBcIj5cIjtcbiAgfVxuXG4gIGhvc3Rwb3J0U3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmhvc3QgKyBcIjpcIiArIHRoaXMucG9ydDtcbiAgfVxufVxuXG4vLyBXZSBoYW5kbGUgdHJhY2tpbmcgdGltZW91dHMgd2l0aCBhbiBhcnJheSBvZiBkZWFkbGluZXMgKHJlcXVlc3RUaW1lb3V0cyksIGFzXG4vLyBub2RlIGRvZXNuJ3QgbGlrZSB1cyBzZXR0aW5nIHVwIGxvdHMgb2YgdGltZXJzLCBhbmQgdXNpbmcganVzdCBvbmUgaXMgbW9yZVxuLy8gZWZmaWNpZW50IGFueXdheS5cbmNvbnN0IHRpbWVvdXRIYW5kbGVyID0gZnVuY3Rpb24gKHNlcnZlcjogU2VydmVyLCBzb2NrOiBuZXQuU29ja2V0KSB7XG4gIGlmIChzZXJ2ZXIucmVxdWVzdFRpbWVvdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIG5vdGhpbmcgYWN0aXZlXG4gICAgc2VydmVyLnRpbWVvdXRTZXQgPSBmYWxzZTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzb21lIHJlcXVlc3RzIG91dHN0YW5kaW5nLCBjaGVjayBpZiBhbnkgaGF2ZSB0aW1lZC1vdXRcbiAgY29uc3Qgbm93ID0gdGltZXN0YW1wKCk7XG4gIGNvbnN0IHNvb25lc3RUaW1lb3V0ID0gc2VydmVyLnJlcXVlc3RUaW1lb3V0c1swXTtcblxuICBpZiAoc29vbmVzdFRpbWVvdXQgPD0gbm93KSB7XG4gICAgLy8gdGltZW91dCBvY2N1cnJlZCFcbiAgICBzb2NrLmVuZCgpO1xuICAgIHNlcnZlci5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBzZXJ2ZXIuX3NvY2tldCA9IHVuZGVmaW5lZDtcbiAgICBzZXJ2ZXIudGltZW91dFNldCA9IGZhbHNlO1xuICAgIHNlcnZlci5lcnJvcihuZXcgRXJyb3IoXCJzb2NrZXQgdGltZWQgb3V0IHdhaXRpbmcgb24gcmVzcG9uc2UuXCIpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBubyB0aW1lb3V0ISBTZXR1cCBuZXh0IG9uZS5cbiAgICBjb25zdCBkZWFkbGluZSA9IHNvb25lc3RUaW1lb3V0IC0gbm93O1xuICAgIHNvY2suc2V0VGltZW91dChkZWFkbGluZSwgZnVuY3Rpb24gKCkge1xuICAgICAgdGltZW91dEhhbmRsZXIoc2VydmVyLCBzb2NrKTtcbiAgICB9KTtcbiAgfVxufTtcbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbWpzL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4Q0FBc0I7QUFDdEIsb0RBQTRCO0FBQzVCLG1DQU1pQjtBQTBCakIsTUFBYSxNQUFPLFNBQVEsZ0JBQU0sQ0FBQyxZQUFZO0lBZ0I3QyxZQUNFLElBQVk7SUFDWixnR0FBZ0c7SUFDaEcsSUFBc0IsRUFDdEIsUUFBaUIsRUFDakIsUUFBaUIsRUFDakIsT0FBZ0M7UUFFaEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUU7WUFDbEMsT0FBTyxFQUFFLEdBQUc7WUFDWixTQUFTLEVBQUUsS0FBSztZQUNoQixjQUFjLEVBQUUsRUFBRTtTQUNuQixDQUFrQixDQUFDO1FBQ3BCLElBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssU0FBUztZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQ2pDO1lBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFX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bnQiOlsiaW1wb3J0IG5ldCBmcm9tIFwibmV0XCI7XG5pbXBvcnQgZXZlbnRzIGZyb20gXCJldmVudHNcIjtcbmltcG9ydCB7XG4gIG1ha2VSZXF1ZXN0QnVmZmVyLFxuICBwYXJzZU1lc3NhZ2UsXG4gIG1lcmdlLFxuICB0aW1lc3RhbXAsXG4gIE1lc3NhZ2UsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyT3B0aW9ucyB7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAga2VlcEFsaXZlOiBib29sZWFuO1xuICBrZWVwQWxpdmVEZWxheTogbnVtYmVyO1xuICBjb25udGltZW91dDogbnVtYmVyO1xuICB1c2VybmFtZT86IHN0cmluZztcbiAgcGFzc3dvcmQ/OiBzdHJpbmc7XG59XG5cbnR5cGUgU2VxID0gbnVtYmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9uQ29ubmVjdENhbGxiYWNrIHtcbiAgKHNvY2tldDogbmV0LlNvY2tldCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25SZXNwb25zZUNhbGxiYWNrIHtcbiAgKG1lc3NhZ2U6IE1lc3NhZ2UpOiB2b2lkO1xuICBxdWlldD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25FcnJvckNhbGxiYWNrIHtcbiAgKGVycm9yOiBFcnJvcik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgcmVzcG9uc2VCdWZmZXI6IEJ1ZmZlcjtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgdGltZW91dFNldDogYm9vbGVhbjtcbiAgY29ubmVjdENhbGxiYWNrczogT25Db25uZWN0Q2FsbGJhY2tbXTtcbiAgcmVzcG9uc2VDYWxsYmFja3M6IHsgW3NlcTogc3RyaW5nXTogT25SZXNwb25zZUNhbGxiYWNrIH07XG4gIHJlcXVlc3RUaW1lb3V0czogbnVtYmVyW107XG4gIGVycm9yQ2FsbGJhY2tzOiB7IFtzZXE6IHN0cmluZ106IE9uRXJyb3JDYWxsYmFjayB9O1xuICBvcHRpb25zOiBTZXJ2ZXJPcHRpb25zO1xuICB1c2VybmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwYXNzd29yZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIF9zb2NrZXQ6IG5ldC5Tb2NrZXQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdDogc3RyaW5nLFxuICAgIC8qIFRPRE86IGFsbG93aW5nIHBvcnQgdG8gYmUgc3RyaW5nIG9yIHVuZGVmaW5lZCBpcyB1c2VkIGJ5IHRoZSB0ZXN0cywgYnV0IHNlZW1zIGJhZCBvdmVyYWxsLiAqL1xuICAgIHBvcnQ/OiBzdHJpbmcgfCBudW1iZXIsXG4gICAgdXNlcm5hbWU/OiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8U2VydmVyT3B0aW9ucz5cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3BvbnNlQnVmZmVyID0gQnVmZmVyLmZyb20oW10pO1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMudGltZW91dFNldCA9IGZhbHNlO1xuICAgIHRoaXMuY29ubmVjdENhbGxiYWNrcyA9IFtdO1xuICAgIHRoaXMucmVzcG9uc2VDYWxsYmFja3MgPSB7fTtcbiAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cyA9IFtdO1xuICAgIHRoaXMuZXJyb3JDYWxsYmFja3MgPSB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSBtZXJnZShvcHRpb25zIHx8IHt9LCB7XG4gICAgICB0aW1lb3V0OiAwLjUsXG4gICAgICBrZWVwQWxpdmU6IGZhbHNlLFxuICAgICAga2VlcEFsaXZlRGVsYXk6IDMwLFxuICAgIH0pIGFzIFNlcnZlck9wdGlvbnM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5vcHRpb25zLmNvbm50aW1lb3V0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5jb25udGltZW91dCA9PT0gbnVsbFxuICAgICkge1xuICAgICAgdGhpcy5vcHRpb25zLmNvbm50aW1lb3V0ID0gMiAqIHRoaXMub3B0aW9ucy50aW1lb3V0O1xuICAgIH1cbiAgICB0aGlzLnVzZXJuYW1lID1cbiAgICAgIHVzZXJuYW1lIHx8XG4gICAgICB0aGlzLm9wdGlvbnMudXNlcm5hbWUgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk1FTUNBQ0hJRVJfVVNFUk5BTUUgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk1FTUNBQ0hFX1VTRVJOQU1FO1xuICAgIHRoaXMucGFzc3dvcmQgPVxuICAgICAgcGFzc3dvcmQgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5wYXNzd29yZCB8fFxuICAgICAgcHJvY2Vzcy5lbnYuTUVNQ0FDSElFUl9QQVNTV09SRCB8fFxuICAgICAgcHJvY2Vzcy5lbnYuTUVNQ0FDSEVfUEFTU1dPUkQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvbkNvbm5lY3QoZnVuYzogT25Db25uZWN0Q2FsbGJhY2spIHtcbiAgICB0aGlzLmNvbm5lY3RDYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfVxuXG4gIG9uUmVzcG9uc2Uoc2VxOiBTZXEsIGZ1bmM6IE9uUmVzcG9uc2VDYWxsYmFjaykge1xuICAgIHRoaXMucmVzcG9uc2VDYWxsYmFja3Nbc2VxXSA9IGZ1bmM7XG4gIH1cblxuICByZXNwb25kKHJlc3BvbnNlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLnJlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlLmhlYWRlci5vcGFxdWVdO1xuICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgIC8vIGluIGNhc2Ugb2YgYXV0aGVudGljYXRpb24sIG5vIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGJhY2socmVzcG9uc2UpO1xuICAgIGlmICghY2FsbGJhY2sucXVpZXQgfHwgcmVzcG9uc2UuaGVhZGVyLnRvdGFsQm9keUxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMucmVzcG9uc2VDYWxsYmFja3NbcmVzcG9uc2UuaGVhZGVyLm9wYXF1ZV07XG4gICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5zaGlmdCgpO1xuICAgICAgZGVsZXRlIHRoaXMuZXJyb3JDYWxsYmFja3NbcmVzcG9uc2UuaGVhZGVyLm9wYXF1ZV07XG4gICAgfVxuICB9XG5cbiAgb25FcnJvcihzZXE6IFNlcSwgZnVuYzogT25FcnJvckNhbGxiYWNrKSB7XG4gICAgdGhpcy5lcnJvckNhbGxiYWNrc1tzZXFdID0gZnVuYztcbiAgfVxuXG4gIGVycm9yKGVycjogRXJyb3IpIHtcbiAgICBjb25zdCBlcnJjYWxscyA9IHRoaXMuZXJyb3JDYWxsYmFja3M7XG4gICAgLy8gcmVzZXQgYWxsIHN0YXRlcyBleGNlcHQgaG9zdCwgcG9ydCwgb3B0aW9ucywgdXNlcm5hbWUsIHBhc3N3b3JkXG4gICAgdGhpcy5yZXNwb25zZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFtdKTtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMudGltZW91dFNldCA9IGZhbHNlO1xuICAgIHRoaXMuY29ubmVjdENhbGxiYWNrcyA9IFtdO1xuICAgIHRoaXMucmVzcG9uc2VDYWxsYmFja3MgPSB7fTtcbiAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cyA9IFtdO1xuICAgIHRoaXMuZXJyb3JDYWxsYmFja3MgPSB7fTtcbiAgICBpZiAodGhpcy5fc29ja2V0KSB7XG4gICAgICB0aGlzLl9zb2NrZXQuZGVzdHJveSgpO1xuICAgICAgZGVsZXRlIHRoaXMuX3NvY2tldDtcbiAgICB9XG4gICAgZm9yIChsZXQgZXJyY2FsbCBvZiBPYmplY3QudmFsdWVzKGVycmNhbGxzKSkge1xuICAgICAgZXJyY2FsbChlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGxpc3RTYXNsKCkge1xuICAgIGNvbnN0IGJ1ZiA9IG1ha2VSZXF1ZXN0QnVmZmVyKDB4MjAsIFwiXCIsIFwiXCIsIFwiXCIpO1xuICAgIHRoaXMud3JpdGVTQVNMKGJ1Zik7XG4gIH1cblxuICBzYXNsQXV0aCgpIHtcbiAgICBjb25zdCBhdXRoU3RyID0gXCJcXHgwMFwiICsgdGhpcy51c2VybmFtZSArIFwiXFx4MDBcIiArIHRoaXMucGFzc3dvcmQ7XG4gICAgY29uc3QgYnVmID0gbWFrZVJlcXVlc3RCdWZmZXIoMHgyMSwgXCJQTEFJTlwiLCBcIlwiLCBhdXRoU3RyKTtcbiAgICB0aGlzLndyaXRlU0FTTChidWYpO1xuICB9XG5cbiAgYXBwZW5kVG9CdWZmZXIoZGF0YUJ1ZjogQnVmZmVyKSB7XG4gICAgY29uc3Qgb2xkID0gdGhpcy5yZXNwb25zZUJ1ZmZlcjtcbiAgICB0aGlzLnJlc3BvbnNlQnVmZmVyID0gQnVmZmVyLmFsbG9jKG9sZC5sZW5ndGggKyBkYXRhQnVmLmxlbmd0aCk7XG4gICAgb2xkLmNvcHkodGhpcy5yZXNwb25zZUJ1ZmZlciwgMCk7XG4gICAgZGF0YUJ1Zi5jb3B5KHRoaXMucmVzcG9uc2VCdWZmZXIsIG9sZC5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlQnVmZmVyO1xuICB9XG4gIHJlc3BvbnNlSGFuZGxlcihkYXRhQnVmOiBCdWZmZXIpIHtcbiAgICBsZXQgcmVzcG9uc2U6IE1lc3NhZ2UgfCBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBwYXJzZU1lc3NhZ2UodGhpcy5hcHBlbmRUb0J1ZmZlcihkYXRhQnVmKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5lcnJvcihlIGFzIEVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzcExlbmd0aDogbnVtYmVyO1xuICAgIHdoaWxlIChyZXNwb25zZSkge1xuICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlci5vcGNvZGUgPT09IDB4MjApIHtcbiAgICAgICAgdGhpcy5zYXNsQXV0aCgpO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5oZWFkZXIuc3RhdHVzID09PSAoMHgyMCBhcyBhbnkpIC8qIFRPRE86IHd0Zj8gKi8pIHtcbiAgICAgICAgdGhpcy5lcnJvcihuZXcgRXJyb3IoXCJNZW1jYWNoZWQgc2VydmVyIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCFcIikpO1xuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5oZWFkZXIub3Bjb2RlID09PSAweDIxKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImF1dGhlbnRpY2F0ZWRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc3BvbmQocmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgcmVzcExlbmd0aCA9IHJlc3BvbnNlLmhlYWRlci50b3RhbEJvZHlMZW5ndGggKyAyNDtcbiAgICAgIHRoaXMucmVzcG9uc2VCdWZmZXIgPSB0aGlzLnJlc3BvbnNlQnVmZmVyLnNsaWNlKHJlc3BMZW5ndGgpO1xuICAgICAgcmVzcG9uc2UgPSBwYXJzZU1lc3NhZ2UodGhpcy5yZXNwb25zZUJ1ZmZlcik7XG4gICAgfVxuICB9XG4gIHNvY2soc2FzbDogYm9vbGVhbiwgZ286IE9uQ29ubmVjdENhbGxiYWNrKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoIXNlbGYuX3NvY2tldCkge1xuICAgICAgLy8gQ0FTRSAxOiBjb21wbGV0ZWx5IG5ldyBzb2NrZXRcbiAgICAgIHNlbGYuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICBzZWxmLnJlc3BvbnNlQnVmZmVyID0gQnVmZmVyLmZyb20oW10pO1xuICAgICAgc2VsZi5fc29ja2V0ID0gbmV0LmNvbm5lY3QoXG4gICAgICAgIC8qIFRPRE86IGFsbG93aW5nIHBvcnQgdG8gYmUgc3RyaW5nIG9yIHVuZGVmaW5lZCBpcyB1c2VkIGJ5IHRoZSB0ZXN0cywgYnV0IHNlZW1zIGJhZCBvdmVyYWxsLiAqL1xuICAgICAgICB0eXBlb2YgdGhpcy5wb3J0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyBwYXJzZUludCh0aGlzLnBvcnQsIDEwKVxuICAgICAgICAgIDogdGhpcy5wb3J0IHx8IDExMjExLFxuICAgICAgICB0aGlzLmhvc3QsXG4gICAgICAgIGZ1bmN0aW9uICh0aGlzOiBuZXQuU29ja2V0KSB7XG4gICAgICAgICAgLy8gU0FTTCBhdXRoZW50aWNhdGlvbiBoYW5kbGVyXG4gICAgICAgICAgc2VsZi5vbmNlKFwiYXV0aGVudGljYXRlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fc29ja2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNvY2tldCA9IHNlbGYuX3NvY2tldDtcbiAgICAgICAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAvLyBjYW5jZWwgY29ubmVjdGlvbiB0aW1lb3V0XG4gICAgICAgICAgICAgIHNlbGYuX3NvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgICAgICAgICAgICBzZWxmLnRpbWVvdXRTZXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgLy8gcnVuIGFjdHVhbCByZXF1ZXN0KHMpXG4gICAgICAgICAgICAgIGdvKHNlbGYuX3NvY2tldCk7XG4gICAgICAgICAgICAgIHNlbGYuY29ubmVjdENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIGNiKHNvY2tldCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBzZWxmLmNvbm5lY3RDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIHNldHVwIHJlc3BvbnNlIGhhbmRsZXJcbiAgICAgICAgICB0aGlzLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZGF0YUJ1Zikge1xuICAgICAgICAgICAgc2VsZi5yZXNwb25zZUhhbmRsZXIoZGF0YUJ1Zik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBraWNrIG9mIFNBU0wgaWYgbmVlZGVkXG4gICAgICAgICAgaWYgKHNlbGYudXNlcm5hbWUgJiYgc2VsZi5wYXNzd29yZCkge1xuICAgICAgICAgICAgc2VsZi5saXN0U2FzbCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmVtaXQoXCJhdXRoZW50aWNhdGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gc2V0dXAgZXJyb3IgaGFuZGxlclxuICAgICAgc2VsZi5fc29ja2V0Lm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIHNlbGYuZXJyb3IoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlbGYuX3NvY2tldC5vbihcImNsb3NlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuZXJyb3JDYWxsYmFja3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZWxmLmVycm9yKG5ldyBFcnJvcihcInNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5LlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgc2VsZi5yZXNwb25zZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFtdKTtcbiAgICAgICAgaWYgKHNlbGYudGltZW91dFNldCkge1xuICAgICAgICAgIHNlbGYuX3NvY2tldD8uc2V0VGltZW91dCgwKTtcbiAgICAgICAgICBzZWxmLnRpbWVvdXRTZXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9zb2NrZXQgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gc2V0dXAgY29ubmVjdGlvbiB0aW1lb3V0IGhhbmRsZXJcbiAgICAgIHNlbGYudGltZW91dFNldCA9IHRydWU7XG4gICAgICBzZWxmLl9zb2NrZXQuc2V0VGltZW91dChcbiAgICAgICAgc2VsZi5vcHRpb25zLmNvbm50aW1lb3V0ICogMTAwMCxcbiAgICAgICAgZnVuY3Rpb24gKHRoaXM6IG5ldC5Tb2NrZXQpIHtcbiAgICAgICAgICBzZWxmLnRpbWVvdXRTZXQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoIXNlbGYuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgICAgICAgc2VsZi5fc29ja2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgc2VsZi5lcnJvcihuZXcgRXJyb3IoXCJzb2NrZXQgdGltZWQgb3V0IGNvbm5lY3RpbmcgdG8gc2VydmVyLlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyB1c2UgVENQIGtlZXAtYWxpdmVcbiAgICAgIHNlbGYuX3NvY2tldC5zZXRLZWVwQWxpdmUoXG4gICAgICAgIHNlbGYub3B0aW9ucy5rZWVwQWxpdmUsXG4gICAgICAgIHNlbGYub3B0aW9ucy5rZWVwQWxpdmVEZWxheSAqIDEwMDBcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghc2VsZi5jb25uZWN0ZWQgJiYgIXNhc2wpIHtcbiAgICAgIC8vIENBU0UgMjogc29ja2V0IGV4aXN0cywgYnV0IHN0aWxsIGNvbm5lY3RpbmcgLyBhdXRoZW50aWNhdGluZ1xuICAgICAgc2VsZi5vbkNvbm5lY3QoZ28pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDQVNFIDM6IHNvY2tldCBleGlzdHMgYW5kIGNvbm5lY3RlZCAvIHJlYWR5IHRvIHVzZVxuICAgICAgZ28oc2VsZi5fc29ja2V0KTtcbiAgICB9XG4gIH1cblxuICB3cml0ZShibG9iOiBCdWZmZXIpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBkZWFkbGluZSA9IE1hdGgucm91bmQoc2VsZi5vcHRpb25zLnRpbWVvdXQgKiAxMDAwKTtcbiAgICB0aGlzLnNvY2soZmFsc2UsIGZ1bmN0aW9uIChzKSB7XG4gICAgICBzLndyaXRlKGJsb2IpO1xuICAgICAgc2VsZi5yZXF1ZXN0VGltZW91dHMucHVzaCh0aW1lc3RhbXAoKSArIGRlYWRsaW5lKTtcbiAgICAgIGlmICghc2VsZi50aW1lb3V0U2V0KSB7XG4gICAgICAgIHNlbGYudGltZW91dFNldCA9IHRydWU7XG4gICAgICAgIHMuc2V0VGltZW91dChkZWFkbGluZSwgZnVuY3Rpb24gKHRoaXM6IG5ldC5Tb2NrZXQpIHtcbiAgICAgICAgICB0aW1lb3V0SGFuZGxlcihzZWxmLCB0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB3cml0ZVNBU0woYmxvYjogQnVmZmVyKSB7XG4gICAgdGhpcy5zb2NrKHRydWUsIGZ1bmN0aW9uIChzKSB7XG4gICAgICBzLndyaXRlKGJsb2IpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZGVzdHJveSgpIGluIGF0IGxlYXN0IHNvbWUsIGlmIG5vdCBhbGwsXG4gICAgICAvLyBjYXNlcy5cbiAgICAgIHRoaXMuX3NvY2tldC5lbmQoKTtcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCI8U2VydmVyIFwiICsgdGhpcy5ob3N0ICsgXCI6XCIgKyB0aGlzLnBvcnQgKyBcIj5cIjtcbiAgfVxuXG4gIGhvc3Rwb3J0U3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmhvc3QgKyBcIjpcIiArIHRoaXMucG9ydDtcbiAgfVxufVxuXG4vLyBXZSBoYW5kbGUgdHJhY2tpbmcgdGltZW91dHMgd2l0aCBhbiBhcnJheSBvZiBkZWFkbGluZXMgKHJlcXVlc3RUaW1lb3V0cyksIGFzXG4vLyBub2RlIGRvZXNuJ3QgbGlrZSB1cyBzZXR0aW5nIHVwIGxvdHMgb2YgdGltZXJzLCBhbmQgdXNpbmcganVzdCBvbmUgaXMgbW9yZVxuLy8gZWZmaWNpZW50IGFueXdheS5cbmNvbnN0IHRpbWVvdXRIYW5kbGVyID0gZnVuY3Rpb24gKHNlcnZlcjogU2VydmVyLCBzb2NrOiBuZXQuU29ja2V0KSB7XG4gIGlmIChzZXJ2ZXIucmVxdWVzdFRpbWVvdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIG5vdGhpbmcgYWN0aXZlXG4gICAgc2VydmVyLnRpbWVvdXRTZXQgPSBmYWxzZTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzb21lIHJlcXVlc3RzIG91dHN0YW5kaW5nLCBjaGVjayBpZiBhbnkgaGF2ZSB0aW1lZC1vdXRcbiAgY29uc3Qgbm93ID0gdGltZXN0YW1wKCk7XG4gIGNvbnN0IHNvb25lc3RUaW1lb3V0ID0gc2VydmVyLnJlcXVlc3RUaW1lb3V0c1swXTtcblxuICBpZiAoc29vbmVzdFRpbWVvdXQgPD0gbm93KSB7XG4gICAgLy8gdGltZW91dCBvY2N1cnJlZCFcbiAgICBzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKFwic29ja2V0IHRpbWVkIG91dCB3YWl0aW5nIG9uIHJlc3BvbnNlLlwiKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm8gdGltZW91dCEgU2V0dXAgbmV4dCBvbmUuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBzb29uZXN0VGltZW91dCAtIG5vdztcbiAgICBzb2NrLnNldFRpbWVvdXQoZGVhZGxpbmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRpbWVvdXRIYW5kbGVyKHNlcnZlciwgc29jayk7XG4gICAgfSk7XG4gIH1cbn07XG4iXX0= \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1963366..09423c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "memjs", - "version": "1.2.4", + "version": "1.2.4-NOTION.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "memjs", - "version": "1.2.4", + "version": "1.2.4-NOTION.1", "license": "MIT", "devDependencies": { "@types/node": "12.20.7", diff --git a/package.json b/package.json index a24179c..007377f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "author": "Amit Levy", "name": "memjs", "description": "A memcache client for node using the binary protocol and SASL authentication", - "version": "1.2.4", + "version": "1.2.4-NOTION.1", "license": "MIT", "homepage": "http://github.com/memcachier/memjs", "keywords": [ diff --git a/src/memjs/server.ts b/src/memjs/server.ts index ed96313..5f7b830 100644 --- a/src/memjs/server.ts +++ b/src/memjs/server.ts @@ -118,12 +118,14 @@ export class Server extends events.EventEmitter { error(err: Error) { const errcalls = this.errorCallbacks; + // reset all states except host, port, options, username, password + this.responseBuffer = Buffer.from([]); + this.connected = false; + this.timeoutSet = false; this.connectCallbacks = []; this.responseCallbacks = {}; this.requestTimeouts = []; this.errorCallbacks = {}; - this.timeoutSet = false; - this.responseBuffer = Buffer.from([]); if (this._socket) { this._socket.destroy(); delete this._socket; @@ -290,6 +292,8 @@ export class Server extends events.EventEmitter { close() { if (this._socket) { + // TODO: this should probably be destroy() in at least some, if not all, + // cases. this._socket.end(); } } @@ -319,10 +323,6 @@ const timeoutHandler = function (server: Server, sock: net.Socket) { if (soonestTimeout <= now) { // timeout occurred! - sock.end(); - server.connected = false; - server._socket = undefined; - server.timeoutSet = false; server.error(new Error("socket timed out waiting on response.")); } else { // no timeout! Setup next one.