browserfs
Version:
A filesystem in your browser!
606 lines • 84.3 kB
JavaScript
"use strict";
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 __());
};
var file_system = require('../core/file_system');
var api_error_1 = require('../core/api_error');
var file_flag = require('../core/file_flag');
var util_1 = require('../core/util');
var file = require('../core/file');
var node_fs_stats_1 = require('../core/node_fs_stats');
var preload_file = require('../generic/preload_file');
var global = require('../core/global');
var fs = require('../core/node_fs');
var SpecialArgType;
(function (SpecialArgType) {
SpecialArgType[SpecialArgType["CB"] = 0] = "CB";
SpecialArgType[SpecialArgType["FD"] = 1] = "FD";
SpecialArgType[SpecialArgType["API_ERROR"] = 2] = "API_ERROR";
SpecialArgType[SpecialArgType["STATS"] = 3] = "STATS";
SpecialArgType[SpecialArgType["PROBE"] = 4] = "PROBE";
SpecialArgType[SpecialArgType["FILEFLAG"] = 5] = "FILEFLAG";
SpecialArgType[SpecialArgType["BUFFER"] = 6] = "BUFFER";
SpecialArgType[SpecialArgType["ERROR"] = 7] = "ERROR";
})(SpecialArgType || (SpecialArgType = {}));
var CallbackArgumentConverter = (function () {
function CallbackArgumentConverter() {
this._callbacks = {};
this._nextId = 0;
}
CallbackArgumentConverter.prototype.toRemoteArg = function (cb) {
var id = this._nextId++;
this._callbacks[id] = cb;
return {
type: SpecialArgType.CB,
id: id
};
};
CallbackArgumentConverter.prototype.toLocalArg = function (id) {
var cb = this._callbacks[id];
delete this._callbacks[id];
return cb;
};
return CallbackArgumentConverter;
}());
var FileDescriptorArgumentConverter = (function () {
function FileDescriptorArgumentConverter() {
this._fileDescriptors = {};
this._nextId = 0;
}
FileDescriptorArgumentConverter.prototype.toRemoteArg = function (fd, p, flag, cb) {
var id = this._nextId++, data, stat, argsLeft = 2;
this._fileDescriptors[id] = fd;
fd.stat(function (err, stats) {
if (err) {
cb(err);
}
else {
stat = bufferToTransferrableObject(stats.toBuffer());
if (flag.isReadable()) {
fd.read(new Buffer(stats.size), 0, stats.size, 0, function (err, bytesRead, buff) {
if (err) {
cb(err);
}
else {
data = bufferToTransferrableObject(buff);
cb(null, {
type: SpecialArgType.FD,
id: id,
data: data,
stat: stat,
path: p,
flag: flag.getFlagString()
});
}
});
}
else {
cb(null, {
type: SpecialArgType.FD,
id: id,
data: new ArrayBuffer(0),
stat: stat,
path: p,
flag: flag.getFlagString()
});
}
}
});
};
FileDescriptorArgumentConverter.prototype._applyFdChanges = function (remoteFd, cb) {
var fd = this._fileDescriptors[remoteFd.id], data = transferrableObjectToBuffer(remoteFd.data), remoteStats = node_fs_stats_1["default"].fromBuffer(transferrableObjectToBuffer(remoteFd.stat));
var flag = file_flag.FileFlag.getFileFlag(remoteFd.flag);
if (flag.isWriteable()) {
fd.write(data, 0, data.length, flag.isAppendable() ? fd.getPos() : 0, function (e) {
function applyStatChanges() {
fd.stat(function (e, stats) {
if (e) {
cb(e);
}
else {
if (stats.mode !== remoteStats.mode) {
fd.chmod(remoteStats.mode, function (e) {
cb(e, fd);
});
}
else {
cb(e, fd);
}
}
});
}
if (e) {
cb(e);
}
else {
if (!flag.isAppendable()) {
fd.truncate(data.length, function () {
applyStatChanges();
});
}
else {
applyStatChanges();
}
}
});
}
else {
cb(null, fd);
}
};
FileDescriptorArgumentConverter.prototype.applyFdAPIRequest = function (request, cb) {
var _this = this;
var fdArg = request.args[0];
this._applyFdChanges(fdArg, function (err, fd) {
if (err) {
cb(err);
}
else {
fd[request.method](function (e) {
if (request.method === 'close') {
delete _this._fileDescriptors[fdArg.id];
}
cb(e);
});
}
});
};
return FileDescriptorArgumentConverter;
}());
function apiErrorLocal2Remote(e) {
return {
type: SpecialArgType.API_ERROR,
errorData: bufferToTransferrableObject(e.writeToBuffer())
};
}
function apiErrorRemote2Local(e) {
return api_error_1.ApiError.fromBuffer(transferrableObjectToBuffer(e.errorData));
}
function errorLocal2Remote(e) {
return {
type: SpecialArgType.ERROR,
name: e.name,
message: e.message,
stack: e.stack
};
}
function errorRemote2Local(e) {
var cnstr = global[e.name];
if (typeof (cnstr) !== 'function') {
cnstr = Error;
}
var err = new cnstr(e.message);
err.stack = e.stack;
return err;
}
function statsLocal2Remote(stats) {
return {
type: SpecialArgType.STATS,
statsData: bufferToTransferrableObject(stats.toBuffer())
};
}
function statsRemote2Local(stats) {
return node_fs_stats_1["default"].fromBuffer(transferrableObjectToBuffer(stats.statsData));
}
function fileFlagLocal2Remote(flag) {
return {
type: SpecialArgType.FILEFLAG,
flagStr: flag.getFlagString()
};
}
function fileFlagRemote2Local(remoteFlag) {
return file_flag.FileFlag.getFileFlag(remoteFlag.flagStr);
}
function bufferToTransferrableObject(buff) {
return util_1.buffer2ArrayBuffer(buff);
}
function transferrableObjectToBuffer(buff) {
return util_1.arrayBuffer2Buffer(buff);
}
function bufferLocal2Remote(buff) {
return {
type: SpecialArgType.BUFFER,
data: bufferToTransferrableObject(buff)
};
}
function bufferRemote2Local(buffArg) {
return transferrableObjectToBuffer(buffArg.data);
}
function isAPIRequest(data) {
return data != null && typeof data === 'object' && data.hasOwnProperty('browserfsMessage') && data['browserfsMessage'];
}
function isAPIResponse(data) {
return data != null && typeof data === 'object' && data.hasOwnProperty('browserfsMessage') && data['browserfsMessage'];
}
var WorkerFile = (function (_super) {
__extends(WorkerFile, _super);
function WorkerFile(_fs, _path, _flag, _stat, remoteFdId, contents) {
_super.call(this, _fs, _path, _flag, _stat, contents);
this._remoteFdId = remoteFdId;
}
WorkerFile.prototype.getRemoteFdId = function () {
return this._remoteFdId;
};
WorkerFile.prototype.toRemoteArg = function () {
return {
type: SpecialArgType.FD,
id: this._remoteFdId,
data: bufferToTransferrableObject(this.getBuffer()),
stat: bufferToTransferrableObject(this.getStats().toBuffer()),
path: this.getPath(),
flag: this.getFlag().getFlagString()
};
};
WorkerFile.prototype._syncClose = function (type, cb) {
var _this = this;
if (this.isDirty()) {
this._fs.syncClose(type, this, function (e) {
if (!e) {
_this.resetDirty();
}
cb(e);
});
}
else {
cb();
}
};
WorkerFile.prototype.sync = function (cb) {
this._syncClose('sync', cb);
};
WorkerFile.prototype.close = function (cb) {
this._syncClose('close', cb);
};
return WorkerFile;
}(preload_file.PreloadFile));
var WorkerFS = (function (_super) {
__extends(WorkerFS, _super);
function WorkerFS(worker) {
var _this = this;
_super.call(this);
this._callbackConverter = new CallbackArgumentConverter();
this._isInitialized = false;
this._isReadOnly = false;
this._supportLinks = false;
this._supportProps = false;
this._outstandingRequests = {};
this._worker = worker;
this._worker.addEventListener('message', function (e) {
var resp = e.data;
if (isAPIResponse(resp)) {
var i, args = resp.args, fixedArgs = new Array(args.length);
for (i = 0; i < fixedArgs.length; i++) {
fixedArgs[i] = _this._argRemote2Local(args[i]);
}
_this._callbackConverter.toLocalArg(resp.cbId).apply(null, fixedArgs);
}
});
}
WorkerFS.isAvailable = function () {
return typeof (importScripts) !== 'undefined' || typeof (Worker) !== 'undefined';
};
WorkerFS.prototype.getName = function () {
return 'WorkerFS';
};
WorkerFS.prototype._argRemote2Local = function (arg) {
if (arg == null) {
return arg;
}
switch (typeof arg) {
case 'object':
if (arg['type'] != null && typeof arg['type'] === 'number') {
var specialArg = arg;
switch (specialArg.type) {
case SpecialArgType.API_ERROR:
return apiErrorRemote2Local(specialArg);
case SpecialArgType.FD:
var fdArg = specialArg;
return new WorkerFile(this, fdArg.path, file_flag.FileFlag.getFileFlag(fdArg.flag), node_fs_stats_1["default"].fromBuffer(transferrableObjectToBuffer(fdArg.stat)), fdArg.id, transferrableObjectToBuffer(fdArg.data));
case SpecialArgType.STATS:
return statsRemote2Local(specialArg);
case SpecialArgType.FILEFLAG:
return fileFlagRemote2Local(specialArg);
case SpecialArgType.BUFFER:
return bufferRemote2Local(specialArg);
case SpecialArgType.ERROR:
return errorRemote2Local(specialArg);
default:
return arg;
}
}
else {
return arg;
}
default:
return arg;
}
};
WorkerFS.prototype._argLocal2Remote = function (arg) {
if (arg == null) {
return arg;
}
switch (typeof arg) {
case "object":
if (arg instanceof node_fs_stats_1["default"]) {
return statsLocal2Remote(arg);
}
else if (arg instanceof api_error_1.ApiError) {
return apiErrorLocal2Remote(arg);
}
else if (arg instanceof WorkerFile) {
return arg.toRemoteArg();
}
else if (arg instanceof file_flag.FileFlag) {
return fileFlagLocal2Remote(arg);
}
else if (arg instanceof Buffer) {
return bufferLocal2Remote(arg);
}
else if (arg instanceof Error) {
return errorLocal2Remote(arg);
}
else {
return "Unknown argument";
}
case "function":
return this._callbackConverter.toRemoteArg(arg);
default:
return arg;
}
};
WorkerFS.prototype.initialize = function (cb) {
var _this = this;
if (!this._isInitialized) {
var message = {
browserfsMessage: true,
method: 'probe',
args: [this._argLocal2Remote(new Buffer(0)), this._callbackConverter.toRemoteArg(function (probeResponse) {
_this._isInitialized = true;
_this._isReadOnly = probeResponse.isReadOnly;
_this._supportLinks = probeResponse.supportsLinks;
_this._supportProps = probeResponse.supportsProps;
cb();
})]
};
this._worker.postMessage(message);
}
else {
cb();
}
};
WorkerFS.prototype.isReadOnly = function () { return this._isReadOnly; };
WorkerFS.prototype.supportsSynch = function () { return false; };
WorkerFS.prototype.supportsLinks = function () { return this._supportLinks; };
WorkerFS.prototype.supportsProps = function () { return this._supportProps; };
WorkerFS.prototype._rpc = function (methodName, args) {
var message = {
browserfsMessage: true,
method: methodName,
args: null
}, fixedArgs = new Array(args.length), i;
for (i = 0; i < args.length; i++) {
fixedArgs[i] = this._argLocal2Remote(args[i]);
}
message.args = fixedArgs;
this._worker.postMessage(message);
};
WorkerFS.prototype.rename = function (oldPath, newPath, cb) {
this._rpc('rename', arguments);
};
WorkerFS.prototype.stat = function (p, isLstat, cb) {
this._rpc('stat', arguments);
};
WorkerFS.prototype.open = function (p, flag, mode, cb) {
this._rpc('open', arguments);
};
WorkerFS.prototype.unlink = function (p, cb) {
this._rpc('unlink', arguments);
};
WorkerFS.prototype.rmdir = function (p, cb) {
this._rpc('rmdir', arguments);
};
WorkerFS.prototype.mkdir = function (p, mode, cb) {
this._rpc('mkdir', arguments);
};
WorkerFS.prototype.readdir = function (p, cb) {
this._rpc('readdir', arguments);
};
WorkerFS.prototype.exists = function (p, cb) {
this._rpc('exists', arguments);
};
WorkerFS.prototype.realpath = function (p, cache, cb) {
this._rpc('realpath', arguments);
};
WorkerFS.prototype.truncate = function (p, len, cb) {
this._rpc('truncate', arguments);
};
WorkerFS.prototype.readFile = function (fname, encoding, flag, cb) {
this._rpc('readFile', arguments);
};
WorkerFS.prototype.writeFile = function (fname, data, encoding, flag, mode, cb) {
this._rpc('writeFile', arguments);
};
WorkerFS.prototype.appendFile = function (fname, data, encoding, flag, mode, cb) {
this._rpc('appendFile', arguments);
};
WorkerFS.prototype.chmod = function (p, isLchmod, mode, cb) {
this._rpc('chmod', arguments);
};
WorkerFS.prototype.chown = function (p, isLchown, uid, gid, cb) {
this._rpc('chown', arguments);
};
WorkerFS.prototype.utimes = function (p, atime, mtime, cb) {
this._rpc('utimes', arguments);
};
WorkerFS.prototype.link = function (srcpath, dstpath, cb) {
this._rpc('link', arguments);
};
WorkerFS.prototype.symlink = function (srcpath, dstpath, type, cb) {
this._rpc('symlink', arguments);
};
WorkerFS.prototype.readlink = function (p, cb) {
this._rpc('readlink', arguments);
};
WorkerFS.prototype.syncClose = function (method, fd, cb) {
this._worker.postMessage({
browserfsMessage: true,
method: method,
args: [fd.toRemoteArg(), this._callbackConverter.toRemoteArg(cb)]
});
};
WorkerFS.attachRemoteListener = function (worker) {
var fdConverter = new FileDescriptorArgumentConverter();
function argLocal2Remote(arg, requestArgs, cb) {
switch (typeof arg) {
case 'object':
if (arg instanceof node_fs_stats_1["default"]) {
cb(null, statsLocal2Remote(arg));
}
else if (arg instanceof api_error_1.ApiError) {
cb(null, apiErrorLocal2Remote(arg));
}
else if (arg instanceof file.BaseFile) {
cb(null, fdConverter.toRemoteArg(arg, requestArgs[0], requestArgs[1], cb));
}
else if (arg instanceof file_flag.FileFlag) {
cb(null, fileFlagLocal2Remote(arg));
}
else if (arg instanceof Buffer) {
cb(null, bufferLocal2Remote(arg));
}
else if (arg instanceof Error) {
cb(null, errorLocal2Remote(arg));
}
else {
cb(null, arg);
}
break;
default:
cb(null, arg);
break;
}
}
function argRemote2Local(arg, fixedRequestArgs) {
if (arg == null) {
return arg;
}
switch (typeof arg) {
case 'object':
if (typeof arg['type'] === 'number') {
var specialArg = arg;
switch (specialArg.type) {
case SpecialArgType.CB:
var cbId = arg.id;
return function () {
var i, fixedArgs = new Array(arguments.length), message, countdown = arguments.length;
function abortAndSendError(err) {
if (countdown > 0) {
countdown = -1;
message = {
browserfsMessage: true,
cbId: cbId,
args: [apiErrorLocal2Remote(err)]
};
worker.postMessage(message);
}
}
for (i = 0; i < arguments.length; i++) {
(function (i, arg) {
argLocal2Remote(arg, fixedRequestArgs, function (err, fixedArg) {
fixedArgs[i] = fixedArg;
if (err) {
abortAndSendError(err);
}
else if (--countdown === 0) {
message = {
browserfsMessage: true,
cbId: cbId,
args: fixedArgs
};
worker.postMessage(message);
}
});
})(i, arguments[i]);
}
if (arguments.length === 0) {
message = {
browserfsMessage: true,
cbId: cbId,
args: fixedArgs
};
worker.postMessage(message);
}
};
case SpecialArgType.API_ERROR:
return apiErrorRemote2Local(specialArg);
case SpecialArgType.STATS:
return statsRemote2Local(specialArg);
case SpecialArgType.FILEFLAG:
return fileFlagRemote2Local(specialArg);
case SpecialArgType.BUFFER:
return bufferRemote2Local(specialArg);
case SpecialArgType.ERROR:
return errorRemote2Local(specialArg);
default:
return arg;
}
}
else {
return arg;
}
default:
return arg;
}
}
worker.addEventListener('message', function (e) {
var request = e.data;
if (isAPIRequest(request)) {
var args = request.args, fixedArgs = new Array(args.length), i;
switch (request.method) {
case 'close':
case 'sync':
(function () {
var remoteCb = args[1];
fdConverter.applyFdAPIRequest(request, function (err) {
var response = {
browserfsMessage: true,
cbId: remoteCb.id,
args: err ? [apiErrorLocal2Remote(err)] : []
};
worker.postMessage(response);
});
})();
break;
case 'probe':
(function () {
var rootFs = fs.getRootFS(), remoteCb = args[1], probeResponse = {
type: SpecialArgType.PROBE,
isReadOnly: rootFs.isReadOnly(),
supportsLinks: rootFs.supportsLinks(),
supportsProps: rootFs.supportsProps()
}, response = {
browserfsMessage: true,
cbId: remoteCb.id,
args: [probeResponse]
};
worker.postMessage(response);
})();
break;
default:
for (i = 0; i < args.length; i++) {
fixedArgs[i] = argRemote2Local(args[i], fixedArgs);
}
var rootFS = fs.getRootFS();
rootFS[request.method].apply(rootFS, fixedArgs);
break;
}
}
});
};
return WorkerFS;
}(file_system.BaseFileSystem));
exports.__esModule = true;
exports["default"] = WorkerFS;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2VyRlMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2VuZC9Xb3JrZXJGUy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFPLFdBQVcsV0FBVyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ3BELDBCQUF1QixtQkFBbUIsQ0FBQyxDQUFBO0FBQzNDLElBQU8sU0FBUyxXQUFXLG1CQUFtQixDQUFDLENBQUM7QUFDaEQscUJBQXFELGNBQWMsQ0FBQyxDQUFBO0FBQ3BFLElBQU8sSUFBSSxXQUFXLGNBQWMsQ0FBQyxDQUFDO0FBQ3RDLDhCQUF5Qyx1QkFBdUIsQ0FBQyxDQUFBO0FBQ2pFLElBQU8sWUFBWSxXQUFXLHlCQUF5QixDQUFDLENBQUM7QUFDekQsSUFBTyxNQUFNLFdBQVcsZ0JBQWdCLENBQUMsQ0FBQztBQUMxQyxJQUFPLEVBQUUsV0FBVyxpQkFBaUIsQ0FBQyxDQUFDO0FBTXZDLElBQUssY0FpQko7QUFqQkQsV0FBSyxjQUFjO0lBRWpCLCtDQUFFLENBQUE7SUFFRiwrQ0FBRSxDQUFBO0lBRUYsNkRBQVMsQ0FBQTtJQUVULHFEQUFLLENBQUE7SUFFTCxxREFBSyxDQUFBO0lBRUwsMkRBQVEsQ0FBQTtJQUVSLHVEQUFNLENBQUE7SUFFTixxREFBSyxDQUFBO0FBQ1AsQ0FBQyxFQWpCSSxjQUFjLEtBQWQsY0FBYyxRQWlCbEI7QUFxQkQ7SUFBQTtRQUNVLGVBQVUsR0FBK0IsRUFBRSxDQUFDO1FBQzVDLFlBQU8sR0FBVyxDQUFDLENBQUM7SUFnQjlCLENBQUM7SUFkUSwrQ0FBVyxHQUFsQixVQUFtQixFQUFZO1FBQzdCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUM7WUFDTCxJQUFJLEVBQUUsY0FBYyxDQUFDLEVBQUU7WUFDdkIsRUFBRSxFQUFF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