@agentuity/storage 3.0.5 → 3.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node.d.ts +5 -5
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +34 -23
- package/dist/node.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -3
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/src/node.ts +42 -24
- package/src/types.ts +9 -3
package/dist/node.d.ts
CHANGED
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
* sent on the wire.
|
|
23
23
|
*
|
|
24
24
|
* 3. **Bucket-in-endpoint addressing.** Agentuity buckets use
|
|
25
|
-
* virtual-host-style endpoints (`<bucket>.<host>`),
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
25
|
+
* virtual-host-style endpoints (`<bucket>.<host>`), but the AWS SDK
|
|
26
|
+
* composes virtual-host requests from a shared endpoint plus the
|
|
27
|
+
* command's `Bucket` parameter. We keep `forcePathStyle` false and
|
|
28
|
+
* pass the SDK the shared endpoint so it does not prepend the bucket
|
|
29
|
+
* twice.
|
|
30
30
|
*/
|
|
31
31
|
import type { BucketConfig, S3ClientLike } from './types.ts';
|
|
32
32
|
export type { BucketConfig, S3ClientLike } from './types.ts';
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAMH,OAAO,KAAK,EACX,YAAY,EAEZ,YAAY,EAMZ,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA4BjD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAMH,OAAO,KAAK,EACX,YAAY,EAEZ,YAAY,EAMZ,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA4BjD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CA8IjE"}
|
package/dist/node.js
CHANGED
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
* sent on the wire.
|
|
23
23
|
*
|
|
24
24
|
* 3. **Bucket-in-endpoint addressing.** Agentuity buckets use
|
|
25
|
-
* virtual-host-style endpoints (`<bucket>.<host>`),
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
25
|
+
* virtual-host-style endpoints (`<bucket>.<host>`), but the AWS SDK
|
|
26
|
+
* composes virtual-host requests from a shared endpoint plus the
|
|
27
|
+
* command's `Bucket` parameter. We keep `forcePathStyle` false and
|
|
28
|
+
* pass the SDK the shared endpoint so it does not prepend the bucket
|
|
29
|
+
* twice.
|
|
30
30
|
*/
|
|
31
31
|
import { Buffer } from 'node:buffer';
|
|
32
32
|
import { Readable, Transform } from 'node:stream';
|
|
@@ -46,13 +46,7 @@ async function loadSdk() {
|
|
|
46
46
|
return sdkPromise;
|
|
47
47
|
}
|
|
48
48
|
export function createS3Client(bucket) {
|
|
49
|
-
const endpoint =
|
|
50
|
-
// The SDK's `Bucket` parameter is essentially a placeholder for our
|
|
51
|
-
// purposes — we always send virtual-hosted-style requests, so the
|
|
52
|
-
// `endpoint` URL is what actually routes. Prefer the explicit
|
|
53
|
-
// `bucket` field when supplied; otherwise fall back to parsing the
|
|
54
|
-
// leading hostname label out of the composed endpoint.
|
|
55
|
-
const bucketLabel = bucket.bucket ?? extractBucketLabel(endpoint);
|
|
49
|
+
const { endpoint, bucketLabel } = resolveSdkTarget(bucket);
|
|
56
50
|
const state = {
|
|
57
51
|
endpoint,
|
|
58
52
|
bucketLabel,
|
|
@@ -179,6 +173,21 @@ export function createS3Client(bucket) {
|
|
|
179
173
|
},
|
|
180
174
|
};
|
|
181
175
|
}
|
|
176
|
+
function resolveSdkTarget(bucket) {
|
|
177
|
+
// Resolve first so invalid BucketConfig shapes fail before SDK adaptation.
|
|
178
|
+
const canonicalEndpoint = resolveEndpoint(bucket);
|
|
179
|
+
if (bucket.host && bucket.bucket) {
|
|
180
|
+
return {
|
|
181
|
+
endpoint: sharedEndpointFromHost(bucket.host),
|
|
182
|
+
bucketLabel: bucket.bucket,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return splitBucketEndpoint(canonicalEndpoint);
|
|
186
|
+
}
|
|
187
|
+
function sharedEndpointFromHost(host) {
|
|
188
|
+
const hostOnly = host.replace(/^https?:\/\//, '').replace(/\/+$/, '');
|
|
189
|
+
return `https://${hostOnly}`;
|
|
190
|
+
}
|
|
182
191
|
/**
|
|
183
192
|
* Convert one of our accepted `S3Body` shapes into something the AWS
|
|
184
193
|
* SDK can consume, while also preparing a way to report the number of
|
|
@@ -321,20 +330,22 @@ function concatUint8Arrays(parts) {
|
|
|
321
330
|
}
|
|
322
331
|
return out;
|
|
323
332
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
* URL. Falls back to `'bucket'` if parsing fails — which is fine
|
|
327
|
-
* because the endpoint override controls actual routing; the SDK only
|
|
328
|
-
* uses `Bucket` to construct path-style URLs (which we never do).
|
|
329
|
-
*/
|
|
330
|
-
function extractBucketLabel(endpoint) {
|
|
333
|
+
function splitBucketEndpoint(endpoint) {
|
|
334
|
+
let url;
|
|
331
335
|
try {
|
|
332
|
-
|
|
333
|
-
const firstLabel = url.hostname.split('.')[0];
|
|
334
|
-
return firstLabel || 'bucket';
|
|
336
|
+
url = new URL(endpoint);
|
|
335
337
|
}
|
|
336
338
|
catch {
|
|
337
|
-
|
|
339
|
+
throw new Error(`Invalid bucket endpoint URL: ${endpoint}`);
|
|
340
|
+
}
|
|
341
|
+
const [firstLabel, ...rest] = url.hostname.split('.');
|
|
342
|
+
if (!firstLabel || rest.length === 0) {
|
|
343
|
+
throw new Error(`Bucket endpoint must be bucket-scoped as \`<bucket>.<host>\`, got host \`${url.hostname}\` from endpoint \`${endpoint}\`. Use \`host\` + \`bucket\` for shared endpoints.`);
|
|
338
344
|
}
|
|
345
|
+
url.hostname = rest.join('.');
|
|
346
|
+
return {
|
|
347
|
+
endpoint: url.toString().replace(/\/$/, ''),
|
|
348
|
+
bucketLabel: firstLabel,
|
|
349
|
+
};
|
|
339
350
|
}
|
|
340
351
|
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAa7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKjD,IAAI,SAAS,GAAqB,IAAI,CAAC;AACvC,IAAI,UAAU,GAA8B,IAAI,CAAC;AAEjD,KAAK,UAAU,OAAO;IACrB,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,UAAU,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACtD,SAAS,GAAG,GAAG,CAAC;YAChB,OAAO,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC;AAWD,MAAM,UAAU,cAAc,CAAC,MAAoB;IAClD,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAa7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKjD,IAAI,SAAS,GAAqB,IAAI,CAAC;AACvC,IAAI,UAAU,GAA8B,IAAI,CAAC;AAEjD,KAAK,UAAU,OAAO;IACrB,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,UAAU,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACtD,SAAS,GAAG,GAAG,CAAC;YAChB,OAAO,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC;AAWD,MAAM,UAAU,cAAc,CAAC,MAAoB;IAClD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE3D,MAAM,KAAK,GAAkB;QAC5B,QAAQ;QACR,WAAW;QACX,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM;QAC/B,WAAW,EAAE;YACZ,WAAW,EAAE,MAAM,CAAC,UAAU;YAC9B,eAAe,EAAE,MAAM,CAAC,UAAU;SAClC;QACD,aAAa,EAAE,IAAI;KACnB,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CACpC,IAAI,GAAG,CAAC,QAAQ,CAAC;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,cAAc,EAAE,KAAK;aACrB,CAAC,CACF,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,aAAa,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO;QACN,KAAK,CAAC,IAAI,CAAC,IAA2B;YACrC,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,IAAI,GAAG,CAAC,oBAAoB,CAAC;gBAC5B,MAAM,EAAE,KAAK,CAAC,WAAW;gBACzB,MAAM,EAAE,IAAI,EAAE,MAAM;gBACpB,OAAO,EAAE,IAAI,EAAE,OAAO;gBACtB,iBAAiB,EAAE,IAAI,EAAE,iBAAiB;aAC1C,CAAC,CACF,CAAC;YACF,OAAO;gBACN,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1C,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;oBAChB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;oBACjB,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE;oBACjD,IAAI,EAAE,CAAC,CAAC,IAAI;iBACZ,CAAC,CAAC;gBACH,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,KAAK;gBACrC,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;aAChD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAW;YACrB,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,IAAI,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAClE,CAAC;YACF,OAAO;gBACN,IAAI,EAAE,GAAG,CAAC,aAAa,IAAI,CAAC;gBAC5B,IAAI,EAAE,GAAG,CAAC,WAAW;gBACrB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,IAAI,EAAE,GAAG,CAAC,IAAI;aACd,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAW;YACf,8DAA8D;YAC9D,+DAA+D;YAC/D,8CAA8C;YAC9C,MAAM,IAAI,GAAsB,EAAE,CAAC;YACnC,OAAO;gBACN,IAAI,IAAI;oBACP,OAAO,IAAI,CAAC,IAAI,CAAC;gBAClB,CAAC;gBACD,KAAK,CAAC,WAAW;oBAChB,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;oBAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;oBACjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,IAAI,GAAG,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CACjE,CAAC;oBACF,IAAI,GAAG,CAAC,WAAW;wBAAE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;oBACjD,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxC,CAAC;gBACD,KAAK,CAAC,IAAI;oBACT,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtC,CAAC;gBACD,MAAM;oBACL,0DAA0D;oBAC1D,6CAA6C;oBAC7C,IAAI,KAAK,GAAsC,IAAI,CAAC;oBACpD,IAAI,MAAM,GAAmD,IAAI,CAAC;oBAClE,OAAO,IAAI,cAAc,CAAa;wBACrC,KAAK,CAAC,IAAI,CAAC,UAAU;4BACpB,IAAI,CAAC,KAAK,EAAE,CAAC;gCACZ,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;gCAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;gCACjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,IAAI,GAAG,CAAC,gBAAgB,CAAC;oCACxB,MAAM,EAAE,KAAK,CAAC,WAAW;oCACzB,GAAG,EAAE,GAAG;iCACR,CAAC,CACF,CAAC;gCACF,IAAI,GAAG,CAAC,WAAW;oCAAE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;gCACjD,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gCAClC,MAAM,GAAG,KAAK,CAAC,SAAS,EAA6C,CAAC;4BACvE,CAAC;4BACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAO,CAAC,IAAI,EAAE,CAAC;4BAC7C,IAAI,IAAI;gCAAE,UAAU,CAAC,KAAK,EAAE,CAAC;;gCACxB,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wBAChC,CAAC;wBACD,KAAK,CAAC,MAAM;4BACX,MAAM,MAAM,EAAE,MAAM,EAAE,CAAC;wBACxB,CAAC;qBACD,CAAC,CAAC;gBACJ,CAAC;aACD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,IAAY,EAAE,IAAqB;YAC3D,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,MAAM,CAAC,IAAI,CAChB,IAAI,GAAG,CAAC,gBAAgB,CAAC;gBACxB,MAAM,EAAE,KAAK,CAAC,WAAW;gBACzB,GAAG,EAAE,GAAG;gBACR,IAAI;gBACJ,WAAW,EAAE,IAAI,EAAE,IAAI;aACvB,CAAC,CACF,CAAC;YACF,OAAO,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,GAAW;YACvB,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;KACD,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAoB;IAC7C,2EAA2E;IAC3E,MAAM,iBAAiB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO;YACN,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC;YAC7C,WAAW,EAAE,MAAM,CAAC,MAAM;SAC1B,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,WAAW,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,IAAY;IAIhC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QACzD,iEAAiE;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAkD,CAAC;QAChF,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAoD,CAAC,CAAC;QAC1F,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IACrD,CAAC;IACD,kEAAkE;IAClE,0DAA0D;IAC1D,OAAO;QACN,IAAI,EAAE,IAA6B;QACnC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;KACzB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAC1C,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAAiC,CAAC,SAAS,KAAK,UAAU,CAClE,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,MAAgB;IAI5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC;QAC7B,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACxB,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;YACtB,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjB,CAAC;KACD,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,qBAAqB,CAAC,IAAa;IACjD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAChC,8DAA8D;QAC9D,kEAAkE;QAClE,iEAAiE;QACjE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACzC,CAAC;IACD,sCAAsC;IACtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAgB,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,wEAAwE;IACxE,2CAA2C;IAC3C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChB,OAAO,GAAG,CAAC,MAAM,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAa;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,IAAI,cAAc,CAAa;YACrC,KAAK,CAAC,UAAU;gBACf,UAAU,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,IAAI,cAAc,CAAa;YACrC,KAAK,CAAC,UAAU;gBACf,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACzB,UAAU,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;IACD,wBAAwB;IACxB,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAgB,CAA0C,CAAC;AAClF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAmB;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,KAAK,IAAI,CAAC,CAAC,UAAU,CAAC;IAC7C,qEAAqE;IACrE,mDAAmD;IACnD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACnB,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC;IACxB,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB;IAC5C,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACd,4EAA4E,GAAG,CAAC,QAAQ,sBAAsB,QAAQ,qDAAqD,CAC3K,CAAC;IACH,CAAC;IAED,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO;QACN,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAC3C,WAAW,EAAE,UAAU;KACvB,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,YAAY;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAc5D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAClC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACnD,YAAY,CAoBd;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -49,13 +49,13 @@ export function resolveEndpoint(bucket) {
|
|
|
49
49
|
* unit-testable without mutating global state.
|
|
50
50
|
*/
|
|
51
51
|
export function bucketConfigFromEnv(env = process.env) {
|
|
52
|
-
const
|
|
52
|
+
const rawEndpoint = env.AWS_ENDPOINT;
|
|
53
53
|
const bucket = env.AWS_BUCKET;
|
|
54
54
|
const access = env.AWS_ACCESS_KEY_ID;
|
|
55
55
|
const secret = env.AWS_SECRET_ACCESS_KEY;
|
|
56
|
-
if (
|
|
56
|
+
if (rawEndpoint && bucket && access && secret) {
|
|
57
57
|
return {
|
|
58
|
-
host,
|
|
58
|
+
host: normalizeHost(rawEndpoint, bucket),
|
|
59
59
|
bucket,
|
|
60
60
|
access_key: access,
|
|
61
61
|
secret_key: secret,
|
|
@@ -66,4 +66,9 @@ export function bucketConfigFromEnv(env = process.env) {
|
|
|
66
66
|
'AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY. Provision an Agentuity ' +
|
|
67
67
|
'bucket or set them manually.');
|
|
68
68
|
}
|
|
69
|
+
function normalizeHost(endpoint, bucket) {
|
|
70
|
+
const host = endpoint.replace(/^https?:\/\//, '').replace(/\/+$/, '');
|
|
71
|
+
const bucketPrefix = `${bucket}.`;
|
|
72
|
+
return host.startsWith(bucketPrefix) ? host.slice(bucketPrefix.length) : host;
|
|
73
|
+
}
|
|
69
74
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6CH;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IACnD,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACzF,CAAC;IACD,kEAAkE;IAClE,wDAAwD;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,WAAW,MAAM,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,mBAAmB,CAClC,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6CH;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IACnD,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACzF,CAAC;IACD,kEAAkE;IAClE,wDAAwD;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,WAAW,MAAM,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,mBAAmB,CAClC,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC;IACrC,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC;IACrC,MAAM,MAAM,GAAG,GAAG,CAAC,qBAAqB,CAAC;IACzC,IAAI,WAAW,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QAC/C,OAAO;YACN,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC;YACxC,MAAM;YACN,UAAU,EAAE,MAAM;YAClB,UAAU,EAAE,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,UAAU;SACtB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACd,qEAAqE;QACpE,oEAAoE;QACpE,8BAA8B,CAC/B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,MAAc;IACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,GAAG,MAAM,GAAG,CAAC;IAClC,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentuity/storage",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.6",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": "Agentuity employees and contributors",
|
|
6
6
|
"description": "Dual-runtime S3 client for Agentuity storage buckets. Bun backend uses Bun.S3Client; Node backend uses @aws-sdk/client-s3.",
|
package/src/node.ts
CHANGED
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
* sent on the wire.
|
|
23
23
|
*
|
|
24
24
|
* 3. **Bucket-in-endpoint addressing.** Agentuity buckets use
|
|
25
|
-
* virtual-host-style endpoints (`<bucket>.<host>`),
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
25
|
+
* virtual-host-style endpoints (`<bucket>.<host>`), but the AWS SDK
|
|
26
|
+
* composes virtual-host requests from a shared endpoint plus the
|
|
27
|
+
* command's `Bucket` parameter. We keep `forcePathStyle` false and
|
|
28
|
+
* pass the SDK the shared endpoint so it does not prepend the bucket
|
|
29
|
+
* twice.
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
32
|
import { Buffer } from 'node:buffer';
|
|
@@ -74,14 +74,7 @@ interface InternalState {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
export function createS3Client(bucket: BucketConfig): S3ClientLike {
|
|
77
|
-
const endpoint =
|
|
78
|
-
|
|
79
|
-
// The SDK's `Bucket` parameter is essentially a placeholder for our
|
|
80
|
-
// purposes — we always send virtual-hosted-style requests, so the
|
|
81
|
-
// `endpoint` URL is what actually routes. Prefer the explicit
|
|
82
|
-
// `bucket` field when supplied; otherwise fall back to parsing the
|
|
83
|
-
// leading hostname label out of the composed endpoint.
|
|
84
|
-
const bucketLabel = bucket.bucket ?? extractBucketLabel(endpoint);
|
|
77
|
+
const { endpoint, bucketLabel } = resolveSdkTarget(bucket);
|
|
85
78
|
|
|
86
79
|
const state: InternalState = {
|
|
87
80
|
endpoint,
|
|
@@ -224,6 +217,25 @@ export function createS3Client(bucket: BucketConfig): S3ClientLike {
|
|
|
224
217
|
};
|
|
225
218
|
}
|
|
226
219
|
|
|
220
|
+
function resolveSdkTarget(bucket: BucketConfig): { endpoint: string; bucketLabel: string } {
|
|
221
|
+
// Resolve first so invalid BucketConfig shapes fail before SDK adaptation.
|
|
222
|
+
const canonicalEndpoint = resolveEndpoint(bucket);
|
|
223
|
+
|
|
224
|
+
if (bucket.host && bucket.bucket) {
|
|
225
|
+
return {
|
|
226
|
+
endpoint: sharedEndpointFromHost(bucket.host),
|
|
227
|
+
bucketLabel: bucket.bucket,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return splitBucketEndpoint(canonicalEndpoint);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function sharedEndpointFromHost(host: string): string {
|
|
235
|
+
const hostOnly = host.replace(/^https?:\/\//, '').replace(/\/+$/, '');
|
|
236
|
+
return `https://${hostOnly}`;
|
|
237
|
+
}
|
|
238
|
+
|
|
227
239
|
/**
|
|
228
240
|
* Convert one of our accepted `S3Body` shapes into something the AWS
|
|
229
241
|
* SDK can consume, while also preparing a way to report the number of
|
|
@@ -375,18 +387,24 @@ function concatUint8Arrays(parts: Uint8Array[]): Uint8Array<ArrayBuffer> {
|
|
|
375
387
|
return out;
|
|
376
388
|
}
|
|
377
389
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
* URL. Falls back to `'bucket'` if parsing fails — which is fine
|
|
381
|
-
* because the endpoint override controls actual routing; the SDK only
|
|
382
|
-
* uses `Bucket` to construct path-style URLs (which we never do).
|
|
383
|
-
*/
|
|
384
|
-
function extractBucketLabel(endpoint: string): string {
|
|
390
|
+
function splitBucketEndpoint(endpoint: string): { endpoint: string; bucketLabel: string } {
|
|
391
|
+
let url: URL;
|
|
385
392
|
try {
|
|
386
|
-
|
|
387
|
-
const firstLabel = url.hostname.split('.')[0];
|
|
388
|
-
return firstLabel || 'bucket';
|
|
393
|
+
url = new URL(endpoint);
|
|
389
394
|
} catch {
|
|
390
|
-
|
|
395
|
+
throw new Error(`Invalid bucket endpoint URL: ${endpoint}`);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const [firstLabel, ...rest] = url.hostname.split('.');
|
|
399
|
+
if (!firstLabel || rest.length === 0) {
|
|
400
|
+
throw new Error(
|
|
401
|
+
`Bucket endpoint must be bucket-scoped as \`<bucket>.<host>\`, got host \`${url.hostname}\` from endpoint \`${endpoint}\`. Use \`host\` + \`bucket\` for shared endpoints.`
|
|
402
|
+
);
|
|
391
403
|
}
|
|
404
|
+
|
|
405
|
+
url.hostname = rest.join('.');
|
|
406
|
+
return {
|
|
407
|
+
endpoint: url.toString().replace(/\/$/, ''),
|
|
408
|
+
bucketLabel: firstLabel,
|
|
409
|
+
};
|
|
392
410
|
}
|
package/src/types.ts
CHANGED
|
@@ -96,13 +96,13 @@ export function resolveEndpoint(bucket: BucketConfig): string {
|
|
|
96
96
|
export function bucketConfigFromEnv(
|
|
97
97
|
env: Record<string, string | undefined> = process.env
|
|
98
98
|
): BucketConfig {
|
|
99
|
-
const
|
|
99
|
+
const rawEndpoint = env.AWS_ENDPOINT;
|
|
100
100
|
const bucket = env.AWS_BUCKET;
|
|
101
101
|
const access = env.AWS_ACCESS_KEY_ID;
|
|
102
102
|
const secret = env.AWS_SECRET_ACCESS_KEY;
|
|
103
|
-
if (
|
|
103
|
+
if (rawEndpoint && bucket && access && secret) {
|
|
104
104
|
return {
|
|
105
|
-
host,
|
|
105
|
+
host: normalizeHost(rawEndpoint, bucket),
|
|
106
106
|
bucket,
|
|
107
107
|
access_key: access,
|
|
108
108
|
secret_key: secret,
|
|
@@ -117,6 +117,12 @@ export function bucketConfigFromEnv(
|
|
|
117
117
|
);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
function normalizeHost(endpoint: string, bucket: string): string {
|
|
121
|
+
const host = endpoint.replace(/^https?:\/\//, '').replace(/\/+$/, '');
|
|
122
|
+
const bucketPrefix = `${bucket}.`;
|
|
123
|
+
return host.startsWith(bucketPrefix) ? host.slice(bucketPrefix.length) : host;
|
|
124
|
+
}
|
|
125
|
+
|
|
120
126
|
/** Options for `list()`. */
|
|
121
127
|
export interface S3ListOptions {
|
|
122
128
|
/** Only return objects whose key starts with this prefix. */
|