Skip to content

Commit b74aa62

Browse files
committed
Patch instruction implemented
1 parent 9e584e8 commit b74aa62

File tree

8 files changed

+352
-167
lines changed

8 files changed

+352
-167
lines changed

dist/browser.js

Lines changed: 137 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,7 +1459,7 @@ dop.core.error = {
14591459
// Remote rejects
14601460
reject_remote: {
14611461
OBJECT_NOT_FOUND: 1,
1462-
1: 'Remote object not found or not permissions to be subscribed',
1462+
1: 'Remote object not found or not permissions to use it',
14631463
SUBSCRIPTION_NOT_FOUND: 2,
14641464
2: 'Subscription not found to unsubscribe this object',
14651465
FUNCTION_NOT_FOUND: 3,
@@ -1989,7 +1989,7 @@ dop.core.emitObservers = function(mutations) {
19891989
subobject = mutation.object;
19901990
object_dop = dop.getObjectDop(subobject);
19911991

1992-
if (!mutationsWithSubscribers /*&& dop.data.object_data[object_dop[0]].nodes > 0*/)
1992+
if (!mutationsWithSubscribers && isObject(dop.data.object[object_dop[0]]))
19931993
mutationsWithSubscribers = true;
19941994

19951995
// Emiting mutations to observerProperties
@@ -2060,8 +2060,9 @@ dop.core.injectMutationInAction = function(action, mutation, isUnaction) {
20602060
var swaps = mutation.swaps.slice(0);
20612061
if (isUnaction)
20622062
swaps.reverse();
2063-
var tochange = (swaps[0]>0) ? 0 : 1;
2064-
swaps[tochange] = swaps[tochange]*-1;
2063+
// var tochange = (swaps[0]>0) ? 0 : 1;
2064+
// swaps[tochange] = swaps[tochange]*-1;
2065+
swaps.unshift(0); // 0 mean swap
20652066
mutations.push(swaps);
20662067
}
20672068

@@ -2074,14 +2075,16 @@ dop.core.injectMutationInAction = function(action, mutation, isUnaction) {
20742075
}
20752076
else
20762077
splice = mutation.splice.slice(0);
2077-
2078+
2079+
splice.unshift(1); // 1 mean splice
20782080
mutations.push(splice);
20792081
}
20802082

20812083
// set
20822084
else
2083-
mutations.push([prop, 1, value]);
2085+
mutations.push([1, prop, 1, value]);
20842086

2087+
// We have to update the length of the array in case that is lower than before
20852088
if (isUnaction && mutation.length!==undefined && mutation.length!==mutation.object.length)
20862089
action.length = mutation.length;
20872090
}
@@ -2214,21 +2217,24 @@ dop.core.setActionMutator = function(destiny, prop, value, typeofValue, path) {
22142217
var mutations = value[dop.cons.DOP],
22152218
mutation,
22162219
index=0,
2217-
total=mutations.length;
2220+
total=mutations.length,
2221+
typeArrayMutation;
22182222

22192223
// if (typeofDestiny!='array')
22202224
// dop.set(destiny, prop, []);
22212225

22222226
for (;index<total; ++index) {
2223-
mutation = mutations[index];
2224-
// swaps
2225-
if (mutation[0]<0 || mutation[1]<0) {
2226-
mutation = mutation.slice(0);
2227-
(mutation[0]<0) ? mutation[0] = mutation[0]*-1 : mutation[1] = mutation[1]*-1;
2227+
typeArrayMutation = mutations[index][0]; // 0=swaps 1=splices
2228+
mutation = mutations[index].slice(1);
2229+
// swap
2230+
if (typeArrayMutation===0) {
2231+
// mutation = mutation.slice(0);
2232+
// (mutation[0]<0) ? mutation[0] = mutation[0]*-1 : mutation[1] = mutation[1]*-1;
22282233
dop.core.swap(destiny[prop], mutation);
22292234
}
22302235
// set
22312236
else {
2237+
// We have to update the length of the array in case that is lower than before
22322238
if (destiny[prop].length<mutation[0])
22332239
dop.getObjectTarget(destiny[prop]).length = mutation[0];
22342240
// set
@@ -2447,15 +2453,18 @@ dop.core.decode = function(property, value, node, undefineds) {
24472453
////////// src/core/protocol/emitNodes.js
24482454

24492455
dop.core.emitNodes = function(action) {
2450-
// var object_id, node_token, node;
2451-
// for (object_id in action) {
2452-
// if (dop.data.object_data[object_id].nodes > 0) {
2453-
// for (node_token in dop.data.object_data[object_id].node) {
2454-
// node = dop.data.node[node_token];
2455-
// dop.protocol.merge(node, object_id, action[object_id]);
2456-
// }
2457-
// }
2458-
// }
2456+
var object_id, node_token, node, object_data;
2457+
for (object_id in action) {
2458+
if (isObject(dop.data.object[object_id])) {
2459+
object_data = dop.data.object[object_id];
2460+
for (node_token in object_data.node) {
2461+
if (object_data.node[node_token].subscriber===1) {
2462+
node = dop.data.node[node_token];
2463+
dop.protocol.patch(node, Number(object_id), action[object_id].action);
2464+
}
2465+
}
2466+
}
2467+
}
24592468
};
24602469

24612470

@@ -2592,9 +2601,11 @@ dop.core.registerObjectToNode = function(node, object) {
25922601
object_data.nodes_total += 1;
25932602
object_data.node[node.token] = {
25942603
subscriber: 0, // 0 or 1 || false true
2595-
owner: 0, // object_id_owner
2596-
subscriber_version: 0,
2597-
owner_version: 0
2604+
owner: 0, // object_id_owner || 0 === false
2605+
version: 0, // incremental integer for new patches
2606+
pending: [],
2607+
applied_version: 0, // last patch version applied correctly
2608+
applied: {}
25982609
};
25992610
}
26002611

@@ -2755,6 +2766,44 @@ dop.protocol._oncall = function(node, request_id, request, response) {
27552766

27562767

27572768

2769+
////////// src/protocol/_onpatch.js
2770+
2771+
dop.protocol._onpatch = function(node, request_id, request, response) {
2772+
var rejection = response[0],
2773+
object_id = request[2],
2774+
object_node = dop.data.object[object_id].node[node.token],
2775+
version = request[3],
2776+
pending_list = object_node.pending,
2777+
promise = request.promise,
2778+
index = 0,
2779+
total = pending_list.length,
2780+
version_item;
2781+
2782+
2783+
if (rejection !== undefined) {
2784+
if (rejection === 0) {
2785+
for (;index<total; index++) {
2786+
version_item = pending_list[index][0];
2787+
// Removing from pending because its been received correctly
2788+
if (version_item >= version) {
2789+
if (version_item === version)
2790+
pending_list.splice(index, 1);
2791+
break;
2792+
}
2793+
// Resending
2794+
else
2795+
dop.protocol.patchSend(node, object_id, object_node, version_item, pending_list[index][1]);
2796+
}
2797+
promise.resolve(response[1]);
2798+
}
2799+
else
2800+
promise.reject(dop.core.getRejectError(rejection));
2801+
}
2802+
};
2803+
2804+
2805+
2806+
27582807
////////// src/protocol/_onsubscribe.js
27592808

27602809
dop.protocol._onsubscribe = function(node, request_id, request, response) {
@@ -2938,7 +2987,7 @@ dop.protocol.instructions = {
29382987
// [-1234, 0, <return>]
29392988

29402989
// Owner -> Subscriptor
2941-
mutation: 5, // [ 1234, <instruction>, <object_id>, <version>, <mutation>]
2990+
patch: 5, // [ 1234, <instruction>, <object_id>, <version>, <patch>]
29422991
// [-1234, 0]
29432992
};
29442993

@@ -2949,25 +2998,11 @@ for (var instruction in dop.protocol.instructions)
29492998

29502999

29513000

2952-
////////// src/protocol/mutation.js
2953-
2954-
dop.protocol.mutation = function(node, object_id, action) {
2955-
2956-
console.log(node.token, object_id, action);
2957-
// node.send(JSON.stringify(
2958-
// dop.core.createRequest(node, dop.protocol.instructions.connect, token)
2959-
//));
2960-
2961-
};
2962-
2963-
2964-
2965-
29663001
////////// src/protocol/onbroadcast.js
29673002

29683003
dop.protocol.onbroadcast = function(node, request_id, request) {
2969-
dop.protocol.onfunction(node, request_id, request, function(permission, object_id) {
2970-
return permission.owner===object_id;
3004+
dop.protocol.onfunction(node, request_id, request, node.owner[request[1]], function(permission) {
3005+
return permission.owner===request[1];
29713006
});
29723007
};
29733008

@@ -2977,7 +3012,7 @@ dop.protocol.onbroadcast = function(node, request_id, request) {
29773012
////////// src/protocol/oncall.js
29783013

29793014
dop.protocol.oncall = function(node, request_id, request) {
2980-
dop.protocol.onfunction(node, request_id, request, function(permission) {
3015+
dop.protocol.onfunction(node, request_id, request, request[1], function(permission) {
29813016
return permission.subscriber===1;
29823017
});
29833018
}
@@ -2987,13 +3022,12 @@ dop.protocol.oncall = function(node, request_id, request) {
29873022

29883023
////////// src/protocol/onfunction.js
29893024
// Used by dop.protocol.oncall && dop.protocol.onbroadcast
2990-
dop.protocol.onfunction = function(node, request_id, request, validator) {
2991-
var object_id = request[1],
2992-
path = request[2],
3025+
dop.protocol.onfunction = function(node, request_id, request, object_id, validator) {
3026+
var path = request[2],
29933027
params = request[3],
29943028
object_data = dop.data.object[object_id];
29953029

2996-
if (isObject(object_data) && isObject(object_data.node[node.token]) && validator(object_data.node[node.token], object_id)) {
3030+
if (isObject(object_data) && isObject(object_data.node[node.token]) && validator(object_data.node[node.token])) {
29973031
var functionName = path.pop(),
29983032
object = dop.util.get(object_data.object, path),
29993033
f = object[functionName];
@@ -3027,6 +3061,44 @@ dop.protocol.onfunction = function(node, request_id, request, validator) {
30273061

30283062

30293063

3064+
////////// src/protocol/onpatch.js
3065+
3066+
dop.protocol.onpatch = function(node, request_id, request) {
3067+
var object_id_owner = request[1],
3068+
object_id = node.owner[object_id_owner],
3069+
version = request[2],
3070+
patch = request[3],
3071+
response = dop.core.createResponse(request_id),
3072+
object_data = dop.data.object[object_id],
3073+
object_node,
3074+
collector;
3075+
3076+
if (isObject(object_data) && isObject(object_data.node[node.token]) && object_data.node[node.token].owner===object_id_owner) {
3077+
object_node = object_data.node[node.token];
3078+
// Storing patch
3079+
if (object_node.applied_version < version && object_node.applied[version]===undefined) {
3080+
// Storing patch
3081+
object_node.applied[version] = patch;
3082+
// Applying
3083+
collector = dop.collectFirst();
3084+
while (object_node.applied[object_node.applied_version+1]) {
3085+
object_node.applied_version += 1;
3086+
dop.core.setActionFunction(object_data.object, object_node.applied[object_node.applied_version]);
3087+
delete object_node.applied[object_node.applied_version];
3088+
}
3089+
collector.emitAndDestroy();
3090+
}
3091+
response.push(0);
3092+
}
3093+
else
3094+
response.push(dop.core.error.reject_remote.OBJECT_NOT_FOUND);
3095+
3096+
dop.core.storeSendMessages(node, response);
3097+
};
3098+
3099+
3100+
3101+
30303102
////////// src/protocol/onsubscribe.js
30313103

30323104
dop.protocol.onsubscribe = function(node, request_id, request) {
@@ -3104,6 +3176,25 @@ dop.protocol.onunsubscribe = function(node, request_id, request) {
31043176

31053177

31063178

3179+
////////// src/protocol/patch.js
3180+
3181+
dop.protocol.patch = function(node, object_id, patch) {
3182+
var object_node = dop.data.object[object_id].node[node.token],
3183+
version = ++object_node.version;
3184+
object_node.pending.push([version, dop.util.merge({}, patch)]); // Making a copy because this object is exposed to the api users and can be mutated
3185+
return dop.protocol.patchSend(node, object_id, object_node, version, patch);
3186+
};
3187+
3188+
// Also used by dop.protocol._onpatch
3189+
dop.protocol.patchSend = function(node, object_id, object_node, version, patch) {
3190+
var request = dop.core.createRequest( node, dop.protocol.instructions.patch, object_id, version, patch);
3191+
dop.core.storeSendMessages(node, request, dop.encodeFunction);
3192+
return request.promise;
3193+
};
3194+
3195+
3196+
3197+
31073198
////////// src/protocol/subscribe.js
31083199

31093200
dop.protocol.subscribe = function(node, params) {

dist/browser.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)