You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					128 lines
				
				5.0 KiB
			
		
		
			
		
	
	
					128 lines
				
				5.0 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | Object.defineProperty(exports, "__esModule", { value: true }); | ||
|  | exports.GridFSBucket = void 0; | ||
|  | const error_1 = require("../error"); | ||
|  | const mongo_types_1 = require("../mongo_types"); | ||
|  | const write_concern_1 = require("../write_concern"); | ||
|  | const download_1 = require("./download"); | ||
|  | const upload_1 = require("./upload"); | ||
|  | const DEFAULT_GRIDFS_BUCKET_OPTIONS = { | ||
|  |     bucketName: 'fs', | ||
|  |     chunkSizeBytes: 255 * 1024 | ||
|  | }; | ||
|  | /** | ||
|  |  * Constructor for a streaming GridFS interface | ||
|  |  * @public | ||
|  |  */ | ||
|  | class GridFSBucket extends mongo_types_1.TypedEventEmitter { | ||
|  |     constructor(db, options) { | ||
|  |         super(); | ||
|  |         this.setMaxListeners(0); | ||
|  |         const privateOptions = { | ||
|  |             ...DEFAULT_GRIDFS_BUCKET_OPTIONS, | ||
|  |             ...options, | ||
|  |             writeConcern: write_concern_1.WriteConcern.fromOptions(options) | ||
|  |         }; | ||
|  |         this.s = { | ||
|  |             db, | ||
|  |             options: privateOptions, | ||
|  |             _chunksCollection: db.collection(privateOptions.bucketName + '.chunks'), | ||
|  |             _filesCollection: db.collection(privateOptions.bucketName + '.files'), | ||
|  |             checkedIndexes: false, | ||
|  |             calledOpenUploadStream: false | ||
|  |         }; | ||
|  |     } | ||
|  |     /** | ||
|  |      * Returns a writable stream (GridFSBucketWriteStream) for writing | ||
|  |      * buffers to GridFS. The stream's 'id' property contains the resulting | ||
|  |      * file's id. | ||
|  |      * | ||
|  |      * @param filename - The value of the 'filename' key in the files doc | ||
|  |      * @param options - Optional settings. | ||
|  |      */ | ||
|  |     openUploadStream(filename, options) { | ||
|  |         return new upload_1.GridFSBucketWriteStream(this, filename, options); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Returns a writable stream (GridFSBucketWriteStream) for writing | ||
|  |      * buffers to GridFS for a custom file id. The stream's 'id' property contains the resulting | ||
|  |      * file's id. | ||
|  |      */ | ||
|  |     openUploadStreamWithId(id, filename, options) { | ||
|  |         return new upload_1.GridFSBucketWriteStream(this, filename, { ...options, id }); | ||
|  |     } | ||
|  |     /** Returns a readable stream (GridFSBucketReadStream) for streaming file data from GridFS. */ | ||
|  |     openDownloadStream(id, options) { | ||
|  |         return new download_1.GridFSBucketReadStream(this.s._chunksCollection, this.s._filesCollection, this.s.options.readPreference, { _id: id }, options); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Deletes a file with the given id | ||
|  |      * | ||
|  |      * @param id - The id of the file doc | ||
|  |      */ | ||
|  |     async delete(id) { | ||
|  |         const { deletedCount } = await this.s._filesCollection.deleteOne({ _id: id }); | ||
|  |         // Delete orphaned chunks before returning FileNotFound
 | ||
|  |         await this.s._chunksCollection.deleteMany({ files_id: id }); | ||
|  |         if (deletedCount === 0) { | ||
|  |             // TODO(NODE-3483): Replace with more appropriate error
 | ||
|  |             // Consider creating new error MongoGridFSFileNotFoundError
 | ||
|  |             throw new error_1.MongoRuntimeError(`File not found for id ${id}`); | ||
|  |         } | ||
|  |     } | ||
|  |     /** Convenience wrapper around find on the files collection */ | ||
|  |     find(filter = {}, options = {}) { | ||
|  |         return this.s._filesCollection.find(filter, options); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Returns a readable stream (GridFSBucketReadStream) for streaming the | ||
|  |      * file with the given name from GridFS. If there are multiple files with | ||
|  |      * the same name, this will stream the most recent file with the given name | ||
|  |      * (as determined by the `uploadDate` field). You can set the `revision` | ||
|  |      * option to change this behavior. | ||
|  |      */ | ||
|  |     openDownloadStreamByName(filename, options) { | ||
|  |         let sort = { uploadDate: -1 }; | ||
|  |         let skip = undefined; | ||
|  |         if (options && options.revision != null) { | ||
|  |             if (options.revision >= 0) { | ||
|  |                 sort = { uploadDate: 1 }; | ||
|  |                 skip = options.revision; | ||
|  |             } | ||
|  |             else { | ||
|  |                 skip = -options.revision - 1; | ||
|  |             } | ||
|  |         } | ||
|  |         return new download_1.GridFSBucketReadStream(this.s._chunksCollection, this.s._filesCollection, this.s.options.readPreference, { filename }, { ...options, sort, skip }); | ||
|  |     } | ||
|  |     /** | ||
|  |      * Renames the file with the given _id to the given string | ||
|  |      * | ||
|  |      * @param id - the id of the file to rename | ||
|  |      * @param filename - new name for the file | ||
|  |      */ | ||
|  |     async rename(id, filename) { | ||
|  |         const filter = { _id: id }; | ||
|  |         const update = { $set: { filename } }; | ||
|  |         const { matchedCount } = await this.s._filesCollection.updateOne(filter, update); | ||
|  |         if (matchedCount === 0) { | ||
|  |             throw new error_1.MongoRuntimeError(`File with id ${id} not found`); | ||
|  |         } | ||
|  |     } | ||
|  |     /** Removes this bucket's files collection, followed by its chunks collection. */ | ||
|  |     async drop() { | ||
|  |         await this.s._filesCollection.drop(); | ||
|  |         await this.s._chunksCollection.drop(); | ||
|  |     } | ||
|  | } | ||
|  | exports.GridFSBucket = GridFSBucket; | ||
|  | /** | ||
|  |  * When the first call to openUploadStream is made, the upload stream will | ||
|  |  * check to see if it needs to create the proper indexes on the chunks and | ||
|  |  * files collections. This event is fired either when 1) it determines that | ||
|  |  * no index creation is necessary, 2) when it successfully creates the | ||
|  |  * necessary indexes. | ||
|  |  * @event | ||
|  |  */ | ||
|  | GridFSBucket.INDEX = 'index'; | ||
|  | //# sourceMappingURL=index.js.map
 |