@agentuity/storage 3.1.1 → 3.1.3

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/bun.d.ts CHANGED
@@ -11,9 +11,25 @@
11
11
  * That is intentional and matches the contract of the `bun` exports
12
12
  * condition.
13
13
  */
14
- import type { BucketConfig, S3ClientLike } from './types.ts';
14
+ import type { BucketConfig, S3Body, S3ClientLike } from './types.ts';
15
15
  export type { BucketConfig, S3ClientLike } from './types.ts';
16
16
  export { bucketConfigFromEnv } from './types.ts';
17
+ /**
18
+ * Normalize a write body into a shape `Bun.S3Client.write` stores
19
+ * losslessly.
20
+ *
21
+ * Bun 1.3.x's `S3Client.write` does not consume a Web `ReadableStream`:
22
+ * it string-coerces it to the 23-byte literal `"[object ReadableStream]"`
23
+ * and stores that instead of the stream's bytes. Buffer a stream to bytes
24
+ * first (a `Uint8Array` round-trips correctly); every other accepted
25
+ * shape (string/Uint8Array/ArrayBuffer/Blob) is already stored losslessly
26
+ * and passes through untouched.
27
+ *
28
+ * Exported for regression testing: Bun's built-in `bun` module can't be
29
+ * overridden via `mock.module`, so the buffering is verified here rather
30
+ * than through a mocked `write`.
31
+ */
32
+ export declare function normalizeWriteBody(body: S3Body): Promise<Exclude<S3Body, ReadableStream<Uint8Array>>>;
17
33
  /**
18
34
  * Create an S3 client backed by `Bun.S3Client`.
19
35
  *
package/dist/bun.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bun.d.ts","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,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;AAEjD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAiFjE"}
1
+ {"version":3,"file":"bun.d.ts","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EACX,YAAY,EACZ,MAAM,EACN,YAAY,EAMZ,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,kBAAkB,CACvC,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAOtD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAiFjE"}
package/dist/bun.js CHANGED
@@ -14,6 +14,29 @@
14
14
  import { S3Client } from 'bun';
15
15
  import { resolveEndpoint } from "./types.js";
16
16
  export { bucketConfigFromEnv } from "./types.js";
17
+ /**
18
+ * Normalize a write body into a shape `Bun.S3Client.write` stores
19
+ * losslessly.
20
+ *
21
+ * Bun 1.3.x's `S3Client.write` does not consume a Web `ReadableStream`:
22
+ * it string-coerces it to the 23-byte literal `"[object ReadableStream]"`
23
+ * and stores that instead of the stream's bytes. Buffer a stream to bytes
24
+ * first (a `Uint8Array` round-trips correctly); every other accepted
25
+ * shape (string/Uint8Array/ArrayBuffer/Blob) is already stored losslessly
26
+ * and passes through untouched.
27
+ *
28
+ * Exported for regression testing: Bun's built-in `bun` module can't be
29
+ * overridden via `mock.module`, so the buffering is verified here rather
30
+ * than through a mocked `write`.
31
+ */
32
+ export async function normalizeWriteBody(body) {
33
+ if (body instanceof ReadableStream) {
34
+ // Buffer the stream to bytes; a Uint8Array round-trips correctly
35
+ // where a raw Web stream is silently corrupted.
36
+ return new Uint8Array(await new Response(body).arrayBuffer());
37
+ }
38
+ return body;
39
+ }
17
40
  /**
18
41
  * Create an S3 client backed by `Bun.S3Client`.
19
42
  *
@@ -78,10 +101,10 @@ export function createS3Client(bucket) {
78
101
  };
79
102
  },
80
103
  async write(key, body, opts) {
81
- // `Bun.S3Client.write` accepts string, Uint8Array, ArrayBuffer,
82
- // Blob, ReadableStream, or Response. We accept the same shapes
83
- // minus Response (callers should pass the underlying stream).
84
- return client.write(key, body, opts);
104
+ // `Bun.S3Client.write` cannot consume a Web `ReadableStream` (it
105
+ // string-coerces it to "[object ReadableStream]"), so normalize
106
+ // the body to a shape Bun stores losslessly before writing.
107
+ return client.write(key, await normalizeWriteBody(body), opts);
85
108
  },
86
109
  async delete(key) {
87
110
  await client.delete(key);
package/dist/bun.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bun.js","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bun.js","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/storage",
3
- "version": "3.1.1",
3
+ "version": "3.1.3",
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/bun.ts CHANGED
@@ -28,6 +28,32 @@ import type {
28
28
  export type { BucketConfig, S3ClientLike } from './types.ts';
29
29
  export { bucketConfigFromEnv } from './types.ts';
30
30
 
31
+ /**
32
+ * Normalize a write body into a shape `Bun.S3Client.write` stores
33
+ * losslessly.
34
+ *
35
+ * Bun 1.3.x's `S3Client.write` does not consume a Web `ReadableStream`:
36
+ * it string-coerces it to the 23-byte literal `"[object ReadableStream]"`
37
+ * and stores that instead of the stream's bytes. Buffer a stream to bytes
38
+ * first (a `Uint8Array` round-trips correctly); every other accepted
39
+ * shape (string/Uint8Array/ArrayBuffer/Blob) is already stored losslessly
40
+ * and passes through untouched.
41
+ *
42
+ * Exported for regression testing: Bun's built-in `bun` module can't be
43
+ * overridden via `mock.module`, so the buffering is verified here rather
44
+ * than through a mocked `write`.
45
+ */
46
+ export async function normalizeWriteBody(
47
+ body: S3Body
48
+ ): Promise<Exclude<S3Body, ReadableStream<Uint8Array>>> {
49
+ if (body instanceof ReadableStream) {
50
+ // Buffer the stream to bytes; a Uint8Array round-trips correctly
51
+ // where a raw Web stream is silently corrupted.
52
+ return new Uint8Array(await new Response(body).arrayBuffer());
53
+ }
54
+ return body;
55
+ }
56
+
31
57
  /**
32
58
  * Create an S3 client backed by `Bun.S3Client`.
33
59
  *
@@ -106,10 +132,10 @@ export function createS3Client(bucket: BucketConfig): S3ClientLike {
106
132
  },
107
133
 
108
134
  async write(key: string, body: S3Body, opts?: S3WriteOptions): Promise<number> {
109
- // `Bun.S3Client.write` accepts string, Uint8Array, ArrayBuffer,
110
- // Blob, ReadableStream, or Response. We accept the same shapes
111
- // minus Response (callers should pass the underlying stream).
112
- return client.write(key, body as any, opts);
135
+ // `Bun.S3Client.write` cannot consume a Web `ReadableStream` (it
136
+ // string-coerces it to "[object ReadableStream]"), so normalize
137
+ // the body to a shape Bun stores losslessly before writing.
138
+ return client.write(key, await normalizeWriteBody(body), opts);
113
139
  },
114
140
 
115
141
  async delete(key: string): Promise<void> {