@super-protocol/sdk-js 0.15.0 → 0.15.2-beta.0
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/build/TIIGenerator.js +129 -239
- package/build/connectors/BaseConnector.js +17 -47
- package/build/connectors/BlockchainConnector.js +222 -348
- package/build/connectors/BlockchainEventsListener.js +38 -92
- package/build/contracts/app.json +466 -35
- package/build/crypto/Crypto.js +63 -135
- package/build/crypto/index.js +1 -1
- package/build/crypto/nodejs/AES.js +62 -119
- package/build/crypto/nodejs/ARIA.js +61 -118
- package/build/crypto/nodejs/ECIES.js +51 -87
- package/build/crypto/nodejs/NativeCrypto.js +64 -118
- package/build/crypto/nodejs/RSA-Hybrid.js +54 -113
- package/build/index.d.ts +5 -0
- package/build/index.js +14 -2
- package/build/logger.d.ts +3 -1
- package/build/logger.js +2 -2
- package/build/models/EtlModel.js +65 -114
- package/build/models/Offer.js +227 -462
- package/build/models/Order.d.ts +4 -0
- package/build/models/Order.js +326 -559
- package/build/models/Provider.d.ts +2 -0
- package/build/models/Provider.js +74 -153
- package/build/models/TCB.js +67 -171
- package/build/models/TeeOffer.d.ts +1 -0
- package/build/models/TeeOffer.js +389 -731
- package/build/proto/Compression.js +20 -21
- package/build/proto/TRI.js +46 -50
- package/build/proto/TeeProperties.js +60 -66
- package/build/providers/storage/ChunksDownloadDecorator.d.ts +1 -1
- package/build/providers/storage/ChunksDownloadDecorator.js +125 -235
- package/build/providers/storage/IStorageProvider.d.ts +1 -1
- package/build/providers/storage/S3StorageProvider.js +173 -298
- package/build/providers/storage/StorageAdapter.d.ts +60 -0
- package/build/providers/storage/StorageAdapter.js +322 -0
- package/build/providers/storage/StorageContentWriter.d.ts +46 -0
- package/build/providers/storage/StorageContentWriter.js +182 -0
- package/build/providers/storage/StorageKeyValueAdapter.d.ts +23 -0
- package/build/providers/storage/StorageKeyValueAdapter.js +157 -0
- package/build/providers/storage/StorageMetadataReader.d.ts +20 -0
- package/build/providers/storage/StorageMetadataReader.js +67 -0
- package/build/providers/storage/StorjAdapter.d.ts +19 -0
- package/build/providers/storage/StorjAdapter.js +73 -0
- package/build/providers/storage/StorjStorageProvider.js +138 -315
- package/build/providers/storage/getStorageProvider.js +7 -7
- package/build/providers/storage/types.d.ts +7 -0
- package/build/providers/storage/types.js +2 -0
- package/build/staticModels/ActiveOffers.js +32 -100
- package/build/staticModels/ActiveOrders.js +42 -120
- package/build/staticModels/BaseStaticModel.js +7 -10
- package/build/staticModels/Consensus.d.ts +4 -1
- package/build/staticModels/Consensus.js +164 -220
- package/build/staticModels/Deposits.js +109 -201
- package/build/staticModels/Marks.js +21 -82
- package/build/staticModels/ModelPackager.js +34 -84
- package/build/staticModels/Offers.js +140 -266
- package/build/staticModels/Orders.d.ts +1 -0
- package/build/staticModels/Orders.js +286 -429
- package/build/staticModels/ProviderRegistry.js +114 -225
- package/build/staticModels/Superpro.js +17 -63
- package/build/staticModels/SuperproToken.js +90 -169
- package/build/staticModels/TeeOffers.js +220 -416
- package/build/store.js +2 -2
- package/build/types/HardwareInfo.js +2 -2
- package/build/types/Order.js +4 -4
- package/build/types/Provider.js +1 -1
- package/build/types/TeeOfferInfo.js +1 -1
- package/build/types/TeeOfferOption.js +2 -2
- package/build/types/TeeOfferSlot.js +2 -2
- package/build/types/ValueOfferSlot.js +3 -3
- package/build/utils/Monitoring.js +24 -28
- package/build/utils/NonceTracker.js +56 -121
- package/build/utils/PubSub.d.ts +9 -0
- package/build/utils/PubSub.js +36 -0
- package/build/utils/TxManager.js +121 -215
- package/build/utils/compressors/GzipCompressor.js +13 -50
- package/build/utils/compressors/UncompressedCompressor.js +10 -13
- package/build/utils/helpers/tryWithInterval.js +34 -78
- package/build/utils/resourceLoaders/BaseResourceLoader.js +26 -78
- package/build/utils/resourceLoaders/StorageProviderLoader.js +33 -97
- package/build/utils/resourceLoaders/UrlResourceLoader.js +29 -93
- package/build/utils/resourceLoaders/getResourceLoader.js +6 -6
- package/build/utils.js +60 -105
- package/package.json +4 -1
|
@@ -8,33 +8,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
11
|
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
39
12
|
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
40
13
|
var m = o[Symbol.asyncIterator], i;
|
|
@@ -44,11 +17,11 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
|
44
17
|
};
|
|
45
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
19
|
exports.S3StorageProvider = void 0;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
20
|
+
const aws_sdk_1 = require("aws-sdk");
|
|
21
|
+
class S3StorageProvider {
|
|
22
|
+
constructor(storageAccess) {
|
|
50
23
|
this.multipartChunkSizeInBytes = 64 * 1024 * 1024; // 64MB
|
|
51
|
-
|
|
24
|
+
const { accessKeyId, secretAccessKey, endpoint, bucket } = storageAccess;
|
|
52
25
|
if (!accessKeyId)
|
|
53
26
|
throw new Error("Access key id is undefined");
|
|
54
27
|
if (!secretAccessKey)
|
|
@@ -60,89 +33,62 @@ var S3StorageProvider = /** @class */ (function () {
|
|
|
60
33
|
this.bucket = bucket;
|
|
61
34
|
this.s3Client = new aws_sdk_1.S3({
|
|
62
35
|
credentials: {
|
|
63
|
-
accessKeyId
|
|
64
|
-
secretAccessKey
|
|
36
|
+
accessKeyId,
|
|
37
|
+
secretAccessKey,
|
|
65
38
|
},
|
|
66
|
-
endpoint
|
|
39
|
+
endpoint,
|
|
67
40
|
s3ForcePathStyle: true,
|
|
68
41
|
signatureVersion: "v4",
|
|
69
42
|
httpOptions: { timeout: 0 },
|
|
70
43
|
});
|
|
71
44
|
}
|
|
72
|
-
|
|
73
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
var total = _a.total, loaded = _a.loaded;
|
|
92
|
-
return progressListener === null || progressListener === void 0 ? void 0 : progressListener(total, loaded);
|
|
93
|
-
})
|
|
94
|
-
.promise()];
|
|
95
|
-
case 1:
|
|
96
|
-
result = _a.sent();
|
|
97
|
-
if (result.$response.error) {
|
|
98
|
-
throw result.$response.error;
|
|
99
|
-
}
|
|
100
|
-
return [2 /*return*/];
|
|
101
|
-
}
|
|
102
|
-
});
|
|
45
|
+
uploadFile(inputStream, remotePath, contentLength, progressListener) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
// For performance & cost optimization
|
|
48
|
+
// https://docs.storj.io/dcs/api-reference/s3-compatible-gateway/multipart-upload/multipart-part-size
|
|
49
|
+
if (inputStream.readableHighWaterMark >= this.multipartChunkSizeInBytes) {
|
|
50
|
+
return this.multipartUpload(inputStream, remotePath, contentLength, progressListener);
|
|
51
|
+
}
|
|
52
|
+
const result = yield this.s3Client
|
|
53
|
+
.putObject({
|
|
54
|
+
Body: inputStream,
|
|
55
|
+
Bucket: this.bucket,
|
|
56
|
+
Key: remotePath,
|
|
57
|
+
ContentLength: contentLength,
|
|
58
|
+
})
|
|
59
|
+
.on("httpUploadProgress", ({ total, loaded }) => progressListener === null || progressListener === void 0 ? void 0 : progressListener(total, loaded))
|
|
60
|
+
.promise();
|
|
61
|
+
if (result.$response.error) {
|
|
62
|
+
throw result.$response.error;
|
|
63
|
+
}
|
|
103
64
|
});
|
|
104
|
-
}
|
|
105
|
-
|
|
65
|
+
}
|
|
66
|
+
multipartUpload(inputStream, remotePath, contentLength, progressListener) {
|
|
106
67
|
var _a, inputStream_1, inputStream_1_1;
|
|
107
68
|
var _b, e_1, _c, _d;
|
|
108
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
_e.trys.push([2, 19, , 21]);
|
|
126
|
-
totalWritten = 0;
|
|
127
|
-
partNumber = 0;
|
|
128
|
-
uploadId = multipart.UploadId;
|
|
129
|
-
parts = [];
|
|
130
|
-
_e.label = 3;
|
|
131
|
-
case 3:
|
|
132
|
-
_e.trys.push([3, 11, 12, 17]);
|
|
133
|
-
_a = true, inputStream_1 = __asyncValues(inputStream);
|
|
134
|
-
_e.label = 4;
|
|
135
|
-
case 4: return [4 /*yield*/, inputStream_1.next()];
|
|
136
|
-
case 5:
|
|
137
|
-
if (!(inputStream_1_1 = _e.sent(), _b = inputStream_1_1.done, !_b)) return [3 /*break*/, 10];
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
const multipart = yield this.s3Client
|
|
71
|
+
.createMultipartUpload({
|
|
72
|
+
Bucket: this.bucket,
|
|
73
|
+
Key: remotePath,
|
|
74
|
+
})
|
|
75
|
+
.promise();
|
|
76
|
+
if (!multipart.UploadId) {
|
|
77
|
+
throw new Error("UploadId property is empty");
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
let totalWritten = 0;
|
|
81
|
+
let partNumber = 0;
|
|
82
|
+
const uploadId = multipart.UploadId;
|
|
83
|
+
const parts = [];
|
|
84
|
+
try {
|
|
85
|
+
for (_a = true, inputStream_1 = __asyncValues(inputStream); inputStream_1_1 = yield inputStream_1.next(), _b = inputStream_1_1.done, !_b;) {
|
|
138
86
|
_d = inputStream_1_1.value;
|
|
139
87
|
_a = false;
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
partNumber++;
|
|
145
|
-
return [4 /*yield*/, this.s3Client
|
|
88
|
+
try {
|
|
89
|
+
const buffer = _d;
|
|
90
|
+
partNumber++;
|
|
91
|
+
const response = yield this.s3Client
|
|
146
92
|
.uploadPart({
|
|
147
93
|
Body: buffer,
|
|
148
94
|
Bucket: this.bucket,
|
|
@@ -150,208 +96,137 @@ var S3StorageProvider = /** @class */ (function () {
|
|
|
150
96
|
UploadId: uploadId,
|
|
151
97
|
PartNumber: partNumber,
|
|
152
98
|
})
|
|
153
|
-
.promise()
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
progressListener(contentLength, totalWritten);
|
|
99
|
+
.promise();
|
|
100
|
+
parts.push({
|
|
101
|
+
ETag: response.ETag,
|
|
102
|
+
PartNumber: partNumber,
|
|
103
|
+
});
|
|
104
|
+
totalWritten += buffer.length;
|
|
105
|
+
if (!!progressListener) {
|
|
106
|
+
progressListener(contentLength, totalWritten);
|
|
107
|
+
}
|
|
163
108
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
_a = true;
|
|
167
|
-
return [7 /*endfinally*/];
|
|
168
|
-
case 9: return [3 /*break*/, 4];
|
|
169
|
-
case 10: return [3 /*break*/, 17];
|
|
170
|
-
case 11:
|
|
171
|
-
e_1_1 = _e.sent();
|
|
172
|
-
e_1 = { error: e_1_1 };
|
|
173
|
-
return [3 /*break*/, 17];
|
|
174
|
-
case 12:
|
|
175
|
-
_e.trys.push([12, , 15, 16]);
|
|
176
|
-
if (!(!_a && !_b && (_c = inputStream_1.return))) return [3 /*break*/, 14];
|
|
177
|
-
return [4 /*yield*/, _c.call(inputStream_1)];
|
|
178
|
-
case 13:
|
|
179
|
-
_e.sent();
|
|
180
|
-
_e.label = 14;
|
|
181
|
-
case 14: return [3 /*break*/, 16];
|
|
182
|
-
case 15:
|
|
183
|
-
if (e_1) throw e_1.error;
|
|
184
|
-
return [7 /*endfinally*/];
|
|
185
|
-
case 16: return [7 /*endfinally*/];
|
|
186
|
-
case 17:
|
|
187
|
-
doneParams = {
|
|
188
|
-
Bucket: this.bucket,
|
|
189
|
-
Key: remotePath,
|
|
190
|
-
UploadId: multipart.UploadId,
|
|
191
|
-
MultipartUpload: { Parts: parts },
|
|
192
|
-
};
|
|
193
|
-
return [4 /*yield*/, this.s3Client.completeMultipartUpload(doneParams).promise()];
|
|
194
|
-
case 18:
|
|
195
|
-
_e.sent();
|
|
196
|
-
return [3 /*break*/, 21];
|
|
197
|
-
case 19:
|
|
198
|
-
uploadingError_1 = _e.sent();
|
|
199
|
-
return [4 /*yield*/, this.s3Client
|
|
200
|
-
.abortMultipartUpload({
|
|
201
|
-
Bucket: this.bucket,
|
|
202
|
-
Key: remotePath,
|
|
203
|
-
UploadId: multipart.UploadId,
|
|
204
|
-
})
|
|
205
|
-
.promise()];
|
|
206
|
-
case 20:
|
|
207
|
-
_e.sent();
|
|
208
|
-
throw uploadingError_1;
|
|
209
|
-
case 21: return [2 /*return*/];
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
};
|
|
214
|
-
S3StorageProvider.prototype.deleteObject = function (remotePath) {
|
|
215
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
216
|
-
var deleteResult;
|
|
217
|
-
return __generator(this, function (_a) {
|
|
218
|
-
switch (_a.label) {
|
|
219
|
-
case 0: return [4 /*yield*/, this.s3Client
|
|
220
|
-
.deleteObject({
|
|
221
|
-
Bucket: this.bucket,
|
|
222
|
-
Key: remotePath,
|
|
223
|
-
})
|
|
224
|
-
.promise()];
|
|
225
|
-
case 1:
|
|
226
|
-
deleteResult = _a.sent();
|
|
227
|
-
if (deleteResult.$response.error) {
|
|
228
|
-
throw deleteResult.$response.error;
|
|
109
|
+
finally {
|
|
110
|
+
_a = true;
|
|
229
111
|
}
|
|
230
|
-
|
|
112
|
+
}
|
|
231
113
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
return __generator(this, function (_b) {
|
|
239
|
-
switch (_b.label) {
|
|
240
|
-
case 0:
|
|
241
|
-
getObjectParams = {
|
|
242
|
-
Bucket: this.bucket,
|
|
243
|
-
Key: remotePath,
|
|
244
|
-
};
|
|
245
|
-
if (config) {
|
|
246
|
-
start = config.offset || 0;
|
|
247
|
-
end = start + (config.length || 0);
|
|
248
|
-
getObjectParams.Range = "bytes=".concat(start, "-").concat(end || "");
|
|
249
|
-
}
|
|
250
|
-
downloadStream = this.s3Client.getObject(getObjectParams).createReadStream();
|
|
251
|
-
current = 0;
|
|
252
|
-
if (!progressListener) return [3 /*break*/, 3];
|
|
253
|
-
_a = config.length;
|
|
254
|
-
if (_a) return [3 /*break*/, 2];
|
|
255
|
-
return [4 /*yield*/, this.getObjectSize(remotePath)];
|
|
256
|
-
case 1:
|
|
257
|
-
_a = (_b.sent());
|
|
258
|
-
_b.label = 2;
|
|
259
|
-
case 2:
|
|
260
|
-
fileBytesSize_1 = _a;
|
|
261
|
-
downloadStream.on("data", function (chunk) {
|
|
262
|
-
current += chunk.length;
|
|
263
|
-
progressListener(fileBytesSize_1, current);
|
|
264
|
-
});
|
|
265
|
-
_b.label = 3;
|
|
266
|
-
case 3: return [2 /*return*/, downloadStream];
|
|
114
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
115
|
+
finally {
|
|
116
|
+
try {
|
|
117
|
+
if (!_a && !_b && (_c = inputStream_1.return)) yield _c.call(inputStream_1);
|
|
118
|
+
}
|
|
119
|
+
finally { if (e_1) throw e_1.error; }
|
|
267
120
|
}
|
|
268
|
-
|
|
121
|
+
const doneParams = {
|
|
122
|
+
Bucket: this.bucket,
|
|
123
|
+
Key: remotePath,
|
|
124
|
+
UploadId: multipart.UploadId,
|
|
125
|
+
MultipartUpload: { Parts: parts },
|
|
126
|
+
};
|
|
127
|
+
yield this.s3Client.completeMultipartUpload(doneParams).promise();
|
|
128
|
+
}
|
|
129
|
+
catch (uploadingError) {
|
|
130
|
+
yield this.s3Client
|
|
131
|
+
.abortMultipartUpload({
|
|
132
|
+
Bucket: this.bucket,
|
|
133
|
+
Key: remotePath,
|
|
134
|
+
UploadId: multipart.UploadId,
|
|
135
|
+
})
|
|
136
|
+
.promise();
|
|
137
|
+
throw uploadingError;
|
|
138
|
+
}
|
|
269
139
|
});
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
})
|
|
283
|
-
.promise()];
|
|
284
|
-
case 1:
|
|
285
|
-
listObjects = _a.sent();
|
|
286
|
-
if (listObjects.$response.error) {
|
|
287
|
-
throw listObjects.$response.error;
|
|
288
|
-
}
|
|
289
|
-
result = [];
|
|
290
|
-
if (listObjects.Contents) {
|
|
291
|
-
result = listObjects.Contents.map(function (object) { return ({
|
|
292
|
-
name: object.Key || "",
|
|
293
|
-
createdAt: object.LastModified || new Date(),
|
|
294
|
-
size: object.Size || 0,
|
|
295
|
-
}); });
|
|
296
|
-
}
|
|
297
|
-
return [2 /*return*/, result];
|
|
298
|
-
}
|
|
299
|
-
});
|
|
140
|
+
}
|
|
141
|
+
deleteObject(remotePath) {
|
|
142
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
143
|
+
const deleteResult = yield this.s3Client
|
|
144
|
+
.deleteObject({
|
|
145
|
+
Bucket: this.bucket,
|
|
146
|
+
Key: remotePath,
|
|
147
|
+
})
|
|
148
|
+
.promise();
|
|
149
|
+
if (deleteResult.$response.error) {
|
|
150
|
+
throw deleteResult.$response.error;
|
|
151
|
+
}
|
|
300
152
|
});
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
153
|
+
}
|
|
154
|
+
downloadFile(remotePath, config, progressListener) {
|
|
155
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
const getObjectParams = {
|
|
157
|
+
Bucket: this.bucket,
|
|
158
|
+
Key: remotePath,
|
|
159
|
+
};
|
|
160
|
+
if (config) {
|
|
161
|
+
const start = config.offset || 0;
|
|
162
|
+
const end = start + (config.length || 0);
|
|
163
|
+
getObjectParams.Range = `bytes=${start}-${end || ""}`;
|
|
164
|
+
}
|
|
165
|
+
const downloadStream = this.s3Client.getObject(getObjectParams).createReadStream();
|
|
166
|
+
let current = 0;
|
|
167
|
+
if (progressListener) {
|
|
168
|
+
const fileBytesSize = config.length || (yield this.getObjectSize(remotePath));
|
|
169
|
+
downloadStream.on("data", (chunk) => {
|
|
170
|
+
current += chunk.length;
|
|
171
|
+
progressListener(fileBytesSize, current);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
return downloadStream;
|
|
321
175
|
});
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
176
|
+
}
|
|
177
|
+
listObjects(remotePath) {
|
|
178
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
179
|
+
const prefix = remotePath.endsWith("/") ? remotePath : `${remotePath}/`;
|
|
180
|
+
const listObjects = yield this.s3Client
|
|
181
|
+
.listObjectsV2({
|
|
182
|
+
Bucket: this.bucket,
|
|
183
|
+
Prefix: prefix,
|
|
184
|
+
})
|
|
185
|
+
.promise();
|
|
186
|
+
if (listObjects.$response.error) {
|
|
187
|
+
throw listObjects.$response.error;
|
|
188
|
+
}
|
|
189
|
+
let result = [];
|
|
190
|
+
if (listObjects.Contents) {
|
|
191
|
+
result = listObjects.Contents.map((object) => ({
|
|
192
|
+
name: object.Key || "",
|
|
193
|
+
createdAt: object.LastModified || new Date(),
|
|
194
|
+
size: object.Size || 0,
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
return result;
|
|
337
198
|
});
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
return [2 /*return*/, metadata.LastModified];
|
|
351
|
-
}
|
|
352
|
-
});
|
|
199
|
+
}
|
|
200
|
+
getMetadata(remotePath) {
|
|
201
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
202
|
+
const getObjectParams = {
|
|
203
|
+
Bucket: this.bucket,
|
|
204
|
+
Key: remotePath,
|
|
205
|
+
};
|
|
206
|
+
const metadata = yield this.s3Client.headObject(getObjectParams).promise();
|
|
207
|
+
if (metadata.$response.error) {
|
|
208
|
+
throw metadata.$response.error;
|
|
209
|
+
}
|
|
210
|
+
return metadata;
|
|
353
211
|
});
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
|
|
212
|
+
}
|
|
213
|
+
getObjectSize(remotePath) {
|
|
214
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
215
|
+
const metadata = yield this.getMetadata(remotePath);
|
|
216
|
+
if (metadata.ContentLength === undefined) {
|
|
217
|
+
throw new Error("ContentLength property is empty");
|
|
218
|
+
}
|
|
219
|
+
return metadata.ContentLength || 0;
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
getLastModified(remotePath) {
|
|
223
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
224
|
+
const metadata = yield this.getMetadata(remotePath);
|
|
225
|
+
if (!metadata.LastModified) {
|
|
226
|
+
throw new Error("LastModified property is empty");
|
|
227
|
+
}
|
|
228
|
+
return metadata.LastModified;
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
357
232
|
exports.S3StorageProvider = S3StorageProvider;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import StorageAccess from "../../types/storage/StorageAccess";
|
|
3
|
+
import { Performance } from "./types";
|
|
4
|
+
export interface LRUCacheConfig {
|
|
5
|
+
max: number;
|
|
6
|
+
}
|
|
7
|
+
export interface StorageAdapterConfig {
|
|
8
|
+
lruCache: LRUCacheConfig;
|
|
9
|
+
writeInterval: number;
|
|
10
|
+
readInterval: number;
|
|
11
|
+
objectDeletedFlag: string;
|
|
12
|
+
readMetadataConcurrency?: number;
|
|
13
|
+
performance?: Performance;
|
|
14
|
+
showLogs?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare enum CacheEvents {
|
|
17
|
+
INSTANCES_CHANGED = "INSTANCES_CHANGED",
|
|
18
|
+
KEY_DELETED = "KEY_DELETED"
|
|
19
|
+
}
|
|
20
|
+
export default class StorageAdapter<V extends object> {
|
|
21
|
+
private readonly logger?;
|
|
22
|
+
private readonly storageKeyValueAdapter;
|
|
23
|
+
private readonly cache;
|
|
24
|
+
private readonly encryptionKeys;
|
|
25
|
+
private readonly contentWriter;
|
|
26
|
+
private readonly metadataReader;
|
|
27
|
+
private readonly instanceId;
|
|
28
|
+
private timeout;
|
|
29
|
+
private readonly readInterval;
|
|
30
|
+
private readonly queues;
|
|
31
|
+
private readonly queueReadMetadata;
|
|
32
|
+
private readonly isUpdating;
|
|
33
|
+
private readonly pubSub;
|
|
34
|
+
private readonly eventName;
|
|
35
|
+
private readonly performance?;
|
|
36
|
+
constructor(storageAccess: StorageAccess, config: StorageAdapterConfig);
|
|
37
|
+
private generateHash;
|
|
38
|
+
subscribe(cb: (props: {
|
|
39
|
+
type: CacheEvents;
|
|
40
|
+
message: unknown;
|
|
41
|
+
}) => void): Promise<() => Promise<void>>;
|
|
42
|
+
private publish;
|
|
43
|
+
has(key: string): Promise<boolean>;
|
|
44
|
+
private getEnryptionKey;
|
|
45
|
+
set(key: string, value: V, encryptionKeyBuffer: Buffer): Promise<void>;
|
|
46
|
+
private setByInstance;
|
|
47
|
+
delete(key: string): Promise<void>;
|
|
48
|
+
get(key: string, encryptionKeyBuffer: Buffer): Promise<(V | null)[] | null>;
|
|
49
|
+
private getQueue;
|
|
50
|
+
private clearQueue;
|
|
51
|
+
private cacheHasNullInstances;
|
|
52
|
+
private fetchNullValues;
|
|
53
|
+
clear(): void;
|
|
54
|
+
run(): void;
|
|
55
|
+
private checkUpdates;
|
|
56
|
+
private startUpdatesChecking;
|
|
57
|
+
private stopUpdatesChecking;
|
|
58
|
+
stop(): void;
|
|
59
|
+
shutdown(): Promise<void>;
|
|
60
|
+
}
|