From 1d61cba0148b6d3e7abd40c3094ac09957c447f6 Mon Sep 17 00:00:00 2001 From: Tomas Della Vedova Date: Tue, 19 Mar 2019 09:50:36 +0100 Subject: [PATCH] Inspect Connection (#784) Handles `console.log` and `utils.inspect` invocations for a better debugging experience. `agent` and `ssl` are hidden since they made the logs very hard to read. The user can still access them with `instance.agent` and `instance.ssl`. --- lib/Connection.d.ts | 2 ++ lib/Connection.js | 24 +++++++++++++++++--- test/unit/connection.test.js | 43 ++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/lib/Connection.d.ts b/lib/Connection.d.ts index 21c701789..99d9a7ffd 100644 --- a/lib/Connection.d.ts +++ b/lib/Connection.d.ts @@ -20,6 +20,7 @@ /// import { URL } from 'url'; +import { inspect, InspectOptions } from 'util'; import * as http from 'http'; import { SecureContextOptions } from 'tls'; @@ -73,6 +74,7 @@ export default class Connection { setRole(role: string, enabled: boolean): Connection; status: string; buildRequestObject(params: any): http.ClientRequestArgs; + [inspect.custom](object: any, options: InspectOptions): string; } export {}; diff --git a/lib/Connection.js b/lib/Connection.js index 22e570edd..4429e8696 100644 --- a/lib/Connection.js +++ b/lib/Connection.js @@ -20,6 +20,7 @@ 'use strict' const assert = require('assert') +const { inspect } = require('util') const http = require('http') const https = require('https') const debug = require('debug')('elasticsearch') @@ -54,7 +55,7 @@ class Connection { maxSockets: keepAliveFalse ? Infinity : 256, maxFreeSockets: 256 }, opts.agent) - this._agent = this.url.protocol === 'http:' + this.agent = this.url.protocol === 'http:' ? new http.Agent(agentOptions) : new https.Agent(Object.assign({}, agentOptions, this.ssl)) @@ -146,7 +147,7 @@ class Connection { if (this._openRequests > 0) { setTimeout(() => this.close(callback), 1000) } else { - this._agent.destroy() + this.agent.destroy() callback() } } @@ -193,7 +194,7 @@ class Connection { auth: !!url.username === true || !!url.password === true ? `${url.username}:${url.password}` : undefined, - agent: this._agent + agent: this.agent } const paramsKeys = Object.keys(params) @@ -218,6 +219,23 @@ class Connection { return request } + + // Handles console.log and utils.inspect invocations. + // We want to hide `agent` and `ssl` since they made + // the logs very hard to read. The user can still + // access them with `instance.agent` and `instance.ssl`. + [inspect.custom] (depth, options) { + return { + url: this.url, + id: this.id, + headers: this.headers, + deadCount: this.deadCount, + resurrectTimeout: this.resurrectTimeout, + _openRequests: this._openRequests, + status: this.status, + roles: this.roles + } + } } Connection.statuses = { diff --git a/test/unit/connection.test.js b/test/unit/connection.test.js index 1a07ccf45..229e00d04 100644 --- a/test/unit/connection.test.js +++ b/test/unit/connection.test.js @@ -20,6 +20,7 @@ 'use strict' const { test } = require('tap') +const { inspect } = require('util') const { createGzip, createDeflate } = require('zlib') const { URL } = require('url') const intoStream = require('into-stream') @@ -670,3 +671,45 @@ test('setRole', t => { t.end() }) + +test('Util.inspect Connection class should hide agent and ssl', t => { + t.plan(1) + + const connection = new Connection({ + url: new URL('http://localhost:9200'), + id: 'node-id', + headers: { foo: 'bar' } + }) + + // Removes spaces and new lines because + // utils.inspect is handled differently + // between major versions of Node.js + function cleanStr (str) { + return str + .replace(/\s/g, '') + .replace(/(\r\n|\n|\r)/gm, '') + } + + t.strictEqual(cleanStr(inspect(connection)), cleanStr(`{ url: + URL { + href: 'http://localhost:9200/', + origin: 'http://localhost:9200', + protocol: 'http:', + username: '', + password: '', + host: 'localhost:9200', + hostname: 'localhost', + port: '9200', + pathname: '/', + search: '', + searchParams: URLSearchParams {}, + hash: '' }, + id: 'node-id', + headers: { foo: 'bar' }, + deadCount: 0, + resurrectTimeout: 0, + _openRequests: 0, + status: 'alive', + roles: { master: true, data: true, ingest: true, ml: false } }`) + ) +})