The Idea
After going through The Go Book I was looking for an opportunity to really stretch my understanding in this new language. One of the suggested final exercises at the time was to write a chat server. But the code for that was already provided so it didn't seem like that much of a challenge.
Around this time, with lockdown in full swing, I had gotten into IRC culture and had joined various open source channels. I'd set up an IRC server on my always running Pi 3 to keep recieving messages even while I was offline.
So the idea naturally came to me to try and implement an IRC-style chat server and and a simple client side html & JS page.
What this isn't
This is not a faithfully adaptation of RFC 1459 that details the IRC implementation. This is also not intended to be used as a replacement for IRC servers as it doesn't implement all the features of IRC and probably couldn't handle the same load. This is simply a way for me to explore the various ideas and approaches to concurrent system design
Design
Something I'm particularly proud of in this project was maintaining a design doc to follow that tracked intially the high level approach and then evolved as the project went along. It still serves as a fairly detailed documentation of the design od the server.
Essentially, IRCish is a chat server with channels. Users that are online and connected to a particular channel can see all messages sent to that channel. Like IRC if you disconnect and reconnect, you will not recieve messages from when you were disconnected. Messages are never stored on the server. On receipt of a message it is sent to all connected parties that are registered to that channel
IRCish also implements features like /identify to set your username, /join and /leave to join and leave channels. For a full list of features available use the /help command
Something I find cool
If you don't mind security through obscurity, you can create a channel with a random name, share that name with someone else and chat with them without the messages being seen by anyone else or stored anywhere