152 lines
5.6 KiB
JavaScript
152 lines
5.6 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var Serialization_1 = require("../../../manager/v2/fileSystem/Serialization");
|
|
var PhysicalFileSystem_1 = require("../../../manager/v2/instances/PhysicalFileSystem");
|
|
var VirtualFileSystem_1 = require("../../../manager/v2/instances/VirtualFileSystem");
|
|
var zlib = require("zlib");
|
|
var fs = require("fs");
|
|
function defaultSerializers() {
|
|
return VirtualFileSystem_1.VirtualSerializerVersions.instances.concat(PhysicalFileSystem_1.PhysicalSerializerVersions.instances);
|
|
}
|
|
function load(data, serializers, callback) {
|
|
var _this = this;
|
|
var fSerializers = serializers ? serializers.concat(defaultSerializers()) : defaultSerializers();
|
|
Serialization_1.unserialize(data, fSerializers, function (e, udata) {
|
|
if (!e)
|
|
_this.fileSystems = udata;
|
|
callback(e);
|
|
});
|
|
}
|
|
exports.load = load;
|
|
function autoLoad(callback) {
|
|
var _this = this;
|
|
var options = this.options.autoLoad || {};
|
|
if (!options.treeFilePath) {
|
|
if (!this.options.autoSave || !this.options.autoSave.treeFilePath)
|
|
return callback(new Error('The "treeFilePath" of the "autoLoad" option is not found.'));
|
|
else
|
|
options.treeFilePath = this.options.autoSave.treeFilePath;
|
|
}
|
|
var stream = fs.createReadStream(options.treeFilePath);
|
|
stream.on('error', callback);
|
|
var streamProvider = options.streamProvider;
|
|
if (!streamProvider)
|
|
streamProvider = function (s, cb) { return cb(s.pipe(zlib.createGunzip())); };
|
|
streamProvider(stream, function (s) {
|
|
if (!s)
|
|
s = stream;
|
|
var data = '';
|
|
s.on('data', function (chunk) {
|
|
data += chunk.toString();
|
|
});
|
|
s.on('error', callback);
|
|
s.on('end', function () {
|
|
var obj = JSON.parse(data.toString());
|
|
_this.load(obj, options.serializers, callback);
|
|
});
|
|
});
|
|
}
|
|
exports.autoLoad = autoLoad;
|
|
function save(callback) {
|
|
Serialization_1.serialize(this.fileSystems, callback);
|
|
}
|
|
exports.save = save;
|
|
function loadDefaultIAutoSaveParam(options) {
|
|
if (!options.streamProvider)
|
|
options.streamProvider = function (cb) { return cb(); };
|
|
if (!options.onSaveError)
|
|
options.onSaveError = function () { };
|
|
if (!options.tempTreeFilePath)
|
|
options.tempTreeFilePath = options.treeFilePath + '.tmp';
|
|
return options;
|
|
}
|
|
var AutoSavePool = /** @class */ (function () {
|
|
function AutoSavePool(options, saveFn) {
|
|
options = loadDefaultIAutoSaveParam(options);
|
|
this.saveRequested = false;
|
|
this.options = options;
|
|
this.saveFn = saveFn;
|
|
this.saving = false;
|
|
}
|
|
AutoSavePool.prototype.imediateSave = function () {
|
|
var _this = this;
|
|
this.saveFn(function (e, data) {
|
|
if (e) {
|
|
_this.options.onSaveError(e);
|
|
_this.saveIfNext();
|
|
}
|
|
else {
|
|
_this.options.streamProvider(function (inputStream, outputStream) {
|
|
if (!inputStream)
|
|
inputStream = zlib.createGzip();
|
|
if (!outputStream)
|
|
outputStream = inputStream;
|
|
var fileStream = fs.createWriteStream(_this.options.tempTreeFilePath);
|
|
outputStream.pipe(fileStream);
|
|
inputStream.end(JSON.stringify(data), function (e) {
|
|
if (e) {
|
|
_this.options.onSaveError(e);
|
|
_this.saveIfNext();
|
|
return;
|
|
}
|
|
});
|
|
fileStream.on('close', function () {
|
|
fs.unlink(_this.options.treeFilePath, function (e) {
|
|
if (e && e.code !== 'ENOENT') // An error other than ENOENT (no file/folder found)
|
|
{
|
|
_this.options.onSaveError(e);
|
|
_this.saveIfNext();
|
|
return;
|
|
}
|
|
fs.rename(_this.options.tempTreeFilePath, _this.options.treeFilePath, function (e) {
|
|
if (e)
|
|
_this.options.onSaveError(e);
|
|
_this.saveIfNext();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
});
|
|
};
|
|
AutoSavePool.prototype.save = function () {
|
|
if (this.saving) {
|
|
this.saveRequested = true;
|
|
}
|
|
else {
|
|
this.saving = true;
|
|
this.imediateSave();
|
|
}
|
|
};
|
|
AutoSavePool.prototype.saveIfNext = function () {
|
|
if (this.saveRequested) {
|
|
this.saveRequested = false;
|
|
this.imediateSave();
|
|
}
|
|
else {
|
|
this.saving = false;
|
|
}
|
|
};
|
|
return AutoSavePool;
|
|
}());
|
|
exports.AutoSavePool = AutoSavePool;
|
|
function autoSave(options) {
|
|
var _this = this;
|
|
this.autoSavePool = new AutoSavePool(options, this.save.bind(this));
|
|
this.afterRequest(function (ctx, next) {
|
|
switch (ctx.request.method.toUpperCase()) {
|
|
case 'PROPPATCH':
|
|
case 'DELETE':
|
|
case 'MKCOL':
|
|
case 'MOVE':
|
|
case 'COPY':
|
|
case 'POST':
|
|
case 'PUT':
|
|
_this.autoSavePool.save();
|
|
break;
|
|
}
|
|
next();
|
|
});
|
|
}
|
|
exports.autoSave = autoSave;
|