Skip to main content

API Reference

Configuration

ProtocolConfig

interface ProtocolConfig {
  appId: string;
  userId: string;
  transports?: TransportsConfig;
  dors?: DorsConfig;
  network?: NetworkConfig;
  reliability?: ReliabilityConfig;
  fileTransfer?: FileTransferConfig;
  path?: PathConfig;
}

TransportsConfig

interface TransportsConfig {
  ble?: {
    enabled: boolean;  // default: true
  };
  internet?: {
    enabled: boolean;           // default: false
    serverAddress?: string;     // WebSocket URL
    autoReconnect?: boolean;    // default: true
    reconnectDelay?: number;    // ms
  };
  wifiDirect?: {
    enabled: boolean;           // default: false (Android only)
    deviceName?: string;
    autoAccept?: boolean;
    groupOwnerIntent?: number;  // 0-15
  };
}

DorsConfig

Controls transport switching behavior.
interface DorsConfig {
  preferOnline?: boolean;              // default: false
  switchHysteresis?: number;           // default: 15.0
  switchCooldownSecs?: number;         // default: 20
  bleToWifiRetryThreshold?: number;    // default: 2
  rssiSwitchThreshold?: number;        // default: -85 dBm
  congestionQueueThreshold?: number;   // default: 50
  stabilityWindowSecs?: number;        // default: 8
  poorSignalDurationSecs?: number;     // default: 10
  ttlEscalationThreshold?: number;     // default: 2
  congestionDurationSecs?: number;     // default: 10
  ttlEscalationHoldSecs?: number;      // default: 20
  historyWindowSize?: number;          // default: 10
  queueRecoveryRatio?: number;         // default: 0.5
}

NetworkConfig

interface NetworkConfig {
  initialTtl?: number;  // default: 8
}

ReliabilityConfig

interface ReliabilityConfig {
  ack?: {
    defaultTimeoutMs?: number;   // default: 5000
    maxPendingAcks?: number;     // default: 1000
  };
  retry?: {
    maxRetries?: number;         // default: 5
    initialDelayMs?: number;     // default: 1000
    maxDelayMs?: number;         // default: 30000
    backoffMultiplier?: number;  // default: 2.0
    outboxMaxLifetimeMs?: number; // default: 3600000
  };
  dedup?: {
    maxTrackedMessages?: number; // default: 10000
    retentionTimeSecs?: number;  // default: 3600
  };
}

PathConfig

interface PathConfig {
  forwardToTopK?: number;        // default: 3
  maxCongestionLevel?: number;   // default: 0.8
}

FileTransferConfig

interface FileTransferConfig {
  chunkSize?: number;    // default: 32768 (32KB)
  maxFileSize?: number;  // default: 104857600 (100MB)
}

API Methods

Constructor

new OfflineProtocol(config: ProtocolConfig)

Lifecycle Methods

MethodReturnsDescription
start()Promise<void>Start the protocol and all enabled transports
stop()Promise<void>Stop the protocol and disconnect all peers
pause()Promise<void>Pause for background mode
resume()Promise<void>Resume from paused state
destroy()Promise<void>Clean up all resources
getState()Promise<ProtocolState>Get current state (Stopped, Running, Paused)

Messaging

MethodReturnsDescription
sendMessage(params: SendMessageParams)Promise<string>Send message, returns message ID
receiveMessage()Promise<MessageReceivedEvent | null>Poll for next received message
interface SendMessageParams {
  recipient: string;
  content: string;
  priority?: MessagePriority;  // default: Medium
}

enum MessagePriority {
  Low = 0,
  Medium = 1,
  High = 2,
  Critical = 3,
}

Transport Management

MethodReturnsDescription
getActiveTransports()Promise<TransportType[]>Get list of active transports
enableTransport(type, config?)Promise<void>Enable a transport
disableTransport(type)Promise<void>Disable a transport
forceTransport(type)Promise<void>Force specific transport (override DORS)
releaseTransportLock()Promise<void>Release forced transport, let DORS decide
getTransportMetrics(type)Promise<TransportMetrics | null>Get transport statistics
type TransportType = 'ble' | 'internet' | 'wifiDirect';

interface TransportMetrics {
  packetsSent: number;
  packetsReceived: number;
  bytesSent: number;
  bytesReceived: number;
  errorRate: number;
  avgLatencyMs: number;
}

Bluetooth

MethodReturnsDescription
isBluetoothEnabled()Promise<boolean>Check if Bluetooth is enabled
requestEnableBluetooth()Promise<boolean>Request to enable Bluetooth (Android only)
getBLePeerCount()Promise<number>Get number of discovered BLE peers

Network Topology

MethodReturnsDescription
getTopology()Promise<NetworkTopology>Get network topology snapshot
getMessageStats()Promise<MessageDeliveryStats[]>Get message delivery statistics
getDeliverySuccessRate()Promise<number>Get delivery success rate (0-1)
getMedianLatency()Promise<number | null>Get median latency in ms
getMedianHops()Promise<number | null>Get median hop count

Battery

MethodReturnsDescription
setBatteryLevel(level)Promise<void>Set battery level (0-100) for mesh decisions
getBatteryLevel()Promise<number | null>Get current battery level

DORS Configuration

MethodReturnsDescription
updateDorsConfig(config)Promise<void>Update DORS settings at runtime
getDorsConfig()Promise<DorsConfig>Get current DORS configuration
shouldEscalateToWifi()Promise<boolean>Check if DORS recommends WiFi escalation

Reliability Configuration

MethodReturnsDescription
updateAckConfig(config)Promise<void>Update ACK settings
updateRetryConfig(config)Promise<void>Update retry settings
updateDedupConfig(config)Promise<void>Update deduplication settings
getDedupStats()Promise<DedupStats>Get deduplication statistics
getPendingAckCount()Promise<number>Get pending ACK count
getRetryQueueSize()Promise<number>Get retry queue size

Gradient Routing

MethodReturnsDescription
learnRoute(destination, nextHop, hopCount, quality)Promise<void>Learn a route from incoming message
getBestRoute(destination)Promise<RouteEntry | null>Get best route to destination
getAllRoutes(destination)Promise<RouteEntry[]>Get all routes to destination
hasRoute(destination)Promise<boolean>Check if route exists
removeNeighborRoutes(neighborId)Promise<void>Remove routes through neighbor
cleanupExpiredRoutes()Promise<void>Clean up expired routes
getRoutingStats()Promise<RoutingStats>Get routing table statistics
updateRoutingConfig(config)Promise<void>Update routing configuration

Event Listeners

MethodReturnsDescription
on(eventType, listener)thisRegister event listener
off(eventType, listener)thisRemove event listener
once(eventType, listener)thisRegister one-time listener
removeAllListeners(eventType?)thisRemove all listeners

Events

Message Events

message_sent

interface MessageSentEvent {
  type: 'message_sent';
  message_id: string;
  sender: string;
  recipient: string;
  content: string;
  priority: 'low' | 'medium' | 'high' | 'critical';
  requires_ack: boolean;
  timestamp: number;
}

message_received

interface MessageReceivedEvent {
  type: 'message_received';
  message_id: string;
  sender: string;
  recipient: string;
  content: string;
  hop_count: number;
  transport: string;
  timestamp: number;
}

message_delivered

interface MessageDeliveredEvent {
  type: 'message_delivered';
  message_id: string;
  latency_ms: number;
  hop_count: number;
  transport: string;
}

message_failed

interface MessageFailedEvent {
  type: 'message_failed';
  message_id: string;
  reason: string;
  retry_count: number;
}

Network Events

transport_switched

interface TransportSwitchedEvent {
  type: 'transport_switched';
  from: string | null;
  to: string;
  reason: string;
}

neighbor_discovered

interface NeighborDiscoveredEvent {
  type: 'neighbor_discovered';
  peer_id: string;
  transport: string;
  rssi?: number;
}

neighbor_lost

interface NeighborLostEvent {
  type: 'neighbor_lost';
  peer_id: string;
}

network_metrics

interface NetworkMetricsEvent {
  type: 'network_metrics';
  neighbor_count: number;
  relay_count: number;
  delivery_ratio: number;
  avg_latency_ms: number;
}

File Events

file_progress

interface FileProgressEvent {
  type: 'file_progress';
  file_id: string;
  chunks_sent: number;
  total_chunks: number;
  percentage: number;
}

file_received

interface FileReceivedEvent {
  type: 'file_received';
  file_id: string;
  file_name: string;
  file_size: number;
  sender: string;
}

Diagnostic Events

interface DiagnosticEvent {
  type: 'diagnostic';
  level: 'info' | 'warning' | 'error';
  message: string;
  context?: Record<string, unknown>;
}

Types

NetworkTopology

interface NetworkTopology {
  timestamp: number;
  local_user_id: string;
  nodes: NetworkNode[];
  links: NetworkLink[];
  stats: NetworkStats;
}

interface NetworkNode {
  user_id: string;
  role: string;  // 'Normal' or 'Relay' from topology API
  connection_count: number;
  battery_level?: number;
  last_seen: number;
  transports: TransportType[];
}

interface NetworkLink {
  from: string;
  to: string;
  quality: number;  // 0.0 - 1.0
  transport: TransportType;
  rssi?: number;
}

interface NetworkStats {
  total_nodes: number;
  relay_nodes: number;  // Count of nodes with 'Relay' role in topology
  total_connections: number;
  avg_link_quality: number;
  network_diameter?: number;
}

MessageDeliveryStats

interface MessageDeliveryStats {
  message_id: string;
  sender: string;
  recipient: string;
  sent_at: number;
  delivered_at?: number;
  hop_count: number;
  transport?: TransportType;
  retry_count: number;
  latency_ms?: number;
}

RouteEntry

interface RouteEntry {
  nextHop: string;
  hopCount: number;
  quality: number;     // 0.0 - 1.0
  lastSeenMs: number;
}

RoutingStats

interface RoutingStats {
  destinationCount: number;
  routeCount: number;
}

DedupStats

interface DedupStats {
  totalTracked: number;
  recentTracked: number;
  capacityUsedPercent: number;
  mode: 'HashMap' | 'BloomFilter';
}

FileProgress

interface FileProgress {
  file_id: string;
  file_name: string;
  file_size: number;
  chunks_completed: number;
  total_chunks: number;
  percentage: number;
}

ProtocolState

enum ProtocolState {
  Stopped = 0,
  Running = 1,
  Paused = 2,
}

DORS (Dynamic Offline Relay Switch)

DORS automatically selects the optimal transport based on real-time conditions.

Scoring Factors

FactorDescription
Signal StrengthRSSI for BLE/WiFi (-50 to -100 dBm)
ProximityHop count to destination
BandwidthTransport throughput capability
CongestionQueue depth and backlog
EnergyBattery impact of transport
ReliabilityHistorical delivery success rate
LoadCurrent processing capacity

Transport Weights

BLE: Optimized for energy efficiency and mesh scenarios
  • Signal: 30%, Energy: 30%, Congestion: 15%, Proximity: 15%
WiFi Direct: Optimized for high throughput
  • Bandwidth: 35%, Proximity: 20%, Congestion: 20%, Reliability: 15%
Internet: Optimized for server connectivity
  • Bandwidth: 35%, Reliability: 30%, Congestion: 15%, Energy: 10%

Switching Safeguards

SafeguardDefaultDescription
Hysteresis15 pointsMinimum score improvement to switch
Cooldown20 secondsWait time between switches
Stability Window8 secondsTransport must be stable before switching

Mesh Networking

Cluster Architecture

Devices organize into clusters (groups of nearby connected peers). Connections between clusters are handled by bridge connections. Connection Roles:
  • MEMBER - Intra-cluster connection (devices in same neighborhood)
  • BRIDGE - Inter-cluster connection (bridges different neighborhoods)

How It Works

  1. Discovery: Devices broadcast BLE advertisements with mesh metadata (degree, free slots, battery, uptime)
  2. Cluster Detection: Each device computes a cluster signature from connected peer hashes
  3. Connection Decisions: MeshController evaluates candidates - prioritizes bridging different clusters
  4. Rebalancing: Periodically swaps lower-quality peers for better candidates or bridge opportunities
  5. Delivery: Messages sent to connected peers

Connection Budget

  • Default: 4 connections per device
  • Minimum: 1 connection maintained
  • Connections are scored and rebalanced every ~15 seconds
  • Bridge candidates get priority when clusters need unifying

Peer Scoring

FactorWeightDescription
RSSI35%Signal strength to peer
Availability20%Free connection slots
Uptime15%How long peer has been active
Battery15%Peer’s battery level
Stability10%Connection reliability history
Load5%Current processing load
Bridge Favor: Candidates from different clusters get a score bonus (bridgeFavor: 0.1) to encourage network unification.

Message TTL

  • Default: 8 hops
  • Messages are dropped when TTL reaches 0
  • Prevents infinite message circulation

Reliability Layer

Acknowledgments

  • Messages require ACK for delivery confirmation
  • Default timeout: 5 seconds
  • message_delivered event fires on ACK receipt

Retry Queue

  • Failed messages are retried with exponential backoff
  • Initial delay: 1 second
  • Maximum delay: 30 seconds
  • Maximum retries: 5

Deduplication

Prevents duplicate message processing:
  • Bloom Filter Mode: Space-efficient, ~1% false positive rate
  • HashMap Mode: Exact tracking, configurable capacity

File Transfer

Sending Files

const fileId = await protocol.sendFile({
  filePath: '/path/to/file.pdf',
  recipient: 'user456',
  fileName: 'document.pdf',  // optional
});

protocol.on('file_progress', (event) => {
  console.log(`${event.percentage}% complete`);
});

Managing Transfers

const progress = await protocol.getFileProgress(fileId);
await protocol.cancelFileTransfer(fileId);

Troubleshooting

Messages Not Delivering

  1. Verify both devices have protocol started
  2. Check they’re within BLE range (~10-30m)
  3. Ensure TTL is sufficient for network size
  4. Monitor message_failed events for retry information

No Peers Discovered

  1. Verify Bluetooth is enabled: await protocol.isBluetoothEnabled()
  2. Check permissions are granted
  3. Ensure background modes enabled (iOS)
  4. Verify devices are within range

Frequent Disconnections

  1. Check signal strength via neighbor_discovered RSSI
  2. Increase stabilityWindowSecs in DORS config
  3. Reduce rebalanceInterval frequency
  4. Check for BLE interference

High Battery Drain

  1. Reduce connection count (native mesh config)
  2. Verify DORS is selecting BLE over WiFi Direct
  3. Check for excessive retry activity
  4. Use setBatteryLevel() to inform mesh decisions

Transport Not Switching

  1. Verify transport is enabled in config
  2. Check hysteresis threshold isn’t too high
  3. Ensure cooldown period has elapsed
  4. Use forceTransport() to test manually

Linking Error

If you see the linking error message:
  1. Run pod install (iOS)
  2. Rebuild the app after installing
  3. Verify not using Expo Go (native modules required)