Review fixes

This commit is contained in:
David Humphrey (:humph) david.humphrey@senecacollege.ca 2013-11-26 19:12:25 -05:00
parent 6e16f86208
commit 3c5a5ef7fa
10 changed files with 317 additions and 353 deletions

286
dist/idbfs.js vendored
View File

@ -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
};
});

View File

@ -8,6 +8,8 @@ define(function(require) {
var O_APPEND = 'APPEND';
return {
FILE_SYSTEM_NAME: 'local',
FILE_STORE_NAME: 'files',
IDB_RO: 'readonly',

View File

@ -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];
}
};
});

210
src/fs.js
View File

@ -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
};
});

View File

@ -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() {

View File

@ -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() {

View File

@ -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);
});
});

View File

@ -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;

View File

@ -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;

View File

@ -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');
});
});