UNPKG

1.83 kBJavaScriptView Raw
1var types = require('./types');
2var strict = require('./modes/strict');
3var isObject = types.isObject;
4var async = require('async');
5var raf = require('raf');
6
7/**
8 * Cast values from extended json objects to their BSON or JS types.
9 *
10 * @param {Any} data - A value which might be esjon encoded.
11 * @return {Any}
12 * @api private
13 */
14module.exports = function deserialize(data) {
15 if (Array.isArray(data)) {
16 return data.map(deserialize);
17 }
18 if (!isObject(data)) {
19 return data;
20 }
21
22 var keys = Object.keys(data);
23 if (keys.length === 0) {
24 return data;
25 }
26
27 var caster = strict.deserialize[keys[0]];
28 if (!caster) {
29 return keys.reduce(function(schema, key) {
30 schema[key] = deserialize(data[key]);
31 return schema;
32 }, {});
33 }
34
35 return caster(data);
36};
37
38function deserializeAsync(data, fn) {
39 if (Array.isArray(data) === true) {
40 async.series(data.map(function(doc) {
41 return function(cb) {
42 raf(function() {
43 deserializeAsync(doc, cb);
44 });
45 };
46 }), fn);
47 } else if (isObject(data) === false) {
48 fn(null, data);
49 } else {
50 var keys = Object.keys(data);
51 if (keys.length === 0) {
52 fn(null, data);
53 } else {
54 var caster = strict.deserialize[keys[0]];
55 if (caster) {
56 fn(null, caster.call(null, data));
57 } else {
58 var res = {};
59 async.series(keys.map(function(key) {
60 return function(cb) {
61 deserializeAsync(data[key], function(err, d) {
62 if (err) {
63 return cb(err);
64 }
65 res[key] = d;
66 cb();
67 });
68 };
69 }), function(err) {
70 if (err) {
71 return fn(err);
72 }
73 fn(null, res);
74 });
75 }
76 }
77 }
78}
79
80module.exports.async = deserializeAsync;