1 |
|
2 |
|
3 | 'use strict'
|
4 |
|
5 | const chai = require('chai')
|
6 | chai.use(require('dirty-chai'))
|
7 | const expect = chai.expect
|
8 |
|
9 | const PubSubRoom = require('../')
|
10 | const createLibp2p = require('./utils/create-libp2p')
|
11 |
|
12 | const topicBase = 'pubsub-room-test-' + Date.now() + '-' + Math.random()
|
13 |
|
14 | describe('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 | })
|