CloudSignal Docs
Getting StartedFeatures

Persistent sessions

CloudSignal's persistent sessions queue messages for offline clients and restore subscriptions on reconnect.

Persistent sessions let CloudSignal remember a client's subscriptions and queue messages while it's offline. When the client reconnects, queued messages are delivered, useful for clients with intermittent connectivity, like mobile apps, agents that go idle, and remote devices.

How it works

When a client connects with clean_session=false (MQTT 3.1.1) or session_expiry_interval > 0 (MQTT 5.0):

StepWhat happens
CloudSignal stores the sessionSubscriptions and client state are saved
Messages are queuedWhile offline, messages matching subscriptions are held
Delivery on reconnectQueued messages are delivered when the client reconnects
Session expiresAfter the configured expiry, the session and queued messages are deleted
Session lifecycle
Client
CloudSignal
Publisher
CONNECT clean_session=false, SUBSCRIBE agents/#
DISCONNECT (client goes offline)
PUBLISH agents/agent-01/state (queued)
CONNECT (reconnect with same clientId)
Deliver queued messages

Configuration

MQTT 3.1.1

Set clean_session to false when connecting:

import CloudSignal from '@cloudsignal/mqtt-client';

const client = new CloudSignal({
  preset: 'desktop',
  clientId: 'agent-01',
  clean: false, // Enable persistent session
});

await client.connectWithToken({ organizationId, externalToken });

MQTT 5.0

Use session_expiry_interval for finer control:

import CloudSignal from '@cloudsignal/mqtt-client';

const client = new CloudSignal({
  preset: 'desktop',
  clientId: 'agent-01',
  clean: false,
  properties: {
    sessionExpiryInterval: 3600, // Session expires 1 hour after disconnect
  },
});

await client.connectWithToken({ organizationId, externalToken });

The client ID is critical. The same client ID must be used on reconnect to restore the session. Use stable, unique identifiers like agent IDs or device serial numbers.

Queue limits

Message queues have size limits based on your plan.

PlanQueue size
Free100 messages
Pro1,000 messages
Max10,000 messages

When the queue is full, the oldest messages are dropped (FIFO).

Session expiry

Sessions are cleaned up after inactivity.

PlanSession expiry
Free1 hour
Pro24 hours
Max7 days

For longer session expiry or larger queues, contact us about Enterprise plans.

Best practices

Use stable client IDs

// Good: stable identifier
const clientId = `agent-${agentId}`;

// Bad: random ID, session can never be restored
const clientId = `agent-${Math.random()}`;

Handle the session-present flag

When connecting, check whether a previous session exists:

client.on('connect', (connack) => {
  if (connack.sessionPresent) {
    // Session restored, subscriptions still active
    console.log('Resumed previous session');
  } else {
    // New session, need to subscribe
    client.subscribe('agents/agent-01/inbox');
  }
});

Choose appropriate QoS

Persistent sessions only queue QoS 1 and QoS 2 messages.

QoSQueued?Notes
0NoFire and forget
1YesDelivered at least once
2YesDelivered exactly once

For messages that must arrive after reconnect, use QoS 1 or higher.

Use cases

Use caseWhy persistent sessions help
Agents with idle periodsCommands sent during downtime are delivered when the agent reconnects
Mobile applicationsUsers don't miss notifications when switching networks or entering tunnels
Remote or edge clientsBuffered upstream messages aren't lost during cloud connectivity issues

On this page