@velajs/storage 0.3.0 → 0.3.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/CHANGELOG.md +6 -1
- package/dist/body-BMUcBeQ0.js +93 -0
- package/dist/body-BMUcBeQ0.js.map +1 -0
- package/dist/client/index.d.ts +49 -46
- package/dist/client/index.js +207 -228
- package/dist/client/index.js.map +1 -0
- package/dist/drivers/memory/index.d.ts +17 -13
- package/dist/drivers/memory/index.js +190 -197
- package/dist/drivers/memory/index.js.map +1 -0
- package/dist/drivers/r2/index.d.ts +7 -4
- package/dist/drivers/r2/index.js +162 -160
- package/dist/drivers/r2/index.js.map +1 -0
- package/dist/drivers/r2-http/index.d.ts +23 -19
- package/dist/drivers/r2-http/index.js +52 -45
- package/dist/drivers/r2-http/index.js.map +1 -0
- package/dist/drivers/s3/index.d.ts +79 -5
- package/dist/drivers/s3/index.js +2 -3
- package/dist/index.d.ts +271 -17
- package/dist/index.js +1078 -16
- package/dist/index.js.map +1 -0
- package/dist/middleware/index.d.ts +177 -15
- package/dist/middleware/index.js +553 -8
- package/dist/middleware/index.js.map +1 -0
- package/dist/protocol.types-C5PPBD12.d.ts +80 -0
- package/dist/r2.types-Bw4Ft83t.d.ts +71 -0
- package/dist/retry-DXtO6R9D.js +119 -0
- package/dist/retry-DXtO6R9D.js.map +1 -0
- package/dist/s3-DrE9NrnD.js +557 -0
- package/dist/s3-DrE9NrnD.js.map +1 -0
- package/dist/storage.error-DVCOkJhc.js +49 -0
- package/dist/storage.error-DVCOkJhc.js.map +1 -0
- package/dist/storage.types-BJN7Yp1J.d.ts +288 -0
- package/dist/storagesdk/index.d.ts +73 -69
- package/dist/storagesdk/index.js +117 -130
- package/dist/storagesdk/index.js.map +1 -0
- package/dist/stored-file-2Yl07eRc.js +105 -0
- package/dist/stored-file-2Yl07eRc.js.map +1 -0
- package/dist/testing/index.d.ts +12 -8
- package/dist/testing/index.js +36 -53
- package/dist/testing/index.js.map +1 -0
- package/package.json +62 -48
- package/dist/base64.d.ts +0 -8
- package/dist/base64.js +0 -25
- package/dist/decorators/inject-storage.decorator.d.ts +0 -17
- package/dist/decorators/inject-storage.decorator.js +0 -21
- package/dist/drivers/r2/r2.types.d.ts +0 -67
- package/dist/drivers/r2/r2.types.js +0 -5
- package/dist/drivers/s3/s3-client.d.ts +0 -33
- package/dist/drivers/s3/s3-client.js +0 -154
- package/dist/drivers/s3/s3.driver.d.ts +0 -4
- package/dist/drivers/s3/s3.driver.js +0 -404
- package/dist/drivers/s3/s3.types.d.ts +0 -28
- package/dist/drivers/s3/s3.types.js +0 -1
- package/dist/drivers/s3/xml.d.ts +0 -6
- package/dist/drivers/s3/xml.js +0 -52
- package/dist/http/authorizer.types.d.ts +0 -59
- package/dist/http/authorizer.types.js +0 -1
- package/dist/http/http-helpers.d.ts +0 -22
- package/dist/http/http-helpers.js +0 -80
- package/dist/http/protocol.types.d.ts +0 -76
- package/dist/http/protocol.types.js +0 -1
- package/dist/internal/body.d.ts +0 -18
- package/dist/internal/body.js +0 -90
- package/dist/internal/retry.d.ts +0 -41
- package/dist/internal/retry.js +0 -127
- package/dist/internal/stored-file.d.ts +0 -27
- package/dist/internal/stored-file.js +0 -114
- package/dist/middleware/cache.d.ts +0 -50
- package/dist/middleware/cache.js +0 -101
- package/dist/middleware/compose.d.ts +0 -12
- package/dist/middleware/compose.js +0 -11
- package/dist/middleware/compression.d.ts +0 -16
- package/dist/middleware/compression.js +0 -101
- package/dist/middleware/encryption.d.ts +0 -14
- package/dist/middleware/encryption.js +0 -134
- package/dist/middleware/failover.d.ts +0 -18
- package/dist/middleware/failover.js +0 -52
- package/dist/middleware/retry.d.ts +0 -14
- package/dist/middleware/retry.js +0 -47
- package/dist/middleware/versioning.d.ts +0 -36
- package/dist/middleware/versioning.js +0 -89
- package/dist/middleware/wrap.d.ts +0 -11
- package/dist/middleware/wrap.js +0 -46
- package/dist/object-key.d.ts +0 -17
- package/dist/object-key.js +0 -42
- package/dist/storage.controller.d.ts +0 -21
- package/dist/storage.controller.js +0 -380
- package/dist/storage.error.d.ts +0 -28
- package/dist/storage.error.js +0 -46
- package/dist/storage.facade.d.ts +0 -47
- package/dist/storage.facade.js +0 -443
- package/dist/storage.module.d.ts +0 -46
- package/dist/storage.module.js +0 -113
- package/dist/storage.service.d.ts +0 -42
- package/dist/storage.service.js +0 -86
- package/dist/storage.tokens.d.ts +0 -13
- package/dist/storage.tokens.js +0 -26
- package/dist/storage.types.d.ts +0 -245
- package/dist/storage.types.js +0 -1
package/dist/drivers/r2/index.js
CHANGED
|
@@ -1,166 +1,168 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { t as StorageError } from "../../storage.error-DVCOkJhc.js";
|
|
2
|
+
import { t as createStoredFile } from "../../stored-file-2Yl07eRc.js";
|
|
3
|
+
//#region src/drivers/r2/index.ts
|
|
3
4
|
function joinPublic(base, key) {
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
const enc = key.split("/").map(encodeURIComponent).join("/");
|
|
6
|
+
return `${base.replace(/\/$/, "")}/${enc}`;
|
|
6
7
|
}
|
|
7
8
|
function metaOf(obj) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
return {
|
|
10
|
+
key: obj.key,
|
|
11
|
+
size: obj.size,
|
|
12
|
+
type: obj.httpMetadata?.contentType ?? "application/octet-stream",
|
|
13
|
+
etag: obj.etag,
|
|
14
|
+
lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : void 0,
|
|
15
|
+
metadata: obj.customMetadata
|
|
16
|
+
};
|
|
16
17
|
}
|
|
17
18
|
/**
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
};
|
|
19
|
+
* Cloudflare R2 driver — native binding mode only. Zero third-party deps
|
|
20
|
+
* (no aws4fetch), fully edge-native I/O with no egress fees.
|
|
21
|
+
*
|
|
22
|
+
* It cannot presign (`signedUploadUrl` throws; `url()` needs `publicBaseUrl`).
|
|
23
|
+
* For presigned URLs use `@velajs/storage/drivers/r2-http` (HTTP or hybrid mode).
|
|
24
|
+
*/
|
|
25
|
+
function r2Driver(options) {
|
|
26
|
+
const bucket = options.bucket;
|
|
27
|
+
const mustGet = async (key) => {
|
|
28
|
+
const obj = await bucket.get(key);
|
|
29
|
+
if (!obj) throw new StorageError("NotFound", `not found: ${key}`);
|
|
30
|
+
return obj;
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
name: options.name ?? "r2",
|
|
34
|
+
raw: bucket,
|
|
35
|
+
supportsRange: true,
|
|
36
|
+
supportsDelimiter: true,
|
|
37
|
+
supportsMetadata: true,
|
|
38
|
+
supportsCacheControl: true,
|
|
39
|
+
supportsServerSideCopy: false,
|
|
40
|
+
reportsUploadProgress: false,
|
|
41
|
+
signedUrl: {
|
|
42
|
+
supported: !!options.publicBaseUrl,
|
|
43
|
+
upload: false
|
|
44
|
+
},
|
|
45
|
+
async upload(key, body, opts) {
|
|
46
|
+
const obj = await bucket.put(key, body, {
|
|
47
|
+
httpMetadata: {
|
|
48
|
+
contentType: opts?.contentType,
|
|
49
|
+
cacheControl: opts?.cacheControl
|
|
50
|
+
},
|
|
51
|
+
customMetadata: opts?.metadata
|
|
52
|
+
});
|
|
53
|
+
if (!obj) throw new StorageError("Provider", `put failed: ${key}`);
|
|
54
|
+
return {
|
|
55
|
+
key,
|
|
56
|
+
size: obj.size,
|
|
57
|
+
contentType: opts?.contentType ?? "application/octet-stream",
|
|
58
|
+
etag: obj.etag,
|
|
59
|
+
lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : void 0
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
async download(key, opts) {
|
|
63
|
+
const range = opts?.range ? {
|
|
64
|
+
offset: opts.range.start,
|
|
65
|
+
length: opts.range.end != null ? opts.range.end - opts.range.start + 1 : void 0
|
|
66
|
+
} : void 0;
|
|
67
|
+
const obj = await bucket.get(key, range ? { range } : void 0);
|
|
68
|
+
if (!obj) throw new StorageError("NotFound", `not found: ${key}`);
|
|
69
|
+
const meta = metaOf(obj);
|
|
70
|
+
const size = range ? range.length ?? obj.size - range.offset : obj.size;
|
|
71
|
+
return createStoredFile({
|
|
72
|
+
...meta,
|
|
73
|
+
size
|
|
74
|
+
}, {
|
|
75
|
+
kind: "stream",
|
|
76
|
+
stream: obj.body
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
async head(key) {
|
|
80
|
+
const obj = await bucket.head(key);
|
|
81
|
+
if (!obj) throw new StorageError("NotFound", `not found: ${key}`);
|
|
82
|
+
return createStoredFile(metaOf(obj), {
|
|
83
|
+
kind: "lazy",
|
|
84
|
+
fetch: async () => new Response((await mustGet(key)).body)
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
async exists(key) {
|
|
88
|
+
return await bucket.head(key) != null;
|
|
89
|
+
},
|
|
90
|
+
async delete(key) {
|
|
91
|
+
await bucket.delete(key);
|
|
92
|
+
},
|
|
93
|
+
async deleteMany(keys) {
|
|
94
|
+
await bucket.delete(keys);
|
|
95
|
+
return { deleted: keys };
|
|
96
|
+
},
|
|
97
|
+
async copy(from, to) {
|
|
98
|
+
const src = await bucket.get(from);
|
|
99
|
+
if (!src) throw new StorageError("NotFound", `not found: ${from}`);
|
|
100
|
+
await bucket.put(to, src.body, {
|
|
101
|
+
httpMetadata: src.httpMetadata,
|
|
102
|
+
customMetadata: src.customMetadata
|
|
103
|
+
});
|
|
104
|
+
},
|
|
105
|
+
async list(opts) {
|
|
106
|
+
const res = await bucket.list({
|
|
107
|
+
prefix: opts?.prefix,
|
|
108
|
+
cursor: opts?.cursor,
|
|
109
|
+
limit: opts?.limit,
|
|
110
|
+
delimiter: opts?.delimiter
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
items: res.objects.map((obj) => createStoredFile(metaOf(obj), {
|
|
114
|
+
kind: "lazy",
|
|
115
|
+
fetch: async () => new Response((await mustGet(obj.key)).body)
|
|
116
|
+
})),
|
|
117
|
+
prefixes: res.delimitedPrefixes.length ? res.delimitedPrefixes : void 0,
|
|
118
|
+
cursor: res.truncated ? res.cursor : void 0
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
async url(key, _opts) {
|
|
122
|
+
if (options.publicBaseUrl) return joinPublic(options.publicBaseUrl, key);
|
|
123
|
+
throw new StorageError("Unsupported", "r2 binding: url() needs publicBaseUrl (or use the r2-http/hybrid driver to presign)");
|
|
124
|
+
},
|
|
125
|
+
async signedUploadUrl() {
|
|
126
|
+
throw new StorageError("Unsupported", "r2 binding cannot presign uploads; use the r2-http or r2-hybrid driver");
|
|
127
|
+
},
|
|
128
|
+
async createMultipartUpload(key, opts) {
|
|
129
|
+
const mpu = await bucket.createMultipartUpload(key, {
|
|
130
|
+
httpMetadata: {
|
|
131
|
+
contentType: opts?.contentType,
|
|
132
|
+
cacheControl: opts?.cacheControl
|
|
133
|
+
},
|
|
134
|
+
customMetadata: opts?.metadata
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
key,
|
|
138
|
+
uploadId: mpu.uploadId,
|
|
139
|
+
async uploadPart(partNumber, part, _o) {
|
|
140
|
+
const up = await mpu.uploadPart(partNumber, part);
|
|
141
|
+
return {
|
|
142
|
+
partNumber: up.partNumber,
|
|
143
|
+
etag: up.etag
|
|
144
|
+
};
|
|
145
|
+
},
|
|
146
|
+
async complete(parts) {
|
|
147
|
+
const obj = await mpu.complete(parts.map((p) => ({
|
|
148
|
+
partNumber: p.partNumber,
|
|
149
|
+
etag: p.etag
|
|
150
|
+
})));
|
|
151
|
+
return {
|
|
152
|
+
key,
|
|
153
|
+
size: obj.size,
|
|
154
|
+
contentType: opts?.contentType ?? "application/octet-stream",
|
|
155
|
+
etag: obj.etag
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
async abort() {
|
|
159
|
+
await mpu.abort();
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
};
|
|
166
164
|
}
|
|
165
|
+
//#endregion
|
|
166
|
+
export { r2Driver };
|
|
167
|
+
|
|
168
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/drivers/r2/index.ts"],"sourcesContent":["import { createStoredFile } from '../../internal/stored-file';\nimport { StorageError } from '../../storage.error';\nimport type {\n Body,\n CreateMultipartOptions,\n DownloadOptions,\n ListOptions,\n ListResult,\n MultipartUpload,\n OperationOptions,\n PartBody,\n StorageDriver,\n StoredFile,\n UploadOptions,\n UploadResult,\n UrlOptions,\n} from '../../storage.types';\nimport type { R2BucketLike, R2DriverOptions, R2ObjectLike, R2PutValue } from './r2.types';\n\nexport type {\n R2BucketLike,\n R2DriverOptions,\n R2ObjectLike,\n R2ObjectBodyLike,\n R2MultipartUploadLike,\n} from './r2.types';\n\nfunction joinPublic(base: string, key: string): string {\n const enc = key.split('/').map(encodeURIComponent).join('/');\n return `${base.replace(/\\/$/, '')}/${enc}`;\n}\n\nfunction metaOf(obj: R2ObjectLike) {\n return {\n key: obj.key,\n size: obj.size,\n type: obj.httpMetadata?.contentType ?? 'application/octet-stream',\n etag: obj.etag,\n lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : undefined,\n metadata: obj.customMetadata,\n };\n}\n\n/**\n * Cloudflare R2 driver — native binding mode only. Zero third-party deps\n * (no aws4fetch), fully edge-native I/O with no egress fees.\n *\n * It cannot presign (`signedUploadUrl` throws; `url()` needs `publicBaseUrl`).\n * For presigned URLs use `@velajs/storage/drivers/r2-http` (HTTP or hybrid mode).\n */\nexport function r2Driver(options: R2DriverOptions): StorageDriver<R2BucketLike> {\n const bucket = options.bucket;\n\n const mustGet = async (key: string) => {\n const obj = await bucket.get(key);\n if (!obj) throw new StorageError('NotFound', `not found: ${key}`);\n return obj;\n };\n\n return {\n name: options.name ?? 'r2',\n raw: bucket,\n supportsRange: true,\n supportsDelimiter: true,\n supportsMetadata: true,\n supportsCacheControl: true,\n supportsServerSideCopy: false,\n reportsUploadProgress: false,\n signedUrl: { supported: !!options.publicBaseUrl, upload: false },\n\n async upload(key: string, body: Body, opts?: UploadOptions): Promise<UploadResult> {\n const obj = await bucket.put(key, body as R2PutValue, {\n httpMetadata: { contentType: opts?.contentType, cacheControl: opts?.cacheControl },\n customMetadata: opts?.metadata,\n });\n if (!obj) throw new StorageError('Provider', `put failed: ${key}`);\n return {\n key,\n size: obj.size,\n contentType: opts?.contentType ?? 'application/octet-stream',\n etag: obj.etag,\n lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : undefined,\n };\n },\n\n async download(key: string, opts?: DownloadOptions): Promise<StoredFile> {\n const range = opts?.range\n ? {\n offset: opts.range.start,\n length: opts.range.end != null ? opts.range.end - opts.range.start + 1 : undefined,\n }\n : undefined;\n const obj = await bucket.get(key, range ? { range } : undefined);\n if (!obj) throw new StorageError('NotFound', `not found: ${key}`);\n const meta = metaOf(obj);\n const size = range ? (range.length ?? obj.size - range.offset) : obj.size;\n return createStoredFile({ ...meta, size }, { kind: 'stream', stream: obj.body });\n },\n\n async head(key: string): Promise<StoredFile> {\n const obj = await bucket.head(key);\n if (!obj) throw new StorageError('NotFound', `not found: ${key}`);\n return createStoredFile(metaOf(obj), {\n kind: 'lazy',\n fetch: async () => new Response((await mustGet(key)).body),\n });\n },\n\n async exists(key: string): Promise<boolean> {\n return (await bucket.head(key)) != null;\n },\n\n async delete(key: string): Promise<void> {\n await bucket.delete(key);\n },\n\n async deleteMany(keys: string[]) {\n await bucket.delete(keys);\n return { deleted: keys };\n },\n\n async copy(from: string, to: string): Promise<void> {\n const src = await bucket.get(from);\n if (!src) throw new StorageError('NotFound', `not found: ${from}`);\n await bucket.put(to, src.body, {\n httpMetadata: src.httpMetadata,\n customMetadata: src.customMetadata,\n });\n },\n\n async list(opts?: ListOptions): Promise<ListResult> {\n const res = await bucket.list({\n prefix: opts?.prefix,\n cursor: opts?.cursor,\n limit: opts?.limit,\n delimiter: opts?.delimiter,\n });\n return {\n items: res.objects.map((obj) =>\n createStoredFile(metaOf(obj), {\n kind: 'lazy',\n fetch: async () => new Response((await mustGet(obj.key)).body),\n }),\n ),\n prefixes: res.delimitedPrefixes.length ? res.delimitedPrefixes : undefined,\n cursor: res.truncated ? res.cursor : undefined,\n };\n },\n\n async url(key: string, _opts?: UrlOptions): Promise<string> {\n if (options.publicBaseUrl) return joinPublic(options.publicBaseUrl, key);\n throw new StorageError(\n 'Unsupported',\n 'r2 binding: url() needs publicBaseUrl (or use the r2-http/hybrid driver to presign)',\n );\n },\n\n async signedUploadUrl(): Promise<never> {\n throw new StorageError(\n 'Unsupported',\n 'r2 binding cannot presign uploads; use the r2-http or r2-hybrid driver',\n );\n },\n\n async createMultipartUpload(\n key: string,\n opts?: CreateMultipartOptions,\n ): Promise<MultipartUpload> {\n const mpu = await bucket.createMultipartUpload(key, {\n httpMetadata: { contentType: opts?.contentType, cacheControl: opts?.cacheControl },\n customMetadata: opts?.metadata,\n });\n return {\n key,\n uploadId: mpu.uploadId,\n async uploadPart(partNumber: number, part: PartBody, _o?: OperationOptions) {\n const up = await mpu.uploadPart(partNumber, part as R2PutValue);\n return { partNumber: up.partNumber, etag: up.etag };\n },\n async complete(parts) {\n const obj = await mpu.complete(\n parts.map((p) => ({ partNumber: p.partNumber, etag: p.etag })),\n );\n return {\n key,\n size: obj.size,\n contentType: opts?.contentType ?? 'application/octet-stream',\n etag: obj.etag,\n };\n },\n async abort() {\n await mpu.abort();\n },\n };\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { C as StorageDriver } from "../../storage.types-BJN7Yp1J.js";
|
|
2
|
+
import { t as R2BucketLike } from "../../r2.types-Bw4Ft83t.js";
|
|
3
|
+
//#region src/drivers/r2-http/index.d.ts
|
|
4
|
+
interface R2HttpOptions {
|
|
5
|
+
/** Cloudflare account ID — the default endpoint is derived from it. */
|
|
6
|
+
accountId: string;
|
|
7
|
+
accessKeyId: string;
|
|
8
|
+
secretAccessKey: string;
|
|
9
|
+
bucket: string;
|
|
10
|
+
/** Override the endpoint (jurisdiction-specific R2 URLs). */
|
|
11
|
+
endpoint?: string;
|
|
12
|
+
region?: string;
|
|
13
|
+
publicBaseUrl?: string;
|
|
14
|
+
defaultUrlExpiresIn?: number;
|
|
15
|
+
fetch?: typeof fetch;
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
18
|
* R2 over the S3-compatible HTTP API (aws4fetch). All I/O goes over HTTP and
|
|
@@ -19,10 +20,10 @@ export interface R2HttpOptions {
|
|
|
19
20
|
* running inside a Worker; use this from Node/other runtimes, or use
|
|
20
21
|
* {@link r2HybridDriver} to combine binding I/O with HTTP presigning.
|
|
21
22
|
*/
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
declare function r2HttpDriver(o: R2HttpOptions): StorageDriver;
|
|
24
|
+
interface R2HybridOptions extends R2HttpOptions {
|
|
25
|
+
/** The Workers `R2Bucket` binding used for reads/writes (no egress). */
|
|
26
|
+
binding: R2BucketLike;
|
|
26
27
|
}
|
|
27
28
|
/**
|
|
28
29
|
* Hybrid R2 driver: reads/writes go through the native binding (intra-Worker,
|
|
@@ -30,4 +31,7 @@ export interface R2HybridOptions extends R2HttpOptions {
|
|
|
30
31
|
* server-side `copy()` use the S3 HTTP signer. The best of both for Workers
|
|
31
32
|
* that need browser-facing presigned URLs.
|
|
32
33
|
*/
|
|
33
|
-
|
|
34
|
+
declare function r2HybridDriver(o: R2HybridOptions): StorageDriver;
|
|
35
|
+
//#endregion
|
|
36
|
+
export { R2HttpOptions, R2HybridOptions, r2HttpDriver, r2HybridDriver };
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,52 +1,59 @@
|
|
|
1
|
+
import { t as s3Driver } from "../../s3-DrE9NrnD.js";
|
|
1
2
|
import { r2Driver } from "../r2/index.js";
|
|
2
|
-
|
|
3
|
+
//#region src/drivers/r2-http/index.ts
|
|
3
4
|
function endpointFor(o) {
|
|
4
|
-
|
|
5
|
+
return o.endpoint ?? `https://${o.accountId}.r2.cloudflarestorage.com`;
|
|
5
6
|
}
|
|
6
7
|
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
8
|
+
* R2 over the S3-compatible HTTP API (aws4fetch). All I/O goes over HTTP and
|
|
9
|
+
* presigning works. Prefer the native binding driver (`../r2`) for I/O when
|
|
10
|
+
* running inside a Worker; use this from Node/other runtimes, or use
|
|
11
|
+
* {@link r2HybridDriver} to combine binding I/O with HTTP presigning.
|
|
12
|
+
*/
|
|
13
|
+
function r2HttpDriver(o) {
|
|
14
|
+
return s3Driver({
|
|
15
|
+
endpoint: endpointFor(o),
|
|
16
|
+
region: o.region ?? "auto",
|
|
17
|
+
bucket: o.bucket,
|
|
18
|
+
forcePathStyle: true,
|
|
19
|
+
credentials: {
|
|
20
|
+
accessKeyId: o.accessKeyId,
|
|
21
|
+
secretAccessKey: o.secretAccessKey
|
|
22
|
+
},
|
|
23
|
+
publicBaseUrl: o.publicBaseUrl,
|
|
24
|
+
defaultUrlExpiresIn: o.defaultUrlExpiresIn,
|
|
25
|
+
fetch: o.fetch,
|
|
26
|
+
name: "r2-http"
|
|
27
|
+
});
|
|
26
28
|
}
|
|
27
29
|
/**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
30
|
+
* Hybrid R2 driver: reads/writes go through the native binding (intra-Worker,
|
|
31
|
+
* no egress), while `url()` / `signedUploadUrl()` / `signedMultipart` /
|
|
32
|
+
* server-side `copy()` use the S3 HTTP signer. The best of both for Workers
|
|
33
|
+
* that need browser-facing presigned URLs.
|
|
34
|
+
*/
|
|
35
|
+
function r2HybridDriver(o) {
|
|
36
|
+
const binding = r2Driver({
|
|
37
|
+
bucket: o.binding,
|
|
38
|
+
publicBaseUrl: o.publicBaseUrl,
|
|
39
|
+
name: "r2-hybrid"
|
|
40
|
+
});
|
|
41
|
+
const http = r2HttpDriver(o);
|
|
42
|
+
return {
|
|
43
|
+
...binding,
|
|
44
|
+
name: "r2-hybrid",
|
|
45
|
+
supportsServerSideCopy: true,
|
|
46
|
+
signedUrl: {
|
|
47
|
+
supported: true,
|
|
48
|
+
upload: true
|
|
49
|
+
},
|
|
50
|
+
url: (key, opts) => http.url(key, opts),
|
|
51
|
+
signedUploadUrl: (key, opts) => http.signedUploadUrl(key, opts),
|
|
52
|
+
signedMultipart: http.signedMultipart,
|
|
53
|
+
copy: (from, to, opts) => http.copy(from, to, opts)
|
|
54
|
+
};
|
|
52
55
|
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { r2HttpDriver, r2HybridDriver };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/drivers/r2-http/index.ts"],"sourcesContent":["import type { StorageDriver } from '../../storage.types';\nimport { r2Driver } from '../r2';\nimport type { R2BucketLike } from '../r2/r2.types';\nimport { s3Driver } from '../s3';\n\nexport interface R2HttpOptions {\n /** Cloudflare account ID — the default endpoint is derived from it. */\n accountId: string;\n accessKeyId: string;\n secretAccessKey: string;\n bucket: string;\n /** Override the endpoint (jurisdiction-specific R2 URLs). */\n endpoint?: string;\n region?: string;\n publicBaseUrl?: string;\n defaultUrlExpiresIn?: number;\n fetch?: typeof fetch;\n}\n\nfunction endpointFor(o: R2HttpOptions): string {\n return o.endpoint ?? `https://${o.accountId}.r2.cloudflarestorage.com`;\n}\n\n/**\n * R2 over the S3-compatible HTTP API (aws4fetch). All I/O goes over HTTP and\n * presigning works. Prefer the native binding driver (`../r2`) for I/O when\n * running inside a Worker; use this from Node/other runtimes, or use\n * {@link r2HybridDriver} to combine binding I/O with HTTP presigning.\n */\nexport function r2HttpDriver(o: R2HttpOptions): StorageDriver {\n return s3Driver({\n endpoint: endpointFor(o),\n region: o.region ?? 'auto',\n bucket: o.bucket,\n forcePathStyle: true,\n credentials: { accessKeyId: o.accessKeyId, secretAccessKey: o.secretAccessKey },\n publicBaseUrl: o.publicBaseUrl,\n defaultUrlExpiresIn: o.defaultUrlExpiresIn,\n fetch: o.fetch,\n name: 'r2-http',\n });\n}\n\nexport interface R2HybridOptions extends R2HttpOptions {\n /** The Workers `R2Bucket` binding used for reads/writes (no egress). */\n binding: R2BucketLike;\n}\n\n/**\n * Hybrid R2 driver: reads/writes go through the native binding (intra-Worker,\n * no egress), while `url()` / `signedUploadUrl()` / `signedMultipart` /\n * server-side `copy()` use the S3 HTTP signer. The best of both for Workers\n * that need browser-facing presigned URLs.\n */\nexport function r2HybridDriver(o: R2HybridOptions): StorageDriver {\n const binding = r2Driver({\n bucket: o.binding,\n publicBaseUrl: o.publicBaseUrl,\n name: 'r2-hybrid',\n });\n const http = r2HttpDriver(o);\n return {\n ...binding,\n name: 'r2-hybrid',\n supportsServerSideCopy: true,\n signedUrl: { supported: true, upload: true },\n url: (key, opts) => http.url(key, opts),\n signedUploadUrl: (key, opts) => http.signedUploadUrl(key, opts),\n signedMultipart: http.signedMultipart,\n copy: (from, to, opts) => http.copy(from, to, opts),\n };\n}\n"],"mappings":";;;AAmBA,SAAS,YAAY,GAA0B;CAC7C,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;AAC9C;;;;;;;AAQA,SAAgB,aAAa,GAAiC;CAC5D,OAAO,SAAS;EACd,UAAU,YAAY,CAAC;EACvB,QAAQ,EAAE,UAAU;EACpB,QAAQ,EAAE;EACV,gBAAgB;EAChB,aAAa;GAAE,aAAa,EAAE;GAAa,iBAAiB,EAAE;EAAgB;EAC9E,eAAe,EAAE;EACjB,qBAAqB,EAAE;EACvB,OAAO,EAAE;EACT,MAAM;CACR,CAAC;AACH;;;;;;;AAaA,SAAgB,eAAe,GAAmC;CAChE,MAAM,UAAU,SAAS;EACvB,QAAQ,EAAE;EACV,eAAe,EAAE;EACjB,MAAM;CACR,CAAC;CACD,MAAM,OAAO,aAAa,CAAC;CAC3B,OAAO;EACL,GAAG;EACH,MAAM;EACN,wBAAwB;EACxB,WAAW;GAAE,WAAW;GAAM,QAAQ;EAAK;EAC3C,MAAM,KAAK,SAAS,KAAK,IAAI,KAAK,IAAI;EACtC,kBAAkB,KAAK,SAAS,KAAK,gBAAgB,KAAK,IAAI;EAC9D,iBAAiB,KAAK;EACtB,OAAO,MAAM,IAAI,SAAS,KAAK,KAAK,MAAM,IAAI,IAAI;CACpD;AACF"}
|
|
@@ -1,5 +1,79 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { C as StorageDriver } from "../../storage.types-BJN7Yp1J.js";
|
|
2
|
+
//#region src/drivers/s3/s3.types.d.ts
|
|
3
|
+
interface S3Credentials {
|
|
4
|
+
accessKeyId: string;
|
|
5
|
+
secretAccessKey: string;
|
|
6
|
+
sessionToken?: string;
|
|
7
|
+
}
|
|
8
|
+
interface S3DriverOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Service endpoint. Examples:
|
|
11
|
+
* - AWS: `https://s3.us-east-1.amazonaws.com`
|
|
12
|
+
* - R2: `https://<accountId>.r2.cloudflarestorage.com`
|
|
13
|
+
* - MinIO: `http://localhost:9000`
|
|
14
|
+
*/
|
|
15
|
+
endpoint: string;
|
|
16
|
+
/** AWS region (`auto` for R2). */
|
|
17
|
+
region: string;
|
|
18
|
+
bucket: string;
|
|
19
|
+
credentials: S3Credentials;
|
|
20
|
+
/** Path-style addressing (`endpoint/bucket/key`). Required by MinIO/R2/most non-AWS. */
|
|
21
|
+
forcePathStyle?: boolean;
|
|
22
|
+
/** CDN/public origin; when set, `url()` returns a permanent link unless signing is forced. */
|
|
23
|
+
publicBaseUrl?: string;
|
|
24
|
+
/** Default `expiresIn` (seconds) for presigned URLs. Default 3600. */
|
|
25
|
+
defaultUrlExpiresIn?: number;
|
|
26
|
+
/** Override the fetch implementation (tests). */
|
|
27
|
+
fetch?: typeof fetch;
|
|
28
|
+
/** Friendly driver name (defaults to `s3`). */
|
|
29
|
+
name?: string;
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/drivers/s3/s3.driver.d.ts
|
|
33
|
+
/** S3 / S3-compatible driver signed with aws4fetch (edge-safe). */
|
|
34
|
+
declare function s3Driver(options: S3DriverOptions): StorageDriver;
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region src/drivers/s3/s3-client.d.ts
|
|
37
|
+
interface PostPolicyOptions {
|
|
38
|
+
expiresIn: number;
|
|
39
|
+
contentType?: string;
|
|
40
|
+
maxSize?: number;
|
|
41
|
+
minSize?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Thin wrapper over aws4fetch: builds addressed URLs, sends SigV4-signed
|
|
45
|
+
* requests, and mints presigned GET/PUT URLs + presigned-POST policies.
|
|
46
|
+
* The single place S3 signing happens.
|
|
47
|
+
*/
|
|
48
|
+
declare class S3Client {
|
|
49
|
+
#private;
|
|
50
|
+
constructor(cfg: S3DriverOptions);
|
|
51
|
+
get bucket(): string;
|
|
52
|
+
objectUrl(key: string, query?: Record<string, string>): URL;
|
|
53
|
+
/** The bucket-root URL used as the presigned-POST target. */
|
|
54
|
+
postUrl(): string;
|
|
55
|
+
/** Send a SigV4-signed request. */
|
|
56
|
+
send(url: URL, init: RequestInit): Promise<Response>;
|
|
57
|
+
/** Presign a GET or PUT URL via query signing (unsigned payload). */
|
|
58
|
+
presign(key: string, method: 'GET' | 'PUT', expiresIn: number, query?: Record<string, string>): Promise<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Presigned POST policy — enforces `content-length-range` server-side.
|
|
61
|
+
* aws4fetch only signs requests, so the policy HMAC chain is hand-rolled
|
|
62
|
+
* on Web Crypto (edge-safe).
|
|
63
|
+
*/
|
|
64
|
+
signPostPolicy(key: string, opts: PostPolicyOptions): Promise<{
|
|
65
|
+
url: string;
|
|
66
|
+
fields: Record<string, string>;
|
|
67
|
+
}>;
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
//#region src/drivers/s3/xml.d.ts
|
|
71
|
+
declare function unescapeXml(s: string): string;
|
|
72
|
+
declare function escapeXml(s: string): string;
|
|
73
|
+
/** First `<tag>…</tag>` inner text (entity-decoded), or `undefined`. */
|
|
74
|
+
declare function tagText(xml: string, tag: string): string | undefined;
|
|
75
|
+
/** All `<tag>…</tag>` inner blocks (raw, not decoded — for nested extraction). */
|
|
76
|
+
declare function tagBlocks(xml: string, tag: string): string[];
|
|
77
|
+
//#endregion
|
|
78
|
+
export { type PostPolicyOptions, S3Client, type S3Credentials, type S3DriverOptions, escapeXml, s3Driver, tagBlocks, tagText, unescapeXml };
|
|
79
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/drivers/s3/index.js
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export { S3Client
|
|
3
|
-
export { escapeXml, unescapeXml, tagText, tagBlocks } from "./xml.js";
|
|
1
|
+
import { a as unescapeXml, i as tagText, n as escapeXml, o as S3Client, r as tagBlocks, t as s3Driver } from "../../s3-DrE9NrnD.js";
|
|
2
|
+
export { S3Client, escapeXml, s3Driver, tagBlocks, tagText, unescapeXml };
|