2022-02-23 15:49:00 +01:00
|
|
|
import { expect } from 'chai'
|
|
|
|
import debug from 'debug'
|
|
|
|
import { Protocols } from 'js-waku/build/main/lib/waku'
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
import { Community } from './community'
|
|
|
|
import { Identity } from './identity'
|
|
|
|
import { Messenger } from './messenger'
|
|
|
|
import { bufToHex } from './utils'
|
|
|
|
import { ApplicationMetadataMessage } from './wire/application_metadata_message'
|
|
|
|
import { ContentType } from './wire/chat_message'
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
const testChatId = 'test-chat-id'
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
const dbg = debug('communities:test:messenger')
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
describe('Messenger', () => {
|
|
|
|
let messengerAlice: Messenger
|
|
|
|
let messengerBob: Messenger
|
|
|
|
let identityAlice: Identity
|
|
|
|
let identityBob: Identity
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
beforeEach(async function () {
|
2022-02-23 15:49:00 +01:00
|
|
|
this.timeout(20_000)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
dbg('Generate keys')
|
|
|
|
identityAlice = Identity.generate()
|
|
|
|
identityBob = Identity.generate()
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
dbg('Create messengers')
|
|
|
|
;[messengerAlice, messengerBob] = await Promise.all([
|
2022-02-23 15:03:14 +01:00
|
|
|
Messenger.create(identityAlice, { bootstrap: {} }),
|
|
|
|
Messenger.create(identityBob, {
|
|
|
|
bootstrap: {},
|
2022-02-23 15:49:00 +01:00
|
|
|
libp2p: { addresses: { listen: ['/ip4/0.0.0.0/tcp/0/ws'] } },
|
2022-02-23 15:03:14 +01:00
|
|
|
}),
|
2022-02-23 15:49:00 +01:00
|
|
|
])
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
dbg('Connect messengers')
|
2022-02-23 15:03:14 +01:00
|
|
|
// Connect both messengers together for test purposes
|
|
|
|
messengerAlice.waku.addPeerToAddressBook(
|
|
|
|
messengerBob.waku.libp2p.peerId,
|
|
|
|
messengerBob.waku.libp2p.multiaddrs
|
2022-02-23 15:49:00 +01:00
|
|
|
)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
dbg('Wait for remote peer')
|
2022-02-23 15:03:14 +01:00
|
|
|
await Promise.all([
|
|
|
|
messengerAlice.waku.waitForRemotePeer([Protocols.Relay]),
|
|
|
|
messengerBob.waku.waitForRemotePeer([Protocols.Relay]),
|
2022-02-23 15:49:00 +01:00
|
|
|
])
|
|
|
|
dbg('Messengers ready')
|
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
it('Sends & Receive public chat messages', async function () {
|
|
|
|
this.timeout(10_000)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
await messengerAlice.joinChatById(testChatId)
|
|
|
|
await messengerBob.joinChatById(testChatId)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
const text = 'This is a message.'
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
const receivedMessagePromise: Promise<ApplicationMetadataMessage> =
|
2022-02-23 15:49:00 +01:00
|
|
|
new Promise(resolve => {
|
|
|
|
messengerBob.addObserver(message => {
|
|
|
|
resolve(message)
|
|
|
|
}, testChatId)
|
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
await messengerAlice.sendMessage(testChatId, {
|
|
|
|
text,
|
|
|
|
contentType: ContentType.Text,
|
2022-02-23 15:49:00 +01:00
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
const receivedMessage = await receivedMessagePromise
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
expect(receivedMessage.chatMessage?.text).to.eq(text)
|
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
it('public chat messages have signers', async function () {
|
|
|
|
this.timeout(10_000)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
await messengerAlice.joinChatById(testChatId)
|
|
|
|
await messengerBob.joinChatById(testChatId)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
const text = 'This is a message.'
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
const receivedMessagePromise: Promise<ApplicationMetadataMessage> =
|
2022-02-23 15:49:00 +01:00
|
|
|
new Promise(resolve => {
|
|
|
|
messengerBob.addObserver(message => {
|
|
|
|
resolve(message)
|
|
|
|
}, testChatId)
|
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
await messengerAlice.sendMessage(testChatId, {
|
|
|
|
text,
|
|
|
|
contentType: ContentType.Text,
|
2022-02-23 15:49:00 +01:00
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
const receivedMessage = await receivedMessagePromise
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
expect(bufToHex(receivedMessage.signer!)).to.eq(
|
|
|
|
bufToHex(identityAlice.publicKey)
|
2022-02-23 15:49:00 +01:00
|
|
|
)
|
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
afterEach(async function () {
|
2022-02-23 15:49:00 +01:00
|
|
|
this.timeout(5000)
|
|
|
|
await messengerAlice.stop()
|
|
|
|
await messengerBob.stop()
|
|
|
|
})
|
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
describe('Messenger [live data]', () => {
|
2022-02-23 15:03:14 +01:00
|
|
|
before(function () {
|
|
|
|
if (process.env.CI) {
|
|
|
|
// Skip live data test in CI
|
2022-02-23 15:49:00 +01:00
|
|
|
this.skip()
|
2022-02-23 15:03:14 +01:00
|
|
|
}
|
2022-02-23 15:49:00 +01:00
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
let messenger: Messenger
|
|
|
|
let identity: Identity
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
beforeEach(async function () {
|
2022-02-23 15:49:00 +01:00
|
|
|
this.timeout(20_000)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
dbg('Generate keys')
|
|
|
|
identity = Identity.generate()
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
dbg('Create messengers')
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
messenger = await Messenger.create(identity, {
|
|
|
|
bootstrap: { default: true },
|
2022-02-23 15:49:00 +01:00
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
dbg('Wait to be connected to a peer')
|
|
|
|
await messenger.waku.waitForRemotePeer()
|
|
|
|
dbg('Messengers ready')
|
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
it('Receive public chat messages', async function () {
|
|
|
|
this.timeout(20_000)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
const community = await Community.instantiateCommunity(
|
2022-02-23 15:49:00 +01:00
|
|
|
'0x02cf13719c8b836bebd4e430c497ee38e798a43e4d8c4760c34bbd9bf4f2434d26',
|
2022-02-23 15:03:14 +01:00
|
|
|
messenger.waku
|
2022-02-23 15:49:00 +01:00
|
|
|
)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
await messenger.joinChats(community.chats.values())
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
const startTime = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)
|
|
|
|
const endTime = new Date()
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
const chat = Array.from(community.chats.values()).find(
|
2022-02-23 15:49:00 +01:00
|
|
|
chat => chat.communityChat?.identity?.displayName === 'Test Chat'
|
|
|
|
)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
if (!chat) throw 'Could not find foobar chat'
|
2022-02-23 15:03:14 +01:00
|
|
|
|
2022-02-23 15:49:00 +01:00
|
|
|
console.log(chat)
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
await messenger.retrievePreviousMessages(
|
|
|
|
chat.id,
|
|
|
|
startTime,
|
|
|
|
endTime,
|
2022-02-23 15:49:00 +01:00
|
|
|
metadata => {
|
|
|
|
metadata.forEach(m => {
|
|
|
|
console.log('Message', m.chatMessage?.text)
|
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
}
|
2022-02-23 15:49:00 +01:00
|
|
|
)
|
|
|
|
})
|
2022-02-23 15:03:14 +01:00
|
|
|
|
|
|
|
afterEach(async function () {
|
2022-02-23 15:49:00 +01:00
|
|
|
this.timeout(5000)
|
|
|
|
await messenger.stop()
|
|
|
|
})
|
|
|
|
})
|