@toa.io/extensions.realtime 1.0.0-alpha.284 → 1.0.0-alpha.286
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/components/realtime.streams/manifest.toa.yaml +4 -2
- package/components/realtime.streams/operations/create.js +1 -1
- package/components/realtime.streams/operations/lib/Stash.js +1 -1
- package/components/realtime.streams/operations/lib/Stream.js +1 -1
- package/components/realtime.streams/operations/push.js +1 -1
- package/components/realtime.streams/source/create.ts +7 -10
- package/components/realtime.streams/source/lib/Stash.ts +24 -26
- package/components/realtime.streams/source/lib/Stream.ts +9 -7
- package/components/realtime.streams/source/push.ts +5 -3
- package/components/realtime.streams/tsconfig.tsbuildinfo +1 -1
- package/context.toa.yaml +2 -2
- package/cucumber.mjs +3 -0
- package/features/steps/Components.ts +8 -7
- package/features/steps/Realtime.ts +4 -5
- package/features/steps/Streams.ts +9 -12
- package/features/steps/components/messages/manifest.toa.yaml +16 -18
- package/package.json +4 -4
- package/source/Composition.ts +5 -5
- package/source/Factory.ts +5 -4
- package/source/Realtime.ts +16 -11
- package/source/Receiver.ts +29 -20
- package/source/Routes.ts +10 -8
- package/source/extension.ts +20 -10
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Factory.d.ts +1 -1
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Realtime.js.map +1 -1
- package/transpiled/Receiver.d.ts +2 -1
- package/transpiled/Receiver.js +5 -3
- package/transpiled/Receiver.js.map +1 -1
- package/transpiled/Routes.js +1 -2
- package/transpiled/Routes.js.map +1 -1
- package/transpiled/extension.d.ts +3 -0
- package/transpiled/extension.js +10 -3
- package/transpiled/extension.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/CHANGELOG.md +0 -344
|
@@ -30,14 +30,16 @@ configuration:
|
|
|
30
30
|
properties:
|
|
31
31
|
maxlen:
|
|
32
32
|
type: number
|
|
33
|
-
default: 1000
|
|
34
33
|
expire:
|
|
35
34
|
type: number
|
|
36
|
-
default: 300
|
|
37
35
|
type: object
|
|
38
36
|
# both have defaults, so the component reads them without checking
|
|
39
37
|
required: [maxlen, expire]
|
|
40
38
|
|
|
39
|
+
defaults:
|
|
40
|
+
maxlen: 1000
|
|
41
|
+
expire: 300
|
|
42
|
+
|
|
41
43
|
state: ~
|
|
42
44
|
stash: ~
|
|
43
45
|
|
|
@@ -62,4 +62,4 @@ export class Effect {
|
|
|
62
62
|
return stream;
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRTlDLE1BQU0sT0FBTyxNQUFNO0lBQ0EsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO0lBQzVDLEtBQUssQ0FBUTtJQUNiLElBQUksQ0FBSztJQUVWLEtBQUssQ0FBQyxPQUFnQjtRQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBO1FBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFbkYsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUE7SUFDbEMsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFFbEUsK0VBQStFO1FBQy9FLCtFQUErRTtRQUMvRSxvQkFBb0I7UUFDcEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM1RCxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFZO1FBQy9CLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUE7UUFFckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFP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
|
|
@@ -83,4 +83,4 @@ class NoResultsError extends Error {
|
|
|
83
83
|
code = 'NO_RESULTS';
|
|
84
84
|
}
|
|
85
85
|
const ERR_NO_RESULTS = new NoResultsError();
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3Rhc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvbGliL1N0YXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxLQUFLO0lBQ0MsS0FBSyxDQUFPO0lBQ1osYUFBYSxDQUFlO0lBQzVCLElBQUksQ0FBSztJQUUxQixZQUFtQixLQUFVLEVBQUUsYUFBNEIsRUFBRSxJQUFTO1FBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO0lBQ2xCLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQVc7UUFDOUIsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQVcsRUFBRSxLQUFhLEVBQUUsSUFBYTtRQUN6RCxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRyxDQUNkLEdBQVcsRUFDWCxLQUFhO1FBRWIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVoQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLO2FBQzdCLEtBQUssQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQzthQUM1QixLQUFLLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWpDLElBQUksT0FBTyxLQUFLLElBQUk7WUFBRSxPQUFPLGNBQWMsQ0FBQTtRQUUzQyxJQUFJLE9BQU8sWUFBWSxLQUFLO1lBQUUsT0FBTyxPQUFPLENBQUE7UUFF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
|
|
@@ -40,4 +40,4 @@ export class Stream extends Readable {
|
|
|
40
40
|
}
|
|
41
41
|
const HEARTBEAT_INTERVAL = 16_000; // why?
|
|
42
42
|
const objectMode = { objectMode: true };
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2xpYi9TdHJlYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE1BQU0sT0FBTyxNQUFPLFNBQVEsUUFBUTtJQUMzQixNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUUxQixRQUFRLEdBQTBCLElBQUksQ0FBQTtJQUN0QyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBRXJCO1FBQ0UsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ25CLENBQUM7SUFFRCxpQkFBaUI7SUFDRCxLQUFLO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFZSxRQUFRLENBQ3RCLEtBQW1CLEVBQ25CLFFBQXdDO1FBRXhDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV4RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUUzQixLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRUQsNEVBQTRFO0lBQ3JFLEtBQUs7UUFDVixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQTtRQUVqQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0IsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtRQUN0QixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQU0sR0FBYSxJQUFJO1FBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUU1QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUVyRCxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdEMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtRQUN0QixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0NBQ0Y7QUFFRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQSxDQUFDLE9BQU87QUFDekMsTUFBTSxVQUFVLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUEifQ==
|
|
@@ -7,4 +7,4 @@ export async function effect({ key, event, data }, context) {
|
|
|
7
7
|
context.state.streams.get(key)?.push({ event: 'token', data: token });
|
|
8
8
|
});
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9wdXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUMxQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFhLEVBQy9CLE9BQWdCO0lBRWhCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUVyRCxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzdELElBQUksS0FBSyxZQUFZLEtBQUs7WUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7O1lBQ2pFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQzVFLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyJ9
|
|
@@ -8,7 +8,7 @@ export class Effect implements Operation {
|
|
|
8
8
|
private stash!: Stash
|
|
9
9
|
private logs: any
|
|
10
10
|
|
|
11
|
-
public mount
|
|
11
|
+
public mount(context: Context): void {
|
|
12
12
|
context.state.streams = this.streams
|
|
13
13
|
context.state.stash = new Stash(context.stash, context.configuration, context.logs)
|
|
14
14
|
|
|
@@ -16,17 +16,16 @@ export class Effect implements Operation {
|
|
|
16
16
|
this.stash = context.state.stash
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
public unmount
|
|
19
|
+
public unmount(): void {
|
|
20
20
|
this.logs.info('Destroying streams', { count: this.streams.size })
|
|
21
21
|
|
|
22
22
|
// closed, not destroyed: destroying a stream that is still piped to a response
|
|
23
23
|
// makes end-of-stream report a premature close, which reaches no one and takes
|
|
24
24
|
// the process down.
|
|
25
|
-
for (const stream of this.streams.values())
|
|
26
|
-
stream.close()
|
|
25
|
+
for (const stream of this.streams.values()) stream.close()
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
public async execute
|
|
28
|
+
public async execute(input: Input): Promise<Readable> {
|
|
30
29
|
const key = input.key
|
|
31
30
|
|
|
32
31
|
if (!this.streams.has(key)) {
|
|
@@ -43,8 +42,7 @@ export class Effect implements Operation {
|
|
|
43
42
|
void this.stash.connect(key).then((token) => {
|
|
44
43
|
if (token instanceof Error)
|
|
45
44
|
this.logs.error('Failed to connect to stash', { key, error: token })
|
|
46
|
-
else
|
|
47
|
-
this.streams.get(key)?.push({ event: 'token', data: token })
|
|
45
|
+
else this.streams.get(key)?.push({ event: 'token', data: token })
|
|
48
46
|
})
|
|
49
47
|
else
|
|
50
48
|
void this.stash.pop(key, input.token).then((result) => {
|
|
@@ -60,8 +58,7 @@ export class Effect implements Operation {
|
|
|
60
58
|
|
|
61
59
|
const stream = this.streams.get(key)
|
|
62
60
|
|
|
63
|
-
if (stream === undefined)
|
|
64
|
-
return
|
|
61
|
+
if (stream === undefined) return
|
|
65
62
|
|
|
66
63
|
const [token, events] = result
|
|
67
64
|
|
|
@@ -74,7 +71,7 @@ export class Effect implements Operation {
|
|
|
74
71
|
return this.streams.get(key)!
|
|
75
72
|
}
|
|
76
73
|
|
|
77
|
-
private createStream
|
|
74
|
+
private createStream(key: string): Stream {
|
|
78
75
|
const stream = new Stream()
|
|
79
76
|
|
|
80
77
|
stream.events.once('destroy', () => {
|
|
@@ -5,37 +5,37 @@ export class Stash {
|
|
|
5
5
|
private readonly configuration: Configuration
|
|
6
6
|
private readonly logs: any
|
|
7
7
|
|
|
8
|
-
public constructor
|
|
8
|
+
public constructor(stash: any, configuration: Configuration, logs: any) {
|
|
9
9
|
this.stash = stash
|
|
10
10
|
this.configuration = configuration
|
|
11
11
|
this.logs = logs
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
public async connect
|
|
14
|
+
public async connect(key: string): Promise<string | Error> {
|
|
15
15
|
return await this.xadd(key, 'connect')
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
public async push
|
|
18
|
+
public async push(key: string, event: string, data: unknown): Promise<string | Error> {
|
|
19
19
|
return await this.xadd(key, event, data)
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
public async pop
|
|
22
|
+
public async pop(
|
|
23
|
+
key: string,
|
|
24
|
+
token: string
|
|
25
|
+
): Promise<[string, Event[]] | null | Error> {
|
|
23
26
|
const stamp = this.decode(token)
|
|
24
27
|
|
|
25
28
|
const results = await this.stash
|
|
26
29
|
.xread('STREAMS', key, stamp)
|
|
27
30
|
.catch((error: Error) => error)
|
|
28
31
|
|
|
29
|
-
if (results === null)
|
|
30
|
-
return ERR_NO_RESULTS
|
|
32
|
+
if (results === null) return ERR_NO_RESULTS
|
|
31
33
|
|
|
32
|
-
if (results instanceof Error)
|
|
33
|
-
return results
|
|
34
|
+
if (results instanceof Error) return results
|
|
34
35
|
|
|
35
36
|
const items = entries(results)
|
|
36
37
|
|
|
37
|
-
if (items === null)
|
|
38
|
-
return null
|
|
38
|
+
if (items === null) return null
|
|
39
39
|
|
|
40
40
|
const events: Event[] = []
|
|
41
41
|
|
|
@@ -48,23 +48,24 @@ export class Stash {
|
|
|
48
48
|
|
|
49
49
|
const data = json === undefined ? undefined : JSON.parse(json)
|
|
50
50
|
|
|
51
|
-
if (data === undefined)
|
|
52
|
-
this.logs.debug('Undefined event payload', { key, event })
|
|
51
|
+
if (data === undefined) this.logs.debug('Undefined event payload', { key, event })
|
|
53
52
|
|
|
54
53
|
events.push({ event, data })
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
if (lastStamp === null)
|
|
58
|
-
return null
|
|
56
|
+
if (lastStamp === null) return null
|
|
59
57
|
|
|
60
58
|
return [this.encode(lastStamp), events]
|
|
61
59
|
}
|
|
62
60
|
|
|
63
|
-
private async xadd
|
|
61
|
+
private async xadd(
|
|
62
|
+
key: string,
|
|
63
|
+
event: string,
|
|
64
|
+
data?: unknown
|
|
65
|
+
): Promise<string | Error> {
|
|
64
66
|
const args = ['MAXLEN', '~', this.configuration.maxlen, '*', 'type', event]
|
|
65
67
|
|
|
66
|
-
if (data !== undefined)
|
|
67
|
-
args.push('data', JSON.stringify(data))
|
|
68
|
+
if (data !== undefined) args.push('data', JSON.stringify(data))
|
|
68
69
|
|
|
69
70
|
const results = await this.stash
|
|
70
71
|
.multi()
|
|
@@ -73,25 +74,22 @@ export class Stash {
|
|
|
73
74
|
.exec()
|
|
74
75
|
.catch((error: Error) => error)
|
|
75
76
|
|
|
76
|
-
if (results === null)
|
|
77
|
-
return ERR_NO_RESULTS
|
|
77
|
+
if (results === null) return ERR_NO_RESULTS
|
|
78
78
|
|
|
79
|
-
if (results instanceof Error)
|
|
80
|
-
return results
|
|
79
|
+
if (results instanceof Error) return results
|
|
81
80
|
|
|
82
81
|
const [[error, stamp]] = results
|
|
83
82
|
|
|
84
|
-
if (error !== null)
|
|
85
|
-
return error
|
|
83
|
+
if (error !== null) return error
|
|
86
84
|
|
|
87
85
|
return this.encode(stamp as string)
|
|
88
86
|
}
|
|
89
87
|
|
|
90
|
-
private encode
|
|
88
|
+
private encode(token: string): string {
|
|
91
89
|
return Buffer.from(token).toString('base64url')
|
|
92
90
|
}
|
|
93
91
|
|
|
94
|
-
private decode
|
|
92
|
+
private decode(token: string): string {
|
|
95
93
|
return Buffer.from(token, 'base64url').toString()
|
|
96
94
|
}
|
|
97
95
|
}
|
|
@@ -101,7 +99,7 @@ export class Stash {
|
|
|
101
99
|
* object keyed by stream name over RESP3. One stream is read, so either way it is the
|
|
102
100
|
* first, and an empty answer means nothing has been added since the token.
|
|
103
101
|
*/
|
|
104
|
-
function entries
|
|
102
|
+
function entries(results: unknown): Entry[] | null {
|
|
105
103
|
if (Array.isArray(results))
|
|
106
104
|
return results.length === 0 ? null : (results[0] as [string, Entry[]])[1]
|
|
107
105
|
|
|
@@ -7,19 +7,21 @@ export class Stream extends Readable {
|
|
|
7
7
|
private interval: NodeJS.Timeout | null = null
|
|
8
8
|
private ended = false
|
|
9
9
|
|
|
10
|
-
public constructor
|
|
10
|
+
public constructor() {
|
|
11
11
|
super(objectMode)
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
// has to be here
|
|
15
|
-
public override _read
|
|
15
|
+
public override _read(): void {
|
|
16
16
|
if (this.interval === null)
|
|
17
17
|
this.interval = setInterval(() => this.heartbeat(), HEARTBEAT_INTERVAL)
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
public override _destroy
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
public override _destroy(
|
|
21
|
+
error: Error | null,
|
|
22
|
+
callback: (error?: Error | null) => void
|
|
23
|
+
): void {
|
|
24
|
+
if (this.interval !== null) clearInterval(this.interval)
|
|
23
25
|
|
|
24
26
|
this.events.emit('destroy')
|
|
25
27
|
|
|
@@ -27,7 +29,7 @@ export class Stream extends Readable {
|
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
/** Ends the stream: whoever reads it gets EOF rather than a broken pipe. */
|
|
30
|
-
public close
|
|
32
|
+
public close(): void {
|
|
31
33
|
this.ended = true
|
|
32
34
|
|
|
33
35
|
if (this.interval !== null) {
|
|
@@ -38,7 +40,7 @@ export class Stream extends Readable {
|
|
|
38
40
|
this.push(null)
|
|
39
41
|
}
|
|
40
42
|
|
|
41
|
-
public heartbeat
|
|
43
|
+
public heartbeat(stream: Readable = this): boolean {
|
|
42
44
|
if (this.ended) return false
|
|
43
45
|
|
|
44
46
|
const resume = stream.push('heartbeat ' + Date.now())
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { type Context, type PushInput } from '../types/index.js'
|
|
2
2
|
|
|
3
|
-
export async function effect
|
|
3
|
+
export async function effect(
|
|
4
|
+
{ key, event, data }: PushInput,
|
|
5
|
+
context: Context
|
|
6
|
+
): Promise<void> {
|
|
4
7
|
context.state.streams.get(key)?.push({ event, data })
|
|
5
8
|
|
|
6
9
|
void context.state.stash.push(key, event, data).then((token) => {
|
|
7
10
|
if (token instanceof Error)
|
|
8
11
|
context.logs.error('Failed to push to stash', { key, error: token })
|
|
9
|
-
else
|
|
10
|
-
context.state.streams.get(key)?.push({ event: 'token', data: token })
|
|
12
|
+
else context.state.streams.get(key)?.push({ event: 'token', data: token })
|
|
11
13
|
})
|
|
12
14
|
}
|