Skip to content

Instantly share code, notes, and snippets.

@matthewp
Created March 24, 2015 02:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save matthewp/4761c941084569995217 to your computer and use it in GitHub Desktop.
Save matthewp/4761c941084569995217 to your computer and use it in GitHub Desktop.
system-cache.js
var each = function(arr, cb){
var i = 0, len = arr.length;
for(; i < len; i++) {
if(cb(arr[i]) === false) {
return;
}
}
};
var baseImport = System.import;
System.import = function(){
var loader = this, args = arguments;
return cached.then(function() {
return baseImport.apply(loader, args);
}).then(function(mod) {
merge();
return mod;
});
};
var sources = {};
var fetch = System.fetch;
System.fetch = function(load) {
return fetch.call(this, load).then(function(source) {
if(/node_modules/.test(load.address)) {
sources[load.name] = source;
}
return source;
});
};
function merge(mod) {
return get("modules").then(function(mods) {
mods = mods || {};
for (var p in sources) {
mods[p] = sources[p];
}
return set("modules", mods);
});
}
function get(key) {
return getDb().then(function(db){
return new Promise(function(resolve, reject) {
var tx = db.transaction([OS_NAME], "readonly");
var req = tx.objectStore(OS_NAME).get(key);
req.onerror = reject;
req.onsuccess = function(e){
resolve(e.target.result);
};
});
});
}
function set(key, value) {
return getDb().then(function(db) {
return new Promise(function(resolve, reject) {
var tx = db.transaction([OS_NAME], "readwrite");
var req = tx.objectStore(OS_NAME).put(value, key);
req.onerror = reject;
req.onsuccess = function(e){
resolve(value);
};
});
});
}
var DB_NAME = System.cachedb || "__system-cache";
var OS_NAME = "sources";
var getDb = (function(){
var db;
return function(){
if(db) return Promise.resolve(db);
return new Promise(function(resolve, reject) {
var req = indexedDB.open(DB_NAME, 1);
req.onerror = reject;
req.onsuccess = function(e){
db = e.target.result;
resolve(db);
};
req.onupgradeneeded = function(e){
var db = e.target.result;
if(!db.objectStoreNames.contains(OS_NAME)) {
db.createObjectStore(OS_NAME);
}
};
});
};
})();
var cached = get("modules").then(function(mods) {
for(var name in mods) {
System.define(name, mods[name]);
}
});
System.cacheClean = function() {
return new Promise(function(resolve, reject) {
var req = indexedDB.deleteDatabase(DB_NAME);
req.onsuccess = resolve;
req.onerror = reject;
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment