Skip to content

Commit 8c99bc8

Browse files
committed
Changed the system of observers based absolute paths instead of storing inside of the object
1 parent 756cca2 commit 8c99bc8

File tree

13 files changed

+191
-208
lines changed

13 files changed

+191
-208
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<p align="center"><a href="https://distributedobjectprotocol.org"><img width="200"src="https://distributedobjectprotocol.org/img/logo.svg"></a></p>
33

44
<p align="center">
5-
<a href="https://www.npmjs.com/package/dop"><img alt="npm version" src="https://img.shields.io/npm/v/dop.svg"></a>
5+
<a href="https://www.npmjs.com/package/dop"><img alt="npm version" src="https://badge.fury.io/js/dop.svg"></a>
66
<a href="https://travis-ci.org/DistributedObjectProtocol/dop"><img alt="Build Status" src="https://travis-ci.org/DistributedObjectProtocol/dop.svg?branch=master"></a>
77
<a href="https://www.npmjs.com/package/dop"><img alt="license" src="https://img.shields.io/npm/l/dop.svg"></a>
88
<a href="https://gitter.im/DistributedObjectProtocol/dop?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"><img alt="Join the chat at" src="https://badges.gitter.im/DistributedObjectProtocol/dop.svg"></a>

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.20.1",
3+
"version": "0.21.0",
44
"main": "./dist/nodejs.js",
55
"browser": "./dist/browser.js",
66
"unpkg": "./dist/browser.min.js",

src/api/observe.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11

2-
dop.observe = function(object, callback) {
2+
dop.observe = function(object, property) {
33
dop.util.invariant(dop.isRegistered(object), 'dop.observe needs a registered object as first parameter');
4+
var args = arguments;
5+
callback = args[args.length-1];
46
dop.util.invariant(isFunction(callback), 'dop.observe needs a callback as second parameter');
57

68
var observer = dop.createObserver(callback);
7-
observer.observe(object);
9+
10+
(args.length===2) ?
11+
observer.observe(object)
12+
:
13+
observer.observe(object, property);
14+
815
return observer;
916
};

src/api/observeProperty.js

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/core/constructors/observer.js

Lines changed: 43 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2,81 +2,65 @@
22
dop.core.observer = function(callback, id) {
33
this.callback = callback;
44
this.id = id;
5-
this.objects = [];
6-
this.properties = {};
5+
this.observers = {}; // need it for destroy()
6+
this.observers_prop = {}; // need it for destroy()
77
};
88

99

10-
dop.core.observer.prototype.observe = function(object) {
10+
dop.core.observer.prototype.observe = function(object, property) {
1111
dop.util.invariant(dop.isRegistered(object), 'observer.observe needs a registered object as first parameter');
12-
var object_dop = dop.getObjectDop(object);
13-
if (object_dop.om[this.id] === undefined) {
14-
// Storing in object
15-
object_dop.om[this.id] = true;
16-
// Storing in observer
17-
this.objects.push(object); // using for .destroy()
12+
13+
var path_id = dop.core.getPathId(dop.getObjectPath(object, false)),
14+
data_path = dop.data.path,
15+
type = 'observers';
16+
17+
// is observeProperty
18+
if (arguments.length === 2) {
19+
type = 'observers_prop';
20+
path_id += dop.core.pathSeparator(property);
1821
}
19-
};
20-
dop.core.observer.prototype.unobserve = function(object) {
21-
dop.util.invariant(dop.isRegistered(object), 'observer.unobserve needs a registered object as first parameter');
22-
// Removing from object
23-
delete dop.getObjectDop(object).om[this.id];
24-
// Removing from observer
25-
var index = this.objects.indexOf(object); // using for .destroy()
26-
if (index > -1)
27-
this.objects.splice(index,1); // using for .destroy()
22+
23+
if (data_path[path_id] === undefined)
24+
data_path[path_id] = {};
25+
26+
if (data_path[path_id][type] === undefined)
27+
data_path[path_id][type] = {};
28+
29+
data_path[path_id][type][this.id] = true;
30+
this[type][path_id] = true;
2831
};
2932

3033

34+
dop.core.observer.prototype.unobserve = function(object, property) {
35+
dop.util.invariant(dop.isRegistered(object), 'observer.unobserve needs a registered object as first parameter');
36+
37+
var path_id = dop.core.getPathId(dop.getObjectPath(object, false)),
38+
data_path = dop.data.path,
39+
type = 'observers';
3140

32-
dop.core.observer.prototype.observeProperty = function(object, property) {
33-
dop.util.invariant(dop.isRegistered(object), 'observer.observeProperty needs a registered object as first parameter');
34-
// Storing in object
35-
var object_dop = dop.getObjectDop(object);
36-
if (object_dop.omp[property] === undefined)
37-
object_dop.omp[property] = {};
38-
if (object_dop.omp[property][this.id] === undefined) {
39-
object_dop.omp[property][this.id] = true;
40-
// Storing in observer
41-
if (this.properties[property] === undefined)
42-
this.properties[property] = [];
43-
this.properties[property].push(object); // using for .destroy()
41+
// is observeProperty
42+
if (arguments.length === 2) {
43+
type = 'observers_prop';
44+
path_id += dop.core.pathSeparator(property);
4445
}
45-
};
46-
dop.core.observer.prototype.unobserveProperty = function(object, property) {
47-
dop.util.invariant(dop.isRegistered(object), 'observer.unobserveProperty needs a registered object as first parameter');
48-
var object_dop = dop.getObjectDop(object),
49-
properties = this.properties[property],
50-
index;
51-
// Removing from object
52-
if (object_dop.omp[property] !== undefined)
53-
delete object_dop.omp[property][this.id];
54-
// Removing from observer
55-
if (properties !== undefined) {
56-
index = properties.indexOf(object); // using for .destroy()
57-
if (index > -1)
58-
properties.splice(index,1); // using for .destroy()
46+
47+
if (data_path[path_id] !== undefined && data_path[path_id][type] !== undefined) {
48+
delete data_path[path_id][type][this.id];
49+
delete this[type][path_id];
5950
}
6051
};
6152

6253

6354
dop.core.observer.prototype.destroy = function() {
64-
var index=0,
65-
objectsandproperties = this.objects,
66-
total=objectsandproperties.length,
67-
property;
68-
69-
// Deleting objects
70-
for (;index<total; ++index)
71-
delete dop.getObjectDop(objectsandproperties[index]).om[this.id];
55+
var path_id,
56+
data_path = dop.data.path;
57+
58+
delete dop.data.observers[this.id];
7259

73-
// Deleting properties
74-
objectsandproperties = this.properties;
75-
for (property in objectsandproperties)
76-
for (index=0,total=objectsandproperties[property].length; index<total; ++index)
77-
delete dop.getObjectDop(objectsandproperties[property][index]).omp[property][this.id];
60+
for (path_id in this.observers)
61+
delete data_path[path_id].observers[this.id];
7862

79-
// Deleting from dop.data
80-
delete dop.data.observers[this.id];
63+
for (path_id in this.observers_prop)
64+
delete data_path[path_id].observers_prop[this.id];
8165
};
8266

src/core/objects/configureObject.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ dop.core.configureObject = function(object, propertyParent, parent) {
1818
var object_dop = {}, object_proxy, object_target;
1919
object_dop._ = parent; // parent
2020
object_dop.pr = propertyParent; // property
21-
object_dop.om = {}; // observers multiple
22-
object_dop.omp = {}; // observers multiple property
23-
object_dop.m = []; // temporal mutations before will be emitted
21+
2422
// Making proxy object
2523
if (canWeProxy) {
2624
object_proxy = object_dop.p = new Proxy(object, dop.core.proxyObjectHandler);

src/core/objects/emitObservers.js

Lines changed: 0 additions & 46 deletions
This file was deleted.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
2+
dop.core.emitToObservers = function(mutations) {
3+
4+
var mutation,
5+
path_id,
6+
observer_id,
7+
observers = {},
8+
mutationsWithSubscribers = false,
9+
data_path = dop.data.path,
10+
index = 0,
11+
total = mutations.length;
12+
13+
for (;index<total; ++index) {
14+
mutation = mutations[index];
15+
path_id = mutation.path_id;
16+
17+
if (!mutationsWithSubscribers && isObject(dop.data.object[dop.getObjectId(mutation.object)]))
18+
mutationsWithSubscribers = true;
19+
20+
21+
if (data_path[path_id] !== undefined && data_path[path_id].observers !== undefined) {
22+
for (observer_id in data_path[path_id].observers) {
23+
if (observers[observer_id] === undefined)
24+
observers[observer_id] = [];
25+
observers[observer_id].push(mutation);
26+
}
27+
}
28+
29+
// If mutation is swap type we should skip
30+
if (mutation.swaps === undefined) {
31+
path_id += dop.core.pathSeparator(mutation.splice===undefined ? mutation.prop : 'length');
32+
if (data_path[path_id] !== undefined && data_path[path_id].observers_prop !== undefined) {
33+
for (observer_id in data_path[path_id].observers_prop) {
34+
if (observers[observer_id] === undefined)
35+
observers[observer_id] = [];
36+
// We have to check this because we dont want to duplicate
37+
if (observers[observer_id].indexOf(mutation) == -1)
38+
observers[observer_id].push(mutation);
39+
}
40+
}
41+
}
42+
43+
}
44+
45+
// Emiting
46+
for (observer_id in observers)
47+
dop.data.observers[observer_id].callback(observers[observer_id]);
48+
49+
return mutationsWithSubscribers;
50+
};

src/core/objects/proxyObjectHandler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ dop.core.proxyObjectHandler = {
88
return dop.core.delete(dop.getObjectProxy(object), property) !== undefined;
99
},
1010
get: function(object, property) {
11-
if (dop.data.gets_collecting && typeof property == 'string' && property !== dop.cons.DOP && object[property] !== Object.prototype[property])
11+
if (dop.data.gets_collecting && typeof property == 'string' && property !== dop.cons.DOP && object[property] !== Array.prototype[property])
1212
dop.data.gets_paths.push(dop.getObjectPath(object, false).concat(property));
1313

1414
return object[property];

src/dop.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,19 @@ var dop = {
1717
gets_collecting: false,
1818
gets_paths: [],
1919

20-
observers_inc: 0,
21-
observers: {},
22-
2320
computed_inc: 0,
2421
computed: {},
2522

23+
observers_inc: 0,
24+
observers: {},
25+
2626
path: {
27-
// computeds: []
28-
// derivations: []
29-
// observers: []
27+
// "1.thepath.value": {
28+
// observers: {},
29+
// observers_prop: {},
30+
// computeds: [],
31+
// derivations: [],
32+
// }
3033
}
3134
},
3235

0 commit comments

Comments
 (0)