From a57955c7d908114e06a5f286ab00053c3d861ca3 Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Fri, 23 Jan 2026 22:47:02 -0300 Subject: [PATCH 01/10] feat: bump lhisp libs --- package-lock.json | 67 ++++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0480090..cf798de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { - "name": "lhisp-oauth-client-dev", - "version": "1.0.35", + "name": "lhisp-oauth-client", + "version": "1.0.36", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "lhisp-oauth-client-dev", - "version": "1.0.35", + "name": "lhisp-oauth-client", + "version": "1.0.36", "license": "MIT", "dependencies": { "axios": "^1.10.0", - "lhisp-logger": "^2.2.2" + "lhisp-logger": "^3.0.3" }, "devDependencies": { "@types/jest": "^30.0.0", @@ -3330,12 +3330,12 @@ } }, "node_modules/lhisp-logger": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/lhisp-logger/-/lhisp-logger-2.2.2.tgz", - "integrity": "sha512-hoQced0w2ZShF+UbTu6OkQsWSdGcyG3qJ6oxmJFJjb/tBrTbAiRX0WrvPMC5wa1hBICm2v8KcnaGZN25HITxxw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lhisp-logger/-/lhisp-logger-3.0.3.tgz", + "integrity": "sha512-3wu65EPZiWCl+LcH2ZsByXozmd1bg7JSWyTpBjXoIp4i9nxKXHqqB3MsBgWzC5jSm/Rz2l+0BccrjSkVxFyx+w==", "license": "ISC", "dependencies": { - "pino": "^10.1.0", + "pino": "^10.3.0", "pino-loki": "^3.0.0", "pino-pretty": "^13.1.3" } @@ -3769,31 +3769,31 @@ } }, "node_modules/pino": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-10.1.0.tgz", - "integrity": "sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.0.tgz", + "integrity": "sha512-0GNPNzHXBKw6U/InGe79A3Crzyk9bcSyObF9/Gfo9DLEf5qj5RF50RSjsu0W1rZ6ZqRGdzDFCRBQvi9/rSGPtA==", "license": "MIT", "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", + "pino-abstract-transport": "^3.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", - "thread-stream": "^3.0.0" + "thread-stream": "^4.0.0" }, "bin": { "pino": "bin.js" } }, "node_modules/pino-abstract-transport": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", - "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", "license": "MIT", "dependencies": { "split2": "^4.0.0" @@ -3818,15 +3818,6 @@ "url": "https://github.com/sponsors/Julien-R44" } }, - "node_modules/pino-loki/node_modules/pino-abstract-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", - "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", - "license": "MIT", - "dependencies": { - "split2": "^4.0.0" - } - }, "node_modules/pino-pretty": { "version": "13.1.3", "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz", @@ -3851,15 +3842,6 @@ "pino-pretty": "bin.js" } }, - "node_modules/pino-pretty/node_modules/pino-abstract-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", - "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", - "license": "MIT", - "dependencies": { - "split2": "^4.0.0" - } - }, "node_modules/pino-pretty/node_modules/strip-json-comments": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", @@ -3873,9 +3855,9 @@ } }, "node_modules/pino-std-serializers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", "license": "MIT" }, "node_modules/pirates": { @@ -4406,12 +4388,15 @@ } }, "node_modules/thread-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", - "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", + "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", "license": "MIT", "dependencies": { "real-require": "^0.2.0" + }, + "engines": { + "node": ">=20" } }, "node_modules/tmpl": { diff --git a/package.json b/package.json index 3a52360..58a92cf 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,6 @@ }, "dependencies": { "axios": "^1.10.0", - "lhisp-logger": "^2.2.2" + "lhisp-logger": "^3.0.3" } } From a9fbbc39be6625ff578d639ba7da236df0eed925 Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Sat, 24 Jan 2026 00:34:31 -0300 Subject: [PATCH 02/10] feat: bump lhisp libs --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index cf798de..0bc6f72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "axios": "^1.10.0", - "lhisp-logger": "^3.0.3" + "lhisp-logger": "^3.0.5" }, "devDependencies": { "@types/jest": "^30.0.0", @@ -3330,9 +3330,9 @@ } }, "node_modules/lhisp-logger": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lhisp-logger/-/lhisp-logger-3.0.3.tgz", - "integrity": "sha512-3wu65EPZiWCl+LcH2ZsByXozmd1bg7JSWyTpBjXoIp4i9nxKXHqqB3MsBgWzC5jSm/Rz2l+0BccrjSkVxFyx+w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/lhisp-logger/-/lhisp-logger-3.0.5.tgz", + "integrity": "sha512-2FIeSUQqjndprbvczSwJBalVdSJqlGa76OQhsjCpSTh27QTRZY+r7MnWohq0zLuMYcUynzXAqgDAE24ZU9PpqA==", "license": "ISC", "dependencies": { "pino": "^10.3.0", diff --git a/package.json b/package.json index 58a92cf..15bb9a0 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,6 @@ }, "dependencies": { "axios": "^1.10.0", - "lhisp-logger": "^3.0.3" + "lhisp-logger": "^3.0.5" } } From ffa30f7941a676e4ef161c26223eb68bc7f24f12 Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Sat, 24 Jan 2026 10:13:20 -0300 Subject: [PATCH 03/10] feat: bump lhisp libs --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0bc6f72..7470265 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "axios": "^1.10.0", - "lhisp-logger": "^3.0.5" + "lhisp-logger": "^3.1.0" }, "devDependencies": { "@types/jest": "^30.0.0", @@ -3330,9 +3330,9 @@ } }, "node_modules/lhisp-logger": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/lhisp-logger/-/lhisp-logger-3.0.5.tgz", - "integrity": "sha512-2FIeSUQqjndprbvczSwJBalVdSJqlGa76OQhsjCpSTh27QTRZY+r7MnWohq0zLuMYcUynzXAqgDAE24ZU9PpqA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lhisp-logger/-/lhisp-logger-3.1.0.tgz", + "integrity": "sha512-dfWGqkn1yZqEwPFQ9LjdeMHm6G2/lrsQ5p3bF3sisflFVBXUB9LY5rzThEZPGCekeDz0GTw2T2LNyrRv8wPxDw==", "license": "ISC", "dependencies": { "pino": "^10.3.0", diff --git a/package.json b/package.json index 15bb9a0..8ac5333 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,6 @@ }, "dependencies": { "axios": "^1.10.0", - "lhisp-logger": "^3.0.5" + "lhisp-logger": "^3.1.0" } } From dc40ba4ac04f95f423aa8551c6d7199e5826c0dd Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Sat, 24 Jan 2026 10:17:16 -0300 Subject: [PATCH 04/10] feat: bump lhisp libs --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8ac5333..d30758a 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,6 @@ }, "dependencies": { "axios": "^1.10.0", - "lhisp-logger": "^3.1.0" + "lhisp-logger": "^3.1.1" } } From e548beb8c9f2d9a5f5bc98c0aa7e51f1aa1ddea6 Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Sat, 24 Jan 2026 10:29:48 -0300 Subject: [PATCH 05/10] feat: bump lhisp libs --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7470265..e22a613 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "axios": "^1.10.0", - "lhisp-logger": "^3.1.0" + "lhisp-logger": "^3.1.2" }, "devDependencies": { "@types/jest": "^30.0.0", @@ -3330,9 +3330,9 @@ } }, "node_modules/lhisp-logger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lhisp-logger/-/lhisp-logger-3.1.0.tgz", - "integrity": "sha512-dfWGqkn1yZqEwPFQ9LjdeMHm6G2/lrsQ5p3bF3sisflFVBXUB9LY5rzThEZPGCekeDz0GTw2T2LNyrRv8wPxDw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lhisp-logger/-/lhisp-logger-3.1.2.tgz", + "integrity": "sha512-dmS7pLjE8XxrEWUkzaIXWSgmITsvZmD299fWW3w4HZQoJ+Cvb6T/Dq3eQTxw4sBeE09f1P900dXGV3CvKyq0ZQ==", "license": "ISC", "dependencies": { "pino": "^10.3.0", diff --git a/package.json b/package.json index d30758a..44d9255 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,6 @@ }, "dependencies": { "axios": "^1.10.0", - "lhisp-logger": "^3.1.1" + "lhisp-logger": "^3.1.2" } } From d8c3bbf6b6e947361a01238e39b9b5cb650a1c35 Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Sat, 24 Jan 2026 10:54:19 -0300 Subject: [PATCH 06/10] feat: enhance logging capabilities with configurable logger --- src/lhisp-oauth-client.t.ts | 2 ++ src/lhisp-oauth-client.ts | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/lhisp-oauth-client.t.ts b/src/lhisp-oauth-client.t.ts index df941fe..6229a6e 100644 --- a/src/lhisp-oauth-client.t.ts +++ b/src/lhisp-oauth-client.t.ts @@ -1,4 +1,5 @@ import { AxiosRequestConfig } from "axios"; +import { Logger } from "lhisp-logger"; export interface Headers { [name: string]: any; @@ -23,6 +24,7 @@ export interface LhispOauthClientConstructorParams { formatAccessToken?: (accessToken?: AccessToken) => string; debug?: boolean; timeout?: number; + logger?: Logger; } export interface ExecutarRequestParams extends AxiosRequestConfig { diff --git a/src/lhisp-oauth-client.ts b/src/lhisp-oauth-client.ts index 4d4c4dd..107e977 100644 --- a/src/lhisp-oauth-client.ts +++ b/src/lhisp-oauth-client.ts @@ -1,6 +1,6 @@ import axios, { AxiosHeaders, AxiosRequestConfig } from "axios"; import https from "https"; -import lhLogger from "lhisp-logger"; +import logger, { Logger } from "lhisp-logger"; import qs from "querystring"; import { AccessToken, @@ -13,8 +13,6 @@ import { LhispOauthClientConstructorParams, } from "./lhisp-oauth-client.t"; -const logger = lhLogger({ name: "lhisp-oauth-client" }); - export class LhispOauthClient { protected authUrl: string; protected apiUrl: string; @@ -38,6 +36,7 @@ export class LhispOauthClient { protected sendAuthCredentialsOnRequestBody?: boolean; protected timeout: number; protected formatAccessToken?: (accessToken?: iAccessToken) => string; + private logger: Logger; constructor(params: LhispOauthClientConstructorParams) { if (params.certificado) { @@ -68,6 +67,7 @@ export class LhispOauthClient { this.sendAuthCredentialsOnRequestBody = params.sendAuthCredentialsOnRequestBody; this.formatAccessToken = params.formatAccessToken; this.timeout = params.timeout ? params.timeout : 60000; + this.logger = params.logger || logger; } getAuthHeaderValue(): string { @@ -131,7 +131,7 @@ export class LhispOauthClient { }); const resp = await axios.request(authRequestOpt); if (!resp?.data) { - logger.error({ message: "LhispOauthClient.getAccessToken", resp }); + this.logger.error({ message: "LhispOauthClient.getAccessToken", resp }); throw new Error("Resposta inválida ao obter token de acesso."); } this.accessToken = this.buildAccessToken(resp.data); @@ -139,7 +139,7 @@ export class LhispOauthClient { this.tokenExpiresIn = this.accessToken?.expires_in || this.tokenCreatedAt + 60000; return this.accessToken; } catch (error) { - logger.error({ message: "LhispOauthClient.getAccessToken", error }); + this.logger.error({ message: "LhispOauthClient.getAccessToken", error }); throw error; } } @@ -192,7 +192,7 @@ export class LhispOauthClient { return response.data; } catch (error) { - logger.error({ + this.logger.error({ message: "LhispOauthClient.executarRequest", method, url: `${this.apiUrl}${path}`, From 0f99277068ca0eb5f0c0574ed192d6e012d0dfc9 Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Sat, 24 Jan 2026 10:58:52 -0300 Subject: [PATCH 07/10] feat: update version to 1.0.37 and enhance logger interface --- package-lock.json | 292 +----------------------------------- package.json | 6 +- src/lhisp-oauth-client.t.ts | 9 +- src/lhisp-oauth-client.ts | 9 +- 4 files changed, 23 insertions(+), 293 deletions(-) diff --git a/package-lock.json b/package-lock.json index e22a613..ccd6bff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,15 @@ { "name": "lhisp-oauth-client", - "version": "1.0.36", + "version": "1.0.37", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "lhisp-oauth-client", - "version": "1.0.36", + "version": "1.0.37", "license": "MIT", "dependencies": { - "axios": "^1.10.0", - "lhisp-logger": "^3.1.2" + "axios": "^1.10.0" }, "devDependencies": { "@types/jest": "^30.0.0", @@ -974,12 +973,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@pinojs/redact": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", - "license": "MIT" - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1264,15 +1257,6 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/axios": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", @@ -1695,12 +1679,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1742,15 +1720,6 @@ "node": ">= 8" } }, - "node_modules/dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1877,15 +1846,6 @@ "dev": true, "license": "MIT" }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2027,12 +1987,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/fast-copy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.2.tgz", - "integrity": "sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==", - "license": "MIT" - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2040,12 +1994,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" - }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -2402,12 +2350,6 @@ "node": ">= 0.4" } }, - "node_modules/help-me": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", - "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", - "license": "MIT" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -3256,15 +3198,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3329,17 +3262,6 @@ "node": ">=6" } }, - "node_modules/lhisp-logger": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lhisp-logger/-/lhisp-logger-3.1.2.tgz", - "integrity": "sha512-dmS7pLjE8XxrEWUkzaIXWSgmITsvZmD299fWW3w4HZQoJ+Cvb6T/Dq3eQTxw4sBeE09f1P900dXGV3CvKyq0ZQ==", - "license": "ISC", - "dependencies": { - "pino": "^10.3.0", - "pino-loki": "^3.0.0", - "pino-pretty": "^13.1.3" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -3495,15 +3417,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -3579,19 +3492,11 @@ "node": ">=8" } }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -3768,98 +3673,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pino": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.0.tgz", - "integrity": "sha512-0GNPNzHXBKw6U/InGe79A3Crzyk9bcSyObF9/Gfo9DLEf5qj5RF50RSjsu0W1rZ6ZqRGdzDFCRBQvi9/rSGPtA==", - "license": "MIT", - "dependencies": { - "@pinojs/redact": "^0.4.0", - "atomic-sleep": "^1.0.0", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^3.0.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^5.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^4.0.1", - "thread-stream": "^4.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/pino-abstract-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", - "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", - "license": "MIT", - "dependencies": { - "split2": "^4.0.0" - } - }, - "node_modules/pino-loki": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pino-loki/-/pino-loki-3.0.0.tgz", - "integrity": "sha512-9TyUW5syTjp2nT70QcijJtIWUzdYUj+olQ7+fWNfm1/HrDGEWt86Q4ACzClH6DM6GBwtQimRDgneNczP+p4ypA==", - "license": "MIT", - "dependencies": { - "pino-abstract-transport": "^3.0.0", - "pump": "^3.0.3" - }, - "bin": { - "pino-loki": "dist/cli.mjs" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/Julien-R44" - } - }, - "node_modules/pino-pretty": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz", - "integrity": "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.7", - "dateformat": "^4.6.3", - "fast-copy": "^4.0.0", - "fast-safe-stringify": "^2.1.1", - "help-me": "^5.0.0", - "joycon": "^3.1.1", - "minimist": "^1.2.6", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^3.0.0", - "pump": "^3.0.0", - "secure-json-parse": "^4.0.0", - "sonic-boom": "^4.0.1", - "strip-json-comments": "^5.0.2" - }, - "bin": { - "pino-pretty": "bin.js" - } - }, - "node_modules/pino-pretty/node_modules/strip-json-comments": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", - "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pino-std-serializers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", - "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", - "license": "MIT" - }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", @@ -3911,38 +3724,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process-warning": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/pure-rand": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", @@ -3960,12 +3747,6 @@ ], "license": "MIT" }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", - "license": "MIT" - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -3973,15 +3754,6 @@ "dev": true, "license": "MIT" }, - "node_modules/real-require": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4015,31 +3787,6 @@ "node": ">=8" } }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/secure-json-parse": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", - "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4088,15 +3835,6 @@ "node": ">=8" } }, - "node_modules/sonic-boom": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", - "license": "MIT", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4118,15 +3856,6 @@ "source-map": "^0.6.0" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -4387,18 +4116,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/thread-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", - "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", - "license": "MIT", - "dependencies": { - "real-require": "^0.2.0" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -4746,6 +4463,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { diff --git a/package.json b/package.json index 44d9255..f2252c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lhisp-oauth-client", - "version": "1.0.36", + "version": "1.0.37", "main": "src/index", "types": "src/index.d.ts", "repository": { @@ -12,6 +12,7 @@ "scripts": { "build": "tsc", "test": "jest", + "publish": "rm -rfv dist/; npm run build; cd dist; cp ../package* .; npm publish; cd -; rm -rfv dist/;", "test:watch": "jest --watchAll" }, "devDependencies": { @@ -22,7 +23,6 @@ "typescript": "^5.8.3" }, "dependencies": { - "axios": "^1.10.0", - "lhisp-logger": "^3.1.2" + "axios": "^1.10.0" } } diff --git a/src/lhisp-oauth-client.t.ts b/src/lhisp-oauth-client.t.ts index 6229a6e..8867a03 100644 --- a/src/lhisp-oauth-client.t.ts +++ b/src/lhisp-oauth-client.t.ts @@ -1,5 +1,12 @@ import { AxiosRequestConfig } from "axios"; -import { Logger } from "lhisp-logger"; + +export interface Logger { + child: (params: any) => Logger; + info: Console["info"]; + warn: Console["warn"]; + error: Console["error"]; + debug: Console["debug"]; +} export interface Headers { [name: string]: any; diff --git a/src/lhisp-oauth-client.ts b/src/lhisp-oauth-client.ts index 107e977..70122f1 100644 --- a/src/lhisp-oauth-client.ts +++ b/src/lhisp-oauth-client.ts @@ -1,6 +1,5 @@ import axios, { AxiosHeaders, AxiosRequestConfig } from "axios"; import https from "https"; -import logger, { Logger } from "lhisp-logger"; import qs from "querystring"; import { AccessToken, @@ -11,6 +10,7 @@ import { defaultTokenHeaderName, ExecutarRequestParams, LhispOauthClientConstructorParams, + Logger, } from "./lhisp-oauth-client.t"; export class LhispOauthClient { @@ -67,7 +67,7 @@ export class LhispOauthClient { this.sendAuthCredentialsOnRequestBody = params.sendAuthCredentialsOnRequestBody; this.formatAccessToken = params.formatAccessToken; this.timeout = params.timeout ? params.timeout : 60000; - this.logger = params.logger || logger; + this.logger = params.logger || consoleLogger; } getAuthHeaderValue(): string { @@ -240,3 +240,8 @@ export class LhispOauthClient { }); } } + +const consoleLogger: Logger = { + ...console, + child: () => consoleLogger, +}; From 4cfa8fa6e4e32508f3b2d778f8ab2f8ea453601a Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Sat, 24 Jan 2026 11:04:38 -0300 Subject: [PATCH 08/10] feat: update version to 1.0.38 and add README documentation --- README.md | 326 ++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 4 +- package.json | 2 +- 3 files changed, 329 insertions(+), 3 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d7fda51 --- /dev/null +++ b/README.md @@ -0,0 +1,326 @@ +# lhisp-oauth-client + +Bilingual README (Português / English) for the **lhisp-oauth-client** library. + +- [Português (PT-BR)](#português-pt-br) +- [English](#english) + +--- + +## Português (PT-BR) + +Cliente HTTP simples para consumir uma API protegida por **OAuth2 (Client Credentials)**, cuidando automaticamente de: + +- Obter o `access_token` no endpoint de autenticação +- Cache do token até expirar (com margem de ~10s) +- Enviar o token nas requisições subsequentes para a API +- Suporte opcional a **certificado cliente (PFX)** via `https.Agent` + +> Observação: refresh token **ainda não está implementado** (há um `TODO` no código). Quando o token expira, um novo token é solicitado. + +### Instalação + +```bash +npm i lhisp-oauth-client +# ou +yarn add lhisp-oauth-client +``` + +### Uso rápido + +```ts +import { LhispOauthClient } from "lhisp-oauth-client"; + +const client = new LhispOauthClient({ + apiUrl: "https://api.exemplo.com", + authUrl: "https://auth.exemplo.com/oauth/token", + clientId: "SEU_CLIENT_ID", + clientSecret: "SEU_CLIENT_SECRET", +}); + +type StatusResponse = { status: string }; + +async function main() { + const resp = await client.get({ + path: "/status", + params: { verbose: true }, + }); + + console.log(resp.status); +} + +main(); +``` + +### API (principais métodos) + +- `getAccessToken(): Promise` + - Obtém e cacheia o token. +- `getAuthToken(): string` + - Retorna o header final de autorização (por padrão `" "`). +- `executarRequest(params): Promise` + - Método base que injeta token e executa request via Axios. +- Atalhos HTTP: + - `get`, `post`, `put`, `patch`, `delete` + +### Parâmetros do construtor + +`new LhispOauthClient(params)` aceita: + +- `apiUrl` (string, obrigatório): URL base da API (ex.: `https://api.exemplo.com`) +- `authUrl` (string, obrigatório): endpoint OAuth2 para obter token +- `clientId` (string, obrigatório) +- `clientSecret` (string, obrigatório) + +Opcionalmente: + +- `certificado` (string | Buffer): certificado cliente PFX + - Se for string, o código assume **base64** e faz `Buffer.from(certificado, "base64")` +- `senhaCertificado` (string): senha do PFX +- `authScope` (string): adiciona `scope` no request de token +- `grantType` (string): padrão `client_credentials` +- `authContentType` (`ContentType`): padrão `application/x-www-form-urlencoded` +- `authData` (Record): campos extras enviados ao endpoint de token +- `headers` (object): headers aplicados nas requisições para a API +- `authHeaders` (object): headers extras somente na obtenção do token +- `authHeaderName` (string): nome do header usado para credenciais Basic (padrão `Authorization`) +- `tokenHeaderName` (string): nome do header onde o token é enviado (padrão `Authorization`) +- `sendAuthCredentialsOnRequestBody` (boolean): envia `client_id` e `client_secret` também no body +- `formatAccessToken` ((token?) => string): personaliza o valor enviado no header do token +- `timeout` (number): timeout das requisições (ms). Padrão `60000` +- `logger` (Logger): logger compatível (com `.child()` + métodos `info/warn/error/debug`) + +### Content-Type + +Você pode escolher o `Content-Type` das requisições para API via `contentType`: + +```ts +import { ContentType } from "lhisp-oauth-client"; + +await client.post({ + path: "/clientes", + contentType: ContentType.APPLICATION_JSON, + data: { name: "Maria" }, +}); +``` + +> Nota: o `contentType` de **autenticação** (request do token) é controlado por `authContentType`. + +### Exemplo: credenciais no body (alguns servidores exigem) + +```ts +import { LhispOauthClient, ContentType } from "lhisp-oauth-client"; + +const client = new LhispOauthClient({ + apiUrl: "https://api.exemplo.com", + authUrl: "https://auth.exemplo.com/oauth/token", + clientId: "SEU_CLIENT_ID", + clientSecret: "SEU_CLIENT_SECRET", + authContentType: ContentType.APPLICATION_JSON, + sendAuthCredentialsOnRequestBody: true, +}); + +await client.get({ path: "/status" }); +``` + +### Exemplo: header de token customizado + +```ts +import { LhispOauthClient } from "lhisp-oauth-client"; + +const client = new LhispOauthClient({ + apiUrl: "https://api.exemplo.com", + authUrl: "https://auth.exemplo.com/oauth/token", + clientId: "SEU_CLIENT_ID", + clientSecret: "SEU_CLIENT_SECRET", + tokenHeaderName: "x-token", +}); + +await client.get({ path: "/status" }); +``` + +### Exemplo: usando certificado (PFX) + +```ts +import fs from "node:fs"; +import { LhispOauthClient } from "lhisp-oauth-client"; + +const pfxBuffer = fs.readFileSync("./certificado.pfx"); + +const client = new LhispOauthClient({ + apiUrl: "https://api.exemplo.com", + authUrl: "https://auth.exemplo.com/oauth/token", + clientId: "SEU_CLIENT_ID", + clientSecret: "SEU_CLIENT_SECRET", + certificado: pfxBuffer, + senhaCertificado: "SENHA_DO_PFX", +}); + +await client.get({ path: "/status" }); +``` + +### Observações de segurança + +- O `https.Agent` é criado com `rejectUnauthorized: false` (com ou sem certificado). Isso **desabilita validação do certificado** do servidor TLS. + - Em produção, isso pode reduzir segurança. Se você precisar de validação TLS, será necessário ajustar a implementação. + +--- + +## English + +A lightweight HTTP client to consume an API protected by **OAuth2 (Client Credentials)**. It automatically: + +- Fetches an `access_token` from the auth endpoint +- Caches the token until it expires (with a ~10s safety margin) +- Sends the token on subsequent API requests +- Optionally supports **client certificate (PFX)** via `https.Agent` + +> Note: refresh token is **not implemented yet** (there is a `TODO` in the code). When the token expires, a new token is requested. + +### Install + +```bash +npm i lhisp-oauth-client +# or +yarn add lhisp-oauth-client +``` + +### Quick start + +```ts +import { LhispOauthClient } from "lhisp-oauth-client"; + +const client = new LhispOauthClient({ + apiUrl: "https://api.example.com", + authUrl: "https://auth.example.com/oauth/token", + clientId: "YOUR_CLIENT_ID", + clientSecret: "YOUR_CLIENT_SECRET", +}); + +type StatusResponse = { status: string }; + +async function main() { + const resp = await client.get({ + path: "/status", + params: { verbose: true }, + }); + + console.log(resp.status); +} + +main(); +``` + +### API (main methods) + +- `getAccessToken(): Promise` + - Fetches and caches the token. +- `getAuthToken(): string` + - Returns the final auth header value (by default `" "`). +- `executarRequest(params): Promise` + - Base method that injects the token and performs the request via Axios. +- HTTP helpers: + - `get`, `post`, `put`, `patch`, `delete` + +### Constructor parameters + +`new LhispOauthClient(params)` accepts: + +Required: + +- `apiUrl` (string): API base URL (e.g. `https://api.example.com`) +- `authUrl` (string): OAuth2 token endpoint +- `clientId` (string) +- `clientSecret` (string) + +Optional: + +- `certificado` (string | Buffer): PFX client certificate + - If string, it is treated as **base64** and converted using `Buffer.from(certificado, "base64")` +- `senhaCertificado` (string): PFX password +- `authScope` (string): adds `scope` to the token request +- `grantType` (string): default `client_credentials` +- `authContentType` (`ContentType`): default `application/x-www-form-urlencoded` +- `authData` (Record): extra fields sent to the token endpoint +- `headers` (object): headers applied to API calls +- `authHeaders` (object): extra headers only for token retrieval +- `authHeaderName` (string): Basic credentials header name (default `Authorization`) +- `tokenHeaderName` (string): token header name (default `Authorization`) +- `sendAuthCredentialsOnRequestBody` (boolean): also sends `client_id` and `client_secret` in the request body +- `formatAccessToken` ((token?) => string): customize token header value +- `timeout` (number): request timeout in ms (default `60000`) +- `logger` (Logger): compatible logger (must support `.child()` and `info/warn/error/debug`) + +### Content-Type + +You can set the API request `Content-Type` using `contentType`: + +```ts +import { ContentType } from "lhisp-oauth-client"; + +await client.post({ + path: "/customers", + contentType: ContentType.APPLICATION_JSON, + data: { name: "Alice" }, +}); +``` + +> Note: the **auth/token** request content type is controlled by `authContentType`. + +### Example: credentials in request body + +```ts +import { LhispOauthClient, ContentType } from "lhisp-oauth-client"; + +const client = new LhispOauthClient({ + apiUrl: "https://api.example.com", + authUrl: "https://auth.example.com/oauth/token", + clientId: "YOUR_CLIENT_ID", + clientSecret: "YOUR_CLIENT_SECRET", + authContentType: ContentType.APPLICATION_JSON, + sendAuthCredentialsOnRequestBody: true, +}); + +await client.get({ path: "/status" }); +``` + +### Example: custom token header + +```ts +import { LhispOauthClient } from "lhisp-oauth-client"; + +const client = new LhispOauthClient({ + apiUrl: "https://api.example.com", + authUrl: "https://auth.example.com/oauth/token", + clientId: "YOUR_CLIENT_ID", + clientSecret: "YOUR_CLIENT_SECRET", + tokenHeaderName: "x-token", +}); + +await client.get({ path: "/status" }); +``` + +### Example: using a PFX certificate + +```ts +import fs from "node:fs"; +import { LhispOauthClient } from "lhisp-oauth-client"; + +const pfxBuffer = fs.readFileSync("./certificate.pfx"); + +const client = new LhispOauthClient({ + apiUrl: "https://api.example.com", + authUrl: "https://auth.example.com/oauth/token", + clientId: "YOUR_CLIENT_ID", + clientSecret: "YOUR_CLIENT_SECRET", + certificado: pfxBuffer, + senhaCertificado: "PFX_PASSWORD", +}); + +await client.get({ path: "/status" }); +``` + +### Security notes + +- The internal `https.Agent` is created with `rejectUnauthorized: false` (with or without PFX). This **disables TLS server certificate validation**. + - In production, this may reduce security. If you need strict TLS validation, the implementation must be adjusted. diff --git a/package-lock.json b/package-lock.json index ccd6bff..10813df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "lhisp-oauth-client", - "version": "1.0.37", + "version": "1.0.38", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "lhisp-oauth-client", - "version": "1.0.37", + "version": "1.0.38", "license": "MIT", "dependencies": { "axios": "^1.10.0" diff --git a/package.json b/package.json index f2252c2..564fa28 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lhisp-oauth-client", - "version": "1.0.37", + "version": "1.0.38", "main": "src/index", "types": "src/index.d.ts", "repository": { From ca6cd330aa847f8ad53cda339f32612a22e40a9b Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Sat, 24 Jan 2026 11:09:15 -0300 Subject: [PATCH 09/10] feat: update version to 1.0.39 and include README in publish script --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 564fa28..cc8c724 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lhisp-oauth-client", - "version": "1.0.38", + "version": "1.0.39", "main": "src/index", "types": "src/index.d.ts", "repository": { @@ -12,7 +12,7 @@ "scripts": { "build": "tsc", "test": "jest", - "publish": "rm -rfv dist/; npm run build; cd dist; cp ../package* .; npm publish; cd -; rm -rfv dist/;", + "publish": "rm -rfv dist/; npm run build; cd dist; cp ../package* .; cp ../README.md .; npm publish; cd -; rm -rfv dist/;", "test:watch": "jest --watchAll" }, "devDependencies": { From b78ae3a520f8d1ba6a5ca627c545c49076a03b04 Mon Sep 17 00:00:00 2001 From: Leandro Costa Date: Sat, 24 Jan 2026 11:11:36 -0300 Subject: [PATCH 10/10] feat: update version to 1.0.40 and add rejectUnauthorized option for HTTPS agent --- README.md | 10 ---------- package-lock.json | 4 ++-- package.json | 2 +- src/lhisp-oauth-client.t.ts | 1 + src/lhisp-oauth-client.ts | 4 ++-- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d7fda51..bd9d49e 100644 --- a/README.md +++ b/README.md @@ -159,11 +159,6 @@ const client = new LhispOauthClient({ await client.get({ path: "/status" }); ``` -### Observações de segurança - -- O `https.Agent` é criado com `rejectUnauthorized: false` (com ou sem certificado). Isso **desabilita validação do certificado** do servidor TLS. - - Em produção, isso pode reduzir segurança. Se você precisar de validação TLS, será necessário ajustar a implementação. - --- ## English @@ -319,8 +314,3 @@ const client = new LhispOauthClient({ await client.get({ path: "/status" }); ``` - -### Security notes - -- The internal `https.Agent` is created with `rejectUnauthorized: false` (with or without PFX). This **disables TLS server certificate validation**. - - In production, this may reduce security. If you need strict TLS validation, the implementation must be adjusted. diff --git a/package-lock.json b/package-lock.json index 10813df..dad1f18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "lhisp-oauth-client", - "version": "1.0.38", + "version": "1.0.40", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "lhisp-oauth-client", - "version": "1.0.38", + "version": "1.0.40", "license": "MIT", "dependencies": { "axios": "^1.10.0" diff --git a/package.json b/package.json index cc8c724..ef86604 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lhisp-oauth-client", - "version": "1.0.39", + "version": "1.0.40", "main": "src/index", "types": "src/index.d.ts", "repository": { diff --git a/src/lhisp-oauth-client.t.ts b/src/lhisp-oauth-client.t.ts index 8867a03..0d997da 100644 --- a/src/lhisp-oauth-client.t.ts +++ b/src/lhisp-oauth-client.t.ts @@ -32,6 +32,7 @@ export interface LhispOauthClientConstructorParams { debug?: boolean; timeout?: number; logger?: Logger; + rejectUnauthorized?: boolean; } export interface ExecutarRequestParams extends AxiosRequestConfig { diff --git a/src/lhisp-oauth-client.ts b/src/lhisp-oauth-client.ts index 70122f1..da4d5e2 100644 --- a/src/lhisp-oauth-client.ts +++ b/src/lhisp-oauth-client.ts @@ -43,11 +43,11 @@ export class LhispOauthClient { this.agent = new https.Agent({ pfx: Buffer.isBuffer(params.certificado) ? params.certificado : Buffer.from(params.certificado, "base64"), passphrase: params.senhaCertificado ? params.senhaCertificado : undefined, - rejectUnauthorized: false, + rejectUnauthorized: params.rejectUnauthorized ?? false, }); } else { this.agent = new https.Agent({ - rejectUnauthorized: false, + rejectUnauthorized: params.rejectUnauthorized ?? false, }); }