fix(core): update
This commit is contained in:
		| @@ -3,6 +3,6 @@ | ||||
|  */ | ||||
| export const commitinfo = { | ||||
|   name: '@push.rocks/smartbucket', | ||||
|   version: '3.0.3', | ||||
|   version: '3.0.4', | ||||
|   description: 'A TypeScript library that offers simple, cloud-independent object storage with features like bucket creation, file management, and directory management.' | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| import * as plugins from './smartbucket.plugins.js'; | ||||
| import { SmartBucket } from './smartbucket.classes.smartbucket.js'; | ||||
| import { Directory } from './smartbucket.classes.directory.js'; | ||||
| import * as plugins from './plugins.js'; | ||||
| import { SmartBucket } from './classes.smartbucket.js'; | ||||
| import { Directory } from './classes.directory.js'; | ||||
| 
 | ||||
| export class Bucket { | ||||
|   public static async getBucketByName(smartbucketRef: SmartBucket, bucketNameArg: string) { | ||||
| @@ -52,15 +52,35 @@ export class Bucket { | ||||
|   public async fastPut(optionsArg: { | ||||
|     path: string; | ||||
|     contents: string | Buffer; | ||||
|     overwrite?: boolean; | ||||
|   }): Promise<void> { | ||||
|     const streamIntake = new plugins.smartstream.StreamIntake(); | ||||
|     const putPromise = this.smartbucketRef.minioClient | ||||
|       .putObject(this.name, optionsArg.path, streamIntake) | ||||
|       .catch((e) => console.log(e)); | ||||
|     streamIntake.pushData(optionsArg.contents); | ||||
|     streamIntake.signalEnd(); | ||||
|     const response = await putPromise; | ||||
|     try { | ||||
|       // Check if the object already exists
 | ||||
|       const exists = await this.fastExists({ path: optionsArg.path }); | ||||
|    | ||||
|       if (exists && !optionsArg.overwrite) { | ||||
|         console.error(`Object already exists at path '${optionsArg.path}' in bucket '${this.name}'.`); | ||||
|         return; | ||||
|       } else if (exists && optionsArg.overwrite) { | ||||
|         console.log(`Overwriting existing object at path '${optionsArg.path}' in bucket '${this.name}'.`); | ||||
|       } else { | ||||
|         console.log(`Creating new object at path '${optionsArg.path}' in bucket '${this.name}'.`); | ||||
|       } | ||||
|    | ||||
|       // Proceed with putting the object
 | ||||
|       const streamIntake = new plugins.smartstream.StreamIntake(); | ||||
|       const putPromise = this.smartbucketRef.minioClient.putObject(this.name, optionsArg.path, streamIntake); | ||||
|       streamIntake.pushData(optionsArg.contents); | ||||
|       streamIntake.signalEnd(); | ||||
|       await putPromise; | ||||
|    | ||||
|       console.log(`Object '${optionsArg.path}' has been successfully stored in bucket '${this.name}'.`); | ||||
|     } catch (error) { | ||||
|       console.error(`Error storing object at path '${optionsArg.path}' in bucket '${this.name}':`, error); | ||||
|       throw error; | ||||
|     } | ||||
|   } | ||||
|    | ||||
| 
 | ||||
|   /** | ||||
|    * get file | ||||
| @@ -126,20 +146,42 @@ export class Bucket { | ||||
|     path: string; | ||||
|     dataStream: plugins.stream.Readable; | ||||
|     nativeMetadata?: { [key: string]: string }; | ||||
|     overwrite?: boolean; | ||||
|   }): Promise<void> { | ||||
|     await this.smartbucketRef.minioClient.putObject( | ||||
|       this.name, | ||||
|       optionsArg.path, | ||||
|       optionsArg.dataStream, | ||||
|       null, | ||||
|       ...(optionsArg.nativeMetadata | ||||
|         ? (() => { | ||||
|             const returnObject: any = {}; | ||||
|             return returnObject; | ||||
|           })() | ||||
|         : {}) | ||||
|     ); | ||||
|     try { | ||||
|       // Check if the object already exists
 | ||||
|       const exists = await this.fastExists({ path: optionsArg.path }); | ||||
|    | ||||
|       if (exists && !optionsArg.overwrite) { | ||||
|         console.error(`Object already exists at path '${optionsArg.path}' in bucket '${this.name}'.`); | ||||
|         return; | ||||
|       } else if (exists && optionsArg.overwrite) { | ||||
|         console.log(`Overwriting existing object at path '${optionsArg.path}' in bucket '${this.name}'.`); | ||||
|       } else { | ||||
|         console.log(`Creating new object at path '${optionsArg.path}' in bucket '${this.name}'.`); | ||||
|       } | ||||
|    | ||||
|       // Proceed with putting the object
 | ||||
|       await this.smartbucketRef.minioClient.putObject( | ||||
|         this.name, | ||||
|         optionsArg.path, | ||||
|         optionsArg.dataStream, | ||||
|         null, | ||||
|         ...(optionsArg.nativeMetadata | ||||
|           ? (() => { | ||||
|               const returnObject: any = {}; | ||||
|               return returnObject; | ||||
|             })() | ||||
|           : {}) | ||||
|       ); | ||||
|    | ||||
|       console.log(`Object '${optionsArg.path}' has been successfully stored in bucket '${this.name}'.`); | ||||
|     } catch (error) { | ||||
|       console.error(`Error storing object at path '${optionsArg.path}' in bucket '${this.name}':`, error); | ||||
|       throw error; | ||||
|     } | ||||
|   } | ||||
|    | ||||
| 
 | ||||
|   public async copyObject(optionsArg: { | ||||
|     /** | ||||
| @@ -198,7 +240,12 @@ export class Bucket { | ||||
|     await this.smartbucketRef.minioClient.removeObject(this.name, optionsArg.path); | ||||
|   } | ||||
| 
 | ||||
|   public async doesObjectExist(optionsArg: { | ||||
|   /** | ||||
|    * check wether file exists | ||||
|    * @param optionsArg | ||||
|    * @returns  | ||||
|    */ | ||||
|   public async fastExists(optionsArg: { | ||||
|     path: string; | ||||
|   }): Promise<boolean> { | ||||
|     try { | ||||
| @@ -215,4 +262,10 @@ export class Bucket { | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   public async fastStat(optionsArg: { | ||||
|     path: string; | ||||
|   }) { | ||||
|     return this.smartbucketRef.minioClient.statObject(this.name, optionsArg.path); | ||||
|   } | ||||
| } | ||||
| @@ -1,6 +1,6 @@ | ||||
| import * as plugins from './smartbucket.plugins.js'; | ||||
| import { Bucket } from './smartbucket.classes.bucket.js'; | ||||
| import { File } from './smartbucket.classes.file.js'; | ||||
| import * as plugins from './plugins.js'; | ||||
| import { Bucket } from './classes.bucket.js'; | ||||
| import { File } from './classes.file.js'; | ||||
| 
 | ||||
| export class Directory { | ||||
|   public bucketRef: Bucket; | ||||
| @@ -59,6 +59,32 @@ export class Directory { | ||||
|     return basePath; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * gets a file by name | ||||
|    */ | ||||
|   public async getFile(optionsArg: { | ||||
|     name: string; | ||||
|     createWithContents?: string | Buffer; | ||||
|   }): Promise<File> { | ||||
|     // check wether the file exists
 | ||||
|     const exists = await this.bucketRef.fastExists({ | ||||
|       path: this.getBasePath() + optionsArg.name, | ||||
|     }); | ||||
|     if (!exists && !optionsArg.createWithContents) { | ||||
|       return null; | ||||
|     } | ||||
|     if (!exists && optionsArg.createWithContents) { | ||||
|       await this.fastPut({ | ||||
|         path: optionsArg.name, | ||||
|         contents: optionsArg.createWithContents, | ||||
|       }); | ||||
|     } | ||||
|     return new File({ | ||||
|       directoryRefArg: this, | ||||
|       fileName: optionsArg.name, | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * lists all files | ||||
|    */ | ||||
							
								
								
									
										154
									
								
								ts/classes.file.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								ts/classes.file.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,154 @@ | ||||
| import * as plugins from './plugins.js'; | ||||
| import { Directory } from './classes.directory.js'; | ||||
| import { MetaData } from './classes.metadata.js'; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * represents a file in a directory | ||||
|  */ | ||||
| export class File { | ||||
|   // STATIC | ||||
|  | ||||
|   /** | ||||
|    * creates a file in draft mode | ||||
|    * you need to call .save() to store it in s3 | ||||
|    * @param optionsArg | ||||
|    */ | ||||
|   public static async create(optionsArg: { | ||||
|     directory: Directory; | ||||
|     name: string; | ||||
|     contents: Buffer | string | plugins.stream.Readable; | ||||
|     /** | ||||
|      * if contents are of type string, you can specify the encoding here | ||||
|      */ | ||||
|     encoding?: 'utf8' | 'binary'; | ||||
|   }): Promise<File> { | ||||
|     const contents = | ||||
|       typeof optionsArg.contents === 'string' | ||||
|         ? Buffer.from(optionsArg.contents, optionsArg.encoding) | ||||
|         : optionsArg.contents; | ||||
|     const file = new File({ | ||||
|       directoryRefArg: optionsArg.directory, | ||||
|       fileName: optionsArg.name, | ||||
|     }); | ||||
|     if (contents instanceof plugins.stream.Readable) {} else { | ||||
|       await optionsArg.directory.fastPut({ | ||||
|         path: optionsArg.name, | ||||
|         contents: contents, | ||||
|       }); | ||||
|     } | ||||
|     return file; | ||||
|   } | ||||
|  | ||||
|   // INSTANCE | ||||
|   public parentDirectoryRef: Directory; | ||||
|   public name: string; | ||||
|  | ||||
|   public getBasePath(): string { | ||||
|     return plugins.path.join(this.parentDirectoryRef.getBasePath(), this.name); | ||||
|   }; | ||||
|  | ||||
|   constructor(optionsArg: { directoryRefArg: Directory; fileName: string }) { | ||||
|     this.parentDirectoryRef = optionsArg.directoryRefArg; | ||||
|     this.name = optionsArg.fileName; | ||||
|   } | ||||
|  | ||||
|   public async getContentsAsString(): Promise<string> { | ||||
|     const fileBuffer = await this.getContents(); | ||||
|     return fileBuffer.toString(); | ||||
|   } | ||||
|  | ||||
|   public async getContents(): Promise<Buffer> { | ||||
|     const resultBuffer = await this.parentDirectoryRef.bucketRef.fastGet({ | ||||
|       path: this.getBasePath(), | ||||
|     }); | ||||
|     return resultBuffer; | ||||
|   } | ||||
|  | ||||
|   public async getReadStream() { | ||||
|     const readStream = this.parentDirectoryRef.bucketRef.fastGetStream({ | ||||
|       path: this.getBasePath(), | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * removes this file | ||||
|    * for using recycling mechanics use .delete() | ||||
|    */ | ||||
|   public async remove() { | ||||
|     await this.parentDirectoryRef.bucketRef.fastRemove({ | ||||
|       path: this.getBasePath(), | ||||
|     }); | ||||
|     if (!this.name.endsWith('.metadata')) { | ||||
|       await this.parentDirectoryRef.bucketRef.fastRemove({ | ||||
|         path: this.getBasePath() + '.metadata', | ||||
|       }); | ||||
|     } | ||||
|     await this.parentDirectoryRef.listFiles(); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * deletes the file with recycling mechanics | ||||
|    */ | ||||
|   public async delete() { | ||||
|     await this.remove(); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * allows locking the file | ||||
|    * @param optionsArg | ||||
|    */ | ||||
|   public async lock(optionsArg?: { timeoutMillis?: number }) { | ||||
|     const metadata = await this.getMetaData(); | ||||
|     await metadata.setLock({ | ||||
|       lock: 'locked', | ||||
|       expires: new Date(Date.now() + (optionsArg?.timeoutMillis || 1000)), | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * actively unlocks a file | ||||
|    * | ||||
|    */ | ||||
|   public async unlock(optionsArg?: { | ||||
|     /** | ||||
|      * unlock the file even if not locked from this instance | ||||
|      */ | ||||
|     force?: boolean; | ||||
|   }) { | ||||
|  | ||||
|   } | ||||
|  | ||||
|   public async updateWithContents(optionsArg: { | ||||
|     contents: Buffer | string | plugins.stream.Readable; | ||||
|     encoding?: 'utf8' | 'binary'; | ||||
|   }) { | ||||
|     if (optionsArg.contents instanceof plugins.stream.Readable) { | ||||
|       await this.parentDirectoryRef.bucketRef.fastPutStream({ | ||||
|         path: this.getBasePath(), | ||||
|         dataStream: optionsArg.contents, | ||||
|       }); | ||||
|     } else if (Buffer.isBuffer(optionsArg.contents)) { | ||||
|       await this.parentDirectoryRef.bucketRef.fastPut({ | ||||
|         path: this.getBasePath(), | ||||
|         contents: optionsArg.contents, | ||||
|       }); | ||||
|     } else if (typeof optionsArg.contents === 'string') { | ||||
|       await this.parentDirectoryRef.bucketRef.fastPut({ | ||||
|         path: this.getBasePath(), | ||||
|         contents: Buffer.from(optionsArg.contents, optionsArg.encoding), | ||||
|       }); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * allows updating the metadata of a file | ||||
|    * @param updatedMetadata | ||||
|    */ | ||||
|   public async getMetaData() { | ||||
|     const metadata = await MetaData.createForFile({ | ||||
|       file: this, | ||||
|     }); | ||||
|     return metadata; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										105
									
								
								ts/classes.metadata.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								ts/classes.metadata.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| import * as plugins from './plugins.js'; | ||||
|  | ||||
| import { File } from './classes.file.js'; | ||||
|  | ||||
| export class MetaData { | ||||
|   // static | ||||
|   public static async createForFile(optionsArg: { | ||||
|     file: File; | ||||
|   }) { | ||||
|     const metaData = new MetaData(); | ||||
|     metaData.fileRef = optionsArg.file; | ||||
|  | ||||
|     // lets find the existing metadata file | ||||
|     metaData.metadataFile = await metaData.fileRef.parentDirectoryRef.getFile({ | ||||
|       name: metaData.fileRef.name + '.metadata', | ||||
|       createWithContents: '{}', | ||||
|     }); | ||||
|  | ||||
|     return metaData; | ||||
|   } | ||||
|  | ||||
|   // instance | ||||
|   /** | ||||
|    * the file that contains the metadata | ||||
|    */ | ||||
|   metadataFile: File; | ||||
|  | ||||
|   /** | ||||
|    * the file that the metadata is for | ||||
|    */ | ||||
|   fileRef: File; | ||||
|    | ||||
|   public async getFileType(optionsArg?: { | ||||
|     useFileExtension?: boolean; | ||||
|     useMagicBytes?: boolean; | ||||
|   }): Promise<string> { | ||||
|     if (optionsArg && optionsArg.useFileExtension || optionsArg.useFileExtension === undefined) { | ||||
|       return plugins.path.extname(this.fileRef.name); | ||||
|     } | ||||
|   }; | ||||
|    | ||||
|   /** | ||||
|    * gets the size of the fileRef | ||||
|    */ | ||||
|   public async getSizeInBytes(): Promise<number> { | ||||
|     const stat = await this.fileRef.parentDirectoryRef.bucketRef.fastStat({ | ||||
|       path: this.fileRef.getBasePath(), | ||||
|     }); | ||||
|     return stat.size; | ||||
|   }; | ||||
|  | ||||
|   private prefixCustomMetaData = 'custom_'; | ||||
|  | ||||
|   public async storeCustomMetaData<T = any>(optionsArg: { | ||||
|     key: string; | ||||
|     value: T; | ||||
|   }) { | ||||
|     const json = await this.metadataFile.getContentsAsString(); | ||||
|     const parsed = await JSON.parse(json); | ||||
|     parsed[this.prefixCustomMetaData + optionsArg.key] = optionsArg.value; | ||||
|     await this.metadataFile.updateWithContents({ | ||||
|       contents: JSON.stringify(parsed), | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   public async getCustomMetaData<T = any>(optionsArg: { | ||||
|     key: string; | ||||
|   }): Promise<T> { | ||||
|     const json = await this.metadataFile.getContentsAsString(); | ||||
|     const parsed = await JSON.parse(json); | ||||
|     return parsed[this.prefixCustomMetaData + optionsArg.key]; | ||||
|   } | ||||
|  | ||||
|   public async deleteCustomMetaData(optionsArg: { | ||||
|     key: string; | ||||
|   }) { | ||||
|     const json = await this.metadataFile.getContentsAsString(); | ||||
|     const parsed = await JSON.parse(json); | ||||
|     delete parsed[this.prefixCustomMetaData + optionsArg.key]; | ||||
|     await this.metadataFile.updateWithContents({ | ||||
|       contents: JSON.stringify(parsed), | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * set a lock on the ref file | ||||
|    * @param optionsArg | ||||
|    */ | ||||
|   public async setLock(optionsArg: { | ||||
|     lock: string; | ||||
|     expires: Date; | ||||
|   }) { | ||||
|      | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * remove the lock on the ref file | ||||
|    * @param optionsArg  | ||||
|    */ | ||||
|   public async removeLock(optionsArg: { | ||||
|     force: boolean; | ||||
|   }) { | ||||
|  | ||||
|   } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| import * as plugins from './smartbucket.plugins.js'; | ||||
| import { Bucket } from './smartbucket.classes.bucket.js'; | ||||
| import * as plugins from './plugins.js'; | ||||
| import { Bucket } from './classes.bucket.js'; | ||||
| 
 | ||||
| export class SmartBucket { | ||||
|   public config: plugins.tsclass.storage.IS3Descriptor; | ||||
| @@ -1,4 +1,4 @@ | ||||
| export * from './smartbucket.classes.smartbucket.js'; | ||||
| export * from './smartbucket.classes.bucket.js'; | ||||
| export * from './smartbucket.classes.directory.js'; | ||||
| export * from './smartbucket.classes.file.js'; | ||||
| export * from './classes.smartbucket.js'; | ||||
| export * from './classes.bucket.js'; | ||||
| export * from './classes.directory.js'; | ||||
| export * from './classes.file.js'; | ||||
|   | ||||
| @@ -5,12 +5,13 @@ import * as stream from 'stream'; | ||||
| export { path, stream }; | ||||
| 
 | ||||
| // @push.rocks scope
 | ||||
| import * as smartmime from '@push.rocks/smartmime'; | ||||
| import * as smartpath from '@push.rocks/smartpath'; | ||||
| import * as smartpromise from '@push.rocks/smartpromise'; | ||||
| import * as smartrx from '@push.rocks/smartrx'; | ||||
| import * as smartstream from '@push.rocks/smartstream'; | ||||
| 
 | ||||
| export { smartpath, smartpromise, smartrx, smartstream }; | ||||
| export { smartmime, smartpath, smartpromise, smartrx, smartstream }; | ||||
| 
 | ||||
| // @tsclass
 | ||||
| import * as tsclass from '@tsclass/tsclass'; | ||||
| @@ -1,140 +0,0 @@ | ||||
| import * as plugins from './smartbucket.plugins.js'; | ||||
| import { Directory } from './smartbucket.classes.directory.js'; | ||||
|  | ||||
| export interface IFileMetaData { | ||||
|   name: string; | ||||
|   fileType: string; | ||||
|   size: string; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * represents a file in a directory | ||||
|  */ | ||||
| export class File { | ||||
|   // STATIC | ||||
|  | ||||
|   /** | ||||
|    * creates a file in draft mode | ||||
|    * you need to call .save() to store it in s3 | ||||
|    * @param optionsArg | ||||
|    */ | ||||
|   public static async create(optionsArg: { | ||||
|     directory: Directory; | ||||
|     name: string; | ||||
|     contents: Buffer | string | plugins.stream.Readable; | ||||
|     /** | ||||
|      * if contents are of type string, you can specify the encoding here | ||||
|      */ | ||||
|     encoding?: 'utf8' | 'binary'; | ||||
|   }): Promise<File> { | ||||
|     const contents = | ||||
|       typeof optionsArg.contents === 'string' | ||||
|         ? Buffer.from(optionsArg.contents, optionsArg.encoding) | ||||
|         : optionsArg.contents; | ||||
|     const file = new File({ | ||||
|       directoryRefArg: optionsArg.directory, | ||||
|       fileName: optionsArg.name, | ||||
|     }); | ||||
|     if (contents instanceof plugins.stream.Readable) {} else { | ||||
|       await optionsArg.directory.fastPut({ | ||||
|         path: optionsArg.name, | ||||
|         contents: contents, | ||||
|       }); | ||||
|     } | ||||
|     return file; | ||||
|   } | ||||
|  | ||||
|   // INSTANCE | ||||
|   public parentDirectoryRef: Directory; | ||||
|   public name: string; | ||||
|  | ||||
|   public path: string; | ||||
|   public metaData: IFileMetaData; | ||||
|  | ||||
|   constructor(optionsArg: { directoryRefArg: Directory; fileName: string }) { | ||||
|     this.parentDirectoryRef = optionsArg.directoryRefArg; | ||||
|     this.name = optionsArg.fileName; | ||||
|   } | ||||
|  | ||||
|   public async getContentAsString() { | ||||
|     const fileBuffer = await this.getContentAsBuffer(); | ||||
|     return fileBuffer.toString(); | ||||
|   } | ||||
|  | ||||
|   public async getContentAsBuffer() { | ||||
|     const done = plugins.smartpromise.defer(); | ||||
|     const fileStream = await this.parentDirectoryRef.bucketRef.smartbucketRef.minioClient | ||||
|       .getObject(this.parentDirectoryRef.bucketRef.name, this.path) | ||||
|       .catch((e) => console.log(e)); | ||||
|     let completeFile = Buffer.from(''); | ||||
|     const duplexStream = new plugins.smartstream.SmartDuplex<Buffer, Buffer>( | ||||
|       { | ||||
|         writeFunction: async (chunk) => { | ||||
|           completeFile = Buffer.concat([chunk]); | ||||
|           return chunk; | ||||
|         }, | ||||
|         finalFunction: async (cb) => { | ||||
|           done.resolve(); | ||||
|           return Buffer.from(''); | ||||
|         }, | ||||
|       } | ||||
|     ); | ||||
|  | ||||
|     if (!fileStream) { | ||||
|       return null; | ||||
|     } | ||||
|  | ||||
|     fileStream.pipe(duplexStream); | ||||
|     await done.promise; | ||||
|     return completeFile; | ||||
|   } | ||||
|  | ||||
|   public async readStreaming() { | ||||
|     // TODO | ||||
|     throw new Error('not yet implemented'); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * removes this file | ||||
|    */ | ||||
|   public async remove() { | ||||
|     await this.parentDirectoryRef.bucketRef.smartbucketRef.minioClient.removeObject( | ||||
|       this.parentDirectoryRef.bucketRef.name, | ||||
|       this.path | ||||
|     ); | ||||
|     await this.parentDirectoryRef.listFiles(); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * deletes the file | ||||
|    */ | ||||
|   public async delete() {} | ||||
|  | ||||
|   /** | ||||
|    * allows locking the file | ||||
|    * @param optionsArg | ||||
|    */ | ||||
|   public async lock(optionsArg?: { timeoutMillis?: number }) {} | ||||
|  | ||||
|   /** | ||||
|    * actively unlocks a file | ||||
|    * | ||||
|    */ | ||||
|   public async unlock(optionsArg?: { | ||||
|     /** | ||||
|      * unlock the file even if not locked from this instance | ||||
|      */ | ||||
|     force?: boolean; | ||||
|   }) {} | ||||
|  | ||||
|   public async updateWithContents(optionsArg: { | ||||
|     contents: Buffer | string | plugins.stream.Readable; | ||||
|     encoding?: 'utf8' | 'binary'; | ||||
|   }) {} | ||||
|  | ||||
|   /** | ||||
|    * allows updating the metadata of a file | ||||
|    * @param updatedMetadata | ||||
|    */ | ||||
|   public async updateMetaData(updatedMetadata: any) {} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user