@trunkrs/common 1.4.5 → 1.4.6
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/package.json
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Serializer } from '../serialization';
|
|
2
|
+
import Cache from './Cache';
|
|
3
|
+
declare class S3Cache extends Cache {
|
|
4
|
+
private readonly serializer;
|
|
5
|
+
private readonly bucketArn;
|
|
6
|
+
private readonly keyPrefix;
|
|
7
|
+
private readonly expirationTagName;
|
|
8
|
+
private readonly s3Client;
|
|
9
|
+
constructor(serializer: Serializer, bucketArn: string, keyPrefix?: string, stalenessTimeout?: number);
|
|
10
|
+
private getFullKey;
|
|
11
|
+
hasKey(key: string): Promise<boolean>;
|
|
12
|
+
add<TValue>(key: string, value: TValue): Promise<void>;
|
|
13
|
+
get<TValue>(key: string): Promise<TValue | null>;
|
|
14
|
+
getOrAdd<TValue>(key: string, factory: () => Promise<TValue>): Promise<TValue>;
|
|
15
|
+
remove(key: string): Promise<void>;
|
|
16
|
+
clear(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export default S3Cache;
|
|
@@ -0,0 +1,114 @@
|
|
|
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
|
+
const aws_sdk_1 = require("aws-sdk");
|
|
7
|
+
const Cache_1 = __importDefault(require("./Cache"));
|
|
8
|
+
class S3Cache extends Cache_1.default {
|
|
9
|
+
constructor(serializer, bucketArn, keyPrefix = 'cached', stalenessTimeout = 0) {
|
|
10
|
+
super(stalenessTimeout);
|
|
11
|
+
this.serializer = serializer;
|
|
12
|
+
this.bucketArn = bucketArn;
|
|
13
|
+
this.keyPrefix = keyPrefix;
|
|
14
|
+
this.expirationTagName = 'CacheExpiration';
|
|
15
|
+
this.s3Client = new aws_sdk_1.S3();
|
|
16
|
+
}
|
|
17
|
+
getFullKey(key) {
|
|
18
|
+
return `${this.keyPrefix}/${key}`;
|
|
19
|
+
}
|
|
20
|
+
async hasKey(key) {
|
|
21
|
+
try {
|
|
22
|
+
const meta = await this.s3Client
|
|
23
|
+
.headObject({
|
|
24
|
+
Bucket: this.bucketArn,
|
|
25
|
+
Key: this.getFullKey(key),
|
|
26
|
+
})
|
|
27
|
+
.promise();
|
|
28
|
+
const { [this.expirationTagName]: expiration } = meta.Metadata;
|
|
29
|
+
return this.isValidItem({
|
|
30
|
+
expiration: new Date(expiration),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const s3Error = error;
|
|
35
|
+
if (s3Error.statusCode === 404) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async add(key, value) {
|
|
42
|
+
const cacheItem = this.createItem(value);
|
|
43
|
+
await this.s3Client
|
|
44
|
+
.putObject({
|
|
45
|
+
Bucket: this.bucketArn,
|
|
46
|
+
Key: this.getFullKey(key),
|
|
47
|
+
Body: this.serializer.serialize(value, 'string'),
|
|
48
|
+
Metadata: {
|
|
49
|
+
[this.expirationTagName]: String(Number(cacheItem.expiration)),
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
.promise();
|
|
53
|
+
}
|
|
54
|
+
async get(key) {
|
|
55
|
+
const isValid = await this.hasKey(key);
|
|
56
|
+
if (!isValid) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const object = await this.s3Client
|
|
60
|
+
.getObject({
|
|
61
|
+
Bucket: this.bucketArn,
|
|
62
|
+
Key: this.getFullKey(key),
|
|
63
|
+
})
|
|
64
|
+
.promise();
|
|
65
|
+
return this.serializer.deserialize(object.Body);
|
|
66
|
+
}
|
|
67
|
+
async getOrAdd(key, factory) {
|
|
68
|
+
const value = await this.get(key);
|
|
69
|
+
if (value) {
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
const newValue = await factory();
|
|
73
|
+
await this.add(key, newValue);
|
|
74
|
+
return newValue;
|
|
75
|
+
}
|
|
76
|
+
async remove(key) {
|
|
77
|
+
try {
|
|
78
|
+
await this.s3Client
|
|
79
|
+
.deleteObject({
|
|
80
|
+
Bucket: this.bucketArn,
|
|
81
|
+
Key: this.getFullKey(key),
|
|
82
|
+
})
|
|
83
|
+
.promise();
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const s3Error = error;
|
|
87
|
+
if (s3Error.statusCode !== 404) {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async clear() {
|
|
93
|
+
const bucketItems = await this.s3Client
|
|
94
|
+
.listObjectsV2({
|
|
95
|
+
Bucket: this.bucketArn,
|
|
96
|
+
})
|
|
97
|
+
.promise();
|
|
98
|
+
if (!bucketItems.Contents || !bucketItems.Contents.length) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
await this.s3Client
|
|
102
|
+
.deleteObjects({
|
|
103
|
+
Bucket: this.bucketArn,
|
|
104
|
+
Delete: {
|
|
105
|
+
Objects: bucketItems.Contents.map((bucketObject) => ({
|
|
106
|
+
Key: bucketObject.Key,
|
|
107
|
+
})),
|
|
108
|
+
},
|
|
109
|
+
})
|
|
110
|
+
.promise();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.default = S3Cache;
|
|
114
|
+
//# sourceMappingURL=S3Cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"S3Cache.js","sourceRoot":"","sources":["../../../utils/caching/S3Cache.ts"],"names":[],"mappings":"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"}
|
package/utils/caching/index.d.ts
CHANGED
|
@@ -3,3 +3,4 @@ export { default as FileCache } from './FileCache';
|
|
|
3
3
|
export { default as GlobalAtomicCache } from './GlobalAtomicCache';
|
|
4
4
|
export { default as MemoryCache } from './MemoryCache';
|
|
5
5
|
export { default as SecretCache } from './SecretCache';
|
|
6
|
+
export { default as S3Cache } from './S3Cache';
|
package/utils/caching/index.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SecretCache = exports.MemoryCache = exports.GlobalAtomicCache = exports.FileCache = exports.Cache = void 0;
|
|
6
|
+
exports.S3Cache = exports.SecretCache = exports.MemoryCache = exports.GlobalAtomicCache = exports.FileCache = exports.Cache = void 0;
|
|
7
7
|
var Cache_1 = require("./Cache");
|
|
8
8
|
Object.defineProperty(exports, "Cache", { enumerable: true, get: function () { return __importDefault(Cache_1).default; } });
|
|
9
9
|
var FileCache_1 = require("./FileCache");
|
|
@@ -14,4 +14,6 @@ var MemoryCache_1 = require("./MemoryCache");
|
|
|
14
14
|
Object.defineProperty(exports, "MemoryCache", { enumerable: true, get: function () { return __importDefault(MemoryCache_1).default; } });
|
|
15
15
|
var SecretCache_1 = require("./SecretCache");
|
|
16
16
|
Object.defineProperty(exports, "SecretCache", { enumerable: true, get: function () { return __importDefault(SecretCache_1).default; } });
|
|
17
|
+
var S3Cache_1 = require("./S3Cache");
|
|
18
|
+
Object.defineProperty(exports, "S3Cache", { enumerable: true, get: function () { return __importDefault(S3Cache_1).default; } });
|
|
17
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../utils/caching/index.ts"],"names":[],"mappings":";;;;;;AAAA,iCAA0C;AAAjC,+GAAA,OAAO,OAAS;AAEzB,yCAAkD;AAAzC,uHAAA,OAAO,OAAa;AAC7B,yDAAkE;AAAzD,uIAAA,OAAO,OAAqB;AACrC,6CAAsD;AAA7C,2HAAA,OAAO,OAAe;AAC/B,6CAAsD;AAA7C,2HAAA,OAAO,OAAe"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../utils/caching/index.ts"],"names":[],"mappings":";;;;;;AAAA,iCAA0C;AAAjC,+GAAA,OAAO,OAAS;AAEzB,yCAAkD;AAAzC,uHAAA,OAAO,OAAa;AAC7B,yDAAkE;AAAzD,uIAAA,OAAO,OAAqB;AACrC,6CAAsD;AAA7C,2HAAA,OAAO,OAAe;AAC/B,6CAAsD;AAA7C,2HAAA,OAAO,OAAe;AAC/B,qCAA8C;AAArC,mHAAA,OAAO,OAAW"}
|