⚓ SignalArgh

Set sail with real-time messaging. No charts, no compass - just coordinates and wind.

Test the Waters

This be a live connection to the SignalR hub. Open this page in another port to watch messages flow betwixt vessels in real-time.

⚓ Not Connected

Ship's Log:

Chart Your Course

Copy this bearing and set sail. No registration at port, no credentials to verify - just hoist the flag and go.

Hub Coordinates: https://signalargh.mikesendpoint.com/hub
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.0/signalr.min.js"></script>
<script>
const connection = new signalR.HubConnectionBuilder()
    .withUrl("https://signalargh.mikesendpoint.com/hub?channelId=my-fleet&userId=captain-1")
    .withAutomaticReconnect()
    .build();

connection.on("channelChat", (data) => {
    console.log(`${data.userId}: ${data.message}`);
});

await connection.start();
await connection.invoke("SendChannelChat", "my-fleet", "Ahoy from the helm!");
</script>

Navigation Principles

Channels

Think of channels as separate shipping lanes. Vessels in different channels never cross paths - their messages stay isolated to their own waters. Channels chart themselves upon first contact - no harbor master approval needed.

Groups

Groups be sub-divisions within a channel. Perfect for organizing the crew or coordinating specific operations.

await connection.invoke("JoinGroup", "officers");
await connection.invoke("PublishToGroupWithUser", "officers", "groupChat", "Starboard crew, report!");

Ship's Manifest

Available Commands

Command Parameters Purpose
SendChannelChat channelId, message Broadcast to all vessels in channel
SendChannelAnnouncement channelId, message Send priority signal (highlighted)
JoinGroup groupName Join a formation within your channel
LeaveGroup groupName Leave formation
PublishToGroupWithUser groupName, topic, payload Signal to formation members

Incoming Signals

Signal Type Payload When Received
channelChat {message, userId, timestamp} Vessel sends message
systemNotification string Vessel enters/leaves channel
channelAnnouncement {message, userId, timestamp} Priority signal received
groupChat {message, userId, timestamp} Formation-specific message

Captain's Templates

JavaScript Bearing

// npm install @microsoft/signalr
import * as signalR from "@microsoft/signalr";

const channelId = "fleet-" + Date.now();
const userId = "vessel-" + Math.random().toString(36).substr(2, 9);

const connection = new signalR.HubConnectionBuilder()
    .withUrl(`https://signalargh.mikesendpoint.com/hub?channelId=${channelId}&userId=${userId}`)
    .withAutomaticReconnect()
    .build();

connection.on("channelChat", (data) => {
    console.log(`${data.userId}: ${data.message}`);
});

connection.on("systemNotification", (message) => {
    console.log(`Harbor Master: ${message}`);
});

await connection.start();
console.log("Connected to the aether!");

// Send message
await connection.invoke("SendChannelChat", channelId, "All hands on deck!");

Python Course

# pip install signalrcore
from signalrcore.hub_connection_builder import HubConnectionBuilder

hub = HubConnectionBuilder() \
    .with_url("https://signalargh.mikesendpoint.com/hub?channelId=my-fleet&userId=python-vessel") \
    .build()

hub.on("channelChat", lambda data: print(f"{data['userId']}: {data['message']}"))
hub.on("systemNotification", lambda msg: print(f"Harbor: {msg}"))

hub.start()
hub.send("SendChannelChat", ["my-fleet", "Ahoy from Python!"])

C# Navigation

using Microsoft.AspNetCore.SignalR.Client;

var connection = new HubConnectionBuilder()
    .WithUrl("https://signalargh.mikesendpoint.com/hub?channelId=my-fleet&userId=dotnet-ship")
    .WithAutomaticReconnect()
    .Build();

connection.On<dynamic>("channelChat", data => 
    Console.WriteLine($"{data.userId}: {data.message}"));

connection.On<string>("systemNotification", message => 
    Console.WriteLine($"Harbor: {message}"));

await connection.StartAsync();
await connection.InvokeAsync("SendChannelChat", "my-fleet", "Sailing from C#!");

When Seas Get Rough

Connection refused: Ensure yer URL includes both channelId and userId as query parameters. Use WebSockets transport with skipNegotiation: true.

Messages not received: Verify all vessels be in the same channel. Set up signal handlers BEFORE calling connection.start().

Check harbor status:

curl https://signalargh.mikesendpoint.com/health