@sipgate/integration-bridge 1.0.35 → 1.0.38
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/cache/contact-cache-storage.js +79 -97
- package/dist/cache/contact-cache-storage.js.map +1 -1
- package/dist/cache/storage/memory-storage-adapter.js +8 -22
- package/dist/cache/storage/memory-storage-adapter.js.map +1 -1
- package/dist/cache/storage/redis-storage-adapter.js +16 -30
- package/dist/cache/storage/redis-storage-adapter.js.map +1 -1
- package/dist/cache/token-cache-storage.js +30 -43
- package/dist/cache/token-cache-storage.js.map +1 -1
- package/dist/controllers/call-log.controller.js +63 -78
- package/dist/controllers/call-log.controller.js.map +1 -1
- package/dist/controllers/task.controller.js +60 -75
- package/dist/controllers/task.controller.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.js +38 -21
- package/dist/index.js.map +1 -1
- package/dist/middlewares/error-handler.middleware.js +1 -2
- package/dist/middlewares/error-handler.middleware.js.map +1 -1
- package/dist/middlewares/extract-header.middleware.d.ts +0 -1
- package/dist/middlewares/extract-header.middleware.js +2 -2
- package/dist/middlewares/extract-header.middleware.js.map +1 -1
- package/dist/models/cache-item-state.model.js +1 -1
- package/dist/models/cache-item-state.model.js.map +1 -1
- package/dist/models/call-direction.enum.js +1 -1
- package/dist/models/call-direction.enum.js.map +1 -1
- package/dist/models/call-event.model.js +2 -2
- package/dist/models/call-event.model.js.map +1 -1
- package/dist/models/contact.model.js +3 -3
- package/dist/models/contact.model.js.map +1 -1
- package/dist/models/controller.model.js +579 -622
- package/dist/models/controller.model.js.map +1 -1
- package/dist/models/integration-entity.model.js +1 -1
- package/dist/models/integration-entity.model.js.map +1 -1
- package/dist/models/integration-error.model.js +1 -1
- package/dist/models/integration-error.model.js.map +1 -1
- package/dist/models/integrations-event.model.js +1 -1
- package/dist/models/integrations-event.model.js.map +1 -1
- package/dist/models/pubsub/pubsub-client.model.js +16 -25
- package/dist/models/pubsub/pubsub-client.model.js.map +1 -1
- package/dist/models/pubsub/pubsub-contacts-message.model.js +1 -1
- package/dist/models/pubsub/pubsub-contacts-message.model.js.map +1 -1
- package/dist/models/server-error.model.js +1 -0
- package/dist/models/server-error.model.js.map +1 -1
- package/dist/swagger/openapi-spec.d.ts +972 -0
- package/dist/swagger/openapi-spec.js +787 -0
- package/dist/swagger/openapi-spec.js.map +1 -0
- package/dist/util/anonymize-key.js +1 -2
- package/dist/util/anonymize-key.js.map +1 -1
- package/dist/util/call-comment.js +5 -6
- package/dist/util/call-comment.js.map +1 -1
- package/dist/util/call-event.util.js +1 -2
- package/dist/util/call-event.util.js.map +1 -1
- package/dist/util/callEventHelper.js +4 -4
- package/dist/util/callEventHelper.js.map +1 -1
- package/dist/util/contact.util.js +10 -8
- package/dist/util/contact.util.js.map +1 -1
- package/dist/util/env.js +19 -9
- package/dist/util/env.js.map +1 -1
- package/dist/util/error/delegate-to-frontend.error.d.ts +5 -0
- package/dist/util/error/delegate-to-frontend.error.js +14 -0
- package/dist/util/error/delegate-to-frontend.error.js.map +1 -0
- package/dist/util/error/error.d.ts +12 -0
- package/dist/util/error/error.js +93 -0
- package/dist/util/error/error.js.map +1 -0
- package/dist/util/gdpr/gdprSlackNotification.js +22 -22
- package/dist/util/gdpr/gdprSlackNotification.js.map +1 -1
- package/dist/util/gdpr/index.js +17 -7
- package/dist/util/gdpr/index.js.map +1 -1
- package/dist/util/get-contact-cache.js +1 -2
- package/dist/util/get-contact-cache.js.map +1 -1
- package/dist/util/http/default-axios.js +1 -2
- package/dist/util/http/default-axios.js.map +1 -1
- package/dist/util/http/index.js +17 -7
- package/dist/util/http/index.js.map +1 -1
- package/dist/util/http/pagination.js +32 -85
- package/dist/util/http/pagination.js.map +1 -1
- package/dist/util/http/rate-limited-axios.js +42 -61
- package/dist/util/http/rate-limited-axios.js.map +1 -1
- package/dist/util/http/retrying-axios.js +11 -23
- package/dist/util/http/retrying-axios.js.map +1 -1
- package/dist/util/http/url.js +1 -2
- package/dist/util/http/url.js.map +1 -1
- package/dist/util/index.d.ts +2 -1
- package/dist/util/index.js +21 -9
- package/dist/util/index.js.map +1 -1
- package/dist/util/lang/delay.js +1 -2
- package/dist/util/lang/delay.js.map +1 -1
- package/dist/util/lang/diff.js +19 -10
- package/dist/util/lang/diff.js.map +1 -1
- package/dist/util/logger.util.js +7 -2
- package/dist/util/logger.util.js.map +1 -1
- package/dist/util/oauth.js +131 -134
- package/dist/util/oauth.js.map +1 -1
- package/dist/util/phone-number-utils.js +4 -5
- package/dist/util/phone-number-utils.js.map +1 -1
- package/dist/util/security/index.js +17 -7
- package/dist/util/security/index.js.map +1 -1
- package/dist/util/security/nonce.js +5 -6
- package/dist/util/security/nonce.js.map +1 -1
- package/dist/util/size-of.js +1 -1
- package/dist/util/size-of.js.map +1 -1
- package/dist/util/token-util.js +46 -62
- package/dist/util/token-util.js.map +1 -1
- package/dist/util/validate.js +1 -2
- package/dist/util/validate.js.map +1 -1
- package/package.json +25 -38
- package/README.md +0 -117
- package/dist/util/error.d.ts +0 -7
- package/dist/util/error.js +0 -76
- package/dist/util/error.js.map +0 -1
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.ContactCacheStorage = void 0;
|
|
13
4
|
const cache_item_state_model_1 = require("../models/cache-item-state.model");
|
|
@@ -15,9 +6,10 @@ const util_1 = require("../util");
|
|
|
15
6
|
const CACHE_STATE_PREFIX = 'cache-state:';
|
|
16
7
|
const CACHE_STATE_SECONDS_TTL = 1800; // 30 minutes
|
|
17
8
|
class ContactCacheStorage {
|
|
9
|
+
LOG_PREFIX = 'CONTACT CACHE';
|
|
10
|
+
storage;
|
|
11
|
+
cacheRefreshIntervalMs = 30 * 60 * 1000; // 30 minutes
|
|
18
12
|
constructor(storageAdapter) {
|
|
19
|
-
this.LOG_PREFIX = 'CONTACT CACHE';
|
|
20
|
-
this.cacheRefreshIntervalMs = 30 * 60 * 1000; // 30 minutes
|
|
21
13
|
this.storage = storageAdapter;
|
|
22
14
|
const { CACHE_REFRESH_INTERVAL } = process.env;
|
|
23
15
|
if (CACHE_REFRESH_INTERVAL) {
|
|
@@ -26,100 +18,90 @@ class ContactCacheStorage {
|
|
|
26
18
|
}
|
|
27
19
|
(0, util_1.infoLogger)(this.LOG_PREFIX, `Initialized storage cache with maximum refresh interval of ${this.cacheRefreshIntervalMs / 1000}s.`, undefined);
|
|
28
20
|
}
|
|
29
|
-
get(key, getFreshValue) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
(0, util_1.infoLogger)(this.LOG_PREFIX, `Returning previously cached contacts (${contacts.length}), because new contacts are still being fetched`, key);
|
|
40
|
-
return contacts;
|
|
41
|
-
}
|
|
42
|
-
return cacheItemState;
|
|
43
|
-
}
|
|
44
|
-
if (contacts) {
|
|
45
|
-
(0, util_1.infoLogger)(this.LOG_PREFIX, `Found ${contacts.length} contacts in cache`, key);
|
|
46
|
-
const now = new Date().getTime();
|
|
47
|
-
const isValueStale = Boolean(!cacheItemState ||
|
|
48
|
-
(cacheItemState.state === cache_item_state_model_1.CacheItemStateType.CACHED &&
|
|
49
|
-
now > cacheItemState.timestamp + this.cacheRefreshIntervalMs));
|
|
50
|
-
if (getFreshValue && isValueStale) {
|
|
51
|
-
(0, util_1.infoLogger)(this.LOG_PREFIX, `Cached value was stale, fetching fresh contacts`, key);
|
|
52
|
-
// we don't return the fresh value here because we don't want to wait on the result.
|
|
53
|
-
// We return the old value instead, the fresh value is returned the next time it is requested
|
|
54
|
-
this.getRefreshed(key, getFreshValue).catch((error) => {
|
|
55
|
-
(0, util_1.errorLogger)(this.LOG_PREFIX, `Unable to get fresh contacts`, key, error);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
21
|
+
async get(key, getFreshValue) {
|
|
22
|
+
try {
|
|
23
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, 'Trying to get contacts from cache', key);
|
|
24
|
+
const cacheItemState = await this.storage.get(this.getCacheItemKey(key));
|
|
25
|
+
const contacts = await this.storage.get(key);
|
|
26
|
+
if (cacheItemState?.state === cache_item_state_model_1.CacheItemStateType.FETCHING) {
|
|
27
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, 'Not refreshing contacts, because cache state is FETCHING', key);
|
|
28
|
+
// if we have old contacts saved in cache we return them instead
|
|
29
|
+
if (contacts && contacts?.length > 0) {
|
|
30
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, `Returning previously cached contacts (${contacts.length}), because new contacts are still being fetched`, key);
|
|
58
31
|
return contacts;
|
|
59
32
|
}
|
|
33
|
+
return cacheItemState;
|
|
60
34
|
}
|
|
61
|
-
|
|
62
|
-
(0, util_1.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
35
|
+
if (contacts) {
|
|
36
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, `Found ${contacts.length} contacts in cache`, key);
|
|
37
|
+
const now = new Date().getTime();
|
|
38
|
+
const isValueStale = Boolean(!cacheItemState ||
|
|
39
|
+
(cacheItemState.state === cache_item_state_model_1.CacheItemStateType.CACHED &&
|
|
40
|
+
now > cacheItemState.timestamp + this.cacheRefreshIntervalMs));
|
|
41
|
+
if (getFreshValue && isValueStale) {
|
|
42
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, `Cached value was stale, fetching fresh contacts`, key);
|
|
43
|
+
// we don't return the fresh value here because we don't want to wait on the result.
|
|
44
|
+
// We return the old value instead, the fresh value is returned the next time it is requested
|
|
45
|
+
this.getRefreshed(key, getFreshValue).catch((error) => {
|
|
46
|
+
(0, util_1.errorLogger)(this.LOG_PREFIX, `Unable to get fresh contacts`, key, error);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return contacts;
|
|
67
50
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
(0, util_1.errorLogger)(this.LOG_PREFIX, `Unable to get contacts from cache`, key, e);
|
|
54
|
+
}
|
|
55
|
+
if (!getFreshValue) {
|
|
56
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, `No "getFreshValue" function provided - returning empty array`, key);
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, `Found no match in cache. Getting fresh value`, key);
|
|
60
|
+
return this.getRefreshed(key, getFreshValue);
|
|
71
61
|
}
|
|
72
|
-
set(key, contacts) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
});
|
|
62
|
+
async set(key, contacts) {
|
|
63
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, `Saving ${contacts.length} contacts to cache`, key);
|
|
64
|
+
try {
|
|
65
|
+
await this.storage.set(key, contacts);
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
(0, util_1.errorLogger)(this.LOG_PREFIX, `Unable to set cache`, key, e);
|
|
69
|
+
}
|
|
82
70
|
}
|
|
83
|
-
setCacheState(key, state, ttl) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
});
|
|
71
|
+
async setCacheState(key, state, ttl) {
|
|
72
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, `Setting cache state to ${state}`, key);
|
|
73
|
+
try {
|
|
74
|
+
await this.storage.set(this.getCacheItemKey(key), {
|
|
75
|
+
timestamp: Date.now(),
|
|
76
|
+
state,
|
|
77
|
+
}, ttl);
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
(0, util_1.errorLogger)(this.LOG_PREFIX, `Unable to set cache state`, key, e);
|
|
81
|
+
}
|
|
96
82
|
}
|
|
97
|
-
delete(key) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
});
|
|
83
|
+
async delete(key) {
|
|
84
|
+
(0, util_1.infoLogger)(this.LOG_PREFIX, `Removing contacts from cache`, key);
|
|
85
|
+
try {
|
|
86
|
+
await this.storage.delete(key);
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
(0, util_1.errorLogger)(this.LOG_PREFIX, `Unable to remove contacts from cache`, key, e);
|
|
90
|
+
}
|
|
107
91
|
}
|
|
108
|
-
getRefreshed(key, getFreshValue) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
});
|
|
92
|
+
async getRefreshed(key, getFreshValue) {
|
|
93
|
+
await this.setCacheState(key, cache_item_state_model_1.CacheItemStateType.FETCHING, CACHE_STATE_SECONDS_TTL);
|
|
94
|
+
try {
|
|
95
|
+
const freshValue = await getFreshValue(key);
|
|
96
|
+
await this.set(key, freshValue);
|
|
97
|
+
await this.setCacheState(key, cache_item_state_model_1.CacheItemStateType.CACHED);
|
|
98
|
+
return freshValue;
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
(0, util_1.errorLogger)(this.LOG_PREFIX, `Error while refreshing value`, key, e);
|
|
102
|
+
await this.storage.delete(this.getCacheItemKey(key));
|
|
103
|
+
throw e;
|
|
104
|
+
}
|
|
123
105
|
}
|
|
124
106
|
getCacheItemKey(key) {
|
|
125
107
|
return `${CACHE_STATE_PREFIX}${key}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contact-cache-storage.js","sourceRoot":"","sources":["../../src/cache/contact-cache-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contact-cache-storage.js","sourceRoot":"","sources":["../../src/cache/contact-cache-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
4
|
};
|
|
@@ -16,6 +7,7 @@ exports.MemoryStorageAdapter = void 0;
|
|
|
16
7
|
const lru_cache_1 = __importDefault(require("lru-cache"));
|
|
17
8
|
const size_of_1 = __importDefault(require("../../util/size-of"));
|
|
18
9
|
class MemoryStorageAdapter {
|
|
10
|
+
cache;
|
|
19
11
|
constructor(ttl) {
|
|
20
12
|
const { MEMORY_CACHE_TTL_SECONDS } = process.env;
|
|
21
13
|
const cacheTtlInSeconds = Number(MEMORY_CACHE_TTL_SECONDS) || 60 * 60 * 24 * 30; // 30 days
|
|
@@ -27,21 +19,15 @@ class MemoryStorageAdapter {
|
|
|
27
19
|
});
|
|
28
20
|
console.log(`Initialized memory cache`);
|
|
29
21
|
}
|
|
30
|
-
get(key) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return cached !== null && cached !== void 0 ? cached : null;
|
|
34
|
-
});
|
|
22
|
+
async get(key) {
|
|
23
|
+
const cached = this.cache.get(key);
|
|
24
|
+
return cached ?? null;
|
|
35
25
|
}
|
|
36
|
-
set(key, value) {
|
|
37
|
-
|
|
38
|
-
this.cache.set(key, value);
|
|
39
|
-
});
|
|
26
|
+
async set(key, value) {
|
|
27
|
+
this.cache.set(key, value);
|
|
40
28
|
}
|
|
41
|
-
delete(key) {
|
|
42
|
-
|
|
43
|
-
this.cache.del(key);
|
|
44
|
-
});
|
|
29
|
+
async delete(key) {
|
|
30
|
+
this.cache.del(key);
|
|
45
31
|
}
|
|
46
32
|
}
|
|
47
33
|
exports.MemoryStorageAdapter = MemoryStorageAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-storage-adapter.js","sourceRoot":"","sources":["../../../src/cache/storage/memory-storage-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory-storage-adapter.js","sourceRoot":"","sources":["../../../src/cache/storage/memory-storage-adapter.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA4B;AAE5B,iEAAwC;AAExC,MAAa,oBAAoB;IACvB,KAAK,CAAuB;IAEpC,YAAY,GAAY;QACtB,MAAM,EAAE,wBAAwB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;QACjD,MAAM,iBAAiB,GACrB,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU;QACnE,MAAM,YAAY,GAAW,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;QAExD,IAAI,CAAC,KAAK,GAAG,IAAI,mBAAG,CAAC;YACnB,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,CAAC,GAAG,IAAI,iBAAiB,CAAC,GAAG,IAAI;YACtC,eAAe,EAAE,iBAAM;SACxB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAEM,KAAK,CAAC,GAAG,CAAI,GAAW;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAkB,CAAC;QACpD,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;CACF;AA9BD,oDA8BC"}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.RedisStorageAdapter = void 0;
|
|
13
4
|
const redis_1 = require("redis");
|
|
@@ -17,6 +8,7 @@ const inflate = (0, util_1.promisify)(zlib_1.inflate);
|
|
|
17
8
|
const deflate = (0, util_1.promisify)(zlib_1.deflate);
|
|
18
9
|
const DEFAULT_CACHE_TTL = 60 * 60 * 24 * 30; // 30 days
|
|
19
10
|
class RedisStorageAdapter {
|
|
11
|
+
client;
|
|
20
12
|
constructor(url) {
|
|
21
13
|
this.client = (0, redis_1.createClient)({ url });
|
|
22
14
|
console.log(`Initialized Redis storage with URL ${url}`);
|
|
@@ -38,30 +30,24 @@ class RedisStorageAdapter {
|
|
|
38
30
|
console.warn('Redis connection error: ', error.message);
|
|
39
31
|
});
|
|
40
32
|
}
|
|
41
|
-
get(key) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return result;
|
|
50
|
-
});
|
|
33
|
+
async get(key) {
|
|
34
|
+
const value = await this.client.get(key);
|
|
35
|
+
if (!value) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const decompressed = await inflate(Buffer.from(value, 'base64'));
|
|
39
|
+
const result = JSON.parse(decompressed.toString());
|
|
40
|
+
return result;
|
|
51
41
|
}
|
|
52
|
-
set(key, value, ttl) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
EX: ttl !== null && ttl !== void 0 ? ttl : DEFAULT_CACHE_TTL,
|
|
58
|
-
});
|
|
42
|
+
async set(key, value, ttl) {
|
|
43
|
+
const stringified = JSON.stringify(value);
|
|
44
|
+
const compressed = await deflate(stringified);
|
|
45
|
+
await this.client.set(key, compressed.toString('base64'), {
|
|
46
|
+
EX: ttl ?? DEFAULT_CACHE_TTL,
|
|
59
47
|
});
|
|
60
48
|
}
|
|
61
|
-
delete(key) {
|
|
62
|
-
|
|
63
|
-
yield this.client.del(key);
|
|
64
|
-
});
|
|
49
|
+
async delete(key) {
|
|
50
|
+
await this.client.del(key);
|
|
65
51
|
}
|
|
66
52
|
}
|
|
67
53
|
exports.RedisStorageAdapter = RedisStorageAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-storage-adapter.js","sourceRoot":"","sources":["../../../src/cache/storage/redis-storage-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"redis-storage-adapter.js","sourceRoot":"","sources":["../../../src/cache/storage/redis-storage-adapter.ts"],"names":[],"mappings":";;;AAAA,iCAAsD;AACtD,+BAAiC;AACjC,+BAIc;AAGd,MAAM,OAAO,GAAG,IAAA,gBAAS,EAAoB,cAAW,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,IAAA,gBAAS,EAAoB,cAAW,CAAC,CAAC;AAE1D,MAAM,iBAAiB,GAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU;AAE/D,MAAa,mBAAmB;IACtB,MAAM,CAA4B;IAE1C,YAAY,GAAW;QACrB,IAAI,CAAC,MAAM,GAAG,IAAA,oBAAY,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAEpC,OAAO,CAAC,GAAG,CAAC,sCAAsC,GAAG,EAAE,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YAClC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM;aACR,OAAO,EAAE;aACT,IAAI,CAAC,GAAG,EAAE;YACT,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC/C,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,KAAK,CAAC,GAAG,CAAI,GAAW;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,OAAO,CAChC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAyB,CACrD,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,GAAY;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YACxD,EAAE,EAAE,GAAG,IAAI,iBAAiB;SAC7B,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF;AAtDD,kDAsDC"}
|
|
@@ -1,58 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.TokenCacheStorage = void 0;
|
|
13
4
|
const util_1 = require("../util");
|
|
14
5
|
class TokenCacheStorage {
|
|
6
|
+
storage;
|
|
7
|
+
logPrefix = 'TOKEN CACHE';
|
|
8
|
+
keyPrefix;
|
|
15
9
|
constructor(storageAdapter, keyPrefix) {
|
|
16
|
-
this.logPrefix = 'TOKEN CACHE';
|
|
17
10
|
this.storage = storageAdapter;
|
|
18
11
|
this.keyPrefix = keyPrefix;
|
|
19
12
|
(0, util_1.infoLogger)(this.logPrefix, `Initialized token storage cache.`);
|
|
20
13
|
}
|
|
21
|
-
get(key) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
});
|
|
14
|
+
async get(key) {
|
|
15
|
+
const keyWithPrefix = this.buildKey(key);
|
|
16
|
+
try {
|
|
17
|
+
return await this.storage.get(keyWithPrefix);
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
(0, util_1.errorLogger)(this.logPrefix, `Unable to get token from cache`, keyWithPrefix, e);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
32
23
|
}
|
|
33
|
-
set(key, token, ttl) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
});
|
|
24
|
+
async set(key, token, ttl) {
|
|
25
|
+
const keyWithPrefix = this.buildKey(key);
|
|
26
|
+
(0, util_1.infoLogger)(this.logPrefix, `Saving token to cache`, keyWithPrefix);
|
|
27
|
+
try {
|
|
28
|
+
await this.storage.set(keyWithPrefix, token, ttl);
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
(0, util_1.errorLogger)(this.logPrefix, `Unable to set cache`, keyWithPrefix, e);
|
|
32
|
+
}
|
|
44
33
|
}
|
|
45
|
-
delete(key) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
});
|
|
34
|
+
async delete(key) {
|
|
35
|
+
const keyWithPrefix = this.buildKey(key);
|
|
36
|
+
(0, util_1.infoLogger)(this.logPrefix, `Removing token from cache`, keyWithPrefix);
|
|
37
|
+
try {
|
|
38
|
+
await this.storage.delete(keyWithPrefix);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
(0, util_1.errorLogger)(this.logPrefix, `Unable to remove token from cache`, keyWithPrefix, e);
|
|
42
|
+
}
|
|
56
43
|
}
|
|
57
44
|
buildKey(key) {
|
|
58
45
|
return `${this.keyPrefix}:${key}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-cache-storage.js","sourceRoot":"","sources":["../../src/cache/token-cache-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-cache-storage.js","sourceRoot":"","sources":["../../src/cache/token-cache-storage.ts"],"names":[],"mappings":";;;AAGA,kCAAkD;AAElD,MAAa,iBAAiB;IACpB,OAAO,CAAiB;IACxB,SAAS,GAAG,aAAa,CAAC;IAC1B,SAAS,CAAS;IAE1B,YAAY,cAA8B,EAAE,SAAiB;QAC3D,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAA,iBAAU,EAAC,IAAI,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;IACjE,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,GAAW;QAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAiB,aAAa,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAA,kBAAW,EACT,IAAI,CAAC,SAAS,EACd,gCAAgC,EAChC,aAAa,EACb,CAAC,CACF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,GAAG,CACd,GAAW,EACX,KAAqB,EACrB,GAAY;QAEZ,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACzC,IAAA,iBAAU,EAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,EAAE,aAAa,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAA,kBAAW,EAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACzC,IAAA,iBAAU,EAAC,IAAI,CAAC,SAAS,EAAE,2BAA2B,EAAE,aAAa,CAAC,CAAC;QACvE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAA,kBAAW,EACT,IAAI,CAAC,SAAS,EACd,mCAAmC,EACnC,aAAa,EACb,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,GAAW;QAC1B,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;IACpC,CAAC;CACF;AA1DD,8CA0DC"}
|