Skip to content

Commit 549f690

Browse files
authored
feat(node): [NET-1381] Add version to operator heartbeats (#2918)
Add `applicationVersion` field to the heartbeat message (published by `announceNodeToStream`). ## Testing Manually tested that the schema validation in v101 accepts the message which has the additional version field. This test snippet passes in a temp branch which was checked out from the v101.1.2 tag: ```ts it('v102 messages passes validation in v101 schema', () => { const msg = { "msgType": "heartbeat", "peerDescriptor": { "nodeId": "nodeId", "websocket": { "port": 31313, "host": "127.0.0.1", "tls": false } }, "applicationVersion": "102.0.0-beta.1" } expect(() => HeartbeatMessageSchema.parse(msg)).not.toThrow() }) ```
1 parent 596c590 commit 549f690

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

packages/node/src/plugins/operator/heartbeatUtils.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { z } from 'zod'
21
import { NetworkNodeType, NetworkPeerDescriptor } from '@streamr/sdk'
2+
import { z } from 'zod'
3+
import { version as applicationVersion } from '../../../package.json'
34

45
export const HeartbeatMessageSchema = z.object({
56
msgType: z.enum(['heartbeat']),
@@ -12,14 +13,16 @@ export const HeartbeatMessageSchema = z.object({
1213
tls: z.boolean()
1314
})),
1415
region: z.optional(z.number())
15-
})
16+
}),
17+
applicationVersion: z.optional(z.string()) // optional for backward compatibility (written from v102 onward)
1618
})
1719

1820
export type HeartbeatMessage = z.infer<typeof HeartbeatMessageSchema>
1921

2022
export function createHeartbeatMessage(peerDescriptor: NetworkPeerDescriptor): HeartbeatMessage {
2123
return {
2224
msgType: 'heartbeat',
23-
peerDescriptor
25+
peerDescriptor,
26+
applicationVersion
2427
}
2528
}

packages/node/test/integration/plugins/operator/announceNodeToStream.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { _operatorContractUtils } from '@streamr/sdk'
22
import { fastPrivateKey, generateWalletWithGasAndTokens } from '@streamr/test-utils'
33
import { collect, toEthereumAddress } from '@streamr/utils'
4+
import { version as applicationVersion } from '../../../../package.json'
45
import { announceNodeToStream } from '../../../../src/plugins/operator/announceNodeToStream'
56
import { formCoordinationStreamId } from '../../../../src/plugins/operator/formCoordinationStreamId'
67
import { createClient } from '../../../utils'
@@ -26,7 +27,8 @@ describe('announceNodeToStream', () => {
2627
const [{ content }] = await collect(subscription, 1)
2728
expect(content).toEqual({
2829
msgType: 'heartbeat',
29-
peerDescriptor: await client.getPeerDescriptor()
30+
peerDescriptor: await client.getPeerDescriptor(),
31+
applicationVersion
3032
})
3133

3234
await anonymousClient.destroy()

packages/node/test/unit/plugins/operator/heartbeatUtils.test.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { createHeartbeatMessage, HeartbeatMessageSchema } from '../../../../src/plugins/operator/heartbeatUtils'
1+
import { omit } from 'lodash'
22
import { ZodError } from 'zod'
3+
import { createHeartbeatMessage, HeartbeatMessageSchema } from '../../../../src/plugins/operator/heartbeatUtils'
34

45
describe('heartbeatUtils', () => {
56
it('messages created with createHeartbeatMessage pass validation', () => {
@@ -14,6 +15,21 @@ describe('heartbeatUtils', () => {
1415
expect(() => HeartbeatMessageSchema.parse(msg)).not.toThrow()
1516
})
1617

18+
it('messages without version pass validation', () => {
19+
const msg = omit(
20+
createHeartbeatMessage({
21+
nodeId: 'nodeId',
22+
websocket: {
23+
port: 31313,
24+
host: '127.0.0.1',
25+
tls: false
26+
}
27+
}),
28+
'applicationVersion'
29+
)
30+
expect(() => HeartbeatMessageSchema.parse(msg)).not.toThrow()
31+
})
32+
1733
it('invalid message does not pass validation', () => {
1834
const msg = createHeartbeatMessage({
1935
foo: 'bar'

0 commit comments

Comments
 (0)