@sipgate/integration-bridge 0.22.9 → 0.22.11
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/index.d.ts +1 -1
- package/dist/util/oauth.d.ts +1 -2
- package/dist/util/oauth.js +3 -8
- package/dist/util/oauth.js.map +1 -1
- package/dist/util/token-util.d.ts +1 -1
- package/dist/util/token-util.js +27 -12
- package/dist/util/token-util.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { TokenStorageCache } from './cache';
|
|
|
4
4
|
import { Adapter } from './models';
|
|
5
5
|
import { CustomRouter } from './models/custom-router.model';
|
|
6
6
|
import { CustomRoute } from './models/custom-routes.model';
|
|
7
|
-
export declare let tokenCache: TokenStorageCache;
|
|
7
|
+
export declare let tokenCache: TokenStorageCache | undefined;
|
|
8
8
|
export declare function start(adapter: Adapter, customRouters?: CustomRouter[], customRoutes?: CustomRoute[]): Server;
|
|
9
9
|
export declare const deleteContactCacheItem: (key: string) => Promise<void>;
|
|
10
10
|
export declare const getContactCacheItem: (key: string) => Promise<import("./models").Contact[] | import("./models/cache-item-state.model").CacheItemState>;
|
package/dist/util/oauth.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Request, Response } from 'express';
|
|
2
1
|
import { AxiosResponse } from 'axios';
|
|
2
|
+
import { Request, Response } from 'express';
|
|
3
3
|
export type ExtractTokenFromResponseFn<T> = (response: AxiosResponse) => T;
|
|
4
4
|
export interface OAuthParams {
|
|
5
5
|
accesTokenUrl: string;
|
|
@@ -28,5 +28,4 @@ export declare enum GetAccessTokenParamCommunication {
|
|
|
28
28
|
X_WWW_FORM_URL_ENCODED = 1,
|
|
29
29
|
BODY = 2
|
|
30
30
|
}
|
|
31
|
-
export declare function getAccessToken(accessTokenURL: string, authorizationCode: string, clientId: string, clientSecret: string, redirect_uri: string, paramCommunication?: GetAccessTokenParamCommunication): Promise<AxiosResponse<any, any>>;
|
|
32
31
|
export declare function refreshToken(accessTokenURL: string, refresh_token: string, clientId: string, clientSecret: string, paramCommunication?: GetAccessTokenParamCommunication): Promise<AxiosResponse<any, any>>;
|
package/dist/util/oauth.js
CHANGED
|
@@ -35,10 +35,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
35
35
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
36
|
};
|
|
37
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.refreshToken = exports.
|
|
39
|
-
const _1 = require(".");
|
|
40
|
-
const util = __importStar(require("util"));
|
|
38
|
+
exports.refreshToken = exports.GetAccessTokenParamCommunication = exports.handleOAuth2Callback = exports.getOAuth2RedirectUrl = void 0;
|
|
41
39
|
const axios_1 = __importDefault(require("axios"));
|
|
40
|
+
const util = __importStar(require("util"));
|
|
41
|
+
const _1 = require(".");
|
|
42
42
|
const models_1 = require("../models");
|
|
43
43
|
function getOAuth2RedirectUrl(config, req, res) {
|
|
44
44
|
var _a;
|
|
@@ -132,12 +132,9 @@ function getAccessToken(accessTokenURL, authorizationCode, clientId, clientSecre
|
|
|
132
132
|
return yield axios_1.default.post(accessTokenURL, params);
|
|
133
133
|
default:
|
|
134
134
|
throw Error('Unexpected parameter communication type');
|
|
135
|
-
break;
|
|
136
135
|
}
|
|
137
|
-
console.log(`End: fetching access tokens`);
|
|
138
136
|
});
|
|
139
137
|
}
|
|
140
|
-
exports.getAccessToken = getAccessToken;
|
|
141
138
|
function refreshToken(accessTokenURL, refresh_token, clientId, clientSecret, paramCommunication = GetAccessTokenParamCommunication.BODY) {
|
|
142
139
|
return __awaiter(this, void 0, void 0, function* () {
|
|
143
140
|
console.log(`Start: refreshing access tokens`);
|
|
@@ -158,9 +155,7 @@ function refreshToken(accessTokenURL, refresh_token, clientId, clientSecret, par
|
|
|
158
155
|
return yield axios_1.default.post(accessTokenURL, params);
|
|
159
156
|
default:
|
|
160
157
|
throw Error('Unexpected parameter communication type');
|
|
161
|
-
break;
|
|
162
158
|
}
|
|
163
|
-
console.log(`End: refreshing access tokens`);
|
|
164
159
|
});
|
|
165
160
|
}
|
|
166
161
|
exports.refreshToken = refreshToken;
|
package/dist/util/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/util/oauth.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/util/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,5 @@ import { TokenStorageCache } from '../cache';
|
|
|
2
2
|
import { Config } from '../models';
|
|
3
3
|
import { Token } from '../models/token.model';
|
|
4
4
|
export type TokenRefreshFn = (config: Config) => Promise<Token>;
|
|
5
|
-
export declare function getTokenCache(): TokenStorageCache;
|
|
5
|
+
export declare function getTokenCache(): TokenStorageCache | undefined;
|
|
6
6
|
export declare function getFreshAccessToken(config: Config, refreshFn: TokenRefreshFn, force?: boolean): Promise<string>;
|
package/dist/util/token-util.js
CHANGED
|
@@ -15,28 +15,41 @@ const storage_1 = require("../cache/storage");
|
|
|
15
15
|
const models_1 = require("../models");
|
|
16
16
|
const __1 = require("..");
|
|
17
17
|
const REFRESH_MARKER_TTL = 5;
|
|
18
|
+
const DEFAULT_TTL = '3540';
|
|
19
|
+
let KEY_PREFIX;
|
|
18
20
|
function useCollection(value) {
|
|
19
|
-
|
|
20
|
-
if (!INTEGRATION_NAME) {
|
|
21
|
-
return value;
|
|
22
|
-
}
|
|
23
|
-
return `${INTEGRATION_NAME}:${value.replace(/:/g, '_')}`;
|
|
21
|
+
return `${KEY_PREFIX}:${value.replace(/:/g, '_')}`;
|
|
24
22
|
}
|
|
25
23
|
function getTokenCache() {
|
|
26
|
-
const { REDIS_URL, INTEGRATION_NAME } = process.env;
|
|
24
|
+
const { REDIS_URL, INTEGRATION_NAME, OAUTH2_IDENTIFIER, OAUTH2_REDIRECT_URL, } = process.env;
|
|
25
|
+
// if oauth is not configured, token cache is not needed
|
|
26
|
+
if (!OAUTH2_REDIRECT_URL) {
|
|
27
|
+
(0, __1.infoLogger)('TOKEN CACHE', 'No OAUTH2_REDIRECT_URL provided, skipping token cache initialization.');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
27
30
|
if (REDIS_URL) {
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
if (INTEGRATION_NAME) {
|
|
32
|
+
KEY_PREFIX = INTEGRATION_NAME;
|
|
33
|
+
}
|
|
34
|
+
else if (OAUTH2_IDENTIFIER) {
|
|
35
|
+
(0, __1.warnLogger)('TOKEN CACHE', 'Using OAUTH2_IDENTIFIER is deprecated, specify INTEGRATION_NAME instead.');
|
|
36
|
+
KEY_PREFIX = OAUTH2_IDENTIFIER;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
throw new models_1.ServerError(500, 'Could not specify KEY_PREFIX for getTokenCache, missing environment variable INTEGRATION_NAME.');
|
|
40
|
+
}
|
|
41
|
+
(0, __1.infoLogger)(`TOKEN CACHE`, `Using Redis cache with prefix ${KEY_PREFIX}`);
|
|
31
42
|
return new cache_1.TokenStorageCache(new storage_1.RedisStorageAdapter(REDIS_URL));
|
|
32
43
|
}
|
|
33
|
-
console.log('[TOKEN CACHE] Using memory cache');
|
|
34
44
|
const { TOKEN_CACHE_TTL } = process.env;
|
|
35
|
-
|
|
45
|
+
(0, __1.infoLogger)('TOKEN CACHE', `Using memory cache with TTL ${TOKEN_CACHE_TTL || DEFAULT_TTL}`);
|
|
46
|
+
return new cache_1.TokenStorageCache(new storage_1.MemoryStorageAdapter(parseInt(TOKEN_CACHE_TTL || DEFAULT_TTL)));
|
|
36
47
|
}
|
|
37
48
|
exports.getTokenCache = getTokenCache;
|
|
38
49
|
function getFreshAccessToken(config, refreshFn, force = false) {
|
|
39
50
|
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
if (__1.tokenCache === undefined)
|
|
52
|
+
throw new models_1.ServerError(500, 'Tried getting token from cache while cache was undefined.');
|
|
40
53
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
41
54
|
if (force) {
|
|
42
55
|
const newToken = yield getNewToken(config, refreshFn);
|
|
@@ -56,13 +69,15 @@ function getFreshAccessToken(config, refreshFn, force = false) {
|
|
|
56
69
|
exports.getFreshAccessToken = getFreshAccessToken;
|
|
57
70
|
function getNewToken(config, refreshFn) {
|
|
58
71
|
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
if (__1.tokenCache === undefined)
|
|
73
|
+
throw new models_1.ServerError(500, 'Tried getting token from cache while cache was undefined.');
|
|
59
74
|
yield __1.tokenCache.set(useCollection(config.apiKey), {
|
|
60
75
|
refresh_token: '',
|
|
61
76
|
access_token: '',
|
|
62
77
|
isPending: true,
|
|
63
78
|
}, REFRESH_MARKER_TTL);
|
|
64
79
|
const newToken = Object.assign(Object.assign({}, (yield refreshFn(config))), { isPending: false });
|
|
65
|
-
yield __1.tokenCache.set(useCollection(config.apiKey), newToken, parseInt(process.env.TOKEN_CACHE_TTL ||
|
|
80
|
+
yield __1.tokenCache.set(useCollection(config.apiKey), newToken, parseInt(process.env.TOKEN_CACHE_TTL || DEFAULT_TTL));
|
|
66
81
|
return newToken;
|
|
67
82
|
});
|
|
68
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-util.js","sourceRoot":"","sources":["../../src/util/token-util.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAA6C;AAC7C,8CAA6E;AAC7E,sCAAgD;AAGhD,
|
|
1
|
+
{"version":3,"file":"token-util.js","sourceRoot":"","sources":["../../src/util/token-util.ts"],"names":[],"mappings":"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"}
|