emscripten Humble Cloud interface
Edward Rudd
2014-08-21 bc2cb709567017e614557d2ca9d6d5aa4025d7c8

separate out things so the cloudfs loads and refers to a provider to access the "cloud"

1 files modified
47 ■■■■■ changed files
client/library/library_cloudfs.js 47 ●●●●● patch | view | raw | blame | history
client/library/library_cloudfs.js
@@ -1,15 +1,22 @@
var LibraryCLOUDFS = {
    $CLOUDFS__deps: ['$FS', '$MEMFS', '$PATH'],
    $CLOUDFS: {
        applicationToken: '__NOTOKEN__',
        remoteAPIEndpoint: 'http://asmjs.brigadoon.outoforder.cc/cloud',
        mount: function(mount) {
            console.log("Mounting", mount);
            var provider = CLOUDFS.fetchProvider(mount);
            if (provider) {
                mount.opts.provider = provider;
                console.log("Mounting", mount);
            } else {
                mount.opts.disabled = true;
                Module.print("WARNING: Cloud provider not available. Disabling Sync");
            }
            return MEMFS.mount.apply(null, arguments);
        },
        syncfs: function(mount, populate, callback) {
            window.HB_mount = mount;
            if (mount.opts.disabled) {
                return callback(new Error("Syncing Disabled"));
            }
            console.log("Syncing", mount, populate);
            // re-use IDBFS.getLocalSet for now
            CLOUDFS.getLocalSet(mount, function(err, local) {
@@ -29,19 +36,22 @@
                });
            });
        },
        // XHR Utility function
        xhrLoad: function(url, onload, onerror) {
          var xhr = new XMLHttpRequest();
          xhr.open('GET', url, true);
          xhr.onload = function () {
            if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {
              onload(xhr.response);
            } else {
              onerror();
        // Utility functions
        fetchProvider: function(mount) {
            if (mount.opts.provider === undefined || window[mount.opts.provider] === undefined) {
                return false;
            }
          };
          xhr.onerror = onerror;
          xhr.send(null);
            var provider = window[mount.opts.provider];
            var requiredMethods = ['listFiles', 'downloadFile', 'uploadFile', 'removeFile'];
            var valid = requiredMethods.every(function(method) {
                return (method in provider);
            });
            if (valid) {
                Module.print('Cloud provider vendor: ' + provider.vendor);
                return provider;
            } else {
                return false;
            }
        },
        // Getting list of entities
        getLocalSet: function(mount, callback) {
@@ -82,8 +92,7 @@
            return callback(null, { type: 'local', entries: entries });
        },
        getRemoteSet: function(mount, callback) {
          var url = CLOUDFS.remoteAPIEndpoint + '/storage/files';
            CLOUDFS.xhrLoad(url, function(data) {
          mount.opts.provider.listFiles(mount.opts.cloud, function(data) {
            var entries = {},
                toAbsolute = function(p) { return PATH.join2(mount.mountpoint, p); };
                json = JSON.parse(data);