# BareRTC BareRTC is a simple WebRTC-based chat room application. It is especially designed to be plugged into any existing website, with or without a pre-existing base of users. It is very much in the style of the old-school Flash based webcam chat rooms of the early 2000's: a multi-user chat room with DMs and _some_ users may broadcast video and others may watch multiple video feeds in an asynchronous manner. I thought that this should be such an obvious free and open source app that should exist, but it did not and so I had to write it myself. This is still a **work in progress** and see the features it still needs, below. # Features * Specify multiple Public Channels that all users have access to. * Users can open direct message (one-on-one) conversations with each other. * No long-term server side state: messages are pushed out as they come in. * Users may broadcast their webcam which shows a camera icon by their name in the Who List. Users may click on those icons to open multiple camera feeds of other users they are interested in. * Mobile friendly: works best on iPads and above but adapts to smaller screens well. * WebRTC means peer-to-peer video streaming so cheap on hosting costs! * Simple integration with your existing userbase via signed JWT tokens. Some important features it still needs: * JWT authentication, and admin user permissions (kick/ban/etc.) * Support for profile URLs, custom avatar image URLs, custom profile fields to show in-app * See who all is looking at your camera right now, and kick them off. * Lots of UI cleanup. # Configuration Work in progress. On first run it will create the settings.toml file for you: ```toml WebsiteURL = "http://localhost:8080" [JWT] Enabled = true Strict = true SecretKey = "change me" [[PublicChannels]] ID = "lobby" Name = "Lobby" Icon = "fa fa-gavel" WelcomeMessages = ["Welcome to the chat server!", "Please follow the basic rules:\n\n1. Have fun\n2. Be kind"] [[PublicChannels]] ID = "offtopic" Name = "Off Topic" WelcomeMessages = ["Welcome to the Off Topic channel!"] ``` A description of the config directives includes: * **JWT**: settings for JWT [Authentication](#authentication). * Enabled (bool): activate the JWT token authentication feature. * Strict (bool): if true, **only** valid signed JWT tokens may log in. If false, users with no/invalid token can enter their own username without authentication. * SecretKey (string): the JWT signing secret shared with your back-end app. * **PublicChannels**: list the public channels and their configuration. The default channel will be the first one listed. * ID (string): an arbitrary 'username' for the chat channel, like "lobby". * Name (string): the user friendly name for the channel, like "Off Topic" * Icon (string, optional): CSS class names for FontAwesome icon for the channel, like "fa fa-message" * WelcomeMessages ([]string, optional): messages that are delivered by ChatServer to the user when they connect to the server. Useful to give an introduction to each channel, list its rules, etc. # Authentication BareRTC supports custom (user-defined) authentication with your app in the form of JSON Web Tokens (JWTs). JWTs will allow your existing app to handle authentication for users by signing a token that vouches for them, and the BareRTC app will trust your signed token. The workflow is as follows: 1. Your existing app already has the user logged-in and you trust who they are. To get them into the chat room, your server signs a JWT token using a secret key that both it and BareRTC knows. 2. Your server redirects the user to your BareRTC website sending the JWT token as a `jwt` parameter, either in the query string (GET) or POST request. * e.g. you send them to `https://chat.example.com/?jwt=TOKEN` * If the JWT token is too long to fit in a query string, you may create a `