Skip to content

Commit 6408b60

Browse files
authored
Merge pull request #481 from share/presence-error
🥅 Improve presence error message
2 parents 4862bc6 + 040e611 commit 6408b60

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

lib/client/presence/local-doc-presence.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var LocalPresence = require('./local-presence');
22
var ShareDBError = require('../../error');
3+
var util = require('../../util');
34
var ERROR_CODE = ShareDBError.CODES;
45

56
module.exports = LocalDocPresence;
@@ -77,15 +78,15 @@ LocalDocPresence.prototype._transformAgainstOp = function(op, source) {
7778
var presence = this;
7879
this._pendingMessages.forEach(function(message) {
7980
try {
80-
message.p = presence._doc.type.transformPresence(message.p, op, source);
81+
message.p = presence._transformPresence(message.p, op, source);
8182
} catch (error) {
8283
var callback = presence._getCallback(message.pv);
8384
presence._callbackOrEmit(error, callback);
8485
}
8586
});
8687

8788
try {
88-
this.value = this._doc.type.transformPresence(this.value, op, source);
89+
this.value = this._transformPresence(this.value, op, source);
8990
} catch (error) {
9091
this.emit('error', error);
9192
}
@@ -112,3 +113,14 @@ LocalDocPresence.prototype._message = function() {
112113
message.t = null;
113114
return message;
114115
};
116+
117+
LocalDocPresence.prototype._transformPresence = function(value, op, source) {
118+
var type = this._doc.type;
119+
if (!util.supportsPresence(type)) {
120+
throw new ShareDBError(
121+
ERROR_CODE.ERR_TYPE_DOES_NOT_SUPPORT_PRESENCE,
122+
'Type does not support presence: ' + type.name
123+
);
124+
}
125+
return type.transformPresence(value, op, source);
126+
};

test/client/presence/doc-presence.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,27 @@ describe('DocPresence', function() {
796796
], done);
797797
});
798798

799+
it('errors local presence when listening to ops on a type that does not support presence', function(done) {
800+
var jsonDoc = connection1.get('books', 'emma');
801+
var jsonPresence = connection1.getDocPresence('books', 'emma');
802+
var localJsonPresence = jsonPresence.create('json-presence');
803+
localJsonPresence.submit({index: 1}, function() {
804+
// Swallow error, which is expected since presence is unsupported
805+
});
806+
807+
async.series([
808+
jsonDoc.create.bind(jsonDoc, {title: 'Emma'}, 'json0'),
809+
function(next) {
810+
localJsonPresence.once('error', function(error) {
811+
expect(error.code).to.eql('ERR_TYPE_DOES_NOT_SUPPORT_PRESENCE');
812+
next();
813+
});
814+
815+
jsonDoc.submitOp({p: ['author'], oi: 'Jane Austen'});
816+
}
817+
], done);
818+
});
819+
799820
it('returns errors sent from the middleware', function(done) {
800821
backend.use(backend.MIDDLEWARE_ACTIONS.sendPresence, function(request, callback) {
801822
callback('some error');

0 commit comments

Comments
 (0)