@super-protocol/sdk-js 0.13.6-beta.2 → 0.13.6-beta.4
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/index.d.ts +0 -1
- package/build/index.js +0 -1
- package/build/providers/storage/S3StorageProvider.d.ts +24 -0
- package/build/providers/storage/S3StorageProvider.js +357 -0
- package/build/providers/storage/getStorageProvider.js +3 -0
- package/build/types/storage/StorageObject.d.ts +2 -2
- package/package.json +2 -2
- package/build/providers/storage/StorjS3StorageProvider.d.ts +0 -26
- package/build/providers/storage/StorjS3StorageProvider.js +0 -188
package/build/index.d.ts
CHANGED
|
@@ -59,5 +59,4 @@ export { default as StorageObject } from "./types/storage/StorageObject";
|
|
|
59
59
|
export { default as StorageAccess } from "./types/storage/StorageAccess";
|
|
60
60
|
export { default as getStorageProvider } from "./providers/storage/getStorageProvider";
|
|
61
61
|
export { default as IStorageProvider } from "./providers/storage/IStorageProvider";
|
|
62
|
-
export * from "./providers/storage/StorjS3StorageProvider";
|
|
63
62
|
export * as helpers from "./utils/helpers";
|
package/build/index.js
CHANGED
|
@@ -106,5 +106,4 @@ __exportStar(require("./types/Origins"), exports);
|
|
|
106
106
|
exports.ChunkedStorageProvider = __importStar(require("./providers/storage/ChunksDownloadDecorator"));
|
|
107
107
|
var getStorageProvider_1 = require("./providers/storage/getStorageProvider");
|
|
108
108
|
Object.defineProperty(exports, "getStorageProvider", { enumerable: true, get: function () { return __importDefault(getStorageProvider_1).default; } });
|
|
109
|
-
__exportStar(require("./providers/storage/StorjS3StorageProvider"), exports);
|
|
110
109
|
exports.helpers = __importStar(require("./utils/helpers"));
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import IStorageProvider, { DownloadConfig } from "./IStorageProvider";
|
|
3
|
+
import { Readable } from "stream";
|
|
4
|
+
import StorageObject from "../../types/storage/StorageObject";
|
|
5
|
+
export type S3ClientConfig = {
|
|
6
|
+
accessKeyId: string;
|
|
7
|
+
secretAccessKey: string;
|
|
8
|
+
endpoint: string;
|
|
9
|
+
bucket: string;
|
|
10
|
+
};
|
|
11
|
+
export declare class S3StorageProvider implements IStorageProvider {
|
|
12
|
+
private readonly s3Client;
|
|
13
|
+
private readonly bucket;
|
|
14
|
+
private readonly multipartChunkSizeInBytes;
|
|
15
|
+
constructor(storageAccess: S3ClientConfig);
|
|
16
|
+
uploadFile(inputStream: Readable, remotePath: string, contentLength: number, progressListener?: ((total: number, current: number) => void) | undefined): Promise<void>;
|
|
17
|
+
private multipartUpload;
|
|
18
|
+
deleteObject(remotePath: string): Promise<void>;
|
|
19
|
+
downloadFile(remotePath: string, config: DownloadConfig, progressListener?: ((total: number, current: number) => void) | undefined): Promise<Readable>;
|
|
20
|
+
listObjects(remotePath: string): Promise<StorageObject[]>;
|
|
21
|
+
private getMetadata;
|
|
22
|
+
getObjectSize(remotePath: string): Promise<number>;
|
|
23
|
+
getLastModified(remotePath: string): Promise<Date>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,357 @@
|
|
|
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
|
+
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
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
39
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
40
|
+
var m = o[Symbol.asyncIterator], i;
|
|
41
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
42
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
43
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
44
|
+
};
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.S3StorageProvider = void 0;
|
|
47
|
+
var aws_sdk_1 = require("aws-sdk");
|
|
48
|
+
var S3StorageProvider = /** @class */ (function () {
|
|
49
|
+
function S3StorageProvider(storageAccess) {
|
|
50
|
+
this.multipartChunkSizeInBytes = 64 * 1024 * 1024; // 64MB
|
|
51
|
+
var accessKeyId = storageAccess.accessKeyId, secretAccessKey = storageAccess.secretAccessKey, endpoint = storageAccess.endpoint, bucket = storageAccess.bucket;
|
|
52
|
+
if (!accessKeyId)
|
|
53
|
+
throw new Error("Access key id is undefined");
|
|
54
|
+
if (!secretAccessKey)
|
|
55
|
+
throw new Error("Secret access is undefined");
|
|
56
|
+
if (!endpoint)
|
|
57
|
+
throw new Error("Endpoint is undefined");
|
|
58
|
+
if (!bucket)
|
|
59
|
+
throw new Error("Bucket is undefined");
|
|
60
|
+
this.bucket = bucket;
|
|
61
|
+
this.s3Client = new aws_sdk_1.S3({
|
|
62
|
+
credentials: {
|
|
63
|
+
accessKeyId: accessKeyId,
|
|
64
|
+
secretAccessKey: secretAccessKey,
|
|
65
|
+
},
|
|
66
|
+
endpoint: endpoint,
|
|
67
|
+
s3ForcePathStyle: true,
|
|
68
|
+
signatureVersion: "v4",
|
|
69
|
+
httpOptions: { timeout: 0 },
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
S3StorageProvider.prototype.uploadFile = function (inputStream, remotePath, contentLength, progressListener) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
74
|
+
var result;
|
|
75
|
+
return __generator(this, function (_a) {
|
|
76
|
+
switch (_a.label) {
|
|
77
|
+
case 0:
|
|
78
|
+
// For performance & cost optimization
|
|
79
|
+
// https://docs.storj.io/dcs/api-reference/s3-compatible-gateway/multipart-upload/multipart-part-size
|
|
80
|
+
if (inputStream.readableHighWaterMark >= this.multipartChunkSizeInBytes) {
|
|
81
|
+
return [2 /*return*/, this.multipartUpload(inputStream, remotePath, contentLength, progressListener)];
|
|
82
|
+
}
|
|
83
|
+
return [4 /*yield*/, this.s3Client
|
|
84
|
+
.putObject({
|
|
85
|
+
Body: inputStream,
|
|
86
|
+
Bucket: this.bucket,
|
|
87
|
+
Key: remotePath,
|
|
88
|
+
ContentLength: contentLength,
|
|
89
|
+
})
|
|
90
|
+
.on("httpUploadProgress", function (_a) {
|
|
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
|
+
});
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
S3StorageProvider.prototype.multipartUpload = function (inputStream, remotePath, contentLength, progressListener) {
|
|
106
|
+
var _a, inputStream_1, inputStream_1_1;
|
|
107
|
+
var _b, e_1, _c, _d;
|
|
108
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
109
|
+
var multipart, totalWritten, partNumber, uploadId, parts, buffer, response, e_1_1, doneParams, uploadingError_1;
|
|
110
|
+
return __generator(this, function (_e) {
|
|
111
|
+
switch (_e.label) {
|
|
112
|
+
case 0: return [4 /*yield*/, this.s3Client
|
|
113
|
+
.createMultipartUpload({
|
|
114
|
+
Bucket: this.bucket,
|
|
115
|
+
Key: remotePath,
|
|
116
|
+
})
|
|
117
|
+
.promise()];
|
|
118
|
+
case 1:
|
|
119
|
+
multipart = _e.sent();
|
|
120
|
+
if (!multipart.UploadId) {
|
|
121
|
+
throw new Error("UploadId property is empty");
|
|
122
|
+
}
|
|
123
|
+
_e.label = 2;
|
|
124
|
+
case 2:
|
|
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];
|
|
138
|
+
_d = inputStream_1_1.value;
|
|
139
|
+
_a = false;
|
|
140
|
+
_e.label = 6;
|
|
141
|
+
case 6:
|
|
142
|
+
_e.trys.push([6, , 8, 9]);
|
|
143
|
+
buffer = _d;
|
|
144
|
+
partNumber++;
|
|
145
|
+
return [4 /*yield*/, this.s3Client
|
|
146
|
+
.uploadPart({
|
|
147
|
+
Body: buffer,
|
|
148
|
+
Bucket: this.bucket,
|
|
149
|
+
Key: remotePath,
|
|
150
|
+
UploadId: uploadId,
|
|
151
|
+
PartNumber: partNumber,
|
|
152
|
+
})
|
|
153
|
+
.promise()];
|
|
154
|
+
case 7:
|
|
155
|
+
response = _e.sent();
|
|
156
|
+
parts.push({
|
|
157
|
+
ETag: response.ETag,
|
|
158
|
+
PartNumber: partNumber,
|
|
159
|
+
});
|
|
160
|
+
totalWritten += buffer.length;
|
|
161
|
+
if (!!progressListener) {
|
|
162
|
+
progressListener(contentLength, totalWritten);
|
|
163
|
+
}
|
|
164
|
+
return [3 /*break*/, 9];
|
|
165
|
+
case 8:
|
|
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;
|
|
229
|
+
}
|
|
230
|
+
return [2 /*return*/];
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
S3StorageProvider.prototype.downloadFile = function (remotePath, config, progressListener) {
|
|
236
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
237
|
+
var getObjectParams, start, end, downloadStream, current, fileBytesSize_1, _a;
|
|
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];
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
};
|
|
271
|
+
S3StorageProvider.prototype.listObjects = function (remotePath) {
|
|
272
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
273
|
+
var prefix, listObjects, result;
|
|
274
|
+
return __generator(this, function (_a) {
|
|
275
|
+
switch (_a.label) {
|
|
276
|
+
case 0:
|
|
277
|
+
prefix = remotePath.endsWith("/") ? remotePath : "".concat(remotePath, "/");
|
|
278
|
+
return [4 /*yield*/, this.s3Client
|
|
279
|
+
.listObjectsV2({
|
|
280
|
+
Bucket: this.bucket,
|
|
281
|
+
Prefix: prefix,
|
|
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
|
+
});
|
|
300
|
+
});
|
|
301
|
+
};
|
|
302
|
+
S3StorageProvider.prototype.getMetadata = function (remotePath) {
|
|
303
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
304
|
+
var getObjectParams, metadata;
|
|
305
|
+
return __generator(this, function (_a) {
|
|
306
|
+
switch (_a.label) {
|
|
307
|
+
case 0:
|
|
308
|
+
getObjectParams = {
|
|
309
|
+
Bucket: this.bucket,
|
|
310
|
+
Key: remotePath,
|
|
311
|
+
};
|
|
312
|
+
return [4 /*yield*/, this.s3Client.headObject(getObjectParams).promise()];
|
|
313
|
+
case 1:
|
|
314
|
+
metadata = _a.sent();
|
|
315
|
+
if (metadata.$response.error) {
|
|
316
|
+
throw metadata.$response.error;
|
|
317
|
+
}
|
|
318
|
+
return [2 /*return*/, metadata];
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
};
|
|
323
|
+
S3StorageProvider.prototype.getObjectSize = function (remotePath) {
|
|
324
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
325
|
+
var metadata;
|
|
326
|
+
return __generator(this, function (_a) {
|
|
327
|
+
switch (_a.label) {
|
|
328
|
+
case 0: return [4 /*yield*/, this.getMetadata(remotePath)];
|
|
329
|
+
case 1:
|
|
330
|
+
metadata = _a.sent();
|
|
331
|
+
if (metadata.ContentLength === undefined) {
|
|
332
|
+
throw new Error("ContentLength property is empty");
|
|
333
|
+
}
|
|
334
|
+
return [2 /*return*/, metadata.ContentLength || 0];
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
};
|
|
339
|
+
S3StorageProvider.prototype.getLastModified = function (remotePath) {
|
|
340
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
341
|
+
var metadata;
|
|
342
|
+
return __generator(this, function (_a) {
|
|
343
|
+
switch (_a.label) {
|
|
344
|
+
case 0: return [4 /*yield*/, this.getMetadata(remotePath)];
|
|
345
|
+
case 1:
|
|
346
|
+
metadata = _a.sent();
|
|
347
|
+
if (!metadata.LastModified) {
|
|
348
|
+
throw new Error("LastModified property is empty");
|
|
349
|
+
}
|
|
350
|
+
return [2 /*return*/, metadata.LastModified];
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
};
|
|
355
|
+
return S3StorageProvider;
|
|
356
|
+
}());
|
|
357
|
+
exports.S3StorageProvider = S3StorageProvider;
|
|
@@ -5,11 +5,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
var dto_js_1 = require("@super-protocol/dto-js");
|
|
7
7
|
var StorjStorageProvider_1 = __importDefault(require("./StorjStorageProvider"));
|
|
8
|
+
var S3StorageProvider_1 = require("./S3StorageProvider");
|
|
8
9
|
exports.default = (function (storageAccess) {
|
|
9
10
|
var key = storageAccess.storageType;
|
|
10
11
|
switch (key) {
|
|
11
12
|
case dto_js_1.StorageType.StorJ:
|
|
12
13
|
return new StorjStorageProvider_1.default(storageAccess.credentials, storageAccess.maximumConcurrent);
|
|
14
|
+
case dto_js_1.StorageType.S3:
|
|
15
|
+
return new S3StorageProvider_1.S3StorageProvider(storageAccess.credentials);
|
|
13
16
|
default:
|
|
14
17
|
throw Error("Unsupported storageType ".concat(key));
|
|
15
18
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@super-protocol/sdk-js",
|
|
3
|
-
"version": "0.13.6-beta.
|
|
3
|
+
"version": "0.13.6-beta.4",
|
|
4
4
|
"main": "build/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"typescript": "^4.4.4"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@super-protocol/dto-js": "0.0.
|
|
55
|
+
"@super-protocol/dto-js": "0.0.28",
|
|
56
56
|
"@super-protocol/tee-lib": "^0.1.2",
|
|
57
57
|
"@super-protocol/uplink-nodejs": "1.2.16",
|
|
58
58
|
"aws-sdk": "^2.1418.0",
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { S3 } from "aws-sdk";
|
|
3
|
-
export interface ObjectMetadata {
|
|
4
|
-
name: string;
|
|
5
|
-
size: number;
|
|
6
|
-
createdAt: Date;
|
|
7
|
-
}
|
|
8
|
-
export type S3ClientConfig = {
|
|
9
|
-
accessKeyId: string;
|
|
10
|
-
secretAccessKey: string;
|
|
11
|
-
endpoint: string;
|
|
12
|
-
bucket: string;
|
|
13
|
-
};
|
|
14
|
-
export declare class StorjS3StorageProvider {
|
|
15
|
-
private readonly s3Client;
|
|
16
|
-
private readonly bucket;
|
|
17
|
-
constructor(storageAccess: S3ClientConfig);
|
|
18
|
-
private storageUpload;
|
|
19
|
-
private storageDelete;
|
|
20
|
-
private storageDownload;
|
|
21
|
-
private storageListFiles;
|
|
22
|
-
uploadFile(key: string, value: Buffer): Promise<void>;
|
|
23
|
-
deleteFile(key: string): Promise<void>;
|
|
24
|
-
downloadFile(key: string): Promise<S3.Body>;
|
|
25
|
-
listObjects(key: string): Promise<ObjectMetadata[]>;
|
|
26
|
-
}
|
|
@@ -1,188 +0,0 @@
|
|
|
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
|
-
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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.StorjS3StorageProvider = void 0;
|
|
40
|
-
var aws_sdk_1 = require("aws-sdk");
|
|
41
|
-
// TODO add streams support https://superprotocol.atlassian.net/browse/SP-3203
|
|
42
|
-
var StorjS3StorageProvider = /** @class */ (function () {
|
|
43
|
-
function StorjS3StorageProvider(storageAccess) {
|
|
44
|
-
var accessKeyId = storageAccess.accessKeyId, secretAccessKey = storageAccess.secretAccessKey, endpoint = storageAccess.endpoint, bucket = storageAccess.bucket;
|
|
45
|
-
if (!accessKeyId)
|
|
46
|
-
throw new Error("Access key id is undefined");
|
|
47
|
-
if (!secretAccessKey)
|
|
48
|
-
throw new Error("Secret access is undefined");
|
|
49
|
-
if (!endpoint)
|
|
50
|
-
throw new Error("Endpoint is undefined");
|
|
51
|
-
if (!bucket)
|
|
52
|
-
throw new Error("Bucket is undefined");
|
|
53
|
-
this.bucket = bucket;
|
|
54
|
-
this.s3Client = new aws_sdk_1.S3({
|
|
55
|
-
credentials: {
|
|
56
|
-
accessKeyId: accessKeyId,
|
|
57
|
-
secretAccessKey: secretAccessKey,
|
|
58
|
-
},
|
|
59
|
-
endpoint: endpoint,
|
|
60
|
-
s3ForcePathStyle: true,
|
|
61
|
-
signatureVersion: "v4",
|
|
62
|
-
httpOptions: { timeout: 0 },
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
StorjS3StorageProvider.prototype.storageUpload = function (remotePath, value) {
|
|
66
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
67
|
-
var result;
|
|
68
|
-
return __generator(this, function (_a) {
|
|
69
|
-
switch (_a.label) {
|
|
70
|
-
case 0: return [4 /*yield*/, this.s3Client
|
|
71
|
-
.putObject({
|
|
72
|
-
ACL: "public-read",
|
|
73
|
-
Body: value,
|
|
74
|
-
Bucket: this.bucket,
|
|
75
|
-
Key: remotePath,
|
|
76
|
-
})
|
|
77
|
-
.promise()];
|
|
78
|
-
case 1:
|
|
79
|
-
result = _a.sent();
|
|
80
|
-
if (result.$response.error) {
|
|
81
|
-
throw result.$response.error;
|
|
82
|
-
}
|
|
83
|
-
return [2 /*return*/];
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
};
|
|
88
|
-
StorjS3StorageProvider.prototype.storageDelete = function (key) {
|
|
89
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
90
|
-
var deleteResult;
|
|
91
|
-
return __generator(this, function (_a) {
|
|
92
|
-
switch (_a.label) {
|
|
93
|
-
case 0: return [4 /*yield*/, this.s3Client
|
|
94
|
-
.deleteObject({
|
|
95
|
-
Bucket: this.bucket,
|
|
96
|
-
Key: key,
|
|
97
|
-
})
|
|
98
|
-
.promise()];
|
|
99
|
-
case 1:
|
|
100
|
-
deleteResult = _a.sent();
|
|
101
|
-
if (deleteResult.$response.error) {
|
|
102
|
-
throw deleteResult.$response.error;
|
|
103
|
-
}
|
|
104
|
-
return [2 /*return*/];
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
};
|
|
109
|
-
StorjS3StorageProvider.prototype.storageDownload = function (filepath) {
|
|
110
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
111
|
-
var downloadStream;
|
|
112
|
-
return __generator(this, function (_a) {
|
|
113
|
-
switch (_a.label) {
|
|
114
|
-
case 0: return [4 /*yield*/, this.s3Client
|
|
115
|
-
.getObject({
|
|
116
|
-
Bucket: this.bucket,
|
|
117
|
-
Key: filepath,
|
|
118
|
-
})
|
|
119
|
-
.promise()];
|
|
120
|
-
case 1:
|
|
121
|
-
downloadStream = _a.sent();
|
|
122
|
-
if (downloadStream.$response.error) {
|
|
123
|
-
throw downloadStream.$response.error;
|
|
124
|
-
}
|
|
125
|
-
return [2 /*return*/, downloadStream.Body || Buffer.from([])];
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
};
|
|
130
|
-
StorjS3StorageProvider.prototype.storageListFiles = function (key) {
|
|
131
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
132
|
-
var prefix, listObjects, result;
|
|
133
|
-
return __generator(this, function (_a) {
|
|
134
|
-
switch (_a.label) {
|
|
135
|
-
case 0:
|
|
136
|
-
prefix = key.endsWith("/") ? key : "".concat(key, "/");
|
|
137
|
-
return [4 /*yield*/, this.s3Client
|
|
138
|
-
.listObjectsV2({
|
|
139
|
-
Bucket: this.bucket,
|
|
140
|
-
Prefix: prefix,
|
|
141
|
-
})
|
|
142
|
-
.promise()];
|
|
143
|
-
case 1:
|
|
144
|
-
listObjects = _a.sent();
|
|
145
|
-
result = [];
|
|
146
|
-
if (listObjects.Contents) {
|
|
147
|
-
result = listObjects.Contents.map(function (object) { return ({
|
|
148
|
-
name: object.Key || "",
|
|
149
|
-
createdAt: object.LastModified || new Date(),
|
|
150
|
-
size: object.Size || 0,
|
|
151
|
-
}); });
|
|
152
|
-
}
|
|
153
|
-
return [2 /*return*/, result];
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
};
|
|
158
|
-
StorjS3StorageProvider.prototype.uploadFile = function (key, value) {
|
|
159
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
160
|
-
return __generator(this, function (_a) {
|
|
161
|
-
return [2 /*return*/, this.storageUpload(key, value)];
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
};
|
|
165
|
-
StorjS3StorageProvider.prototype.deleteFile = function (key) {
|
|
166
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
167
|
-
return __generator(this, function (_a) {
|
|
168
|
-
return [2 /*return*/, this.storageDelete(key)];
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
};
|
|
172
|
-
StorjS3StorageProvider.prototype.downloadFile = function (key) {
|
|
173
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
174
|
-
return __generator(this, function (_a) {
|
|
175
|
-
return [2 /*return*/, this.storageDownload(key)];
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
};
|
|
179
|
-
StorjS3StorageProvider.prototype.listObjects = function (key) {
|
|
180
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
181
|
-
return __generator(this, function (_a) {
|
|
182
|
-
return [2 /*return*/, this.storageListFiles(key)];
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
};
|
|
186
|
-
return StorjS3StorageProvider;
|
|
187
|
-
}());
|
|
188
|
-
exports.StorjS3StorageProvider = StorjS3StorageProvider;
|