@contract-kit/provider-storage-s3 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/CHANGELOG.md +28 -0
- package/README.md +141 -0
- package/dist/index.d.ts +148 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +644 -0
- package/dist/index.js.map +1 -0
- package/package.json +67 -0
- package/src/index.ts +906 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
import { Readable } from "node:stream";
|
|
2
|
+
import { DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client, } from "@aws-sdk/client-s3";
|
|
3
|
+
import { createProviderDevtools } from "@contract-kit/devtools";
|
|
4
|
+
import { createProvider, } from "@contract-kit/ports";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
const visibilityMetadataKey = "ck-visibility";
|
|
7
|
+
const BooleanString = z
|
|
8
|
+
.enum(["true", "false"])
|
|
9
|
+
.transform((value) => value === "true");
|
|
10
|
+
const S3StorageConfigSchema = z.object({
|
|
11
|
+
BUCKET: z.string().min(1),
|
|
12
|
+
REGION: z.string().min(1).default("us-east-1"),
|
|
13
|
+
ENDPOINT: z.string().url().optional(),
|
|
14
|
+
ACCESS_KEY_ID: z.string().min(1).optional(),
|
|
15
|
+
SECRET_ACCESS_KEY: z.string().min(1).optional(),
|
|
16
|
+
SESSION_TOKEN: z.string().min(1).optional(),
|
|
17
|
+
PUBLIC_BASE_URL: z.string().min(1).optional(),
|
|
18
|
+
FORCE_PATH_STYLE: BooleanString.optional(),
|
|
19
|
+
KEY_PREFIX: z.string().optional(),
|
|
20
|
+
});
|
|
21
|
+
function copyBytes(bytes) {
|
|
22
|
+
return new Uint8Array(bytes);
|
|
23
|
+
}
|
|
24
|
+
function bytesToArrayBuffer(bytes) {
|
|
25
|
+
const buffer = new ArrayBuffer(bytes.byteLength);
|
|
26
|
+
new Uint8Array(buffer).set(bytes);
|
|
27
|
+
return buffer;
|
|
28
|
+
}
|
|
29
|
+
function bytesToStream(bytes) {
|
|
30
|
+
const copy = copyBytes(bytes);
|
|
31
|
+
return new ReadableStream({
|
|
32
|
+
start(controller) {
|
|
33
|
+
controller.enqueue(copy);
|
|
34
|
+
controller.close();
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function hasControlCharacter(value) {
|
|
39
|
+
for (const char of value) {
|
|
40
|
+
const code = char.charCodeAt(0);
|
|
41
|
+
if (code <= 31 || code === 127)
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
function validateStorageKey(key) {
|
|
47
|
+
if (key.length === 0) {
|
|
48
|
+
throw new Error("Storage key must not be empty.");
|
|
49
|
+
}
|
|
50
|
+
if (hasControlCharacter(key)) {
|
|
51
|
+
throw new Error("Storage key must not include control characters.");
|
|
52
|
+
}
|
|
53
|
+
if (key.startsWith("/")) {
|
|
54
|
+
throw new Error("Storage key must not start with '/'.");
|
|
55
|
+
}
|
|
56
|
+
if (key.endsWith("/")) {
|
|
57
|
+
throw new Error("Storage key must not end with '/'.");
|
|
58
|
+
}
|
|
59
|
+
if (key.includes("\\")) {
|
|
60
|
+
throw new Error("Storage key must use '/' separators, not '\\'.");
|
|
61
|
+
}
|
|
62
|
+
const segments = key.split("/");
|
|
63
|
+
if (segments.some((segment) => segment === "")) {
|
|
64
|
+
throw new Error("Storage key must not include empty path segments.");
|
|
65
|
+
}
|
|
66
|
+
if (segments.some((segment) => segment === "." || segment === "..")) {
|
|
67
|
+
throw new Error("Storage key must not include '.' or '..' segments.");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function normalizeKeyPrefix(prefix) {
|
|
71
|
+
if (!prefix)
|
|
72
|
+
return "";
|
|
73
|
+
const normalized = prefix.replace(/^\/+|\/+$/g, "");
|
|
74
|
+
if (!normalized)
|
|
75
|
+
return "";
|
|
76
|
+
validateStorageKey(normalized);
|
|
77
|
+
return normalized;
|
|
78
|
+
}
|
|
79
|
+
function objectKey(prefix, key) {
|
|
80
|
+
validateStorageKey(key);
|
|
81
|
+
return prefix ? `${prefix}/${key}` : key;
|
|
82
|
+
}
|
|
83
|
+
function objectPrefix(keyPrefix, prefix) {
|
|
84
|
+
if (prefix.length === 0) {
|
|
85
|
+
return keyPrefix ? `${keyPrefix}/` : "";
|
|
86
|
+
}
|
|
87
|
+
const normalized = prefix.replace(/\/+$/g, "");
|
|
88
|
+
validateStorageKey(normalized);
|
|
89
|
+
return `${objectKey(keyPrefix, normalized)}/`;
|
|
90
|
+
}
|
|
91
|
+
function joinPublicUrl(baseUrl, key) {
|
|
92
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
93
|
+
const encodedKey = key
|
|
94
|
+
.split("/")
|
|
95
|
+
.map((part) => encodeURIComponent(part))
|
|
96
|
+
.join("/");
|
|
97
|
+
return `${base}/${encodedKey}`;
|
|
98
|
+
}
|
|
99
|
+
function toPutBody(body) {
|
|
100
|
+
if (typeof body === "string")
|
|
101
|
+
return body;
|
|
102
|
+
if (body instanceof Uint8Array)
|
|
103
|
+
return copyBytes(body);
|
|
104
|
+
if (body instanceof ArrayBuffer)
|
|
105
|
+
return new Uint8Array(body.slice(0));
|
|
106
|
+
if (body instanceof Blob) {
|
|
107
|
+
return Readable.fromWeb(body.stream());
|
|
108
|
+
}
|
|
109
|
+
return Readable.fromWeb(body);
|
|
110
|
+
}
|
|
111
|
+
async function streamToBytes(stream) {
|
|
112
|
+
const reader = stream.getReader();
|
|
113
|
+
const chunks = [];
|
|
114
|
+
let size = 0;
|
|
115
|
+
try {
|
|
116
|
+
while (true) {
|
|
117
|
+
const result = await reader.read();
|
|
118
|
+
if (result.done)
|
|
119
|
+
break;
|
|
120
|
+
chunks.push(result.value);
|
|
121
|
+
size += result.value.byteLength;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
reader.releaseLock();
|
|
126
|
+
}
|
|
127
|
+
const bytes = new Uint8Array(size);
|
|
128
|
+
let offset = 0;
|
|
129
|
+
for (const chunk of chunks) {
|
|
130
|
+
bytes.set(chunk, offset);
|
|
131
|
+
offset += chunk.byteLength;
|
|
132
|
+
}
|
|
133
|
+
return bytes;
|
|
134
|
+
}
|
|
135
|
+
async function asyncIterableToBytes(iterable) {
|
|
136
|
+
const chunks = [];
|
|
137
|
+
let size = 0;
|
|
138
|
+
for await (const chunk of iterable) {
|
|
139
|
+
chunks.push(chunk);
|
|
140
|
+
size += chunk.byteLength;
|
|
141
|
+
}
|
|
142
|
+
const bytes = new Uint8Array(size);
|
|
143
|
+
let offset = 0;
|
|
144
|
+
for (const chunk of chunks) {
|
|
145
|
+
bytes.set(chunk, offset);
|
|
146
|
+
offset += chunk.byteLength;
|
|
147
|
+
}
|
|
148
|
+
return bytes;
|
|
149
|
+
}
|
|
150
|
+
function isAsyncIterable(value) {
|
|
151
|
+
return (typeof value === "object" && value !== null && Symbol.asyncIterator in value);
|
|
152
|
+
}
|
|
153
|
+
function bodyToStream(body) {
|
|
154
|
+
if (body instanceof ReadableStream)
|
|
155
|
+
return body;
|
|
156
|
+
if (body instanceof Uint8Array)
|
|
157
|
+
return bytesToStream(body);
|
|
158
|
+
if (typeof body === "string") {
|
|
159
|
+
return bytesToStream(new TextEncoder().encode(body));
|
|
160
|
+
}
|
|
161
|
+
if (body instanceof Blob) {
|
|
162
|
+
return body.stream();
|
|
163
|
+
}
|
|
164
|
+
const transformable = body;
|
|
165
|
+
if (typeof transformable?.transformToWebStream === "function") {
|
|
166
|
+
return transformable.transformToWebStream();
|
|
167
|
+
}
|
|
168
|
+
if (body instanceof Readable) {
|
|
169
|
+
return Readable.toWeb(body);
|
|
170
|
+
}
|
|
171
|
+
throw new Error("S3 object body is not readable.");
|
|
172
|
+
}
|
|
173
|
+
async function bodyToBytes(body) {
|
|
174
|
+
if (body instanceof Uint8Array)
|
|
175
|
+
return copyBytes(body);
|
|
176
|
+
if (typeof body === "string")
|
|
177
|
+
return new TextEncoder().encode(body);
|
|
178
|
+
if (body instanceof Blob)
|
|
179
|
+
return new Uint8Array(await body.arrayBuffer());
|
|
180
|
+
const transformable = body;
|
|
181
|
+
if (typeof transformable?.transformToByteArray === "function") {
|
|
182
|
+
return copyBytes(await transformable.transformToByteArray());
|
|
183
|
+
}
|
|
184
|
+
if (typeof transformable?.transformToString === "function") {
|
|
185
|
+
return new TextEncoder().encode(await transformable.transformToString());
|
|
186
|
+
}
|
|
187
|
+
if (isAsyncIterable(body)) {
|
|
188
|
+
return asyncIterableToBytes(body);
|
|
189
|
+
}
|
|
190
|
+
return streamToBytes(bodyToStream(body));
|
|
191
|
+
}
|
|
192
|
+
function createObjectBody(object, body) {
|
|
193
|
+
let bodyUsed = false;
|
|
194
|
+
function markConsumed() {
|
|
195
|
+
if (bodyUsed) {
|
|
196
|
+
throw new Error("Storage object body has already been consumed.");
|
|
197
|
+
}
|
|
198
|
+
bodyUsed = true;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
...object,
|
|
202
|
+
get bodyUsed() {
|
|
203
|
+
return bodyUsed;
|
|
204
|
+
},
|
|
205
|
+
stream() {
|
|
206
|
+
markConsumed();
|
|
207
|
+
return bodyToStream(body);
|
|
208
|
+
},
|
|
209
|
+
async bytes() {
|
|
210
|
+
markConsumed();
|
|
211
|
+
return bodyToBytes(body);
|
|
212
|
+
},
|
|
213
|
+
async arrayBuffer() {
|
|
214
|
+
markConsumed();
|
|
215
|
+
return bytesToArrayBuffer(await bodyToBytes(body));
|
|
216
|
+
},
|
|
217
|
+
async text() {
|
|
218
|
+
markConsumed();
|
|
219
|
+
if (typeof body === "string")
|
|
220
|
+
return body;
|
|
221
|
+
const transformable = body;
|
|
222
|
+
if (typeof transformable?.transformToString === "function") {
|
|
223
|
+
return transformable.transformToString();
|
|
224
|
+
}
|
|
225
|
+
return new TextDecoder().decode(await bodyToBytes(body));
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function metadataWithoutReserved(metadata) {
|
|
230
|
+
const result = {};
|
|
231
|
+
for (const [key, value] of Object.entries(metadata ?? {})) {
|
|
232
|
+
if (key.toLowerCase() !== visibilityMetadataKey) {
|
|
233
|
+
result[key] = value;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return result;
|
|
237
|
+
}
|
|
238
|
+
function visibilityFromMetadata(metadata) {
|
|
239
|
+
const visibility = metadata?.[visibilityMetadataKey];
|
|
240
|
+
return visibility === "public" ? "public" : "private";
|
|
241
|
+
}
|
|
242
|
+
function metadataForPut(metadata, visibility) {
|
|
243
|
+
return {
|
|
244
|
+
...(metadata ?? {}),
|
|
245
|
+
[visibilityMetadataKey]: visibility,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
function objectFromHead(key, output) {
|
|
249
|
+
return {
|
|
250
|
+
key,
|
|
251
|
+
size: output.ContentLength ?? 0,
|
|
252
|
+
...(output.ContentType !== undefined
|
|
253
|
+
? { contentType: output.ContentType }
|
|
254
|
+
: {}),
|
|
255
|
+
...(output.CacheControl !== undefined
|
|
256
|
+
? { cacheControl: output.CacheControl }
|
|
257
|
+
: {}),
|
|
258
|
+
metadata: metadataWithoutReserved(output.Metadata),
|
|
259
|
+
visibility: visibilityFromMetadata(output.Metadata),
|
|
260
|
+
lastModified: output.LastModified ?? new Date(),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
function isNotFoundError(error) {
|
|
264
|
+
if (typeof error !== "object" || error === null)
|
|
265
|
+
return false;
|
|
266
|
+
const candidate = error;
|
|
267
|
+
return (candidate.name === "NoSuchKey" ||
|
|
268
|
+
candidate.name === "NotFound" ||
|
|
269
|
+
candidate.Code === "NoSuchKey" ||
|
|
270
|
+
candidate.code === "NoSuchKey" ||
|
|
271
|
+
candidate.$metadata?.httpStatusCode === 404);
|
|
272
|
+
}
|
|
273
|
+
function errorMessage(error) {
|
|
274
|
+
return error instanceof Error ? error.message : String(error);
|
|
275
|
+
}
|
|
276
|
+
function createDefaultClient(options) {
|
|
277
|
+
return new S3Client({
|
|
278
|
+
...options.clientConfig,
|
|
279
|
+
region: options.region ?? "us-east-1",
|
|
280
|
+
...(options.endpoint !== undefined ? { endpoint: options.endpoint } : {}),
|
|
281
|
+
...(options.credentials !== undefined
|
|
282
|
+
? { credentials: options.credentials }
|
|
283
|
+
: {}),
|
|
284
|
+
...(options.forcePathStyle !== undefined
|
|
285
|
+
? { forcePathStyle: options.forcePathStyle }
|
|
286
|
+
: {}),
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
export function createS3Storage(options) {
|
|
290
|
+
const client = options.client ?? createDefaultClient(options);
|
|
291
|
+
const keyPrefix = normalizeKeyPrefix(options.keyPrefix);
|
|
292
|
+
const devtools = createProviderDevtools(options.devtools, {
|
|
293
|
+
providerName: "storage-s3",
|
|
294
|
+
watcher: "storage",
|
|
295
|
+
});
|
|
296
|
+
const recordStorageEvent = (event) => {
|
|
297
|
+
devtools.custom({
|
|
298
|
+
name: `storage.${event.operation}`,
|
|
299
|
+
label: `Storage ${event.operation}`,
|
|
300
|
+
summary: event.summary,
|
|
301
|
+
details: {
|
|
302
|
+
provider: "s3",
|
|
303
|
+
operation: event.operation,
|
|
304
|
+
key: event.key,
|
|
305
|
+
bucket: options.bucket,
|
|
306
|
+
...event.details,
|
|
307
|
+
},
|
|
308
|
+
});
|
|
309
|
+
};
|
|
310
|
+
async function statObject(key) {
|
|
311
|
+
const s3Key = objectKey(keyPrefix, key);
|
|
312
|
+
try {
|
|
313
|
+
const output = (await client.send(new HeadObjectCommand({
|
|
314
|
+
Bucket: options.bucket,
|
|
315
|
+
Key: s3Key,
|
|
316
|
+
})));
|
|
317
|
+
return objectFromHead(key, output);
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
if (isNotFoundError(error))
|
|
321
|
+
return null;
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
async put(key, body, putOptions) {
|
|
327
|
+
const startedAt = Date.now();
|
|
328
|
+
try {
|
|
329
|
+
const s3Key = objectKey(keyPrefix, key);
|
|
330
|
+
const visibility = putOptions?.visibility ?? "private";
|
|
331
|
+
await client.send(new PutObjectCommand({
|
|
332
|
+
Bucket: options.bucket,
|
|
333
|
+
Key: s3Key,
|
|
334
|
+
Body: toPutBody(body),
|
|
335
|
+
...(putOptions?.contentType !== undefined
|
|
336
|
+
? { ContentType: putOptions.contentType }
|
|
337
|
+
: {}),
|
|
338
|
+
...(putOptions?.cacheControl !== undefined
|
|
339
|
+
? { CacheControl: putOptions.cacheControl }
|
|
340
|
+
: {}),
|
|
341
|
+
Metadata: metadataForPut(putOptions?.metadata, visibility),
|
|
342
|
+
}));
|
|
343
|
+
const object = (await statObject(key)) ??
|
|
344
|
+
{
|
|
345
|
+
key,
|
|
346
|
+
size: 0,
|
|
347
|
+
...(putOptions?.contentType !== undefined
|
|
348
|
+
? { contentType: putOptions.contentType }
|
|
349
|
+
: {}),
|
|
350
|
+
...(putOptions?.cacheControl !== undefined
|
|
351
|
+
? { cacheControl: putOptions.cacheControl }
|
|
352
|
+
: {}),
|
|
353
|
+
metadata: { ...(putOptions?.metadata ?? {}) },
|
|
354
|
+
visibility,
|
|
355
|
+
lastModified: new Date(),
|
|
356
|
+
};
|
|
357
|
+
recordStorageEvent({
|
|
358
|
+
operation: "put",
|
|
359
|
+
key,
|
|
360
|
+
summary: "Storage object written",
|
|
361
|
+
details: {
|
|
362
|
+
s3Key,
|
|
363
|
+
size: object.size,
|
|
364
|
+
visibility: object.visibility,
|
|
365
|
+
contentType: object.contentType ?? null,
|
|
366
|
+
metadataKeys: Object.keys(object.metadata),
|
|
367
|
+
durationMs: Date.now() - startedAt,
|
|
368
|
+
},
|
|
369
|
+
});
|
|
370
|
+
return object;
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
recordStorageEvent({
|
|
374
|
+
operation: "put.failed",
|
|
375
|
+
key,
|
|
376
|
+
summary: "Storage put failed",
|
|
377
|
+
details: {
|
|
378
|
+
durationMs: Date.now() - startedAt,
|
|
379
|
+
error: errorMessage(error),
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
throw error;
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
async get(key) {
|
|
386
|
+
const startedAt = Date.now();
|
|
387
|
+
try {
|
|
388
|
+
const s3Key = objectKey(keyPrefix, key);
|
|
389
|
+
const output = (await client.send(new GetObjectCommand({
|
|
390
|
+
Bucket: options.bucket,
|
|
391
|
+
Key: s3Key,
|
|
392
|
+
})));
|
|
393
|
+
if (output.Body === undefined)
|
|
394
|
+
return null;
|
|
395
|
+
const object = objectFromHead(key, output);
|
|
396
|
+
recordStorageEvent({
|
|
397
|
+
operation: "get",
|
|
398
|
+
key,
|
|
399
|
+
summary: "Storage object read",
|
|
400
|
+
details: {
|
|
401
|
+
s3Key,
|
|
402
|
+
hit: true,
|
|
403
|
+
size: object.size,
|
|
404
|
+
durationMs: Date.now() - startedAt,
|
|
405
|
+
},
|
|
406
|
+
});
|
|
407
|
+
return createObjectBody(object, output.Body);
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
if (isNotFoundError(error)) {
|
|
411
|
+
recordStorageEvent({
|
|
412
|
+
operation: "get",
|
|
413
|
+
key,
|
|
414
|
+
summary: "Storage object missing",
|
|
415
|
+
details: {
|
|
416
|
+
hit: false,
|
|
417
|
+
durationMs: Date.now() - startedAt,
|
|
418
|
+
},
|
|
419
|
+
});
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
recordStorageEvent({
|
|
423
|
+
operation: "get.failed",
|
|
424
|
+
key,
|
|
425
|
+
summary: "Storage get failed",
|
|
426
|
+
details: {
|
|
427
|
+
durationMs: Date.now() - startedAt,
|
|
428
|
+
error: errorMessage(error),
|
|
429
|
+
},
|
|
430
|
+
});
|
|
431
|
+
throw error;
|
|
432
|
+
}
|
|
433
|
+
},
|
|
434
|
+
async stat(key) {
|
|
435
|
+
const startedAt = Date.now();
|
|
436
|
+
try {
|
|
437
|
+
const object = await statObject(key);
|
|
438
|
+
recordStorageEvent({
|
|
439
|
+
operation: "stat",
|
|
440
|
+
key,
|
|
441
|
+
summary: object ? "Storage object found" : "Storage object missing",
|
|
442
|
+
details: {
|
|
443
|
+
hit: object !== null,
|
|
444
|
+
size: object?.size ?? null,
|
|
445
|
+
durationMs: Date.now() - startedAt,
|
|
446
|
+
},
|
|
447
|
+
});
|
|
448
|
+
return object;
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
recordStorageEvent({
|
|
452
|
+
operation: "stat.failed",
|
|
453
|
+
key,
|
|
454
|
+
summary: "Storage stat failed",
|
|
455
|
+
details: {
|
|
456
|
+
durationMs: Date.now() - startedAt,
|
|
457
|
+
error: errorMessage(error),
|
|
458
|
+
},
|
|
459
|
+
});
|
|
460
|
+
throw error;
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
async delete(key) {
|
|
464
|
+
const startedAt = Date.now();
|
|
465
|
+
try {
|
|
466
|
+
const s3Key = objectKey(keyPrefix, key);
|
|
467
|
+
const existed = (await statObject(key)) !== null;
|
|
468
|
+
await client.send(new DeleteObjectCommand({
|
|
469
|
+
Bucket: options.bucket,
|
|
470
|
+
Key: s3Key,
|
|
471
|
+
}));
|
|
472
|
+
recordStorageEvent({
|
|
473
|
+
operation: "delete",
|
|
474
|
+
key,
|
|
475
|
+
summary: existed
|
|
476
|
+
? "Storage object deleted"
|
|
477
|
+
: "Storage object missing",
|
|
478
|
+
details: {
|
|
479
|
+
s3Key,
|
|
480
|
+
deleted: existed,
|
|
481
|
+
durationMs: Date.now() - startedAt,
|
|
482
|
+
},
|
|
483
|
+
});
|
|
484
|
+
return existed;
|
|
485
|
+
}
|
|
486
|
+
catch (error) {
|
|
487
|
+
recordStorageEvent({
|
|
488
|
+
operation: "delete.failed",
|
|
489
|
+
key,
|
|
490
|
+
summary: "Storage delete failed",
|
|
491
|
+
details: {
|
|
492
|
+
durationMs: Date.now() - startedAt,
|
|
493
|
+
error: errorMessage(error),
|
|
494
|
+
},
|
|
495
|
+
});
|
|
496
|
+
throw error;
|
|
497
|
+
}
|
|
498
|
+
},
|
|
499
|
+
async exists(key) {
|
|
500
|
+
const startedAt = Date.now();
|
|
501
|
+
try {
|
|
502
|
+
const exists = (await statObject(key)) !== null;
|
|
503
|
+
recordStorageEvent({
|
|
504
|
+
operation: "exists",
|
|
505
|
+
key,
|
|
506
|
+
summary: exists ? "Storage object exists" : "Storage object missing",
|
|
507
|
+
details: {
|
|
508
|
+
exists,
|
|
509
|
+
durationMs: Date.now() - startedAt,
|
|
510
|
+
},
|
|
511
|
+
});
|
|
512
|
+
return exists;
|
|
513
|
+
}
|
|
514
|
+
catch (error) {
|
|
515
|
+
recordStorageEvent({
|
|
516
|
+
operation: "exists.failed",
|
|
517
|
+
key,
|
|
518
|
+
summary: "Storage exists failed",
|
|
519
|
+
details: {
|
|
520
|
+
durationMs: Date.now() - startedAt,
|
|
521
|
+
error: errorMessage(error),
|
|
522
|
+
},
|
|
523
|
+
});
|
|
524
|
+
throw error;
|
|
525
|
+
}
|
|
526
|
+
},
|
|
527
|
+
async publicUrl(key) {
|
|
528
|
+
const startedAt = Date.now();
|
|
529
|
+
try {
|
|
530
|
+
const s3Key = objectKey(keyPrefix, key);
|
|
531
|
+
const object = await statObject(key);
|
|
532
|
+
const url = object?.visibility === "public" && options.publicBaseUrl
|
|
533
|
+
? joinPublicUrl(options.publicBaseUrl, s3Key)
|
|
534
|
+
: null;
|
|
535
|
+
recordStorageEvent({
|
|
536
|
+
operation: "publicUrl",
|
|
537
|
+
key,
|
|
538
|
+
summary: url ? "Storage public URL resolved" : "No public URL",
|
|
539
|
+
details: {
|
|
540
|
+
s3Key,
|
|
541
|
+
hit: object !== null,
|
|
542
|
+
visibility: object?.visibility ?? null,
|
|
543
|
+
hasPublicUrl: url !== null,
|
|
544
|
+
durationMs: Date.now() - startedAt,
|
|
545
|
+
},
|
|
546
|
+
});
|
|
547
|
+
return url;
|
|
548
|
+
}
|
|
549
|
+
catch (error) {
|
|
550
|
+
recordStorageEvent({
|
|
551
|
+
operation: "publicUrl.failed",
|
|
552
|
+
key,
|
|
553
|
+
summary: "Storage public URL failed",
|
|
554
|
+
details: {
|
|
555
|
+
durationMs: Date.now() - startedAt,
|
|
556
|
+
error: errorMessage(error),
|
|
557
|
+
},
|
|
558
|
+
});
|
|
559
|
+
throw error;
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
export function createS3StorageProvider(options = {}) {
|
|
565
|
+
const ConfigSchema = S3StorageConfigSchema.extend({
|
|
566
|
+
BUCKET: options.bucket !== undefined
|
|
567
|
+
? z.string().min(1).default(options.bucket)
|
|
568
|
+
: S3StorageConfigSchema.shape.BUCKET,
|
|
569
|
+
REGION: z
|
|
570
|
+
.string()
|
|
571
|
+
.min(1)
|
|
572
|
+
.default(options.region ?? "us-east-1"),
|
|
573
|
+
ENDPOINT: options.endpoint !== undefined
|
|
574
|
+
? z.string().url().default(options.endpoint)
|
|
575
|
+
: S3StorageConfigSchema.shape.ENDPOINT,
|
|
576
|
+
PUBLIC_BASE_URL: options.publicBaseUrl !== undefined
|
|
577
|
+
? z.string().min(1).default(options.publicBaseUrl)
|
|
578
|
+
: S3StorageConfigSchema.shape.PUBLIC_BASE_URL,
|
|
579
|
+
FORCE_PATH_STYLE: options.forcePathStyle !== undefined
|
|
580
|
+
? BooleanString.default(options.forcePathStyle)
|
|
581
|
+
: S3StorageConfigSchema.shape.FORCE_PATH_STYLE,
|
|
582
|
+
KEY_PREFIX: options.keyPrefix !== undefined
|
|
583
|
+
? z.string().default(options.keyPrefix)
|
|
584
|
+
: S3StorageConfigSchema.shape.KEY_PREFIX,
|
|
585
|
+
});
|
|
586
|
+
return createProvider({
|
|
587
|
+
name: options.name ?? "storage-s3",
|
|
588
|
+
config: {
|
|
589
|
+
schema: ConfigSchema,
|
|
590
|
+
envPrefix: "STORAGE_S3_",
|
|
591
|
+
},
|
|
592
|
+
async setup({ ports, config }) {
|
|
593
|
+
if (!config?.BUCKET) {
|
|
594
|
+
throw new Error("[s3StorageProvider] Missing S3 storage config. " +
|
|
595
|
+
"Please set STORAGE_S3_BUCKET.");
|
|
596
|
+
}
|
|
597
|
+
const keyPrefix = normalizeKeyPrefix(config.KEY_PREFIX ?? options.keyPrefix);
|
|
598
|
+
const client = options.createClient?.(config) ??
|
|
599
|
+
createDefaultClient({
|
|
600
|
+
...options,
|
|
601
|
+
bucket: config.BUCKET,
|
|
602
|
+
region: config.REGION ?? options.region,
|
|
603
|
+
endpoint: config.ENDPOINT ?? options.endpoint,
|
|
604
|
+
publicBaseUrl: config.PUBLIC_BASE_URL ?? options.publicBaseUrl,
|
|
605
|
+
forcePathStyle: config.FORCE_PATH_STYLE ?? options.forcePathStyle,
|
|
606
|
+
keyPrefix,
|
|
607
|
+
credentials: config.ACCESS_KEY_ID && config.SECRET_ACCESS_KEY
|
|
608
|
+
? {
|
|
609
|
+
accessKeyId: config.ACCESS_KEY_ID,
|
|
610
|
+
secretAccessKey: config.SECRET_ACCESS_KEY,
|
|
611
|
+
...(config.SESSION_TOKEN !== undefined
|
|
612
|
+
? { sessionToken: config.SESSION_TOKEN }
|
|
613
|
+
: {}),
|
|
614
|
+
}
|
|
615
|
+
: options.credentials,
|
|
616
|
+
});
|
|
617
|
+
return {
|
|
618
|
+
ports: {
|
|
619
|
+
storage: createS3Storage({
|
|
620
|
+
...options,
|
|
621
|
+
bucket: config.BUCKET,
|
|
622
|
+
client,
|
|
623
|
+
publicBaseUrl: config.PUBLIC_BASE_URL ?? options.publicBaseUrl,
|
|
624
|
+
keyPrefix,
|
|
625
|
+
devtools: ports,
|
|
626
|
+
}),
|
|
627
|
+
s3Storage: {
|
|
628
|
+
client,
|
|
629
|
+
bucket: config.BUCKET,
|
|
630
|
+
keyPrefix,
|
|
631
|
+
objectKey(key) {
|
|
632
|
+
return objectKey(keyPrefix, key);
|
|
633
|
+
},
|
|
634
|
+
objectPrefix(prefix) {
|
|
635
|
+
return objectPrefix(keyPrefix, prefix);
|
|
636
|
+
},
|
|
637
|
+
},
|
|
638
|
+
},
|
|
639
|
+
};
|
|
640
|
+
},
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
export const s3StorageProvider = createS3StorageProvider();
|
|
644
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|