2025-10-01 19:55:38 +02:00

358 lines
14 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var LockScope_1 = require("../lock/LockScope");
var Workflow_1 = require("../../../helper/Workflow");
var LockType_1 = require("../lock/LockType");
var LockKind_1 = require("../lock/LockKind");
var LockBag_1 = require("../lock/LockBag");
var Errors_1 = require("../../../Errors");
var mimeTypes = require("mime-types");
var StandardResource = /** @class */ (function () {
function StandardResource(parent, fsManager) {
this.deleteOnMoved = true;
this.dateCreation = Date.now();
this.properties = {};
this.fsManager = fsManager;
this.lockBag = new LockBag_1.LockBag();
this.parent = parent;
this.dateLastModified = this.dateCreation;
}
StandardResource.sizeOfSubFiles = function (resource, targetSource, callback) {
resource.getChildren(function (e, children) {
if (e) {
callback(e, null);
return;
}
new Workflow_1.Workflow()
.each(children, function (child, cb) {
child.size(targetSource, cb);
})
.error(function (e) { return callback(e, 0); })
.done(function (sizes) { return callback(null, sizes.reduce(function (o, s) { return o + s; }, 0)); });
});
};
// ****************************** Locks ****************************** //
StandardResource.prototype.getAvailableLocks = function (callback) {
callback(null, [
new LockKind_1.LockKind(LockScope_1.LockScope.Exclusive, LockType_1.LockType.Write),
new LockKind_1.LockKind(LockScope_1.LockScope.Shared, LockType_1.LockType.Write)
]);
};
StandardResource.prototype.getLocks = function (callback) {
callback(null, this.lockBag.getLocks());
};
StandardResource.prototype.setLock = function (lock, callback) {
var locked = this.lockBag.setLock(lock);
this.updateLastModified();
callback(locked ? null : Errors_1.Errors.CannotLockResource);
};
StandardResource.prototype.removeLock = function (uuid, callback) {
this.lockBag.removeLock(uuid);
this.updateLastModified();
callback(null, true);
};
StandardResource.prototype.getLock = function (uuid, callback) {
callback(null, this.lockBag.getLock(uuid));
};
// ****************************** Properties ****************************** //
StandardResource.prototype.setProperty = function (name, value, callback) {
this.properties[name] = value;
this.updateLastModified();
callback(null);
};
StandardResource.prototype.getProperty = function (name, callback) {
var value = this.properties[name];
if (value === undefined)
callback(Errors_1.Errors.PropertyNotFound, null);
else
callback(null, value);
};
StandardResource.prototype.removeProperty = function (name, callback) {
delete this.properties[name];
this.updateLastModified();
callback(null);
};
StandardResource.prototype.getProperties = function (callback) {
callback(null, this.properties);
};
StandardResource.prototype.moveTo = function (parent, newName, overwrite, callback) {
StandardResource.standardMoveByCopy(this, parent, newName, overwrite, this.deleteOnMoved, callback);
};
// ****************************** Std meta-data ****************************** //
StandardResource.prototype.creationDate = function (callback) {
callback(null, this.dateCreation);
};
StandardResource.prototype.lastModifiedDate = function (callback) {
callback(null, this.dateLastModified);
};
StandardResource.prototype.updateLastModified = function () {
this.dateLastModified = Date.now();
};
StandardResource.prototype.removeFromParent = function (callback) {
StandardResource.standardRemoveFromParent(this, callback);
};
StandardResource.prototype.addToParent = function (parent, callback) {
StandardResource.standardAddToParent(this, parent, callback);
};
StandardResource.standardRemoveFromParent = function (resource, callback) {
var parent = resource.parent;
if (parent)
parent.removeChild(resource, function (e) {
if (!e && resource.parent === parent) // resource.parent didn't change
resource.parent = null;
callback(e);
});
else
callback(null);
};
StandardResource.standardAddToParent = function (resource, parent, callback) {
parent.addChild(resource, function (e) {
if (!e)
resource.parent = parent;
callback(e);
});
};
StandardResource.standardFindChildren = function (parent, predicate, callback) {
parent.getChildren(function (e, children) {
if (e) {
callback(e, null);
return;
}
new Workflow_1.Workflow()
.each(children, function (child, cb) {
predicate(child, function (e, isMatching) { return cb(e, isMatching ? child : null); });
})
.error(function (e) { return callback(e, null); })
.done(function (conflictingChildren) { return callback(null, conflictingChildren.filter(function (c) { return !!c; })); });
});
};
StandardResource.standardFindChildByName = function (parent, name, callback) {
this.standardFindChildren(parent, function (r, cb) { return r.webName(function (e, rname) {
if (e)
cb(e);
else if (name === rname)
cb(null, true);
else
cb(null, false);
}); }, function (e, rs) {
if (e)
callback(e, null);
else if (rs.length > 0)
callback(null, rs[0]);
else
callback(Errors_1.Errors.ResourceNotFound, null);
});
};
StandardResource.standardMoveByCopy = function (resource, parent, newName, overwrite, deleteSource, callback) {
StandardResource.standardFindChildByName(parent, newName, function (e, r) {
if (e === Errors_1.Errors.ResourceNotFound)
copy();
else if (e)
callback(e, null);
else if (!overwrite)
callback(Errors_1.Errors.ResourceAlreadyExists, null);
else
r.delete(function (e) {
if (e)
callback(e, null);
else
copy();
});
});
function copy() {
resource.type(function (e, type) {
if (e) {
callback(e, null);
return;
}
var destination = parent.fsManager.newResource(null, newName, type, parent);
destination.create(function (e) {
if (e) {
callback(e, null);
return;
}
parent.addChild(destination, function (e) {
if (e) {
callback(e, null);
return;
}
if (type.isDirectory)
copyDir(destination);
else
copyFile(destination);
});
});
});
}
function copyProperties(destination, callback) {
resource.getProperties(function (e, props) {
if (e) {
callback(e);
return;
}
new Workflow_1.Workflow()
.each(Object.keys(props), function (key, cb) { return destination.setProperty(key, props[key], cb); })
.error(callback)
.done(function () { return callback(null); });
});
}
function copyLocks(destination, callback) {
resource.getLocks(function (e, locks) {
if (e === Errors_1.Errors.MustIgnore) {
callback(null);
return;
}
if (e) {
callback(e);
return;
}
new Workflow_1.Workflow()
.each(locks, function (lock, cb) { return destination.setLock(lock, cb); })
.error(callback)
.done(function () { return callback(null); });
});
}
function finalizeCopy(destination) {
copyProperties(destination, function (e) {
if (e)
callback(e, null);
else
copyLocks(destination, function (e) {
if (e)
callback(e, null);
else if (deleteSource)
resource.delete(function (e) { return callback(e, destination); });
else
resource.parent.removeChild(resource, function (e) { return callback(e, destination); });
});
});
}
function copyDir(destination) {
resource.getChildren(function (e, children) {
if (e) {
callback(e, null);
return;
}
new Workflow_1.Workflow()
.each(children, function (child, cb) { return child.webName(function (e, name) {
if (e)
cb(e);
else
child.moveTo(destination, name, overwrite, cb);
}); })
.error(function (e) { return callback(e, null); })
.done(function () { return finalizeCopy(destination); });
});
}
function copyFile(destination) {
resource.read(true, function (e, rStream) {
if (e) {
callback(e, null);
return;
}
destination.write(true, function (e, wStream) {
if (e) {
callback(e, null);
return;
}
rStream.pipe(wStream);
wStream.on('error', callback);
wStream.on('finish', function () { return finalizeCopy(destination); });
});
});
}
};
StandardResource.standardMoveTo = function (resource, parent, newName, overwrite, callback) {
StandardResource.standardMoveByCopy(resource, parent, newName, overwrite, true, callback);
};
/**
* @deprecated Prefer calling 'standardMoveByCopy(...)' instead to avoid compatibility issue between file systems.
*/
StandardResource.standardMoveWithoutCopy = function (resource, parent, newName, overwrite, callback) {
StandardResource.standardFindChildByName(parent, newName, function (e, r) {
if (e === Errors_1.Errors.ResourceNotFound)
move();
else if (e)
callback(e);
else if (!overwrite)
callback(Errors_1.Errors.ResourceAlreadyExists);
else
r.delete(function (e) {
if (e)
callback(e);
else
move();
});
});
function move() {
if (parent === resource.parent) {
resource.rename(newName, function (e, oldName, newName) {
callback(e);
});
return;
}
StandardResource.standardRemoveFromParent(resource, function (e) {
if (e) {
callback(e);
return;
}
resource.webName(function (e, name) {
if (e || name === newName) {
parent.addChild(resource, function (e) {
callback(e);
});
return;
}
resource.rename(newName, function (e, oldName, newName) {
if (e)
callback(e);
else
parent.addChild(resource, function (e) {
callback(e);
});
});
});
});
}
};
StandardResource.standardMimeType = function (resource, targetSource, _defaultMimeType, _useWebName, _callback) {
var callback;
var useWebName = false;
var defaultMimeType = 'application/octet-stream';
if (_defaultMimeType.constructor === Function) {
callback = _defaultMimeType;
}
else if (_defaultMimeType.constructor === Boolean) {
callback = _useWebName;
if (_defaultMimeType !== undefined && _defaultMimeType !== null)
useWebName = _defaultMimeType;
}
else {
callback = _callback;
if (_useWebName !== undefined && _useWebName !== null)
useWebName = _useWebName;
if (_defaultMimeType !== undefined && _defaultMimeType !== null)
defaultMimeType = _defaultMimeType;
}
resource.type(function (e, type) {
if (e)
callback(e, null);
else if (type.isFile) {
var fn = !useWebName && resource.displayName ? resource.displayName : resource.webName;
fn(function (e, name) {
if (e)
callback(e, null);
else {
var mt = mimeTypes.contentType(name);
callback(null, mt ? mt : defaultMimeType);
}
});
}
else
callback(Errors_1.Errors.NoMimeTypeForAFolder, null);
});
};
return StandardResource;
}());
exports.StandardResource = StandardResource;