@radically-straightforward/utilities 1.1.1 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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":"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"}
|
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);
|