Zero-copy KCP protocol for the web
npm install @hazae41/kcpZero-copy KCP protocol for the web
``bash`
npm i @hazae41/kcp
`typescript
import { KcpDuplex } from "@hazae41/kcp"
import { Opaque, Writable } from "@hazae41/binary"
import { SuperTransformStream } from "@hazae41/cascade"
import { None } from "@hazae41/kcp"
const conversation = 12345
function pipeToKcp(raw: { outer: ReadableWritablePair
const kcp = new KcpDuplex({ conversation })
raw.outer.readable
.pipeTo(kcp.inner.writable)
.catch(() => { })
kcp.inner.readable
.pipeTo(raw.outer.writable)
.catch(() => { })
return kcp
}
function pipeToDummy(kcp: { outer: ReadableWritablePair
const dummy = new Dummy()
kcp.outer.readable
.pipeTo(dummy.inner.writable)
.catch(() => { })
dummy.inner.readable
.pipeTo(kcp.outer.writable)
.catch(() => { })
return dummy
}
class Dummy extends HalfDuplex
constructor() {
super()
}
send(data: Writable) {
this.output.enqueue(data)
}
}
const forward = new TransformStream
const backward = new TransformStream
const rawA = { outer: { readable: forward.readable, writable: backward.writable } }
const rawB = { outer: { readable: backward.readable, writable: forward.writable } }
const kcpA = pipeToKcp(rawA)
const kcpB = pipeToKcp(rawB)
const dummyA = pipeToDummy(kcpA)
const dummyB = pipeToDummy(kcpB)
dummyB.input.events.on("message", (data) => {
console.log("b", data.bytes)
return new None()
})
dummyA.input.events.on("message", (data) => {
console.log("a", data.bytes)
return new None()
})
dummyA.send(new Opaque(new Uint8Array([1, 2, 3])))
dummyB.send(new Opaque(new Uint8Array([4, 5, 6])))
``