@zeruxjs/files 0.0.0-stage → 0.0.2
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/LICENSE-APACHE +201 -0
- package/LICENSE-MIT +9 -0
- package/README.md +67 -2
- package/dist/authorization.d.ts +25 -0
- package/dist/authorization.js +27 -0
- package/dist/authorization.js.map +1 -0
- package/dist/aws-credentials.d.ts +43 -0
- package/dist/aws-credentials.js +64 -0
- package/dist/aws-credentials.js.map +1 -0
- package/dist/cache.d.ts +22 -0
- package/dist/cache.js +49 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.js +38 -0
- package/dist/client.js.map +1 -0
- package/dist/drivers/local.d.ts +8 -0
- package/dist/drivers/local.js +277 -0
- package/dist/drivers/local.js.map +1 -0
- package/dist/drivers/s3.d.ts +54 -0
- package/dist/drivers/s3.js +219 -0
- package/dist/drivers/s3.js.map +1 -0
- package/dist/http.d.ts +23 -0
- package/dist/http.js +157 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/manager.d.ts +2 -0
- package/dist/manager.js +171 -0
- package/dist/manager.js.map +1 -0
- package/dist/types.d.ts +104 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +9 -0
- package/dist/validation.js +84 -0
- package/dist/validation.js.map +1 -0
- package/package.json +46 -4
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, createHash, randomBytes, randomUUID } from 'node:crypto';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { mkdir, lstat, realpath, open, link, rename, unlink, readdir } from 'node:fs/promises';
|
|
4
|
+
import { dirname, join, resolve, sep } from 'node:path';
|
|
5
|
+
import { chunks, ensureNotExpired, validateAddress, validateBucket, validateKey, validatePut, validateRange } from '../validation.js';
|
|
6
|
+
function failNotFound() { return Object.assign(new Error('File not found'), { code: 'ENOENT' }); }
|
|
7
|
+
export function createLocalStorage(options) {
|
|
8
|
+
if (!options?.root)
|
|
9
|
+
throw new TypeError('Local storage root required');
|
|
10
|
+
const root = resolve(options.root), objects = join(root, 'objects'), metadata = join(root, 'metadata');
|
|
11
|
+
const key = options.encryptionKey === undefined ? undefined : typeof options.encryptionKey === 'string' ? Buffer.from(options.encryptionKey, 'base64') : Buffer.from(options.encryptionKey);
|
|
12
|
+
if (key && key.byteLength !== 32)
|
|
13
|
+
throw new TypeError('AES-256-GCM requires 32-byte encryption key');
|
|
14
|
+
async function secureDir(path, create = false) {
|
|
15
|
+
if (!(path === root || path.startsWith(root + sep)))
|
|
16
|
+
throw new Error('Unsafe storage directory');
|
|
17
|
+
if (create) {
|
|
18
|
+
if (path !== root)
|
|
19
|
+
await secureDir(dirname(path), true);
|
|
20
|
+
await mkdir(path, { mode: 0o700 }).catch(error => { if (error.code !== 'EEXIST')
|
|
21
|
+
throw error; });
|
|
22
|
+
}
|
|
23
|
+
const current = await lstat(path);
|
|
24
|
+
if (!current.isDirectory() || current.isSymbolicLink() || await realpath(path) !== path)
|
|
25
|
+
throw new Error('Unsafe storage directory');
|
|
26
|
+
// Check root separately even when requesting a nested directory.
|
|
27
|
+
if (path !== root)
|
|
28
|
+
await secureDir(root);
|
|
29
|
+
}
|
|
30
|
+
function paths(address) { validateAddress(address); const dest = join(objects, address.bucket, ...address.key.split('/')); const id = createHash('sha256').update(address.key).digest('hex'); return { dest, sidecar: join(metadata, address.bucket, id + '.json') }; }
|
|
31
|
+
async function metadataOf(a) {
|
|
32
|
+
const { sidecar, dest } = paths(a);
|
|
33
|
+
try {
|
|
34
|
+
await secureDir(dirname(sidecar));
|
|
35
|
+
const handle = await open(sidecar, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
36
|
+
try {
|
|
37
|
+
const st = await handle.stat();
|
|
38
|
+
if (!st.isFile() || st.size > 16384)
|
|
39
|
+
throw new Error('Invalid file metadata');
|
|
40
|
+
const info = JSON.parse(await handle.readFile({ encoding: 'utf8' }));
|
|
41
|
+
if (info.bucket !== a.bucket || info.key !== a.key || !Number.isSafeInteger(info.size) || info.size < 0 || typeof info.etag !== 'string' || !/^"[a-f0-9]{64}"$/.test(info.etag) || !['private', 'public'].includes(info.visibility) || typeof info.contentType !== 'string' || typeof info.modifiedAt !== 'string' || !info.metadata || typeof info.metadata !== 'object')
|
|
42
|
+
throw new Error('Corrupted file metadata');
|
|
43
|
+
await secureDir(dirname(dest));
|
|
44
|
+
const file = await open(dest, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
45
|
+
try {
|
|
46
|
+
const physical = await file.stat();
|
|
47
|
+
if (!physical.isFile() || physical.size !== info.size) {
|
|
48
|
+
if (!info.encryption || physical.size !== info.size)
|
|
49
|
+
throw new Error('File size mismatch');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
await file.close();
|
|
54
|
+
}
|
|
55
|
+
return info;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
await handle.close();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
if (e.code === 'ENOENT')
|
|
63
|
+
return null;
|
|
64
|
+
throw e;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function atomicJson(path, data) {
|
|
68
|
+
await secureDir(dirname(path), true);
|
|
69
|
+
const tmp = path + '.tmp-' + randomUUID();
|
|
70
|
+
try {
|
|
71
|
+
const handle = await open(tmp, 'wx', 0o600);
|
|
72
|
+
try {
|
|
73
|
+
await handle.writeFile(JSON.stringify(data));
|
|
74
|
+
await handle.sync();
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
await handle.close();
|
|
78
|
+
}
|
|
79
|
+
await rename(tmp, path);
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
await unlink(tmp).catch(() => { });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const driver = {
|
|
86
|
+
kind: 'local-s3-lite',
|
|
87
|
+
async put(address, source, options = {}) {
|
|
88
|
+
validatePut(options);
|
|
89
|
+
const { dest, sidecar } = paths(address);
|
|
90
|
+
await secureDir(dirname(dest), true);
|
|
91
|
+
await secureDir(dirname(sidecar), true);
|
|
92
|
+
if (options.ifNoneMatch !== false && await metadataOf(address))
|
|
93
|
+
throw Object.assign(new Error('File exists'), { code: 'FILE_EXISTS' });
|
|
94
|
+
const tmp = dest + '.tmp-' + randomUUID();
|
|
95
|
+
const handle = await open(tmp, 'wx', 0o600);
|
|
96
|
+
let length = 0;
|
|
97
|
+
const hash = createHash('sha256');
|
|
98
|
+
const iv = key ? randomBytes(12) : undefined;
|
|
99
|
+
const cipher = key && iv ? createCipheriv('aes-256-gcm', key, iv) : undefined;
|
|
100
|
+
try {
|
|
101
|
+
for await (const part of chunks(source, options.signal)) {
|
|
102
|
+
length += part.byteLength;
|
|
103
|
+
if (!Number.isSafeInteger(length) || length > (options.maxBytes ?? Number.MAX_SAFE_INTEGER))
|
|
104
|
+
throw new RangeError('File size exceeds limit');
|
|
105
|
+
hash.update(part);
|
|
106
|
+
const encoded = cipher ? cipher.update(part) : part;
|
|
107
|
+
if (encoded.byteLength)
|
|
108
|
+
await handle.writeFile(encoded);
|
|
109
|
+
}
|
|
110
|
+
if (cipher) {
|
|
111
|
+
const tail = cipher.final();
|
|
112
|
+
if (tail.byteLength)
|
|
113
|
+
await handle.writeFile(tail);
|
|
114
|
+
}
|
|
115
|
+
await handle.sync();
|
|
116
|
+
await handle.close();
|
|
117
|
+
if (options.ifNoneMatch !== false) {
|
|
118
|
+
await link(tmp, dest);
|
|
119
|
+
await unlink(tmp);
|
|
120
|
+
}
|
|
121
|
+
else
|
|
122
|
+
await rename(tmp, dest);
|
|
123
|
+
const info = { bucket: address.bucket, key: address.key, size: length, etag: '"' + hash.digest('hex') + '"', contentType: options.contentType ?? 'application/octet-stream', visibility: options.visibility ?? 'private', modifiedAt: new Date().toISOString(), metadata: { ...options.metadata }, ...(options.cacheControl ? { cacheControl: options.cacheControl } : {}), ...(options.contentDisposition ? { contentDisposition: options.contentDisposition } : {}), ...(options.expiresAt ? { expiresAt: options.expiresAt } : {}), ...(cipher && iv ? { encryption: 'AES-256-GCM', rangeSupported: false, versionId: iv.toString('base64url') + '.' + cipher.getAuthTag().toString('base64url') } : {}) };
|
|
124
|
+
await atomicJson(sidecar, info);
|
|
125
|
+
return info;
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
await handle.close().catch(() => { });
|
|
129
|
+
throw err;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
await unlink(tmp).catch(() => { });
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
stat(address) { return metadataOf(address); },
|
|
136
|
+
async read(address, opts = {}) {
|
|
137
|
+
validateRange(opts);
|
|
138
|
+
const info = await metadataOf(address);
|
|
139
|
+
if (!info)
|
|
140
|
+
throw failNotFound();
|
|
141
|
+
ensureNotExpired(info);
|
|
142
|
+
if (info.encryption && (opts.start !== undefined || opts.end !== undefined))
|
|
143
|
+
throw new Error('Ranges unsupported for encrypted local objects');
|
|
144
|
+
const { dest } = paths(address);
|
|
145
|
+
await secureDir(dirname(dest));
|
|
146
|
+
const handle = await open(dest, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
147
|
+
const st = await handle.stat();
|
|
148
|
+
if (!st.isFile() || st.size !== info.size) {
|
|
149
|
+
await handle.close();
|
|
150
|
+
throw new Error('File size changed');
|
|
151
|
+
}
|
|
152
|
+
if (info.encryption) {
|
|
153
|
+
// Verify the entire AES-GCM authentication tag BEFORE emitting any bytes.
|
|
154
|
+
// This is an extra streaming pass over the private file, bounded in memory.
|
|
155
|
+
try {
|
|
156
|
+
if (!key || !info.versionId)
|
|
157
|
+
throw new Error('Storage encryption key unavailable');
|
|
158
|
+
const [iv, tag] = info.versionId.split('.');
|
|
159
|
+
const verifier = createDecipheriv('aes-256-gcm', key, Buffer.from(iv, 'base64url'));
|
|
160
|
+
verifier.setAuthTag(Buffer.from(tag, 'base64url'));
|
|
161
|
+
let checkOffset = 0;
|
|
162
|
+
while (checkOffset < info.size) {
|
|
163
|
+
if (opts.signal?.aborted)
|
|
164
|
+
throw opts.signal.reason;
|
|
165
|
+
const buf = Buffer.allocUnsafe(Math.min(64 * 1024, info.size - checkOffset));
|
|
166
|
+
const { bytesRead } = await handle.read(buf, 0, buf.length, checkOffset);
|
|
167
|
+
if (!bytesRead)
|
|
168
|
+
throw new Error('File truncated during decryption');
|
|
169
|
+
verifier.update(buf.subarray(0, bytesRead));
|
|
170
|
+
checkOffset += bytesRead;
|
|
171
|
+
}
|
|
172
|
+
verifier.final();
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
await handle.close();
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const start = opts.start ?? 0;
|
|
180
|
+
const end = Math.min(opts.end ?? Math.max(0, info.size - 1), Math.max(0, info.size - 1));
|
|
181
|
+
async function* reader() {
|
|
182
|
+
try {
|
|
183
|
+
let decipher;
|
|
184
|
+
if (info.encryption) {
|
|
185
|
+
if (!key || !info.versionId)
|
|
186
|
+
throw new Error('Storage encryption key unavailable');
|
|
187
|
+
const [iv, tag] = info.versionId.split('.');
|
|
188
|
+
decipher = createDecipheriv('aes-256-gcm', key, Buffer.from(iv, 'base64url'));
|
|
189
|
+
decipher.setAuthTag(Buffer.from(tag, 'base64url'));
|
|
190
|
+
}
|
|
191
|
+
let offset = start;
|
|
192
|
+
while (offset <= end && info.size) {
|
|
193
|
+
if (opts.signal?.aborted)
|
|
194
|
+
throw opts.signal.reason;
|
|
195
|
+
const buf = Buffer.allocUnsafe(Math.min(64 * 1024, end - offset + 1));
|
|
196
|
+
const { bytesRead } = await handle.read(buf, 0, buf.length, offset);
|
|
197
|
+
if (!bytesRead)
|
|
198
|
+
throw new Error('File truncated during read');
|
|
199
|
+
offset += bytesRead;
|
|
200
|
+
const part = decipher ? decipher.update(buf.subarray(0, bytesRead)) : buf.subarray(0, bytesRead);
|
|
201
|
+
if (part.byteLength)
|
|
202
|
+
yield part;
|
|
203
|
+
}
|
|
204
|
+
if (decipher) {
|
|
205
|
+
const final = decipher.final();
|
|
206
|
+
if (final.byteLength)
|
|
207
|
+
yield final;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
await handle.close();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return reader();
|
|
215
|
+
},
|
|
216
|
+
async delete(a) {
|
|
217
|
+
const info = await metadataOf(a);
|
|
218
|
+
if (!info)
|
|
219
|
+
return false;
|
|
220
|
+
const { dest, sidecar } = paths(a);
|
|
221
|
+
for (const path of [dest, sidecar]) {
|
|
222
|
+
const item = await lstat(path);
|
|
223
|
+
if (!item.isFile() || item.isSymbolicLink())
|
|
224
|
+
throw new Error('Unsafe storage entry');
|
|
225
|
+
}
|
|
226
|
+
await unlink(sidecar);
|
|
227
|
+
await unlink(dest);
|
|
228
|
+
return true;
|
|
229
|
+
},
|
|
230
|
+
async list(bucket, options = {}) {
|
|
231
|
+
validateBucket(bucket);
|
|
232
|
+
const limit = options.limit ?? 100;
|
|
233
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1000)
|
|
234
|
+
throw new RangeError('Invalid limit');
|
|
235
|
+
const location = join(metadata, bucket);
|
|
236
|
+
try {
|
|
237
|
+
await secureDir(location);
|
|
238
|
+
}
|
|
239
|
+
catch (e) {
|
|
240
|
+
if (e.code === 'ENOENT')
|
|
241
|
+
return { items: [] };
|
|
242
|
+
throw e;
|
|
243
|
+
}
|
|
244
|
+
const all = [];
|
|
245
|
+
for (const name of (await readdir(location)).filter(n => /^[a-f0-9]{64}\.json$/.test(n))) {
|
|
246
|
+
try {
|
|
247
|
+
const path = join(location, name), handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
248
|
+
let info;
|
|
249
|
+
try {
|
|
250
|
+
if ((await handle.stat()).size > 16384)
|
|
251
|
+
continue;
|
|
252
|
+
info = JSON.parse(await handle.readFile({ encoding: 'utf8' }));
|
|
253
|
+
}
|
|
254
|
+
finally {
|
|
255
|
+
await handle.close();
|
|
256
|
+
}
|
|
257
|
+
if (info.bucket !== bucket || typeof info.key !== 'string')
|
|
258
|
+
continue;
|
|
259
|
+
validateKey(info.key);
|
|
260
|
+
if (options.prefix && !info.key.startsWith(options.prefix))
|
|
261
|
+
continue;
|
|
262
|
+
const valid = await metadataOf(info);
|
|
263
|
+
if (valid && !valid.expiresAt || valid && Date.parse(valid.expiresAt) > Date.now())
|
|
264
|
+
all.push(valid);
|
|
265
|
+
}
|
|
266
|
+
catch { /* exclude broken records */ }
|
|
267
|
+
}
|
|
268
|
+
all.sort((a, b) => a.key.localeCompare(b.key));
|
|
269
|
+
const filtered = all.filter(item => !options.cursor || item.key > options.cursor);
|
|
270
|
+
const items = filtered.slice(0, limit);
|
|
271
|
+
return { items, nextCursor: filtered.length > limit ? items.at(-1).key : undefined };
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
return driver;
|
|
275
|
+
}
|
|
276
|
+
export const createS3LiteStorage = createLocalStorage;
|
|
277
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/drivers/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AwsCredentialOptions } from '../aws-credentials.js';
|
|
2
|
+
import type { StorageDriver } from '../types.js';
|
|
3
|
+
export type S3Encryption = {
|
|
4
|
+
mode: 'AES256';
|
|
5
|
+
} | {
|
|
6
|
+
mode: 'aws:kms';
|
|
7
|
+
keyId?: string;
|
|
8
|
+
bucketKeyEnabled?: boolean;
|
|
9
|
+
} | {
|
|
10
|
+
mode: 'SSE-C';
|
|
11
|
+
customerKeyBase64: string;
|
|
12
|
+
};
|
|
13
|
+
export interface S3StorageDriver extends StorageDriver {
|
|
14
|
+
readonly kind: 'aws-s3';
|
|
15
|
+
/** Trusted-server escape hatch for S3-specific lifecycle, versioning, policy and KMS commands. */
|
|
16
|
+
getClient(): Promise<{
|
|
17
|
+
send(command: any): Promise<any>;
|
|
18
|
+
destroy?(): void;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export interface S3StorageOptions extends AwsCredentialOptions {
|
|
22
|
+
/** AWS region, or signing region for MinIO/RustFS/S3-compatible endpoints. */
|
|
23
|
+
region?: string;
|
|
24
|
+
endpoint?: string;
|
|
25
|
+
/** Defaults true for custom S3 endpoints (MinIO, RustFS, R2, Ceph), false for AWS. */
|
|
26
|
+
forcePathStyle?: boolean;
|
|
27
|
+
/** Opt into HTTP for trusted on-premise S3 endpoints. Never use over untrusted networks. */
|
|
28
|
+
allowInsecureHttp?: boolean;
|
|
29
|
+
/** AWS S3 access-point ARN region support; not available on all third-party endpoints. */
|
|
30
|
+
useArnRegion?: boolean;
|
|
31
|
+
/** Controls optional AWS SDK retry behavior. */
|
|
32
|
+
maxAttempts?: number;
|
|
33
|
+
encryption?: S3Encryption;
|
|
34
|
+
/** Public custom domain / CloudFront domain. Never makes an object public by itself. */
|
|
35
|
+
publicBaseUrl?: string;
|
|
36
|
+
cloudFrontSigning?: {
|
|
37
|
+
keyPairId: string;
|
|
38
|
+
privateKey: string;
|
|
39
|
+
};
|
|
40
|
+
/** CloudFront distributions may map a single bucket to their origin root. */
|
|
41
|
+
publicPathStyle?: 'bucket-key' | 'key-only';
|
|
42
|
+
/** Use dependency-injected AWS SDK compatible client for tests or shared clients. */
|
|
43
|
+
client?: {
|
|
44
|
+
send(command: any): Promise<any>;
|
|
45
|
+
destroy?(): void;
|
|
46
|
+
};
|
|
47
|
+
/** Default false; if true, close() also destroys an injected client. */
|
|
48
|
+
ownClient?: boolean;
|
|
49
|
+
multipart?: {
|
|
50
|
+
partSize?: number;
|
|
51
|
+
queueSize?: number;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export declare function createS3Storage(options: S3StorageOptions): S3StorageDriver;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
|
+
import { resolveAwsCredentials, validateAwsCredentialOptions } from '../aws-credentials.js';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { chunks, validateAddress, validateBucket, validatePut, validateRange } from '../validation.js';
|
|
5
|
+
export function createS3Storage(options) {
|
|
6
|
+
const region = options?.region ?? 'us-east-1';
|
|
7
|
+
if (!/^[A-Za-z0-9-]{1,64}$/.test(region))
|
|
8
|
+
throw new TypeError('Invalid S3 region');
|
|
9
|
+
validateAwsCredentialOptions(options);
|
|
10
|
+
if (options.maxAttempts !== undefined && (!Number.isSafeInteger(options.maxAttempts) || options.maxAttempts < 1 || options.maxAttempts > 20))
|
|
11
|
+
throw new RangeError('Invalid S3 retry count');
|
|
12
|
+
if (options.endpoint) {
|
|
13
|
+
const parsed = new URL(options.endpoint);
|
|
14
|
+
if (!['https:', 'http:'].includes(parsed.protocol) || !parsed.hostname || parsed.username || parsed.password || parsed.search || parsed.hash)
|
|
15
|
+
throw new TypeError('Invalid S3 endpoint');
|
|
16
|
+
if (parsed.protocol === 'http:' && !options.allowInsecureHttp)
|
|
17
|
+
throw new TypeError('HTTP S3 endpoints require allowInsecureHttp');
|
|
18
|
+
if (options.encryption?.mode === 'SSE-C' && parsed.protocol === 'http:')
|
|
19
|
+
throw new TypeError('SSE-C customer keys require HTTPS');
|
|
20
|
+
}
|
|
21
|
+
if (options.publicBaseUrl && (!/^https:\/\//.test(options.publicBaseUrl) || new URL(options.publicBaseUrl).username || new URL(options.publicBaseUrl).password || new URL(options.publicBaseUrl).search))
|
|
22
|
+
throw new TypeError('Public CDN URL must use HTTPS');
|
|
23
|
+
if (options.publicPathStyle && !['bucket-key', 'key-only'].includes(options.publicPathStyle))
|
|
24
|
+
throw new TypeError('Invalid CDN path style');
|
|
25
|
+
if (options.cloudFrontSigning && !options.publicBaseUrl)
|
|
26
|
+
throw new TypeError('CloudFront signing requires publicBaseUrl');
|
|
27
|
+
if (options.cloudFrontSigning && (!options.cloudFrontSigning.keyPairId || !options.cloudFrontSigning.privateKey))
|
|
28
|
+
throw new TypeError('CloudFront signing keys required');
|
|
29
|
+
if (options.encryption?.mode === 'SSE-C' && options.publicBaseUrl)
|
|
30
|
+
throw new TypeError('SSE-C objects cannot use public CDN URLs');
|
|
31
|
+
if (options.multipart?.partSize !== undefined && (!Number.isSafeInteger(options.multipart.partSize) || options.multipart.partSize < 5 * 1024 * 1024 || options.multipart.partSize > 512 * 1024 * 1024))
|
|
32
|
+
throw new RangeError('Invalid S3 multipart part size');
|
|
33
|
+
if (options.multipart?.queueSize !== undefined && (!Number.isSafeInteger(options.multipart.queueSize) || options.multipart.queueSize < 1 || options.multipart.queueSize > 32))
|
|
34
|
+
throw new RangeError('Invalid S3 multipart concurrency');
|
|
35
|
+
if (options.encryption?.mode === 'SSE-C' && Buffer.from(options.encryption.customerKeyBase64, 'base64').length !== 32)
|
|
36
|
+
throw new TypeError('SSE-C requires a base64-encoded 32-byte key');
|
|
37
|
+
let client = options.client;
|
|
38
|
+
let creating;
|
|
39
|
+
let closed = false;
|
|
40
|
+
async function getClient() {
|
|
41
|
+
if (closed)
|
|
42
|
+
throw new Error('S3 connection closed');
|
|
43
|
+
if (client)
|
|
44
|
+
return client;
|
|
45
|
+
return creating ??= Promise.all([import('@aws-sdk/client-s3'), resolveAwsCredentials(options, region)]).then(([{ S3Client }, credentials]) => client = new S3Client({ region, endpoint: options.endpoint, forcePathStyle: options.forcePathStyle ?? !!options.endpoint, useArnRegion: options.useArnRegion, maxAttempts: options.maxAttempts, ...(credentials ? { credentials } : {}) })).catch(error => { creating = undefined; throw error; });
|
|
46
|
+
}
|
|
47
|
+
async function send(command) { return (await getClient()).send(command); }
|
|
48
|
+
function encryptionHeaders(forRead = false) {
|
|
49
|
+
switch (options.encryption?.mode) {
|
|
50
|
+
case 'AES256': return forRead ? {} : { ServerSideEncryption: 'AES256' };
|
|
51
|
+
case 'aws:kms': return forRead ? {} : { ServerSideEncryption: 'aws:kms', SSEKMSKeyId: options.encryption.keyId, BucketKeyEnabled: options.encryption.bucketKeyEnabled };
|
|
52
|
+
case 'SSE-C': {
|
|
53
|
+
const customer = options.encryption.customerKeyBase64;
|
|
54
|
+
return { SSECustomerAlgorithm: 'AES256', SSECustomerKey: customer, SSECustomerKeyMD5: createHash('md5').update(Buffer.from(customer, 'base64')).digest('base64') };
|
|
55
|
+
}
|
|
56
|
+
default: return {};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function url(a) { validateAddress(a); if (!options.publicBaseUrl)
|
|
60
|
+
return undefined; return options.publicBaseUrl.replace(/\/$/, '') + '/' + (options.publicPathStyle === 'key-only' ? '' : encodeURIComponent(a.bucket) + '/') + a.key.split('/').map(encodeURIComponent).join('/'); }
|
|
61
|
+
function metadata(meta, visibility) {
|
|
62
|
+
return { ...meta, 'zfiles-visibility': visibility };
|
|
63
|
+
}
|
|
64
|
+
function result(a, head) {
|
|
65
|
+
const data = head.Metadata ?? {};
|
|
66
|
+
const user = { ...data };
|
|
67
|
+
delete user['zfiles-visibility'];
|
|
68
|
+
delete user['zfiles-expires'];
|
|
69
|
+
const visibility = data['zfiles-visibility'] === 'public' ? 'public' : 'private';
|
|
70
|
+
return { bucket: a.bucket, key: a.key, size: Number(head.ContentLength ?? head.Size ?? 0), etag: String(head.ETag ?? '').replace(/^"|"$/g, '') ? String(head.ETag) : '', contentType: head.ContentType ?? 'application/octet-stream', modifiedAt: (head.LastModified instanceof Date ? head.LastModified : new Date(head.LastModified ?? Date.now())).toISOString(), visibility, metadata: user, cacheControl: head.CacheControl, contentDisposition: head.ContentDisposition, versionId: head.VersionId, rangeSupported: true, encryption: options.encryption?.mode === 'SSE-C' ? 'SSE-C' : head.ServerSideEncryption, expiresAt: data['zfiles-expires'] };
|
|
71
|
+
}
|
|
72
|
+
async function stat(a) {
|
|
73
|
+
validateAddress(a);
|
|
74
|
+
const { HeadObjectCommand } = await import('@aws-sdk/client-s3');
|
|
75
|
+
try {
|
|
76
|
+
return result(a, await send(new HeadObjectCommand({ Bucket: a.bucket, Key: a.key, ...encryptionHeaders(true) })));
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
const err = e;
|
|
80
|
+
if (['NotFound', 'NoSuchKey'].includes(err.name ?? '') || err.$metadata?.httpStatusCode === 404)
|
|
81
|
+
return null;
|
|
82
|
+
throw e;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const driver = {
|
|
86
|
+
kind: 'aws-s3',
|
|
87
|
+
getClient,
|
|
88
|
+
async put(a, source, opts = {}) {
|
|
89
|
+
validateAddress(a);
|
|
90
|
+
validatePut(opts);
|
|
91
|
+
if (opts.signal?.aborted)
|
|
92
|
+
throw opts.signal.reason;
|
|
93
|
+
// Streaming/unknown-length bodies require multipart upload. Conditional
|
|
94
|
+
// create is best-effort here (preflight HEAD is not atomic across writers).
|
|
95
|
+
const max = opts.maxBytes ?? Number.MAX_SAFE_INTEGER;
|
|
96
|
+
if (source instanceof Uint8Array) {
|
|
97
|
+
if (source.byteLength > max)
|
|
98
|
+
throw new RangeError('File size exceeds limit');
|
|
99
|
+
const { PutObjectCommand } = await import('@aws-sdk/client-s3');
|
|
100
|
+
const userMetadata = { ...opts.metadata };
|
|
101
|
+
if (opts.expiresAt)
|
|
102
|
+
userMetadata['zfiles-expires'] = opts.expiresAt;
|
|
103
|
+
try {
|
|
104
|
+
await send(new PutObjectCommand({ Bucket: a.bucket, Key: a.key, Body: source, ContentType: opts.contentType ?? 'application/octet-stream', ContentDisposition: opts.contentDisposition, CacheControl: opts.cacheControl, Metadata: metadata(userMetadata, opts.visibility ?? 'private'), ...encryptionHeaders(), ...(opts.ifNoneMatch !== false ? { IfNoneMatch: '*' } : {}) }));
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const code = error;
|
|
108
|
+
if (code.name === 'PreconditionFailed' || code.$metadata?.httpStatusCode === 412)
|
|
109
|
+
throw Object.assign(new Error('File exists'), { code: 'FILE_EXISTS' });
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
const info = await stat(a);
|
|
113
|
+
if (!info)
|
|
114
|
+
throw new Error('S3 object not visible after upload');
|
|
115
|
+
return info;
|
|
116
|
+
}
|
|
117
|
+
const { Upload } = await import('@aws-sdk/lib-storage');
|
|
118
|
+
async function* bounded() { let bytes = 0; for await (const piece of chunks(source, opts.signal)) {
|
|
119
|
+
bytes += piece.byteLength;
|
|
120
|
+
if (!Number.isSafeInteger(bytes) || bytes > max)
|
|
121
|
+
throw new RangeError('File size exceeds limit');
|
|
122
|
+
yield Buffer.from(piece);
|
|
123
|
+
} }
|
|
124
|
+
const userMetadata = { ...opts.metadata };
|
|
125
|
+
if (opts.expiresAt)
|
|
126
|
+
userMetadata['zfiles-expires'] = opts.expiresAt;
|
|
127
|
+
if (opts.ifNoneMatch !== false && await stat(a))
|
|
128
|
+
throw Object.assign(new Error('File exists'), { code: 'FILE_EXISTS' });
|
|
129
|
+
const request = { Bucket: a.bucket, Key: a.key, Body: Readable.from(bounded()), ContentType: opts.contentType ?? 'application/octet-stream', ContentDisposition: opts.contentDisposition, CacheControl: opts.cacheControl, Metadata: metadata(userMetadata, opts.visibility ?? 'private'), ...encryptionHeaders(), ...(opts.ifNoneMatch !== false ? { IfNoneMatch: '*' } : {}) };
|
|
130
|
+
const uploader = new Upload({ client: await getClient(), params: request, leavePartsOnError: false, partSize: options.multipart?.partSize, queueSize: options.multipart?.queueSize });
|
|
131
|
+
const abort = () => uploader.abort();
|
|
132
|
+
opts.signal?.addEventListener('abort', abort, { once: true });
|
|
133
|
+
try {
|
|
134
|
+
await uploader.done();
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
opts.signal?.removeEventListener('abort', abort);
|
|
138
|
+
}
|
|
139
|
+
const found = await stat(a);
|
|
140
|
+
if (!found)
|
|
141
|
+
throw new Error('S3 object not visible after upload');
|
|
142
|
+
return found;
|
|
143
|
+
},
|
|
144
|
+
stat,
|
|
145
|
+
async read(a, opts = {}) {
|
|
146
|
+
validateAddress(a);
|
|
147
|
+
validateRange(opts);
|
|
148
|
+
const { GetObjectCommand } = await import('@aws-sdk/client-s3');
|
|
149
|
+
const Range = opts.start !== undefined || opts.end !== undefined ? `bytes=${opts.start ?? 0}-${opts.end ?? ''}` : undefined;
|
|
150
|
+
const response = await send(new GetObjectCommand({ Bucket: a.bucket, Key: a.key, Range, ...encryptionHeaders(true) }));
|
|
151
|
+
if (!response.Body)
|
|
152
|
+
throw new Error('Missing S3 response body');
|
|
153
|
+
const body = response.Body;
|
|
154
|
+
async function* iterable() { for await (const part of body) {
|
|
155
|
+
if (opts.signal?.aborted)
|
|
156
|
+
throw opts.signal.reason;
|
|
157
|
+
yield part;
|
|
158
|
+
} }
|
|
159
|
+
return iterable();
|
|
160
|
+
},
|
|
161
|
+
async delete(a) { validateAddress(a); const { DeleteObjectCommand } = await import('@aws-sdk/client-s3'); const present = await stat(a); if (!present)
|
|
162
|
+
return false; await send(new DeleteObjectCommand({ Bucket: a.bucket, Key: a.key })); return true; },
|
|
163
|
+
async list(bucket, opts = {}) {
|
|
164
|
+
validateBucket(bucket);
|
|
165
|
+
const { ListObjectsV2Command } = await import('@aws-sdk/client-s3');
|
|
166
|
+
const limit = opts.limit ?? 100;
|
|
167
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1000)
|
|
168
|
+
throw new RangeError('Invalid limit');
|
|
169
|
+
const page = await send(new ListObjectsV2Command({ Bucket: bucket, Prefix: opts.prefix, MaxKeys: limit, ContinuationToken: opts.cursor }));
|
|
170
|
+
const items = [];
|
|
171
|
+
for (const item of page.Contents ?? []) {
|
|
172
|
+
if (item.Key) {
|
|
173
|
+
const info = await stat({ bucket, key: item.Key });
|
|
174
|
+
if (info)
|
|
175
|
+
items.push(info);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return { items, nextCursor: page.NextContinuationToken };
|
|
179
|
+
},
|
|
180
|
+
async copy(from, to, opts = {}) {
|
|
181
|
+
validateAddress(from);
|
|
182
|
+
validateAddress(to);
|
|
183
|
+
validatePut(opts);
|
|
184
|
+
const { CopyObjectCommand } = await import('@aws-sdk/client-s3');
|
|
185
|
+
const source = await stat(from);
|
|
186
|
+
if (!source)
|
|
187
|
+
throw new Error('Source missing');
|
|
188
|
+
const userMetadata = { ...source.metadata, ...opts.metadata };
|
|
189
|
+
if (opts.expiresAt)
|
|
190
|
+
userMetadata['zfiles-expires'] = opts.expiresAt;
|
|
191
|
+
if (opts.ifNoneMatch !== false && await stat(to))
|
|
192
|
+
throw Object.assign(new Error('File exists'), { code: 'FILE_EXISTS' });
|
|
193
|
+
await send(new CopyObjectCommand({ Bucket: to.bucket, Key: to.key, CopySource: `${encodeURIComponent(from.bucket)}/${from.key.split('/').map(encodeURIComponent).join('/')}`, MetadataDirective: 'REPLACE', ContentType: opts.contentType ?? source.contentType, CacheControl: opts.cacheControl ?? source.cacheControl, Metadata: metadata(userMetadata, opts.visibility ?? source.visibility), ...encryptionHeaders() }));
|
|
194
|
+
const found = await stat(to);
|
|
195
|
+
if (!found)
|
|
196
|
+
throw new Error('S3 copy failed');
|
|
197
|
+
return found;
|
|
198
|
+
},
|
|
199
|
+
async signedUrl(method, a, seconds, opts) {
|
|
200
|
+
validateAddress(a);
|
|
201
|
+
if (!Number.isSafeInteger(seconds) || seconds < 1 || seconds > 604800)
|
|
202
|
+
throw new RangeError('Invalid signing lifetime');
|
|
203
|
+
if (method === 'GET' && options.cloudFrontSigning) {
|
|
204
|
+
const { getSignedUrl } = await import('@aws-sdk/cloudfront-signer');
|
|
205
|
+
const cf = options.cloudFrontSigning;
|
|
206
|
+
return getSignedUrl({ url: url(a), keyPairId: cf.keyPairId, privateKey: cf.privateKey, dateLessThan: new Date(Date.now() + seconds * 1000).toISOString() });
|
|
207
|
+
}
|
|
208
|
+
const s3 = await import('@aws-sdk/client-s3');
|
|
209
|
+
const { getSignedUrl } = await import('@aws-sdk/s3-request-presigner');
|
|
210
|
+
const command = method === 'GET' ? new s3.GetObjectCommand({ Bucket: a.bucket, Key: a.key, ...encryptionHeaders(true) }) : new s3.PutObjectCommand({ Bucket: a.bucket, Key: a.key, ContentType: opts?.contentType, ...encryptionHeaders() });
|
|
211
|
+
return getSignedUrl(await getClient(), command, { expiresIn: seconds });
|
|
212
|
+
},
|
|
213
|
+
publicUrl: url,
|
|
214
|
+
async close() { closed = true; const existing = client ?? await creating?.catch(() => undefined); if ((!options.client || options.ownClient) && existing?.destroy)
|
|
215
|
+
existing.destroy(); }
|
|
216
|
+
};
|
|
217
|
+
return driver;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=s3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/drivers/s3.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { FileAddress, FileInfo, PutFileOptions, StorageManager } from './types.js';
|
|
2
|
+
export interface FileHttpOptions {
|
|
3
|
+
/** Called before each access, including public files. Required to access private files. */
|
|
4
|
+
authorize?: (request: Request, address: FileAddress, operation: 'read' | 'write' | 'delete', info?: FileInfo) => boolean | Promise<boolean>;
|
|
5
|
+
/** Explicit storage and bucket mapping; never accept arbitrary locations from a URL. */
|
|
6
|
+
storage?: string;
|
|
7
|
+
bucket: string;
|
|
8
|
+
prefix?: string;
|
|
9
|
+
maxUploadBytes?: number;
|
|
10
|
+
cacheControl?: string;
|
|
11
|
+
allowDelete?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function createFileResponse(manager: StorageManager, address: FileAddress, request: Request, options?: {
|
|
14
|
+
authorize?: FileHttpOptions['authorize'];
|
|
15
|
+
inline?: boolean;
|
|
16
|
+
cacheControl?: string;
|
|
17
|
+
downloadName?: string;
|
|
18
|
+
}): Promise<Response>;
|
|
19
|
+
/** Binary request bodies, no multipart parsing; authentication belongs to the route. */
|
|
20
|
+
export declare function uploadFileRequest(manager: StorageManager, address: FileAddress, request: Request, options?: PutFileOptions & {
|
|
21
|
+
authorize?: FileHttpOptions['authorize'];
|
|
22
|
+
}): Promise<FileInfo>;
|
|
23
|
+
export declare function createFileHttpHandler(manager: StorageManager, options: FileHttpOptions): (request: Request) => Promise<Response>;
|