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`.
This commit is contained in:
Tomas Della Vedova
2019-03-19 09:50:36 +01:00
committed by delvedor
parent 4d551319dd
commit dc5102d30b
3 changed files with 66 additions and 3 deletions

2
lib/Connection.d.ts vendored
View File

@ -20,6 +20,7 @@
/// <reference types="node" />
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 {};

View File

@ -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 = {