@shivam995364/uplink-nodejs-test 0.1.0-beta.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/Makefile +945 -0
- package/README.md +281 -0
- package/binding.gyp +105 -0
- package/dist/access/index.d.ts +102 -0
- package/dist/access/index.d.ts.map +1 -0
- package/dist/access/index.js +168 -0
- package/dist/access/index.js.map +1 -0
- package/dist/debug/index.d.ts +54 -0
- package/dist/debug/index.d.ts.map +1 -0
- package/dist/debug/index.js +61 -0
- package/dist/debug/index.js.map +1 -0
- package/dist/download/index.d.ts +106 -0
- package/dist/download/index.d.ts.map +1 -0
- package/dist/download/index.js +153 -0
- package/dist/download/index.js.map +1 -0
- package/dist/edge/index.d.ts +101 -0
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +128 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/errors/codes.d.ts +29 -0
- package/dist/errors/codes.d.ts.map +1 -0
- package/dist/errors/codes.js +35 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/exceptions.d.ts +135 -0
- package/dist/errors/exceptions.d.ts.map +1 -0
- package/dist/errors/exceptions.js +203 -0
- package/dist/errors/exceptions.js.map +1 -0
- package/dist/errors/factory.d.ts +69 -0
- package/dist/errors/factory.d.ts.map +1 -0
- package/dist/errors/factory.js +121 -0
- package/dist/errors/factory.js.map +1 -0
- package/dist/errors/index.d.ts +35 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +69 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/multipart/index.d.ts +146 -0
- package/dist/multipart/index.d.ts.map +1 -0
- package/dist/multipart/index.js +244 -0
- package/dist/multipart/index.js.map +1 -0
- package/dist/native/index.d.ts +72 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +34 -0
- package/dist/native/index.js.map +1 -0
- package/dist/project/index.d.ts +409 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +529 -0
- package/dist/project/index.js.map +1 -0
- package/dist/types/index.d.ts +299 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +59 -0
- package/dist/types/index.js.map +1 -0
- package/dist/uplink.d.ts +99 -0
- package/dist/uplink.d.ts.map +1 -0
- package/dist/uplink.js +135 -0
- package/dist/uplink.js.map +1 -0
- package/dist/upload/index.d.ts +153 -0
- package/dist/upload/index.d.ts.map +1 -0
- package/dist/upload/index.js +206 -0
- package/dist/upload/index.js.map +1 -0
- package/native/include/uplink.h +545 -0
- package/native/include/uplink_compat.h +111 -0
- package/native/include/uplink_definitions.h +344 -0
- package/native/include/uplink_msvc_compat.h +0 -0
- package/native/prebuilds/darwin-arm64/libuplink.dylib +0 -0
- package/native/prebuilds/darwin-arm64/uplink_native.node +0 -0
- package/native/prebuilds/win32-x64/libuplink.dll +0 -0
- package/native/prebuilds/win32-x64/uplink.def +87 -0
- package/native/prebuilds/win32-x64/uplink.lib +0 -0
- package/package.json +94 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file project/index.ts
|
|
4
|
+
* @brief ProjectResultStruct class for uplink-nodejs
|
|
5
|
+
*
|
|
6
|
+
* Provides TypeScript wrapper for project operations.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ProjectResultStruct = void 0;
|
|
10
|
+
const upload_1 = require("../upload");
|
|
11
|
+
const download_1 = require("../download");
|
|
12
|
+
const native_1 = require("../native");
|
|
13
|
+
/**
|
|
14
|
+
* Represents an open project on Storj.
|
|
15
|
+
*
|
|
16
|
+
* A project is the main entry point for bucket and object operations.
|
|
17
|
+
* Always call `close()` when done to free resources.
|
|
18
|
+
*/
|
|
19
|
+
class ProjectResultStruct {
|
|
20
|
+
_handle;
|
|
21
|
+
_isOpen = true;
|
|
22
|
+
/**
|
|
23
|
+
* Create a new ProjectResultStruct from a native handle
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
constructor(handle) {
|
|
27
|
+
if (handle == null) {
|
|
28
|
+
throw new TypeError('Invalid project handle');
|
|
29
|
+
}
|
|
30
|
+
this._handle = handle;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get the internal handle (for internal use only)
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
get _nativeHandle() {
|
|
37
|
+
this.validateOpen();
|
|
38
|
+
return this._handle;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if the project is still open
|
|
42
|
+
*/
|
|
43
|
+
get isOpen() {
|
|
44
|
+
return this._isOpen;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Close the project and release resources.
|
|
48
|
+
*
|
|
49
|
+
* After calling this method, no other methods should be called
|
|
50
|
+
* on this project instance.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const project = await access.openProject();
|
|
55
|
+
* try {
|
|
56
|
+
* // Use project...
|
|
57
|
+
* } finally {
|
|
58
|
+
* await project.close();
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
async close() {
|
|
63
|
+
if (!this._isOpen) {
|
|
64
|
+
return; // Already closed
|
|
65
|
+
}
|
|
66
|
+
await native_1.native.closeProject(this._handle);
|
|
67
|
+
this._isOpen = false;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Revoke an access grant.
|
|
71
|
+
*
|
|
72
|
+
* Revokes the API key embedded in the provided access grant.
|
|
73
|
+
* This is useful when you want to invalidate a previously shared access.
|
|
74
|
+
*
|
|
75
|
+
* @param access - The access grant to revoke (AccessResultStruct)
|
|
76
|
+
* @returns Promise resolving when the access is revoked
|
|
77
|
+
* @throws Error if revocation fails
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* // Create a shared access with limited permissions
|
|
82
|
+
* const sharedAccess = await access.share(permission, prefixes);
|
|
83
|
+
*
|
|
84
|
+
* // Give the shared access to someone...
|
|
85
|
+
*
|
|
86
|
+
* // Later, revoke the access when no longer needed
|
|
87
|
+
* await project.revokeAccess(sharedAccess);
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
async revokeAccess(access) {
|
|
91
|
+
this.validateOpen();
|
|
92
|
+
if (access == null || access._nativeHandle == null) {
|
|
93
|
+
throw new TypeError('Invalid access: must be an AccessResultStruct');
|
|
94
|
+
}
|
|
95
|
+
await native_1.native.revokeAccess(this._handle, access._nativeHandle);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Validate that the project is still open
|
|
99
|
+
* @throws Error if project is closed
|
|
100
|
+
*/
|
|
101
|
+
validateOpen() {
|
|
102
|
+
if (!this._isOpen) {
|
|
103
|
+
throw new Error('Project is closed');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validate a bucket name
|
|
108
|
+
* @param name - Bucket name to validate
|
|
109
|
+
* @throws TypeError if bucket name is invalid
|
|
110
|
+
*/
|
|
111
|
+
validateBucketName(name) {
|
|
112
|
+
if (!name || typeof name !== 'string') {
|
|
113
|
+
throw new TypeError('Bucket name must be a non-empty string');
|
|
114
|
+
}
|
|
115
|
+
if (name.length < 3 || name.length > 63) {
|
|
116
|
+
throw new TypeError('Bucket name must be 3-63 characters');
|
|
117
|
+
}
|
|
118
|
+
// Bucket names must be lowercase alphanumeric or hyphens
|
|
119
|
+
// Must start and end with alphanumeric
|
|
120
|
+
if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$/.test(name) && name.length > 2) {
|
|
121
|
+
throw new TypeError('Bucket name must be lowercase alphanumeric or hyphens, ' +
|
|
122
|
+
'starting and ending with alphanumeric');
|
|
123
|
+
}
|
|
124
|
+
// Single character names need special handling
|
|
125
|
+
if (name.length <= 2 && !/^[a-z0-9]+$/.test(name)) {
|
|
126
|
+
throw new TypeError('Bucket name must be lowercase alphanumeric');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// ========== Bucket Operations ==========
|
|
130
|
+
/**
|
|
131
|
+
* Create a new bucket.
|
|
132
|
+
*
|
|
133
|
+
* @param name - Bucket name (3-63 lowercase alphanumeric chars or hyphens)
|
|
134
|
+
* @returns Promise resolving to the created bucket info
|
|
135
|
+
* @throws TypeError if bucket name is invalid
|
|
136
|
+
* @throws Error if bucket already exists
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const bucket = await project.createBucket('my-bucket');
|
|
141
|
+
* console.log(`Created bucket: ${bucket.name}`);
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
async createBucket(name) {
|
|
145
|
+
this.validateOpen();
|
|
146
|
+
this.validateBucketName(name);
|
|
147
|
+
return native_1.native.createBucket(this._handle, name);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Ensure a bucket exists, creating it if necessary.
|
|
151
|
+
*
|
|
152
|
+
* This is idempotent - calling it multiple times has the same effect
|
|
153
|
+
* as calling it once.
|
|
154
|
+
*
|
|
155
|
+
* @param name - Bucket name (3-63 lowercase alphanumeric chars or hyphens)
|
|
156
|
+
* @returns Promise resolving to the bucket info
|
|
157
|
+
* @throws TypeError if bucket name is invalid
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* const bucket = await project.ensureBucket('my-bucket');
|
|
162
|
+
* // Bucket now exists, whether it was just created or already existed
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
async ensureBucket(name) {
|
|
166
|
+
this.validateOpen();
|
|
167
|
+
this.validateBucketName(name);
|
|
168
|
+
return native_1.native.ensureBucket(this._handle, name);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get information about a bucket.
|
|
172
|
+
*
|
|
173
|
+
* @param name - Bucket name
|
|
174
|
+
* @returns Promise resolving to the bucket info
|
|
175
|
+
* @throws TypeError if bucket name is invalid
|
|
176
|
+
* @throws Error if bucket does not exist
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```typescript
|
|
180
|
+
* const bucket = await project.statBucket('my-bucket');
|
|
181
|
+
* console.log(`Bucket created: ${bucket.created}`);
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
async statBucket(name) {
|
|
185
|
+
this.validateOpen();
|
|
186
|
+
this.validateBucketName(name);
|
|
187
|
+
return native_1.native.statBucket(this._handle, name);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Delete an empty bucket.
|
|
191
|
+
*
|
|
192
|
+
* The bucket must be empty before it can be deleted.
|
|
193
|
+
* Use `deleteBucketWithObjects` to delete a bucket and all its contents.
|
|
194
|
+
*
|
|
195
|
+
* @param name - Bucket name
|
|
196
|
+
* @returns Promise resolving when the bucket is deleted
|
|
197
|
+
* @throws TypeError if bucket name is invalid
|
|
198
|
+
* @throws Error if bucket does not exist or is not empty
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```typescript
|
|
202
|
+
* await project.deleteBucket('my-bucket');
|
|
203
|
+
* ```
|
|
204
|
+
*/
|
|
205
|
+
async deleteBucket(name) {
|
|
206
|
+
this.validateOpen();
|
|
207
|
+
this.validateBucketName(name);
|
|
208
|
+
return native_1.native.deleteBucket(this._handle, name);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Delete a bucket and all its objects.
|
|
212
|
+
*
|
|
213
|
+
* WARNING: This will permanently delete all objects in the bucket!
|
|
214
|
+
*
|
|
215
|
+
* @param name - Bucket name
|
|
216
|
+
* @returns Promise resolving when the bucket and all objects are deleted
|
|
217
|
+
* @throws TypeError if bucket name is invalid
|
|
218
|
+
* @throws Error if bucket does not exist
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```typescript
|
|
222
|
+
* // Delete bucket and all its contents
|
|
223
|
+
* await project.deleteBucketWithObjects('my-bucket');
|
|
224
|
+
* ```
|
|
225
|
+
*/
|
|
226
|
+
async deleteBucketWithObjects(name) {
|
|
227
|
+
this.validateOpen();
|
|
228
|
+
this.validateBucketName(name);
|
|
229
|
+
return native_1.native.deleteBucketWithObjects(this._handle, name);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* List all buckets in the project.
|
|
233
|
+
*
|
|
234
|
+
* @param options - Optional listing options
|
|
235
|
+
* @returns Promise resolving to an array of bucket info
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* ```typescript
|
|
239
|
+
* const buckets = await project.listBuckets();
|
|
240
|
+
* for (const bucket of buckets) {
|
|
241
|
+
* console.log(`- ${bucket.name} (created: ${bucket.created})`);
|
|
242
|
+
* }
|
|
243
|
+
* ```
|
|
244
|
+
*/
|
|
245
|
+
async listBuckets(options) {
|
|
246
|
+
this.validateOpen();
|
|
247
|
+
return native_1.native.listBuckets(this._handle, options);
|
|
248
|
+
}
|
|
249
|
+
// ========== Object Operations ==========
|
|
250
|
+
/**
|
|
251
|
+
* Validate an object key
|
|
252
|
+
* @param key - Object key to validate
|
|
253
|
+
* @throws TypeError if object key is invalid
|
|
254
|
+
*/
|
|
255
|
+
validateObjectKey(key) {
|
|
256
|
+
if (!key || typeof key !== 'string') {
|
|
257
|
+
throw new TypeError('Object key must be a non-empty string');
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get information about an object.
|
|
262
|
+
*
|
|
263
|
+
* @param bucketName - Name of the bucket containing the object
|
|
264
|
+
* @param objectKey - Object key (path)
|
|
265
|
+
* @returns Promise resolving to the object info
|
|
266
|
+
* @throws TypeError if bucket name or object key is invalid
|
|
267
|
+
* @throws Error if object does not exist
|
|
268
|
+
*
|
|
269
|
+
* @example
|
|
270
|
+
* ```typescript
|
|
271
|
+
* const info = await project.statObject('my-bucket', 'path/to/file.txt');
|
|
272
|
+
* console.log(`Size: ${info.system.contentLength} bytes`);
|
|
273
|
+
* console.log(`Created: ${info.system.created}`);
|
|
274
|
+
* ```
|
|
275
|
+
*/
|
|
276
|
+
async statObject(bucketName, objectKey) {
|
|
277
|
+
this.validateOpen();
|
|
278
|
+
this.validateBucketName(bucketName);
|
|
279
|
+
this.validateObjectKey(objectKey);
|
|
280
|
+
return native_1.native.statObject(this._handle, bucketName, objectKey);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Delete an object.
|
|
284
|
+
*
|
|
285
|
+
* @param bucketName - Name of the bucket containing the object
|
|
286
|
+
* @param objectKey - Object key (path)
|
|
287
|
+
* @returns Promise resolving when the object is deleted
|
|
288
|
+
* @throws TypeError if bucket name or object key is invalid
|
|
289
|
+
* @throws Error if object does not exist
|
|
290
|
+
*
|
|
291
|
+
* @example
|
|
292
|
+
* ```typescript
|
|
293
|
+
* await project.deleteObject('my-bucket', 'path/to/file.txt');
|
|
294
|
+
* ```
|
|
295
|
+
*/
|
|
296
|
+
async deleteObject(bucketName, objectKey) {
|
|
297
|
+
this.validateOpen();
|
|
298
|
+
this.validateBucketName(bucketName);
|
|
299
|
+
this.validateObjectKey(objectKey);
|
|
300
|
+
return native_1.native.deleteObject(this._handle, bucketName, objectKey);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* List objects in a bucket.
|
|
304
|
+
*
|
|
305
|
+
* @param bucketName - Name of the bucket to list objects from
|
|
306
|
+
* @param options - Optional listing options
|
|
307
|
+
* @returns Promise resolving to an array of object info
|
|
308
|
+
* @throws TypeError if bucket name is invalid
|
|
309
|
+
*
|
|
310
|
+
* @example
|
|
311
|
+
* ```typescript
|
|
312
|
+
* // List all objects
|
|
313
|
+
* const objects = await project.listObjects('my-bucket');
|
|
314
|
+
*
|
|
315
|
+
* // List with prefix and pagination
|
|
316
|
+
* const objects = await project.listObjects('my-bucket', {
|
|
317
|
+
* prefix: 'photos/',
|
|
318
|
+
* recursive: true,
|
|
319
|
+
* system: true,
|
|
320
|
+
* custom: true
|
|
321
|
+
* });
|
|
322
|
+
*
|
|
323
|
+
* for (const obj of objects) {
|
|
324
|
+
* if (obj.isPrefix) {
|
|
325
|
+
* console.log(`[DIR] ${obj.key}`);
|
|
326
|
+
* } else {
|
|
327
|
+
* console.log(`${obj.key} (${obj.system.contentLength} bytes)`);
|
|
328
|
+
* }
|
|
329
|
+
* }
|
|
330
|
+
* ```
|
|
331
|
+
*/
|
|
332
|
+
async listObjects(bucketName, options) {
|
|
333
|
+
this.validateOpen();
|
|
334
|
+
this.validateBucketName(bucketName);
|
|
335
|
+
return native_1.native.listObjects(this._handle, bucketName, options);
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Copy an object to a new location.
|
|
339
|
+
*
|
|
340
|
+
* @param oldBucket - Source bucket name
|
|
341
|
+
* @param oldKey - Source object key
|
|
342
|
+
* @param newBucket - Destination bucket name
|
|
343
|
+
* @param newKey - Destination object key
|
|
344
|
+
* @param options - Optional copy options
|
|
345
|
+
* @returns Promise resolving to the new object info
|
|
346
|
+
* @throws TypeError if bucket name or object key is invalid
|
|
347
|
+
* @throws Error if source object does not exist
|
|
348
|
+
*
|
|
349
|
+
* @example
|
|
350
|
+
* ```typescript
|
|
351
|
+
* // Copy within same bucket
|
|
352
|
+
* const copied = await project.copyObject(
|
|
353
|
+
* 'my-bucket', 'original.txt',
|
|
354
|
+
* 'my-bucket', 'copy.txt'
|
|
355
|
+
* );
|
|
356
|
+
*
|
|
357
|
+
* // Copy to different bucket
|
|
358
|
+
* const copied = await project.copyObject(
|
|
359
|
+
* 'source-bucket', 'file.txt',
|
|
360
|
+
* 'dest-bucket', 'backup/file.txt'
|
|
361
|
+
* );
|
|
362
|
+
* ```
|
|
363
|
+
*/
|
|
364
|
+
async copyObject(oldBucket, oldKey, newBucket, newKey, options) {
|
|
365
|
+
this.validateOpen();
|
|
366
|
+
this.validateBucketName(oldBucket);
|
|
367
|
+
this.validateObjectKey(oldKey);
|
|
368
|
+
this.validateBucketName(newBucket);
|
|
369
|
+
this.validateObjectKey(newKey);
|
|
370
|
+
return native_1.native.copyObject(this._handle, oldBucket, oldKey, newBucket, newKey, options);
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Move (rename) an object to a new location.
|
|
374
|
+
*
|
|
375
|
+
* @param oldBucket - Source bucket name
|
|
376
|
+
* @param oldKey - Source object key
|
|
377
|
+
* @param newBucket - Destination bucket name
|
|
378
|
+
* @param newKey - Destination object key
|
|
379
|
+
* @param options - Optional move options
|
|
380
|
+
* @returns Promise resolving when the move is complete
|
|
381
|
+
* @throws TypeError if bucket name or object key is invalid
|
|
382
|
+
* @throws Error if source object does not exist
|
|
383
|
+
*
|
|
384
|
+
* @example
|
|
385
|
+
* ```typescript
|
|
386
|
+
* // Rename within same bucket
|
|
387
|
+
* await project.moveObject(
|
|
388
|
+
* 'my-bucket', 'old-name.txt',
|
|
389
|
+
* 'my-bucket', 'new-name.txt'
|
|
390
|
+
* );
|
|
391
|
+
*
|
|
392
|
+
* // Move to different bucket
|
|
393
|
+
* await project.moveObject(
|
|
394
|
+
* 'source-bucket', 'file.txt',
|
|
395
|
+
* 'archive-bucket', 'archived/file.txt'
|
|
396
|
+
* );
|
|
397
|
+
* ```
|
|
398
|
+
*/
|
|
399
|
+
async moveObject(oldBucket, oldKey, newBucket, newKey, options) {
|
|
400
|
+
this.validateOpen();
|
|
401
|
+
this.validateBucketName(oldBucket);
|
|
402
|
+
this.validateObjectKey(oldKey);
|
|
403
|
+
this.validateBucketName(newBucket);
|
|
404
|
+
this.validateObjectKey(newKey);
|
|
405
|
+
return native_1.native.moveObject(this._handle, oldBucket, oldKey, newBucket, newKey, options);
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Update object custom metadata.
|
|
409
|
+
*
|
|
410
|
+
* Replaces the existing custom metadata with new metadata.
|
|
411
|
+
* System metadata (created, expires, contentLength) cannot be modified.
|
|
412
|
+
*
|
|
413
|
+
* @param bucketName - Bucket name containing the object
|
|
414
|
+
* @param objectKey - Object key to update
|
|
415
|
+
* @param metadata - New custom metadata (replaces existing)
|
|
416
|
+
* @returns Promise resolving when metadata is updated
|
|
417
|
+
* @throws TypeError if bucket name or object key is invalid
|
|
418
|
+
* @throws Error if object does not exist
|
|
419
|
+
*
|
|
420
|
+
* @example
|
|
421
|
+
* ```typescript
|
|
422
|
+
* // Update custom metadata
|
|
423
|
+
* await project.updateObjectMetadata('my-bucket', 'file.txt', {
|
|
424
|
+
* 'Content-Type': 'text/plain',
|
|
425
|
+
* 'X-Author': 'John Doe',
|
|
426
|
+
* 'X-Version': '2'
|
|
427
|
+
* });
|
|
428
|
+
*
|
|
429
|
+
* // Clear custom metadata by passing empty object
|
|
430
|
+
* await project.updateObjectMetadata('my-bucket', 'file.txt', {});
|
|
431
|
+
* ```
|
|
432
|
+
*/
|
|
433
|
+
async updateObjectMetadata(bucketName, objectKey, metadata) {
|
|
434
|
+
this.validateOpen();
|
|
435
|
+
this.validateBucketName(bucketName);
|
|
436
|
+
this.validateObjectKey(objectKey);
|
|
437
|
+
if (metadata == null || typeof metadata !== 'object') {
|
|
438
|
+
throw new TypeError('metadata must be an object');
|
|
439
|
+
}
|
|
440
|
+
return native_1.native.updateObjectMetadata(this._handle, bucketName, objectKey, metadata);
|
|
441
|
+
}
|
|
442
|
+
// ========== Upload Operations ==========
|
|
443
|
+
/**
|
|
444
|
+
* Start uploading an object.
|
|
445
|
+
*
|
|
446
|
+
* Returns an UploadResultStruct for writing data and finalizing the upload.
|
|
447
|
+
*
|
|
448
|
+
* @param bucketName - Name of the bucket to upload to
|
|
449
|
+
* @param objectKey - Object key (path) for the uploaded object
|
|
450
|
+
* @param options - Optional upload options (e.g., expiration)
|
|
451
|
+
* @returns Promise resolving to an UploadResultStruct
|
|
452
|
+
* @throws TypeError if bucket name or object key is invalid
|
|
453
|
+
*
|
|
454
|
+
* @example
|
|
455
|
+
* ```typescript
|
|
456
|
+
* // Simple upload
|
|
457
|
+
* const upload = await project.uploadObject('my-bucket', 'file.txt');
|
|
458
|
+
* await upload.write(Buffer.from('Hello, World!'), 13);
|
|
459
|
+
* await upload.commit();
|
|
460
|
+
*
|
|
461
|
+
* // Upload with expiration
|
|
462
|
+
* const upload = await project.uploadObject('my-bucket', 'temp.txt', {
|
|
463
|
+
* expires: new Date(Date.now() + 24 * 60 * 60 * 1000) // 24 hours
|
|
464
|
+
* });
|
|
465
|
+
* await upload.write(data, data.length);
|
|
466
|
+
* await upload.commit();
|
|
467
|
+
*
|
|
468
|
+
* // Upload with custom metadata
|
|
469
|
+
* const upload = await project.uploadObject('my-bucket', 'photo.jpg');
|
|
470
|
+
* await upload.setCustomMetadata({
|
|
471
|
+
* 'Content-Type': 'image/jpeg',
|
|
472
|
+
* 'X-Custom-Tag': 'vacation'
|
|
473
|
+
* });
|
|
474
|
+
* await upload.write(imageBuffer, imageBuffer.length);
|
|
475
|
+
* await upload.commit();
|
|
476
|
+
* ```
|
|
477
|
+
*/
|
|
478
|
+
async uploadObject(bucketName, objectKey, options) {
|
|
479
|
+
this.validateOpen();
|
|
480
|
+
this.validateBucketName(bucketName);
|
|
481
|
+
this.validateObjectKey(objectKey);
|
|
482
|
+
const handle = await native_1.native.uploadObject(this._handle, bucketName, objectKey, options);
|
|
483
|
+
return new upload_1.UploadResultStruct(handle);
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Start a download from a bucket.
|
|
487
|
+
*
|
|
488
|
+
* Opens a download stream for the specified object. Use the returned
|
|
489
|
+
* DownloadResultStruct to read data and close the download when done.
|
|
490
|
+
*
|
|
491
|
+
* @param bucketName - Name of the bucket to download from
|
|
492
|
+
* @param objectKey - Object key (path) to download
|
|
493
|
+
* @param options - Optional download options (offset, length)
|
|
494
|
+
* @returns Promise resolving to a DownloadResultStruct
|
|
495
|
+
* @throws TypeError if bucket name or object key is invalid
|
|
496
|
+
*
|
|
497
|
+
* @example
|
|
498
|
+
* ```typescript
|
|
499
|
+
* // Download entire object
|
|
500
|
+
* const download = await project.downloadObject('my-bucket', 'file.txt');
|
|
501
|
+
* const buffer = Buffer.alloc(1024);
|
|
502
|
+
* let totalBytes = 0;
|
|
503
|
+
* let result;
|
|
504
|
+
* do {
|
|
505
|
+
* result = await download.read(buffer, buffer.length);
|
|
506
|
+
* totalBytes += result.bytesRead;
|
|
507
|
+
* } while (result.bytesRead > 0);
|
|
508
|
+
* await download.close();
|
|
509
|
+
*
|
|
510
|
+
* // Download with offset and length (partial download)
|
|
511
|
+
* const download = await project.downloadObject('my-bucket', 'large-file.bin', {
|
|
512
|
+
* offset: 1000,
|
|
513
|
+
* length: 500
|
|
514
|
+
* });
|
|
515
|
+
* const chunk = Buffer.alloc(500);
|
|
516
|
+
* await download.read(chunk, chunk.length);
|
|
517
|
+
* await download.close();
|
|
518
|
+
* ```
|
|
519
|
+
*/
|
|
520
|
+
async downloadObject(bucketName, objectKey, options) {
|
|
521
|
+
this.validateOpen();
|
|
522
|
+
this.validateBucketName(bucketName);
|
|
523
|
+
this.validateObjectKey(objectKey);
|
|
524
|
+
const result = (await native_1.native.downloadObject(this._handle, bucketName, objectKey, options));
|
|
525
|
+
return new download_1.DownloadResultStruct(result.downloadHandle);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
exports.ProjectResultStruct = ProjectResultStruct;
|
|
529
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/project/index.ts"],"names":[],"mappings":"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"}
|