Skip to content
Wanna `enhance(RTCDataChannel)` for general usage.
JavaScript TypeScript
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
__tests__ Fix missing props Jul 12, 2019
src Make resolve() possible on message event Jul 29, 2019
.eslintignore Install test env Jul 11, 2019
.eslintrc.js Install test env Jul 11, 2019
.gitignore Install test env Jul 11, 2019
CHANGELOG.md Update changelog Jul 29, 2019
LICENSE Initial commit Jul 10, 2019
README.md Update README Jul 29, 2019
karma.conf.js Update deps Jul 18, 2019
package-lock.json Update deps Aug 1, 2019
package.json Update deps Aug 1, 2019
tsconfig.json Install test env Jul 11, 2019

README.md

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();

// create DataChannel instance
const dc = pc.createDataChannel("mych");
// or
pc.addEventListener("datachannel", ev => {
  const dc = ev.channel;
});

// signaling by yourself and connect p2p...

// enhance it for your usage!
const basedDC = based(dc);
// or
const promisedDC = promised(dc);
// or
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.

// recv
basedDC.on("message", data => {});

// send
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.

// recv
promisedDC.on("message", (data, resolve, reject) => {
  try {
    console.log(data.msg); // "Take this!"
    resolve({ res: "Thank you!" });
  } catch (err) {
    reject(err);
  }
});

// send
const data = await promisedDC.send({ msg: "Take this!" });
console.log(data.res); // "Thank you!"

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.

// recv
chunkedDC.on("message", (blob, meta) => {
  // download it
  const $downloadLink = document.createElement("a");
  $downloadLink.href = URL.createObjectURL(blob);
  $downloadLink.download = meta.name;
  $downloadLink.textContent = meta.name;
  document.body.append($downloadLink);
});

// send
await chunkedDC.send(file, { name: "prof.png" });
You can’t perform that action at this time.