@bitblit/ratchet-common 4.0.80-alpha

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 (220) hide show
  1. package/dist/cjs/2d/line-2d.js +2 -0
  2. package/dist/cjs/2d/plane-2d.js +2 -0
  3. package/dist/cjs/2d/point-2d.js +2 -0
  4. package/dist/cjs/2d/poly-line-2d.js +2 -0
  5. package/dist/cjs/2d/ratchet-2d.js +250 -0
  6. package/dist/cjs/build/build-information.js +2 -0
  7. package/dist/cjs/build/ratchet-common-info.js +18 -0
  8. package/dist/cjs/histogram/histogram-entry.js +2 -0
  9. package/dist/cjs/histogram/histogram.js +54 -0
  10. package/dist/cjs/index.js +74 -0
  11. package/dist/cjs/jwt/common-jwt-token.js +2 -0
  12. package/dist/cjs/jwt/expired-jwt-handling.js +9 -0
  13. package/dist/cjs/jwt/jwt-ratchet-like.js +2 -0
  14. package/dist/cjs/jwt/jwt-ratchet.js +164 -0
  15. package/dist/cjs/jwt/jwt-token-base.js +2 -0
  16. package/dist/cjs/lang/array-ratchet.js +87 -0
  17. package/dist/cjs/lang/base64-ratchet.js +49 -0
  18. package/dist/cjs/lang/boolean-ratchet.js +49 -0
  19. package/dist/cjs/lang/composite-last-success-provider.js +28 -0
  20. package/dist/cjs/lang/date-ratchet.js +33 -0
  21. package/dist/cjs/lang/duration-ratchet.js +46 -0
  22. package/dist/cjs/lang/enum-ratchet.js +34 -0
  23. package/dist/cjs/lang/error-ratchet.js +49 -0
  24. package/dist/cjs/lang/expiring-object.js +68 -0
  25. package/dist/cjs/lang/geolocation-ratchet.js +267 -0
  26. package/dist/cjs/lang/global-ratchet.js +48 -0
  27. package/dist/cjs/lang/key-value.js +6 -0
  28. package/dist/cjs/lang/last-success-provider.js +2 -0
  29. package/dist/cjs/lang/map-ratchet.js +168 -0
  30. package/dist/cjs/lang/no.js +8 -0
  31. package/dist/cjs/lang/number-ratchet.js +156 -0
  32. package/dist/cjs/lang/parsed-url.js +2 -0
  33. package/dist/cjs/lang/promise-ratchet.js +142 -0
  34. package/dist/cjs/lang/require-ratchet.js +60 -0
  35. package/dist/cjs/lang/stop-watch.js +117 -0
  36. package/dist/cjs/lang/string-ratchet.js +195 -0
  37. package/dist/cjs/lang/time-zone-ratchet.js +80 -0
  38. package/dist/cjs/lang/timeout-token.js +19 -0
  39. package/dist/cjs/lang/transform-ratchet.js +70 -0
  40. package/dist/cjs/logger/classic-single-line-log-message-formatter.js +18 -0
  41. package/dist/cjs/logger/log-message-builder.js +51 -0
  42. package/dist/cjs/logger/log-message-format-type.js +9 -0
  43. package/dist/cjs/logger/log-message-formatter.js +2 -0
  44. package/dist/cjs/logger/log-message-processor.js +2 -0
  45. package/dist/cjs/logger/log-message.js +2 -0
  46. package/dist/cjs/logger/log-snapshot.js +2 -0
  47. package/dist/cjs/logger/logger-instance.js +207 -0
  48. package/dist/cjs/logger/logger-level-name.js +12 -0
  49. package/dist/cjs/logger/logger-meta.js +2 -0
  50. package/dist/cjs/logger/logger-options.js +2 -0
  51. package/dist/cjs/logger/logger-output-function.js +9 -0
  52. package/dist/cjs/logger/logger-ring-buffer.js +76 -0
  53. package/dist/cjs/logger/logger-util.js +49 -0
  54. package/dist/cjs/logger/logger.js +139 -0
  55. package/dist/cjs/logger/none-log-message-formatter.js +9 -0
  56. package/dist/cjs/logger/structured-json-log-message-formatter.js +24 -0
  57. package/dist/cjs/network/browser-local-ip-provider.js +25 -0
  58. package/dist/cjs/network/fixed-local-ip-provider.js +12 -0
  59. package/dist/cjs/network/local-ip-provider.js +2 -0
  60. package/dist/cjs/network/network-ratchet.js +106 -0
  61. package/dist/cjs/stream/buffer-writable.js +20 -0
  62. package/dist/cjs/stream/stream-ratchet.js +72 -0
  63. package/dist/cjs/stream/string-writable.js +18 -0
  64. package/dist/cjs/third-party/google/google-recaptcha-ratchet.js +33 -0
  65. package/dist/cjs/third-party/twilio/twilio-ratchet.js +75 -0
  66. package/dist/cjs/transform/built-in-transforms.js +195 -0
  67. package/dist/cjs/transform/transform-rule.js +2 -0
  68. package/dist/cjs/tx/transaction-configuration.js +2 -0
  69. package/dist/cjs/tx/transaction-final-state.js +9 -0
  70. package/dist/cjs/tx/transaction-ratchet.js +80 -0
  71. package/dist/cjs/tx/transaction-result.js +2 -0
  72. package/dist/cjs/tx/transaction-step.js +2 -0
  73. package/dist/es/2d/line-2d.js +1 -0
  74. package/dist/es/2d/plane-2d.js +1 -0
  75. package/dist/es/2d/point-2d.js +1 -0
  76. package/dist/es/2d/poly-line-2d.js +1 -0
  77. package/dist/es/2d/ratchet-2d.js +245 -0
  78. package/dist/es/build/build-information.js +1 -0
  79. package/dist/es/build/ratchet-common-info.js +14 -0
  80. package/dist/es/histogram/histogram-entry.js +1 -0
  81. package/dist/es/histogram/histogram.js +50 -0
  82. package/dist/es/index.js +71 -0
  83. package/dist/es/jwt/common-jwt-token.js +1 -0
  84. package/dist/es/jwt/expired-jwt-handling.js +6 -0
  85. package/dist/es/jwt/jwt-ratchet-like.js +1 -0
  86. package/dist/es/jwt/jwt-ratchet.js +159 -0
  87. package/dist/es/jwt/jwt-token-base.js +1 -0
  88. package/dist/es/lang/array-ratchet.js +83 -0
  89. package/dist/es/lang/base64-ratchet.js +45 -0
  90. package/dist/es/lang/boolean-ratchet.js +45 -0
  91. package/dist/es/lang/composite-last-success-provider.js +24 -0
  92. package/dist/es/lang/date-ratchet.js +29 -0
  93. package/dist/es/lang/duration-ratchet.js +42 -0
  94. package/dist/es/lang/enum-ratchet.js +30 -0
  95. package/dist/es/lang/error-ratchet.js +44 -0
  96. package/dist/es/lang/expiring-object.js +63 -0
  97. package/dist/es/lang/geolocation-ratchet.js +263 -0
  98. package/dist/es/lang/global-ratchet.js +43 -0
  99. package/dist/es/lang/key-value.js +2 -0
  100. package/dist/es/lang/last-success-provider.js +1 -0
  101. package/dist/es/lang/map-ratchet.js +164 -0
  102. package/dist/es/lang/no.js +4 -0
  103. package/dist/es/lang/number-ratchet.js +152 -0
  104. package/dist/es/lang/parsed-url.js +1 -0
  105. package/dist/es/lang/promise-ratchet.js +138 -0
  106. package/dist/es/lang/require-ratchet.js +56 -0
  107. package/dist/es/lang/stop-watch.js +113 -0
  108. package/dist/es/lang/string-ratchet.js +191 -0
  109. package/dist/es/lang/time-zone-ratchet.js +76 -0
  110. package/dist/es/lang/timeout-token.js +15 -0
  111. package/dist/es/lang/transform-ratchet.js +66 -0
  112. package/dist/es/logger/classic-single-line-log-message-formatter.js +13 -0
  113. package/dist/es/logger/log-message-builder.js +47 -0
  114. package/dist/es/logger/log-message-format-type.js +6 -0
  115. package/dist/es/logger/log-message-formatter.js +1 -0
  116. package/dist/es/logger/log-message-processor.js +1 -0
  117. package/dist/es/logger/log-message.js +1 -0
  118. package/dist/es/logger/log-snapshot.js +1 -0
  119. package/dist/es/logger/logger-instance.js +201 -0
  120. package/dist/es/logger/logger-level-name.js +9 -0
  121. package/dist/es/logger/logger-meta.js +1 -0
  122. package/dist/es/logger/logger-options.js +1 -0
  123. package/dist/es/logger/logger-output-function.js +6 -0
  124. package/dist/es/logger/logger-ring-buffer.js +72 -0
  125. package/dist/es/logger/logger-util.js +44 -0
  126. package/dist/es/logger/logger.js +134 -0
  127. package/dist/es/logger/none-log-message-formatter.js +5 -0
  128. package/dist/es/logger/structured-json-log-message-formatter.js +19 -0
  129. package/dist/es/network/browser-local-ip-provider.js +21 -0
  130. package/dist/es/network/fixed-local-ip-provider.js +8 -0
  131. package/dist/es/network/local-ip-provider.js +1 -0
  132. package/dist/es/network/network-ratchet.js +102 -0
  133. package/dist/es/stream/buffer-writable.js +16 -0
  134. package/dist/es/stream/stream-ratchet.js +68 -0
  135. package/dist/es/stream/string-writable.js +14 -0
  136. package/dist/es/third-party/google/google-recaptcha-ratchet.js +28 -0
  137. package/dist/es/third-party/twilio/twilio-ratchet.js +70 -0
  138. package/dist/es/transform/built-in-transforms.js +191 -0
  139. package/dist/es/transform/transform-rule.js +1 -0
  140. package/dist/es/tx/transaction-configuration.js +1 -0
  141. package/dist/es/tx/transaction-final-state.js +6 -0
  142. package/dist/es/tx/transaction-ratchet.js +76 -0
  143. package/dist/es/tx/transaction-result.js +1 -0
  144. package/dist/es/tx/transaction-step.js +1 -0
  145. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  146. package/dist/tsconfig.es.tsbuildinfo +1 -0
  147. package/dist/tsconfig.types.tsbuildinfo +1 -0
  148. package/dist/types/2d/line-2d.d.ts +5 -0
  149. package/dist/types/2d/plane-2d.d.ts +6 -0
  150. package/dist/types/2d/point-2d.d.ts +4 -0
  151. package/dist/types/2d/poly-line-2d.d.ts +4 -0
  152. package/dist/types/2d/ratchet-2d.d.ts +37 -0
  153. package/dist/types/build/build-information.d.ts +8 -0
  154. package/dist/types/build/ratchet-common-info.d.ts +5 -0
  155. package/dist/types/histogram/histogram-entry.d.ts +4 -0
  156. package/dist/types/histogram/histogram.d.ts +15 -0
  157. package/dist/types/index.d.ts +74 -0
  158. package/dist/types/jwt/common-jwt-token.d.ts +17 -0
  159. package/dist/types/jwt/expired-jwt-handling.d.ts +5 -0
  160. package/dist/types/jwt/jwt-ratchet-like.d.ts +18 -0
  161. package/dist/types/jwt/jwt-ratchet.d.ts +39 -0
  162. package/dist/types/jwt/jwt-token-base.d.ts +13 -0
  163. package/dist/types/lang/array-ratchet.d.ts +30 -0
  164. package/dist/types/lang/base64-ratchet.d.ts +10 -0
  165. package/dist/types/lang/boolean-ratchet.d.ts +7 -0
  166. package/dist/types/lang/composite-last-success-provider.d.ts +8 -0
  167. package/dist/types/lang/date-ratchet.d.ts +11 -0
  168. package/dist/types/lang/duration-ratchet.d.ts +7 -0
  169. package/dist/types/lang/enum-ratchet.d.ts +12 -0
  170. package/dist/types/lang/error-ratchet.d.ts +6 -0
  171. package/dist/types/lang/expiring-object.d.ts +20 -0
  172. package/dist/types/lang/geolocation-ratchet.d.ts +40 -0
  173. package/dist/types/lang/global-ratchet.d.ts +6 -0
  174. package/dist/types/lang/key-value.d.ts +4 -0
  175. package/dist/types/lang/last-success-provider.d.ts +4 -0
  176. package/dist/types/lang/map-ratchet.d.ts +15 -0
  177. package/dist/types/lang/no.d.ts +3 -0
  178. package/dist/types/lang/number-ratchet.d.ts +20 -0
  179. package/dist/types/lang/parsed-url.d.ts +10 -0
  180. package/dist/types/lang/promise-ratchet.d.ts +32 -0
  181. package/dist/types/lang/require-ratchet.d.ts +11 -0
  182. package/dist/types/lang/stop-watch.d.ts +17 -0
  183. package/dist/types/lang/string-ratchet.d.ts +27 -0
  184. package/dist/types/lang/time-zone-ratchet.d.ts +50 -0
  185. package/dist/types/lang/timeout-token.d.ts +9 -0
  186. package/dist/types/lang/transform-ratchet.d.ts +7 -0
  187. package/dist/types/logger/classic-single-line-log-message-formatter.d.ts +6 -0
  188. package/dist/types/logger/log-message-builder.d.ts +14 -0
  189. package/dist/types/logger/log-message-format-type.d.ts +5 -0
  190. package/dist/types/logger/log-message-formatter.d.ts +5 -0
  191. package/dist/types/logger/log-message-processor.d.ts +5 -0
  192. package/dist/types/logger/log-message.d.ts +8 -0
  193. package/dist/types/logger/log-snapshot.d.ts +5 -0
  194. package/dist/types/logger/logger-instance.d.ts +46 -0
  195. package/dist/types/logger/logger-level-name.d.ts +8 -0
  196. package/dist/types/logger/logger-meta.d.ts +6 -0
  197. package/dist/types/logger/logger-options.d.ts +13 -0
  198. package/dist/types/logger/logger-output-function.d.ts +5 -0
  199. package/dist/types/logger/logger-ring-buffer.d.ts +18 -0
  200. package/dist/types/logger/logger-util.d.ts +8 -0
  201. package/dist/types/logger/logger.d.ts +52 -0
  202. package/dist/types/logger/none-log-message-formatter.d.ts +6 -0
  203. package/dist/types/logger/structured-json-log-message-formatter.d.ts +6 -0
  204. package/dist/types/network/browser-local-ip-provider.d.ts +7 -0
  205. package/dist/types/network/fixed-local-ip-provider.d.ts +6 -0
  206. package/dist/types/network/local-ip-provider.d.ts +4 -0
  207. package/dist/types/network/network-ratchet.d.ts +9 -0
  208. package/dist/types/stream/buffer-writable.d.ts +9 -0
  209. package/dist/types/stream/stream-ratchet.d.ts +12 -0
  210. package/dist/types/stream/string-writable.d.ts +8 -0
  211. package/dist/types/third-party/google/google-recaptcha-ratchet.d.ts +4 -0
  212. package/dist/types/third-party/twilio/twilio-ratchet.d.ts +15 -0
  213. package/dist/types/transform/built-in-transforms.d.ts +18 -0
  214. package/dist/types/transform/transform-rule.d.ts +3 -0
  215. package/dist/types/tx/transaction-configuration.d.ts +7 -0
  216. package/dist/types/tx/transaction-final-state.d.ts +5 -0
  217. package/dist/types/tx/transaction-ratchet.d.ts +6 -0
  218. package/dist/types/tx/transaction-result.d.ts +9 -0
  219. package/dist/types/tx/transaction-step.d.ts +5 -0
  220. package/package.json +65 -0
@@ -0,0 +1,164 @@
1
+ import { Logger } from '../logger/logger';
2
+ import { ErrorRatchet } from './error-ratchet';
3
+ import { set } from 'lodash';
4
+ export class MapRatchet {
5
+ static expandNestedKeys(src) {
6
+ const rval = {};
7
+ Object.keys(src).forEach((k) => {
8
+ set(rval, k, src[k]);
9
+ });
10
+ return rval;
11
+ }
12
+ static mapByUniqueProperty(input, propName) {
13
+ if (!input || !propName) {
14
+ throw new Error('Neither input nor propName can be null');
15
+ }
16
+ const rval = new Map();
17
+ input.forEach((i) => {
18
+ const val = !!i ? i[propName] : null;
19
+ if (val === null || val === undefined) {
20
+ throw new Error('No value for ' + propName + ' found in ' + JSON.stringify(i));
21
+ }
22
+ if (rval.has(val)) {
23
+ throw new Error('Multiple values found for ' + val);
24
+ }
25
+ rval.set(val, i);
26
+ });
27
+ return rval;
28
+ }
29
+ static groupByProperty(input, propName) {
30
+ if (!input || !propName) {
31
+ throw new Error('Neither input nor propName can be null');
32
+ }
33
+ const rval = new Map();
34
+ input.forEach((i) => {
35
+ const val = !!i ? i[propName] : null;
36
+ if (val === null || val === undefined) {
37
+ throw ErrorRatchet.fErr('No value for %s found in %j', propName, i);
38
+ }
39
+ if (!rval.has(val)) {
40
+ rval.set(val, []);
41
+ }
42
+ rval.get(val).push(i);
43
+ });
44
+ return rval;
45
+ }
46
+ static findValue(toSearch, path) {
47
+ if (!path || path.length == 0) {
48
+ return toSearch;
49
+ }
50
+ else {
51
+ if (toSearch) {
52
+ return MapRatchet.findValue(toSearch[path[0]], path.slice(1));
53
+ }
54
+ else {
55
+ return null;
56
+ }
57
+ }
58
+ }
59
+ static findValueDotPath(toSearch, dotPath) {
60
+ if (!dotPath || dotPath.length == 0) {
61
+ return toSearch;
62
+ }
63
+ else {
64
+ if (toSearch) {
65
+ return MapRatchet.findValue(toSearch, dotPath.split('.'));
66
+ }
67
+ else {
68
+ return null;
69
+ }
70
+ }
71
+ }
72
+ static simpleDeepCompare(object1, object2) {
73
+ if (object1 == null && object2 == null)
74
+ return true;
75
+ if (object1 == null || object2 == null)
76
+ return false;
77
+ return JSON.stringify(object1) == JSON.stringify(object2);
78
+ }
79
+ static toKeyValueList(value) {
80
+ const returnArray = [];
81
+ for (const k of Object.keys(value)) {
82
+ returnArray.push({
83
+ key: k,
84
+ value: value[k],
85
+ });
86
+ }
87
+ return returnArray;
88
+ }
89
+ static fromKeyValueList(list) {
90
+ const rval = {};
91
+ list.forEach((a) => (rval[a.key] = a.value));
92
+ return rval;
93
+ }
94
+ static cleanup(obj, stripZero = false, stripNull = true, stripUndefined = true, stripEmptyString = true) {
95
+ if (obj === null || obj === undefined || typeof obj !== 'object') {
96
+ return obj;
97
+ }
98
+ const o = JSON.parse(JSON.stringify(obj));
99
+ Object.keys(o).forEach((key) => {
100
+ if (o[key] && typeof o[key] === 'object') {
101
+ if (Array.isArray(o[key])) {
102
+ for (let i = 0; i < o[key].length; i++) {
103
+ o[key][i] = MapRatchet.cleanup(o[key][i]);
104
+ }
105
+ }
106
+ else {
107
+ o[key] = MapRatchet.cleanup(o[key]);
108
+ }
109
+ }
110
+ else if ((o[key] === undefined && stripUndefined) ||
111
+ (o[key] === null && stripNull) ||
112
+ (o[key] === '' && stripEmptyString) ||
113
+ (o[key] === 0 && stripZero)) {
114
+ delete o[key];
115
+ }
116
+ else {
117
+ o[key] = o[key];
118
+ }
119
+ });
120
+ return o;
121
+ }
122
+ static extractValueFromMapIgnoreCase(src, key) {
123
+ let rval = null;
124
+ if (src && key) {
125
+ const finder = key.toLowerCase();
126
+ Object.keys(src).forEach((s) => {
127
+ if (s.toLowerCase() === finder) {
128
+ const newVal = src[s];
129
+ if (rval) {
130
+ Logger.warn('Multiple entries found for %s (replacing %s with %s', key, rval, newVal);
131
+ }
132
+ rval = newVal;
133
+ }
134
+ });
135
+ }
136
+ return rval;
137
+ }
138
+ static safeCallFunction(ob, fnName) {
139
+ let rval = false;
140
+ if (!!ob && !!ob[fnName] && typeof ob[fnName] === 'function') {
141
+ try {
142
+ ob[fnName]();
143
+ rval = true;
144
+ }
145
+ catch (err) {
146
+ Logger.warn('Error calling %s on %s : %s', fnName, ob, err, err);
147
+ }
148
+ }
149
+ return rval;
150
+ }
151
+ static caseInsensitiveAccess(ob, keyName) {
152
+ let rval = null;
153
+ if (!!ob && !!keyName) {
154
+ rval = ob[keyName];
155
+ if (!rval) {
156
+ const keyNameCI = Object.keys(ob).find((f) => f.toLowerCase() === keyName.toLowerCase());
157
+ if (!!keyNameCI) {
158
+ rval = ob[keyNameCI];
159
+ }
160
+ }
161
+ }
162
+ return rval;
163
+ }
164
+ }
@@ -0,0 +1,4 @@
1
+ export class No {
2
+ static op(...args) {
3
+ }
4
+ }
@@ -0,0 +1,152 @@
1
+ import { Logger } from '../logger/logger';
2
+ import { RequireRatchet } from './require-ratchet';
3
+ export class NumberRatchet {
4
+ static toFixedDecimalNumber(input, placesAfterPoint) {
5
+ const v = NumberRatchet.safeNumber(input);
6
+ return v === null || v === undefined ? v : NumberRatchet.safeNumber(v.toFixed(placesAfterPoint));
7
+ }
8
+ static leadingZeros(val, size) {
9
+ const sVal = String(val);
10
+ if (sVal.length < size) {
11
+ let pad = '0000';
12
+ if (size > NumberRatchet.MAX_LEADING_ZEROS_FORMAT_LENGTH) {
13
+ throw 'Cannot format number that large (max length is ' + NumberRatchet.MAX_LEADING_ZEROS_FORMAT_LENGTH + ')';
14
+ }
15
+ while (pad.length < size) {
16
+ pad = pad + pad;
17
+ }
18
+ return (pad + sVal).slice(-1 * size);
19
+ }
20
+ else {
21
+ return sVal;
22
+ }
23
+ }
24
+ static between(inTest, inP1, inP2) {
25
+ const test = NumberRatchet.safeNumber(inTest);
26
+ const p1 = NumberRatchet.safeNumber(inP1);
27
+ const p2 = NumberRatchet.safeNumber(inP2);
28
+ return (test >= p1 && test <= p2) || (test >= p2 && test <= p1);
29
+ }
30
+ static safeNumber(input, ifNotNumber = null) {
31
+ let rval = null;
32
+ if (input != null) {
33
+ const type = typeof input;
34
+ if (type == 'number') {
35
+ rval = input;
36
+ }
37
+ else if (type == 'string') {
38
+ if (input.trim().length === 0) {
39
+ rval = ifNotNumber;
40
+ }
41
+ else {
42
+ rval = Number.parseFloat(input);
43
+ }
44
+ }
45
+ else {
46
+ Logger.warn('Value is of type %s, returning default', type);
47
+ rval = ifNotNumber;
48
+ }
49
+ if (isNaN(rval)) {
50
+ Logger.debug('Parsed string to NaN - using NaN value from param');
51
+ rval = ifNotNumber;
52
+ }
53
+ }
54
+ return rval;
55
+ }
56
+ static numberCSVToList(inputCSV) {
57
+ let rval = null;
58
+ if (inputCSV) {
59
+ rval = inputCSV.split(',').map((s) => {
60
+ return NumberRatchet.safeNumber(s.trim());
61
+ });
62
+ rval = rval.filter((r) => typeof r === 'number' && !isNaN(r));
63
+ }
64
+ return rval;
65
+ }
66
+ static fitToWindow(val, b1, b2) {
67
+ let rval = val;
68
+ if (val === null || b1 === null || b2 === null || b1 < 0 || b2 < 0 || val < 0) {
69
+ throw new Error('All values must be non-null and larger than 0');
70
+ }
71
+ const low = Math.min(b1, b2);
72
+ const high = Math.max(b1, b2);
73
+ const windowSize = high - low;
74
+ if (high === low) {
75
+ rval = high;
76
+ }
77
+ else {
78
+ while (rval < low) {
79
+ rval += windowSize;
80
+ }
81
+ while (rval > high) {
82
+ rval -= windowSize;
83
+ }
84
+ }
85
+ return rval;
86
+ }
87
+ static groupNumbersIntoContiguousRanges(inputData, minRangeSize = 3) {
88
+ RequireRatchet.notNullOrUndefined(inputData);
89
+ const input = Object.assign([], inputData);
90
+ input.sort((a, b) => a - b);
91
+ const singles = [];
92
+ const ranges = [];
93
+ let start = 0;
94
+ for (let i = 1; i < input.length; i++) {
95
+ if (input[i] === input[i - 1] + 1) {
96
+ }
97
+ else {
98
+ if (start === i - 1) {
99
+ singles.push(input[i - 1]);
100
+ }
101
+ else {
102
+ const rangeSize = i - start;
103
+ if (rangeSize < minRangeSize) {
104
+ for (let j = start; j < i; j++) {
105
+ singles.push(input[j]);
106
+ }
107
+ }
108
+ else {
109
+ ranges.push({
110
+ min: input[start],
111
+ max: input[i - 1],
112
+ });
113
+ }
114
+ }
115
+ start = i;
116
+ }
117
+ }
118
+ return {
119
+ singles: singles,
120
+ ranges: ranges,
121
+ };
122
+ }
123
+ static distributeItemsEvenly(items, buckets) {
124
+ RequireRatchet.notNullOrUndefined(items, 'items');
125
+ RequireRatchet.notNullOrUndefined(buckets, 'buckets');
126
+ RequireRatchet.true(items > 0 && items === Math.floor(items), 'Items integer larger than 0');
127
+ RequireRatchet.true(buckets > 0 && buckets === Math.floor(buckets), 'Buckets integer larger than 0');
128
+ const offset = buckets / items;
129
+ const rval = [];
130
+ for (let i = 0; i < buckets; i++) {
131
+ rval.push(0);
132
+ }
133
+ let loc = 0;
134
+ let rem = items;
135
+ while (rem > 0) {
136
+ rval[Math.floor(loc) % buckets]++;
137
+ rem--;
138
+ loc += offset;
139
+ }
140
+ return rval;
141
+ }
142
+ static createRange(minInclusive, maxExclusive, step = 1) {
143
+ const rval = [];
144
+ let val = minInclusive;
145
+ while (val < maxExclusive) {
146
+ rval.push(val);
147
+ val += step;
148
+ }
149
+ return rval;
150
+ }
151
+ }
152
+ NumberRatchet.MAX_LEADING_ZEROS_FORMAT_LENGTH = 1000;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,138 @@
1
+ import { Logger } from '../logger/logger';
2
+ import { ArrayRatchet } from './array-ratchet';
3
+ import { TimeoutToken } from './timeout-token';
4
+ import { StopWatch } from './stop-watch';
5
+ import { LoggerLevelName } from '../logger/logger-level-name';
6
+ export class PromiseRatchet {
7
+ static resolveOnEvent(evtSrc, okEvtNames, errEvtNames = [], rval = null) {
8
+ if (!evtSrc || !okEvtNames || okEvtNames.length === 0 || !evtSrc['on']) {
9
+ Promise.reject('Cannot continue - missing source object or name, or the object is not an event source');
10
+ }
11
+ return new Promise((res, rej) => {
12
+ okEvtNames.forEach((e) => {
13
+ evtSrc.on(e, () => {
14
+ res(rval);
15
+ });
16
+ });
17
+ if (!!errEvtNames) {
18
+ errEvtNames.forEach((e) => {
19
+ evtSrc.on(e, (err) => {
20
+ rej(err);
21
+ });
22
+ });
23
+ }
24
+ });
25
+ }
26
+ static timeout(srcPromise, title, timeoutMS) {
27
+ return Promise.race([srcPromise, PromiseRatchet.createTimeoutPromise(title, timeoutMS)]);
28
+ }
29
+ static createTimeoutPromise(title, timeoutMS) {
30
+ return new Promise((resolve, reject) => {
31
+ const id = setTimeout(() => {
32
+ clearTimeout(id);
33
+ const rval = new TimeoutToken(title, timeoutMS);
34
+ resolve(rval);
35
+ }, timeoutMS);
36
+ });
37
+ }
38
+ static async wait(time) {
39
+ await PromiseRatchet.createTimeoutPromise('Wait ' + time, time);
40
+ Logger.silly('Finished wait of %d ms', time);
41
+ }
42
+ static dumpResult(result, autoDebug = false) {
43
+ Logger.info('Success, result was : \n\n%s\n\n', JSON.stringify(result));
44
+ if (autoDebug) {
45
+ debugger;
46
+ }
47
+ process.exit(0);
48
+ }
49
+ static dumpError(err, autoDebug = false) {
50
+ Logger.warn('Failure, err was : \n\n%s\n\n -- \n\n%s\n\n', JSON.stringify(err), String(err));
51
+ console.trace();
52
+ if (autoDebug) {
53
+ debugger;
54
+ }
55
+ process.exit(1);
56
+ }
57
+ static logErrorAndReturnNull(err, autoDebug = false) {
58
+ Logger.warn('Failure, err was : \n\n%s\n\n -- \n\n%s\n\n', JSON.stringify(err), String(err));
59
+ if (autoDebug) {
60
+ debugger;
61
+ }
62
+ return null;
63
+ }
64
+ static runPromiseAndDump(promise) {
65
+ promise.then(PromiseRatchet.dumpResult).catch(PromiseRatchet.dumpError);
66
+ }
67
+ static async waitFor(testFunction, expectedValue, intervalMS, maxCycles, label = 'waitFor', count = 0) {
68
+ if (expectedValue == null || intervalMS < 50 || maxCycles < 1 || count < 0 || typeof testFunction != 'function') {
69
+ Logger.warn('%s: Invalid configuration for waitFor - exiting immediately', label);
70
+ Logger.warn('ExpectedValue : %s ; interval: %d ; maxCycles: %d ; test : %s', expectedValue, intervalMS, maxCycles, typeof testFunction);
71
+ return false;
72
+ }
73
+ let curVal = null;
74
+ try {
75
+ curVal = testFunction(count);
76
+ }
77
+ catch (err) {
78
+ Logger.warn('%s: Caught error while waiting, giving up', label);
79
+ return false;
80
+ }
81
+ if (curVal === null) {
82
+ Logger.debug('%s:CurVal was null - aborting', label);
83
+ return false;
84
+ }
85
+ else if (curVal == expectedValue) {
86
+ Logger.debug('%s:Found expected value', label);
87
+ return true;
88
+ }
89
+ else if (count > maxCycles) {
90
+ Logger.debug('%s:Exceeded max cycles, giving up', label);
91
+ return false;
92
+ }
93
+ else {
94
+ Logger.debug('%s : value not reached yet, waiting (count = %d of %d)', label, count, maxCycles);
95
+ await PromiseRatchet.wait(intervalMS);
96
+ return PromiseRatchet.waitFor(testFunction, expectedValue, intervalMS, maxCycles, label, count + 1);
97
+ }
98
+ }
99
+ static async runBoundedParallel(promiseFn, params, context, maxConcurrent = 1, logLevel = LoggerLevelName.debug) {
100
+ const sw = new StopWatch();
101
+ let rval = [];
102
+ let remain = params;
103
+ Logger.logByLevel(logLevel, 'Processing %d total elements %d at a time', params.length, maxConcurrent);
104
+ const ctx = context || this;
105
+ let processed = 0;
106
+ const totalCount = remain.length;
107
+ while (remain.length > 0) {
108
+ const curBatch = remain.slice(0, Math.min(remain.length, maxConcurrent));
109
+ remain = remain.slice(curBatch.length);
110
+ const proms = curBatch.map((c) => promiseFn.apply(ctx, c));
111
+ const output = await Promise.all(proms);
112
+ processed += proms.length;
113
+ rval = rval.concat(output);
114
+ const pct = processed / totalCount;
115
+ Logger.logByLevel(logLevel, '%d elements remain : %s', remain.length, sw.dumpExpected(pct));
116
+ }
117
+ sw.log();
118
+ return rval;
119
+ }
120
+ static async runBoundedParallelSingleParam(promiseFn, params, context, maxConcurrent = 1, logLevel = LoggerLevelName.debug) {
121
+ const wrappedParams = ArrayRatchet.wrapElementsInArray(params);
122
+ return PromiseRatchet.runBoundedParallel(promiseFn, wrappedParams, context, maxConcurrent, logLevel);
123
+ }
124
+ static async asyncForEachSerial(array, callback) {
125
+ for (let index = 0; index < array.length; index++) {
126
+ await callback(array[index], index, array);
127
+ }
128
+ }
129
+ static async asyncForEachParallel(array, callback) {
130
+ const proms = [];
131
+ for (let index = 0; index < array.length; index++) {
132
+ proms.push(callback(array[index], index, array));
133
+ }
134
+ await Promise.all(proms);
135
+ }
136
+ constructor() {
137
+ }
138
+ }
@@ -0,0 +1,56 @@
1
+ import { ErrorRatchet } from './error-ratchet';
2
+ export class RequireRatchet {
3
+ static isNullOrUndefined(ob) {
4
+ return ob === null || ob === undefined;
5
+ }
6
+ static notNullOrUndefined(ob, name = 'object') {
7
+ if (RequireRatchet.isNullOrUndefined(ob)) {
8
+ throw new Error(name + ' may not be null or undefined');
9
+ }
10
+ }
11
+ static notNullUndefinedOrOnlyWhitespaceString(ob, name = 'string') {
12
+ if (RequireRatchet.isNullOrUndefined(ob) || ob.trim() === '') {
13
+ throw new Error(name + ' may not be null or undefined or only whitespace string');
14
+ }
15
+ }
16
+ static notNullUndefinedOrEmptyArray(ob, name = 'string') {
17
+ if (RequireRatchet.isNullOrUndefined(ob) || ob.length === 0) {
18
+ throw new Error(name + ' may not be null or undefined or an empty array');
19
+ }
20
+ }
21
+ static equal(ob1, ob2, message = 'Values must be equal') {
22
+ if (ob1 !== ob2) {
23
+ throw new Error(message);
24
+ }
25
+ }
26
+ static true(ob, message = 'Value must be true') {
27
+ RequireRatchet.equal(ob, true, message);
28
+ }
29
+ static noNullOrUndefinedValuesInArray(arr, expectedLength = null, customMsg = null) {
30
+ RequireRatchet.notNullOrUndefined(arr, 'Source array may not be null');
31
+ if (expectedLength !== null && arr.length !== expectedLength) {
32
+ ErrorRatchet.throwFormattedErr('Expected array of length %d but was %d %s', expectedLength, arr.length, customMsg);
33
+ }
34
+ for (let i = 0; i < arr.length; i++) {
35
+ if (RequireRatchet.isNullOrUndefined(arr[i])) {
36
+ ErrorRatchet.throwFormattedErr('Array index %d was null or undefined %s', i, customMsg);
37
+ }
38
+ }
39
+ }
40
+ static noNullOrUndefinedValuesInRestArgs(expectedLength, ...restArgs) {
41
+ RequireRatchet.notNullOrUndefined(restArgs, 'Source array may not be null');
42
+ if (expectedLength !== null && restArgs.length !== expectedLength) {
43
+ ErrorRatchet.throwFormattedErr('Expected array of length %d but was %d', expectedLength, restArgs.length);
44
+ }
45
+ for (let i = 0; i < restArgs.length; i++) {
46
+ if (RequireRatchet.isNullOrUndefined(restArgs[i])) {
47
+ ErrorRatchet.throwFormattedErr('Array index %d was null or undefined', i);
48
+ }
49
+ }
50
+ }
51
+ static constructorArgumentsMatchLengthAndAreNonNull() {
52
+ const args = Array.from(arguments);
53
+ const len = this.constructor.length;
54
+ return RequireRatchet.noNullOrUndefinedValuesInArray(args, len);
55
+ }
56
+ }
@@ -0,0 +1,113 @@
1
+ import { DurationRatchet } from './duration-ratchet';
2
+ import { StringRatchet } from './string-ratchet';
3
+ import { RequireRatchet } from './require-ratchet';
4
+ import { LoggerLevelName } from '../logger/logger-level-name';
5
+ import { Logger } from '../logger/logger';
6
+ export class StopWatch {
7
+ constructor(label = StringRatchet.createRandomHexString(4)) {
8
+ this.label = label;
9
+ this.starts = new Map();
10
+ this.ends = new Map();
11
+ this.createTime = Date.now();
12
+ }
13
+ start(name) {
14
+ RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
15
+ const now = Date.now();
16
+ this.starts.set(StringRatchet.trimToNull(name), now);
17
+ return now;
18
+ }
19
+ stop(name) {
20
+ RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
21
+ const now = Date.now();
22
+ this.ends.set(StringRatchet.trimToNull(name), now);
23
+ return now;
24
+ }
25
+ reset(name) {
26
+ RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
27
+ this.starts.delete(StringRatchet.trimToNull(name));
28
+ this.ends.delete(StringRatchet.trimToNull(name));
29
+ }
30
+ hasTimer(name) {
31
+ RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
32
+ return this.starts.has(name);
33
+ }
34
+ log(name, shortForm, logLevel = LoggerLevelName.info) {
35
+ Logger.logByLevel(logLevel, this.dump(name, shortForm));
36
+ }
37
+ logExpected(pctComplete, name, shortForm, logLevel = LoggerLevelName.info) {
38
+ Logger.logByLevel(logLevel, this.dumpExpected(pctComplete, name, shortForm));
39
+ }
40
+ dump(name, shortForm) {
41
+ let rval = this.label + ' ';
42
+ const cleanName = StringRatchet.trimToNull(name);
43
+ if (cleanName && !this.hasTimer(cleanName)) {
44
+ rval += 'No such timer : ' + cleanName;
45
+ }
46
+ else {
47
+ const start = name ? this.starts.get(cleanName) : this.createTime;
48
+ const end = name ? this.ends.get(cleanName) : Date.now();
49
+ rval += (cleanName || 'Default') + ' ';
50
+ if (!!start && !!end) {
51
+ rval += 'completed in ' + DurationRatchet.formatMsDuration(end - start, !shortForm);
52
+ }
53
+ else if (!!start) {
54
+ rval += 'running for ' + DurationRatchet.formatMsDuration(Date.now() - start, !shortForm);
55
+ }
56
+ }
57
+ return rval;
58
+ }
59
+ dumpExpected(pctComplete, name, shortForm) {
60
+ let rval = this.label + ' ';
61
+ const cleanName = StringRatchet.trimToNull(name);
62
+ if (cleanName && !this.hasTimer(cleanName)) {
63
+ rval += 'No such timer : ' + cleanName;
64
+ }
65
+ else {
66
+ if (!pctComplete || pctComplete <= 0) {
67
+ rval += 'Cannot generate output for 0 percent complete';
68
+ }
69
+ else if (pctComplete > 1) {
70
+ rval += 'Cannot generate output for percent > 1';
71
+ }
72
+ else {
73
+ rval += (cleanName || 'Default') + ' ';
74
+ const start = name ? this.starts.get(cleanName) : this.createTime;
75
+ const end = name ? this.ends.get(cleanName) : Date.now();
76
+ if (!!start && !!end) {
77
+ rval += 'completed in ' + DurationRatchet.formatMsDuration(end - start, !shortForm);
78
+ }
79
+ else if (!!start) {
80
+ const now = Date.now();
81
+ const elapsedMS = now - start;
82
+ const expectedTotalMS = elapsedMS / pctComplete;
83
+ const remainMS = expectedTotalMS - elapsedMS;
84
+ rval +=
85
+ 'running for ' +
86
+ DurationRatchet.formatMsDuration(elapsedMS, !shortForm) +
87
+ ' approx ' +
88
+ DurationRatchet.formatMsDuration(remainMS, !shortForm) +
89
+ ' remaining';
90
+ }
91
+ }
92
+ }
93
+ return rval;
94
+ }
95
+ elapsedMS(name) {
96
+ let rval = null;
97
+ const cleanName = StringRatchet.trimToNull(name);
98
+ if (cleanName && !this.hasTimer(cleanName)) {
99
+ rval = null;
100
+ }
101
+ else {
102
+ const start = name ? this.starts.get(cleanName) : this.createTime;
103
+ const end = name ? this.ends.get(cleanName) : Date.now();
104
+ if (!!start && !!end) {
105
+ rval = end - start;
106
+ }
107
+ else if (!!start) {
108
+ rval = Date.now() - start;
109
+ }
110
+ }
111
+ return rval;
112
+ }
113
+ }