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 IPFS = require('ipfs')
|
10 | const each = require('async/each')
|
11 | const clone = require('lodash.clonedeep')
|
12 |
|
13 | const Room = require('../')
|
14 | const createRepo = require('./utils/create-repo-node')
|
15 |
|
16 | const topicBase = 'pubsub-room-test-' + Date.now() + '-' + Math.random()
|
17 |
|
18 | const ipfsOptions = {
|
19 | EXPERIMENTAL: {
|
20 | pubsub: true
|
21 | },
|
22 | config: {
|
23 | Addresses: {
|
24 | Swarm: [
|
25 | '/dns4/ws-star.discovery.libp2p.io/tcp/443/wss/p2p-websocket-star'
|
26 | ]
|
27 | }
|
28 | }
|
29 | }
|
30 |
|
31 | describe('room', function () {
|
32 | this.timeout(30000)
|
33 | const repos = []
|
34 | let node1, node2
|
35 | let id1, id2
|
36 |
|
37 | before((done) => {
|
38 | const repo = createRepo()
|
39 | repos.push(repo)
|
40 | const options = Object.assign({}, clone(ipfsOptions), {
|
41 | repo: repo
|
42 | })
|
43 | node1 = new IPFS(options)
|
44 | node1.once('ready', () => {
|
45 | node1.id((err, info) => {
|
46 | expect(err).to.not.exist()
|
47 | id1 = info.id
|
48 | done()
|
49 | })
|
50 | })
|
51 | })
|
52 |
|
53 | before((done) => {
|
54 | const repo = createRepo()
|
55 | repos.push(repo)
|
56 | const options = Object.assign({}, clone(ipfsOptions), {
|
57 | repo: repo
|
58 | })
|
59 | node2 = new IPFS(options)
|
60 | node2.once('ready', () => {
|
61 | node2.id((err, info) => {
|
62 | expect(err).to.not.exist()
|
63 | id2 = info.id
|
64 | done()
|
65 | })
|
66 | })
|
67 | })
|
68 |
|
69 | after((done) => each(repos, (repo, cb) => { repo.teardown(cb) }, done))
|
70 |
|
71 | ;([1, 2].forEach((n) => {
|
72 | const topic = topicBase + '-' + n
|
73 | let room1, room2
|
74 | describe('topic ' + n, () => {
|
75 | it('can create a room, and they find each other', (done) => {
|
76 | room1 = Room(node1, topic)
|
77 | room2 = Room(node2, topic)
|
78 | room1.on('warning', console.log)
|
79 | room2.on('warning', console.log)
|
80 |
|
81 | let left = 2
|
82 | room1.once('peer joined', (id) => {
|
83 | expect(id).to.equal(id2)
|
84 | if (--left === 0) {
|
85 | done()
|
86 | }
|
87 | })
|
88 | room2.once('peer joined', (id) => {
|
89 | expect(id).to.equal(id1)
|
90 | if (--left === 0) {
|
91 | done()
|
92 | }
|
93 | })
|
94 | })
|
95 |
|
96 | it('has peer', (done) => {
|
97 | expect(room1.getPeers()).to.deep.equal([id2])
|
98 | expect(room2.getPeers()).to.deep.equal([id1])
|
99 | done()
|
100 | })
|
101 |
|
102 | it('can broadcast', (done) => {
|
103 | let gotMessage = false
|
104 | room1.on('message', (message) => {
|
105 | if (gotMessage) {
|
106 | throw new Error('double message:' + message.data.toString())
|
107 | }
|
108 | gotMessage = true
|
109 | expect(message.from).to.equal(id2)
|
110 | expect(message.data.toString()).to.equal('message 1')
|
111 | done()
|
112 | })
|
113 | room2.broadcast('message 1')
|
114 | })
|
115 |
|
116 | it('can send private message', (done) => {
|
117 | let gotMessage = false
|
118 |
|
119 | room2.on('message', (message) => {
|
120 | if (gotMessage) {
|
121 | throw new Error('double message')
|
122 | }
|
123 | gotMessage = true
|
124 | expect(message.from).to.equal(id1)
|
125 | expect(message.seqno.toString()).to.equal(Buffer.from([0]).toString())
|
126 | expect(message.topicIDs).to.deep.equal([topic])
|
127 | expect(message.topicCIDs).to.deep.equal([topic])
|
128 | expect(message.data.toString()).to.equal('message 2')
|
129 | done()
|
130 | })
|
131 | room1.sendTo(id2, 'message 2')
|
132 | })
|
133 |
|
134 | it('can leave room', (done) => {
|
135 | room1.once('peer left', (peer) => {
|
136 | expect(peer).to.equal(id2)
|
137 | done()
|
138 | })
|
139 | room2.leave()
|
140 | })
|
141 | })
|
142 | }))
|
143 | })
|