diff --git a/lib/write-type.js b/lib/write-type.js index 94a10ab..c76fa76 100644 --- a/lib/write-type.js +++ b/lib/write-type.js @@ -26,6 +26,7 @@ exports.getWriteType = getWriteType; function getWriteType(options) { var token = WriteToken.getWriteToken(options); var useraw = options && options.useraw; + var functions = options && options.functions; var binarraybuffer = HAS_UINT8ARRAY && options && options.binarraybuffer; var isBuffer = binarraybuffer ? Bufferish.isArrayBuffer : Bufferish.isBuffer; var bin = binarraybuffer ? bin_arraybuffer : bin_buffer; @@ -229,6 +230,10 @@ function getWriteType(options) { // map 32 -- 0xdf function obj_to_map(encoder, value) { var keys = Object.keys(value); + + if (!functions) + keys = keys.filter(function(key) { return !(value[key] instanceof Function); }); + var length = keys.length; var type = (length < 16) ? (0x80 + length) : (length <= 0xFFFF) ? 0xde : 0xdf; token[type](encoder, length); diff --git a/test/28.functions.js b/test/28.functions.js new file mode 100644 index 0000000..cf8fbd5 --- /dev/null +++ b/test/28.functions.js @@ -0,0 +1,26 @@ +#!/usr/bin/env mocha -R spec + +var assert = require("assert"); +var msgpackJS = "../index"; +var isBrowser = ("undefined" !== typeof window); +var msgpack = isBrowser && window.msgpack || require(msgpackJS); +var TITLE = __filename.replace(/^.*\//, ""); +var obj = {func: function() {}}; + +describe(TITLE, function() { + it("functions: false", function() { + var options = {codec: msgpack.createCodec({functions: false})}; + + // as default + assert.deepEqual(msgpack.decode(msgpack.encode(obj)), {}); + + // explicit + assert.deepEqual(msgpack.decode(msgpack.encode(obj, options)), {}); + }); + + it("functions: true", function() { + var options = {codec: msgpack.createCodec({functions: true})}; + + assert.deepEqual(msgpack.decode(msgpack.encode(obj, options)), {"func": null}); + }); +});