@contember/engine-s3-plugin 1.2.1 → 1.3.0-alpha.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/Config.d.ts +2 -3
- package/dist/src/Config.d.ts.map +1 -1
- package/dist/src/Config.js.map +1 -1
- package/dist/src/S3ConfigProcessor.d.ts +2 -2
- package/dist/src/S3ConfigProcessor.d.ts.map +1 -1
- package/dist/src/S3ConfigProcessor.js.map +1 -1
- package/dist/src/S3ObjectAuthorizator.d.ts +22 -0
- package/dist/src/S3ObjectAuthorizator.d.ts.map +1 -0
- package/dist/src/S3ObjectAuthorizator.js +48 -0
- package/dist/src/S3ObjectAuthorizator.js.map +1 -0
- package/dist/src/S3SchemaContributor.d.ts +10 -5
- package/dist/src/S3SchemaContributor.d.ts.map +1 -1
- package/dist/src/S3SchemaContributor.js +61 -90
- package/dist/src/S3SchemaContributor.js.map +1 -1
- package/dist/src/S3SchemaTypes.d.ts +21 -0
- package/dist/src/S3SchemaTypes.d.ts.map +1 -0
- package/dist/src/S3SchemaTypes.js +65 -0
- package/dist/src/S3SchemaTypes.js.map +1 -0
- package/dist/src/S3Service.d.ts +10 -10
- package/dist/src/S3Service.d.ts.map +1 -1
- package/dist/src/S3Service.js +40 -37
- package/dist/src/S3Service.js.map +1 -1
- package/dist/src/S3Signer.d.ts +1 -1
- package/dist/src/S3Signer.d.ts.map +1 -1
- package/dist/src/S3Signer.js +1 -1
- package/dist/src/S3Signer.js.map +1 -1
- package/dist/src/index.d.ts +6 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/tests/cases/authorizator.test.d.ts +2 -0
- package/dist/tests/cases/authorizator.test.d.ts.map +1 -0
- package/dist/tests/cases/authorizator.test.js +21 -0
- package/dist/tests/cases/authorizator.test.js.map +1 -0
- package/dist/tests/cases/signRequest.test.js +14 -5
- package/dist/tests/cases/signRequest.test.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -5
- package/src/Config.ts +1 -2
- package/src/S3ConfigProcessor.ts +2 -2
- package/src/S3ObjectAuthorizator.ts +63 -0
- package/src/S3SchemaContributor.ts +50 -114
- package/src/S3SchemaTypes.ts +89 -0
- package/src/S3Service.ts +51 -43
- package/src/S3Signer.ts +2 -2
- package/src/index.ts +9 -7
- package/src/tsconfig.json +3 -9
- package/tests/cases/authorizator.test.ts +22 -0
- package/tests/cases/signRequest.test.ts +18 -18
- package/tests/tsconfig.json +1 -3
- package/tsconfig.json +2 -6
- package/dist/src/ObjectKeyVerifier.d.ts +0 -3
- package/dist/src/ObjectKeyVerifier.d.ts.map +0 -1
- package/dist/src/ObjectKeyVerifier.js +0 -18
- package/dist/src/ObjectKeyVerifier.js.map +0 -1
- package/src/ObjectKeyVerifier.ts +0 -14
- package/types/sign3/index.d.ts +0 -8
package/dist/src/Config.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ProjectConfig } from '@contember/engine-plugins';
|
|
2
1
|
import * as Typesafe from '@contember/typesafe';
|
|
3
2
|
export declare enum S3Providers {
|
|
4
3
|
aws = "aws",
|
|
@@ -22,9 +21,9 @@ export declare const s3ConfigSchema: Typesafe.Type<{
|
|
|
22
21
|
readonly noAcl?: boolean | undefined;
|
|
23
22
|
}>;
|
|
24
23
|
export declare type S3Config = ReturnType<typeof s3ConfigSchema>;
|
|
25
|
-
export declare type
|
|
24
|
+
export declare type Project3Config = {
|
|
26
25
|
s3?: S3Config;
|
|
27
|
-
}
|
|
26
|
+
};
|
|
28
27
|
export declare const resolveS3Config: (config: S3Config) => S3Config;
|
|
29
28
|
export declare const resolveS3Endpoint: (config: S3Config) => {
|
|
30
29
|
endpoint: string;
|
package/dist/src/Config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAE/C,oBAAY,WAAW;IACtB,GAAG,QAAQ;IACX,KAAK,UAAU;IACf,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,WAAW,gBAAgB;CAC3B;AAGD,eAAO,MAAM,cAAc;;;;;;;;;;;;;EAgB1B,CAAA;AAED,oBAAY,QAAQ,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAExD,oBAAY,cAAc,GAAG;IAAE,EAAE,CAAC,EAAE,QAAQ,CAAA;CAAE,CAAA;AAK9C,eAAO,MAAM,eAAe,WAAY,QAAQ,KAAG,QAKlD,CAAA;AAID,eAAO,MAAM,iBAAiB,WACrB,QAAQ;cAEN,MAAM;cACN,MAAM;CAOhB,CAAA;AAED,eAAO,MAAM,sBAAsB,WAAY,QAAQ,KAAG,MAMzD,CAAA"}
|
package/dist/src/Config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/Config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAA+C;AAE/C,IAAY,WAMX;AAND,WAAY,WAAW;IACtB,0BAAW,CAAA;IACX,8BAAe,CAAA;IACf,4BAAa,CAAA;IACb,wCAAyB,CAAA;IACzB,0CAA2B,CAAA;AAC5B,CAAC,EANW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAMtB;AAGY,QAAA,cAAc,GAAG,QAAQ,CAAC,YAAY,CAClD,QAAQ,CAAC,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC;QAC5B,GAAG,EAAE,QAAQ,CAAC,MAAM;QACpB,MAAM,EAAE,QAAQ,CAAC,MAAM;KACvB,CAAC;CACF,CAAC,EACF,QAAQ,CAAC,OAAO,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC,MAAM;IACzB,WAAW,EAAE,QAAQ,CAAC,MAAM;IAC5B,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,WAAW,CAAC;IACrI,KAAK,EAAE,QAAQ,CAAC,OAAO;CACvB,CAAC,CACF,CAAA;AAMD,OAAO;AACP,MAAM,wBAAwB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;AAE7C,MAAM,eAAe,GAAG,CAAC,MAAgB,EAAY,EAAE;IAC7D,OAAO;QACN,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,wBAAwB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9E,GAAG,MAAM;KACT,CAAA;AACF,CAAC,CAAA;AALY,QAAA,eAAe,mBAK3B;AAED,MAAM,aAAa,GAAG,WAAW,CAAA;AAE1B,MAAM,iBAAiB,GAAG,CAChC,MAAgB,EAIf,EAAE;IACH,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,WAAW,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,IAAI,aAAa,gBAAgB,CAAA;IAC3I,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAEzD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;AAC9B,CAAC,CAAA;AAXY,QAAA,iBAAiB,qBAW7B;AAEM,MAAM,sBAAsB,GAAG,CAAC,MAAgB,EAAU,EAAE;IAClE,IAAI,MAAM,CAAC,WAAW,EAAE;QACvB,OAAO,MAAM,CAAC,WAAW,CAAA;KACzB;IACD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAA;IACxD,OAAO,QAAQ,GAAG,QAAQ,CAAA;AAC3B,CAAC,CAAA;AANY,QAAA,sBAAsB,0BAMlC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ConfigProcessor, ConfigTemplate, ConfigTemplateContext } from '@contember/engine-plugins';
|
|
2
|
-
import {
|
|
2
|
+
import { Project3Config } from './Config';
|
|
3
3
|
import * as Typesafe from '@contember/typesafe';
|
|
4
|
-
export declare class S3ConfigProcessor implements ConfigProcessor<
|
|
4
|
+
export declare class S3ConfigProcessor implements ConfigProcessor<Project3Config> {
|
|
5
5
|
getDefaultEnv(): Record<string, string>;
|
|
6
6
|
prepareConfigTemplate(template: ConfigTemplate, { env }: ConfigTemplateContext): any;
|
|
7
7
|
getProjectConfigSchema(slug: string): Typesafe.Type<Record<string, any>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3ConfigProcessor.d.ts","sourceRoot":"","sources":["../../src/S3ConfigProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAClG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"S3ConfigProcessor.d.ts","sourceRoot":"","sources":["../../src/S3ConfigProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAClG,OAAO,EAAE,cAAc,EAAkB,MAAM,UAAU,CAAA;AACzD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAA;AAE/C,qBAAa,iBAAkB,YAAW,eAAe,CAAC,cAAc,CAAC;IACxE,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQvC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,EAAE,qBAAqB;IAqB9E,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CASxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3ConfigProcessor.js","sourceRoot":"","sources":["../../src/S3ConfigProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,
|
|
1
|
+
{"version":3,"file":"S3ConfigProcessor.js","sourceRoot":"","sources":["../../src/S3ConfigProcessor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,qCAAyD;AACzD,8DAA+C;AAE/C,MAAa,iBAAiB;IAC7B,aAAa;QACZ,OAAO;YACN,mBAAmB,EAAE,EAAE;YACvB,iBAAiB,EAAE,WAAW;YAC9B,mBAAmB,EAAE,KAAK;SAC1B,CAAA;IACF,CAAC;IAED,qBAAqB,CAAC,QAAwB,EAAE,EAAE,GAAG,EAAyB;QAC7E,OAAO;YACN,GAAG,QAAQ;YACX,eAAe,EAAE;gBAChB,GAAG,QAAQ,CAAC,eAAe;gBAC3B,EAAE,EAAE;oBACH,MAAM,EAAE,0BAA0B;oBAClC,MAAM,EAAE,wCAAwC;oBAChD,MAAM,EAAE,yBAAyB;oBACjC,QAAQ,EAAE,2BAA2B;oBACrC,WAAW,EAAE,uBAAuB;oBACpC,QAAQ,EAAE,2BAA2B;oBACrC,WAAW,EAAE;wBACZ,GAAG,EAAE,8CAA8C;wBACnD,MAAM,EAAE,oDAAoD;qBAC5D;iBACD;aACD;SACD,CAAA;IACF,CAAC;IAED,sBAAsB,CAAC,IAAY;QAClC,OAAO,QAAQ,CAAC,KAAK,CACpB,CAAC,KAAc,EAAE,OAAsB,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAC5I,QAAQ,CAAC,MAAM,CAAC;YACf,EAAE,EAAE,uBAAc;SAClB,CAAC,CACF,CAAA;IACF,CAAC;CAED;AAvCD,8CAuCC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare type S3ObjectUploadRule = {
|
|
2
|
+
pattern: string;
|
|
3
|
+
maxSize?: number;
|
|
4
|
+
matcher?: (key: string) => boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare type S3ObjectReadRule = {
|
|
7
|
+
pattern: string;
|
|
8
|
+
matcher?: (key: string) => boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare class S3ObjectAuthorizator {
|
|
11
|
+
private readonly uploadRules;
|
|
12
|
+
private readonly readRules;
|
|
13
|
+
constructor(uploadRules: Omit<S3ObjectUploadRule, 'matcher'>[], readRules: Omit<S3ObjectReadRule, 'matcher'>[]);
|
|
14
|
+
verifyReadAccess({ key }: {
|
|
15
|
+
key: string;
|
|
16
|
+
}): void;
|
|
17
|
+
verifyUploadAccess({ key, size }: {
|
|
18
|
+
key: string;
|
|
19
|
+
size: number | null;
|
|
20
|
+
}): void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=S3ObjectAuthorizator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"S3ObjectAuthorizator.d.ts","sourceRoot":"","sources":["../../src/S3ObjectAuthorizator.ts"],"names":[],"mappings":"AAGA,oBAAY,kBAAkB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAClC,CAAA;AAED,oBAAY,gBAAgB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAClC,CAAA;AAED,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;gBAG7C,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAAE,EAClD,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAAE;IAMxC,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAYhD,kBAAkB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI;CAwBpF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.S3ObjectAuthorizator = void 0;
|
|
7
|
+
const picomatch_1 = __importDefault(require("picomatch"));
|
|
8
|
+
const graphql_utils_1 = require("@contember/graphql-utils");
|
|
9
|
+
class S3ObjectAuthorizator {
|
|
10
|
+
constructor(uploadRules, readRules) {
|
|
11
|
+
this.uploadRules = uploadRules;
|
|
12
|
+
this.readRules = readRules;
|
|
13
|
+
}
|
|
14
|
+
verifyReadAccess({ key }) {
|
|
15
|
+
var _a;
|
|
16
|
+
for (const rule of this.readRules) {
|
|
17
|
+
(_a = rule.matcher) !== null && _a !== void 0 ? _a : (rule.matcher = (0, picomatch_1.default)(rule.pattern));
|
|
18
|
+
if (rule.matcher(key)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
throw new graphql_utils_1.ForbiddenError(`Read access forbidden for object key ${key}`);
|
|
23
|
+
}
|
|
24
|
+
verifyUploadAccess({ key, size }) {
|
|
25
|
+
var _a;
|
|
26
|
+
const matchedPatterns = [];
|
|
27
|
+
for (const rule of this.uploadRules) {
|
|
28
|
+
(_a = rule.matcher) !== null && _a !== void 0 ? _a : (rule.matcher = (0, picomatch_1.default)(rule.pattern));
|
|
29
|
+
if (rule.matcher(key)) {
|
|
30
|
+
if (!rule.maxSize || (size !== null && size <= rule.maxSize)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
matchedPatterns.push(rule);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (matchedPatterns.length > 0) {
|
|
37
|
+
if (size === null) {
|
|
38
|
+
throw new graphql_utils_1.ForbiddenError('File size must be provided');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
throw new graphql_utils_1.ForbiddenError('Uploaded file is too large');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
throw new graphql_utils_1.ForbiddenError(`Upload access forbidden for object key ${key}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.S3ObjectAuthorizator = S3ObjectAuthorizator;
|
|
48
|
+
//# sourceMappingURL=S3ObjectAuthorizator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"S3ObjectAuthorizator.js","sourceRoot":"","sources":["../../src/S3ObjectAuthorizator.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA0B;AAC1B,4DAAyD;AAazD,MAAa,oBAAoB;IAIhC,YACC,WAAkD,EAClD,SAA8C;QAE9C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC3B,CAAC;IAEM,gBAAgB,CAAC,EAAE,GAAG,EAAmB;;QAC/C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;YAClC,MAAA,IAAI,CAAC,OAAO,oCAAZ,IAAI,CAAC,OAAO,GAAK,IAAA,mBAAE,EAAC,IAAI,CAAC,OAAO,CAAC,EAAA;YAEjC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACtB,OAAM;aACN;SACD;QAED,MAAM,IAAI,8BAAc,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAA;IACxE,CAAC;IAEM,kBAAkB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAwC;;QAC5E,MAAM,eAAe,GAAyB,EAAE,CAAA;QAEhD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;YACpC,MAAA,IAAI,CAAC,OAAO,oCAAZ,IAAI,CAAC,OAAO,GAAK,IAAA,mBAAE,EAAC,IAAI,CAAC,OAAO,CAAC,EAAA;YAEjC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACtB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE;oBAC7D,OAAM;iBACN;gBACD,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;aAC1B;SACD;QAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,IAAI,IAAI,KAAK,IAAI,EAAE;gBAClB,MAAM,IAAI,8BAAc,CAAC,4BAA4B,CAAC,CAAA;aACtD;iBAAM;gBACN,MAAM,IAAI,8BAAc,CAAC,4BAA4B,CAAC,CAAA;aACtD;SACD;QAED,MAAM,IAAI,8BAAc,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAA;IAC1E,CAAC;CACD;AAhDD,oDAgDC"}
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { GraphQLSchema } from 'graphql';
|
|
2
2
|
import { S3ServiceFactory } from './S3Service';
|
|
3
3
|
import { S3Config } from './Config';
|
|
4
|
-
import { GraphQLSchemaContributor,
|
|
5
|
-
|
|
4
|
+
import { GraphQLSchemaContributor, Providers, GraphQLSchemaContributorContext } from '@contember/engine-plugins';
|
|
5
|
+
export declare type S3SchemaUploadAcl = boolean | {
|
|
6
|
+
maxSize?: number;
|
|
7
|
+
};
|
|
8
|
+
export declare type S3SchemaAcl = Record<string, // public/*.jpg
|
|
9
|
+
{
|
|
10
|
+
read?: boolean;
|
|
11
|
+
upload?: S3SchemaUploadAcl;
|
|
12
|
+
}>;
|
|
6
13
|
export declare class S3SchemaContributor implements GraphQLSchemaContributor {
|
|
7
14
|
private readonly s3Config;
|
|
8
15
|
private readonly s3Factory;
|
|
9
16
|
private readonly providers;
|
|
10
|
-
private s3HeadersType;
|
|
11
17
|
constructor(s3Config: S3Config | undefined, s3Factory: S3ServiceFactory, providers: Providers);
|
|
12
|
-
|
|
13
|
-
createSchema(context: SchemaContext): GraphQLSchema | undefined;
|
|
18
|
+
createSchema(context: GraphQLSchemaContributorContext): GraphQLSchema | undefined;
|
|
14
19
|
private createReadMutation;
|
|
15
20
|
private createUploadMutation;
|
|
16
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3SchemaContributor.d.ts","sourceRoot":"","sources":["../../src/S3SchemaContributor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"S3SchemaContributor.d.ts","sourceRoot":"","sources":["../../src/S3SchemaContributor.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,aAAa,EAEb,MAAM,SAAS,CAAA;AAChB,OAAO,EAAa,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAmB,QAAQ,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAA;AAShH,oBAAY,iBAAiB,GAC1B,OAAO,GACP;IACD,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAEF,oBAAY,WAAW,GAAG,MAAM,CAC/B,MAAM,EAAE,eAAe;AACvB;IACC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC1B,CACD,CAAA;AAGD,qBAAa,mBAAoB,YAAW,wBAAwB;IAElE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,SAAS;IAGtC,YAAY,CAAC,OAAO,EAAE,+BAA+B,GAAG,aAAa,GAAG,SAAS;IA8CjF,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,oBAAoB;CA4B5B"}
|
|
@@ -1,44 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
26
|
exports.S3SchemaContributor = void 0;
|
|
4
27
|
const graphql_1 = require("graphql");
|
|
5
|
-
const S3Service_1 = require("./S3Service");
|
|
6
28
|
const Config_1 = require("./Config");
|
|
7
|
-
const
|
|
29
|
+
const types = __importStar(require("./S3SchemaTypes"));
|
|
30
|
+
const S3SchemaTypes_1 = require("./S3SchemaTypes");
|
|
31
|
+
const S3ObjectAuthorizator_1 = require("./S3ObjectAuthorizator");
|
|
8
32
|
class S3SchemaContributor {
|
|
9
33
|
constructor(s3Config, s3Factory, providers) {
|
|
10
34
|
this.s3Config = s3Config;
|
|
11
35
|
this.s3Factory = s3Factory;
|
|
12
36
|
this.providers = providers;
|
|
13
|
-
this.s3HeadersType = {
|
|
14
|
-
type: new graphql_1.GraphQLNonNull(new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(new graphql_1.GraphQLObjectType({
|
|
15
|
-
name: 'S3Header',
|
|
16
|
-
fields: {
|
|
17
|
-
key: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
18
|
-
value: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
19
|
-
},
|
|
20
|
-
})))),
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
getCacheKey(context) {
|
|
24
|
-
const roles = context.identity.projectRoles;
|
|
25
|
-
roles.sort();
|
|
26
|
-
return roles.join('||');
|
|
27
37
|
}
|
|
28
38
|
createSchema(context) {
|
|
29
39
|
if (!this.s3Config) {
|
|
30
40
|
return undefined;
|
|
31
41
|
}
|
|
32
42
|
const rules = context.identity.projectRoles.flatMap(it => { var _a; return Object.entries(((_a = context.schema.acl.roles[it]) === null || _a === void 0 ? void 0 : _a.s3) || {}); });
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
43
|
+
const uploadRules = rules.filter(([, it]) => it.upload).map(([it, val]) => ({
|
|
44
|
+
pattern: it,
|
|
45
|
+
...(typeof val.upload !== 'boolean' ? val.upload : {}),
|
|
46
|
+
}));
|
|
47
|
+
const readRules = rules.filter(([, it]) => it.read).map(([it]) => ({
|
|
48
|
+
pattern: it,
|
|
49
|
+
}));
|
|
50
|
+
if (uploadRules.length === 0 && readRules.length == 0) {
|
|
36
51
|
return undefined;
|
|
37
52
|
}
|
|
38
53
|
const s3Config = (0, Config_1.resolveS3Config)(this.s3Config);
|
|
39
|
-
const
|
|
40
|
-
const
|
|
41
|
-
const
|
|
54
|
+
const authorizator = new S3ObjectAuthorizator_1.S3ObjectAuthorizator(uploadRules, readRules);
|
|
55
|
+
const s3 = this.s3Factory.create(s3Config, this.providers, authorizator);
|
|
56
|
+
const uploadMutation = this.createUploadMutation(s3);
|
|
57
|
+
const readMutation = this.createReadMutation(s3);
|
|
42
58
|
const mutation = {
|
|
43
59
|
generateUploadUrl: uploadMutation,
|
|
44
60
|
generateReadUrl: readMutation,
|
|
@@ -58,22 +74,9 @@ class S3SchemaContributor {
|
|
|
58
74
|
}),
|
|
59
75
|
});
|
|
60
76
|
}
|
|
61
|
-
createReadMutation(s3
|
|
62
|
-
let verifier;
|
|
77
|
+
createReadMutation(s3) {
|
|
63
78
|
return {
|
|
64
|
-
type: new graphql_1.GraphQLNonNull(
|
|
65
|
-
name: 'S3SignedRead',
|
|
66
|
-
fields: {
|
|
67
|
-
url: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
68
|
-
headers: this.s3HeadersType,
|
|
69
|
-
method: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
70
|
-
objectKey: {
|
|
71
|
-
type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString),
|
|
72
|
-
description: `Allowed patterns:\n${allowedKeyPatterns.join('\n')}`,
|
|
73
|
-
},
|
|
74
|
-
bucket: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
75
|
-
},
|
|
76
|
-
})),
|
|
79
|
+
type: new graphql_1.GraphQLNonNull(S3SchemaTypes_1.S3SignedRead),
|
|
77
80
|
args: {
|
|
78
81
|
objectKey: {
|
|
79
82
|
type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString),
|
|
@@ -83,66 +86,34 @@ class S3SchemaContributor {
|
|
|
83
86
|
},
|
|
84
87
|
},
|
|
85
88
|
resolve: async (parent, args) => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
return s3.getSignedReadUrl(args.objectKey, verifier, args.expiration);
|
|
89
|
+
var _a;
|
|
90
|
+
return s3.getSignedReadUrl({ objectKey: args.objectKey, expiration: (_a = args.expiration) !== null && _a !== void 0 ? _a : null });
|
|
90
91
|
},
|
|
91
92
|
};
|
|
92
93
|
}
|
|
93
|
-
createUploadMutation(
|
|
94
|
-
let verifier;
|
|
94
|
+
createUploadMutation(s3) {
|
|
95
95
|
return {
|
|
96
|
-
type: new graphql_1.GraphQLNonNull(
|
|
97
|
-
name: 'S3SignedUpload',
|
|
98
|
-
fields: {
|
|
99
|
-
url: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
100
|
-
headers: this.s3HeadersType,
|
|
101
|
-
method: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
102
|
-
objectKey: {
|
|
103
|
-
type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString),
|
|
104
|
-
description: `Allowed patterns:\n${allowedKeyPatterns.join('\n')}`,
|
|
105
|
-
},
|
|
106
|
-
bucket: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
107
|
-
publicUrl: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
108
|
-
},
|
|
109
|
-
})),
|
|
96
|
+
type: new graphql_1.GraphQLNonNull(S3SchemaTypes_1.S3SignedUpload),
|
|
110
97
|
args: {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
},
|
|
117
|
-
prefix: {
|
|
118
|
-
type: graphql_1.GraphQLString,
|
|
119
|
-
},
|
|
120
|
-
...(s3Config.noAcl
|
|
121
|
-
? {}
|
|
122
|
-
: {
|
|
123
|
-
acl: {
|
|
124
|
-
type: new graphql_1.GraphQLEnumType({
|
|
125
|
-
name: 'S3Acl',
|
|
126
|
-
values: {
|
|
127
|
-
PUBLIC_READ: {},
|
|
128
|
-
PRIVATE: {},
|
|
129
|
-
NONE: {},
|
|
130
|
-
},
|
|
131
|
-
}),
|
|
132
|
-
},
|
|
133
|
-
}),
|
|
98
|
+
input: { type: types.S3GenerateSignedUploadInput },
|
|
99
|
+
contentType: { type: graphql_1.GraphQLString, deprecationReason: 'Use input.contentType' },
|
|
100
|
+
expiration: { type: graphql_1.GraphQLInt, deprecationReason: 'Use input.expiration' },
|
|
101
|
+
prefix: { type: graphql_1.GraphQLString, deprecationReason: 'Use input.prefix' },
|
|
102
|
+
acl: { type: types.S3Acl, deprecationReason: 'Use input.acl' },
|
|
134
103
|
},
|
|
135
104
|
resolve: async (parent, args) => {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
105
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;
|
|
106
|
+
return s3.getSignedUploadUrl({
|
|
107
|
+
acl: (_c = (_b = (_a = args.input) === null || _a === void 0 ? void 0 : _a.acl) !== null && _b !== void 0 ? _b : args.acl) !== null && _c !== void 0 ? _c : null,
|
|
108
|
+
contentDisposition: (_e = (_d = args.input) === null || _d === void 0 ? void 0 : _d.contentDisposition) !== null && _e !== void 0 ? _e : null,
|
|
109
|
+
contentType: (_h = (_g = (_f = args.input) === null || _f === void 0 ? void 0 : _f.contentType) !== null && _g !== void 0 ? _g : args.contentType) !== null && _h !== void 0 ? _h : null,
|
|
110
|
+
expiration: (_l = (_k = (_j = args.input) === null || _j === void 0 ? void 0 : _j.expiration) !== null && _k !== void 0 ? _k : args.expiration) !== null && _l !== void 0 ? _l : null,
|
|
111
|
+
extension: (_o = (_m = args.input) === null || _m === void 0 ? void 0 : _m.extension) !== null && _o !== void 0 ? _o : null,
|
|
112
|
+
fileName: (_q = (_p = args.input) === null || _p === void 0 ? void 0 : _p.fileName) !== null && _q !== void 0 ? _q : null,
|
|
113
|
+
prefix: (_t = (_s = (_r = args.input) === null || _r === void 0 ? void 0 : _r.prefix) !== null && _s !== void 0 ? _s : args.prefix) !== null && _t !== void 0 ? _t : null,
|
|
114
|
+
suffix: (_v = (_u = args.input) === null || _u === void 0 ? void 0 : _u.suffix) !== null && _v !== void 0 ? _v : null,
|
|
115
|
+
size: (_x = (_w = args.input) === null || _w === void 0 ? void 0 : _w.size) !== null && _x !== void 0 ? _x : null,
|
|
116
|
+
});
|
|
146
117
|
},
|
|
147
118
|
};
|
|
148
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3SchemaContributor.js","sourceRoot":"","sources":["../../src/S3SchemaContributor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"S3SchemaContributor.js","sourceRoot":"","sources":["../../src/S3SchemaContributor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAOgB;AAEhB,qCAAoD;AAEpD,uDAAwC;AACxC,mDAAkG;AAClG,iEAA6D;AAqB7D,MAAa,mBAAmB;IAC/B,YACkB,QAA8B,EAC9B,SAA2B,EAC3B,SAAoB;QAFpB,aAAQ,GAAR,QAAQ,CAAsB;QAC9B,cAAS,GAAT,SAAS,CAAkB;QAC3B,cAAS,GAAT,SAAS,CAAW;IACnC,CAAC;IAEJ,YAAY,CAAC,OAAwC;QACpD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACnB,OAAO,SAAS,CAAA;SAChB;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,WACxD,OAAA,MAAM,CAAC,OAAO,CAAC,CAAC,MAAA,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,0CAAE,EAAkB,KAAI,EAAE,CAAC,CAAA,EAAA,CACvE,CAAA;QAGD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3E,OAAO,EAAE,EAAE;YACX,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC,CAAA;QACH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAClE,OAAO,EAAE,EAAE;SACX,CAAC,CAAC,CAAA;QAEH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;YACtD,OAAO,SAAS,CAAA;SAChB;QAED,MAAM,QAAQ,GAAG,IAAA,wBAAe,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,YAAY,GAAG,IAAI,2CAAoB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QACrE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QACxE,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAA;QAChD,MAAM,QAAQ,GAAG;YAChB,iBAAiB,EAAE,cAAmD;YACtE,eAAe,EAAE,YAAY;SAC7B,CAAA;QACD,OAAO,IAAI,uBAAa,CAAC;YACxB,QAAQ,EAAE,IAAI,2BAAiB,CAAC;gBAC/B,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ;aACtB,CAAC;YACF,KAAK,EAAE,IAAI,2BAAiB,CAAC;gBAC5B,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;oBACd,YAAY,EAAE;wBACb,IAAI,EAAE,uBAAa;qBACnB;iBACD,CAAC;aACF,CAAC;SACF,CAAC,CAAA;IACH,CAAC;IAEO,kBAAkB,CAAC,EAAa;QACvC,OAAO;YACN,IAAI,EAAE,IAAI,wBAAc,CAAC,4BAAY,CAAC;YACtC,IAAI,EAAE;gBACL,SAAS,EAAE;oBACV,IAAI,EAAE,IAAI,wBAAc,CAAC,uBAAa,CAAC;iBACvC;gBACD,UAAU,EAAE;oBACX,IAAI,EAAE,oBAAU;iBAChB;aACD;YACD,OAAO,EAAE,KAAK,EAAE,MAAW,EAAE,IAAgD,EAAE,EAAE;;gBAChF,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAA,IAAI,CAAC,UAAU,mCAAI,IAAI,EAAE,CAAC,CAAA;YAC/F,CAAC;SACoC,CAAA;IACvC,CAAC;IAEO,oBAAoB,CAAC,EAAa;QACzC,OAAO;YACN,IAAI,EAAE,IAAI,wBAAc,CAAC,8BAAc,CAAC;YACxC,IAAI,EAAE;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,2BAA2B,EAAE;gBAClD,WAAW,EAAE,EAAE,IAAI,EAAE,uBAAa,EAAE,iBAAiB,EAAE,uBAAuB,EAAE;gBAChF,UAAU,EAAE,EAAE,IAAI,EAAE,oBAAU,EAAE,iBAAiB,EAAE,sBAAsB,EAAE;gBAC3E,MAAM,EAAE,EAAE,IAAI,EAAE,uBAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE;gBACtE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE;aAC9D;YACD,OAAO,EAAE,KAAK,EACb,MAAW,EACX,IAA+H,EAC9H,EAAE;;gBACH,OAAO,EAAE,CAAC,kBAAkB,CAAC;oBAC5B,GAAG,EAAE,MAAA,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,GAAG,mCAAI,IAAI,CAAC,GAAG,mCAAI,IAAI;oBACxC,kBAAkB,EAAE,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,kBAAkB,mCAAI,IAAI;oBAC1D,WAAW,EAAE,MAAA,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,WAAW,mCAAI,IAAI,CAAC,WAAW,mCAAI,IAAI;oBAChE,UAAU,EAAE,MAAA,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,UAAU,mCAAI,IAAI,CAAC,UAAU,mCAAI,IAAI;oBAC7D,SAAS,EAAE,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS,mCAAI,IAAI;oBACxC,QAAQ,EAAE,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ,mCAAI,IAAI;oBACtC,MAAM,EAAE,MAAA,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,mCAAI,IAAI,CAAC,MAAM,mCAAI,IAAI;oBACjD,MAAM,EAAE,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,mCAAI,IAAI;oBAClC,IAAI,EAAE,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,IAAI,mCAAI,IAAI;iBAC9B,CAAC,CAAA;YACH,CAAC;SACD,CAAA;IACF,CAAC;CACD;AAlGD,kDAkGC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { GraphQLEnumType, GraphQLInputObjectType, GraphQLObjectType } from 'graphql';
|
|
2
|
+
export declare const S3Header: GraphQLObjectType<any, any>;
|
|
3
|
+
export declare const S3ContentDisposition: GraphQLEnumType;
|
|
4
|
+
export declare type S3ContentDisposition = 'ATTACHMENT' | 'INLINE';
|
|
5
|
+
export declare const S3SignedRead: GraphQLObjectType<any, any>;
|
|
6
|
+
export declare const S3SignedUpload: GraphQLObjectType<any, any>;
|
|
7
|
+
export declare const S3Acl: GraphQLEnumType;
|
|
8
|
+
export declare type S3Acl = 'PUBLIC_READ' | 'PRIVATE' | 'NONE';
|
|
9
|
+
export declare const S3GenerateSignedUploadInput: GraphQLInputObjectType;
|
|
10
|
+
export interface S3GenerateSignedUploadInput {
|
|
11
|
+
contentType: null | string;
|
|
12
|
+
extension: null | string;
|
|
13
|
+
expiration: null | number;
|
|
14
|
+
size: null | number;
|
|
15
|
+
prefix: null | string;
|
|
16
|
+
suffix: null | string;
|
|
17
|
+
fileName: null | string;
|
|
18
|
+
contentDisposition: null | S3ContentDisposition;
|
|
19
|
+
acl: null | S3Acl;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=S3SchemaTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"S3SchemaTypes.d.ts","sourceRoot":"","sources":["../../src/S3SchemaTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,eAAe,EACf,sBAAsB,EAItB,iBAAiB,EAEjB,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,QAAQ,6BAMnB,CAAA;AAEF,eAAO,MAAM,oBAAoB,iBAK/B,CAAA;AACF,oBAAY,oBAAoB,GAAG,YAAY,GAAG,QAAQ,CAAA;AAE1D,eAAO,MAAM,YAAY,6BAWvB,CAAA;AAEF,eAAO,MAAM,cAAc,6BAYzB,CAAA;AAEF,eAAO,MAAM,KAAK,iBAOhB,CAAA;AAEF,oBAAY,KAAK,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,CAAA;AAEtD,eAAO,MAAM,2BAA2B,wBAatC,CAAA;AACF,MAAM,WAAW,2BAA2B;IAC3C,WAAW,EAAE,IAAI,GAAG,MAAM,CAAA;IAC1B,SAAS,EAAE,IAAI,GAAG,MAAM,CAAA;IACxB,UAAU,EAAE,IAAI,GAAG,MAAM,CAAA;IACzB,IAAI,EAAE,IAAI,GAAG,MAAM,CAAA;IACnB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,kBAAkB,EAAE,IAAI,GAAG,oBAAoB,CAAA;IAC/C,GAAG,EAAE,IAAI,GAAG,KAAK,CAAA;CACjB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.S3GenerateSignedUploadInput = exports.S3Acl = exports.S3SignedUpload = exports.S3SignedRead = exports.S3ContentDisposition = exports.S3Header = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
exports.S3Header = new graphql_1.GraphQLObjectType({
|
|
6
|
+
name: 'S3Header',
|
|
7
|
+
fields: {
|
|
8
|
+
key: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
9
|
+
value: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
exports.S3ContentDisposition = new graphql_1.GraphQLEnumType({
|
|
13
|
+
name: 'S33ContentDisposition', values: {
|
|
14
|
+
ATTACHMENT: {},
|
|
15
|
+
INLINE: {},
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
exports.S3SignedRead = new graphql_1.GraphQLObjectType({
|
|
19
|
+
name: 'S3SignedRead',
|
|
20
|
+
fields: {
|
|
21
|
+
url: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
22
|
+
headers: {
|
|
23
|
+
type: new graphql_1.GraphQLNonNull(new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(exports.S3Header))),
|
|
24
|
+
},
|
|
25
|
+
method: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
26
|
+
objectKey: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
27
|
+
bucket: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
exports.S3SignedUpload = new graphql_1.GraphQLObjectType({
|
|
31
|
+
name: 'S3SignedUpload',
|
|
32
|
+
fields: {
|
|
33
|
+
url: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
34
|
+
headers: {
|
|
35
|
+
type: new graphql_1.GraphQLNonNull(new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(exports.S3Header))),
|
|
36
|
+
},
|
|
37
|
+
method: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
38
|
+
objectKey: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
39
|
+
bucket: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
40
|
+
publicUrl: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
exports.S3Acl = new graphql_1.GraphQLEnumType({
|
|
44
|
+
name: 'S3Acl',
|
|
45
|
+
values: {
|
|
46
|
+
PUBLIC_READ: {},
|
|
47
|
+
PRIVATE: {},
|
|
48
|
+
NONE: {},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
exports.S3GenerateSignedUploadInput = new graphql_1.GraphQLInputObjectType({
|
|
52
|
+
name: 'S3GenerateSignedUploadInput',
|
|
53
|
+
fields: {
|
|
54
|
+
contentType: { type: graphql_1.GraphQLString },
|
|
55
|
+
extension: { type: graphql_1.GraphQLString, description: 'If not provided, extension is detected from a content-type.' },
|
|
56
|
+
expiration: { type: graphql_1.GraphQLInt, description: 'Signed URL expiration.' },
|
|
57
|
+
size: { type: graphql_1.GraphQLInt, description: 'Uploaded file size. Required when you enable ACL size limits.' },
|
|
58
|
+
prefix: { type: graphql_1.GraphQLString, description: 'Can be used as a "directory".' },
|
|
59
|
+
suffix: { type: graphql_1.GraphQLString, description: 'Suffix after generated id and before the extension.' },
|
|
60
|
+
fileName: { type: graphql_1.GraphQLString, description: 'This only affects Content-disposition header. Does not affect actual object key.' },
|
|
61
|
+
contentDisposition: { type: exports.S3ContentDisposition },
|
|
62
|
+
acl: { type: exports.S3Acl, description: 'If not supported by S3 provider, an error is thrown.' },
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=S3SchemaTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"S3SchemaTypes.js","sourceRoot":"","sources":["../../src/S3SchemaTypes.ts"],"names":[],"mappings":"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"}
|
package/dist/src/S3Service.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { S3Config } from './Config';
|
|
2
|
-
import { ObjectKeyVerifier } from './ObjectKeyVerifier';
|
|
3
2
|
import { Providers } from '@contember/engine-plugins';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
PublicRead = "public-read",
|
|
7
|
-
Private = "private"
|
|
8
|
-
}
|
|
3
|
+
import { S3GenerateSignedUploadInput } from './S3SchemaTypes';
|
|
4
|
+
import { S3ObjectAuthorizator } from './S3ObjectAuthorizator';
|
|
9
5
|
declare type SignedReadUrl = {
|
|
10
6
|
url: string;
|
|
11
7
|
bucket: string;
|
|
@@ -30,15 +26,19 @@ declare type SignedUploadUrl = {
|
|
|
30
26
|
export declare class S3Service {
|
|
31
27
|
readonly config: S3Config;
|
|
32
28
|
private readonly providers;
|
|
29
|
+
private readonly authorizator;
|
|
33
30
|
private readonly publicBaseUrl;
|
|
34
31
|
private readonly signer;
|
|
35
|
-
constructor(config: S3Config, providers: Providers);
|
|
36
|
-
getSignedUploadUrl(
|
|
37
|
-
getSignedReadUrl(objectKey
|
|
32
|
+
constructor(config: S3Config, providers: Pick<Providers, 'uuid' | 'now'>, authorizator: S3ObjectAuthorizator);
|
|
33
|
+
getSignedUploadUrl({ acl, contentDisposition, contentType, expiration, prefix, suffix, fileName, extension, size }: S3GenerateSignedUploadInput): SignedUploadUrl;
|
|
34
|
+
getSignedReadUrl({ objectKey, expiration }: {
|
|
35
|
+
objectKey: string;
|
|
36
|
+
expiration: number | null;
|
|
37
|
+
}): SignedReadUrl;
|
|
38
38
|
formatPublicUrl(key: string): string;
|
|
39
39
|
}
|
|
40
40
|
export declare class S3ServiceFactory {
|
|
41
|
-
create(config: S3Config, providers: Providers): S3Service;
|
|
41
|
+
create(config: S3Config, providers: Providers, authorizator: S3ObjectAuthorizator): S3Service;
|
|
42
42
|
}
|
|
43
43
|
export {};
|
|
44
44
|
//# sourceMappingURL=S3Service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3Service.d.ts","sourceRoot":"","sources":["../../src/S3Service.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,QAAQ,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"S3Service.d.ts","sourceRoot":"","sources":["../../src/S3Service.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D,aAAK,aAAa,GAAG;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,MAAM,EAAE,MAAM,CAAA;CACd,CAAA;AAED,aAAK,eAAe,GAAG;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,MAAM,EAAE,MAAM,CAAA;CACd,CAAA;AAGD,qBAAa,SAAS;aAMJ,MAAM,EAAE,QAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAP9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IAEtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAGhB,MAAM,EAAE,QAAQ,EACf,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,EAC1C,YAAY,EAAE,oBAAoB;IAM7C,kBAAkB,CACxB,EAAE,GAAG,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,2BAA2B,GAC1H,eAAe;IAwDX,gBAAgB,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,GAAG,aAAa;IA+B3G,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAG3C;AAED,qBAAa,gBAAgB;IACrB,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB;CAGxF"}
|