@radically-straightforward/utilities 1.1.1 → 1.2.1
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/CHANGELOG.md +8 -0
- package/README.md +24 -1
- package/build/index.d.mts +22 -1
- package/build/index.d.mts.map +1 -1
- package/build/index.mjs +44 -5
- package/build/index.mjs.map +1 -1
- package/build/index.test.mjs +32 -4
- package/build/index.test.mjs.map +1 -1
- package/package.json +1 -1
- package/source/index.mts +44 -5
- package/source/index.test.mts +38 -4
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.2.1 · 2024-03-12
|
4
|
+
|
5
|
+
- Changed `backgroundJob()` so that in Node.js it doesn’t leak `process.once.("gracefulTermination")` event listeners to terminate gracefully.
|
6
|
+
|
7
|
+
## 1.2.0 · 2024-03-07
|
8
|
+
|
9
|
+
- Added `JSONLinesTransformStream`.
|
10
|
+
|
3
11
|
## 1.1.1 · 2024-02-21
|
4
12
|
|
5
13
|
- Added date to `log()`.
|
package/README.md
CHANGED
@@ -93,7 +93,7 @@ A promisified version of `setTimeout()`. Bare-bones: It doesn’t even offer a w
|
|
93
93
|
export function randomString(): string;
|
94
94
|
```
|
95
95
|
|
96
|
-
A fast random string generator. The generated strings are
|
96
|
+
A fast random string generator. The generated strings vary in length, but are generally around 10 characters. The generated strings include the characters `[a-z0-9]`. The generated strings are **not** cryptographically secure—if you need that, then use [`crypto-random-string`](https://www.npmjs.com/package/crypto-random-string).
|
97
97
|
|
98
98
|
### `log()`
|
99
99
|
|
@@ -103,6 +103,29 @@ export function log(...messageParts: string[]): void;
|
|
103
103
|
|
104
104
|
Tab-separated logging.
|
105
105
|
|
106
|
+
### `JSONLinesTransformStream`
|
107
|
+
|
108
|
+
```typescript
|
109
|
+
export class JSONLinesTransformStream extends TransformStream;
|
110
|
+
```
|
111
|
+
|
112
|
+
A [TransformStream](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream) to convert a stream of a string with JSON lines into a stream of JSON objects.
|
113
|
+
|
114
|
+
**Example**
|
115
|
+
|
116
|
+
```typescript
|
117
|
+
const reader = new Blob([
|
118
|
+
`\n\n${JSON.stringify("hi")}\n${JSON.stringify({ hello: "world" })}\n`,
|
119
|
+
])
|
120
|
+
.stream()
|
121
|
+
.pipeThrough(new TextDecoderStream())
|
122
|
+
.pipeThrough(new utilities.JSONLinesTransformStream())
|
123
|
+
.getReader();
|
124
|
+
(await reader.read()).value; // => "hi"
|
125
|
+
(await reader.read()).value; // => { hello: "world" }
|
126
|
+
(await reader.read()).value; // => undefined
|
127
|
+
```
|
128
|
+
|
106
129
|
### `Intern`
|
107
130
|
|
108
131
|
```typescript
|
package/build/index.d.mts
CHANGED
@@ -56,13 +56,34 @@ export declare function backgroundJob({ interval, intervalVariance, }: {
|
|
56
56
|
*/
|
57
57
|
export declare function sleep(duration: number): Promise<void>;
|
58
58
|
/**
|
59
|
-
* A fast random string generator. The generated strings are
|
59
|
+
* A fast random string generator. The generated strings vary in length, but are generally around 10 characters. The generated strings include the characters `[a-z0-9]`. The generated strings are **not** cryptographically secure—if you need that, then use [`crypto-random-string`](https://www.npmjs.com/package/crypto-random-string).
|
60
60
|
*/
|
61
61
|
export declare function randomString(): string;
|
62
62
|
/**
|
63
63
|
* Tab-separated logging.
|
64
64
|
*/
|
65
65
|
export declare function log(...messageParts: string[]): void;
|
66
|
+
/**
|
67
|
+
* A [TransformStream](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream) to convert a stream of a string with JSON lines into a stream of JSON objects.
|
68
|
+
*
|
69
|
+
* **Example**
|
70
|
+
*
|
71
|
+
* ```typescript
|
72
|
+
* const reader = new Blob([
|
73
|
+
* `\n\n${JSON.stringify("hi")}\n${JSON.stringify({ hello: "world" })}\n`,
|
74
|
+
* ])
|
75
|
+
* .stream()
|
76
|
+
* .pipeThrough(new TextDecoderStream())
|
77
|
+
* .pipeThrough(new utilities.JSONLinesTransformStream())
|
78
|
+
* .getReader();
|
79
|
+
* (await reader.read()).value; // => "hi"
|
80
|
+
* (await reader.read()).value; // => { hello: "world" }
|
81
|
+
* (await reader.read()).value; // => undefined
|
82
|
+
* ```
|
83
|
+
*/
|
84
|
+
export declare class JSONLinesTransformStream extends TransformStream {
|
85
|
+
constructor();
|
86
|
+
}
|
66
87
|
/**
|
67
88
|
* Utility type for `intern()`.
|
68
89
|
*/
|
package/build/index.d.mts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../source/index.mts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,aAAa,CAC3B,EACE,QAAQ,EACR,gBAAsB,GACvB,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,EAClD,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC9B;IAAE,GAAG,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../source/index.mts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,aAAa,CAC3B,EACE,QAAQ,EACR,gBAAsB,GACvB,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,EAClD,GAAG,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC9B;IAAE,GAAG,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAwCvC;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,GAAG,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAEnD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,wBAAyB,SAAQ,eAAe;;CAkB5D;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,GAAG;IAAE,CAAC,YAAY,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,SAAS,GACT,IAAI,GACJ,MAAM,CAAC,OAAO,CAAC,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqGG;AACH,wBAAgB,MAAM,CACpB,IAAI,SAAS,KAAK,CAAC,gBAAgB,CAAC,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAAE,EAC1E,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAyC3B;yBA3Ce,MAAM;;;;;;;;;;;;;;;;AA6CtB,eAAO,MAAM,YAAY,eAAmB,CAAC"}
|
package/build/index.mjs
CHANGED
@@ -73,13 +73,14 @@ export function backgroundJob({ interval, intervalVariance = 0.1, }, job) {
|
|
73
73
|
stop: () => {
|
74
74
|
clearTimeout(timeout);
|
75
75
|
state = "stopped";
|
76
|
+
process?.off?.("gracefulTermination", gracefulTerminationListener);
|
76
77
|
},
|
77
78
|
};
|
78
79
|
scheduler.run();
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
const gracefulTerminationListener = () => {
|
81
|
+
scheduler.stop();
|
82
|
+
};
|
83
|
+
process?.once?.("gracefulTermination", gracefulTerminationListener);
|
83
84
|
return scheduler;
|
84
85
|
}
|
85
86
|
/**
|
@@ -89,7 +90,7 @@ export function sleep(duration) {
|
|
89
90
|
return new Promise((resolve) => setTimeout(resolve, duration));
|
90
91
|
}
|
91
92
|
/**
|
92
|
-
* A fast random string generator. The generated strings are
|
93
|
+
* A fast random string generator. The generated strings vary in length, but are generally around 10 characters. The generated strings include the characters `[a-z0-9]`. The generated strings are **not** cryptographically secure—if you need that, then use [`crypto-random-string`](https://www.npmjs.com/package/crypto-random-string).
|
93
94
|
*/
|
94
95
|
export function randomString() {
|
95
96
|
return Math.random().toString(36).slice(2);
|
@@ -100,6 +101,44 @@ export function randomString() {
|
|
100
101
|
export function log(...messageParts) {
|
101
102
|
console.log([new Date().toISOString(), ...messageParts].join(" \t"));
|
102
103
|
}
|
104
|
+
/**
|
105
|
+
* A [TransformStream](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream) to convert a stream of a string with JSON lines into a stream of JSON objects.
|
106
|
+
*
|
107
|
+
* **Example**
|
108
|
+
*
|
109
|
+
* ```typescript
|
110
|
+
* const reader = new Blob([
|
111
|
+
* `\n\n${JSON.stringify("hi")}\n${JSON.stringify({ hello: "world" })}\n`,
|
112
|
+
* ])
|
113
|
+
* .stream()
|
114
|
+
* .pipeThrough(new TextDecoderStream())
|
115
|
+
* .pipeThrough(new utilities.JSONLinesTransformStream())
|
116
|
+
* .getReader();
|
117
|
+
* (await reader.read()).value; // => "hi"
|
118
|
+
* (await reader.read()).value; // => { hello: "world" }
|
119
|
+
* (await reader.read()).value; // => undefined
|
120
|
+
* ```
|
121
|
+
*/
|
122
|
+
export class JSONLinesTransformStream extends TransformStream {
|
123
|
+
constructor() {
|
124
|
+
let buffer = "";
|
125
|
+
super({
|
126
|
+
async transform(chunk, controller) {
|
127
|
+
buffer += await chunk;
|
128
|
+
const lines = buffer.split("\n");
|
129
|
+
buffer = lines.pop() ?? "";
|
130
|
+
for (const line of lines)
|
131
|
+
if (line.trim() !== "")
|
132
|
+
try {
|
133
|
+
controller.enqueue(JSON.parse(line));
|
134
|
+
}
|
135
|
+
catch (error) {
|
136
|
+
controller.error(error);
|
137
|
+
}
|
138
|
+
},
|
139
|
+
});
|
140
|
+
}
|
141
|
+
}
|
103
142
|
/**
|
104
143
|
* [Interning](<https://en.wikipedia.org/wiki/Interning_(computer_science)>) a value makes it unique across the program, which is useful for checking equality with `===` (reference equality), using it as a key in a `Map`, adding it to a `Set`, and so forth:
|
105
144
|
*
|
package/build/index.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../source/index.mts"],"names":[],"mappings":"AAAA,IAAI,OAAO,KAAK,SAAS;IAAE,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,UAAU,aAAa,CAC3B,EACE,QAAQ,EACR,gBAAgB,GAAG,GAAG,GAC0B,EAClD,GAA+B;IAE/B,IAAI,KAAK,GACP,UAAU,CAAC;IACb,IAAI,OAAO,GAAQ,SAAS,CAAC;IAC7B,MAAM,SAAS,GAAG;QAChB,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,QAAQ,KAAK,EAAE,CAAC;gBACd,KAAK,UAAU;oBACb,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,KAAK,GAAG,SAAS,CAAC;oBAClB,MAAM,GAAG,EAAE,CAAC;oBACZ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,0BAA0B,EAAE,CAAC;wBAChE,OAAO,GAAG,UAAU,CAClB,GAAG,EAAE;4BACH,SAAS,CAAC,GAAG,EAAE,CAAC;wBAClB,CAAC,EACA,KAAa,KAAK,0BAA0B;4BAC3C,CAAC,CAAC,CAAC;4BACH,CAAC,CAAC,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,CAC3D,CAAC;wBACF,KAAK,GAAG,UAAU,CAAC;oBACrB,CAAC;oBACD,MAAM;gBACR,KAAK,SAAS;oBACZ,KAAK,GAAG,0BAA0B,CAAC;oBACnC,MAAM;YACV,CAAC;QACH,CAAC;QACD,IAAI,EAAE,GAAG,EAAE;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,KAAK,GAAG,SAAS,CAAC;
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../source/index.mts"],"names":[],"mappings":"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"}
|
package/build/index.test.mjs
CHANGED
@@ -7,6 +7,11 @@ test("backgroundJob()", {
|
|
7
7
|
? false
|
8
8
|
: "Run interactive test with ‘node ./build/index.test.mjs’.",
|
9
9
|
}, async () => {
|
10
|
+
for (let iteration = 0; iteration < 1000; iteration++) {
|
11
|
+
const backgroundJob = utilities.backgroundJob({ interval: 3 * 1000 }, () => { });
|
12
|
+
backgroundJob.stop();
|
13
|
+
// If background jobs leak ‘process.once("gracefulTermination")’ event listeners, then we get a warning in the console.
|
14
|
+
}
|
10
15
|
const backgroundJob = utilities.backgroundJob({ interval: 3 * 1000 }, async () => {
|
11
16
|
console.log("backgroundJob(): Running background job...");
|
12
17
|
await utilities.sleep(3 * 1000);
|
@@ -23,13 +28,36 @@ test("sleep()", async () => {
|
|
23
28
|
assert(Date.now() - before >= 1000);
|
24
29
|
});
|
25
30
|
test("randomString()", () => {
|
26
|
-
|
27
|
-
assert(10 <= randomString.length && randomString.length <= 11);
|
28
|
-
assert.match(randomString, /^[0-9a-z]+$/);
|
31
|
+
assert.match(utilities.randomString(), /^[a-z0-9]+$/);
|
29
32
|
});
|
30
|
-
test("
|
33
|
+
test("log()", () => {
|
31
34
|
utilities.log("EXAMPLE", "OF", "TAB-SEPARATED LOGGING");
|
32
35
|
});
|
36
|
+
test("JSONLinesTransformStream", async () => {
|
37
|
+
{
|
38
|
+
const reader = new Blob([
|
39
|
+
`\n\n${JSON.stringify("hi")}\n${JSON.stringify({ hello: "world" })}\n`,
|
40
|
+
])
|
41
|
+
.stream()
|
42
|
+
.pipeThrough(new TextDecoderStream())
|
43
|
+
.pipeThrough(new utilities.JSONLinesTransformStream())
|
44
|
+
.getReader();
|
45
|
+
assert.equal((await reader.read()).value, "hi");
|
46
|
+
assert.deepEqual((await reader.read()).value, { hello: "world" });
|
47
|
+
assert.equal((await reader.read()).value, undefined);
|
48
|
+
}
|
49
|
+
{
|
50
|
+
const reader = new Blob([`\n\n${JSON.stringify("hi")}\n{\n`])
|
51
|
+
.stream()
|
52
|
+
.pipeThrough(new TextDecoderStream())
|
53
|
+
.pipeThrough(new utilities.JSONLinesTransformStream())
|
54
|
+
.getReader();
|
55
|
+
assert.equal((await reader.read()).value, "hi");
|
56
|
+
await assert.rejects(async () => {
|
57
|
+
await reader.read();
|
58
|
+
});
|
59
|
+
}
|
60
|
+
});
|
33
61
|
test("intern()", () => {
|
34
62
|
// @ts-expect-error
|
35
63
|
assert(([1] === [1]) === false);
|
package/build/index.test.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.test.mjs","sourceRoot":"","sources":["../source/index.test.mts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,KAAK,SAAS,MAAM,sCAAsC,CAAC;AAClE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,sCAAsC,CAAC;AAEnE,IAAI,CACF,iBAAiB,EACjB;IACE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;QACvB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,0DAA0D;CAC/D,EACD,KAAK,IAAI,EAAE;IACT,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAC3C,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,EACtB,KAAK,IAAI,EAAE;QACT,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC,CACF,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,aAAa,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CACT,4FAA4F,CAC7F,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC1B,MAAM,YAAY,GAAG,SAAS,CAAC,
|
1
|
+
{"version":3,"file":"index.test.mjs","sourceRoot":"","sources":["../source/index.test.mts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,KAAK,SAAS,MAAM,sCAAsC,CAAC;AAClE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,sCAAsC,CAAC;AAEnE,IAAI,CACF,iBAAiB,EACjB;IACE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;QACvB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,0DAA0D;CAC/D,EACD,KAAK,IAAI,EAAE;IACT,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;QACtD,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAC3C,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,EACtB,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QACF,aAAa,CAAC,IAAI,EAAE,CAAC;QACrB,uHAAuH;IACzH,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAC3C,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,EACtB,KAAK,IAAI,EAAE;QACT,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC,CACF,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,aAAa,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CACT,4FAA4F,CAC7F,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC1B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;IACjB,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;IAC1C,CAAC;QACC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC;YACtB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI;SACvE,CAAC;aACC,MAAM,EAAE;aACR,WAAW,CAAC,IAAI,iBAAiB,EAAE,CAAC;aACpC,WAAW,CAAC,IAAI,SAAS,CAAC,wBAAwB,EAAE,CAAC;aACrD,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,CAAC;QACC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC1D,MAAM,EAAE;aACR,WAAW,CAAC,IAAI,iBAAiB,EAAE,CAAC;aACpC,WAAW,CAAC,IAAI,SAAS,CAAC,wBAAwB,EAAE,CAAC;aACrD,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;IACpB,mBAAmB;IACnB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;IAChC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhD,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1B,CAAC;QACC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;QACxC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,CAAC;QACC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAsC,CAAC;QAC1D,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,CAAC;QACC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAY,CAAC;QAChC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACb,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,CAAC;QACC,MAAM,GAAG,GAAG,IAAI,GAAG,EAA8B,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACjB,mBAAmB;QACnB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAExC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACjB,mBAAmB;QACnB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,CAAC;QACC,MAAM,UAAU,GAAG,IAAI,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,mCAAmC;QACnC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
package/source/index.mts
CHANGED
@@ -83,13 +83,14 @@ export function backgroundJob(
|
|
83
83
|
stop: () => {
|
84
84
|
clearTimeout(timeout);
|
85
85
|
state = "stopped";
|
86
|
+
process?.off?.("gracefulTermination", gracefulTerminationListener);
|
86
87
|
},
|
87
88
|
};
|
88
89
|
scheduler.run();
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
90
|
+
const gracefulTerminationListener = () => {
|
91
|
+
scheduler.stop();
|
92
|
+
};
|
93
|
+
process?.once?.("gracefulTermination", gracefulTerminationListener);
|
93
94
|
return scheduler;
|
94
95
|
}
|
95
96
|
|
@@ -101,7 +102,7 @@ export function sleep(duration: number): Promise<void> {
|
|
101
102
|
}
|
102
103
|
|
103
104
|
/**
|
104
|
-
* A fast random string generator. The generated strings are
|
105
|
+
* A fast random string generator. The generated strings vary in length, but are generally around 10 characters. The generated strings include the characters `[a-z0-9]`. The generated strings are **not** cryptographically secure—if you need that, then use [`crypto-random-string`](https://www.npmjs.com/package/crypto-random-string).
|
105
106
|
*/
|
106
107
|
export function randomString(): string {
|
107
108
|
return Math.random().toString(36).slice(2);
|
@@ -114,6 +115,44 @@ export function log(...messageParts: string[]): void {
|
|
114
115
|
console.log([new Date().toISOString(), ...messageParts].join(" \t"));
|
115
116
|
}
|
116
117
|
|
118
|
+
/**
|
119
|
+
* A [TransformStream](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream) to convert a stream of a string with JSON lines into a stream of JSON objects.
|
120
|
+
*
|
121
|
+
* **Example**
|
122
|
+
*
|
123
|
+
* ```typescript
|
124
|
+
* const reader = new Blob([
|
125
|
+
* `\n\n${JSON.stringify("hi")}\n${JSON.stringify({ hello: "world" })}\n`,
|
126
|
+
* ])
|
127
|
+
* .stream()
|
128
|
+
* .pipeThrough(new TextDecoderStream())
|
129
|
+
* .pipeThrough(new utilities.JSONLinesTransformStream())
|
130
|
+
* .getReader();
|
131
|
+
* (await reader.read()).value; // => "hi"
|
132
|
+
* (await reader.read()).value; // => { hello: "world" }
|
133
|
+
* (await reader.read()).value; // => undefined
|
134
|
+
* ```
|
135
|
+
*/
|
136
|
+
export class JSONLinesTransformStream extends TransformStream {
|
137
|
+
constructor() {
|
138
|
+
let buffer = "";
|
139
|
+
super({
|
140
|
+
async transform(chunk, controller) {
|
141
|
+
buffer += await chunk;
|
142
|
+
const lines = buffer.split("\n");
|
143
|
+
buffer = lines.pop() ?? "";
|
144
|
+
for (const line of lines)
|
145
|
+
if (line.trim() !== "")
|
146
|
+
try {
|
147
|
+
controller.enqueue(JSON.parse(line));
|
148
|
+
} catch (error) {
|
149
|
+
controller.error(error);
|
150
|
+
}
|
151
|
+
},
|
152
|
+
});
|
153
|
+
}
|
154
|
+
}
|
155
|
+
|
117
156
|
/**
|
118
157
|
* Utility type for `intern()`.
|
119
158
|
*/
|
package/source/index.test.mts
CHANGED
@@ -11,6 +11,15 @@ test(
|
|
11
11
|
: "Run interactive test with ‘node ./build/index.test.mjs’.",
|
12
12
|
},
|
13
13
|
async () => {
|
14
|
+
for (let iteration = 0; iteration < 1000; iteration++) {
|
15
|
+
const backgroundJob = utilities.backgroundJob(
|
16
|
+
{ interval: 3 * 1000 },
|
17
|
+
() => {},
|
18
|
+
);
|
19
|
+
backgroundJob.stop();
|
20
|
+
// If background jobs leak ‘process.once("gracefulTermination")’ event listeners, then we get a warning in the console.
|
21
|
+
}
|
22
|
+
|
14
23
|
const backgroundJob = utilities.backgroundJob(
|
15
24
|
{ interval: 3 * 1000 },
|
16
25
|
async () => {
|
@@ -35,15 +44,40 @@ test("sleep()", async () => {
|
|
35
44
|
});
|
36
45
|
|
37
46
|
test("randomString()", () => {
|
38
|
-
|
39
|
-
assert(10 <= randomString.length && randomString.length <= 11);
|
40
|
-
assert.match(randomString, /^[0-9a-z]+$/);
|
47
|
+
assert.match(utilities.randomString(), /^[a-z0-9]+$/);
|
41
48
|
});
|
42
49
|
|
43
|
-
test("
|
50
|
+
test("log()", () => {
|
44
51
|
utilities.log("EXAMPLE", "OF", "TAB-SEPARATED LOGGING");
|
45
52
|
});
|
46
53
|
|
54
|
+
test("JSONLinesTransformStream", async () => {
|
55
|
+
{
|
56
|
+
const reader = new Blob([
|
57
|
+
`\n\n${JSON.stringify("hi")}\n${JSON.stringify({ hello: "world" })}\n`,
|
58
|
+
])
|
59
|
+
.stream()
|
60
|
+
.pipeThrough(new TextDecoderStream())
|
61
|
+
.pipeThrough(new utilities.JSONLinesTransformStream())
|
62
|
+
.getReader();
|
63
|
+
assert.equal((await reader.read()).value, "hi");
|
64
|
+
assert.deepEqual((await reader.read()).value, { hello: "world" });
|
65
|
+
assert.equal((await reader.read()).value, undefined);
|
66
|
+
}
|
67
|
+
|
68
|
+
{
|
69
|
+
const reader = new Blob([`\n\n${JSON.stringify("hi")}\n{\n`])
|
70
|
+
.stream()
|
71
|
+
.pipeThrough(new TextDecoderStream())
|
72
|
+
.pipeThrough(new utilities.JSONLinesTransformStream())
|
73
|
+
.getReader();
|
74
|
+
assert.equal((await reader.read()).value, "hi");
|
75
|
+
await assert.rejects(async () => {
|
76
|
+
await reader.read();
|
77
|
+
});
|
78
|
+
}
|
79
|
+
});
|
80
|
+
|
47
81
|
test("intern()", () => {
|
48
82
|
// @ts-expect-error
|
49
83
|
assert(([1] === [1]) === false);
|