UNPKG

3.61 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 IPFS = require('ipfs')
10const each = require('async/each')
11const clone = require('lodash.clonedeep')
12
13const Room = require('../')
14const createRepo = require('./utils/create-repo-node')
15
16const topicBase = 'pubsub-room-test-' + Date.now() + '-' + Math.random()
17
18const 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
31describe('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})