Created
March 24, 2015 02:13
-
-
Save matthewp/4761c941084569995217 to your computer and use it in GitHub Desktop.
system-cache.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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