@webiny/api-file-manager-s3 0.0.0-mt-2 → 0.0.0-unstable.06b2ede40f
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/assetDelivery/assetDeliveryConfig.d.ts +2 -0
- package/assetDelivery/assetDeliveryConfig.js +52 -0
- package/assetDelivery/assetDeliveryConfig.js.map +1 -0
- package/assetDelivery/createAssetDelivery.d.ts +3 -0
- package/assetDelivery/createAssetDelivery.js +30 -0
- package/assetDelivery/createAssetDelivery.js.map +1 -0
- package/assetDelivery/createCustomAssetDelivery.d.ts +12 -0
- package/assetDelivery/createCustomAssetDelivery.js +28 -0
- package/assetDelivery/createCustomAssetDelivery.js.map +1 -0
- package/assetDelivery/customAssets/CustomAsset.d.ts +6 -0
- package/assetDelivery/customAssets/CustomAsset.js +14 -0
- package/assetDelivery/customAssets/CustomAsset.js.map +1 -0
- package/assetDelivery/customAssets/CustomAssetProcessor.d.ts +10 -0
- package/assetDelivery/customAssets/CustomAssetProcessor.js +25 -0
- package/assetDelivery/customAssets/CustomAssetProcessor.js.map +1 -0
- package/assetDelivery/customAssets/S3CustomAssetResolver.d.ts +15 -0
- package/assetDelivery/customAssets/S3CustomAssetResolver.js +90 -0
- package/assetDelivery/customAssets/S3CustomAssetResolver.js.map +1 -0
- package/assetDelivery/customAssets/customAssetDeliveryConfig.d.ts +1 -0
- package/assetDelivery/customAssets/customAssetDeliveryConfig.js +30 -0
- package/assetDelivery/customAssets/customAssetDeliveryConfig.js.map +1 -0
- package/assetDelivery/index.d.ts +9 -0
- package/assetDelivery/index.js +70 -0
- package/assetDelivery/index.js.map +1 -0
- package/assetDelivery/s3/S3AssetMetadataReader.d.ts +15 -0
- package/assetDelivery/s3/S3AssetMetadataReader.js +36 -0
- package/assetDelivery/s3/S3AssetMetadataReader.js.map +1 -0
- package/assetDelivery/s3/S3AssetResolver.d.ts +9 -0
- package/assetDelivery/s3/S3AssetResolver.js +37 -0
- package/assetDelivery/s3/S3AssetResolver.js.map +1 -0
- package/assetDelivery/s3/S3ContentsReader.d.ts +10 -0
- package/assetDelivery/s3/S3ContentsReader.js +27 -0
- package/assetDelivery/s3/S3ContentsReader.js.map +1 -0
- package/assetDelivery/s3/S3ErrorAssetReply.d.ts +4 -0
- package/assetDelivery/s3/S3ErrorAssetReply.js +20 -0
- package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -0
- package/assetDelivery/s3/S3OutputStrategy.d.ts +15 -0
- package/assetDelivery/s3/S3OutputStrategy.js +40 -0
- package/assetDelivery/s3/S3OutputStrategy.js.map +1 -0
- package/assetDelivery/s3/S3RedirectAssetReply.d.ts +4 -0
- package/assetDelivery/s3/S3RedirectAssetReply.js +23 -0
- package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -0
- package/assetDelivery/s3/S3StreamAssetReply.d.ts +5 -0
- package/assetDelivery/s3/S3StreamAssetReply.js +23 -0
- package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -0
- package/assetDelivery/s3/SharpTransform.d.ts +18 -0
- package/assetDelivery/s3/SharpTransform.js +192 -0
- package/assetDelivery/s3/SharpTransform.js.map +1 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.d.ts +8 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js +29 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.d.ts +12 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.js +17 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -0
- package/assetDelivery/s3/transformation/WidthCollection.d.ts +7 -0
- package/assetDelivery/s3/transformation/WidthCollection.js +27 -0
- package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -0
- package/assetDelivery/s3/transformation/legacyUtils.d.ts +12 -0
- package/assetDelivery/s3/transformation/legacyUtils.js +34 -0
- package/assetDelivery/s3/transformation/legacyUtils.js.map +1 -0
- package/assetDelivery/s3/transformation/utils.d.ts +11 -0
- package/assetDelivery/s3/transformation/utils.js +33 -0
- package/assetDelivery/s3/transformation/utils.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +62 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +13 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -0
- package/assetDelivery/threatDetection/index.d.ts +2 -0
- package/assetDelivery/threatDetection/index.js +29 -0
- package/assetDelivery/threatDetection/index.js.map +1 -0
- package/assetDelivery/threatDetection/processThreatScanResult.d.ts +2 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js +66 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -0
- package/assetDelivery/threatDetection/types.d.ts +13 -0
- package/assetDelivery/threatDetection/types.js +7 -0
- package/assetDelivery/threatDetection/types.js.map +1 -0
- package/assetDelivery/types.d.ts +11 -0
- package/assetDelivery/types.js +7 -0
- package/assetDelivery/types.js.map +1 -0
- package/flushCdnCache/CdnPathsGenerator.d.ts +4 -0
- package/flushCdnCache/CdnPathsGenerator.js +14 -0
- package/flushCdnCache/CdnPathsGenerator.js.map +1 -0
- package/flushCdnCache/InvalidateCacheTask.d.ts +18 -0
- package/flushCdnCache/InvalidateCacheTask.js +78 -0
- package/flushCdnCache/InvalidateCacheTask.js.map +1 -0
- package/flushCdnCache/flushCacheOnFileDelete.d.ts +3 -0
- package/flushCdnCache/flushCacheOnFileDelete.js +34 -0
- package/flushCdnCache/flushCacheOnFileDelete.js.map +1 -0
- package/flushCdnCache/flushCacheOnFileUpdate.d.ts +3 -0
- package/flushCdnCache/flushCacheOnFileUpdate.js +40 -0
- package/flushCdnCache/flushCacheOnFileUpdate.js.map +1 -0
- package/flushCdnCache/index.d.ts +1 -0
- package/flushCdnCache/index.js +15 -0
- package/flushCdnCache/index.js.map +1 -0
- package/flushCdnCache/invalidateCacheTaskDefinition.d.ts +2 -0
- package/flushCdnCache/invalidateCacheTaskDefinition.js +22 -0
- package/flushCdnCache/invalidateCacheTaskDefinition.js.map +1 -0
- package/index.d.ts +4 -1
- package/index.js +27 -7
- package/index.js.map +1 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.d.ts +15 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js +65 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.d.ts +20 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js +48 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -0
- package/package.json +29 -16
- package/plugins/addFileMetadata.d.ts +10 -0
- package/plugins/addFileMetadata.js +67 -0
- package/plugins/addFileMetadata.js.map +1 -0
- package/plugins/checkPermissions.d.ts +4 -0
- package/plugins/checkPermissions.js +44 -0
- package/plugins/checkPermissions.js.map +1 -0
- package/plugins/fileStorageS3.d.ts +2 -2
- package/plugins/fileStorageS3.js +47 -46
- package/plugins/fileStorageS3.js.map +1 -0
- package/plugins/graphqlFileStorageS3.d.ts +2 -2
- package/plugins/graphqlFileStorageS3.js +137 -59
- package/plugins/graphqlFileStorageS3.js.map +1 -0
- package/types.d.ts +20 -0
- package/types.js +7 -1
- package/types.js.map +1 -0
- package/utils/FileExtension.d.ts +6 -0
- package/utils/FileExtension.js +24 -0
- package/utils/FileExtension.js.map +1 -0
- package/utils/FileKey.d.ts +11 -0
- package/utils/FileKey.js +33 -0
- package/utils/FileKey.js.map +1 -0
- package/utils/FileKey.test.d.ts +1 -0
- package/utils/FileKey.test.js +60 -0
- package/utils/FileKey.test.js.map +1 -0
- package/utils/FileNormalizer.d.ts +18 -0
- package/utils/FileNormalizer.js +49 -0
- package/utils/FileNormalizer.js.map +1 -0
- package/utils/FileUploadModifier.d.ts +30 -0
- package/utils/FileUploadModifier.js +49 -0
- package/utils/FileUploadModifier.js.map +1 -0
- package/utils/createFileNormalizerFromContext.d.ts +3 -0
- package/utils/createFileNormalizerFromContext.js +15 -0
- package/utils/createFileNormalizerFromContext.js.map +1 -0
- package/utils/getPresignedPostPayload.d.ts +3 -11
- package/utils/getPresignedPostPayload.js +14 -55
- package/utils/getPresignedPostPayload.js.map +1 -0
- package/utils/mimeTypes.d.ts +5 -0
- package/utils/mimeTypes.js +23 -0
- package/utils/mimeTypes.js.map +1 -0
- package/utils/uploadFileToS3.d.ts +5 -1
- package/utils/uploadFileToS3.js +9 -12
- package/utils/uploadFileToS3.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_tasks","require","_InvalidateCacheTask","createInvalidateCacheTask","createPrivateTaskDefinition","id","title","description","run","params","taskRunner","InvalidateCloudfrontCacheTask","exports"],"sources":["invalidateCacheTaskDefinition.ts"],"sourcesContent":["import { createPrivateTaskDefinition } from \"@webiny/tasks\";\nimport type { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { InvalidateCloudfrontCacheTask } from \"./InvalidateCacheTask\";\n\nexport const createInvalidateCacheTask = () => {\n return createPrivateTaskDefinition<FileManagerContext>({\n id: \"cloudfrontInvalidateCache\",\n title: \"Invalidate Cloudfront Cache\",\n description: \"A task to invalidate Cloudfront cache by given paths.\",\n run(params) {\n const taskRunner = new InvalidateCloudfrontCacheTask();\n return taskRunner.run(params);\n }\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,oBAAA,GAAAD,OAAA;AAEO,MAAME,yBAAyB,GAAGA,CAAA,KAAM;EAC3C,OAAO,IAAAC,kCAA2B,EAAqB;IACnDC,EAAE,EAAE,2BAA2B;IAC/BC,KAAK,EAAE,6BAA6B;IACpCC,WAAW,EAAE,uDAAuD;IACpEC,GAAGA,CAACC,MAAM,EAAE;MACR,MAAMC,UAAU,GAAG,IAAIC,kDAA6B,CAAC,CAAC;MACtD,OAAOD,UAAU,CAACF,GAAG,CAACC,MAAM,CAAC;IACjC;EACJ,CAAC,CAAC;AACN,CAAC;AAACG,OAAA,CAAAT,yBAAA,GAAAA,yBAAA","ignoreList":[]}
|
package/index.d.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
export { createFileUploadModifier } from "./utils/FileUploadModifier";
|
|
2
|
+
export { createAssetDelivery } from "./assetDelivery/createAssetDelivery";
|
|
3
|
+
export { createCustomAssetDelivery } from "./assetDelivery/createCustomAssetDelivery";
|
|
4
|
+
declare const _default: () => (import("@webiny/handler-graphql/types").GraphQLSchemaPlugin<import("@webiny/api-file-manager/types").FileManagerContext> | import("@webiny/api").ContextPlugin<import("@webiny/api/types").Context> | (import("@webiny/api").ContextPlugin<import("@webiny/api-file-manager/types").FileManagerContext> | import("@webiny/tasks").TaskDefinitionPlugin<import("@webiny/api-file-manager/types").FileManagerContext, any, import("@webiny/tasks").ITaskResponseDoneResultOutput>)[])[];
|
|
2
5
|
export default _default;
|
package/index.js
CHANGED
|
@@ -1,16 +1,36 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
7
|
+
Object.defineProperty(exports, "createAssetDelivery", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return _createAssetDelivery.createAssetDelivery;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
Object.defineProperty(exports, "createCustomAssetDelivery", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () {
|
|
16
|
+
return _createCustomAssetDelivery.createCustomAssetDelivery;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "createFileUploadModifier", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () {
|
|
22
|
+
return _FileUploadModifier.createFileUploadModifier;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
8
25
|
exports.default = void 0;
|
|
9
|
-
|
|
10
26
|
var _graphqlFileStorageS = _interopRequireDefault(require("./plugins/graphqlFileStorageS3"));
|
|
11
|
-
|
|
12
27
|
var _fileStorageS = _interopRequireDefault(require("./plugins/fileStorageS3"));
|
|
28
|
+
var _addFileMetadata = require("./plugins/addFileMetadata");
|
|
29
|
+
var _flushCdnCache = require("./flushCdnCache");
|
|
30
|
+
var _FileUploadModifier = require("./utils/FileUploadModifier");
|
|
31
|
+
var _createAssetDelivery = require("./assetDelivery/createAssetDelivery");
|
|
32
|
+
var _createCustomAssetDelivery = require("./assetDelivery/createCustomAssetDelivery");
|
|
33
|
+
var _default = () => [(0, _fileStorageS.default)(), _graphqlFileStorageS.default, (0, _addFileMetadata.addFileMetadata)(), (0, _flushCdnCache.flushCdnCache)()];
|
|
34
|
+
exports.default = _default;
|
|
13
35
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
exports.default = _default;
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_graphqlFileStorageS","_interopRequireDefault","require","_fileStorageS","_addFileMetadata","_flushCdnCache","_FileUploadModifier","_createAssetDelivery","_createCustomAssetDelivery","_default","fileStorageS3","graphqlFileStorageS3","addFileMetadata","flushCdnCache","exports","default"],"sources":["index.ts"],"sourcesContent":["import graphqlFileStorageS3 from \"./plugins/graphqlFileStorageS3\";\nimport fileStorageS3 from \"./plugins/fileStorageS3\";\nimport { addFileMetadata } from \"./plugins/addFileMetadata\";\nimport { flushCdnCache } from \"~/flushCdnCache\";\n\nexport { createFileUploadModifier } from \"./utils/FileUploadModifier\";\nexport { createAssetDelivery } from \"./assetDelivery/createAssetDelivery\";\nexport { createCustomAssetDelivery } from \"./assetDelivery/createCustomAssetDelivery\";\n\nexport default () => [fileStorageS3(), graphqlFileStorageS3, addFileMetadata(), flushCdnCache()];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,oBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AAEA,IAAAI,mBAAA,GAAAJ,OAAA;AACA,IAAAK,oBAAA,GAAAL,OAAA;AACA,IAAAM,0BAAA,GAAAN,OAAA;AAAsF,IAAAO,QAAA,GAEvEA,CAAA,KAAM,CAAC,IAAAC,qBAAa,EAAC,CAAC,EAAEC,4BAAoB,EAAE,IAAAC,gCAAe,EAAC,CAAC,EAAE,IAAAC,4BAAa,EAAC,CAAC,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAAN,QAAA","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { S3 } from "@webiny/aws-sdk/client-s3";
|
|
2
|
+
interface CompleteMultiPartUploadParams {
|
|
3
|
+
fileKey: string;
|
|
4
|
+
uploadId: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class CompleteMultiPartUploadUseCase {
|
|
7
|
+
private readonly s3;
|
|
8
|
+
private readonly bucket;
|
|
9
|
+
private readonly emptyMarkerValues;
|
|
10
|
+
constructor(bucket: string, s3Client: S3);
|
|
11
|
+
execute(params: CompleteMultiPartUploadParams): Promise<void>;
|
|
12
|
+
private getAllUploadParts;
|
|
13
|
+
private isMarkerEmpty;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CompleteMultiPartUploadUseCase = void 0;
|
|
7
|
+
var _clientS = require("@webiny/aws-sdk/client-s3");
|
|
8
|
+
class CompleteMultiPartUploadUseCase {
|
|
9
|
+
emptyMarkerValues = [undefined, "0"];
|
|
10
|
+
constructor(bucket, s3Client) {
|
|
11
|
+
this.bucket = bucket;
|
|
12
|
+
this.s3 = s3Client;
|
|
13
|
+
}
|
|
14
|
+
async execute(params) {
|
|
15
|
+
const uploadParams = {
|
|
16
|
+
Bucket: this.bucket,
|
|
17
|
+
Key: params.fileKey,
|
|
18
|
+
UploadId: params.uploadId
|
|
19
|
+
};
|
|
20
|
+
const allParts = await this.getAllUploadParts(uploadParams);
|
|
21
|
+
const s3Params = {
|
|
22
|
+
...uploadParams,
|
|
23
|
+
MultipartUpload: {
|
|
24
|
+
Parts: allParts
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
try {
|
|
28
|
+
const command = new _clientS.CompleteMultipartUploadCommand(s3Params);
|
|
29
|
+
await this.s3.send(command);
|
|
30
|
+
} catch (err) {
|
|
31
|
+
console.error(err);
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async getAllUploadParts(params) {
|
|
36
|
+
const parts = [];
|
|
37
|
+
let marker = undefined;
|
|
38
|
+
while (true) {
|
|
39
|
+
const {
|
|
40
|
+
Parts,
|
|
41
|
+
PartNumberMarker
|
|
42
|
+
} = await this.s3.send(new _clientS.ListPartsCommand({
|
|
43
|
+
...params,
|
|
44
|
+
PartNumberMarker: marker
|
|
45
|
+
}));
|
|
46
|
+
if (Parts) {
|
|
47
|
+
Parts.forEach(part => parts.push(part));
|
|
48
|
+
}
|
|
49
|
+
marker = PartNumberMarker || undefined;
|
|
50
|
+
if (this.isMarkerEmpty(marker)) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return parts.map(part => ({
|
|
55
|
+
ETag: part.ETag,
|
|
56
|
+
PartNumber: part.PartNumber
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
isMarkerEmpty(marker) {
|
|
60
|
+
return this.emptyMarkerValues.includes(marker);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.CompleteMultiPartUploadUseCase = CompleteMultiPartUploadUseCase;
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=CompleteMultiPartUploadUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_clientS","require","CompleteMultiPartUploadUseCase","emptyMarkerValues","undefined","constructor","bucket","s3Client","s3","execute","params","uploadParams","Bucket","Key","fileKey","UploadId","uploadId","allParts","getAllUploadParts","s3Params","MultipartUpload","Parts","command","CompleteMultipartUploadCommand","send","err","console","error","parts","marker","PartNumberMarker","ListPartsCommand","forEach","part","push","isMarkerEmpty","map","ETag","PartNumber","includes","exports"],"sources":["CompleteMultiPartUploadUseCase.ts"],"sourcesContent":["import type { S3, Part, ListPartsOutput } from \"@webiny/aws-sdk/client-s3\";\nimport { ListPartsCommand, CompleteMultipartUploadCommand } from \"@webiny/aws-sdk/client-s3\";\n\ninterface CompleteMultiPartUploadParams {\n fileKey: string;\n uploadId: string;\n}\n\ninterface GetAllUploadPartsParams {\n Bucket: string;\n Key: string;\n UploadId: string;\n}\n\nexport class CompleteMultiPartUploadUseCase {\n private readonly s3: S3;\n private readonly bucket: string;\n private readonly emptyMarkerValues = [undefined, \"0\"];\n\n constructor(bucket: string, s3Client: S3) {\n this.bucket = bucket;\n this.s3 = s3Client;\n }\n\n async execute(params: CompleteMultiPartUploadParams) {\n const uploadParams = {\n Bucket: this.bucket,\n Key: params.fileKey,\n UploadId: params.uploadId\n };\n\n const allParts = await this.getAllUploadParts(uploadParams);\n\n const s3Params = {\n ...uploadParams,\n MultipartUpload: {\n Parts: allParts\n }\n };\n\n try {\n const command = new CompleteMultipartUploadCommand(s3Params);\n await this.s3.send(command);\n } catch (err) {\n console.error(err);\n throw err;\n }\n }\n\n private async getAllUploadParts(params: GetAllUploadPartsParams) {\n const parts: Part[] = [];\n\n let marker: string | undefined = undefined;\n while (true) {\n const { Parts, PartNumberMarker }: ListPartsOutput = await this.s3.send(\n new ListPartsCommand({\n ...params,\n PartNumberMarker: marker\n })\n );\n\n if (Parts) {\n Parts.forEach(part => parts.push(part));\n }\n\n marker = PartNumberMarker || undefined;\n if (this.isMarkerEmpty(marker)) {\n break;\n }\n }\n\n return parts.map(part => ({\n ETag: part.ETag as string,\n PartNumber: part.PartNumber as number\n }));\n }\n\n private isMarkerEmpty(marker: string | undefined) {\n return this.emptyMarkerValues.includes(marker);\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AAaO,MAAMC,8BAA8B,CAAC;EAGvBC,iBAAiB,GAAG,CAACC,SAAS,EAAE,GAAG,CAAC;EAErDC,WAAWA,CAACC,MAAc,EAAEC,QAAY,EAAE;IACtC,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,EAAE,GAAGD,QAAQ;EACtB;EAEA,MAAME,OAAOA,CAACC,MAAqC,EAAE;IACjD,MAAMC,YAAY,GAAG;MACjBC,MAAM,EAAE,IAAI,CAACN,MAAM;MACnBO,GAAG,EAAEH,MAAM,CAACI,OAAO;MACnBC,QAAQ,EAAEL,MAAM,CAACM;IACrB,CAAC;IAED,MAAMC,QAAQ,GAAG,MAAM,IAAI,CAACC,iBAAiB,CAACP,YAAY,CAAC;IAE3D,MAAMQ,QAAQ,GAAG;MACb,GAAGR,YAAY;MACfS,eAAe,EAAE;QACbC,KAAK,EAAEJ;MACX;IACJ,CAAC;IAED,IAAI;MACA,MAAMK,OAAO,GAAG,IAAIC,uCAA8B,CAACJ,QAAQ,CAAC;MAC5D,MAAM,IAAI,CAACX,EAAE,CAACgB,IAAI,CAACF,OAAO,CAAC;IAC/B,CAAC,CAAC,OAAOG,GAAG,EAAE;MACVC,OAAO,CAACC,KAAK,CAACF,GAAG,CAAC;MAClB,MAAMA,GAAG;IACb;EACJ;EAEA,MAAcP,iBAAiBA,CAACR,MAA+B,EAAE;IAC7D,MAAMkB,KAAa,GAAG,EAAE;IAExB,IAAIC,MAA0B,GAAGzB,SAAS;IAC1C,OAAO,IAAI,EAAE;MACT,MAAM;QAAEiB,KAAK;QAAES;MAAkC,CAAC,GAAG,MAAM,IAAI,CAACtB,EAAE,CAACgB,IAAI,CACnE,IAAIO,yBAAgB,CAAC;QACjB,GAAGrB,MAAM;QACToB,gBAAgB,EAAED;MACtB,CAAC,CACL,CAAC;MAED,IAAIR,KAAK,EAAE;QACPA,KAAK,CAACW,OAAO,CAACC,IAAI,IAAIL,KAAK,CAACM,IAAI,CAACD,IAAI,CAAC,CAAC;MAC3C;MAEAJ,MAAM,GAAGC,gBAAgB,IAAI1B,SAAS;MACtC,IAAI,IAAI,CAAC+B,aAAa,CAACN,MAAM,CAAC,EAAE;QAC5B;MACJ;IACJ;IAEA,OAAOD,KAAK,CAACQ,GAAG,CAACH,IAAI,KAAK;MACtBI,IAAI,EAAEJ,IAAI,CAACI,IAAc;MACzBC,UAAU,EAAEL,IAAI,CAACK;IACrB,CAAC,CAAC,CAAC;EACP;EAEQH,aAAaA,CAACN,MAA0B,EAAE;IAC9C,OAAO,IAAI,CAAC1B,iBAAiB,CAACoC,QAAQ,CAACV,MAAM,CAAC;EAClD;AACJ;AAACW,OAAA,CAAAtC,8BAAA,GAAAA,8BAAA","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { S3 } from "@webiny/aws-sdk/client-s3";
|
|
2
|
+
import type { FileData } from "../types";
|
|
3
|
+
interface CreateMultiPartUploadParams {
|
|
4
|
+
file: FileData;
|
|
5
|
+
numberOfParts: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class CreateMultiPartUploadUseCase {
|
|
8
|
+
private readonly s3;
|
|
9
|
+
private readonly bucket;
|
|
10
|
+
constructor(bucket: string, s3Client: S3);
|
|
11
|
+
execute({ file, numberOfParts }: CreateMultiPartUploadParams): Promise<{
|
|
12
|
+
file: FileData;
|
|
13
|
+
uploadId: string | undefined;
|
|
14
|
+
parts: {
|
|
15
|
+
url: string;
|
|
16
|
+
partNumber: number;
|
|
17
|
+
}[];
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CreateMultiPartUploadUseCase = void 0;
|
|
7
|
+
var _clientS = require("@webiny/aws-sdk/client-s3");
|
|
8
|
+
class CreateMultiPartUploadUseCase {
|
|
9
|
+
constructor(bucket, s3Client) {
|
|
10
|
+
this.bucket = bucket;
|
|
11
|
+
this.s3 = s3Client;
|
|
12
|
+
}
|
|
13
|
+
async execute({
|
|
14
|
+
file,
|
|
15
|
+
numberOfParts
|
|
16
|
+
}) {
|
|
17
|
+
const s3Params = {
|
|
18
|
+
Bucket: this.bucket,
|
|
19
|
+
Key: file.key
|
|
20
|
+
};
|
|
21
|
+
const {
|
|
22
|
+
UploadId
|
|
23
|
+
} = await this.s3.createMultipartUpload(s3Params);
|
|
24
|
+
const parts = await Promise.all(Array.from({
|
|
25
|
+
length: numberOfParts
|
|
26
|
+
}).map((_, index) => {
|
|
27
|
+
return (0, _clientS.getSignedUrl)(this.s3, new _clientS.UploadPartCommand({
|
|
28
|
+
...s3Params,
|
|
29
|
+
UploadId,
|
|
30
|
+
PartNumber: index + 1
|
|
31
|
+
}), {
|
|
32
|
+
// URL expires after 24 hours.
|
|
33
|
+
expiresIn: 86400
|
|
34
|
+
}).then(url => ({
|
|
35
|
+
url,
|
|
36
|
+
partNumber: index + 1
|
|
37
|
+
}));
|
|
38
|
+
}));
|
|
39
|
+
return {
|
|
40
|
+
file,
|
|
41
|
+
uploadId: UploadId,
|
|
42
|
+
parts
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.CreateMultiPartUploadUseCase = CreateMultiPartUploadUseCase;
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=CreateMultiPartUploadUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_clientS","require","CreateMultiPartUploadUseCase","constructor","bucket","s3Client","s3","execute","file","numberOfParts","s3Params","Bucket","Key","key","UploadId","createMultipartUpload","parts","Promise","all","Array","from","length","map","_","index","getSignedUrl","UploadPartCommand","PartNumber","expiresIn","then","url","partNumber","uploadId","exports"],"sources":["CreateMultiPartUploadUseCase.ts"],"sourcesContent":["import type { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { getSignedUrl, UploadPartCommand } from \"@webiny/aws-sdk/client-s3\";\nimport type { FileData } from \"~/types\";\n\ninterface CreateMultiPartUploadParams {\n file: FileData;\n numberOfParts: number;\n}\n\nexport class CreateMultiPartUploadUseCase {\n private readonly s3: S3;\n private readonly bucket: string;\n\n constructor(bucket: string, s3Client: S3) {\n this.bucket = bucket;\n this.s3 = s3Client;\n }\n\n async execute({ file, numberOfParts }: CreateMultiPartUploadParams) {\n const s3Params = { Bucket: this.bucket, Key: file.key };\n\n const { UploadId } = await this.s3.createMultipartUpload(s3Params);\n\n const parts = await Promise.all(\n Array.from({ length: numberOfParts }).map((_, index) => {\n return getSignedUrl(\n this.s3,\n new UploadPartCommand({ ...s3Params, UploadId, PartNumber: index + 1 }),\n {\n // URL expires after 24 hours.\n expiresIn: 86400\n }\n ).then(url => ({\n url,\n partNumber: index + 1\n }));\n })\n );\n\n return {\n file,\n uploadId: UploadId,\n parts\n };\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,QAAA,GAAAC,OAAA;AAQO,MAAMC,4BAA4B,CAAC;EAItCC,WAAWA,CAACC,MAAc,EAAEC,QAAY,EAAE;IACtC,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,EAAE,GAAGD,QAAQ;EACtB;EAEA,MAAME,OAAOA,CAAC;IAAEC,IAAI;IAAEC;EAA2C,CAAC,EAAE;IAChE,MAAMC,QAAQ,GAAG;MAAEC,MAAM,EAAE,IAAI,CAACP,MAAM;MAAEQ,GAAG,EAAEJ,IAAI,CAACK;IAAI,CAAC;IAEvD,MAAM;MAAEC;IAAS,CAAC,GAAG,MAAM,IAAI,CAACR,EAAE,CAACS,qBAAqB,CAACL,QAAQ,CAAC;IAElE,MAAMM,KAAK,GAAG,MAAMC,OAAO,CAACC,GAAG,CAC3BC,KAAK,CAACC,IAAI,CAAC;MAAEC,MAAM,EAAEZ;IAAc,CAAC,CAAC,CAACa,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KAAK;MACpD,OAAO,IAAAC,qBAAY,EACf,IAAI,CAACnB,EAAE,EACP,IAAIoB,0BAAiB,CAAC;QAAE,GAAGhB,QAAQ;QAAEI,QAAQ;QAAEa,UAAU,EAAEH,KAAK,GAAG;MAAE,CAAC,CAAC,EACvE;QACI;QACAI,SAAS,EAAE;MACf,CACJ,CAAC,CAACC,IAAI,CAACC,GAAG,KAAK;QACXA,GAAG;QACHC,UAAU,EAAEP,KAAK,GAAG;MACxB,CAAC,CAAC,CAAC;IACP,CAAC,CACL,CAAC;IAED,OAAO;MACHhB,IAAI;MACJwB,QAAQ,EAAElB,QAAQ;MAClBE;IACJ,CAAC;EACL;AACJ;AAACiB,OAAA,CAAA/B,4BAAA,GAAAA,4BAAA","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-file-manager-s3",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-unstable.06b2ede40f",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -10,29 +10,42 @@
|
|
|
10
10
|
"author": "Webiny Ltd",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@webiny/api
|
|
14
|
-
"@webiny/
|
|
15
|
-
"@webiny/
|
|
16
|
-
"
|
|
17
|
-
"
|
|
13
|
+
"@webiny/api": "0.0.0-unstable.06b2ede40f",
|
|
14
|
+
"@webiny/api-file-manager": "0.0.0-unstable.06b2ede40f",
|
|
15
|
+
"@webiny/api-security": "0.0.0-unstable.06b2ede40f",
|
|
16
|
+
"@webiny/api-wcp": "0.0.0-unstable.06b2ede40f",
|
|
17
|
+
"@webiny/api-websockets": "0.0.0-unstable.06b2ede40f",
|
|
18
|
+
"@webiny/aws-sdk": "0.0.0-unstable.06b2ede40f",
|
|
19
|
+
"@webiny/error": "0.0.0-unstable.06b2ede40f",
|
|
20
|
+
"@webiny/handler": "0.0.0-unstable.06b2ede40f",
|
|
21
|
+
"@webiny/handler-aws": "0.0.0-unstable.06b2ede40f",
|
|
22
|
+
"@webiny/handler-graphql": "0.0.0-unstable.06b2ede40f",
|
|
23
|
+
"@webiny/plugins": "0.0.0-unstable.06b2ede40f",
|
|
24
|
+
"@webiny/tasks": "0.0.0-unstable.06b2ede40f",
|
|
25
|
+
"@webiny/utils": "0.0.0-unstable.06b2ede40f",
|
|
26
|
+
"@webiny/validation": "0.0.0-unstable.06b2ede40f",
|
|
27
|
+
"form-data": "4.0.0",
|
|
28
|
+
"mime": "3.0.0",
|
|
29
|
+
"node-fetch": "2.6.7",
|
|
30
|
+
"object-hash": "3.0.0",
|
|
31
|
+
"p-map": "4.0.0",
|
|
32
|
+
"p-reduce": "2.1.0",
|
|
18
33
|
"sanitize-filename": "1.6.3",
|
|
19
|
-
"
|
|
34
|
+
"sharp": "0.32.6"
|
|
20
35
|
},
|
|
21
36
|
"devDependencies": {
|
|
22
|
-
"@
|
|
23
|
-
"@
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"rimraf": "^3.0.2",
|
|
27
|
-
"typescript": "^4.1.3"
|
|
37
|
+
"@types/node-fetch": "2.6.2",
|
|
38
|
+
"@webiny/project-utils": "0.0.0-unstable.06b2ede40f",
|
|
39
|
+
"rimraf": "6.0.1",
|
|
40
|
+
"typescript": "5.3.3"
|
|
28
41
|
},
|
|
29
42
|
"publishConfig": {
|
|
30
43
|
"access": "public",
|
|
31
44
|
"directory": "dist"
|
|
32
45
|
},
|
|
33
46
|
"scripts": {
|
|
34
|
-
"build": "
|
|
35
|
-
"watch": "
|
|
47
|
+
"build": "node ../cli/bin.js run build",
|
|
48
|
+
"watch": "node ../cli/bin.js run watch"
|
|
36
49
|
},
|
|
37
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "06b2ede40fc2212a70eeafd74afd50b56fb0ce82"
|
|
38
51
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ContextPlugin } from "@webiny/api";
|
|
2
|
+
import type { FileManagerContext, File } from "@webiny/api-file-manager/types";
|
|
3
|
+
export declare class MetadataWriter {
|
|
4
|
+
private readonly bucket;
|
|
5
|
+
constructor(bucket: string);
|
|
6
|
+
write(files: File[]): Promise<void>;
|
|
7
|
+
private getS3;
|
|
8
|
+
private getMetadata;
|
|
9
|
+
}
|
|
10
|
+
export declare const addFileMetadata: () => ContextPlugin<FileManagerContext>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.addFileMetadata = exports.MetadataWriter = void 0;
|
|
7
|
+
var _clientS = require("@webiny/aws-sdk/client-s3");
|
|
8
|
+
var _api = require("@webiny/api");
|
|
9
|
+
var _utils = require("@webiny/utils");
|
|
10
|
+
class MetadataWriter {
|
|
11
|
+
constructor(bucket) {
|
|
12
|
+
this.bucket = bucket;
|
|
13
|
+
}
|
|
14
|
+
async write(files) {
|
|
15
|
+
const s3 = this.getS3();
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* We need to write each file with retry.
|
|
19
|
+
*/
|
|
20
|
+
const writers = files.map(file => {
|
|
21
|
+
const writer = () => {
|
|
22
|
+
return s3.putObject({
|
|
23
|
+
Bucket: this.bucket,
|
|
24
|
+
Key: `${file.key}.metadata`,
|
|
25
|
+
Body: JSON.stringify(this.getMetadata(file)),
|
|
26
|
+
ContentType: "application/json",
|
|
27
|
+
CacheControl: "max-age=31536000"
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
return (0, _utils.executeWithRetry)(writer);
|
|
31
|
+
});
|
|
32
|
+
await Promise.all(writers);
|
|
33
|
+
}
|
|
34
|
+
getS3() {
|
|
35
|
+
return new _clientS.S3({
|
|
36
|
+
region: process.env.AWS_REGION
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
getMetadata(file) {
|
|
40
|
+
return {
|
|
41
|
+
id: file.id,
|
|
42
|
+
tenant: file.tenant,
|
|
43
|
+
locale: file.locale,
|
|
44
|
+
size: file.size,
|
|
45
|
+
contentType: file.type
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.MetadataWriter = MetadataWriter;
|
|
50
|
+
const addFileMetadata = () => {
|
|
51
|
+
return new _api.ContextPlugin(context => {
|
|
52
|
+
const metadataWriter = new MetadataWriter(String(process.env.S3_BUCKET));
|
|
53
|
+
context.fileManager.onFileAfterCreate.subscribe(({
|
|
54
|
+
file
|
|
55
|
+
}) => {
|
|
56
|
+
return metadataWriter.write([file]);
|
|
57
|
+
});
|
|
58
|
+
context.fileManager.onFileAfterBatchCreate.subscribe(({
|
|
59
|
+
files
|
|
60
|
+
}) => {
|
|
61
|
+
return metadataWriter.write(files);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
exports.addFileMetadata = addFileMetadata;
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=addFileMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_clientS","require","_api","_utils","MetadataWriter","constructor","bucket","write","files","s3","getS3","writers","map","file","writer","putObject","Bucket","Key","key","Body","JSON","stringify","getMetadata","ContentType","CacheControl","executeWithRetry","Promise","all","S3","region","process","env","AWS_REGION","id","tenant","locale","size","contentType","type","exports","addFileMetadata","ContextPlugin","context","metadataWriter","String","S3_BUCKET","fileManager","onFileAfterCreate","subscribe","onFileAfterBatchCreate"],"sources":["addFileMetadata.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport type { FileManagerContext, File } from \"@webiny/api-file-manager/types\";\nimport { executeWithRetry } from \"@webiny/utils\";\n\nexport class MetadataWriter {\n private readonly bucket: string;\n\n constructor(bucket: string) {\n this.bucket = bucket;\n }\n\n async write(files: File[]) {\n const s3 = this.getS3();\n\n /**\n * We need to write each file with retry.\n */\n const writers = files.map(file => {\n const writer = () => {\n return s3.putObject({\n Bucket: this.bucket,\n Key: `${file.key}.metadata`,\n Body: JSON.stringify(this.getMetadata(file)),\n ContentType: \"application/json\",\n CacheControl: \"max-age=31536000\"\n });\n };\n\n return executeWithRetry(writer);\n });\n\n await Promise.all(writers);\n }\n\n private getS3() {\n return new S3({ region: process.env.AWS_REGION });\n }\n\n private getMetadata(file: File) {\n return {\n id: file.id,\n tenant: file.tenant,\n locale: file.locale,\n size: file.size,\n contentType: file.type\n };\n }\n}\n\nexport const addFileMetadata = () => {\n return new ContextPlugin<FileManagerContext>(context => {\n const metadataWriter = new MetadataWriter(String(process.env.S3_BUCKET));\n\n context.fileManager.onFileAfterCreate.subscribe(({ file }) => {\n return metadataWriter.write([file]);\n });\n\n context.fileManager.onFileAfterBatchCreate.subscribe(({ files }) => {\n return metadataWriter.write(files);\n });\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAEO,MAAMG,cAAc,CAAC;EAGxBC,WAAWA,CAACC,MAAc,EAAE;IACxB,IAAI,CAACA,MAAM,GAAGA,MAAM;EACxB;EAEA,MAAMC,KAAKA,CAACC,KAAa,EAAE;IACvB,MAAMC,EAAE,GAAG,IAAI,CAACC,KAAK,CAAC,CAAC;;IAEvB;AACR;AACA;IACQ,MAAMC,OAAO,GAAGH,KAAK,CAACI,GAAG,CAACC,IAAI,IAAI;MAC9B,MAAMC,MAAM,GAAGA,CAAA,KAAM;QACjB,OAAOL,EAAE,CAACM,SAAS,CAAC;UAChBC,MAAM,EAAE,IAAI,CAACV,MAAM;UACnBW,GAAG,EAAE,GAAGJ,IAAI,CAACK,GAAG,WAAW;UAC3BC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC,IAAI,CAACC,WAAW,CAACT,IAAI,CAAC,CAAC;UAC5CU,WAAW,EAAE,kBAAkB;UAC/BC,YAAY,EAAE;QAClB,CAAC,CAAC;MACN,CAAC;MAED,OAAO,IAAAC,uBAAgB,EAACX,MAAM,CAAC;IACnC,CAAC,CAAC;IAEF,MAAMY,OAAO,CAACC,GAAG,CAAChB,OAAO,CAAC;EAC9B;EAEQD,KAAKA,CAAA,EAAG;IACZ,OAAO,IAAIkB,WAAE,CAAC;MAAEC,MAAM,EAAEC,OAAO,CAACC,GAAG,CAACC;IAAW,CAAC,CAAC;EACrD;EAEQV,WAAWA,CAACT,IAAU,EAAE;IAC5B,OAAO;MACHoB,EAAE,EAAEpB,IAAI,CAACoB,EAAE;MACXC,MAAM,EAAErB,IAAI,CAACqB,MAAM;MACnBC,MAAM,EAAEtB,IAAI,CAACsB,MAAM;MACnBC,IAAI,EAAEvB,IAAI,CAACuB,IAAI;MACfC,WAAW,EAAExB,IAAI,CAACyB;IACtB,CAAC;EACL;AACJ;AAACC,OAAA,CAAAnC,cAAA,GAAAA,cAAA;AAEM,MAAMoC,eAAe,GAAGA,CAAA,KAAM;EACjC,OAAO,IAAIC,kBAAa,CAAqBC,OAAO,IAAI;IACpD,MAAMC,cAAc,GAAG,IAAIvC,cAAc,CAACwC,MAAM,CAACd,OAAO,CAACC,GAAG,CAACc,SAAS,CAAC,CAAC;IAExEH,OAAO,CAACI,WAAW,CAACC,iBAAiB,CAACC,SAAS,CAAC,CAAC;MAAEnC;IAAK,CAAC,KAAK;MAC1D,OAAO8B,cAAc,CAACpC,KAAK,CAAC,CAACM,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF6B,OAAO,CAACI,WAAW,CAACG,sBAAsB,CAACD,SAAS,CAAC,CAAC;MAAExC;IAAM,CAAC,KAAK;MAChE,OAAOmC,cAAc,CAACpC,KAAK,CAACC,KAAK,CAAC;IACtC,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAAC+B,OAAA,CAAAC,eAAA,GAAAA,eAAA","ignoreList":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.checkPermissions = void 0;
|
|
7
|
+
var _apiSecurity = require("@webiny/api-security");
|
|
8
|
+
const checkPermissions = async (context, check = {}) => {
|
|
9
|
+
const filePermissions = await context.security.getPermissions("fm.file");
|
|
10
|
+
const relevantFilePermissions = filePermissions.filter(current => {
|
|
11
|
+
if (check.rwd && !hasRwd(current, check.rwd)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
});
|
|
16
|
+
if (relevantFilePermissions.length === 0) {
|
|
17
|
+
throw new _apiSecurity.NotAuthorizedError();
|
|
18
|
+
}
|
|
19
|
+
return relevantFilePermissions;
|
|
20
|
+
};
|
|
21
|
+
exports.checkPermissions = checkPermissions;
|
|
22
|
+
const hasRwd = (filesFilePermissions, rwd) => {
|
|
23
|
+
if (!Array.isArray(filesFilePermissions)) {
|
|
24
|
+
filesFilePermissions = [filesFilePermissions];
|
|
25
|
+
}
|
|
26
|
+
if (!rwd) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.
|
|
31
|
+
const permissionWithoutRwdRestrictions = filesFilePermissions.some(permission => {
|
|
32
|
+
return typeof permission.rwd !== "string";
|
|
33
|
+
});
|
|
34
|
+
if (permissionWithoutRwdRestrictions) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.
|
|
39
|
+
return filesFilePermissions.some(permission => {
|
|
40
|
+
return permission.rwd && permission.rwd.includes(rwd);
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=checkPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_apiSecurity","require","checkPermissions","context","check","filePermissions","security","getPermissions","relevantFilePermissions","filter","current","rwd","hasRwd","length","NotAuthorizedError","exports","filesFilePermissions","Array","isArray","permissionWithoutRwdRestrictions","some","permission","includes"],"sources":["checkPermissions.ts"],"sourcesContent":["import type { FileManagerContext, FilePermission } from \"@webiny/api-file-manager/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nexport const checkPermissions = async (\n context: FileManagerContext,\n check: { rwd?: string } = {}\n) => {\n const filePermissions = await context.security.getPermissions<FilePermission>(\"fm.file\");\n\n const relevantFilePermissions = filePermissions.filter(current => {\n if (check.rwd && !hasRwd(current, check.rwd)) {\n return false;\n }\n\n return true;\n });\n\n if (relevantFilePermissions.length === 0) {\n throw new NotAuthorizedError();\n }\n\n return relevantFilePermissions;\n};\n\nconst hasRwd = (filesFilePermissions: FilePermission | FilePermission[], rwd: string): boolean => {\n if (!Array.isArray(filesFilePermissions)) {\n filesFilePermissions = [filesFilePermissions];\n }\n\n if (!rwd) {\n return true;\n }\n\n // Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.\n const permissionWithoutRwdRestrictions = filesFilePermissions.some(permission => {\n return typeof permission.rwd !== \"string\";\n });\n\n if (permissionWithoutRwdRestrictions) {\n return true;\n }\n\n // If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.\n return filesFilePermissions.some(permission => {\n return permission.rwd && permission.rwd.includes(rwd);\n });\n};\n"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAEO,MAAMC,gBAAgB,GAAG,MAAAA,CAC5BC,OAA2B,EAC3BC,KAAuB,GAAG,CAAC,CAAC,KAC3B;EACD,MAAMC,eAAe,GAAG,MAAMF,OAAO,CAACG,QAAQ,CAACC,cAAc,CAAiB,SAAS,CAAC;EAExF,MAAMC,uBAAuB,GAAGH,eAAe,CAACI,MAAM,CAACC,OAAO,IAAI;IAC9D,IAAIN,KAAK,CAACO,GAAG,IAAI,CAACC,MAAM,CAACF,OAAO,EAAEN,KAAK,CAACO,GAAG,CAAC,EAAE;MAC1C,OAAO,KAAK;IAChB;IAEA,OAAO,IAAI;EACf,CAAC,CAAC;EAEF,IAAIH,uBAAuB,CAACK,MAAM,KAAK,CAAC,EAAE;IACtC,MAAM,IAAIC,+BAAkB,CAAC,CAAC;EAClC;EAEA,OAAON,uBAAuB;AAClC,CAAC;AAACO,OAAA,CAAAb,gBAAA,GAAAA,gBAAA;AAEF,MAAMU,MAAM,GAAGA,CAACI,oBAAuD,EAAEL,GAAW,KAAc;EAC9F,IAAI,CAACM,KAAK,CAACC,OAAO,CAACF,oBAAoB,CAAC,EAAE;IACtCA,oBAAoB,GAAG,CAACA,oBAAoB,CAAC;EACjD;EAEA,IAAI,CAACL,GAAG,EAAE;IACN,OAAO,IAAI;EACf;;EAEA;EACA,MAAMQ,gCAAgC,GAAGH,oBAAoB,CAACI,IAAI,CAACC,UAAU,IAAI;IAC7E,OAAO,OAAOA,UAAU,CAACV,GAAG,KAAK,QAAQ;EAC7C,CAAC,CAAC;EAEF,IAAIQ,gCAAgC,EAAE;IAClC,OAAO,IAAI;EACf;;EAEA;EACA,OAAOH,oBAAoB,CAACI,IAAI,CAACC,UAAU,IAAI;IAC3C,OAAOA,UAAU,CAACV,GAAG,IAAIU,UAAU,CAACV,GAAG,CAACW,QAAQ,CAACX,GAAG,CAAC;EACzD,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
declare const _default: () =>
|
|
1
|
+
import { ContextPlugin } from "@webiny/api";
|
|
2
|
+
declare const _default: () => ContextPlugin<import("@webiny/api/types").Context>;
|
|
3
3
|
export default _default;
|
package/plugins/fileStorageS3.js
CHANGED
|
@@ -1,59 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
|
|
13
|
-
|
|
14
|
-
var _getPresignedPostPayload = _interopRequireDefault(require("../utils/getPresignedPostPayload"));
|
|
15
|
-
|
|
8
|
+
var _clientS = require("@webiny/aws-sdk/client-s3");
|
|
9
|
+
var _FilePhysicalStoragePlugin = require("@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin");
|
|
10
|
+
var _getPresignedPostPayload = require("../utils/getPresignedPostPayload");
|
|
16
11
|
var _uploadFileToS = _interopRequireDefault(require("../utils/uploadFileToS3"));
|
|
17
|
-
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
const _excluded = ["settings", "buffer"];
|
|
12
|
+
var _api = require("@webiny/api");
|
|
13
|
+
var _createFileNormalizerFromContext = require("../utils/createFileNormalizerFromContext");
|
|
21
14
|
const S3_BUCKET = process.env.S3_BUCKET;
|
|
22
|
-
|
|
23
15
|
var _default = () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
16
|
+
/**
|
|
17
|
+
* We need to extend the type for FilePhysicalStoragePlugin.
|
|
18
|
+
* Otherwise, the `getPresignedPostPayload` doesn't know it has all required values in params.
|
|
19
|
+
*/
|
|
20
|
+
return new _api.ContextPlugin(context => {
|
|
21
|
+
context.plugins.register(new _FilePhysicalStoragePlugin.FilePhysicalStoragePlugin({
|
|
22
|
+
upload: async params => {
|
|
23
|
+
const {
|
|
24
|
+
settings,
|
|
25
|
+
buffer,
|
|
26
|
+
...data
|
|
27
|
+
} = params;
|
|
28
|
+
const normalizer = (0, _createFileNormalizerFromContext.createFileNormalizerFromContext)(context);
|
|
29
|
+
const {
|
|
30
|
+
data: preSignedPostPayload,
|
|
31
|
+
file
|
|
32
|
+
} = await (0, _getPresignedPostPayload.getPresignedPostPayload)(await normalizer.normalizeFile(data), settings);
|
|
33
|
+
const response = await (0, _uploadFileToS.default)(buffer, preSignedPostPayload);
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
throw Error("Unable to upload file.");
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
data: preSignedPostPayload,
|
|
39
|
+
file
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
delete: async params => {
|
|
43
|
+
const {
|
|
44
|
+
key
|
|
45
|
+
} = params;
|
|
46
|
+
const s3 = new _clientS.S3();
|
|
47
|
+
if (!key || !S3_BUCKET) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
await s3.deleteObject({
|
|
51
|
+
Bucket: S3_BUCKET,
|
|
52
|
+
Key: key
|
|
53
|
+
});
|
|
39
54
|
}
|
|
40
|
-
|
|
41
|
-
return {
|
|
42
|
-
data: preSignedPostPayload,
|
|
43
|
-
file
|
|
44
|
-
};
|
|
45
|
-
},
|
|
46
|
-
delete: async args => {
|
|
47
|
-
const {
|
|
48
|
-
key
|
|
49
|
-
} = args;
|
|
50
|
-
const s3 = new _s.default();
|
|
51
|
-
await s3.deleteObject({
|
|
52
|
-
Bucket: S3_BUCKET,
|
|
53
|
-
Key: key
|
|
54
|
-
}).promise();
|
|
55
|
-
}
|
|
55
|
+
}));
|
|
56
56
|
});
|
|
57
57
|
};
|
|
58
|
+
exports.default = _default;
|
|
58
59
|
|
|
59
|
-
|
|
60
|
+
//# sourceMappingURL=fileStorageS3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_clientS","require","_FilePhysicalStoragePlugin","_getPresignedPostPayload","_uploadFileToS","_interopRequireDefault","_api","_createFileNormalizerFromContext","S3_BUCKET","process","env","_default","ContextPlugin","context","plugins","register","FilePhysicalStoragePlugin","upload","params","settings","buffer","data","normalizer","createFileNormalizerFromContext","preSignedPostPayload","file","getPresignedPostPayload","normalizeFile","response","uploadFileToS3","ok","Error","delete","key","s3","S3","deleteObject","Bucket","Key","exports","default"],"sources":["fileStorageS3.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport { FilePhysicalStoragePlugin } from \"@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload\";\nimport uploadFileToS3 from \"../utils/uploadFileToS3\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { createFileNormalizerFromContext } from \"~/utils/createFileNormalizerFromContext\";\nimport type { PresignedPostPayloadData } from \"~/types\";\n\nconst S3_BUCKET = process.env.S3_BUCKET;\n\nexport default () => {\n /**\n * We need to extend the type for FilePhysicalStoragePlugin.\n * Otherwise, the `getPresignedPostPayload` doesn't know it has all required values in params.\n */\n return new ContextPlugin(context => {\n context.plugins.register(\n new FilePhysicalStoragePlugin({\n upload: async params => {\n const { settings, buffer, ...data } = params;\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const { data: preSignedPostPayload, file } = await getPresignedPostPayload(\n await normalizer.normalizeFile(data as PresignedPostPayloadData),\n settings\n );\n\n const response = await uploadFileToS3(buffer, preSignedPostPayload);\n if (!response.ok) {\n throw Error(\"Unable to upload file.\");\n }\n\n return {\n data: preSignedPostPayload,\n file\n };\n },\n delete: async params => {\n const { key } = params;\n const s3 = new S3();\n\n if (!key || !S3_BUCKET) {\n return;\n }\n\n await s3.deleteObject({\n Bucket: S3_BUCKET,\n Key: key\n });\n }\n })\n );\n });\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,0BAAA,GAAAD,OAAA;AACA,IAAAE,wBAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAC,sBAAA,CAAAJ,OAAA;AACA,IAAAK,IAAA,GAAAL,OAAA;AACA,IAAAM,gCAAA,GAAAN,OAAA;AAGA,MAAMO,SAAS,GAAGC,OAAO,CAACC,GAAG,CAACF,SAAS;AAAC,IAAAG,QAAA,GAEzBA,CAAA,KAAM;EACjB;AACJ;AACA;AACA;EACI,OAAO,IAAIC,kBAAa,CAACC,OAAO,IAAI;IAChCA,OAAO,CAACC,OAAO,CAACC,QAAQ,CACpB,IAAIC,oDAAyB,CAAC;MAC1BC,MAAM,EAAE,MAAMC,MAAM,IAAI;QACpB,MAAM;UAAEC,QAAQ;UAAEC,MAAM;UAAE,GAAGC;QAAK,CAAC,GAAGH,MAAM;QAE5C,MAAMI,UAAU,GAAG,IAAAC,gEAA+B,EAACV,OAAO,CAAC;QAE3D,MAAM;UAAEQ,IAAI,EAAEG,oBAAoB;UAAEC;QAAK,CAAC,GAAG,MAAM,IAAAC,gDAAuB,EACtE,MAAMJ,UAAU,CAACK,aAAa,CAACN,IAAgC,CAAC,EAChEF,QACJ,CAAC;QAED,MAAMS,QAAQ,GAAG,MAAM,IAAAC,sBAAc,EAACT,MAAM,EAAEI,oBAAoB,CAAC;QACnE,IAAI,CAACI,QAAQ,CAACE,EAAE,EAAE;UACd,MAAMC,KAAK,CAAC,wBAAwB,CAAC;QACzC;QAEA,OAAO;UACHV,IAAI,EAAEG,oBAAoB;UAC1BC;QACJ,CAAC;MACL,CAAC;MACDO,MAAM,EAAE,MAAMd,MAAM,IAAI;QACpB,MAAM;UAAEe;QAAI,CAAC,GAAGf,MAAM;QACtB,MAAMgB,EAAE,GAAG,IAAIC,WAAE,CAAC,CAAC;QAEnB,IAAI,CAACF,GAAG,IAAI,CAACzB,SAAS,EAAE;UACpB;QACJ;QAEA,MAAM0B,EAAE,CAACE,YAAY,CAAC;UAClBC,MAAM,EAAE7B,SAAS;UACjB8B,GAAG,EAAEL;QACT,CAAC,CAAC;MACN;IACJ,CAAC,CACL,CAAC;EACL,CAAC,CAAC;AACN,CAAC;AAAAM,OAAA,CAAAC,OAAA,GAAA7B,QAAA","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GraphQLSchemaPlugin } from "@webiny/handler-graphql/types";
|
|
2
|
-
import { FileManagerContext } from "@webiny/api-file-manager/types";
|
|
1
|
+
import type { GraphQLSchemaPlugin } from "@webiny/handler-graphql/types";
|
|
2
|
+
import type { FileManagerContext } from "@webiny/api-file-manager/types";
|
|
3
3
|
declare const plugin: GraphQLSchemaPlugin<FileManagerContext>;
|
|
4
4
|
export default plugin;
|