@oxyhq/services 5.10.6 → 5.10.8

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.
@@ -1 +0,0 @@
1
- {"version":3,"names":["_clientS","require","_s3RequestPresigner","S3FileManagerRN","constructor","config","s3Client","S3Client","region","credentials","accessKeyId","secretAccessKey","bucketName","uploadFile","key","file","options","body","contentType","isRNFile","rnFileToBuffer","type","command","PutObjectCommand","Bucket","Key","Body","ContentType","Metadata","metadata","ACL","publicRead","send","downloadFile","GetObjectCommand","response","Error","chunks","reader","transformToWebStream","getReader","done","value","read","push","Buffer","concat","deleteFile","DeleteObjectCommand","getPresignedUploadUrl","expiresIn","getSignedUrl","getPresignedDownloadUrl","listFiles","prefix","maxKeys","ListObjectsV2Command","Prefix","MaxKeys","Contents","map","item","size","Size","lastModified","LastModified","fileExists","error","name","getFileMetadata","parseInt","ContentLength","toString","fetch","uri","arrayBuffer","from","uploadMultipleFiles","files","uploadPromises","Promise","all","deleteMultipleFiles","keys","deletePromises","copyFile","sourceKey","destinationKey","moveFile","uploadImage","getFileSize","method","contentLength","headers","get","console","warn","exports","createS3FileManagerRN"],"sourceRoot":"../../../src","sources":["utils/s3FileManagerRN.ts"],"mappings":"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","ignoreList":[]}
@@ -1,237 +0,0 @@
1
- "use strict";
2
-
3
- import { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, ListObjectsV2Command } from '@aws-sdk/client-s3';
4
- import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
5
- export class S3FileManager {
6
- constructor(config) {
7
- this.s3Client = new S3Client({
8
- region: config.region,
9
- credentials: {
10
- accessKeyId: config.accessKeyId,
11
- secretAccessKey: config.secretAccessKey
12
- }
13
- });
14
- this.bucketName = config.bucketName;
15
- }
16
-
17
- /**
18
- * Upload a file to S3
19
- */
20
- async uploadFile(key, file, options = {}) {
21
- let body;
22
- let contentType = options.contentType;
23
- if (file instanceof File) {
24
- body = await this.fileToBuffer(file);
25
- contentType = contentType || file.type;
26
- } else if (typeof file === 'string') {
27
- body = file;
28
- contentType = contentType || 'text/plain';
29
- } else {
30
- body = file;
31
- contentType = contentType || 'application/octet-stream';
32
- }
33
- const command = new PutObjectCommand({
34
- Bucket: this.bucketName,
35
- Key: key,
36
- Body: body,
37
- ContentType: contentType,
38
- Metadata: options.metadata,
39
- ACL: options.publicRead ? 'public-read' : 'private'
40
- });
41
- await this.s3Client.send(command);
42
- return `https://${this.bucketName}.s3.amazonaws.com/${key}`;
43
- }
44
-
45
- /**
46
- * Download a file from S3
47
- */
48
- async downloadFile(key) {
49
- const command = new GetObjectCommand({
50
- Bucket: this.bucketName,
51
- Key: key
52
- });
53
- const response = await this.s3Client.send(command);
54
- if (!response.Body) {
55
- throw new Error('File not found or empty');
56
- }
57
-
58
- // Convert stream to buffer
59
- const chunks = [];
60
- const reader = response.Body.transformToWebStream().getReader();
61
- while (true) {
62
- const {
63
- done,
64
- value
65
- } = await reader.read();
66
- if (done) break;
67
- chunks.push(value);
68
- }
69
- return Buffer.concat(chunks);
70
- }
71
-
72
- /**
73
- * Delete a file from S3
74
- */
75
- async deleteFile(key) {
76
- const command = new DeleteObjectCommand({
77
- Bucket: this.bucketName,
78
- Key: key
79
- });
80
- await this.s3Client.send(command);
81
- }
82
-
83
- /**
84
- * Generate a presigned URL for file upload
85
- */
86
- async getPresignedUploadUrl(key, contentType, expiresIn = 3600) {
87
- const command = new PutObjectCommand({
88
- Bucket: this.bucketName,
89
- Key: key,
90
- ContentType: contentType
91
- });
92
- return getSignedUrl(this.s3Client, command, {
93
- expiresIn
94
- });
95
- }
96
-
97
- /**
98
- * Generate a presigned URL for file download
99
- */
100
- async getPresignedDownloadUrl(key, expiresIn = 3600) {
101
- const command = new GetObjectCommand({
102
- Bucket: this.bucketName,
103
- Key: key
104
- });
105
- return getSignedUrl(this.s3Client, command, {
106
- expiresIn
107
- });
108
- }
109
-
110
- /**
111
- * List files in a directory
112
- */
113
- async listFiles(prefix = '', maxKeys = 1000) {
114
- const command = new ListObjectsV2Command({
115
- Bucket: this.bucketName,
116
- Prefix: prefix,
117
- MaxKeys: maxKeys
118
- });
119
- const response = await this.s3Client.send(command);
120
- if (!response.Contents) {
121
- return [];
122
- }
123
- return response.Contents.map(item => ({
124
- key: item.Key,
125
- size: item.Size || 0,
126
- lastModified: item.LastModified
127
- }));
128
- }
129
-
130
- /**
131
- * Check if a file exists
132
- */
133
- async fileExists(key) {
134
- try {
135
- const command = new GetObjectCommand({
136
- Bucket: this.bucketName,
137
- Key: key
138
- });
139
- await this.s3Client.send(command);
140
- return true;
141
- } catch (error) {
142
- if (error.name === 'NoSuchKey') {
143
- return false;
144
- }
145
- throw error;
146
- }
147
- }
148
-
149
- /**
150
- * Get file metadata
151
- */
152
- async getFileMetadata(key) {
153
- try {
154
- const command = new GetObjectCommand({
155
- Bucket: this.bucketName,
156
- Key: key
157
- });
158
- const response = await this.s3Client.send(command);
159
- return {
160
- key,
161
- size: parseInt(response.ContentLength?.toString() || '0'),
162
- lastModified: response.LastModified,
163
- contentType: response.ContentType,
164
- metadata: response.Metadata
165
- };
166
- } catch (error) {
167
- if (error.name === 'NoSuchKey') {
168
- return null;
169
- }
170
- throw error;
171
- }
172
- }
173
-
174
- /**
175
- * Convert File object to Buffer (for React Native compatibility)
176
- */
177
- async fileToBuffer(file) {
178
- return new Promise((resolve, reject) => {
179
- const reader = new FileReader();
180
- reader.onload = () => {
181
- if (reader.result instanceof ArrayBuffer) {
182
- resolve(Buffer.from(reader.result));
183
- } else {
184
- reject(new Error('Failed to read file'));
185
- }
186
- };
187
- reader.onerror = () => reject(reader.error);
188
- reader.readAsArrayBuffer(file);
189
- });
190
- }
191
-
192
- /**
193
- * Upload multiple files
194
- */
195
- async uploadMultipleFiles(files) {
196
- const uploadPromises = files.map(({
197
- key,
198
- file,
199
- options
200
- }) => this.uploadFile(key, file, options));
201
- return Promise.all(uploadPromises);
202
- }
203
-
204
- /**
205
- * Delete multiple files
206
- */
207
- async deleteMultipleFiles(keys) {
208
- const deletePromises = keys.map(key => this.deleteFile(key));
209
- await Promise.all(deletePromises);
210
- }
211
-
212
- /**
213
- * Copy file from one key to another
214
- */
215
- async copyFile(sourceKey, destinationKey) {
216
- const command = new PutObjectCommand({
217
- Bucket: this.bucketName,
218
- Key: destinationKey,
219
- Body: await this.downloadFile(sourceKey)
220
- });
221
- await this.s3Client.send(command);
222
- }
223
-
224
- /**
225
- * Move file (copy + delete)
226
- */
227
- async moveFile(sourceKey, destinationKey) {
228
- await this.copyFile(sourceKey, destinationKey);
229
- await this.deleteFile(sourceKey);
230
- }
231
- }
232
-
233
- // Export a factory function for easier configuration
234
- export function createS3FileManager(config) {
235
- return new S3FileManager(config);
236
- }
237
- //# sourceMappingURL=s3FileManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["S3Client","PutObjectCommand","GetObjectCommand","DeleteObjectCommand","ListObjectsV2Command","getSignedUrl","S3FileManager","constructor","config","s3Client","region","credentials","accessKeyId","secretAccessKey","bucketName","uploadFile","key","file","options","body","contentType","File","fileToBuffer","type","command","Bucket","Key","Body","ContentType","Metadata","metadata","ACL","publicRead","send","downloadFile","response","Error","chunks","reader","transformToWebStream","getReader","done","value","read","push","Buffer","concat","deleteFile","getPresignedUploadUrl","expiresIn","getPresignedDownloadUrl","listFiles","prefix","maxKeys","Prefix","MaxKeys","Contents","map","item","size","Size","lastModified","LastModified","fileExists","error","name","getFileMetadata","parseInt","ContentLength","toString","Promise","resolve","reject","FileReader","onload","result","ArrayBuffer","from","onerror","readAsArrayBuffer","uploadMultipleFiles","files","uploadPromises","all","deleteMultipleFiles","keys","deletePromises","copyFile","sourceKey","destinationKey","moveFile","createS3FileManager"],"sourceRoot":"../../../src","sources":["utils/s3FileManager.ts"],"mappings":"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","ignoreList":[]}
@@ -1,400 +0,0 @@
1
- "use strict";
2
-
3
- /**
4
- * S3 File Management Examples
5
- *
6
- * This file demonstrates how to use the S3 file management functionality
7
- * in both web and React Native environments.
8
- */
9
-
10
- import { createS3FileManager } from './s3FileManager';
11
- import { createS3FileManagerRN } from './s3FileManagerRN';
12
-
13
- // Example configuration
14
- const s3Config = {
15
- region: 'us-east-1',
16
- accessKeyId: 'your-access-key-id',
17
- secretAccessKey: 'your-secret-access-key',
18
- bucketName: 'your-bucket-name'
19
- };
20
-
21
- // ============================================================================
22
- // WEB ENVIRONMENT EXAMPLES
23
- // ============================================================================
24
-
25
- export class WebFileManagerExample {
26
- constructor() {
27
- this.s3Manager = createS3FileManager(s3Config);
28
- }
29
-
30
- /**
31
- * Example: Upload a file from web form
32
- */
33
- async uploadFileFromForm(fileInput) {
34
- const file = fileInput.files?.[0];
35
- if (!file) {
36
- throw new Error('No file selected');
37
- }
38
- const key = `uploads/${Date.now()}-${file.name}`;
39
- const uploadOptions = {
40
- contentType: file.type,
41
- metadata: {
42
- originalName: file.name,
43
- uploadedBy: 'web-user',
44
- uploadedAt: new Date().toISOString()
45
- },
46
- publicRead: false
47
- };
48
- try {
49
- const url = await this.s3Manager.uploadFile(key, file, uploadOptions);
50
- console.log('File uploaded successfully:', url);
51
- return url;
52
- } catch (error) {
53
- console.error('Upload failed:', error);
54
- throw error;
55
- }
56
- }
57
-
58
- /**
59
- * Example: Upload multiple files
60
- */
61
- async uploadMultipleFiles(fileList) {
62
- const files = Array.from(fileList).map(file => ({
63
- key: `uploads/${Date.now()}-${file.name}`,
64
- file,
65
- options: {
66
- contentType: file.type,
67
- metadata: {
68
- originalName: file.name,
69
- uploadedBy: 'web-user',
70
- uploadedAt: new Date().toISOString()
71
- },
72
- publicRead: false
73
- }
74
- }));
75
- try {
76
- const urls = await this.s3Manager.uploadMultipleFiles(files);
77
- console.log('Files uploaded successfully:', urls);
78
- return urls;
79
- } catch (error) {
80
- console.error('Upload failed:', error);
81
- throw error;
82
- }
83
- }
84
-
85
- /**
86
- * Example: Download a file
87
- */
88
- async downloadFile(key) {
89
- try {
90
- const buffer = await this.s3Manager.downloadFile(key);
91
-
92
- // Create a blob and download link
93
- const blob = new Blob([buffer]);
94
- const url = URL.createObjectURL(blob);
95
- const a = document.createElement('a');
96
- a.href = url;
97
- a.download = key.split('/').pop() || 'download';
98
- document.body.appendChild(a);
99
- a.click();
100
- document.body.removeChild(a);
101
- URL.revokeObjectURL(url);
102
- console.log('File downloaded successfully');
103
- } catch (error) {
104
- console.error('Download failed:', error);
105
- throw error;
106
- }
107
- }
108
-
109
- /**
110
- * Example: Get presigned URLs
111
- */
112
- async getPresignedUrls(key) {
113
- try {
114
- const uploadUrl = await this.s3Manager.getPresignedUploadUrl(key, 'application/octet-stream');
115
- const downloadUrl = await this.s3Manager.getPresignedDownloadUrl(key);
116
- return {
117
- upload: uploadUrl,
118
- download: downloadUrl
119
- };
120
- } catch (error) {
121
- console.error('Failed to get presigned URLs:', error);
122
- throw error;
123
- }
124
- }
125
-
126
- /**
127
- * Example: List files with pagination
128
- */
129
- async listFiles(prefix = '', maxKeys = 50) {
130
- try {
131
- const files = await this.s3Manager.listFiles(prefix, maxKeys);
132
- console.log('Files found:', files);
133
- files.forEach(file => {
134
- console.log(`- ${file.key} (${file.size} bytes, modified: ${file.lastModified})`);
135
- });
136
- } catch (error) {
137
- console.error('Failed to list files:', error);
138
- throw error;
139
- }
140
- }
141
-
142
- /**
143
- * Example: File operations (copy, move, delete)
144
- */
145
- async performFileOperations() {
146
- const sourceKey = 'uploads/source-file.txt';
147
- const destKey = 'uploads/destination-file.txt';
148
- try {
149
- // Copy file
150
- await this.s3Manager.copyFile(sourceKey, destKey);
151
- console.log('File copied successfully');
152
-
153
- // Move file
154
- await this.s3Manager.moveFile(destKey, 'uploads/moved-file.txt');
155
- console.log('File moved successfully');
156
-
157
- // Delete file
158
- await this.s3Manager.deleteFile('uploads/moved-file.txt');
159
- console.log('File deleted successfully');
160
- } catch (error) {
161
- console.error('File operation failed:', error);
162
- throw error;
163
- }
164
- }
165
- }
166
-
167
- // ============================================================================
168
- // REACT NATIVE ENVIRONMENT EXAMPLES
169
- // ============================================================================
170
-
171
- export class ReactNativeFileManagerExample {
172
- constructor() {
173
- this.s3Manager = createS3FileManagerRN(s3Config);
174
- }
175
-
176
- /**
177
- * Example: Upload a file from React Native
178
- */
179
- async uploadFileFromRN(fileInfo) {
180
- const key = `uploads/${Date.now()}-${fileInfo.name}`;
181
- const uploadOptions = {
182
- contentType: fileInfo.type || 'application/octet-stream',
183
- metadata: {
184
- originalName: fileInfo.name,
185
- uploadedBy: 'rn-user',
186
- uploadedAt: new Date().toISOString(),
187
- fileSize: fileInfo.size?.toString() || '0'
188
- },
189
- publicRead: false
190
- };
191
- try {
192
- const url = await this.s3Manager.uploadFile(key, fileInfo, uploadOptions);
193
- console.log('File uploaded successfully:', url);
194
- return url;
195
- } catch (error) {
196
- console.error('Upload failed:', error);
197
- throw error;
198
- }
199
- }
200
-
201
- /**
202
- * Example: Upload image with size validation
203
- */
204
- async uploadImageWithValidation(fileInfo, maxSize = 5 * 1024 * 1024) {
205
- // Get file size
206
- const fileSize = await this.s3Manager.getFileSize(fileInfo);
207
- if (fileSize > maxSize) {
208
- throw new Error(`File size (${fileSize} bytes) exceeds maximum allowed size (${maxSize} bytes)`);
209
- }
210
- const key = `images/${Date.now()}-${fileInfo.name}`;
211
- const uploadOptions = {
212
- contentType: fileInfo.type || 'image/jpeg',
213
- metadata: {
214
- originalName: fileInfo.name,
215
- uploadedBy: 'rn-user',
216
- uploadedAt: new Date().toISOString(),
217
- fileSize: fileSize.toString(),
218
- category: 'image'
219
- },
220
- publicRead: true // Images are often public
221
- };
222
- try {
223
- const url = await this.s3Manager.uploadImage(key, fileInfo, uploadOptions);
224
- console.log('Image uploaded successfully:', url);
225
- return url;
226
- } catch (error) {
227
- console.error('Image upload failed:', error);
228
- throw error;
229
- }
230
- }
231
-
232
- /**
233
- * Example: Download file to React Native
234
- */
235
- async downloadFileToRN(key) {
236
- try {
237
- const buffer = await this.s3Manager.downloadFile(key);
238
- console.log('File downloaded successfully, size:', buffer.length);
239
- return buffer;
240
- } catch (error) {
241
- console.error('Download failed:', error);
242
- throw error;
243
- }
244
- }
245
-
246
- /**
247
- * Example: Batch operations
248
- */
249
- async performBatchOperations(files) {
250
- try {
251
- // Upload multiple files
252
- const uploadPromises = files.map((file, index) => {
253
- const key = `batch-uploads/${Date.now()}-${index}-${file.name}`;
254
- return this.s3Manager.uploadFile(key, file, {
255
- metadata: {
256
- batchId: Date.now().toString()
257
- }
258
- });
259
- });
260
- const uploadedUrls = await Promise.all(uploadPromises);
261
- console.log('Batch upload completed:', uploadedUrls);
262
-
263
- // Delete multiple files (example with keys)
264
- const keysToDelete = uploadedUrls.map(url => {
265
- const key = url.split('/').pop();
266
- return `batch-uploads/${key}`;
267
- });
268
- await this.s3Manager.deleteMultipleFiles(keysToDelete);
269
- console.log('Batch delete completed');
270
- } catch (error) {
271
- console.error('Batch operations failed:', error);
272
- throw error;
273
- }
274
- }
275
- }
276
-
277
- // ============================================================================
278
- // USAGE EXAMPLES
279
- // ============================================================================
280
-
281
- /**
282
- * Example usage in a React component
283
- */
284
- export const useS3FileManager = () => {
285
- const webManager = new WebFileManagerExample();
286
- const rnManager = new ReactNativeFileManagerExample();
287
- const handleFileUpload = async file => {
288
- try {
289
- if ('uri' in file) {
290
- // React Native file
291
- return await rnManager.uploadFileFromRN(file);
292
- } else {
293
- // Web file
294
- const mockInput = {
295
- files: [file]
296
- };
297
- return await webManager.uploadFileFromForm(mockInput);
298
- }
299
- } catch (error) {
300
- console.error('Upload failed:', error);
301
- throw error;
302
- }
303
- };
304
- const handleFileDownload = async key => {
305
- try {
306
- if (typeof window !== 'undefined') {
307
- // Web environment
308
- await webManager.downloadFile(key);
309
- } else {
310
- // React Native environment
311
- const buffer = await rnManager.downloadFileToRN(key);
312
- // Handle buffer in React Native (save to file system, etc.)
313
- return buffer;
314
- }
315
- } catch (error) {
316
- console.error('Download failed:', error);
317
- throw error;
318
- }
319
- };
320
- return {
321
- uploadFile: handleFileUpload,
322
- downloadFile: handleFileDownload,
323
- listFiles: webManager.listFiles.bind(webManager),
324
- getPresignedUrls: webManager.getPresignedUrls.bind(webManager)
325
- };
326
- };
327
-
328
- /**
329
- * Example: Error handling and retry logic
330
- */
331
- export const uploadWithRetry = async (s3Manager, key, file, options = {}, maxRetries = 3) => {
332
- // Type guard to determine which manager we're using
333
- const isRNManager = manager => {
334
- return 'getFileSize' in manager;
335
- };
336
- let lastError;
337
- for (let attempt = 1; attempt <= maxRetries; attempt++) {
338
- try {
339
- if (isRNManager(s3Manager)) {
340
- // For React Native manager, ensure file is RNFile
341
- if ('uri' in file) {
342
- return await s3Manager.uploadFile(key, file, options);
343
- } else {
344
- throw new Error('React Native manager requires RNFile with uri property');
345
- }
346
- } else {
347
- // For web manager, ensure file is not RNFile
348
- if ('uri' in file) {
349
- throw new Error('Web manager does not support RNFile');
350
- } else {
351
- return await s3Manager.uploadFile(key, file, options);
352
- }
353
- }
354
- } catch (error) {
355
- lastError = error;
356
- console.warn(`Upload attempt ${attempt} failed:`, error);
357
- if (attempt < maxRetries) {
358
- // Wait before retrying (exponential backoff)
359
- const delay = Math.pow(2, attempt) * 1000;
360
- await new Promise(resolve => setTimeout(resolve, delay));
361
- }
362
- }
363
- }
364
- throw new Error(`Upload failed after ${maxRetries} attempts. Last error: ${lastError?.message || 'Unknown error'}`);
365
- };
366
-
367
- /**
368
- * Example: File validation utilities
369
- */
370
- export const validateFile = (file, options = {}) => {
371
- const errors = [];
372
- const {
373
- maxSize = 10 * 1024 * 1024,
374
- allowedTypes = [],
375
- allowedExtensions = []
376
- } = options;
377
-
378
- // Check file size
379
- if ('size' in file && file.size && file.size > maxSize) {
380
- errors.push(`File size (${file.size} bytes) exceeds maximum allowed size (${maxSize} bytes)`);
381
- }
382
-
383
- // Check file type
384
- if ('type' in file && file.type && allowedTypes.length > 0 && !allowedTypes.includes(file.type)) {
385
- errors.push(`File type (${file.type}) is not allowed`);
386
- }
387
-
388
- // Check file extension
389
- if (allowedExtensions.length > 0) {
390
- const extension = file.name.split('.').pop()?.toLowerCase();
391
- if (!extension || !allowedExtensions.includes(`.${extension}`)) {
392
- errors.push(`File extension (.${extension}) is not allowed`);
393
- }
394
- }
395
- return {
396
- isValid: errors.length === 0,
397
- errors
398
- };
399
- };
400
- //# sourceMappingURL=s3FileManagerExample.js.map