This is a very simple WebSocket based IRC WebClient/Server.
It contains a small chat-webapp as the frontend (a single-page webapp written in plain JavaScript, not frameworks), it contains a WebSocket/IRC bridge using the SwiftNIO IRC client module, and a small HTTP server which delivers the webapp and serves as a websocket endpoint.
This WebClient is a regular Swift package and can be imported in other Swift servers!
On the surface it is a very simple chat webapp, with basic support for channels and direct messages:
Sometimes a live demo installation is running on http://irc.noze.io/. We probably have to shut it down once abuse starts to take place :-) If it doesn't run and you want to play with it, just install it locally, it is a matter of minutes using MiniIRCd.
This module contains the middlepart, the webserver. It serves two purposes:
- Deliver the client side (JavaScript) webapp to the browser (single page, HTML + CSS + JS).
- Server as an HTTP endpoint for the WebSocket connection. If the JS webapp creates a WebSocket connection, it'll contact the HTTP server, which will then upgrade the HTTP connection to the WebSocket protocol.
┌───────────────────────┐
HTML │ ┌─────────────────┐ │
┌───────JS──────────┼──│ NIO HTTP Server │ │
│ │ └─────────────────┘ │
│ │ │ │
▼ │ Upgrades │
┌──────────────┐ │ Connection │
│ │ │ │ │
│ WebBrowser │ │ ▼ │ ┌──────────────┐
│ │ WebSocket │ ┌─────────────────┐ │ │ │
│ JavaScript │◀────JSON───┼─▶│ NIO WebSocket │◀─┼─IRC──▶│ IRC Server │
│ WebApp │ │ └─────────────────┘ │ │ │
│ │ │ WebServer │ └──────────────┘
└──────────────┘ └───────────────────────┘
The JavaScript web app is embedded into the compiled Swift module (using a Makefile all the resources are bundled together into a single Swift source file). Yet it also works as a standalone web application (you can drag the Client.html into your browser.
The client app is located in Sources/IRCWebClient/WebApp.
An example Package.swift
importing the necessary modules:
// swift-tools-version:5.0
import PackageDescription
let package = Package(
name: "MyOwnIRCServer",
dependencies: [
.package(url: "https://github.com/NozeIO/swift-nio-irc-webclient.git",
from: "0.7.0")
],
targets: [
.target(name: "MyIRCServer",
dependencies: [ "IRCServer", "IRCWebClient" ])
]
)
let webServer = IRCWebClientServer()
webServer.listen()
Check the Configuration object for the supported configuration options.
One can configure three connection parameters:
- host/port - this is the address the HTTP server is running on
- ircHost/port - this is the address of the IRC server
- externalHost/port - the address the browser is using to connect to the HTTP server. Often but not necessarily the same like 1.
Brought to you by ZeeZide. We like feedback, GitHub stars, cool contract work, presumably any form of praise you can think of.