Skip to content

Commit 9e584e8

Browse files
committed
Building patch instruction
1 parent 01f9ee7 commit 9e584e8

File tree

3 files changed

+71
-23
lines changed

3 files changed

+71
-23
lines changed

src/core/protocol/registerObjectToNode.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ dop.core.registerObjectToNode = function(node, object) {
1717
object_data.node[node.token] = {
1818
subscriber: 0, // 0 or 1 || false true
1919
owner: 0, // object_id_owner || 0 === false
20-
subscriber_version: 0,
21-
owner_version: 0,
22-
pending_version: 0,
23-
pending: {}
20+
version: 0, // incremental integer for new patches
21+
received_version: 0, // last patch version received correctly
22+
received: {},
23+
applied_version:0, // last patch version applied correctly
24+
applied:{}
2425
};
2526
}
2627

src/protocol/patch.js

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
dop.protocol.patch = function(node, object_id, patch) {
33
var object_node = dop.data.object[object_id].node[node.token],
4-
version = ++object_node.subscriber_version,
4+
version = ++object_node.version,
55
request = dop.core.createRequest(
66
node,
77
dop.protocol.instructions.patch,
@@ -10,7 +10,7 @@ dop.protocol.patch = function(node, object_id, patch) {
1010
patch
1111
);
1212

13-
object_node.pending[version] = patch;
13+
object_node.received[version] = {received:false, patch:dop.util.merge({}, patch)}; // Making a copy because this object is exposed to the api users and can be mutated
1414
dop.core.storeSendMessages(node, request, dop.encodeFunction);
1515
return request.promise;
1616
};
@@ -22,19 +22,29 @@ dop.protocol.onpatch = function(node, request_id, request) {
2222
patch = request[3],
2323
response = dop.core.createResponse(request_id),
2424
object_data = dop.data.object[object_id],
25-
object_node;
26-
25+
object_node,
26+
collector;
27+
console.log( version );
2728
if (isObject(object_data) && isObject(object_data.node[node.token]) && object_data.node[node.token].owner===object_id_owner) {
2829
object_node = object_data.node[node.token];
29-
// We apply patch
30-
if (object_node.owner_version+1 === version) {
31-
object_node.owner_version += 1;
30+
// Storing patch
31+
if (object_node.applied_version < version && object_node.applied[version]===undefined) {
32+
console.log(version, 'entra')
33+
// Storing patch
34+
object_node.applied[version] = patch;
35+
// Applying
3236
collector = dop.collectFirst();
33-
dop.core.setActionFunction(object_data.object, patch);
37+
while (object_node.applied[object_node.applied_version+1]) {
38+
object_node.applied_version += 1;
39+
console.log(object_node.applied_version, object_node.applied[object_node.applied_version] );
40+
dop.core.setActionFunction(object_data.object, object_node.applied[object_node.applied_version]);
41+
delete object_node.applied[object_node.applied_version];
42+
}
3443
collector.emitAndDestroy();
35-
response.push(0);
3644
}
37-
//
45+
console.log( '--' );
46+
// Confirm received
47+
response.push(0);
3848
}
3949
else
4050
response.push(dop.core.error.reject_remote.OBJECT_NOT_FOUND);
@@ -44,14 +54,21 @@ dop.protocol.onpatch = function(node, request_id, request) {
4454

4555
dop.protocol._onpatch = function(node, request_id, request, response) {
4656
var rejection = response[0],
47-
// object_id = request[2],
57+
object_id = request[2],
58+
object_node = dop.data.object[object_id].node[node.token],
59+
version = request[3],
4860
promise = request.promise;
4961

5062

5163
if (rejection !== undefined) {
5264
if (rejection === 0) {
53-
// var object_node = dop.data.object[object_id].node[node.token];
54-
promise.resolve(response[1]);
65+
// Correct version applyed
66+
if (object_node.pending_version+1 === version) {
67+
console.log( object_node.pending_version, version );
68+
object_node.pending_version += 1;
69+
delete object_node.pending[object_node.pending_version];
70+
promise.resolve(response[1]);
71+
}
5572
}
5673
else
5774
promise.reject(dop.core.getRejectError(rejection));

test/protocol/patchs.js

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var transportListen = require('dop-transports').listen[transportName];
77
var transportConnect = require('dop-transports').connect[transportName];
88

99
dop.env = 'SERVER';
10+
dop.data.object_inc = 25;
1011
dopClient1.env = 'CLIENT1';
1112
dopClient2.env = 'CLIENT2';
1213

@@ -36,15 +37,17 @@ dop.onsubscribe(function(){
3637
// test('BROADCASTING TO CLIENTS', function(t) {
3738

3839
client1.subscribe().into({subobject:{broadcast:function(a,b){return a+b}}})
40+
// .then(function(obj) {
41+
// return client2.subscribe().into({subobject:{broadcast:function(a,b){return a*b}}})
42+
// })
3943
.then(function(obj) {
40-
return client2.subscribe().into({subobject:{broadcast:function(a,b){return a*b}}})
41-
})
42-
.then(function(obj) {
44+
console.log(dopClient1.data.object[1].object)
4345

44-
// var collector = dop.collect();
4546
objServer.number = 25;
4647
objServer.arr = [1,2,3];
47-
// collector.emitAndDestroy();
48+
objServer.tres = 3;
49+
objServer.cuatro = 4444;
50+
objServer.cinco = 'elcinco';
4851

4952
// var promises = objServer.subobject.broadcast(2,5);
5053
// t.equal(Array.isArray(promises), true, 'Promises is array');
@@ -63,4 +66,31 @@ client1.subscribe().into({subobject:{broadcast:function(a,b){return a+b}}})
6366
// })
6467

6568

66-
// // More test todo
69+
// // More test todo
70+
dopClient1.protocol.onpatchOri = dopClient1.protocol.onpatch;
71+
dopClient1.protocol.onpatch = function(node, request_id, request) {
72+
var version = request[2];
73+
if (request[2] === 2) {
74+
setTimeout(function() {
75+
dopClient1.protocol.onpatchOri(node, request_id, request);
76+
}, 100);
77+
setTimeout(function() {
78+
dopClient1.protocol.onpatchOri(node, request_id, request);
79+
console.log(dopClient1.data.object[1].object)
80+
}, 300);
81+
}
82+
else if (request[2] === 4) {
83+
setTimeout(function() {
84+
dopClient1.protocol.onpatchOri(node, request_id, request);
85+
}, 150);
86+
setTimeout(function() {
87+
dopClient1.protocol.onpatchOri(node, request_id, request);
88+
}, 200);
89+
}
90+
else if (request[2] === 3) {
91+
dopClient1.protocol.onpatchOri(node, request_id, request);
92+
dopClient1.protocol.onpatchOri(node, request_id, request);
93+
}
94+
else
95+
dopClient1.protocol.onpatchOri(node, request_id, request);
96+
}

0 commit comments

Comments
 (0)