diff --git a/lib/bson/parser/deserializer.js b/lib/bson/parser/deserializer.js index b7f45d769..92e48a48c 100644 --- a/lib/bson/parser/deserializer.js +++ b/lib/bson/parser/deserializer.js @@ -38,7 +38,7 @@ var deserialize = function(buffer, options, isArray) { return deserializeObject(buffer, index, options, isArray); }; -var deserializeObject = function(buffer, index, options, isArray) { +var deserializeObject = function(buffer, index, options, isArray, target) { var evalFunctions = options['evalFunctions'] == null ? false : options['evalFunctions']; var cacheFunctions = options['cacheFunctions'] == null ? false : options['cacheFunctions']; var cacheFunctionsCrc32 = @@ -73,11 +73,14 @@ var deserializeObject = function(buffer, index, options, isArray) { if (size < 5 || size > buffer.length) throw new Error('corrupt bson message'); // Create holding object - var object = isArray ? [] : {}; + var object = (target instanceof Function) ? new target() : (isArray ? [] : {}); // Used for arrays to skip having to perform utf8 decoding var arrayIndex = 0; var done = false; + var newTarget = null; + + if (isArray && target) newTarget = target['$']; // While we have more left data left keep parsing // while (buffer[index + 1] !== 0) { @@ -98,6 +101,9 @@ var deserializeObject = function(buffer, index, options, isArray) { if (i >= buffer.length) throw new Error('Bad BSON Document: illegal CString'); var name = isArray ? arrayIndex++ : buffer.toString('utf8', index, i); + if (name === 'firstBatch' || name === 'nextBatch') newTarget = {$: options.target}; + else if (!isArray && target) newTarget = target['$' + name]; + index = i + 1; if (elementType === BSON.BSON_DATA_STRING) { @@ -164,7 +170,7 @@ var deserializeObject = function(buffer, index, options, isArray) { if (raw) { object[name] = buffer.slice(index, index + objectSize); } else { - object[name] = deserializeObject(buffer, _index, options, false); + object[name] = deserializeObject(buffer, _index, options, false, newTarget); } index = index + objectSize; @@ -187,7 +193,7 @@ var deserializeObject = function(buffer, index, options, isArray) { arrayOptions['raw'] = true; } - object[name] = deserializeObject(buffer, _index, arrayOptions, true); + object[name] = deserializeObject(buffer, _index, arrayOptions, true, newTarget); index = index + objectSize; if (buffer[index - 1] !== 0) throw new Error('invalid array terminator byte');