@toa.io/extensions.realtime 1.0.0-alpha.284 → 1.0.0-alpha.287

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 (37) hide show
  1. package/CHANGELOG.md +1 -337
  2. package/components/realtime.streams/manifest.toa.yaml +4 -2
  3. package/components/realtime.streams/operations/create.js +1 -1
  4. package/components/realtime.streams/operations/lib/Stash.js +1 -1
  5. package/components/realtime.streams/operations/lib/Stream.js +1 -1
  6. package/components/realtime.streams/operations/push.js +1 -1
  7. package/components/realtime.streams/source/create.ts +7 -10
  8. package/components/realtime.streams/source/lib/Stash.ts +24 -26
  9. package/components/realtime.streams/source/lib/Stream.ts +9 -7
  10. package/components/realtime.streams/source/push.ts +5 -3
  11. package/components/realtime.streams/tsconfig.tsbuildinfo +1 -1
  12. package/context.toa.yaml +2 -2
  13. package/cucumber.mjs +3 -0
  14. package/features/steps/Components.ts +8 -7
  15. package/features/steps/Realtime.ts +4 -5
  16. package/features/steps/Streams.ts +9 -12
  17. package/features/steps/components/messages/manifest.toa.yaml +16 -18
  18. package/package.json +4 -4
  19. package/source/Composition.ts +5 -5
  20. package/source/Factory.ts +5 -4
  21. package/source/Realtime.ts +16 -11
  22. package/source/Receiver.ts +29 -20
  23. package/source/Routes.ts +10 -8
  24. package/source/extension.ts +20 -10
  25. package/transpiled/Composition.js.map +1 -1
  26. package/transpiled/Factory.d.ts +1 -1
  27. package/transpiled/Factory.js.map +1 -1
  28. package/transpiled/Realtime.js.map +1 -1
  29. package/transpiled/Receiver.d.ts +2 -1
  30. package/transpiled/Receiver.js +5 -3
  31. package/transpiled/Receiver.js.map +1 -1
  32. package/transpiled/Routes.js +1 -2
  33. package/transpiled/Routes.js.map +1 -1
  34. package/transpiled/extension.d.ts +3 -0
  35. package/transpiled/extension.js +10 -3
  36. package/transpiled/extension.js.map +1 -1
  37. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -3,342 +3,6 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- # [1.0.0-alpha.284](https://github.com/toa-io/toa/compare/v1.0.0-alpha.283...v1.0.0-alpha.284) (2026-09-05)
7
-
8
- ### Bug Fixes
9
-
10
- * **build:** an operations directory holds modules and nothing else ([21a8ca1](https://github.com/toa-io/toa/commit/21a8ca19f1c45aef6cbb443ada0a909d325e76e8))
11
-
12
-
13
- # [1.0.0-alpha.283](https://github.com/toa-io/toa/compare/v1.0.0-alpha.282...v1.0.0-alpha.283) (2026-09-04)
14
-
15
- ### Bug Fixes
16
-
17
- * **cli:** an assignment hands back the new state, not nothing ([91304e9](https://github.com/toa-io/toa/commit/91304e9e9a3bba5933b7421b7a0ffff0c2e47795))
18
- * **exposition:** declare the errors the built-in components return ([27200c3](https://github.com/toa-io/toa/commit/27200c348ab09068d58c52c3e83208cb29cd7290))
19
-
20
- ### Features
21
-
22
- * **cli:** a type module is declarations, so it sits beside a component's source ([ca755d9](https://github.com/toa-io/toa/commit/ca755d93d1a04b7697dd0dd12eb59e5b6e2a71d1))
23
- * **cli:** the built-in components ship types generated from their manifests ([bd7db9e](https://github.com/toa-io/toa/commit/bd7db9e88e46c1060223761898932239127f389a))
24
- * **extensions:** an extension declares what it puts on a component's context ([133bc2a](https://github.com/toa-io/toa/commit/133bc2aad1e45a2d4aa68a08a5e44ca48d3b7414))
25
-
26
-
27
- # [1.0.0-alpha.282](https://github.com/toa-io/toa/compare/v1.0.0-alpha.281...v1.0.0-alpha.282) (2026-09-03)
28
-
29
- ### Bug Fixes
30
-
31
- * **boot:** declare host, and build extensions with it in the step definitions ([915d957](https://github.com/toa-io/toa/commit/915d9571823358f8fca6fe19ef3aabd1b62e5605))
32
-
33
- ### Features
34
-
35
- * **core:** a Host for extensions ([6315eac](https://github.com/toa-io/toa/commit/6315eac1e9fb05be472272de06385c54ad5934ce))
36
-
37
-
38
- # [1.0.0-alpha.278](https://github.com/toa-io/toa/compare/v1.0.0-alpha.277...v1.0.0-alpha.278) (2026-09-03)
6
+ # [1.0.0-alpha.287](https://github.com/toa-io/toa/compare/v1.0.0-alpha.286...v1.0.0-alpha.287) (2026-09-06)
39
7
 
40
8
  **Note:** Version bump only for package @toa.io/extensions.realtime
41
-
42
-
43
-
44
-
45
-
46
- # [1.0.0-alpha.277](https://github.com/toa-io/toa/compare/v1.0.0-alpha.276...v1.0.0-alpha.277) (2026-09-03)
47
-
48
- ### Bug Fixes
49
-
50
- * drop the build output that landed beside the sources ([a724f69](https://github.com/toa-io/toa/commit/a724f6921190e5c9d945e33c6035bb12d832e5c8))
51
- * settle what the module loader made asynchronous ([d4ab9df](https://github.com/toa-io/toa/commit/d4ab9dfb09e382da311dba08f52214e7645f4a6c))
52
- * what the loader resolves, and what it will not ([1b8a02f](https://github.com/toa-io/toa/commit/1b8a02ff0a5e0f18ee62e3f71bc81116f86f9af1))
53
-
54
-
55
- # [1.0.0-alpha.274](https://github.com/toa-io/toa/compare/v1.0.0-alpha.273...v1.0.0-alpha.274) (2026-09-02)
56
-
57
-
58
- * Configuration is served by a component, followed live, and kept per epoch (#1017) ([b05997d](https://github.com/toa-io/toa/commit/b05997d3adb784f238a222cb46878b23859339a2)), closes [#1017](https://github.com/toa-io/toa/issues/1017)
59
-
60
-
61
- ### BREAKING CHANGES
62
-
63
- * a secret configuration value is an object, not a string;
64
- read it with `unwrap()`.
65
-
66
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
67
-
68
- * test(configuration): wait for the second round rather than assume it
69
-
70
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
71
-
72
- * refactor(configuration)!: read a secret with its own unwrap
73
-
74
- Component code depends on no Toa package, so a secret is read as
75
- `context.configuration.apiKey.unwrap()` and the helper in `@toa.io/generic`
76
- goes. A value a component reads as a secret is therefore given as a reference:
77
- `identity.basic` no longer defaults `pepper` to `''`, the development context
78
- and the feature harness give the token keys, the federation client secret and
79
- the signing key as references, and the harness has a step for the secrets a
80
- scenario refers to. CONTRIBUTING states the rule.
81
- * `identity.basic` `pepper` has no default; a value read as a
82
- secret must be given as a `$NAME` reference.
83
-
84
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
85
-
86
- * feat(configuration): list the configurations
87
-
88
- `configuration.values.list` returns every component's configuration for its
89
- deployed epoch, by component name, and `GET /configuration/values/` serves it
90
- behind `system:configuration:get`.
91
-
92
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
93
-
94
- * fix(exposition): write a value in YAML the way its toJSON says
95
-
96
- A redacted secret in a reply was dumped as an empty object; it is written as
97
- `<REDACTED>`, as JSON and msgpack already write it.
98
-
99
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
100
-
101
- * test(configuration): a secret is an object, and stays redacted in a reply
102
-
103
- A component with `{ a: 1, b: $SECRET_B }` returns its configuration as
104
- `{ a: 1, b: '<REDACTED>' }` and the secret itself through `unwrap()`. The reply
105
- step also accepts a reply as a caller across a process boundary receives it,
106
- since a call within the process hands the object over as it is.
107
-
108
- Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
109
-
110
- * chore(schemas): bump the dependencies
111
-
112
- ajv 8.18.0 to 8.20.0, ajv-formats 2.1.1 to 3.0.1, better-ajv-errors 1.2.0
113
- to 2.0.3, fast-glob 3.2.12 to 3.3.3 and js-yaml 4.3.1 to 5.4.1 — the version
114
- exposition already uses. The three majors keep the CommonJS entry points this
115
- library calls: ajv-formats as a function, better-ajv-errors as .default, and
116
- js-yaml's load.
117
-
118
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
119
-
120
- * feat(configuration)!: serve the schema with the value
121
-
122
- GET /configuration/values/:component/ answers { configuration, schema, epoch }
123
- where it answered with the configuration alone, and list carries the schema of
124
- every component. Nothing reads a configuration without needing to know what it
125
- is checked against, and the schema was only ever on the values service.
126
-
127
- An epoch the deployment does not know has no schema; the value stored for it
128
- is still returned.
129
-
130
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
131
-
132
- * feat(configuration): publish a configuration UI
133
-
134
- The values service serves a page at /.configuration on port 8003, out of the
135
- directory ui builds: the configured components, a screen per component showing
136
- what it holds now, and a dialog creating the next one. Reading needs
137
- system:configuration:get and creating needs system:configuration:create.
138
-
139
- A configuration is immutable, so the dialog opens on the current value and what
140
- is left out of it is left out of the component. The editor takes YAML, the
141
- schema is applied before anything is sent, and a secret is a reference the page
142
- never shows.
143
-
144
- The page is always published: the annotation is the per-component values map
145
- and has nowhere to carry a switch.
146
-
147
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
148
-
149
- * feat(introspection): link a component to its configuration
150
-
151
- A card carrying @toa.io/extensions.configuration reads that extension as a link
152
- to the configuration UI rather than as a name, and configuration joins the
153
- namespaces the runtime provides, so its components band under System.
154
-
155
- Deployed, both pages sit behind the same ingress and the path alone is right;
156
- locally each console has its own port.
157
-
158
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
159
-
160
- * feat(introspection): scroll the map, zoom with a modifier
161
-
162
- The map was grabbed to move and zoomed with a bare wheel, which is neither what
163
- a page does nor what the wheel does anywhere else. A plain scroll now pans on
164
- both axes and the wheel scales only with the modifier held — a trackpad pinch
165
- arrives as one of those on every platform.
166
-
167
- A card's own scrollable box keeps its wheel, in both paths.
168
-
169
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
170
-
171
- * refactor(introspection): centre the filter in the header
172
-
173
- The sides take equal space, which is what leaves the filter between them.
174
- Neither side may shrink under what it holds, or the tabs run out from under
175
- their side and across the filter, and the filter across the sign-out button;
176
- the title gives way instead.
177
-
178
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
179
-
180
- * fix(configuration): connect the UI to the values service
181
-
182
- The page was declared as a dependency from inside `open`, and a connector connects
183
- what it depends on before `open` runs — so the server was constructed and never
184
- listened. Nothing caught it: the UI feature builds the server itself.
185
-
186
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
187
-
188
- * feat(configuration)!: reserve resources in the annotation
189
-
190
- The values service deploys like any other and must state what it may take, but the
191
- annotation is a map of component ids and had nowhere to put it — so `toa env` failed
192
- for every context using configuration unless it declared a context-wide `resources`.
193
-
194
- `resources` is now the service's own, read the way `introspection` and `realtime` read
195
- theirs. A component actually named `resources` is written `default.resources`, which is
196
- what its id is anyway.
197
-
198
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
199
-
200
- * feat(configuration): follow the system colour scheme
201
-
202
- The dark tokens were behind a `.dark` class nothing sets, and the `dark:` variant was
203
- pointed at that class too — so a component's own dark styling never applied either.
204
- Both now key off `prefers-color-scheme`, and `color-scheme` hands the native chrome
205
- the same answer.
206
-
207
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
208
-
209
- * feat(introspection): follow the system colour scheme
210
-
211
- The dark tokens were behind a `.dark` class nothing sets, and the `dark:` variant was
212
- pointed at that class too — so a component's own dark styling never applied either.
213
- Both now key off `prefers-color-scheme`, and `color-scheme` hands the native chrome
214
- the same answer.
215
-
216
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
217
-
218
- * feat(configuration): present a change as an edit of what is there
219
-
220
- A configuration is immutable and creating one replaces the whole of it, but the dialog
221
- opens on the current value and the page never shows an older one — so what the reader
222
- does is edit. The words follow: Edit rather than New, Update rather than Create, and
223
- the paragraph explaining the model goes, along with the field's label, which the title
224
- above it already said.
225
-
226
- The editor also stayed as wide as its longest line — `field-sizing: content` sizes to
227
- content, and no `max-width` clamps that — so a long value painted outside the dialog.
228
- It is fixed now, the dialog takes the width the screen has rather than a fixed step,
229
- and the band held for errors no longer leaves a gap when there are none.
230
-
231
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
232
-
233
- * feat(configuration): mark a component that keeps a secret
234
-
235
- A key after the name on the row, wherever the configuration holds a reference, however
236
- deep. The predicate reads the same lines the value screen renders, so the two cannot
237
- disagree about what counts as a secret.
238
-
239
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
240
-
241
- * feat(configuration): lead back to the list from the title
242
-
243
- Every address ends in a slash, so the way up is the address itself on the list and one
244
- level above it on a component's screen — which holds wherever the page is mounted.
245
-
246
- Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
247
-
248
-
249
-
250
-
251
-
252
- # [1.0.0-alpha.273](https://github.com/toa-io/toa/compare/v1.0.0-alpha.272...v1.0.0-alpha.273) (2026-09-02)
253
-
254
-
255
- ### Bug Fixes
256
-
257
- * **exposition:** green the feature suite ([67c25ad](https://github.com/toa-io/toa/commit/67c25ad627db3b3779b09405c5a3c319ecd47722))
258
- * **realtime:** green the feature suite ([6b4650b](https://github.com/toa-io/toa/commit/6b4650bad9e1d53dabd0b7775966694bdb05f236))
259
-
260
-
261
-
262
-
263
-
264
- # [1.0.0-alpha.272](https://github.com/toa-io/toa/compare/v1.0.0-alpha.271...v1.0.0-alpha.272) (2026-09-01)
265
-
266
- **Note:** Version bump only for package @toa.io/extensions.realtime
267
-
268
-
269
-
270
-
271
-
272
- # [1.0.0-alpha.270](https://github.com/toa-io/toa/compare/v1.0.0-alpha.269...v1.0.0-alpha.270) (2026-08-31)
273
-
274
- **Note:** Version bump only for package @toa.io/extensions.realtime
275
-
276
-
277
-
278
-
279
-
280
- # [1.0.0-alpha.266](https://github.com/toa-io/toa/compare/v1.0.0-alpha.265...v1.0.0-alpha.266) (2026-08-29)
281
-
282
- **Note:** Version bump only for package @toa.io/extensions.realtime
283
-
284
-
285
-
286
-
287
-
288
- # [1.0.0-alpha.265](https://github.com/toa-io/toa/compare/v1.0.0-alpha.264...v1.0.0-alpha.265) (2026-08-29)
289
-
290
- **Note:** Version bump only for package @toa.io/extensions.realtime
291
-
292
-
293
-
294
-
295
-
296
- # [1.0.0-alpha.264](https://github.com/toa-io/toa/compare/v1.0.0-alpha.263...v1.0.0-alpha.264) (2026-08-29)
297
-
298
- **Note:** Version bump only for package @toa.io/extensions.realtime
299
-
300
-
301
-
302
-
303
-
304
- # [1.0.0-alpha.263](https://github.com/toa-io/toa/compare/v1.0.0-alpha.262...v1.0.0-alpha.263) (2026-08-29)
305
-
306
- **Note:** Version bump only for package @toa.io/extensions.realtime
307
-
308
-
309
-
310
-
311
-
312
- # [1.0.0-alpha.262](https://github.com/toa-io/toa/compare/v1.0.0-alpha.261...v1.0.0-alpha.262) (2026-08-28)
313
-
314
-
315
- ### Features
316
-
317
- * **core:** identify the origin of a call with `request.source` ([9da6b66](https://github.com/toa-io/toa/commit/9da6b66df852690351a1e82c7b8cc176fd89774a))
318
-
319
-
320
-
321
-
322
-
323
- # [1.0.0-alpha.259](https://github.com/toa-io/toa/compare/v1.0.0-alpha.258...v1.0.0-alpha.259) (2026-08-24)
324
-
325
- **Note:** Version bump only for package @toa.io/extensions.realtime
326
-
327
-
328
-
329
-
330
-
331
- # [1.0.0-alpha.257](https://github.com/toa-io/toa/compare/v1.0.0-alpha.256...v1.0.0-alpha.257) (2026-08-24)
332
-
333
- **Note:** Version bump only for package @toa.io/extensions.realtime
334
-
335
-
336
-
337
-
338
-
339
- # [1.0.0-alpha.256](https://github.com/toa-io/toa/compare/v1.0.0-alpha.255...v1.0.0-alpha.256) (2026-08-23)
340
-
341
-
342
- ### Features
343
-
344
- * add toa mono and discover components at components/* ([787a111](https://github.com/toa-io/toa/commit/787a111c8f83e56ebc734801c97106c585d034ea))
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc291cmNlL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRTlDLE1BQU0sT0FBTyxNQUFNO0lBQ0EsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFBO0lBQzVDLEtBQUssQ0FBUTtJQUNiLElBQUksQ0FBSztJQUVWLEtBQUssQ0FBRSxPQUFnQjtRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBO1FBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFbkYsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUE7SUFDbEMsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFFbEUsK0VBQStFO1FBQy9FLCtFQUErRTtRQUMvRSxvQkFBb0I7UUFDcEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUN4QyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDbEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUUsS0FBWTtRQUNoQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFBO1FBRXJCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FB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
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3Rhc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvbGliL1N0YXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxLQUFLO0lBQ0MsS0FBSyxDQUFPO0lBQ1osYUFBYSxDQUFlO0lBQzVCLElBQUksQ0FBSztJQUUxQixZQUFvQixLQUFVLEVBQUUsYUFBNEIsRUFBRSxJQUFTO1FBQ3JFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO0lBQ2xCLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFFLEdBQVc7UUFDL0IsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3hDLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSSxDQUFFLEdBQVcsRUFBRSxLQUFhLEVBQUUsSUFBYTtRQUMxRCxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRyxDQUFFLEdBQVcsRUFBRSxLQUFhO1FBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFaEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSzthQUM3QixLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUM7YUFDNUIsS0FBSyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVqQyxJQUFJLE9BQU8sS0FBSyxJQUFJO1lBQ2xCLE9BQU8sY0FBYyxDQUFBO1FBRXZCLElBQUksT0FBTyxZQUFZLEtBQUs7WUFDMUIsT0FBTyxPQUFPLENBQUE7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
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2xpYi9TdHJlYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE1BQU0sT0FBTyxNQUFPLFNBQVEsUUFBUTtJQUMzQixNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtJQUUxQixRQUFRLEdBQTBCLElBQUksQ0FBQTtJQUN0QyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBRXJCO1FBQ0UsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ25CLENBQUM7SUFFRCxpQkFBaUI7SUFDRCxLQUFLO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFFZSxRQUFRLENBQUUsS0FBbUIsRUFBRSxRQUEwQztRQUN2RixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSTtZQUN4QixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTlCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRTNCLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRCw0RUFBNEU7SUFDckUsS0FBSztRQUNWLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBRWpCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzQixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO1FBQ3RCLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFFTSxTQUFTLENBQUUsTUFBTSxHQUFhLElBQUk7UUFDdkMsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFBO1FBRTVCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBRXJELElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO1FBQ3RCLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7Q0FDRjtBQUVELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFBLENBQUMsT0FBTztBQUN6QyxNQUFNLFVBQVUsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQSJ9
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NvdXJjZS9wdXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQWEsRUFBRSxPQUFnQjtJQUM3RSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFFckQsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUM3RCxJQUFJLEtBQUssWUFBWSxLQUFLO1lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBOztZQUVwRSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUN6RSxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMifQ==
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 (context: Context): void {
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 (): void {
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 (input: Input): Promise<Readable> {
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 (key: string): Stream {
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 (stash: any, configuration: Configuration, logs: any) {
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 (key: string): Promise<string | Error> {
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 (key: string, event: string, data: unknown): Promise<string | Error> {
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 (key: string, token: string): Promise<[string, Event[]] | null | Error> {
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 (key: string, event: string, data?: unknown): Promise<string | Error> {
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 (token: string): string {
88
+ private encode(token: string): string {
91
89
  return Buffer.from(token).toString('base64url')
92
90
  }
93
91
 
94
- private decode (token: string): string {
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 (results: unknown): Entry[] | null {
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 (): void {
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 (error: Error | null, callback: (error?: (Error | null)) => void): void {
21
- if (this.interval !== null)
22
- clearInterval(this.interval)
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 (): void {
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 (stream: Readable = this): boolean {
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())