helia-coord 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.on-save.json +8 -0
- package/PEDIGREE.md +3 -0
- package/README.md +3 -0
- package/config/bootstrap-circuit-relays.js +48 -0
- package/examples/start-external.js +56 -0
- package/index.js +129 -0
- package/lib/adapters/bch-adapter.js +94 -0
- package/lib/adapters/encryption-adapter.js +123 -0
- package/lib/adapters/gist.js +42 -0
- package/lib/adapters/index.js +66 -0
- package/lib/adapters/ipfs-adapter.js +263 -0
- package/lib/adapters/logs-adapter.js +44 -0
- package/lib/adapters/pubsub-adapter/README.md +86 -0
- package/lib/adapters/pubsub-adapter/about-adapter.js +117 -0
- package/lib/adapters/pubsub-adapter/index.js +275 -0
- package/lib/adapters/pubsub-adapter/messaging.js +389 -0
- package/lib/adapters/pubsub-adapter/msg-router.js +58 -0
- package/lib/adapters/pubsub-adapter/resend-msg.js +58 -0
- package/lib/controllers/index.js +24 -0
- package/lib/controllers/timer-controller.js +417 -0
- package/lib/entities/this-node-entity.js +102 -0
- package/lib/use-cases/index.js +36 -0
- package/lib/use-cases/peer-use-cases.js +146 -0
- package/lib/use-cases/pubsub-use-cases.js +56 -0
- package/lib/use-cases/relay-use-cases.js +479 -0
- package/lib/use-cases/schema.js +158 -0
- package/lib/use-cases/this-node-use-cases.js +443 -0
- package/lib/util/utils.js +12 -0
- package/package.json +52 -0
- package/test/mocks/adapter-mock.js +119 -0
- package/test/mocks/circuit-relay-mocks.js +67 -0
- package/test/mocks/ipfs-mock.js +46 -0
- package/test/mocks/peers-mock.js +75 -0
- package/test/mocks/pubsub-mocks.js +37 -0
- package/test/mocks/thisnode-mocks.js +82 -0
- package/test/mocks/use-case-mocks.js +24 -0
- package/test/unit/adapters/bch-adapter-unit.js +96 -0
- package/test/unit/adapters/encryption-adapter-unit.js +129 -0
- package/test/unit/adapters/gist.unit.adapters.js +58 -0
- package/test/unit/adapters/index-adapters-unit.js +79 -0
- package/test/unit/adapters/ipfs-adapter-unit.js +215 -0
- package/test/unit/adapters/logs-adapter-unit.js +55 -0
- package/test/unit/adapters/pubsub/about-adapter-unit.js +129 -0
- package/test/unit/adapters/pubsub/messaging-adapter-unit.js +576 -0
- package/test/unit/adapters/pubsub/pubsub-adapter-unit.js +367 -0
- package/test/unit/adapters/pubsub/resend-msg-adapter-unit.js +58 -0
- package/test/unit/controllers/controllers-index-unit.js +30 -0
- package/test/unit/controllers/timer-controller-unit.js +261 -0
- package/test/unit/entities/this-node.unit.entity.js +157 -0
- package/test/unit/index-unit.js +160 -0
- package/test/unit/use-cases/peer.unit.use-cases.js +186 -0
- package/test/unit/use-cases/pubsub.unit.use-cases.js +114 -0
- package/test/unit/use-cases/relay-use-cases-unit.js +658 -0
- package/test/unit/use-cases/schema-use-case-unit.js +101 -0
- package/test/unit/use-cases/this-node-use-cases-unit.js +427 -0
- package/test/unit/use-cases/use-cases-index-unit.js +47 -0
- package/test/unit/util/utils-unit.js +31 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Unit tests for the Peer Use Case library.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// npm libraries
|
|
6
|
+
import { assert } from 'chai'
|
|
7
|
+
import sinon from 'sinon'
|
|
8
|
+
|
|
9
|
+
// Local libraries
|
|
10
|
+
import PeerUseCases from '../../../lib/use-cases/peer-use-cases.js'
|
|
11
|
+
import ThisNodeUseCases from '../../../lib/use-cases/this-node-use-cases.js'
|
|
12
|
+
import AdapterMock from '../../mocks/adapter-mock.js'
|
|
13
|
+
|
|
14
|
+
const adapters = new AdapterMock()
|
|
15
|
+
// const mockData = require('../../mocks/peers-mock')
|
|
16
|
+
|
|
17
|
+
describe('#Use-Cases-Peer', () => {
|
|
18
|
+
let uut
|
|
19
|
+
let sandbox
|
|
20
|
+
let thisNode
|
|
21
|
+
|
|
22
|
+
beforeEach(async () => {
|
|
23
|
+
// Restore the sandbox before each test.
|
|
24
|
+
sandbox = sinon.createSandbox()
|
|
25
|
+
|
|
26
|
+
const thisNodeUseCases = new ThisNodeUseCases({
|
|
27
|
+
adapters,
|
|
28
|
+
statusLog: () => {
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
thisNode = await thisNodeUseCases.createSelf({ type: 'node.js' })
|
|
32
|
+
//
|
|
33
|
+
// uut = new RelayUseCases({
|
|
34
|
+
// adapters,
|
|
35
|
+
// controllers: {},
|
|
36
|
+
// statusLog: () => {}
|
|
37
|
+
// })
|
|
38
|
+
|
|
39
|
+
uut = new PeerUseCases({ adapters, controllers: {} })
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
afterEach(() => sandbox.restore())
|
|
43
|
+
|
|
44
|
+
describe('#constructor', () => {
|
|
45
|
+
it('should throw an error if adapters is not included', () => {
|
|
46
|
+
try {
|
|
47
|
+
uut = new PeerUseCases()
|
|
48
|
+
|
|
49
|
+
assert.fail('Unexpected code path')
|
|
50
|
+
} catch (err) {
|
|
51
|
+
assert.include(
|
|
52
|
+
err.message,
|
|
53
|
+
'Must inject instance of adapters when instantiating Peer Use Cases library.'
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
describe('#sendPrivateMessage', () => {
|
|
60
|
+
it('should throw an error if peer data can not be found', async () => {
|
|
61
|
+
try {
|
|
62
|
+
const result = await uut.sendPrivateMessage(
|
|
63
|
+
'fakeId',
|
|
64
|
+
'messageStr',
|
|
65
|
+
thisNode
|
|
66
|
+
)
|
|
67
|
+
console.log('result: ', result)
|
|
68
|
+
} catch (err) {
|
|
69
|
+
assert.include(err.message, 'Data for peer')
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('should encrypt a message and add it to the peers OrbitDB', async () => {
|
|
74
|
+
thisNode.peerData.push({ from: 'fakeId' })
|
|
75
|
+
// thisNode.orbitData.push({
|
|
76
|
+
// ipfsId: 'fakeId',
|
|
77
|
+
// db: {
|
|
78
|
+
// add: () => {
|
|
79
|
+
// }
|
|
80
|
+
// }
|
|
81
|
+
// })
|
|
82
|
+
|
|
83
|
+
// Mock dependencies
|
|
84
|
+
// sandbox.stub(uut.adapters.encryption, 'encryptMsg')
|
|
85
|
+
sandbox.stub(uut, 'connectToPeer').resolves(true)
|
|
86
|
+
|
|
87
|
+
const result = await uut.sendPrivateMessage(
|
|
88
|
+
'fakeId',
|
|
89
|
+
'messageStr',
|
|
90
|
+
thisNode
|
|
91
|
+
)
|
|
92
|
+
// console.log('result: ', result)
|
|
93
|
+
|
|
94
|
+
assert.equal(result, true)
|
|
95
|
+
})
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
describe('#connectToPeer', () => {
|
|
99
|
+
it('should skip if peer is already connected', async () => {
|
|
100
|
+
// Test data
|
|
101
|
+
const peerId = 'QmbyYXKbnAmMbMGo8LRBZ58jYs58anqUzY1m4jxDmhDsjd'
|
|
102
|
+
thisNode.peerList = [peerId]
|
|
103
|
+
|
|
104
|
+
// Mock dependencies
|
|
105
|
+
sandbox.stub(uut.adapters.ipfs, 'getPeers').resolves([{ peer: peerId }])
|
|
106
|
+
|
|
107
|
+
// Connect to that peer
|
|
108
|
+
const result = await uut.connectToPeer(peerId, thisNode)
|
|
109
|
+
|
|
110
|
+
assert.equal(result, true)
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
it('should connect to peer through circuit relay', async () => {
|
|
114
|
+
// Test data
|
|
115
|
+
const peerId = 'QmbyYXKbnAmMbMGo8LRBZ58jYs58anqUzY1m4jxDmhDsjd'
|
|
116
|
+
thisNode.peerList = [peerId]
|
|
117
|
+
thisNode.relayData = [
|
|
118
|
+
{
|
|
119
|
+
multiaddr: '/ip4/139.162.76.54/tcp/5269/ws/p2p/QmaKzQTAtoJWYMiG5ATx41uWsMajr1kSxRdtg919s8fK77',
|
|
120
|
+
connected: true,
|
|
121
|
+
updatedAt: '2021-09-20T15:59:12.961Z',
|
|
122
|
+
ipfsId: 'QmaKzQTAtoJWYMiG5ATx41uWsMajr1kSxRdtg919s8fK77',
|
|
123
|
+
isBootstrap: false,
|
|
124
|
+
metrics: { aboutLatency: [] },
|
|
125
|
+
latencyScore: 10000
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
|
|
129
|
+
// Mock dependencies
|
|
130
|
+
sandbox.stub(uut.adapters.ipfs, 'getPeers').resolves([])
|
|
131
|
+
sandbox.stub(uut.adapters.ipfs, 'connectToPeer').resolves(true)
|
|
132
|
+
thisNode.useCases = {
|
|
133
|
+
relays: {
|
|
134
|
+
sortRelays: () => thisNode.relayData
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Connect to that peer
|
|
139
|
+
const result = await uut.connectToPeer(peerId, thisNode)
|
|
140
|
+
|
|
141
|
+
assert.equal(result, true)
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it('should return false if not able to connect to peer', async () => {
|
|
145
|
+
// Test data
|
|
146
|
+
const peerId = 'QmbyYXKbnAmMbMGo8LRBZ58jYs58anqUzY1m4jxDmhDsjd'
|
|
147
|
+
thisNode.peerList = [peerId]
|
|
148
|
+
thisNode.relayData = [
|
|
149
|
+
{
|
|
150
|
+
multiaddr: '/ip4/139.162.76.54/tcp/5269/ws/p2p/QmaKzQTAtoJWYMiG5ATx41uWsMajr1kSxRdtg919s8fK77',
|
|
151
|
+
connected: true,
|
|
152
|
+
updatedAt: '2021-09-20T15:59:12.961Z',
|
|
153
|
+
ipfsId: 'QmaKzQTAtoJWYMiG5ATx41uWsMajr1kSxRdtg919s8fK77',
|
|
154
|
+
isBootstrap: false,
|
|
155
|
+
metrics: { aboutLatency: [] },
|
|
156
|
+
latencyScore: 10000
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
|
|
160
|
+
// Mock dependencies
|
|
161
|
+
sandbox.stub(uut.adapters.ipfs, 'getPeers').resolves([])
|
|
162
|
+
sandbox.stub(uut.adapters.ipfs, 'connectToPeer').resolves(false)
|
|
163
|
+
thisNode.useCases = {
|
|
164
|
+
relays: {
|
|
165
|
+
sortRelays: () => thisNode.relayData
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Connect to that peer
|
|
170
|
+
const result = await uut.connectToPeer(peerId, thisNode)
|
|
171
|
+
|
|
172
|
+
assert.equal(result, false)
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
it('should catch and throw errors', async () => {
|
|
176
|
+
try {
|
|
177
|
+
await uut.connectToPeer()
|
|
178
|
+
|
|
179
|
+
assert.fail('Unexpected code path')
|
|
180
|
+
} catch (err) {
|
|
181
|
+
// console.log(err)
|
|
182
|
+
assert.include(err.message, 'Cannot read')
|
|
183
|
+
}
|
|
184
|
+
})
|
|
185
|
+
})
|
|
186
|
+
})
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Unit tests for the Pubsub use case.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// npm libraries
|
|
6
|
+
import { assert } from 'chai'
|
|
7
|
+
import sinon from 'sinon'
|
|
8
|
+
|
|
9
|
+
// Local libraries
|
|
10
|
+
import PubsubUseCases from '../../../lib/use-cases/pubsub-use-cases.js'
|
|
11
|
+
import ThisNodeUseCases from '../../../lib/use-cases/this-node-use-cases.js'
|
|
12
|
+
import AdapterMock from '../../mocks/adapter-mock.js'
|
|
13
|
+
|
|
14
|
+
const adapters = new AdapterMock()
|
|
15
|
+
// const mockData = require('../../mocks/peers-mock')
|
|
16
|
+
|
|
17
|
+
describe('#pubsub-Use-Cases', () => {
|
|
18
|
+
let uut
|
|
19
|
+
let sandbox
|
|
20
|
+
let thisNodeUseCases
|
|
21
|
+
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
// Restore the sandbox before each test.
|
|
24
|
+
sandbox = sinon.createSandbox()
|
|
25
|
+
|
|
26
|
+
thisNodeUseCases = new ThisNodeUseCases({
|
|
27
|
+
adapters,
|
|
28
|
+
statusLog: () => {}
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
uut = new PubsubUseCases({
|
|
32
|
+
adapters,
|
|
33
|
+
thisNodeUseCases
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
afterEach(() => sandbox.restore())
|
|
38
|
+
|
|
39
|
+
describe('#constructor', () => {
|
|
40
|
+
it('should throw an error if adapters is not included', () => {
|
|
41
|
+
try {
|
|
42
|
+
uut = new PubsubUseCases()
|
|
43
|
+
|
|
44
|
+
assert.fail('Unexpected code path')
|
|
45
|
+
} catch (err) {
|
|
46
|
+
assert.include(
|
|
47
|
+
err.message,
|
|
48
|
+
'Must inject instance of adapters when instantiating Pubsub Use Cases library.'
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('should throw an error if thisNodeUseCases instance is not included', () => {
|
|
54
|
+
try {
|
|
55
|
+
uut = new PubsubUseCases({
|
|
56
|
+
adapters: {},
|
|
57
|
+
controllers: {}
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
assert.fail('Unexpected code path')
|
|
61
|
+
} catch (err) {
|
|
62
|
+
assert.include(
|
|
63
|
+
err.message,
|
|
64
|
+
'thisNode use cases required when instantiating Pubsub Use Cases library.'
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
it('should allow parent app to override coinjoin pubsub handler', () => {
|
|
70
|
+
const localHandler = () => {}
|
|
71
|
+
|
|
72
|
+
// Use default handler
|
|
73
|
+
uut = new PubsubUseCases({
|
|
74
|
+
adapters: {},
|
|
75
|
+
thisNodeUseCases
|
|
76
|
+
})
|
|
77
|
+
const normalHandleResult = uut.coinjoinPubsubHandler()
|
|
78
|
+
assert.equal(normalHandleResult, true)
|
|
79
|
+
|
|
80
|
+
// Replace default handler
|
|
81
|
+
uut = new PubsubUseCases({
|
|
82
|
+
adapters: {},
|
|
83
|
+
thisNodeUseCases,
|
|
84
|
+
coinjoinPubsubHandler: localHandler
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
assert.isOk(uut.coinjoinPubsubHandler)
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
describe('#initializePubsub', () => {
|
|
92
|
+
it('should subscribe to a node', async () => {
|
|
93
|
+
await uut.initializePubsub('fakeNode')
|
|
94
|
+
|
|
95
|
+
assert.isOk(true, 'No throwing an error is a pass')
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
it('should catch and throw an error', async () => {
|
|
99
|
+
try {
|
|
100
|
+
// Force an error
|
|
101
|
+
sandbox
|
|
102
|
+
.stub(uut.adapters.pubsub, 'subscribeToPubsubChannel')
|
|
103
|
+
.rejects(new Error('test error'))
|
|
104
|
+
|
|
105
|
+
await uut.initializePubsub('fakeNode')
|
|
106
|
+
|
|
107
|
+
assert.fail('Unexpected code path')
|
|
108
|
+
} catch (err) {
|
|
109
|
+
// console.log(err)
|
|
110
|
+
assert.include(err.message, 'test error')
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
})
|
|
114
|
+
})
|