spectrum-ts 0.2.1 → 0.3.0

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.
@@ -1,71 +0,0 @@
1
- import { Repeater } from "@repeaterjs/repeater";
2
-
3
- export interface ManagedStream<T> extends AsyncIterable<T> {
4
- close(): Promise<void>;
5
- }
6
-
7
- type StreamCleanup = void | (() => void | Promise<void>);
8
-
9
- export function stream<T>(
10
- setup: (
11
- emit: (value: T) => void,
12
- end: (error?: unknown) => void
13
- ) => StreamCleanup | Promise<StreamCleanup>
14
- ): ManagedStream<T> {
15
- const repeater = new Repeater<T>(async (push, stop) => {
16
- const emit = (value: T) => {
17
- Promise.resolve(push(value)).catch((error) => {
18
- stop(error);
19
- return undefined;
20
- });
21
- };
22
- const end = (error?: unknown) => {
23
- stop(error);
24
- };
25
- const cleanup = await setup(emit, end);
26
-
27
- try {
28
- await stop;
29
- } finally {
30
- await cleanup?.();
31
- }
32
- });
33
-
34
- return Object.assign(repeater, {
35
- close: async () => {
36
- await repeater.return(undefined);
37
- },
38
- });
39
- }
40
-
41
- export function mergeStreams<T>(
42
- streams: readonly ManagedStream<T>[]
43
- ): ManagedStream<T> {
44
- return stream<T>((emit, end) => {
45
- if (streams.length === 0) {
46
- end();
47
- return;
48
- }
49
-
50
- let openStreams = streams.length;
51
- const workers = streams.map(async (source) => {
52
- try {
53
- for await (const value of source) {
54
- emit(value);
55
- }
56
- } catch (error) {
57
- end(error);
58
- } finally {
59
- openStreams -= 1;
60
- if (openStreams === 0) {
61
- end();
62
- }
63
- }
64
- });
65
-
66
- return async () => {
67
- await Promise.allSettled(streams.map((source) => source.close()));
68
- await Promise.allSettled(workers);
69
- };
70
- });
71
- }