BrowserFS v0.4.2

BrowserFS is an in-browser file system that emulates the Node JS file system API and supports storing and retrieving files from various backends. BrowserFS also integrates nicely into the Emscripten file system.
Backends
BrowserFS is highly extensible, and ships with many filesystem backends:
XmlHttpRequest
: Downloads files on-demand from a webserver via XMLHttpRequest
LocalStorage
: Stores files in the browser's localStorage
.HTML5FS
: Stores files into the HTML5 FileSystem
APIIndexedDB
: Stores files into the browser's IndexedDB
object database.Dropbox
: Stores files into the user's Dropbox account.
InMemory
: Stores files in-memory. Thus, it is a temporary file store that clears when the user navigates away.ZipFS
: Read-only zip file-backed FS. Lazily decompresses files as you access them.WorkerFS
: Lets you mount the BrowserFS file system configured in the main thread in a WebWorker, or the other way around!MountableFileSystem
: Lets you mount multiple file systems into a single directory hierarchy, as in *nix-based OSes.OverlayFS
: Mount a read-only file system as read-write by overlaying a writable file system on top of it. Like Docker's overlayfs, it will only write changed files to the writable file system.
- Note: Does not support asynchronous file systems at the moment. Wrap them in
AsyncMirrorFS
first.
AsyncMirrorFS
: Use an asynchronous backend synchronously. Invaluable for Emscripten; let your Emscripten applications write to larger file stores with no additional effort!
- Note: Loads the entire contents of the file system into a synchronous backend during construction. Performs synchronous operations in-memory, and enqueues them to be mirrored onto the asynchronous backend.
More backends can be defined by separate libraries, so long as they extend the BaseFileSystem
. Multiple backends can be active at once at different locations in the directory hierarchy.
For more information, see the wiki.
Building
Prerequisites:
- Node and NPM
- Grunt-cli globally installed:
npm install -g grunt-cli
- Run
npm install
to install local dependencies
Release:
grunt
The minified release build can be found in build/browserfs.min.js
.
Development:
grunt dev
The development build can be found as build/browserfs.js
.
Custom builds:
If you want to build BrowserFS with a subset of the available backends,
change the getBackends()
function in Gruntfile.js
to return an
array of backends you wish to use. Then, perform a release build.
Using
Here's a simple example, using the LocalStorage-backed file system:
<script type="text/javascript" src="browserfs.min.js"></script>
<script type="text/javascript">
BrowserFS.install(window);
var lsfs = new BrowserFS.FileSystem.LocalStorage();
BrowserFS.initialize(lsfs);
</script>
Now, you can write code like this:
var fs = require('fs');
fs.writeFile('/test.txt', 'Cool, I can do this in the browser!', function(err) {
fs.readFile('/test.txt', function(err, contents) {
console.log(contents.toString());
});
});
Using with Browserify
As of BrowserFS 0.4.0, you can use BrowserFS with your Browserify projects! At the moment, you need to 'opt in' to the entire BrowserFS ecosystem -- e.g. you need to use BrowserFS's path
, process
, and Buffer
in place of Browserify's builtins.
I have written an example project that illustrates how to do this.
In the future, we will support mixing and matching builtin modules.
Using with Emscripten
You can use any synchronous BrowserFS file systems with Emscripten!
Persist particular folders in the Emscripten file system to localStorage
, or enable Emscripten to synchronously download files from another folder as they are requested.
Include browserfs.min.js
into the page, and add code similar to the following to your Module
's preRun
array:
function setupBFS() {
var lsfs = new BrowserFS.FileSystem.LocalStorage();
BrowserFS.initialize(lsfs);
var BFS = new BrowserFS.EmscriptenFS();
FS.createFolder(FS.root, 'data', true, true);
FS.mount(BFS, {root: '/'}, '/data');
}
Note: Do NOT use BrowserFS.install(window)
on a page with an Emscripten application! Emscripten will be tricked into thinking that it is running in Node JS.
If you wish to use an asynchronous BrowserFS backend with Emscripten (e.g. Dropbox), you'll need to wrap it into an AsyncMirrorFS
first:
function asyncSetup(dropboxClient, cb) {
var dbfs = new BrowserFS.FileSystem.Dropbox(dropboxClient);
var asyncMirror = new BrowserFS.FileSystem.AsyncMirrorFS(
new BrowserFS.FileSystem.InMemory(), dbfs);
asyncMirror.initialize((err?) => {
BrowserFS.initialize(asyncMirror);
cb();
});
}
function setupBFS() {
var BFS = new BrowserFS.EmscriptenFS();
FS.createFolder(FS.root, 'data', true, true);
FS.mount(BFS, {root: '/'}, '/data');
}
Testing
Prerequisites:
- Karma globally installed:
npm install -g karma
To run unit tests, simply run grunt test
(NOTE: This will launch multiple web browsers!). You may need to change build/karma.conf.js
if you do not have Chrome, Safari, Opera, and Firefox installed.
License
BrowserFS is licensed under the MIT License. See LICENSE
for details.