Skip to content

Commit 2c03766

Browse files
Merge pull request #873 from jg-wright/new-requirements
feat: add broker streaming
2 parents 229196d + a3e8599 commit 2c03766

13 files changed

Lines changed: 618 additions & 311 deletions

package-lock.json

Lines changed: 15 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/message-bus/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"dependencies": {
3434
"@johngw/async": "^5.0.1",
3535
"@johngw/async-iterator": "^4.0.1",
36+
"@johngw/stream": "^4.2.0",
3637
"@plugola/invoke": "^2.0.3",
3738
"ts-toolbelt": "^9.6.0",
3839
"tslib": "^2.8.1"

packages/message-bus/src/Broker.ts

Lines changed: 78 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,26 @@
1-
import { InvokablesDict, InvokerRegistrationArgs } from '@plugola/invoke'
1+
import { InvokerRegistrationArgs } from '@plugola/invoke'
22
import type MessageBus from './MessageBus.js'
33
import SubscriptionDisposer from './SubscriptionDisposer.js'
44
import type {
55
EventInterceptorArgs,
6-
EventsT,
76
SubscriberArgs,
87
UntilArgs,
98
UntilRtn,
109
} from './types/events.js'
11-
import type {
12-
EventGeneratorArgs,
13-
EventGeneratorsT,
14-
} from './types/generators.js'
10+
import type { EventGeneratorArgs } from './types/generators.js'
1511
import type { InvokerInterceptorArgs } from './types/invokables.js'
16-
import { ErrorHandler, Unsubscriber } from './types/MessageBus.js'
17-
18-
export default class Broker<
19-
Events extends EventsT = EventsT,
20-
EventGens extends EventGeneratorsT = EventGeneratorsT,
21-
Invokables extends InvokablesDict = InvokablesDict
22-
> {
12+
import {
13+
ErrorHandler,
14+
MessageBusContext,
15+
Unsubscriber,
16+
} from './types/MessageBus.js'
17+
import { StreamReaderArgs } from './types/streams.js'
18+
19+
export default class Broker<$ extends MessageBusContext = MessageBusContext> {
2320
constructor(
24-
messageBus: MessageBus<Events, EventGens, Invokables>,
21+
messageBus: MessageBus<$>,
2522
id: string,
26-
abortController: AbortController
23+
abortController: AbortController,
2724
) {
2825
this.#abortController = abortController
2926
this.#id = id
@@ -40,7 +37,7 @@ export default class Broker<
4037
return this.abortSignal.aborted
4138
}
4239

43-
get abortSignal() {
40+
get abortSignal(): AbortSignal {
4441
return this.#abortController.signal
4542
}
4643

@@ -54,7 +51,7 @@ export default class Broker<
5451
return this.#id
5552
}
5653

57-
readonly #messageBus: MessageBus<Events, EventGens, Invokables>
54+
readonly #messageBus: MessageBus<$>
5855
get messageBus() {
5956
return this.#messageBus
6057
}
@@ -75,147 +72,164 @@ export default class Broker<
7572
})
7673
}
7774

78-
emit<EventName extends keyof Events>(
75+
emit<EventName extends keyof $['events']>(
7976
eventName: EventName,
80-
...args: Events[EventName]
77+
...args: $['events'][EventName]
8178
): void | Promise<void> {
8279
return this.#messageBus.emit(this, eventName, args)
8380
}
8481

85-
emitSignal<EventName extends keyof Events>(
82+
emitSignal<EventName extends keyof $['events']>(
8683
eventName: EventName,
8784
signal: AbortSignal,
88-
...args: Events[EventName]
85+
...args: $['events'][EventName]
8986
): void | Promise<void> {
9087
return this.#messageBus.emit(this, eventName, args, signal)
9188
}
9289

93-
interceptEvent<EventName extends keyof Events>(
90+
interceptEvent<EventName extends keyof $['events']>(
9491
eventName: EventName,
95-
...args: EventInterceptorArgs<Events[EventName]>
92+
...args: EventInterceptorArgs<$['events'][EventName]>
9693
): Unsubscriber {
9794
return this.#messageBus.interceptEvent(this as any, eventName, args)
9895
}
9996

100-
on<EventName extends keyof Events>(
97+
on<EventName extends keyof $['events']>(
10198
eventName: EventName,
102-
...args: SubscriberArgs<Events[EventName]>
99+
...args: SubscriberArgs<$['events'][EventName]>
103100
): Unsubscriber {
104101
return this.#messageBus.on(this, eventName, args)
105102
}
106103

107-
once<EventName extends keyof Events>(
104+
once<EventName extends keyof $['events']>(
108105
eventName: EventName,
109-
...args: SubscriberArgs<Events[EventName]>
106+
...args: SubscriberArgs<$['events'][EventName]>
110107
): Unsubscriber {
111108
return this.#messageBus.once(this, eventName, args)
112109
}
113110

114-
hasSubscriber(eventName: keyof Events) {
111+
hasSubscriber(eventName: keyof $['events']) {
115112
return this.#messageBus.hasSubscriber(eventName)
116113
}
117114

118115
async until<
119-
EventName extends keyof Events,
120-
Args extends UntilArgs<Events[EventName]>
116+
EventName extends keyof $['events'],
117+
Args extends UntilArgs<$['events'][EventName]>,
121118
>(
122119
eventName: EventName,
123120
...args: Args
124-
): Promise<UntilRtn<Events[EventName], Args>> {
121+
): Promise<UntilRtn<$['events'][EventName], Args>> {
125122
return this.#messageBus.until(this, eventName, args) as any
126123
}
127124

128125
async untilSignal<
129-
EventName extends keyof Events,
130-
Args extends UntilArgs<Events[EventName]>
126+
EventName extends keyof $['events'],
127+
Args extends UntilArgs<$['events'][EventName]>,
131128
>(
132129
eventName: EventName,
133130
abortSignal: AbortSignal,
134131
...args: Args
135-
): Promise<UntilRtn<Events[EventName], Args>> {
132+
): Promise<UntilRtn<$['events'][EventName], Args>> {
136133
return this.#messageBus.until(this, eventName, args, abortSignal) as any
137134
}
138135

139-
generator<EventName extends keyof EventGens>(
136+
generator<EventName extends keyof $['generators']>(
140137
eventName: EventName,
141138
...args: EventGeneratorArgs<
142-
EventGens[EventName]['args'],
143-
EventGens[EventName]['yield']
139+
$['generators'][EventName]['args'],
140+
$['generators'][EventName]['yield']
144141
>
145142
): Unsubscriber {
146143
return this.#messageBus.generator(this, eventName, args)
147144
}
148145

149-
iterate<EventName extends keyof EventGens>(
146+
iterate<EventName extends keyof $['generators']>(
150147
eventName: EventName,
151-
...args: EventGens[EventName]['args']
152-
): AsyncIterable<EventGens[EventName]['yield']> {
148+
...args: $['generators'][EventName]['args']
149+
): AsyncIterable<$['generators'][EventName]['yield']> {
153150
return this.#messageBus.iterate(this, eventName, args)
154151
}
155152

156-
iterateSignal<EventName extends keyof EventGens>(
153+
iterateSignal<EventName extends keyof $['generators']>(
157154
eventName: EventName,
158155
abortSignal: AbortSignal,
159-
...args: EventGens[EventName]['args']
160-
): AsyncIterable<EventGens[EventName]['yield']> {
156+
...args: $['generators'][EventName]['args']
157+
): AsyncIterable<$['generators'][EventName]['yield']> {
161158
return this.#messageBus.iterate(this, eventName, args, abortSignal)
162159
}
163160

164-
iterateWithin<EventName extends keyof EventGens>(
161+
iterateWithin<EventName extends keyof $['generators']>(
165162
within: number,
166163
eventName: EventName,
167-
...args: EventGens[EventName]['args']
168-
): AsyncIterable<EventGens[EventName]['yield']> {
164+
...args: $['generators'][EventName]['args']
165+
): AsyncIterable<$['generators'][EventName]['yield']> {
169166
return this.#messageBus.iterateWithin(this, within, eventName, args)
170167
}
171168

172-
accumulate<EventName extends keyof EventGens>(
169+
accumulate<EventName extends keyof $['generators']>(
173170
eventName: EventName,
174-
...args: EventGens[EventName]['args']
175-
): Promise<EventGens[EventName]['yield'][]> {
171+
...args: $['generators'][EventName]['args']
172+
): Promise<$['generators'][EventName]['yield'][]> {
176173
return this.#messageBus.accumulate(this, eventName, args)
177174
}
178175

179-
accumulateWithin<EventName extends keyof EventGens>(
176+
accumulateWithin<EventName extends keyof $['generators']>(
180177
within: number,
181178
eventName: EventName,
182-
...args: EventGens[EventName]['args']
183-
): Promise<EventGens[EventName]['yield'][]> {
179+
...args: $['generators'][EventName]['args']
180+
): Promise<$['generators'][EventName]['yield'][]> {
184181
return this.#messageBus.accumulateWithin(this, within, eventName, args)
185182
}
186183

187-
register<InvokableName extends keyof Invokables>(
184+
register<InvokableName extends keyof $['invokables']>(
188185
invokableName: InvokableName,
189186
...args: InvokerRegistrationArgs<
190-
Invokables[InvokableName]['args'],
191-
Invokables[InvokableName]['return']
187+
$['invokables'][InvokableName]['args'],
188+
$['invokables'][InvokableName]['return']
192189
>
193190
): Unsubscriber {
194191
return this.#messageBus.register(this, invokableName, args)
195192
}
196193

197-
invoke<InvokableName extends keyof Invokables>(
194+
invoke<InvokableName extends keyof $['invokables']>(
198195
invokableName: InvokableName,
199-
...args: Invokables[InvokableName]['args']
200-
): Promise<Invokables[InvokableName]['return']> {
196+
...args: $['invokables'][InvokableName]['args']
197+
): Promise<$['invokables'][InvokableName]['return']> {
201198
return this.#messageBus.invoke(this, invokableName, args)
202199
}
203200

204-
invokeSignal<InvokableName extends keyof Invokables>(
201+
invokeSignal<InvokableName extends keyof $['invokables']>(
205202
invokableName: InvokableName,
206203
abortSignal: AbortSignal,
207-
...args: Invokables[InvokableName]['args']
208-
): Promise<Invokables[InvokableName]['return']> {
204+
...args: $['invokables'][InvokableName]['args']
205+
): Promise<$['invokables'][InvokableName]['return']> {
209206
return this.#messageBus.invoke(this, invokableName, args, abortSignal)
210207
}
211208

212-
interceptInvoker<InvokableName extends keyof Invokables>(
209+
interceptInvoker<InvokableName extends keyof $['invokables']>(
213210
invokableName: InvokableName,
214211
...args: InvokerInterceptorArgs<
215-
Invokables[InvokableName]['args'],
216-
Invokables[InvokableName]['return']
212+
$['invokables'][InvokableName]['args'],
213+
$['invokables'][InvokableName]['return']
217214
>
218215
): Unsubscriber {
219216
return this.#messageBus.interceptInvoker(this, invokableName, args)
220217
}
218+
219+
reader<StreamName extends keyof $['streams']>(
220+
streamName: StreamName,
221+
...args: StreamReaderArgs<
222+
$['streams'][StreamName]['args'],
223+
$['streams'][StreamName]['item']
224+
>
225+
): Unsubscriber {
226+
return this.#messageBus.reader(this, streamName, args)
227+
}
228+
229+
stream<StreamName extends keyof $['streams']>(
230+
streamName: StreamName,
231+
...args: $['streams'][StreamName]['args']
232+
): ReadableStream<$['streams'][StreamName]['item']> {
233+
return this.#messageBus.stream(this, streamName, args)
234+
}
221235
}

0 commit comments

Comments
 (0)