P2P videocalls via WebRTC for integration into Delta Chat clients.
To integrate into your Delta Chat client you need to provide a
window.calls object with the following API:
startCall: (offerPayload: string) => void(implementation must calldc_place_outgoing_callchatmail core API)acceptCall: (answerPayload: string) => void(implementation must calldc_accept_incoming_callchatmail core API)endCall: () => void(implementation must calldc_end_callchatmail core API)getIceServers: () => string | Promise<string>(returns a JSON string with array of ice server configurations as expected by https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setConfiguration)getAvatar: () => string(returning the chat's avatar image URL; can be a regular URL or a data-URL, ex."data:image/png;base64,...")
Commands are given to the app via URL hash:
#startCall: tells the app to generate an offer payload and callstartCall(), this is how the app should be open when the user is starting an outgoing call.#offerIncomingCall=PAYLOAD: tells the app to show the "Incoming call. Answer?" screen. Then, if the user clicks "Answer", generate a WebRTC answer to the offer provided inPAYLOAD, and callwindow.calls.acceptCall(webrtcAnswer). If the user declined the call, the app will invokewindow.calls.endCall.#acceptCall=PAYLOAD: same as#offerIncomingCall, but doesn't show the "Incoming call. Answer?" screen and instead automatically and immediately accepts the call.#onAnswer=PAYLOAD: notifies the app that the outgoing call was accepted and provides the answer payload
IMPORTANT: PAYLOAD must be base64 encoded (NOTE: you might still need to URL-encode the base64 string to be a valid URL hash) before passing it to the app in the URL hash.
In order to start the app in audio-only mode initially,
provide noOutgoingVideoInitially in the query (search) string
of the initial URL, e.g. /index.html?noOutgoingVideoInitially#startCall.
In order to completely disable incoming and outgoing video,
provide disableVideoCompletely in the query string of the URL.
See #31.
After cloning this repo, install dependencies:
pnpm i
pnpm check
To test your work in your browser while developing:
pnpm start
Open the simulated instances in 2 separate tabs (the "share" button on the instance in the simulator).
Then add #startCall to the end of the URL of one instance.
On macOS on Safari, you may not be able to give access to the camera to two tabs simultaneously; in this case, try Firefox.
To build the app for releasing:
pnpm build
To package the app with developer tools inside to debug in Delta Chat, set the NODE_ENV
environment variable to "debug":
NODE_ENV=debug pnpm build
The resulting optimized .html file is saved in dist/ folder.
To automatically build and create a new GitHub release with the .html file:
git tag -a v1.0.1
git push origin v1.0.1
Inspired by Serverless WebRTC but built from scratch and much simpler: no data channel, file transfer and only browsers are supported.
See blog posts explaining the idea here: