@furystack/s3-blob-store 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -0
- package/esm/define-s3-blob-store.d.ts +36 -0
- package/esm/define-s3-blob-store.d.ts.map +1 -0
- package/esm/define-s3-blob-store.js +41 -0
- package/esm/define-s3-blob-store.js.map +1 -0
- package/esm/define-s3-blob-store.spec.d.ts +2 -0
- package/esm/define-s3-blob-store.spec.d.ts.map +1 -0
- package/esm/define-s3-blob-store.spec.js +86 -0
- package/esm/define-s3-blob-store.spec.js.map +1 -0
- package/esm/ensure-bucket-lifecycle.d.ts +24 -0
- package/esm/ensure-bucket-lifecycle.d.ts.map +1 -0
- package/esm/ensure-bucket-lifecycle.js +37 -0
- package/esm/ensure-bucket-lifecycle.js.map +1 -0
- package/esm/index.d.ts +3 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +3 -0
- package/esm/index.js.map +1 -0
- package/esm/s3-blob-store.d.ts +82 -0
- package/esm/s3-blob-store.d.ts.map +1 -0
- package/esm/s3-blob-store.integration.spec.d.ts +2 -0
- package/esm/s3-blob-store.integration.spec.d.ts.map +1 -0
- package/esm/s3-blob-store.integration.spec.js +71 -0
- package/esm/s3-blob-store.integration.spec.js.map +1 -0
- package/esm/s3-blob-store.js +283 -0
- package/esm/s3-blob-store.js.map +1 -0
- package/esm/s3-blob-store.unit.spec.d.ts +2 -0
- package/esm/s3-blob-store.unit.spec.d.ts.map +1 -0
- package/esm/s3-blob-store.unit.spec.js +892 -0
- package/esm/s3-blob-store.unit.spec.js.map +1 -0
- package/esm/s3-stream-helpers.d.ts +35 -0
- package/esm/s3-stream-helpers.d.ts.map +1 -0
- package/esm/s3-stream-helpers.js +127 -0
- package/esm/s3-stream-helpers.js.map +1 -0
- package/package.json +55 -0
- package/src/define-s3-blob-store.spec.ts +24 -0
- package/src/define-s3-blob-store.ts +43 -0
- package/src/ensure-bucket-lifecycle.ts +47 -0
- package/src/index.ts +2 -0
- package/src/s3-blob-store.integration.spec.ts +78 -0
- package/src/s3-blob-store.ts +378 -0
- package/src/s3-blob-store.unit.spec.ts +539 -0
- package/src/s3-stream-helpers.ts +132 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, } from '@aws-sdk/client-s3';
|
|
2
|
+
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
|
3
|
+
import { BlobStoreError, validateBlobKey, } from '@furystack/blob-store';
|
|
4
|
+
import { DEFAULT_LIFECYCLE_RULE_ID, ensureBucketLifecycle } from './ensure-bucket-lifecycle.js';
|
|
5
|
+
import { bodyToBuffer, bodyToWebStream, stripQuotes, toUploadBody } from './s3-stream-helpers.js';
|
|
6
|
+
/**
|
|
7
|
+
* 5 TiB — the per-object limit AWS S3 enforces. Other S3-compatible
|
|
8
|
+
* backends (MinIO, R2) advertise smaller caps in practice; the value
|
|
9
|
+
* is a soft hint per
|
|
10
|
+
* {@link BlobStoreCapabilities.maxObjectBytes}.
|
|
11
|
+
*/
|
|
12
|
+
export const S3_MAX_OBJECT_BYTES = 5_497_558_138_880;
|
|
13
|
+
const CAPABILITIES = Object.freeze({
|
|
14
|
+
presignedUrls: true,
|
|
15
|
+
/**
|
|
16
|
+
* Single-part PUT only in v1. Apps that need resumable multipart
|
|
17
|
+
* uploads for very large payloads can compose `@aws-sdk/lib-storage`
|
|
18
|
+
* `Upload` themselves on the underlying `S3Client` and pass the
|
|
19
|
+
* resulting key back as a {@link BlobRef}. v1.x will lift this to
|
|
20
|
+
* `true` once the adapter exposes a multipart-aware `put` variant.
|
|
21
|
+
*/
|
|
22
|
+
multipart: false,
|
|
23
|
+
range: true,
|
|
24
|
+
crossNodeAccessible: true,
|
|
25
|
+
/**
|
|
26
|
+
* Single-part PUT caps at 5 GiB on AWS S3. Larger payloads need
|
|
27
|
+
* multipart, which v1 does not expose — see the `multipart` note
|
|
28
|
+
* above.
|
|
29
|
+
*/
|
|
30
|
+
maxObjectBytes: 5 * 1024 * 1024 * 1024,
|
|
31
|
+
});
|
|
32
|
+
const wrap = (code, message, key, storeName, cause) => {
|
|
33
|
+
throw new BlobStoreError(code, message, { key, storeName, cause });
|
|
34
|
+
};
|
|
35
|
+
const isNotFoundError = (cause) => {
|
|
36
|
+
if (!cause || typeof cause !== 'object')
|
|
37
|
+
return false;
|
|
38
|
+
const { name } = cause;
|
|
39
|
+
const code = cause.Code ?? cause.code;
|
|
40
|
+
const httpStatus = cause.$metadata?.httpStatusCode;
|
|
41
|
+
return name === 'NoSuchKey' || code === 'NoSuchKey' || code === 'NotFound' || httpStatus === 404;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* S3-compatible {@link BlobStore} adapter. Targets AWS S3, MinIO,
|
|
45
|
+
* Cloudflare R2, Backblaze B2, and any other backend exposing the v3
|
|
46
|
+
* S3 API. The caller owns the underlying `S3Client` instance.
|
|
47
|
+
*
|
|
48
|
+
* Multipart uploads run automatically via `@aws-sdk/lib-storage`'s
|
|
49
|
+
* `Upload`; single-part PUT is used for known-small payloads when
|
|
50
|
+
* `contentLength` is supplied at put time.
|
|
51
|
+
*/
|
|
52
|
+
export class S3BlobStore {
|
|
53
|
+
capabilities = CAPABILITIES;
|
|
54
|
+
storeName;
|
|
55
|
+
#client;
|
|
56
|
+
#bucket;
|
|
57
|
+
#keyPrefix;
|
|
58
|
+
#manageLifecycle;
|
|
59
|
+
#lifecycleRuleId;
|
|
60
|
+
#onLifecycleError;
|
|
61
|
+
#lifecycleAttempted = false;
|
|
62
|
+
#disposed = false;
|
|
63
|
+
constructor(options) {
|
|
64
|
+
if (!options.bucket || typeof options.bucket !== 'string') {
|
|
65
|
+
throw new BlobStoreError('invalid-config', 'S3BlobStore requires a non-empty `bucket`');
|
|
66
|
+
}
|
|
67
|
+
this.#client = options.client;
|
|
68
|
+
this.#bucket = options.bucket;
|
|
69
|
+
this.#keyPrefix = options.keyPrefix ?? '';
|
|
70
|
+
this.#manageLifecycle = options.manageLifecycle ?? true;
|
|
71
|
+
this.#lifecycleRuleId = options.lifecycleRuleId ?? DEFAULT_LIFECYCLE_RULE_ID;
|
|
72
|
+
this.#onLifecycleError = options.onLifecycleError;
|
|
73
|
+
this.storeName = options.name ?? 's3';
|
|
74
|
+
}
|
|
75
|
+
async put(key, payload, options = {}) {
|
|
76
|
+
this.#ensureLive();
|
|
77
|
+
validateBlobKey(key);
|
|
78
|
+
await this.#ensureLifecycle();
|
|
79
|
+
const wireKey = this.#wireKey(key);
|
|
80
|
+
let etag;
|
|
81
|
+
let contentLength;
|
|
82
|
+
try {
|
|
83
|
+
const body = toUploadBody(payload);
|
|
84
|
+
const result = await this.#client.send(new PutObjectCommand({
|
|
85
|
+
Bucket: this.#bucket,
|
|
86
|
+
Key: wireKey,
|
|
87
|
+
Body: body,
|
|
88
|
+
ContentType: options.contentType,
|
|
89
|
+
ContentLength: options.contentLength,
|
|
90
|
+
Metadata: options.metadata,
|
|
91
|
+
}));
|
|
92
|
+
etag = stripQuotes(result.ETag);
|
|
93
|
+
({ contentLength } = options);
|
|
94
|
+
}
|
|
95
|
+
catch (cause) {
|
|
96
|
+
throw new BlobStoreError('io-error', `Failed to upload blob ${key}`, {
|
|
97
|
+
key,
|
|
98
|
+
storeName: this.storeName,
|
|
99
|
+
cause,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (contentLength === undefined) {
|
|
103
|
+
try {
|
|
104
|
+
const head = await this.#client.send(new HeadObjectCommand({ Bucket: this.#bucket, Key: wireKey }));
|
|
105
|
+
contentLength = head.ContentLength;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Best-effort: leave contentLength undefined when head is denied/missing.
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
storeName: this.storeName,
|
|
113
|
+
key,
|
|
114
|
+
contentType: options.contentType,
|
|
115
|
+
contentLength,
|
|
116
|
+
etag,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async get(key) {
|
|
120
|
+
this.#ensureLive();
|
|
121
|
+
validateBlobKey(key);
|
|
122
|
+
const wireKey = this.#wireKey(key);
|
|
123
|
+
let response;
|
|
124
|
+
try {
|
|
125
|
+
response = await this.#client.send(new GetObjectCommand({ Bucket: this.#bucket, Key: wireKey }));
|
|
126
|
+
}
|
|
127
|
+
catch (cause) {
|
|
128
|
+
if (isNotFoundError(cause)) {
|
|
129
|
+
wrap('not-found', `Blob not found: ${key}`, key, this.storeName, cause);
|
|
130
|
+
}
|
|
131
|
+
wrap('io-error', `Failed to read blob ${key}`, key, this.storeName, cause);
|
|
132
|
+
throw cause;
|
|
133
|
+
}
|
|
134
|
+
const body = response.Body;
|
|
135
|
+
if (!body) {
|
|
136
|
+
throw new BlobStoreError('io-error', `S3 returned no body for ${key}`, {
|
|
137
|
+
key,
|
|
138
|
+
storeName: this.storeName,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
stream: bodyToWebStream(body),
|
|
143
|
+
contentType: response.ContentType,
|
|
144
|
+
contentLength: response.ContentLength,
|
|
145
|
+
etag: stripQuotes(response.ETag),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
async head(key) {
|
|
149
|
+
this.#ensureLive();
|
|
150
|
+
validateBlobKey(key);
|
|
151
|
+
const wireKey = this.#wireKey(key);
|
|
152
|
+
let response;
|
|
153
|
+
try {
|
|
154
|
+
response = await this.#client.send(new HeadObjectCommand({ Bucket: this.#bucket, Key: wireKey }));
|
|
155
|
+
}
|
|
156
|
+
catch (cause) {
|
|
157
|
+
if (isNotFoundError(cause))
|
|
158
|
+
return undefined;
|
|
159
|
+
throw new BlobStoreError('io-error', `Failed to head blob ${key}`, {
|
|
160
|
+
key,
|
|
161
|
+
storeName: this.storeName,
|
|
162
|
+
cause,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
key,
|
|
167
|
+
contentType: response.ContentType,
|
|
168
|
+
contentLength: response.ContentLength ?? 0,
|
|
169
|
+
etag: stripQuotes(response.ETag),
|
|
170
|
+
lastModified: response.LastModified ?? new Date(0),
|
|
171
|
+
customMetadata: response.Metadata,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
async delete(key) {
|
|
175
|
+
this.#ensureLive();
|
|
176
|
+
validateBlobKey(key);
|
|
177
|
+
try {
|
|
178
|
+
await this.#client.send(new DeleteObjectCommand({ Bucket: this.#bucket, Key: this.#wireKey(key) }));
|
|
179
|
+
}
|
|
180
|
+
catch (cause) {
|
|
181
|
+
if (isNotFoundError(cause))
|
|
182
|
+
return;
|
|
183
|
+
throw new BlobStoreError('io-error', `Failed to delete blob ${key}`, {
|
|
184
|
+
key,
|
|
185
|
+
storeName: this.storeName,
|
|
186
|
+
cause,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async list(prefix, options = {}) {
|
|
191
|
+
this.#ensureLive();
|
|
192
|
+
if (typeof prefix !== 'string') {
|
|
193
|
+
throw new BlobStoreError('invalid-config', 'Prefix must be a string');
|
|
194
|
+
}
|
|
195
|
+
const limit = options.limit ?? 100;
|
|
196
|
+
if (!Number.isInteger(limit) || limit <= 0) {
|
|
197
|
+
throw new BlobStoreError('invalid-config', `Limit must be a positive integer, got ${String(options.limit)}`);
|
|
198
|
+
}
|
|
199
|
+
let response;
|
|
200
|
+
try {
|
|
201
|
+
response = await this.#client.send(new ListObjectsV2Command({
|
|
202
|
+
Bucket: this.#bucket,
|
|
203
|
+
Prefix: this.#keyPrefix + prefix,
|
|
204
|
+
MaxKeys: limit,
|
|
205
|
+
ContinuationToken: options.cursor,
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
208
|
+
catch (cause) {
|
|
209
|
+
throw new BlobStoreError('io-error', 'Failed to list blobs', { storeName: this.storeName, cause });
|
|
210
|
+
}
|
|
211
|
+
const items = (response.Contents ?? [])
|
|
212
|
+
.filter((entry) => !!entry.Key)
|
|
213
|
+
.map((entry) => ({
|
|
214
|
+
key: this.#stripPrefix(entry.Key),
|
|
215
|
+
contentLength: entry.Size ?? 0,
|
|
216
|
+
etag: stripQuotes(entry.ETag),
|
|
217
|
+
lastModified: entry.LastModified ?? new Date(0),
|
|
218
|
+
}));
|
|
219
|
+
return {
|
|
220
|
+
items,
|
|
221
|
+
nextCursor: response.NextContinuationToken,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
async getDownloadUrl(key, options) {
|
|
225
|
+
this.#ensureLive();
|
|
226
|
+
validateBlobKey(key);
|
|
227
|
+
return getSignedUrl(this.#client, new GetObjectCommand({ Bucket: this.#bucket, Key: this.#wireKey(key) }), {
|
|
228
|
+
expiresIn: options.ttlSec,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
async getUploadUrl(key, options) {
|
|
232
|
+
this.#ensureLive();
|
|
233
|
+
validateBlobKey(key);
|
|
234
|
+
// Note on `maxBytes`: a pre-signed PUT cannot enforce a server-side
|
|
235
|
+
// upload size cap — `ContentLength` would lock the upload to an exact
|
|
236
|
+
// size, not a maximum, so we deliberately omit it. Apps that need a
|
|
237
|
+
// hard cap should either use the filesystem adapter's server-proxy
|
|
238
|
+
// endpoint (which streams through a size enforcer) or layer a POST
|
|
239
|
+
// policy in front of S3. `options.maxBytes` is treated as advisory
|
|
240
|
+
// here so callers who pass it on a heterogeneous adapter set still
|
|
241
|
+
// see uniform behaviour.
|
|
242
|
+
const url = await getSignedUrl(this.#client, new PutObjectCommand({
|
|
243
|
+
Bucket: this.#bucket,
|
|
244
|
+
Key: this.#wireKey(key),
|
|
245
|
+
ContentType: options.contentType,
|
|
246
|
+
}), { expiresIn: options.ttlSec });
|
|
247
|
+
return { url, method: 'PUT' };
|
|
248
|
+
}
|
|
249
|
+
[Symbol.dispose]() {
|
|
250
|
+
this.#disposed = true;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Public helper for tests / advanced consumers: drains a `Body` from an
|
|
254
|
+
* S3 response into a single `Uint8Array`. Memory-bound — only safe
|
|
255
|
+
* when the caller knows the payload fits in RAM.
|
|
256
|
+
*/
|
|
257
|
+
static async bodyToBuffer(body) {
|
|
258
|
+
return bodyToBuffer(body);
|
|
259
|
+
}
|
|
260
|
+
#wireKey(key) {
|
|
261
|
+
return `${this.#keyPrefix}${key}`;
|
|
262
|
+
}
|
|
263
|
+
#stripPrefix(wireKey) {
|
|
264
|
+
return this.#keyPrefix && wireKey.startsWith(this.#keyPrefix) ? wireKey.slice(this.#keyPrefix.length) : wireKey;
|
|
265
|
+
}
|
|
266
|
+
async #ensureLifecycle() {
|
|
267
|
+
if (!this.#manageLifecycle || this.#lifecycleAttempted)
|
|
268
|
+
return;
|
|
269
|
+
this.#lifecycleAttempted = true;
|
|
270
|
+
await ensureBucketLifecycle({
|
|
271
|
+
client: this.#client,
|
|
272
|
+
bucket: this.#bucket,
|
|
273
|
+
ruleId: this.#lifecycleRuleId,
|
|
274
|
+
onError: this.#onLifecycleError,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
#ensureLive() {
|
|
278
|
+
if (this.#disposed) {
|
|
279
|
+
throw new BlobStoreError('io-error', 'S3BlobStore has been disposed', { storeName: this.storeName });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=s3-blob-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-blob-store.js","sourceRoot":"","sources":["../src/s3-blob-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-blob-store.unit.spec.d.ts","sourceRoot":"","sources":["../src/s3-blob-store.unit.spec.ts"],"names":[],"mappings":""}
|