@aws-sdk/middleware-sdk-s3 3.972.46 → 3.972.47

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 (143) hide show
  1. package/dist-cjs/index.browser.js +34 -0
  2. package/dist-cjs/index.js +57 -53
  3. package/dist-cjs/submodules/s3/index.browser.js +1028 -0
  4. package/dist-cjs/submodules/s3/index.js +1042 -0
  5. package/dist-cjs/submodules/s3-control/index.js +215 -0
  6. package/dist-es/index.browser.js +1 -0
  7. package/dist-es/index.js +1 -9
  8. package/dist-es/submodules/s3/NodeDisableMultiregionAccessPointConfigOptions.js +8 -0
  9. package/dist-es/submodules/s3/NodeUseArnRegionConfigOptions.js +8 -0
  10. package/dist-es/submodules/s3/index.browser.js +30 -0
  11. package/dist-es/submodules/s3/index.js +25 -0
  12. package/dist-es/submodules/s3/middleware-bucket-endpoint/bucketEndpointMiddleware.js +81 -0
  13. package/dist-es/submodules/s3/middleware-bucket-endpoint/bucketHostname.js +106 -0
  14. package/dist-es/submodules/s3/middleware-bucket-endpoint/bucketHostnameUtils.js +111 -0
  15. package/dist-es/submodules/s3/middleware-bucket-endpoint/configurations.js +12 -0
  16. package/dist-es/submodules/s3/middleware-expect-continue/middleware-expect-continue.js +41 -0
  17. package/dist-es/submodules/s3/middleware-location-constraint/configuration.js +3 -0
  18. package/dist-es/submodules/s3/middleware-location-constraint/middleware-location-constraint.js +24 -0
  19. package/dist-es/{s3Configuration.js → submodules/s3/middleware-s3-configuration/s3Configuration.js} +1 -1
  20. package/dist-es/submodules/s3/middleware-ssec/middleware-ssec.js +66 -0
  21. package/dist-es/{throw-200-exceptions.js → submodules/s3/middleware-throw-200-exceptions/throw-200-exceptions.js} +1 -1
  22. package/dist-es/{validate-bucket-name.js → submodules/s3/middleware-validate-bucket-name/validate-bucket-name.js} +1 -1
  23. package/dist-es/submodules/s3-control/configurations.js +7 -0
  24. package/dist-es/submodules/s3-control/constants.js +5 -0
  25. package/dist-es/submodules/s3-control/index.js +7 -0
  26. package/dist-es/submodules/s3-control/middleware-host-prefix-deduplication/hostPrefixDeduplicationMiddleware.js +17 -0
  27. package/dist-es/submodules/s3-control/middleware-process-arnables/getOutpostEndpoint.js +18 -0
  28. package/dist-es/submodules/s3-control/middleware-process-arnables/getProcessArnablesPlugin.js +8 -0
  29. package/dist-es/submodules/s3-control/middleware-process-arnables/parse-outpost-arnables.js +94 -0
  30. package/dist-es/submodules/s3-control/middleware-process-arnables/update-arnables-request.js +31 -0
  31. package/dist-es/submodules/s3-control/middleware-redirect-from-postid/redirect-from-postid.js +26 -0
  32. package/dist-types/index.browser.d.ts +2 -0
  33. package/dist-types/index.d.ts +2 -9
  34. package/dist-types/submodules/s3/NodeDisableMultiregionAccessPointConfigOptions.d.ts +4 -0
  35. package/dist-types/submodules/s3/NodeUseArnRegionConfigOptions.d.ts +9 -0
  36. package/dist-types/submodules/s3/index.browser.d.ts +36 -0
  37. package/dist-types/submodules/s3/index.d.ts +32 -0
  38. package/dist-types/submodules/s3/middleware-bucket-endpoint/bucketEndpointMiddleware.d.ts +17 -0
  39. package/dist-types/submodules/s3/middleware-bucket-endpoint/bucketHostname.d.ts +16 -0
  40. package/dist-types/submodules/s3/middleware-bucket-endpoint/bucketHostnameUtils.d.ts +174 -0
  41. package/dist-types/submodules/s3/middleware-bucket-endpoint/configurations.d.ts +95 -0
  42. package/dist-types/submodules/s3/middleware-expect-continue/middleware-expect-continue.d.ts +12 -0
  43. package/dist-types/submodules/s3/middleware-location-constraint/configuration.d.ts +17 -0
  44. package/dist-types/submodules/s3/middleware-location-constraint/middleware-location-constraint.d.ts +10 -0
  45. package/dist-types/{s3Configuration.d.ts → submodules/s3/middleware-s3-configuration/s3Configuration.d.ts} +1 -1
  46. package/dist-types/submodules/s3/middleware-ssec/middleware-ssec.d.ts +12 -0
  47. package/dist-types/{validate-bucket-name.d.ts → submodules/s3/middleware-validate-bucket-name/validate-bucket-name.d.ts} +1 -1
  48. package/dist-types/submodules/s3-control/configurations.d.ts +47 -0
  49. package/dist-types/submodules/s3-control/constants.d.ts +5 -0
  50. package/dist-types/submodules/s3-control/index.d.ts +9 -0
  51. package/dist-types/submodules/s3-control/middleware-host-prefix-deduplication/hostPrefixDeduplicationMiddleware.d.ts +17 -0
  52. package/dist-types/submodules/s3-control/middleware-process-arnables/getOutpostEndpoint.d.ts +6 -0
  53. package/dist-types/submodules/s3-control/middleware-process-arnables/getProcessArnablesPlugin.d.ts +3 -0
  54. package/dist-types/submodules/s3-control/middleware-process-arnables/parse-outpost-arnables.d.ts +27 -0
  55. package/dist-types/submodules/s3-control/middleware-process-arnables/update-arnables-request.d.ts +19 -0
  56. package/dist-types/submodules/s3-control/middleware-redirect-from-postid/redirect-from-postid.d.ts +17 -0
  57. package/dist-types/ts3.4/index.browser.d.ts +39 -0
  58. package/dist-types/ts3.4/index.d.ts +39 -9
  59. package/dist-types/ts3.4/submodules/s3/NodeDisableMultiregionAccessPointConfigOptions.d.ts +6 -0
  60. package/dist-types/ts3.4/submodules/s3/NodeUseArnRegionConfigOptions.d.ts +6 -0
  61. package/dist-types/ts3.4/submodules/s3/index.browser.d.ts +103 -0
  62. package/dist-types/ts3.4/submodules/s3/index.d.ts +107 -0
  63. package/dist-types/ts3.4/submodules/s3/middleware-bucket-endpoint/bucketEndpointMiddleware.d.ts +13 -0
  64. package/dist-types/ts3.4/submodules/s3/middleware-bucket-endpoint/bucketHostname.d.ts +10 -0
  65. package/dist-types/ts3.4/submodules/s3/middleware-bucket-endpoint/bucketHostnameUtils.d.ts +80 -0
  66. package/dist-types/ts3.4/submodules/s3/middleware-bucket-endpoint/configurations.d.ts +31 -0
  67. package/dist-types/ts3.4/submodules/s3/middleware-expect-continue/middleware-expect-continue.d.ts +22 -0
  68. package/dist-types/ts3.4/submodules/s3/middleware-location-constraint/configuration.d.ts +12 -0
  69. package/dist-types/ts3.4/submodules/s3/middleware-location-constraint/middleware-location-constraint.d.ts +13 -0
  70. package/dist-types/ts3.4/{s3Configuration.d.ts → submodules/s3/middleware-s3-configuration/s3Configuration.d.ts} +1 -1
  71. package/dist-types/ts3.4/submodules/s3/middleware-ssec/middleware-ssec.d.ts +27 -0
  72. package/dist-types/ts3.4/{validate-bucket-name.d.ts → submodules/s3/middleware-validate-bucket-name/validate-bucket-name.d.ts} +1 -1
  73. package/dist-types/ts3.4/submodules/s3-control/configurations.d.ts +23 -0
  74. package/dist-types/ts3.4/submodules/s3-control/constants.d.ts +5 -0
  75. package/dist-types/ts3.4/submodules/s3-control/index.d.ts +26 -0
  76. package/dist-types/ts3.4/submodules/s3-control/middleware-host-prefix-deduplication/hostPrefixDeduplicationMiddleware.d.ts +13 -0
  77. package/dist-types/ts3.4/submodules/s3-control/middleware-process-arnables/getOutpostEndpoint.d.ts +13 -0
  78. package/dist-types/ts3.4/submodules/s3-control/middleware-process-arnables/getProcessArnablesPlugin.d.ts +5 -0
  79. package/dist-types/ts3.4/submodules/s3-control/middleware-process-arnables/parse-outpost-arnables.d.ts +12 -0
  80. package/dist-types/ts3.4/submodules/s3-control/middleware-process-arnables/update-arnables-request.d.ts +13 -0
  81. package/dist-types/ts3.4/submodules/s3-control/middleware-redirect-from-postid/redirect-from-postid.d.ts +22 -0
  82. package/package.json +50 -4
  83. package/dist-cjs/toStream.browser.js +0 -11
  84. package/dist-cjs/toStream.js +0 -7
  85. package/dist-es/s3-express/index.js +0 -7
  86. package/dist-types/s3-express/index.d.ts +0 -9
  87. package/dist-types/ts3.4/s3-express/index.d.ts +0 -17
  88. /package/dist-es/{check-content-length-header.js → submodules/s3/middleware-check-content-length-header/check-content-length-header.js} +0 -0
  89. /package/dist-es/{bucket-endpoint-middleware.js → submodules/s3/middleware-region-redirect/bucket-endpoint-middleware.js} +0 -0
  90. /package/dist-es/{region-redirect-endpoint-middleware.js → submodules/s3/middleware-region-redirect/region-redirect-endpoint-middleware.js} +0 -0
  91. /package/dist-es/{region-redirect-middleware.js → submodules/s3/middleware-region-redirect/region-redirect-middleware.js} +0 -0
  92. /package/dist-es/{s3-expires-middleware.js → submodules/s3/middleware-s3-expires/s3-expires-middleware.js} +0 -0
  93. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/classes/S3ExpressIdentityCache.js +0 -0
  94. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/classes/S3ExpressIdentityCacheEntry.js +0 -0
  95. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/classes/S3ExpressIdentityProviderImpl.js +0 -0
  96. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/classes/SignatureV4S3Express.js +0 -0
  97. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/constants.js +0 -0
  98. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/functions/s3ExpressHttpSigningMiddleware.js +0 -0
  99. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/functions/s3ExpressMiddleware.js +0 -0
  100. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/functions/signS3Express.js +0 -0
  101. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/interfaces/S3ExpressIdentity.js +0 -0
  102. /package/dist-es/{s3-express → submodules/s3/middleware-s3-express}/interfaces/S3ExpressIdentityProvider.js +0 -0
  103. /package/dist-es/{protocol → submodules/s3/protocol}/S3RestXmlProtocol.js +0 -0
  104. /package/dist-es/{toStream.browser.js → submodules/s3/to-stream/toStream.browser.js} +0 -0
  105. /package/dist-es/{toStream.js → submodules/s3/to-stream/toStream.js} +0 -0
  106. /package/dist-types/{check-content-length-header.d.ts → submodules/s3/middleware-check-content-length-header/check-content-length-header.d.ts} +0 -0
  107. /package/dist-types/{bucket-endpoint-middleware.d.ts → submodules/s3/middleware-region-redirect/bucket-endpoint-middleware.d.ts} +0 -0
  108. /package/dist-types/{region-redirect-endpoint-middleware.d.ts → submodules/s3/middleware-region-redirect/region-redirect-endpoint-middleware.d.ts} +0 -0
  109. /package/dist-types/{region-redirect-middleware.d.ts → submodules/s3/middleware-region-redirect/region-redirect-middleware.d.ts} +0 -0
  110. /package/dist-types/{s3-expires-middleware.d.ts → submodules/s3/middleware-s3-expires/s3-expires-middleware.d.ts} +0 -0
  111. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/classes/S3ExpressIdentityCache.d.ts +0 -0
  112. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/classes/S3ExpressIdentityCacheEntry.d.ts +0 -0
  113. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/classes/S3ExpressIdentityProviderImpl.d.ts +0 -0
  114. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/classes/SignatureV4S3Express.d.ts +0 -0
  115. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/constants.d.ts +0 -0
  116. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/functions/s3ExpressHttpSigningMiddleware.d.ts +0 -0
  117. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/functions/s3ExpressMiddleware.d.ts +0 -0
  118. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/functions/signS3Express.d.ts +0 -0
  119. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/interfaces/S3ExpressIdentity.d.ts +0 -0
  120. /package/dist-types/{s3-express → submodules/s3/middleware-s3-express}/interfaces/S3ExpressIdentityProvider.d.ts +0 -0
  121. /package/dist-types/{throw-200-exceptions.d.ts → submodules/s3/middleware-throw-200-exceptions/throw-200-exceptions.d.ts} +0 -0
  122. /package/dist-types/{protocol → submodules/s3/protocol}/S3RestXmlProtocol.d.ts +0 -0
  123. /package/dist-types/{toStream.browser.d.ts → submodules/s3/to-stream/toStream.browser.d.ts} +0 -0
  124. /package/dist-types/{toStream.d.ts → submodules/s3/to-stream/toStream.d.ts} +0 -0
  125. /package/dist-types/ts3.4/{check-content-length-header.d.ts → submodules/s3/middleware-check-content-length-header/check-content-length-header.d.ts} +0 -0
  126. /package/dist-types/ts3.4/{bucket-endpoint-middleware.d.ts → submodules/s3/middleware-region-redirect/bucket-endpoint-middleware.d.ts} +0 -0
  127. /package/dist-types/ts3.4/{region-redirect-endpoint-middleware.d.ts → submodules/s3/middleware-region-redirect/region-redirect-endpoint-middleware.d.ts} +0 -0
  128. /package/dist-types/ts3.4/{region-redirect-middleware.d.ts → submodules/s3/middleware-region-redirect/region-redirect-middleware.d.ts} +0 -0
  129. /package/dist-types/ts3.4/{s3-expires-middleware.d.ts → submodules/s3/middleware-s3-expires/s3-expires-middleware.d.ts} +0 -0
  130. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/classes/S3ExpressIdentityCache.d.ts +0 -0
  131. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/classes/S3ExpressIdentityCacheEntry.d.ts +0 -0
  132. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/classes/S3ExpressIdentityProviderImpl.d.ts +0 -0
  133. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/classes/SignatureV4S3Express.d.ts +0 -0
  134. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/constants.d.ts +0 -0
  135. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/functions/s3ExpressHttpSigningMiddleware.d.ts +0 -0
  136. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/functions/s3ExpressMiddleware.d.ts +0 -0
  137. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/functions/signS3Express.d.ts +0 -0
  138. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/interfaces/S3ExpressIdentity.d.ts +0 -0
  139. /package/dist-types/ts3.4/{s3-express → submodules/s3/middleware-s3-express}/interfaces/S3ExpressIdentityProvider.d.ts +0 -0
  140. /package/dist-types/ts3.4/{throw-200-exceptions.d.ts → submodules/s3/middleware-throw-200-exceptions/throw-200-exceptions.d.ts} +0 -0
  141. /package/dist-types/ts3.4/{protocol → submodules/s3/protocol}/S3RestXmlProtocol.d.ts +0 -0
  142. /package/dist-types/ts3.4/{toStream.browser.d.ts → submodules/s3/to-stream/toStream.browser.d.ts} +0 -0
  143. /package/dist-types/ts3.4/{toStream.d.ts → submodules/s3/to-stream/toStream.d.ts} +0 -0
@@ -0,0 +1,1042 @@
1
+ 'use strict';
2
+
3
+ var client = require('@smithy/core/client');
4
+ var protocols = require('@smithy/core/protocols');
5
+ var serde = require('@smithy/core/serde');
6
+ var signatureV4MultiRegion = require('@aws-sdk/signature-v4-multi-region');
7
+ var config = require('@smithy/core/config');
8
+ var client$1 = require('@aws-sdk/core/client');
9
+ var core = require('@smithy/core');
10
+ var node_stream = require('node:stream');
11
+ var util = require('@aws-sdk/core/util');
12
+ var protocols$1 = require('@aws-sdk/core/protocols');
13
+ var schema = require('@smithy/core/schema');
14
+
15
+ const CONTENT_LENGTH_HEADER = "content-length";
16
+ const DECODED_CONTENT_LENGTH_HEADER = "x-amz-decoded-content-length";
17
+ function checkContentLengthHeader() {
18
+ return (next, context) => async (args) => {
19
+ const { request } = args;
20
+ if (protocols.HttpRequest.isInstance(request)) {
21
+ if (!(CONTENT_LENGTH_HEADER in request.headers) && !(DECODED_CONTENT_LENGTH_HEADER in request.headers)) {
22
+ const message = `Are you using a Stream of unknown length as the Body of a PutObject request? Consider using Upload instead from @aws-sdk/lib-storage.`;
23
+ if (typeof context?.logger?.warn === "function" && !(context.logger instanceof client.NoOpLogger)) {
24
+ context.logger.warn(message);
25
+ }
26
+ else {
27
+ console.warn(message);
28
+ }
29
+ }
30
+ }
31
+ return next({ ...args });
32
+ };
33
+ }
34
+ const checkContentLengthHeaderMiddlewareOptions = {
35
+ step: "finalizeRequest",
36
+ tags: ["CHECK_CONTENT_LENGTH_HEADER"],
37
+ name: "getCheckContentLengthHeaderPlugin",
38
+ override: true,
39
+ };
40
+ const getCheckContentLengthHeaderPlugin = (unused) => ({
41
+ applyToStack: (clientStack) => {
42
+ clientStack.add(checkContentLengthHeader(), checkContentLengthHeaderMiddlewareOptions);
43
+ },
44
+ });
45
+
46
+ const regionRedirectEndpointMiddleware = (config) => {
47
+ return (next, context) => async (args) => {
48
+ const originalRegion = await config.region();
49
+ const regionProviderRef = config.region;
50
+ let unlock = () => { };
51
+ if (context.__s3RegionRedirect) {
52
+ Object.defineProperty(config, "region", {
53
+ writable: false,
54
+ value: async () => {
55
+ return context.__s3RegionRedirect;
56
+ },
57
+ });
58
+ unlock = () => Object.defineProperty(config, "region", {
59
+ writable: true,
60
+ value: regionProviderRef,
61
+ });
62
+ }
63
+ try {
64
+ const result = await next(args);
65
+ if (context.__s3RegionRedirect) {
66
+ unlock();
67
+ const region = await config.region();
68
+ if (originalRegion !== region) {
69
+ throw new Error("Region was not restored following S3 region redirect.");
70
+ }
71
+ }
72
+ return result;
73
+ }
74
+ catch (e) {
75
+ unlock();
76
+ throw e;
77
+ }
78
+ };
79
+ };
80
+ const regionRedirectEndpointMiddlewareOptions = {
81
+ tags: ["REGION_REDIRECT", "S3"],
82
+ name: "regionRedirectEndpointMiddleware",
83
+ override: true,
84
+ relation: "before",
85
+ toMiddleware: "endpointV2Middleware",
86
+ };
87
+
88
+ function regionRedirectMiddleware(clientConfig) {
89
+ return (next, context) => async (args) => {
90
+ try {
91
+ return await next(args);
92
+ }
93
+ catch (err) {
94
+ if (clientConfig.followRegionRedirects) {
95
+ const statusCode = err?.$metadata?.httpStatusCode;
96
+ const isHeadBucket = context.commandName === "HeadBucketCommand";
97
+ const bucketRegionHeader = err?.$response?.headers?.["x-amz-bucket-region"];
98
+ if (bucketRegionHeader) {
99
+ if (statusCode === 301 ||
100
+ (statusCode === 400 && (err?.name === "IllegalLocationConstraintException" || isHeadBucket))) {
101
+ try {
102
+ const actualRegion = bucketRegionHeader;
103
+ context.logger?.debug(`Redirecting from ${await clientConfig.region()} to ${actualRegion}`);
104
+ context.__s3RegionRedirect = actualRegion;
105
+ }
106
+ catch (e) {
107
+ throw new Error("Region redirect failed: " + e);
108
+ }
109
+ return next(args);
110
+ }
111
+ }
112
+ }
113
+ throw err;
114
+ }
115
+ };
116
+ }
117
+ const regionRedirectMiddlewareOptions = {
118
+ step: "initialize",
119
+ tags: ["REGION_REDIRECT", "S3"],
120
+ name: "regionRedirectMiddleware",
121
+ override: true,
122
+ };
123
+ const getRegionRedirectMiddlewarePlugin = (clientConfig) => ({
124
+ applyToStack: (clientStack) => {
125
+ clientStack.add(regionRedirectMiddleware(clientConfig), regionRedirectMiddlewareOptions);
126
+ clientStack.addRelativeTo(regionRedirectEndpointMiddleware(clientConfig), regionRedirectEndpointMiddlewareOptions);
127
+ },
128
+ });
129
+
130
+ class S3ExpressIdentityCache {
131
+ data;
132
+ lastPurgeTime = Date.now();
133
+ static EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS = 30_000;
134
+ constructor(data = {}) {
135
+ this.data = data;
136
+ }
137
+ get(key) {
138
+ const entry = this.data[key];
139
+ if (!entry) {
140
+ return;
141
+ }
142
+ return entry;
143
+ }
144
+ set(key, entry) {
145
+ this.data[key] = entry;
146
+ return entry;
147
+ }
148
+ delete(key) {
149
+ delete this.data[key];
150
+ }
151
+ async purgeExpired() {
152
+ const now = Date.now();
153
+ if (this.lastPurgeTime + S3ExpressIdentityCache.EXPIRED_CREDENTIAL_PURGE_INTERVAL_MS > now) {
154
+ return;
155
+ }
156
+ for (const key in this.data) {
157
+ const entry = this.data[key];
158
+ if (!entry.isRefreshing) {
159
+ const credential = await entry.identity;
160
+ if (credential.expiration) {
161
+ if (credential.expiration.getTime() < now) {
162
+ delete this.data[key];
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+
170
+ class S3ExpressIdentityCacheEntry {
171
+ _identity;
172
+ isRefreshing;
173
+ accessed;
174
+ constructor(_identity, isRefreshing = false, accessed = Date.now()) {
175
+ this._identity = _identity;
176
+ this.isRefreshing = isRefreshing;
177
+ this.accessed = accessed;
178
+ }
179
+ get identity() {
180
+ this.accessed = Date.now();
181
+ return this._identity;
182
+ }
183
+ }
184
+
185
+ class S3ExpressIdentityProviderImpl {
186
+ createSessionFn;
187
+ cache;
188
+ static REFRESH_WINDOW_MS = 60_000;
189
+ constructor(createSessionFn, cache = new S3ExpressIdentityCache()) {
190
+ this.createSessionFn = createSessionFn;
191
+ this.cache = cache;
192
+ }
193
+ async getS3ExpressIdentity(awsIdentity, identityProperties) {
194
+ const key = identityProperties.Bucket;
195
+ const { cache } = this;
196
+ const entry = cache.get(key);
197
+ if (entry) {
198
+ return entry.identity.then((identity) => {
199
+ const isExpired = (identity.expiration?.getTime() ?? 0) < Date.now();
200
+ if (isExpired) {
201
+ return cache.set(key, new S3ExpressIdentityCacheEntry(this.getIdentity(key))).identity;
202
+ }
203
+ const isExpiringSoon = (identity.expiration?.getTime() ?? 0) < Date.now() + S3ExpressIdentityProviderImpl.REFRESH_WINDOW_MS;
204
+ if (isExpiringSoon && !entry.isRefreshing) {
205
+ entry.isRefreshing = true;
206
+ this.getIdentity(key).then((id) => {
207
+ cache.set(key, new S3ExpressIdentityCacheEntry(Promise.resolve(id)));
208
+ });
209
+ }
210
+ return identity;
211
+ });
212
+ }
213
+ return cache.set(key, new S3ExpressIdentityCacheEntry(this.getIdentity(key))).identity;
214
+ }
215
+ async getIdentity(key) {
216
+ await this.cache.purgeExpired().catch((error) => {
217
+ console.warn("Error while clearing expired entries in S3ExpressIdentityCache: \n" + error);
218
+ });
219
+ const session = await this.createSessionFn(key);
220
+ if (!session.Credentials?.AccessKeyId || !session.Credentials?.SecretAccessKey) {
221
+ throw new Error("s3#createSession response credential missing AccessKeyId or SecretAccessKey.");
222
+ }
223
+ const identity = {
224
+ accessKeyId: session.Credentials.AccessKeyId,
225
+ secretAccessKey: session.Credentials.SecretAccessKey,
226
+ sessionToken: session.Credentials.SessionToken,
227
+ expiration: session.Credentials.Expiration ? new Date(session.Credentials.Expiration) : undefined,
228
+ };
229
+ return identity;
230
+ }
231
+ }
232
+
233
+ const resolveS3Config = (input, { session, }) => {
234
+ const [s3ClientProvider, CreateSessionCommandCtor] = session;
235
+ const { forcePathStyle, useAccelerateEndpoint, disableMultiregionAccessPoints, followRegionRedirects, s3ExpressIdentityProvider, bucketEndpoint, expectContinueHeader, } = input;
236
+ return Object.assign(input, {
237
+ forcePathStyle: forcePathStyle ?? false,
238
+ useAccelerateEndpoint: useAccelerateEndpoint ?? false,
239
+ disableMultiregionAccessPoints: disableMultiregionAccessPoints ?? false,
240
+ followRegionRedirects: followRegionRedirects ?? false,
241
+ s3ExpressIdentityProvider: s3ExpressIdentityProvider ??
242
+ new S3ExpressIdentityProviderImpl(async (key) => s3ClientProvider().send(new CreateSessionCommandCtor({
243
+ Bucket: key,
244
+ }))),
245
+ bucketEndpoint: bucketEndpoint ?? false,
246
+ expectContinueHeader: expectContinueHeader ?? 2_097_152,
247
+ });
248
+ };
249
+
250
+ const s3ExpiresMiddleware = (config) => {
251
+ return (next, context) => async (args) => {
252
+ const result = await next(args);
253
+ const { response } = result;
254
+ if (protocols.HttpResponse.isInstance(response)) {
255
+ if (response.headers.expires) {
256
+ response.headers.expiresstring = response.headers.expires;
257
+ try {
258
+ serde.parseRfc7231DateTime(response.headers.expires);
259
+ }
260
+ catch (e) {
261
+ context.logger?.warn(`AWS SDK Warning for ${context.clientName}::${context.commandName} response parsing (${response.headers.expires}): ${e}`);
262
+ delete response.headers.expires;
263
+ }
264
+ }
265
+ }
266
+ return result;
267
+ };
268
+ };
269
+ const s3ExpiresMiddlewareOptions = {
270
+ tags: ["S3"],
271
+ name: "s3ExpiresMiddleware",
272
+ override: true,
273
+ relation: "after",
274
+ toMiddleware: "deserializerMiddleware",
275
+ };
276
+ const getS3ExpiresMiddlewarePlugin = (clientConfig) => ({
277
+ applyToStack: (clientStack) => {
278
+ clientStack.addRelativeTo(s3ExpiresMiddleware(), s3ExpiresMiddlewareOptions);
279
+ },
280
+ });
281
+
282
+ class SignatureV4S3Express extends signatureV4MultiRegion.SignatureV4SignWithCredentials {
283
+ }
284
+
285
+ const S3_EXPRESS_BUCKET_TYPE = "Directory";
286
+ const S3_EXPRESS_BACKEND = "S3Express";
287
+ const S3_EXPRESS_AUTH_SCHEME = "sigv4-s3express";
288
+ const SESSION_TOKEN_QUERY_PARAM = "X-Amz-S3session-Token";
289
+ const SESSION_TOKEN_HEADER = SESSION_TOKEN_QUERY_PARAM.toLowerCase();
290
+ const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME = "AWS_S3_DISABLE_EXPRESS_SESSION_AUTH";
291
+ const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME = "s3_disable_express_session_auth";
292
+ const NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS = {
293
+ environmentVariableSelector: (env) => config.booleanSelector(env, NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_ENV_NAME, config.SelectorType.ENV),
294
+ configFileSelector: (profile) => config.booleanSelector(profile, NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_INI_NAME, config.SelectorType.CONFIG),
295
+ default: false,
296
+ };
297
+
298
+ const s3ExpressMiddleware = (options) => {
299
+ return (next, context) => async (args) => {
300
+ if (context.endpointV2) {
301
+ const endpoint = context.endpointV2;
302
+ const isS3ExpressAuth = endpoint.properties?.authSchemes?.[0]?.name === S3_EXPRESS_AUTH_SCHEME;
303
+ const isS3ExpressBucket = endpoint.properties?.backend === S3_EXPRESS_BACKEND ||
304
+ endpoint.properties?.bucketType === S3_EXPRESS_BUCKET_TYPE;
305
+ if (isS3ExpressBucket) {
306
+ client$1.setFeature(context, "S3_EXPRESS_BUCKET", "J");
307
+ context.isS3ExpressBucket = true;
308
+ }
309
+ if (isS3ExpressAuth) {
310
+ const requestBucket = args.input.Bucket;
311
+ if (requestBucket) {
312
+ const s3ExpressIdentity = await options.s3ExpressIdentityProvider.getS3ExpressIdentity(await options.credentials(), {
313
+ Bucket: requestBucket,
314
+ });
315
+ context.s3ExpressIdentity = s3ExpressIdentity;
316
+ if (protocols.HttpRequest.isInstance(args.request) && s3ExpressIdentity.sessionToken) {
317
+ args.request.headers[SESSION_TOKEN_HEADER] = s3ExpressIdentity.sessionToken;
318
+ }
319
+ }
320
+ }
321
+ }
322
+ return next(args);
323
+ };
324
+ };
325
+ const s3ExpressMiddlewareOptions = {
326
+ name: "s3ExpressMiddleware",
327
+ step: "build",
328
+ tags: ["S3", "S3_EXPRESS"],
329
+ override: true,
330
+ };
331
+ const getS3ExpressPlugin = (options) => ({
332
+ applyToStack: (clientStack) => {
333
+ clientStack.add(s3ExpressMiddleware(options), s3ExpressMiddlewareOptions);
334
+ },
335
+ });
336
+
337
+ const signS3Express = async (s3ExpressIdentity, signingOptions, request, sigV4MultiRegionSigner) => {
338
+ const signedRequest = await sigV4MultiRegionSigner.signWithCredentials(request, s3ExpressIdentity, {});
339
+ if (signedRequest.headers["X-Amz-Security-Token"] || signedRequest.headers["x-amz-security-token"]) {
340
+ throw new Error("X-Amz-Security-Token must not be set for s3-express requests.");
341
+ }
342
+ return signedRequest;
343
+ };
344
+
345
+ const defaultErrorHandler = (signingProperties) => (error) => {
346
+ throw error;
347
+ };
348
+ const defaultSuccessHandler = (httpResponse, signingProperties) => { };
349
+ const s3ExpressHttpSigningMiddlewareOptions = core.httpSigningMiddlewareOptions;
350
+ const s3ExpressHttpSigningMiddleware = (config) => (next, context) => async (args) => {
351
+ if (!protocols.HttpRequest.isInstance(args.request)) {
352
+ return next(args);
353
+ }
354
+ const smithyContext = client.getSmithyContext(context);
355
+ const scheme = smithyContext.selectedHttpAuthScheme;
356
+ if (!scheme) {
357
+ throw new Error(`No HttpAuthScheme was selected: unable to sign request`);
358
+ }
359
+ const { httpAuthOption: { signingProperties = {} }, identity, signer, } = scheme;
360
+ let request;
361
+ if (context.s3ExpressIdentity) {
362
+ request = await signS3Express(context.s3ExpressIdentity, signingProperties, args.request, await config.signer());
363
+ }
364
+ else {
365
+ request = await signer.sign(args.request, identity, signingProperties);
366
+ }
367
+ const output = await next({
368
+ ...args,
369
+ request,
370
+ }).catch((signer.errorHandler || defaultErrorHandler)(signingProperties));
371
+ (signer.successHandler || defaultSuccessHandler)(output.response, signingProperties);
372
+ return output;
373
+ };
374
+ const getS3ExpressHttpSigningPlugin = (config) => ({
375
+ applyToStack: (clientStack) => {
376
+ clientStack.addRelativeTo(s3ExpressHttpSigningMiddleware(config), core.httpSigningMiddlewareOptions);
377
+ },
378
+ });
379
+
380
+ function toStream(bytes) {
381
+ return node_stream.Readable.from(Buffer.from(bytes));
382
+ }
383
+
384
+ const THROW_IF_EMPTY_BODY = {
385
+ CopyObjectCommand: true,
386
+ UploadPartCopyCommand: true,
387
+ CompleteMultipartUploadCommand: true,
388
+ };
389
+ const throw200ExceptionsMiddleware = (config) => (next, context) => async (args) => {
390
+ const result = await next(args);
391
+ const { response } = result;
392
+ if (!protocols.HttpResponse.isInstance(response)) {
393
+ return result;
394
+ }
395
+ const { statusCode, body } = response;
396
+ if (statusCode < 200 || statusCode >= 300) {
397
+ return result;
398
+ }
399
+ const bodyBytes = await collectBody(body, config);
400
+ response.body = toStream(bodyBytes);
401
+ if (bodyBytes.length === 0 && THROW_IF_EMPTY_BODY[context.commandName]) {
402
+ const err = new Error("S3 aborted request");
403
+ err.$metadata = {
404
+ httpStatusCode: 503,
405
+ };
406
+ err.name = "InternalError";
407
+ throw err;
408
+ }
409
+ const bodyStringTail = config.utf8Encoder(bodyBytes.subarray(bodyBytes.length - 16));
410
+ if (bodyStringTail && bodyStringTail.endsWith("</Error>")) {
411
+ response.statusCode = 503;
412
+ }
413
+ return result;
414
+ };
415
+ const collectBody = (streamBody = new Uint8Array(), context) => {
416
+ if (streamBody instanceof Uint8Array) {
417
+ return Promise.resolve(streamBody);
418
+ }
419
+ return context.streamCollector(streamBody) || Promise.resolve(new Uint8Array());
420
+ };
421
+ const throw200ExceptionsMiddlewareOptions = {
422
+ relation: "after",
423
+ toMiddleware: "deserializerMiddleware",
424
+ tags: ["THROW_200_EXCEPTIONS", "S3"],
425
+ name: "throw200ExceptionsMiddleware",
426
+ override: true,
427
+ };
428
+ const getThrow200ExceptionsPlugin = (config) => ({
429
+ applyToStack: (clientStack) => {
430
+ clientStack.addRelativeTo(throw200ExceptionsMiddleware(config), throw200ExceptionsMiddlewareOptions);
431
+ },
432
+ });
433
+
434
+ function bucketEndpointMiddleware$1(options) {
435
+ return (next, context) => async (args) => {
436
+ if (options.bucketEndpoint) {
437
+ const endpoint = context.endpointV2;
438
+ if (endpoint) {
439
+ const bucket = args.input.Bucket;
440
+ if (typeof bucket === "string") {
441
+ try {
442
+ const bucketEndpointUrl = new URL(bucket);
443
+ context.endpointV2 = {
444
+ ...endpoint,
445
+ url: bucketEndpointUrl,
446
+ };
447
+ }
448
+ catch (e) {
449
+ const warning = `@aws-sdk/middleware-sdk-s3: bucketEndpoint=true was set but Bucket=${bucket} could not be parsed as URL.`;
450
+ if (context.logger?.constructor?.name === "NoOpLogger") {
451
+ console.warn(warning);
452
+ }
453
+ else {
454
+ context.logger?.warn?.(warning);
455
+ }
456
+ throw e;
457
+ }
458
+ }
459
+ }
460
+ }
461
+ return next(args);
462
+ };
463
+ }
464
+ const bucketEndpointMiddlewareOptions$1 = {
465
+ name: "bucketEndpointMiddleware",
466
+ override: true,
467
+ relation: "after",
468
+ toMiddleware: "endpointV2Middleware",
469
+ };
470
+
471
+ function validateBucketNameMiddleware({ bucketEndpoint }) {
472
+ return (next) => async (args) => {
473
+ const { input: { Bucket }, } = args;
474
+ if (!bucketEndpoint && typeof Bucket === "string" && !util.validate(Bucket) && Bucket.indexOf("/") >= 0) {
475
+ const err = new Error(`Bucket name shouldn't contain '/', received '${Bucket}'`);
476
+ err.name = "InvalidBucketName";
477
+ throw err;
478
+ }
479
+ return next({ ...args });
480
+ };
481
+ }
482
+ const validateBucketNameMiddlewareOptions = {
483
+ step: "initialize",
484
+ tags: ["VALIDATE_BUCKET_NAME"],
485
+ name: "validateBucketNameMiddleware",
486
+ override: true,
487
+ };
488
+ const getValidateBucketNamePlugin = (options) => ({
489
+ applyToStack: (clientStack) => {
490
+ clientStack.add(validateBucketNameMiddleware(options), validateBucketNameMiddlewareOptions);
491
+ clientStack.addRelativeTo(bucketEndpointMiddleware$1(options), bucketEndpointMiddlewareOptions$1);
492
+ },
493
+ });
494
+
495
+ class S3RestXmlProtocol extends protocols$1.AwsRestXmlProtocol {
496
+ async serializeRequest(operationSchema, input, context) {
497
+ const request = await super.serializeRequest(operationSchema, input, context);
498
+ const ns = schema.NormalizedSchema.of(operationSchema.input);
499
+ const staticStructureSchema = ns.getSchema();
500
+ let bucketMemberIndex = 0;
501
+ const requiredMemberCount = staticStructureSchema[6] ?? 0;
502
+ if (input && typeof input === "object") {
503
+ for (const [memberName, memberNs] of ns.structIterator()) {
504
+ if (++bucketMemberIndex > requiredMemberCount) {
505
+ break;
506
+ }
507
+ if (memberName === "Bucket") {
508
+ if (!input.Bucket && memberNs.getMergedTraits().httpLabel) {
509
+ throw new Error(`No value provided for input HTTP label: Bucket.`);
510
+ }
511
+ break;
512
+ }
513
+ }
514
+ }
515
+ return request;
516
+ }
517
+ }
518
+
519
+ const NODE_DISABLE_MULTIREGION_ACCESS_POINT_ENV_NAME = "AWS_S3_DISABLE_MULTIREGION_ACCESS_POINTS";
520
+ const NODE_DISABLE_MULTIREGION_ACCESS_POINT_INI_NAME = "s3_disable_multiregion_access_points";
521
+ const NODE_DISABLE_MULTIREGION_ACCESS_POINT_CONFIG_OPTIONS = {
522
+ environmentVariableSelector: (env) => config.booleanSelector(env, NODE_DISABLE_MULTIREGION_ACCESS_POINT_ENV_NAME, config.SelectorType.ENV),
523
+ configFileSelector: (profile) => config.booleanSelector(profile, NODE_DISABLE_MULTIREGION_ACCESS_POINT_INI_NAME, config.SelectorType.CONFIG),
524
+ default: false,
525
+ };
526
+
527
+ const NODE_USE_ARN_REGION_ENV_NAME = "AWS_S3_USE_ARN_REGION";
528
+ const NODE_USE_ARN_REGION_INI_NAME = "s3_use_arn_region";
529
+ const NODE_USE_ARN_REGION_CONFIG_OPTIONS = {
530
+ environmentVariableSelector: (env) => config.booleanSelector(env, NODE_USE_ARN_REGION_ENV_NAME, config.SelectorType.ENV),
531
+ configFileSelector: (profile) => config.booleanSelector(profile, NODE_USE_ARN_REGION_INI_NAME, config.SelectorType.CONFIG),
532
+ default: undefined,
533
+ };
534
+
535
+ const DOMAIN_PATTERN = /^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/;
536
+ const IP_ADDRESS_PATTERN = /(\d+\.){3}\d+/;
537
+ const DOTS_PATTERN = /\.\./;
538
+ const DOT_PATTERN = /\./;
539
+ const S3_HOSTNAME_PATTERN = /^(.+\.)?s3(-fips)?(\.dualstack)?[.-]([a-z0-9-]+)\./;
540
+ const S3_US_EAST_1_ALTNAME_PATTERN = /^s3(-external-1)?\.amazonaws\.com$/;
541
+ const AWS_PARTITION_SUFFIX = "amazonaws.com";
542
+ const isBucketNameOptions = (options) => typeof options.bucketName === "string";
543
+ const isDnsCompatibleBucketName = (bucketName) => DOMAIN_PATTERN.test(bucketName) && !IP_ADDRESS_PATTERN.test(bucketName) && !DOTS_PATTERN.test(bucketName);
544
+ const getRegionalSuffix = (hostname) => {
545
+ const parts = hostname.match(S3_HOSTNAME_PATTERN);
546
+ return [parts[4], hostname.replace(new RegExp(`^${parts[0]}`), "")];
547
+ };
548
+ const getSuffix = (hostname) => S3_US_EAST_1_ALTNAME_PATTERN.test(hostname) ? ["us-east-1", AWS_PARTITION_SUFFIX] : getRegionalSuffix(hostname);
549
+ const getSuffixForArnEndpoint = (hostname) => S3_US_EAST_1_ALTNAME_PATTERN.test(hostname)
550
+ ? [hostname.replace(`.${AWS_PARTITION_SUFFIX}`, ""), AWS_PARTITION_SUFFIX]
551
+ : getRegionalSuffix(hostname);
552
+ const validateArnEndpointOptions = (options) => {
553
+ if (options.pathStyleEndpoint) {
554
+ throw new Error("Path-style S3 endpoint is not supported when bucket is an ARN");
555
+ }
556
+ if (options.accelerateEndpoint) {
557
+ throw new Error("Accelerate endpoint is not supported when bucket is an ARN");
558
+ }
559
+ if (!options.tlsCompatible) {
560
+ throw new Error("HTTPS is required when bucket is an ARN");
561
+ }
562
+ };
563
+ const validateService = (service) => {
564
+ if (service !== "s3" && service !== "s3-outposts" && service !== "s3-object-lambda") {
565
+ throw new Error("Expect 's3' or 's3-outposts' or 's3-object-lambda' in ARN service component");
566
+ }
567
+ };
568
+ const validateS3Service = (service) => {
569
+ if (service !== "s3") {
570
+ throw new Error("Expect 's3' in Accesspoint ARN service component");
571
+ }
572
+ };
573
+ const validateOutpostService = (service) => {
574
+ if (service !== "s3-outposts") {
575
+ throw new Error("Expect 's3-posts' in Outpost ARN service component");
576
+ }
577
+ };
578
+ const validatePartition = (partition, options) => {
579
+ if (partition !== options.clientPartition) {
580
+ throw new Error(`Partition in ARN is incompatible, got "${partition}" but expected "${options.clientPartition}"`);
581
+ }
582
+ };
583
+ const validateRegion = (region, options) => { };
584
+ const validateRegionalClient = (region) => {
585
+ if (["s3-external-1", "aws-global"].includes(region)) {
586
+ throw new Error(`Client region ${region} is not regional`);
587
+ }
588
+ };
589
+ const validateAccountId = (accountId) => {
590
+ if (!/[0-9]{12}/.exec(accountId)) {
591
+ throw new Error("Access point ARN accountID does not match regex '[0-9]{12}'");
592
+ }
593
+ };
594
+ const validateDNSHostLabel = (label, options = { tlsCompatible: true }) => {
595
+ if (label.length >= 64 ||
596
+ !/^[a-z0-9][a-z0-9.-]*[a-z0-9]$/.test(label) ||
597
+ /(\d+\.){3}\d+/.test(label) ||
598
+ /[.-]{2}/.test(label) ||
599
+ (options?.tlsCompatible && DOT_PATTERN.test(label))) {
600
+ throw new Error(`Invalid DNS label ${label}`);
601
+ }
602
+ };
603
+ const validateCustomEndpoint = (options) => {
604
+ if (options.isCustomEndpoint) {
605
+ if (options.dualstackEndpoint)
606
+ throw new Error("Dualstack endpoint is not supported with custom endpoint");
607
+ if (options.accelerateEndpoint)
608
+ throw new Error("Accelerate endpoint is not supported with custom endpoint");
609
+ }
610
+ };
611
+ const getArnResources = (resource) => {
612
+ const delimiter = resource.includes(":") ? ":" : "/";
613
+ const [resourceType, ...rest] = resource.split(delimiter);
614
+ if (resourceType === "accesspoint") {
615
+ if (rest.length !== 1 || rest[0] === "") {
616
+ throw new Error(`Access Point ARN should have one resource accesspoint${delimiter}{accesspointname}`);
617
+ }
618
+ return { accesspointName: rest[0] };
619
+ }
620
+ else if (resourceType === "outpost") {
621
+ if (!rest[0] || rest[1] !== "accesspoint" || !rest[2] || rest.length !== 3) {
622
+ throw new Error(`Outpost ARN should have resource outpost${delimiter}{outpostId}${delimiter}accesspoint${delimiter}{accesspointName}`);
623
+ }
624
+ const [outpostId, _, accesspointName] = rest;
625
+ return { outpostId, accesspointName };
626
+ }
627
+ else {
628
+ throw new Error(`ARN resource should begin with 'accesspoint${delimiter}' or 'outpost${delimiter}'`);
629
+ }
630
+ };
631
+ const validateNoDualstack = (dualstackEndpoint) => { };
632
+ const validateNoFIPS = (useFipsEndpoint) => {
633
+ if (useFipsEndpoint)
634
+ throw new Error(`FIPS region is not supported with Outpost.`);
635
+ };
636
+ const validateMrapAlias = (name) => {
637
+ try {
638
+ name.split(".").forEach((label) => {
639
+ validateDNSHostLabel(label);
640
+ });
641
+ }
642
+ catch (e) {
643
+ throw new Error(`"${name}" is not a DNS compatible name.`);
644
+ }
645
+ };
646
+
647
+ const bucketHostname = (options) => {
648
+ validateCustomEndpoint(options);
649
+ return isBucketNameOptions(options)
650
+ ?
651
+ getEndpointFromBucketName(options)
652
+ :
653
+ getEndpointFromArn(options);
654
+ };
655
+ const getEndpointFromBucketName = ({ accelerateEndpoint = false, clientRegion: region, baseHostname, bucketName, dualstackEndpoint = false, fipsEndpoint = false, pathStyleEndpoint = false, tlsCompatible = true, isCustomEndpoint = false, }) => {
656
+ const [clientRegion, hostnameSuffix] = isCustomEndpoint ? [region, baseHostname] : getSuffix(baseHostname);
657
+ if (pathStyleEndpoint || !isDnsCompatibleBucketName(bucketName) || (tlsCompatible && DOT_PATTERN.test(bucketName))) {
658
+ return {
659
+ bucketEndpoint: false,
660
+ hostname: dualstackEndpoint ? `s3.dualstack.${clientRegion}.${hostnameSuffix}` : baseHostname,
661
+ };
662
+ }
663
+ if (accelerateEndpoint) {
664
+ baseHostname = `s3-accelerate${dualstackEndpoint ? ".dualstack" : ""}.${hostnameSuffix}`;
665
+ }
666
+ else if (dualstackEndpoint) {
667
+ baseHostname = `s3.dualstack.${clientRegion}.${hostnameSuffix}`;
668
+ }
669
+ return {
670
+ bucketEndpoint: true,
671
+ hostname: `${bucketName}.${baseHostname}`,
672
+ };
673
+ };
674
+ const getEndpointFromArn = (options) => {
675
+ const { isCustomEndpoint, baseHostname, clientRegion } = options;
676
+ const hostnameSuffix = isCustomEndpoint ? baseHostname : getSuffixForArnEndpoint(baseHostname)[1];
677
+ const { pathStyleEndpoint, accelerateEndpoint = false, fipsEndpoint = false, tlsCompatible = true, bucketName, clientPartition = "aws", } = options;
678
+ validateArnEndpointOptions({ pathStyleEndpoint, accelerateEndpoint, tlsCompatible });
679
+ const { service, partition, accountId, region, resource } = bucketName;
680
+ validateService(service);
681
+ validatePartition(partition, { clientPartition });
682
+ validateAccountId(accountId);
683
+ const { accesspointName, outpostId } = getArnResources(resource);
684
+ if (service === "s3-object-lambda") {
685
+ return getEndpointFromObjectLambdaArn({ ...options, tlsCompatible, bucketName, accesspointName, hostnameSuffix });
686
+ }
687
+ if (region === "") {
688
+ return getEndpointFromMRAPArn({ ...options, mrapAlias: accesspointName, hostnameSuffix });
689
+ }
690
+ if (outpostId) {
691
+ return getEndpointFromOutpostArn({ ...options, clientRegion, outpostId, accesspointName, hostnameSuffix });
692
+ }
693
+ return getEndpointFromAccessPointArn({ ...options, clientRegion, accesspointName, hostnameSuffix });
694
+ };
695
+ const getEndpointFromObjectLambdaArn = ({ dualstackEndpoint = false, fipsEndpoint = false, tlsCompatible = true, useArnRegion, clientRegion, clientSigningRegion = clientRegion, accesspointName, bucketName, hostnameSuffix, }) => {
696
+ const { accountId, region, service } = bucketName;
697
+ validateRegionalClient(clientRegion);
698
+ const DNSHostLabel = `${accesspointName}-${accountId}`;
699
+ validateDNSHostLabel(DNSHostLabel, { tlsCompatible });
700
+ const endpointRegion = useArnRegion ? region : clientRegion;
701
+ const signingRegion = useArnRegion ? region : clientSigningRegion;
702
+ return {
703
+ bucketEndpoint: true,
704
+ hostname: `${DNSHostLabel}.${service}${fipsEndpoint ? "-fips" : ""}.${endpointRegion}.${hostnameSuffix}`,
705
+ signingRegion,
706
+ signingService: service,
707
+ };
708
+ };
709
+ const getEndpointFromMRAPArn = ({ disableMultiregionAccessPoints, dualstackEndpoint = false, isCustomEndpoint, mrapAlias, hostnameSuffix, }) => {
710
+ if (disableMultiregionAccessPoints === true) {
711
+ throw new Error("SDK is attempting to use a MRAP ARN. Please enable to feature.");
712
+ }
713
+ validateMrapAlias(mrapAlias);
714
+ return {
715
+ bucketEndpoint: true,
716
+ hostname: `${mrapAlias}${isCustomEndpoint ? "" : `.accesspoint.s3-global`}.${hostnameSuffix}`,
717
+ signingRegion: "*",
718
+ };
719
+ };
720
+ const getEndpointFromOutpostArn = ({ useArnRegion, clientRegion, clientSigningRegion = clientRegion, bucketName, outpostId, dualstackEndpoint = false, fipsEndpoint = false, tlsCompatible = true, accesspointName, isCustomEndpoint, hostnameSuffix, }) => {
721
+ validateRegionalClient(clientRegion);
722
+ const DNSHostLabel = `${accesspointName}-${bucketName.accountId}`;
723
+ validateDNSHostLabel(DNSHostLabel, { tlsCompatible });
724
+ const endpointRegion = useArnRegion ? bucketName.region : clientRegion;
725
+ const signingRegion = useArnRegion ? bucketName.region : clientSigningRegion;
726
+ validateOutpostService(bucketName.service);
727
+ validateDNSHostLabel(outpostId, { tlsCompatible });
728
+ validateNoFIPS(fipsEndpoint);
729
+ const hostnamePrefix = `${DNSHostLabel}.${outpostId}`;
730
+ return {
731
+ bucketEndpoint: true,
732
+ hostname: `${hostnamePrefix}${isCustomEndpoint ? "" : `.s3-outposts.${endpointRegion}`}.${hostnameSuffix}`,
733
+ signingRegion,
734
+ signingService: "s3-outposts",
735
+ };
736
+ };
737
+ const getEndpointFromAccessPointArn = ({ useArnRegion, clientRegion, clientSigningRegion = clientRegion, bucketName, dualstackEndpoint = false, fipsEndpoint = false, tlsCompatible = true, accesspointName, isCustomEndpoint, hostnameSuffix, }) => {
738
+ validateRegionalClient(clientRegion);
739
+ const hostnamePrefix = `${accesspointName}-${bucketName.accountId}`;
740
+ validateDNSHostLabel(hostnamePrefix, { tlsCompatible });
741
+ const endpointRegion = useArnRegion ? bucketName.region : clientRegion;
742
+ const signingRegion = useArnRegion ? bucketName.region : clientSigningRegion;
743
+ validateS3Service(bucketName.service);
744
+ return {
745
+ bucketEndpoint: true,
746
+ hostname: `${hostnamePrefix}${isCustomEndpoint
747
+ ? ""
748
+ : `.s3-accesspoint${fipsEndpoint ? "-fips" : ""}${dualstackEndpoint ? ".dualstack" : ""}.${endpointRegion}`}.${hostnameSuffix}`,
749
+ signingRegion,
750
+ };
751
+ };
752
+
753
+ const bucketEndpointMiddleware = (options) => (next, context) => async (args) => {
754
+ const { Bucket: bucketName } = args.input;
755
+ let replaceBucketInPath = options.bucketEndpoint;
756
+ const request = args.request;
757
+ if (protocols.HttpRequest.isInstance(request)) {
758
+ if (options.bucketEndpoint) {
759
+ request.hostname = bucketName;
760
+ }
761
+ else if (util.validate(bucketName)) {
762
+ const bucketArn = util.parse(bucketName);
763
+ const clientRegion = await options.region();
764
+ const useDualstackEndpoint = await options.useDualstackEndpoint();
765
+ const useFipsEndpoint = await options.useFipsEndpoint();
766
+ const { partition, signingRegion = clientRegion } = (await options.regionInfoProvider(clientRegion, { useDualstackEndpoint, useFipsEndpoint })) || {};
767
+ const useArnRegion = await options.useArnRegion();
768
+ const { hostname, bucketEndpoint, signingRegion: modifiedSigningRegion, signingService, } = bucketHostname({
769
+ bucketName: bucketArn,
770
+ baseHostname: request.hostname,
771
+ accelerateEndpoint: options.useAccelerateEndpoint,
772
+ dualstackEndpoint: useDualstackEndpoint,
773
+ fipsEndpoint: useFipsEndpoint,
774
+ pathStyleEndpoint: options.forcePathStyle,
775
+ tlsCompatible: request.protocol === "https:",
776
+ useArnRegion,
777
+ clientPartition: partition,
778
+ clientSigningRegion: signingRegion,
779
+ clientRegion: clientRegion,
780
+ isCustomEndpoint: options.isCustomEndpoint,
781
+ disableMultiregionAccessPoints: await options.disableMultiregionAccessPoints(),
782
+ });
783
+ if (modifiedSigningRegion && modifiedSigningRegion !== signingRegion) {
784
+ context["signing_region"] = modifiedSigningRegion;
785
+ }
786
+ if (signingService && signingService !== "s3") {
787
+ context["signing_service"] = signingService;
788
+ }
789
+ request.hostname = hostname;
790
+ replaceBucketInPath = bucketEndpoint;
791
+ }
792
+ else {
793
+ const clientRegion = await options.region();
794
+ const dualstackEndpoint = await options.useDualstackEndpoint();
795
+ const fipsEndpoint = await options.useFipsEndpoint();
796
+ const { hostname, bucketEndpoint } = bucketHostname({
797
+ bucketName,
798
+ clientRegion,
799
+ baseHostname: request.hostname,
800
+ accelerateEndpoint: options.useAccelerateEndpoint,
801
+ dualstackEndpoint,
802
+ fipsEndpoint,
803
+ pathStyleEndpoint: options.forcePathStyle,
804
+ tlsCompatible: request.protocol === "https:",
805
+ isCustomEndpoint: options.isCustomEndpoint,
806
+ });
807
+ request.hostname = hostname;
808
+ replaceBucketInPath = bucketEndpoint;
809
+ }
810
+ if (replaceBucketInPath) {
811
+ request.path = request.path.replace(/^(\/)?[^\/]+/, "");
812
+ if (request.path === "") {
813
+ request.path = "/";
814
+ }
815
+ }
816
+ }
817
+ return next({ ...args, request });
818
+ };
819
+ const bucketEndpointMiddlewareOptions = {
820
+ tags: ["BUCKET_ENDPOINT"],
821
+ name: "bucketEndpointMiddleware",
822
+ relation: "before",
823
+ toMiddleware: "hostHeaderMiddleware",
824
+ override: true,
825
+ };
826
+ const getBucketEndpointPlugin = (options) => ({
827
+ applyToStack: (clientStack) => {
828
+ clientStack.addRelativeTo(bucketEndpointMiddleware(options), bucketEndpointMiddlewareOptions);
829
+ },
830
+ });
831
+
832
+ function resolveBucketEndpointConfig(input) {
833
+ const { bucketEndpoint = false, forcePathStyle = false, useAccelerateEndpoint = false, useArnRegion, disableMultiregionAccessPoints = false, } = input;
834
+ return Object.assign(input, {
835
+ bucketEndpoint,
836
+ forcePathStyle,
837
+ useAccelerateEndpoint,
838
+ useArnRegion: typeof useArnRegion === "function" ? useArnRegion : () => Promise.resolve(useArnRegion),
839
+ disableMultiregionAccessPoints: typeof disableMultiregionAccessPoints === "function"
840
+ ? disableMultiregionAccessPoints
841
+ : () => Promise.resolve(disableMultiregionAccessPoints),
842
+ });
843
+ }
844
+
845
+ function addExpectContinueMiddleware(options) {
846
+ return (next) => async (args) => {
847
+ const { request } = args;
848
+ if (options.expectContinueHeader !== false &&
849
+ protocols.HttpRequest.isInstance(request) &&
850
+ request.body &&
851
+ options.runtime === "node" &&
852
+ options.requestHandler?.constructor?.name !== "FetchHttpHandler") {
853
+ let sendHeader = true;
854
+ if (typeof options.expectContinueHeader === "number") {
855
+ try {
856
+ const bodyLength = Number(request.headers?.["content-length"]) ?? options.bodyLengthChecker?.(request.body) ?? Infinity;
857
+ sendHeader = bodyLength >= options.expectContinueHeader;
858
+ }
859
+ catch (e) { }
860
+ }
861
+ else {
862
+ sendHeader = !!options.expectContinueHeader;
863
+ }
864
+ if (sendHeader) {
865
+ request.headers.Expect = "100-continue";
866
+ }
867
+ }
868
+ return next({
869
+ ...args,
870
+ request,
871
+ });
872
+ };
873
+ }
874
+ const addExpectContinueMiddlewareOptions = {
875
+ step: "build",
876
+ tags: ["SET_EXPECT_HEADER", "EXPECT_HEADER"],
877
+ name: "addExpectContinueMiddleware",
878
+ override: true,
879
+ };
880
+ const getAddExpectContinuePlugin = (options) => ({
881
+ applyToStack: (clientStack) => {
882
+ clientStack.add(addExpectContinueMiddleware(options), addExpectContinueMiddlewareOptions);
883
+ },
884
+ });
885
+
886
+ function locationConstraintMiddleware(options) {
887
+ return (next) => async (args) => {
888
+ const { CreateBucketConfiguration } = args.input;
889
+ const region = await options.region();
890
+ if (!CreateBucketConfiguration?.LocationConstraint && !CreateBucketConfiguration?.Location) {
891
+ if (region !== "us-east-1") {
892
+ args.input.CreateBucketConfiguration = args.input.CreateBucketConfiguration ?? {};
893
+ args.input.CreateBucketConfiguration.LocationConstraint = region;
894
+ }
895
+ }
896
+ return next(args);
897
+ };
898
+ }
899
+ const locationConstraintMiddlewareOptions = {
900
+ step: "initialize",
901
+ tags: ["LOCATION_CONSTRAINT", "CREATE_BUCKET_CONFIGURATION"],
902
+ name: "locationConstraintMiddleware",
903
+ override: true,
904
+ };
905
+ const getLocationConstraintPlugin = (config) => ({
906
+ applyToStack: (clientStack) => {
907
+ clientStack.add(locationConstraintMiddleware(config), locationConstraintMiddlewareOptions);
908
+ },
909
+ });
910
+
911
+ function resolveLocationConstraintConfig(input) {
912
+ return input;
913
+ }
914
+
915
+ function ssecMiddleware(options) {
916
+ return (next) => async (args) => {
917
+ const input = { ...args.input };
918
+ const properties = [
919
+ {
920
+ target: "SSECustomerKey",
921
+ hash: "SSECustomerKeyMD5",
922
+ },
923
+ {
924
+ target: "CopySourceSSECustomerKey",
925
+ hash: "CopySourceSSECustomerKeyMD5",
926
+ },
927
+ ];
928
+ for (const prop of properties) {
929
+ const value = input[prop.target];
930
+ if (value) {
931
+ let valueForHash;
932
+ if (typeof value === "string") {
933
+ if (isValidBase64EncodedSSECustomerKey(value, options)) {
934
+ valueForHash = options.base64Decoder(value);
935
+ }
936
+ else {
937
+ valueForHash = options.utf8Decoder(value);
938
+ input[prop.target] = options.base64Encoder(valueForHash);
939
+ }
940
+ }
941
+ else {
942
+ valueForHash = ArrayBuffer.isView(value)
943
+ ? new Uint8Array(value.buffer, value.byteOffset, value.byteLength)
944
+ : new Uint8Array(value);
945
+ input[prop.target] = options.base64Encoder(valueForHash);
946
+ }
947
+ const hash = new options.md5();
948
+ hash.update(valueForHash);
949
+ input[prop.hash] = options.base64Encoder(await hash.digest());
950
+ }
951
+ }
952
+ return next({
953
+ ...args,
954
+ input,
955
+ });
956
+ };
957
+ }
958
+ const ssecMiddlewareOptions = {
959
+ name: "ssecMiddleware",
960
+ step: "initialize",
961
+ tags: ["SSE"],
962
+ override: true,
963
+ };
964
+ const getSsecPlugin = (config) => ({
965
+ applyToStack: (clientStack) => {
966
+ clientStack.add(ssecMiddleware(config), ssecMiddlewareOptions);
967
+ },
968
+ });
969
+ function isValidBase64EncodedSSECustomerKey(str, options) {
970
+ const base64Regex = /^(?:[A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
971
+ if (!base64Regex.test(str))
972
+ return false;
973
+ try {
974
+ const decodedBytes = options.base64Decoder(str);
975
+ return decodedBytes.length === 32;
976
+ }
977
+ catch {
978
+ return false;
979
+ }
980
+ }
981
+
982
+ exports.NODE_DISABLE_MULTIREGION_ACCESS_POINT_CONFIG_OPTIONS = NODE_DISABLE_MULTIREGION_ACCESS_POINT_CONFIG_OPTIONS;
983
+ exports.NODE_DISABLE_MULTIREGION_ACCESS_POINT_ENV_NAME = NODE_DISABLE_MULTIREGION_ACCESS_POINT_ENV_NAME;
984
+ exports.NODE_DISABLE_MULTIREGION_ACCESS_POINT_INI_NAME = NODE_DISABLE_MULTIREGION_ACCESS_POINT_INI_NAME;
985
+ exports.NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS = NODE_DISABLE_S3_EXPRESS_SESSION_AUTH_OPTIONS;
986
+ exports.NODE_USE_ARN_REGION_CONFIG_OPTIONS = NODE_USE_ARN_REGION_CONFIG_OPTIONS;
987
+ exports.NODE_USE_ARN_REGION_ENV_NAME = NODE_USE_ARN_REGION_ENV_NAME;
988
+ exports.NODE_USE_ARN_REGION_INI_NAME = NODE_USE_ARN_REGION_INI_NAME;
989
+ exports.S3ExpressIdentityCache = S3ExpressIdentityCache;
990
+ exports.S3ExpressIdentityCacheEntry = S3ExpressIdentityCacheEntry;
991
+ exports.S3ExpressIdentityProviderImpl = S3ExpressIdentityProviderImpl;
992
+ exports.S3RestXmlProtocol = S3RestXmlProtocol;
993
+ exports.SignatureV4S3Express = SignatureV4S3Express;
994
+ exports.addExpectContinueMiddleware = addExpectContinueMiddleware;
995
+ exports.addExpectContinueMiddlewareOptions = addExpectContinueMiddlewareOptions;
996
+ exports.bucketEndpointMiddleware = bucketEndpointMiddleware;
997
+ exports.bucketEndpointMiddlewareOptions = bucketEndpointMiddlewareOptions;
998
+ exports.bucketHostname = bucketHostname;
999
+ exports.checkContentLengthHeader = checkContentLengthHeader;
1000
+ exports.checkContentLengthHeaderMiddlewareOptions = checkContentLengthHeaderMiddlewareOptions;
1001
+ exports.getAddExpectContinuePlugin = getAddExpectContinuePlugin;
1002
+ exports.getArnResources = getArnResources;
1003
+ exports.getBucketEndpointPlugin = getBucketEndpointPlugin;
1004
+ exports.getCheckContentLengthHeaderPlugin = getCheckContentLengthHeaderPlugin;
1005
+ exports.getLocationConstraintPlugin = getLocationConstraintPlugin;
1006
+ exports.getRegionRedirectMiddlewarePlugin = getRegionRedirectMiddlewarePlugin;
1007
+ exports.getS3ExpiresMiddlewarePlugin = getS3ExpiresMiddlewarePlugin;
1008
+ exports.getS3ExpressHttpSigningPlugin = getS3ExpressHttpSigningPlugin;
1009
+ exports.getS3ExpressPlugin = getS3ExpressPlugin;
1010
+ exports.getSsecPlugin = getSsecPlugin;
1011
+ exports.getSuffixForArnEndpoint = getSuffixForArnEndpoint;
1012
+ exports.getThrow200ExceptionsPlugin = getThrow200ExceptionsPlugin;
1013
+ exports.getValidateBucketNamePlugin = getValidateBucketNamePlugin;
1014
+ exports.isValidBase64EncodedSSECustomerKey = isValidBase64EncodedSSECustomerKey;
1015
+ exports.locationConstraintMiddleware = locationConstraintMiddleware;
1016
+ exports.locationConstraintMiddlewareOptions = locationConstraintMiddlewareOptions;
1017
+ exports.regionRedirectEndpointMiddleware = regionRedirectEndpointMiddleware;
1018
+ exports.regionRedirectEndpointMiddlewareOptions = regionRedirectEndpointMiddlewareOptions;
1019
+ exports.regionRedirectMiddleware = regionRedirectMiddleware;
1020
+ exports.regionRedirectMiddlewareOptions = regionRedirectMiddlewareOptions;
1021
+ exports.resolveBucketEndpointConfig = resolveBucketEndpointConfig;
1022
+ exports.resolveLocationConstraintConfig = resolveLocationConstraintConfig;
1023
+ exports.resolveS3Config = resolveS3Config;
1024
+ exports.s3ExpiresMiddleware = s3ExpiresMiddleware;
1025
+ exports.s3ExpiresMiddlewareOptions = s3ExpiresMiddlewareOptions;
1026
+ exports.s3ExpressHttpSigningMiddleware = s3ExpressHttpSigningMiddleware;
1027
+ exports.s3ExpressHttpSigningMiddlewareOptions = s3ExpressHttpSigningMiddlewareOptions;
1028
+ exports.s3ExpressMiddleware = s3ExpressMiddleware;
1029
+ exports.s3ExpressMiddlewareOptions = s3ExpressMiddlewareOptions;
1030
+ exports.ssecMiddleware = ssecMiddleware;
1031
+ exports.ssecMiddlewareOptions = ssecMiddlewareOptions;
1032
+ exports.throw200ExceptionsMiddleware = throw200ExceptionsMiddleware;
1033
+ exports.throw200ExceptionsMiddlewareOptions = throw200ExceptionsMiddlewareOptions;
1034
+ exports.validateAccountId = validateAccountId;
1035
+ exports.validateBucketNameMiddleware = validateBucketNameMiddleware;
1036
+ exports.validateBucketNameMiddlewareOptions = validateBucketNameMiddlewareOptions;
1037
+ exports.validateDNSHostLabel = validateDNSHostLabel;
1038
+ exports.validateNoDualstack = validateNoDualstack;
1039
+ exports.validateNoFIPS = validateNoFIPS;
1040
+ exports.validateOutpostService = validateOutpostService;
1041
+ exports.validatePartition = validatePartition;
1042
+ exports.validateRegion = validateRegion;