browserfs
Version:
A filesystem in your browser!
113 lines • 16.5 kB
JavaScript
;
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
(function (ErrorCode) {
ErrorCode[ErrorCode["EPERM"] = 1] = "EPERM";
ErrorCode[ErrorCode["ENOENT"] = 2] = "ENOENT";
ErrorCode[ErrorCode["EIO"] = 5] = "EIO";
ErrorCode[ErrorCode["EBADF"] = 9] = "EBADF";
ErrorCode[ErrorCode["EACCES"] = 13] = "EACCES";
ErrorCode[ErrorCode["EBUSY"] = 16] = "EBUSY";
ErrorCode[ErrorCode["EEXIST"] = 17] = "EEXIST";
ErrorCode[ErrorCode["ENOTDIR"] = 20] = "ENOTDIR";
ErrorCode[ErrorCode["EISDIR"] = 21] = "EISDIR";
ErrorCode[ErrorCode["EINVAL"] = 22] = "EINVAL";
ErrorCode[ErrorCode["EFBIG"] = 27] = "EFBIG";
ErrorCode[ErrorCode["ENOSPC"] = 28] = "ENOSPC";
ErrorCode[ErrorCode["EROFS"] = 30] = "EROFS";
ErrorCode[ErrorCode["ENOTEMPTY"] = 39] = "ENOTEMPTY";
ErrorCode[ErrorCode["ENOTSUP"] = 95] = "ENOTSUP";
})(exports.ErrorCode || (exports.ErrorCode = {}));
var ErrorCode = exports.ErrorCode;
exports.ErrorStrings = {};
exports.ErrorStrings[ErrorCode.EPERM] = 'Operation not permitted.';
exports.ErrorStrings[ErrorCode.ENOENT] = 'No such file or directory.';
exports.ErrorStrings[ErrorCode.EIO] = 'Input/output error.';
exports.ErrorStrings[ErrorCode.EBADF] = 'Bad file descriptor.';
exports.ErrorStrings[ErrorCode.EACCES] = 'Permission denied.';
exports.ErrorStrings[ErrorCode.EBUSY] = 'Resource busy or locked.';
exports.ErrorStrings[ErrorCode.EEXIST] = 'File exists.';
exports.ErrorStrings[ErrorCode.ENOTDIR] = 'File is not a directory.';
exports.ErrorStrings[ErrorCode.EISDIR] = 'File is a directory.';
exports.ErrorStrings[ErrorCode.EINVAL] = 'Invalid argument.';
exports.ErrorStrings[ErrorCode.EFBIG] = 'File is too big.';
exports.ErrorStrings[ErrorCode.ENOSPC] = 'No space left on disk.';
exports.ErrorStrings[ErrorCode.EROFS] = 'Cannot modify a read-only file system.';
exports.ErrorStrings[ErrorCode.ENOTEMPTY] = 'Directory is not empty.';
exports.ErrorStrings[ErrorCode.ENOTSUP] = 'Operation is not supported.';
var ApiError = (function (_super) {
__extends(ApiError, _super);
function ApiError(type, message, path) {
if (message === void 0) { message = exports.ErrorStrings[type]; }
if (path === void 0) { path = null; }
_super.call(this, message);
this.syscall = "";
this.errno = type;
this.code = ErrorCode[type];
this.path = path;
this.stack = (new Error()).stack;
this.message = "Error: " + this.code + ": " + message + (this.path ? ", '" + this.path + "'" : '');
}
ApiError.prototype.toString = function () {
return this.message;
};
ApiError.prototype.toJSON = function () {
return {
errno: this.errno,
code: this.code,
path: this.path,
stack: this.stack,
message: this.message
};
};
ApiError.fromJSON = function (json) {
var err = new ApiError(0);
err.errno = json.errno;
err.code = json.code;
err.path = json.path;
err.stack = json.stack;
err.message = json.message;
return err;
};
ApiError.prototype.writeToBuffer = function (buffer, i) {
if (buffer === void 0) { buffer = new Buffer(this.bufferSize()); }
if (i === void 0) { i = 0; }
var bytesWritten = buffer.write(JSON.stringify(this.toJSON()), i + 4);
buffer.writeUInt32LE(bytesWritten, i);
return buffer;
};
ApiError.fromBuffer = function (buffer, i) {
if (i === void 0) { i = 0; }
return ApiError.fromJSON(JSON.parse(buffer.toString('utf8', i + 4, i + 4 + buffer.readUInt32LE(i))));
};
ApiError.prototype.bufferSize = function () {
return 4 + Buffer.byteLength(JSON.stringify(this.toJSON()));
};
ApiError.FileError = function (code, p) {
return new ApiError(code, exports.ErrorStrings[code], p);
};
ApiError.ENOENT = function (path) {
return this.FileError(ErrorCode.ENOENT, path);
};
ApiError.EEXIST = function (path) {
return this.FileError(ErrorCode.EEXIST, path);
};
ApiError.EISDIR = function (path) {
return this.FileError(ErrorCode.EISDIR, path);
};
ApiError.ENOTDIR = function (path) {
return this.FileError(ErrorCode.ENOTDIR, path);
};
ApiError.EPERM = function (path) {
return this.FileError(ErrorCode.EPERM, path);
};
ApiError.ENOTEMPTY = function (path) {
return this.FileError(ErrorCode.ENOTEMPTY, path);
};
return ApiError;
}(Error));
exports.ApiError = ApiError;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpX2Vycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvYXBpX2Vycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUtBLFdBQVksU0FBUztJQUNuQiwyQ0FBYSxDQUFBO0lBQ2IsNkNBQWEsQ0FBQTtJQUNiLHVDQUFhLENBQUE7SUFDYiwyQ0FBYSxDQUFBO0lBQ2IsOENBQWMsQ0FBQTtJQUNkLDRDQUFjLENBQUE7SUFDZCw4Q0FBYyxDQUFBO0lBQ2QsZ0RBQWMsQ0FBQTtJQUNkLDhDQUFjLENBQUE7SUFDZCw4Q0FBYyxDQUFBO0lBQ2QsNENBQWMsQ0FBQTtJQUNkLDhDQUFjLENBQUE7SUFDZCw0Q0FBYyxDQUFBO0lBQ2Qsb0RBQWMsQ0FBQTtJQUNkLGdEQUFjLENBQUE7QUFDaEIsQ0FBQyxFQWhCVyxpQkFBUyxLQUFULGlCQUFTLFFBZ0JwQjtBQWhCRCxJQUFZLFNBQVMsR0FBVCxpQkFnQlgsQ0FBQTtBQUlZLG9CQUFZLEdBQXNELEVBQUUsQ0FBQztBQUNsRixvQkFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRywwQkFBMEIsQ0FBQztBQUMzRCxvQkFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyw0QkFBNEIsQ0FBQztBQUM5RCxvQkFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxxQkFBcUIsQ0FBQztBQUNwRCxvQkFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztBQUN2RCxvQkFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxvQkFBb0IsQ0FBQztBQUN0RCxvQkFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRywwQkFBMEIsQ0FBQztBQUMzRCxvQkFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxjQUFjLENBQUM7QUFDaEQsb0JBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcs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TSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRWEsY0FBSyxHQUFuQixVQUFvQixJQUFZO1FBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVhLGtCQUFTLEdBQXZCLFVBQXdCLElBQVk7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0gsZUFBQztBQUFELENBQUMsQUF4R0QsQ0FBOEIsS0FBSyxHQXdHbEM7QUF4R1ksZ0JBQVEsV0F3R3BCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YW5kYXJkIGxpYmMgZXJyb3IgY29kZXMuIEFkZCBtb3JlIHRvIHRoaXMgZW51bSBhbmQgRXJyb3JTdHJpbmdzIGFzIHRoZXkgYXJlXG4gKiBuZWVkZWQuXG4gKiBAdXJsIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJjL21hbnVhbC9odG1sX25vZGUvRXJyb3ItQ29kZXMuaHRtbFxuICovXG5leHBvcnQgZW51bSBFcnJvckNvZGUge1xuICBFUEVSTSAgICAgPSAxLFxuICBFTk9FTlQgICAgPSAyLFxuICBFSU8gICAgICAgPSA1LFxuICBFQkFERiAgICAgPSA5LFxuICBFQUNDRVMgICAgPSAxMyxcbiAgRUJVU1kgICAgID0gMTYsXG4gIEVFWElTVCAgICA9IDE3LFxuICBFTk9URElSICAgPSAyMCxcbiAgRUlTRElSICAgID0gMjEsXG4gIEVJTlZBTCAgICA9IDIyLFxuICBFRkJJRyAgICAgPSAyNyxcbiAgRU5PU1BDICAgID0gMjgsXG4gIEVST0ZTICAgICA9IDMwLFxuICBFTk9URU1QVFkgPSAzOSxcbiAgRU5PVFNVUCAgID0gOTUsXG59XG4vKipcbiAqIFN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZXJyb3IgY29kZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVycm9yU3RyaW5nczoge1tjb2RlOiBzdHJpbmddOiBzdHJpbmc7IFtjb2RlOiBudW1iZXJdOiBzdHJpbmc7fSA9IHt9O1xuRXJyb3JTdHJpbmdzW0Vycm9yQ29kZS5FUEVSTV0gPSAnT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQuJztcbkVycm9yU3RyaW5nc1tFcnJvckNvZGUuRU5PRU5UXSA9ICdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Lic7XG5FcnJvclN0cmluZ3NbRXJyb3JDb2RlLkVJT10gPSAnSW5wdXQvb3V0cHV0IGVycm9yLic7XG5FcnJvclN0cmluZ3NbRXJyb3JDb2RlLkVCQURGXSA9ICdCYWQgZmlsZSBkZXNjcmlwdG9yLic7XG5FcnJvclN0cmluZ3NbRXJyb3JDb2RlLkVBQ0NFU10gPSAnUGVybWlzc2lvbiBkZW5pZWQuJztcbkVycm9yU3RyaW5nc1tFcnJvckNvZGUuRUJVU1ldID0gJ1Jlc291cmNlIGJ1c3kgb3IgbG9ja2VkLic7XG5FcnJvclN0cmluZ3NbRXJyb3JDb2RlLkVFWElTVF0gPSAnRmlsZSBleGlzdHMuJztcbkVycm9yU3RyaW5nc1tFcnJvckNvZGUuRU5PVERJUl0gPSAnRmlsZSBpcyBub3QgYSBkaXJlY3RvcnkuJztcbkVycm9yU3RyaW5nc1tFcnJvckNvZGUuRUlTRElSXSA9ICdGaWxlIGlzIGEgZGlyZWN0b3J5Lic7XG5FcnJvclN0cmluZ3NbRXJyb3JDb2RlLkVJTlZBTF0gPSAnSW52YWxpZCBhcmd1bWVudC4nO1xuRXJyb3JTdHJpbmdzW0Vycm9yQ29kZS5FRkJJR10gPSAnRmlsZSBpcyB0b28gYmlnLic7XG5FcnJvclN0cmluZ3NbRXJyb3JDb2RlLkVOT1NQQ10gPSAnTm8gc3BhY2UgbGVmdCBvbiBkaXNrLic7XG5FcnJvclN0cmluZ3NbRXJyb3JDb2RlLkVST0ZTXSA9ICdDYW5ub3QgbW9kaWZ5IGEgcmVhZC1vbmx5IGZpbGUgc3lzdGVtLic7XG5FcnJvclN0cmluZ3NbRXJyb3JDb2RlLkVOT1RFTVBUWV0gPSAnRGlyZWN0b3J5IGlzIG5vdCBlbXB0eS4nO1xuRXJyb3JTdHJpbmdzW0Vycm9yQ29kZS5FTk9UU1VQXSA9ICdPcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4nO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBCcm93c2VyRlMgZXJyb3IuIFBhc3NlZCBiYWNrIHRvIGFwcGxpY2F0aW9ucyBhZnRlciBhIGZhaWxlZFxuICogY2FsbCB0byB0aGUgQnJvd3NlckZTIEFQSS5cbiAqIGVycm5vPzogbnVtYmVyO1xuICAgICAgICBjb2RlPzogc3RyaW5nO1xuICAgICAgICBwYXRoPzogc3RyaW5nO1xuICAgICAgICBzeXNjYWxsPzogc3RyaW5nO1xuICAgICAgICBzdGFjaz86IHN0cmluZztcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUVycm9yIGV4dGVuZHMgRXJyb3IgaW1wbGVtZW50cyBOb2RlSlMuRXJybm9FeGNlcHRpb24ge1xuICBwdWJsaWMgZXJybm86IEVycm9yQ29kZTtcbiAgcHVibGljIGNvZGU6IHN0cmluZztcbiAgcHVibGljIHBhdGg6IHN0cmluZztcbiAgLy8gVW5zdXBwb3J0ZWQuXG4gIHB1YmxpYyBzeXNjYWxsOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgc3RhY2s6IHN0cmluZztcblxuICAvKipcbiAgICogUmVwcmVzZW50cyBhIEJyb3dzZXJGUyBlcnJvci4gUGFzc2VkIGJhY2sgdG8gYXBwbGljYXRpb25zIGFmdGVyIGEgZmFpbGVkXG4gICAqIGNhbGwgdG8gdGhlIEJyb3dzZXJGUyBBUEkuXG4gICAqXG4gICAqIEVycm9yIGNvZGVzIG1pcnJvciB0aG9zZSByZXR1cm5lZCBieSByZWd1bGFyIFVuaXggZmlsZSBvcGVyYXRpb25zLCB3aGljaCBpc1xuICAgKiB3aGF0IE5vZGUgcmV0dXJucy5cbiAgICogQGNvbnN0cnVjdG9yIEFwaUVycm9yXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIFttZXNzYWdlXSBBIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlOiBFcnJvckNvZGUsIG1lc3NhZ2U6IHN0cmluZyA9IEVycm9yU3RyaW5nc1t0eXBlXSwgcGF0aDogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuZXJybm8gPSB0eXBlO1xuICAgIHRoaXMuY29kZSA9IEVycm9yQ29kZVt0eXBlXTtcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMuc3RhY2sgPSAoPGFueT5uZXcgRXJyb3IoKSkuc3RhY2s7XG4gICAgdGhpcy5tZXNzYWdlID0gYEVycm9yOiAke3RoaXMuY29kZX06ICR7bWVzc2FnZX0ke3RoaXMucGF0aCA/IGAsICcke3RoaXMucGF0aH0nYCA6ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICB9XG5cbiAgcHVibGljIHRvSlNPTigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJubzogdGhpcy5lcnJubyxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIHBhdGg6IHRoaXMucGF0aCxcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUpTT04oanNvbjogYW55KTogQXBpRXJyb3Ige1xuICAgIHZhciBlcnIgPSBuZXcgQXBpRXJyb3IoMCk7XG4gICAgZXJyLmVycm5vID0ganNvbi5lcnJubztcbiAgICBlcnIuY29kZSA9IGpzb24uY29kZTtcbiAgICBlcnIucGF0aCA9IGpzb24ucGF0aDtcbiAgICBlcnIuc3RhY2sgPSBqc29uLnN0YWNrO1xuICAgIGVyci5tZXNzYWdlID0ganNvbi5tZXNzYWdlO1xuICAgIHJldHVybiBlcnI7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBBUEkgZXJyb3IgaW50byBhIGJ1ZmZlci5cbiAgICovXG4gIHB1YmxpYyB3cml0ZVRvQnVmZmVyKGJ1ZmZlcjogQnVmZmVyID0gbmV3IEJ1ZmZlcih0aGlzLmJ1ZmZlclNpemUoKSksIGk6IG51bWJlciA9IDApOiBCdWZmZXIge1xuICAgIHZhciBieXRlc1dyaXR0ZW4gPSBidWZmZXIud3JpdGUoSlNPTi5zdHJpbmdpZnkodGhpcy50b0pTT04oKSksIGkgKyA0KTtcbiAgICBidWZmZXIud3JpdGVVSW50MzJMRShieXRlc1dyaXR0ZW4sIGkpO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBcGlFcnJvciBvYmplY3QgZnJvbSBhIGJ1ZmZlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJ1ZmZlcihidWZmZXI6IEJ1ZmZlciwgaTogbnVtYmVyID0gMCk6IEFwaUVycm9yIHtcbiAgICByZXR1cm4gQXBpRXJyb3IuZnJvbUpTT04oSlNPTi5wYXJzZShidWZmZXIudG9TdHJpbmcoJ3V0ZjgnLCBpICsgNCwgaSArIDQgKyBidWZmZXIucmVhZFVJbnQzMkxFKGkpKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBBUEkgZXJyb3IgaW4gYnVmZmVyLWZvcm0gaW4gYnl0ZXMuXG4gICAqL1xuICBwdWJsaWMgYnVmZmVyU2l6ZSgpOiBudW1iZXIge1xuICAgIC8vIDQgYnl0ZXMgZm9yIHN0cmluZyBsZW5ndGguXG4gICAgcmV0dXJuIDQgKyBCdWZmZXIuYnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEZpbGVFcnJvcihjb2RlOiBFcnJvckNvZGUsIHA6IHN0cmluZyk6IEFwaUVycm9yIHtcbiAgICByZXR1cm4gbmV3IEFwaUVycm9yKGNvZGUsIEVycm9yU3RyaW5nc1tjb2RlXSwgcCk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBFTk9FTlQocGF0aDogc3RyaW5nKTogQXBpRXJyb3Ige1xuICAgIHJldHVybiB0aGlzLkZpbGVFcnJvcihFcnJvckNvZGUuRU5PRU5ULCBwYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRUVYSVNUKHBhdGg6IHN0cmluZyk6IEFwaUVycm9yIHtcbiAgICByZXR1cm4gdGhpcy5GaWxlRXJyb3IoRXJyb3JDb2RlLkVFWElTVCwgcGF0aCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEVJU0RJUihwYXRoOiBzdHJpbmcpOiBBcGlFcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuRmlsZUVycm9yKEVycm9yQ29kZS5FSVNESVIsIHBhdGgpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBFTk9URElSKHBhdGg6IHN0cmluZyk6IEFwaUVycm9yIHtcbiAgICByZXR1cm4gdGhpcy5GaWxlRXJyb3IoRXJyb3JDb2RlLkVOT1RESVIsIHBhdGgpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBFUEVSTShwYXRoOiBzdHJpbmcpOiBBcGlFcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuRmlsZUVycm9yKEVycm9yQ29kZS5FUEVSTSwgcGF0aCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEVOT1RFTVBUWShwYXRoOiBzdHJpbmcpOiBBcGlFcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuRmlsZUVycm9yKEVycm9yQ29kZS5FTk9URU1QVFksIHBhdGgpO1xuICB9XG59XG4iXX0=