@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.
- package/dist/cjs/2d/line-2d.js +2 -0
- package/dist/cjs/2d/plane-2d.js +2 -0
- package/dist/cjs/2d/point-2d.js +2 -0
- package/dist/cjs/2d/poly-line-2d.js +2 -0
- package/dist/cjs/2d/ratchet-2d.js +250 -0
- package/dist/cjs/build/build-information.js +2 -0
- package/dist/cjs/build/ratchet-common-info.js +18 -0
- package/dist/cjs/histogram/histogram-entry.js +2 -0
- package/dist/cjs/histogram/histogram.js +54 -0
- package/dist/cjs/index.js +74 -0
- package/dist/cjs/jwt/common-jwt-token.js +2 -0
- package/dist/cjs/jwt/expired-jwt-handling.js +9 -0
- package/dist/cjs/jwt/jwt-ratchet-like.js +2 -0
- package/dist/cjs/jwt/jwt-ratchet.js +164 -0
- package/dist/cjs/jwt/jwt-token-base.js +2 -0
- package/dist/cjs/lang/array-ratchet.js +87 -0
- package/dist/cjs/lang/base64-ratchet.js +49 -0
- package/dist/cjs/lang/boolean-ratchet.js +49 -0
- package/dist/cjs/lang/composite-last-success-provider.js +28 -0
- package/dist/cjs/lang/date-ratchet.js +33 -0
- package/dist/cjs/lang/duration-ratchet.js +46 -0
- package/dist/cjs/lang/enum-ratchet.js +34 -0
- package/dist/cjs/lang/error-ratchet.js +49 -0
- package/dist/cjs/lang/expiring-object.js +68 -0
- package/dist/cjs/lang/geolocation-ratchet.js +267 -0
- package/dist/cjs/lang/global-ratchet.js +48 -0
- package/dist/cjs/lang/key-value.js +6 -0
- package/dist/cjs/lang/last-success-provider.js +2 -0
- package/dist/cjs/lang/map-ratchet.js +168 -0
- package/dist/cjs/lang/no.js +8 -0
- package/dist/cjs/lang/number-ratchet.js +156 -0
- package/dist/cjs/lang/parsed-url.js +2 -0
- package/dist/cjs/lang/promise-ratchet.js +142 -0
- package/dist/cjs/lang/require-ratchet.js +60 -0
- package/dist/cjs/lang/stop-watch.js +117 -0
- package/dist/cjs/lang/string-ratchet.js +195 -0
- package/dist/cjs/lang/time-zone-ratchet.js +80 -0
- package/dist/cjs/lang/timeout-token.js +19 -0
- package/dist/cjs/lang/transform-ratchet.js +70 -0
- package/dist/cjs/logger/classic-single-line-log-message-formatter.js +18 -0
- package/dist/cjs/logger/log-message-builder.js +51 -0
- package/dist/cjs/logger/log-message-format-type.js +9 -0
- package/dist/cjs/logger/log-message-formatter.js +2 -0
- package/dist/cjs/logger/log-message-processor.js +2 -0
- package/dist/cjs/logger/log-message.js +2 -0
- package/dist/cjs/logger/log-snapshot.js +2 -0
- package/dist/cjs/logger/logger-instance.js +207 -0
- package/dist/cjs/logger/logger-level-name.js +12 -0
- package/dist/cjs/logger/logger-meta.js +2 -0
- package/dist/cjs/logger/logger-options.js +2 -0
- package/dist/cjs/logger/logger-output-function.js +9 -0
- package/dist/cjs/logger/logger-ring-buffer.js +76 -0
- package/dist/cjs/logger/logger-util.js +49 -0
- package/dist/cjs/logger/logger.js +139 -0
- package/dist/cjs/logger/none-log-message-formatter.js +9 -0
- package/dist/cjs/logger/structured-json-log-message-formatter.js +24 -0
- package/dist/cjs/network/browser-local-ip-provider.js +25 -0
- package/dist/cjs/network/fixed-local-ip-provider.js +12 -0
- package/dist/cjs/network/local-ip-provider.js +2 -0
- package/dist/cjs/network/network-ratchet.js +106 -0
- package/dist/cjs/stream/buffer-writable.js +20 -0
- package/dist/cjs/stream/stream-ratchet.js +72 -0
- package/dist/cjs/stream/string-writable.js +18 -0
- package/dist/cjs/third-party/google/google-recaptcha-ratchet.js +33 -0
- package/dist/cjs/third-party/twilio/twilio-ratchet.js +75 -0
- package/dist/cjs/transform/built-in-transforms.js +195 -0
- package/dist/cjs/transform/transform-rule.js +2 -0
- package/dist/cjs/tx/transaction-configuration.js +2 -0
- package/dist/cjs/tx/transaction-final-state.js +9 -0
- package/dist/cjs/tx/transaction-ratchet.js +80 -0
- package/dist/cjs/tx/transaction-result.js +2 -0
- package/dist/cjs/tx/transaction-step.js +2 -0
- package/dist/es/2d/line-2d.js +1 -0
- package/dist/es/2d/plane-2d.js +1 -0
- package/dist/es/2d/point-2d.js +1 -0
- package/dist/es/2d/poly-line-2d.js +1 -0
- package/dist/es/2d/ratchet-2d.js +245 -0
- package/dist/es/build/build-information.js +1 -0
- package/dist/es/build/ratchet-common-info.js +14 -0
- package/dist/es/histogram/histogram-entry.js +1 -0
- package/dist/es/histogram/histogram.js +50 -0
- package/dist/es/index.js +71 -0
- package/dist/es/jwt/common-jwt-token.js +1 -0
- package/dist/es/jwt/expired-jwt-handling.js +6 -0
- package/dist/es/jwt/jwt-ratchet-like.js +1 -0
- package/dist/es/jwt/jwt-ratchet.js +159 -0
- package/dist/es/jwt/jwt-token-base.js +1 -0
- package/dist/es/lang/array-ratchet.js +83 -0
- package/dist/es/lang/base64-ratchet.js +45 -0
- package/dist/es/lang/boolean-ratchet.js +45 -0
- package/dist/es/lang/composite-last-success-provider.js +24 -0
- package/dist/es/lang/date-ratchet.js +29 -0
- package/dist/es/lang/duration-ratchet.js +42 -0
- package/dist/es/lang/enum-ratchet.js +30 -0
- package/dist/es/lang/error-ratchet.js +44 -0
- package/dist/es/lang/expiring-object.js +63 -0
- package/dist/es/lang/geolocation-ratchet.js +263 -0
- package/dist/es/lang/global-ratchet.js +43 -0
- package/dist/es/lang/key-value.js +2 -0
- package/dist/es/lang/last-success-provider.js +1 -0
- package/dist/es/lang/map-ratchet.js +164 -0
- package/dist/es/lang/no.js +4 -0
- package/dist/es/lang/number-ratchet.js +152 -0
- package/dist/es/lang/parsed-url.js +1 -0
- package/dist/es/lang/promise-ratchet.js +138 -0
- package/dist/es/lang/require-ratchet.js +56 -0
- package/dist/es/lang/stop-watch.js +113 -0
- package/dist/es/lang/string-ratchet.js +191 -0
- package/dist/es/lang/time-zone-ratchet.js +76 -0
- package/dist/es/lang/timeout-token.js +15 -0
- package/dist/es/lang/transform-ratchet.js +66 -0
- package/dist/es/logger/classic-single-line-log-message-formatter.js +13 -0
- package/dist/es/logger/log-message-builder.js +47 -0
- package/dist/es/logger/log-message-format-type.js +6 -0
- package/dist/es/logger/log-message-formatter.js +1 -0
- package/dist/es/logger/log-message-processor.js +1 -0
- package/dist/es/logger/log-message.js +1 -0
- package/dist/es/logger/log-snapshot.js +1 -0
- package/dist/es/logger/logger-instance.js +201 -0
- package/dist/es/logger/logger-level-name.js +9 -0
- package/dist/es/logger/logger-meta.js +1 -0
- package/dist/es/logger/logger-options.js +1 -0
- package/dist/es/logger/logger-output-function.js +6 -0
- package/dist/es/logger/logger-ring-buffer.js +72 -0
- package/dist/es/logger/logger-util.js +44 -0
- package/dist/es/logger/logger.js +134 -0
- package/dist/es/logger/none-log-message-formatter.js +5 -0
- package/dist/es/logger/structured-json-log-message-formatter.js +19 -0
- package/dist/es/network/browser-local-ip-provider.js +21 -0
- package/dist/es/network/fixed-local-ip-provider.js +8 -0
- package/dist/es/network/local-ip-provider.js +1 -0
- package/dist/es/network/network-ratchet.js +102 -0
- package/dist/es/stream/buffer-writable.js +16 -0
- package/dist/es/stream/stream-ratchet.js +68 -0
- package/dist/es/stream/string-writable.js +14 -0
- package/dist/es/third-party/google/google-recaptcha-ratchet.js +28 -0
- package/dist/es/third-party/twilio/twilio-ratchet.js +70 -0
- package/dist/es/transform/built-in-transforms.js +191 -0
- package/dist/es/transform/transform-rule.js +1 -0
- package/dist/es/tx/transaction-configuration.js +1 -0
- package/dist/es/tx/transaction-final-state.js +6 -0
- package/dist/es/tx/transaction-ratchet.js +76 -0
- package/dist/es/tx/transaction-result.js +1 -0
- package/dist/es/tx/transaction-step.js +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.es.tsbuildinfo +1 -0
- package/dist/tsconfig.types.tsbuildinfo +1 -0
- package/dist/types/2d/line-2d.d.ts +5 -0
- package/dist/types/2d/plane-2d.d.ts +6 -0
- package/dist/types/2d/point-2d.d.ts +4 -0
- package/dist/types/2d/poly-line-2d.d.ts +4 -0
- package/dist/types/2d/ratchet-2d.d.ts +37 -0
- package/dist/types/build/build-information.d.ts +8 -0
- package/dist/types/build/ratchet-common-info.d.ts +5 -0
- package/dist/types/histogram/histogram-entry.d.ts +4 -0
- package/dist/types/histogram/histogram.d.ts +15 -0
- package/dist/types/index.d.ts +74 -0
- package/dist/types/jwt/common-jwt-token.d.ts +17 -0
- package/dist/types/jwt/expired-jwt-handling.d.ts +5 -0
- package/dist/types/jwt/jwt-ratchet-like.d.ts +18 -0
- package/dist/types/jwt/jwt-ratchet.d.ts +39 -0
- package/dist/types/jwt/jwt-token-base.d.ts +13 -0
- package/dist/types/lang/array-ratchet.d.ts +30 -0
- package/dist/types/lang/base64-ratchet.d.ts +10 -0
- package/dist/types/lang/boolean-ratchet.d.ts +7 -0
- package/dist/types/lang/composite-last-success-provider.d.ts +8 -0
- package/dist/types/lang/date-ratchet.d.ts +11 -0
- package/dist/types/lang/duration-ratchet.d.ts +7 -0
- package/dist/types/lang/enum-ratchet.d.ts +12 -0
- package/dist/types/lang/error-ratchet.d.ts +6 -0
- package/dist/types/lang/expiring-object.d.ts +20 -0
- package/dist/types/lang/geolocation-ratchet.d.ts +40 -0
- package/dist/types/lang/global-ratchet.d.ts +6 -0
- package/dist/types/lang/key-value.d.ts +4 -0
- package/dist/types/lang/last-success-provider.d.ts +4 -0
- package/dist/types/lang/map-ratchet.d.ts +15 -0
- package/dist/types/lang/no.d.ts +3 -0
- package/dist/types/lang/number-ratchet.d.ts +20 -0
- package/dist/types/lang/parsed-url.d.ts +10 -0
- package/dist/types/lang/promise-ratchet.d.ts +32 -0
- package/dist/types/lang/require-ratchet.d.ts +11 -0
- package/dist/types/lang/stop-watch.d.ts +17 -0
- package/dist/types/lang/string-ratchet.d.ts +27 -0
- package/dist/types/lang/time-zone-ratchet.d.ts +50 -0
- package/dist/types/lang/timeout-token.d.ts +9 -0
- package/dist/types/lang/transform-ratchet.d.ts +7 -0
- package/dist/types/logger/classic-single-line-log-message-formatter.d.ts +6 -0
- package/dist/types/logger/log-message-builder.d.ts +14 -0
- package/dist/types/logger/log-message-format-type.d.ts +5 -0
- package/dist/types/logger/log-message-formatter.d.ts +5 -0
- package/dist/types/logger/log-message-processor.d.ts +5 -0
- package/dist/types/logger/log-message.d.ts +8 -0
- package/dist/types/logger/log-snapshot.d.ts +5 -0
- package/dist/types/logger/logger-instance.d.ts +46 -0
- package/dist/types/logger/logger-level-name.d.ts +8 -0
- package/dist/types/logger/logger-meta.d.ts +6 -0
- package/dist/types/logger/logger-options.d.ts +13 -0
- package/dist/types/logger/logger-output-function.d.ts +5 -0
- package/dist/types/logger/logger-ring-buffer.d.ts +18 -0
- package/dist/types/logger/logger-util.d.ts +8 -0
- package/dist/types/logger/logger.d.ts +52 -0
- package/dist/types/logger/none-log-message-formatter.d.ts +6 -0
- package/dist/types/logger/structured-json-log-message-formatter.d.ts +6 -0
- package/dist/types/network/browser-local-ip-provider.d.ts +7 -0
- package/dist/types/network/fixed-local-ip-provider.d.ts +6 -0
- package/dist/types/network/local-ip-provider.d.ts +4 -0
- package/dist/types/network/network-ratchet.d.ts +9 -0
- package/dist/types/stream/buffer-writable.d.ts +9 -0
- package/dist/types/stream/stream-ratchet.d.ts +12 -0
- package/dist/types/stream/string-writable.d.ts +8 -0
- package/dist/types/third-party/google/google-recaptcha-ratchet.d.ts +4 -0
- package/dist/types/third-party/twilio/twilio-ratchet.d.ts +15 -0
- package/dist/types/transform/built-in-transforms.d.ts +18 -0
- package/dist/types/transform/transform-rule.d.ts +3 -0
- package/dist/types/tx/transaction-configuration.d.ts +7 -0
- package/dist/types/tx/transaction-final-state.d.ts +5 -0
- package/dist/types/tx/transaction-ratchet.d.ts +6 -0
- package/dist/types/tx/transaction-result.d.ts +9 -0
- package/dist/types/tx/transaction-step.d.ts +5 -0
- package/package.json +65 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PromiseRatchet = void 0;
|
|
4
|
+
const logger_1 = require("../logger/logger");
|
|
5
|
+
const array_ratchet_1 = require("./array-ratchet");
|
|
6
|
+
const timeout_token_1 = require("./timeout-token");
|
|
7
|
+
const stop_watch_1 = require("./stop-watch");
|
|
8
|
+
const logger_level_name_1 = require("../logger/logger-level-name");
|
|
9
|
+
class PromiseRatchet {
|
|
10
|
+
static resolveOnEvent(evtSrc, okEvtNames, errEvtNames = [], rval = null) {
|
|
11
|
+
if (!evtSrc || !okEvtNames || okEvtNames.length === 0 || !evtSrc['on']) {
|
|
12
|
+
Promise.reject('Cannot continue - missing source object or name, or the object is not an event source');
|
|
13
|
+
}
|
|
14
|
+
return new Promise((res, rej) => {
|
|
15
|
+
okEvtNames.forEach((e) => {
|
|
16
|
+
evtSrc.on(e, () => {
|
|
17
|
+
res(rval);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
if (!!errEvtNames) {
|
|
21
|
+
errEvtNames.forEach((e) => {
|
|
22
|
+
evtSrc.on(e, (err) => {
|
|
23
|
+
rej(err);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
static timeout(srcPromise, title, timeoutMS) {
|
|
30
|
+
return Promise.race([srcPromise, PromiseRatchet.createTimeoutPromise(title, timeoutMS)]);
|
|
31
|
+
}
|
|
32
|
+
static createTimeoutPromise(title, timeoutMS) {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const id = setTimeout(() => {
|
|
35
|
+
clearTimeout(id);
|
|
36
|
+
const rval = new timeout_token_1.TimeoutToken(title, timeoutMS);
|
|
37
|
+
resolve(rval);
|
|
38
|
+
}, timeoutMS);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
static async wait(time) {
|
|
42
|
+
await PromiseRatchet.createTimeoutPromise('Wait ' + time, time);
|
|
43
|
+
logger_1.Logger.silly('Finished wait of %d ms', time);
|
|
44
|
+
}
|
|
45
|
+
static dumpResult(result, autoDebug = false) {
|
|
46
|
+
logger_1.Logger.info('Success, result was : \n\n%s\n\n', JSON.stringify(result));
|
|
47
|
+
if (autoDebug) {
|
|
48
|
+
debugger;
|
|
49
|
+
}
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
static dumpError(err, autoDebug = false) {
|
|
53
|
+
logger_1.Logger.warn('Failure, err was : \n\n%s\n\n -- \n\n%s\n\n', JSON.stringify(err), String(err));
|
|
54
|
+
console.trace();
|
|
55
|
+
if (autoDebug) {
|
|
56
|
+
debugger;
|
|
57
|
+
}
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
static logErrorAndReturnNull(err, autoDebug = false) {
|
|
61
|
+
logger_1.Logger.warn('Failure, err was : \n\n%s\n\n -- \n\n%s\n\n', JSON.stringify(err), String(err));
|
|
62
|
+
if (autoDebug) {
|
|
63
|
+
debugger;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
static runPromiseAndDump(promise) {
|
|
68
|
+
promise.then(PromiseRatchet.dumpResult).catch(PromiseRatchet.dumpError);
|
|
69
|
+
}
|
|
70
|
+
static async waitFor(testFunction, expectedValue, intervalMS, maxCycles, label = 'waitFor', count = 0) {
|
|
71
|
+
if (expectedValue == null || intervalMS < 50 || maxCycles < 1 || count < 0 || typeof testFunction != 'function') {
|
|
72
|
+
logger_1.Logger.warn('%s: Invalid configuration for waitFor - exiting immediately', label);
|
|
73
|
+
logger_1.Logger.warn('ExpectedValue : %s ; interval: %d ; maxCycles: %d ; test : %s', expectedValue, intervalMS, maxCycles, typeof testFunction);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
let curVal = null;
|
|
77
|
+
try {
|
|
78
|
+
curVal = testFunction(count);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
logger_1.Logger.warn('%s: Caught error while waiting, giving up', label);
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
if (curVal === null) {
|
|
85
|
+
logger_1.Logger.debug('%s:CurVal was null - aborting', label);
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
else if (curVal == expectedValue) {
|
|
89
|
+
logger_1.Logger.debug('%s:Found expected value', label);
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
else if (count > maxCycles) {
|
|
93
|
+
logger_1.Logger.debug('%s:Exceeded max cycles, giving up', label);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
logger_1.Logger.debug('%s : value not reached yet, waiting (count = %d of %d)', label, count, maxCycles);
|
|
98
|
+
await PromiseRatchet.wait(intervalMS);
|
|
99
|
+
return PromiseRatchet.waitFor(testFunction, expectedValue, intervalMS, maxCycles, label, count + 1);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
static async runBoundedParallel(promiseFn, params, context, maxConcurrent = 1, logLevel = logger_level_name_1.LoggerLevelName.debug) {
|
|
103
|
+
const sw = new stop_watch_1.StopWatch();
|
|
104
|
+
let rval = [];
|
|
105
|
+
let remain = params;
|
|
106
|
+
logger_1.Logger.logByLevel(logLevel, 'Processing %d total elements %d at a time', params.length, maxConcurrent);
|
|
107
|
+
const ctx = context || this;
|
|
108
|
+
let processed = 0;
|
|
109
|
+
const totalCount = remain.length;
|
|
110
|
+
while (remain.length > 0) {
|
|
111
|
+
const curBatch = remain.slice(0, Math.min(remain.length, maxConcurrent));
|
|
112
|
+
remain = remain.slice(curBatch.length);
|
|
113
|
+
const proms = curBatch.map((c) => promiseFn.apply(ctx, c));
|
|
114
|
+
const output = await Promise.all(proms);
|
|
115
|
+
processed += proms.length;
|
|
116
|
+
rval = rval.concat(output);
|
|
117
|
+
const pct = processed / totalCount;
|
|
118
|
+
logger_1.Logger.logByLevel(logLevel, '%d elements remain : %s', remain.length, sw.dumpExpected(pct));
|
|
119
|
+
}
|
|
120
|
+
sw.log();
|
|
121
|
+
return rval;
|
|
122
|
+
}
|
|
123
|
+
static async runBoundedParallelSingleParam(promiseFn, params, context, maxConcurrent = 1, logLevel = logger_level_name_1.LoggerLevelName.debug) {
|
|
124
|
+
const wrappedParams = array_ratchet_1.ArrayRatchet.wrapElementsInArray(params);
|
|
125
|
+
return PromiseRatchet.runBoundedParallel(promiseFn, wrappedParams, context, maxConcurrent, logLevel);
|
|
126
|
+
}
|
|
127
|
+
static async asyncForEachSerial(array, callback) {
|
|
128
|
+
for (let index = 0; index < array.length; index++) {
|
|
129
|
+
await callback(array[index], index, array);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
static async asyncForEachParallel(array, callback) {
|
|
133
|
+
const proms = [];
|
|
134
|
+
for (let index = 0; index < array.length; index++) {
|
|
135
|
+
proms.push(callback(array[index], index, array));
|
|
136
|
+
}
|
|
137
|
+
await Promise.all(proms);
|
|
138
|
+
}
|
|
139
|
+
constructor() {
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.PromiseRatchet = PromiseRatchet;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequireRatchet = void 0;
|
|
4
|
+
const error_ratchet_1 = require("./error-ratchet");
|
|
5
|
+
class RequireRatchet {
|
|
6
|
+
static isNullOrUndefined(ob) {
|
|
7
|
+
return ob === null || ob === undefined;
|
|
8
|
+
}
|
|
9
|
+
static notNullOrUndefined(ob, name = 'object') {
|
|
10
|
+
if (RequireRatchet.isNullOrUndefined(ob)) {
|
|
11
|
+
throw new Error(name + ' may not be null or undefined');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
static notNullUndefinedOrOnlyWhitespaceString(ob, name = 'string') {
|
|
15
|
+
if (RequireRatchet.isNullOrUndefined(ob) || ob.trim() === '') {
|
|
16
|
+
throw new Error(name + ' may not be null or undefined or only whitespace string');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
static notNullUndefinedOrEmptyArray(ob, name = 'string') {
|
|
20
|
+
if (RequireRatchet.isNullOrUndefined(ob) || ob.length === 0) {
|
|
21
|
+
throw new Error(name + ' may not be null or undefined or an empty array');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
static equal(ob1, ob2, message = 'Values must be equal') {
|
|
25
|
+
if (ob1 !== ob2) {
|
|
26
|
+
throw new Error(message);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
static true(ob, message = 'Value must be true') {
|
|
30
|
+
RequireRatchet.equal(ob, true, message);
|
|
31
|
+
}
|
|
32
|
+
static noNullOrUndefinedValuesInArray(arr, expectedLength = null, customMsg = null) {
|
|
33
|
+
RequireRatchet.notNullOrUndefined(arr, 'Source array may not be null');
|
|
34
|
+
if (expectedLength !== null && arr.length !== expectedLength) {
|
|
35
|
+
error_ratchet_1.ErrorRatchet.throwFormattedErr('Expected array of length %d but was %d %s', expectedLength, arr.length, customMsg);
|
|
36
|
+
}
|
|
37
|
+
for (let i = 0; i < arr.length; i++) {
|
|
38
|
+
if (RequireRatchet.isNullOrUndefined(arr[i])) {
|
|
39
|
+
error_ratchet_1.ErrorRatchet.throwFormattedErr('Array index %d was null or undefined %s', i, customMsg);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
static noNullOrUndefinedValuesInRestArgs(expectedLength, ...restArgs) {
|
|
44
|
+
RequireRatchet.notNullOrUndefined(restArgs, 'Source array may not be null');
|
|
45
|
+
if (expectedLength !== null && restArgs.length !== expectedLength) {
|
|
46
|
+
error_ratchet_1.ErrorRatchet.throwFormattedErr('Expected array of length %d but was %d', expectedLength, restArgs.length);
|
|
47
|
+
}
|
|
48
|
+
for (let i = 0; i < restArgs.length; i++) {
|
|
49
|
+
if (RequireRatchet.isNullOrUndefined(restArgs[i])) {
|
|
50
|
+
error_ratchet_1.ErrorRatchet.throwFormattedErr('Array index %d was null or undefined', i);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
static constructorArgumentsMatchLengthAndAreNonNull() {
|
|
55
|
+
const args = Array.from(arguments);
|
|
56
|
+
const len = this.constructor.length;
|
|
57
|
+
return RequireRatchet.noNullOrUndefinedValuesInArray(args, len);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.RequireRatchet = RequireRatchet;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StopWatch = void 0;
|
|
4
|
+
const duration_ratchet_1 = require("./duration-ratchet");
|
|
5
|
+
const string_ratchet_1 = require("./string-ratchet");
|
|
6
|
+
const require_ratchet_1 = require("./require-ratchet");
|
|
7
|
+
const logger_level_name_1 = require("../logger/logger-level-name");
|
|
8
|
+
const logger_1 = require("../logger/logger");
|
|
9
|
+
class StopWatch {
|
|
10
|
+
constructor(label = string_ratchet_1.StringRatchet.createRandomHexString(4)) {
|
|
11
|
+
this.label = label;
|
|
12
|
+
this.starts = new Map();
|
|
13
|
+
this.ends = new Map();
|
|
14
|
+
this.createTime = Date.now();
|
|
15
|
+
}
|
|
16
|
+
start(name) {
|
|
17
|
+
require_ratchet_1.RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
|
|
18
|
+
const now = Date.now();
|
|
19
|
+
this.starts.set(string_ratchet_1.StringRatchet.trimToNull(name), now);
|
|
20
|
+
return now;
|
|
21
|
+
}
|
|
22
|
+
stop(name) {
|
|
23
|
+
require_ratchet_1.RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
this.ends.set(string_ratchet_1.StringRatchet.trimToNull(name), now);
|
|
26
|
+
return now;
|
|
27
|
+
}
|
|
28
|
+
reset(name) {
|
|
29
|
+
require_ratchet_1.RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
|
|
30
|
+
this.starts.delete(string_ratchet_1.StringRatchet.trimToNull(name));
|
|
31
|
+
this.ends.delete(string_ratchet_1.StringRatchet.trimToNull(name));
|
|
32
|
+
}
|
|
33
|
+
hasTimer(name) {
|
|
34
|
+
require_ratchet_1.RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
|
|
35
|
+
return this.starts.has(name);
|
|
36
|
+
}
|
|
37
|
+
log(name, shortForm, logLevel = logger_level_name_1.LoggerLevelName.info) {
|
|
38
|
+
logger_1.Logger.logByLevel(logLevel, this.dump(name, shortForm));
|
|
39
|
+
}
|
|
40
|
+
logExpected(pctComplete, name, shortForm, logLevel = logger_level_name_1.LoggerLevelName.info) {
|
|
41
|
+
logger_1.Logger.logByLevel(logLevel, this.dumpExpected(pctComplete, name, shortForm));
|
|
42
|
+
}
|
|
43
|
+
dump(name, shortForm) {
|
|
44
|
+
let rval = this.label + ' ';
|
|
45
|
+
const cleanName = string_ratchet_1.StringRatchet.trimToNull(name);
|
|
46
|
+
if (cleanName && !this.hasTimer(cleanName)) {
|
|
47
|
+
rval += 'No such timer : ' + cleanName;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const start = name ? this.starts.get(cleanName) : this.createTime;
|
|
51
|
+
const end = name ? this.ends.get(cleanName) : Date.now();
|
|
52
|
+
rval += (cleanName || 'Default') + ' ';
|
|
53
|
+
if (!!start && !!end) {
|
|
54
|
+
rval += 'completed in ' + duration_ratchet_1.DurationRatchet.formatMsDuration(end - start, !shortForm);
|
|
55
|
+
}
|
|
56
|
+
else if (!!start) {
|
|
57
|
+
rval += 'running for ' + duration_ratchet_1.DurationRatchet.formatMsDuration(Date.now() - start, !shortForm);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return rval;
|
|
61
|
+
}
|
|
62
|
+
dumpExpected(pctComplete, name, shortForm) {
|
|
63
|
+
let rval = this.label + ' ';
|
|
64
|
+
const cleanName = string_ratchet_1.StringRatchet.trimToNull(name);
|
|
65
|
+
if (cleanName && !this.hasTimer(cleanName)) {
|
|
66
|
+
rval += 'No such timer : ' + cleanName;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
if (!pctComplete || pctComplete <= 0) {
|
|
70
|
+
rval += 'Cannot generate output for 0 percent complete';
|
|
71
|
+
}
|
|
72
|
+
else if (pctComplete > 1) {
|
|
73
|
+
rval += 'Cannot generate output for percent > 1';
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
rval += (cleanName || 'Default') + ' ';
|
|
77
|
+
const start = name ? this.starts.get(cleanName) : this.createTime;
|
|
78
|
+
const end = name ? this.ends.get(cleanName) : Date.now();
|
|
79
|
+
if (!!start && !!end) {
|
|
80
|
+
rval += 'completed in ' + duration_ratchet_1.DurationRatchet.formatMsDuration(end - start, !shortForm);
|
|
81
|
+
}
|
|
82
|
+
else if (!!start) {
|
|
83
|
+
const now = Date.now();
|
|
84
|
+
const elapsedMS = now - start;
|
|
85
|
+
const expectedTotalMS = elapsedMS / pctComplete;
|
|
86
|
+
const remainMS = expectedTotalMS - elapsedMS;
|
|
87
|
+
rval +=
|
|
88
|
+
'running for ' +
|
|
89
|
+
duration_ratchet_1.DurationRatchet.formatMsDuration(elapsedMS, !shortForm) +
|
|
90
|
+
' approx ' +
|
|
91
|
+
duration_ratchet_1.DurationRatchet.formatMsDuration(remainMS, !shortForm) +
|
|
92
|
+
' remaining';
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return rval;
|
|
97
|
+
}
|
|
98
|
+
elapsedMS(name) {
|
|
99
|
+
let rval = null;
|
|
100
|
+
const cleanName = string_ratchet_1.StringRatchet.trimToNull(name);
|
|
101
|
+
if (cleanName && !this.hasTimer(cleanName)) {
|
|
102
|
+
rval = null;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const start = name ? this.starts.get(cleanName) : this.createTime;
|
|
106
|
+
const end = name ? this.ends.get(cleanName) : Date.now();
|
|
107
|
+
if (!!start && !!end) {
|
|
108
|
+
rval = end - start;
|
|
109
|
+
}
|
|
110
|
+
else if (!!start) {
|
|
111
|
+
rval = Date.now() - start;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return rval;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.StopWatch = StopWatch;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StringRatchet = void 0;
|
|
4
|
+
const require_ratchet_1 = require("./require-ratchet");
|
|
5
|
+
class StringRatchet {
|
|
6
|
+
static stringToUint8Array(val) {
|
|
7
|
+
return val ? new TextEncoder().encode(val) : null;
|
|
8
|
+
}
|
|
9
|
+
static uint8ArrayToString(val) {
|
|
10
|
+
return val ? new TextDecoder().decode(val) : null;
|
|
11
|
+
}
|
|
12
|
+
static attemptJsonParse(val) {
|
|
13
|
+
let rval = null;
|
|
14
|
+
if (StringRatchet.trimToNull(val)) {
|
|
15
|
+
try {
|
|
16
|
+
rval = JSON.parse(val);
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
rval = null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return rval;
|
|
23
|
+
}
|
|
24
|
+
static canParseAsJson(val) {
|
|
25
|
+
return !!StringRatchet.attemptJsonParse(val);
|
|
26
|
+
}
|
|
27
|
+
static allUnique(input) {
|
|
28
|
+
let rval = true;
|
|
29
|
+
if (input) {
|
|
30
|
+
const check = new Set();
|
|
31
|
+
for (let i = 0; i < input.length && rval; i++) {
|
|
32
|
+
const test = input.charAt(i);
|
|
33
|
+
rval = !check.has(test);
|
|
34
|
+
check.add(test);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return rval;
|
|
38
|
+
}
|
|
39
|
+
static allPermutationsOfLength(len, alphabet) {
|
|
40
|
+
const rval = [];
|
|
41
|
+
if (len > 0 && alphabet && alphabet.length > 0) {
|
|
42
|
+
require_ratchet_1.RequireRatchet.true(StringRatchet.allUnique(alphabet), 'Alphabet must be unique');
|
|
43
|
+
const step = len === 1 ? [''] : StringRatchet.allPermutationsOfLength(len - 1, alphabet);
|
|
44
|
+
for (let i = 0; i < alphabet.length; i++) {
|
|
45
|
+
step.forEach((s) => rval.push(alphabet.charAt(i) + s));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return rval;
|
|
49
|
+
}
|
|
50
|
+
static createType4Guid() {
|
|
51
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
52
|
+
const r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;
|
|
53
|
+
return v.toString(16);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
static createRandomHexString(len = 10) {
|
|
57
|
+
let r = '';
|
|
58
|
+
for (let i = 0; i < len; i++) {
|
|
59
|
+
r += Math.floor(Math.random() * 16).toString(16);
|
|
60
|
+
}
|
|
61
|
+
return r;
|
|
62
|
+
}
|
|
63
|
+
static canonicalize(value) {
|
|
64
|
+
let rval = value ? value.toLowerCase() : '';
|
|
65
|
+
rval = rval.replace(' ', '-');
|
|
66
|
+
StringRatchet.RFC_3986_RESERVED.forEach((s) => {
|
|
67
|
+
rval = rval.replace(s, '');
|
|
68
|
+
});
|
|
69
|
+
return rval;
|
|
70
|
+
}
|
|
71
|
+
static formatBytes(bytes, decimals = 2) {
|
|
72
|
+
if (bytes == 0)
|
|
73
|
+
return '0 Bytes';
|
|
74
|
+
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));
|
|
75
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
|
|
76
|
+
}
|
|
77
|
+
static safeString(input) {
|
|
78
|
+
let rval = null;
|
|
79
|
+
if (input != null) {
|
|
80
|
+
const type = typeof input;
|
|
81
|
+
if (type == 'string') {
|
|
82
|
+
rval = input;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
rval = String(input);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return rval;
|
|
89
|
+
}
|
|
90
|
+
static stringContainsOnlyNumbers(input) {
|
|
91
|
+
const rval = /^[0-9]+$/.test(input);
|
|
92
|
+
return rval;
|
|
93
|
+
}
|
|
94
|
+
static stringContainsOnlyAlphanumeric(input) {
|
|
95
|
+
const rval = /^[0-9a-zA-Z]+$/.test(input);
|
|
96
|
+
return rval;
|
|
97
|
+
}
|
|
98
|
+
static stringContainsOnlyHex(input) {
|
|
99
|
+
const rval = /^[0-9a-fA-F]+$/.test(input);
|
|
100
|
+
return rval;
|
|
101
|
+
}
|
|
102
|
+
static stringContainsOnly(inVal, validCharsIn) {
|
|
103
|
+
const input = !inVal ? '' : inVal;
|
|
104
|
+
const validChars = !validCharsIn ? '' : validCharsIn;
|
|
105
|
+
let rval = true;
|
|
106
|
+
for (let i = 0; i < input.length && rval; i++) {
|
|
107
|
+
rval = validChars.indexOf(input.charAt(i)) >= 0;
|
|
108
|
+
}
|
|
109
|
+
return rval;
|
|
110
|
+
}
|
|
111
|
+
static obscure(input, prefixLength = 2, suffixLength = 2) {
|
|
112
|
+
if (!input) {
|
|
113
|
+
return input;
|
|
114
|
+
}
|
|
115
|
+
const len = input.length;
|
|
116
|
+
let pl = prefixLength;
|
|
117
|
+
let sl = suffixLength;
|
|
118
|
+
while (len > 0 && len < pl + sl + 1) {
|
|
119
|
+
pl = Math.max(0, pl - 1);
|
|
120
|
+
sl = Math.max(0, sl - 1);
|
|
121
|
+
}
|
|
122
|
+
const rem = len - (pl + sl);
|
|
123
|
+
let rval = '';
|
|
124
|
+
rval += input.substring(0, pl);
|
|
125
|
+
for (let i = 0; i < rem; i++) {
|
|
126
|
+
rval += '*';
|
|
127
|
+
}
|
|
128
|
+
rval += input.substring(len - sl);
|
|
129
|
+
return rval;
|
|
130
|
+
}
|
|
131
|
+
static leadingZeros(inVal, size) {
|
|
132
|
+
const pad = '00000000000000000000000000000000000000000000000000';
|
|
133
|
+
let negative = false;
|
|
134
|
+
let sVal = String(inVal);
|
|
135
|
+
if (sVal.startsWith('-')) {
|
|
136
|
+
negative = true;
|
|
137
|
+
sVal = sVal.substring(1);
|
|
138
|
+
}
|
|
139
|
+
if (size > pad.length) {
|
|
140
|
+
throw new Error('Cannot format number that large');
|
|
141
|
+
}
|
|
142
|
+
let rval = (pad + sVal).slice(-1 * size);
|
|
143
|
+
if (negative) {
|
|
144
|
+
rval = '-' + rval;
|
|
145
|
+
}
|
|
146
|
+
return rval;
|
|
147
|
+
}
|
|
148
|
+
static trimToEmpty(input) {
|
|
149
|
+
const t = input ? StringRatchet.safeString(input) : '';
|
|
150
|
+
return t.trim();
|
|
151
|
+
}
|
|
152
|
+
static trimToNull(input) {
|
|
153
|
+
const x = StringRatchet.trimToEmpty(input);
|
|
154
|
+
return x.length > 0 ? x : null;
|
|
155
|
+
}
|
|
156
|
+
static trimAllStringPropertiesToNullInPlace(input) {
|
|
157
|
+
return StringRatchet.trimAllStringPropertiesInPlace(input, false);
|
|
158
|
+
}
|
|
159
|
+
static trimAllStringPropertiesToEmptyInPlace(input) {
|
|
160
|
+
return StringRatchet.trimAllStringPropertiesInPlace(input, true);
|
|
161
|
+
}
|
|
162
|
+
static trimAllStringPropertiesInPlace(input, toEmpty) {
|
|
163
|
+
const dealKeys = Object.keys(input);
|
|
164
|
+
dealKeys.forEach((key) => {
|
|
165
|
+
const val = input[key];
|
|
166
|
+
if (val != null && typeof val === 'string') {
|
|
167
|
+
input[key] = toEmpty ? StringRatchet.trimToEmpty(input[key]) : StringRatchet.trimToNull(input[key]);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return input;
|
|
171
|
+
}
|
|
172
|
+
static stripNonNumeric(input) {
|
|
173
|
+
let rval = input;
|
|
174
|
+
if (input != null && !StringRatchet.stringContainsOnlyNumbers(input)) {
|
|
175
|
+
rval = '';
|
|
176
|
+
for (let i = 0; i < input.length; i++) {
|
|
177
|
+
const c = input.charAt(i);
|
|
178
|
+
if (StringRatchet.stringContainsOnlyNumbers(c) || (i === 0 && c === '-')) {
|
|
179
|
+
rval += c;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return rval;
|
|
184
|
+
}
|
|
185
|
+
static csvSafe(input) {
|
|
186
|
+
let rval = StringRatchet.trimToEmpty(StringRatchet.safeString(input));
|
|
187
|
+
rval.split('"').join('\\"');
|
|
188
|
+
if (rval.indexOf(',') !== -1 || rval.indexOf('"') !== -1 || rval.indexOf("'") !== -1) {
|
|
189
|
+
rval = '"' + rval + '"';
|
|
190
|
+
}
|
|
191
|
+
return rval;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
exports.StringRatchet = StringRatchet;
|
|
195
|
+
StringRatchet.RFC_3986_RESERVED = ['!', '*', "'", '(', ')', ';', ':', '@', '&', '=', '+', '$', ',', '/', '?', '#', '[', ']', '%'];
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimeZoneRatchet = void 0;
|
|
4
|
+
const luxon_1 = require("luxon");
|
|
5
|
+
class TimeZoneRatchet {
|
|
6
|
+
constructor(timezone) {
|
|
7
|
+
if (!timezone) {
|
|
8
|
+
throw 'Timezone cannot be null';
|
|
9
|
+
}
|
|
10
|
+
this.timezone = timezone;
|
|
11
|
+
}
|
|
12
|
+
currentHour() {
|
|
13
|
+
const rval = luxon_1.DateTime.local().setZone(this.timezone).hour;
|
|
14
|
+
return rval;
|
|
15
|
+
}
|
|
16
|
+
toEpochSeconds(dt) {
|
|
17
|
+
return Math.round(dt.toMillis() / 1000);
|
|
18
|
+
}
|
|
19
|
+
startOfTodayEpochSeconds() {
|
|
20
|
+
const startOfToday = this.toEpochSeconds(luxon_1.DateTime.local().setZone(this.timezone).set({ hour: 0, minute: 0, second: 0, millisecond: 0 }));
|
|
21
|
+
return startOfToday;
|
|
22
|
+
}
|
|
23
|
+
startOfMatchingDayEpochSeconds(inputTS) {
|
|
24
|
+
const startOfToday = this.toEpochSeconds(luxon_1.DateTime.fromMillis(inputTS).set({ hour: 0, minute: 0, second: 0, millisecond: 0 }));
|
|
25
|
+
return startOfToday;
|
|
26
|
+
}
|
|
27
|
+
startOfMatchingDayEpochMS(inputTS) {
|
|
28
|
+
return this.startOfMatchingDayEpochSeconds(inputTS) * 1000;
|
|
29
|
+
}
|
|
30
|
+
startOfCurrentHourEpochSeconds() {
|
|
31
|
+
const rval = this.toEpochSeconds(luxon_1.DateTime.local().setZone(this.timezone).set({ minute: 0, second: 0, millisecond: 0 }));
|
|
32
|
+
return rval;
|
|
33
|
+
}
|
|
34
|
+
startOfCurrentMinuteEpochSeconds() {
|
|
35
|
+
const rval = this.toEpochSeconds(luxon_1.DateTime.local().setZone(this.timezone).set({ second: 0, millisecond: 0 }));
|
|
36
|
+
return rval;
|
|
37
|
+
}
|
|
38
|
+
startOfCurrentSecondEpochSeconds() {
|
|
39
|
+
const rval = this.toEpochSeconds(luxon_1.DateTime.local().setZone(this.timezone).set({ millisecond: 0 }));
|
|
40
|
+
return rval;
|
|
41
|
+
}
|
|
42
|
+
startOfTodayEpochMS() {
|
|
43
|
+
const startOfToday = luxon_1.DateTime.local().setZone(this.timezone).set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).toMillis();
|
|
44
|
+
return startOfToday;
|
|
45
|
+
}
|
|
46
|
+
dailySlotCount(slotWidthMs) {
|
|
47
|
+
return Math.ceil(86400000 / slotWidthMs);
|
|
48
|
+
}
|
|
49
|
+
currentTimeSlotIdx(slotWidthMs) {
|
|
50
|
+
if (slotWidthMs < 1) {
|
|
51
|
+
throw new Error('Cannot process with slot less than one ms wide');
|
|
52
|
+
}
|
|
53
|
+
const startOfToday = this.startOfTodayEpochMS();
|
|
54
|
+
const now = new Date().getTime();
|
|
55
|
+
const delta = now - startOfToday;
|
|
56
|
+
const idx = Math.floor(delta / slotWidthMs);
|
|
57
|
+
return idx;
|
|
58
|
+
}
|
|
59
|
+
matchingTimeSlotIdx(timestamp, slotWidthMs) {
|
|
60
|
+
if (slotWidthMs < 1) {
|
|
61
|
+
throw new Error('Cannot process with slot less than one ms wide');
|
|
62
|
+
}
|
|
63
|
+
const startOfDay = this.startOfMatchingDayEpochMS(timestamp);
|
|
64
|
+
const delta = timestamp - startOfDay;
|
|
65
|
+
const idx = Math.floor(delta / slotWidthMs);
|
|
66
|
+
return idx;
|
|
67
|
+
}
|
|
68
|
+
startOfCurrentSlotEpochMS(slotWidthMs) {
|
|
69
|
+
const startOfToday = this.startOfTodayEpochMS();
|
|
70
|
+
const currentIdx = this.currentTimeSlotIdx(slotWidthMs);
|
|
71
|
+
return startOfToday + currentIdx * slotWidthMs;
|
|
72
|
+
}
|
|
73
|
+
startOfMatchingSlotEpochMS(timestamp, slotWidthMs) {
|
|
74
|
+
const startOfDay = this.startOfMatchingDayEpochMS(timestamp);
|
|
75
|
+
const currentIdx = this.matchingTimeSlotIdx(timestamp, slotWidthMs);
|
|
76
|
+
return startOfDay + currentIdx * slotWidthMs;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.TimeZoneRatchet = TimeZoneRatchet;
|
|
80
|
+
TimeZoneRatchet.PACIFIC = new TimeZoneRatchet('America/Los_Angeles');
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimeoutToken = void 0;
|
|
4
|
+
const logger_1 = require("../logger/logger");
|
|
5
|
+
const logger_level_name_1 = require("../logger/logger-level-name");
|
|
6
|
+
class TimeoutToken {
|
|
7
|
+
constructor(title, timeoutMS) {
|
|
8
|
+
this.title = title;
|
|
9
|
+
this.timeoutMS = timeoutMS;
|
|
10
|
+
this.__timeoutTokenFlagField = true;
|
|
11
|
+
}
|
|
12
|
+
writeToLog(logLevel = logger_level_name_1.LoggerLevelName.warn) {
|
|
13
|
+
logger_1.Logger.logByLevel(logLevel, 'Timed out after %d ms waiting for results of %s', this.timeoutMS, this.title);
|
|
14
|
+
}
|
|
15
|
+
static isTimeoutToken(value) {
|
|
16
|
+
return !!value && !!value['__timeoutTokenFlagField'];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.TimeoutToken = TimeoutToken;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransformRatchet = void 0;
|
|
4
|
+
const logger_1 = require("../logger/logger");
|
|
5
|
+
class TransformRatchet {
|
|
6
|
+
static transform(toTransform, rules = []) {
|
|
7
|
+
return TransformRatchet.transformGeneric(toTransform, rules, false, null);
|
|
8
|
+
}
|
|
9
|
+
static transformGeneric(toTransform, rules = [], isKey, context) {
|
|
10
|
+
let rval = null;
|
|
11
|
+
const type = typeof toTransform;
|
|
12
|
+
switch (type) {
|
|
13
|
+
case 'undefined':
|
|
14
|
+
case 'symbol':
|
|
15
|
+
case 'function':
|
|
16
|
+
rval = toTransform;
|
|
17
|
+
break;
|
|
18
|
+
case 'number':
|
|
19
|
+
case 'string':
|
|
20
|
+
case 'boolean':
|
|
21
|
+
rval = TransformRatchet.applyTransformToPrimitive(toTransform, rules, isKey, context);
|
|
22
|
+
break;
|
|
23
|
+
case 'object':
|
|
24
|
+
rval = TransformRatchet.applyTransformToObject(toTransform, rules, isKey, context);
|
|
25
|
+
break;
|
|
26
|
+
default:
|
|
27
|
+
throw new Error('Unrecognized type ' + type);
|
|
28
|
+
}
|
|
29
|
+
return rval;
|
|
30
|
+
}
|
|
31
|
+
static applyTransformToObject(toTransform, rules = [], isKey, context = null) {
|
|
32
|
+
logger_1.Logger.silly('Tranform: %j, %s, %j', toTransform, isKey, context);
|
|
33
|
+
let rval = null;
|
|
34
|
+
if (toTransform != null) {
|
|
35
|
+
if (Array.isArray(toTransform)) {
|
|
36
|
+
rval = [];
|
|
37
|
+
toTransform.forEach((val) => {
|
|
38
|
+
const newVal = TransformRatchet.transformGeneric(val, rules, isKey, toTransform);
|
|
39
|
+
if (newVal != null) {
|
|
40
|
+
rval.push(newVal);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
rval = {};
|
|
46
|
+
Object.keys(toTransform).forEach((k) => {
|
|
47
|
+
const oldValue = toTransform[k];
|
|
48
|
+
const newKey = TransformRatchet.applyTransformToPrimitive(k, rules, true, toTransform);
|
|
49
|
+
if (newKey != null) {
|
|
50
|
+
let newValue = TransformRatchet.transformGeneric(oldValue, rules, false, toTransform);
|
|
51
|
+
newValue = TransformRatchet.applyTransformToPrimitive(newValue, rules, false, toTransform);
|
|
52
|
+
if (newValue != null) {
|
|
53
|
+
rval[newKey] = newValue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
rval = TransformRatchet.applyTransformToPrimitive(rval, rules, false, toTransform);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return rval;
|
|
61
|
+
}
|
|
62
|
+
static applyTransformToPrimitive(toTransform, rules = [], isKey, context) {
|
|
63
|
+
let rval = toTransform;
|
|
64
|
+
rules.forEach((r) => {
|
|
65
|
+
rval = rval == null ? null : r.transform(rval, isKey, context);
|
|
66
|
+
});
|
|
67
|
+
return rval;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.TransformRatchet = TransformRatchet;
|