Comparing version 3.2.3 to 3.2.4
{ | ||
"name": "clues", | ||
"version": "3.2.3", | ||
"version": "3.2.4", | ||
"description": "Lightweight logic tree solver using promises.", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -9,7 +9,5 @@ (function(self) { | ||
request = require('request'); | ||
fetch.prototype.request = fetch.prototype.nodeRequest; | ||
} else { | ||
self.reptile = reptile; | ||
clues = self.clues; | ||
fetch.prototype.request = fetch.prototype.ajaxRequest; | ||
} | ||
@@ -19,130 +17,93 @@ | ||
function fetch(queue,input,options) { | ||
if (!(this instanceof fetch)) | ||
return new fetch(queue,input,options); | ||
this.queue = queue; | ||
function fetch() { | ||
var self = this, | ||
buffer = '', | ||
queue = self.$queue; | ||
this.input = input; | ||
this.buffer = ''; | ||
this.options = options || {}; | ||
this.options.delay = this.options.delay || 100; | ||
this.request(); | ||
} | ||
delete self.$queue; | ||
fetch.prototype.ajaxRequest = function() { | ||
var r = new XMLHttpRequest(), | ||
self = this, | ||
last = 0; | ||
if (!queue || !Object.keys(queue).length) | ||
return; | ||
r.open('POST',this.options.url+Object.keys(this.queue),true); | ||
r.setRequestHeader('Content-Type','application/json;charset=UTF-8'); | ||
r.send(JSON.stringify(this.input)); | ||
r.onprogress = function() { | ||
self.processBuffer(r.responseText.slice(last)); | ||
last = r.responseText.length; | ||
}; | ||
r.onload = function() { | ||
self.processBuffer(r.responseText.slice(last)); | ||
}; | ||
}; | ||
self.data = self.data || {}; | ||
fetch.prototype.nodeRequest = function() { | ||
request({ | ||
url : this.options.url+Object.keys(this.queue), | ||
method : 'POST', | ||
json : this.input | ||
}) | ||
.on('data',this.processBuffer.bind(this)) | ||
.on('error',this.requestFailed.bind(this)); | ||
}; | ||
var r = new XMLHttpRequest(), | ||
last = 0; | ||
fetch.prototype.requestFailed = function(e) { | ||
Object.keys(this.queue) | ||
.forEach(function(key) { | ||
this.queue[key].reject(e); | ||
},this); | ||
}; | ||
r.open('POST','/api/'+Object.keys(queue).join(','),true); | ||
r.setRequestHeader('Content-Type','application/json;charset=UTF-8'); | ||
r.send(JSON.stringify(self.$input)); | ||
r.onprogress = function() { | ||
processBuffer(r.responseText.slice(last)); | ||
last = r.responseText.length; | ||
}; | ||
r.onload = function() { | ||
processBuffer(r.responseText.slice(last)); | ||
}; | ||
fetch.prototype.processBuffer = function(d) { | ||
if (d) this.buffer += d; | ||
function processBuffer(d) { | ||
if (d) buffer += d; | ||
var queue = this.queue; | ||
var items = this.buffer.split(',\t\n'); | ||
this.buffer = items.slice(items.length-1)[0]; | ||
var items = buffer.split(',\t\n'); | ||
buffer = items.slice(items.length-1)[0]; | ||
if (items.length < 2) return; | ||
items.slice(0,items.length-1) | ||
.forEach(function(item) { | ||
var m = /\s*\"(.*?)\"\s*\:\s*(.*)/.exec(item); | ||
if (!m) return; | ||
if (items.length < 2) return; | ||
items.slice(0,items.length-1) | ||
.forEach(function(item) { | ||
var m = /\s*\"(.*?)\"\s*\:\s*(.*)/.exec(item); | ||
if (!m) return; | ||
var key = m[1],value; | ||
if (!queue[key]) return; | ||
var key = m[1],value; | ||
if (!self[key]) return; | ||
try { | ||
value = JSON.parse(m[2]); | ||
} catch(e) { | ||
value = {error:true,message:'JSON parse error: '+e}; | ||
} | ||
console.log(key,value) | ||
if (value && value.error) | ||
queue[key].reject(value); | ||
else | ||
queue[key].resolve(value); | ||
}); | ||
}; | ||
try { | ||
value = JSON.parse(m[2]); | ||
} catch(e) { | ||
value = {error:true,message:'JSON parse error: '+e}; | ||
} | ||
if (value && value.error) | ||
queue[key].reject(value); | ||
else | ||
queue[key].resolve(value); | ||
self.data[key] = value; | ||
}); | ||
if (typeof self.$applyFn === 'function') | ||
self.$applyFn(); | ||
} | ||
} | ||
function fetcher(options) { | ||
var queue = {}, | ||
next, | ||
inputLock; | ||
reptile.external = function(options) { | ||
options = options || {}; | ||
options.delay = options.delay || 100; | ||
return function (ref) { | ||
var defer = Promise.defer(), | ||
self = this; | ||
return function(ref) { | ||
return function(input) { | ||
// Ensure that input object is consistent | ||
if (inputLock && input !== inputLock) { | ||
queue = {}; | ||
return Promise.rejected('INCONSISTENT_INPUT'); | ||
if (!self.$queue) { | ||
Promise.delay(options.delay || 30) | ||
.then(fetch.bind(self,options)); | ||
self.$queue = {}; | ||
} | ||
inputLock = input; | ||
// Fire off the fetch after an optional delay | ||
if (!next) next = Promise.delay(options.delay) | ||
.then(function() { | ||
fetch(queue,input,options); | ||
queue={}; | ||
input={}; | ||
next = undefined; | ||
inputLock=undefined; | ||
}); | ||
return (queue[ref] = Promise.defer()).promise; | ||
}; | ||
self.$queue[ref] = defer; | ||
return defer.promise; | ||
}; | ||
} | ||
reptile.fetcher = fetcher; | ||
reptile.fetch = fetch; | ||
reptile.$external = function(options) { | ||
return { | ||
$external : reptile.fetcher(options) | ||
}; | ||
}; | ||
reptile.render = function(obj,element,tiles) { | ||
var keys = element.dataset.reptile.split(','), | ||
key; | ||
reptile.render = function(obj,widgets,element) { | ||
var self = this; | ||
var keys = element.dataset.reptile.split(','),key; | ||
tiles = tiles || (window && window.tiles); | ||
function renderKey() { | ||
key = keys.shift(); | ||
return clues(obj,widgets[key],{element:element}) | ||
return clues(obj,tiles[key],{element:element}) | ||
.catch(function(e) { | ||
if (keys.length) return renderKey(); | ||
element.innerHTML = 'Error: '+e.message+' ('+e.ref+')'; | ||
}) | ||
.then(function(d) { | ||
obj.data[key] = d; | ||
return d; | ||
}); | ||
@@ -153,8 +114,8 @@ } | ||
reptile.renderAll = function(element) { | ||
var self = this; | ||
reptile.renderAll = function(obj,element,tiles) { | ||
if (!element && !window) throw 'Not in a browser - element must be provided'; | ||
tiles = tiles || (window && window.tiles); | ||
var selection = (element || window.document).querySelectorAll('[data-reptile]'), | ||
items = [].map.call(selection,function(d) { | ||
return self.render(d); | ||
return reptile.render(obj,d,tiles); | ||
}); | ||
@@ -164,2 +125,15 @@ return Promise.settle(items); | ||
})(this); | ||
// Very hacky - needs to be addressed | ||
reptile.api = function(obj,options) { | ||
obj = obj || {}; | ||
obj.api = obj.api || {}; | ||
obj.api.data = obj.data = obj.data || {}; | ||
obj.api.$input = obj.$input; | ||
obj.api.$applyFn = obj.$applyFn; | ||
obj.api.$external = reptile.external(options); | ||
obj.$render = reptile.render.bind(obj,obj); | ||
obj.$renderAll = reptile.renderAll.bind(obj,obj); | ||
return obj; | ||
}; | ||
})(this); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1
67701
1259