Skip to content

Commit e33b4fd

Browse files
committed
Building unsubscribe
1 parent 1f18a79 commit e33b4fd

File tree

5 files changed

+104
-4
lines changed

5 files changed

+104
-4
lines changed

src/core/constructors/node.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,48 @@ dop.core.node.prototype.subscribe = function() {
2727
return dop.protocol.subscribe(this, arguments);
2828
};
2929

30+
dop.core.node.prototype.unsubscribe = function(object) {
31+
return dop.protocol.unsubscribe(this, object);
32+
};
33+
34+
35+
36+
dop.protocol.unsubscribe = function(node, object) {
37+
var object_id = dop.getObjectId(object),
38+
object_data = dop.data.object[object_id];
39+
40+
if (isObject(object_data) && isObject(object_data.node[node.token]) && object_data.node[node.token].owner) {
41+
var request = dop.core.createRequest(node, dop.protocol.instructions.unsubscribe, object_id);
42+
dop.core.storeRequest(node, request);
43+
if (node.connected)
44+
dop.core.sendRequests(node);
45+
return request.promise;
46+
}
47+
else
48+
return Promise.reject(dop.core.error.reject.SUBSCRIPTION_NOT_FOUND);
49+
};
50+
51+
52+
dop.protocol.onunsubscribe = function(node, request_id, request) {
53+
var object_id = request[1],
54+
object_data = dop.data.object[object_id],
55+
response = dop.core.createResponse(request_id);
56+
57+
if (isObject(object_data) && isObject(object_data.node[node.token]) && object_data.node[node.token].subscribed) {
58+
59+
var roles = object_data.node[node.token];
60+
roles.subscribed = false;
61+
62+
if (roles.owner === false)
63+
object_data.nodes_total -= 1;
64+
65+
if (object_data.nodes_total === 0)
66+
delete dop.data.object[object_id];
67+
68+
response.push(0);
69+
}
70+
else
71+
response.push(dop.core.error.reject.SUBSCRIPTION_NOT_FOUND);
72+
73+
dop.core.sendResponse(node, response);
74+
};

src/core/error.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ dop.core.error = {
66
},
77

88
reject: {
9-
OBJECT_NOT_FOUND: 'Object not found to be subscribed',
109
// OBJECT_ALREADY_SUBSCRIBED: 'The object "%s" is already subscribed',
10+
OBJECT_NOT_FOUND: 'Object not found to be subscribed',
11+
SUBSCRIPTION_NOT_FOUND: 'Not subscription found to unsubscribe this object',
1112
}
1213

1314
};

src/core/protocol/registerObjectToNode.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ dop.core.registerObjectToNode = function(node, object) {
1616
object_data.nodes_total += 1;
1717
object_data.node[node.token] = {
1818
subscribed: false,
19-
owner: false
19+
owner: false,
20+
subscribed_version: 0,
21+
owner_version: 0
2022
};
2123
}
2224

src/protocol/instructions.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ dop.protocol.instructions = {
3535

3636
// Subscriptor -> Owner
3737
unsubscribe: 2, // [ 1234, <instruction>, <object_id>]
38-
// Owner -> Subscriptor
39-
// [ 1234, <instruction>, -<object_id>]
4038
// [-1234, 0]
4139

4240
// Subscriptor -> Owner

test/transports/unsubscribe.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
var test = require('tape');
2+
var dopServer = require('../../dist/nodejs').create();
3+
var dopClient = require('../../dist/nodejs').create();
4+
dopServer.env = 'SERVER';
5+
dopClient.env = 'CLIENT';
6+
7+
8+
var transportName = process.argv[2] || 'local';
9+
var transportListen = require('dop-transports').listen[transportName];
10+
var transportConnect = require('dop-transports').connect[transportName];
11+
12+
var server = dopServer.listen({transport:transportListen})
13+
var client = dopClient.connect({transport:transportConnect, listener:server})
14+
server.on('connect', function(node) {
15+
if (typeof serverClient == 'undefined')
16+
serverClient = node;
17+
})
18+
19+
20+
21+
test('Client unsubscribe Server', function(t) {
22+
var objectServer = dopServer.register({test:Math.random()});
23+
t.equal(dopServer.data.object[1], undefined, 'Object data not stored on server yet');
24+
25+
dopServer.onsubscribe(function() {
26+
return objectServer;
27+
})
28+
29+
var objectClient = dopClient.register({});
30+
t.equal(dopClient.data.object[1], undefined, 'Object data not stored on client yet');
31+
client.subscribe().into(objectClient).then(function(obj){
32+
var objectDataServer = dopServer.data.object[1];
33+
var objectDataClient = dopClient.data.object[1];
34+
t.deepEqual(objectDataServer.node[serverClient.token].subscribed, true, 'Client subscribed');
35+
t.deepEqual(objectDataServer.node[serverClient.token].owner, false, 'Client is not owner');
36+
t.deepEqual(objectDataClient.node[client.token].subscribed, false, 'Server is not subscribed');
37+
t.deepEqual(objectDataClient.node[client.token].owner, true, 'Server is owner');
38+
39+
40+
client.unsubscribe(objectClient)
41+
.then(function(){
42+
t.deepEqual(objectDataServer.node[serverClient.token].subscribed, false, 'Client subscribed');
43+
t.deepEqual(objectDataServer.node[serverClient.token].owner, false, 'Client is not owner');
44+
t.deepEqual(objectDataClient.node[client.token].subscribed, false, 'Server is not subscribed');
45+
t.deepEqual(objectDataClient.node[client.token].owner, true, 'Server is owner');
46+
})
47+
.catch(function(err){
48+
console.log( err );
49+
})
50+
51+
t.end();
52+
})
53+
54+
})

0 commit comments

Comments
 (0)