Skip to content

Commit ca0b8a3

Browse files
committed
feat: Added event emitter for any event
Now connection.onAll(listener) will trigger the listener on every event or response. It triggers the listener before any other listeners so that debug statements will be triggered before any other possibly faulty listeners. fix #14
1 parent fbdb31a commit ca0b8a3

4 files changed

Lines changed: 47 additions & 4 deletions

File tree

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ A low level Node.js api-wrapper for communicating with HEOS devices. It enables
2525
- [connection.write(commandGroup, command[, attributes])](#connectionwritecommandgroup-command-attributes)
2626
- [connection.on(event, listener)](#connectiononevent-listener)
2727
- [connection.once(event, listener)](#connectiononceevent-listener)
28+
- [connection.onAll(listener)](#connectiononall-listener)
2829
- [HeosEvent and HeosResponse](#heosevent-and-heosresponse)
2930
- [Documentation](#documentation)
3031
- [Contributing](#contributing)
@@ -150,6 +151,12 @@ connection.on({ commandGroup: 'event', command: 'player_volume_changed' }, conso
150151

151152
Exactly like [`connection.on()`](<#connection.on(event,-listener)>) but will only trigger the listener the first time the event happens.
152153

154+
#### connection.onAll(listener)
155+
156+
- `listener`: (message: [HeosEvent](#HeosEvent-and-HeosResponse) | [HeosResponse](#HeosEvent-and-HeosResponse)) => void
157+
158+
Exactly like [`connection.on()`](<#connection.on(event,-listener)>) but will trigger the listener for every response or event. It is useful for logging or debugging purposes. These listeners are triggered before any other as they can be useful for understanding why other listeners might be faulty.
159+
153160
#### HeosEvent and HeosResponse
154161

155162
The responses to commands are objects like this example:

src/connection/connect.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { createConnection, Socket } from 'net'
22
import { DEFAULT_PORT } from '../utils/constants'
3-
import { ResponseEventHandler, HeosEventEmitter } from '../listen/responseEventHandler'
3+
import {
4+
ResponseEventHandler,
5+
HeosEventEmitter,
6+
HeosAllEventEmitter
7+
} from '../listen/responseEventHandler'
48
import { ResponseParser } from '../listen/responseParser'
59
import { HeosConnection } from './heosConnection'
610
import { HeosResponse, HeosEvent } from '../types'
@@ -41,7 +45,9 @@ export function connect(address: string): Promise<HeosConnection> {
4145
const once: HeosEventEmitter = (event, listener) =>
4246
responseEventHandler.once(event, listener)
4347

44-
const connection = new HeosConnection(on, once, (message: string) =>
48+
const onAll: HeosAllEventEmitter = listener => responseEventHandler.onAll(listener)
49+
50+
const connection = new HeosConnection(on, once, onAll, (message: string) =>
4551
socket.write(message)
4652
)
4753

src/connection/heosConnection.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,40 @@
1-
import { HeosEventEmitter, HeosConnectionEventEmitter } from '../listen/responseEventHandler'
2-
import { HeosCommandAttribute } from '../types'
1+
import {
2+
HeosEventEmitter,
3+
HeosConnectionEventEmitter,
4+
HeosAllEventEmitter,
5+
HeosConnectionAllEventEmitter
6+
} from '../listen/responseEventHandler'
37
import { generateHeosCommand } from '../write/heosCommand'
8+
import { HeosCommandAttribute } from '../types'
49

510
export class HeosConnection {
611
constructor(
712
on: HeosEventEmitter,
813
once: HeosEventEmitter,
14+
onAll: HeosAllEventEmitter,
915
socketWrite: (message: string) => any
1016
) {
1117
this.on = (event, listener) => {
1218
on(event, listener)
1319
return this
1420
}
21+
1522
this.once = (event, listener) => {
1623
once(event, listener)
1724
return this
1825
}
26+
27+
this.onAll = listener => {
28+
onAll(listener)
29+
return this
30+
}
31+
1932
this.socketWrite = socketWrite
2033
}
2134

2235
on: HeosConnectionEventEmitter
2336
once: HeosConnectionEventEmitter
37+
onAll: HeosConnectionAllEventEmitter
2438
private socketWrite: (message: string) => any
2539

2640
write(

src/listen/responseEventHandler.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,19 @@ import { EventEmitter } from 'events'
33
import { generateHeosCommandString } from './heosCommand'
44
import { HeosConnection } from '../connection/heosConnection'
55

6+
export type HeosConnectionAllEventEmitter = (
7+
listener: (message: HeosResponse | HeosEvent) => void
8+
) => HeosConnection
9+
610
export type HeosConnectionEventEmitter = (
711
event: HeosCommand,
812
listener: (message: HeosResponse | HeosEvent) => void
913
) => HeosConnection
1014

15+
export type HeosAllEventEmitter = (
16+
listener: (message: HeosResponse | HeosEvent) => void
17+
) => ResponseEventHandler
18+
1119
export type HeosEventEmitter = (
1220
event: HeosCommand,
1321
listener: (message: HeosResponse | HeosEvent) => void
@@ -16,12 +24,15 @@ export type HeosEventEmitter = (
1624
export class ResponseEventHandler {
1725
constructor() {
1826
this.emitter = new EventEmitter()
27+
this.listenersOnAll = []
1928
}
2029

2130
emitter: EventEmitter
31+
listenersOnAll: ((message: HeosResponse | HeosEvent) => void)[]
2232

2333
put(message: HeosResponse | HeosEvent): void {
2434
const eventString = generateHeosCommandString(message.heos.command)
35+
this.listenersOnAll.forEach(listener => listener(message))
2536
this.emitter.emit(eventString, message)
2637
}
2738

@@ -42,4 +53,9 @@ export class ResponseEventHandler {
4253
this.emitter.once(eventString, listener)
4354
return this
4455
}
56+
57+
onAll(listener: (message: HeosResponse | HeosEvent) => void): ResponseEventHandler {
58+
this.listenersOnAll = [...this.listenersOnAll, listener]
59+
return this
60+
}
4561
}

0 commit comments

Comments
 (0)