@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,191 @@
1
+ import { RequireRatchet } from './require-ratchet';
2
+ export class StringRatchet {
3
+ static stringToUint8Array(val) {
4
+ return val ? new TextEncoder().encode(val) : null;
5
+ }
6
+ static uint8ArrayToString(val) {
7
+ return val ? new TextDecoder().decode(val) : null;
8
+ }
9
+ static attemptJsonParse(val) {
10
+ let rval = null;
11
+ if (StringRatchet.trimToNull(val)) {
12
+ try {
13
+ rval = JSON.parse(val);
14
+ }
15
+ catch (err) {
16
+ rval = null;
17
+ }
18
+ }
19
+ return rval;
20
+ }
21
+ static canParseAsJson(val) {
22
+ return !!StringRatchet.attemptJsonParse(val);
23
+ }
24
+ static allUnique(input) {
25
+ let rval = true;
26
+ if (input) {
27
+ const check = new Set();
28
+ for (let i = 0; i < input.length && rval; i++) {
29
+ const test = input.charAt(i);
30
+ rval = !check.has(test);
31
+ check.add(test);
32
+ }
33
+ }
34
+ return rval;
35
+ }
36
+ static allPermutationsOfLength(len, alphabet) {
37
+ const rval = [];
38
+ if (len > 0 && alphabet && alphabet.length > 0) {
39
+ RequireRatchet.true(StringRatchet.allUnique(alphabet), 'Alphabet must be unique');
40
+ const step = len === 1 ? [''] : StringRatchet.allPermutationsOfLength(len - 1, alphabet);
41
+ for (let i = 0; i < alphabet.length; i++) {
42
+ step.forEach((s) => rval.push(alphabet.charAt(i) + s));
43
+ }
44
+ }
45
+ return rval;
46
+ }
47
+ static createType4Guid() {
48
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
49
+ const r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;
50
+ return v.toString(16);
51
+ });
52
+ }
53
+ static createRandomHexString(len = 10) {
54
+ let r = '';
55
+ for (let i = 0; i < len; i++) {
56
+ r += Math.floor(Math.random() * 16).toString(16);
57
+ }
58
+ return r;
59
+ }
60
+ static canonicalize(value) {
61
+ let rval = value ? value.toLowerCase() : '';
62
+ rval = rval.replace(' ', '-');
63
+ StringRatchet.RFC_3986_RESERVED.forEach((s) => {
64
+ rval = rval.replace(s, '');
65
+ });
66
+ return rval;
67
+ }
68
+ static formatBytes(bytes, decimals = 2) {
69
+ if (bytes == 0)
70
+ return '0 Bytes';
71
+ const k = 1024, dm = decimals || 2, sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], i = Math.floor(Math.log(bytes) / Math.log(k));
72
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
73
+ }
74
+ static safeString(input) {
75
+ let rval = null;
76
+ if (input != null) {
77
+ const type = typeof input;
78
+ if (type == 'string') {
79
+ rval = input;
80
+ }
81
+ else {
82
+ rval = String(input);
83
+ }
84
+ }
85
+ return rval;
86
+ }
87
+ static stringContainsOnlyNumbers(input) {
88
+ const rval = /^[0-9]+$/.test(input);
89
+ return rval;
90
+ }
91
+ static stringContainsOnlyAlphanumeric(input) {
92
+ const rval = /^[0-9a-zA-Z]+$/.test(input);
93
+ return rval;
94
+ }
95
+ static stringContainsOnlyHex(input) {
96
+ const rval = /^[0-9a-fA-F]+$/.test(input);
97
+ return rval;
98
+ }
99
+ static stringContainsOnly(inVal, validCharsIn) {
100
+ const input = !inVal ? '' : inVal;
101
+ const validChars = !validCharsIn ? '' : validCharsIn;
102
+ let rval = true;
103
+ for (let i = 0; i < input.length && rval; i++) {
104
+ rval = validChars.indexOf(input.charAt(i)) >= 0;
105
+ }
106
+ return rval;
107
+ }
108
+ static obscure(input, prefixLength = 2, suffixLength = 2) {
109
+ if (!input) {
110
+ return input;
111
+ }
112
+ const len = input.length;
113
+ let pl = prefixLength;
114
+ let sl = suffixLength;
115
+ while (len > 0 && len < pl + sl + 1) {
116
+ pl = Math.max(0, pl - 1);
117
+ sl = Math.max(0, sl - 1);
118
+ }
119
+ const rem = len - (pl + sl);
120
+ let rval = '';
121
+ rval += input.substring(0, pl);
122
+ for (let i = 0; i < rem; i++) {
123
+ rval += '*';
124
+ }
125
+ rval += input.substring(len - sl);
126
+ return rval;
127
+ }
128
+ static leadingZeros(inVal, size) {
129
+ const pad = '00000000000000000000000000000000000000000000000000';
130
+ let negative = false;
131
+ let sVal = String(inVal);
132
+ if (sVal.startsWith('-')) {
133
+ negative = true;
134
+ sVal = sVal.substring(1);
135
+ }
136
+ if (size > pad.length) {
137
+ throw new Error('Cannot format number that large');
138
+ }
139
+ let rval = (pad + sVal).slice(-1 * size);
140
+ if (negative) {
141
+ rval = '-' + rval;
142
+ }
143
+ return rval;
144
+ }
145
+ static trimToEmpty(input) {
146
+ const t = input ? StringRatchet.safeString(input) : '';
147
+ return t.trim();
148
+ }
149
+ static trimToNull(input) {
150
+ const x = StringRatchet.trimToEmpty(input);
151
+ return x.length > 0 ? x : null;
152
+ }
153
+ static trimAllStringPropertiesToNullInPlace(input) {
154
+ return StringRatchet.trimAllStringPropertiesInPlace(input, false);
155
+ }
156
+ static trimAllStringPropertiesToEmptyInPlace(input) {
157
+ return StringRatchet.trimAllStringPropertiesInPlace(input, true);
158
+ }
159
+ static trimAllStringPropertiesInPlace(input, toEmpty) {
160
+ const dealKeys = Object.keys(input);
161
+ dealKeys.forEach((key) => {
162
+ const val = input[key];
163
+ if (val != null && typeof val === 'string') {
164
+ input[key] = toEmpty ? StringRatchet.trimToEmpty(input[key]) : StringRatchet.trimToNull(input[key]);
165
+ }
166
+ });
167
+ return input;
168
+ }
169
+ static stripNonNumeric(input) {
170
+ let rval = input;
171
+ if (input != null && !StringRatchet.stringContainsOnlyNumbers(input)) {
172
+ rval = '';
173
+ for (let i = 0; i < input.length; i++) {
174
+ const c = input.charAt(i);
175
+ if (StringRatchet.stringContainsOnlyNumbers(c) || (i === 0 && c === '-')) {
176
+ rval += c;
177
+ }
178
+ }
179
+ }
180
+ return rval;
181
+ }
182
+ static csvSafe(input) {
183
+ let rval = StringRatchet.trimToEmpty(StringRatchet.safeString(input));
184
+ rval.split('"').join('\\"');
185
+ if (rval.indexOf(',') !== -1 || rval.indexOf('"') !== -1 || rval.indexOf("'") !== -1) {
186
+ rval = '"' + rval + '"';
187
+ }
188
+ return rval;
189
+ }
190
+ }
191
+ StringRatchet.RFC_3986_RESERVED = ['!', '*', "'", '(', ')', ';', ':', '@', '&', '=', '+', '$', ',', '/', '?', '#', '[', ']', '%'];
@@ -0,0 +1,76 @@
1
+ import { DateTime } from 'luxon';
2
+ export class TimeZoneRatchet {
3
+ constructor(timezone) {
4
+ if (!timezone) {
5
+ throw 'Timezone cannot be null';
6
+ }
7
+ this.timezone = timezone;
8
+ }
9
+ currentHour() {
10
+ const rval = DateTime.local().setZone(this.timezone).hour;
11
+ return rval;
12
+ }
13
+ toEpochSeconds(dt) {
14
+ return Math.round(dt.toMillis() / 1000);
15
+ }
16
+ startOfTodayEpochSeconds() {
17
+ const startOfToday = this.toEpochSeconds(DateTime.local().setZone(this.timezone).set({ hour: 0, minute: 0, second: 0, millisecond: 0 }));
18
+ return startOfToday;
19
+ }
20
+ startOfMatchingDayEpochSeconds(inputTS) {
21
+ const startOfToday = this.toEpochSeconds(DateTime.fromMillis(inputTS).set({ hour: 0, minute: 0, second: 0, millisecond: 0 }));
22
+ return startOfToday;
23
+ }
24
+ startOfMatchingDayEpochMS(inputTS) {
25
+ return this.startOfMatchingDayEpochSeconds(inputTS) * 1000;
26
+ }
27
+ startOfCurrentHourEpochSeconds() {
28
+ const rval = this.toEpochSeconds(DateTime.local().setZone(this.timezone).set({ minute: 0, second: 0, millisecond: 0 }));
29
+ return rval;
30
+ }
31
+ startOfCurrentMinuteEpochSeconds() {
32
+ const rval = this.toEpochSeconds(DateTime.local().setZone(this.timezone).set({ second: 0, millisecond: 0 }));
33
+ return rval;
34
+ }
35
+ startOfCurrentSecondEpochSeconds() {
36
+ const rval = this.toEpochSeconds(DateTime.local().setZone(this.timezone).set({ millisecond: 0 }));
37
+ return rval;
38
+ }
39
+ startOfTodayEpochMS() {
40
+ const startOfToday = DateTime.local().setZone(this.timezone).set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).toMillis();
41
+ return startOfToday;
42
+ }
43
+ dailySlotCount(slotWidthMs) {
44
+ return Math.ceil(86400000 / slotWidthMs);
45
+ }
46
+ currentTimeSlotIdx(slotWidthMs) {
47
+ if (slotWidthMs < 1) {
48
+ throw new Error('Cannot process with slot less than one ms wide');
49
+ }
50
+ const startOfToday = this.startOfTodayEpochMS();
51
+ const now = new Date().getTime();
52
+ const delta = now - startOfToday;
53
+ const idx = Math.floor(delta / slotWidthMs);
54
+ return idx;
55
+ }
56
+ matchingTimeSlotIdx(timestamp, slotWidthMs) {
57
+ if (slotWidthMs < 1) {
58
+ throw new Error('Cannot process with slot less than one ms wide');
59
+ }
60
+ const startOfDay = this.startOfMatchingDayEpochMS(timestamp);
61
+ const delta = timestamp - startOfDay;
62
+ const idx = Math.floor(delta / slotWidthMs);
63
+ return idx;
64
+ }
65
+ startOfCurrentSlotEpochMS(slotWidthMs) {
66
+ const startOfToday = this.startOfTodayEpochMS();
67
+ const currentIdx = this.currentTimeSlotIdx(slotWidthMs);
68
+ return startOfToday + currentIdx * slotWidthMs;
69
+ }
70
+ startOfMatchingSlotEpochMS(timestamp, slotWidthMs) {
71
+ const startOfDay = this.startOfMatchingDayEpochMS(timestamp);
72
+ const currentIdx = this.matchingTimeSlotIdx(timestamp, slotWidthMs);
73
+ return startOfDay + currentIdx * slotWidthMs;
74
+ }
75
+ }
76
+ TimeZoneRatchet.PACIFIC = new TimeZoneRatchet('America/Los_Angeles');
@@ -0,0 +1,15 @@
1
+ import { Logger } from '../logger/logger';
2
+ import { LoggerLevelName } from '../logger/logger-level-name';
3
+ export class TimeoutToken {
4
+ constructor(title, timeoutMS) {
5
+ this.title = title;
6
+ this.timeoutMS = timeoutMS;
7
+ this.__timeoutTokenFlagField = true;
8
+ }
9
+ writeToLog(logLevel = LoggerLevelName.warn) {
10
+ Logger.logByLevel(logLevel, 'Timed out after %d ms waiting for results of %s', this.timeoutMS, this.title);
11
+ }
12
+ static isTimeoutToken(value) {
13
+ return !!value && !!value['__timeoutTokenFlagField'];
14
+ }
15
+ }
@@ -0,0 +1,66 @@
1
+ import { Logger } from '../logger/logger';
2
+ export class TransformRatchet {
3
+ static transform(toTransform, rules = []) {
4
+ return TransformRatchet.transformGeneric(toTransform, rules, false, null);
5
+ }
6
+ static transformGeneric(toTransform, rules = [], isKey, context) {
7
+ let rval = null;
8
+ const type = typeof toTransform;
9
+ switch (type) {
10
+ case 'undefined':
11
+ case 'symbol':
12
+ case 'function':
13
+ rval = toTransform;
14
+ break;
15
+ case 'number':
16
+ case 'string':
17
+ case 'boolean':
18
+ rval = TransformRatchet.applyTransformToPrimitive(toTransform, rules, isKey, context);
19
+ break;
20
+ case 'object':
21
+ rval = TransformRatchet.applyTransformToObject(toTransform, rules, isKey, context);
22
+ break;
23
+ default:
24
+ throw new Error('Unrecognized type ' + type);
25
+ }
26
+ return rval;
27
+ }
28
+ static applyTransformToObject(toTransform, rules = [], isKey, context = null) {
29
+ Logger.silly('Tranform: %j, %s, %j', toTransform, isKey, context);
30
+ let rval = null;
31
+ if (toTransform != null) {
32
+ if (Array.isArray(toTransform)) {
33
+ rval = [];
34
+ toTransform.forEach((val) => {
35
+ const newVal = TransformRatchet.transformGeneric(val, rules, isKey, toTransform);
36
+ if (newVal != null) {
37
+ rval.push(newVal);
38
+ }
39
+ });
40
+ }
41
+ else {
42
+ rval = {};
43
+ Object.keys(toTransform).forEach((k) => {
44
+ const oldValue = toTransform[k];
45
+ const newKey = TransformRatchet.applyTransformToPrimitive(k, rules, true, toTransform);
46
+ if (newKey != null) {
47
+ let newValue = TransformRatchet.transformGeneric(oldValue, rules, false, toTransform);
48
+ newValue = TransformRatchet.applyTransformToPrimitive(newValue, rules, false, toTransform);
49
+ if (newValue != null) {
50
+ rval[newKey] = newValue;
51
+ }
52
+ }
53
+ });
54
+ rval = TransformRatchet.applyTransformToPrimitive(rval, rules, false, toTransform);
55
+ }
56
+ }
57
+ return rval;
58
+ }
59
+ static applyTransformToPrimitive(toTransform, rules = [], isKey, context) {
60
+ let rval = toTransform;
61
+ rules.forEach((r) => {
62
+ rval = rval == null ? null : r.transform(rval, isKey, context);
63
+ });
64
+ return rval;
65
+ }
66
+ }
@@ -0,0 +1,13 @@
1
+ import util from 'util';
2
+ export class ClassicSingleLineLogMessageFormatter {
3
+ formatMessage(msg, meta) {
4
+ let tmp = null;
5
+ if (msg) {
6
+ tmp = '';
7
+ tmp += meta.options.trace ? meta.options.trace + ' ' : '';
8
+ tmp += '[' + msg.lvl + '] ';
9
+ tmp += util.format(msg.messageSource, ...msg.subsVars);
10
+ }
11
+ return tmp;
12
+ }
13
+ }
@@ -0,0 +1,47 @@
1
+ export class LogMessageBuilder {
2
+ constructor(lvl, messageSource) {
3
+ if (!lvl) {
4
+ throw Error('Cannot set level to null/undefined');
5
+ }
6
+ this.wrapped = { lvl: lvl, timestamp: Date.now(), messageSource: messageSource };
7
+ }
8
+ clone() {
9
+ const rval = new LogMessageBuilder(this.wrapped.lvl, this.wrapped.messageSource);
10
+ rval.wrapped = Object.assign({}, this.wrapped);
11
+ return rval;
12
+ }
13
+ level(lvl) {
14
+ if (!lvl) {
15
+ throw Error('Cannot set level to null/undefined');
16
+ }
17
+ this.wrapped.lvl = lvl;
18
+ return this;
19
+ }
20
+ timestamp(val) {
21
+ if (!val) {
22
+ throw Error('Cannot set timestamp to null/undefined');
23
+ }
24
+ this.wrapped.timestamp = val;
25
+ return this;
26
+ }
27
+ messageSource(val) {
28
+ this.wrapped.messageSource = val;
29
+ return this;
30
+ }
31
+ subVars(val) {
32
+ this.wrapped.subsVars = val || [];
33
+ return this;
34
+ }
35
+ params(val) {
36
+ this.wrapped.params = val || {};
37
+ return this;
38
+ }
39
+ p(name, value) {
40
+ this.wrapped.params = this.wrapped.params || {};
41
+ this.wrapped.params[name] = value;
42
+ return this;
43
+ }
44
+ toMessage() {
45
+ return Object.assign({}, this.wrapped);
46
+ }
47
+ }
@@ -0,0 +1,6 @@
1
+ export var LogMessageFormatType;
2
+ (function (LogMessageFormatType) {
3
+ LogMessageFormatType["ClassicSingleLine"] = "ClassicSingleLine";
4
+ LogMessageFormatType["StructuredJson"] = "StructuredJson";
5
+ LogMessageFormatType["None"] = "None";
6
+ })(LogMessageFormatType || (LogMessageFormatType = {}));
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,201 @@
1
+ import { LoggerRingBuffer } from './logger-ring-buffer';
2
+ import { LoggerLevelName } from './logger-level-name';
3
+ import { LoggerUtil } from './logger-util';
4
+ import { LogMessageFormatType } from './log-message-format-type';
5
+ import { ClassicSingleLineLogMessageFormatter } from './classic-single-line-log-message-formatter';
6
+ import { NoneLogMessageFormatter } from './none-log-message-formatter';
7
+ import { StructuredJsonLogMessageFormatter } from './structured-json-log-message-formatter';
8
+ import { StringRatchet } from '../lang/string-ratchet';
9
+ export class LoggerInstance {
10
+ constructor(loggerInstanceName = 'default', inOptions) {
11
+ this.loggerInstanceName = loggerInstanceName;
12
+ this.options = inOptions;
13
+ }
14
+ addPreProcessor(proc) {
15
+ if (proc) {
16
+ this._options.preProcessors = this._options.preProcessors || [];
17
+ this._options.preProcessors.push(proc);
18
+ }
19
+ return Object.assign([], this._options.preProcessors);
20
+ }
21
+ get ringBuffer() {
22
+ return this._ringBuffer;
23
+ }
24
+ dumpConfigurationIntoLog() {
25
+ this.error('ERROR enabled');
26
+ this.warn('WARN enabled');
27
+ this.info('INFO enabled');
28
+ this.verbose('VERBOSE enabled');
29
+ this.debug('DEBUG enabled');
30
+ this.silly('SILLY enabled');
31
+ }
32
+ dumpOptionsIntoLog() {
33
+ this.info('Options: %j', this.options);
34
+ if (this?.options?.preProcessors?.length) {
35
+ const labels = this.options.preProcessors.map((p) => StringRatchet.trimToNull(p.label()) || 'Unlabelled');
36
+ this.info('Preprocessors: %j', labels);
37
+ }
38
+ }
39
+ changeRingBufferSize(newSize) {
40
+ this._ringBuffer = null;
41
+ if (newSize) {
42
+ this._ringBuffer = new LoggerRingBuffer(newSize);
43
+ this._options.ringBufferSize = newSize;
44
+ }
45
+ }
46
+ updateTracePrefix(newValue) {
47
+ this._options.trace = newValue;
48
+ }
49
+ get options() {
50
+ return Object.assign({}, this._options);
51
+ }
52
+ set options(newOpts) {
53
+ this._options = Object.assign({}, newOpts);
54
+ if (this._options.ringBufferSize) {
55
+ this._ringBuffer = new LoggerRingBuffer(this._options.ringBufferSize);
56
+ }
57
+ switch (this._options.formatType) {
58
+ case LogMessageFormatType.None:
59
+ this._formatter = new NoneLogMessageFormatter();
60
+ break;
61
+ case LogMessageFormatType.StructuredJson:
62
+ this._formatter = new StructuredJsonLogMessageFormatter();
63
+ break;
64
+ default:
65
+ this._formatter = new ClassicSingleLineLogMessageFormatter();
66
+ break;
67
+ }
68
+ this._level = this._options.initialLevel;
69
+ this._handlerFunctionMap = LoggerUtil.handlerFunctionMap(this._options.outputFunction);
70
+ const oldId = this._loggerMeta ? this._loggerMeta.loggerInstanceId : null;
71
+ this._loggerMeta = {
72
+ options: this._options,
73
+ loggerInstanceName: this.loggerInstanceName,
74
+ loggerInstanceId: oldId || StringRatchet.createRandomHexString(8),
75
+ };
76
+ }
77
+ get level() {
78
+ return this._level;
79
+ }
80
+ set level(newLevel) {
81
+ if (!newLevel) {
82
+ throw new Error('Cannot set level to null/undefined');
83
+ }
84
+ this._level = newLevel;
85
+ }
86
+ consoleLogPassThru(level, ...input) {
87
+ if (LoggerUtil.levelIsEnabled(level, this._level)) {
88
+ let passThruPrefix = this._options.trace || '';
89
+ passThruPrefix += '[' + level + '] ';
90
+ input.unshift(passThruPrefix);
91
+ const fn = this._handlerFunctionMap.get(level) || LoggerUtil.defaultHandlerFunction;
92
+ fn(...input);
93
+ }
94
+ }
95
+ createLogMessage(level, params, format, ...input) {
96
+ const rval = {
97
+ lvl: level,
98
+ timestamp: Date.now(),
99
+ messageSource: format,
100
+ subsVars: input,
101
+ params: params,
102
+ };
103
+ return rval;
104
+ }
105
+ formatMessage(msg) {
106
+ const rval = msg ? this._formatter.formatMessage(msg, this._loggerMeta) : null;
107
+ return rval;
108
+ }
109
+ formatMessages(msgs) {
110
+ const rval = (msgs || []).map((m) => this.formatMessage(m)).filter((m) => !!m);
111
+ return rval;
112
+ }
113
+ recordMessageBuilder(msgBuild) {
114
+ return this.recordMessage(msgBuild.toMessage());
115
+ }
116
+ recordMessage(inMsg) {
117
+ let rval = null;
118
+ if (LoggerUtil.levelIsEnabled(inMsg.lvl, this._level)) {
119
+ let msg = Object.assign({}, inMsg);
120
+ if (this._options.preProcessors?.length) {
121
+ for (let i = 0; i < this._options.preProcessors.length; i++) {
122
+ msg = this._options.preProcessors[i].process(msg);
123
+ }
124
+ }
125
+ rval = this.formatMessage(msg);
126
+ if (rval) {
127
+ const fn = this._handlerFunctionMap.get(msg.lvl) || LoggerUtil.defaultHandlerFunction;
128
+ fn(rval);
129
+ if (this._ringBuffer) {
130
+ this._ringBuffer.addToRingBuffer(msg);
131
+ }
132
+ }
133
+ }
134
+ else {
135
+ }
136
+ return rval;
137
+ }
138
+ error(format, ...input) {
139
+ const msg = this.createLogMessage(LoggerLevelName.error, {}, format, ...input);
140
+ return this.recordMessage(msg);
141
+ }
142
+ errorP(...input) {
143
+ this.consoleLogPassThru(LoggerLevelName.error, ...input);
144
+ }
145
+ warn(format, ...input) {
146
+ const msg = this.createLogMessage(LoggerLevelName.warn, {}, format, ...input);
147
+ return this.recordMessage(msg);
148
+ }
149
+ warnP(...input) {
150
+ this.consoleLogPassThru(LoggerLevelName.warn, ...input);
151
+ }
152
+ info(format, ...input) {
153
+ const msg = this.createLogMessage(LoggerLevelName.info, {}, format, ...input);
154
+ return this.recordMessage(msg);
155
+ }
156
+ infoP(...input) {
157
+ this.consoleLogPassThru(LoggerLevelName.info, ...input);
158
+ }
159
+ verbose(format, ...input) {
160
+ const msg = this.createLogMessage(LoggerLevelName.verbose, {}, format, ...input);
161
+ return this.recordMessage(msg);
162
+ }
163
+ verboseP(...input) {
164
+ this.consoleLogPassThru(LoggerLevelName.verbose, ...input);
165
+ }
166
+ debug(format, ...input) {
167
+ const msg = this.createLogMessage(LoggerLevelName.debug, {}, format, ...input);
168
+ return this.recordMessage(msg);
169
+ }
170
+ debugP(...input) {
171
+ this.consoleLogPassThru(LoggerLevelName.debug, ...input);
172
+ }
173
+ silly(format, ...input) {
174
+ const msg = this.createLogMessage(LoggerLevelName.silly, {}, format, ...input);
175
+ return this.recordMessage(msg);
176
+ }
177
+ sillyP(...input) {
178
+ this.consoleLogPassThru(LoggerLevelName.silly, ...input);
179
+ }
180
+ logByLevel(level, format, ...input) {
181
+ const msg = this.createLogMessage(level, {}, format, ...input);
182
+ this.recordMessage(msg);
183
+ }
184
+ importMessages(msgs, prefixIn = '', addTimestamp = true) {
185
+ const prefix = prefixIn || '';
186
+ if (msgs && msgs.length > 0) {
187
+ this.silly('Received import data : %d msgs', msgs.length);
188
+ msgs.forEach((m) => {
189
+ if (m.messageSource) {
190
+ let mOut = prefix;
191
+ if (addTimestamp) {
192
+ const ts = String(new Date()).substring(15, 24);
193
+ mOut += ' (' + ts + ') : ';
194
+ mOut += m.messageSource;
195
+ }
196
+ this.logByLevel(m.lvl, mOut);
197
+ }
198
+ });
199
+ }
200
+ }
201
+ }
@@ -0,0 +1,9 @@
1
+ export var LoggerLevelName;
2
+ (function (LoggerLevelName) {
3
+ LoggerLevelName["error"] = "error";
4
+ LoggerLevelName["warn"] = "warn";
5
+ LoggerLevelName["info"] = "info";
6
+ LoggerLevelName["verbose"] = "verbose";
7
+ LoggerLevelName["debug"] = "debug";
8
+ LoggerLevelName["silly"] = "silly";
9
+ })(LoggerLevelName || (LoggerLevelName = {}));
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export var LoggerOutputFunction;
2
+ (function (LoggerOutputFunction) {
3
+ LoggerOutputFunction["Console"] = "Console";
4
+ LoggerOutputFunction["ConsoleNoDebug"] = "ConsoleNoDebug";
5
+ LoggerOutputFunction["StdOut"] = "StdOut";
6
+ })(LoggerOutputFunction || (LoggerOutputFunction = {}));