Skip to content

A very simple IRC web client and WebSocket bridge for SwiftNIO

License

Notifications You must be signed in to change notification settings

NozeIO/swift-nio-irc-webclient

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SwiftNIO IRC Web Client

Swift4 Swift5 macOS tuxOS

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!

What it looks like

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.

Overview

Swift NIO Parts

This module contains the middlepart, the webserver. It serves two purposes:

  1. Deliver the client side (JavaScript) webapp to the browser (single page, HTML + CSS + JS).
  2. 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       │       └──────────────┘
└──────────────┘            └───────────────────────┘

JavaScript Client

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.

Importing the module using Swift Package Manager

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" ])
    ]
)

Using the Server

let webServer = IRCWebClientServer()
webServer.listen()

Check the Configuration object for the supported configuration options.

One can configure three connection parameters:

  1. host/port - this is the address the HTTP server is running on
  2. ircHost/port - this is the address of the IRC server
  3. externalHost/port - the address the browser is using to connect to the HTTP server. Often but not necessarily the same like 1.

Who

Brought to you by ZeeZide. We like feedback, GitHub stars, cool contract work, presumably any form of praise you can think of.