@bitblit/ratchet-common 4.0.115-alpha → 4.0.119-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 (114) hide show
  1. package/lib/index.d.ts +73 -1
  2. package/lib/index.mjs +4 -0
  3. package/lib/index.mjs.map +1 -0
  4. package/lib/lang/base64-ratchet.d.ts +1 -1
  5. package/lib/stream/buffer-writable.d.ts +2 -2
  6. package/lib/stream/multi-stream.d.ts +1 -1
  7. package/lib/stream/stream-ratchet.d.ts +2 -2
  8. package/lib/stream/string-writable.d.ts +1 -1
  9. package/package.json +9 -5
  10. package/lib/2d/line-2d.js +0 -1
  11. package/lib/2d/plane-2d.js +0 -1
  12. package/lib/2d/point-2d.js +0 -1
  13. package/lib/2d/poly-line-2d.js +0 -1
  14. package/lib/2d/ratchet-2d.js +0 -245
  15. package/lib/2d/ratchet-2d.spec.js +0 -117
  16. package/lib/build/build-information.js +0 -1
  17. package/lib/build/ratchet-common-info.js +0 -14
  18. package/lib/histogram/histogram-entry.js +0 -1
  19. package/lib/histogram/histogram.js +0 -48
  20. package/lib/histogram/histogram.spec.js +0 -19
  21. package/lib/index.js +0 -1
  22. package/lib/jwt/common-jwt-token.js +0 -1
  23. package/lib/jwt/expired-jwt-handling.js +0 -6
  24. package/lib/jwt/jwt-ratchet-like.js +0 -1
  25. package/lib/jwt/jwt-ratchet.js +0 -164
  26. package/lib/jwt/jwt-ratchet.spec.js +0 -49
  27. package/lib/jwt/jwt-token-base.js +0 -1
  28. package/lib/lang/array-ratchet.js +0 -83
  29. package/lib/lang/array-ratchet.spec.js +0 -68
  30. package/lib/lang/base64-ratchet.js +0 -45
  31. package/lib/lang/base64-ratchet.spec.js +0 -28
  32. package/lib/lang/boolean-ratchet.js +0 -45
  33. package/lib/lang/boolean-ratchet.spec.js +0 -81
  34. package/lib/lang/composite-last-success-provider.js +0 -26
  35. package/lib/lang/composite-last-success-provider.spec.js +0 -26
  36. package/lib/lang/date-ratchet.js +0 -29
  37. package/lib/lang/date-ratchet.spec.js +0 -21
  38. package/lib/lang/duration-ratchet.js +0 -42
  39. package/lib/lang/duration-ratchet.spec.js +0 -39
  40. package/lib/lang/enum-ratchet.js +0 -30
  41. package/lib/lang/enum-ratchet.spec.js +0 -31
  42. package/lib/lang/error-ratchet.js +0 -44
  43. package/lib/lang/error-ratchet.spec.js +0 -20
  44. package/lib/lang/esm-ratchet.js +0 -17
  45. package/lib/lang/expiring-object.js +0 -72
  46. package/lib/lang/expiring-object.spec.js +0 -51
  47. package/lib/lang/geolocation-ratchet.js +0 -263
  48. package/lib/lang/geolocation-ratchet.spec.js +0 -74
  49. package/lib/lang/global-ratchet.js +0 -43
  50. package/lib/lang/global-ratchet.spec.js +0 -14
  51. package/lib/lang/key-value.js +0 -4
  52. package/lib/lang/last-success-provider.js +0 -1
  53. package/lib/lang/map-ratchet.js +0 -164
  54. package/lib/lang/map-ratchet.spec.js +0 -90
  55. package/lib/lang/no.js +0 -4
  56. package/lib/lang/no.spec.js +0 -7
  57. package/lib/lang/number-ratchet.js +0 -155
  58. package/lib/lang/number-ratchet.spec.js +0 -118
  59. package/lib/lang/parsed-url.js +0 -1
  60. package/lib/lang/promise-ratchet.js +0 -138
  61. package/lib/lang/promise-ratchet.spec.js +0 -74
  62. package/lib/lang/require-ratchet.js +0 -56
  63. package/lib/lang/require-ratchet.spec.js +0 -80
  64. package/lib/lang/stop-watch.js +0 -114
  65. package/lib/lang/string-ratchet.js +0 -201
  66. package/lib/lang/string-ratchet.spec.js +0 -158
  67. package/lib/lang/time-zone-ratchet.js +0 -77
  68. package/lib/lang/time-zone-ratchet.spec.js +0 -40
  69. package/lib/lang/timeout-token.js +0 -17
  70. package/lib/lang/timeout-token.spec.js +0 -9
  71. package/lib/lang/transform-ratchet.js +0 -66
  72. package/lib/lang/transform-ratchet.spec.js +0 -118
  73. package/lib/logger/classic-single-line-log-message-formatter.js +0 -13
  74. package/lib/logger/log-message-builder.js +0 -48
  75. package/lib/logger/log-message-format-type.js +0 -6
  76. package/lib/logger/log-message-formatter.js +0 -1
  77. package/lib/logger/log-message-processor.js +0 -1
  78. package/lib/logger/log-message.js +0 -1
  79. package/lib/logger/log-snapshot.js +0 -1
  80. package/lib/logger/logger-instance.js +0 -208
  81. package/lib/logger/logger-level-name.js +0 -9
  82. package/lib/logger/logger-meta.js +0 -1
  83. package/lib/logger/logger-options.js +0 -1
  84. package/lib/logger/logger-output-function.js +0 -6
  85. package/lib/logger/logger-ring-buffer.js +0 -73
  86. package/lib/logger/logger-util.js +0 -44
  87. package/lib/logger/logger-util.spec.js +0 -9
  88. package/lib/logger/logger.js +0 -134
  89. package/lib/logger/logger.spec.js +0 -134
  90. package/lib/logger/none-log-message-formatter.js +0 -5
  91. package/lib/logger/structured-json-log-message-formatter.js +0 -19
  92. package/lib/network/browser-local-ip-provider.js +0 -21
  93. package/lib/network/browser-local-ip-provider.spec.js +0 -16
  94. package/lib/network/fixed-local-ip-provider.js +0 -9
  95. package/lib/network/local-ip-provider.js +0 -1
  96. package/lib/network/network-ratchet.js +0 -102
  97. package/lib/network/network-ratchet.spec.js +0 -13
  98. package/lib/stream/buffer-writable.js +0 -16
  99. package/lib/stream/multi-stream.js +0 -12
  100. package/lib/stream/stream-ratchet.js +0 -68
  101. package/lib/stream/stream-ratchet.spec.js +0 -13
  102. package/lib/stream/string-writable.js +0 -14
  103. package/lib/stream/string-writable.spec.js +0 -12
  104. package/lib/third-party/google/google-recaptcha-ratchet.js +0 -28
  105. package/lib/third-party/google/google-recaptcha-ratchet.spec.js +0 -20
  106. package/lib/third-party/twilio/twilio-ratchet.js +0 -73
  107. package/lib/transform/built-in-transforms.js +0 -191
  108. package/lib/transform/transform-rule.js +0 -1
  109. package/lib/tx/transaction-configuration.js +0 -1
  110. package/lib/tx/transaction-final-state.js +0 -6
  111. package/lib/tx/transaction-ratchet.js +0 -76
  112. package/lib/tx/transaction-ratchet.spec.js +0 -130
  113. package/lib/tx/transaction-result.js +0 -1
  114. package/lib/tx/transaction-step.js +0 -1
@@ -1,138 +0,0 @@
1
- import { Logger } from '../logger/logger.js';
2
- import { ArrayRatchet } from './array-ratchet.js';
3
- import { TimeoutToken } from './timeout-token.js';
4
- import { StopWatch } from './stop-watch.js';
5
- import { LoggerLevelName } from '../logger/logger-level-name.js';
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
- }
@@ -1,74 +0,0 @@
1
- import { PromiseRatchet } from './promise-ratchet.js';
2
- import { Logger } from '../logger/logger.js';
3
- import { LoggerLevelName } from '../logger/logger-level-name.js';
4
- const fnFalse = (ignored) => {
5
- return false;
6
- };
7
- const fnOn3 = (t) => {
8
- Logger.info('t=%d', t);
9
- return t == 3;
10
- };
11
- const waitAndPrint = async (t1, t2) => {
12
- Logger.info('Running: %s', t2);
13
- await PromiseRatchet.wait(t1 * 2);
14
- return t1 * 2;
15
- };
16
- describe('#promiseRatchet', function () {
17
- it('should timeout eventually', async () => {
18
- try {
19
- Logger.setLevel(LoggerLevelName.silly);
20
- const result = await PromiseRatchet.waitFor(fnFalse, true, 100, 2);
21
- Logger.info('Got : %s', result);
22
- expect(result).toEqual(false);
23
- }
24
- catch (err) {
25
- Logger.warn('Error: %s', err, err);
26
- }
27
- });
28
- it('should succeed on 3rd try', async () => {
29
- const promise = PromiseRatchet.waitFor(fnOn3, true, 100, 4);
30
- const result = await promise;
31
- expect(result).toEqual(true);
32
- });
33
- it('should run 10 elements, 2 at a time', async () => {
34
- Logger.setLevel(LoggerLevelName.debug);
35
- const elements = [
36
- [100, 'Test1'],
37
- [200, 'Test2'],
38
- [300, 'Test3'],
39
- [400, 'Test4'],
40
- [500, 'Test5'],
41
- [600, 'Test6'],
42
- [700, 'Test7'],
43
- [800, 'Test8'],
44
- [900, 'Test9'],
45
- [1000, 'Test10'],
46
- ];
47
- const results = await PromiseRatchet.runBoundedParallel(waitAndPrint, elements, this, 2);
48
- Logger.info('Final results %j', results);
49
- expect(results).toBeTruthy();
50
- expect(results.length).toEqual(10);
51
- }, 30000);
52
- it('should run 10 waits, 2 at a time', async () => {
53
- Logger.setLevel(LoggerLevelName.debug);
54
- const elements = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000];
55
- const results = await PromiseRatchet.runBoundedParallelSingleParam(PromiseRatchet.wait, elements, this, 2);
56
- Logger.info('Final results %j', results);
57
- expect(results).toBeTruthy();
58
- expect(results.length).toEqual(10);
59
- });
60
- xit('should run an async function as a for/each', async () => {
61
- Logger.setLevel(LoggerLevelName.debug);
62
- const elements = [1001, 1002, 2000];
63
- const pfn = async (v) => {
64
- Logger.info('Waiting %s', v);
65
- await PromiseRatchet.wait(v);
66
- Logger.info('Finished %s', v);
67
- };
68
- Logger.info('Serial test');
69
- await PromiseRatchet.asyncForEachSerial(elements, pfn);
70
- Logger.info('Parallel test');
71
- await PromiseRatchet.asyncForEachParallel(elements, pfn);
72
- Logger.info('Done');
73
- });
74
- });
@@ -1,56 +0,0 @@
1
- import { ErrorRatchet } from './error-ratchet.js';
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
- }
@@ -1,80 +0,0 @@
1
- import { RequireRatchet } from './require-ratchet.js';
2
- import { fail } from 'assert';
3
- import { Logger } from '../logger/logger.js';
4
- describe('#standardCases', function () {
5
- it('should throw exception on null value', function () {
6
- try {
7
- RequireRatchet.notNullOrUndefined(null, 'test1');
8
- fail('Should have thrown exception');
9
- }
10
- catch (err) {
11
- Logger.debug('Correctly threw exception : %s', err);
12
- }
13
- try {
14
- RequireRatchet.notNullOrUndefined(undefined, 'test2');
15
- fail('Should have thrown exception');
16
- }
17
- catch (err) {
18
- Logger.debug('Correctly threw exception : %s', err);
19
- }
20
- });
21
- it('should throw exception on whitespace value', function () {
22
- try {
23
- RequireRatchet.notNullUndefinedOrOnlyWhitespaceString('', 'test1');
24
- fail('Should have thrown exception');
25
- }
26
- catch (err) {
27
- Logger.debug('Correctly threw exception : %s', err);
28
- }
29
- try {
30
- RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(' ', 'test2');
31
- fail('Should have thrown exception');
32
- }
33
- catch (err) {
34
- Logger.debug('Correctly threw exception : %s', err);
35
- }
36
- });
37
- });
38
- describe('#noNullOrUndefinedValuesInArray', function () {
39
- it('should throw exception on null value', function () {
40
- const arr = [1, null, 'a'];
41
- try {
42
- RequireRatchet.noNullOrUndefinedValuesInArray(arr);
43
- fail('Should have thrown exception');
44
- }
45
- catch (err) {
46
- Logger.debug('Correctly threw exception : %s', err);
47
- }
48
- });
49
- it('throw exception on bad length', function () {
50
- const arr = [1, 2, 'a'];
51
- try {
52
- RequireRatchet.noNullOrUndefinedValuesInArray(arr, 4);
53
- fail('Should have thrown exception');
54
- }
55
- catch (err) {
56
- Logger.debug('Correctly threw exception : %s', err);
57
- }
58
- });
59
- it('should not throw exception on good values', function () {
60
- const arr = [1, 2, 'a'];
61
- RequireRatchet.noNullOrUndefinedValuesInArray(arr, 3);
62
- });
63
- it('should not throw exception on good constructor values', function () {
64
- const test = new ConstructorTester('a', 'b');
65
- });
66
- it('throw exception on null constructor param', function () {
67
- try {
68
- const test = new ConstructorTester('a', null);
69
- fail('Should have thrown exception');
70
- }
71
- catch (err) {
72
- Logger.debug('Correctly threw exception : %s', err);
73
- }
74
- });
75
- });
76
- export class ConstructorTester {
77
- constructor(testVal1, testVal2) {
78
- Logger.info('Args : %j', this.constructor);
79
- }
80
- }
@@ -1,114 +0,0 @@
1
- import { DurationRatchet } from './duration-ratchet.js';
2
- import { StringRatchet } from './string-ratchet.js';
3
- import { RequireRatchet } from './require-ratchet.js';
4
- import { LoggerLevelName } from '../logger/logger-level-name.js';
5
- import { Logger } from '../logger/logger.js';
6
- export class StopWatch {
7
- label;
8
- starts = new Map();
9
- ends = new Map();
10
- createTime = Date.now();
11
- constructor(label = StringRatchet.createRandomHexString(4)) {
12
- this.label = label;
13
- }
14
- start(name) {
15
- RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
16
- const now = Date.now();
17
- this.starts.set(StringRatchet.trimToNull(name), now);
18
- return now;
19
- }
20
- stop(name) {
21
- RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
22
- const now = Date.now();
23
- this.ends.set(StringRatchet.trimToNull(name), now);
24
- return now;
25
- }
26
- reset(name) {
27
- RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
28
- this.starts.delete(StringRatchet.trimToNull(name));
29
- this.ends.delete(StringRatchet.trimToNull(name));
30
- }
31
- hasTimer(name) {
32
- RequireRatchet.notNullUndefinedOrOnlyWhitespaceString(name, 'name');
33
- return this.starts.has(name);
34
- }
35
- log(name, shortForm, logLevel = LoggerLevelName.info) {
36
- Logger.logByLevel(logLevel, this.dump(name, shortForm));
37
- }
38
- logExpected(pctComplete, name, shortForm, logLevel = LoggerLevelName.info) {
39
- Logger.logByLevel(logLevel, this.dumpExpected(pctComplete, name, shortForm));
40
- }
41
- dump(name, shortForm) {
42
- let rval = this.label + ' ';
43
- const cleanName = StringRatchet.trimToNull(name);
44
- if (cleanName && !this.hasTimer(cleanName)) {
45
- rval += 'No such timer : ' + cleanName;
46
- }
47
- else {
48
- const start = name ? this.starts.get(cleanName) : this.createTime;
49
- const end = name ? this.ends.get(cleanName) : Date.now();
50
- rval += (cleanName || 'Default') + ' ';
51
- if (!!start && !!end) {
52
- rval += 'completed in ' + DurationRatchet.formatMsDuration(end - start, !shortForm);
53
- }
54
- else if (!!start) {
55
- rval += 'running for ' + DurationRatchet.formatMsDuration(Date.now() - start, !shortForm);
56
- }
57
- }
58
- return rval;
59
- }
60
- dumpExpected(pctComplete, name, shortForm) {
61
- let rval = this.label + ' ';
62
- const cleanName = StringRatchet.trimToNull(name);
63
- if (cleanName && !this.hasTimer(cleanName)) {
64
- rval += 'No such timer : ' + cleanName;
65
- }
66
- else {
67
- if (!pctComplete || pctComplete <= 0) {
68
- rval += 'Cannot generate output for 0 percent complete';
69
- }
70
- else if (pctComplete > 1) {
71
- rval += 'Cannot generate output for percent > 1';
72
- }
73
- else {
74
- rval += (cleanName || 'Default') + ' ';
75
- const start = name ? this.starts.get(cleanName) : this.createTime;
76
- const end = name ? this.ends.get(cleanName) : Date.now();
77
- if (!!start && !!end) {
78
- rval += 'completed in ' + DurationRatchet.formatMsDuration(end - start, !shortForm);
79
- }
80
- else if (!!start) {
81
- const now = Date.now();
82
- const elapsedMS = now - start;
83
- const expectedTotalMS = elapsedMS / pctComplete;
84
- const remainMS = expectedTotalMS - elapsedMS;
85
- rval +=
86
- 'running for ' +
87
- DurationRatchet.formatMsDuration(elapsedMS, !shortForm) +
88
- ' approx ' +
89
- DurationRatchet.formatMsDuration(remainMS, !shortForm) +
90
- ' remaining';
91
- }
92
- }
93
- }
94
- return rval;
95
- }
96
- elapsedMS(name) {
97
- let rval = null;
98
- const cleanName = StringRatchet.trimToNull(name);
99
- if (cleanName && !this.hasTimer(cleanName)) {
100
- rval = null;
101
- }
102
- else {
103
- const start = name ? this.starts.get(cleanName) : this.createTime;
104
- const end = name ? this.ends.get(cleanName) : Date.now();
105
- if (!!start && !!end) {
106
- rval = end - start;
107
- }
108
- else if (!!start) {
109
- rval = Date.now() - start;
110
- }
111
- }
112
- return rval;
113
- }
114
- }
@@ -1,201 +0,0 @@
1
- import { RequireRatchet } from './require-ratchet.js';
2
- export class StringRatchet {
3
- static RFC_3986_RESERVED = ['!', '*', "'", '(', ')', ';', ':', '@', '&', '=', '+', '$', ',', '/', '?', '#', '[', ']', '%'];
4
- static stringToUint8Array(val) {
5
- return val ? new TextEncoder().encode(val) : null;
6
- }
7
- static uint8ArrayToString(val) {
8
- return val ? new TextDecoder().decode(val) : null;
9
- }
10
- static attemptJsonParse(val) {
11
- let rval = null;
12
- if (StringRatchet.trimToNull(val)) {
13
- try {
14
- rval = JSON.parse(val);
15
- }
16
- catch (err) {
17
- rval = null;
18
- }
19
- }
20
- return rval;
21
- }
22
- static canParseAsJson(val) {
23
- return !!StringRatchet.attemptJsonParse(val);
24
- }
25
- static allUnique(input) {
26
- let rval = true;
27
- if (input) {
28
- const check = new Set();
29
- for (let i = 0; i < input.length && rval; i++) {
30
- const test = input.charAt(i);
31
- rval = !check.has(test);
32
- check.add(test);
33
- }
34
- }
35
- return rval;
36
- }
37
- static allPermutationsOfLength(len, alphabet) {
38
- const rval = [];
39
- if (len > 0 && alphabet && alphabet.length > 0) {
40
- RequireRatchet.true(StringRatchet.allUnique(alphabet), 'Alphabet must be unique');
41
- const step = len === 1 ? [''] : StringRatchet.allPermutationsOfLength(len - 1, alphabet);
42
- for (let i = 0; i < alphabet.length; i++) {
43
- step.forEach((s) => rval.push(alphabet.charAt(i) + s));
44
- }
45
- }
46
- return rval;
47
- }
48
- static createType4Guid() {
49
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
50
- const r = (Math.random() * 16) | 0, v = c == 'x' ? r : (r & 0x3) | 0x8;
51
- return v.toString(16);
52
- });
53
- }
54
- static createRandomHexString(len = 10) {
55
- let r = '';
56
- for (let i = 0; i < len; i++) {
57
- r += Math.floor(Math.random() * 16).toString(16);
58
- }
59
- return r;
60
- }
61
- static canonicalize(value) {
62
- let rval = value ? value.toLowerCase() : '';
63
- rval = rval.replace(' ', '-');
64
- StringRatchet.RFC_3986_RESERVED.forEach((s) => {
65
- rval = rval.replace(s, '');
66
- });
67
- return rval;
68
- }
69
- static formatBytes(bytes, decimals = 2) {
70
- if (bytes == 0)
71
- return '0 Bytes';
72
- 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));
73
- return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
74
- }
75
- static safeString(input) {
76
- let rval = null;
77
- if (input != null) {
78
- const type = typeof input;
79
- if (type == 'string') {
80
- rval = input;
81
- }
82
- else {
83
- rval = String(input);
84
- }
85
- }
86
- return rval;
87
- }
88
- static stringContainsOnlyNumbers(input) {
89
- const rval = /^[0-9]+$/.test(input);
90
- return rval;
91
- }
92
- static stringContainsOnlyAlphanumeric(input) {
93
- const rval = /^[0-9a-zA-Z]+$/.test(input);
94
- return rval;
95
- }
96
- static stringContainsOnlyHex(input) {
97
- const rval = /^[0-9a-fA-F]+$/.test(input);
98
- return rval;
99
- }
100
- static stringContainsOnly(inVal, validCharsIn) {
101
- const input = !inVal ? '' : inVal;
102
- const validChars = !validCharsIn ? '' : validCharsIn;
103
- let rval = true;
104
- for (let i = 0; i < input.length && rval; i++) {
105
- rval = validChars.indexOf(input.charAt(i)) >= 0;
106
- }
107
- return rval;
108
- }
109
- static obscure(input, prefixLength = 2, suffixLength = 2) {
110
- if (!input) {
111
- return input;
112
- }
113
- const len = input.length;
114
- let pl = prefixLength;
115
- let sl = suffixLength;
116
- while (len > 0 && len < pl + sl + 1) {
117
- pl = Math.max(0, pl - 1);
118
- sl = Math.max(0, sl - 1);
119
- }
120
- const rem = len - (pl + sl);
121
- let rval = '';
122
- rval += input.substring(0, pl);
123
- for (let i = 0; i < rem; i++) {
124
- rval += '*';
125
- }
126
- rval += input.substring(len - sl);
127
- return rval;
128
- }
129
- static leadingZeros(inVal, size) {
130
- const pad = '00000000000000000000000000000000000000000000000000';
131
- let negative = false;
132
- let sVal = String(inVal);
133
- if (sVal.startsWith('-')) {
134
- negative = true;
135
- sVal = sVal.substring(1);
136
- }
137
- if (size > pad.length) {
138
- throw new Error('Cannot format number that large');
139
- }
140
- let rval = (pad + sVal).slice(-1 * size);
141
- if (negative) {
142
- rval = '-' + rval;
143
- }
144
- return rval;
145
- }
146
- static trimToEmpty(input) {
147
- const t = input ? StringRatchet.safeString(input) : '';
148
- return t.trim();
149
- }
150
- static trimToNull(input) {
151
- const x = StringRatchet.trimToEmpty(input);
152
- return x.length > 0 ? x : null;
153
- }
154
- static trimAllStringPropertiesToNullInPlace(input) {
155
- return StringRatchet.trimAllStringPropertiesInPlace(input, false);
156
- }
157
- static trimAllStringPropertiesToEmptyInPlace(input) {
158
- return StringRatchet.trimAllStringPropertiesInPlace(input, true);
159
- }
160
- static trimAllStringPropertiesInPlace(input, toEmpty) {
161
- const dealKeys = Object.keys(input);
162
- dealKeys.forEach((key) => {
163
- const val = input[key];
164
- if (val != null && typeof val === 'string') {
165
- input[key] = toEmpty ? StringRatchet.trimToEmpty(input[key]) : StringRatchet.trimToNull(input[key]);
166
- }
167
- });
168
- return input;
169
- }
170
- static stripNonNumeric(input) {
171
- let rval = input;
172
- if (input != null && !StringRatchet.stringContainsOnlyNumbers(input)) {
173
- rval = '';
174
- for (let i = 0; i < input.length; i++) {
175
- const c = input.charAt(i);
176
- if (StringRatchet.stringContainsOnlyNumbers(c) || (i === 0 && c === '-')) {
177
- rval += c;
178
- }
179
- }
180
- }
181
- return rval;
182
- }
183
- static csvSafe(input) {
184
- let rval = StringRatchet.trimToEmpty(StringRatchet.safeString(input));
185
- rval.split('"').join('\\"');
186
- if (rval.indexOf(',') !== -1 || rval.indexOf('"') !== -1 || rval.indexOf("'") !== -1) {
187
- rval = '"' + rval + '"';
188
- }
189
- return rval;
190
- }
191
- static stripNonAscii(value) {
192
- const reduced = [...value].reduce((previousValue, currentValue) => {
193
- const charCode = currentValue.charCodeAt(0);
194
- if (charCode > 127) {
195
- return previousValue;
196
- }
197
- return previousValue + currentValue;
198
- });
199
- return reduced;
200
- }
201
- }