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

175 lines
7.1 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var WebDAVRequest_1 = require("../WebDAVRequest");
var Errors_1 = require("../../../Errors");
var https = require("https");
var http = require("http");
var zlib = require("zlib");
var fs = require("fs");
function autoSave(options) {
var _this = this;
if (!options.streamProvider)
options.streamProvider = function (s, cb) { return cb(s); };
if (!options.onSaveError)
options.onSaveError = function () { };
var saving = false;
var saveRequested = false;
this.afterRequest(function (arg, next) {
switch (arg.request.method.toUpperCase()) {
case 'PROPPATCH':
case 'DELETE':
case 'MKCOL':
case 'MOVE':
case 'COPY':
case 'POST':
case 'PUT':
// Avoid concurrent saving
if (saving) {
saveRequested = true;
next();
return;
}
var save_1 = function () {
this.save(function (e, data) {
if (e) {
options.onSaveError(e);
next();
}
else {
var stream_1 = zlib.createGzip();
options.streamProvider(stream_1, function (outputStream) {
if (!outputStream)
outputStream = stream_1;
outputStream.pipe(fs.createWriteStream(options.tempTreeFilePath));
stream_1.end(JSON.stringify(data), function (e) {
if (e) {
options.onSaveError(e);
next();
return;
}
});
stream_1.on('close', function () {
fs.unlink(options.treeFilePath, function (e) {
if (e && e.code !== 'ENOENT') // An error other than ENOENT (no file/folder found)
{
options.onSaveError(e);
next();
return;
}
fs.rename(options.tempTreeFilePath, options.treeFilePath, function (e) {
if (e)
options.onSaveError(e);
next();
});
});
});
});
}
});
};
saving = true;
next = function () {
if (saveRequested) {
saveRequested = false;
save_1.bind(_this)();
}
else
saving = false;
};
save_1.bind(_this)();
break;
default:
next();
break;
}
});
}
function start(port, callback) {
var _this = this;
var _port = this.options.port;
var _callback;
if (port && port.constructor === Number) {
_port = port;
if (callback) {
if (callback instanceof Function)
_callback = callback;
else
throw Errors_1.Errors.IllegalArguments;
}
}
else if (port && port.constructor === Function) {
_port = this.options.port;
_callback = port;
if (callback)
throw Errors_1.Errors.IllegalArguments;
}
if (!this.server) {
var serverCreator = this.options.https ? function (c) { return https.createServer(_this.options.https, c); } : function (c) { return http.createServer(c); };
this.server = serverCreator(function (req, res) {
var method = _this.methods[_this.normalizeMethodName(req.method)];
if (!method)
method = _this.unknownMethod;
WebDAVRequest_1.MethodCallArgs.create(_this, req, res, function (e, base) {
if (e) {
if (e === Errors_1.Errors.AuenticationPropertyMissing || e === Errors_1.Errors.MissingAuthorisationHeader || e === Errors_1.Errors.BadAuthentication || e === Errors_1.Errors.WrongHeaderFormat)
base.setCode(WebDAVRequest_1.HTTPCodes.Unauthorized);
else
base.setCode(WebDAVRequest_1.HTTPCodes.InternalServerError);
res.end();
return;
}
base.exit = function () {
base.response.end();
_this.invokeAfterRequest(base, null);
};
if (!_this.options.canChunk || !method.chunked) {
var go_1 = function () {
_this.invokeBeforeRequest(base, function () {
method(base, base.exit);
});
};
if (base.contentLength <= 0) {
base.data = Buffer.alloc(0);
go_1();
}
else {
var data_1 = Buffer.alloc(base.contentLength);
var index_1 = 0;
req.on('data', function (chunk) {
if (chunk.constructor === String)
chunk = Buffer.from(chunk);
for (var i = 0; i < chunk.length && index_1 < data_1.length; ++i, ++index_1)
data_1[index_1] = chunk[i];
if (index_1 >= base.contentLength) {
base.data = data_1;
go_1();
}
});
}
}
else {
_this.invokeBeforeRequest(base, function () {
method.chunked(base, base.exit);
});
}
});
});
if (this.options.autoSave)
autoSave.bind(this)(this.options.autoSave);
}
this.server.listen(_port, this.options.hostname, function () {
if (_callback)
_callback(_this.server);
});
}
exports.start = start;
function stop(callback) {
if (this.server) {
this.server.close(callback);
this.server = null;
}
else
process.nextTick(callback);
}
exports.stop = stop;