BrowserFS v1.4.3
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.
IsoFS
: Mount an .iso file into the file system.
- Supports Microsoft Joliet and Rock Ridge extensions to the ISO9660 standard.
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.AsyncMirror
: 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.
FolderAdapter
: Wraps a file system, and scopes all interactions to a subfolder of that file system.Emscripten
: Lets you mount Emscripten file systems inside BrowserFS.
More backends can be defined by separate libraries, so long as they extend the BaseFileSystem
class. Multiple backends can be active at once at different locations in the directory hierarchy.
For more information, see the API documentation for BrowserFS.
Building
Prerequisites:
- Node and NPM
- Run
yarn install
(or npm install
) to install local dependencies and build BrowserFS
A minified build can be found in dist/browserfs.min.js
, and the unminified build can be found in dist/browserfs.js
.
Custom builds:
If you want to build BrowserFS with a subset of the available backends,
change src/core/backends.ts
to include only the backends you require,
and re-build.
Using
Using BrowserFS.configure()
, you can easily configure BrowserFS to use a variety of file system types.
Here's a simple usage example using the LocalStorage-backed file system:
<script type="text/javascript" src="browserfs.min.js"></script>
<script type="text/javascript">
BrowserFS.install(window);
BrowserFS.configure({
fs: "LocalStorage"
}, function(e) {
if (e) {
throw e;
}
});
</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());
});
});
The following code mounts a zip file to /zip
, in-memory storage to /tmp
, and IndexedDB browser-local storage to /home
:
fetch('mydata.zip').then(function(response) {
return response.arraybuffer();
}).then(function(zipData) {
var Buffer = BrowserFS.BFSRequire('buffer').Buffer;
BrowserFS.configure({
fs: "MountableFileSystem",
options: {
"/zip": {
fs: "ZipFS",
options: {
zipData: Buffer.from(zipData)
}
},
"/tmp": { fs: "InMemory" },
"/home": { fs: "IndexedDB" }
}
}, function(e) {
if (e) {
throw e;
}
});
});
Using with Browserify and Webpack
BrowserFS is published as a UMD module, so you can either include it on your webpage in a script
tag or bundle it with your favorite
JavaScript module bundler.
You can also use BrowserFS to supply your application with fs
, path
, and buffer
modules, as well as the Buffer
and process
globals. BrowserFS contains shim modules for fs
, buffer
, path
, and process
that you can use with Webpack and Browserify.
Webpack:
module.exports = {
resolve: {
alias: {
'fs': 'browserfs/dist/shims/fs.js',
'buffer': 'browserfs/dist/shims/buffer.js',
'path': 'browserfs/dist/shims/path.js',
'processGlobal': 'browserfs/dist/shims/process.js',
'bufferGlobal': 'browserfs/dist/shims/bufferGlobal.js',
'bfsGlobal': require.resolve('browserfs')
}
},
plugins: [
new webpack.ProvidePlugin({ BrowserFS: 'bfsGlobal', process: 'processGlobal', Buffer: 'bufferGlobal' })
],
node: {
process: false,
Buffer: false
}
};
Browserify:
var browserfsPath = require.resolve('browserfs');
var browserifyConfig = {
builtins: Object.assign({}, require('browserify/lib/builtins'), {
"buffer": require.resolve('browserfs/dist/shims/buffer.js'),
"fs": require.resolve("browserfs/dist/shims/fs.js"),
"path": require.resolve("browserfs/dist/shims/path.js")
}),
insertGlobalVars: {
"process": function () { return "require('browserfs/dist/shims/process.js')" },
'Buffer': function () { return "require('buffer').Buffer" },
"BrowserFS": function() { return "require('" + browserfsPath + "')" }
}
};
Using with Node
You can use BrowserFS with Node. Simply add browserfs
as an NPM dependency, and require('browserfs')
.
The object returned from this action is the same BrowserFS
global described above.
If you need BrowserFS to return Node Buffer objects (instead of objects that implement the same interface),
simply require('browserfs/dist/node/index')
instead.
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 configure BrowserFS prior to running your Emscripten code. Then, add code similar to the following to your Module
's preRun
array:
function setupBFS() {
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 AsyncMirror
file system first:
function asyncSetup(dropboxClient, cb) {
BrowserFS.configure({
fs: "AsyncMirror",
options: {
sync: {
fs: "InMemory"
},
async: {
fs: "Dropbox",
options: {
client: dropboxClient
}
}
}
}, cb);
}
function setupBFS() {
var BFS = new BrowserFS.EmscriptenFS();
FS.createFolder(FS.root, 'data', true, true);
FS.mount(BFS, {root: '/'}, '/data');
}
Testing
To run unit tests, simply run npm test
.
License
BrowserFS is licensed under the MIT License. See LICENSE
for details.