Developement guide

Overview

This guide is for people who want to hack on Convos.

It is helpful if you are familiar with git. Mojolicious and basic Perl tools, such as prove and cpanm.

The JavaScript is compiled using rollupjs and the JavaScript dependency tree is maintained using pnpm.

Getting the source code

The first step is to clone the Convos repository. You can either do this directly on github or by running the command below:

$ git clone https://github.com/nordaaker/convos.git

The command above will create a “convos” directory in the current working directory. The following steps need to be run from the project root, meaning you should cd ./convos first.

Installing dependencies

Once you have the source code you should install the dependencies:

$ pnpm i
$ script/convos install --develop

pnpm is used to install all the JavaScript dependencies. You could use “npm” instead, but “pnpm” is highly recommended.

--develop will install dependencies which is only required if you want to make changes to the files in the assets/ directory. Note that the dependencies are installed in local/lib/. If you want to install them globally or in your $HOME/perl5 directy, then use one of these command instead:

$ perl ./script/cpanm --installdeps --sudo .
$ perl ./script/cpanm --installdeps .

Installing an IRC daemon

It is highly suggested that you install an IRC daemon, since many networks will ban you if you reconnect too often. Any IRC compatible server will work, but ircd is a good alternative:

$ sudo apt-get install ircd-hybrid # ubuntu
$ brew install ircd-hybrid         # osx

Please ask in #convos on freenode.net if you want to use the demo IRC server instead of installing your own.

Starting the application

The basics of getting the application running in development mode is the command below:

$ ./script/convos dev

The command above is the same as:

$ MOJO_IRC_DEBUG=1 CONVOS_DEBUG=1 script/convos webpack \
    -w lib -w public/convos-api.json -w templates

MOJO_IRC_DEBUG and CONVOS_DEBUG will print extra low level debug information to STDERR, which is useful to discover bugs. The -w switch is for watching different files and directories for changes and reload the web server automatically.

Secure connection

Running convos dev will automatically pick up any certificated files in the root of your project. This can be useful if you want to work on some features that require “https”. A self-signed certificate is often not enough, so we suggest using mkcert to set up local development certificates.

After you have installed mkcert you can simply run the following commands to get a secure connection:

$ mkcert localhost
$ ./script/convos dev

The default address for the secure server will be https://localhost:3443/, but you can change that:

$ ./script/convos dev --listen https://localhost:8443

Building production assets

The command below will create production assets, which will be used when you start the production version of Convos:

BUILD_ASSETS=1 prove -l t/production-resources.t

Directory structure

Convos frontend

                .------.
            ____| Core |
.--------._/    '------'
| Convos |
'--------'    .-------------.
      \_______| Controllers |
              '-------------'

The frontend contains of a single template, embedded inside of Convos.pm The rest of the frontend consist of a JavaScript application, powered by Svelte. This application gets its data from a OpenAPI powered JSON API with a thin logical layer inside the controllers:

Convos core

             .---------.
          ___| Backend |
.------._/   '---------'
| Core |
'------   .------.  .-------------.  .---------.
    \_____| User |__| Connections |__| Dialogs |
          '------'  '-------------'  '---------'

Convos::Core is the heart of Convos. The core takes care of connections, dialogs can persist to a backend and provide hooks for plugins.

The design makes Convos a multi-user application, that can persist to any backend (memory, file storage, redis, …) and connect to any chat server, as well as keeping any number of dialogs active.

The way the backend is hooked into the rest of the object graph is by events. Any user, connection or dialog can emit new events that the Backend can choose to persist to storage. The default backend is a file-based backend, which enables Convos to be started without any external database.

API

Convos has an OpenAPI powered REST API. The specification is used to both generate perl code for validation, and to generate documentation. Resources:

TODO: Need to document the WebSocket API as well.

Contribute

Any contribution is more than welcome! Examples: If you find typos on this web page or find something annoying, then please tell us.

We welcome pull requests, but any form of patches are better than nothing. The pull request does not need to be complete either, but it is more likely to get merged if it includes tests and documentation updates.

Check out the issues for open issues. Some of the issues are put into planned milestones, but any of the backlog issues are for grabs at any time.