@dvsa/appdev-api-common 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.secignore ADDED
@@ -0,0 +1,4 @@
1
+ .npmrc
2
+
3
+ # Reason: "Contains word: credential"
4
+ packages/appdev-common/src/auth/client-credentials.ts
@@ -0,0 +1,19 @@
1
+ export interface ClientCredentialsResponse {
2
+ token_type: string;
3
+ expires_in: number;
4
+ ext_expires_in: number;
5
+ access_token: string;
6
+ }
7
+ export declare class ClientCredentials {
8
+ private readonly tokenUrl;
9
+ private readonly clientId;
10
+ private readonly clientSecret;
11
+ private readonly scope;
12
+ private readonly debugMode;
13
+ private static accessToken;
14
+ private static readonly grant_type;
15
+ constructor(tokenUrl: string, clientId: string, clientSecret: string, scope: string, debugMode?: boolean);
16
+ getAccessToken(): Promise<string>;
17
+ private fetchClientCredentials;
18
+ private isAccessTokenExpired;
19
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientCredentials = void 0;
4
+ const node_querystring_1 = require("node:querystring");
5
+ const jose_1 = require("jose");
6
+ class ClientCredentials {
7
+ tokenUrl;
8
+ clientId;
9
+ clientSecret;
10
+ scope;
11
+ debugMode;
12
+ static accessToken;
13
+ static grant_type = "client_credentials";
14
+ constructor(tokenUrl, clientId, clientSecret, scope, debugMode = false) {
15
+ this.tokenUrl = tokenUrl;
16
+ this.clientId = clientId;
17
+ this.clientSecret = clientSecret;
18
+ this.scope = scope;
19
+ this.debugMode = debugMode;
20
+ }
21
+ async getAccessToken() {
22
+ if (!ClientCredentials.accessToken || this.isAccessTokenExpired()) {
23
+ const { access_token } = await this.fetchClientCredentials();
24
+ if (this.debugMode)
25
+ console.log("[DEBUG] New access token fetched:", access_token);
26
+ ClientCredentials.accessToken = access_token;
27
+ }
28
+ else if (this.debugMode) {
29
+ console.log("[DEBUG] Using existing access token:", ClientCredentials.accessToken);
30
+ }
31
+ return ClientCredentials.accessToken;
32
+ }
33
+ async fetchClientCredentials() {
34
+ const response = await fetch(this.tokenUrl, {
35
+ method: "POST",
36
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
37
+ body: (0, node_querystring_1.stringify)({
38
+ grant_type: ClientCredentials.grant_type,
39
+ client_id: this.clientId,
40
+ client_secret: this.clientSecret,
41
+ scope: this.scope,
42
+ }),
43
+ });
44
+ if (!response.ok) {
45
+ console.error("Error fetching client credentials", response);
46
+ throw new Error("Failed to fetch client credentials");
47
+ }
48
+ return (await response.json());
49
+ }
50
+ isAccessTokenExpired() {
51
+ try {
52
+ const decodedAccessToken = (0, jose_1.decodeJwt)(ClientCredentials.accessToken);
53
+ const currentTime = new Date().getTime() / 1000;
54
+ // Check if exp exists before comparing as it can be undefined
55
+ if (!decodedAccessToken?.exp) {
56
+ return true;
57
+ }
58
+ return currentTime > decodedAccessToken.exp;
59
+ }
60
+ catch (err) {
61
+ console.error("Error decoding access token:", err);
62
+ return true;
63
+ }
64
+ }
65
+ }
66
+ exports.ClientCredentials = ClientCredentials;
package/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from "./api/http-status-codes";
2
2
  export * from "./auth/auth-checker";
3
3
  export * from "./auth/auth-errors";
4
+ export * from "./auth/client-credentials";
4
5
  export * from "./auth/verify-jwt";
5
6
  export * from "./validation/request-body";
package/index.js CHANGED
@@ -17,5 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./api/http-status-codes"), exports);
18
18
  __exportStar(require("./auth/auth-checker"), exports);
19
19
  __exportStar(require("./auth/auth-errors"), exports);
20
+ __exportStar(require("./auth/client-credentials"), exports);
20
21
  __exportStar(require("./auth/verify-jwt"), exports);
21
22
  __exportStar(require("./validation/request-body"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dvsa/appdev-api-common",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "keywords": [
5
5
  "dvsa",
6
6
  "nodejs",
@@ -20,7 +20,8 @@
20
20
  "build": "npm run clean && tsc",
21
21
  "build:package": "npm run build",
22
22
  "prepublishOnly": "npm run build:package && cp -r ./dist/* . && rm -rf ./dist",
23
- "postpublish": "git clean -fd && npm run clean:temp"
23
+ "postpublish": "git clean -fd && npm run clean:temp",
24
+ "gitSecrets": "git secrets --scan . && git log -p -- . | scanrepo"
24
25
  },
25
26
  "dependencies": {
26
27
  "ajv": "^8.17.1",