Skip to content

Commit 040e611

Browse files
committed
🥅 Improve presence error message
At the moment, if a consumer tries to listen for presence on a type that does not support presence, they'll get an error along the lines of: ``` TypeError: this._doc.type.transformPresence is not a function at LocalDocPresence._transformAgainstOp ``` This can be a bit confusing for consumers who assume their type supports presence. This change wraps that method in a function that will check if the type supports presence. If not, then we throw a more descriptive error, explaining that the type does not support presence.
1 parent a837b00 commit 040e611

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)