From 1320c105154a25653210c853793a6479a8443a7a Mon Sep 17 00:00:00 2001 From: Matt Broadstone Date: Wed, 6 Jun 2018 11:09:08 -0400 Subject: [PATCH] fix(serialization): normalize function stringification A non-default option for serialization allows for the automatically stringifying javascript functions. Function.prototype.toString has changed between versions of node, so we need to normalize so as to not potentially break compatibility with earlier expectations. This should have marginal performance effects only in the case where users are actually using this functionality. NODE-1499 --- lib/bson/parser/calculate_size.js | 6 ++++-- lib/bson/parser/serializer.js | 5 ++++- lib/bson/parser/utils.js | 13 +++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 lib/bson/parser/utils.js diff --git a/lib/bson/parser/calculate_size.js b/lib/bson/parser/calculate_size.js index c43a0ab6..f174519d 100644 --- a/lib/bson/parser/calculate_size.js +++ b/lib/bson/parser/calculate_size.js @@ -13,6 +13,8 @@ var Long = require('../long').Long, DBRef = require('../db_ref').DBRef, Binary = require('../binary').Binary; +var normalizedFunctionString = require('./utils').normalizedFunctionString; + // To ensure that 0.4 of node works correctly var isDate = function isDate(d) { return typeof d === 'object' && Object.prototype.toString.call(d) === '[object Date]'; @@ -221,7 +223,7 @@ function calculateElement(name, value, serializeFunctions, isArray, ignoreUndefi 1 + 4 + 4 + - Buffer.byteLength(value.toString(), 'utf8') + + Buffer.byteLength(normalizedFunctionString(value), 'utf8') + 1 + calculateObjectSize(value.scope, serializeFunctions, ignoreUndefined) ); @@ -230,7 +232,7 @@ function calculateElement(name, value, serializeFunctions, isArray, ignoreUndefi (name != null ? Buffer.byteLength(name, 'utf8') + 1 : 0) + 1 + 4 + - Buffer.byteLength(value.toString(), 'utf8') + + Buffer.byteLength(normalizedFunctionString(value), 'utf8') + 1 ); } diff --git a/lib/bson/parser/serializer.js b/lib/bson/parser/serializer.js index 56b7d8ee..820bd089 100644 --- a/lib/bson/parser/serializer.js +++ b/lib/bson/parser/serializer.js @@ -6,6 +6,8 @@ var writeIEEE754 = require('../float_parser').writeIEEE754, Map = require('../map'), Binary = require('../binary').Binary; +const normalizedFunctionString = require('./utils').normalizedFunctionString; + // try { // var _Buffer = Uint8Array; // } catch (e) { @@ -443,7 +445,8 @@ var serializeFunction = function(buffer, key, value, index, checkKeys, depth, is index = index + numberOfWrittenBytes; buffer[index++] = 0; // Function string - var functionString = value.toString(); + var functionString = normalizedFunctionString(value); + // Write the string var size = buffer.write(functionString, index + 4, 'utf8') + 1; // Write the size of the string to buffer diff --git a/lib/bson/parser/utils.js b/lib/bson/parser/utils.js new file mode 100644 index 00000000..4a241773 --- /dev/null +++ b/lib/bson/parser/utils.js @@ -0,0 +1,13 @@ +'use strict'; + +/** + * Normalizes our expected stringified form of a function across versions of node + * @param {Function} fn The function to stringify + */ +function normalizedFunctionString(fn) { + return fn.toString().replace('function(', 'function ('); +} + +module.exports = { + normalizedFunctionString +};