UNPKG

3 kBJavaScriptView Raw
1/* eslint-env mocha */
2/* eslint max-nested-callbacks: ["error", 5] */
3'use strict'
4
5const chai = require('chai')
6chai.use(require('dirty-chai'))
7const expect = chai.expect
8
9const PubSubRoom = require('../')
10const createLibp2p = require('./utils/create-libp2p')
11
12const topicBase = 'pubsub-room-test-' + Date.now() + '-' + Math.random()
13
14describe('room', function () {
15 this.timeout(30000)
16 let node1, node2
17 let id1, id2
18
19 before(async () => {
20 node1 = await createLibp2p()
21 id1 = node1.peerInfo.id.toB58String()
22 })
23
24 before(async () => {
25 node2 = await createLibp2p(node1)
26 id2 = node2.peerInfo.id.toB58String()
27 })
28
29 const rooms = []
30
31 ;([1, 2].forEach((n) => {
32 const topic = topicBase + '-' + n
33
34 after('after topic ' + n, () => {
35 return Promise.all([
36 rooms[n].a.leave(),
37 rooms[n].b.leave()
38 ])
39 })
40
41 describe('topic ' + n, () => {
42 it('can create a room, and they find each other', (done) => {
43 rooms[n] = {
44 a: new PubSubRoom(node1, topic),
45 b: new PubSubRoom(node2, topic)
46 }
47
48 let left = 2
49 rooms[n].a.once('peer joined', (id) => {
50 expect(id).to.deep.equal(id2)
51 if (--left === 0) {
52 done()
53 }
54 })
55 rooms[n].b.once('peer joined', (id) => {
56 expect(id).to.deep.equal(id1)
57 if (--left === 0) {
58 done()
59 }
60 })
61 })
62
63 it('has peer', (done) => {
64 expect(rooms[n].a.getPeers()).to.deep.equal([id2])
65 expect(rooms[n].b.getPeers()).to.deep.equal([id1])
66 done()
67 })
68
69 it('can broadcast', (done) => {
70 let gotMessage = false
71 rooms[n].a.on('message', (message) => {
72 if (gotMessage) {
73 throw new Error('double message:' + message.data.toString())
74 }
75 gotMessage = true
76 expect(message.from).to.deep.equal(id2)
77 expect(message.data.toString()).to.equal('message 1')
78 done()
79 })
80 rooms[n].b.broadcast('message 1')
81 })
82
83 it('can send private message', (done) => {
84 let gotMessage = false
85
86 rooms[n].b.on('message', (message) => {
87 if (gotMessage) {
88 throw new Error('double message')
89 }
90 gotMessage = true
91 expect(message.from).to.deep.equal(id1)
92 expect(message.seqno.toString()).to.equal(Buffer.from([0]).toString())
93 expect(message.topicIDs).to.deep.equal([topic])
94 expect(message.topicCIDs).to.deep.equal([topic])
95 expect(message.data.toString()).to.equal('message 2')
96 done()
97 })
98 rooms[n].a.sendTo(id2, 'message 2')
99 })
100
101 it('can leave room', (done) => {
102 rooms[n].a.once('peer left', (peer) => {
103 expect(peer).to.deep.equal(id2)
104 done()
105 })
106 rooms[n].b.leave()
107 })
108 })
109 }))
110
111 after(() => {
112 return Promise.all([
113 node1.stop(),
114 node2.stop()
115 ])
116 })
117})