forked from gritzko/todomvc-swarm
-
Notifications
You must be signed in to change notification settings - Fork 61
/
TodoRouter.js
91 lines (82 loc) · 2.34 KB
/
TodoRouter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"use strict";
var TodoList = require('./model/TodoList');
var TodoItem = require('./model/TodoItem');
var Swarm = require('swarm');
var Spec = Swarm.Spec;
function TodoRouter() {
this.itemIds = null;
}
TodoRouter.prototype.buildRoute = function (path) {
if (path.length === 0) {
return '/';
}
return '/' + path[0].listId +
'/' + path.map(function (el) {return el.itemId;}).join('/');
};
TodoRouter.prototype.addPathItem = function (listId, itemIds, path, cb) {
// normalize 2nd argument
if (!itemIds) {
itemIds = [];
} else if (itemIds.constructor===String) {
itemIds = [itemIds];
} else if (itemIds.constructor!==Array) {
throw new Error('incorrect argument');
}
var self = this;
self.itemIds = itemIds;
var list = Swarm.env.localhost.get('/TodoList#' + listId);
list.onObjectStateReady(function () {
if (self.itemIds != itemIds) {
// prevent parallel loading of several routes
return;
}
var item;
if (!list.length()) {
item = new TodoItem();
list.addObject(item);
itemIds.length = 0;
} else if (itemIds.length === 0) {
item = list.objectAt(0);
} else {
item = list.getObject(itemIds.shift());
}
if (item) {
// item found
path.push({
listId: listId,
itemId: item._id
});
if (item.childList && itemIds.length) {
self.addPathItem(item.childList, itemIds, path, cb);
return;
}
}
self.itemIds = null;
cb(path);
});
};
TodoRouter.prototype.load = function (route, cb) {
var rootListId = null;
var itemIds = [];
var m;
Spec.reQTokExt.lastIndex = 0;
while (m = Spec.reQTokExt.exec(route)) {
var id = m && m[2];
if (!rootListId) {
rootListId = id;
} else {
itemIds.push(id);
}
}
if (!rootListId) {
// create new list
var list = new TodoList();
rootListId = list._id;
// and create new item in it
var item = new TodoItem();
list.addObject(item);
itemIds.push(item._id);
}
this.addPathItem(rootListId, itemIds, [], cb);
};
module.exports = TodoRouter;