diff --git a/lib/ot.js b/lib/ot.js index 1dc89bcfc..8cf708521 100644 --- a/lib/ot.js +++ b/lib/ot.js @@ -102,7 +102,7 @@ exports.apply = function(snapshot, op) { function applyOpEdit(snapshot, edit) { if (!snapshot.type) return {code: 4015, message: 'Document does not exist'}; - if (typeof edit !== 'object') return {code: 5004, message: 'Missing op'}; + if (edit == null) return {code: 5004, message: 'Missing op'}; var type = types[snapshot.type]; if (!type) return {code: 4008, message: 'Unknown type'}; diff --git a/test/client/number-type.js b/test/client/number-type.js new file mode 100644 index 000000000..d25401ebc --- /dev/null +++ b/test/client/number-type.js @@ -0,0 +1,23 @@ +// A simple number type, where: +// +// - snapshot is an integer +// - operation is an integer +exports.type = { + name: 'number-type', + uri: 'http://sharejs.org/types/number-type', + create: create, + apply: apply, + transform: transform +}; + +function create(data) { + return data | 0; +} + +function apply(snapshot, op) { + return snapshot + op; +} + +function transform(op1, op2, side) { + return op1; +} diff --git a/test/client/submit.js b/test/client/submit.js index 4e508e66e..b80abe0af 100644 --- a/test/client/submit.js +++ b/test/client/submit.js @@ -2,8 +2,10 @@ var async = require('async'); var expect = require('expect.js'); var types = require('../../lib/types'); var deserializedType = require('./deserialized-type'); +var numberType = require('./number-type'); types.register(deserializedType.type); types.register(deserializedType.type2); +types.register(numberType.type); module.exports = function() { describe('client submit', function() { @@ -1044,6 +1046,19 @@ describe('client submit', function() { }); }); + it('allows snapshot and op to be a non-object', function(done) { + var doc = this.backend.connect().get('dogs', 'fido'); + doc.create(5, numberType.type.uri, function (err) { + if (err) return done(err); + expect(doc.data).to.equal(5); + doc.submitOp(2, function(err) { + if (err) return done(err); + expect(doc.data).to.equal(7); + done(); + }); + }); + }); + describe('type.deserialize', function() { it('can create a new doc', function(done) { var doc = this.backend.connect().get('dogs', 'fido');