From f18a523087a6ee3a2bc9fd5f2f5e63e449f5dba5 Mon Sep 17 00:00:00 2001 From: Yury Shkoda Date: Mon, 14 Aug 2023 10:50:11 +0300 Subject: [PATCH] feat(request-client): added bleached verbose mode --- README.md | 2 +- src/SASjs.ts | 18 ++++++++--- src/request/RequestClient.ts | 22 ++++++++++--- src/test/RequestClient.spec.ts | 56 ++++++++++++++++++++++++++++++++++ src/types/RequestClient.ts | 1 + src/types/SASjsConfig.ts | 3 +- src/types/index.ts | 2 +- 7 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 src/types/RequestClient.ts diff --git a/README.md b/README.md index 37234c0..d24e0fc 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ The adapter will also cache the logs (if debug enabled) and even the work tables ### Verbose Mode -Set `verbose` to `true` to enable verbose mode that logs a summary of every HTTP response. Verbose mode can be disabled by calling `disableVerboseMode` method or enabled by `enableVerboseMode` method. Verbose mode can also be enabled/disabled by `startComputeJob` method. +Set `verbose` to `true` to enable verbose mode that logs a summary of every HTTP response. Verbose mode can be disabled by calling `disableVerboseMode` method or enabled by `enableVerboseMode` method. Verbose mode also supports `bleached` mode that disables extra colors in req/res summary. To enable `bleached` verbose mode, pass `verbose` equal to `bleached` while instantiating an instance of `RequestClient` or to `setVerboseMode` method. Verbose mode can also be enabled/disabled by `startComputeJob` method. ### Session Manager diff --git a/src/SASjs.ts b/src/SASjs.ts index e071ecc..993922f 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -855,7 +855,7 @@ export default class SASjs { * @param pollOptions - an object that represents poll interval(milliseconds) and maximum amount of attempts. Object example: { maxPollCount: 24 * 60 * 60, pollInterval: 1000 }. More information available at src/api/viya/pollJobState.ts. * @param printPid - a boolean that indicates whether the function should print (PID) of the started job. * @param variables - an object that represents macro variables. - * @param verboseMode - boolean to enable verbose mode (log every HTTP response). + * @param verboseMode - boolean or a string equal to 'bleached' to enable verbose mode (log every HTTP response). */ public async startComputeJob( sasJob: string, @@ -866,7 +866,7 @@ export default class SASjs { pollOptions?: PollOptions, printPid = false, variables?: MacroVar, - verboseMode?: boolean + verboseMode?: VerboseMode ) { config = { ...this.sasjsConfig, @@ -880,8 +880,10 @@ export default class SASjs { ) } - if (verboseMode) this.requestClient?.enableVerboseMode() - else if (verboseMode === false) this.requestClient?.disableVerboseMode() + if (verboseMode) { + this.requestClient?.setVerboseMode(verboseMode) + this.requestClient?.enableVerboseMode() + } else if (verboseMode === false) this.requestClient?.disableVerboseMode() return this.sasViyaApiClient?.executeComputeJob( sasJob, @@ -1160,4 +1162,12 @@ export default class SASjs { public disableVerboseMode() { this.requestClient?.disableVerboseMode() } + + /** + * Sets verbose mode. + * @param verboseMode - value of the verbose mode, can be true, false or bleached(without extra colors). + */ + public setVerboseMode = (verboseMode: VerboseMode) => { + this.requestClient?.setVerboseMode(verboseMode) + } } diff --git a/src/request/RequestClient.ts b/src/request/RequestClient.ts index 181cbb0..b9586c7 100644 --- a/src/request/RequestClient.ts +++ b/src/request/RequestClient.ts @@ -10,7 +10,7 @@ import { JobExecutionError, CertificateError } from '../types/errors' -import { SASjsRequest } from '../types' +import { VerboseMode } from '../types' import { parseWeboutResponse } from '../utils/parseWeboutResponse' import { prefixMessage } from '@sasjs/utils/error' import { SAS9AuthError } from '../types/errors/SAS9AuthError' @@ -61,6 +61,7 @@ export class RequestClient implements HttpClient { private requests: SASjsRequest[] = [] private requestsLimit: number = 10 private httpInterceptor?: number + private verboseMode: VerboseMode = false protected csrfToken: CsrfToken = { headerName: '', value: '' } protected fileUploadCsrfToken: CsrfToken | undefined @@ -70,13 +71,16 @@ export class RequestClient implements HttpClient { protected baseUrl: string, httpsAgentOptions?: https.AgentOptions, requestsLimit?: number, - verboseMode?: boolean + verboseMode?: VerboseMode ) { this.createHttpClient(baseUrl, httpsAgentOptions) if (requestsLimit) this.requestsLimit = requestsLimit - if (verboseMode) this.enableVerboseMode() + if (verboseMode) { + this.setVerboseMode(verboseMode) + this.enableVerboseMode() + } } public setConfig(baseUrl: string, httpsAgentOptions?: https.AgentOptions) { @@ -398,10 +402,12 @@ export class RequestClient implements HttpClient { /** * Adds colors to the string. + * If verboseMode is set to 'bleached', colors should be disabled * @param str - string to be prettified. * @returns - prettified string */ - private prettifyString = (str: any) => inspect(str, { colors: true }) + private prettifyString = (str: any) => + inspect(str, { colors: this.verboseMode !== 'bleached' }) /** * Formats HTTP request/response body. @@ -471,6 +477,14 @@ ${resHeaders}${parsedResBody ? `\n\n${parsedResBody}` : ''} return response } + /** + * Sets verbose mode. + * @param verboseMode - value of the verbose mode, can be true, false or bleached(without extra colors). + */ + public setVerboseMode = (verboseMode: VerboseMode) => { + this.verboseMode = verboseMode + } + /** * Turns on verbose mode to log every HTTP response. * @param successCallBack - function that should be triggered on every HTTP response with the status 2**. diff --git a/src/test/RequestClient.spec.ts b/src/test/RequestClient.spec.ts index bef18bc..e9650e9 100644 --- a/src/test/RequestClient.spec.ts +++ b/src/test/RequestClient.spec.ts @@ -11,10 +11,12 @@ import { NotFoundError, InternalServerError } from '../types/errors' +import { VerboseMode } from '../types' import { RequestClient } from '../request/RequestClient' import { getTokenRequestErrorPrefixResponse } from '../auth/getTokenRequestErrorPrefix' import { AxiosResponse } from 'axios' import { Logger, LogLevel } from '@sasjs/utils/logger' +import * as UtilsModule from 'util' const axiosActual = jest.requireActual('axios') @@ -235,6 +237,60 @@ ${resHeaders[0]}: ${resHeaders[1]}${ }) }) + describe('setVerboseMode', () => { + it(`should set verbose mode`, () => { + const requestClient = new RequestClient('') + let verbose: VerboseMode = false + requestClient.setVerboseMode(verbose) + + expect(requestClient['verboseMode']).toEqual(verbose) + + verbose = true + requestClient.setVerboseMode(verbose) + + expect(requestClient['verboseMode']).toEqual(verbose) + + verbose = 'bleached' + requestClient.setVerboseMode(verbose) + + expect(requestClient['verboseMode']).toEqual(verbose) + }) + }) + + describe('prettifyString', () => { + it(`should call inspect without colors when verbose mode is set to 'bleached'`, () => { + const requestClient = new RequestClient('') + let verbose: VerboseMode = 'bleached' + requestClient.setVerboseMode(verbose) + + jest.spyOn(UtilsModule, 'inspect') + + const testStr = JSON.stringify({ test: 'test' }) + + requestClient['prettifyString'](testStr) + + expect(UtilsModule.inspect).toHaveBeenCalledWith(testStr, { + colors: false + }) + }) + + it(`should call inspect with colors when verbose mode is set to 'true'`, () => { + const requestClient = new RequestClient('') + let verbose: VerboseMode = true + requestClient.setVerboseMode(verbose) + + jest.spyOn(UtilsModule, 'inspect') + + const testStr = JSON.stringify({ test: 'test' }) + + requestClient['prettifyString'](testStr) + + expect(UtilsModule.inspect).toHaveBeenCalledWith(testStr, { + colors: true + }) + }) + }) + describe('disableVerboseMode', () => { it('should eject interceptor', () => { const requestClient = new RequestClient('') diff --git a/src/types/RequestClient.ts b/src/types/RequestClient.ts new file mode 100644 index 0000000..4765575 --- /dev/null +++ b/src/types/RequestClient.ts @@ -0,0 +1 @@ +export type VerboseMode = boolean | 'bleached' diff --git a/src/types/SASjsConfig.ts b/src/types/SASjsConfig.ts index d2c0536..92a0198 100644 --- a/src/types/SASjsConfig.ts +++ b/src/types/SASjsConfig.ts @@ -1,5 +1,6 @@ import * as https from 'https' import { ServerType } from '@sasjs/utils/types' +import { VerboseMode } from '../types' /** * Specifies the configuration for the SASjs instance - eg where and how to @@ -48,7 +49,7 @@ export class SASjsConfig { /** * Set to `true` to enable verbose mode that will log a summary of every HTTP response. */ - verbose?: boolean = true + verbose?: VerboseMode = true /** * The name of the compute context to use when calling the Viya services directly. * Example value: 'SAS Job Execution compute context' diff --git a/src/types/index.ts b/src/types/index.ts index c5994f7..5d51e4a 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -7,7 +7,7 @@ export * from './JobDefinition' export * from './JobResult' export * from './Link' export * from './SASjsConfig' -export * from './SASjsRequest' +export * from './RequestClient' export * from './Session' export * from './UploadFile' export * from './PollOptions'