enhanced-datachannel
The enhance(RTCDataChannel)
functions for general usage.
Install
npm i enhanced-datachannel
You need to bundle into your app using webpack
, rollup
, etc....
Exports
import { based, promised, chunked } from "enhanced-datachannel";
const pc = new RTCPeerConnection();
const dc = pc.createDataChannel("mych");
pc.addEventListener("datachannel", ev => {
const dc = ev.channel;
});
const basedDC = based(dc);
const promisedDC = promised(dc);
const chunkedDC = chunked(dc);
Passed RTCDataChannel
instance should be reliable
and ordered
mode.
API
BasedDataChannel
const basedDC = based(dc);
Do nothing, just wrap with EventEmitter
.
This class has the same properties which RTCDataChannel
instance has.
readyState
label
binaryType
- etc...
See spec for the detail.
and also emits the same event types via EventEmitter
.
open
close
error
message
bufferedamountlow
The send()
method is equivalent to dc.send()
and on("message")
handler is equivalent to dc.onmessage
.
basedDC.on("message", data => {});
basedDC.send(data);
PromisedDataChannel
const promisedDC = promised(dc);
Make it possible to await dc.send(json)
.
This class extends BasedDataChannel
.
And this class has special send()
method and on("message")
handler.
promisedDC.on("message", (data, resolve, reject) => {
try {
console.log(data.msg);
resolve({ res: "Thank you!" });
} catch (err) {
reject(err);
}
});
const data = await promisedDC.send({ msg: "Take this!" });
console.log(data.res);
If recv side does not resolve()
neither nor reject()
, it is treated as reject()
with timeout.
ChunkedDataChannel
const chunkedDC = chunked(dc);
Make it possible to send a large file.
This class extends BasedDataChannel
.
And this class has special send()
method and on("message")
handler.
chunkedDC.on("message", (blob, meta) => {
const $downloadLink = document.createElement("a");
$downloadLink.href = URL.createObjectURL(blob);
$downloadLink.download = meta.name;
$downloadLink.textContent = meta.name;
document.body.append($downloadLink);
});
await chunkedDC.send(file, { name: "prof.png" });