Skip to content

Commit

Permalink
🥅 Improve presence error message
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
alecgibson committed Jun 14, 2021
1 parent a837b00 commit 040e611
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 2 deletions.
16 changes: 14 additions & 2 deletions lib/client/presence/local-doc-presence.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
var LocalPresence = require('./local-presence');
var ShareDBError = require('../../error');
var util = require('../../util');
var ERROR_CODE = ShareDBError.CODES;

module.exports = LocalDocPresence;
Expand Down Expand Up @@ -77,15 +78,15 @@ LocalDocPresence.prototype._transformAgainstOp = function(op, source) {
var presence = this;
this._pendingMessages.forEach(function(message) {
try {
message.p = presence._doc.type.transformPresence(message.p, op, source);
message.p = presence._transformPresence(message.p, op, source);
} catch (error) {
var callback = presence._getCallback(message.pv);
presence._callbackOrEmit(error, callback);
}
});

try {
this.value = this._doc.type.transformPresence(this.value, op, source);
this.value = this._transformPresence(this.value, op, source);
} catch (error) {
this.emit('error', error);
}
Expand All @@ -112,3 +113,14 @@ LocalDocPresence.prototype._message = function() {
message.t = null;
return message;
};

LocalDocPresence.prototype._transformPresence = function(value, op, source) {
var type = this._doc.type;
if (!util.supportsPresence(type)) {
throw new ShareDBError(
ERROR_CODE.ERR_TYPE_DOES_NOT_SUPPORT_PRESENCE,
'Type does not support presence: ' + type.name
);
}
return type.transformPresence(value, op, source);
};
21 changes: 21 additions & 0 deletions test/client/presence/doc-presence.js
Original file line number Diff line number Diff line change
Expand Up @@ -796,6 +796,27 @@ describe('DocPresence', function() {
], done);
});

it('errors local presence when listening to ops on a type that does not support presence', function(done) {
var jsonDoc = connection1.get('books', 'emma');
var jsonPresence = connection1.getDocPresence('books', 'emma');
var localJsonPresence = jsonPresence.create('json-presence');
localJsonPresence.submit({index: 1}, function() {
// Swallow error, which is expected since presence is unsupported
});

async.series([
jsonDoc.create.bind(jsonDoc, {title: 'Emma'}, 'json0'),
function(next) {
localJsonPresence.once('error', function(error) {
expect(error.code).to.eql('ERR_TYPE_DOES_NOT_SUPPORT_PRESENCE');
next();
});

jsonDoc.submitOp({p: ['author'], oi: 'Jane Austen'});
}
], done);
});

it('returns errors sent from the middleware', function(done) {
backend.use(backend.MIDDLEWARE_ACTIONS.sendPresence, function(request, callback) {
callback('some error');
Expand Down

0 comments on commit 040e611

Please sign in to comment.