Comparing version 0.3.3 to 0.4.0
228
lib/arya.js
@@ -38,15 +38,10 @@ // Generated by CoffeeScript 1.10.0 | ||
Arya.prototype.save = function(obj, sink, next) { | ||
var NEW_CONTEXT; | ||
if ((obj == null) || ((typeof obj) !== "object") || (obj instanceof Array)) { | ||
return next(new Error("cannot save " + obj)); | ||
} | ||
NEW_CONTEXT = { | ||
arrayList: [], | ||
depth: 0 | ||
}; | ||
return this._saveObject(NEW_CONTEXT, obj, sink, next); | ||
return this._saveObject({}, [], obj, sink, next); | ||
}; | ||
Arya.prototype._dehydrate = function(context, obj, sink, next) { | ||
var checkArray, dObj, i, key, len, ref, type, uuid; | ||
Arya.prototype._dehydrate = function(context, arrayList, obj, sink, next) { | ||
var dObj, dehydrates, key, type; | ||
if (obj instanceof Array) { | ||
@@ -61,35 +56,72 @@ dObj = []; | ||
} | ||
dehydrates = []; | ||
for (key in obj) { | ||
if (obj[key] != null) { | ||
switch (typeof obj[key]) { | ||
case "boolean": | ||
case "number": | ||
case "string": | ||
dObj[key] = obj[key]; | ||
break; | ||
case "object": | ||
if (obj[key] instanceof Date) { | ||
dObj[key] = RANGLE + obj[key].getTime().toString(); | ||
} else if (obj[key] instanceof Array) { | ||
ref = context.arrayList; | ||
for (i = 0, len = ref.length; i < len; i++) { | ||
checkArray = ref[i]; | ||
if (checkArray === obj[key]) { | ||
return next(new Error("circular arrays error detected")); | ||
dehydrates.push(this._dehydratePromise(context, arrayList, obj, key, dObj, sink, next)); | ||
} | ||
return Promise.all(dehydrates).then(function() { | ||
return next(NO_ERROR, dObj); | ||
})["catch"](function(err) { | ||
return next(err); | ||
}); | ||
}; | ||
Arya.prototype._dehydratePromise = function(context, arrayList, obj, key, dObj, sink, next) { | ||
var checkArray, i, len, uuid; | ||
if (obj[key] == null) { | ||
return Promise.resolve(dObj); | ||
} | ||
switch (typeof obj[key]) { | ||
case "boolean": | ||
case "number": | ||
case "string": | ||
dObj[key] = obj[key]; | ||
return Promise.resolve(dObj); | ||
case "object": | ||
if (obj[key] instanceof Date) { | ||
dObj[key] = RANGLE + obj[key].getTime().toString(); | ||
return Promise.resolve(dObj); | ||
} else if (obj[key] instanceof Array) { | ||
for (i = 0, len = arrayList.length; i < len; i++) { | ||
checkArray = arrayList[i]; | ||
if (checkArray === obj[key]) { | ||
return Promise.reject(new Error("circular arrays error detected")); | ||
} | ||
} | ||
return new Promise((function(_this) { | ||
return function(resolve, reject) { | ||
var myArrayList; | ||
myArrayList = arrayList.slice(0); | ||
myArrayList.push(obj[key]); | ||
return _this._dehydrate(context, myArrayList, obj[key], sink, function(err, myObj) { | ||
if (err != null) { | ||
return reject(err); | ||
} else { | ||
dObj[key] = myObj; | ||
return resolve(dObj); | ||
} | ||
} | ||
context.arrayList.push(obj[key]); | ||
dObj[key] = this._dehydrate(context, obj[key], sink, next); | ||
context.arrayList.pop(); | ||
} else { | ||
uuid = this._identify(obj[key]); | ||
if (context[uuid] == null) { | ||
this._saveObject(context, obj[key], sink, next); | ||
} | ||
dObj[key] = RANGLE + uuid; | ||
} | ||
}); | ||
}; | ||
})(this)); | ||
} else { | ||
uuid = this._identify(obj[key]); | ||
if (context[uuid] == null) { | ||
return new Promise((function(_this) { | ||
return function(resolve, reject) { | ||
return _this._saveObject(context, arrayList, obj[key], sink, function(err, myObj) { | ||
if (err != null) { | ||
return reject(err); | ||
} else { | ||
dObj[key] = RANGLE + uuid; | ||
return resolve(dObj); | ||
} | ||
}); | ||
}; | ||
})(this)); | ||
} else { | ||
dObj[key] = RANGLE + uuid; | ||
return Promise.resolve(dObj); | ||
} | ||
} | ||
} | ||
} | ||
return dObj; | ||
return Promise.reject(new Error("unable to dehydrate")); | ||
}; | ||
@@ -142,8 +174,3 @@ | ||
} | ||
_this._rehydrate(context[uuid], dObj, context, uuid, src, function(err) { | ||
if (err != null) { | ||
return next(err); | ||
} | ||
}); | ||
return next(NO_ERROR, context[uuid]); | ||
return _this._rehydrate(context[uuid], dObj, context, uuid, src, next); | ||
}; | ||
@@ -154,57 +181,84 @@ })(this)); | ||
Arya.prototype._rehydrate = function(rObj, dObj, context, uuid, src, next) { | ||
var key; | ||
var key, rehydrates; | ||
rehydrates = []; | ||
for (key in dObj) { | ||
switch (typeof dObj[key]) { | ||
case "boolean": | ||
case "number": | ||
rObj[key] = dObj[key]; | ||
break; | ||
case "string": | ||
if (TYPE_TAG_RE.test(key)) { | ||
if (rObj.constructor.name !== dObj[key]) { | ||
return next(new Error("constructor error detected")); | ||
} | ||
rehydrates.push(this._rehydratePromise(rObj, dObj, key, context, uuid, src, next)); | ||
} | ||
return Promise.all(rehydrates).then(function() { | ||
return next(NO_ERROR, rObj); | ||
})["catch"](function(err) { | ||
return next(err); | ||
}); | ||
}; | ||
Arya.prototype._rehydratePromise = function(rObj, dObj, key, context, uuid, src, next) { | ||
switch (typeof dObj[key]) { | ||
case "boolean": | ||
case "number": | ||
rObj[key] = dObj[key]; | ||
return Promise.resolve(rObj); | ||
case "string": | ||
if (TYPE_TAG_RE.test(key)) { | ||
if (rObj.constructor.name !== dObj[key]) { | ||
return Promise.reject(new Error("constructor error detected")); | ||
} else { | ||
if (UUID_TAG_RE.test(dObj[key])) { | ||
this._loadObject(context, dObj[key].substring(1), src, function(err, obj) { | ||
return Promise.resolve(rObj); | ||
} | ||
} else { | ||
if (UUID_TAG_RE.test(dObj[key])) { | ||
return new Promise((function(_this) { | ||
return function(resolve, reject) { | ||
return _this._loadObject(context, dObj[key].substring(1), src, function(err, obj) { | ||
if (err != null) { | ||
return reject(err); | ||
} else { | ||
rObj[key] = obj; | ||
return resolve(rObj); | ||
} | ||
}); | ||
}; | ||
})(this)); | ||
} else if (TIME_TAG_RE.test(dObj[key])) { | ||
rObj[key] = new Date(parseInt(dObj[key].substring(1), 10)); | ||
return Promise.resolve(rObj); | ||
} else { | ||
rObj[key] = dObj[key]; | ||
return Promise.resolve(rObj); | ||
} | ||
} | ||
break; | ||
case "object": | ||
if (dObj[key] instanceof Array) { | ||
rObj[key] = []; | ||
return new Promise((function(_this) { | ||
return function(resolve, reject) { | ||
return _this._rehydrate(rObj[key], dObj[key], context, uuid, src, function(err, obj) { | ||
if (err != null) { | ||
return next(err); | ||
return reject(err); | ||
} else { | ||
return resolve(rObj); | ||
} | ||
return rObj[key] = obj; | ||
}); | ||
} else if (TIME_TAG_RE.test(dObj[key])) { | ||
rObj[key] = new Date(parseInt(dObj[key].substring(1), 10)); | ||
} else { | ||
rObj[key] = dObj[key]; | ||
} | ||
} | ||
break; | ||
case "object": | ||
if (dObj[key] instanceof Array) { | ||
rObj[key] = []; | ||
this._rehydrate(rObj[key], dObj[key], context, uuid, src, function(err) { | ||
if (err != null) { | ||
return next(err); | ||
} | ||
}); | ||
} else { | ||
return next(new Error("corrupt JSON input detected")); | ||
} | ||
} | ||
}; | ||
})(this)); | ||
} else { | ||
return Promise.reject(new Error("corrupt JSON input detected")); | ||
} | ||
} | ||
return next(NO_ERROR); | ||
return Promise.reject(new Error("unable to rehydrate")); | ||
}; | ||
Arya.prototype._saveObject = function(context, obj, sink, next) { | ||
var dObj, json, uuid; | ||
context.depth++; | ||
Arya.prototype._saveObject = function(context, arrayList, obj, sink, next) { | ||
var uuid; | ||
uuid = this._identify(obj); | ||
context[uuid] = obj; | ||
dObj = this._dehydrate(context, obj, sink, next); | ||
json = JSON.stringify(dObj, null, 2); | ||
context.depth--; | ||
return sink(uuid, json, function(err) { | ||
if (context.depth === 0) { | ||
return next(err, uuid); | ||
return this._dehydrate(context, arrayList, obj, sink, function(err, dObj) { | ||
var json; | ||
if (err != null) { | ||
return next(err); | ||
} | ||
json = JSON.stringify(dObj, null, 2); | ||
return sink(uuid, json, function(err2) { | ||
return next(err2, uuid); | ||
}); | ||
}); | ||
@@ -211,0 +265,0 @@ }; |
{ | ||
"name": "sansa", | ||
"version": "0.3.3", | ||
"version": "0.4.0", | ||
"description": "Object graph serialization library.", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
56370
283