diff --git a/dist/idbfs.js b/dist/idbfs.js index 67fc4ec..69fb4e5 100644 --- a/dist/idbfs.js +++ b/dist/idbfs.js @@ -7307,6 +7307,8 @@ define('src/constants',['require'],function(require) { var O_APPEND = 'APPEND'; return { + FILE_SYSTEM_NAME: 'local', + FILE_STORE_NAME: 'files', IDB_RO: 'readonly', @@ -7352,7 +7354,8 @@ define('src/constants',['require'],function(require) { }; }); -define('src/providers/indexeddb',['require','src/constants','src/constants','src/constants'],function(require) { +define('src/providers/indexeddb',['require','src/constants','src/constants','src/constants','src/constants'],function(require) { + var FILE_SYSTEM_NAME = require('src/constants').FILE_SYSTEM_NAME; var FILE_STORE_NAME = require('src/constants').FILE_STORE_NAME; var indexedDB = window.indexedDB || @@ -7426,7 +7429,7 @@ define('src/providers/indexeddb',['require','src/constants','src/constants','src function IndexedDB(name) { - this.name = name || "local"; + this.name = name || FILE_SYSTEM_NAME; this.db = null; } IndexedDB.isSupported = function() { @@ -7479,7 +7482,8 @@ define('src/providers/indexeddb',['require','src/constants','src/constants','src return IndexedDB; }); -define('src/providers/memory',['require'],function(require) { +define('src/providers/memory',['require','src/constants'],function(require) { + var FILE_SYSTEM_NAME = require('src/constants').FILE_SYSTEM_NAME; function MemoryContext(db, readOnly) { this.readOnly = readOnly; @@ -7515,7 +7519,7 @@ define('src/providers/memory',['require'],function(require) { function Memory(name) { - this.name = name || "local"; + this.name = name || FILE_SYSTEM_NAME; this.db = {}; } Memory.isSupported = function() { @@ -7523,7 +7527,6 @@ define('src/providers/memory',['require'],function(require) { }; Memory.prototype.open = function(callback) { - var that = this; callback(null, true); }; Memory.prototype.getReadOnlyContext = function() { @@ -7544,68 +7547,7 @@ define('src/providers/providers',['require','src/providers/indexeddb','src/provi }; }); -define('src/filesystems-manager',['require','src/shared','src/constants','src/constants','src/error'],function(require) { - - var guid = require('src/shared').guid; - var FS_READY = require('src/constants').FS_READY; - var FS_ERROR = require('src/constants').FS_ERROR; - var EFileSystemError = require('src/error').EFileSystemError; - - var filesystems = {}; - - function FileSystemWrapper(fs) { - this.fs = fs; - this.openFiles = {}; - this.nextDescriptor = 1; - this.queue = []; - } - - FileSystemWrapper.prototype.allocDescriptor = function(openFileDescription) { - var fd = this.nextDescriptor ++; - this.openFiles[fd] = openFileDescription; - return fd; - }; - - FileSystemWrapper.prototype.releaseDescriptor = function(fd) { - delete this.openFiles[fd]; - }; - - FileSystemWrapper.prototype.queueOrRun = function(operation) { - var error; - var fs = this.fs; - - if(FS_READY == fs.readyState) { - operation.call(fs); - } else if(FS_ERROR == fs.readyState) { - error = new EFileSystemError('unknown error'); - } else { - this.queue.push(operation); - } - - return error; - }; - - FileSystemWrapper.prototype.runQueued = function() { - this.queue.forEach(function(operation) { - operation.call(this); - }.bind(this.fs)); - this.queue = null; - }; - - - return { - register: function(fs) { - fs.id = guid(); - filesystems[fs.id] = new FileSystemWrapper(fs); - }, - - get: function(fs) { - return filesystems[fs.id]; - } - }; -}); - -define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','src/path','src/path','src/shared','src/shared','src/shared','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/providers/providers','src/filesystems-manager'],function(require) { +define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','src/path','src/path','src/shared','src/shared','src/shared','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/error','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/constants','src/providers/providers'],function(require) { var _ = require('lodash'); @@ -7636,6 +7578,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr var ELoop = require('src/error').ELoop; var EFileSystemError = require('src/error').EFileSystemError; + var FILE_SYSTEM_NAME = require('src/constants').FILE_SYSTEM_NAME; var FS_FORMAT = require('src/constants').FS_FORMAT; var MODE_FILE = require('src/constants').MODE_FILE; var MODE_DIRECTORY = require('src/constants').MODE_DIRECTORY; @@ -7654,8 +7597,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr var O_APPEND = require('src/constants').O_APPEND; var O_FLAGS = require('src/constants').O_FLAGS; - var Providers = require('src/providers/providers'); - var FileSystemsManager = require('src/filesystems-manager'); + var providers = require('src/providers/providers'); /* * DirectoryEntry @@ -7734,7 +7676,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr } else if(!rootDirectoryNode) { callback(new ENoEntry('path does not exist')); } else { - callback(undefined, rootDirectoryNode); + callback(null, rootDirectoryNode); } } @@ -7777,7 +7719,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr follow_symbolic_link(node.data); } } else { - callback(undefined, node); + callback(null, node); } } } @@ -8078,7 +8020,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr callback(error); } else { fileNode = result; - callback(undefined, fileNode); + callback(null, fileNode); } } @@ -8110,7 +8052,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined, fileNode); + callback(null, fileNode); } } } @@ -8123,7 +8065,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined, length); + callback(null, length); } } @@ -8187,7 +8129,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(undefined === position) { ofd.position += length; } - callback(undefined, length); + callback(null, length); } } @@ -8211,7 +8153,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined, result); + callback(null, result); } } @@ -8223,7 +8165,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined, result); + callback(null, result); } } @@ -8270,7 +8212,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined, result); + callback(null, result); } } } @@ -8434,7 +8376,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr } else { directoryData = result; var files = Object.keys(directoryData); - callback(undefined, files); + callback(null, files); } } @@ -8544,7 +8486,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(result.mode != MODE_SYMBOLIC_LINK) { callback(new EInvalid("path not a symbolic link")); } else { - callback(undefined, result.data); + callback(null, result.data); } } } @@ -8569,34 +8511,72 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr * For example: "FORMAT" will cause the file system to be formatted. * No explicit flags are set by default. * - * contextProvider: a explicit constructor function to use for the file - * system's database context provider. A number of context - * providers are provided, and users can write one of their - * own and pass it in to be used. By default an IndexedDB - * provider is used. + * provider: an explicit storage provider to use for the file + * system's database context provider. A number of context + * providers are included (see /src/providers), and users + * can write one of their own and pass it in to be used. + * By default an IndexedDB provider is used. * - * onReady: a callback function to be executed when the file system becomes - * ready for use. Depending on the context provider used, this might - * be right away, or could take some time. The onReady callback should - * check the file system's `readyState` and `error` properties to - * make sure it is usable. + * callback: a callback function to be executed when the file system becomes + * ready for use. Depending on the context provider used, this might + * be right away, or could take some time. The callback should expect + * an `error` argument, which will be null if everything worked. Also + * users should check the file system's `readyState` and `error` + * properties to make sure it is usable. */ - function FileSystem(options) { + function FileSystem(options, callback) { options = options || {}; + callback = callback || nop; - var fs = this; - FileSystemsManager.register(fs); - - var name = options.name || "local"; + var name = options.name || FILE_SYSTEM_NAME; var flags = options.flags; - var provider = options.provider || new Providers.Default(name); - var onReady = options.onReady || nop; + var provider = options.provider || new providers.Default(name); var forceFormatting = _(flags).contains(FS_FORMAT); + var fs = this; fs.readyState = FS_PENDING; fs.name = name; fs.error = null; + // Safely expose the list of open files and file + // descriptor management functions + var openFiles = {}; + var nextDescriptor = 1; + Object.defineProperty(this, "openFiles", { + get: function() { return openFiles; } + }); + this.allocDescriptor = function(openFileDescription) { + var fd = nextDescriptor ++; + openFiles[fd] = openFileDescription; + return fd; + }; + this.releaseDescriptor = function(fd) { + delete openFiles[fd]; + }; + + // Safely expose the operation queue + var queue = []; + this.queueOrRun = function(operation) { + var error; + + if(FS_READY == fs.readyState) { + operation.call(fs); + } else if(FS_ERROR == fs.readyState) { + error = new EFileSystemError('unknown error'); + } else { + queue.push(operation); + } + + return error; + }; + function runQueued() { + queue.forEach(function(operation) { + operation.call(this); + }.bind(fs)); + queue = null; + } + + // Open file system storage provider provider.open(function(err, needsFormatting) { function complete(error) { fs.provider = provider; @@ -8604,9 +8584,9 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr fs.readyState = FS_ERROR; } else { fs.readyState = FS_READY; - FileSystemsManager.get(fs).runQueued(); + runQueued(); } - onReady(); + callback(error); } if(err) { @@ -8615,19 +8595,23 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr // If we don't need or want formatting, we're done if(!(forceFormatting || needsFormatting)) { - return complete(); + return complete(null); } // otherwise format the fs first var context = provider.getReadWriteContext(); context.clear(function(err) { if(err) { - return complete(err); + complete(err); + return; } make_root_directory(context, complete); }); }); } + // Expose storage providers on FileSystem constructor + FileSystem.providers = providers; + function _open(fs, context, path, flags, callback) { function check_result(error, fileNode) { if(error) { @@ -8640,8 +8624,8 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr position = 0; } var openFileDescription = new OpenFileDescription(fileNode.id, flags, position); - var fd = FileSystemsManager.get(fs).allocDescriptor(openFileDescription); - callback(undefined, fd); + var fd = fs.allocDescriptor(openFileDescription); + callback(null, fd); } } @@ -8654,12 +8638,11 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr } function _close(fs, fd, callback) { - var wrapped = FileSystemsManager.get(fs); - if(!_(wrapped.openFiles).has(fd)) { + if(!_(fs.openFiles).has(fd)) { callback(new EBadFileDescriptor('invalid file descriptor')); } else { - wrapped.releaseDescriptor(fd); - callback(undefined); + fs.releaseDescriptor(fd); + callback(null); } } @@ -8668,7 +8651,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -8680,7 +8663,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -8693,7 +8676,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr callback(error); } else { var stats = new Stats(result, name); - callback(undefined, stats); + callback(null, stats); } } @@ -8706,11 +8689,11 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr callback(error); } else { var stats = new Stats(result, fs.name); - callback(undefined, stats); + callback(null, stats); } } - var ofd = FileSystemsManager.get(fs).openFiles[fd]; + var ofd = fs.openFiles[fd]; if(!ofd) { callback(new EBadFileDescriptor('invalid file descriptor')); @@ -8724,7 +8707,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -8736,7 +8719,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -8751,11 +8734,11 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined, nbytes); + callback(null, nbytes); } } - var ofd = FileSystemsManager.get(fs).openFiles[fd]; + var ofd = fs.openFiles[fd]; if(!ofd) { callback(new EBadFileDescriptor('invalid file descriptor')); @@ -8786,7 +8769,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr return callback(err); } var ofd = new OpenFileDescription(fileNode.id, flags, 0); - var fd = FileSystemsManager.get(fs).allocDescriptor(ofd); + var fd = fs.allocDescriptor(ofd); fstat_file(context, ofd, function(err2, fstatResult) { if(err2) { @@ -8801,7 +8784,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(err3) { return callback(err3); } - FileSystemsManager.get(fs).releaseDescriptor(fd); + fs.releaseDescriptor(fd); var data; if(options.encoding === 'utf8') { @@ -8809,7 +8792,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr } else { data = buffer; } - callback(undefined, data); + callback(null, data); }); }); @@ -8824,11 +8807,11 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined, nbytes); + callback(null, nbytes); } } - var ofd = FileSystemsManager.get(fs).openFiles[fd]; + var ofd = fs.openFiles[fd]; if(!ofd) { callback(new EBadFileDescriptor('invalid file descriptor')); @@ -8865,14 +8848,14 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr return callback(err); } var ofd = new OpenFileDescription(fileNode.id, flags, 0); - var fd = FileSystemsManager.get(fs).allocDescriptor(ofd); + var fd = fs.allocDescriptor(ofd); write_data(context, ofd, data, 0, data.length, 0, function(err2, nbytes) { if(err2) { return callback(err2); } - FileSystemsManager.get(fs).releaseDescriptor(fd); - callback(undefined); + fs.releaseDescriptor(fd); + callback(null); }); }); } @@ -8902,12 +8885,12 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr callback(new EInvalid('resulting file offset would be negative')); } else { ofd.position = stats.size + offset; - callback(undefined, ofd.position); + callback(null, ofd.position); } } } - var ofd = FileSystemsManager.get(fs).openFiles[fd]; + var ofd = fs.openFiles[fd]; if(!ofd) { callback(new EBadFileDescriptor('invalid file descriptor')); @@ -8918,14 +8901,14 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr callback(new EInvalid('resulting file offset would be negative')); } else { ofd.position = offset; - callback(undefined, ofd.position); + callback(null, ofd.position); } } else if('CUR' === whence) { if(ofd.position + offset < 0) { callback(new EInvalid('resulting file offset would be negative')); } else { ofd.position += offset; - callback(undefined, ofd.position); + callback(null, ofd.position); } } else if('END' === whence) { fstat_file(context, ofd, update_descriptor_position); @@ -8939,7 +8922,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined, files); + callback(null, files); } } @@ -8955,7 +8938,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -8975,7 +8958,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -8987,7 +8970,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr if(error) { callback(error); } else { - callback(undefined, result); + callback(null, result); } } @@ -9004,7 +8987,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr callback(error); } else { var stats = new Stats(result, fs.name); - callback(undefined, stats); + callback(null, stats); } } @@ -9026,7 +9009,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr FileSystem.prototype.open = function(path, flags, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _open(fs, context, path, flags, callback); @@ -9039,7 +9022,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.mkdir = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _mkdir(context, path, callback); @@ -9049,7 +9032,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.rmdir = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _rmdir(context, path, callback); @@ -9059,7 +9042,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.stat = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _stat(context, fs.name, path, callback); @@ -9069,7 +9052,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.fstat = function(fd, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _fstat(fs, context, fd, callback); @@ -9079,7 +9062,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.link = function(oldpath, newpath, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _link(context, oldpath, newpath, callback); @@ -9089,7 +9072,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.unlink = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _unlink(context, path, callback); @@ -9099,7 +9082,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.read = function(fd, buffer, offset, length, position, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _read(fs, context, fd, buffer, offset, length, position, callback); @@ -9109,7 +9092,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.readFile = function(path, options, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _readFile(fs, context, path, options, callback); @@ -9119,7 +9102,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.write = function(fd, buffer, offset, length, position, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _write(fs, context, fd, buffer, offset, length, position, callback); @@ -9130,7 +9113,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.writeFile = function(path, data, options, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _writeFile(fs, context, path, data, options, callback); @@ -9140,7 +9123,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.lseek = function(fd, offset, whence, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _lseek(fs, context, fd, offset, whence, callback); @@ -9150,7 +9133,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.readdir = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _readdir(context, path, callback); @@ -9160,7 +9143,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.rename = function(oldpath, newpath, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _rename(context, oldpath, newpath, callback); @@ -9170,7 +9153,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.readlink = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _readlink(context, path, callback); @@ -9180,7 +9163,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.symlink = function(srcpath, dstpath, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _symlink(context, srcpath, dstpath, callback); @@ -9190,7 +9173,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; FileSystem.prototype.lstat = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _lstat(fs, context, path, callback); @@ -9200,8 +9183,7 @@ define('src/fs',['require','lodash','encoding-indexes','encoding','src/path','sr }; return { - FileSystem: FileSystem, - Providers: Providers + FileSystem: FileSystem }; }); diff --git a/src/constants.js b/src/constants.js index c4ba915..847067c 100644 --- a/src/constants.js +++ b/src/constants.js @@ -8,6 +8,8 @@ define(function(require) { var O_APPEND = 'APPEND'; return { + FILE_SYSTEM_NAME: 'local', + FILE_STORE_NAME: 'files', IDB_RO: 'readonly', diff --git a/src/filesystems-manager.js b/src/filesystems-manager.js deleted file mode 100644 index 5873c98..0000000 --- a/src/filesystems-manager.js +++ /dev/null @@ -1,60 +0,0 @@ -define(function(require) { - - var guid = require('src/shared').guid; - var FS_READY = require('src/constants').FS_READY; - var FS_ERROR = require('src/constants').FS_ERROR; - var EFileSystemError = require('src/error').EFileSystemError; - - var filesystems = {}; - - function FileSystemWrapper(fs) { - this.fs = fs; - this.openFiles = {}; - this.nextDescriptor = 1; - this.queue = []; - } - - FileSystemWrapper.prototype.allocDescriptor = function(openFileDescription) { - var fd = this.nextDescriptor ++; - this.openFiles[fd] = openFileDescription; - return fd; - }; - - FileSystemWrapper.prototype.releaseDescriptor = function(fd) { - delete this.openFiles[fd]; - }; - - FileSystemWrapper.prototype.queueOrRun = function(operation) { - var error; - var fs = this.fs; - - if(FS_READY == fs.readyState) { - operation.call(fs); - } else if(FS_ERROR == fs.readyState) { - error = new EFileSystemError('unknown error'); - } else { - this.queue.push(operation); - } - - return error; - }; - - FileSystemWrapper.prototype.runQueued = function() { - this.queue.forEach(function(operation) { - operation.call(this); - }.bind(this.fs)); - this.queue = null; - }; - - - return { - register: function(fs) { - fs.id = guid(); - filesystems[fs.id] = new FileSystemWrapper(fs); - }, - - get: function(fs) { - return filesystems[fs.id]; - } - }; -}); diff --git a/src/fs.js b/src/fs.js index aff3548..6609720 100644 --- a/src/fs.js +++ b/src/fs.js @@ -29,6 +29,7 @@ define(function(require) { var ELoop = require('src/error').ELoop; var EFileSystemError = require('src/error').EFileSystemError; + var FILE_SYSTEM_NAME = require('src/constants').FILE_SYSTEM_NAME; var FS_FORMAT = require('src/constants').FS_FORMAT; var MODE_FILE = require('src/constants').MODE_FILE; var MODE_DIRECTORY = require('src/constants').MODE_DIRECTORY; @@ -47,8 +48,7 @@ define(function(require) { var O_APPEND = require('src/constants').O_APPEND; var O_FLAGS = require('src/constants').O_FLAGS; - var Providers = require('src/providers/providers'); - var FileSystemsManager = require('src/filesystems-manager'); + var providers = require('src/providers/providers'); /* * DirectoryEntry @@ -127,7 +127,7 @@ define(function(require) { } else if(!rootDirectoryNode) { callback(new ENoEntry('path does not exist')); } else { - callback(undefined, rootDirectoryNode); + callback(null, rootDirectoryNode); } } @@ -170,7 +170,7 @@ define(function(require) { follow_symbolic_link(node.data); } } else { - callback(undefined, node); + callback(null, node); } } } @@ -471,7 +471,7 @@ define(function(require) { callback(error); } else { fileNode = result; - callback(undefined, fileNode); + callback(null, fileNode); } } @@ -503,7 +503,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined, fileNode); + callback(null, fileNode); } } } @@ -516,7 +516,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined, length); + callback(null, length); } } @@ -580,7 +580,7 @@ define(function(require) { if(undefined === position) { ofd.position += length; } - callback(undefined, length); + callback(null, length); } } @@ -604,7 +604,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined, result); + callback(null, result); } } @@ -616,7 +616,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined, result); + callback(null, result); } } @@ -663,7 +663,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined, result); + callback(null, result); } } } @@ -827,7 +827,7 @@ define(function(require) { } else { directoryData = result; var files = Object.keys(directoryData); - callback(undefined, files); + callback(null, files); } } @@ -937,7 +937,7 @@ define(function(require) { if(result.mode != MODE_SYMBOLIC_LINK) { callback(new EInvalid("path not a symbolic link")); } else { - callback(undefined, result.data); + callback(null, result.data); } } } @@ -962,34 +962,72 @@ define(function(require) { * For example: "FORMAT" will cause the file system to be formatted. * No explicit flags are set by default. * - * contextProvider: a explicit constructor function to use for the file - * system's database context provider. A number of context - * providers are provided, and users can write one of their - * own and pass it in to be used. By default an IndexedDB - * provider is used. + * provider: an explicit storage provider to use for the file + * system's database context provider. A number of context + * providers are included (see /src/providers), and users + * can write one of their own and pass it in to be used. + * By default an IndexedDB provider is used. * - * onReady: a callback function to be executed when the file system becomes - * ready for use. Depending on the context provider used, this might - * be right away, or could take some time. The onReady callback should - * check the file system's `readyState` and `error` properties to - * make sure it is usable. + * callback: a callback function to be executed when the file system becomes + * ready for use. Depending on the context provider used, this might + * be right away, or could take some time. The callback should expect + * an `error` argument, which will be null if everything worked. Also + * users should check the file system's `readyState` and `error` + * properties to make sure it is usable. */ - function FileSystem(options) { + function FileSystem(options, callback) { options = options || {}; + callback = callback || nop; - var fs = this; - FileSystemsManager.register(fs); - - var name = options.name || "local"; + var name = options.name || FILE_SYSTEM_NAME; var flags = options.flags; - var provider = options.provider || new Providers.Default(name); - var onReady = options.onReady || nop; + var provider = options.provider || new providers.Default(name); var forceFormatting = _(flags).contains(FS_FORMAT); + var fs = this; fs.readyState = FS_PENDING; fs.name = name; fs.error = null; + // Safely expose the list of open files and file + // descriptor management functions + var openFiles = {}; + var nextDescriptor = 1; + Object.defineProperty(this, "openFiles", { + get: function() { return openFiles; } + }); + this.allocDescriptor = function(openFileDescription) { + var fd = nextDescriptor ++; + openFiles[fd] = openFileDescription; + return fd; + }; + this.releaseDescriptor = function(fd) { + delete openFiles[fd]; + }; + + // Safely expose the operation queue + var queue = []; + this.queueOrRun = function(operation) { + var error; + + if(FS_READY == fs.readyState) { + operation.call(fs); + } else if(FS_ERROR == fs.readyState) { + error = new EFileSystemError('unknown error'); + } else { + queue.push(operation); + } + + return error; + }; + function runQueued() { + queue.forEach(function(operation) { + operation.call(this); + }.bind(fs)); + queue = null; + } + + // Open file system storage provider provider.open(function(err, needsFormatting) { function complete(error) { fs.provider = provider; @@ -997,9 +1035,9 @@ define(function(require) { fs.readyState = FS_ERROR; } else { fs.readyState = FS_READY; - FileSystemsManager.get(fs).runQueued(); + runQueued(); } - onReady(); + callback(error); } if(err) { @@ -1008,19 +1046,23 @@ define(function(require) { // If we don't need or want formatting, we're done if(!(forceFormatting || needsFormatting)) { - return complete(); + return complete(null); } // otherwise format the fs first var context = provider.getReadWriteContext(); context.clear(function(err) { if(err) { - return complete(err); + complete(err); + return; } make_root_directory(context, complete); }); }); } + // Expose storage providers on FileSystem constructor + FileSystem.providers = providers; + function _open(fs, context, path, flags, callback) { function check_result(error, fileNode) { if(error) { @@ -1033,8 +1075,8 @@ define(function(require) { position = 0; } var openFileDescription = new OpenFileDescription(fileNode.id, flags, position); - var fd = FileSystemsManager.get(fs).allocDescriptor(openFileDescription); - callback(undefined, fd); + var fd = fs.allocDescriptor(openFileDescription); + callback(null, fd); } } @@ -1047,12 +1089,11 @@ define(function(require) { } function _close(fs, fd, callback) { - var wrapped = FileSystemsManager.get(fs); - if(!_(wrapped.openFiles).has(fd)) { + if(!_(fs.openFiles).has(fd)) { callback(new EBadFileDescriptor('invalid file descriptor')); } else { - wrapped.releaseDescriptor(fd); - callback(undefined); + fs.releaseDescriptor(fd); + callback(null); } } @@ -1061,7 +1102,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -1073,7 +1114,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -1086,7 +1127,7 @@ define(function(require) { callback(error); } else { var stats = new Stats(result, name); - callback(undefined, stats); + callback(null, stats); } } @@ -1099,11 +1140,11 @@ define(function(require) { callback(error); } else { var stats = new Stats(result, fs.name); - callback(undefined, stats); + callback(null, stats); } } - var ofd = FileSystemsManager.get(fs).openFiles[fd]; + var ofd = fs.openFiles[fd]; if(!ofd) { callback(new EBadFileDescriptor('invalid file descriptor')); @@ -1117,7 +1158,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -1129,7 +1170,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -1144,11 +1185,11 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined, nbytes); + callback(null, nbytes); } } - var ofd = FileSystemsManager.get(fs).openFiles[fd]; + var ofd = fs.openFiles[fd]; if(!ofd) { callback(new EBadFileDescriptor('invalid file descriptor')); @@ -1179,7 +1220,7 @@ define(function(require) { return callback(err); } var ofd = new OpenFileDescription(fileNode.id, flags, 0); - var fd = FileSystemsManager.get(fs).allocDescriptor(ofd); + var fd = fs.allocDescriptor(ofd); fstat_file(context, ofd, function(err2, fstatResult) { if(err2) { @@ -1194,7 +1235,7 @@ define(function(require) { if(err3) { return callback(err3); } - FileSystemsManager.get(fs).releaseDescriptor(fd); + fs.releaseDescriptor(fd); var data; if(options.encoding === 'utf8') { @@ -1202,7 +1243,7 @@ define(function(require) { } else { data = buffer; } - callback(undefined, data); + callback(null, data); }); }); @@ -1217,11 +1258,11 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined, nbytes); + callback(null, nbytes); } } - var ofd = FileSystemsManager.get(fs).openFiles[fd]; + var ofd = fs.openFiles[fd]; if(!ofd) { callback(new EBadFileDescriptor('invalid file descriptor')); @@ -1258,14 +1299,14 @@ define(function(require) { return callback(err); } var ofd = new OpenFileDescription(fileNode.id, flags, 0); - var fd = FileSystemsManager.get(fs).allocDescriptor(ofd); + var fd = fs.allocDescriptor(ofd); write_data(context, ofd, data, 0, data.length, 0, function(err2, nbytes) { if(err2) { return callback(err2); } - FileSystemsManager.get(fs).releaseDescriptor(fd); - callback(undefined); + fs.releaseDescriptor(fd); + callback(null); }); }); } @@ -1295,12 +1336,12 @@ define(function(require) { callback(new EInvalid('resulting file offset would be negative')); } else { ofd.position = stats.size + offset; - callback(undefined, ofd.position); + callback(null, ofd.position); } } } - var ofd = FileSystemsManager.get(fs).openFiles[fd]; + var ofd = fs.openFiles[fd]; if(!ofd) { callback(new EBadFileDescriptor('invalid file descriptor')); @@ -1311,14 +1352,14 @@ define(function(require) { callback(new EInvalid('resulting file offset would be negative')); } else { ofd.position = offset; - callback(undefined, ofd.position); + callback(null, ofd.position); } } else if('CUR' === whence) { if(ofd.position + offset < 0) { callback(new EInvalid('resulting file offset would be negative')); } else { ofd.position += offset; - callback(undefined, ofd.position); + callback(null, ofd.position); } } else if('END' === whence) { fstat_file(context, ofd, update_descriptor_position); @@ -1332,7 +1373,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined, files); + callback(null, files); } } @@ -1348,7 +1389,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -1368,7 +1409,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined); + callback(null); } } @@ -1380,7 +1421,7 @@ define(function(require) { if(error) { callback(error); } else { - callback(undefined, result); + callback(null, result); } } @@ -1397,7 +1438,7 @@ define(function(require) { callback(error); } else { var stats = new Stats(result, fs.name); - callback(undefined, stats); + callback(null, stats); } } @@ -1419,7 +1460,7 @@ define(function(require) { FileSystem.prototype.open = function(path, flags, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _open(fs, context, path, flags, callback); @@ -1432,7 +1473,7 @@ define(function(require) { }; FileSystem.prototype.mkdir = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _mkdir(context, path, callback); @@ -1442,7 +1483,7 @@ define(function(require) { }; FileSystem.prototype.rmdir = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _rmdir(context, path, callback); @@ -1452,7 +1493,7 @@ define(function(require) { }; FileSystem.prototype.stat = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _stat(context, fs.name, path, callback); @@ -1462,7 +1503,7 @@ define(function(require) { }; FileSystem.prototype.fstat = function(fd, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _fstat(fs, context, fd, callback); @@ -1472,7 +1513,7 @@ define(function(require) { }; FileSystem.prototype.link = function(oldpath, newpath, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _link(context, oldpath, newpath, callback); @@ -1482,7 +1523,7 @@ define(function(require) { }; FileSystem.prototype.unlink = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _unlink(context, path, callback); @@ -1492,7 +1533,7 @@ define(function(require) { }; FileSystem.prototype.read = function(fd, buffer, offset, length, position, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _read(fs, context, fd, buffer, offset, length, position, callback); @@ -1502,7 +1543,7 @@ define(function(require) { }; FileSystem.prototype.readFile = function(path, options, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _readFile(fs, context, path, options, callback); @@ -1512,7 +1553,7 @@ define(function(require) { }; FileSystem.prototype.write = function(fd, buffer, offset, length, position, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _write(fs, context, fd, buffer, offset, length, position, callback); @@ -1523,7 +1564,7 @@ define(function(require) { }; FileSystem.prototype.writeFile = function(path, data, options, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _writeFile(fs, context, path, data, options, callback); @@ -1533,7 +1574,7 @@ define(function(require) { }; FileSystem.prototype.lseek = function(fd, offset, whence, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _lseek(fs, context, fd, offset, whence, callback); @@ -1543,7 +1584,7 @@ define(function(require) { }; FileSystem.prototype.readdir = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _readdir(context, path, callback); @@ -1553,7 +1594,7 @@ define(function(require) { }; FileSystem.prototype.rename = function(oldpath, newpath, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _rename(context, oldpath, newpath, callback); @@ -1563,7 +1604,7 @@ define(function(require) { }; FileSystem.prototype.readlink = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _readlink(context, path, callback); @@ -1573,7 +1614,7 @@ define(function(require) { }; FileSystem.prototype.symlink = function(srcpath, dstpath, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _symlink(context, srcpath, dstpath, callback); @@ -1583,7 +1624,7 @@ define(function(require) { }; FileSystem.prototype.lstat = function(path, callback) { var fs = this; - var error = FileSystemsManager.get(fs).queueOrRun( + var error = fs.queueOrRun( function() { var context = fs.provider.getReadWriteContext(); _lstat(fs, context, path, callback); @@ -1593,8 +1634,7 @@ define(function(require) { }; return { - FileSystem: FileSystem, - Providers: Providers + FileSystem: FileSystem }; }); diff --git a/src/providers/indexeddb.js b/src/providers/indexeddb.js index 0d4e188..540ec9c 100644 --- a/src/providers/indexeddb.js +++ b/src/providers/indexeddb.js @@ -1,4 +1,5 @@ define(function(require) { + var FILE_SYSTEM_NAME = require('src/constants').FILE_SYSTEM_NAME; var FILE_STORE_NAME = require('src/constants').FILE_STORE_NAME; var indexedDB = window.indexedDB || @@ -72,7 +73,7 @@ define(function(require) { function IndexedDB(name) { - this.name = name || "local"; + this.name = name || FILE_SYSTEM_NAME; this.db = null; } IndexedDB.isSupported = function() { diff --git a/src/providers/memory.js b/src/providers/memory.js index 63e74e1..a813f24 100644 --- a/src/providers/memory.js +++ b/src/providers/memory.js @@ -1,4 +1,5 @@ define(function(require) { + var FILE_SYSTEM_NAME = require('src/constants').FILE_SYSTEM_NAME; function MemoryContext(db, readOnly) { this.readOnly = readOnly; @@ -34,7 +35,7 @@ define(function(require) { function Memory(name) { - this.name = name || "local"; + this.name = name || FILE_SYSTEM_NAME; this.db = {}; } Memory.isSupported = function() { @@ -42,7 +43,6 @@ define(function(require) { }; Memory.prototype.open = function(callback) { - var that = this; callback(null, true); }; Memory.prototype.getReadOnlyContext = function() { diff --git a/tests/spec/idbfs.spec.js b/tests/spec/idbfs.spec.js index 1bb42ab..9911dc3 100644 --- a/tests/spec/idbfs.spec.js +++ b/tests/spec/idbfs.spec.js @@ -103,7 +103,7 @@ describe('fs.stat', function() { runs(function() { expect(_result).toBeDefined(); - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result['node']).toBeDefined(); expect(_result['dev']).toEqual(that.db_name); expect(_result['size']).toBeDefined(); @@ -149,7 +149,7 @@ describe('fs.stat', function() { runs(function() { expect(_result).toBeDefined(); expect(_node).toBeDefined(); - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result['node']).toEqual(_node); }); }); @@ -196,7 +196,7 @@ describe('fs.fstat', function() { runs(function() { expect(_result).toBeDefined(); - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result['node']).toBeDefined(); expect(_result['dev']).toEqual(that.db_name); expect(_result['size']).toBeDefined(); @@ -265,7 +265,7 @@ describe('fs.lstat', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toBeDefined(); }); }); @@ -292,7 +292,7 @@ describe('fs.lstat', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toBeDefined(); }); }); @@ -377,7 +377,7 @@ describe('fs.mkdir', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).not.toBeDefined(); expect(_stat).toBeDefined(); }); @@ -441,7 +441,7 @@ describe('fs.readdir', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_files.length).toEqual(1); expect(_files[0]).toEqual('tmp'); }); @@ -470,7 +470,7 @@ describe('fs.readdir', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_files.length).toEqual(1); expect(_files[0]).toEqual('tmp'); }); @@ -630,7 +630,7 @@ describe('fs.rmdir', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_stat).not.toBeDefined(); }); }); @@ -775,7 +775,7 @@ describe('fs.open', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result1).toBeDefined(); expect(_result2).toBeDefined(); expect(_result1).not.toEqual(_result2); @@ -802,7 +802,7 @@ describe('fs.open', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toBeDefined(); }); }); @@ -856,7 +856,7 @@ describe('fs.write', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(buffer.length); expect(_stats.size).toEqual(buffer.length); }); @@ -898,7 +898,7 @@ describe('fs.write', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(2 * buffer.length); expect(_stats.size).toEqual(_result); }); @@ -968,7 +968,7 @@ describe('fs.writeFile, fs.readFile', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(contents); }); }); @@ -994,7 +994,7 @@ describe('fs.writeFile, fs.readFile', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(contents); }); }); @@ -1020,7 +1020,7 @@ describe('fs.writeFile, fs.readFile', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(contents); }); }); @@ -1048,7 +1048,7 @@ describe('fs.writeFile, fs.readFile', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(binary); }); }); @@ -1132,7 +1132,7 @@ describe('fs.read', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(rbuffer.length); expect(typed_array_equal(wbuffer, rbuffer)).toEqual(true); }); @@ -1173,7 +1173,7 @@ describe('fs.read', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(rbuffer.length); expect(typed_array_equal(wbuffer.buffer, rbuffer.buffer)).toEqual(true); }); @@ -1281,7 +1281,7 @@ describe('fs.link', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_newstats.node).toEqual(_oldstats.node); expect(_newstats.nlinks).toEqual(2); expect(_newstats).toEqual(_oldstats); @@ -1318,7 +1318,7 @@ describe('fs.link', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function () { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_newstats.node).toEqual(_linkstats.node); expect(_newstats.node).toNotEqual(_oldstats.node); expect(_newstats.nlinks).toEqual(2); @@ -1554,7 +1554,7 @@ describe('fs.lseek', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function () { - expect(_error1).not.toBeDefined(); + expect(_error1).toEqual(null); expect(_error2).toBeDefined(); expect(_stats.nlinks).toEqual(1); }); @@ -1623,7 +1623,7 @@ describe('fs.lseek', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(offset); expect(_stats.size).toEqual(offset + buffer.length); var expected = new Uint8Array([1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 8]); @@ -1675,7 +1675,7 @@ describe('fs.lseek', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(offset + buffer.length); expect(_stats.size).toEqual(offset + 2 * buffer.length); var expected = new Uint8Array([1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8]); @@ -1732,7 +1732,7 @@ describe('fs.lseek', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual(offset + buffer.length); expect(_stats.size).toEqual(offset + 2 * buffer.length); var expected = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8]); @@ -1815,7 +1815,7 @@ describe('fs.symlink', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).not.toBeDefined(); }); }); @@ -1899,7 +1899,7 @@ describe('fs.readlink', function() { }, 'test to complete', DEFAULT_TIMEOUT); runs(function() { - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result).toEqual('/'); }); }); @@ -1946,7 +1946,7 @@ describe('path resolution', function() { runs(function() { expect(_result).toBeDefined(); expect(_node).toBeDefined(); - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result['node']).toEqual(_node); }); }); @@ -1980,7 +1980,7 @@ describe('path resolution', function() { runs(function() { expect(_result).toBeDefined(); expect(_node).toBeDefined(); - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result['node']).toEqual(_node); }); }); @@ -2019,7 +2019,7 @@ describe('path resolution', function() { runs(function() { expect(_result).toBeDefined(); expect(_node).toBeDefined(); - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result['node']).toEqual(_node); }); }); @@ -2061,7 +2061,7 @@ describe('path resolution', function() { runs(function() { expect(_result).toBeDefined(); expect(_node).toBeDefined(); - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result['node']).toEqual(_node); }); }); @@ -2204,7 +2204,7 @@ describe('path resolution', function() { runs(function() { expect(_result).toBeDefined(); expect(_node).toBeDefined(); - expect(_error).not.toBeDefined(); + expect(_error).toEqual(null); expect(_result['node']).toEqual(_node); }); }); diff --git a/tests/spec/providers.indexeddb.spec.js b/tests/spec/providers.indexeddb.spec.js index 2599748..8f904d5 100644 --- a/tests/spec/providers.indexeddb.spec.js +++ b/tests/spec/providers.indexeddb.spec.js @@ -1,10 +1,10 @@ -describe("IDBFS.Providers.IndexedDB", function() { +describe("IDBFS.FileSystem.providers.IndexedDB", function() { it("is supported -- if it isn't, none of these tests can run.", function() { - expect(IDBFS.Providers.IndexedDB.isSupported()).toEqual(true); + expect(IDBFS.FileSystem.providers.IndexedDB.isSupported()).toEqual(true); }); it("has open, getReadOnlyContext, and getReadWriteContext instance methods", function() { - var indexedDBProvider = new IDBFS.Providers.IndexedDB(); + var indexedDBProvider = new IDBFS.FileSystem.providers.IndexedDB(); expect(typeof indexedDBProvider.open).toEqual('function'); expect(typeof indexedDBProvider.getReadOnlyContext).toEqual('function'); expect(typeof indexedDBProvider.getReadWriteContext).toEqual('function'); @@ -23,7 +23,7 @@ describe("IDBFS.Providers.IndexedDB", function() { var complete = false; var _error, _result; - var provider = new IDBFS.Providers.IndexedDB(this.db_name); + var provider = new IDBFS.FileSystem.providers.IndexedDB(this.db_name); provider.open(function(err, firstAccess) { _error = err; _result = firstAccess; @@ -54,7 +54,7 @@ describe("IDBFS.Providers.IndexedDB", function() { var complete = false; var _error, _result; - var provider = new IDBFS.Providers.IndexedDB(this.db_name); + var provider = new IDBFS.FileSystem.providers.IndexedDB(this.db_name); provider.open(function(err, firstAccess) { _error = err; @@ -84,7 +84,7 @@ describe("IDBFS.Providers.IndexedDB", function() { var complete = false; var _error, _result; - var provider = new IDBFS.Providers.IndexedDB(this.db_name); + var provider = new IDBFS.FileSystem.providers.IndexedDB(this.db_name); provider.open(function(err, firstAccess) { _error = err; @@ -117,7 +117,7 @@ describe("IDBFS.Providers.IndexedDB", function() { var complete = false; var _error, _result1, _result2; - var provider = new IDBFS.Providers.IndexedDB(this.db_name); + var provider = new IDBFS.FileSystem.providers.IndexedDB(this.db_name); provider.open(function(err, firstAccess) { _error = err; @@ -161,7 +161,7 @@ describe("IDBFS.Providers.IndexedDB", function() { var complete = false; var _error, _result; - var provider = new IDBFS.Providers.IndexedDB(this.db_name); + var provider = new IDBFS.FileSystem.providers.IndexedDB(this.db_name); provider.open(function(err, firstAccess) { _error = err; diff --git a/tests/spec/providers.memory.spec.js b/tests/spec/providers.memory.spec.js index 34c9cd6..abfd8bc 100644 --- a/tests/spec/providers.memory.spec.js +++ b/tests/spec/providers.memory.spec.js @@ -1,10 +1,10 @@ -describe("IDBFS.Providers.Memory", function() { +describe("IDBFS.FileSystem.providers.Memory", function() { it("is supported -- if it isn't, none of these tests can run.", function() { - expect(IDBFS.Providers.Memory.isSupported()).toEqual(true); + expect(IDBFS.FileSystem.providers.Memory.isSupported()).toEqual(true); }); it("has open, getReadOnlyContext, and getReadWriteContext instance methods", function() { - var indexedDBProvider = new IDBFS.Providers.Memory(); + var indexedDBProvider = new IDBFS.FileSystem.providers.Memory(); expect(typeof indexedDBProvider.open).toEqual('function'); expect(typeof indexedDBProvider.getReadOnlyContext).toEqual('function'); expect(typeof indexedDBProvider.getReadWriteContext).toEqual('function'); @@ -15,7 +15,7 @@ describe("IDBFS.Providers.Memory", function() { var complete = false; var _error, _result; - var provider = new IDBFS.Providers.Memory(this.db_name); + var provider = new IDBFS.FileSystem.providers.Memory(this.db_name); provider.open(function(err, firstAccess) { _error = err; _result = firstAccess; @@ -38,7 +38,7 @@ describe("IDBFS.Providers.Memory", function() { var complete = false; var _error, _result; - var provider = new IDBFS.Providers.Memory(this.db_name); + var provider = new IDBFS.FileSystem.providers.Memory(this.db_name); provider.open(function(err, firstAccess) { _error = err; @@ -68,7 +68,7 @@ describe("IDBFS.Providers.Memory", function() { var complete = false; var _error, _result; - var provider = new IDBFS.Providers.Memory(this.db_name); + var provider = new IDBFS.FileSystem.providers.Memory(this.db_name); provider.open(function(err, firstAccess) { _error = err; @@ -101,7 +101,7 @@ describe("IDBFS.Providers.Memory", function() { var complete = false; var _error, _result1, _result2; - var provider = new IDBFS.Providers.Memory(this.db_name); + var provider = new IDBFS.FileSystem.providers.Memory(this.db_name); provider.open(function(err, firstAccess) { _error = err; @@ -145,7 +145,7 @@ describe("IDBFS.Providers.Memory", function() { var complete = false; var _error, _result; - var provider = new IDBFS.Providers.Memory(this.db_name); + var provider = new IDBFS.FileSystem.providers.Memory(this.db_name); provider.open(function(err, firstAccess) { _error = err; diff --git a/tests/spec/providers.spec.js b/tests/spec/providers.spec.js index b8ed960..759d5db 100644 --- a/tests/spec/providers.spec.js +++ b/tests/spec/providers.spec.js @@ -1,18 +1,17 @@ describe("IDBFS.Providers", function() { it("is defined", function() { - expect(typeof IDBFS.Providers).not.toEqual(undefined); + expect(typeof IDBFS.FileSystem.providers).not.toEqual(undefined); }); it("has IndexedDB constructor", function() { - expect(typeof IDBFS.Providers.IndexedDB).toEqual('function'); + expect(typeof IDBFS.FileSystem.providers.IndexedDB).toEqual('function'); }); it("has Memory constructor", function() { - expect(typeof IDBFS.Providers.Memory).toEqual('function'); + expect(typeof IDBFS.FileSystem.providers.Memory).toEqual('function'); }); it("has a Default constructor", function() { - expect(typeof IDBFS.Providers.Default).toEqual('function'); + expect(typeof IDBFS.FileSystem.providers.Default).toEqual('function'); }); - });