Skip to content

Commit 064a238

Browse files
committed
dop.intercept implemented
1 parent a1aea93 commit 064a238

File tree

7 files changed

+273
-7
lines changed

7 files changed

+273
-7
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "dop",
3-
"version": "0.23.0",
3+
"version": "0.24.0",
44
"main": "./dist/dop.nodejs.js",
55
"browser": "./dist/dop.js",
66
"unpkg": "./dist/dop.min.js",

src/api/intercept.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
2+
dop.intercept = function(object, property, callback) {
3+
4+
dop.util.invariant(dop.isRegistered(object), 'dop.intercept() needs a registered object as first parameter');
5+
var path = dop.getObjectPath(object);
6+
dop.util.invariant(isArray(path), 'dop.intercept() The object you are passing is not allocated to a registered object');
7+
var type = 'interceptors';
8+
if (arguments.length === 2)
9+
callback = property;
10+
11+
dop.util.invariant(isFunction(callback), 'dop.intercept() needs a callback as last parameter');
12+
13+
var path_id = dop.core.getPathId(path),
14+
data_path = dop.data.path;
15+
16+
if (arguments.length === 3) {
17+
type = 'interceptors_prop';
18+
path_id += dop.core.pathSeparator(property);
19+
}
20+
21+
if (data_path[path_id] === undefined)
22+
data_path[path_id] = {};
23+
24+
if (data_path[path_id][type] === undefined)
25+
data_path[path_id][type] = [];
26+
27+
var interceptors = data_path[path_id][type];
28+
interceptors.push(callback);
29+
30+
return function dispose() {
31+
// delete interceptors[interceptors.indexOf(callback)]; // we splice in dop.core.runInterceptors
32+
interceptors.splice(interceptors.indexOf(callback), 1);
33+
};
34+
35+
};
36+
37+
38+

src/core/objects/storeMutation.js

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,30 @@
22
dop.core.storeMutation = function(mutation) {
33

44
var collectors = dop.data.collectors,
5+
paths = dop.data.path,
56
index=0,
67
total=collectors.length,
8+
path_id_parent,
79
path_id;
810

911
// Saving path_id
10-
path_id = mutation.path_id = dop.core.getPathId(mutation.path);
12+
path_id_parent = path_id = mutation.path_id = dop.core.getPathId(mutation.path);
1113

1214
if (mutation.splice===undefined && mutation.swaps===undefined)
1315
path_id += dop.core.pathSeparator(mutation.prop);
1416

15-
// Running collectors
17+
18+
// Interceptors objects
19+
if (!dop.core.runInterceptors(paths[path_id_parent], 'interceptors', mutation))
20+
return
21+
22+
23+
// Interceptors properties
24+
if (!dop.core.runInterceptors(paths[path_id], 'interceptors_prop', mutation))
25+
return
26+
27+
28+
// Collectors
1629
for (;index<total; index++)
1730
if (collectors[index].add(mutation))
1831
return dop.core.runDerivations(path_id);
@@ -22,4 +35,30 @@ dop.core.storeMutation = function(mutation) {
2235
snapshot.emit();
2336

2437
dop.core.runDerivations(path_id);
25-
};
38+
};
39+
40+
41+
dop.core.runInterceptors = function(interceptors, type, mutation) {
42+
if (interceptors && (interceptors=interceptors[type]) && interceptors.length>0)
43+
for (var index=0,total=interceptors.length; index<total; ++index)
44+
if (interceptors[index](mutation) !== true)
45+
return false;
46+
47+
return true;
48+
};
49+
50+
51+
// dop.core.runInterceptors = function(interceptors, type, mutation) {
52+
// if (interceptors && (interceptors=interceptors[type]) && interceptors.length>0) {
53+
// for (var index=0,total=interceptors.length, tosplice=[]; index<total; ++index) {
54+
// if (interceptors[index] === undefined)
55+
// tosplice.push(index);
56+
// else if (interceptors[index](mutation) !== true)
57+
// return false;
58+
// }
59+
// for (index=0,total=tosplice.length; index<total; ++index)
60+
// tosplice.splice(tosplice[index], 1);
61+
// }
62+
63+
// return true;
64+
// };

src/dop.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ var dop = {
2727
// "1.thepath.value": {
2828
// observers: {},
2929
// observers_prop: {},
30+
// interceptors: {},
31+
// interceptors_prop: {},
3032
// computeds: [],
3133
// derivations: [],
3234
// }

test/interceptors.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
var test = require('tape');
2+
// require('tabe').createStream( test );
3+
dop = require('./.proxy').create()
4+
var set = dop.set
5+
6+
7+
8+
var object = dop.register({name:'Enzo'});
9+
10+
11+
12+
test('Passing wrong arguments', function(t) {
13+
14+
var disposer;
15+
try {disposer = dop.intercept()}
16+
catch(e){t.equal(e.message.indexOf('needs a registered object')>-1,true, e.message)}
17+
18+
try {disposer = dop.intercept(object)}
19+
catch(e){t.equal(e.message.indexOf('needs a callback')>-1,true, e.message)}
20+
21+
try {disposer = dop.intercept(object, 'name')}
22+
catch(e){t.equal(e.message.indexOf('needs a callback')>-1,true, e.message)}
23+
24+
var disposer = dop.intercept(object, function(){})
25+
t.equal(typeof disposer, 'function')
26+
disposer()
27+
28+
disposer = dop.intercept(object, 'name', function(){})
29+
t.equal(typeof disposer, 'function')
30+
disposer()
31+
32+
t.end();
33+
})
34+
35+
36+
37+
test('Multiple interceptors', function(t) {
38+
var inc = 1
39+
var disposer1 = dop.intercept(object, 'name', function(mutation) {
40+
t.equal(inc++, 2)
41+
return true
42+
})
43+
var disposer2 = dop.intercept(object, function(mutation) {
44+
t.equal(inc++, 1)
45+
return true
46+
})
47+
var disposer3 = dop.intercept(object, 'name', function(mutation) {
48+
t.equal(inc++, 3)
49+
return true
50+
})
51+
var observer = dop.createObserver(function(mutation) {
52+
disposer1();
53+
disposer2();
54+
disposer3();
55+
observer.destroy()
56+
t.equal(inc++, 4, 'observer')
57+
t.end();
58+
})
59+
observer.observe(object, 'name')
60+
set(object, 'name', 'John')
61+
})
62+
63+
64+
65+
66+
test('Second interceptor do not return true', function(t) {
67+
var inc = 1
68+
var disposer1 = dop.intercept(object, function(mutation) {
69+
t.equal(inc++, 1)
70+
return true
71+
})
72+
var disposer2 = dop.intercept(object, 'name', function(mutation) {
73+
disposer1()
74+
disposer2();
75+
t.equal(inc++, 2)
76+
t.end();
77+
})
78+
var observer = dop.createObserver(function(mutation) {
79+
t.end(false,true, 'this shouldnt happen')
80+
})
81+
observer.observe(object, 'name')
82+
set(object, 'name', 'Josema')
83+
})

test/setpatchs.js

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ function makeTest(t, collector, objServer, objClient) {
3232
var objServer = dop.register({
3333
number:1,
3434
subobject:{value1:true},
35-
array:[{value1:true}],
35+
array:[{value1:true},'B','C',4],
3636
subobjectarray:{array:[{value1:true}]},
3737
})
38-
var objClient = dop.util.merge({}, objServer);
38+
var objClient = dop.register(dop.util.merge({}, objServer));
3939

4040

4141

@@ -45,6 +45,94 @@ test('Same initial', function(t) {
4545
t.end()
4646
})
4747

48+
test('Splice 1', function(t) {
49+
50+
var collector = dop.collect()
51+
objServer.array.splice(1,1,'Mola1')
52+
53+
t.notDeepEqual(objServer, objClient)
54+
makeTest(t, collector, objServer, objClient)
55+
t.deepEqual(objServer, objClient)
56+
t.end()
57+
})
58+
59+
test('Splice 2', function(t) {
60+
61+
var collector = dop.collect()
62+
objServer.array.splice(0,0,'Mola2')
63+
64+
t.notDeepEqual(objServer, objClient)
65+
makeTest(t, collector, objServer, objClient)
66+
t.deepEqual(objServer, objClient)
67+
t.end()
68+
})
69+
70+
test('Splice 3', function(t) {
71+
72+
var collector = dop.collect()
73+
objServer.array.splice(100,100,'Mola3')
74+
75+
t.notDeepEqual(objServer, objClient)
76+
makeTest(t, collector, objServer, objClient)
77+
t.deepEqual(objServer, objClient)
78+
t.end()
79+
})
80+
81+
test('Splice 4', function(t) {
82+
83+
var collector = dop.collect()
84+
objServer.array.splice(1,1,'Mola4')
85+
86+
t.notDeepEqual(objServer, objClient)
87+
makeTest(t, collector, objServer, objClient)
88+
t.deepEqual(objServer, objClient)
89+
t.end()
90+
})
91+
92+
test('Splice 5', function(t) {
93+
94+
var collector = dop.collect()
95+
objServer.array.splice(1,-100,'Mola5')
96+
97+
t.notDeepEqual(objServer, objClient)
98+
makeTest(t, collector, objServer, objClient)
99+
t.deepEqual(objServer, objClient)
100+
t.end()
101+
})
102+
103+
104+
test('Splice 6', function(t) {
105+
106+
var collector = dop.collect()
107+
objServer.array.splice(-1,2,'Mola6')
108+
109+
t.notDeepEqual(objServer, objClient)
110+
makeTest(t, collector, objServer, objClient)
111+
t.deepEqual(objServer, objClient)
112+
t.end()
113+
})
114+
115+
116+
117+
118+
119+
test('Swap 1', function(t) {
120+
121+
var collector = dop.collect()
122+
objServer.array.reverse()
123+
124+
t.notDeepEqual(objServer, objClient)
125+
makeTest(t, collector, objServer, objClient)
126+
t.deepEqual(objServer, objClient)
127+
t.end()
128+
})
129+
130+
131+
132+
133+
134+
135+
48136

49137
test('Deleting an subobject on destiny', function(t) {
50138
delete objClient.subobject
@@ -112,4 +200,5 @@ test('Mutating deep array in server when objclient does not have that array', fu
112200
makeTest(t, collector, objServer, objClient)
113201
t.equal(objClient.subobjectarray, undefined)
114202
t.end()
115-
})
203+
})
204+

test/undoredo.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,3 +218,18 @@ test('From string to array and mutations', function(t) {
218218

219219
makeTest(t, snapshot, original, object, mutated)
220220
});
221+
222+
223+
224+
225+
test('Negative splice', function(t) {
226+
227+
var object = dop.register({dos:[1,2,3]})
228+
var original = dop.util.clone(object)
229+
var collector = dop.collect()
230+
object.dos.splice(1,-1,'!')
231+
var snapshot = collector.emit()
232+
var mutated = dop.util.clone(object)
233+
234+
makeTest(t, snapshot, original, object, mutated)
235+
});

0 commit comments

Comments
 (0)