+ static literal(...props) {
+ return Object.assign(Object.create(null, StrappDirectory.defaults), ...props)
+ }
+ loadFiles(fileData) {
+ Object.keys(fileData)
+ .map((key) => (this.files[key] = StrappFile.parse(fileData[key])))
+ }
+ resolveOwnFiles() {
+ return new Promise((resolve, reject) => {
+ localforage.getItem(this.path).then((fileData) => {
+ this.loadFiles(fileData)
+ resolve()
+ }).catch(reject)
+ })
+ }
+ traverse(method, pubKey, data, locStack) {
+ this.traverse = _traverse_loading
+ this.loadWaiters = []
+ this.resolveOwnFiles().then(() => {
+ this.traverse = _traverse_loaded
+ this.loadWaiters
+ .map((w) => _traverse_loaded(w[0], w[1], w[2], w[3]).then(w[4], w[5]))
+ delete this.loadWaiters
+ })
+ return _traverse_loading(method, pubKey, data, locStack)
+ }
+ request(method, pubKey, data, locStack) {
+ return new Promise((resolve, reject) => {
+ super.resolveRequest(method, pubKey, data, locStack)
+ .then(resolve)
+ .catch((err) => {
+ if (err === 404)
+ return this.traverse(method, pubKey, data, locStack)
+ return Promise.reject(err)
+ })
+ })
+ }