UNPKG

browserfs

Version:

A filesystem in your browser!

606 lines 84.3 kB
"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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