Commit 5368b260f7cabad0bf9d35cd4525524ae4bf8efe
cleanup
wanderer committed on 8/4/2017, 8:06:42 PMParent: 9aeb50b928d404dec97a93aa0c1143d8e3ddd114
Files changed
index.js | changed |
index.js | ||
---|---|---|
@@ -31,85 +31,64 @@ | ||
31 | 31 … | |
32 | 32 … | async _get (key) { |
33 | 33 … | let index = 0 |
34 | 34 … | let root = this.root |
35 | - let extensionIndex = 0 | |
36 | 35 … | while (key.length > index) { |
37 | - extensionIndex = 0 | |
38 | - let nextRoot | |
39 | - | |
40 | 36 … | if (root['/'].extension) { |
37 … | + let extensionIndex = 0 | |
41 | 38 … | const extension = this.toTypedArray(root['/'].extension) |
42 | 39 … | let subKey |
43 | - let subKeyLen | |
40 … | + // alll extension are padded to 8 bit alignment. So we need to update | |
41 … | + // the index later to count for the added padding | |
42 … | + let padLen | |
44 | 43 … | if (this.radix === 2) { |
45 | 44 … | subKey = key.slice(index, index + extension.length) |
46 | - subKeyLen = subKey.length | |
45 … | + padLen = subKey.length | |
47 | 46 … | subKey = new this.ArrayConstructor(subKey.buffer) |
48 | - subKeyLen = subKey.length - subKeyLen | |
47 … | + padLen = subKey.length - padLen | |
49 | 48 … | } else { |
50 | 49 … | subKey = key.subarray(index, extension.length) |
51 | 50 … | } |
51 … | + // checks the extension against the key | |
52 | 52 … | while (extensionIndex < extension.length && extension[extensionIndex] === subKey[extensionIndex]) { |
53 | 53 … | extensionIndex++ |
54 | 54 … | } |
55 | - index += extensionIndex - subKeyLen | |
55 … | + index += extensionIndex - padLen | |
56 … | + // check if we compelete travered the extension | |
56 | 57 … | if (extensionIndex !== extension.length) { |
57 | 58 … | return { |
58 | 59 … | extensionIndex: extensionIndex, |
59 | 60 … | root: root, |
60 | 61 … | index: index |
61 | 62 … | } |
62 | 63 … | } |
64 … | + } | |
63 | 65 … | |
64 | - let keySegment = key[index] | |
65 | - if (Array.isArray(root['/'].node) && keySegment) { | |
66 | - await this.graph.get(root['/'].node, keySegment) | |
67 | - nextRoot = root['/'].node[keySegment] | |
68 | - if (!nextRoot) { | |
69 | - return { | |
70 | - root: root, | |
71 | - index: index | |
72 | - } | |
73 | - } | |
74 | - root = nextRoot | |
75 | - } | |
76 | - } else { | |
77 | - let keySegment = key[index] | |
78 | - await this.graph.get(root, keySegment) | |
79 | - nextRoot = root['/'][keySegment] | |
80 | - if (!nextRoot) { | |
81 | - return { | |
82 | - root: root, | |
83 | - index: index | |
84 | - } | |
85 | - } | |
86 | - root = nextRoot | |
66 … | + let keySegment = key[index] | |
67 … | + if (keySegment) { | |
68 … | + const branch = getBranch(root) | |
69 … | + await this.graph.get(branch, keySegment) | |
70 … | + root = branch[keySegment] | |
87 | 71 … | } |
88 | 72 … | |
89 | 73 … | index++ |
90 | 74 … | } |
75 … | + | |
76 … | + const node = getBranch(root) | |
77 … | + // get the value | |
91 | 78 … | let value |
92 | - if (root['/'].extension) { | |
93 | - if (Array.isArray(root['/'].node)) { | |
94 | - value = root['/'].node[root['/'].node.length - 1] | |
95 | - } else { | |
96 | - value = root['/'].node | |
97 | - } | |
79 … | + if (Array.isArray(node)) { | |
80 … | + value = node[node.length - 1] | |
98 | 81 … | } else { |
99 | - if (Array.isArray(root['/'])) { | |
100 | - value = root['/'][root.length - 1] | |
101 | - } else { | |
102 | - value = root['/'] | |
103 | - } | |
82 … | + value = node | |
104 | 83 … | } |
84 … | + | |
105 | 85 … | if (value.length >= 32) { |
106 | 86 … | value = await this.graph.get(root, root.length - 1) |
107 | 87 … | } |
108 | 88 … | |
109 | 89 … | return { |
110 | 90 … | value: value, |
111 | - extensionIndex: extensionIndex, | |
112 | 91 … | root: root, |
113 | 92 … | index: index |
114 | 93 … | } |
115 | 94 … | } |
@@ -136,41 +115,34 @@ | ||
136 | 115 … | let root = result.root |
137 | 116 … | let keySegment = key[result.index] |
138 | 117 … | |
139 | 118 … | if (result.extensionIndex !== undefined) { |
119 … | + // split the extension node in two | |
140 | 120 … | let extension = this.toTypedArray(root['/'].extension) |
141 | - // save the common part of the extension | |
142 | 121 … | const extensionKey = extension[result.extensionIndex + 1] |
143 | 122 … | const remExtension = extension.subarray(1 - result.extensionIndex) |
144 | 123 … | extension = extension.subarray(0, result.extensionIndex) |
124 … | + | |
145 | 125 … | const node = root['/'].node |
146 | - | |
126 … | + let newNode | |
127 … | + // create the new extension node | |
147 | 128 … | if (extension.length) { |
148 | 129 … | root['/'].extension = new Buffer(extension.buffer) |
149 | - root['/'].node = [] | |
150 | - if (remExtension.length) { | |
151 | - root['/'].node[extensionKey] = { | |
152 | - '/': { | |
153 | - extension: new Buffer(remExtension.buffer), | |
154 | - node: node | |
155 | - } | |
130 … | + newNode = root['/'].node = [] | |
131 … | + } else { | |
132 … | + newNode = root['/'] = [] | |
133 … | + } | |
134 … | + | |
135 … | + // save the remainer of the extension node | |
136 … | + if (remExtension.length) { | |
137 … | + newNode[extensionKey] = { | |
138 … | + '/': { | |
139 … | + extension: new Buffer(remExtension.buffer), | |
140 … | + node: node | |
156 | 141 … | } |
157 | - } else { | |
158 | - root['/'].node[extensionKey] = node | |
159 | 142 … | } |
160 | 143 … | } else { |
161 | - // there is no extension | |
162 | - root['/'] = [] | |
163 | - if (remExtension.length) { | |
164 | - root['/'][extensionKey] = { | |
165 | - '/': { | |
166 | - extension: remExtension, | |
167 | - node: node | |
168 | - } | |
169 | - } | |
170 | - } else { | |
171 | - root['/'][extensionKey] = node | |
172 | - } | |
144 … | + newNode[extensionKey] = node | |
173 | 145 … | } |
174 | 146 … | } |
175 | 147 … | |
176 | 148 … | let newNode |
@@ -186,71 +158,61 @@ | ||
186 | 158 … | } else { |
187 | 159 … | newNode = value |
188 | 160 … | } |
189 | 161 … | |
190 | - if (root['/'].extension) { | |
191 | - if (!Array.isArray(root['/'].node)) { | |
192 | - const val = root['/'].node | |
193 | - root['/'].node = [] | |
194 | - root['/'].node[this.radix] = val | |
195 | - } | |
196 | - if (keySegment === undefined) { | |
197 | - root['/'].node[this.radix] = newNode | |
198 | - } else { | |
199 | - root['/'].node[keySegment] = newNode | |
200 | - } | |
162 … | + let targetNode = getBranch(root) | |
163 … | + | |
164 … | + // set the value | |
165 … | + if (keySegment === undefined) { | |
166 … | + targetNode[this.radix] = newNode | |
201 | 167 … | } else { |
202 | - if (keySegment === undefined) { | |
203 | - root['/'][this.radix] = newNode | |
204 | - } else { | |
205 | - root['/'][keySegment] = newNode | |
206 | - } | |
168 … | + targetNode[keySegment] = newNode | |
207 | 169 … | } |
208 | 170 … | } |
209 | 171 … | |
210 | - async delete (key) { | |
211 | - key = new this.ArrayConstructor(key) | |
212 | - const results = await this._get(key) | |
213 | - const root = results.root | |
214 | - if (results.value) { | |
215 | - if (results.extensionIndex) { | |
216 | - key = key.subarray(-results.extensionIndex) | |
217 | - } | |
218 | - const keySegment = key[key.length - 1] | |
219 | - delete root[keySegment] | |
220 | - if (this.isEmptyNode(root) && results.parent) { | |
221 | - delete results.parent[results.parentKey] | |
222 | - } else if (!root[root.length - 1]) { | |
223 | - let oneNode = false | |
224 | - let rNodeIndex | |
225 | - for (let i = 0; i < root.length - 1; i++) { | |
226 | - const el = root[i] | |
227 | - if (el) { | |
228 | - if (!oneNode) { | |
229 | - rNodeIndex = i | |
230 | - oneNode = true | |
231 | - } else { | |
232 | - oneNode = false | |
233 | - break | |
234 | - } | |
235 | - } | |
236 | - } | |
172 … | + // async delete (key) { | |
173 … | + // key = new this.ArrayConstructor(key) | |
174 … | + // const results = await this._get(key) | |
175 … | + // const root = results.root | |
176 … | + // if (results.value) { | |
177 … | + // if (results.extensionIndex) { | |
178 … | + // key = key.subarray(-results.extensionIndex) | |
179 … | + // } | |
180 … | + // const keySegment = key[key.length - 1] | |
181 … | + // delete root[keySegment] | |
182 … | + // if (this.isEmptyNode(root) && results.parent) { | |
183 … | + // delete results.parent[results.parentKey] | |
184 … | + // } else if (!root[root.length - 1]) { | |
185 … | + // let oneNode = false | |
186 … | + // let rNodeIndex | |
187 … | + // for (let i = 0; i < root.length - 1; i++) { | |
188 … | + // const el = root[i] | |
189 … | + // if (el) { | |
190 … | + // if (!oneNode) { | |
191 … | + // rNodeIndex = i | |
192 … | + // oneNode = true | |
193 … | + // } else { | |
194 … | + // oneNode = false | |
195 … | + // break | |
196 … | + // } | |
197 … | + // } | |
198 … | + // } | |
237 | 199 … | |
238 | - if (oneNode) { | |
239 | - let extension = root[rNodeIndex].extension || [] | |
240 | - extension = concat([rNodeIndex], extension) | |
241 | - const parentExtenstion = results.parent[results.parentIndex].extension | |
242 | - if (parentExtenstion) { | |
243 | - extension = concat(parentExtenstion, extension) | |
244 | - } | |
245 | - results.parent[results.parentIndex] = { | |
246 | - extension: extension, | |
247 | - root: root | |
248 | - } | |
249 | - } | |
250 | - } | |
251 | - } | |
252 | - } | |
200 … | + // if (oneNode) { | |
201 … | + // let extension = root[rNodeIndex].extension || [] | |
202 … | + // extension = concat([rNodeIndex], extension) | |
203 … | + // const parentExtenstion = results.parent[results.parentIndex].extension | |
204 … | + // if (parentExtenstion) { | |
205 … | + // extension = concat(parentExtenstion, extension) | |
206 … | + // } | |
207 … | + // results.parent[results.parentIndex] = { | |
208 … | + // extension: extension, | |
209 … | + // root: root | |
210 … | + // } | |
211 … | + // } | |
212 … | + // } | |
213 … | + // } | |
214 … | + // } | |
253 | 215 … | isEmptyNode (node) { |
254 | 216 … | return node.evey(el => !el) |
255 | 217 … | } |
256 | 218 … | formatKey (key) { |
@@ -260,8 +222,12 @@ | ||
260 | 222 … | return new this.ArrayConstructor(key.buffer) |
261 | 223 … | } |
262 | 224 … | } |
263 | 225 … | |
264 | -function concat(a, b) {} | |
265 | -function readData (data) { | |
266 | - return new Uint8Array(data) | |
226 … | +function getBranch (node) { | |
227 … | + if (node['/'].extension) { | |
228 … | + return node['/'].node | |
229 … | + } else { | |
230 … | + return root['/'] | |
231 … | + } | |
267 | 232 … | } |
233 … | + |
Built with git-ssb-web