123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- "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 utils_1 = require("../utils");
- 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);
- }
- delete(id, callback) {
- return (0, utils_1.executeLegacyOperation)((0, utils_1.getTopology)(this.s.db), _delete, [this, id, callback], {
- skipSessions: true
- });
- }
- /** Convenience wrapper around find on the files collection */
- find(filter, options) {
- filter !== null && filter !== void 0 ? filter : (filter = {});
- options = options !== null && options !== void 0 ? 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 });
- }
- rename(id, filename, callback) {
- return (0, utils_1.executeLegacyOperation)((0, utils_1.getTopology)(this.s.db), _rename, [this, id, filename, callback], {
- skipSessions: true
- });
- }
- drop(callback) {
- return (0, utils_1.executeLegacyOperation)((0, utils_1.getTopology)(this.s.db), _drop, [this, callback], {
- skipSessions: true
- });
- }
- /** Get the Db scoped logger. */
- getLogger() {
- return this.s.db.s.logger;
- }
- }
- 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';
- function _delete(bucket, id, callback) {
- return bucket.s._filesCollection.deleteOne({ _id: id }, (error, res) => {
- if (error) {
- return callback(error);
- }
- return bucket.s._chunksCollection.deleteMany({ files_id: id }, error => {
- if (error) {
- return callback(error);
- }
- // Delete orphaned chunks before returning FileNotFound
- if (!(res === null || res === void 0 ? void 0 : res.deletedCount)) {
- // TODO(NODE-3483): Replace with more appropriate error
- // Consider creating new error MongoGridFSFileNotFoundError
- return callback(new error_1.MongoRuntimeError(`File not found for id ${id}`));
- }
- return callback();
- });
- });
- }
- function _rename(bucket, id, filename, callback) {
- const filter = { _id: id };
- const update = { $set: { filename } };
- return bucket.s._filesCollection.updateOne(filter, update, (error, res) => {
- if (error) {
- return callback(error);
- }
- if (!(res === null || res === void 0 ? void 0 : res.matchedCount)) {
- return callback(new error_1.MongoRuntimeError(`File with id ${id} not found`));
- }
- return callback();
- });
- }
- function _drop(bucket, callback) {
- return bucket.s._filesCollection.drop((error) => {
- if (error) {
- return callback(error);
- }
- return bucket.s._chunksCollection.drop((error) => {
- if (error) {
- return callback(error);
- }
- return callback();
- });
- });
- }
- //# sourceMappingURL=index.js.map
|