@aws-sdk/middleware-sdk-s3 3.460.0 → 3.465.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist-cjs/index.js +1 -0
  2. package/dist-cjs/s3-express/classes/S3ExpressIdentityCache.js +42 -0
  3. package/dist-cjs/s3-express/classes/S3ExpressIdentityCacheEntry.js +15 -0
  4. package/dist-cjs/s3-express/classes/S3ExpressIdentityProviderImpl.js +53 -0
  5. package/dist-cjs/s3-express/classes/SignatureV4S3Express.js +46 -0
  6. package/dist-cjs/s3-express/constants.js +16 -0
  7. package/dist-cjs/s3-express/functions/s3ExpressMiddleware.js +45 -0
  8. package/dist-cjs/s3-express/index.js +17 -0
  9. package/dist-cjs/s3-express/interfaces/S3ExpressIdentity.js +2 -0
  10. package/dist-cjs/s3-express/interfaces/S3ExpressIdentityProvider.js +2 -0
  11. package/dist-cjs/s3Configuration.js +10 -4
  12. package/dist-es/index.js +1 -0
  13. package/dist-es/s3-express/classes/S3ExpressIdentityCache.js +38 -0
  14. package/dist-es/s3-express/classes/S3ExpressIdentityCacheEntry.js +11 -0
  15. package/dist-es/s3-express/classes/S3ExpressIdentityProviderImpl.js +47 -0
  16. package/dist-es/s3-express/classes/SignatureV4S3Express.js +41 -0
  17. package/dist-es/s3-express/constants.js +13 -0
  18. package/dist-es/s3-express/functions/s3ExpressMiddleware.js +39 -0
  19. package/dist-es/s3-express/index.js +6 -0
  20. package/dist-es/s3-express/interfaces/S3ExpressIdentity.js +1 -0
  21. package/dist-es/s3-express/interfaces/S3ExpressIdentityProvider.js +1 -0
  22. package/dist-es/s3Configuration.js +16 -7
  23. package/dist-types/index.d.ts +1 -0
  24. package/dist-types/s3-express/classes/S3ExpressIdentityCache.d.ts +16 -0
  25. package/dist-types/s3-express/classes/S3ExpressIdentityCacheEntry.d.ts +16 -0
  26. package/dist-types/s3-express/classes/S3ExpressIdentityProviderImpl.d.ts +32 -0
  27. package/dist-types/s3-express/classes/SignatureV4S3Express.d.ts +17 -0
  28. package/dist-types/s3-express/constants.d.ts +37 -0
  29. package/dist-types/s3-express/functions/s3ExpressMiddleware.d.ts +32 -0
  30. package/dist-types/s3-express/index.d.ts +8 -0
  31. package/dist-types/s3-express/interfaces/S3ExpressIdentity.d.ts +6 -0
  32. package/dist-types/s3-express/interfaces/S3ExpressIdentityProvider.d.ts +12 -0
  33. package/dist-types/s3Configuration.d.ts +22 -1
  34. package/dist-types/ts3.4/index.d.ts +1 -0
  35. package/dist-types/ts3.4/s3-express/classes/S3ExpressIdentityCache.d.ts +14 -0
  36. package/dist-types/ts3.4/s3-express/classes/S3ExpressIdentityCacheEntry.d.ts +12 -0
  37. package/dist-types/ts3.4/s3-express/classes/S3ExpressIdentityProviderImpl.d.ts +31 -0
  38. package/dist-types/ts3.4/s3-express/classes/SignatureV4S3Express.d.ts +19 -0
  39. package/dist-types/ts3.4/s3-express/constants.d.ts +11 -0
  40. package/dist-types/ts3.4/s3-express/functions/s3ExpressMiddleware.d.ts +27 -0
  41. package/dist-types/ts3.4/s3-express/index.d.ts +12 -0
  42. package/dist-types/ts3.4/s3-express/interfaces/S3ExpressIdentity.d.ts +2 -0
  43. package/dist-types/ts3.4/s3-express/interfaces/S3ExpressIdentityProvider.d.ts +8 -0
  44. package/dist-types/ts3.4/s3Configuration.d.ts +15 -1
  45. package/package.json +6 -7
package/dist-cjs/index.js CHANGED
@@ -4,6 +4,7 @@ const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./check-content-length-header"), exports);
5
5
  tslib_1.__exportStar(require("./region-redirect-endpoint-middleware"), exports);
6
6
  tslib_1.__exportStar(require("./region-redirect-middleware"), exports);
7
+ tslib_1.__exportStar(require("./s3-express/index"), exports);
7
8
  tslib_1.__exportStar(require("./s3Configuration"), exports);
8
9
  tslib_1.__exportStar(require("./throw-200-exceptions"), exports);
9
10
  tslib_1.__exportStar(require("./validate-bucket-name"), exports);
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.S3ExpressIdentityCache = void 0;
4
+ class S3ExpressIdentityCache {
5
+ constructor(data = {}) {
6
+ this.data = data;
7
+ this.lastPurgeTime = Date.now();
8
+ }
9
+ get(key) {
10
+ const entry = this.data[key];
11
+ if (!entry) {
12
+ return;
13
+ }
14
+ return entry;
15
+ }
16
+ set(key, entry) {
17
+ this.data[key] = entry;
18
+ return entry;
19
+ }
20
+ delete(key) {
21
+ delete this.data[key];
22
+ }
23
+ async purgeExpired() {
24
+ const now = Date.now();
25
+ if (this.lastPurgeTime + S3ExpressIdentityCache.EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS > now) {
26
+ return;
27
+ }
28
+ for (const key in this.data) {
29
+ const entry = this.data[key];
30
+ if (!entry.isRefreshing) {
31
+ const credential = await entry.identity;
32
+ if (credential.expiration) {
33
+ if (credential.expiration.getTime() < now) {
34
+ delete this.data[key];
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ exports.S3ExpressIdentityCache = S3ExpressIdentityCache;
42
+ S3ExpressIdentityCache.EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS = 30000;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.S3ExpressIdentityCacheEntry = void 0;
4
+ class S3ExpressIdentityCacheEntry {
5
+ constructor(_identity, isRefreshing = false, accessed = Date.now()) {
6
+ this._identity = _identity;
7
+ this.isRefreshing = isRefreshing;
8
+ this.accessed = accessed;
9
+ }
10
+ get identity() {
11
+ this.accessed = Date.now();
12
+ return this._identity;
13
+ }
14
+ }
15
+ exports.S3ExpressIdentityCacheEntry = S3ExpressIdentityCacheEntry;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.S3ExpressIdentityProviderImpl = void 0;
4
+ const S3ExpressIdentityCache_1 = require("./S3ExpressIdentityCache");
5
+ const S3ExpressIdentityCacheEntry_1 = require("./S3ExpressIdentityCacheEntry");
6
+ class S3ExpressIdentityProviderImpl {
7
+ constructor(createSessionFn, cache = new S3ExpressIdentityCache_1.S3ExpressIdentityCache()) {
8
+ this.createSessionFn = createSessionFn;
9
+ this.cache = cache;
10
+ }
11
+ async getS3ExpressIdentity(awsIdentity, identityProperties) {
12
+ const key = identityProperties.Bucket;
13
+ const { cache } = this;
14
+ const entry = cache.get(key);
15
+ if (entry) {
16
+ return entry.identity.then((identity) => {
17
+ var _a, _b, _c, _d;
18
+ const isExpired = ((_b = (_a = identity.expiration) === null || _a === void 0 ? void 0 : _a.getTime()) !== null && _b !== void 0 ? _b : 0) < Date.now();
19
+ if (isExpired) {
20
+ return cache.set(key, new S3ExpressIdentityCacheEntry_1.S3ExpressIdentityCacheEntry(this.getIdentity(key))).identity;
21
+ }
22
+ const isExpiringSoon = ((_d = (_c = identity.expiration) === null || _c === void 0 ? void 0 : _c.getTime()) !== null && _d !== void 0 ? _d : 0) < Date.now() + S3ExpressIdentityProviderImpl.REFRESH_WINDOW_MS;
23
+ if (isExpiringSoon && !entry.isRefreshing) {
24
+ entry.isRefreshing = true;
25
+ this.getIdentity(key).then((id) => {
26
+ cache.set(key, new S3ExpressIdentityCacheEntry_1.S3ExpressIdentityCacheEntry(Promise.resolve(id)));
27
+ });
28
+ }
29
+ return identity;
30
+ });
31
+ }
32
+ return cache.set(key, new S3ExpressIdentityCacheEntry_1.S3ExpressIdentityCacheEntry(this.getIdentity(key))).identity;
33
+ }
34
+ async getIdentity(key) {
35
+ var _a, _b;
36
+ await this.cache.purgeExpired().catch((error) => {
37
+ console.warn("Error while clearing expired entries in S3ExpressIdentityCache: \n" + error);
38
+ });
39
+ const session = await this.createSessionFn(key);
40
+ if (!((_a = session.Credentials) === null || _a === void 0 ? void 0 : _a.AccessKeyId) || !((_b = session.Credentials) === null || _b === void 0 ? void 0 : _b.SecretAccessKey)) {
41
+ throw new Error("s3#createSession response credential missing AccessKeyId or SecretAccessKey.");
42
+ }
43
+ const identity = {
44
+ accessKeyId: session.Credentials.AccessKeyId,
45
+ secretAccessKey: session.Credentials.SecretAccessKey,
46
+ sessionToken: session.Credentials.SessionToken,
47
+ expiration: session.Credentials.Expiration ? new Date(session.Credentials.Expiration) : undefined,
48
+ };
49
+ return identity;
50
+ }
51
+ }
52
+ exports.S3ExpressIdentityProviderImpl = S3ExpressIdentityProviderImpl;
53
+ S3ExpressIdentityProviderImpl.REFRESH_WINDOW_MS = 60000;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SignatureV4S3Express = void 0;
4
+ const signature_v4_1 = require("@smithy/signature-v4");
5
+ const constants_1 = require("../constants");
6
+ class SignatureV4S3Express extends signature_v4_1.SignatureV4 {
7
+ async signWithCredentials(requestToSign, credentials, options) {
8
+ const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);
9
+ requestToSign.headers[constants_1.SESSION_TOKEN_HEADER] = credentials.sessionToken;
10
+ const privateAccess = this;
11
+ setSingleOverride(privateAccess, credentialsWithoutSessionToken);
12
+ return privateAccess.signRequest(requestToSign, options !== null && options !== void 0 ? options : {});
13
+ }
14
+ async presignWithCredentials(requestToSign, credentials, options) {
15
+ var _a;
16
+ const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);
17
+ delete requestToSign.headers[constants_1.SESSION_TOKEN_HEADER];
18
+ requestToSign.headers[constants_1.SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;
19
+ requestToSign.query = (_a = requestToSign.query) !== null && _a !== void 0 ? _a : {};
20
+ requestToSign.query[constants_1.SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;
21
+ const privateAccess = this;
22
+ setSingleOverride(privateAccess, credentialsWithoutSessionToken);
23
+ return this.presign(requestToSign, options);
24
+ }
25
+ }
26
+ exports.SignatureV4S3Express = SignatureV4S3Express;
27
+ function getCredentialsWithoutSessionToken(credentials) {
28
+ const credentialsWithoutSessionToken = {
29
+ accessKeyId: credentials.accessKeyId,
30
+ secretAccessKey: credentials.secretAccessKey,
31
+ expiration: credentials.expiration,
32
+ };
33
+ return credentialsWithoutSessionToken;
34
+ }
35
+ function setSingleOverride(privateAccess, credentialsWithoutSessionToken) {
36
+ const id = setTimeout(() => {
37
+ throw new Error("SignatureV4S3Express credential override was created but not called.");
38
+ }, 10);
39
+ const currentCredentialProvider = privateAccess.credentialProvider;
40
+ const overrideCredentialsProviderOnce = () => {
41
+ clearTimeout(id);
42
+ privateAccess.credentialProvider = currentCredentialProvider;
43
+ return Promise.resolve(credentialsWithoutSessionToken);
44
+ };
45
+ privateAccess.credentialProvider = overrideCredentialsProviderOnce;
46
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS = exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME = exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME = exports.SESSION_TOKEN_HEADER = exports.SESSION_TOKEN_QUERY_PARAM = exports.S3_EXPRESS_AUTH_SCHEME = exports.S3_EXPRESS_BACKEND = exports.S3_EXPRESS_BUCKET_TYPE = void 0;
4
+ const util_config_provider_1 = require("@smithy/util-config-provider");
5
+ exports.S3_EXPRESS_BUCKET_TYPE = "Directory";
6
+ exports.S3_EXPRESS_BACKEND = "S3Express";
7
+ exports.S3_EXPRESS_AUTH_SCHEME = "sigv4-s3express";
8
+ exports.SESSION_TOKEN_QUERY_PARAM = "X-Amz-S3session-Token";
9
+ exports.SESSION_TOKEN_HEADER = exports.SESSION_TOKEN_QUERY_PARAM.toLowerCase();
10
+ exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME = "AWS_S3_DISABLE_EXPRESS_SESSION_AUTH";
11
+ exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME = "s3_disable_express_session_auth";
12
+ exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS = {
13
+ environmentVariableSelector: (env) => (0, util_config_provider_1.booleanSelector)(env, exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME, util_config_provider_1.SelectorType.ENV),
14
+ configFileSelector: (profile) => (0, util_config_provider_1.booleanSelector)(profile, exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME, util_config_provider_1.SelectorType.CONFIG),
15
+ default: false,
16
+ };
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getS3ExpressPlugin = exports.s3ExpressMiddlewareOptions = exports.s3ExpressMiddleware = void 0;
4
+ const protocol_http_1 = require("@smithy/protocol-http");
5
+ const constants_1 = require("../constants");
6
+ const s3ExpressMiddleware = (options) => {
7
+ return (next, context) => async (args) => {
8
+ var _a, _b, _c, _d, _e;
9
+ if (context.endpointV2) {
10
+ const endpoint = context.endpointV2;
11
+ const isS3ExpressAuth = ((_c = (_b = (_a = endpoint.properties) === null || _a === void 0 ? void 0 : _a.authSchemes) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.name) === constants_1.S3_EXPRESS_AUTH_SCHEME;
12
+ const isS3ExpressBucket = ((_d = endpoint.properties) === null || _d === void 0 ? void 0 : _d.backend) === constants_1.S3_EXPRESS_BACKEND ||
13
+ ((_e = endpoint.properties) === null || _e === void 0 ? void 0 : _e.bucketType) === constants_1.S3_EXPRESS_BUCKET_TYPE;
14
+ if (isS3ExpressBucket) {
15
+ context.isS3ExpressBucket = true;
16
+ }
17
+ if (isS3ExpressAuth) {
18
+ const requestBucket = args.input.Bucket;
19
+ if (requestBucket) {
20
+ const s3ExpressIdentity = await options.s3ExpressIdentityProvider.getS3ExpressIdentity(await options.credentials(), {
21
+ Bucket: requestBucket,
22
+ });
23
+ context.s3ExpressIdentity = s3ExpressIdentity;
24
+ if (protocol_http_1.HttpRequest.isInstance(args.request) && s3ExpressIdentity.sessionToken) {
25
+ args.request.headers[constants_1.SESSION_TOKEN_HEADER] = s3ExpressIdentity.sessionToken;
26
+ }
27
+ }
28
+ }
29
+ }
30
+ return next(args);
31
+ };
32
+ };
33
+ exports.s3ExpressMiddleware = s3ExpressMiddleware;
34
+ exports.s3ExpressMiddlewareOptions = {
35
+ name: "s3ExpressMiddleware",
36
+ step: "build",
37
+ tags: ["S3", "S3_EXPRESS"],
38
+ override: true,
39
+ };
40
+ const getS3ExpressPlugin = (options) => ({
41
+ applyToStack: (clientStack) => {
42
+ clientStack.add((0, exports.s3ExpressMiddleware)(options), exports.s3ExpressMiddlewareOptions);
43
+ },
44
+ });
45
+ exports.getS3ExpressPlugin = getS3ExpressPlugin;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.s3ExpressMiddlewareOptions = exports.s3ExpressMiddleware = exports.getS3ExpressPlugin = exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS = exports.SignatureV4S3Express = exports.S3ExpressIdentityProviderImpl = exports.S3ExpressIdentityCacheEntry = exports.S3ExpressIdentityCache = void 0;
4
+ var S3ExpressIdentityCache_1 = require("./classes/S3ExpressIdentityCache");
5
+ Object.defineProperty(exports, "S3ExpressIdentityCache", { enumerable: true, get: function () { return S3ExpressIdentityCache_1.S3ExpressIdentityCache; } });
6
+ var S3ExpressIdentityCacheEntry_1 = require("./classes/S3ExpressIdentityCacheEntry");
7
+ Object.defineProperty(exports, "S3ExpressIdentityCacheEntry", { enumerable: true, get: function () { return S3ExpressIdentityCacheEntry_1.S3ExpressIdentityCacheEntry; } });
8
+ var S3ExpressIdentityProviderImpl_1 = require("./classes/S3ExpressIdentityProviderImpl");
9
+ Object.defineProperty(exports, "S3ExpressIdentityProviderImpl", { enumerable: true, get: function () { return S3ExpressIdentityProviderImpl_1.S3ExpressIdentityProviderImpl; } });
10
+ var SignatureV4S3Express_1 = require("./classes/SignatureV4S3Express");
11
+ Object.defineProperty(exports, "SignatureV4S3Express", { enumerable: true, get: function () { return SignatureV4S3Express_1.SignatureV4S3Express; } });
12
+ var constants_1 = require("./constants");
13
+ Object.defineProperty(exports, "NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS", { enumerable: true, get: function () { return constants_1.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS; } });
14
+ var s3ExpressMiddleware_1 = require("./functions/s3ExpressMiddleware");
15
+ Object.defineProperty(exports, "getS3ExpressPlugin", { enumerable: true, get: function () { return s3ExpressMiddleware_1.getS3ExpressPlugin; } });
16
+ Object.defineProperty(exports, "s3ExpressMiddleware", { enumerable: true, get: function () { return s3ExpressMiddleware_1.s3ExpressMiddleware; } });
17
+ Object.defineProperty(exports, "s3ExpressMiddlewareOptions", { enumerable: true, get: function () { return s3ExpressMiddleware_1.s3ExpressMiddlewareOptions; } });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,14 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveS3Config = void 0;
4
- const resolveS3Config = (input) => {
5
- var _a, _b, _c, _d;
6
- return ({
4
+ const s3_express_1 = require("./s3-express");
5
+ const resolveS3Config = (input, { session, }) => {
6
+ var _a, _b, _c, _d, _e;
7
+ const [s3ClientProvider, CreateSessionCommandCtor] = session;
8
+ return {
7
9
  ...input,
8
10
  forcePathStyle: (_a = input.forcePathStyle) !== null && _a !== void 0 ? _a : false,
9
11
  useAccelerateEndpoint: (_b = input.useAccelerateEndpoint) !== null && _b !== void 0 ? _b : false,
10
12
  disableMultiregionAccessPoints: (_c = input.disableMultiregionAccessPoints) !== null && _c !== void 0 ? _c : false,
11
13
  followRegionRedirects: (_d = input.followRegionRedirects) !== null && _d !== void 0 ? _d : false,
12
- });
14
+ s3ExpressIdentityProvider: (_e = input.s3ExpressIdentityProvider) !== null && _e !== void 0 ? _e : new s3_express_1.S3ExpressIdentityProviderImpl(async (key) => s3ClientProvider().send(new CreateSessionCommandCtor({
15
+ Bucket: key,
16
+ SessionMode: "ReadWrite",
17
+ }))),
18
+ };
13
19
  };
14
20
  exports.resolveS3Config = resolveS3Config;
package/dist-es/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from "./check-content-length-header";
2
2
  export * from "./region-redirect-endpoint-middleware";
3
3
  export * from "./region-redirect-middleware";
4
+ export * from "./s3-express/index";
4
5
  export * from "./s3Configuration";
5
6
  export * from "./throw-200-exceptions";
6
7
  export * from "./validate-bucket-name";
@@ -0,0 +1,38 @@
1
+ export class S3ExpressIdentityCache {
2
+ constructor(data = {}) {
3
+ this.data = data;
4
+ this.lastPurgeTime = Date.now();
5
+ }
6
+ get(key) {
7
+ const entry = this.data[key];
8
+ if (!entry) {
9
+ return;
10
+ }
11
+ return entry;
12
+ }
13
+ set(key, entry) {
14
+ this.data[key] = entry;
15
+ return entry;
16
+ }
17
+ delete(key) {
18
+ delete this.data[key];
19
+ }
20
+ async purgeExpired() {
21
+ const now = Date.now();
22
+ if (this.lastPurgeTime + S3ExpressIdentityCache.EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS > now) {
23
+ return;
24
+ }
25
+ for (const key in this.data) {
26
+ const entry = this.data[key];
27
+ if (!entry.isRefreshing) {
28
+ const credential = await entry.identity;
29
+ if (credential.expiration) {
30
+ if (credential.expiration.getTime() < now) {
31
+ delete this.data[key];
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ S3ExpressIdentityCache.EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS = 30000;
@@ -0,0 +1,11 @@
1
+ export class S3ExpressIdentityCacheEntry {
2
+ constructor(_identity, isRefreshing = false, accessed = Date.now()) {
3
+ this._identity = _identity;
4
+ this.isRefreshing = isRefreshing;
5
+ this.accessed = accessed;
6
+ }
7
+ get identity() {
8
+ this.accessed = Date.now();
9
+ return this._identity;
10
+ }
11
+ }
@@ -0,0 +1,47 @@
1
+ import { S3ExpressIdentityCache } from "./S3ExpressIdentityCache";
2
+ import { S3ExpressIdentityCacheEntry } from "./S3ExpressIdentityCacheEntry";
3
+ export class S3ExpressIdentityProviderImpl {
4
+ constructor(createSessionFn, cache = new S3ExpressIdentityCache()) {
5
+ this.createSessionFn = createSessionFn;
6
+ this.cache = cache;
7
+ }
8
+ async getS3ExpressIdentity(awsIdentity, identityProperties) {
9
+ const key = identityProperties.Bucket;
10
+ const { cache } = this;
11
+ const entry = cache.get(key);
12
+ if (entry) {
13
+ return entry.identity.then((identity) => {
14
+ const isExpired = (identity.expiration?.getTime() ?? 0) < Date.now();
15
+ if (isExpired) {
16
+ return cache.set(key, new S3ExpressIdentityCacheEntry(this.getIdentity(key))).identity;
17
+ }
18
+ const isExpiringSoon = (identity.expiration?.getTime() ?? 0) < Date.now() + S3ExpressIdentityProviderImpl.REFRESH_WINDOW_MS;
19
+ if (isExpiringSoon && !entry.isRefreshing) {
20
+ entry.isRefreshing = true;
21
+ this.getIdentity(key).then((id) => {
22
+ cache.set(key, new S3ExpressIdentityCacheEntry(Promise.resolve(id)));
23
+ });
24
+ }
25
+ return identity;
26
+ });
27
+ }
28
+ return cache.set(key, new S3ExpressIdentityCacheEntry(this.getIdentity(key))).identity;
29
+ }
30
+ async getIdentity(key) {
31
+ await this.cache.purgeExpired().catch((error) => {
32
+ console.warn("Error while clearing expired entries in S3ExpressIdentityCache: \n" + error);
33
+ });
34
+ const session = await this.createSessionFn(key);
35
+ if (!session.Credentials?.AccessKeyId || !session.Credentials?.SecretAccessKey) {
36
+ throw new Error("s3#createSession response credential missing AccessKeyId or SecretAccessKey.");
37
+ }
38
+ const identity = {
39
+ accessKeyId: session.Credentials.AccessKeyId,
40
+ secretAccessKey: session.Credentials.SecretAccessKey,
41
+ sessionToken: session.Credentials.SessionToken,
42
+ expiration: session.Credentials.Expiration ? new Date(session.Credentials.Expiration) : undefined,
43
+ };
44
+ return identity;
45
+ }
46
+ }
47
+ S3ExpressIdentityProviderImpl.REFRESH_WINDOW_MS = 60000;
@@ -0,0 +1,41 @@
1
+ import { SignatureV4 } from "@smithy/signature-v4";
2
+ import { SESSION_TOKEN_HEADER, SESSION_TOKEN_QUERY_PARAM } from "../constants";
3
+ export class SignatureV4S3Express extends SignatureV4 {
4
+ async signWithCredentials(requestToSign, credentials, options) {
5
+ const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);
6
+ requestToSign.headers[SESSION_TOKEN_HEADER] = credentials.sessionToken;
7
+ const privateAccess = this;
8
+ setSingleOverride(privateAccess, credentialsWithoutSessionToken);
9
+ return privateAccess.signRequest(requestToSign, options ?? {});
10
+ }
11
+ async presignWithCredentials(requestToSign, credentials, options) {
12
+ const credentialsWithoutSessionToken = getCredentialsWithoutSessionToken(credentials);
13
+ delete requestToSign.headers[SESSION_TOKEN_HEADER];
14
+ requestToSign.headers[SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;
15
+ requestToSign.query = requestToSign.query ?? {};
16
+ requestToSign.query[SESSION_TOKEN_QUERY_PARAM] = credentials.sessionToken;
17
+ const privateAccess = this;
18
+ setSingleOverride(privateAccess, credentialsWithoutSessionToken);
19
+ return this.presign(requestToSign, options);
20
+ }
21
+ }
22
+ function getCredentialsWithoutSessionToken(credentials) {
23
+ const credentialsWithoutSessionToken = {
24
+ accessKeyId: credentials.accessKeyId,
25
+ secretAccessKey: credentials.secretAccessKey,
26
+ expiration: credentials.expiration,
27
+ };
28
+ return credentialsWithoutSessionToken;
29
+ }
30
+ function setSingleOverride(privateAccess, credentialsWithoutSessionToken) {
31
+ const id = setTimeout(() => {
32
+ throw new Error("SignatureV4S3Express credential override was created but not called.");
33
+ }, 10);
34
+ const currentCredentialProvider = privateAccess.credentialProvider;
35
+ const overrideCredentialsProviderOnce = () => {
36
+ clearTimeout(id);
37
+ privateAccess.credentialProvider = currentCredentialProvider;
38
+ return Promise.resolve(credentialsWithoutSessionToken);
39
+ };
40
+ privateAccess.credentialProvider = overrideCredentialsProviderOnce;
41
+ }
@@ -0,0 +1,13 @@
1
+ import { booleanSelector, SelectorType } from "@smithy/util-config-provider";
2
+ export const S3_EXPRESS_BUCKET_TYPE = "Directory";
3
+ export const S3_EXPRESS_BACKEND = "S3Express";
4
+ export const S3_EXPRESS_AUTH_SCHEME = "sigv4-s3express";
5
+ export const SESSION_TOKEN_QUERY_PARAM = "X-Amz-S3session-Token";
6
+ export const SESSION_TOKEN_HEADER = SESSION_TOKEN_QUERY_PARAM.toLowerCase();
7
+ export const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME = "AWS_S3_DISABLE_EXPRESS_SESSION_AUTH";
8
+ export const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME = "s3_disable_express_session_auth";
9
+ export const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS = {
10
+ environmentVariableSelector: (env) => booleanSelector(env, NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME, SelectorType.ENV),
11
+ configFileSelector: (profile) => booleanSelector(profile, NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME, SelectorType.CONFIG),
12
+ default: false,
13
+ };
@@ -0,0 +1,39 @@
1
+ import { HttpRequest } from "@smithy/protocol-http";
2
+ import { S3_EXPRESS_AUTH_SCHEME, S3_EXPRESS_BACKEND, S3_EXPRESS_BUCKET_TYPE, SESSION_TOKEN_HEADER } from "../constants";
3
+ export const s3ExpressMiddleware = (options) => {
4
+ return (next, context) => async (args) => {
5
+ if (context.endpointV2) {
6
+ const endpoint = context.endpointV2;
7
+ const isS3ExpressAuth = endpoint.properties?.authSchemes?.[0]?.name === S3_EXPRESS_AUTH_SCHEME;
8
+ const isS3ExpressBucket = endpoint.properties?.backend === S3_EXPRESS_BACKEND ||
9
+ endpoint.properties?.bucketType === S3_EXPRESS_BUCKET_TYPE;
10
+ if (isS3ExpressBucket) {
11
+ context.isS3ExpressBucket = true;
12
+ }
13
+ if (isS3ExpressAuth) {
14
+ const requestBucket = args.input.Bucket;
15
+ if (requestBucket) {
16
+ const s3ExpressIdentity = await options.s3ExpressIdentityProvider.getS3ExpressIdentity(await options.credentials(), {
17
+ Bucket: requestBucket,
18
+ });
19
+ context.s3ExpressIdentity = s3ExpressIdentity;
20
+ if (HttpRequest.isInstance(args.request) && s3ExpressIdentity.sessionToken) {
21
+ args.request.headers[SESSION_TOKEN_HEADER] = s3ExpressIdentity.sessionToken;
22
+ }
23
+ }
24
+ }
25
+ }
26
+ return next(args);
27
+ };
28
+ };
29
+ export const s3ExpressMiddlewareOptions = {
30
+ name: "s3ExpressMiddleware",
31
+ step: "build",
32
+ tags: ["S3", "S3_EXPRESS"],
33
+ override: true,
34
+ };
35
+ export const getS3ExpressPlugin = (options) => ({
36
+ applyToStack: (clientStack) => {
37
+ clientStack.add(s3ExpressMiddleware(options), s3ExpressMiddlewareOptions);
38
+ },
39
+ });
@@ -0,0 +1,6 @@
1
+ export { S3ExpressIdentityCache } from "./classes/S3ExpressIdentityCache";
2
+ export { S3ExpressIdentityCacheEntry } from "./classes/S3ExpressIdentityCacheEntry";
3
+ export { S3ExpressIdentityProviderImpl } from "./classes/S3ExpressIdentityProviderImpl";
4
+ export { SignatureV4S3Express } from "./classes/SignatureV4S3Express";
5
+ export { NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS } from "./constants";
6
+ export { getS3ExpressPlugin, s3ExpressMiddleware, s3ExpressMiddlewareOptions } from "./functions/s3ExpressMiddleware";
@@ -0,0 +1 @@
1
+ export {};
@@ -1,7 +1,16 @@
1
- export const resolveS3Config = (input) => ({
2
- ...input,
3
- forcePathStyle: input.forcePathStyle ?? false,
4
- useAccelerateEndpoint: input.useAccelerateEndpoint ?? false,
5
- disableMultiregionAccessPoints: input.disableMultiregionAccessPoints ?? false,
6
- followRegionRedirects: input.followRegionRedirects ?? false,
7
- });
1
+ import { S3ExpressIdentityProviderImpl } from "./s3-express";
2
+ export const resolveS3Config = (input, { session, }) => {
3
+ const [s3ClientProvider, CreateSessionCommandCtor] = session;
4
+ return {
5
+ ...input,
6
+ forcePathStyle: input.forcePathStyle ?? false,
7
+ useAccelerateEndpoint: input.useAccelerateEndpoint ?? false,
8
+ disableMultiregionAccessPoints: input.disableMultiregionAccessPoints ?? false,
9
+ followRegionRedirects: input.followRegionRedirects ?? false,
10
+ s3ExpressIdentityProvider: input.s3ExpressIdentityProvider ??
11
+ new S3ExpressIdentityProviderImpl(async (key) => s3ClientProvider().send(new CreateSessionCommandCtor({
12
+ Bucket: key,
13
+ SessionMode: "ReadWrite",
14
+ }))),
15
+ };
16
+ };
@@ -1,6 +1,7 @@
1
1
  export * from "./check-content-length-header";
2
2
  export * from "./region-redirect-endpoint-middleware";
3
3
  export * from "./region-redirect-middleware";
4
+ export * from "./s3-express/index";
4
5
  export * from "./s3Configuration";
5
6
  export * from "./throw-200-exceptions";
6
7
  export * from "./validate-bucket-name";
@@ -0,0 +1,16 @@
1
+ import { S3ExpressIdentityCacheEntry } from "./S3ExpressIdentityCacheEntry";
2
+ /**
3
+ * @internal
4
+ *
5
+ * Stores identities by key.
6
+ */
7
+ export declare class S3ExpressIdentityCache {
8
+ private data;
9
+ private lastPurgeTime;
10
+ static EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS: number;
11
+ constructor(data?: Record<string, S3ExpressIdentityCacheEntry>);
12
+ get(key: string): undefined | S3ExpressIdentityCacheEntry;
13
+ set(key: string, entry: S3ExpressIdentityCacheEntry): S3ExpressIdentityCacheEntry;
14
+ delete(key: string): void;
15
+ purgeExpired(): Promise<void>;
16
+ }
@@ -0,0 +1,16 @@
1
+ import { S3ExpressIdentity } from "../interfaces/S3ExpressIdentity";
2
+ /**
3
+ * @internal
4
+ */
5
+ export declare class S3ExpressIdentityCacheEntry {
6
+ private _identity;
7
+ isRefreshing: boolean;
8
+ accessed: number;
9
+ /**
10
+ * @param identity - stored identity.
11
+ * @param accessed - timestamp of last access in epoch ms.
12
+ * @param isRefreshing - this key is currently in the process of being refreshed (background).
13
+ */
14
+ constructor(_identity: Promise<S3ExpressIdentity>, isRefreshing?: boolean, accessed?: number);
15
+ get identity(): Promise<S3ExpressIdentity>;
16
+ }
@@ -0,0 +1,32 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ import { S3ExpressIdentity } from "../interfaces/S3ExpressIdentity";
3
+ import { S3ExpressIdentityProvider } from "../interfaces/S3ExpressIdentityProvider";
4
+ import { S3ExpressIdentityCache } from "./S3ExpressIdentityCache";
5
+ /**
6
+ * @internal
7
+ *
8
+ * This should match S3::CreateSessionCommandOutput::SessionCredentials
9
+ * but it is not imported since that would create a circular dependency.
10
+ */
11
+ type Credentials = {
12
+ AccessKeyId: string | undefined;
13
+ SecretAccessKey: string | undefined;
14
+ SessionToken: string | undefined;
15
+ Expiration: Date | undefined;
16
+ };
17
+ /**
18
+ * @internal
19
+ */
20
+ export declare class S3ExpressIdentityProviderImpl implements S3ExpressIdentityProvider {
21
+ private createSessionFn;
22
+ private cache;
23
+ static REFRESH_WINDOW_MS: number;
24
+ constructor(createSessionFn: (key: string) => Promise<{
25
+ Credentials: Credentials;
26
+ }>, cache?: S3ExpressIdentityCache);
27
+ getS3ExpressIdentity(awsIdentity: AwsCredentialIdentity, identityProperties: {
28
+ Bucket: string;
29
+ } & Record<string, string>): Promise<S3ExpressIdentity>;
30
+ private getIdentity;
31
+ }
32
+ export {};
@@ -0,0 +1,17 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ import { SignatureV4 } from "@smithy/signature-v4";
3
+ import { HttpRequest as IHttpRequest, RequestPresigningArguments, RequestSigningArguments } from "@smithy/types";
4
+ export declare class SignatureV4S3Express extends SignatureV4 {
5
+ /**
6
+ * Signs with alternate provided credentials instead of those provided in the
7
+ * constructor.
8
+ *
9
+ * Additionally omits the credential sessionToken and assigns it to the
10
+ * alternate header field for S3 Express.
11
+ */
12
+ signWithCredentials(requestToSign: IHttpRequest, credentials: AwsCredentialIdentity, options?: RequestSigningArguments): Promise<IHttpRequest>;
13
+ /**
14
+ * Similar to {@link SignatureV4S3Express#signWithCredentials} but for presigning.
15
+ */
16
+ presignWithCredentials(requestToSign: IHttpRequest, credentials: AwsCredentialIdentity, options?: RequestPresigningArguments): Promise<IHttpRequest>;
17
+ }
@@ -0,0 +1,37 @@
1
+ import type { LoadedConfigSelectors } from "@smithy/node-config-provider";
2
+ /**
3
+ * @internal
4
+ *
5
+ * @deprecated will be replaced by backend.
6
+ *
7
+ * TODO(s3-express): non-beta value, backend == S3Express.
8
+ */
9
+ export declare const S3_EXPRESS_BUCKET_TYPE = "Directory";
10
+ /**
11
+ * @internal
12
+ */
13
+ export declare const S3_EXPRESS_BACKEND = "S3Express";
14
+ /**
15
+ * @internal
16
+ */
17
+ export declare const S3_EXPRESS_AUTH_SCHEME = "sigv4-s3express";
18
+ /**
19
+ * @internal
20
+ */
21
+ export declare const SESSION_TOKEN_QUERY_PARAM = "X-Amz-S3session-Token";
22
+ /**
23
+ * @internal
24
+ */
25
+ export declare const SESSION_TOKEN_HEADER: string;
26
+ /**
27
+ * @internal
28
+ */
29
+ export declare const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME = "AWS_S3_DISABLE_EXPRESS_SESSION_AUTH";
30
+ /**
31
+ * @internal
32
+ */
33
+ export declare const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME = "s3_disable_express_session_auth";
34
+ /**
35
+ * @internal
36
+ */
37
+ export declare const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS: LoadedConfigSelectors<boolean>;
@@ -0,0 +1,32 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ import { BuildHandlerOptions, BuildMiddleware, Logger, MemoizedProvider, Pluggable } from "@smithy/types";
3
+ import { S3ExpressIdentity } from "../interfaces/S3ExpressIdentity";
4
+ import { S3ExpressIdentityProvider } from "../interfaces/S3ExpressIdentityProvider";
5
+ declare module "@smithy/types" {
6
+ interface HandlerExecutionContext {
7
+ /**
8
+ * Reserved key, only when using S3.
9
+ */
10
+ s3ExpressIdentity?: S3ExpressIdentity;
11
+ }
12
+ }
13
+ /**
14
+ * @internal
15
+ */
16
+ export interface S3ExpressResolvedConfig {
17
+ logger?: Logger;
18
+ s3ExpressIdentityProvider: S3ExpressIdentityProvider;
19
+ credentials: MemoizedProvider<AwsCredentialIdentity>;
20
+ }
21
+ /**
22
+ * @internal
23
+ */
24
+ export declare const s3ExpressMiddleware: (options: S3ExpressResolvedConfig) => BuildMiddleware<any, any>;
25
+ /**
26
+ * @internal
27
+ */
28
+ export declare const s3ExpressMiddlewareOptions: BuildHandlerOptions;
29
+ /**
30
+ * @internal
31
+ */
32
+ export declare const getS3ExpressPlugin: (options: S3ExpressResolvedConfig) => Pluggable<any, any>;
@@ -0,0 +1,8 @@
1
+ export { S3ExpressIdentityCache } from "./classes/S3ExpressIdentityCache";
2
+ export { S3ExpressIdentityCacheEntry } from "./classes/S3ExpressIdentityCacheEntry";
3
+ export { S3ExpressIdentityProviderImpl } from "./classes/S3ExpressIdentityProviderImpl";
4
+ export { SignatureV4S3Express } from "./classes/SignatureV4S3Express";
5
+ export { NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS } from "./constants";
6
+ export { getS3ExpressPlugin, s3ExpressMiddleware, s3ExpressMiddlewareOptions } from "./functions/s3ExpressMiddleware";
7
+ export { S3ExpressIdentity } from "./interfaces/S3ExpressIdentity";
8
+ export { S3ExpressIdentityProvider } from "./interfaces/S3ExpressIdentityProvider";
@@ -0,0 +1,6 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ /**
3
+ * @public
4
+ */
5
+ export interface S3ExpressIdentity extends AwsCredentialIdentity {
6
+ }
@@ -0,0 +1,12 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ import { S3ExpressIdentity } from "./S3ExpressIdentity";
3
+ /**
4
+ * @public
5
+ */
6
+ export interface S3ExpressIdentityProvider {
7
+ /**
8
+ * @param awsIdentity - pre-existing credentials.
9
+ * @param identityProperties - unknown.
10
+ */
11
+ getS3ExpressIdentity(awsIdentity: AwsCredentialIdentity, identityProperties: Record<string, string>): Promise<S3ExpressIdentity>;
12
+ }
@@ -1,3 +1,5 @@
1
+ import type { Client, Command } from "@smithy/types";
2
+ import { S3ExpressIdentityProvider } from "./s3-express";
1
3
  /**
2
4
  * @public
3
5
  *
@@ -24,11 +26,30 @@ export interface S3InputConfig {
24
26
  * This feature should only be used as a last resort if you do not know the region of your bucket(s) ahead of time.
25
27
  */
26
28
  followRegionRedirects?: boolean;
29
+ s3ExpressIdentityProvider?: S3ExpressIdentityProvider;
27
30
  }
31
+ /**
32
+ * @internal
33
+ * This is a placeholder for the actual
34
+ * S3Client type from \@aws-sdk/client-s3. It is not explicitly
35
+ * imported to avoid a circular dependency.
36
+ */
37
+ type PlaceholderS3Client = Client<any, any, any> & any;
38
+ /**
39
+ * @internal
40
+ * Placeholder for the constructor for CreateSessionCommand.
41
+ */
42
+ type PlaceholderCreateSessionCommandCtor = {
43
+ new (args: any): Command<any, any, any, any, any>;
44
+ };
28
45
  export interface S3ResolvedConfig {
29
46
  forcePathStyle: boolean;
30
47
  useAccelerateEndpoint: boolean;
31
48
  disableMultiregionAccessPoints: boolean;
32
49
  followRegionRedirects: boolean;
50
+ s3ExpressIdentityProvider: S3ExpressIdentityProvider;
33
51
  }
34
- export declare const resolveS3Config: <T>(input: T & S3InputConfig) => T & S3ResolvedConfig;
52
+ export declare const resolveS3Config: <T>(input: T & S3InputConfig, { session, }: {
53
+ session: [() => PlaceholderS3Client, PlaceholderCreateSessionCommandCtor];
54
+ }) => T & S3ResolvedConfig;
55
+ export {};
@@ -1,6 +1,7 @@
1
1
  export * from "./check-content-length-header";
2
2
  export * from "./region-redirect-endpoint-middleware";
3
3
  export * from "./region-redirect-middleware";
4
+ export * from "./s3-express/index";
4
5
  export * from "./s3Configuration";
5
6
  export * from "./throw-200-exceptions";
6
7
  export * from "./validate-bucket-name";
@@ -0,0 +1,14 @@
1
+ import { S3ExpressIdentityCacheEntry } from "./S3ExpressIdentityCacheEntry";
2
+ export declare class S3ExpressIdentityCache {
3
+ private data;
4
+ private lastPurgeTime;
5
+ static EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS: number;
6
+ constructor(data?: Record<string, S3ExpressIdentityCacheEntry>);
7
+ get(key: string): undefined | S3ExpressIdentityCacheEntry;
8
+ set(
9
+ key: string,
10
+ entry: S3ExpressIdentityCacheEntry
11
+ ): S3ExpressIdentityCacheEntry;
12
+ delete(key: string): void;
13
+ purgeExpired(): Promise<void>;
14
+ }
@@ -0,0 +1,12 @@
1
+ import { S3ExpressIdentity } from "../interfaces/S3ExpressIdentity";
2
+ export declare class S3ExpressIdentityCacheEntry {
3
+ private _identity;
4
+ isRefreshing: boolean;
5
+ accessed: number;
6
+ constructor(
7
+ _identity: Promise<S3ExpressIdentity>,
8
+ isRefreshing?: boolean,
9
+ accessed?: number
10
+ );
11
+ readonly identity: Promise<S3ExpressIdentity>;
12
+ }
@@ -0,0 +1,31 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ import { S3ExpressIdentity } from "../interfaces/S3ExpressIdentity";
3
+ import { S3ExpressIdentityProvider } from "../interfaces/S3ExpressIdentityProvider";
4
+ import { S3ExpressIdentityCache } from "./S3ExpressIdentityCache";
5
+ type Credentials = {
6
+ AccessKeyId: string | undefined;
7
+ SecretAccessKey: string | undefined;
8
+ SessionToken: string | undefined;
9
+ Expiration: Date | undefined;
10
+ };
11
+ export declare class S3ExpressIdentityProviderImpl
12
+ implements S3ExpressIdentityProvider
13
+ {
14
+ private createSessionFn;
15
+ private cache;
16
+ static REFRESH_WINDOW_MS: number;
17
+ constructor(
18
+ createSessionFn: (key: string) => Promise<{
19
+ Credentials: Credentials;
20
+ }>,
21
+ cache?: S3ExpressIdentityCache
22
+ );
23
+ getS3ExpressIdentity(
24
+ awsIdentity: AwsCredentialIdentity,
25
+ identityProperties: {
26
+ Bucket: string;
27
+ } & Record<string, string>
28
+ ): Promise<S3ExpressIdentity>;
29
+ private getIdentity;
30
+ }
31
+ export {};
@@ -0,0 +1,19 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ import { SignatureV4 } from "@smithy/signature-v4";
3
+ import {
4
+ HttpRequest as IHttpRequest,
5
+ RequestPresigningArguments,
6
+ RequestSigningArguments,
7
+ } from "@smithy/types";
8
+ export declare class SignatureV4S3Express extends SignatureV4 {
9
+ signWithCredentials(
10
+ requestToSign: IHttpRequest,
11
+ credentials: AwsCredentialIdentity,
12
+ options?: RequestSigningArguments
13
+ ): Promise<IHttpRequest>;
14
+ presignWithCredentials(
15
+ requestToSign: IHttpRequest,
16
+ credentials: AwsCredentialIdentity,
17
+ options?: RequestPresigningArguments
18
+ ): Promise<IHttpRequest>;
19
+ }
@@ -0,0 +1,11 @@
1
+ import { LoadedConfigSelectors } from "@smithy/node-config-provider";
2
+ export declare const S3_EXPRESS_BUCKET_TYPE = "Directory";
3
+ export declare const S3_EXPRESS_BACKEND = "S3Express";
4
+ export declare const S3_EXPRESS_AUTH_SCHEME = "sigv4-s3express";
5
+ export declare const SESSION_TOKEN_QUERY_PARAM = "X-Amz-S3session-Token";
6
+ export declare const SESSION_TOKEN_HEADER: string;
7
+ export declare const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME =
8
+ "AWS_S3_DISABLE_EXPRESS_SESSION_AUTH";
9
+ export declare const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME =
10
+ "s3_disable_express_session_auth";
11
+ export declare const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS: LoadedConfigSelectors<boolean>;
@@ -0,0 +1,27 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ import {
3
+ BuildHandlerOptions,
4
+ BuildMiddleware,
5
+ Logger,
6
+ MemoizedProvider,
7
+ Pluggable,
8
+ } from "@smithy/types";
9
+ import { S3ExpressIdentity } from "../interfaces/S3ExpressIdentity";
10
+ import { S3ExpressIdentityProvider } from "../interfaces/S3ExpressIdentityProvider";
11
+ declare module "@smithy/types" {
12
+ interface HandlerExecutionContext {
13
+ s3ExpressIdentity?: S3ExpressIdentity;
14
+ }
15
+ }
16
+ export interface S3ExpressResolvedConfig {
17
+ logger?: Logger;
18
+ s3ExpressIdentityProvider: S3ExpressIdentityProvider;
19
+ credentials: MemoizedProvider<AwsCredentialIdentity>;
20
+ }
21
+ export declare const s3ExpressMiddleware: (
22
+ options: S3ExpressResolvedConfig
23
+ ) => BuildMiddleware<any, any>;
24
+ export declare const s3ExpressMiddlewareOptions: BuildHandlerOptions;
25
+ export declare const getS3ExpressPlugin: (
26
+ options: S3ExpressResolvedConfig
27
+ ) => Pluggable<any, any>;
@@ -0,0 +1,12 @@
1
+ export { S3ExpressIdentityCache } from "./classes/S3ExpressIdentityCache";
2
+ export { S3ExpressIdentityCacheEntry } from "./classes/S3ExpressIdentityCacheEntry";
3
+ export { S3ExpressIdentityProviderImpl } from "./classes/S3ExpressIdentityProviderImpl";
4
+ export { SignatureV4S3Express } from "./classes/SignatureV4S3Express";
5
+ export { NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS } from "./constants";
6
+ export {
7
+ getS3ExpressPlugin,
8
+ s3ExpressMiddleware,
9
+ s3ExpressMiddlewareOptions,
10
+ } from "./functions/s3ExpressMiddleware";
11
+ export { S3ExpressIdentity } from "./interfaces/S3ExpressIdentity";
12
+ export { S3ExpressIdentityProvider } from "./interfaces/S3ExpressIdentityProvider";
@@ -0,0 +1,2 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ export interface S3ExpressIdentity extends AwsCredentialIdentity {}
@@ -0,0 +1,8 @@
1
+ import { AwsCredentialIdentity } from "@aws-sdk/types";
2
+ import { S3ExpressIdentity } from "./S3ExpressIdentity";
3
+ export interface S3ExpressIdentityProvider {
4
+ getS3ExpressIdentity(
5
+ awsIdentity: AwsCredentialIdentity,
6
+ identityProperties: Record<string, string>
7
+ ): Promise<S3ExpressIdentity>;
8
+ }
@@ -1,15 +1,29 @@
1
+ import { Client, Command } from "@smithy/types";
2
+ import { S3ExpressIdentityProvider } from "./s3-express";
1
3
  export interface S3InputConfig {
2
4
  forcePathStyle?: boolean;
3
5
  useAccelerateEndpoint?: boolean;
4
6
  disableMultiregionAccessPoints?: boolean;
5
7
  followRegionRedirects?: boolean;
8
+ s3ExpressIdentityProvider?: S3ExpressIdentityProvider;
6
9
  }
10
+ type PlaceholderS3Client = Client<any, any, any> & any;
11
+ type PlaceholderCreateSessionCommandCtor = {
12
+ new (args: any): Command<any, any, any, any, any>;
13
+ };
7
14
  export interface S3ResolvedConfig {
8
15
  forcePathStyle: boolean;
9
16
  useAccelerateEndpoint: boolean;
10
17
  disableMultiregionAccessPoints: boolean;
11
18
  followRegionRedirects: boolean;
19
+ s3ExpressIdentityProvider: S3ExpressIdentityProvider;
12
20
  }
13
21
  export declare const resolveS3Config: <T>(
14
- input: T & S3InputConfig
22
+ input: T & S3InputConfig,
23
+ {
24
+ session,
25
+ }: {
26
+ session: [() => PlaceholderS3Client, PlaceholderCreateSessionCommandCtor];
27
+ }
15
28
  ) => T & S3ResolvedConfig;
29
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-sdk/middleware-sdk-s3",
3
- "version": "3.460.0",
3
+ "version": "3.465.0",
4
4
  "scripts": {
5
5
  "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types'",
6
6
  "build:cjs": "tsc -p tsconfig.cjs.json",
@@ -23,11 +23,14 @@
23
23
  },
24
24
  "license": "Apache-2.0",
25
25
  "dependencies": {
26
- "@aws-sdk/types": "3.460.0",
27
- "@aws-sdk/util-arn-parser": "3.310.0",
26
+ "@aws-sdk/types": "3.465.0",
27
+ "@aws-sdk/util-arn-parser": "3.465.0",
28
+ "@smithy/node-config-provider": "^2.1.5",
28
29
  "@smithy/protocol-http": "^3.0.9",
30
+ "@smithy/signature-v4": "^2.0.0",
29
31
  "@smithy/smithy-client": "^2.1.15",
30
32
  "@smithy/types": "^2.5.0",
33
+ "@smithy/util-config-provider": "^2.0.0",
31
34
  "tslib": "^2.5.0"
32
35
  },
33
36
  "devDependencies": {
@@ -35,7 +38,6 @@
35
38
  "concurrently": "7.0.0",
36
39
  "downlevel-dts": "0.10.1",
37
40
  "rimraf": "3.0.2",
38
- "typedoc": "0.23.23",
39
41
  "typescript": "~4.9.5"
40
42
  },
41
43
  "engines": {
@@ -56,8 +58,5 @@
56
58
  "type": "git",
57
59
  "url": "https://github.com/aws/aws-sdk-js-v3.git",
58
60
  "directory": "packages/middleware-sdk-s3"
59
- },
60
- "typedoc": {
61
- "entryPoint": "src/index.ts"
62
61
  }
63
62
  }