@sweepbright/api-client 0.37.0 → 0.38.0-pre
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/dist/client.d.ts +1 -0
- package/dist/client.js +27 -21
- package/dist/client.js.map +1 -1
- package/dist/oauth-manager/AuthenticationService_OAuthPrivateAPI.d.ts +20 -0
- package/dist/oauth-manager/AuthenticationService_OAuthPrivateAPI.js +54 -0
- package/dist/oauth-manager/AuthenticationService_OAuthPrivateAPI.js.map +1 -0
- package/dist/oauth-manager/AuthenticationService_PrivateAPI.d.ts +1 -1
- package/dist/oauth-manager/AuthenticationService_PrivateAPI.js +1 -1
- package/dist/oauth-manager/AuthenticationService_PrivateAPI.js.map +1 -1
- package/dist/oauth-manager/TokensRepository_Redis.d.ts +5 -5
- package/dist/oauth-manager/TokensRepository_Redis.js +34 -34
- package/dist/oauth-manager/TokensRepository_Redis.js.map +1 -1
- package/dist/oauth-manager/factories/createOAuthManager.d.ts +4 -8
- package/dist/oauth-manager/factories/createOAuthManager.js +2 -34
- package/dist/oauth-manager/factories/createOAuthManager.js.map +1 -1
- package/package.json +5 -3
package/dist/client.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export declare class ClientImpl implements Client {
|
|
|
6
6
|
private ctx;
|
|
7
7
|
constructor(conf: ClientConf);
|
|
8
8
|
private authorizeWithOAuthManager;
|
|
9
|
+
private getDefaultConfig;
|
|
9
10
|
authorize(config?: InitConf): Promise<Client>;
|
|
10
11
|
withUserToken(accessToken: string): Promise<Client>;
|
|
11
12
|
get leads(): {
|
package/dist/client.js
CHANGED
|
@@ -8,6 +8,7 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
8
8
|
const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
|
|
9
9
|
const envHosts_1 = require("./common/envHosts");
|
|
10
10
|
const SessionDataImpl_1 = require("./oauth-manager/SessionDataImpl");
|
|
11
|
+
const createOAuthManager_1 = require("./oauth-manager/factories/createOAuthManager");
|
|
11
12
|
const channel_accounts_1 = __importDefault(require("./resources/channel_accounts"));
|
|
12
13
|
const channels_1 = __importDefault(require("./resources/channels"));
|
|
13
14
|
const companies_1 = __importDefault(require("./resources/companies"));
|
|
@@ -49,32 +50,37 @@ class ClientImpl {
|
|
|
49
50
|
this._auth = { token: accessToken, type: types_1.TokenType.API_TOKEN };
|
|
50
51
|
this.httpClient.defaults.headers.common['Authorization'] = `Bearer ${accessToken}`;
|
|
51
52
|
}
|
|
53
|
+
getDefaultConfig() {
|
|
54
|
+
const redisURL = process.env.REDIS_URL;
|
|
55
|
+
if (redisURL) {
|
|
56
|
+
return {
|
|
57
|
+
storage: 'redis',
|
|
58
|
+
redisURL,
|
|
59
|
+
env: this.conf.env ?? types_1.Env.PRODUCTION,
|
|
60
|
+
apiVersion: this.conf.version,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
storage: 'memory',
|
|
65
|
+
env: this.conf.env ?? types_1.Env.PRODUCTION,
|
|
66
|
+
apiVersion: this.conf.version,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
52
69
|
async authorize(config = {}) {
|
|
53
70
|
const { scopes = ['companies:read', 'properties:download', 'lead_info:write'], } = config;
|
|
54
71
|
const { clientId, clientSecret, oauthManager } = this.conf;
|
|
55
72
|
(0, tiny_invariant_1.default)(clientId, 'Missing client ID');
|
|
56
73
|
(0, tiny_invariant_1.default)(clientSecret, 'Missing client secret');
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
const response = await this.httpClient.post('/oauth/token', {
|
|
69
|
-
client_id: clientId,
|
|
70
|
-
client_secret: clientSecret,
|
|
71
|
-
grant_type: 'client_credentials',
|
|
72
|
-
scope: scopes.join(','),
|
|
73
|
-
});
|
|
74
|
-
const { access_token } = response;
|
|
75
|
-
(0, tiny_invariant_1.default)(access_token, 'Access token should be defined');
|
|
76
|
-
this._auth = { token: access_token, type: types_1.TokenType.API_TOKEN };
|
|
77
|
-
this.httpClient.defaults.headers.common['Authorization'] = `Bearer ${access_token}`;
|
|
74
|
+
const localAuthManager = oauthManager ?? (0, createOAuthManager_1.createOAuthManager)(this.getDefaultConfig());
|
|
75
|
+
const oAuthManagerInvalidateInterceptor = async (error) => {
|
|
76
|
+
if (error.response?.status === 401) {
|
|
77
|
+
await this.authorizeWithOAuthManager(localAuthManager, clientId, clientSecret, scopes, { forceInvalidate: true });
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
return Promise.reject(error);
|
|
81
|
+
};
|
|
82
|
+
this.httpClient.interceptors.response.use(undefined, oAuthManagerInvalidateInterceptor);
|
|
83
|
+
await this.authorizeWithOAuthManager(localAuthManager, clientId, clientSecret, scopes);
|
|
78
84
|
return this;
|
|
79
85
|
}
|
|
80
86
|
async withUserToken(accessToken) {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0C;AAC1C,oEAAuC;AACvC,gDAA6C;AAC7C,qEAAkE;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0C;AAC1C,oEAAuC;AACvC,gDAA6C;AAC7C,qEAAkE;AAClE,qFAGsD;AAKtD,oFAA2D;AAC3D,oEAA4C;AAC5C,sEAA8C;AAC9C,0FAAkE;AAClE,oEAA4C;AAC5C,kEAA0C;AAC1C,8DAAsC;AACtC,0EAAkD;AAClD,kEAA0C;AAC1C,mCAQiB;AACjB,mCAAwD;AAExD,MAAa,UAAU;IAKrB,YAAoB,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;QAJ5B,UAAK,GAAgB,IAAI,CAAC;QAKhC,MAAM,EAAE,GAAG,GAAG,WAAG,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAE/C,IAAI,CAAC,UAAU,GAAG,eAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,mBAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAO,EAAE,4BAAoB,CAAC,CAAC;QAEzE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CACrC,QAAQ,CACT,GAAG,+BAA+B,OAAO,OAAO,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,GAAG,GAAG;YACT,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,CAAC,SAAoB,EAAE,EAAE;gBAClC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACjD,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,yBAAyB,CACrC,YAA0B,EAC1B,QAAgB,EAChB,YAAoB,EACpB,MAAgB,EAChB,OAA+B;QAE/B,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,2BAA2B,CAChE,IAAI,iCAAe,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EACvD,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAS,CAAC,SAAS,EAAE,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CACrC,eAAe,CAChB,GAAG,UAAU,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,QAAQ;gBACR,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,WAAG,CAAC,UAAU;gBACpC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;aAC9B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,WAAG,CAAC,UAAU;YACpC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;SAC9B,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,SAAmB,EAAE;QAC1C,MAAM,EACJ,MAAM,GAAG,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,CAAC,GACtE,GAAG,MAAM,CAAC;QACX,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAE3D,IAAA,wBAAS,EAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QACzC,IAAA,wBAAS,EAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;QAEjD,MAAM,gBAAgB,GACpB,YAAY,IAAI,IAAA,uCAAkB,EAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE9D,MAAM,iCAAiC,GAAG,KAAK,EAAE,KAAiB,EAAE,EAAE;YACpE,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,MAAM,IAAI,CAAC,yBAAyB,CAClC,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,EAAE,eAAe,EAAE,IAAI,EAAE,CAC1B,CAAC;gBACF,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACvC,SAAS,EACT,iCAAiC,CAClC,CAAC;QAEF,MAAM,IAAI,CAAC,yBAAyB,CAClC,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,MAAM,CACP,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,WAAmB;QAC5C,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAS,CAAC,UAAU,EAAE,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CACrC,eAAe,CAChB,GAAG,UAAU,WAAW,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAW,KAAK;QACd,OAAO,IAAA,eAAK,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAA,qBAAW,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAA,iBAAO,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAA,kBAAQ,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAA,0BAAe,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAA,kBAAQ,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAA,mBAAS,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,IAAW,kBAAkB;QAC3B,OAAO,IAAA,6BAAmB,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAA,iBAAO,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;CACF;AAzJD,gCAyJC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AuthenticationService, SessionData, Tokens } from './interfaces';
|
|
2
|
+
interface AuthenticationServicePrivateAPIOptions {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
apiVersion: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* AuthenticationService_PrivateAPI is used for authentication
|
|
8
|
+
* (exchanging the client credentials for an access token)
|
|
9
|
+
*
|
|
10
|
+
* This is the implementation of the {@link AuthenticationService} interface
|
|
11
|
+
* which uses Private API for authentication.
|
|
12
|
+
*
|
|
13
|
+
* Do not use this class directly.
|
|
14
|
+
*/
|
|
15
|
+
export declare class AuthenticationService_PrivateAPI implements AuthenticationService {
|
|
16
|
+
private httpClient;
|
|
17
|
+
constructor(options: AuthenticationServicePrivateAPIOptions);
|
|
18
|
+
authenticate(sessionData: SessionData): Promise<Tokens | null>;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AuthenticationService_PrivateAPI = void 0;
|
|
7
|
+
const assert_1 = require("assert");
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
/**
|
|
10
|
+
* AuthenticationService_PrivateAPI is used for authentication
|
|
11
|
+
* (exchanging the client credentials for an access token)
|
|
12
|
+
*
|
|
13
|
+
* This is the implementation of the {@link AuthenticationService} interface
|
|
14
|
+
* which uses Private API for authentication.
|
|
15
|
+
*
|
|
16
|
+
* Do not use this class directly.
|
|
17
|
+
*/
|
|
18
|
+
class AuthenticationService_PrivateAPI {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.httpClient = axios_1.default.create({
|
|
21
|
+
baseURL: options.baseUrl,
|
|
22
|
+
headers: {
|
|
23
|
+
Accept: `application/vnd.sweepbright.${options.apiVersion}+json`,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async authenticate(sessionData) {
|
|
28
|
+
const request = {
|
|
29
|
+
client_id: sessionData.getCredentials().clientId,
|
|
30
|
+
client_secret: sessionData.getCredentials().clientSecret,
|
|
31
|
+
scope: sessionData.getScopes().join(','),
|
|
32
|
+
grant_type: 'client_credentials',
|
|
33
|
+
};
|
|
34
|
+
const response = await this.httpClient.post('/oauth/token', request, {
|
|
35
|
+
validateStatus(status) {
|
|
36
|
+
return status === 200 || status === 401;
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
if (response.status === 401) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const { data: { access_token, expires_in, token_type }, } = response;
|
|
43
|
+
(0, assert_1.ok)(access_token, 'access token should be defined');
|
|
44
|
+
(0, assert_1.ok)(expires_in, 'expires_in should be defined');
|
|
45
|
+
(0, assert_1.strictEqual)(token_type, 'Bearer', 'token_type should be Bearer');
|
|
46
|
+
const tokens = {
|
|
47
|
+
accessToken: access_token,
|
|
48
|
+
expiresIn: expires_in,
|
|
49
|
+
};
|
|
50
|
+
return tokens;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.AuthenticationService_PrivateAPI = AuthenticationService_PrivateAPI;
|
|
54
|
+
//# sourceMappingURL=AuthenticationService_OAuthPrivateAPI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthenticationService_OAuthPrivateAPI.js","sourceRoot":"","sources":["../../src/oauth-manager/AuthenticationService_OAuthPrivateAPI.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAyC;AACzC,kDAA6C;AAQ7C;;;;;;;;GAQG;AACH,MAAa,gCAAgC;IAG3C,YAAY,OAA+C;QACzD,IAAI,CAAC,UAAU,GAAG,eAAK,CAAC,MAAM,CAAC;YAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE;gBACP,MAAM,EAAE,+BAA+B,OAAO,CAAC,UAAU,OAAO;aACjE;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,WAAwB;QAChD,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,QAAQ;YAChD,aAAa,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,YAAY;YACxD,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;YACxC,UAAU,EAAE,oBAAoB;SACjC,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE;YACnE,cAAc,CAAC,MAAM;gBACnB,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;YAC1C,CAAC;SACF,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,EACJ,IAAI,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,GAC/C,GAAG,QAAQ,CAAC;QACb,IAAA,WAAE,EAAC,YAAY,EAAE,gCAAgC,CAAC,CAAC;QACnD,IAAA,WAAE,EAAC,UAAU,EAAE,8BAA8B,CAAC,CAAC;QAC/C,IAAA,oBAAW,EAAC,UAAU,EAAE,QAAQ,EAAE,6BAA6B,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAW;YACrB,WAAW,EAAE,YAAY;YACzB,SAAS,EAAE,UAAU;SACtB,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA1CD,4EA0CC"}
|
|
@@ -31,7 +31,7 @@ class AuthenticationService_PrivateAPI {
|
|
|
31
31
|
scope: sessionData.getScopes().join(','),
|
|
32
32
|
grant_type: 'client_credentials',
|
|
33
33
|
};
|
|
34
|
-
const response = await this.httpClient.post('/
|
|
34
|
+
const response = await this.httpClient.post('/auth/access-token', request, {
|
|
35
35
|
validateStatus(status) {
|
|
36
36
|
return status === 200 || status === 401;
|
|
37
37
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthenticationService_PrivateAPI.js","sourceRoot":"","sources":["../../src/oauth-manager/AuthenticationService_PrivateAPI.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAyC;AACzC,kDAA6C;AAQ7C;;;;;;;;GAQG;AACH,MAAa,gCAAgC;IAG3C,YAAY,OAA+C;QACzD,IAAI,CAAC,UAAU,GAAG,eAAK,CAAC,MAAM,CAAC;YAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE;gBACP,MAAM,EAAE,+BAA+B,OAAO,CAAC,UAAU,OAAO;aACjE;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,WAAwB;QAChD,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,QAAQ;YAChD,aAAa,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,YAAY;YACxD,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;YACxC,UAAU,EAAE,oBAAoB;SACjC,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"AuthenticationService_PrivateAPI.js","sourceRoot":"","sources":["../../src/oauth-manager/AuthenticationService_PrivateAPI.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAyC;AACzC,kDAA6C;AAQ7C;;;;;;;;GAQG;AACH,MAAa,gCAAgC;IAG3C,YAAY,OAA+C;QACzD,IAAI,CAAC,UAAU,GAAG,eAAK,CAAC,MAAM,CAAC;YAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE;gBACP,MAAM,EAAE,+BAA+B,OAAO,CAAC,UAAU,OAAO;aACjE;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,WAAwB;QAChD,MAAM,OAAO,GAAG;YACd,SAAS,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,QAAQ;YAChD,aAAa,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,YAAY;YACxD,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;YACxC,UAAU,EAAE,oBAAoB;SACjC,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE;YACzE,cAAc,CAAC,MAAM;gBACnB,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;YAC1C,CAAC;SACF,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,EACJ,IAAI,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,GAC/C,GAAG,QAAQ,CAAC;QACb,IAAA,WAAE,EAAC,YAAY,EAAE,gCAAgC,CAAC,CAAC;QACnD,IAAA,WAAE,EAAC,UAAU,EAAE,8BAA8B,CAAC,CAAC;QAC/C,IAAA,oBAAW,EAAC,UAAU,EAAE,QAAQ,EAAE,6BAA6B,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAW;YACrB,WAAW,EAAE,YAAY;YACzB,SAAS,EAAE,UAAU;SACtB,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA1CD,4EA0CC"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RedisClientType } from 'redis';
|
|
2
2
|
import { CanCheckConnection } from './CanCheckConnection';
|
|
3
3
|
import { LockAcquireOptions, LockId, LockReleaseOptions, Logger, TokensRepository } from './interfaces';
|
|
4
4
|
export declare class TokensRepository_Redis implements TokensRepository, CanCheckConnection {
|
|
5
5
|
private readonly redis;
|
|
6
6
|
private readonly log;
|
|
7
|
-
constructor(redis: Redis | Cluster, log: Logger);
|
|
8
7
|
private connectionChecked;
|
|
9
8
|
private connected;
|
|
10
|
-
isConnected(): Promise<boolean>;
|
|
11
|
-
private checkConnection;
|
|
12
9
|
private readonly version;
|
|
10
|
+
constructor(redis: RedisClientType, log: Logger);
|
|
11
|
+
private getClient;
|
|
12
|
+
isConnected(): Promise<boolean>;
|
|
13
13
|
private accessTokenKey;
|
|
14
14
|
private lockKey;
|
|
15
|
-
getAccessTokenIfValid(sessionKey: string
|
|
15
|
+
getAccessTokenIfValid(sessionKey: string): Promise<string | null>;
|
|
16
16
|
deleteAccessToken(lockId: LockId, sessionKey: string): Promise<void>;
|
|
17
17
|
acquireLock(options: LockAcquireOptions): Promise<LockId | null>;
|
|
18
18
|
releaseLock(lockId: LockId, options: LockReleaseOptions): Promise<void>;
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TokensRepository_Redis = void 0;
|
|
4
4
|
const uuid_1 = require("uuid");
|
|
5
|
-
const REDIS_OPTION_IF_NOT_EXISTS = 'NX';
|
|
6
|
-
const REDIS_OPTION_TTL_IN_MILLISECONDS = 'PX';
|
|
7
5
|
class TokensRepository_Redis {
|
|
8
6
|
constructor(redis, log) {
|
|
9
7
|
this.redis = redis;
|
|
@@ -12,78 +10,80 @@ class TokensRepository_Redis {
|
|
|
12
10
|
this.connected = false;
|
|
13
11
|
this.version = 'v1';
|
|
14
12
|
}
|
|
13
|
+
async getClient() {
|
|
14
|
+
if (this.redis && this.connected) {
|
|
15
|
+
return this.redis;
|
|
16
|
+
}
|
|
17
|
+
this.redis.on('error', (err) => {
|
|
18
|
+
this.connected = false;
|
|
19
|
+
this.log.error(err);
|
|
20
|
+
});
|
|
21
|
+
await this.redis.connect();
|
|
22
|
+
await this.redis.ping();
|
|
23
|
+
this.connected = true;
|
|
24
|
+
this.connectionChecked = true;
|
|
25
|
+
return this.redis;
|
|
26
|
+
}
|
|
15
27
|
async isConnected() {
|
|
16
28
|
if (!this.connectionChecked) {
|
|
17
|
-
|
|
18
|
-
this.connectionChecked = true;
|
|
29
|
+
await this.getClient();
|
|
19
30
|
}
|
|
20
31
|
return this.connected;
|
|
21
32
|
}
|
|
22
|
-
async checkConnection() {
|
|
23
|
-
try {
|
|
24
|
-
await this.redis.ping('a');
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
catch (e) {
|
|
28
|
-
this.log.error('Redis connection error', e);
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
33
|
accessTokenKey(sessionKey) {
|
|
33
34
|
return `${this.version}/${sessionKey}/t`;
|
|
34
35
|
}
|
|
35
36
|
lockKey(sessionKey) {
|
|
36
37
|
return `${this.version}/${sessionKey}/l`;
|
|
37
38
|
}
|
|
38
|
-
async getAccessTokenIfValid(sessionKey
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
// If a record exists, the record is valid.
|
|
42
|
-
// Expiration is provided automatically by Redis.
|
|
43
|
-
return this.redis.get(this.accessTokenKey(sessionKey));
|
|
39
|
+
async getAccessTokenIfValid(sessionKey) {
|
|
40
|
+
const redis = await this.getClient();
|
|
41
|
+
return redis.get(this.accessTokenKey(sessionKey));
|
|
44
42
|
}
|
|
45
43
|
async deleteAccessToken(lockId, sessionKey) {
|
|
46
|
-
const
|
|
44
|
+
const redis = await this.getClient();
|
|
45
|
+
const existingLock = await redis.get(this.lockKey(sessionKey));
|
|
47
46
|
if (!existingLock) {
|
|
48
47
|
throw new Error('Cannot delete access token, not locked');
|
|
49
48
|
}
|
|
50
49
|
if (existingLock !== lockId) {
|
|
51
50
|
throw new Error('Cannot delete access token, locked by another process');
|
|
52
51
|
}
|
|
53
|
-
await
|
|
52
|
+
await redis.del(this.accessTokenKey(sessionKey));
|
|
54
53
|
}
|
|
55
54
|
async acquireLock(options) {
|
|
56
55
|
const { sessionKey, lockedUntil, currentTime } = options;
|
|
57
56
|
const lockId = (0, uuid_1.v4)();
|
|
58
|
-
const
|
|
59
|
-
|
|
57
|
+
const redis = await this.getClient();
|
|
58
|
+
const result = await redis.set(this.lockKey(sessionKey), lockId, {
|
|
59
|
+
PX: lockedUntil.getTime() - currentTime.getTime(),
|
|
60
|
+
NX: true,
|
|
61
|
+
});
|
|
60
62
|
if (result === 'OK') {
|
|
61
63
|
this.log.debug('lock acquired');
|
|
62
64
|
return lockId;
|
|
63
65
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
this.log.debug('lock not acquired');
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
//Normally this should never happen
|
|
70
|
-
throw new Error(`Unknown response from Redis: ${result}`);
|
|
66
|
+
this.log.debug('lock not acquired');
|
|
67
|
+
return null;
|
|
71
68
|
}
|
|
72
69
|
async releaseLock(lockId, options) {
|
|
73
70
|
const { sessionKey, shouldUpdateTokens } = options;
|
|
74
71
|
this.log.debug('releasing lock');
|
|
75
|
-
const
|
|
72
|
+
const redis = await this.getClient();
|
|
73
|
+
const existingLockId = await redis.get(this.lockKey(sessionKey));
|
|
76
74
|
if (existingLockId !== lockId) {
|
|
77
75
|
throw new Error('Cannot release lock, because it was set by another process');
|
|
78
76
|
}
|
|
79
77
|
try {
|
|
80
78
|
if (shouldUpdateTokens) {
|
|
81
79
|
const { tokens: { accessToken }, expiresAt, currentTime, } = options;
|
|
82
|
-
await
|
|
80
|
+
await redis.set(this.accessTokenKey(sessionKey), accessToken, {
|
|
81
|
+
PX: expiresAt.getTime() - currentTime.getTime(),
|
|
82
|
+
});
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
finally {
|
|
86
|
-
await
|
|
86
|
+
await redis.del(this.lockKey(sessionKey));
|
|
87
87
|
this.log.debug('lock released');
|
|
88
88
|
}
|
|
89
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokensRepository_Redis.js","sourceRoot":"","sources":["../../src/oauth-manager/TokensRepository_Redis.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"TokensRepository_Redis.js","sourceRoot":"","sources":["../../src/oauth-manager/TokensRepository_Redis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
import { Cluster, Redis } from 'ioredis';
|
|
2
1
|
import { Env } from '../../types';
|
|
3
2
|
import { Logger, OAuthManager } from '../interfaces';
|
|
4
|
-
interface CreateOAuthManagerOptionsBase {
|
|
3
|
+
export interface CreateOAuthManagerOptionsBase {
|
|
5
4
|
env: Env;
|
|
6
|
-
apiVersion
|
|
5
|
+
apiVersion?: string;
|
|
7
6
|
logger?: Logger;
|
|
8
7
|
}
|
|
9
|
-
type RedisOptions = {
|
|
8
|
+
export type RedisOptions = {
|
|
10
9
|
redisURL: string;
|
|
11
|
-
} | {
|
|
12
|
-
redis: Redis | Cluster;
|
|
13
10
|
};
|
|
14
|
-
type CreateOAuthManagerOptions = CreateOAuthManagerOptionsBase & ({
|
|
11
|
+
export type CreateOAuthManagerOptions = CreateOAuthManagerOptionsBase & ({
|
|
15
12
|
storage: 'memory';
|
|
16
13
|
} | ({
|
|
17
14
|
storage: 'redis';
|
|
18
15
|
} & RedisOptions));
|
|
19
16
|
export declare function createOAuthManager(opt: CreateOAuthManagerOptions): OAuthManager;
|
|
20
|
-
export {};
|
|
@@ -2,50 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createOAuthManager = createOAuthManager;
|
|
4
4
|
const assert_1 = require("assert");
|
|
5
|
-
const
|
|
6
|
-
const ioredis_1 = require("ioredis");
|
|
5
|
+
const redis_1 = require("redis");
|
|
7
6
|
const envHosts_1 = require("../../common/envHosts");
|
|
8
7
|
const AuthenticationService_PrivateAPI_1 = require("../AuthenticationService_PrivateAPI");
|
|
9
8
|
const SweepbrightOAuthManager_1 = require("../SweepbrightOAuthManager");
|
|
10
9
|
const TokensRepository_Memory_1 = require("../TokensRepository_Memory");
|
|
11
10
|
const TokensRepository_Redis_1 = require("../TokensRepository_Redis");
|
|
12
11
|
const TokensRepository_RedisWithMemoryFallback_1 = require("../TokensRepository_RedisWithMemoryFallback");
|
|
13
|
-
function createRedisClient(redisURL) {
|
|
14
|
-
const url = new url_1.URL(redisURL);
|
|
15
|
-
const useTLS = url.protocol.startsWith('rediss');
|
|
16
|
-
const host = url.hostname;
|
|
17
|
-
const port = Number(url.port) ?? (0, assert_1.fail)(`Invalid port ${url.port}`);
|
|
18
|
-
const client = new ioredis_1.Cluster([{ host, port }], {
|
|
19
|
-
dnsLookup(hostname, cb) {
|
|
20
|
-
cb(null, hostname);
|
|
21
|
-
},
|
|
22
|
-
redisOptions: {
|
|
23
|
-
tls: useTLS ? {} : undefined,
|
|
24
|
-
commandTimeout: 3000,
|
|
25
|
-
},
|
|
26
|
-
slotsRefreshInterval: 2 ** 30,
|
|
27
|
-
slotsRefreshTimeout: 3000,
|
|
28
|
-
});
|
|
29
|
-
// Failed to refresh slots cache.
|
|
30
|
-
client.on('error', (err) => {
|
|
31
|
-
if (err &&
|
|
32
|
-
typeof err === 'object' &&
|
|
33
|
-
'message' in err &&
|
|
34
|
-
err.message === 'Failed to refresh slots cache.') {
|
|
35
|
-
console.warn('Failed to refresh slots cache.', { error: err });
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
console.error('Unhandled Redis error', { error: err });
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
return client;
|
|
42
|
-
}
|
|
43
12
|
function createTokenStorage(opt, logger) {
|
|
44
13
|
let tokensRepository;
|
|
45
14
|
switch (opt.storage) {
|
|
46
15
|
case 'redis': {
|
|
47
|
-
|
|
48
|
-
tokensRepository = new TokensRepository_RedisWithMemoryFallback_1.TokensRepository_RedisWithMemoryFallback(new TokensRepository_Redis_1.TokensRepository_Redis(redis, logger), new TokensRepository_Memory_1.TokensRepository_Memory(logger), logger);
|
|
16
|
+
tokensRepository = new TokensRepository_RedisWithMemoryFallback_1.TokensRepository_RedisWithMemoryFallback(new TokensRepository_Redis_1.TokensRepository_Redis((0, redis_1.createClient)({ url: opt.redisURL }), logger), new TokensRepository_Memory_1.TokensRepository_Memory(logger), logger);
|
|
49
17
|
break;
|
|
50
18
|
}
|
|
51
19
|
case 'memory': {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createOAuthManager.js","sourceRoot":"","sources":["../../../src/oauth-manager/factories/createOAuthManager.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"createOAuthManager.js","sourceRoot":"","sources":["../../../src/oauth-manager/factories/createOAuthManager.ts"],"names":[],"mappings":";;AA6CA,gDAYC;AAzDD,mCAAkC;AAClC,iCAAqC;AACrC,oDAAiD;AAEjD,0FAAuF;AACvF,wEAAqE;AACrE,wEAAqE;AACrE,sEAAmE;AACnE,0GAAuG;AAcvG,SAAS,kBAAkB,CAAC,GAA8B,EAAE,MAAc;IACxE,IAAI,gBAAkC,CAAC;IAEvC,QAAQ,GAAG,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,gBAAgB,GAAG,IAAI,mFAAwC,CAC7D,IAAI,+CAAsB,CAAC,IAAA,oBAAY,EAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,EACvE,IAAI,iDAAuB,CAAC,MAAM,CAAC,EACnC,MAAM,CACP,CAAC;YACF,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,gBAAgB,GAAG,IAAI,iDAAuB,CAAC,MAAM,CAAC,CAAC;YACvD,MAAM;QACR,CAAC;QACD;YACE,IAAA,aAAI,EAAC,iBAAiB,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,SAAgB,kBAAkB,CAChC,GAA8B;IAE9B,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC;IAClD,MAAM,OAAO,GAAG,mBAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAA,WAAE,EAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;IAEzC,OAAO,IAAI,iDAAuB,CAChC,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,EAC/B,IAAI,mEAAgC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAC7D,MAAM,CACP,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.38.0-pre",
|
|
3
3
|
"license": "UNLICENCED",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"typings": "./dist/index.d.ts",
|
|
@@ -31,11 +31,12 @@
|
|
|
31
31
|
"@sweepbright/shared-configs-tsconfig": "^1.0.1",
|
|
32
32
|
"@types/ioredis-mock": "^8.2.5",
|
|
33
33
|
"@types/jest": "^29.5.14",
|
|
34
|
+
"@types/redis-mock": "^0.17.3",
|
|
34
35
|
"@types/uuid": "^10.0.0",
|
|
35
36
|
"husky": "^9.1.7",
|
|
36
|
-
"ioredis-mock": "^8.9.0",
|
|
37
37
|
"jest": "^29.7.0",
|
|
38
38
|
"msw": "^2.7.0",
|
|
39
|
+
"redis-mock": "^0.56.3",
|
|
39
40
|
"ts-jest": "^29.2.5",
|
|
40
41
|
"tslib": "^2.8.1",
|
|
41
42
|
"tsx": "^4.19.2",
|
|
@@ -43,7 +44,8 @@
|
|
|
43
44
|
},
|
|
44
45
|
"dependencies": {
|
|
45
46
|
"axios": "1.7.9",
|
|
46
|
-
"
|
|
47
|
+
"node-redis": "^0.1.7",
|
|
48
|
+
"redis": "^4.7.0",
|
|
47
49
|
"tiny-invariant": "1.3.3",
|
|
48
50
|
"uuid": "11.0.5",
|
|
49
51
|
"zod": "3.24.1"
|