@syncular/server-cloudflare 0.0.6-159 → 0.0.6-165
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/r2.d.ts +41 -9
- package/dist/r2.d.ts.map +1 -1
- package/dist/r2.js +63 -25
- package/dist/r2.js.map +1 -1
- package/package.json +1 -1
- package/src/r2.ts +130 -42
package/dist/r2.d.ts
CHANGED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
export interface BlobSignUploadOptions {
|
|
13
13
|
/** SHA-256 hash (for naming and checksum validation) */
|
|
14
14
|
hash: string;
|
|
15
|
+
/** Optional tenant/partition namespace for storage lookups */
|
|
16
|
+
partitionId?: string;
|
|
15
17
|
/** Content size in bytes */
|
|
16
18
|
size: number;
|
|
17
19
|
/** MIME type */
|
|
@@ -36,6 +38,8 @@ export interface BlobSignedUpload {
|
|
|
36
38
|
export interface BlobSignDownloadOptions {
|
|
37
39
|
/** SHA-256 hash */
|
|
38
40
|
hash: string;
|
|
41
|
+
/** Optional tenant/partition namespace for storage lookups */
|
|
42
|
+
partitionId?: string;
|
|
39
43
|
/** URL expiration in seconds */
|
|
40
44
|
expiresIn: number;
|
|
41
45
|
}
|
|
@@ -57,34 +61,48 @@ export interface BlobStorageAdapter {
|
|
|
57
61
|
/**
|
|
58
62
|
* Check if a blob exists in storage.
|
|
59
63
|
*/
|
|
60
|
-
exists(hash: string
|
|
64
|
+
exists(hash: string, options?: {
|
|
65
|
+
partitionId?: string;
|
|
66
|
+
}): Promise<boolean>;
|
|
61
67
|
/**
|
|
62
68
|
* Delete a blob (for garbage collection).
|
|
63
69
|
*/
|
|
64
|
-
delete(hash: string
|
|
70
|
+
delete(hash: string, options?: {
|
|
71
|
+
partitionId?: string;
|
|
72
|
+
}): Promise<void>;
|
|
65
73
|
/**
|
|
66
74
|
* Get blob metadata from storage (optional).
|
|
67
75
|
*/
|
|
68
|
-
getMetadata?(hash: string
|
|
76
|
+
getMetadata?(hash: string, options?: {
|
|
77
|
+
partitionId?: string;
|
|
78
|
+
}): Promise<{
|
|
69
79
|
size: number;
|
|
70
80
|
mimeType?: string;
|
|
71
81
|
} | null>;
|
|
72
82
|
/**
|
|
73
83
|
* Store blob data directly (for adapters that support direct storage).
|
|
74
84
|
*/
|
|
75
|
-
put?(hash: string, data: Uint8Array, metadata?: Record<string, unknown
|
|
85
|
+
put?(hash: string, data: Uint8Array, metadata?: Record<string, unknown>, options?: {
|
|
86
|
+
partitionId?: string;
|
|
87
|
+
}): Promise<void>;
|
|
76
88
|
/**
|
|
77
89
|
* Store blob data directly from a stream.
|
|
78
90
|
*/
|
|
79
|
-
putStream?(hash: string, stream: ReadableStream<Uint8Array>, metadata?: Record<string, unknown
|
|
91
|
+
putStream?(hash: string, stream: ReadableStream<Uint8Array>, metadata?: Record<string, unknown>, options?: {
|
|
92
|
+
partitionId?: string;
|
|
93
|
+
}): Promise<void>;
|
|
80
94
|
/**
|
|
81
95
|
* Get blob data directly (for adapters that support direct retrieval).
|
|
82
96
|
*/
|
|
83
|
-
get?(hash: string
|
|
97
|
+
get?(hash: string, options?: {
|
|
98
|
+
partitionId?: string;
|
|
99
|
+
}): Promise<Uint8Array | null>;
|
|
84
100
|
/**
|
|
85
101
|
* Get blob data directly as a stream.
|
|
86
102
|
*/
|
|
87
|
-
getStream?(hash: string
|
|
103
|
+
getStream?(hash: string, options?: {
|
|
104
|
+
partitionId?: string;
|
|
105
|
+
}): Promise<ReadableStream<Uint8Array> | null>;
|
|
88
106
|
}
|
|
89
107
|
/**
|
|
90
108
|
* Token signer interface for creating/verifying upload/download tokens.
|
|
@@ -98,7 +116,14 @@ export interface BlobTokenSigner {
|
|
|
98
116
|
*/
|
|
99
117
|
sign(payload: {
|
|
100
118
|
hash: string;
|
|
101
|
-
|
|
119
|
+
partitionId: string;
|
|
120
|
+
action: 'upload';
|
|
121
|
+
size: number;
|
|
122
|
+
expiresAt: number;
|
|
123
|
+
} | {
|
|
124
|
+
hash: string;
|
|
125
|
+
partitionId: string;
|
|
126
|
+
action: 'download';
|
|
102
127
|
expiresAt: number;
|
|
103
128
|
}, expiresIn: number): Promise<string>;
|
|
104
129
|
/**
|
|
@@ -107,7 +132,14 @@ export interface BlobTokenSigner {
|
|
|
107
132
|
*/
|
|
108
133
|
verify(token: string): Promise<{
|
|
109
134
|
hash: string;
|
|
110
|
-
|
|
135
|
+
partitionId: string;
|
|
136
|
+
action: 'upload';
|
|
137
|
+
size: number;
|
|
138
|
+
expiresAt: number;
|
|
139
|
+
} | {
|
|
140
|
+
hash: string;
|
|
141
|
+
partitionId: string;
|
|
142
|
+
action: 'download';
|
|
111
143
|
expiresAt: number;
|
|
112
144
|
} | null>;
|
|
113
145
|
}
|
package/dist/r2.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../src/r2.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB;IAClB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEtE;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../src/r2.ts"],"names":[],"mappings":"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"}
|
package/dist/r2.js
CHANGED
|
@@ -31,10 +31,36 @@ export function createHmacTokenSigner(secret) {
|
|
|
31
31
|
if (sig !== expectedSig)
|
|
32
32
|
return null;
|
|
33
33
|
try {
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
34
|
+
const parsed = JSON.parse(atob(dataB64));
|
|
35
|
+
if (typeof parsed.hash !== 'string')
|
|
36
36
|
return null;
|
|
37
|
-
|
|
37
|
+
if (typeof parsed.partitionId !== 'string')
|
|
38
|
+
return null;
|
|
39
|
+
if (typeof parsed.expiresAt !== 'number')
|
|
40
|
+
return null;
|
|
41
|
+
if (Date.now() > parsed.expiresAt)
|
|
42
|
+
return null;
|
|
43
|
+
if (parsed.action === 'download') {
|
|
44
|
+
return {
|
|
45
|
+
hash: parsed.hash,
|
|
46
|
+
partitionId: parsed.partitionId,
|
|
47
|
+
action: 'download',
|
|
48
|
+
expiresAt: parsed.expiresAt,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (parsed.action === 'upload' &&
|
|
52
|
+
typeof parsed.size === 'number' &&
|
|
53
|
+
Number.isFinite(parsed.size) &&
|
|
54
|
+
parsed.size >= 0) {
|
|
55
|
+
return {
|
|
56
|
+
hash: parsed.hash,
|
|
57
|
+
partitionId: parsed.partitionId,
|
|
58
|
+
action: 'upload',
|
|
59
|
+
size: parsed.size,
|
|
60
|
+
expiresAt: parsed.expiresAt,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
38
64
|
}
|
|
39
65
|
catch {
|
|
40
66
|
return null;
|
|
@@ -70,10 +96,14 @@ export function createR2BlobStorageAdapter(options) {
|
|
|
70
96
|
const { bucket, keyPrefix = '', baseUrl, tokenSigner } = options;
|
|
71
97
|
// Normalize base URL (remove trailing slash)
|
|
72
98
|
const normalizedBaseUrl = baseUrl.replace(/\/$/, '');
|
|
73
|
-
function getKey(hash) {
|
|
99
|
+
function getKey(hash, partitionId) {
|
|
74
100
|
// Remove "sha256:" prefix and use hex as key
|
|
75
101
|
const hex = hash.startsWith('sha256:') ? hash.slice(7) : hash;
|
|
76
|
-
|
|
102
|
+
const normalizedPartition = partitionId?.trim();
|
|
103
|
+
if (!normalizedPartition || normalizedPartition === 'default') {
|
|
104
|
+
return `${keyPrefix}${hex}`;
|
|
105
|
+
}
|
|
106
|
+
return `${keyPrefix}${encodeURIComponent(normalizedPartition)}/${hex}`;
|
|
77
107
|
}
|
|
78
108
|
function resolveMimeType(metadata) {
|
|
79
109
|
return typeof metadata?.mimeType === 'string'
|
|
@@ -132,8 +162,8 @@ export function createR2BlobStorageAdapter(options) {
|
|
|
132
162
|
reader.releaseLock();
|
|
133
163
|
}
|
|
134
164
|
}
|
|
135
|
-
async function putStreamInternal(hash, stream, metadata) {
|
|
136
|
-
const key = getKey(hash);
|
|
165
|
+
async function putStreamInternal(hash, stream, metadata, options) {
|
|
166
|
+
const key = getKey(hash, options?.partitionId);
|
|
137
167
|
const mimeType = resolveMimeType(metadata);
|
|
138
168
|
const checksum = resolveChecksum(hash, metadata);
|
|
139
169
|
const contentLength = resolveContentLength(metadata);
|
|
@@ -167,8 +197,8 @@ export function createR2BlobStorageAdapter(options) {
|
|
|
167
197
|
sha256: checksum,
|
|
168
198
|
});
|
|
169
199
|
}
|
|
170
|
-
async function getStreamInternal(hash) {
|
|
171
|
-
const key = getKey(hash);
|
|
200
|
+
async function getStreamInternal(hash, options) {
|
|
201
|
+
const key = getKey(hash, options?.partitionId);
|
|
172
202
|
const object = await bucket.get(key);
|
|
173
203
|
if (!object)
|
|
174
204
|
return null;
|
|
@@ -177,8 +207,15 @@ export function createR2BlobStorageAdapter(options) {
|
|
|
177
207
|
return {
|
|
178
208
|
name: 'r2',
|
|
179
209
|
async signUpload(opts) {
|
|
210
|
+
const partitionId = opts.partitionId ?? 'default';
|
|
180
211
|
const expiresAt = Date.now() + opts.expiresIn * 1000;
|
|
181
|
-
const token = await tokenSigner.sign({
|
|
212
|
+
const token = await tokenSigner.sign({
|
|
213
|
+
hash: opts.hash,
|
|
214
|
+
partitionId,
|
|
215
|
+
action: 'upload',
|
|
216
|
+
size: opts.size,
|
|
217
|
+
expiresAt,
|
|
218
|
+
}, opts.expiresIn);
|
|
182
219
|
// URL points to server's blob upload endpoint
|
|
183
220
|
const url = `${normalizedBaseUrl}/blobs/${encodeURIComponent(opts.hash)}/upload?token=${encodeURIComponent(token)}`;
|
|
184
221
|
return {
|
|
@@ -191,21 +228,22 @@ export function createR2BlobStorageAdapter(options) {
|
|
|
191
228
|
};
|
|
192
229
|
},
|
|
193
230
|
async signDownload(opts) {
|
|
231
|
+
const partitionId = opts.partitionId ?? 'default';
|
|
194
232
|
const expiresAt = Date.now() + opts.expiresIn * 1000;
|
|
195
|
-
const token = await tokenSigner.sign({ hash: opts.hash, action: 'download', expiresAt }, opts.expiresIn);
|
|
233
|
+
const token = await tokenSigner.sign({ hash: opts.hash, partitionId, action: 'download', expiresAt }, opts.expiresIn);
|
|
196
234
|
return `${normalizedBaseUrl}/blobs/${encodeURIComponent(opts.hash)}/download?token=${encodeURIComponent(token)}`;
|
|
197
235
|
},
|
|
198
|
-
async exists(hash) {
|
|
199
|
-
const key = getKey(hash);
|
|
236
|
+
async exists(hash, options) {
|
|
237
|
+
const key = getKey(hash, options?.partitionId);
|
|
200
238
|
const head = await bucket.head(key);
|
|
201
239
|
return head !== null;
|
|
202
240
|
},
|
|
203
|
-
async delete(hash) {
|
|
204
|
-
const key = getKey(hash);
|
|
241
|
+
async delete(hash, options) {
|
|
242
|
+
const key = getKey(hash, options?.partitionId);
|
|
205
243
|
await bucket.delete(key);
|
|
206
244
|
},
|
|
207
|
-
async getMetadata(hash) {
|
|
208
|
-
const key = getKey(hash);
|
|
245
|
+
async getMetadata(hash, options) {
|
|
246
|
+
const key = getKey(hash, options?.partitionId);
|
|
209
247
|
const head = await bucket.head(key);
|
|
210
248
|
if (!head)
|
|
211
249
|
return null;
|
|
@@ -214,8 +252,8 @@ export function createR2BlobStorageAdapter(options) {
|
|
|
214
252
|
mimeType: head.httpMetadata?.contentType,
|
|
215
253
|
};
|
|
216
254
|
},
|
|
217
|
-
async put(hash, data, metadata) {
|
|
218
|
-
const key = getKey(hash);
|
|
255
|
+
async put(hash, data, metadata, options) {
|
|
256
|
+
const key = getKey(hash, options?.partitionId);
|
|
219
257
|
const mimeType = resolveMimeType(metadata);
|
|
220
258
|
const checksum = resolveChecksum(hash, metadata);
|
|
221
259
|
await bucket.put(key, data, {
|
|
@@ -225,11 +263,11 @@ export function createR2BlobStorageAdapter(options) {
|
|
|
225
263
|
sha256: checksum,
|
|
226
264
|
});
|
|
227
265
|
},
|
|
228
|
-
async putStream(hash, stream, metadata) {
|
|
229
|
-
await putStreamInternal(hash, stream, metadata);
|
|
266
|
+
async putStream(hash, stream, metadata, options) {
|
|
267
|
+
await putStreamInternal(hash, stream, metadata, options);
|
|
230
268
|
},
|
|
231
|
-
async get(hash) {
|
|
232
|
-
const stream = await getStreamInternal(hash);
|
|
269
|
+
async get(hash, options) {
|
|
270
|
+
const stream = await getStreamInternal(hash, options);
|
|
233
271
|
if (!stream)
|
|
234
272
|
return null;
|
|
235
273
|
const reader = stream.getReader();
|
|
@@ -257,8 +295,8 @@ export function createR2BlobStorageAdapter(options) {
|
|
|
257
295
|
reader.releaseLock();
|
|
258
296
|
}
|
|
259
297
|
},
|
|
260
|
-
async getStream(hash) {
|
|
261
|
-
return getStreamInternal(hash);
|
|
298
|
+
async getStream(hash, options) {
|
|
299
|
+
return getStreamInternal(hash, options);
|
|
262
300
|
},
|
|
263
301
|
};
|
|
264
302
|
}
|
package/dist/r2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../src/r2.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../src/r2.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/r2.ts
CHANGED
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
export interface BlobSignUploadOptions {
|
|
19
19
|
/** SHA-256 hash (for naming and checksum validation) */
|
|
20
20
|
hash: string;
|
|
21
|
+
/** Optional tenant/partition namespace for storage lookups */
|
|
22
|
+
partitionId?: string;
|
|
21
23
|
/** Content size in bytes */
|
|
22
24
|
size: number;
|
|
23
25
|
/** MIME type */
|
|
@@ -44,6 +46,8 @@ export interface BlobSignedUpload {
|
|
|
44
46
|
export interface BlobSignDownloadOptions {
|
|
45
47
|
/** SHA-256 hash */
|
|
46
48
|
hash: string;
|
|
49
|
+
/** Optional tenant/partition namespace for storage lookups */
|
|
50
|
+
partitionId?: string;
|
|
47
51
|
/** URL expiration in seconds */
|
|
48
52
|
expiresIn: number;
|
|
49
53
|
}
|
|
@@ -69,18 +73,19 @@ export interface BlobStorageAdapter {
|
|
|
69
73
|
/**
|
|
70
74
|
* Check if a blob exists in storage.
|
|
71
75
|
*/
|
|
72
|
-
exists(hash: string): Promise<boolean>;
|
|
76
|
+
exists(hash: string, options?: { partitionId?: string }): Promise<boolean>;
|
|
73
77
|
|
|
74
78
|
/**
|
|
75
79
|
* Delete a blob (for garbage collection).
|
|
76
80
|
*/
|
|
77
|
-
delete(hash: string): Promise<void>;
|
|
81
|
+
delete(hash: string, options?: { partitionId?: string }): Promise<void>;
|
|
78
82
|
|
|
79
83
|
/**
|
|
80
84
|
* Get blob metadata from storage (optional).
|
|
81
85
|
*/
|
|
82
86
|
getMetadata?(
|
|
83
|
-
hash: string
|
|
87
|
+
hash: string,
|
|
88
|
+
options?: { partitionId?: string }
|
|
84
89
|
): Promise<{ size: number; mimeType?: string } | null>;
|
|
85
90
|
|
|
86
91
|
/**
|
|
@@ -89,7 +94,8 @@ export interface BlobStorageAdapter {
|
|
|
89
94
|
put?(
|
|
90
95
|
hash: string,
|
|
91
96
|
data: Uint8Array,
|
|
92
|
-
metadata?: Record<string, unknown
|
|
97
|
+
metadata?: Record<string, unknown>,
|
|
98
|
+
options?: { partitionId?: string }
|
|
93
99
|
): Promise<void>;
|
|
94
100
|
|
|
95
101
|
/**
|
|
@@ -98,18 +104,25 @@ export interface BlobStorageAdapter {
|
|
|
98
104
|
putStream?(
|
|
99
105
|
hash: string,
|
|
100
106
|
stream: ReadableStream<Uint8Array>,
|
|
101
|
-
metadata?: Record<string, unknown
|
|
107
|
+
metadata?: Record<string, unknown>,
|
|
108
|
+
options?: { partitionId?: string }
|
|
102
109
|
): Promise<void>;
|
|
103
110
|
|
|
104
111
|
/**
|
|
105
112
|
* Get blob data directly (for adapters that support direct retrieval).
|
|
106
113
|
*/
|
|
107
|
-
get?(
|
|
114
|
+
get?(
|
|
115
|
+
hash: string,
|
|
116
|
+
options?: { partitionId?: string }
|
|
117
|
+
): Promise<Uint8Array | null>;
|
|
108
118
|
|
|
109
119
|
/**
|
|
110
120
|
* Get blob data directly as a stream.
|
|
111
121
|
*/
|
|
112
|
-
getStream?(
|
|
122
|
+
getStream?(
|
|
123
|
+
hash: string,
|
|
124
|
+
options?: { partitionId?: string }
|
|
125
|
+
): Promise<ReadableStream<Uint8Array> | null>;
|
|
113
126
|
}
|
|
114
127
|
|
|
115
128
|
/**
|
|
@@ -123,7 +136,20 @@ export interface BlobTokenSigner {
|
|
|
123
136
|
* @returns A signed token string
|
|
124
137
|
*/
|
|
125
138
|
sign(
|
|
126
|
-
payload:
|
|
139
|
+
payload:
|
|
140
|
+
| {
|
|
141
|
+
hash: string;
|
|
142
|
+
partitionId: string;
|
|
143
|
+
action: 'upload';
|
|
144
|
+
size: number;
|
|
145
|
+
expiresAt: number;
|
|
146
|
+
}
|
|
147
|
+
| {
|
|
148
|
+
hash: string;
|
|
149
|
+
partitionId: string;
|
|
150
|
+
action: 'download';
|
|
151
|
+
expiresAt: number;
|
|
152
|
+
},
|
|
127
153
|
expiresIn: number
|
|
128
154
|
): Promise<string>;
|
|
129
155
|
|
|
@@ -131,11 +157,22 @@ export interface BlobTokenSigner {
|
|
|
131
157
|
* Verify and decode a signed token.
|
|
132
158
|
* @returns The payload if valid, null if invalid/expired
|
|
133
159
|
*/
|
|
134
|
-
verify(token: string): Promise<
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
160
|
+
verify(token: string): Promise<
|
|
161
|
+
| {
|
|
162
|
+
hash: string;
|
|
163
|
+
partitionId: string;
|
|
164
|
+
action: 'upload';
|
|
165
|
+
size: number;
|
|
166
|
+
expiresAt: number;
|
|
167
|
+
}
|
|
168
|
+
| {
|
|
169
|
+
hash: string;
|
|
170
|
+
partitionId: string;
|
|
171
|
+
action: 'download';
|
|
172
|
+
expiresAt: number;
|
|
173
|
+
}
|
|
174
|
+
| null
|
|
175
|
+
>;
|
|
139
176
|
}
|
|
140
177
|
|
|
141
178
|
/**
|
|
@@ -176,15 +213,37 @@ export function createHmacTokenSigner(secret: string): BlobTokenSigner {
|
|
|
176
213
|
if (sig !== expectedSig) return null;
|
|
177
214
|
|
|
178
215
|
try {
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
216
|
+
const parsed = JSON.parse(atob(dataB64)) as Record<string, unknown>;
|
|
217
|
+
if (typeof parsed.hash !== 'string') return null;
|
|
218
|
+
if (typeof parsed.partitionId !== 'string') return null;
|
|
219
|
+
if (typeof parsed.expiresAt !== 'number') return null;
|
|
220
|
+
if (Date.now() > parsed.expiresAt) return null;
|
|
221
|
+
|
|
222
|
+
if (parsed.action === 'download') {
|
|
223
|
+
return {
|
|
224
|
+
hash: parsed.hash,
|
|
225
|
+
partitionId: parsed.partitionId,
|
|
226
|
+
action: 'download',
|
|
227
|
+
expiresAt: parsed.expiresAt,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
184
230
|
|
|
185
|
-
if (
|
|
231
|
+
if (
|
|
232
|
+
parsed.action === 'upload' &&
|
|
233
|
+
typeof parsed.size === 'number' &&
|
|
234
|
+
Number.isFinite(parsed.size) &&
|
|
235
|
+
parsed.size >= 0
|
|
236
|
+
) {
|
|
237
|
+
return {
|
|
238
|
+
hash: parsed.hash,
|
|
239
|
+
partitionId: parsed.partitionId,
|
|
240
|
+
action: 'upload',
|
|
241
|
+
size: parsed.size,
|
|
242
|
+
expiresAt: parsed.expiresAt,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
186
245
|
|
|
187
|
-
return
|
|
246
|
+
return null;
|
|
188
247
|
} catch {
|
|
189
248
|
return null;
|
|
190
249
|
}
|
|
@@ -236,10 +295,14 @@ export function createR2BlobStorageAdapter(
|
|
|
236
295
|
// Normalize base URL (remove trailing slash)
|
|
237
296
|
const normalizedBaseUrl = baseUrl.replace(/\/$/, '');
|
|
238
297
|
|
|
239
|
-
function getKey(hash: string): string {
|
|
298
|
+
function getKey(hash: string, partitionId?: string): string {
|
|
240
299
|
// Remove "sha256:" prefix and use hex as key
|
|
241
300
|
const hex = hash.startsWith('sha256:') ? hash.slice(7) : hash;
|
|
242
|
-
|
|
301
|
+
const normalizedPartition = partitionId?.trim();
|
|
302
|
+
if (!normalizedPartition || normalizedPartition === 'default') {
|
|
303
|
+
return `${keyPrefix}${hex}`;
|
|
304
|
+
}
|
|
305
|
+
return `${keyPrefix}${encodeURIComponent(normalizedPartition)}/${hex}`;
|
|
243
306
|
}
|
|
244
307
|
|
|
245
308
|
function resolveMimeType(metadata?: Record<string, unknown>): string {
|
|
@@ -313,9 +376,10 @@ export function createR2BlobStorageAdapter(
|
|
|
313
376
|
async function putStreamInternal(
|
|
314
377
|
hash: string,
|
|
315
378
|
stream: ReadableStream<Uint8Array>,
|
|
316
|
-
metadata?: Record<string, unknown
|
|
379
|
+
metadata?: Record<string, unknown>,
|
|
380
|
+
options?: { partitionId?: string }
|
|
317
381
|
): Promise<void> {
|
|
318
|
-
const key = getKey(hash);
|
|
382
|
+
const key = getKey(hash, options?.partitionId);
|
|
319
383
|
const mimeType = resolveMimeType(metadata);
|
|
320
384
|
const checksum = resolveChecksum(hash, metadata);
|
|
321
385
|
const contentLength = resolveContentLength(metadata);
|
|
@@ -356,9 +420,10 @@ export function createR2BlobStorageAdapter(
|
|
|
356
420
|
}
|
|
357
421
|
|
|
358
422
|
async function getStreamInternal(
|
|
359
|
-
hash: string
|
|
423
|
+
hash: string,
|
|
424
|
+
options?: { partitionId?: string }
|
|
360
425
|
): Promise<ReadableStream<Uint8Array> | null> {
|
|
361
|
-
const key = getKey(hash);
|
|
426
|
+
const key = getKey(hash, options?.partitionId);
|
|
362
427
|
const object = await bucket.get(key);
|
|
363
428
|
if (!object) return null;
|
|
364
429
|
return object.body as ReadableStream<Uint8Array> | null;
|
|
@@ -368,9 +433,16 @@ export function createR2BlobStorageAdapter(
|
|
|
368
433
|
name: 'r2',
|
|
369
434
|
|
|
370
435
|
async signUpload(opts: BlobSignUploadOptions): Promise<BlobSignedUpload> {
|
|
436
|
+
const partitionId = opts.partitionId ?? 'default';
|
|
371
437
|
const expiresAt = Date.now() + opts.expiresIn * 1000;
|
|
372
438
|
const token = await tokenSigner.sign(
|
|
373
|
-
{
|
|
439
|
+
{
|
|
440
|
+
hash: opts.hash,
|
|
441
|
+
partitionId,
|
|
442
|
+
action: 'upload',
|
|
443
|
+
size: opts.size,
|
|
444
|
+
expiresAt,
|
|
445
|
+
},
|
|
374
446
|
opts.expiresIn
|
|
375
447
|
);
|
|
376
448
|
|
|
@@ -388,30 +460,38 @@ export function createR2BlobStorageAdapter(
|
|
|
388
460
|
},
|
|
389
461
|
|
|
390
462
|
async signDownload(opts: BlobSignDownloadOptions): Promise<string> {
|
|
463
|
+
const partitionId = opts.partitionId ?? 'default';
|
|
391
464
|
const expiresAt = Date.now() + opts.expiresIn * 1000;
|
|
392
465
|
const token = await tokenSigner.sign(
|
|
393
|
-
{ hash: opts.hash, action: 'download', expiresAt },
|
|
466
|
+
{ hash: opts.hash, partitionId, action: 'download', expiresAt },
|
|
394
467
|
opts.expiresIn
|
|
395
468
|
);
|
|
396
469
|
|
|
397
470
|
return `${normalizedBaseUrl}/blobs/${encodeURIComponent(opts.hash)}/download?token=${encodeURIComponent(token)}`;
|
|
398
471
|
},
|
|
399
472
|
|
|
400
|
-
async exists(
|
|
401
|
-
|
|
473
|
+
async exists(
|
|
474
|
+
hash: string,
|
|
475
|
+
options?: { partitionId?: string }
|
|
476
|
+
): Promise<boolean> {
|
|
477
|
+
const key = getKey(hash, options?.partitionId);
|
|
402
478
|
const head = await bucket.head(key);
|
|
403
479
|
return head !== null;
|
|
404
480
|
},
|
|
405
481
|
|
|
406
|
-
async delete(
|
|
407
|
-
|
|
482
|
+
async delete(
|
|
483
|
+
hash: string,
|
|
484
|
+
options?: { partitionId?: string }
|
|
485
|
+
): Promise<void> {
|
|
486
|
+
const key = getKey(hash, options?.partitionId);
|
|
408
487
|
await bucket.delete(key);
|
|
409
488
|
},
|
|
410
489
|
|
|
411
490
|
async getMetadata(
|
|
412
|
-
hash: string
|
|
491
|
+
hash: string,
|
|
492
|
+
options?: { partitionId?: string }
|
|
413
493
|
): Promise<{ size: number; mimeType?: string } | null> {
|
|
414
|
-
const key = getKey(hash);
|
|
494
|
+
const key = getKey(hash, options?.partitionId);
|
|
415
495
|
const head = await bucket.head(key);
|
|
416
496
|
if (!head) return null;
|
|
417
497
|
|
|
@@ -424,9 +504,10 @@ export function createR2BlobStorageAdapter(
|
|
|
424
504
|
async put(
|
|
425
505
|
hash: string,
|
|
426
506
|
data: Uint8Array,
|
|
427
|
-
metadata?: Record<string, unknown
|
|
507
|
+
metadata?: Record<string, unknown>,
|
|
508
|
+
options?: { partitionId?: string }
|
|
428
509
|
): Promise<void> {
|
|
429
|
-
const key = getKey(hash);
|
|
510
|
+
const key = getKey(hash, options?.partitionId);
|
|
430
511
|
const mimeType = resolveMimeType(metadata);
|
|
431
512
|
const checksum = resolveChecksum(hash, metadata);
|
|
432
513
|
await bucket.put(key, data, {
|
|
@@ -440,13 +521,17 @@ export function createR2BlobStorageAdapter(
|
|
|
440
521
|
async putStream(
|
|
441
522
|
hash: string,
|
|
442
523
|
stream: ReadableStream<Uint8Array>,
|
|
443
|
-
metadata?: Record<string, unknown
|
|
524
|
+
metadata?: Record<string, unknown>,
|
|
525
|
+
options?: { partitionId?: string }
|
|
444
526
|
): Promise<void> {
|
|
445
|
-
await putStreamInternal(hash, stream, metadata);
|
|
527
|
+
await putStreamInternal(hash, stream, metadata, options);
|
|
446
528
|
},
|
|
447
529
|
|
|
448
|
-
async get(
|
|
449
|
-
|
|
530
|
+
async get(
|
|
531
|
+
hash: string,
|
|
532
|
+
options?: { partitionId?: string }
|
|
533
|
+
): Promise<Uint8Array | null> {
|
|
534
|
+
const stream = await getStreamInternal(hash, options);
|
|
450
535
|
if (!stream) return null;
|
|
451
536
|
|
|
452
537
|
const reader = stream.getReader();
|
|
@@ -472,8 +557,11 @@ export function createR2BlobStorageAdapter(
|
|
|
472
557
|
}
|
|
473
558
|
},
|
|
474
559
|
|
|
475
|
-
async getStream(
|
|
476
|
-
|
|
560
|
+
async getStream(
|
|
561
|
+
hash: string,
|
|
562
|
+
options?: { partitionId?: string }
|
|
563
|
+
): Promise<ReadableStream<Uint8Array> | null> {
|
|
564
|
+
return getStreamInternal(hash, options);
|
|
477
565
|
},
|
|
478
566
|
};
|
|
479
567
|
}
|