1
0
mirror of https://github.com/sasjs/adapter.git synced 2025-12-11 01:14:36 +00:00

feat(request-client): added bleached verbose mode

This commit is contained in:
Yury Shkoda
2023-08-14 10:50:11 +03:00
parent 8cbd292f13
commit f18a523087
7 changed files with 93 additions and 11 deletions

View File

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

View File

@@ -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)
}
}

View File

@@ -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**.

View File

@@ -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('')

View File

@@ -0,0 +1 @@
export type VerboseMode = boolean | 'bleached'

View File

@@ -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'

View File

@@ -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'