datoms-protocol
Version:
An integrated implementation of hypercore protocol with both stream and state machine
111 lines (95 loc) • 2.94 kB
JavaScript
const { Stream, Protocol, createProtocolStream } = require('./index')
const assert = require('assert')
const b4a = require('b4a')
// Test Stream implementation
function testStream() {
console.log('Testing Stream implementation...')
const streamA = createProtocolStream(true)
const streamB = createProtocolStream(false)
let received = false
const key = b4a.from('deadbeefdeadbeefdeadbeefdeadbeef', 'hex')
const channel = streamA.open(key)
streamB.open(key, {
ondata(message) {
received = true
assert.strictEqual(message.value.toString(), '{ block: 42 }')
console.log('✓ Stream test passed')
}
})
channel.data({ index: 1, value: Buffer.from('{ block: 42 }') })
// Connect the streams
streamA.pipe(streamB).pipe(streamA)
return new Promise(resolve => {
setTimeout(() => {
assert(received, 'Should have received data')
resolve()
}, 2000) // 增加超时时间到 2 秒
})
}
// Test Protocol implementation
function testProtocol() {
console.log('Testing Protocol implementation...')
let received = false
let handshakeCompleted = false
const protocolA = new Protocol(true, {
onhandshake() {
console.log('Protocol A handshake completed')
handshakeCompleted = true
},
send(data) {
console.log('Protocol A sending data:', data.length, 'bytes')
protocolB.recv(data)
}
})
const protocolB = new Protocol(false, {
onhandshake() {
console.log('Protocol B handshake completed')
},
onrequest(channel, message) {
received = true
console.log('Protocol B received request on channel', channel, ':', message)
assert.strictEqual(message.index, 42)
console.log('✓ Protocol test passed')
},
send(data) {
console.log('Protocol B sending data:', data.length, 'bytes')
protocolA.recv(data)
}
})
// 等待握手完成后再发送请求
return new Promise(resolve => {
// 检查握手是否完成的函数
function checkHandshake() {
if (handshakeCompleted) {
console.log('Handshake completed, sending test request')
// 发送测试请求
protocolA.request(10, {
index: 42
})
// 等待接收请求
setTimeout(() => {
assert(received, 'Should have received request')
console.log('Test completed successfully!')
resolve()
}, 1000) // 增加等待时间到 1 秒
} else {
console.log('Waiting for handshake to complete...')
setTimeout(checkHandshake, 500) // 每 500ms 检查一次
}
}
// 开始检查握手
setTimeout(checkHandshake, 500)
})
}
// Run tests
async function runTests() {
try {
await testProtocol()
await testStream()
console.log('All tests passed!')
} catch (err) {
console.error('Test failed:', err)
process.exit(1)
}
}
runTests()