diff --git a/packages/core/src/Gossiper.ts b/packages/core/src/Gossiper.ts new file mode 100644 index 0000000..bc72144 --- /dev/null +++ b/packages/core/src/Gossiper.ts @@ -0,0 +1,36 @@ +import { Group } from './Group'; +import { Node } from './Node'; + +export interface GossiperOptions { + /** + * The interval to gossip with. + */ + intervalInMs: number; + + gossip: (node: Node) => void; +} + +export class Gossiper { + private readonly group: Group; + private readonly timer: any; + + private readonly gossip: (node: Node) => void; + + public constructor(group: Group, options: GossiperOptions) { + this.group = group; + this.timer = setInterval(this.findAndGossip.bind(this), options.intervalInMs); + this.gossip = options.gossip; + } + + public destroy(): void { + clearInterval(this.timer); + } + + private findAndGossip() { + const nodes = this.group.nodes; + const idx = Math.floor(Math.random() * nodes.length); + + const node = nodes[idx]; + this.gossip(node); + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 09f7dca..65a15f7 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -67,4 +67,5 @@ export * from './Group'; export * from './group/NamedGroup'; export * from './RequestReplyHelper'; +export * from './Gossiper'; export * from './SynchronizedValues';