@buley/dash 0.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/.coveralls.yml +1 -0
  2. package/.github/workflows/opencommit.yml +33 -0
  3. package/.github/workflows/testing.yml +20 -0
  4. package/.gitmodules +0 -0
  5. package/README.md +98 -0
  6. package/behaviors/cache.dev.js +282 -0
  7. package/behaviors/changes.dev.js +337 -0
  8. package/behaviors/collect.dev.js +40 -0
  9. package/behaviors/examples/async.dev.js +17 -0
  10. package/behaviors/firebase.dev.js +283 -0
  11. package/behaviors/live.dev.js +67 -0
  12. package/behaviors/map.dev.js +54 -0
  13. package/behaviors/mapreduce.dev.js +68 -0
  14. package/behaviors/match.dev.js +66 -0
  15. package/behaviors/patch.dev.js +69 -0
  16. package/behaviors/rest.dev.js +340 -0
  17. package/behaviors/shorthand.dev.js +59 -0
  18. package/behaviors/stats.dev.js +672 -0
  19. package/dist/behaviors/index.js +142 -0
  20. package/dist/database/index.js +76 -0
  21. package/dist/databases/index.js +121 -0
  22. package/dist/entry/index.js +166 -0
  23. package/dist/index.js +93 -0
  24. package/dist/indexes/index.js +153 -0
  25. package/dist/store/index.js +97 -0
  26. package/dist/stores/index.js +90 -0
  27. package/dist/utilities/index.js +174 -0
  28. package/documentation/database/closing.md +3 -0
  29. package/documentation/database/getting.md +1 -0
  30. package/documentation/database/opening.md +5 -0
  31. package/documentation/database/removing.md +3 -0
  32. package/documentation/databases.md +21 -0
  33. package/documentation/entries.md +13 -0
  34. package/documentation/entry/adding.md +1 -0
  35. package/documentation/entry/getting.md +4 -0
  36. package/documentation/entry/putting.md +0 -0
  37. package/documentation/entry/removing.md +3 -0
  38. package/documentation/entry/updating.md +0 -0
  39. package/documentation/general/security.md +10 -0
  40. package/documentation/general/transaction/requests.md +3 -0
  41. package/documentation/general/transactions.md +5 -0
  42. package/documentation/index/creating.md +1 -0
  43. package/documentation/index/getting.md +1 -0
  44. package/documentation/index/iterating.md +1 -0
  45. package/documentation/index/removing.md +1 -0
  46. package/documentation/indexes.md +3 -0
  47. package/documentation/key/cursors.md +5 -0
  48. package/documentation/key/range/bounds.md +11 -0
  49. package/documentation/key/range/direction.md +1 -0
  50. package/documentation/key/ranges.md +3 -0
  51. package/documentation/keys.md +12 -0
  52. package/documentation/objectstore/clearing.md +1 -0
  53. package/documentation/objectstore/creating.md +1 -0
  54. package/documentation/objectstore/getting.md +1 -0
  55. package/documentation/objectstore/iteration.md +1 -0
  56. package/documentation/objectstore/removing.md +1 -0
  57. package/documentation/overview.md +5 -0
  58. package/documentation/stores.md +13 -0
  59. package/jest.config.js +12 -0
  60. package/package.json +40 -0
  61. package/src/behaviors/index.ts +140 -0
  62. package/src/database/index.ts +81 -0
  63. package/src/databases/index.ts +127 -0
  64. package/src/entry/index.ts +183 -0
  65. package/src/index/index.ts +61 -0
  66. package/src/index.ts +96 -0
  67. package/src/indexes/index.ts +151 -0
  68. package/src/store/index.ts +102 -0
  69. package/src/stores/index.ts +90 -0
  70. package/src/utilities/index.ts +349 -0
  71. package/tests/behaviors/behaviors.spec.ts +123 -0
  72. package/tests/database/database.spec.ts +177 -0
  73. package/tests/databases/databases.spec.ts +199 -0
  74. package/tests/entry/entry.spec.ts +252 -0
  75. package/tests/index/index.spec.ts +94 -0
  76. package/tests/indexes/indexes.spec.ts +203 -0
  77. package/tests/store/store.spec.ts +164 -0
  78. package/tests/stores/stores.spec.ts +148 -0
  79. package/tests/utilities/clone.spec.ts +48 -0
  80. package/tests/utilities/cloneError.spec.ts +33 -0
  81. package/tests/utilities/contains.spec.ts +28 -0
  82. package/tests/utilities/exists.spec.ts +21 -0
  83. package/tests/utilities/is.spec.ts +37 -0
  84. package/tests/utilities/isArray.spec.ts +21 -0
  85. package/tests/utilities/isBoolean.spec.ts +23 -0
  86. package/tests/utilities/isEmpty.spec.ts +45 -0
  87. package/tests/utilities/isFunction.spec.ts +30 -0
  88. package/tests/utilities/isNumber.spec.ts +29 -0
  89. package/tests/utilities/isObject.spec.ts +42 -0
  90. package/tests/utilities/isRegEx.spec.ts +33 -0
  91. package/tests/utilities/isString.spec.ts +25 -0
  92. package/tests/utilities/isnt.spec.ts +50 -0
  93. package/tests/utilities/randomId.spec.ts +39 -0
  94. package/tests/utilities/safeApply.spec.ts +49 -0
  95. package/tests/utilities/safeEach.spec.ts +38 -0
  96. package/tests/utilities/safeIterate.spec.ts +47 -0
  97. package/tsconfig.json +16 -0
@@ -0,0 +1,672 @@
1
+ var dashStats = (function (environment) {
2
+ "use strict";
3
+ var model = function () {
4
+ return {
5
+ display: {
6
+ actual: {},
7
+ thoroughput_rate: {},
8
+ thoroughput_average: {},
9
+ speed_rate: {},
10
+ speed_average: {},
11
+ elapsed: {},
12
+ remaining: {},
13
+ duration: {}
14
+ },
15
+ metrics: {
16
+ add: {
17
+ average: 0,
18
+ rate: 0,
19
+ recent: [],
20
+ expecting: 0,
21
+ remaining: 0,
22
+ duration: 0,
23
+ requests: 0,
24
+ elapsed: 0,
25
+ expected: 0
26
+ },
27
+ clear: {
28
+ average: 0,
29
+ rate: 0,
30
+ recent: [],
31
+ expecting: 0,
32
+ remaining: 0,
33
+ duration: 0,
34
+ requests: 0,
35
+ elapsed: 0,
36
+ expected: 0
37
+ },
38
+ count: {
39
+ average: 0,
40
+ rate: 0,
41
+ recent: [],
42
+ expecting: 0,
43
+ remaining: 0,
44
+ duration: 0,
45
+ elapsed: 0,
46
+ requests: 0,
47
+ expected: 0
48
+ },
49
+ get: {
50
+ average: 0,
51
+ rate: 0,
52
+ recent: [],
53
+ expecting: 0,
54
+ remaining: 0,
55
+ duration: 0,
56
+ elapsed: 0,
57
+ requests: 0,
58
+ expected: 0
59
+ },
60
+ put: {
61
+ average: 0,
62
+ rate: 0,
63
+ recent: [],
64
+ expecting: 0,
65
+ remaining: 0,
66
+ duration: 0,
67
+ elapsed: 0,
68
+ requests: 0,
69
+ expected: 0
70
+ },
71
+ remove: {
72
+ average: 0,
73
+ rate: 0,
74
+ recent: [],
75
+ expecting: 0,
76
+ remaining: 0,
77
+ duration: 0,
78
+ elapsed: 0,
79
+ requests: 0,
80
+ expected: 0
81
+ },
82
+ update: {
83
+ average: 0,
84
+ rate: 0,
85
+ recent: [],
86
+ expecting: 0,
87
+ remaining: 0,
88
+ duration: 0,
89
+ elapsed: 0,
90
+ requests: 0,
91
+ expected: 0
92
+ },
93
+ resolve: {
94
+ average: 0,
95
+ rate: 0,
96
+ recent: [],
97
+ expecting: 0,
98
+ remaining: 0,
99
+ duration: 0,
100
+ elapsed: 0,
101
+ requests: 0,
102
+ expected: 0
103
+ },
104
+ notify: {
105
+ average: 0,
106
+ rate: 0,
107
+ recent: [],
108
+ expecting: 0,
109
+ remaining: 0,
110
+ duration: 0,
111
+ elapsed: 0,
112
+ requests: 0,
113
+ expected: 0
114
+ },
115
+ error: {
116
+ average: 0,
117
+ rate: 0,
118
+ recent: [],
119
+ expecting: 0,
120
+ remaining: 0,
121
+ duration: 0,
122
+ elapsed: 0,
123
+ requests: 0,
124
+ expected: 0
125
+ },
126
+ total: {
127
+ average: 0,
128
+ rate: 0,
129
+ recent: [],
130
+ expecting: 0,
131
+ remaining: 0,
132
+ duration: 0,
133
+ elapsed: 0,
134
+ requests: 0,
135
+ expected: 0
136
+ },
137
+ store: {
138
+ average: 0,
139
+ rate: 0,
140
+ recent: [],
141
+ expecting: 0,
142
+ remaining: 0,
143
+ duration: 0,
144
+ elapsed: 0,
145
+ requests: 0,
146
+ expected: 0
147
+ },
148
+ stores: {
149
+ average: 0,
150
+ rate: 0,
151
+ recent: [],
152
+ expecting: 0,
153
+ remaining: 0,
154
+ duration: 0,
155
+ elapsed: 0,
156
+ requests: 0,
157
+ expected: 0
158
+ },
159
+ entry: {
160
+ average: 0,
161
+ rate: 0,
162
+ recent: [],
163
+ expecting: 0,
164
+ remaining: 0,
165
+ duration: 0,
166
+ elapsed: 0,
167
+ requests: 0,
168
+ expected: 0
169
+ },
170
+ entries: {
171
+ average: 0,
172
+ rate: 0,
173
+ recent: [],
174
+ expecting: 0,
175
+ remaining: 0,
176
+ duration: 0,
177
+ elapsed: 0,
178
+ requests: 0,
179
+ expected: 0
180
+ },
181
+ database: {
182
+ average: 0,
183
+ rate: 0,
184
+ recent: [],
185
+ expecting: 0,
186
+ remaining: 0,
187
+ duration: 0,
188
+ elapsed: 0,
189
+ requests: 0,
190
+ expected: 0
191
+ },
192
+ databases: {
193
+ average: 0,
194
+ rate: 0,
195
+ recent: [],
196
+ expecting: 0,
197
+ remaining: 0,
198
+ duration: 0,
199
+ elapsed: 0,
200
+ requests: 0,
201
+ expected: 0
202
+ },
203
+ index: {
204
+ average: 0,
205
+ rate: 0,
206
+ recent: [],
207
+ expecting: 0,
208
+ remaining: 0,
209
+ duration: 0,
210
+ elapsed: 0,
211
+ requests: 0,
212
+ expected: 0
213
+ },
214
+ indexes: {
215
+ average: 0,
216
+ rate: 0,
217
+ recent: [],
218
+ expecting: 0,
219
+ remaining: 0,
220
+ duration: 0,
221
+ elapsed: 0,
222
+ requests: 0,
223
+ expected: 0
224
+ }
225
+ },
226
+ type: null,
227
+ memory: 3
228
+ };
229
+ },
230
+ allStats = {
231
+ total: model()
232
+ },
233
+ average = function (stack) {
234
+ var x = 0,
235
+ xlen = stack.length,
236
+ xitem, total = 0;
237
+ for (x = 0; x < xlen; x += 1) {
238
+ total += stack[x];
239
+ }
240
+ return total / x;
241
+ },
242
+ prettyTime = function (milliseconds) {
243
+ milliseconds = Math.floor(milliseconds);
244
+ var seconds = Math.floor(milliseconds / 1000),
245
+ days = Math.floor(seconds / 86400),
246
+ hours = Math.floor(seconds / 3600),
247
+ minutes = Math.floor(seconds / 60),
248
+ secs = Math.floor(seconds - (days * 86400) - (hours * 3600) - (minutes * 60)),
249
+ msecs = Math.floor(milliseconds - (secs * 1000));
250
+ if (true === isNaN(hours) && true === isNaN(minutes) && true === isNaN(secs)) {
251
+ return;
252
+ }
253
+ if (hours < 10 && hours > 0) {
254
+ hours = '0' + hours.toString() + ':';
255
+ } else if (hours < 1) {
256
+ hours = '';
257
+ } else {
258
+ hours = hours.toString() + ':';
259
+ }
260
+ if (minutes < 10) {
261
+ minutes = '0' + minutes.toString();
262
+ } else {
263
+ minutes = minutes.toString();
264
+ }
265
+ if (secs < 10) {
266
+ secs = '0' + secs.toString();
267
+ } else {
268
+ secs = secs.toString();
269
+ }
270
+ if (msecs < 10) {
271
+ msecs = '00' + msecs.toString();
272
+ } else if (msecs < 100) {
273
+ msecs = '0' + msecs.toString();
274
+ } else {
275
+ msecs = msecs.toString();
276
+ }
277
+ if (2 === msecs.length) {
278
+ msecs += '0';
279
+ }
280
+ return hours + minutes + ':' + secs + '.' + msecs;
281
+ };
282
+ return function (state) {
283
+ if (this.isnt(state.context.stats, true)) {
284
+ return state;
285
+ }
286
+ var context = state.context,
287
+ pieces = !! state.method ? state.method.split('.') : [],
288
+ verb = pieces[0],
289
+ noun = pieces[1],
290
+ deferred,
291
+ datetime,
292
+ diff,
293
+ promise = state.promise,
294
+ theirs = this,
295
+ calculate = function (v, n) {
296
+ /* Time */
297
+ datetime = new Date().getTime();
298
+ allStats['total'] = allStats['total'];
299
+ allStats[state.context.statistics.id] = allStats[state.context.statistics.id];
300
+ allStats['total'].started = allStats['total'].started || datetime;
301
+ allStats[state.context.statistics.id].started = allStats[state.context.statistics.id].started || datetime;
302
+ allStats[state.context.statistics.id].last = allStats[state.context.statistics.id].last || allStats[state.context.statistics.id].started || datetime;
303
+ allStats['total'].elapsed = datetime - allStats['total'].started;
304
+ allStats['total'].metrics.total.actual = allStats['total'].elapsed;
305
+ allStats[state.context.statistics.id].elapsed = datetime - allStats[state.context.statistics.id].started;
306
+ allStats[state.context.statistics.id].metrics.total.actual = allStats[state.context.statistics.id].elapsed;
307
+ allStats[state.context.statistics.id].metrics[n].elapsed = allStats[state.context.statistics.id].elapsed;
308
+ allStats[state.context.statistics.id].metrics[v].elapsed = allStats[state.context.statistics.id].elapsed;
309
+ allStats[state.context.statistics.id].metrics.total.elapsed = allStats[state.context.statistics.id].elapsed;
310
+ allStats['total'].metrics[n].elapsed = allStats[state.context.statistics.id].elapsed;
311
+ allStats['total'].metrics[v].elapsed = allStats[state.context.statistics.id].elapsed;
312
+ allStats['total'].metrics.total.elapsed = allStats[state.context.statistics.id].elapsed;
313
+ diff = datetime - allStats[state.context.statistics.id].last;
314
+ if (diff > 0) {
315
+ allStats[state.context.statistics.id].metrics[n].between = diff;
316
+ allStats[state.context.statistics.id].metrics[v].between = diff;
317
+ allStats[state.context.statistics.id].metrics.total.between = diff;
318
+ allStats['total'].metrics[n].between = diff;
319
+ allStats['total'].metrics[v].between = diff;
320
+ allStats['total'].metrics.total.between = diff;
321
+ allStats[state.context.statistics.id].metrics[v].recent.unshift(allStats['total'].metrics[v].between);
322
+ allStats['total'].metrics[v].recent.unshift(allStats['total'].metrics[v].between);
323
+ allStats[state.context.statistics.id].metrics[n].recent.unshift(allStats[state.context.statistics.id].metrics[n].between);
324
+ allStats['total'].metrics[n].recent.unshift(allStats[state.context.statistics.id].metrics[n].between);
325
+ allStats[state.context.statistics.id].metrics.total.recent.unshift(allStats[state.context.statistics.id].metrics.total.between);
326
+ allStats['total'].metrics.total.recent.unshift(allStats[state.context.statistics.id].metrics.total.between);
327
+ if (allStats[state.context.statistics.id].metrics[v].recent.length > allStats[state.context.statistics.id].memory) {
328
+ allStats[state.context.statistics.id].metrics[v].recent = allStats[state.context.statistics.id].metrics[v].recent.slice(0, allStats[state.context.statistics.id].memory);
329
+ }
330
+ if (allStats['total'].metrics[n].recent.length > allStats['total'].memory) {
331
+ allStats['total'].metrics[n].recent = allStats['total'].metrics[n].recent.slice(0, allStats['total'].memory);
332
+ }
333
+ if (allStats[state.context.statistics.id].metrics[n].recent.length > allStats[state.context.statistics.id].memory) {
334
+ allStats[state.context.statistics.id].metrics[n].recent = allStats[state.context.statistics.id].metrics[n].recent.slice(0, allStats[state.context.statistics.id].memory);
335
+ }
336
+ if (allStats['total'].metrics[n].recent.length > allStats['total'].memory) {
337
+ allStats['total'].metrics[n].recent = allStats['total'].metrics[n].recent.slice(0, allStats['total'].memory);
338
+ }
339
+ if (allStats[state.context.statistics.id].metrics.total.recent.length > allStats[state.context.statistics.id].memory) {
340
+ allStats[state.context.statistics.id].metrics.total.recent = allStats[state.context.statistics.id].metrics.total.recent.slice(0, allStats['total'].memory);
341
+ }
342
+ if (allStats['total'].metrics.total.recent.length > allStats['total'].memory) {
343
+ allStats['total'].metrics.total.recent = allStats['total'].metrics.total.recent.slice(0, allStats['total'].memory);
344
+ }
345
+ }
346
+ /* Other */
347
+ allStats[state.context.statistics.id].metrics[v].rate = average(allStats[state.context.statistics.id].metrics[v].recent);
348
+ allStats[state.context.statistics.id].metrics[n].rate = average(allStats[state.context.statistics.id].metrics[n].recent);
349
+ allStats[state.context.statistics.id].metrics.total.rate = average(allStats[state.context.statistics.id].metrics.total.recent);
350
+ allStats['total'].metrics[v].rate = average(allStats['total'].metrics[v].recent);
351
+ allStats['total'].metrics[n].rate = average(allStats['total'].metrics[n].recent);
352
+ allStats['total'].metrics.total.rate = average(allStats['total'].metrics.total.recent);
353
+ allStats[state.context.statistics.id].metrics[v].average = allStats[state.context.statistics.id].metrics[v].elapsed / allStats[state.context.statistics.id].metrics[v].requests;
354
+ allStats[state.context.statistics.id].metrics[n].average = allStats[state.context.statistics.id].metrics[n].elapsed / allStats[state.context.statistics.id].metrics[n].requests;
355
+ allStats[state.context.statistics.id].metrics.total.average = allStats[state.context.statistics.id].metrics.total.elapsed / allStats[state.context.statistics.id].metrics.total.requests;
356
+ allStats['total'].metrics[v].average = allStats['total'].metrics[v].elapsed / allStats['total'].metrics[v].requests;
357
+ allStats['total'].metrics[n].average = allStats['total'].metrics[n].elapsed / allStats['total'].metrics[n].requests;
358
+ allStats['total'].metrics.total.average = allStats['total'].metrics.total.elapsed / allStats['total'].metrics.total.requests;
359
+ if (theirs.is(state.context.forecast, true)) {
360
+ allStats[state.context.statistics.id].metrics[v].expecting = allStats[state.context.statistics.id].metrics[v].expected - allStats[state.context.statistics.id].metrics[v].requests;
361
+ allStats[state.context.statistics.id].metrics[n].expecting = allStats[state.context.statistics.id].metrics[n].expected - allStats[state.context.statistics.id].metrics[n].requests;
362
+ allStats[state.context.statistics.id].metrics.total.expecting = allStats[state.context.statistics.id].metrics.total.expected - allStats[state.context.statistics.id].metrics.total.requests;
363
+ allStats['total'].metrics[v].expecting = allStats['total'].metrics[v].expected - allStats['total'].metrics[v].requests;
364
+ allStats['total'].metrics[n].expecting = allStats['total'].metrics[n].expected - allStats['total'].metrics[n].requests;
365
+ allStats['total'].metrics.total.expecting = allStats['total'].metrics.total.expected - allStats['total'].metrics.total.requests;
366
+ allStats[state.context.statistics.id].metrics[v].duration = allStats[state.context.statistics.id].metrics[v].average * allStats[state.context.statistics.id].metrics[v].expected;
367
+ allStats[state.context.statistics.id].metrics[n].duration = allStats[state.context.statistics.id].metrics[n].average * allStats[state.context.statistics.id].metrics[n].expected;
368
+ allStats[state.context.statistics.id].metrics.total.duration = allStats[state.context.statistics.id].metrics.total.average * allStats[state.context.statistics.id].metrics.total.expected;
369
+ allStats['total'].metrics[v].duration = allStats['total'].metrics[v].average * allStats['total'].metrics[v].expected;
370
+ allStats['total'].metrics[n].duration = allStats['total'].metrics[n].average * allStats['total'].metrics[n].expected;
371
+ allStats['total'].metrics.total.duration = allStats['total'].metrics.total.average * allStats['total'].metrics.total.expected;
372
+ allStats['total'].metrics[v].remaining = allStats['total'].metrics[v].expecting * allStats['total'].metrics[v].rate;
373
+ allStats['total'].metrics[n].remaining = allStats['total'].metrics[n].expecting * allStats['total'].metrics[n].rate;
374
+ allStats['total'].metrics.total.remaining = allStats['total'].metrics.total.expecting * allStats['total'].metrics.total.rate;
375
+ allStats[state.context.statistics.id].metrics[v].remaining = allStats[state.context.statistics.id].metrics[v].expecting * allStats[state.context.statistics.id].metrics[v].rate
376
+ allStats[state.context.statistics.id].metrics[n].remaining = allStats[state.context.statistics.id].metrics[n].expecting * allStats[state.context.statistics.id].metrics[n].rate;
377
+ allStats[state.context.statistics.id].metrics.total.remaining = allStats[state.context.statistics.id].metrics.total.expecting * allStats[state.context.statistics.id].metrics.total.rate;
378
+ }
379
+ if (0 > allStats['total'].metrics[v].remaining) {
380
+ allStats['total'].metrics[v].remaining = 0;
381
+ }
382
+ if (0 > allStats['total'].metrics[n].remaining) {
383
+ allStats['total'].metrics[n].remaining = 0;
384
+ }
385
+ if (0 > allStats['total'].metrics.total.remaining) {
386
+ allStats['total'].metrics.total.remaining = 0;
387
+ }
388
+ allStats['total'].display.elapsed[v] = prettyTime(allStats['total'].metrics[v].elapsed);
389
+ allStats['total'].display.elapsed[n] = prettyTime(allStats['total'].metrics[n].elapsed);
390
+ allStats['total'].display.elapsed.total = prettyTime(allStats['total'].metrics.total.elapsed);
391
+ allStats[state.context.statistics.id].display.elapsed[v] = prettyTime(allStats[state.context.statistics.id].metrics[v].elapsed);
392
+ allStats[state.context.statistics.id].display.elapsed[n] = prettyTime(allStats[state.context.statistics.id].metrics[n].elapsed);
393
+ allStats[state.context.statistics.id].display.elapsed.total = prettyTime(allStats[state.context.statistics.id].metrics.total.elapsed);
394
+ if (theirs.is(state.context.forecast, true)) {
395
+ allStats[state.context.statistics.id].display.duration[v] = prettyTime(allStats[state.context.statistics.id].metrics[v].duration);
396
+ allStats[state.context.statistics.id].display.duration[n] = prettyTime(allStats[state.context.statistics.id].metrics[n].duration);
397
+ allStats[state.context.statistics.id].display.duration.total = prettyTime(allStats[state.context.statistics.id].metrics.total.duration);
398
+ allStats['total'].display.duration[v] = prettyTime(allStats['total'].metrics[v].duration);
399
+ allStats['total'].display.duration[n] = prettyTime(allStats['total'].metrics[n].duration);
400
+ allStats['total'].display.duration.total = prettyTime(allStats['total'].metrics.total.duration);
401
+ allStats[state.context.statistics.id].display.remaining[v] = prettyTime(allStats[state.context.statistics.id].metrics[v].remaining);
402
+ allStats[state.context.statistics.id].display.remaining[n] = prettyTime(allStats[state.context.statistics.id].metrics[n].remaining);
403
+ allStats[state.context.statistics.id].display.remaining.total = prettyTime(allStats[state.context.statistics.id].metrics.total.remaining);
404
+ allStats['total'].display.remaining[v] = prettyTime(allStats['total'].metrics[v].remaining);
405
+ allStats['total'].display.remaining[n] = prettyTime(allStats['total'].metrics[n].remaining);
406
+ allStats['total'].display.remaining.total = prettyTime(allStats['total'].metrics.total.remaining);
407
+ }
408
+ allStats[state.context.statistics.id].display.actual.total = prettyTime(allStats[state.context.statistics.id].metrics.total.actual);
409
+ allStats['total'].display.actual.total = prettyTime(allStats['total'].metrics.total.actual);
410
+ allStats['total'].display.thoroughput_rate[v] = Math.floor(1000 / allStats['total'].metrics[v].rate);
411
+ allStats['total'].display.thoroughput_rate[n] = Math.floor(1000 / allStats['total'].metrics[n].rate);
412
+ allStats['total'].display.thoroughput_rate.total = Math.floor(1000 / allStats['total'].metrics.total.rate);
413
+ if (allStats['total'].display.thoroughput_rate[v] < 1) {
414
+ allStats['total'].display.thoroughput_rate[v] = Math.floor(60 / allStats['total'].display.thoroughput_rate[v]) + ' entries/min';
415
+ } else {
416
+ allStats['total'].display.thoroughput_rate[v] += ' entries/sec';
417
+ }
418
+ if (allStats['total'].display.thoroughput_rate[n] < 1) {
419
+ allStats['total'].display.thoroughput_rate[n] = Math.floor(60 / allStats['total'].display.thoroughput_rate[n]) + ' entries/min';
420
+ } else {
421
+ allStats['total'].display.thoroughput_rate[n] += ' entries/sec';
422
+ }
423
+ if (allStats['total'].display.thoroughput_rate.total < 1) {
424
+ allStats['total'].display.thoroughput_rate.total = Math.floor(60 / allStats['total'].display.thoroughput_rate.total) + ' entries/min';
425
+ } else {
426
+ allStats['total'].display.thoroughput_rate.total += ' entries/sec';
427
+ }
428
+ allStats['total'].display.thoroughput_average[v] = Math.floor(1000 / allStats['total'].metrics[v].average);
429
+ allStats['total'].display.thoroughput_average[n] = Math.floor(1000 / allStats['total'].metrics[n].average);
430
+ allStats['total'].display.thoroughput_average.total = Math.floor(1000 / allStats['total'].metrics.total.average);
431
+ if (allStats['total'].display.thoroughput_average[v] < 1) {
432
+ allStats['total'].display.thoroughput_average[v] = Math.floor(60 / allStats['total'].display.thoroughput_average[v]) + ' entries/min';
433
+ } else {
434
+ allStats['total'].display.thoroughput_average[v] += ' entries/sec';
435
+ }
436
+ if (allStats['total'].display.thoroughput_average[n] < 1) {
437
+ allStats['total'].display.thoroughput_average[n] = Math.floor(60 / allStats['total'].display.thoroughput_average[n]) + ' entries/min';
438
+ } else {
439
+ allStats['total'].display.thoroughput_average[n] += ' entries/sec';
440
+ }
441
+ if (allStats['total'].display.thoroughput_average.total < 1) {
442
+ allStats['total'].display.thoroughput_average.total = Math.floor(60 / allStats['total'].display.thoroughput_average.total) + ' entries/min';
443
+ } else {
444
+ allStats['total'].display.thoroughput_average.total += ' entries/sec';
445
+ }
446
+ allStats[state.context.statistics.id].display.thoroughput_rate[v] = Math.floor(1000 / allStats[state.context.statistics.id].metrics[v].rate);
447
+ allStats[state.context.statistics.id].display.thoroughput_rate[n] = Math.floor(1000 / allStats[state.context.statistics.id].metrics[n].rate);
448
+ allStats[state.context.statistics.id].display.thoroughput_rate.total = Math.floor(1000 / allStats[state.context.statistics.id].metrics.total.rate);
449
+ if (allStats[state.context.statistics.id].display.thoroughput_rate[v] < 1) {
450
+ allStats[state.context.statistics.id].display.thoroughput_rate[v] = Math.floor(60 / allStats[state.context.statistics.id].display.thoroughput_rate[v]) + ' entries/min';
451
+ } else {
452
+ allStats[state.context.statistics.id].display.thoroughput_rate[v] += ' entries/sec';
453
+ }
454
+ if (allStats[state.context.statistics.id].display.thoroughput_rate[n] < 1) {
455
+ allStats[state.context.statistics.id].display.thoroughput_rate[n] = Math.floor(60 / allStats[state.context.statistics.id].display.thoroughput_rate[n]) + ' entries/min';
456
+ } else {
457
+ allStats[state.context.statistics.id].display.thoroughput_rate[n] += ' entries/sec';
458
+ }
459
+ if (allStats[state.context.statistics.id].display.thoroughput_rate.total < 1) {
460
+ allStats[state.context.statistics.id].display.thoroughput_rate.total = Math.floor(60 / allStats[state.context.statistics.id].display.thoroughput_rate.total) + ' entries/min';
461
+ } else {
462
+ allStats[state.context.statistics.id].display.thoroughput_rate.total += ' entries/sec';
463
+ }
464
+ allStats[state.context.statistics.id].display.thoroughput_average[v] = Math.floor(1000 / allStats[state.context.statistics.id].metrics[v].average);
465
+ allStats[state.context.statistics.id].display.thoroughput_average[n] = Math.floor(1000 / allStats[state.context.statistics.id].metrics[n].average);
466
+ allStats[state.context.statistics.id].display.thoroughput_average.total = Math.floor(1000 / allStats[state.context.statistics.id].metrics.total.average);
467
+ if (allStats[state.context.statistics.id].display.thoroughput_average[v] < 1) {
468
+ allStats[state.context.statistics.id].display.thoroughput_average[v] = Math.floor(60 / allStats[state.context.statistics.id].display.thoroughput_average[v]) + ' entries/min';
469
+ } else {
470
+ allStats[state.context.statistics.id].display.thoroughput_average[v] += ' entries/sec';
471
+ }
472
+ if (allStats[state.context.statistics.id].display.thoroughput_average[n] < 1) {
473
+ allStats[state.context.statistics.id].display.thoroughput_average[n] = Math.floor(60 / allStats[state.context.statistics.id].display.thoroughput_average[n]) + ' entries/min';
474
+ } else {
475
+ allStats[state.context.statistics.id].display.thoroughput_average[n] += ' entries/sec';
476
+ }
477
+ if (allStats[state.context.statistics.id].display.thoroughput_average.total < 1) {
478
+ allStats[state.context.statistics.id].display.thoroughput_average.total = Math.floor(60 / allStats[state.context.statistics.id].display.thoroughput_average.total) + ' entries/min';
479
+ } else {
480
+ allStats[state.context.statistics.id].display.thoroughput_average.total += ' entries/sec';
481
+ }
482
+ allStats['total'].display.speed_rate[v] = Math.floor(allStats['total'].metrics[v].rate);
483
+ allStats['total'].display.speed_rate[n] = Math.floor(allStats['total'].metrics[n].rate);
484
+ allStats['total'].display.speed_rate.total = Math.floor(allStats['total'].metrics.total.rate);
485
+ if (allStats['total'].display.speed_rate[v] < 1) {
486
+ allStats['total'].display.speed_rate[v] = Math.floor(60 / allStats['total'].display.speed_rate[v]) + ' ms/entry';
487
+ } else {
488
+ allStats['total'].display.speed_rate[v] += ' ms/entry';
489
+ }
490
+ if (allStats['total'].display.speed_rate[n] < 1) {
491
+ allStats['total'].display.speed_rate[n] = Math.floor(60 / allStats['total'].display.speed_rate[n]) + ' ms/entry';
492
+ } else {
493
+ allStats['total'].display.speed_rate[n] += ' ms/entry';
494
+ }
495
+ if (allStats['total'].display.speed_rate.total < 1) {
496
+ allStats['total'].display.speed_rate.total = Math.floor(60 / allStats['total'].display.speed_rate.total) + ' ms/entry';
497
+ } else {
498
+ allStats['total'].display.speed_rate.total += ' ms/entry';
499
+ }
500
+ allStats['total'].display.speed_average[v] = Math.floor(allStats['total'].metrics[v].average);
501
+ allStats['total'].display.speed_average[n] = Math.floor(allStats['total'].metrics[n].average);
502
+ allStats['total'].display.speed_average.total = Math.floor(allStats['total'].metrics.total.average);
503
+ if (allStats['total'].display.speed_average[v] < 1) {
504
+ allStats['total'].display.speed_average[v] = Math.floor(60 / allStats['total'].display.speed_average[v]) + ' ms/entry';
505
+ } else {
506
+ allStats['total'].display.speed_average[v] += ' ms/entry';
507
+ }
508
+ if (allStats['total'].display.speed_average[n] < 1) {
509
+ allStats['total'].display.speed_average[n] = Math.floor(60 / allStats['total'].display.speed_average[n]) + ' ms/entry';
510
+ } else {
511
+ allStats['total'].display.speed_average[n] += ' ms/entry';
512
+ }
513
+ if (allStats['total'].display.speed_average.total < 1) {
514
+ allStats['total'].display.speed_average.total = Math.floor(60 / allStats['total'].display.speed_average.total) + ' ms/entry';
515
+ } else {
516
+ allStats['total'].display.speed_average.total += ' ms/entry';
517
+ }
518
+ allStats[state.context.statistics.id].display.speed_rate[v] = Math.floor(allStats[state.context.statistics.id].metrics[v].rate);
519
+ allStats[state.context.statistics.id].display.speed_rate[n] = Math.floor(allStats[state.context.statistics.id].metrics[n].rate);
520
+ allStats[state.context.statistics.id].display.speed_rate.total = Math.floor(allStats[state.context.statistics.id].metrics.total.rate);
521
+ if (allStats[state.context.statistics.id].display.speed_rate[v] < 1) {
522
+ allStats[state.context.statistics.id].display.speed_rate[v] = Math.floor(60 / allStats[state.context.statistics.id].display.speed_rate[v]) + ' ms/entry';
523
+ } else {
524
+ allStats[state.context.statistics.id].display.speed_rate[v] += ' ms/entry';
525
+ }
526
+ if (allStats[state.context.statistics.id].display.speed_rate[n] < 1) {
527
+ allStats[state.context.statistics.id].display.speed_rate[n] = Math.floor(60 / allStats[state.context.statistics.id].display.speed_rate[n]) + ' ms/entry';
528
+ } else {
529
+ allStats[state.context.statistics.id].display.speed_rate[n] += ' ms/entry';
530
+ }
531
+ if (allStats[state.context.statistics.id].display.speed_rate.total < 1) {
532
+ allStats[state.context.statistics.id].display.speed_rate.total = Math.floor(60 / allStats[state.context.statistics.id].display.speed_rate.total) + ' ms/entry';
533
+ } else {
534
+ allStats[state.context.statistics.id].display.speed_rate.total += ' ms/entry';
535
+ }
536
+ allStats[state.context.statistics.id].display.speed_average[v] = Math.floor(allStats[state.context.statistics.id].metrics[v].average);
537
+ allStats[state.context.statistics.id].display.speed_average[n] = Math.floor(allStats[state.context.statistics.id].metrics[n].average);
538
+ allStats[state.context.statistics.id].display.speed_average.total = Math.floor(allStats[state.context.statistics.id].metrics.total.average);
539
+ if (allStats[state.context.statistics.id].display.speed_average[v] < 1) {
540
+ allStats[state.context.statistics.id].display.speed_average[v] = Math.floor(60 / allStats[state.context.statistics.id].display.speed_average[v]) + ' ms/entry';
541
+ } else {
542
+ allStats[state.context.statistics.id].display.speed_average[v] += ' ms/entry';
543
+ }
544
+ if (allStats[state.context.statistics.id].display.speed_average[n] < 1) {
545
+ allStats[state.context.statistics.id].display.speed_average[n] = Math.floor(60 / allStats[state.context.statistics.id].display.speed_average[n]) + ' ms/entry';
546
+ } else {
547
+ allStats[state.context.statistics.id].display.speed_average[n] += ' ms/entry';
548
+ }
549
+ if (allStats[state.context.statistics.id].display.speed_average.total < 1) {
550
+ allStats[state.context.statistics.id].display.speed_average.total = Math.floor(60 / allStats[state.context.statistics.id].display.speed_average.total) + ' ms/entry';
551
+ } else {
552
+ allStats[state.context.statistics.id].display.speed_average.total += ' ms/entry';
553
+ }
554
+ };
555
+ if (!theirs.exists(state.context.statistics)) {
556
+ var id = theirs.random();
557
+ allStats[id] = model();
558
+ state.context.statistics = {
559
+ total: allStats['total'],
560
+ request: allStats[id],
561
+ id: id
562
+ };
563
+ }
564
+ if (!this.contains(['resolve', 'notify', 'error'], state.type)) {
565
+ allStats[state.context.statistics.id] = model();
566
+ allStats[state.context.statistics.id].started = new Date().getTime();
567
+ allStats['total'].started = allStats['total'].started || new Date().getTime();
568
+ allStats[state.context.statistics.id].type = state.method;
569
+ if ( !! state.method && ('count.entries' !== state.method && null !== state.method.match(/\.entries$/) && this.is(state.context.forecast, true))) {
570
+ deferred = this.deferred();
571
+ promise(function (st) {
572
+ var context = st.context;
573
+ var processTotal = function (total) {
574
+ if (!verb || !noun) {
575
+ state.promise = promise;
576
+ deferred.resolve(state.context);
577
+ return;
578
+ }
579
+ if (theirs.exists(state.context.limit) && state.context.limit < total) {
580
+ allStats[state.context.statistics.id].metrics[verb].expected = state.context.limit;
581
+ allStats[state.context.statistics.id].metrics.total.expected = state.context.limit;
582
+ allStats[state.context.statistics.id].metrics[noun].expected = state.context.limit;
583
+ allStats['total'].metrics[verb].expected += state.context.limit;
584
+ allStats['total'].metrics[noun].expected += state.context.limit;
585
+ allStats['total'].metrics.total.expected += state.context.limit;
586
+ } else {
587
+ allStats[state.context.statistics.id].metrics[verb].expected = total;
588
+ allStats[state.context.statistics.id].metrics[noun].expected = total;
589
+ allStats[state.context.statistics.id].metrics.total.expected = total;
590
+ allStats['total'].metrics[verb].expected += total;
591
+ allStats['total'].metrics[noun].expected += total;
592
+ allStats['total'].metrics.total.expected += total;
593
+ }
594
+ allStats[state.context.statistics.id].metrics[verb].expected += 1;
595
+ allStats[state.context.statistics.id].metrics[noun].expected += 1;
596
+ allStats['total'].metrics[verb].expected += 1;
597
+ allStats['total'].metrics[noun].expected += 1;
598
+ allStats[state.context.statistics.id].metrics.total.expected += 1;
599
+ allStats['total'].metrics.total.expected += 1;
600
+ calculate(verb, noun);
601
+ state.promise = promise;
602
+ deferred.resolve(state.context);
603
+ };
604
+ if ( !! state.context.total) {
605
+ processTotal(state.context.total);
606
+ } else {
607
+ theirs.api.count.entries({
608
+ database: context.database,
609
+ index: context.index,
610
+ index_key: context.index_key,
611
+ index_key_path: context.index_key_path,
612
+ limit: context.limit,
613
+ store: context.store,
614
+ store_key_path: context.store_key_path
615
+ })(function (context) {
616
+ state.context.total = context.total;
617
+ processTotal(context.total);
618
+ }, function (context) {
619
+ deferred.error(state.context);
620
+ }, function (context) {
621
+ deferred.notify(state.context);
622
+ });
623
+ }
624
+ });
625
+ if (theirs.is(state.context.forecast, true)) {
626
+ allStats[state.context.statistics.id].metrics[verb].expected += 1;
627
+ allStats[state.context.statistics.id].metrics[noun].expected += 1;
628
+ allStats['total'].metrics[verb].expected += 1;
629
+ allStats['total'].metrics[noun].expected += 1;
630
+ allStats[state.context.statistics.id].metrics.total.expected += 1;
631
+ allStats['total'].metrics.total.expected += 1;
632
+ }
633
+ state.promise = deferred.promise;
634
+ } else {
635
+ if (theirs.is(state.context.forecast, true)) {
636
+ allStats[state.context.statistics.id].metrics[verb].expected += 1;
637
+ allStats[state.context.statistics.id].metrics[noun].expected += 1;
638
+ allStats['total'].metrics[verb].expected += 1;
639
+ allStats['total'].metrics[noun].expected += 1;
640
+ allStats[state.context.statistics.id].metrics.total.expected += 1;
641
+ allStats['total'].metrics.total.expected += 1;
642
+ }
643
+ if ( !! verb && !! noun) {
644
+ calculate(verb, noun);
645
+ }
646
+ }
647
+ } else {
648
+ if ( !! allStats[state.context.statistics.id].type) {
649
+ pieces = allStats[state.context.statistics.id].type.split('.');
650
+ verb = pieces[0];
651
+ noun = pieces[1];
652
+ allStats[state.context.statistics.id].metrics[verb].requests += 1;
653
+ allStats['total'].metrics[verb].requests += 1;
654
+ allStats[state.context.statistics.id].metrics[noun].requests += 1;
655
+ allStats['total'].metrics[noun].requests += 1;
656
+ allStats[state.context.statistics.id].metrics[state.type].requests += 1;
657
+ allStats['total'].metrics[state.type].requests += 1;
658
+ allStats[state.context.statistics.id].metrics.total.requests += 1;
659
+ allStats['total'].metrics.total.requests += 1;
660
+ if ('notify' !== state.type || this.is(state.context.progress, true)) {
661
+ calculate(verb, noun);
662
+ state.context.statistics.total = theirs.clone(allStats['total']);
663
+ state.context.statistics.request = theirs.clone(allStats[state.context.statistics.id]);
664
+ allStats[state.context.statistics.id].last = datetime;
665
+ } else if (this.contains(['resolve', 'error'], state.type)) {
666
+ delete allStats[state.context.statistics.id];
667
+ }
668
+ }
669
+ }
670
+ return state;
671
+ };
672
+ }(self));