| .. | .. |
|---|
| 141 | 141 | client.keepAlivePeriod = 30; |
|---|
| 142 | 142 | client.autoReconnect = false; // Don't auto-reconnect during trial — enable after success |
|---|
| 143 | 143 | client.connectTimeoutPeriod = timeout; |
|---|
| 144 | | - client.logging(on: true); |
|---|
| 144 | + // client.maxConnectionAttempts is final — can't set it |
|---|
| 145 | + client.logging(on: false); |
|---|
| 145 | 146 | |
|---|
| 146 | 147 | client.onConnected = _onConnected; |
|---|
| 147 | 148 | client.onDisconnected = _onDisconnected; |
|---|
| .. | .. |
|---|
| 407 | 408 | } |
|---|
| 408 | 409 | |
|---|
| 409 | 410 | if (type == 'image' && sessionId != null) { |
|---|
| 410 | | - // Image message |
|---|
| 411 | 411 | _publish('pailot/$sessionId/in', { |
|---|
| 412 | 412 | 'msgId': _uuid(), |
|---|
| 413 | 413 | 'type': 'image', |
|---|
| .. | .. |
|---|
| 420 | 420 | return; |
|---|
| 421 | 421 | } |
|---|
| 422 | 422 | |
|---|
| 423 | + if (type == 'bundle' && sessionId != null) { |
|---|
| 424 | + // Atomic multi-attachment message |
|---|
| 425 | + _publish('pailot/$sessionId/in', { |
|---|
| 426 | + 'msgId': _uuid(), |
|---|
| 427 | + 'type': 'bundle', |
|---|
| 428 | + 'sessionId': sessionId, |
|---|
| 429 | + 'caption': message['caption'] ?? '', |
|---|
| 430 | + if (message['audioBase64'] != null) 'audioBase64': message['audioBase64'], |
|---|
| 431 | + 'attachments': message['attachments'] ?? [], |
|---|
| 432 | + 'ts': _now(), |
|---|
| 433 | + }, MqttQos.atLeastOnce); |
|---|
| 434 | + return; |
|---|
| 435 | + } |
|---|
| 436 | + |
|---|
| 437 | + if (type == 'file' && sessionId != null) { |
|---|
| 438 | + _publish('pailot/$sessionId/in', { |
|---|
| 439 | + 'msgId': _uuid(), |
|---|
| 440 | + 'type': 'file', |
|---|
| 441 | + 'sessionId': sessionId, |
|---|
| 442 | + 'fileBase64': message['fileBase64'] ?? '', |
|---|
| 443 | + 'fileName': message['fileName'] ?? 'file', |
|---|
| 444 | + 'mimeType': message['mimeType'] ?? 'application/octet-stream', |
|---|
| 445 | + 'fileSize': message['fileSize'] ?? 0, |
|---|
| 446 | + 'ts': _now(), |
|---|
| 447 | + }, MqttQos.atLeastOnce); |
|---|
| 448 | + return; |
|---|
| 449 | + } |
|---|
| 450 | + |
|---|
| 423 | 451 | if (type == 'tts' && sessionId != null) { |
|---|
| 424 | 452 | // TTS request — route as command |
|---|
| 425 | 453 | _publish('pailot/control/in', { |
|---|