A user who types a message while their phone switches from WiFi to cellular loses the message silently — the send fires against a disconnected socket and the error is swallowed. No error message, no retry prompt, no indication the message was lost. This erodes trust in the platform's basic promise of delivery. ISO 25010 reliability covers graceful degradation under transient connectivity loss, and offline-aware apps are now a baseline expectation for communication tools.
Low because silently dropped outbound messages occur only during transient disconnects, but they produce irreversible data loss with no user-visible signal.
Buffer outbound messages in a client-side queue and flush automatically on reconnect. Persist the queue to localStorage if you need durability across page reloads.
class OutboundQueue {
private q: Array<{ id: string; data: unknown }> = [];
private connected = false;
constructor(private socket: Socket) {
socket.on('connect', () => { this.connected = true; this.flush(); });
socket.on('disconnect', () => { this.connected = false; });
}
send(data: unknown) {
const id = nanoid();
if (this.connected) {
this.socket.emit('send_message', { ...data as object, id });
} else {
this.q.push({ id, data });
}
}
private flush() {
while (this.q.length) {
const item = this.q.shift()!;
this.socket.emit('send_message', { ...item.data as object, id: item.id });
}
}
}
ID: community-realtime.realtime-ux.offline-send-queue
Severity: low
What to look for: Count all client message send paths. For each, classify whether messages are queued when the connection is down. Enumerate the queue mechanisms: in-memory array, IndexedDB, localStorage.
Pass criteria: The client maintains at least 1 outbound message queue. Messages sent while offline are queued and automatically re-sent when the connection is restored with 0 silently dropped messages.
Fail criteria: Messages sent while offline are silently dropped with no retry.
Skip (N/A) when: Never — offline send queue significantly improves UX.
Detail on fail: "Client drops outbound messages while offline. User must manually resend after reconnecting."
Remediation: Queue and resend outbound messages:
class MessageQueue {
private queue: Array<{ id: string; data: any }> = [];
private isOnline = true;
constructor(private socket: Socket) {
socket.on('connect', () => {
this.isOnline = true;
this.flushQueue();
});
socket.on('disconnect', () => {
this.isOnline = false;
});
}
send(data: any) {
const id = nanoid();
if (this.isOnline) {
this.socket.emit('send_message', { ...data, id });
} else {
this.queue.push({ id, data });
}
}
private flushQueue() {
while (this.queue.length > 0) {
const item = this.queue.shift()!;
this.socket.emit('send_message', { ...item.data, id: item.id });
}
}
}