=== Eye Viewer Log Rotated at 2026-01-21 10:56:04 +0000 ===
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
datesent = "2026-01-21 11:04:49";
"file_name" = "";
message = Okii;
"message_id" = 18384;
"message_type" = 0;
"prev_session_message_id" = 18383;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("session_id"): ILUIWU]
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18384, AnyHashable("operation_type"): 3]
- stun:stun.l.google.com:19302
- turn:crivello.dyndns.org:3478?transport=udp
- turn:crivello.dyndns.org:3478?transport=tcp
- turns:crivello.dyndns.org:5349?transport=tcp
datesent = "2026-01-21 11:20:40";
"file_name" = "";
message = "\Ud83d\Udc8b";
"message_id" = 18385;
"message_type" = 0;
"prev_session_message_id" = 18384;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18385]
datesent = "2026-01-21 11:20:40";
"file_name" = "";
message = "\Ud83d\Udc8b";
"message_id" = 18385;
"message_type" = 0;
"prev_session_message_id" = 18384;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18385]
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
datesent = "2026-01-21 11:20:40";
"file_name" = "";
message = "\Ud83d\Udc8b";
"message_id" = 18385;
"message_type" = 0;
"prev_session_message_id" = 18384;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}]
"content-available" = 1;
}, AnyHashable("operation_type"): 3]
- stun:stun.l.google.com:19302
- turn:crivello.dyndns.org:3478?transport=udp
- turn:crivello.dyndns.org:3478?transport=tcp
- turns:crivello.dyndns.org:5349?transport=tcp
"LocalWebSocketTask <622300CF-5BD1-445E-9935-9BE955B4F47C>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <622300CF-5BD1-445E-9935-9BE955B4F47C>.<1>}
"content-available" = 1;
}, AnyHashable("operation_type"): 3]
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18386, AnyHashable("operation_type"): 3]
"LocalWebSocketTask <37837BEB-46F9-4935-AF5A-43BDB98CA0DD>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <37837BEB-46F9-4935-AF5A-43BDB98CA0DD>.<1>}
datesent = "2026-01-21 12:16:28";
"file_name" = "";
message = "I was in a call with sasa baby";
"message_id" = 18388;
"message_type" = 0;
"prev_session_message_id" = 18387;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}]
datesent = "2026-01-21 12:16:31";
"file_name" = "";
message = "Sorry\Ud83e\Udd72";
"message_id" = 18389;
"message_type" = 0;
"prev_session_message_id" = 18388;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 2;
"content-available" = 1;
sound = default;
}]
"content-available" = 1;
}, AnyHashable("operation_type"): 3]
alert = {
body = "New message received";
title = Eye;
};
badge = 2;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 12:16:31";
"file_name" = "";
message = "Sorry\Ud83e\Udd72";
"message_id" = 18389;
"message_type" = 0;
"prev_session_message_id" = 18388;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("operation_type"): 0]
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18389]
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18390]
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18391]
"LocalWebSocketTask <5B5E188C-4F2F-44A5-A562-5B4D26D46C91>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <5B5E188C-4F2F-44A5-A562-5B4D26D46C91>.<1>}
datesent = "2026-01-21 12:24:40";
"file_name" = "";
message = "Im sure it will baby\U2665\Ufe0f";
"message_id" = 18393;
"message_type" = 0;
"prev_session_message_id" = 18392;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18393, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}]
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_id"): 18393, AnyHashable("message_data"): {
datesent = "2026-01-21 12:24:40";
"file_name" = "";
message = "Im sure it will baby\U2665\Ufe0f";
"message_id" = 18393;
"message_type" = 0;
"prev_session_message_id" = 18392;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("operation_type"): 0]
"content-available" = 1;
}]
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
"content-available" = 1;
}]
"LocalWebSocketTask <BA7106B1-EAB1-4727-AB8A-DA2CC99C2DEF>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <BA7106B1-EAB1-4727-AB8A-DA2CC99C2DEF>.<1>}
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
datesent = "2026-01-21 12:35:13";
"file_name" = "";
message = "Babyyy!!!!!!";
"message_id" = 18396;
"message_type" = 0;
"prev_session_message_id" = 18395;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18396]
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18396]
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 12:35:22";
"file_name" = "";
message = "\Ud83d\Ude21";
"message_id" = 18397;
"message_type" = 0;
"prev_session_message_id" = 18396;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18397, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
"LocalWebSocketTask <6DEF45AE-ECF0-48E2-ABCE-C8D608D0AC30>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <6DEF45AE-ECF0-48E2-ABCE-C8D608D0AC30>.<1>}
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18397, AnyHashable("operation_type"): 3]
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 12:35:22";
"file_name" = "";
message = "\Ud83d\Ude21";
"message_id" = 18397;
"message_type" = 0;
"prev_session_message_id" = 18396;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18397]
datesent = "2026-01-21 12:56:37";
"file_name" = "";
message = "I do, I always do !";
"message_id" = 18400;
"message_type" = 0;
"prev_session_message_id" = 18399;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("session_id"): ILUIWU]
"content-available" = 1;
}, AnyHashable("message_id"): 18400, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
"LocalDataTask <7074F352-0D31-4D01-A5AE-7D58AE30AFF6>.<150>"
), NSLocalizedDescription=The network connection was lost., NSErrorFailingURLStringKey=https://crivello.dyndns.org:443/WebRTC/chat/receive_message.php, NSErrorFailingURLKey=https://crivello.dyndns.org:443/WebRTC/chat/receive_message.php, _kCFStreamErrorDomainKey=4}
- stun:stun.l.google.com:19302
- turn:crivello.dyndns.org:3478?transport=udp
- turn:crivello.dyndns.org:3478?transport=tcp
- turns:crivello.dyndns.org:5349?transport=tcp
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18404, AnyHashable("session_id"): ILUIWU]
"content-available" = 1;
}, AnyHashable("operation_type"): 3]
datesent = "2026-01-21 16:09:06";
"file_name" = "";
message = "Ahhh I wish I can go\Ud83e\Udd72";
"message_id" = 18416;
"message_type" = 0;
"prev_session_message_id" = 18415;
"replied_message" = "Maybe Pilates ?";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18408;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 7;
"content-available" = 1;
sound = default;
}]
"content-available" = 1;
}]
"content-available" = 1;
}, AnyHashable("message_id"): 18415]
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18414]
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18412]
"content-available" = 1;
}, AnyHashable("message_id"): 18410]
"content-available" = 1;
}]
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
[17:37:33] [CRASH] No crash detected
[17:37:33] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[17:37:33] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[17:37:33] [GIPHY] SDK not available - using REST API fallback
[17:37:33] [BACKGROUND] Background fetch enabled
[17:37:33] [CLEANUP] No old timer messages to delete
[17:37:33] [SECURITY] Initial launch - timeout exceeded (325.33579301834106s > 300.0s)
[17:37:33] [AUTH] Starting PIN authentication
[17:37:33] [PUSH] Notification tapped - session_id: ILUIWU
[17:37:33] [PUSH] Max message_id before tap: 18418
[17:37:33] [PUSH] Stored pending session: ILUIWU
[17:37:33] [PUSH_EMBED] 📩 Received embedded message: id=18419, type=0, sender=Esra
[17:37:33] [PUSH_EMBED] ✅ Saved message 18419 to local DB (sync)
[17:37:33] [PUSH_EMBED] Created new cache with embedded message 18419
[17:37:33] [PUSH_EMBED] Fetching evolution data for message 18419 in background
[17:37:33] [PUSH_EMBED] ✅ Fully processed message 18419
[17:37:33] [PUSH] Embedded message handled instantly on tap
[17:37:33] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[17:37:33] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:37:33] [PUSH] Fetching server messages since_id=18418 to catch coalesced notifications on tap
[17:37:33] [PUSH_PRELOAD] Fetching up to 50 messages since_id=18418 to catch coalesced notifications
[17:37:33] [PUSH_PRELOAD] Fetching messages for instant display cache
[17:37:33] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[17:37:33] [PRELOAD] Cache has only 1 messages (from push) - will load full history
[17:37:33] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18419)...
[17:37:33] [PUSH_EMBED] Got evolution data for message 18419, saving to local DB
[17:37:33] [PUSH_EMBED] Saved evolution data for message 18419
[17:37:33] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[17:37:33] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[17:37:34] [CLIENT_SIG] WebSocket opened
[17:37:34] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[17:37:34] [CLIENT_SIG] Connected! clientId=nkL3iBH0f1aK7hNY
[17:37:34] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[17:37:34] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[17:37:34] [PRELOAD] No messages or parse error
[17:37:34] [PUSH_PRELOAD] Fetched 1 messages - caching for instant display
[17:37:34] [PUSH_PRELOAD] ⚡ Pre-cached 1 messages for instant display (preserved 0 from push)
[17:37:34] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[17:37:34] [PUSH] Server fetch on tap completed (success=true)
[17:37:34] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[17:37:34] [CLIENT_SIG] - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[17:37:34] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:37:34] [USER] ✅ User registered successfully
[17:37:34] [PUSH] User registration after token update: success
[17:37:35] [PUSH] Silent push received
[17:37:35] [PUSH_EMBED] 📩 Received embedded message: id=18419, type=0, sender=Esra
[17:37:35] [PUSH_EMBED] ✅ Saved message 18419 to local DB (sync)
[17:37:35] [PUSH_EMBED] Created new cache with embedded message 18419
[17:37:35] [PUSH_EMBED] Fetching evolution data for message 18419 in background
[17:37:35] [PUSH_EMBED] ✅ Fully processed message 18419
[17:37:35] [PUSH] Embedded message handled instantly from silent push
[17:37:35] [PIN_AUTH] Correct PIN
[17:37:35] [SECURITY] Restored real session: ILUIWU
[17:37:35] [SECURITY] Restored real session: ILUIWU
[17:37:35] [PUSH_EMBED] Got evolution data for message 18419, saving to local DB
[17:37:35] [PUSH_EMBED] Saved evolution data for message 18419
[17:37:35] [SECURITY] Saved real session: ILUIWU
[17:37:35] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[17:37:35] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[17:37:35] Documents Directory: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents
[17:37:35] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[17:37:35] [THEME] Applying current theme
[17:37:35] [CHAT] Applied day theme (mode: day)
[17:37:35] [SECURITY] Saved real session: ILUIWU
[17:37:35] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[17:37:35] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[17:37:35] [NETWORK] Network monitor started
[17:37:35] [NETWORK] Status changed: connected
[17:37:35] Did transition
[17:37:35] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[17:37:35] [VIEWER] Screen lock enabled - normal idle behavior
[17:37:35] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[17:37:35] [VCC] ========== VideoConnectionClass INIT ==========
[17:37:35] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[17:37:35] [DATA AUDIO] ========== setupWebRTC() START ==========
[17:37:35] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[17:37:35] [DATA AUDIO] Creating encoder/decoder factories...
[17:37:35] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[17:37:35] [CODEC] Viewer selected encoder: AV1 (best quality)
[17:37:35] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[17:37:35] [DATA AUDIO] ✅ Factory created
[17:37:35] [DATA AUDIO] RTCAudioSession locked
[17:37:35] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[17:37:35] [DATA AUDIO] RTCAudioSession unlocked
[17:37:35] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[17:37:35] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[17:37:35] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[17:37:35] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:37:35] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[17:37:35] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[17:37:35] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[17:37:35] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[17:37:35] Did transition
[17:37:35] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[17:37:35] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[17:37:35] [CHUNK] Merged 868 reactions synchronously
[17:37:35] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[17:37:35] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[17:37:35] [MIGRATION] No messages need sender_name backfill
[17:37:35] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[17:37:35] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[17:37:35] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[17:37:35] [GALLERY_DB] Raw datesent for msg 18380: '2026-01-21 10:30:35'
[17:37:36] [GALLERY_DB] ✅ Loaded 475 media messages
[17:37:36] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18419
[17:37:36] [INCREMENTAL_SYNC] ✅ No new messages
[17:37:36] [USER] ✅ User registered successfully
[17:37:36] [USER] User registration successful
[17:37:36] [GALLERY] Filtered 475 -> 436 (only with local thumbnails)
[17:37:36] [GALLERY] First 5 after sort (newest first):
[17:37:36] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[17:37:36] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[17:37:36] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[17:37:36] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[17:37:36] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[17:37:36] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[17:37:36] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:37:36] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[17:37:36] [CELL_UPLOAD] configure: msgId=18378, file=7fcf17ed21a942d6.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[17:37:36] [CELL_UPLOAD] → not my message, setting complete
[17:37:36] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=7fcf17ed21a942d6.jpg, overlayExists=true
[17:37:36] [CELL_UPLOAD] configure: msgId=18409, file=f733dc0a9f704916.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[17:37:36] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[17:37:36] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f733dc0a9f704916.jpg, overlayExists=true
[17:37:36] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18418 → 18419
[17:37:36] [SERVER] Starting reconnect polling (5s interval)
[17:37:36] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[17:37:36] [ICONS] Offset applied: -14.6
[17:37:36] [ICONS] New left margin: 11.2, New right margin: 11.3
[17:37:36] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:37:36] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[17:37:36] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[17:37:36] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[17:37:36] [ICONS] Chat center: (31.2, 87.0)
[17:37:36] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[17:37:36] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[17:37:36] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[17:37:36] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[17:37:36] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[17:37:36] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[17:37:36] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[17:37:36] [ICONS] Screen width: 440.0
[17:37:36] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[17:37:36] [UNSENT_RETRY] Checking for unsent messages...
[17:37:36] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[17:37:36] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[17:37:36] [UPLOAD_RECOVERY] Session: ILUIWU
[17:37:36] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[17:37:36] [UPLOAD_RECOVERY] Checking recent media messages on server...
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[17:37:36] [UPLOAD_RECOVERY] Verifying 10 media files exist on server...
[17:37:36] [PENDING_UPLOAD] Total pending upload messages: 0
[17:37:36] [UNSENT_RETRY] No unsent messages found
[17:37:37] new_session POST ok: token len=157
[17:37:37] HELLO → sent (fetched token, role=query)
[17:37:37] [SIG] hello_ok received for query connection - ready to query agents
[17:37:37] [SIG] get_agents request sent for sessionId=ILUIWU
[17:37:37] [SIG] get_agents request sent for sessionId=iosILUIWU
[17:37:37] [SERVER] Stopped reconnect polling
[17:37:37] [SIG] agents_list received: []
[17:37:37] [UPLOAD_RECOVERY] ✅ All media files verified on server
[17:37:37] [SIG] agents_list received: []
[17:37:37] [COMBINED_FETCH] Loaded 7185 read receipts, 871 messages with reactions
[17:37:37] [READBY_ENRICH] Enriched 50 messages with readBy data
[17:37:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:37:38] [CELL_UPLOAD] configure: msgId=18409, file=f733dc0a9f704916.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[17:37:38] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[17:37:38] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f733dc0a9f704916.jpg, overlayExists=true
[17:37:38] [PUSH] Silent push received
[17:37:38] [PUSH_EMBED] No embedded message_data in notification
[17:37:38] [PUSH] No embedded data, pre-loading messages from server
[17:37:38] [PUSH_PRELOAD] Fetching messages for instant display cache
[17:37:38] [CLIENT_SIG] Event received: type=3 messageId=18419
[17:37:38] [WS_EVENT] Received event: type=3, messageId=18419
[17:37:38] [WS_EVENT] Read receipt for message 18419 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:37:38] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[17:37:38] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[17:37:38] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[17:37:38] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18419]
[17:37:38] [PUSH] Parsed message_id: 18419
[17:37:38] [PUSH] Parsed operation_type: 3
[17:37:38] [PUSH] Taking direct action: opType=3, messageId=18419
[17:37:38] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18419
[17:37:39] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[17:37:40] [CLIENT_SIG] Event received: type=0 messageId=18420
[17:37:40] [WS_EVENT] Received event: type=0, messageId=18420
[17:37:40] [WS_EVENT] 📨 New message notification (msgId=18420) - triggering incremental refresh, currentMsgCount=50
[17:37:40] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[17:37:40] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18419
[17:37:40] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-01-21 16:37:40 +0000 - type: unknown, operation_type: 0, message_id: 18420, session_id: ILUIWU, state: 0
[17:37:40] [PUSH_DEBUG] Full userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
datesent = "2026-01-21 16:37:39";
"file_name" = "";
message = "I haven\U2019t eaten anything yet today";
"message_id" = 18420;
"message_type" = 0;
"prev_session_message_id" = 18419;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18420, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}]
[17:37:40] [PUSH] App active - suppressing notification UI, posting internal event
[17:37:40] [PUSH_EMBED] 📩 Received embedded message: id=18420, type=0, sender=Esra
[17:37:40] [PUSH_EMBED] ✅ Saved message 18420 to local DB (sync)
[17:37:40] [PUSH_EMBED] Inserted message 18420 into existing cache (now 51 messages)
[17:37:40] [PUSH_EMBED] Fetching evolution data for message 18420 in background
[17:37:40] [PUSH_EMBED] ✅ Fully processed message 18420
[17:37:40] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
datesent = "2026-01-21 16:37:39";
"file_name" = "";
message = "I haven\U2019t eaten anything yet today";
"message_id" = 18420;
"message_type" = 0;
"prev_session_message_id" = 18419;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18420, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}]
[17:37:40] [PUSH_EMBED_VC] Processing embedded message: id=18420, type=0, sender=Esra, prevId=18419
[17:37:40] [PUSH_EMBED_VC] Inserted message 18420 into allMessagesWithReadBy (now 51 messages)
[17:37:40] [PUSH_EMBED_VC] ✅ Previous message 18419 exists in memory
[17:37:40] [PUSH] ⚡ Embedded message handled directly in ViewController
[17:37:40] [PUSH] Parsed message_id: 18420
[17:37:40] [PUSH] Parsed operation_type: 0
[17:37:40] [PUSH] Taking direct action: opType=0, messageId=18420
[17:37:40] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18420
[17:37:40] [PUSH] ⚡ Message 18420 already in memory - skipping duplicate notification entirely
[17:37:40] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[17:37:40] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[17:37:40] [PUSH_UI] Message 18420 already in memory - skipping insert
[17:37:40] [PUSH_EMBED_VC] Saved message 18420 to local DB
[17:37:40] [PUSH] Silent push received
[17:37:40] [PUSH_EMBED] 📩 Received embedded message: id=18420, type=0, sender=Esra
[17:37:40] [PUSH_EMBED] ✅ Saved message 18420 to local DB (sync)
[17:37:40] [PUSH_EMBED] Fetching evolution data for message 18420 in background
[17:37:40] [PUSH_EMBED] ✅ Fully processed message 18420
[17:37:40] [PUSH] Embedded message handled instantly from silent push
[17:37:40] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[17:37:40] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[17:37:40] [PUSH_UI] Message 18420 already in memory - skipping insert
[17:37:40] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
datesent = "2026-01-21 16:37:39";
"file_name" = "";
message = "I haven\U2019t eaten anything yet today";
"message_id" = 18420;
"message_type" = 0;
"prev_session_message_id" = 18419;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18420, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}]
[17:37:40] [PUSH_EMBED_VC] Message 18420 already in memory - skipping
[17:37:40] [PUSH] ⚡ Embedded message handled directly in ViewController
[17:37:40] [PUSH] Parsed message_id: 18420
[17:37:40] [PUSH] Parsed operation_type: 0
[17:37:40] [PUSH] Taking direct action: opType=0, messageId=18420
[17:37:40] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18420
[17:37:40] [PUSH] ⚡ Message 18420 already in memory - skipping duplicate notification entirely
[17:37:40] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[17:37:40] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[17:37:40] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[17:37:40] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[17:37:40] [PUSH_EMBED] Got evolution data for message 18420, saving to local DB
[17:37:40] [PUSH_EMBED] Saved evolution data for message 18420
[17:37:40] [PUSH_EMBED] Got evolution data for message 18420, saving to local DB
[17:37:40] [PUSH_EMBED] Saved evolution data for message 18420
[17:37:40] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:37:40] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18419 → 18420
[17:37:42] [PUSH] Silent push received
[17:37:42] [PUSH_EMBED] No embedded message_data in notification
[17:37:42] [PUSH] No embedded data, pre-loading messages from server
[17:37:42] [PUSH_PRELOAD] Fetching messages for instant display cache
[17:37:42] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[17:37:42] [CLIENT_SIG] Event received: type=3 messageId=18420
[17:37:42] [WS_EVENT] Received event: type=3, messageId=18420
[17:37:42] [WS_EVENT] Read receipt for message 18420 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:37:42] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [18370]
[17:37:42] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[17:37:42] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[17:37:42] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18420, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
[17:37:42] [PUSH] Parsed message_id: 18420
[17:37:42] [PUSH] Parsed operation_type: 3
[17:37:42] [PUSH] Taking direct action: opType=3, messageId=18420
[17:37:42] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18420
[17:38:01] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[17:38:01] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[17:38:01] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=52
[17:38:01] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-1, 18420, 18419, 18418, 18417]
[17:38:01] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[17:38:01] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[17:38:03] [CLIENT_SIG] Event received: type=0 messageId=18421
[17:38:03] [WS_EVENT] Received event: type=0, messageId=18421
[17:38:03] [WS_EVENT] 📨 New message notification (msgId=18421) - triggering incremental refresh, currentMsgCount=52
[17:38:03] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[17:38:03] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18420
[17:38:03] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18421,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 16:38:01"}
[17:38:03] [CHAT] receive_message.php JSON: ["message_type": 0, "ok": 1, "file_name": , "session_id": ILUIWU, "message_id": 18421, "datesent_utc": 2026-01-21 16:38:01]
[17:38:03] [DB_UPGRADE] Upgrading message ID: -1 → 18421, preserveOriginalDate=false
[17:38:03] [DB_UPGRADE] ✅ Upgraded -1 → 18421 with send_status=0, 1 row(s) affected
[17:38:03] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 18421
[17:38:03] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 18421
[17:38:03] ReloadData 9
[17:38:03] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[17:38:03] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[17:38:03] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[17:38:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:38:12] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[17:38:12] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=52, isReloading=false
[17:38:12] [SEND_MESSAGE] ✅ Added optimistic message id=-2 to arrays, newMsgCount=53
[17:38:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[-2, 18421, 18420, 18419, 18418]
[17:38:12] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[17:38:12] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[17:38:12] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[17:38:14] [CLIENT_SIG] Event received: type=0 messageId=18422
[17:38:14] [WS_EVENT] Received event: type=0, messageId=18422
[17:38:14] [WS_EVENT] 📨 New message notification (msgId=18422) - triggering incremental refresh, currentMsgCount=53
[17:38:14] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[17:38:14] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18421
[17:38:14] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18422,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 16:38:12"}
[17:38:14] [CHAT] receive_message.php JSON: ["message_id": 18422, "session_id": ILUIWU, "ok": 1, "message_type": 0, "datesent_utc": 2026-01-21 16:38:12, "file_name": ]
[17:38:14] [DB_UPGRADE] Upgrading message ID: -2 → 18422, preserveOriginalDate=false
[17:38:14] [DB_UPGRADE] ✅ Upgraded -2 → 18422 with send_status=0, 1 row(s) affected
[17:38:14] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -2 → 18422
[17:38:14] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -2 → 18422
[17:38:14] ReloadData 9
[17:38:14] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[17:38:14] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[17:38:14] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[17:38:14] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:38:15] [PUSH] Silent push received
[17:38:15] [PUSH_EMBED] No embedded message_data in notification
[17:38:15] [PUSH] No embedded data, pre-loading messages from server
[17:38:15] [PUSH_PRELOAD] Fetching messages for instant display cache
[17:38:15] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[17:38:15] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [18372, 18371, 18370]
[17:38:15] [PUSH_PRELOAD] ⚡ Pre-cached 53 messages for instant display (preserved 3 from push)
[17:38:15] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[17:38:15] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("message_id"): 18421, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
[17:38:15] [PUSH] Parsed message_id: 18421
[17:38:15] [PUSH] Parsed operation_type: 3
[17:38:15] [PUSH] Taking direct action: opType=3, messageId=18421
[17:38:15] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18421
[17:38:15] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[17:38:15] [CLIENT_SIG] Event received: type=3 messageId=18421
[17:38:15] [WS_EVENT] Received event: type=3, messageId=18421
[17:38:15] [WS_EVENT] Read receipt for message 18421 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[17:38:17] [PUSH] Silent push received
[17:38:17] [PUSH_EMBED] No embedded message_data in notification
[17:38:17] [PUSH] No embedded data, pre-loading messages from server
[17:38:17] [PUSH_PRELOAD] Fetching messages for instant display cache
[17:38:17] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[17:38:17] [PRELOAD_CACHE] Preserving 4 push-inserted messages: [18373, 18372, 18371, 18370]
[17:38:17] [PUSH_PRELOAD] ⚡ Pre-cached 54 messages for instant display (preserved 4 from push)
[17:38:17] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[17:38:17] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 18422, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[17:38:17] [PUSH] Parsed message_id: 18422
[17:38:17] [PUSH] Parsed operation_type: 3
[17:38:17] [PUSH] Taking direct action: opType=3, messageId=18422
[17:38:17] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18422
[17:38:17] [CLIENT_SIG] Event received: type=0 messageId=18423
[17:38:17] [WS_EVENT] Received event: type=0, messageId=18423
[17:38:17] [WS_EVENT] 📨 New message notification (msgId=18423) - triggering incremental refresh, currentMsgCount=53
[17:38:17] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[17:38:17] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18423
[17:38:17] [INCREMENTAL_SYNC] ✅ No new messages
[17:38:17] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[17:38:17] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-01-21 16:38:17 +0000 - type: unknown, operation_type: 0, message_id: 18423, session_id: ILUIWU, state: 0
[17:38:17] [PUSH_DEBUG] Full userInfo: [AnyHashable("message_id"): 18423, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
datesent = "2026-01-21 16:38:16";
"file_name" = "";
message = "Yes I was baby";
"message_id" = 18423;
"message_type" = 0;
"prev_session_message_id" = 18422;
"replied_message" = "Were you alone at home today ?";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18406;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("session_id"): ILUIWU]
[17:38:17] [PUSH] App active - suppressing notification UI, posting internal event
[17:38:17] [PUSH_EMBED] 📩 Received embedded message: id=18423, type=0, sender=Esra
[17:38:17] [PUSH_EMBED] ✅ Saved message 18423 to local DB (sync)
[17:38:17] [PUSH_EMBED] Fetching evolution data for message 18423 in background
[17:38:17] [PUSH_EMBED] ✅ Fully processed message 18423
[17:38:17] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 18423, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
datesent = "2026-01-21 16:38:16";
"file_name" = "";
message = "Yes I was baby";
"message_id" = 18423;
"message_type" = 0;
"prev_session_message_id" = 18422;
"replied_message" = "Were you alone at home today ?";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18406;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("session_id"): ILUIWU]
[17:38:17] [PUSH_EMBED_VC] Processing embedded message: id=18423, type=0, sender=Esra, prevId=18422
[17:38:17] [PUSH_EMBED_VC] Inserted message 18423 into allMessagesWithReadBy (now 54 messages)
[17:38:17] [PUSH_EMBED_VC] ✅ Previous message 18422 exists in memory
[17:38:17] [PUSH] ⚡ Embedded message handled directly in ViewController
[17:38:17] [PUSH] Parsed message_id: 18423
[17:38:17] [PUSH] Parsed operation_type: 0
[17:38:17] [PUSH] Taking direct action: opType=0, messageId=18423
[17:38:17] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18423
[17:38:17] [PUSH] ⚡ Message 18423 already in memory - skipping duplicate notification entirely
[17:38:17] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[17:38:17] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[17:38:17] [PUSH_UI] Message 18423 already in memory - skipping insert
[17:38:17] [PUSH_EMBED_VC] Saved message 18423 to local DB
[17:38:17] [PUSH] Silent push received
[17:38:17] [PUSH_EMBED] 📩 Received embedded message: id=18423, type=0, sender=Esra
[17:38:17] [PUSH_EMBED] ✅ Saved message 18423 to local DB (sync)
[17:38:17] [PUSH_EMBED] Fetching evolution data for message 18423 in background
[17:38:17] [PUSH_EMBED] ✅ Fully processed message 18423
[17:38:17] [PUSH] Embedded message handled instantly from silent push
[17:38:17] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[17:38:17] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[17:38:17] [PUSH_UI] Message 18423 already in memory - skipping insert
[17:38:17] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_id"): 18423, AnyHashable("message_data"): {
datesent = "2026-01-21 16:38:16";
"file_name" = "";
message = "Yes I was baby";
"message_id" = 18423;
"message_type" = 0;
"prev_session_message_id" = 18422;
"replied_message" = "Were you alone at home today ?";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18406;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}]
[17:38:17] [PUSH_EMBED_VC] Message 18423 already in memory - skipping
[17:38:17] [PUSH] ⚡ Embedded message handled directly in ViewController
[17:38:17] [PUSH] Parsed message_id: 18423
[17:38:17] [PUSH] Parsed operation_type: 0
[17:38:17] [PUSH] Taking direct action: opType=0, messageId=18423
[17:38:17] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18423
[17:38:17] [PUSH] ⚡ Message 18423 already in memory - skipping duplicate notification entirely
[17:38:17] [PUSH_EMBED] Got evolution data for message 18423, saving to local DB
[17:38:17] [PUSH_EMBED] Saved evolution data for message 18423
[17:38:17] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[18423, 18370, 18371, 18372, 18373]
[17:38:17] [PUSH_EMBED] Got evolution data for message 18423, saving to local DB
[17:38:17] [PUSH_EMBED] Saved evolution data for message 18423
[17:38:17] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18422 → 18423
[17:38:17] [CLIENT_SIG] Event received: type=3 messageId=18422
[17:38:17] [WS_EVENT] Received event: type=3, messageId=18422
[17:38:17] [WS_EVENT] Read receipt for message 18422 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[17:38:19] [PUSH] Silent push received
[17:38:19] [PUSH_EMBED] No embedded message_data in notification
[17:38:19] [PUSH] No embedded data, pre-loading messages from server
[17:38:19] [PUSH_PRELOAD] Fetching messages for instant display cache
[17:38:19] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[17:38:19] [PRELOAD_CACHE] Preserving 4 push-inserted messages: [18373, 18372, 18371, 18370]
[17:38:19] [PUSH_PRELOAD] ⚡ Pre-cached 54 messages for instant display (preserved 4 from push)
[17:38:19] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[17:38:19] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18423, AnyHashable("operation_type"): 3]
[17:38:19] [PUSH] Parsed message_id: 18423
[17:38:19] [PUSH] Parsed operation_type: 3
[17:38:19] [PUSH] Taking direct action: opType=3, messageId=18423
[17:38:19] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18423
[17:38:20] [CLIENT_SIG] Event received: type=3 messageId=18423
[17:38:20] [WS_EVENT] Received event: type=3, messageId=18423
[17:38:20] [WS_EVENT] Read receipt for message 18423 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:38:25] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[17:38:38] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[17:38:38] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=54, isReloading=false
[17:38:38] [SEND_MESSAGE] ✅ Added optimistic message id=-3 to arrays, newMsgCount=55
[17:38:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=55, first5Ids=[-3, 18423, 18422, 18421, 18420]
[17:38:38] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[17:38:38] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[17:38:40] [CLIENT_SIG] Event received: type=0 messageId=18424
[17:38:40] [WS_EVENT] Received event: type=0, messageId=18424
[17:38:40] [WS_EVENT] 📨 New message notification (msgId=18424) - triggering incremental refresh, currentMsgCount=55
[17:38:40] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=55
[17:38:40] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18424,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 16:38:38"}
[17:38:40] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18423
[17:38:40] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-01-21 16:38:38, "ok": 1, "session_id": ILUIWU, "file_name": , "message_type": 0, "message_id": 18424]
[17:38:40] [DB_UPGRADE] Upgrading message ID: -3 → 18424, preserveOriginalDate=false
[17:38:40] [DB_UPGRADE] ✅ Upgraded -3 → 18424 with send_status=0, 1 row(s) affected
[17:38:40] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -3 → 18424
[17:38:40] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -3 → 18424
[17:38:40] ReloadData 9
[17:38:40] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[17:38:40] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[17:38:40] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=55
[17:38:40] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=55, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:38:43] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[17:38:44] [PUSH] Silent push received
[17:38:44] [PUSH_EMBED] No embedded message_data in notification
[17:38:44] [PUSH] No embedded data, pre-loading messages from server
[17:38:44] [PUSH_PRELOAD] Fetching messages for instant display cache
[17:38:44] [CLIENT_SIG] Event received: type=3 messageId=18424
[17:38:44] [WS_EVENT] Received event: type=3, messageId=18424
[17:38:44] [WS_EVENT] Read receipt for message 18424 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[17:38:45] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[17:38:45] [PRELOAD_CACHE] Preserving 6 push-inserted messages: [18375, 18374, 18373, 18372, 18371, 18370]
[17:38:45] [PUSH_PRELOAD] ⚡ Pre-cached 56 messages for instant display (preserved 6 from push)
[17:38:45] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[17:38:45] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18424]
[17:38:45] [PUSH] Parsed message_id: 18424
[17:38:45] [PUSH] Parsed operation_type: 3
[17:38:45] [PUSH] Taking direct action: opType=3, messageId=18424
[17:38:45] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18424
[17:38:46] [CLIENT_SIG] Event received: type=0 messageId=18425
[17:38:46] [WS_EVENT] Received event: type=0, messageId=18425
[17:38:46] [WS_EVENT] 📨 New message notification (msgId=18425) - triggering incremental refresh, currentMsgCount=55
[17:38:46] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=55
[17:38:46] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18425
[17:38:46] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-01-21 16:38:46 +0000 - type: unknown, operation_type: 0, message_id: 18425, session_id: ILUIWU, state: 0
[17:38:46] [PUSH_DEBUG] Full userInfo: [AnyHashable("operation_type"): 0, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 16:38:43";
"file_name" = "";
message = "Not sure about that, gained some weight during weekend \Ud83e\Udd23\Ud83e\Udd23";
"message_id" = 18425;
"message_type" = 0;
"prev_session_message_id" = 18424;
"replied_message" = "More needed for me than for you !";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18422;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18425]
[17:38:46] [PUSH] App active - suppressing notification UI, posting internal event
[17:38:46] [PUSH_EMBED] 📩 Received embedded message: id=18425, type=0, sender=Esra
[17:38:46] [PUSH_EMBED] ✅ Saved message 18425 to local DB (sync)
[17:38:46] [PUSH_EMBED] Fetching evolution data for message 18425 in background
[17:38:46] [PUSH_EMBED] ✅ Fully processed message 18425
[17:38:46] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 0, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 16:38:43";
"file_name" = "";
message = "Not sure about that, gained some weight during weekend \Ud83e\Udd23\Ud83e\Udd23";
"message_id" = 18425;
"message_type" = 0;
"prev_session_message_id" = 18424;
"replied_message" = "More needed for me than for you !";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18422;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18425]
[17:38:46] [PUSH_EMBED_VC] Processing embedded message: id=18425, type=0, sender=Esra, prevId=18424
[17:38:46] [PUSH_EMBED_VC] Inserted message 18425 into allMessagesWithReadBy (now 56 messages)
[17:38:46] [PUSH_EMBED_VC] ✅ Previous message 18424 exists in memory
[17:38:46] [PUSH] ⚡ Embedded message handled directly in ViewController
[17:38:46] [PUSH] Parsed message_id: 18425
[17:38:46] [PUSH] Parsed operation_type: 0
[17:38:46] [PUSH] Taking direct action: opType=0, messageId=18425
[17:38:46] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18425
[17:38:46] [PUSH] ⚡ Message 18425 already in memory - skipping duplicate notification entirely
[17:38:46] [PUSH_EMBED_VC] Saved message 18425 to local DB
[17:38:46] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[17:38:46] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[17:38:46] [PUSH_UI] Message 18425 already in memory - skipping insert
[17:38:46] [PUSH] Silent push received
[17:38:46] [PUSH_EMBED] 📩 Received embedded message: id=18425, type=0, sender=Esra
[17:38:46] [PUSH_EMBED] ✅ Saved message 18425 to local DB (sync)
[17:38:46] [PUSH_EMBED] Fetching evolution data for message 18425 in background
[17:38:46] [PUSH_EMBED] ✅ Fully processed message 18425
[17:38:46] [PUSH] Embedded message handled instantly from silent push
[17:38:46] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[17:38:46] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[17:38:46] [PUSH_UI] Message 18425 already in memory - skipping insert
[17:38:46] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_data"): {
datesent = "2026-01-21 16:38:43";
"file_name" = "";
message = "Not sure about that, gained some weight during weekend \Ud83e\Udd23\Ud83e\Udd23";
"message_id" = 18425;
"message_type" = 0;
"prev_session_message_id" = 18424;
"replied_message" = "More needed for me than for you !";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18422;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 18425, AnyHashable("session_id"): ILUIWU]
[17:38:46] [PUSH_EMBED_VC] Message 18425 already in memory - skipping
[17:38:46] [PUSH] ⚡ Embedded message handled directly in ViewController
[17:38:46] [PUSH] Parsed message_id: 18425
[17:38:46] [PUSH] Parsed operation_type: 0
[17:38:46] [PUSH] Taking direct action: opType=0, messageId=18425
[17:38:46] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18425
[17:38:46] [PUSH] ⚡ Message 18425 already in memory - skipping duplicate notification entirely
[17:38:46] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=56, first5Ids=[18425, 18370, 18371, 18372, 18373]
[17:38:46] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18424 → 18425
[17:38:47] [INCREMENTAL_SYNC] ✅ No new messages
[17:38:47] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=56
[17:38:47] [PUSH_EMBED] Got evolution data for message 18425, saving to local DB
[17:38:47] [PUSH_EMBED] Saved evolution data for message 18425
[17:38:47] [PUSH_EMBED] Got evolution data for message 18425, saving to local DB
[17:38:47] [PUSH_EMBED] Saved evolution data for message 18425
[17:38:49] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[17:38:49] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[17:38:50] [PUSH] Silent push received
[17:38:50] [PUSH_EMBED] No embedded message_data in notification
[17:38:50] [PUSH] No embedded data, pre-loading messages from server
[17:38:50] [PUSH_PRELOAD] Fetching messages for instant display cache
[17:38:50] [CLIENT_SIG] Event received: type=3 messageId=18425
[17:38:50] [WS_EVENT] Received event: type=3, messageId=18425
[17:38:50] [WS_EVENT] Read receipt for message 18425 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:38:51] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[17:38:51] [PRELOAD_CACHE] Preserving 6 push-inserted messages: [18375, 18374, 18373, 18372, 18371, 18370]
[17:38:51] [PUSH_PRELOAD] ⚡ Pre-cached 56 messages for instant display (preserved 6 from push)
[17:38:51] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[17:38:51] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18425]
[17:38:51] [PUSH] Parsed message_id: 18425
[17:38:51] [PUSH] Parsed operation_type: 3
[17:38:51] [PUSH] Taking direct action: opType=3, messageId=18425
[17:38:51] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18425
[17:39:12] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[17:39:12] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=56, isReloading=false
[17:39:12] [SEND_MESSAGE] ✅ Added optimistic message id=-4 to arrays, newMsgCount=57
[17:39:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[-4, 18425, 18424, 18423, 18422]
[17:39:12] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[17:39:12] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[17:39:14] [CLIENT_SIG] Event received: type=0 messageId=18426
[17:39:14] [WS_EVENT] Received event: type=0, messageId=18426
[17:39:14] [WS_EVENT] 📨 New message notification (msgId=18426) - triggering incremental refresh, currentMsgCount=57
[17:39:14] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=57
[17:39:14] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18425
[17:39:14] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18426,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 16:39:12"}
[17:39:14] [CHAT] receive_message.php JSON: ["ok": 1, "file_name": , "message_id": 18426, "message_type": 0, "datesent_utc": 2026-01-21 16:39:12, "session_id": ILUIWU]
[17:39:14] [DB_UPGRADE] Upgrading message ID: -4 → 18426, preserveOriginalDate=false
[17:39:14] [DB_UPGRADE] ✅ Upgraded -4 → 18426 with send_status=0, 1 row(s) affected
[17:39:14] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -4 → 18426
[17:39:14] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -4 → 18426
[17:39:14] ReloadData 9
[17:39:14] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[17:39:14] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[17:39:14] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=57
[17:39:14] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:39:15] [LIFECYCLE] App resigning active - cleared crash flag
[17:39:15] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[17:39:15] [SECURITY] Saved background timestamp
[17:39:15] [LIFECYCLE] App entering background - cleared crash flag
[17:39:15] [CLIENT_SIG] Disconnecting
[17:39:15] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[17:39:15] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[17:39:15] [WS] Canceling WebSocket for query connection to iosILUIWU
[17:39:15] In cleanupPeer
[17:39:15] In cleanupPeer
[17:39:15] [LIFECYCLE] WebRTC audio disabled
[17:39:15] [LIFECYCLE] AVAudioSession deactivated
[17:39:15] [LIFECYCLE] All connections stopped
[17:39:15] [CLIENT_SIG] WebSocket closed with code 1001
[17:39:15] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[17:39:15] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[17:39:15] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[17:39:15] [SERVER] Stopped reconnect polling
[17:39:15] Will request stop of video 0
[17:39:15] Will request stop of video 0
[17:39:15] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[17:39:15] [WS] Query connection error - cleaning up all agent connections and views
[17:39:15] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:39:15] [WS] Query connection failed - cleaning up all agent connections and views
[17:39:15] [PIP] Removing 0 tracks from PiP for connection 0
[17:39:15] [PIP] ✅ All tracks removed for connection 0
[17:39:15] [PIP] Removing 0 tracks from PiP for connection 0
[17:39:15] [PIP] ✅ All tracks removed for connection 0
[17:39:15] [CLEANUP] ========================================
[17:39:15] [CLEANUP] Cleaning up all agent connections and views
[17:39:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:39:15] [CLEANUP] Stopped and removed 0 video connections
[17:39:15] [CLEANUP] Removed 0 video views
[17:39:15] [CLEANUP] Removed 0 feed scroll views
[17:39:15] [CLEANUP] Removed 0 status labels
[17:39:15] [CLEANUP] Reset agent query state
[17:39:15] [CLEANUP] Updated page indicator
[17:39:15] [CLEANUP] Rebuilt video layout
[17:39:15] [CLEANUP] ✅ All agent connections and views cleaned up
[17:39:15] [CLEANUP] ========================================
[17:39:15] [SERVER] Skipping reconnect polling - app is in background
[17:39:15] [WS] URLSession invalidated successfully
[17:39:15] [CLEANUP] ========================================
[17:39:15] [CLEANUP] Cleaning up all agent connections and views
[17:39:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:39:15] [CLEANUP] Stopped and removed 0 video connections
[17:39:15] [CLEANUP] Removed 0 video views
[17:39:15] [CLEANUP] Removed 0 feed scroll views
[17:39:15] [CLEANUP] Removed 0 status labels
[17:39:15] [CLEANUP] Reset agent query state
[17:39:15] [CLEANUP] Updated page indicator
[17:39:15] [CLEANUP] Rebuilt video layout
[17:39:15] [CLEANUP] ✅ All agent connections and views cleaned up
[17:39:15] [CLEANUP] ========================================
[17:39:15] [SERVER] Skipping reconnect polling - app is in background
[17:41:31] [NETWORK] Status changed: connected
[17:41:31] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:41:31] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:41:31] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:41:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:41:31] [CLIENT_SIG] WebSocket opened
[17:41:31] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[17:41:31] HELLO → sent (cached token, role=query)
[17:41:31] [CLIENT_SIG] Connected! clientId=qonMnSI4ko4ky2uK
[17:41:31] [SIG] hello_ok received for query connection - ready to query agents
[17:41:31] [SIG] get_agents request sent for sessionId=ILUIWU
[17:41:31] [SIG] get_agents request sent for sessionId=iosILUIWU
[17:41:31] [SERVER] Stopped reconnect polling
[17:41:31] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[17:41:31] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:41:31] [SIG] agents_list received: []
[17:41:33] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalWebSocketTask <C46221C8-5A4A-4F2B-9DAC-2BE6B035669B>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <C46221C8-5A4A-4F2B-9DAC-2BE6B035669B>.<1>, NSLocalizedDescription=The network connection was lost.}
[17:41:33] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[17:41:33] [WS] WebSocket task completed with error - isQueryOnly=true: The network connection was lost.
[17:41:33] [WS] Query connection error - cleaning up all agent connections and views
[17:41:33] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[17:41:33] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[17:41:33] [WS] Connection failed: The operation couldn’t be completed. Operation canceled
[17:41:33] [WS] Query connection failed - cleaning up all agent connections and views
[17:41:33] [CLEANUP] ========================================
[17:41:33] [CLEANUP] Cleaning up all agent connections and views
[17:41:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:41:33] [CLEANUP] Stopped and removed 0 video connections
[17:41:33] [CLEANUP] Removed 0 video views
[17:41:33] [CLEANUP] Removed 0 feed scroll views
[17:41:33] [CLEANUP] Removed 0 status labels
[17:41:33] [CLEANUP] Reset agent query state
[17:41:33] [CLEANUP] Updated page indicator
[17:41:33] [CLEANUP] Rebuilt video layout
[17:41:33] [CLEANUP] ✅ All agent connections and views cleaned up
[17:41:33] [CLEANUP] ========================================
[17:41:33] [SERVER] Skipping reconnect polling - app is in background
[17:41:33] [CLEANUP] ========================================
[17:41:33] [CLEANUP] Cleaning up all agent connections and views
[17:41:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:41:33] [CLEANUP] Stopped and removed 0 video connections
[17:41:33] [CLEANUP] Removed 0 video views
[17:41:33] [CLEANUP] Removed 0 feed scroll views
[17:41:33] [CLEANUP] Removed 0 status labels
[17:41:33] [CLEANUP] Reset agent query state
[17:41:33] [CLEANUP] Updated page indicator
[17:41:33] [CLEANUP] Rebuilt video layout
[17:41:33] [CLEANUP] ✅ All agent connections and views cleaned up
[17:41:33] [CLEANUP] ========================================
[17:41:33] [SERVER] Skipping reconnect polling - app is in background
[17:41:35] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:41:35] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:41:35] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:41:35] HELLO → sent (cached token, role=query)
[17:41:35] [SIG] hello_ok received for query connection - ready to query agents
[17:41:35] [SIG] get_agents request sent for sessionId=ILUIWU
[17:41:35] [SIG] get_agents request sent for sessionId=iosILUIWU
[17:41:35] [SERVER] Stopped reconnect polling
[17:41:35] [SIG] agents_list received: []
[17:41:35] [SIG] agents_list received: []
[17:41:36] [SECURITY] Timeout check: elapsed=141.06570887565613s, timeout=300.0s
[17:41:36] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[17:41:36] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:41:36] [LIFECYCLE] App entering foreground - restoring connections
[17:41:36] [LIFECYCLE] Away > 2 minutes (141s) - will scroll to bottom
[17:41:36] [UPLOAD_RETRY] No pending uploads to retry
[17:41:36] [LIFECYCLE] Merged 868 reactions from local DB
[17:41:36] [LIFECYCLE] WebRTC audio re-enabled
[17:41:36] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[17:41:36] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[17:41:36] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[17:41:36] [VIEWER] Reconnecting after background - querying agents
[17:41:36] [UNSENT_RETRY] Checking for unsent messages...
[17:41:36] [PENDING_UPLOAD] Total pending upload messages: 0
[17:41:36] [UNSENT_RETRY] No unsent messages found
[17:41:36] [CLIENT_SIG] WebSocket opened
[17:41:36] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[17:41:36] [CLIENT_SIG] Connected! clientId=xMRIHih12EIesJRP
[17:41:36] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:41:36] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[17:41:36] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:41:37] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[17:41:37] [SECURITY] Saved background timestamp
[17:41:37] [LIFECYCLE] App entering background - cleared crash flag
[17:41:37] [CLIENT_SIG] Disconnecting
[17:41:37] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[17:41:37] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[17:41:37] [WS] Canceling WebSocket for query connection to iosILUIWU
[17:41:37] In cleanupPeer
[17:41:37] In cleanupPeer
[17:41:37] [LIFECYCLE] WebRTC audio disabled
[17:41:37] [LIFECYCLE] AVAudioSession deactivated
[17:41:37] [LIFECYCLE] All connections stopped
[17:41:37] [CLIENT_SIG] WebSocket closed with code 1001
[17:41:37] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[17:41:37] [SERVER] Stopped reconnect polling
[17:41:37] Will request stop of video 0
[17:41:37] Will request stop of video 0
[17:41:37] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[17:41:37] [WS] Query connection error - cleaning up all agent connections and views
[17:41:37] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:41:37] [WS] Query connection failed - cleaning up all agent connections and views
[17:41:37] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[17:41:37] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[17:41:37] [COMBINED_FETCH] Loaded 7192 read receipts, 873 messages with reactions
[17:41:37] [FOREGROUND] Enriched 0 messages with readBy data from server
[17:41:37] [PIP] Removing 0 tracks from PiP for connection 0
[17:41:37] [PIP] ✅ All tracks removed for connection 0
[17:41:37] [PIP] Removing 0 tracks from PiP for connection 0
[17:41:37] [PIP] ✅ All tracks removed for connection 0
[17:41:37] [CLEANUP] ========================================
[17:41:37] [CLEANUP] Cleaning up all agent connections and views
[17:41:37] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:41:37] [CLEANUP] Stopped and removed 0 video connections
[17:41:37] [CLEANUP] Removed 0 video views
[17:41:37] [CLEANUP] Removed 0 feed scroll views
[17:41:37] [CLEANUP] Removed 0 status labels
[17:41:37] [CLEANUP] Reset agent query state
[17:41:37] [CLEANUP] Updated page indicator
[17:41:37] [CLEANUP] Rebuilt video layout
[17:41:37] [CLEANUP] ✅ All agent connections and views cleaned up
[17:41:37] [CLEANUP] ========================================
[17:41:37] [WS] URLSession invalidated successfully
[17:41:37] [CLEANUP] ========================================
[17:41:37] [CLEANUP] Cleaning up all agent connections and views
[17:41:37] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:41:37] [CLEANUP] Stopped and removed 0 video connections
[17:41:37] [CLEANUP] Removed 0 video views
[17:41:37] [CLEANUP] Removed 0 feed scroll views
[17:41:37] [CLEANUP] Removed 0 status labels
[17:41:37] [CLEANUP] Reset agent query state
[17:41:37] [CLEANUP] Updated page indicator
[17:41:37] [CLEANUP] Rebuilt video layout
[17:41:37] [CLEANUP] ✅ All agent connections and views cleaned up
[17:41:37] [CLEANUP] ========================================
[17:41:37] [SERVER] Skipping reconnect polling - app is in background
[17:41:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:41:38] [SECURITY] Timeout check: elapsed=0.9255220890045166s, timeout=300.0s
[17:41:38] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[17:41:38] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:41:38] [LIFECYCLE] App entering foreground - restoring connections
[17:41:38] [UPLOAD_RETRY] No pending uploads to retry
[17:41:38] [LIFECYCLE] Merged 868 reactions from local DB
[17:41:38] [LIFECYCLE] WebRTC audio re-enabled
[17:41:38] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[17:41:38] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[17:41:38] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[17:41:38] [VIEWER] Reconnecting after background - querying agents
[17:41:38] [UNSENT_RETRY] Checking for unsent messages...
[17:41:38] [PENDING_UPLOAD] Total pending upload messages: 0
[17:41:38] [UNSENT_RETRY] No unsent messages found
[17:41:38] [CLIENT_SIG] WebSocket opened
[17:41:38] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[17:41:38] [CLIENT_SIG] Connected! clientId=aUDfpEPEtE7PvM3k
[17:41:38] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[17:41:38] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:41:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:41:39] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[17:41:39] [SECURITY] Within timeout - cleared background flag
[17:41:39] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[17:41:39] [PUSH] handlePollEventsNotification userInfo: [:]
[17:41:39] [PUSH] No message_id in userInfo
[17:41:39] [PUSH] No operation_type in userInfo
[17:41:39] [FAST_REFRESH] Evolution disabled - performing incremental sync
[17:41:39] [FAST_REFRESH] Already have 57 messages - skipping local DB load
[17:41:39] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[17:41:39] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[17:41:39] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=57
[17:41:39] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18426
[17:41:39] [INCREMENTAL_SYNC] ✅ No new messages
[17:41:39] [FAST_REFRESH] Incremental sync complete - 57 messages
[17:41:39] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:41:39] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:41:39] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:41:39] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:41:39] HELLO → sent (cached token, role=query)
[17:41:39] [COMBINED_FETCH] Loaded 7192 read receipts, 873 messages with reactions
[17:41:39] [FOREGROUND] Enriched 0 messages with readBy data from server
[17:41:39] [SIG] hello_ok received for query connection - ready to query agents
[17:41:39] [SIG] get_agents request sent for sessionId=ILUIWU
[17:41:39] [SIG] get_agents request sent for sessionId=iosILUIWU
[17:41:39] [SERVER] Stopped reconnect polling
[17:41:39] [SIG] agents_list received: []
[17:41:39] [SIG] agents_list received: []
[17:41:39] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:41:40] [COMBINED_FETCH] Loaded 7192 read receipts, 873 messages with reactions
[17:41:40] [FAST_REFRESH] Enriched 57 messages with readBy data
[17:41:40] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:41:41] [MENU] dismissAnyExistingMenu called
[17:41:41] [MENU] dismissAnyExistingMenu completed
[17:41:41] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[17:41:42] [MENU] dismissAnyExistingMenu called
[17:41:42] [MENU] dismissAnyExistingMenu completed
[17:41:49] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[17:41:49] [WS] Query connection error - cleaning up all agent connections and views
[17:41:49] [CLEANUP] ========================================
[17:41:49] [CLEANUP] Cleaning up all agent connections and views
[17:41:49] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:41:49] [CLEANUP] Stopped and removed 0 video connections
[17:41:49] [CLEANUP] Removed 0 video views
[17:41:49] [CLEANUP] Removed 0 feed scroll views
[17:41:49] [CLEANUP] Removed 0 status labels
[17:41:49] [CLEANUP] Reset agent query state
[17:41:49] [CLEANUP] Updated page indicator
[17:41:49] [CLEANUP] Rebuilt video layout
[17:41:49] [CLEANUP] ✅ All agent connections and views cleaned up
[17:41:49] [CLEANUP] ========================================
[17:41:49] [SERVER] Starting reconnect polling (5s interval)
[17:41:51] [MENU] dismissAnyExistingMenu called
[17:41:51] [MENU] dismissAnyExistingMenu completed
[17:41:51] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[17:41:51] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=57, isReloading=false
[17:41:51] [SEND_MESSAGE] ✅ Added optimistic message id=-5 to arrays, newMsgCount=58
[17:41:51] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[-5, 18426, 18425, 18424, 18423]
[17:41:51] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[17:41:51] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[17:41:53] [LOCK] Lock button tapped - locking app immediately
[17:41:53] [LOCK] Received lock app notification
[17:41:53] [CLIENT_SIG] Event received: type=0 messageId=18427
[17:41:53] [WS_EVENT] Received event: type=0, messageId=18427
[17:41:53] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18427,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 16:41:52"}
[17:41:53] [WS_EVENT] 📨 New message notification (msgId=18427) - triggering incremental refresh, currentMsgCount=58
[17:41:53] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=58
[17:41:53] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-01-21 16:41:52, "message_type": 0, "ok": 1, "session_id": ILUIWU, "file_name": , "message_id": 18427]
[17:41:53] [DB_UPGRADE] Upgrading message ID: -5 → 18427, preserveOriginalDate=false
[17:41:53] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18426
[17:41:53] [DB_UPGRADE] ✅ Upgraded -5 → 18427 with send_status=0, 1 row(s) affected
[17:41:53] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -5 → 18427
[17:41:53] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -5 → 18427
[17:41:53] ReloadData 9
[17:41:53] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[17:41:53] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[17:41:53] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=58
[17:41:53] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:41:54] [LIFECYCLE] App resigning active - cleared crash flag
[17:41:54] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[17:41:54] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[17:41:54] [LIFECYCLE] App entering background - cleared crash flag
[17:41:54] [CLIENT_SIG] Disconnecting
[17:41:54] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[17:41:54] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[17:41:54] [WS] Canceling WebSocket for query connection to iosILUIWU
[17:41:54] In cleanupPeer
[17:41:54] In cleanupPeer
[17:41:54] [LIFECYCLE] WebRTC audio disabled
[17:41:54] [LIFECYCLE] AVAudioSession deactivated
[17:41:54] [LIFECYCLE] All connections stopped
[17:41:54] [CLIENT_SIG] WebSocket closed with code 1001
[17:41:54] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[17:41:54] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[17:41:54] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[17:41:54] [SERVER] Stopped reconnect polling
[17:41:54] [WS] URLSession invalidated successfully
[17:41:54] Will request stop of video 0
[17:41:54] Will request stop of video 0
[17:41:54] [PIP] Removing 0 tracks from PiP for connection 0
[17:41:54] [PIP] ✅ All tracks removed for connection 0
[17:41:54] [PIP] Removing 0 tracks from PiP for connection 0
[17:41:54] [PIP] ✅ All tracks removed for connection 0
[17:45:40] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:45:40] [NETWORK] Status changed: connected
[17:45:40] [WS] Connection failed: The operation couldn’t be completed. Software caused connection abort
[17:45:40] [WS] Query connection failed - cleaning up all agent connections and views
[17:45:40] [CLEANUP] ========================================
[17:45:40] [CLEANUP] Cleaning up all agent connections and views
[17:45:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:45:40] [CLEANUP] Stopped and removed 0 video connections
[17:45:40] [CLEANUP] Removed 0 video views
[17:45:40] [CLEANUP] Removed 0 feed scroll views
[17:45:40] [CLEANUP] Removed 0 status labels
[17:45:40] [CLEANUP] Reset agent query state
[17:45:40] [CLEANUP] Updated page indicator
[17:45:40] [CLEANUP] Rebuilt video layout
[17:45:40] [CLEANUP] ✅ All agent connections and views cleaned up
[17:45:40] [CLEANUP] ========================================
[17:45:40] [SERVER] Skipping reconnect polling - app is in background
[17:45:40] [CLIENT_SIG] WebSocket opened
[17:45:40] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[17:45:40] [CLIENT_SIG] Connected! clientId=hBvAvRvL3AND5W-I
[17:45:40] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[17:45:40] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:46:08] [LAST_SEEN] Fetch error: The request timed out.
[17:46:08] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:46:08] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:46:08] [NETWORK] Status changed: connected
[17:46:08] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[17:46:08] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[17:46:08] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalWebSocketTask <6E11C228-B24A-4F7A-AC00-58DDE0A5B60C>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <6E11C228-B24A-4F7A-AC00-58DDE0A5B60C>.<1>}
[17:46:08] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[17:46:08] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:46:08] HELLO → sent (cached token, role=query)
[17:46:08] [SIG] hello_ok received for query connection - ready to query agents
[17:46:08] [SIG] get_agents request sent for sessionId=ILUIWU
[17:46:08] [SIG] get_agents request sent for sessionId=iosILUIWU
[17:46:08] [SERVER] Stopped reconnect polling
[17:46:08] [SIG] agents_list received: []
[17:46:08] [SIG] agents_list received: []
[17:46:08] [WS] Connection failed: The operation couldn’t be completed. Software caused connection abort
[17:46:08] [WS] Query connection failed - cleaning up all agent connections and views
[17:46:08] [WS] WebSocket task completed with error - isQueryOnly=true: The operation couldn’t be completed. Software caused connection abort
[17:46:08] [WS] Query connection error - cleaning up all agent connections and views
[17:46:08] [CLEANUP] ========================================
[17:46:08] [CLEANUP] Cleaning up all agent connections and views
[17:46:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:46:08] [CLEANUP] Stopped and removed 0 video connections
[17:46:08] [CLEANUP] Removed 0 video views
[17:46:08] [CLEANUP] Removed 0 feed scroll views
[17:46:08] [CLEANUP] Removed 0 status labels
[17:46:08] [CLEANUP] Reset agent query state
[17:46:08] [CLEANUP] Updated page indicator
[17:46:08] [CLEANUP] Rebuilt video layout
[17:46:08] [CLEANUP] ✅ All agent connections and views cleaned up
[17:46:08] [CLEANUP] ========================================
[17:46:08] [SERVER] Skipping reconnect polling - app is in background
[17:46:08] [CLEANUP] ========================================
[17:46:08] [CLEANUP] Cleaning up all agent connections and views
[17:46:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:46:08] [CLEANUP] Stopped and removed 0 video connections
[17:46:08] [CLEANUP] Removed 0 video views
[17:46:08] [CLEANUP] Removed 0 feed scroll views
[17:46:08] [CLEANUP] Removed 0 status labels
[17:46:08] [CLEANUP] Reset agent query state
[17:46:08] [CLEANUP] Updated page indicator
[17:46:08] [CLEANUP] Rebuilt video layout
[17:46:08] [CLEANUP] ✅ All agent connections and views cleaned up
[17:46:08] [CLEANUP] ========================================
[17:46:08] [SERVER] Skipping reconnect polling - app is in background
[17:46:17] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:46:17] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:46:17] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:46:17] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:46:17] [CLIENT_SIG] WebSocket opened
[17:46:17] HELLO → sent (cached token, role=query)
[17:46:17] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[17:46:17] [CLIENT_SIG] Connected! clientId=TstZhYJHuibkajf6
[17:46:17] [SIG] hello_ok received for query connection - ready to query agents
[17:46:17] [SIG] get_agents request sent for sessionId=ILUIWU
[17:46:17] [SIG] get_agents request sent for sessionId=iosILUIWU
[17:46:17] [SERVER] Stopped reconnect polling
[17:46:17] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[17:46:17] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:46:17] [SIG] agents_list received: []
[17:46:17] [SIG] agents_list received: []
[17:46:18] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[17:46:18] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[17:46:18] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalWebSocketTask <B20088FB-C92D-472A-A471-0DCB51C8A677>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <B20088FB-C92D-472A-A471-0DCB51C8A677>.<1>}
[17:46:18] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[17:46:18] [WS] Connection failed: The operation couldn’t be completed. Software caused connection abort
[17:46:18] [WS] Query connection failed - cleaning up all agent connections and views
[17:46:18] [WS] WebSocket task completed with error - isQueryOnly=true: The operation couldn’t be completed. Software caused connection abort
[17:46:18] [WS] Query connection error - cleaning up all agent connections and views
[17:46:18] [CLEANUP] ========================================
[17:46:18] [CLEANUP] Cleaning up all agent connections and views
[17:46:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:46:18] [CLEANUP] Stopped and removed 0 video connections
[17:46:18] [CLEANUP] Removed 0 video views
[17:46:18] [CLEANUP] Removed 0 feed scroll views
[17:46:18] [CLEANUP] Removed 0 status labels
[17:46:18] [CLEANUP] Reset agent query state
[17:46:18] [CLEANUP] Updated page indicator
[17:46:18] [CLEANUP] Rebuilt video layout
[17:46:18] [CLEANUP] ✅ All agent connections and views cleaned up
[17:46:18] [CLEANUP] ========================================
[17:46:18] [SERVER] Skipping reconnect polling - app is in background
[17:46:18] [CLEANUP] ========================================
[17:46:18] [CLEANUP] Cleaning up all agent connections and views
[17:46:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:46:18] [CLEANUP] Stopped and removed 0 video connections
[17:46:18] [CLEANUP] Removed 0 video views
[17:46:18] [CLEANUP] Removed 0 feed scroll views
[17:46:18] [CLEANUP] Removed 0 status labels
[17:46:18] [CLEANUP] Reset agent query state
[17:46:18] [CLEANUP] Updated page indicator
[17:46:18] [CLEANUP] Rebuilt video layout
[17:46:18] [CLEANUP] ✅ All agent connections and views cleaned up
[17:46:18] [CLEANUP] ========================================
[17:46:18] [SERVER] Skipping reconnect polling - app is in background
[17:46:19] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[17:46:19] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:46:19] [LIFECYCLE] App entering foreground - restoring connections
[17:46:19] [LIFECYCLE] Away > 2 minutes (264s) - will scroll to bottom
[17:46:19] [UPLOAD_RETRY] No pending uploads to retry
[17:46:19] [LIFECYCLE] Merged 868 reactions from local DB
[17:46:19] [LIFECYCLE] WebRTC audio re-enabled
[17:46:19] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[17:46:19] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[17:46:19] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[17:46:19] [VIEWER] Reconnecting after background - querying agents
[17:46:19] [UNSENT_RETRY] Checking for unsent messages...
[17:46:19] [PENDING_UPLOAD] Total pending upload messages: 0
[17:46:19] [UNSENT_RETRY] No unsent messages found
[17:46:19] [CLIENT_SIG] WebSocket opened
[17:46:19] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[17:46:19] [CLIENT_SIG] Connected! clientId=7EiXrger4I6J-Qfp
[17:46:19] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[17:46:19] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:46:19] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:46:19] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:46:19] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:46:19] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:46:19] HELLO → sent (cached token, role=query)
[17:46:19] [SIG] hello_ok received for query connection - ready to query agents
[17:46:19] [SIG] get_agents request sent for sessionId=ILUIWU
[17:46:19] [SIG] get_agents request sent for sessionId=iosILUIWU
[17:46:19] [SERVER] Stopped reconnect polling
[17:46:19] [SIG] agents_list received: []
[17:46:19] [SIG] agents_list received: []
[17:46:19] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[17:46:19] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[17:46:19] [PUSH] handlePollEventsNotification userInfo: [:]
[17:46:19] [PUSH] No message_id in userInfo
[17:46:19] [PUSH] No operation_type in userInfo
[17:46:19] [FAST_REFRESH] Evolution disabled - performing incremental sync
[17:46:19] [FAST_REFRESH] Already have 58 messages - skipping local DB load
[17:46:19] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[17:46:19] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[17:46:19] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=58
[17:46:19] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18427
[17:46:19] [LIFECYCLE] App resigning active - cleared crash flag
[17:46:19] [COMBINED_FETCH] Loaded 7193 read receipts, 873 messages with reactions
[17:46:19] [FOREGROUND] Enriched 0 messages with readBy data from server
[17:46:19] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[17:46:20] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:46:20] [INCREMENTAL_SYNC] ✅ No new messages
[17:46:20] [FAST_REFRESH] Incremental sync complete - 58 messages
[17:46:20] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[17:46:20] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[17:46:20] [LIFECYCLE] App entering background - cleared crash flag
[17:46:20] [CLIENT_SIG] Disconnecting
[17:46:20] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[17:46:20] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[17:46:20] [WS] Canceling WebSocket for query connection to iosILUIWU
[17:46:20] In cleanupPeer
[17:46:20] In cleanupPeer
[17:46:20] [LIFECYCLE] WebRTC audio disabled
[17:46:20] [LIFECYCLE] AVAudioSession deactivated
[17:46:20] [LIFECYCLE] All connections stopped
[17:46:20] [CLIENT_SIG] WebSocket closed with code 1001
[17:46:20] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[17:46:20] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[17:46:20] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[17:46:20] [SERVER] Stopped reconnect polling
[17:46:20] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[17:46:20] [WS] Query connection error - cleaning up all agent connections and views
[17:46:20] Will request stop of video 0
[17:46:20] Will request stop of video 0
[17:46:20] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:46:20] [WS] Query connection failed - cleaning up all agent connections and views
[17:46:20] [COMBINED_FETCH] Loaded 7193 read receipts, 873 messages with reactions
[17:46:20] [FAST_REFRESH] Enriched 58 messages with readBy data
[17:46:20] [CLEANUP] ========================================
[17:46:20] [CLEANUP] Cleaning up all agent connections and views
[17:46:20] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:46:20] [CLEANUP] Stopped and removed 0 video connections
[17:46:20] [CLEANUP] Removed 0 video views
[17:46:20] [CLEANUP] Removed 0 feed scroll views
[17:46:20] [CLEANUP] Removed 0 status labels
[17:46:20] [CLEANUP] Reset agent query state
[17:46:20] [CLEANUP] Updated page indicator
[17:46:20] [CLEANUP] Rebuilt video layout
[17:46:20] [CLEANUP] ✅ All agent connections and views cleaned up
[17:46:20] [CLEANUP] ========================================
[17:46:20] [SERVER] Skipping reconnect polling - app is in background
[17:46:20] [PIP] Removing 0 tracks from PiP for connection 0
[17:46:20] [PIP] ✅ All tracks removed for connection 0
[17:46:20] [PIP] Removing 0 tracks from PiP for connection 0
[17:46:20] [PIP] ✅ All tracks removed for connection 0
[17:46:20] [WS] URLSession invalidated successfully
[17:46:20] [CLEANUP] ========================================
[17:46:20] [CLEANUP] Cleaning up all agent connections and views
[17:46:20] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:46:20] [CLEANUP] Stopped and removed 0 video connections
[17:46:20] [CLEANUP] Removed 0 video views
[17:46:20] [CLEANUP] Removed 0 feed scroll views
[17:46:20] [CLEANUP] Removed 0 status labels
[17:46:20] [CLEANUP] Reset agent query state
[17:46:20] [CLEANUP] Updated page indicator
[17:46:20] [CLEANUP] Rebuilt video layout
[17:46:20] [CLEANUP] ✅ All agent connections and views cleaned up
[17:46:20] [CLEANUP] ========================================
[17:46:20] [SERVER] Skipping reconnect polling - app is in background
[17:50:16] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:50:16] [NETWORK] Status changed: connected
[17:50:16] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[17:50:16] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:50:16] [LIFECYCLE] App entering foreground - restoring connections
[17:50:16] [LIFECYCLE] Away > 2 minutes (235s) - will scroll to bottom
[17:50:16] [UPLOAD_RETRY] No pending uploads to retry
[17:50:16] [LIFECYCLE] Merged 868 reactions from local DB
[17:50:16] [LIFECYCLE] WebRTC audio re-enabled
[17:50:16] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[17:50:16] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[17:50:16] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[17:50:16] [VIEWER] Reconnecting after background - querying agents
[17:50:16] [UNSENT_RETRY] Checking for unsent messages...
[17:50:16] [PENDING_UPLOAD] Total pending upload messages: 0
[17:50:16] [UNSENT_RETRY] No unsent messages found
[17:50:16] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:16] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:16] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[17:50:16] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:16] [CLIENT_SIG] WebSocket opened
[17:50:16] HELLO → sent (cached token, role=query)
[17:50:16] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[17:50:16] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:16] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:16] [CLEANUP] ========================================
[17:50:16] [CLEANUP] Cleaning up all agent connections and views
[17:50:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:16] [CLEANUP] Stopped and removed 0 video connections
[17:50:16] [CLEANUP] Removed 0 video views
[17:50:16] [CLEANUP] Removed 0 feed scroll views
[17:50:16] [CLEANUP] Removed 0 status labels
[17:50:16] [CLEANUP] Reset agent query state
[17:50:16] [CLEANUP] Updated page indicator
[17:50:16] [CLEANUP] Rebuilt video layout
[17:50:16] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:16] [CLEANUP] ========================================
[17:50:16] [SERVER] Starting reconnect polling (5s interval)
[17:50:16] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:16] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:16] [CLEANUP] ========================================
[17:50:16] [CLEANUP] Cleaning up all agent connections and views
[17:50:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:16] [CLEANUP] Stopped and removed 0 video connections
[17:50:16] [CLEANUP] Removed 0 video views
[17:50:16] [CLEANUP] Removed 0 feed scroll views
[17:50:16] [CLEANUP] Removed 0 status labels
[17:50:16] [CLEANUP] Reset agent query state
[17:50:16] [CLEANUP] Updated page indicator
[17:50:16] [CLEANUP] Rebuilt video layout
[17:50:16] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:16] [CLEANUP] ========================================
[17:50:16] [SERVER] Starting reconnect polling (5s interval)
[17:50:16] [CLIENT_SIG] Connected! clientId=1gOOGFQJkwZ5YGqY
[17:50:16] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[17:50:16] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:50:16] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:50:16] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[17:50:16] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[17:50:16] [PUSH] handlePollEventsNotification userInfo: [:]
[17:50:16] [PUSH] No message_id in userInfo
[17:50:16] [PUSH] No operation_type in userInfo
[17:50:16] [FAST_REFRESH] Evolution disabled - performing incremental sync
[17:50:16] [FAST_REFRESH] Already have 58 messages - skipping local DB load
[17:50:16] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[17:50:16] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[17:50:16] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=58
[17:50:16] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18427
[17:50:16] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:50:16] [INCREMENTAL_SYNC] ✅ No new messages
[17:50:16] [FAST_REFRESH] Incremental sync complete - 58 messages
[17:50:17] [COMBINED_FETCH] Loaded 7193 read receipts, 873 messages with reactions
[17:50:17] [FOREGROUND] Enriched 0 messages with readBy data from server
[17:50:17] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:50:17] [COMBINED_FETCH] Loaded 7193 read receipts, 873 messages with reactions
[17:50:17] [FAST_REFRESH] Enriched 58 messages with readBy data
[17:50:17] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[18370, 18371, 18372, 18373, 18374]
[17:50:18] [PIN_AUTH] Correct PIN
[17:50:18] [SECURITY] Restored real session: ILUIWU
[17:50:18] [SECURITY] Restored real session: ILUIWU
[17:50:18] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:18] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:18] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:18] HELLO → sent (cached token, role=query)
[17:50:18] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:18] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:18] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:18] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:18] [CLEANUP] ========================================
[17:50:18] [CLEANUP] Cleaning up all agent connections and views
[17:50:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:18] [CLEANUP] Stopped and removed 0 video connections
[17:50:18] [CLEANUP] Removed 0 video views
[17:50:18] [CLEANUP] Removed 0 feed scroll views
[17:50:18] [CLEANUP] Removed 0 status labels
[17:50:18] [CLEANUP] Reset agent query state
[17:50:18] [CLEANUP] Updated page indicator
[17:50:18] [CLEANUP] Rebuilt video layout
[17:50:18] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:18] [CLEANUP] ========================================
[17:50:18] [SERVER] Starting reconnect polling (5s interval)
[17:50:18] [CLEANUP] ========================================
[17:50:18] [CLEANUP] Cleaning up all agent connections and views
[17:50:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:18] [CLEANUP] Stopped and removed 0 video connections
[17:50:18] [CLEANUP] Removed 0 video views
[17:50:18] [CLEANUP] Removed 0 feed scroll views
[17:50:18] [CLEANUP] Removed 0 status labels
[17:50:18] [CLEANUP] Reset agent query state
[17:50:18] [CLEANUP] Updated page indicator
[17:50:18] [CLEANUP] Rebuilt video layout
[17:50:18] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:18] [CLEANUP] ========================================
[17:50:18] [SERVER] Starting reconnect polling (5s interval)
[17:50:18] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[17:50:18] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[17:50:18] [AUTH] UI update complete
[17:50:18] [FAKE MODE] Exiting fake mode, restoring real session
[17:50:18] [SECURITY] Restored real session: ILUIWU
[17:50:18] [SECURITY] Saved real session: ILUIWU
[17:50:18] [FAKE MODE] ✅ Restored real session: ILUIWU
[17:50:18] [FAKE MODE] Loaded 50 messages (limited to page size)
[17:50:18] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[17:50:18] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[17:50:18] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18378, 18379, 18380, 18381, 18382]
[17:50:18] [USER] ✅ User registered successfully
[17:50:18] [PUSH] User registration after token update: success
[17:50:19] [COMBINED_FETCH] Loaded 7193 read receipts, 873 messages with reactions
[17:50:19] [FAKE MODE] Enriched 50 messages with readBy data
[17:50:19] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18378, 18379, 18380, 18381, 18382]
[17:50:19] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:19] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:19] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:19] HELLO → sent (cached token, role=query)
[17:50:19] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:19] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:19] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:19] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:19] [CLEANUP] ========================================
[17:50:19] [CLEANUP] Cleaning up all agent connections and views
[17:50:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:19] [CLEANUP] Stopped and removed 0 video connections
[17:50:19] [CLEANUP] Removed 0 video views
[17:50:19] [CLEANUP] Removed 0 feed scroll views
[17:50:19] [CLEANUP] Removed 0 status labels
[17:50:19] [CLEANUP] Reset agent query state
[17:50:19] [CLEANUP] Updated page indicator
[17:50:19] [CLEANUP] Rebuilt video layout
[17:50:19] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:19] [CLEANUP] ========================================
[17:50:19] [SERVER] Starting reconnect polling (5s interval)
[17:50:19] [CLEANUP] ========================================
[17:50:19] [CLEANUP] Cleaning up all agent connections and views
[17:50:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:19] [CLEANUP] Stopped and removed 0 video connections
[17:50:19] [CLEANUP] Removed 0 video views
[17:50:19] [CLEANUP] Removed 0 feed scroll views
[17:50:19] [CLEANUP] Removed 0 status labels
[17:50:19] [CLEANUP] Reset agent query state
[17:50:19] [CLEANUP] Updated page indicator
[17:50:19] [CLEANUP] Rebuilt video layout
[17:50:19] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:19] [CLEANUP] ========================================
[17:50:19] [SERVER] Starting reconnect polling (5s interval)
[17:50:21] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:21] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:21] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:21] HELLO → sent (cached token, role=query)
[17:50:21] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:21] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:21] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:21] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:21] [CLEANUP] ========================================
[17:50:21] [CLEANUP] Cleaning up all agent connections and views
[17:50:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:21] [CLEANUP] Stopped and removed 0 video connections
[17:50:21] [CLEANUP] Removed 0 video views
[17:50:21] [CLEANUP] Removed 0 feed scroll views
[17:50:21] [CLEANUP] Removed 0 status labels
[17:50:21] [CLEANUP] Reset agent query state
[17:50:21] [CLEANUP] Updated page indicator
[17:50:21] [CLEANUP] Rebuilt video layout
[17:50:21] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:21] [CLEANUP] ========================================
[17:50:21] [SERVER] Starting reconnect polling (5s interval)
[17:50:21] [CLEANUP] ========================================
[17:50:21] [CLEANUP] Cleaning up all agent connections and views
[17:50:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:21] [CLEANUP] Stopped and removed 0 video connections
[17:50:21] [CLEANUP] Removed 0 video views
[17:50:21] [CLEANUP] Removed 0 feed scroll views
[17:50:21] [CLEANUP] Removed 0 status labels
[17:50:21] [CLEANUP] Reset agent query state
[17:50:21] [CLEANUP] Updated page indicator
[17:50:21] [CLEANUP] Rebuilt video layout
[17:50:21] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:21] [CLEANUP] ========================================
[17:50:21] [SERVER] Starting reconnect polling (5s interval)
[17:50:23] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:23] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:23] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:23] HELLO → sent (cached token, role=query)
[17:50:23] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:23] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:23] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:23] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:23] [CLEANUP] ========================================
[17:50:23] [CLEANUP] Cleaning up all agent connections and views
[17:50:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:23] [CLEANUP] Stopped and removed 0 video connections
[17:50:23] [CLEANUP] Removed 0 video views
[17:50:23] [CLEANUP] Removed 0 feed scroll views
[17:50:23] [CLEANUP] Removed 0 status labels
[17:50:23] [CLEANUP] Reset agent query state
[17:50:23] [CLEANUP] Updated page indicator
[17:50:23] [CLEANUP] Rebuilt video layout
[17:50:23] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:23] [CLEANUP] ========================================
[17:50:23] [SERVER] Starting reconnect polling (5s interval)
[17:50:23] [CLEANUP] ========================================
[17:50:23] [CLEANUP] Cleaning up all agent connections and views
[17:50:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:23] [CLEANUP] Stopped and removed 0 video connections
[17:50:23] [CLEANUP] Removed 0 video views
[17:50:23] [CLEANUP] Removed 0 feed scroll views
[17:50:23] [CLEANUP] Removed 0 status labels
[17:50:23] [CLEANUP] Reset agent query state
[17:50:23] [CLEANUP] Updated page indicator
[17:50:23] [CLEANUP] Rebuilt video layout
[17:50:23] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:23] [CLEANUP] ========================================
[17:50:23] [SERVER] Starting reconnect polling (5s interval)
[17:50:24] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:24] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:24] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:24] HELLO → sent (cached token, role=query)
[17:50:24] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:24] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:24] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:24] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:24] [CLEANUP] ========================================
[17:50:24] [CLEANUP] Cleaning up all agent connections and views
[17:50:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:24] [CLEANUP] Stopped and removed 0 video connections
[17:50:24] [CLEANUP] Removed 0 video views
[17:50:24] [CLEANUP] Removed 0 feed scroll views
[17:50:24] [CLEANUP] Removed 0 status labels
[17:50:24] [CLEANUP] Reset agent query state
[17:50:24] [CLEANUP] Updated page indicator
[17:50:24] [CLEANUP] Rebuilt video layout
[17:50:24] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:24] [CLEANUP] ========================================
[17:50:24] [SERVER] Starting reconnect polling (5s interval)
[17:50:24] [CLEANUP] ========================================
[17:50:24] [CLEANUP] Cleaning up all agent connections and views
[17:50:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:24] [CLEANUP] Stopped and removed 0 video connections
[17:50:24] [CLEANUP] Removed 0 video views
[17:50:24] [CLEANUP] Removed 0 feed scroll views
[17:50:24] [CLEANUP] Removed 0 status labels
[17:50:24] [CLEANUP] Reset agent query state
[17:50:24] [CLEANUP] Updated page indicator
[17:50:24] [CLEANUP] Rebuilt video layout
[17:50:24] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:24] [CLEANUP] ========================================
[17:50:24] [SERVER] Starting reconnect polling (5s interval)
[17:50:26] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:26] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:26] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:26] HELLO → sent (cached token, role=query)
[17:50:26] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:26] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:26] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:26] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:26] [CLEANUP] ========================================
[17:50:26] [CLEANUP] Cleaning up all agent connections and views
[17:50:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:26] [CLEANUP] Stopped and removed 0 video connections
[17:50:26] [CLEANUP] Removed 0 video views
[17:50:26] [CLEANUP] Removed 0 feed scroll views
[17:50:26] [CLEANUP] Removed 0 status labels
[17:50:26] [CLEANUP] Reset agent query state
[17:50:26] [CLEANUP] Updated page indicator
[17:50:26] [CLEANUP] Rebuilt video layout
[17:50:26] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:26] [CLEANUP] ========================================
[17:50:26] [SERVER] Starting reconnect polling (5s interval)
[17:50:26] [CLEANUP] ========================================
[17:50:26] [CLEANUP] Cleaning up all agent connections and views
[17:50:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:26] [CLEANUP] Stopped and removed 0 video connections
[17:50:26] [CLEANUP] Removed 0 video views
[17:50:26] [CLEANUP] Removed 0 feed scroll views
[17:50:26] [CLEANUP] Removed 0 status labels
[17:50:26] [CLEANUP] Reset agent query state
[17:50:26] [CLEANUP] Updated page indicator
[17:50:26] [CLEANUP] Rebuilt video layout
[17:50:26] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:26] [CLEANUP] ========================================
[17:50:26] [SERVER] Starting reconnect polling (5s interval)
[17:50:28] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:28] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:28] [CAMERA] Switch-over factors: [2, 8]
[17:50:28] [CAMERA] Virtual device max zoom: 123.75
[17:50:28] [CAMERA] 0.5x: virtual device at zoom 1.0 (ultra-wide)
[17:50:28] [CAMERA] 1x: virtual device at zoom 2.0 (wide angle, macro enabled)
[17:50:28] [CAMERA] 2x: virtual device at zoom 4.0
[17:50:28] [CAMERA] 4x: virtual device at zoom 8.0 (telephoto)
[17:50:28] [CAMERA] 8x: virtual device at zoom 16.0
[17:50:28] [CAMERA] Discovered 5 lenses: ["0.5x=1.0", "1x=2.0", "2x=4.0", "4x=8.0", "8x=16.0"]
[17:50:28] [CAMERA] Using device: Front Camera (AVCaptureDeviceTypeBuiltInWideAngleCamera)
[17:50:28] [CAMERA] updateVideoOrientation - no connection or orientation not supported
[17:50:28] [CAMERA] viewDidLayoutSubviews - previewView.bounds: (0.0, 0.0, 440.0, 796.0), camera: FRONT
[17:50:28] [CAMERA] updateVideoOrientation - no connection or orientation not supported
[17:50:28] [CAMERA] viewDidLayoutSubviews - previewView.bounds: (0.0, 0.0, 440.0, 796.0), camera: FRONT
[17:50:28] [VOLUME] Starting volume button monitoring
[17:50:28] [VOLUME] Hidden MPVolumeView installed
[17:50:29] [VOLUME] Audio session active, initial volume: 0.5
[17:50:29] [VOLUME] Volume observation started
[17:50:29] [CAMERA] updateVideoOrientation - no connection or orientation not supported
[17:50:29] [CAMERA] viewDidLayoutSubviews - previewView.bounds: (0.0, 0.0, 440.0, 796.0), camera: FRONT
[17:50:29] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:29] HELLO → sent (cached token, role=query)
[17:50:29] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:29] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:29] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:29] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:29] [CLEANUP] ========================================
[17:50:29] [CLEANUP] Cleaning up all agent connections and views
[17:50:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:29] [CLEANUP] Stopped and removed 0 video connections
[17:50:29] [CLEANUP] Removed 0 video views
[17:50:29] [CLEANUP] Removed 0 feed scroll views
[17:50:29] [CLEANUP] Removed 0 status labels
[17:50:29] [CLEANUP] Reset agent query state
[17:50:29] [CLEANUP] Updated page indicator
[17:50:29] [CLEANUP] Rebuilt video layout
[17:50:29] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:29] [CLEANUP] ========================================
[17:50:29] [SERVER] Starting reconnect polling (5s interval)
[17:50:29] [CLEANUP] ========================================
[17:50:29] [CLEANUP] Cleaning up all agent connections and views
[17:50:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:29] [CLEANUP] Stopped and removed 0 video connections
[17:50:29] [CLEANUP] Removed 0 video views
[17:50:29] [CLEANUP] Removed 0 feed scroll views
[17:50:29] [CLEANUP] Removed 0 status labels
[17:50:29] [CLEANUP] Reset agent query state
[17:50:29] [CLEANUP] Updated page indicator
[17:50:29] [CLEANUP] Rebuilt video layout
[17:50:29] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:29] [CLEANUP] ========================================
[17:50:29] [SERVER] Starting reconnect polling (5s interval)
[17:50:29] [CAMERA] Configuring focus for Front Camera
[17:50:29] [CAMERA] Focus configured: mode=1, subjectAreaMonitoring=true
[17:50:29] [CAMERA] setupPreviewLayer - previewView.bounds: (0.0, 0.0, 440.0, 796.0), previewLayer.frame: (0.0, 0.0, 440.0, 796.0)
[17:50:30] [CAMERA] Switched to continuous autofocus, lens position: 0.6431372
[17:50:30] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:30] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:30] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:30] HELLO → sent (cached token, role=query)
[17:50:30] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:30] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:30] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:30] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:30] [CLEANUP] ========================================
[17:50:30] [CLEANUP] Cleaning up all agent connections and views
[17:50:30] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:30] [CLEANUP] Stopped and removed 0 video connections
[17:50:30] [CLEANUP] Removed 0 video views
[17:50:30] [CLEANUP] Removed 0 feed scroll views
[17:50:30] [CLEANUP] Removed 0 status labels
[17:50:30] [CLEANUP] Reset agent query state
[17:50:30] [CLEANUP] Updated page indicator
[17:50:30] [CLEANUP] Rebuilt video layout
[17:50:30] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:30] [CLEANUP] ========================================
[17:50:30] [SERVER] Starting reconnect polling (5s interval)
[17:50:30] [CLEANUP] ========================================
[17:50:30] [CLEANUP] Cleaning up all agent connections and views
[17:50:30] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:30] [CLEANUP] Stopped and removed 0 video connections
[17:50:30] [CLEANUP] Removed 0 video views
[17:50:30] [CLEANUP] Removed 0 feed scroll views
[17:50:30] [CLEANUP] Removed 0 status labels
[17:50:30] [CLEANUP] Reset agent query state
[17:50:30] [CLEANUP] Updated page indicator
[17:50:30] [CLEANUP] Rebuilt video layout
[17:50:30] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:30] [CLEANUP] ========================================
[17:50:30] [SERVER] Starting reconnect polling (5s interval)
[17:50:30] [VOLUME] Stopping volume button monitoring
[17:50:30] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[17:50:30] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[17:50:30] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[17:50:30] [GALLERY_DB] Raw datesent for msg 18380: '2026-01-21 10:30:35'
[17:50:31] [GALLERY_DB] ✅ Loaded 475 media messages
[17:50:31] [GALLERY] Filtered 475 -> 436 (only with local thumbnails)
[17:50:31] [GALLERY] First 5 after sort (newest first):
[17:50:31] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[17:50:31] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[17:50:31] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[17:50:31] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[17:50:31] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[17:50:32] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:32] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:32] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:32] HELLO → sent (cached token, role=query)
[17:50:32] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:32] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:32] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:32] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:32] [CLEANUP] ========================================
[17:50:32] [CLEANUP] Cleaning up all agent connections and views
[17:50:32] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:32] [CLEANUP] Stopped and removed 0 video connections
[17:50:32] [CLEANUP] Removed 0 video views
[17:50:32] [CLEANUP] Removed 0 feed scroll views
[17:50:32] [CLEANUP] Removed 0 status labels
[17:50:32] [CLEANUP] Reset agent query state
[17:50:32] [CLEANUP] Updated page indicator
[17:50:32] [CLEANUP] Rebuilt video layout
[17:50:32] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:32] [CLEANUP] ========================================
[17:50:32] [SERVER] Starting reconnect polling (5s interval)
[17:50:32] [CLEANUP] ========================================
[17:50:32] [CLEANUP] Cleaning up all agent connections and views
[17:50:32] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:32] [CLEANUP] Stopped and removed 0 video connections
[17:50:32] [CLEANUP] Removed 0 video views
[17:50:32] [CLEANUP] Removed 0 feed scroll views
[17:50:32] [CLEANUP] Removed 0 status labels
[17:50:32] [CLEANUP] Reset agent query state
[17:50:32] [CLEANUP] Updated page indicator
[17:50:32] [CLEANUP] Rebuilt video layout
[17:50:32] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:32] [CLEANUP] ========================================
[17:50:32] [SERVER] Starting reconnect polling (5s interval)
[17:50:33] [LOG] Long press on chat icon detected! Triggering log upload...
[17:50:33] [SCROLL_BTN] Showing button - 310pt from bottom > half 223pt
[17:50:34] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:34] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:34] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:34] HELLO → sent (cached token, role=query)
[17:50:34] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:34] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:34] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:34] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:34] [CLEANUP] ========================================
[17:50:34] [CLEANUP] Cleaning up all agent connections and views
[17:50:34] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:34] [CLEANUP] Stopped and removed 0 video connections
[17:50:34] [CLEANUP] Removed 0 video views
[17:50:34] [CLEANUP] Removed 0 feed scroll views
[17:50:34] [CLEANUP] Removed 0 status labels
[17:50:34] [CLEANUP] Reset agent query state
[17:50:34] [CLEANUP] Updated page indicator
[17:50:34] [CLEANUP] Rebuilt video layout
[17:50:34] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:34] [CLEANUP] ========================================
[17:50:34] [SERVER] Starting reconnect polling (5s interval)
[17:50:34] [CLEANUP] ========================================
[17:50:34] [CLEANUP] Cleaning up all agent connections and views
[17:50:34] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:34] [CLEANUP] Stopped and removed 0 video connections
[17:50:34] [CLEANUP] Removed 0 video views
[17:50:34] [CLEANUP] Removed 0 feed scroll views
[17:50:34] [CLEANUP] Removed 0 status labels
[17:50:34] [CLEANUP] Reset agent query state
[17:50:34] [CLEANUP] Updated page indicator
[17:50:34] [CLEANUP] Rebuilt video layout
[17:50:34] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:34] [CLEANUP] ========================================
[17:50:34] [SERVER] Starting reconnect polling (5s interval)
[17:50:35] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:35] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:35] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:35] HELLO → sent (cached token, role=query)
[17:50:35] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:35] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:35] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:35] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:35] [CLEANUP] ========================================
[17:50:35] [CLEANUP] Cleaning up all agent connections and views
[17:50:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:35] [CLEANUP] Stopped and removed 0 video connections
[17:50:35] [CLEANUP] Removed 0 video views
[17:50:35] [CLEANUP] Removed 0 feed scroll views
[17:50:35] [CLEANUP] Removed 0 status labels
[17:50:35] [CLEANUP] Reset agent query state
[17:50:35] [CLEANUP] Updated page indicator
[17:50:35] [CLEANUP] Rebuilt video layout
[17:50:35] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:35] [CLEANUP] ========================================
[17:50:35] [SERVER] Starting reconnect polling (5s interval)
[17:50:35] [CLEANUP] ========================================
[17:50:35] [CLEANUP] Cleaning up all agent connections and views
[17:50:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:35] [CLEANUP] Stopped and removed 0 video connections
[17:50:35] [CLEANUP] Removed 0 video views
[17:50:35] [CLEANUP] Removed 0 feed scroll views
[17:50:35] [CLEANUP] Removed 0 status labels
[17:50:35] [CLEANUP] Reset agent query state
[17:50:35] [CLEANUP] Updated page indicator
[17:50:35] [CLEANUP] Rebuilt video layout
[17:50:35] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:35] [CLEANUP] ========================================
[17:50:35] [SERVER] Starting reconnect polling (5s interval)
[17:50:37] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:37] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:37] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:37] HELLO → sent (cached token, role=query)
[17:50:37] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:37] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:37] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:37] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:37] [CLEANUP] ========================================
[17:50:37] [CLEANUP] Cleaning up all agent connections and views
[17:50:37] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:37] [CLEANUP] Stopped and removed 0 video connections
[17:50:37] [CLEANUP] Removed 0 video views
[17:50:37] [CLEANUP] Removed 0 feed scroll views
[17:50:37] [CLEANUP] Removed 0 status labels
[17:50:37] [CLEANUP] Reset agent query state
[17:50:37] [CLEANUP] Updated page indicator
[17:50:37] [CLEANUP] Rebuilt video layout
[17:50:37] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:37] [CLEANUP] ========================================
[17:50:37] [SERVER] Starting reconnect polling (5s interval)
[17:50:37] [CLEANUP] ========================================
[17:50:37] [CLEANUP] Cleaning up all agent connections and views
[17:50:37] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:37] [CLEANUP] Stopped and removed 0 video connections
[17:50:37] [CLEANUP] Removed 0 video views
[17:50:37] [CLEANUP] Removed 0 feed scroll views
[17:50:37] [CLEANUP] Removed 0 status labels
[17:50:37] [CLEANUP] Reset agent query state
[17:50:37] [CLEANUP] Updated page indicator
[17:50:37] [CLEANUP] Rebuilt video layout
[17:50:37] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:37] [CLEANUP] ========================================
[17:50:37] [SERVER] Starting reconnect polling (5s interval)
[17:50:39] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:39] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:39] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:39] HELLO → sent (cached token, role=query)
[17:50:39] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:39] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:39] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:39] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:39] [CLEANUP] ========================================
[17:50:39] [CLEANUP] Cleaning up all agent connections and views
[17:50:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:39] [CLEANUP] Stopped and removed 0 video connections
[17:50:39] [CLEANUP] Removed 0 video views
[17:50:39] [CLEANUP] Removed 0 feed scroll views
[17:50:39] [CLEANUP] Removed 0 status labels
[17:50:39] [CLEANUP] Reset agent query state
[17:50:39] [CLEANUP] Updated page indicator
[17:50:39] [CLEANUP] Rebuilt video layout
[17:50:39] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:39] [CLEANUP] ========================================
[17:50:39] [SERVER] Starting reconnect polling (5s interval)
[17:50:39] [CLEANUP] ========================================
[17:50:39] [CLEANUP] Cleaning up all agent connections and views
[17:50:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:39] [CLEANUP] Stopped and removed 0 video connections
[17:50:39] [CLEANUP] Removed 0 video views
[17:50:39] [CLEANUP] Removed 0 feed scroll views
[17:50:39] [CLEANUP] Removed 0 status labels
[17:50:39] [CLEANUP] Reset agent query state
[17:50:39] [CLEANUP] Updated page indicator
[17:50:39] [CLEANUP] Rebuilt video layout
[17:50:39] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:39] [CLEANUP] ========================================
[17:50:39] [SERVER] Starting reconnect polling (5s interval)
[17:50:40] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:40] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:40] [NETWORK] Status changed: connected
[17:50:40] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:40] HELLO → sent (cached token, role=query)
[17:50:40] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:40] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:40] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:40] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:40] [CLEANUP] ========================================
[17:50:40] [CLEANUP] Cleaning up all agent connections and views
[17:50:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:40] [CLEANUP] Stopped and removed 0 video connections
[17:50:40] [CLEANUP] Removed 0 video views
[17:50:40] [CLEANUP] Removed 0 feed scroll views
[17:50:40] [CLEANUP] Removed 0 status labels
[17:50:40] [CLEANUP] Reset agent query state
[17:50:40] [CLEANUP] Updated page indicator
[17:50:40] [CLEANUP] Rebuilt video layout
[17:50:40] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:40] [CLEANUP] ========================================
[17:50:40] [SERVER] Starting reconnect polling (5s interval)
[17:50:40] [CLEANUP] ========================================
[17:50:40] [CLEANUP] Cleaning up all agent connections and views
[17:50:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:40] [CLEANUP] Stopped and removed 0 video connections
[17:50:40] [CLEANUP] Removed 0 video views
[17:50:40] [CLEANUP] Removed 0 feed scroll views
[17:50:40] [CLEANUP] Removed 0 status labels
[17:50:40] [CLEANUP] Reset agent query state
[17:50:40] [CLEANUP] Updated page indicator
[17:50:40] [CLEANUP] Rebuilt video layout
[17:50:40] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:40] [CLEANUP] ========================================
[17:50:40] [SERVER] Starting reconnect polling (5s interval)
[17:50:42] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:42] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:42] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:42] HELLO → sent (cached token, role=query)
[17:50:42] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:42] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:42] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:42] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:42] [CLEANUP] ========================================
[17:50:42] [CLEANUP] Cleaning up all agent connections and views
[17:50:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:42] [CLEANUP] Stopped and removed 0 video connections
[17:50:42] [CLEANUP] Removed 0 video views
[17:50:42] [CLEANUP] Removed 0 feed scroll views
[17:50:42] [CLEANUP] Removed 0 status labels
[17:50:42] [CLEANUP] Reset agent query state
[17:50:42] [CLEANUP] Updated page indicator
[17:50:42] [CLEANUP] Rebuilt video layout
[17:50:42] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:42] [CLEANUP] ========================================
[17:50:42] [SERVER] Starting reconnect polling (5s interval)
[17:50:42] [CLEANUP] ========================================
[17:50:42] [CLEANUP] Cleaning up all agent connections and views
[17:50:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:42] [CLEANUP] Stopped and removed 0 video connections
[17:50:42] [CLEANUP] Removed 0 video views
[17:50:42] [CLEANUP] Removed 0 feed scroll views
[17:50:42] [CLEANUP] Removed 0 status labels
[17:50:42] [CLEANUP] Reset agent query state
[17:50:42] [CLEANUP] Updated page indicator
[17:50:42] [CLEANUP] Rebuilt video layout
[17:50:42] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:42] [CLEANUP] ========================================
[17:50:42] [SERVER] Starting reconnect polling (5s interval)
[17:50:43] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:43] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:43] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:43] HELLO → sent (cached token, role=query)
[17:50:43] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:43] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:43] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:43] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:43] [CLEANUP] ========================================
[17:50:43] [CLEANUP] Cleaning up all agent connections and views
[17:50:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:43] [CLEANUP] Stopped and removed 0 video connections
[17:50:43] [CLEANUP] Removed 0 video views
[17:50:43] [CLEANUP] Removed 0 feed scroll views
[17:50:43] [CLEANUP] Removed 0 status labels
[17:50:43] [CLEANUP] Reset agent query state
[17:50:43] [CLEANUP] Updated page indicator
[17:50:43] [CLEANUP] Rebuilt video layout
[17:50:43] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:43] [CLEANUP] ========================================
[17:50:43] [SERVER] Starting reconnect polling (5s interval)
[17:50:43] [CLEANUP] ========================================
[17:50:43] [CLEANUP] Cleaning up all agent connections and views
[17:50:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:43] [CLEANUP] Stopped and removed 0 video connections
[17:50:43] [CLEANUP] Removed 0 video views
[17:50:43] [CLEANUP] Removed 0 feed scroll views
[17:50:43] [CLEANUP] Removed 0 status labels
[17:50:43] [CLEANUP] Reset agent query state
[17:50:43] [CLEANUP] Updated page indicator
[17:50:43] [CLEANUP] Rebuilt video layout
[17:50:43] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:43] [CLEANUP] ========================================
[17:50:43] [SERVER] Starting reconnect polling (5s interval)
[17:50:45] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:45] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:45] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:45] HELLO → sent (cached token, role=query)
[17:50:45] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:45] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:45] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:45] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:45] [CLEANUP] ========================================
[17:50:45] [CLEANUP] Cleaning up all agent connections and views
[17:50:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:45] [CLEANUP] Stopped and removed 0 video connections
[17:50:45] [CLEANUP] Removed 0 video views
[17:50:45] [CLEANUP] Removed 0 feed scroll views
[17:50:45] [CLEANUP] Removed 0 status labels
[17:50:45] [CLEANUP] Reset agent query state
[17:50:45] [CLEANUP] Updated page indicator
[17:50:45] [CLEANUP] Rebuilt video layout
[17:50:45] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:45] [CLEANUP] ========================================
[17:50:45] [SERVER] Starting reconnect polling (5s interval)
[17:50:45] [CLEANUP] ========================================
[17:50:45] [CLEANUP] Cleaning up all agent connections and views
[17:50:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:45] [CLEANUP] Stopped and removed 0 video connections
[17:50:45] [CLEANUP] Removed 0 video views
[17:50:45] [CLEANUP] Removed 0 feed scroll views
[17:50:45] [CLEANUP] Removed 0 status labels
[17:50:45] [CLEANUP] Reset agent query state
[17:50:45] [CLEANUP] Updated page indicator
[17:50:45] [CLEANUP] Rebuilt video layout
[17:50:45] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:45] [CLEANUP] ========================================
[17:50:45] [SERVER] Starting reconnect polling (5s interval)
[17:50:47] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:47] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:47] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:47] HELLO → sent (cached token, role=query)
[17:50:47] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:47] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:47] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:47] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:47] [CLEANUP] ========================================
[17:50:47] [CLEANUP] Cleaning up all agent connections and views
[17:50:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:47] [CLEANUP] Stopped and removed 0 video connections
[17:50:47] [CLEANUP] Removed 0 video views
[17:50:47] [CLEANUP] Removed 0 feed scroll views
[17:50:47] [CLEANUP] Removed 0 status labels
[17:50:47] [CLEANUP] Reset agent query state
[17:50:47] [CLEANUP] Updated page indicator
[17:50:47] [CLEANUP] Rebuilt video layout
[17:50:47] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:47] [CLEANUP] ========================================
[17:50:47] [SERVER] Starting reconnect polling (5s interval)
[17:50:47] [CLEANUP] ========================================
[17:50:47] [CLEANUP] Cleaning up all agent connections and views
[17:50:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:47] [CLEANUP] Stopped and removed 0 video connections
[17:50:47] [CLEANUP] Removed 0 video views
[17:50:47] [CLEANUP] Removed 0 feed scroll views
[17:50:47] [CLEANUP] Removed 0 status labels
[17:50:47] [CLEANUP] Reset agent query state
[17:50:47] [CLEANUP] Updated page indicator
[17:50:47] [CLEANUP] Rebuilt video layout
[17:50:47] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:47] [CLEANUP] ========================================
[17:50:47] [SERVER] Starting reconnect polling (5s interval)
[17:50:48] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:48] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:48] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:48] HELLO → sent (cached token, role=query)
[17:50:48] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:48] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:48] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:48] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:48] [CLEANUP] ========================================
[17:50:48] [CLEANUP] Cleaning up all agent connections and views
[17:50:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:48] [CLEANUP] Stopped and removed 0 video connections
[17:50:48] [CLEANUP] Removed 0 video views
[17:50:48] [CLEANUP] Removed 0 feed scroll views
[17:50:48] [CLEANUP] Removed 0 status labels
[17:50:48] [CLEANUP] Reset agent query state
[17:50:48] [CLEANUP] Updated page indicator
[17:50:48] [CLEANUP] Rebuilt video layout
[17:50:48] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:48] [CLEANUP] ========================================
[17:50:48] [SERVER] Starting reconnect polling (5s interval)
[17:50:48] [CLEANUP] ========================================
[17:50:48] [CLEANUP] Cleaning up all agent connections and views
[17:50:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:48] [CLEANUP] Stopped and removed 0 video connections
[17:50:48] [CLEANUP] Removed 0 video views
[17:50:48] [CLEANUP] Removed 0 feed scroll views
[17:50:48] [CLEANUP] Removed 0 status labels
[17:50:48] [CLEANUP] Reset agent query state
[17:50:48] [CLEANUP] Updated page indicator
[17:50:48] [CLEANUP] Rebuilt video layout
[17:50:48] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:48] [CLEANUP] ========================================
[17:50:48] [SERVER] Starting reconnect polling (5s interval)
[17:50:50] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:50] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:50] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:50] HELLO → sent (cached token, role=query)
[17:50:50] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:50] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:50] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:50] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:50] [CLEANUP] ========================================
[17:50:50] [CLEANUP] Cleaning up all agent connections and views
[17:50:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:50] [CLEANUP] Stopped and removed 0 video connections
[17:50:50] [CLEANUP] Removed 0 video views
[17:50:50] [CLEANUP] Removed 0 feed scroll views
[17:50:50] [CLEANUP] Removed 0 status labels
[17:50:50] [CLEANUP] Reset agent query state
[17:50:50] [CLEANUP] Updated page indicator
[17:50:50] [CLEANUP] Rebuilt video layout
[17:50:50] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:50] [CLEANUP] ========================================
[17:50:50] [SERVER] Starting reconnect polling (5s interval)
[17:50:50] [CLEANUP] ========================================
[17:50:50] [CLEANUP] Cleaning up all agent connections and views
[17:50:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:50] [CLEANUP] Stopped and removed 0 video connections
[17:50:50] [CLEANUP] Removed 0 video views
[17:50:50] [CLEANUP] Removed 0 feed scroll views
[17:50:50] [CLEANUP] Removed 0 status labels
[17:50:50] [CLEANUP] Reset agent query state
[17:50:50] [CLEANUP] Updated page indicator
[17:50:50] [CLEANUP] Rebuilt video layout
[17:50:50] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:50] [CLEANUP] ========================================
[17:50:50] [SERVER] Starting reconnect polling (5s interval)
[17:50:52] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:52] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:52] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:52] HELLO → sent (cached token, role=query)
[17:50:52] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:52] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:52] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:52] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:52] [CLEANUP] ========================================
[17:50:52] [CLEANUP] Cleaning up all agent connections and views
[17:50:52] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:52] [CLEANUP] Stopped and removed 0 video connections
[17:50:52] [CLEANUP] Removed 0 video views
[17:50:52] [CLEANUP] Removed 0 feed scroll views
[17:50:52] [CLEANUP] Removed 0 status labels
[17:50:52] [CLEANUP] Reset agent query state
[17:50:52] [CLEANUP] Updated page indicator
[17:50:52] [CLEANUP] Rebuilt video layout
[17:50:52] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:52] [CLEANUP] ========================================
[17:50:52] [SERVER] Starting reconnect polling (5s interval)
[17:50:52] [CLEANUP] ========================================
[17:50:52] [CLEANUP] Cleaning up all agent connections and views
[17:50:52] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:52] [CLEANUP] Stopped and removed 0 video connections
[17:50:52] [CLEANUP] Removed 0 video views
[17:50:52] [CLEANUP] Removed 0 feed scroll views
[17:50:52] [CLEANUP] Removed 0 status labels
[17:50:52] [CLEANUP] Reset agent query state
[17:50:52] [CLEANUP] Updated page indicator
[17:50:52] [CLEANUP] Rebuilt video layout
[17:50:52] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:52] [CLEANUP] ========================================
[17:50:52] [SERVER] Starting reconnect polling (5s interval)
[17:50:53] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:53] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:53] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:53] HELLO → sent (cached token, role=query)
[17:50:53] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:53] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:53] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:53] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:53] [CLEANUP] ========================================
[17:50:53] [CLEANUP] Cleaning up all agent connections and views
[17:50:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:53] [CLEANUP] Stopped and removed 0 video connections
[17:50:53] [CLEANUP] Removed 0 video views
[17:50:53] [CLEANUP] Removed 0 feed scroll views
[17:50:53] [CLEANUP] Removed 0 status labels
[17:50:53] [CLEANUP] Reset agent query state
[17:50:53] [CLEANUP] Updated page indicator
[17:50:53] [CLEANUP] Rebuilt video layout
[17:50:53] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:53] [CLEANUP] ========================================
[17:50:53] [SERVER] Starting reconnect polling (5s interval)
[17:50:53] [CLEANUP] ========================================
[17:50:53] [CLEANUP] Cleaning up all agent connections and views
[17:50:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:53] [CLEANUP] Stopped and removed 0 video connections
[17:50:53] [CLEANUP] Removed 0 video views
[17:50:53] [CLEANUP] Removed 0 feed scroll views
[17:50:53] [CLEANUP] Removed 0 status labels
[17:50:53] [CLEANUP] Reset agent query state
[17:50:53] [CLEANUP] Updated page indicator
[17:50:53] [CLEANUP] Rebuilt video layout
[17:50:53] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:53] [CLEANUP] ========================================
[17:50:53] [SERVER] Starting reconnect polling (5s interval)
[17:50:55] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:55] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:55] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:55] HELLO → sent (cached token, role=query)
[17:50:55] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:55] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:55] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:55] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:55] [CLEANUP] ========================================
[17:50:55] [CLEANUP] Cleaning up all agent connections and views
[17:50:55] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:55] [CLEANUP] Stopped and removed 0 video connections
[17:50:55] [CLEANUP] Removed 0 video views
[17:50:55] [CLEANUP] Removed 0 feed scroll views
[17:50:55] [CLEANUP] Removed 0 status labels
[17:50:55] [CLEANUP] Reset agent query state
[17:50:55] [CLEANUP] Updated page indicator
[17:50:55] [CLEANUP] Rebuilt video layout
[17:50:55] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:55] [CLEANUP] ========================================
[17:50:55] [SERVER] Starting reconnect polling (5s interval)
[17:50:55] [CLEANUP] ========================================
[17:50:55] [CLEANUP] Cleaning up all agent connections and views
[17:50:55] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:55] [CLEANUP] Stopped and removed 0 video connections
[17:50:55] [CLEANUP] Removed 0 video views
[17:50:55] [CLEANUP] Removed 0 feed scroll views
[17:50:55] [CLEANUP] Removed 0 status labels
[17:50:55] [CLEANUP] Reset agent query state
[17:50:55] [CLEANUP] Updated page indicator
[17:50:55] [CLEANUP] Rebuilt video layout
[17:50:55] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:55] [CLEANUP] ========================================
[17:50:55] [SERVER] Starting reconnect polling (5s interval)
[17:50:56] [LOG] Uploading log as '2026-01-21-17-50-do-not-listen-to-sound-when-activating-camera-in-p-Laurent.log' (615 KB) to server...
[17:50:56] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:56] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:57] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:57] HELLO → sent (cached token, role=query)
[17:50:57] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:57] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:57] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:57] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:57] [CLEANUP] ========================================
[17:50:57] [CLEANUP] Cleaning up all agent connections and views
[17:50:57] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:57] [CLEANUP] Stopped and removed 0 video connections
[17:50:57] [CLEANUP] Removed 0 video views
[17:50:57] [CLEANUP] Removed 0 feed scroll views
[17:50:57] [CLEANUP] Removed 0 status labels
[17:50:57] [CLEANUP] Reset agent query state
[17:50:57] [CLEANUP] Updated page indicator
[17:50:57] [CLEANUP] Rebuilt video layout
[17:50:57] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:57] [CLEANUP] ========================================
[17:50:57] [SERVER] Starting reconnect polling (5s interval)
[17:50:57] [CLEANUP] ========================================
[17:50:57] [CLEANUP] Cleaning up all agent connections and views
[17:50:57] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:57] [CLEANUP] Stopped and removed 0 video connections
[17:50:57] [CLEANUP] Removed 0 video views
[17:50:57] [CLEANUP] Removed 0 feed scroll views
[17:50:57] [CLEANUP] Removed 0 status labels
[17:50:57] [CLEANUP] Reset agent query state
[17:50:57] [CLEANUP] Updated page indicator
[17:50:57] [CLEANUP] Rebuilt video layout
[17:50:57] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:57] [CLEANUP] ========================================
[17:50:57] [SERVER] Starting reconnect polling (5s interval)
[17:50:57] [LOG] Upload HTTP status: 200
[17:50:57] [LOG] Upload successful: 2026-01-21-17-50-do-not-listen-to-sound-when-activating-camera-in-p-Laurent.log
[17:50:57] [LOG] Skipping cross-device log request (description doesn't end with '2')
[17:50:58] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:58] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:50:58] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:50:58] HELLO → sent (cached token, role=query)
[17:50:58] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:50:58] [WS] Query connection failed - cleaning up all agent connections and views
[17:50:58] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:50:58] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:50:58] [CLEANUP] ========================================
[17:50:58] [CLEANUP] Cleaning up all agent connections and views
[17:50:58] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:58] [CLEANUP] Stopped and removed 0 video connections
[17:50:58] [CLEANUP] Removed 0 video views
[17:50:58] [CLEANUP] Removed 0 feed scroll views
[17:50:58] [CLEANUP] Removed 0 status labels
[17:50:58] [CLEANUP] Reset agent query state
[17:50:58] [CLEANUP] Updated page indicator
[17:50:58] [CLEANUP] Rebuilt video layout
[17:50:58] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:58] [CLEANUP] ========================================
[17:50:58] [SERVER] Starting reconnect polling (5s interval)
[17:50:58] [CLEANUP] ========================================
[17:50:58] [CLEANUP] Cleaning up all agent connections and views
[17:50:58] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:50:58] [CLEANUP] Stopped and removed 0 video connections
[17:50:58] [CLEANUP] Removed 0 video views
[17:50:58] [CLEANUP] Removed 0 feed scroll views
[17:50:58] [CLEANUP] Removed 0 status labels
[17:50:58] [CLEANUP] Reset agent query state
[17:50:58] [CLEANUP] Updated page indicator
[17:50:58] [CLEANUP] Rebuilt video layout
[17:50:58] [CLEANUP] ✅ All agent connections and views cleaned up
[17:50:58] [CLEANUP] ========================================
[17:50:58] [SERVER] Starting reconnect polling (5s interval)
[17:51:00] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:00] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:00] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:00] HELLO → sent (cached token, role=query)
[17:51:00] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:00] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:00] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:00] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:00] [CLEANUP] ========================================
[17:51:00] [CLEANUP] Cleaning up all agent connections and views
[17:51:00] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:00] [CLEANUP] Stopped and removed 0 video connections
[17:51:00] [CLEANUP] Removed 0 video views
[17:51:00] [CLEANUP] Removed 0 feed scroll views
[17:51:00] [CLEANUP] Removed 0 status labels
[17:51:00] [CLEANUP] Reset agent query state
[17:51:00] [CLEANUP] Updated page indicator
[17:51:00] [CLEANUP] Rebuilt video layout
[17:51:00] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:00] [CLEANUP] ========================================
[17:51:00] [SERVER] Starting reconnect polling (5s interval)
[17:51:00] [CLEANUP] ========================================
[17:51:00] [CLEANUP] Cleaning up all agent connections and views
[17:51:00] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:00] [CLEANUP] Stopped and removed 0 video connections
[17:51:00] [CLEANUP] Removed 0 video views
[17:51:00] [CLEANUP] Removed 0 feed scroll views
[17:51:00] [CLEANUP] Removed 0 status labels
[17:51:00] [CLEANUP] Reset agent query state
[17:51:00] [CLEANUP] Updated page indicator
[17:51:00] [CLEANUP] Rebuilt video layout
[17:51:00] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:00] [CLEANUP] ========================================
[17:51:00] [SERVER] Starting reconnect polling (5s interval)
[17:51:00] [LIFECYCLE] App resigning active - cleared crash flag
[17:51:01] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[17:51:01] [SECURITY] Saved background timestamp
[17:51:01] [LIFECYCLE] App entering background - cleared crash flag
[17:51:01] [CLIENT_SIG] Disconnecting
[17:51:01] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[17:51:01] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[17:51:01] [WS] Canceling WebSocket for query connection to iosILUIWU
[17:51:01] In cleanupPeer
[17:51:01] In cleanupPeer
[17:51:01] [LIFECYCLE] WebRTC audio disabled
[17:51:01] [LIFECYCLE] AVAudioSession deactivated
[17:51:01] [LIFECYCLE] All connections stopped
[17:51:01] [CLIENT_SIG] WebSocket closed with code 1001
[17:51:01] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[17:51:01] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[17:51:01] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[17:51:01] [SERVER] Stopped reconnect polling
[17:51:01] [WS] URLSession invalidated successfully
[17:51:01] Will request stop of video 0
[17:51:01] Will request stop of video 0
[17:51:01] [PIP] Removing 0 tracks from PiP for connection 0
[17:51:01] [PIP] ✅ All tracks removed for connection 0
[17:51:01] [PIP] Removing 0 tracks from PiP for connection 0
[17:51:01] [PIP] ✅ All tracks removed for connection 0
[17:51:03] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:03] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:03] [SECURITY] Timeout check: elapsed=2.3706912994384766s, timeout=300.0s
[17:51:03] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[17:51:03] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:51:03] [LIFECYCLE] App entering foreground - restoring connections
[17:51:03] [NETWORK] Status changed: connected
[17:51:03] [UPLOAD_RETRY] No pending uploads to retry
[17:51:03] [LIFECYCLE] Merged 868 reactions from local DB
[17:51:03] [LIFECYCLE] WebRTC audio re-enabled
[17:51:03] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[17:51:03] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[17:51:03] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[17:51:03] [VIEWER] Reconnecting after background - querying agents
[17:51:03] [UNSENT_RETRY] Checking for unsent messages...
[17:51:03] [PENDING_UPLOAD] Total pending upload messages: 0
[17:51:03] [UNSENT_RETRY] No unsent messages found
[17:51:03] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:03] [CLIENT_SIG] WebSocket opened
[17:51:03] HELLO → sent (cached token, role=query)
[17:51:03] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[17:51:03] [CLIENT_SIG] Connected! clientId=0eN-Hi6dCV9LWCbH
[17:51:03] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:03] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:03] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:03] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:03] [CLEANUP] ========================================
[17:51:03] [CLEANUP] Cleaning up all agent connections and views
[17:51:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:03] [CLEANUP] Stopped and removed 0 video connections
[17:51:03] [CLEANUP] Removed 0 video views
[17:51:03] [CLEANUP] Removed 0 feed scroll views
[17:51:03] [CLEANUP] Removed 0 status labels
[17:51:03] [CLEANUP] Reset agent query state
[17:51:03] [CLEANUP] Updated page indicator
[17:51:03] [CLEANUP] Rebuilt video layout
[17:51:03] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:03] [CLEANUP] ========================================
[17:51:03] [SERVER] Starting reconnect polling (5s interval)
[17:51:03] [CLEANUP] ========================================
[17:51:03] [CLEANUP] Cleaning up all agent connections and views
[17:51:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:03] [CLEANUP] Stopped and removed 0 video connections
[17:51:03] [CLEANUP] Removed 0 video views
[17:51:03] [CLEANUP] Removed 0 feed scroll views
[17:51:03] [CLEANUP] Removed 0 status labels
[17:51:03] [CLEANUP] Reset agent query state
[17:51:03] [CLEANUP] Updated page indicator
[17:51:03] [CLEANUP] Rebuilt video layout
[17:51:03] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:03] [CLEANUP] ========================================
[17:51:03] [SERVER] Starting reconnect polling (5s interval)
[17:51:03] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[17:51:03] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[17:51:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18378, 18379, 18380, 18381, 18382]
[17:51:03] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[17:51:03] [SECURITY] Within timeout - cleared background flag
[17:51:03] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[17:51:03] [PUSH] handlePollEventsNotification userInfo: [:]
[17:51:03] [PUSH] No message_id in userInfo
[17:51:03] [PUSH] No operation_type in userInfo
[17:51:03] [FAST_REFRESH] Evolution disabled - performing incremental sync
[17:51:03] [FAST_REFRESH] Already have 50 messages - skipping local DB load
[17:51:03] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[17:51:03] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[17:51:03] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[17:51:03] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18427
[17:51:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18378, 18379, 18380, 18381, 18382]
[17:51:04] [INCREMENTAL_SYNC] ✅ No new messages
[17:51:04] [FAST_REFRESH] Incremental sync complete - 50 messages
[17:51:05] [COMBINED_FETCH] Loaded 7193 read receipts, 873 messages with reactions
[17:51:05] [FOREGROUND] Enriched 0 messages with readBy data from server
[17:51:05] [COMBINED_FETCH] Loaded 7193 read receipts, 873 messages with reactions
[17:51:05] [FAST_REFRESH] Enriched 50 messages with readBy data
[17:51:05] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[17:51:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18378, 18379, 18380, 18381, 18382]
[17:51:05] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:05] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:05] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:05] HELLO → sent (cached token, role=query)
[17:51:05] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:05] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:05] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:05] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:05] [CLEANUP] ========================================
[17:51:05] [CLEANUP] Cleaning up all agent connections and views
[17:51:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:05] [CLEANUP] Stopped and removed 0 video connections
[17:51:05] [CLEANUP] Removed 0 video views
[17:51:05] [CLEANUP] Removed 0 feed scroll views
[17:51:05] [CLEANUP] Removed 0 status labels
[17:51:05] [CLEANUP] Reset agent query state
[17:51:05] [CLEANUP] Updated page indicator
[17:51:05] [CLEANUP] Rebuilt video layout
[17:51:05] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:05] [CLEANUP] ========================================
[17:51:05] [SERVER] Starting reconnect polling (5s interval)
[17:51:05] [CLEANUP] ========================================
[17:51:05] [CLEANUP] Cleaning up all agent connections and views
[17:51:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:05] [CLEANUP] Stopped and removed 0 video connections
[17:51:05] [CLEANUP] Removed 0 video views
[17:51:05] [CLEANUP] Removed 0 feed scroll views
[17:51:05] [CLEANUP] Removed 0 status labels
[17:51:05] [CLEANUP] Reset agent query state
[17:51:05] [CLEANUP] Updated page indicator
[17:51:05] [CLEANUP] Rebuilt video layout
[17:51:05] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:05] [CLEANUP] ========================================
[17:51:05] [SERVER] Starting reconnect polling (5s interval)
[17:51:05] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[17:51:06] [CAMERA] Switch-over factors: [2, 8]
[17:51:06] [CAMERA] Virtual device max zoom: 123.75
[17:51:06] [CAMERA] 0.5x: virtual device at zoom 1.0 (ultra-wide)
[17:51:06] [CAMERA] 1x: virtual device at zoom 2.0 (wide angle, macro enabled)
[17:51:06] [CAMERA] 2x: virtual device at zoom 4.0
[17:51:06] [CAMERA] 4x: virtual device at zoom 8.0 (telephoto)
[17:51:06] [CAMERA] 8x: virtual device at zoom 16.0
[17:51:06] [CAMERA] Discovered 5 lenses: ["0.5x=1.0", "1x=2.0", "2x=4.0", "4x=8.0", "8x=16.0"]
[17:51:06] [CAMERA] Using device: Front Camera (AVCaptureDeviceTypeBuiltInWideAngleCamera)
[17:51:06] [CAMERA] updateVideoOrientation - no connection or orientation not supported
[17:51:06] [CAMERA] viewDidLayoutSubviews - previewView.bounds: (0.0, 0.0, 440.0, 796.0), camera: FRONT
[17:51:06] [CAMERA] updateVideoOrientation - no connection or orientation not supported
[17:51:06] [CAMERA] viewDidLayoutSubviews - previewView.bounds: (0.0, 0.0, 440.0, 796.0), camera: FRONT
[17:51:06] [VOLUME] Starting volume button monitoring
[17:51:06] [VOLUME] Hidden MPVolumeView installed
[17:51:06] [VOLUME] Audio session active, initial volume: 0.5
[17:51:06] [VOLUME] Volume observation started
[17:51:06] [CAMERA] updateVideoOrientation - no connection or orientation not supported
[17:51:06] [CAMERA] viewDidLayoutSubviews - previewView.bounds: (0.0, 0.0, 440.0, 796.0), camera: FRONT
[17:51:06] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:06] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:07] HELLO → sent (cached token, role=query)
[17:51:07] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:07] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:07] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:07] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:07] [CLEANUP] ========================================
[17:51:07] [CLEANUP] Cleaning up all agent connections and views
[17:51:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:07] [CLEANUP] Stopped and removed 0 video connections
[17:51:07] [CLEANUP] Removed 0 video views
[17:51:07] [CLEANUP] Removed 0 feed scroll views
[17:51:07] [CLEANUP] Removed 0 status labels
[17:51:07] [CLEANUP] Reset agent query state
[17:51:07] [CLEANUP] Updated page indicator
[17:51:07] [CLEANUP] Rebuilt video layout
[17:51:07] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:07] [CLEANUP] ========================================
[17:51:07] [SERVER] Starting reconnect polling (5s interval)
[17:51:07] [CLEANUP] ========================================
[17:51:07] [CLEANUP] Cleaning up all agent connections and views
[17:51:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:07] [CLEANUP] Stopped and removed 0 video connections
[17:51:07] [CLEANUP] Removed 0 video views
[17:51:07] [CLEANUP] Removed 0 feed scroll views
[17:51:07] [CLEANUP] Removed 0 status labels
[17:51:07] [CLEANUP] Reset agent query state
[17:51:07] [CLEANUP] Updated page indicator
[17:51:07] [CLEANUP] Rebuilt video layout
[17:51:07] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:07] [CLEANUP] ========================================
[17:51:07] [SERVER] Starting reconnect polling (5s interval)
[17:51:07] [CAMERA] Configuring focus for Front Camera
[17:51:07] [CAMERA] Focus configured: mode=1, subjectAreaMonitoring=true
[17:51:07] [CAMERA] setupPreviewLayer - previewView.bounds: (0.0, 0.0, 440.0, 796.0), previewLayer.frame: (0.0, 0.0, 440.0, 796.0)
[17:51:07] [CAMERA] Switched to continuous autofocus, lens position: 0.6431372
[17:51:08] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:08] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:08] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:08] HELLO → sent (cached token, role=query)
[17:51:08] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:08] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:08] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:08] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:08] [CLEANUP] ========================================
[17:51:08] [CLEANUP] Cleaning up all agent connections and views
[17:51:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:08] [CLEANUP] Stopped and removed 0 video connections
[17:51:08] [CLEANUP] Removed 0 video views
[17:51:08] [CLEANUP] Removed 0 feed scroll views
[17:51:08] [CLEANUP] Removed 0 status labels
[17:51:08] [CLEANUP] Reset agent query state
[17:51:08] [CLEANUP] Updated page indicator
[17:51:08] [CLEANUP] Rebuilt video layout
[17:51:08] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:08] [CLEANUP] ========================================
[17:51:08] [SERVER] Starting reconnect polling (5s interval)
[17:51:08] [CLEANUP] ========================================
[17:51:08] [CLEANUP] Cleaning up all agent connections and views
[17:51:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:08] [CLEANUP] Stopped and removed 0 video connections
[17:51:08] [CLEANUP] Removed 0 video views
[17:51:08] [CLEANUP] Removed 0 feed scroll views
[17:51:08] [CLEANUP] Removed 0 status labels
[17:51:08] [CLEANUP] Reset agent query state
[17:51:08] [CLEANUP] Updated page indicator
[17:51:08] [CLEANUP] Rebuilt video layout
[17:51:08] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:08] [CLEANUP] ========================================
[17:51:08] [SERVER] Starting reconnect polling (5s interval)
[17:51:09] [CAMERA] flipTapped - switching to: BACK
[17:51:09] [CAMERA] flipTapped - device: Back Triple Camera, activeFormat: 4032x3024
[17:51:09] [CAMERA] flipTapped - sessionPreset: AVCaptureSessionPresetPhoto
[17:51:10] [CAMERA] flipTapped - set initial zoom to 2.0
[17:51:10] [CAMERA] Configuring focus for Back Triple Camera
[17:51:10] [CAMERA] Focus configured: mode=1, subjectAreaMonitoring=true
[17:51:10] [CAMERA] updateVideoOrientation - set to: 1 (1=portrait, 3=landscapeRight, 4=landscapeLeft)
[17:51:10] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:10] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:10] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:10] HELLO → sent (cached token, role=query)
[17:51:10] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:10] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:10] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:10] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:10] [CLEANUP] ========================================
[17:51:10] [CLEANUP] Cleaning up all agent connections and views
[17:51:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:10] [CLEANUP] Stopped and removed 0 video connections
[17:51:10] [CLEANUP] Removed 0 video views
[17:51:10] [CLEANUP] Removed 0 feed scroll views
[17:51:10] [CLEANUP] Removed 0 status labels
[17:51:10] [CLEANUP] Reset agent query state
[17:51:10] [CLEANUP] Updated page indicator
[17:51:10] [CLEANUP] Rebuilt video layout
[17:51:10] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:10] [CLEANUP] ========================================
[17:51:10] [SERVER] Starting reconnect polling (5s interval)
[17:51:10] [CLEANUP] ========================================
[17:51:10] [CLEANUP] Cleaning up all agent connections and views
[17:51:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:10] [CLEANUP] Stopped and removed 0 video connections
[17:51:10] [CLEANUP] Removed 0 video views
[17:51:10] [CLEANUP] Removed 0 feed scroll views
[17:51:10] [CLEANUP] Removed 0 status labels
[17:51:10] [CLEANUP] Reset agent query state
[17:51:10] [CLEANUP] Updated page indicator
[17:51:10] [CLEANUP] Rebuilt video layout
[17:51:10] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:10] [CLEANUP] ========================================
[17:51:10] [SERVER] Starting reconnect polling (5s interval)
[17:51:10] [CAMERA] Switched to continuous autofocus, lens position: 0.61176467
[17:51:11] [CAMERA] flipTapped - switching to: FRONT
[17:51:11] [CAMERA] flipTapped - device: Front Camera, activeFormat: 1920x1080
[17:51:11] [CAMERA] flipTapped - sessionPreset: AVCaptureSessionPresetHigh
[17:51:11] [CAMERA] Configuring focus for Front Camera
[17:51:11] [CAMERA] Focus configured: mode=1, subjectAreaMonitoring=true
[17:51:11] [CAMERA] updateVideoOrientation - set to: 1 (1=portrait, 3=landscapeRight, 4=landscapeLeft)
[17:51:11] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:11] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:11] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:11] HELLO → sent (cached token, role=query)
[17:51:11] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:11] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:11] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:11] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:11] [CLEANUP] ========================================
[17:51:11] [CLEANUP] Cleaning up all agent connections and views
[17:51:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:11] [CLEANUP] Stopped and removed 0 video connections
[17:51:11] [CLEANUP] Removed 0 video views
[17:51:11] [CLEANUP] Removed 0 feed scroll views
[17:51:11] [CLEANUP] Removed 0 status labels
[17:51:11] [CLEANUP] Reset agent query state
[17:51:11] [CLEANUP] Updated page indicator
[17:51:11] [CLEANUP] Rebuilt video layout
[17:51:11] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:11] [CLEANUP] ========================================
[17:51:11] [SERVER] Starting reconnect polling (5s interval)
[17:51:11] [CLEANUP] ========================================
[17:51:11] [CLEANUP] Cleaning up all agent connections and views
[17:51:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:11] [CLEANUP] Stopped and removed 0 video connections
[17:51:11] [CLEANUP] Removed 0 video views
[17:51:11] [CLEANUP] Removed 0 feed scroll views
[17:51:11] [CLEANUP] Removed 0 status labels
[17:51:11] [CLEANUP] Reset agent query state
[17:51:11] [CLEANUP] Updated page indicator
[17:51:11] [CLEANUP] Rebuilt video layout
[17:51:11] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:11] [CLEANUP] ========================================
[17:51:11] [SERVER] Starting reconnect polling (5s interval)
[17:51:12] [CAMERA] Switched to continuous autofocus, lens position: 0.65098035
[17:51:13] [HAPTIC] triggerHapticFeedback called - mode: photo, isRecording: false
[17:51:13] [HAPTIC] Triggering peek haptic for photo
[17:51:13] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:13] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:13] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:13] HELLO → sent (cached token, role=query)
[17:51:13] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:13] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:13] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:13] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:13] [CLEANUP] ========================================
[17:51:13] [CLEANUP] Cleaning up all agent connections and views
[17:51:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:13] [CLEANUP] Stopped and removed 0 video connections
[17:51:13] [CLEANUP] Removed 0 video views
[17:51:13] [CLEANUP] Removed 0 feed scroll views
[17:51:13] [CLEANUP] Removed 0 status labels
[17:51:13] [CLEANUP] Reset agent query state
[17:51:13] [CLEANUP] Updated page indicator
[17:51:13] [CLEANUP] Rebuilt video layout
[17:51:13] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:13] [CLEANUP] ========================================
[17:51:13] [SERVER] Starting reconnect polling (5s interval)
[17:51:13] [CLEANUP] ========================================
[17:51:13] [CLEANUP] Cleaning up all agent connections and views
[17:51:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:13] [CLEANUP] Stopped and removed 0 video connections
[17:51:13] [CLEANUP] Removed 0 video views
[17:51:13] [CLEANUP] Removed 0 feed scroll views
[17:51:13] [CLEANUP] Removed 0 status labels
[17:51:13] [CLEANUP] Reset agent query state
[17:51:13] [CLEANUP] Updated page indicator
[17:51:13] [CLEANUP] Rebuilt video layout
[17:51:13] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:13] [CLEANUP] ========================================
[17:51:13] [SERVER] Starting reconnect polling (5s interval)
[17:51:13] [VOLUME] Stopping volume button monitoring
[17:51:13] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[17:51:13] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[17:51:13] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[17:51:13] [GALLERY_DB] Raw datesent for msg 18380: '2026-01-21 10:30:35'
[17:51:13] [GALLERY_DB] ✅ Loaded 475 media messages
[17:51:13] [GALLERY] Filtered 475 -> 436 (only with local thumbnails)
[17:51:13] [GALLERY] First 5 after sort (newest first):
[17:51:13] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[17:51:13] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[17:51:13] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[17:51:13] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[17:51:13] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[17:51:15] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:15] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:15] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:15] HELLO → sent (cached token, role=query)
[17:51:15] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:15] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:15] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:15] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:15] [CLEANUP] ========================================
[17:51:15] [CLEANUP] Cleaning up all agent connections and views
[17:51:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:15] [CLEANUP] Stopped and removed 0 video connections
[17:51:15] [CLEANUP] Removed 0 video views
[17:51:15] [CLEANUP] Removed 0 feed scroll views
[17:51:15] [CLEANUP] Removed 0 status labels
[17:51:15] [CLEANUP] Reset agent query state
[17:51:15] [CLEANUP] Updated page indicator
[17:51:15] [CLEANUP] Rebuilt video layout
[17:51:15] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:15] [CLEANUP] ========================================
[17:51:15] [SERVER] Starting reconnect polling (5s interval)
[17:51:15] [CLEANUP] ========================================
[17:51:15] [CLEANUP] Cleaning up all agent connections and views
[17:51:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:15] [CLEANUP] Stopped and removed 0 video connections
[17:51:15] [CLEANUP] Removed 0 video views
[17:51:15] [CLEANUP] Removed 0 feed scroll views
[17:51:15] [CLEANUP] Removed 0 status labels
[17:51:15] [CLEANUP] Reset agent query state
[17:51:15] [CLEANUP] Updated page indicator
[17:51:15] [CLEANUP] Rebuilt video layout
[17:51:15] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:15] [CLEANUP] ========================================
[17:51:15] [SERVER] Starting reconnect polling (5s interval)
[17:51:16] Chosen timer = 0
[17:51:16] [MEDIA_SEND] ========== NEW UPLOAD ==========
[17:51:16] [MEDIA_SEND] onSend called
[17:51:16] [MEDIA_SEND] Source URL: /private/var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/tmp/52C3E3CB-5E34-4677-919E-8FD153485066.jpg
[17:51:16] [MEDIA_SEND] Source file exists: true
[17:51:16] [MEDIA_SEND] Original filename: 52C3E3CB-5E34-4677-919E-8FD153485066.jpg
[17:51:16] [MEDIA_SEND] Random filename: f36a462089f1685a.jpg
[17:51:16] [MEDIA_SEND] File extension: jpg
[17:51:16] [MEDIA_SEND] Local media path: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents/MediaCache/f36a462089f1685a.jpg
[17:51:16] [MEDIA_SEND] Local thumbnail path: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents/MediaCache/t_f36a462089f1685a.jpg
[17:51:16] [MEDIA_SEND] Source file size: 491178 bytes (0.47 MB)
[17:51:16] [MEDIA_SEND] Copying file (<100MB)
[17:51:16] [MEDIA_SEND] File copied successfully
[17:51:16] [MEDIA_SEND] Destination file exists: true
[17:51:16] [MEDIA_SEND] Destination file size: 491178 bytes
[17:51:16] [MEDIA_SEND] Creating thumbnail...
[17:51:16] [MEDIA_SEND] Thumbnail created in 0.01s
[17:51:16] [MEDIA_SEND] Thumbnail dimensions: (225.0, 400.0)
[17:51:16] [MEDIA_SEND] Thumbnail exists: true
[17:51:16] [MEDIA_SEND] Thumbnail file size: 23553 bytes
[17:51:16] [MEDIA_SEND] Sending message to server...
[17:51:16] [MEDIA_SEND] Caption: ''
[17:51:16] [MEDIA_SEND] Timer: 0
[17:51:16] [MEDIA_SEND] Filename: f36a462089f1685a.jpg
[17:51:16] [MEDIA_FLOW] ⚠️ Message sent BEFORE upload starts - if app dies now, file won't be uploaded!
[17:51:16] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[17:51:16] [MEDIA_SEND] 📤 Creating media message: id=-6, file=f36a462089f1685a.jpg, isGiphy=false, upload_status=1 (pending)
[17:51:16] [MEDIA_SEND] 💾 Inserted to DB with upload_status=1
[17:51:16] [SEND_MESSAGE] ✅ Added optimistic message id=-6 to arrays, newMsgCount=51
[17:51:16] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-6, 18427, 18426, 18425, 18424]
[17:51:16] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[17:51:16] [CELL_UPLOAD] configure: msgId=-6, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=1
[17:51:16] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=1 → pending
[17:51:16] [CELL_UPLOAD] setUploadStatus(pending, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[17:51:16] [CELL_UPLOAD] → pending: overlay.isHidden=false, alpha=1.0
[17:51:16] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[17:51:16] [MEDIA_SEND] sendMessage API call completed
[17:51:16] [MEDIA_SEND] Starting THUMBNAIL upload: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_ENQUEUE] 📥 ========== ENQUEUE UPLOAD ==========
[17:51:16] [UPLOAD_ENQUEUE] 📥 File: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_ENQUEUE] 📥 Local path: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents/MediaCache/t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_ENQUEUE] 📥 Session: ILUIWU
[17:51:16] [UPLOAD_ENQUEUE] 📥 File exists: true, size: 0.0 MB
[17:51:16] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[17:51:16] [GALLERY_DB] Raw datesent for msg -6: '2026-01-21 16:51:16'
[17:51:16] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[17:51:16] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[17:51:16] [UPLOAD_QUEUE] Enqueued upload id=621 for t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_DEBUG] ========== START UPLOAD ==========
[17:51:16] [UPLOAD_DEBUG] Item ID: 621
[17:51:16] [UPLOAD_DEBUG] Local URL: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents/MediaCache/t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_DEBUG] Random filename: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_DEBUG] Session ID: ILUIWU
[17:51:16] [UPLOAD_DEBUG] API Base: https://crivello.dyndns.org:443/WebRTC/chat/
[17:51:16] [UPLOAD_DEBUG] Retry count: 0
[17:51:16] [UPLOAD_NOTIFY] 📣 Posting notification: file=t_f36a462089f1685a.jpg, status=uploading (2), progress=0.0%
[17:51:16] [UPLOAD_DEBUG] File exists: true
[17:51:16] [UPLOAD_DEBUG] File size: 23553 bytes (0.0 MB)
[17:51:16] [UPLOAD_DEBUG] Chunked threshold: 104857600 bytes (100 MB)
[17:51:16] [UPLOAD_DEBUG] → Using STANDARD upload (file <= threshold)
[17:51:16] [UPLOAD_DEBUG] --- startStandardUpload ---
[17:51:16] [UPLOAD_DEBUG] Upload URL: https://crivello.dyndns.org:443/WebRTC/chat/upload_media.php
[17:51:16] [UPLOAD_DEBUG] File extension: jpg, MIME type: image/jpeg
[17:51:16] [UPLOAD_DEBUG] Temp file URL: /private/var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/tmp/7FC3677B-D7A9-40B6-BCE6-02334E39CBAE.upload
[17:51:16] [UPLOAD_DEBUG] File size: 23553 bytes, in-memory threshold: 10485760 bytes
[17:51:16] [UPLOAD_DEBUG] Creating multipart body (in-memory mode)...
[17:51:16] [UPLOAD_DEBUG] ✓ In-memory body written to temp file (24035 bytes)
[17:51:16] [UPLOAD_DEBUG] Creating background upload task...
[17:51:16] [UPLOAD_DEBUG] Task created with identifier: 1
[17:51:16] [UPLOAD_DEBUG] Added to activeUploads dictionary
[17:51:16] [UPLOAD_DEBUG] Updated DB status to 'uploading'
[17:51:16] [UPLOAD_LIFECYCLE] 🚀 STARTED | task=1 | file=t_f36a462089f1685a.jpg | size=0.0MB | retries=0
[17:51:16] [UPLOAD_DEBUG] ✓ Task resumed - upload should be in progress now
[17:51:16] [UPLOAD_DEBUG] ========== UPLOAD STARTED ==========
[17:51:16] [GALLERY_DB] ✅ Loaded 476 media messages
[17:51:16] [UPLOAD_PROGRESS] t_f36a462089f1685a.jpg: 100% (0.0/0.0 MB) task=1
[17:51:16] [UPLOAD_NOTIFY] 📣 Posting notification: file=t_f36a462089f1685a.jpg, status=uploading (2), progress=100.0%
[17:51:16] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18428,"session_id":"ILUIWU","message_type":1,"file_name":"f36a462089f1685a.jpg","datesent_utc":"2026-01-21 16:51:16"}
[17:51:16] [CHAT] receive_message.php JSON: ["message_id": 18428, "session_id": ILUIWU, "file_name": f36a462089f1685a.jpg, "datesent_utc": 2026-01-21 16:51:16, "message_type": 1, "ok": 1]
[17:51:16] [DB_UPGRADE] Upgrading message ID: -6 → 18428, preserveOriginalDate=false
[17:51:16] [DB_UPGRADE] ✅ Upgraded -6 → 18428 with send_status=0, 1 row(s) affected
[17:51:16] [GALLERY] Filtered 476 -> 437 (only with local thumbnails)
[17:51:16] [GALLERY] First 5 after sort (newest first):
[17:51:16] [GALLERY] 0: id=-6, date=2026-01-21 16:51:16, file=f36a462089f1685a.jpg
[17:51:16] [GALLERY] 1: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[17:51:16] [GALLERY] 2: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[17:51:16] [GALLERY] 3: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[17:51:16] [GALLERY] 4: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[17:51:16] [UPLOAD_STATUS] 📬 Received notification: file=t_f36a462089f1685a.jpg, status=2 (uploading)
[17:51:16] [UPLOAD_STATUS] ⚠️ File not found in memory arrays: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_STATUS] 💾 Updating DB: file=t_f36a462089f1685a.jpg, status=2 (uploading)
[17:51:16] [UPLOAD_STATUS] ⚠️ DB update: 0 rows affected - file=t_f36a462089f1685a.jpg not found in local_messages
[17:51:16] [UPLOAD_STATUS] 📬 Received notification: file=t_f36a462089f1685a.jpg, status=2 (uploading)
[17:51:16] [UPLOAD_STATUS] ⚠️ File not found in memory arrays: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_STATUS] 💾 Updating DB: file=t_f36a462089f1685a.jpg, status=2 (uploading)
[17:51:16] [UPLOAD_STATUS] ⚠️ DB update: 0 rows affected - file=t_f36a462089f1685a.jpg not found in local_messages
[17:51:16] [CLIENT_SIG] Event received: type=0 messageId=18428
[17:51:16] [WS_EVENT] Received event: type=0, messageId=18428
[17:51:16] [WS_EVENT] 📨 New message notification (msgId=18428) - triggering incremental refresh, currentMsgCount=51
[17:51:16] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[17:51:16] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18428
[17:51:16] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -6 → 18428
[17:51:16] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -6 → 18428
[17:51:16] ReloadData 9
[17:51:16] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=1
[17:51:16] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=1 → pending
[17:51:16] [CELL_UPLOAD] setUploadStatus(pending, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[17:51:16] [CELL_UPLOAD] → pending: overlay.isHidden=false, alpha=1.0
[17:51:16] [INCREMENTAL_SYNC] ✅ No new messages
[17:51:16] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[17:51:16] [UPLOAD_RESPONSE] Started receiving response for task 1
[17:51:16] [UPLOAD_METRICS] Task 1 metrics:
[17:51:16] [UPLOAD_METRICS] Total time: 0.29s
[17:51:16] [UPLOAD_METRICS] Upload time: 0.00s
[17:51:16] [UPLOAD_METRICS] Response time: 0.00s
[17:51:16] [UPLOAD_METRICS] Network protocol: http/1.1
[17:51:16] [UPLOAD_METRICS] Proxy: no
[17:51:16] [UPLOAD_METRICS] Reused connection: no
[17:51:16] [UPLOAD_COMPLETE] ========== Task Completed ==========
[17:51:16] [UPLOAD_COMPLETE] Task ID: 1
[17:51:16] [UPLOAD_COMPLETE] Task state: 3 (0=running, 1=suspended, 2=canceling, 3=completed)
[17:51:16] [UPLOAD_COMPLETE] Filename: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_COMPLETE] Local path: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents/MediaCache/t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_COMPLETE] Retry count: 0
[17:51:16] [UPLOAD_COMPLETE] HTTP Status: 200
[17:51:16] [UPLOAD_COMPLETE] Response headers: [AnyHashable("Content-Type"): application/json, AnyHashable("Date"): Wed, 21 Jan 2026 16:51:16 GMT, AnyHashable("Content-Length"): 217, AnyHashable("Server"): Apache/2.4.65 (Debian), AnyHashable("Connection"): Keep-Alive, AnyHashable("Keep-Alive"): timeout=5, max=100]
[17:51:16] [UPLOAD_COMPLETE] Response body (217 bytes): {"ok":true,"file_name":"t_f36a462089f1685a.jpg","orig_name":"t_f36a462089f1685a.jpg","size":23553,"env":{"file_uploads":"1","upload_max_filesize":"5G","post_max_size":"10G","upload_tmp_dir":"","content_length":24035}}
[17:51:16] [UPLOAD_COMPLETE] ✅ Server confirmed upload OK
[17:51:16] [UPLOAD_COMPLETE] Server filename: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_VERIFY] Verifying file exists: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_VERIFY] ✅ File verified: t_f36a462089f1685a.jpg (size: 23553)
[17:51:16] [UPLOAD_LIFECYCLE] ✅ COMPLETED | file=t_f36a462089f1685a.jpg | id=621 | retries=0
[17:51:16] [UPLOAD_COMPLETE] ✅ ========== UPLOAD COMPLETED ==========
[17:51:16] [UPLOAD_COMPLETE] ✅ File: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_COMPLETE] ✅ Queue ID: 621
[17:51:16] [UPLOAD_COMPLETE] ✅ Session: ILUIWU
[17:51:16] [UPLOAD_COMPLETE] ✅ Server filename: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_COMPLETE] ✅ Posting .complete status notification
[17:51:16] [UPLOAD_NOTIFY] 📣 Posting notification: file=t_f36a462089f1685a.jpg, status=complete (0), progress=0.0%
[17:51:16] [UPLOAD_STATUS] 📬 Received notification: file=t_f36a462089f1685a.jpg, status=0 (complete)
[17:51:16] [UPLOAD_STATUS] ⚠️ File not found in memory arrays: t_f36a462089f1685a.jpg
[17:51:16] [UPLOAD_STATUS] 💾 Updating DB: file=t_f36a462089f1685a.jpg, status=0 (complete)
[17:51:16] [UPLOAD_STATUS] ⚠️ DB update: 0 rows affected - file=t_f36a462089f1685a.jpg not found in local_messages
[17:51:16] [UPLOAD_COMPLETE] ✅ Upload queue DB updated to 'completed' for id=621
[17:51:16] [MEDIA_SEND] Thumbnail uploaded successfully in 0.33s
[17:51:16] [MEDIA_SEND] Thumbnail server filename: t_f36a462089f1685a.jpg
[17:51:16] [MEDIA_SEND] Starting MAIN FILE upload: f36a462089f1685a.jpg
[17:51:16] [UPLOAD_ENQUEUE] 📥 ========== ENQUEUE UPLOAD ==========
[17:51:16] [UPLOAD_ENQUEUE] 📥 File: f36a462089f1685a.jpg
[17:51:16] [UPLOAD_ENQUEUE] 📥 Local path: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents/MediaCache/f36a462089f1685a.jpg
[17:51:16] [UPLOAD_ENQUEUE] 📥 Session: ILUIWU
[17:51:16] [UPLOAD_ENQUEUE] 📥 File exists: true, size: 0.5 MB
[17:51:16] [UPLOAD_QUEUE] Enqueued upload id=622 for f36a462089f1685a.jpg
[17:51:16] [UPLOAD_DEBUG] ========== START UPLOAD ==========
[17:51:16] [UPLOAD_DEBUG] Item ID: 622
[17:51:16] [UPLOAD_DEBUG] Local URL: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents/MediaCache/f36a462089f1685a.jpg
[17:51:16] [UPLOAD_DEBUG] Random filename: f36a462089f1685a.jpg
[17:51:16] [UPLOAD_DEBUG] Session ID: ILUIWU
[17:51:16] [UPLOAD_DEBUG] API Base: https://crivello.dyndns.org:443/WebRTC/chat/
[17:51:16] [UPLOAD_DEBUG] Retry count: 0
[17:51:16] [UPLOAD_NOTIFY] 📣 Posting notification: file=f36a462089f1685a.jpg, status=uploading (2), progress=0.0%
[17:51:16] [UPLOAD_STATUS] 📬 Received notification: file=f36a462089f1685a.jpg, status=2 (uploading)
[17:51:16] [UPLOAD_STATUS] 📝 Updated allMessagesWithReadBy[0]: 1 → 2
[17:51:16] [UPLOAD_DEBUG] File exists: true
[17:51:16] [UPLOAD_STATUS] 📝 Updated chatMessages[0]: status=2
[17:51:16] [UPLOAD_STATUS] 💾 Updating DB: file=f36a462089f1685a.jpg, status=2 (uploading)
[17:51:16] [UPLOAD_DEBUG] File size: 491178 bytes (0.5 MB)
[17:51:16] [UPLOAD_DEBUG] Chunked threshold: 104857600 bytes (100 MB)
[17:51:16] [UPLOAD_DEBUG] → Using STANDARD upload (file <= threshold)
[17:51:16] [UPLOAD_DEBUG] --- startStandardUpload ---
[17:51:16] [UPLOAD_DEBUG] Upload URL: https://crivello.dyndns.org:443/WebRTC/chat/upload_media.php
[17:51:16] [UPLOAD_DEBUG] File extension: jpg, MIME type: image/jpeg
[17:51:16] [UPLOAD_DEBUG] Temp file URL: /private/var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/tmp/96FDF885-A9B7-413F-B1CF-BA676A397C15.upload
[17:51:16] [UPLOAD_DEBUG] File size: 491178 bytes, in-memory threshold: 10485760 bytes
[17:51:16] [UPLOAD_DEBUG] Creating multipart body (in-memory mode)...
[17:51:16] [UPLOAD_STATUS] ✅ DB updated: 1 row(s) affected for file=f36a462089f1685a.jpg
[17:51:16] [CELL_UPLOAD] setUploadStatus(uploading, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[17:51:16] [CELL_UPLOAD] → uploading: circularProgress visible, overlay.isHidden=false
[17:51:16] [UPLOAD_DEBUG] ✓ In-memory body written to temp file (491654 bytes)
[17:51:16] [UPLOAD_DEBUG] Creating background upload task...
[17:51:16] [UPLOAD_DEBUG] Task created with identifier: 2
[17:51:16] [UPLOAD_DEBUG] Added to activeUploads dictionary
[17:51:16] [UPLOAD_DEBUG] Updated DB status to 'uploading'
[17:51:16] [UPLOAD_LIFECYCLE] 🚀 STARTED | task=2 | file=f36a462089f1685a.jpg | size=0.5MB | retries=0
[17:51:16] [UPLOAD_DEBUG] ✓ Task resumed - upload should be in progress now
[17:51:16] [UPLOAD_DEBUG] ========== UPLOAD STARTED ==========
[17:51:16] [UPLOAD_PROGRESS] f36a462089f1685a.jpg: 100% (0.5/0.5 MB) task=2
[17:51:16] [UPLOAD_NOTIFY] 📣 Posting notification: file=f36a462089f1685a.jpg, status=uploading (2), progress=100.0%
[17:51:16] [UPLOAD_STATUS] 📬 Received notification: file=f36a462089f1685a.jpg, status=2 (uploading)
[17:51:16] [UPLOAD_STATUS] 📝 Updated allMessagesWithReadBy[0]: 2 → 2
[17:51:16] [UPLOAD_STATUS] 📝 Updated chatMessages[0]: status=2
[17:51:16] [UPLOAD_STATUS] 💾 Updating DB: file=f36a462089f1685a.jpg, status=2 (uploading)
[17:51:16] [UPLOAD_STATUS] ✅ DB updated: 1 row(s) affected for file=f36a462089f1685a.jpg
[17:51:16] [MEDIA_SEND] Main upload progress: 100%
[17:51:16] [CELL_UPLOAD] setUploadStatus(uploading, progress=1.0) for file=f36a462089f1685a.jpg, overlayExists=true
[17:51:16] [CELL_UPLOAD] → uploading: circularProgress visible, overlay.isHidden=false
[17:51:16] [PROGRESS] Updated cell for f36a462089f1685a.jpg: 100%
[17:51:16] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:16] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:16] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:16] HELLO → sent (cached token, role=query)
[17:51:16] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:16] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:16] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:16] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:16] [CLEANUP] ========================================
[17:51:16] [CLEANUP] Cleaning up all agent connections and views
[17:51:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:16] [CLEANUP] Stopped and removed 0 video connections
[17:51:16] [CLEANUP] Removed 0 video views
[17:51:16] [CLEANUP] Removed 0 feed scroll views
[17:51:16] [CLEANUP] Removed 0 status labels
[17:51:16] [CLEANUP] Reset agent query state
[17:51:16] [CLEANUP] Updated page indicator
[17:51:16] [CLEANUP] Rebuilt video layout
[17:51:16] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:16] [CLEANUP] ========================================
[17:51:16] [SERVER] Starting reconnect polling (5s interval)
[17:51:16] [CLEANUP] ========================================
[17:51:16] [CLEANUP] Cleaning up all agent connections and views
[17:51:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:16] [CLEANUP] Stopped and removed 0 video connections
[17:51:16] [CLEANUP] Removed 0 video views
[17:51:16] [CLEANUP] Removed 0 feed scroll views
[17:51:16] [CLEANUP] Removed 0 status labels
[17:51:16] [CLEANUP] Reset agent query state
[17:51:16] [CLEANUP] Updated page indicator
[17:51:16] [CLEANUP] Rebuilt video layout
[17:51:16] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:16] [CLEANUP] ========================================
[17:51:16] [SERVER] Starting reconnect polling (5s interval)
[17:51:17] [UPLOAD_RESPONSE] Started receiving response for task 2
[17:51:17] [UPLOAD_METRICS] Task 2 metrics:
[17:51:17] [UPLOAD_METRICS] Total time: 1.30s
[17:51:17] [UPLOAD_METRICS] Upload time: 0.43s
[17:51:17] [UPLOAD_METRICS] Response time: 0.00s
[17:51:17] [UPLOAD_METRICS] Network protocol: http/1.1
[17:51:17] [UPLOAD_METRICS] Proxy: no
[17:51:17] [UPLOAD_METRICS] Reused connection: yes
[17:51:17] [UPLOAD_COMPLETE] ========== Task Completed ==========
[17:51:17] [UPLOAD_COMPLETE] Task ID: 2
[17:51:17] [UPLOAD_COMPLETE] Task state: 3 (0=running, 1=suspended, 2=canceling, 3=completed)
[17:51:17] [UPLOAD_COMPLETE] Filename: f36a462089f1685a.jpg
[17:51:17] [UPLOAD_COMPLETE] Local path: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents/MediaCache/f36a462089f1685a.jpg
[17:51:17] [UPLOAD_COMPLETE] Retry count: 0
[17:51:17] [UPLOAD_COMPLETE] HTTP Status: 200
[17:51:17] [UPLOAD_COMPLETE] Response headers: [AnyHashable("Keep-Alive"): timeout=5, max=99, AnyHashable("Connection"): Keep-Alive, AnyHashable("Content-Type"): application/json, AnyHashable("Content-Length"): 215, AnyHashable("Date"): Wed, 21 Jan 2026 16:51:16 GMT, AnyHashable("Server"): Apache/2.4.65 (Debian)]
[17:51:17] [UPLOAD_COMPLETE] Response body (215 bytes): {"ok":true,"file_name":"f36a462089f1685a.jpg","orig_name":"f36a462089f1685a.jpg","size":491178,"env":{"file_uploads":"1","upload_max_filesize":"5G","post_max_size":"10G","upload_tmp_dir":"","content_length":491654}}
[17:51:17] [UPLOAD_COMPLETE] ✅ Server confirmed upload OK
[17:51:17] [UPLOAD_COMPLETE] Server filename: f36a462089f1685a.jpg
[17:51:17] [UPLOAD_VERIFY] Verifying file exists: f36a462089f1685a.jpg
[17:51:17] [UPLOAD_VERIFY] ✅ File verified: f36a462089f1685a.jpg (size: 491178)
[17:51:17] [UPLOAD_LIFECYCLE] ✅ COMPLETED | file=f36a462089f1685a.jpg | id=622 | retries=0
[17:51:17] [UPLOAD_COMPLETE] ✅ ========== UPLOAD COMPLETED ==========
[17:51:17] [UPLOAD_COMPLETE] ✅ File: f36a462089f1685a.jpg
[17:51:17] [UPLOAD_COMPLETE] ✅ Queue ID: 622
[17:51:17] [UPLOAD_COMPLETE] ✅ Session: ILUIWU
[17:51:17] [UPLOAD_COMPLETE] ✅ Server filename: f36a462089f1685a.jpg
[17:51:17] [UPLOAD_COMPLETE] ✅ Posting .complete status notification
[17:51:17] [UPLOAD_NOTIFY] 📣 Posting notification: file=f36a462089f1685a.jpg, status=complete (0), progress=0.0%
[17:51:17] [UPLOAD_STATUS] 📬 Received notification: file=f36a462089f1685a.jpg, status=0 (complete)
[17:51:17] [UPLOAD_STATUS] 📝 Updated allMessagesWithReadBy[0]: 2 → 0
[17:51:17] [UPLOAD_STATUS] 📝 Updated chatMessages[0]: status=0
[17:51:17] [UPLOAD_STATUS] 💾 Updating DB: file=f36a462089f1685a.jpg, status=0 (complete)
[17:51:17] [UPLOAD_COMPLETE] ✅ Upload queue DB updated to 'completed' for id=622
[17:51:17] [UPLOAD_STATUS] ✅ DB updated: 1 row(s) affected for file=f36a462089f1685a.jpg
[17:51:17] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[17:51:17] [MEDIA_SEND] MAIN FILE UPLOADED SUCCESSFULLY
[17:51:17] [MEDIA_SEND] Server filename: f36a462089f1685a.jpg
[17:51:17] [MEDIA_SEND] Main upload duration: 1.34s
[17:51:17] [MEDIA_SEND] Total upload duration: 1.68s
[17:51:17] [MEDIA_SEND] ========== UPLOAD COMPLETE ==========
[17:51:17] [PROGRESS] Updated cell for f36a462089f1685a.jpg: 100%
[17:51:18] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:18] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:18] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:18] HELLO → sent (cached token, role=query)
[17:51:18] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:18] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:18] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:18] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:18] [CLEANUP] ========================================
[17:51:18] [CLEANUP] Cleaning up all agent connections and views
[17:51:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:18] [CLEANUP] Stopped and removed 0 video connections
[17:51:18] [CLEANUP] Removed 0 video views
[17:51:18] [CLEANUP] Removed 0 feed scroll views
[17:51:18] [CLEANUP] Removed 0 status labels
[17:51:18] [CLEANUP] Reset agent query state
[17:51:18] [CLEANUP] Updated page indicator
[17:51:18] [CLEANUP] Rebuilt video layout
[17:51:18] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:18] [CLEANUP] ========================================
[17:51:18] [SERVER] Starting reconnect polling (5s interval)
[17:51:18] [CLEANUP] ========================================
[17:51:18] [CLEANUP] Cleaning up all agent connections and views
[17:51:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:18] [CLEANUP] Stopped and removed 0 video connections
[17:51:18] [CLEANUP] Removed 0 video views
[17:51:18] [CLEANUP] Removed 0 feed scroll views
[17:51:18] [CLEANUP] Removed 0 status labels
[17:51:18] [CLEANUP] Reset agent query state
[17:51:18] [CLEANUP] Updated page indicator
[17:51:18] [CLEANUP] Rebuilt video layout
[17:51:18] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:18] [CLEANUP] ========================================
[17:51:18] [SERVER] Starting reconnect polling (5s interval)
[17:51:20] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:20] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:20] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:20] HELLO → sent (cached token, role=query)
[17:51:20] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:20] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:20] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:20] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:20] [CLEANUP] ========================================
[17:51:20] [CLEANUP] Cleaning up all agent connections and views
[17:51:20] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:20] [CLEANUP] Stopped and removed 0 video connections
[17:51:20] [CLEANUP] Removed 0 video views
[17:51:20] [CLEANUP] Removed 0 feed scroll views
[17:51:20] [CLEANUP] Removed 0 status labels
[17:51:20] [CLEANUP] Reset agent query state
[17:51:20] [CLEANUP] Updated page indicator
[17:51:20] [CLEANUP] Rebuilt video layout
[17:51:20] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:20] [CLEANUP] ========================================
[17:51:20] [SERVER] Starting reconnect polling (5s interval)
[17:51:20] [CLEANUP] ========================================
[17:51:20] [CLEANUP] Cleaning up all agent connections and views
[17:51:20] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:20] [CLEANUP] Stopped and removed 0 video connections
[17:51:20] [CLEANUP] Removed 0 video views
[17:51:20] [CLEANUP] Removed 0 feed scroll views
[17:51:20] [CLEANUP] Removed 0 status labels
[17:51:20] [CLEANUP] Reset agent query state
[17:51:20] [CLEANUP] Updated page indicator
[17:51:20] [CLEANUP] Rebuilt video layout
[17:51:20] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:20] [CLEANUP] ========================================
[17:51:20] [SERVER] Starting reconnect polling (5s interval)
[17:51:21] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:21] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:21] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:21] HELLO → sent (cached token, role=query)
[17:51:21] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:21] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:21] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:21] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:21] [CLEANUP] ========================================
[17:51:21] [CLEANUP] Cleaning up all agent connections and views
[17:51:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:21] [CLEANUP] Stopped and removed 0 video connections
[17:51:21] [CLEANUP] Removed 0 video views
[17:51:21] [CLEANUP] Removed 0 feed scroll views
[17:51:21] [CLEANUP] Removed 0 status labels
[17:51:21] [CLEANUP] Reset agent query state
[17:51:21] [CLEANUP] Updated page indicator
[17:51:21] [CLEANUP] Rebuilt video layout
[17:51:21] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:21] [CLEANUP] ========================================
[17:51:21] [SERVER] Starting reconnect polling (5s interval)
[17:51:21] [CLEANUP] ========================================
[17:51:21] [CLEANUP] Cleaning up all agent connections and views
[17:51:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:21] [CLEANUP] Stopped and removed 0 video connections
[17:51:21] [CLEANUP] Removed 0 video views
[17:51:21] [CLEANUP] Removed 0 feed scroll views
[17:51:21] [CLEANUP] Removed 0 status labels
[17:51:21] [CLEANUP] Reset agent query state
[17:51:21] [CLEANUP] Updated page indicator
[17:51:21] [CLEANUP] Rebuilt video layout
[17:51:21] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:21] [CLEANUP] ========================================
[17:51:21] [SERVER] Starting reconnect polling (5s interval)
[17:51:23] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:23] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:23] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:23] HELLO → sent (cached token, role=query)
[17:51:23] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:23] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:23] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:23] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:23] [CLEANUP] ========================================
[17:51:23] [CLEANUP] Cleaning up all agent connections and views
[17:51:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:23] [CLEANUP] Stopped and removed 0 video connections
[17:51:23] [CLEANUP] Removed 0 video views
[17:51:23] [CLEANUP] Removed 0 feed scroll views
[17:51:23] [CLEANUP] Removed 0 status labels
[17:51:23] [CLEANUP] Reset agent query state
[17:51:23] [CLEANUP] Updated page indicator
[17:51:23] [CLEANUP] Rebuilt video layout
[17:51:23] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:23] [CLEANUP] ========================================
[17:51:23] [SERVER] Starting reconnect polling (5s interval)
[17:51:23] [CLEANUP] ========================================
[17:51:23] [CLEANUP] Cleaning up all agent connections and views
[17:51:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:23] [CLEANUP] Stopped and removed 0 video connections
[17:51:23] [CLEANUP] Removed 0 video views
[17:51:23] [CLEANUP] Removed 0 feed scroll views
[17:51:23] [CLEANUP] Removed 0 status labels
[17:51:23] [CLEANUP] Reset agent query state
[17:51:23] [CLEANUP] Updated page indicator
[17:51:23] [CLEANUP] Rebuilt video layout
[17:51:23] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:23] [CLEANUP] ========================================
[17:51:23] [SERVER] Starting reconnect polling (5s interval)
[17:51:25] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:25] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:25] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:25] HELLO → sent (cached token, role=query)
[17:51:25] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:25] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:25] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:25] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:25] [CLEANUP] ========================================
[17:51:25] [CLEANUP] Cleaning up all agent connections and views
[17:51:25] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:25] [CLEANUP] Stopped and removed 0 video connections
[17:51:25] [CLEANUP] Removed 0 video views
[17:51:25] [CLEANUP] Removed 0 feed scroll views
[17:51:25] [CLEANUP] Removed 0 status labels
[17:51:25] [CLEANUP] Reset agent query state
[17:51:25] [CLEANUP] Updated page indicator
[17:51:25] [CLEANUP] Rebuilt video layout
[17:51:25] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:25] [CLEANUP] ========================================
[17:51:25] [SERVER] Starting reconnect polling (5s interval)
[17:51:25] [CLEANUP] ========================================
[17:51:25] [CLEANUP] Cleaning up all agent connections and views
[17:51:25] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:25] [CLEANUP] Stopped and removed 0 video connections
[17:51:25] [CLEANUP] Removed 0 video views
[17:51:25] [CLEANUP] Removed 0 feed scroll views
[17:51:25] [CLEANUP] Removed 0 status labels
[17:51:25] [CLEANUP] Reset agent query state
[17:51:25] [CLEANUP] Updated page indicator
[17:51:25] [CLEANUP] Rebuilt video layout
[17:51:25] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:25] [CLEANUP] ========================================
[17:51:25] [SERVER] Starting reconnect polling (5s interval)
[17:51:26] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:26] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:26] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:26] HELLO → sent (cached token, role=query)
[17:51:26] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:26] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:26] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:26] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:26] [CLEANUP] ========================================
[17:51:26] [CLEANUP] Cleaning up all agent connections and views
[17:51:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:26] [CLEANUP] Stopped and removed 0 video connections
[17:51:26] [CLEANUP] Removed 0 video views
[17:51:26] [CLEANUP] Removed 0 feed scroll views
[17:51:26] [CLEANUP] Removed 0 status labels
[17:51:26] [CLEANUP] Reset agent query state
[17:51:26] [CLEANUP] Updated page indicator
[17:51:26] [CLEANUP] Rebuilt video layout
[17:51:26] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:26] [CLEANUP] ========================================
[17:51:26] [SERVER] Starting reconnect polling (5s interval)
[17:51:26] [CLEANUP] ========================================
[17:51:26] [CLEANUP] Cleaning up all agent connections and views
[17:51:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:26] [CLEANUP] Stopped and removed 0 video connections
[17:51:26] [CLEANUP] Removed 0 video views
[17:51:26] [CLEANUP] Removed 0 feed scroll views
[17:51:26] [CLEANUP] Removed 0 status labels
[17:51:26] [CLEANUP] Reset agent query state
[17:51:26] [CLEANUP] Updated page indicator
[17:51:26] [CLEANUP] Rebuilt video layout
[17:51:26] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:26] [CLEANUP] ========================================
[17:51:26] [SERVER] Starting reconnect polling (5s interval)
[17:51:28] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:28] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:28] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:28] HELLO → sent (cached token, role=query)
[17:51:28] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:28] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:28] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:28] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:28] [CLEANUP] ========================================
[17:51:28] [CLEANUP] Cleaning up all agent connections and views
[17:51:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:28] [CLEANUP] Stopped and removed 0 video connections
[17:51:28] [CLEANUP] Removed 0 video views
[17:51:28] [CLEANUP] Removed 0 feed scroll views
[17:51:28] [CLEANUP] Removed 0 status labels
[17:51:28] [CLEANUP] Reset agent query state
[17:51:28] [CLEANUP] Updated page indicator
[17:51:28] [CLEANUP] Rebuilt video layout
[17:51:28] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:28] [CLEANUP] ========================================
[17:51:28] [SERVER] Starting reconnect polling (5s interval)
[17:51:28] [CLEANUP] ========================================
[17:51:28] [CLEANUP] Cleaning up all agent connections and views
[17:51:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:28] [CLEANUP] Stopped and removed 0 video connections
[17:51:28] [CLEANUP] Removed 0 video views
[17:51:28] [CLEANUP] Removed 0 feed scroll views
[17:51:28] [CLEANUP] Removed 0 status labels
[17:51:28] [CLEANUP] Reset agent query state
[17:51:28] [CLEANUP] Updated page indicator
[17:51:28] [CLEANUP] Rebuilt video layout
[17:51:28] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:28] [CLEANUP] ========================================
[17:51:28] [SERVER] Starting reconnect polling (5s interval)
[17:51:29] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:29] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:30] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:30] HELLO → sent (cached token, role=query)
[17:51:30] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:30] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:30] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:30] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:30] [CLEANUP] ========================================
[17:51:30] [CLEANUP] Cleaning up all agent connections and views
[17:51:30] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:30] [CLEANUP] Stopped and removed 0 video connections
[17:51:30] [CLEANUP] Removed 0 video views
[17:51:30] [CLEANUP] Removed 0 feed scroll views
[17:51:30] [CLEANUP] Removed 0 status labels
[17:51:30] [CLEANUP] Reset agent query state
[17:51:30] [CLEANUP] Updated page indicator
[17:51:30] [CLEANUP] Rebuilt video layout
[17:51:30] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:30] [CLEANUP] ========================================
[17:51:30] [SERVER] Starting reconnect polling (5s interval)
[17:51:30] [CLEANUP] ========================================
[17:51:30] [CLEANUP] Cleaning up all agent connections and views
[17:51:30] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:30] [CLEANUP] Stopped and removed 0 video connections
[17:51:30] [CLEANUP] Removed 0 video views
[17:51:30] [CLEANUP] Removed 0 feed scroll views
[17:51:30] [CLEANUP] Removed 0 status labels
[17:51:30] [CLEANUP] Reset agent query state
[17:51:30] [CLEANUP] Updated page indicator
[17:51:30] [CLEANUP] Rebuilt video layout
[17:51:30] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:30] [CLEANUP] ========================================
[17:51:30] [SERVER] Starting reconnect polling (5s interval)
[17:51:31] [LIFECYCLE] App resigning active - cleared crash flag
[17:51:31] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:31] [WS] Opening session at ws://crivello.dyndns.org:8081/
[17:51:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[17:51:31] HELLO → sent (cached token, role=query)
[17:51:31] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[17:51:31] [WS] Query connection failed - cleaning up all agent connections and views
[17:51:31] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[17:51:31] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[17:51:31] [CLEANUP] ========================================
[17:51:31] [CLEANUP] Cleaning up all agent connections and views
[17:51:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:31] [CLEANUP] Stopped and removed 0 video connections
[17:51:31] [CLEANUP] Removed 0 video views
[17:51:31] [CLEANUP] Removed 0 feed scroll views
[17:51:31] [CLEANUP] Removed 0 status labels
[17:51:31] [CLEANUP] Reset agent query state
[17:51:31] [CLEANUP] Updated page indicator
[17:51:31] [CLEANUP] Rebuilt video layout
[17:51:31] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:31] [CLEANUP] ========================================
[17:51:31] [SERVER] Starting reconnect polling (5s interval)
[17:51:31] [CLEANUP] ========================================
[17:51:31] [CLEANUP] Cleaning up all agent connections and views
[17:51:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[17:51:31] [CLEANUP] Stopped and removed 0 video connections
[17:51:31] [CLEANUP] Removed 0 video views
[17:51:31] [CLEANUP] Removed 0 feed scroll views
[17:51:31] [CLEANUP] Removed 0 status labels
[17:51:31] [CLEANUP] Reset agent query state
[17:51:31] [CLEANUP] Updated page indicator
[17:51:31] [CLEANUP] Rebuilt video layout
[17:51:31] [CLEANUP] ✅ All agent connections and views cleaned up
[17:51:31] [CLEANUP] ========================================
[17:51:31] [SERVER] Starting reconnect polling (5s interval)
[17:51:32] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[17:51:32] [SECURITY] Saved background timestamp
[17:51:32] [LIFECYCLE] App entering background - cleared crash flag
[17:51:32] [CLIENT_SIG] Disconnecting
[17:51:32] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[17:51:32] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[17:51:32] [WS] Canceling WebSocket for query connection to iosILUIWU
[17:51:32] In cleanupPeer
[17:51:32] In cleanupPeer
[17:51:32] [LIFECYCLE] WebRTC audio disabled
[17:51:32] [LIFECYCLE] AVAudioSession deactivated
[17:51:32] [LIFECYCLE] All connections stopped
[17:51:32] [CLIENT_SIG] WebSocket closed with code 1001
[17:51:32] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[17:51:32] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[17:51:32] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[17:51:32] [SERVER] Stopped reconnect polling
[17:51:32] [WS] URLSession invalidated successfully
[17:51:32] Will request stop of video 0
[17:51:32] Will request stop of video 0
[17:51:32] [PIP] Removing 0 tracks from PiP for connection 0
[17:51:32] [PIP] ✅ All tracks removed for connection 0
[17:51:32] [PIP] Removing 0 tracks from PiP for connection 0
[17:51:32] [PIP] ✅ All tracks removed for connection 0
[18:22:08] [CRASH] No crash detected
[18:22:08] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[18:22:08] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[18:22:08] [GIPHY] SDK not available - using REST API fallback
[18:22:08] [BACKGROUND] Background fetch enabled
[18:22:08] [SECURITY] Initial launch - timeout exceeded (1836.225112915039s > 300.0s)
[18:22:08] [AUTH] Starting PIN authentication
[18:22:08] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[18:22:08] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[18:22:08] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[18:22:08] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[18:22:08] [CLEANUP] No old timer messages to delete
[18:22:08] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[18:22:08] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[18:22:08] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[18:22:08] [CLIENT_SIG] WebSocket opened
[18:22:08] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[18:22:08] [USER] ✅ User registered successfully
[18:22:08] [PUSH] User registration after token update: success
[18:22:08] [CLIENT_SIG] Connected! clientId=DpRtqDxeOUpwShBF
[18:22:08] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[18:22:08] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[18:22:08] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18428)...
[18:22:08] [PRELOAD] No messages or parse error
[18:22:09] [PIN_AUTH] Correct PIN
[18:22:09] [SECURITY] Restored real session: ILUIWU
[18:22:09] [SECURITY] Restored real session: ILUIWU
[18:22:10] [SECURITY] Saved real session: ILUIWU
[18:22:10] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[18:22:10] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[18:22:10] Documents Directory: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents
[18:22:10] [THEME] Applying current theme
[18:22:10] [CHAT] Applied day theme (mode: day)
[18:22:10] [SECURITY] Saved real session: ILUIWU
[18:22:10] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[18:22:10] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[18:22:10] [NETWORK] Network monitor started
[18:22:10] [NETWORK] Status changed: connected
[18:22:10] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[18:22:10] Did transition
[18:22:10] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[18:22:10] [VIEWER] Screen lock enabled - normal idle behavior
[18:22:10] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[18:22:10] [VCC] ========== VideoConnectionClass INIT ==========
[18:22:10] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[18:22:10] [DATA AUDIO] ========== setupWebRTC() START ==========
[18:22:10] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[18:22:10] [DATA AUDIO] Creating encoder/decoder factories...
[18:22:10] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[18:22:10] [CODEC] Viewer selected encoder: AV1 (best quality)
[18:22:10] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[18:22:10] [DATA AUDIO] ✅ Factory created
[18:22:10] [DATA AUDIO] RTCAudioSession locked
[18:22:10] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[18:22:10] [DATA AUDIO] RTCAudioSession unlocked
[18:22:10] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[18:22:10] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[18:22:10] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[18:22:10] [WS] Opening session at ws://crivello.dyndns.org:8081/
[18:22:10] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[18:22:10] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[18:22:10] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[18:22:10] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[18:22:10] Did transition
[18:22:10] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[18:22:10] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[18:22:10] [CHUNK] Merged 868 reactions synchronously
[18:22:10] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[18:22:10] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[18:22:10] [MIGRATION] No messages need sender_name backfill
[18:22:10] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[18:22:10] [GALLERY_DB] Raw datesent for msg 18428: '2026-01-21 16:51:16'
[18:22:10] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[18:22:10] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[18:22:10] [USER] ✅ User registered successfully
[18:22:10] [USER] User registration successful
[18:22:10] [GALLERY_DB] ✅ Loaded 476 media messages
[18:22:10] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18428
[18:22:10] [INCREMENTAL_SYNC] ✅ No new messages
[18:22:10] [GALLERY] Filtered 476 -> 437 (only with local thumbnails)
[18:22:10] [GALLERY] First 5 after sort (newest first):
[18:22:10] [GALLERY] 0: id=18428, date=2026-01-21 16:51:16, file=f36a462089f1685a.jpg
[18:22:10] [GALLERY] 1: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[18:22:10] [GALLERY] 2: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[18:22:10] [GALLERY] 3: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[18:22:10] [GALLERY] 4: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[18:22:10] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[18:22:10] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18379, 18380, 18381, 18382, 18383]
[18:22:10] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[18:22:10] [CELL_UPLOAD] configure: msgId=18380, file=47f0a79ffd2469ec.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:22:10] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:22:10] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=47f0a79ffd2469ec.jpg, overlayExists=true
[18:22:10] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:22:10] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:22:10] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:22:10] [SERVER] Starting reconnect polling (5s interval)
[18:22:10] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[18:22:10] [ICONS] Offset applied: -14.6
[18:22:10] [ICONS] New left margin: 11.2, New right margin: 11.3
[18:22:10] [ICONS] Chat center: (31.2, 87.0)
[18:22:10] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[18:22:10] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[18:22:10] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[18:22:10] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[18:22:10] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[18:22:10] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[18:22:10] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[18:22:10] [ICONS] Screen width: 440.0
[18:22:10] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[18:22:10] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[18:22:10] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[18:22:10] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[18:22:10] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[18:22:10] [UNSENT_RETRY] Checking for unsent messages...
[18:22:10] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[18:22:10] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[18:22:10] [UPLOAD_RECOVERY] Session: ILUIWU
[18:22:10] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[18:22:10] [UPLOAD_RECOVERY] Checking recent media messages on server...
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18428, file=f36a462089f1685a.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[18:22:10] [UPLOAD_RECOVERY] Verifying 11 media files exist on server...
[18:22:10] [PENDING_UPLOAD] Total pending upload messages: 0
[18:22:10] [UNSENT_RETRY] No unsent messages found
[18:22:10] new_session POST ok: token len=157
[18:22:10] HELLO → sent (fetched token, role=query)
[18:22:10] [SIG] hello_ok received for query connection - ready to query agents
[18:22:10] [SIG] get_agents request sent for sessionId=ILUIWU
[18:22:10] [SIG] get_agents request sent for sessionId=iosILUIWU
[18:22:10] [SERVER] Stopped reconnect polling
[18:22:10] [SIG] agents_list received: []
[18:22:10] [SIG] agents_list received: []
[18:22:10] [UPLOAD_RECOVERY] ✅ All media files verified on server
[18:22:10] [COMBINED_FETCH] Loaded 7194 read receipts, 873 messages with reactions
[18:22:10] [READBY_ENRICH] Enriched 50 messages with readBy data
[18:22:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18379, 18380, 18381, 18382, 18383]
[18:22:11] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:22:11] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:22:11] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:22:13] [MENU] dismissAnyExistingMenu called
[18:22:13] [MENU] dismissAnyExistingMenu completed
[18:22:13] [SCROLL_BTN] Showing button - 239pt from bottom > half 223pt
[18:22:14] [MENU] dismissAnyExistingMenu called
[18:22:14] [MENU] dismissAnyExistingMenu completed
[18:22:14] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:22:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:22:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:23:10] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[18:23:10] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[18:23:10] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[18:23:10] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 18428, 18427, 18426, 18425]
[18:23:10] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:23:10] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:23:10] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:23:10] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[18:23:10] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[18:23:11] [CLIENT_SIG] Event received: type=0 messageId=18429
[18:23:11] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18429,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 17:23:11"}
[18:23:11] [WS_EVENT] Received event: type=0, messageId=18429
[18:23:11] [WS_EVENT] 📨 New message notification (msgId=18429) - triggering incremental refresh, currentMsgCount=51
[18:23:11] [CHAT] receive_message.php JSON: ["message_type": 0, "session_id": ILUIWU, "file_name": , "datesent_utc": 2026-01-21 17:23:11, "ok": 1, "message_id": 18429]
[18:23:11] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[18:23:11] [DB_UPGRADE] Upgrading message ID: -1 → 18429, preserveOriginalDate=false
[18:23:11] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18428
[18:23:11] [DB_UPGRADE] ✅ Upgraded -1 → 18429 with send_status=0, 1 row(s) affected
[18:23:11] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 18429
[18:23:11] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 18429
[18:23:11] ReloadData 9
[18:23:11] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[18:23:11] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:23:11] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:23:11] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:23:11] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[18:23:11] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[18:23:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18379, 18380, 18381, 18382, 18383]
[18:23:12] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:23:12] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:23:12] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:23:13] [LOCK] Lock button tapped - locking app immediately
[18:23:13] [LOCK] Received lock app notification
[18:23:14] [LIFECYCLE] App resigning active - cleared crash flag
[18:23:14] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[18:23:14] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[18:23:14] [LIFECYCLE] App entering background - cleared crash flag
[18:23:14] [CLIENT_SIG] Disconnecting
[18:23:14] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[18:23:14] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[18:23:14] [WS] Canceling WebSocket for query connection to iosILUIWU
[18:23:14] In cleanupPeer
[18:23:14] In cleanupPeer
[18:23:14] [LIFECYCLE] WebRTC audio disabled
[18:23:14] [LIFECYCLE] AVAudioSession deactivated
[18:23:14] [LIFECYCLE] All connections stopped
[18:23:15] [CLIENT_SIG] WebSocket closed with code 1001
[18:23:15] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[18:23:15] [SERVER] Stopped reconnect polling
[18:23:15] Will request stop of video 0
[18:23:15] Will request stop of video 0
[18:23:15] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1001
[18:23:15] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[18:23:15] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[18:23:15] [WS] Query connection failed - cleaning up all agent connections and views
[18:23:15] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[18:23:15] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[18:23:15] [PIP] Removing 0 tracks from PiP for connection 0
[18:23:15] [PIP] ✅ All tracks removed for connection 0
[18:23:15] [PIP] Removing 0 tracks from PiP for connection 0
[18:23:15] [PIP] ✅ All tracks removed for connection 0
[18:23:15] [CLEANUP] ========================================
[18:23:15] [CLEANUP] Cleaning up all agent connections and views
[18:23:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[18:23:15] [CLEANUP] Stopped and removed 0 video connections
[18:23:15] [CLEANUP] Removed 0 video views
[18:23:15] [CLEANUP] Removed 0 feed scroll views
[18:23:15] [CLEANUP] Removed 0 status labels
[18:23:15] [CLEANUP] Reset agent query state
[18:23:15] [CLEANUP] Updated page indicator
[18:23:15] [CLEANUP] Rebuilt video layout
[18:23:15] [CLEANUP] ✅ All agent connections and views cleaned up
[18:23:15] [CLEANUP] ========================================
[18:23:15] [SERVER] Skipping reconnect polling - app is in background
[18:23:15] [WS] URLSession invalidated successfully
[18:23:15] [CLEANUP] ========================================
[18:23:15] [CLEANUP] Cleaning up all agent connections and views
[18:23:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[18:23:15] [CLEANUP] Stopped and removed 0 video connections
[18:23:15] [CLEANUP] Removed 0 video views
[18:23:15] [CLEANUP] Removed 0 feed scroll views
[18:23:15] [CLEANUP] Removed 0 status labels
[18:23:15] [CLEANUP] Reset agent query state
[18:23:15] [CLEANUP] Updated page indicator
[18:23:15] [CLEANUP] Rebuilt video layout
[18:23:15] [CLEANUP] ✅ All agent connections and views cleaned up
[18:23:15] [CLEANUP] ========================================
[18:23:15] [SERVER] Skipping reconnect polling - app is in background
[18:24:42] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[18:24:42] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[18:24:42] [LIFECYCLE] App entering foreground - restoring connections
[18:24:42] [UPLOAD_RETRY] No pending uploads to retry
[18:24:42] [LIFECYCLE] Merged 868 reactions from local DB
[18:24:42] [LIFECYCLE] WebRTC audio re-enabled
[18:24:42] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[18:24:42] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[18:24:42] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[18:24:42] [VIEWER] Reconnecting after background - querying agents
[18:24:42] [UNSENT_RETRY] Checking for unsent messages...
[18:24:42] [PENDING_UPLOAD] Total pending upload messages: 0
[18:24:42] [UNSENT_RETRY] No unsent messages found
[18:24:42] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[18:24:42] [WS] Opening session at ws://crivello.dyndns.org:8081/
[18:24:42] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[18:24:42] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18379, 18380, 18381, 18382, 18383]
[18:24:42] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:24:42] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:24:42] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:24:42] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[18:24:42] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[18:24:42] [PUSH] handlePollEventsNotification userInfo: [:]
[18:24:42] [PUSH] No message_id in userInfo
[18:24:42] [PUSH] No operation_type in userInfo
[18:24:42] [FAST_REFRESH] Evolution disabled - performing incremental sync
[18:24:42] [FAST_REFRESH] Already have 51 messages - skipping local DB load
[18:24:42] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[18:24:42] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[18:24:42] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[18:24:42] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18429
[18:24:42] [CLIENT_SIG] WebSocket opened
[18:24:42] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[18:24:42] [CLIENT_SIG] Connected! clientId=5-cUPgelTSE0c9f2
[18:24:42] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[18:24:42] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[18:24:42] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[18:24:42] HELLO → sent (cached token, role=query)
[18:24:42] [SIG] hello_ok received for query connection - ready to query agents
[18:24:42] [SIG] get_agents request sent for sessionId=ILUIWU
[18:24:42] [SIG] get_agents request sent for sessionId=iosILUIWU
[18:24:42] [SERVER] Stopped reconnect polling
[18:24:42] [SIG] agents_list received: []
[18:24:42] [SIG] agents_list received: []
[18:24:42] [INCREMENTAL_SYNC] ✅ No new messages
[18:24:42] [FAST_REFRESH] Incremental sync complete - 51 messages
[18:24:42] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18379, 18380, 18381, 18382, 18383]
[18:24:42] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:24:42] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:24:42] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:24:42] [COMBINED_FETCH] Loaded 7195 read receipts, 873 messages with reactions
[18:24:42] [FOREGROUND] Enriched 0 messages with readBy data from server
[18:24:43] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18379, 18380, 18381, 18382, 18383]
[18:24:43] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:24:43] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:24:43] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:24:43] [COMBINED_FETCH] Loaded 7195 read receipts, 873 messages with reactions
[18:24:43] [FAST_REFRESH] Enriched 51 messages with readBy data
[18:24:43] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18379, 18380, 18381, 18382, 18383]
[18:24:43] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:24:43] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:24:43] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:24:43] [PIN_AUTH] Correct PIN
[18:24:43] [SECURITY] Restored real session: ILUIWU
[18:24:43] [SECURITY] Restored real session: ILUIWU
[18:24:43] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[18:24:43] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[18:24:43] [AUTH] UI update complete
[18:24:43] [FAKE MODE] Exiting fake mode, restoring real session
[18:24:43] [SECURITY] Restored real session: ILUIWU
[18:24:43] [SECURITY] Saved real session: ILUIWU
[18:24:43] [FAKE MODE] ✅ Restored real session: ILUIWU
[18:24:43] [FAKE MODE] Loaded 50 messages (limited to page size)
[18:24:43] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[18:24:43] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[18:24:43] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:24:43] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:24:43] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:24:43] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[18:24:43] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:24:43] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:24:43] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:24:43] [USER] ✅ User registered successfully
[18:24:43] [PUSH] User registration after token update: success
[18:24:44] [COMBINED_FETCH] Loaded 7195 read receipts, 873 messages with reactions
[18:24:44] [FAKE MODE] Enriched 50 messages with readBy data
[18:24:44] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[18:24:44] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:24:44] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:24:44] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:24:45] [MENU] dismissAnyExistingMenu called
[18:24:45] [MENU] dismissAnyExistingMenu completed
[18:24:45] [MENU] Created button 'Reply' at index 0
[18:24:45] [MENU] Created button 'Hide' at index 1
[18:24:45] [MENU] Created button 'Delete' at index 2
[18:24:45] [MENU] Menu added at y=595.0
[18:24:46] [MENU] dismissMenuFromSnapshot - tap on floating message
[18:24:46] [MENU] dismissAnyExistingMenu called
[18:24:46] [MENU] Found menu with tag 9999, removing
[18:24:46] [MENU] Removing blur effect
[18:24:46] [MENU] Removing floating message snapshot
[18:24:46] [MENU] Recorded dismissal time for debounce
[18:24:46] [MENU] dismissAnyExistingMenu completed
[18:24:46] [MENU] dismissAnyExistingMenu called
[18:24:46] [MENU] dismissAnyExistingMenu completed
[18:24:48] [MENU] dismissAnyExistingMenu called
[18:24:48] [MENU] dismissAnyExistingMenu completed
[18:24:48] [MENU] Created button 'Reply' at index 0
[18:24:48] [MENU] Created button 'Edit' at index 1
[18:24:48] [MENU] Created button 'Copy' at index 2
[18:24:48] [MENU] Created button 'Delete' at index 3
[18:24:48] [MENU] Menu added at y=476.0
[18:24:50] [MENU] menuButtonTouchDown - button title: Edit, tag: 1
[18:24:50] [MENU] menuButtonTapped - button title: Edit, tag: 1
[18:24:50] [MENU] Button frame: (0.0, 44.0, 120.0, 44.0), superview: true
[18:24:50] [MENU] Found action closure, dismissing menu first
[18:24:50] [MENU] dismissAnyExistingMenu called
[18:24:50] [MENU] Found menu with tag 9999, removing
[18:24:50] [MENU] Removing blur effect
[18:24:50] [MENU] Removing floating message snapshot
[18:24:50] [MENU] Recorded dismissal time for debounce
[18:24:50] [MENU] dismissAnyExistingMenu completed
[18:24:50] [MENU] Menu dismissed, executing action
[18:24:50] [MENU] Action executed
[18:24:50] [SCROLL_BTN] Showing button - 365pt from bottom > half 196pt
[18:24:52] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[18:24:52] [WS] Query connection error - cleaning up all agent connections and views
[18:24:52] [CLEANUP] ========================================
[18:24:52] [CLEANUP] Cleaning up all agent connections and views
[18:24:52] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[18:24:52] [CLEANUP] Stopped and removed 0 video connections
[18:24:52] [CLEANUP] Removed 0 video views
[18:24:52] [CLEANUP] Removed 0 feed scroll views
[18:24:52] [CLEANUP] Removed 0 status labels
[18:24:52] [CLEANUP] Reset agent query state
[18:24:52] [CLEANUP] Updated page indicator
[18:24:52] [CLEANUP] Rebuilt video layout
[18:24:52] [CLEANUP] ✅ All agent connections and views cleaned up
[18:24:52] [CLEANUP] ========================================
[18:24:52] [SERVER] Starting reconnect polling (5s interval)
[18:24:57] [SERVER] Polling - attempting to reconnect...
[18:25:02] [SERVER] Polling - attempting to reconnect...
[18:25:05] ReloadData 11 - applying tab 0 filtering after message edit
[18:25:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[18:25:05] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:05] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:05] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:25:07] [CLIENT_SIG] Event received: type=2 messageId=18429
[18:25:07] [CHAT] edit_message.php HTTP 200
── Body ──
{"ok":true,"message":"Message updated","session_id":"ILUIWU","message_id":18429,"event_type":2}
[18:25:07] [WS_EVENT] Received event: type=2, messageId=18429
[18:25:07] [WS_EVENT] Message edited/updated: 18429
[18:25:07] [SERVER] Polling - attempting to reconnect...
[18:25:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[18:25:07] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:07] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:07] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:25:08] [COMBINED_FETCH] Loaded 7195 read receipts, 873 messages with reactions
[18:25:08] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[18:25:08] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:08] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:25:09] [MENU] dismissAnyExistingMenu called
[18:25:09] [MENU] dismissAnyExistingMenu completed
[18:25:09] [MENU] Created button 'Reply' at index 0
[18:25:09] [MENU] Created button 'Hide' at index 1
[18:25:09] [MENU] Created button 'Delete' at index 2
[18:25:09] [MENU] Menu added at y=595.0
[18:25:11] [MENU] menuButtonTouchDown - button title: Hide, tag: 1
[18:25:11] [MENU] menuButtonTapped - button title: Hide, tag: 1
[18:25:11] [MENU] Button frame: (0.0, 44.0, 120.0, 44.0), superview: true
[18:25:11] [MENU] Found action closure, dismissing menu first
[18:25:11] [MENU] dismissAnyExistingMenu called
[18:25:11] [MENU] Found menu with tag 9999, removing
[18:25:11] [MENU] Removing blur effect
[18:25:11] [MENU] Removing floating message snapshot
[18:25:11] [MENU] Recorded dismissal time for debounce
[18:25:11] [MENU] dismissAnyExistingMenu completed
[18:25:11] [MENU] Menu dismissed, executing action
[18:25:11] [HIDE] Hiding media message id=18428
[18:25:11] [MENU] dismissAnyExistingMenu called
[18:25:11] [MENU] dismissAnyExistingMenu completed
[18:25:11] [GUARD] ⚠️ buildChatRows received 7191 messages - truncating to 500
[18:25:11] [MENU] Action executed
[18:25:11] DOWNLOADIIING 2360d0215b6a2ab2.mov
[18:25:12] [SERVER] Polling - attempting to reconnect...
[18:25:13] [MENU] dismissAnyExistingMenu called
[18:25:13] [MENU] dismissAnyExistingMenu completed
[18:25:13] [SCROLL_BTN] Showing button - 44787pt from bottom > half 379pt
[18:25:14] [CELL_UPLOAD] configure: msgId=18040, file=9517bfe6ca98fe6d.heic, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=9517bfe6ca98fe6d.heic, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18045, file=fc97f5d36a4b78a8.jpeg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=fc97f5d36a4b78a8.jpeg, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18058, file=f533b6e6646d4d9c.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f533b6e6646d4d9c.jpg, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18077, file=7a7b561868bcacae.heic, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=7a7b561868bcacae.heic, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18117, file=ca2813d190665dd2.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=ca2813d190665dd2.jpg, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18147, file=22d80b8c4c39c5aa.png, senderId=EYE-SYSTEM-00000000-0000-0000-0000-000000000000, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=22d80b8c4c39c5aa.png, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18149, file=bdecbcd267d10e9d.heic, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=bdecbcd267d10e9d.heic, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18161, file=399b07f80d99b3ff.heic, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=399b07f80d99b3ff.heic, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18162, file=2360d0215b6a2ab2.mov, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2360d0215b6a2ab2.mov, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18192, file=4bbbc4757d54023e.png, senderId=EYE-SYSTEM-00000000-0000-0000-0000-000000000000, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=4bbbc4757d54023e.png, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18249, file=19efa1fb2f984328.heic, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=19efa1fb2f984328.heic, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18267, file=e30710a6fc631f7e.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=e30710a6fc631f7e.jpg, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18296, file=e27abe61119a26c3.mov, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=e27abe61119a26c3.mov, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18312, file=077bf4aba425ab65.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=077bf4aba425ab65.jpg, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18319, file=69cc52974ecff2d4.png, senderId=EYE-SYSTEM-00000000-0000-0000-0000-000000000000, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=69cc52974ecff2d4.png, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18338, file=587faef97c05d266.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=587faef97c05d266.jpg, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18378, file=7fcf17ed21a942d6.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → not my message, setting complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=7fcf17ed21a942d6.jpg, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18380, file=47f0a79ffd2469ec.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=47f0a79ffd2469ec.jpg, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18407, file=7494d317859e38fb.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=7494d317859e38fb.jpg, overlayExists=true
[18:25:14] [CELL_UPLOAD] configure: msgId=18409, file=f733dc0a9f704916.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f733dc0a9f704916.jpg, overlayExists=true
[18:25:14] [SCROLL_BTN] Showing button - 846pt from bottom > half 379pt
[18:25:14] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[18:25:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[18:25:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[18:25:14] [PUSH] Silent push received
[18:25:14] [PUSH_EMBED] No embedded message_data in notification
[18:25:14] [PUSH] No embedded data, pre-loading messages from server
[18:25:14] [PUSH_PRELOAD] Fetching messages for instant display cache
[18:25:15] [HIDE] Timer updated successfully on server (timer=-2)
[18:25:15] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[18:25:15] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[18:25:15] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[18:25:15] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 4, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("message_id"): 18428]
[18:25:15] [PUSH] Parsed message_id: 18428
[18:25:15] [PUSH] Parsed operation_type: 4
[18:25:15] [PUSH] Taking direct action: opType=4, messageId=18428
[18:25:15] [PUSH] TakeActionFromPush called: OperationType=4, MessageIds=18428
[18:25:15] [PUSH] Unknown operation type: 4
[18:25:16] [LOCK] Lock button tapped - locking app immediately
[18:25:16] [LOCK] Received lock app notification
[18:25:17] [LIFECYCLE] App resigning active - cleared crash flag
[18:25:17] [SERVER] Polling - attempting to reconnect...
[18:25:17] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[18:25:17] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[18:25:17] [LIFECYCLE] App entering background - cleared crash flag
[18:25:17] [CLIENT_SIG] Disconnecting
[18:25:17] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[18:25:17] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[18:25:17] [WS] Canceling WebSocket for query connection to iosILUIWU
[18:25:17] In cleanupPeer
[18:25:17] In cleanupPeer
[18:25:17] [LIFECYCLE] WebRTC audio disabled
[18:25:17] [LIFECYCLE] AVAudioSession deactivated
[18:25:17] [LIFECYCLE] All connections stopped
[18:25:18] [CLIENT_SIG] WebSocket closed with code 1001
[18:25:18] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[18:25:18] [SERVER] Stopped reconnect polling
[18:25:18] [WS] URLSession invalidated successfully
[18:25:18] Will request stop of video 0
[18:25:18] Will request stop of video 0
[18:25:18] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[18:25:18] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[18:25:18] [PIP] Removing 0 tracks from PiP for connection 0
[18:25:18] [PIP] ✅ All tracks removed for connection 0
[18:25:18] [PIP] Removing 0 tracks from PiP for connection 0
[18:25:18] [PIP] ✅ All tracks removed for connection 0
[19:06:07] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:06:07] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:06:07] [LIFECYCLE] App entering foreground - restoring connections
[19:06:07] [LIFECYCLE] Away > 2 minutes (2449s) - will scroll to bottom
[19:06:07] [UPLOAD_RETRY] No pending uploads to retry
[19:06:07] [LIFECYCLE] Merged 868 reactions from local DB
[19:06:07] [LIFECYCLE] WebRTC audio re-enabled
[19:06:07] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:06:07] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:06:07] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:06:07] [VIEWER] Reconnecting after background - querying agents
[19:06:07] [UNSENT_RETRY] Checking for unsent messages...
[19:06:07] [PENDING_UPLOAD] Total pending upload messages: 0
[19:06:07] [UNSENT_RETRY] No unsent messages found
[19:06:07] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:06:07] [WS] Connection failed: The operation couldn’t be completed. Software caused connection abort
[19:06:07] [WS] Query connection failed - cleaning up all agent connections and views
[19:06:07] [CLEANUP] ========================================
[19:06:07] [CLEANUP] Cleaning up all agent connections and views
[19:06:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:06:07] [CLEANUP] Stopped and removed 0 video connections
[19:06:07] [CLEANUP] Removed 0 video views
[19:06:07] [CLEANUP] Removed 0 feed scroll views
[19:06:07] [CLEANUP] Removed 0 status labels
[19:06:07] [CLEANUP] Reset agent query state
[19:06:07] [CLEANUP] Updated page indicator
[19:06:07] [CLEANUP] Rebuilt video layout
[19:06:07] [CLEANUP] ✅ All agent connections and views cleaned up
[19:06:07] [CLEANUP] ========================================
[19:06:07] [SERVER] Starting reconnect polling (5s interval)
[19:06:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:06:07] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:06:07] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:06:07] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:06:07] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:06:07] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:06:07] [PUSH] handlePollEventsNotification userInfo: [:]
[19:06:07] [PUSH] No message_id in userInfo
[19:06:07] [PUSH] No operation_type in userInfo
[19:06:07] [FAST_REFRESH] Evolution disabled - performing incremental sync
[19:06:07] [FAST_REFRESH] Already have 50 messages - skipping local DB load
[19:06:07] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[19:06:07] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[19:06:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[19:06:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18429
[19:06:07] [CLIENT_SIG] WebSocket opened
[19:06:07] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:06:07] [CLIENT_SIG] Connected! clientId=gKQpxrE3ZSN2_b79
[19:06:07] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:06:07] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:06:07] [INCREMENTAL_SYNC] ✅ No new messages
[19:06:07] [FAST_REFRESH] Incremental sync complete - 50 messages
[19:06:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:06:07] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:06:07] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:06:07] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:06:07] [COMBINED_FETCH] Loaded 7195 read receipts, 873 messages with reactions
[19:06:07] [FOREGROUND] Enriched 0 messages with readBy data from server
[19:06:07] [COMBINED_FETCH] Loaded 7195 read receipts, 873 messages with reactions
[19:06:07] [FAST_REFRESH] Enriched 50 messages with readBy data
[19:06:07] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:06:08] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:06:08] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:06:08] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:06:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true[19:06:08] [LOG] Pruned 396 entries older than 3 hours
[19:06:08] [SECURITY] Restored real session: ILUIWU
[19:06:08] [SECURITY] Restored real session: ILUIWU
[19:06:08] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[19:06:08] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:06:08] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[19:06:08] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[19:06:08] [AUTH] UI update complete
[19:06:08] [FAKE MODE] Exiting fake mode, restoring real session
[19:06:08] [SECURITY] Restored real session: ILUIWU
[19:06:08] [SECURITY] Saved real session: ILUIWU
[19:06:08] [FAKE MODE] ✅ Restored real session: ILUIWU
[19:06:08] [FAKE MODE] Loaded 50 messages (limited to page size)
[19:06:08] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:06:08] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:06:08] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:06:08] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:06:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:06:08] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:06:08] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:06:08] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:06:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:06:08] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:06:08] HELLO → sent (cached token, role=query)
[19:06:08] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[19:06:08] [WS] Query connection failed - cleaning up all agent connections and views
[19:06:08] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[19:06:08] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[19:06:08] [CLEANUP] ========================================
[19:06:08] [CLEANUP] Cleaning up all agent connections and views
[19:06:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:06:08] [CLEANUP] Stopped and removed 0 video connections
[19:06:08] [CLEANUP] Removed 0 video views
[19:06:08] [CLEANUP] Removed 0 feed scroll views
[19:06:08] [CLEANUP] Removed 0 status labels
[19:06:08] [CLEANUP] Reset agent query state
[19:06:08] [CLEANUP] Updated page indicator
[19:06:08] [CLEANUP] Rebuilt video layout
[19:06:08] [CLEANUP] ✅ All agent connections and views cleaned up
[19:06:08] [CLEANUP] ========================================
[19:06:08] [SERVER] Starting reconnect polling (5s interval)
[19:06:08] [CLEANUP] ========================================
[19:06:08] [CLEANUP] Cleaning up all agent connections and views
[19:06:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:06:08] [CLEANUP] Stopped and removed 0 video connections
[19:06:08] [CLEANUP] Removed 0 video views
[19:06:08] [CLEANUP] Removed 0 feed scroll views
[19:06:08] [CLEANUP] Removed 0 status labels
[19:06:08] [CLEANUP] Reset agent query state
[19:06:08] [CLEANUP] Updated page indicator
[19:06:08] [CLEANUP] Rebuilt video layout
[19:06:08] [CLEANUP] ✅ All agent connections and views cleaned up
[19:06:08] [CLEANUP] ========================================
[19:06:08] [SERVER] Starting reconnect polling (5s interval)
[19:06:09] [USER] ✅ User registered successfully
[19:06:09] [PUSH] User registration after token update: success
[19:06:09] [COMBINED_FETCH] Loaded 7195 read receipts, 873 messages with reactions
[19:06:09] [FAKE MODE] Enriched 50 messages with readBy data
[19:06:09] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:06:09] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:06:09] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:06:09] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:06:10] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[19:06:10] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:06:10] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:06:10] HELLO → sent (cached token, role=query)
[19:06:10] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[19:06:10] [WS] Query connection failed - cleaning up all agent connections and views
[19:06:10] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[19:06:10] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[19:06:10] [CLEANUP] ========================================
[19:06:10] [CLEANUP] Cleaning up all agent connections and views
[19:06:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:06:10] [CLEANUP] Stopped and removed 0 video connections
[19:06:10] [CLEANUP] Removed 0 video views
[19:06:10] [CLEANUP] Removed 0 feed scroll views
[19:06:10] [CLEANUP] Removed 0 status labels
[19:06:10] [CLEANUP] Reset agent query state
[19:06:10] [CLEANUP] Updated page indicator
[19:06:10] [CLEANUP] Rebuilt video layout
[19:06:10] [CLEANUP] ✅ All agent connections and views cleaned up
[19:06:10] [CLEANUP] ========================================
[19:06:10] [SERVER] Starting reconnect polling (5s interval)
[19:06:10] [CLEANUP] ========================================
[19:06:10] [CLEANUP] Cleaning up all agent connections and views
[19:06:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:06:10] [CLEANUP] Stopped and removed 0 video connections
[19:06:10] [CLEANUP] Removed 0 video views
[19:06:10] [CLEANUP] Removed 0 feed scroll views
[19:06:10] [CLEANUP] Removed 0 status labels
[19:06:10] [CLEANUP] Reset agent query state
[19:06:10] [CLEANUP] Updated page indicator
[19:06:10] [CLEANUP] Rebuilt video layout
[19:06:10] [CLEANUP] ✅ All agent connections and views cleaned up
[19:06:10] [CLEANUP] ========================================
[19:06:10] [SERVER] Starting reconnect polling (5s interval)
[19:06:11] [LOCK] Lock button tapped - locking app immediately
[19:06:11] [LOCK] Received lock app notification
[19:06:12] [LIFECYCLE] App resigning active - cleared crash flag
[19:06:12] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[19:06:12] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:06:12] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:06:12] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:06:12] [LIFECYCLE] App entering background - cleared crash flag
[19:06:12] [CLIENT_SIG] Disconnecting
[19:06:12] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:06:12] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[19:06:12] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:06:12] In cleanupPeer
[19:06:12] In cleanupPeer
[19:06:12] [LIFECYCLE] WebRTC audio disabled
[19:06:12] [LIFECYCLE] AVAudioSession deactivated
[19:06:12] [LIFECYCLE] All connections stopped
[19:06:12] [CLIENT_SIG] WebSocket closed with code 1001
[19:06:12] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:06:12] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:06:12] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:06:12] [SERVER] Stopped reconnect polling
[19:06:12] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[19:06:12] [WS] Query connection error - cleaning up all agent connections and views
[19:06:12] Will request stop of video 0
[19:06:12] [WS] Connection failed: cancelled
[19:06:12] [WS] Query connection failed - cleaning up all agent connections and views
[19:06:12] Will request stop of video 0
[19:06:12] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[19:06:12] [APP_TERMINATE] ⚠️ 2 pending uploads in DB queue:
[19:06:12] [APP_TERMINATE] - id=335, file=t_21b86ebc5e802df4.jpg, status=uploading, retries=0, size=0.0MB
[19:06:12] [APP_TERMINATE] - id=474, file=1f0e8529cd56643f.mov, status=uploading, retries=0, size=0.0MB
[19:09:58] [CRASH] No crash detected
[19:09:58] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[19:09:58] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[19:09:58] [GIPHY] SDK not available - using REST API fallback
[19:09:58] [BACKGROUND] Background fetch enabled
[19:09:58] [AUTH] Starting PIN authentication
[19:09:58] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:09:58] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:09:58] [CLEANUP] No old timer messages to delete
[19:09:58] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[19:09:59] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:09:59] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:09:59] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:09:59] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:09:59] [USER] ✅ User registered successfully
[19:09:59] [PUSH] User registration after token update: success
[19:09:59] [CLIENT_SIG] WebSocket opened
[19:09:59] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:09:59] [CLIENT_SIG] Connected! clientId=CkI5Syi50YBwikPW
[19:09:59] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:09:59] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:09:59] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18429)...
[19:09:59] [PRELOAD] No messages or parse error
[19:10:00] [PIN_AUTH] Correct PIN
[19:10:00] [SECURITY] Restored real session: ILUIWU
[19:10:00] [SECURITY] Restored real session: ILUIWU
[19:10:00] [SECURITY] Saved real session: ILUIWU
[19:10:00] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[19:10:00] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:10:00] Documents Directory: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents
[19:10:00] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[19:10:00] [THEME] Applying current theme
[19:10:00] [CHAT] Applied day theme (mode: day)
[19:10:00] [SECURITY] Saved real session: ILUIWU
[19:10:00] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:10:00] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:10:00] [NETWORK] Network monitor started
[19:10:00] [NETWORK] Status changed: connected
[19:10:00] Did transition
[19:10:00] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[19:10:00] [VIEWER] Screen lock enabled - normal idle behavior
[19:10:00] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[19:10:00] [VCC] ========== VideoConnectionClass INIT ==========
[19:10:00] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[19:10:00] [DATA AUDIO] ========== setupWebRTC() START ==========
[19:10:00] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[19:10:00] [DATA AUDIO] Creating encoder/decoder factories...
[19:10:00] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[19:10:00] [CODEC] Viewer selected encoder: AV1 (best quality)
[19:10:00] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[19:10:00] [DATA AUDIO] ✅ Factory created
[19:10:00] [DATA AUDIO] RTCAudioSession locked
[19:10:00] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[19:10:00] [DATA AUDIO] RTCAudioSession unlocked
[19:10:00] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[19:10:00] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[19:10:00] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[19:10:00] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:10:00] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[19:10:00] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[19:10:00] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[19:10:00] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[19:10:00] Did transition
[19:10:00] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[19:10:00] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:10:00] [CHUNK] Merged 868 reactions synchronously
[19:10:00] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:10:00] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[19:10:00] [MIGRATION] No messages need sender_name backfill
[19:10:00] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[19:10:00] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[19:10:00] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[19:10:00] [GALLERY_DB] Raw datesent for msg 18380: '2026-01-21 10:30:35'
[19:10:00] [USER] ✅ User registered successfully
[19:10:00] [USER] User registration successful
[19:10:00] [GALLERY_DB] ✅ Loaded 475 media messages
[19:10:00] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18429
[19:10:00] [INCREMENTAL_SYNC] ✅ No new messages
[19:10:00] [GALLERY] Filtered 475 -> 436 (only with local thumbnails)
[19:10:00] [GALLERY] First 5 after sort (newest first):
[19:10:00] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[19:10:00] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[19:10:00] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[19:10:00] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[19:10:00] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[19:10:00] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[19:10:00] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:10:00] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[19:10:00] [CELL_UPLOAD] configure: msgId=18380, file=47f0a79ffd2469ec.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:10:00] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:10:00] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=47f0a79ffd2469ec.jpg, overlayExists=true
[19:10:00] [SERVER] Starting reconnect polling (5s interval)
[19:10:00] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[19:10:00] [ICONS] Offset applied: -14.6
[19:10:00] [ICONS] New left margin: 11.2, New right margin: 11.3
[19:10:00] [ICONS] Chat center: (31.2, 87.0)
[19:10:00] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[19:10:00] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[19:10:00] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[19:10:00] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[19:10:00] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[19:10:00] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[19:10:00] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[19:10:00] [ICONS] Screen width: 440.0
[19:10:00] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:10:00] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:10:00] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:10:00] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[19:10:00] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:10:00] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:10:00] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:10:00] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[19:10:00] [UNSENT_RETRY] Checking for unsent messages...
[19:10:00] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[19:10:00] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[19:10:00] [UPLOAD_RECOVERY] Session: ILUIWU
[19:10:00] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[19:10:00] [UPLOAD_RECOVERY] Checking recent media messages on server...
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18428, file=f36a462089f1685a.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[19:10:00] [UPLOAD_RECOVERY] Verifying 11 media files exist on server...
[19:10:00] [PENDING_UPLOAD] Total pending upload messages: 0
[19:10:00] [UNSENT_RETRY] No unsent messages found
[19:10:00] new_session POST ok: token len=157
[19:10:00] HELLO → sent (fetched token, role=query)
[19:10:00] [SIG] hello_ok received for query connection - ready to query agents
[19:10:00] [SIG] get_agents request sent for sessionId=ILUIWU
[19:10:00] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:10:00] [SERVER] Stopped reconnect polling
[19:10:00] [SIG] agents_list received: []
[19:10:00] [SIG] agents_list received: []
[19:10:01] [UPLOAD_RECOVERY] ✅ All media files verified on server
[19:10:01] [COMBINED_FETCH] Loaded 7195 read receipts, 873 messages with reactions
[19:10:01] [READBY_ENRICH] Enriched 50 messages with readBy data
[19:10:01] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:10:01] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:10:01] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:10:01] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:10:14] [LOCK] Lock button tapped - locking app immediately
[19:10:14] [LOCK] Received lock app notification
[19:10:15] [LIFECYCLE] App resigning active - cleared crash flag
[19:10:16] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:10:16] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:10:16] [LIFECYCLE] App entering background - cleared crash flag
[19:10:16] [CLIENT_SIG] Disconnecting
[19:10:16] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:10:16] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[19:10:16] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:10:16] In cleanupPeer
[19:10:16] In cleanupPeer
[19:10:16] [LIFECYCLE] WebRTC audio disabled
[19:10:16] [LIFECYCLE] AVAudioSession deactivated
[19:10:16] [LIFECYCLE] All connections stopped
[19:10:16] [CLIENT_SIG] WebSocket closed with code 1001
[19:10:16] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:10:16] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:10:16] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:10:16] [SERVER] Stopped reconnect polling
[19:10:16] Will request stop of video 0
[19:10:16] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[19:10:16] [WS] Query connection error - cleaning up all agent connections and views
[19:10:16] Will request stop of video 0
[19:10:16] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[19:10:16] [WS] Query connection failed - cleaning up all agent connections and views
[19:10:16] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[19:10:16] [APP_TERMINATE] ⚠️ 2 pending uploads in DB queue:
[19:10:16] [APP_TERMINATE] - id=335, file=t_21b86ebc5e802df4.jpg, status=uploading, retries=0, size=0.0MB
[19:10:16] [APP_TERMINATE] - id=474, file=1f0e8529cd56643f.mov, status=uploading, retries=0, size=0.0MB
[19:10:16] [LIFECYCLE] ViewController deallocated
[19:16:44] [CRASH] No crash detected
[19:16:44] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[19:16:44] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[19:16:44] [GIPHY] SDK not available - using REST API fallback
[19:16:44] [BACKGROUND] Background fetch enabled
[19:16:44] [CLEANUP] No old timer messages to delete
[19:16:44] [AUTH] Starting PIN authentication
[19:16:44] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:16:44] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:16:44] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[19:16:44] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:16:44] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:16:44] [USER] ✅ User registered successfully
[19:16:44] [PUSH] User registration after token update: success
[19:16:44] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:16:44] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:16:44] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18429)...
[19:16:44] [CLIENT_SIG] WebSocket opened
[19:16:44] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:16:44] [CLIENT_SIG] Connected! clientId=6xCv5C2y1RPhgpPh
[19:16:44] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:16:44] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:16:45] [PRELOAD] No messages or parse error
[19:16:46] [PIN_AUTH] Correct PIN
[19:16:46] [SECURITY] Restored real session: ILUIWU
[19:16:46] [SECURITY] Restored real session: ILUIWU
[19:16:46] [SECURITY] Saved real session: ILUIWU
[19:16:46] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[19:16:46] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:16:46] Documents Directory: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents
[19:16:46] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[19:16:46] [THEME] Applying current theme
[19:16:46] [CHAT] Applied day theme (mode: day)
[19:16:46] [SECURITY] Saved real session: ILUIWU
[19:16:46] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:16:46] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:16:46] [NETWORK] Network monitor started
[19:16:46] [NETWORK] Status changed: connected
[19:16:46] Did transition
[19:16:46] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[19:16:46] [VIEWER] Screen lock enabled - normal idle behavior
[19:16:46] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[19:16:46] [VCC] ========== VideoConnectionClass INIT ==========
[19:16:46] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[19:16:46] [DATA AUDIO] ========== setupWebRTC() START ==========
[19:16:46] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[19:16:46] [DATA AUDIO] Creating encoder/decoder factories...
[19:16:46] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[19:16:46] [CODEC] Viewer selected encoder: AV1 (best quality)
[19:16:46] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[19:16:46] [DATA AUDIO] ✅ Factory created
[19:16:46] [DATA AUDIO] RTCAudioSession locked
[19:16:46] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[19:16:46] [DATA AUDIO] RTCAudioSession unlocked
[19:16:46] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[19:16:46] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[19:16:46] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[19:16:46] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:16:46] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[19:16:46] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[19:16:46] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[19:16:46] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[19:16:46] Did transition
[19:16:46] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[19:16:46] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:16:46] [CHUNK] Merged 868 reactions synchronously
[19:16:46] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:16:46] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[19:16:46] [MIGRATION] No messages need sender_name backfill
[19:16:46] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[19:16:46] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[19:16:46] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[19:16:46] [GALLERY_DB] Raw datesent for msg 18380: '2026-01-21 10:30:35'
[19:16:46] [GALLERY_DB] ✅ Loaded 475 media messages
[19:16:46] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18429
[19:16:46] [GALLERY] Filtered 475 -> 436 (only with local thumbnails)
[19:16:46] [GALLERY] First 5 after sort (newest first):
[19:16:46] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[19:16:46] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[19:16:46] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[19:16:46] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[19:16:46] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[19:16:46] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[19:16:46] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:16:46] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[19:16:46] [CELL_UPLOAD] configure: msgId=18380, file=47f0a79ffd2469ec.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:16:46] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:16:46] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=47f0a79ffd2469ec.jpg, overlayExists=true
[19:16:46] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:16:46] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:16:46] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:16:46] [SERVER] Starting reconnect polling (5s interval)
[19:16:46] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[19:16:46] [ICONS] Offset applied: -14.6
[19:16:46] [ICONS] New left margin: 11.2, New right margin: 11.3
[19:16:46] [ICONS] Chat center: (31.2, 87.0)
[19:16:46] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[19:16:46] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[19:16:46] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[19:16:46] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[19:16:46] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[19:16:46] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[19:16:46] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[19:16:46] [ICONS] Screen width: 440.0
[19:16:46] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:16:46] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:16:46] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:16:46] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[19:16:46] [USER] ✅ User registered successfully
[19:16:46] [USER] User registration successful
[19:16:46] [INCREMENTAL_SYNC] ✅ No new messages
[19:16:46] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[19:16:46] [UNSENT_RETRY] Checking for unsent messages...
[19:16:46] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[19:16:46] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[19:16:46] [UPLOAD_RECOVERY] Session: ILUIWU
[19:16:46] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[19:16:46] [UPLOAD_RECOVERY] Checking recent media messages on server...
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18428, file=f36a462089f1685a.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[19:16:46] [UPLOAD_RECOVERY] Verifying 11 media files exist on server...
[19:16:46] [PENDING_UPLOAD] Total pending upload messages: 0
[19:16:46] [UNSENT_RETRY] No unsent messages found
[19:16:46] new_session POST ok: token len=157
[19:16:46] HELLO → sent (fetched token, role=query)
[19:16:46] [SIG] hello_ok received for query connection - ready to query agents
[19:16:46] [SIG] get_agents request sent for sessionId=ILUIWU
[19:16:46] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:16:46] [SERVER] Stopped reconnect polling
[19:16:46] [SIG] agents_list received: []
[19:16:46] [SIG] agents_list received: []
[19:16:46] [UPLOAD_RECOVERY] ✅ All media files verified on server
[19:16:47] [COMBINED_FETCH] Loaded 7195 read receipts, 873 messages with reactions
[19:16:47] [READBY_ENRICH] Enriched 50 messages with readBy data
[19:16:47] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:16:47] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:16:47] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:16:47] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:17:11] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[19:17:11] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[19:17:11] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[19:17:11] [GALLERY_DB] Raw datesent for msg 18380: '2026-01-21 10:30:35'
[19:17:11] [GALLERY_DB] ✅ Loaded 475 media messages
[19:17:11] [GALLERY] Filtered 475 -> 436 (only with local thumbnails)
[19:17:11] [GALLERY] First 5 after sort (newest first):
[19:17:11] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[19:17:11] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[19:17:11] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[19:17:11] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[19:17:11] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[19:17:11] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[19:17:11] [MEDIA_SEND] 📤 Creating media message: id=-1, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, isGiphy=true, upload_status=0 (complete-giphy)
[19:17:11] [MEDIA_SEND] 💾 Inserted to DB with upload_status=0
[19:17:11] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[19:17:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 18429, 18428, 18427, 18426]
[19:17:11] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:17:11] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:17:11] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:17:11] [GIF] configure msgId=-1 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:17:11] [GIF] msgId=-1 START fresh animation
[19:17:11] [CELL_UPLOAD] configure: msgId=-1, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:17:11] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:17:11] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:17:11] [GIF] configure msgId=-1 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:17:11] [GIF] msgId=-1 CONTINUE animation (elapsed=0.014163970947265625s)
[19:17:11] [CELL_UPLOAD] configure: msgId=-1, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:17:11] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:17:11] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:17:11] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:17:11] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:17:11] [SCROLL_BTN] Showing button - 380pt from bottom > half 379pt
[19:17:11] [CLIENT_SIG] Event received: type=0 messageId=18430
[19:17:11] [WS_EVENT] Received event: type=0, messageId=18430
[19:17:11] [WS_EVENT] 📨 New message notification (msgId=18430) - triggering incremental refresh, currentMsgCount=51
[19:17:11] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[19:17:11] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18430,"session_id":"ILUIWU","message_type":1,"file_name":"giphy:https:\/\/media3.giphy.com\/media\/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n\/5WSdgFuyGNK7Zt8ajG\/giphy.gif","datesent_utc":"2026-01-21 18:17:11"}
[19:17:11] [CHAT] receive_message.php JSON: ["message_type": 1, "session_id": ILUIWU, "message_id": 18430, "file_name": giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, "datesent_utc": 2026-01-21 18:17:11, "ok": 1]
[19:17:11] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18429
[19:17:11] [DB_UPGRADE] Upgrading message ID: -1 → 18430, preserveOriginalDate=false
[19:17:11] [DB_UPGRADE] ✅ Upgraded -1 → 18430 with send_status=0, 1 row(s) affected
[19:17:11] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 18430
[19:17:11] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 18430
[19:17:11] ReloadData 9
[19:17:11] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:17:11] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:17:11] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:17:11] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:17:11] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:17:11] [GIF] msgId=18430 START fresh animation
[19:17:11] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:17:11] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:17:11] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:17:11] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:17:11] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[19:17:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18380, 18381, 18382, 18383, 18384]
[19:17:12] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:17:12] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:17:12] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:17:12] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:17:12] [GIF] msgId=18430 CONTINUE animation (elapsed=0.19328594207763672s)
[19:17:12] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:17:12] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:17:12] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:17:12] [MENU] dismissAnyExistingMenu called
[19:17:12] [MENU] dismissAnyExistingMenu completed
[19:17:14] [MENU] dismissAnyExistingMenu called
[19:17:14] [MENU] dismissAnyExistingMenu completed
[19:17:15] [MENU] dismissAnyExistingMenu called
[19:17:15] [MENU] dismissAnyExistingMenu completed
[19:17:15] [LOCK] Lock button tapped - locking app immediately
[19:17:15] [LOCK] Received lock app notification
[19:17:15] [LIFECYCLE] App resigning active - cleared crash flag
[19:17:16] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:17:16] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:17:16] [LIFECYCLE] App entering background - cleared crash flag
[19:17:16] [CLIENT_SIG] Disconnecting
[19:17:16] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:17:16] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[19:17:16] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:17:16] In cleanupPeer
[19:17:16] In cleanupPeer
[19:17:16] [LIFECYCLE] WebRTC audio disabled
[19:17:16] [LIFECYCLE] AVAudioSession deactivated
[19:17:16] [LIFECYCLE] All connections stopped
[19:17:16] [SERVER] Stopped reconnect polling
[19:17:16] [CLIENT_SIG] WebSocket closed with code 1001
[19:17:16] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:17:16] Will request stop of video 0
[19:17:16] Will request stop of video 0
[19:17:16] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1001
[19:17:16] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[19:17:16] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[19:17:16] [WS] Query connection failed - cleaning up all agent connections and views
[19:17:16] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:17:16] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:17:16] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[19:17:16] [APP_TERMINATE] ⚠️ 2 pending uploads in DB queue:
[19:17:16] [APP_TERMINATE] - id=335, file=t_21b86ebc5e802df4.jpg, status=uploading, retries=0, size=0.0MB
[19:17:16] [APP_TERMINATE] - id=474, file=1f0e8529cd56643f.mov, status=uploading, retries=0, size=0.0MB
[19:17:16] [LIFECYCLE] ViewController deallocated
[19:18:53] [CRASH] No crash detected
[19:18:53] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[19:18:53] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[19:18:53] [GIPHY] SDK not available - using REST API fallback
[19:18:53] [BACKGROUND] Background fetch enabled
[19:18:53] [CLEANUP] No old timer messages to delete
[19:18:53] [AUTH] Starting PIN authentication
[19:18:53] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:18:53] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:18:53] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[19:18:53] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:18:53] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:18:53] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18430)...
[19:18:53] [CLIENT_SIG] WebSocket opened
[19:18:53] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:18:53] [CLIENT_SIG] Connected! clientId=7nU6SJLwa0R4cq5l
[19:18:53] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:18:53] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:18:53] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:18:53] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:18:53] [USER] ✅ User registered successfully
[19:18:53] [PUSH] User registration after token update: success
[19:18:53] [PRELOAD] No messages or parse error
[19:18:55] [PIN_AUTH] Correct PIN
[19:18:55] [SECURITY] Restored real session: ILUIWU
[19:18:55] [SECURITY] Restored real session: ILUIWU
[19:18:55] [SECURITY] Saved real session: ILUIWU
[19:18:55] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[19:18:55] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:18:55] Documents Directory: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents
[19:18:55] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[19:18:55] [THEME] Applying current theme
[19:18:55] [CHAT] Applied day theme (mode: day)
[19:18:55] [SECURITY] Saved real session: ILUIWU
[19:18:55] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:18:55] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:18:55] [NETWORK] Network monitor started
[19:18:55] [NETWORK] Status changed: connected
[19:18:55] Did transition
[19:18:55] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[19:18:55] [VIEWER] Screen lock enabled - normal idle behavior
[19:18:55] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[19:18:55] [VCC] ========== VideoConnectionClass INIT ==========
[19:18:55] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[19:18:55] [DATA AUDIO] ========== setupWebRTC() START ==========
[19:18:55] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[19:18:55] [DATA AUDIO] Creating encoder/decoder factories...
[19:18:55] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[19:18:55] [CODEC] Viewer selected encoder: AV1 (best quality)
[19:18:55] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[19:18:55] [DATA AUDIO] ✅ Factory created
[19:18:55] [DATA AUDIO] RTCAudioSession locked
[19:18:55] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[19:18:55] [DATA AUDIO] RTCAudioSession unlocked
[19:18:55] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[19:18:55] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[19:18:55] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[19:18:55] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:18:55] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[19:18:55] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[19:18:55] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[19:18:55] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[19:18:55] Did transition
[19:18:55] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[19:18:55] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:18:55] [CHUNK] Merged 868 reactions synchronously
[19:18:55] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:18:55] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[19:18:55] [MIGRATION] No messages need sender_name backfill
[19:18:55] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[19:18:55] [GALLERY_DB] Raw datesent for msg 18430: '2026-01-21 18:17:11'
[19:18:55] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[19:18:55] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[19:18:55] [USER] ✅ User registered successfully
[19:18:55] [USER] User registration successful
[19:18:55] [GALLERY_DB] ✅ Loaded 476 media messages
[19:18:55] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18430
[19:18:55] [INCREMENTAL_SYNC] ✅ No new messages
[19:18:55] [GALLERY] Filtered 476 -> 436 (only with local thumbnails)
[19:18:55] [GALLERY] First 5 after sort (newest first):
[19:18:55] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[19:18:55] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[19:18:55] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[19:18:55] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[19:18:55] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[19:18:55] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[19:18:55] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:18:55] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[19:18:55] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:18:55] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:18:55] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:18:55] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:18:55] [GIF] msgId=18430 START fresh animation
[19:18:55] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:18:55] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:18:55] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:18:55] [SERVER] Starting reconnect polling (5s interval)
[19:18:55] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[19:18:55] [ICONS] Offset applied: -14.6
[19:18:55] [ICONS] New left margin: 11.2, New right margin: 11.3
[19:18:55] [ICONS] Chat center: (31.2, 87.0)
[19:18:55] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[19:18:55] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[19:18:55] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[19:18:55] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[19:18:55] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[19:18:55] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[19:18:55] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[19:18:55] [ICONS] Screen width: 440.0
[19:18:55] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[19:18:55] [UNSENT_RETRY] Checking for unsent messages...
[19:18:55] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[19:18:55] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[19:18:55] [UPLOAD_RECOVERY] Session: ILUIWU
[19:18:55] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[19:18:55] [UPLOAD_RECOVERY] Checking recent media messages on server...
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18428, file=f36a462089f1685a.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[19:18:55] [UPLOAD_RECOVERY] Verifying 11 media files exist on server...
[19:18:55] [PENDING_UPLOAD] Total pending upload messages: 0
[19:18:55] [UNSENT_RETRY] No unsent messages found
[19:18:55] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:18:55] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:18:55] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:18:55] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[19:18:55] [UPLOAD_RECOVERY] ✅ All media files verified on server
[19:18:55] new_session POST ok: token len=157
[19:18:55] HELLO → sent (fetched token, role=query)
[19:18:55] [SIG] hello_ok received for query connection - ready to query agents
[19:18:55] [SIG] get_agents request sent for sessionId=ILUIWU
[19:18:55] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:18:55] [SERVER] Stopped reconnect polling
[19:18:55] [SIG] agents_list received: []
[19:18:55] [SIG] agents_list received: []
[19:18:55] [COMBINED_FETCH] Loaded 7196 read receipts, 873 messages with reactions
[19:18:55] [READBY_ENRICH] Enriched 50 messages with readBy data
[19:18:56] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:18:56] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:18:56] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:18:56] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:18:56] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:18:56] [GIF] msgId=18430 CONTINUE animation (elapsed=0.6007089614868164s)
[19:18:56] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:18:56] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:18:56] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:18:57] [MENU] dismissAnyExistingMenu called
[19:18:57] [MENU] dismissAnyExistingMenu completed
[19:18:57] [MENU] Created button 'Reply' at index 0
[19:18:57] [MENU] Created button 'Edit' at index 1
[19:18:57] [MENU] Created button 'Copy' at index 2
[19:18:57] [MENU] Created button 'Delete' at index 3
[19:18:57] [MENU] Menu added at y=487.0
[19:18:58] [MENU] menuButtonTouchDown - button title: Edit, tag: 1
[19:18:59] [MENU] menuButtonTapped - button title: Edit, tag: 1
[19:18:59] [MENU] Button frame: (0.0, 44.0, 120.0, 44.0), superview: true
[19:18:59] [MENU] Found action closure, dismissing menu first
[19:18:59] [MENU] dismissAnyExistingMenu called
[19:18:59] [MENU] Found menu with tag 9999, removing
[19:18:59] [MENU] Removing blur effect
[19:18:59] [MENU] Removing floating message snapshot
[19:18:59] [MENU] Recorded dismissal time for debounce
[19:18:59] [MENU] dismissAnyExistingMenu completed
[19:18:59] [MENU] Menu dismissed, executing action
[19:18:59] [MENU] Action executed
[19:18:59] [SCROLL_BTN] Showing button - 384pt from bottom > half 186pt
[19:19:19] ReloadData 11 - applying tab 0 filtering after message edit
[19:19:19] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:19:19] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:19:19] [GIF] SKIP - same msg, completed
[19:19:20] [MENU] dismissAnyExistingMenu called
[19:19:20] [MENU] dismissAnyExistingMenu completed
[19:19:20] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:19:20] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:19:20] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:19:21] [CLIENT_SIG] Event received: type=2 messageId=18429
[19:19:21] [CHAT] edit_message.php HTTP 200
── Body ──
{"ok":true,"message":"Message updated","session_id":"ILUIWU","message_id":18429,"event_type":2}
[19:19:21] [WS_EVENT] Received event: type=2, messageId=18429
[19:19:21] [WS_EVENT] Message edited/updated: 18429
[19:19:21] [COMBINED_FETCH] Loaded 7196 read receipts, 873 messages with reactions
[19:19:21] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:19:22] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:19:22] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:19:22] [GIF] SKIP - same msg, completed
[19:19:24] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:19:24] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:19:24] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:19:24] [LOCK] Lock button tapped - locking app immediately
[19:19:24] [LOCK] Received lock app notification
[19:19:24] [LIFECYCLE] App resigning active - cleared crash flag
[19:19:25] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:19:25] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:19:25] [LIFECYCLE] App entering background - cleared crash flag
[19:19:25] [CLIENT_SIG] Disconnecting
[19:19:25] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:19:25] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[19:19:25] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:19:25] In cleanupPeer
[19:19:25] In cleanupPeer
[19:19:25] [LIFECYCLE] WebRTC audio disabled
[19:19:25] [LIFECYCLE] AVAudioSession deactivated
[19:19:25] [LIFECYCLE] All connections stopped
[19:19:25] [SERVER] Stopped reconnect polling
[19:19:25] Will request stop of video 0
[19:19:25] Will request stop of video 0
[19:19:25] [CLIENT_SIG] WebSocket closed with code 1001
[19:19:25] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:19:25] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1001
[19:19:25] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[19:19:25] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:19:25] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:19:25] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[19:19:25] [WS] Query connection failed - cleaning up all agent connections and views
[19:19:25] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[19:19:25] [APP_TERMINATE] ⚠️ 2 pending uploads in DB queue:
[19:19:25] [APP_TERMINATE] - id=335, file=t_21b86ebc5e802df4.jpg, status=uploading, retries=0, size=0.0MB
[19:19:25] [APP_TERMINATE] - id=474, file=1f0e8529cd56643f.mov, status=uploading, retries=0, size=0.0MB
[19:19:25] [LIFECYCLE] ViewController deallocated[19:37:29] [LOG] Pruned 3301 entries older than 3 hours
[19:37:29] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[19:37:29] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[19:37:29] [GIPHY] SDK not available - using REST API fallback
[19:37:29] [BACKGROUND] Background fetch enabled
[19:37:29] [AUTH] Starting PIN authentication
[19:37:29] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:37:29] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:37:29] [CLEANUP] No old timer messages to delete
[19:37:29] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[19:37:29] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:37:29] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:37:29] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:37:29] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:37:29] [USER] ✅ User registered successfully
[19:37:29] [PUSH] User registration after token update: success
[19:37:29] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18430)...
[19:37:29] [CLIENT_SIG] WebSocket opened
[19:37:29] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:37:29] [CLIENT_SIG] Connected! clientId=VI3Bg2_V98afRl-Y
[19:37:29] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:37:29] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:37:29] [PRELOAD] No messages or parse error[19:37:30] [LOG] Pruned 32 entries older than 3 hours
[19:37:30] [SECURITY] Restored real session: ILUIWU
[19:37:30] [SECURITY] Restored real session: ILUIWU
[19:37:30] [SECURITY] Saved real session: ILUIWU
[19:37:30] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[19:37:30] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:37:30] Documents Directory: /var/mobile/Containers/Data/Application/BCEE3A1D-777A-4FA7-8430-4ADDB19C5FAA/Documents
[19:37:30] [THEME] Applying current theme
[19:37:30] [CHAT] Applied day theme (mode: day)
[19:37:30] [SECURITY] Saved real session: ILUIWU
[19:37:30] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:37:30] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:37:30] [NETWORK] Network monitor started
[19:37:30] [NETWORK] Status changed: connected
[19:37:30] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[19:37:30] Did transition
[19:37:31] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[19:37:31] [VIEWER] Screen lock enabled - normal idle behavior
[19:37:31] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[19:37:31] [VCC] ========== VideoConnectionClass INIT ==========
[19:37:31] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[19:37:31] [DATA AUDIO] ========== setupWebRTC() START ==========
[19:37:31] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[19:37:31] [DATA AUDIO] Creating encoder/decoder factories...
[19:37:31] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[19:37:31] [CODEC] Viewer selected encoder: AV1 (best quality)
[19:37:31] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[19:37:31] [DATA AUDIO] ✅ Factory created
[19:37:31] [DATA AUDIO] RTCAudioSession locked
[19:37:31] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[19:37:31] [DATA AUDIO] RTCAudioSession unlocked
[19:37:31] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[19:37:31] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[19:37:31] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[19:37:31] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:37:31] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[19:37:31] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[19:37:31] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[19:37:31] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[19:37:31] Did transition
[19:37:31] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[19:37:31] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:37:31] [CHUNK] Merged 868 reactions synchronously
[19:37:31] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:37:31] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[19:37:31] [GALLERY_DB] Raw datesent for msg 18430: '2026-01-21 18:17:11'
[19:37:31] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[19:37:31] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[19:37:31] [USER] ✅ User registered successfully
[19:37:31] [USER] User registration successful
[19:37:31] [GALLERY_DB] ✅ Loaded 476 media messages
[19:37:31] [MIGRATION] No messages need sender_name backfill
[19:37:31] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[19:37:31] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18430
[19:37:31] [INCREMENTAL_SYNC] ✅ No new messages
[19:37:31] [GALLERY] Filtered 476 -> 436 (only with local thumbnails)
[19:37:31] [GALLERY] First 5 after sort (newest first):
[19:37:31] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[19:37:31] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[19:37:31] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[19:37:31] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[19:37:31] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[19:37:31] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[19:37:31] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:37:31] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[19:37:31] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:37:31] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:37:31] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:37:31] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:37:31] [GIF] msgId=18430 START fresh animation
[19:37:31] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:37:31] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:37:31] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:37:31] [SERVER] Starting reconnect polling (5s interval)
[19:37:31] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[19:37:31] [ICONS] Offset applied: -14.6
[19:37:31] [ICONS] New left margin: 11.2, New right margin: 11.3
[19:37:31] [ICONS] Chat center: (31.2, 87.0)
[19:37:31] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[19:37:31] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[19:37:31] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[19:37:31] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[19:37:31] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[19:37:31] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[19:37:31] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[19:37:31] [ICONS] Screen width: 440.0
[19:37:31] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[19:37:31] [UNSENT_RETRY] Checking for unsent messages...
[19:37:31] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[19:37:31] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[19:37:31] [UPLOAD_RECOVERY] Session: ILUIWU
[19:37:31] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[19:37:31] [UPLOAD_RECOVERY] Checking recent media messages on server...
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18428, file=f36a462089f1685a.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[19:37:31] [UPLOAD_RECOVERY] Verifying 11 media files exist on server...
[19:37:31] [PENDING_UPLOAD] Total pending upload messages: 0
[19:37:31] [UNSENT_RETRY] No unsent messages found
[19:37:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:37:31] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:37:31] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:37:31] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[19:37:31] [UPLOAD_RECOVERY] ✅ All media files verified on server
[19:37:31] new_session POST ok: token len=157
[19:37:31] HELLO → sent (fetched token, role=query)
[19:37:31] [SIG] hello_ok received for query connection - ready to query agents
[19:37:31] [SIG] get_agents request sent for sessionId=ILUIWU
[19:37:31] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:37:31] [SERVER] Stopped reconnect polling
[19:37:31] [SIG] agents_list received: []
[19:37:31] [SIG] agents_list received: []
[19:37:31] [COMBINED_FETCH] Loaded 7196 read receipts, 873 messages with reactions
[19:37:31] [READBY_ENRICH] Enriched 50 messages with readBy data
[19:37:31] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:37:31] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:37:31] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:37:31] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:37:31] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:37:31] [GIF] msgId=18430 CONTINUE animation (elapsed=0.6830060482025146s)
[19:37:31] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:37:31] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:37:31] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:37:41] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:37:41] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[19:37:41] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[19:37:41] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 18430, 18429, 18428, 18427]
[19:37:41] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:37:41] [GIF] SKIP - same msg, completed
[19:37:41] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:37:41] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:37:42] [CLIENT_SIG] Event received: type=0 messageId=18431
[19:37:42] [WS_EVENT] Received event: type=0, messageId=18431
[19:37:42] [WS_EVENT] 📨 New message notification (msgId=18431) - triggering incremental refresh, currentMsgCount=51
[19:37:42] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18431,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:37:41"}
[19:37:42] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[19:37:42] [CHAT] receive_message.php JSON: ["session_id": ILUIWU, "ok": 1, "message_id": 18431, "file_name": , "message_type": 0, "datesent_utc": 2026-01-21 18:37:41]
[19:37:42] [DB_UPGRADE] Upgrading message ID: -1 → 18431, preserveOriginalDate=false
[19:37:42] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18430
[19:37:42] [DB_UPGRADE] ✅ Upgraded -1 → 18431 with send_status=0, 1 row(s) affected
[19:37:42] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 18431
[19:37:42] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 18431
[19:37:42] ReloadData 9
[19:37:42] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:37:42] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:37:42] [GIF] SKIP - same msg, completed
[19:37:42] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:37:42] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[19:37:42] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:37:42] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:37:42] [GIF] SKIP - same msg, completed
[19:37:52] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:37:52] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[19:37:52] [SEND_MESSAGE] ✅ Added optimistic message id=-2 to arrays, newMsgCount=52
[19:37:52] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-2, 18431, 18430, 18429, 18428]
[19:37:52] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:37:52] [GIF] SKIP - same msg, completed
[19:37:52] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:37:52] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:37:53] [CLIENT_SIG] Event received: type=0 messageId=18432
[19:37:53] [WS_EVENT] Received event: type=0, messageId=18432
[19:37:53] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18432,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:37:52"}
[19:37:53] [WS_EVENT] 📨 New message notification (msgId=18432) - triggering incremental refresh, currentMsgCount=52
[19:37:53] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[19:37:53] [CHAT] receive_message.php JSON: ["ok": 1, "message_type": 0, "file_name": , "datesent_utc": 2026-01-21 18:37:52, "session_id": ILUIWU, "message_id": 18432]
[19:37:53] [DB_UPGRADE] Upgrading message ID: -2 → 18432, preserveOriginalDate=false
[19:37:53] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18431
[19:37:53] [DB_UPGRADE] ✅ Upgraded -2 → 18432 with send_status=0, 1 row(s) affected
[19:37:53] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -2 → 18432
[19:37:53] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -2 → 18432
[19:37:53] ReloadData 9
[19:37:53] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:37:53] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:37:53] [GIF] SKIP - same msg, completed
[19:37:53] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:37:53] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[19:37:53] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:37:53] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:37:53] [GIF] SKIP - same msg, completed
[19:37:58] [LIFECYCLE] App resigning active - cleared crash flag
[19:37:59] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[19:37:59] [SECURITY] Saved background timestamp
[19:37:59] [LIFECYCLE] App entering background - cleared crash flag
[19:37:59] [CLIENT_SIG] Disconnecting
[19:37:59] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:37:59] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[19:37:59] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:37:59] In cleanupPeer
[19:37:59] In cleanupPeer
[19:37:59] [LIFECYCLE] WebRTC audio disabled
[19:37:59] [LIFECYCLE] AVAudioSession deactivated
[19:37:59] [LIFECYCLE] All connections stopped
[19:37:59] [CLIENT_SIG] WebSocket closed with code 1001
[19:37:59] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:37:59] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:37:59] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:37:59] [SERVER] Stopped reconnect polling
[19:37:59] Will request stop of video 0
[19:37:59] Will request stop of video 0
[19:37:59] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1001
[19:37:59] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[19:37:59] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[19:37:59] [WS] Query connection failed - cleaning up all agent connections and views
[19:37:59] [PIP] Removing 0 tracks from PiP for connection 0
[19:37:59] [PIP] ✅ All tracks removed for connection 0
[19:37:59] [PIP] Removing 0 tracks from PiP for connection 0
[19:37:59] [PIP] ✅ All tracks removed for connection 0
[19:37:59] [CLEANUP] ========================================
[19:37:59] [CLEANUP] Cleaning up all agent connections and views
[19:37:59] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:37:59] [CLEANUP] Stopped and removed 0 video connections
[19:37:59] [CLEANUP] Removed 0 video views
[19:37:59] [CLEANUP] Removed 0 feed scroll views
[19:37:59] [CLEANUP] Removed 0 status labels
[19:37:59] [CLEANUP] Reset agent query state
[19:37:59] [CLEANUP] Updated page indicator
[19:37:59] [CLEANUP] Rebuilt video layout
[19:37:59] [CLEANUP] ✅ All agent connections and views cleaned up
[19:37:59] [CLEANUP] ========================================
[19:37:59] [SERVER] Skipping reconnect polling - app is in background
[19:37:59] [WS] URLSession invalidated successfully
[19:37:59] [CLEANUP] ========================================
[19:37:59] [CLEANUP] Cleaning up all agent connections and views
[19:37:59] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:37:59] [CLEANUP] Stopped and removed 0 video connections
[19:37:59] [CLEANUP] Removed 0 video views
[19:37:59] [CLEANUP] Removed 0 feed scroll views
[19:37:59] [CLEANUP] Removed 0 status labels
[19:37:59] [CLEANUP] Reset agent query state
[19:37:59] [CLEANUP] Updated page indicator
[19:37:59] [CLEANUP] Rebuilt video layout
[19:37:59] [CLEANUP] ✅ All agent connections and views cleaned up
[19:37:59] [CLEANUP] ========================================
[19:37:59] [SERVER] Skipping reconnect polling - app is in background
[19:38:14] [SECURITY] Timeout check: elapsed=15.124987125396729s, timeout=300.0s
[19:38:14] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:38:14] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:38:14] [LIFECYCLE] App entering foreground - restoring connections
[19:38:14] [UPLOAD_RETRY] No pending uploads to retry
[19:38:14] [LIFECYCLE] Merged 868 reactions from local DB
[19:38:14] [LIFECYCLE] WebRTC audio re-enabled
[19:38:14] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:38:14] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:38:14] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:38:14] [VIEWER] Reconnecting after background - querying agents
[19:38:14] [UNSENT_RETRY] Checking for unsent messages...
[19:38:14] [PENDING_UPLOAD] Total pending upload messages: 0
[19:38:14] [UNSENT_RETRY] No unsent messages found
[19:38:14] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[19:38:14] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:38:14] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:38:14] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:38:14] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:38:14] [GIF] SKIP - same msg, completed
[19:38:14] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[19:38:14] [SECURITY] Within timeout - cleared background flag
[19:38:14] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:38:14] [PUSH] handlePollEventsNotification userInfo: [:]
[19:38:14] [PUSH] No message_id in userInfo
[19:38:14] [PUSH] No operation_type in userInfo
[19:38:14] [FAST_REFRESH] Evolution disabled - performing incremental sync
[19:38:14] [FAST_REFRESH] Already have 52 messages - skipping local DB load
[19:38:14] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[19:38:14] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[19:38:14] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[19:38:14] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18432
[19:38:14] [CLIENT_SIG] WebSocket opened
[19:38:14] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:38:14] [CLIENT_SIG] Connected! clientId=OzMnp7SBu7sw3gRl
[19:38:14] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:38:14] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:38:14] [INCREMENTAL_SYNC] ✅ No new messages
[19:38:14] [FAST_REFRESH] Incremental sync complete - 52 messages
[19:38:14] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:38:14] HELLO → sent (cached token, role=query)
[19:38:14] [SIG] hello_ok received for query connection - ready to query agents
[19:38:14] [SIG] get_agents request sent for sessionId=ILUIWU
[19:38:14] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:38:14] [SERVER] Stopped reconnect polling
[19:38:14] [SIG] agents_list received: []
[19:38:14] [SIG] agents_list received: []
[19:38:15] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:38:15] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:38:15] [GIF] SKIP - same msg, completed
[19:38:15] [COMBINED_FETCH] Loaded 7198 read receipts, 873 messages with reactions
[19:38:15] [FOREGROUND] Enriched 0 messages with readBy data from server
[19:38:15] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:38:15] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:38:15] [GIF] SKIP - same msg, completed
[19:38:15] [COMBINED_FETCH] Loaded 7198 read receipts, 873 messages with reactions
[19:38:15] [FAST_REFRESH] Enriched 52 messages with readBy data
[19:38:15] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:38:15] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:38:15] [GIF] SKIP - same msg, completed
[19:38:24] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[19:38:24] [WS] Query connection error - cleaning up all agent connections and views
[19:38:24] [CLEANUP] ========================================
[19:38:24] [CLEANUP] Cleaning up all agent connections and views
[19:38:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:38:24] [CLEANUP] Stopped and removed 0 video connections
[19:38:24] [CLEANUP] Removed 0 video views
[19:38:24] [CLEANUP] Removed 0 feed scroll views
[19:38:24] [CLEANUP] Removed 0 status labels
[19:38:24] [CLEANUP] Reset agent query state
[19:38:24] [CLEANUP] Updated page indicator
[19:38:24] [CLEANUP] Rebuilt video layout
[19:38:24] [CLEANUP] ✅ All agent connections and views cleaned up
[19:38:24] [CLEANUP] ========================================
[19:38:24] [SERVER] Starting reconnect polling (5s interval)
[19:38:29] [SERVER] Polling - attempting to reconnect...
[19:38:34] [SERVER] Polling - attempting to reconnect...
[19:38:39] [SERVER] Polling - attempting to reconnect...
[19:38:44] [SERVER] Polling - attempting to reconnect...
[19:38:47] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:38:47] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=52, isReloading=false
[19:38:47] [SEND_MESSAGE] ✅ Added optimistic message id=-3 to arrays, newMsgCount=53
[19:38:47] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[-3, 18432, 18431, 18430, 18429]
[19:38:47] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:38:47] [GIF] SKIP - same msg, completed
[19:38:47] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:38:47] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:38:48] [CLIENT_SIG] Event received: type=0 messageId=18433
[19:38:48] [WS_EVENT] Received event: type=0, messageId=18433
[19:38:48] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18433,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:38:47"}
[19:38:48] [WS_EVENT] 📨 New message notification (msgId=18433) - triggering incremental refresh, currentMsgCount=53
[19:38:48] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[19:38:48] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-01-21 18:38:47, "ok": 1, "message_type": 0, "file_name": , "session_id": ILUIWU, "message_id": 18433]
[19:38:48] [DB_UPGRADE] Upgrading message ID: -3 → 18433, preserveOriginalDate=false
[19:38:48] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18432
[19:38:48] [DB_UPGRADE] ✅ Upgraded -3 → 18433 with send_status=0, 1 row(s) affected
[19:38:48] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -3 → 18433
[19:38:48] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -3 → 18433
[19:38:48] ReloadData 9
[19:38:48] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:38:48] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:38:48] [GIF] SKIP - same msg, completed
[19:38:48] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:38:48] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[19:38:48] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:38:48] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:38:48] [GIF] SKIP - same msg, completed
[19:38:49] [LOCK] Lock button tapped - locking app immediately
[19:38:49] [LOCK] Received lock app notification
[19:38:49] [LIFECYCLE] App resigning active - cleared crash flag
[19:38:49] [SERVER] Polling - attempting to reconnect...
[19:38:50] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:38:50] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:38:50] [LIFECYCLE] App entering background - cleared crash flag
[19:38:50] [CLIENT_SIG] Disconnecting
[19:38:50] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:38:50] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[19:38:50] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:38:50] In cleanupPeer
[19:38:50] In cleanupPeer
[19:38:50] [LIFECYCLE] WebRTC audio disabled
[19:38:50] [LIFECYCLE] AVAudioSession deactivated
[19:38:50] [LIFECYCLE] All connections stopped
[19:38:50] [CLIENT_SIG] WebSocket closed with code 1001
[19:38:50] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:38:50] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:38:50] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:38:50] [SERVER] Stopped reconnect polling
[19:38:50] Will request stop of video 0
[19:38:50] Will request stop of video 0
[19:38:50] [WS] URLSession invalidated successfully
[19:38:50] [PIP] Removing 0 tracks from PiP for connection 0
[19:38:50] [PIP] ✅ All tracks removed for connection 0
[19:38:50] [PIP] Removing 0 tracks from PiP for connection 0
[19:38:50] [PIP] ✅ All tracks removed for connection 0
[19:38:51] [WS] Connection failed: The operation couldn’t be completed. Software caused connection abort
[19:38:51] [WS] Query connection failed - cleaning up all agent connections and views
[19:38:51] [CLEANUP] ========================================
[19:38:51] [CLEANUP] Cleaning up all agent connections and views
[19:38:51] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:38:51] [CLEANUP] Stopped and removed 0 video connections
[19:38:51] [CLEANUP] Removed 0 video views
[19:38:51] [CLEANUP] Removed 0 feed scroll views
[19:38:51] [CLEANUP] Removed 0 status labels
[19:38:51] [CLEANUP] Reset agent query state
[19:38:51] [CLEANUP] Updated page indicator
[19:38:51] [CLEANUP] Rebuilt video layout
[19:38:51] [CLEANUP] ✅ All agent connections and views cleaned up
[19:38:51] [CLEANUP] ========================================
[19:38:51] [SERVER] Skipping reconnect polling - app is in background
[19:41:22] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:41:22] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:41:22] [LIFECYCLE] App entering foreground - restoring connections
[19:41:22] [LIFECYCLE] Away > 2 minutes (152s) - will scroll to bottom
[19:41:22] [UPLOAD_RETRY] No pending uploads to retry
[19:41:22] [LIFECYCLE] Merged 868 reactions from local DB
[19:41:22] [LIFECYCLE] WebRTC audio re-enabled
[19:41:22] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:41:22] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:41:22] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:41:22] [VIEWER] Reconnecting after background - querying agents
[19:41:22] [UNSENT_RETRY] Checking for unsent messages...
[19:41:22] [PENDING_UPLOAD] Total pending upload messages: 0
[19:41:22] [UNSENT_RETRY] No unsent messages found
[19:41:22] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[19:41:22] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:41:22] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:41:22] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:41:22] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:41:22] [GIF] SKIP - same msg, completed
[19:41:22] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:41:22] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:41:22] [PUSH] handlePollEventsNotification userInfo: [:]
[19:41:22] [PUSH] No message_id in userInfo
[19:41:22] [PUSH] No operation_type in userInfo
[19:41:22] [FAST_REFRESH] Evolution disabled - performing incremental sync
[19:41:22] [FAST_REFRESH] Already have 53 messages - skipping local DB load
[19:41:22] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[19:41:22] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[19:41:22] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[19:41:22] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18433
[19:41:22] [CLIENT_SIG] WebSocket opened
[19:41:22] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:41:22] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:41:22] HELLO → sent (cached token, role=query)
[19:41:22] [CLIENT_SIG] Connected! clientId=_mLD25ac8zu0MaxU
[19:41:22] [SIG] hello_ok received for query connection - ready to query agents
[19:41:22] [SIG] get_agents request sent for sessionId=ILUIWU
[19:41:22] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:41:22] [SERVER] Stopped reconnect polling
[19:41:22] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:41:22] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:41:22] [SIG] agents_list received: []
[19:41:22] [SIG] agents_list received: []
[19:41:22] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:41:22] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:41:22] [GIF] SKIP - same msg, completed
[19:41:22] [INCREMENTAL_SYNC] ✅ No new messages
[19:41:22] [FAST_REFRESH] Incremental sync complete - 53 messages
[19:41:23] [COMBINED_FETCH] Loaded 7199 read receipts, 873 messages with reactions
[19:41:23] [FAST_REFRESH] Enriched 53 messages with readBy data
[19:41:23] [COMBINED_FETCH] Loaded 7199 read receipts, 873 messages with reactions
[19:41:23] [FOREGROUND] Enriched 0 messages with readBy data from server
[19:41:23] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:41:23] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18381, 18382, 18383, 18384, 18385]
[19:41:23] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:41:23] [GIF] SKIP - same msg, completed[19:41:23] [LOG] Pruned 93 entries older than 3 hours
[19:41:23] [SECURITY] Restored real session: ILUIWU
[19:41:23] [SECURITY] Restored real session: ILUIWU
[19:41:24] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[19:41:24] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[19:41:24] [AUTH] UI update complete
[19:41:24] [FAKE MODE] Exiting fake mode, restoring real session
[19:41:24] [SECURITY] Restored real session: ILUIWU
[19:41:24] [SECURITY] Saved real session: ILUIWU
[19:41:24] [FAKE MODE] ✅ Restored real session: ILUIWU
[19:41:24] [FAKE MODE] Loaded 50 messages (limited to page size)
[19:41:24] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:41:24] [GIF] SKIP - same msg, completed
[19:41:24] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:41:24] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:41:24] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18384, 18385, 18386, 18387, 18388]
[19:41:24] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:41:24] [GIF] SKIP - same msg, completed
[19:41:24] [USER] ✅ User registered successfully
[19:41:24] [PUSH] User registration after token update: success
[19:41:24] [COMBINED_FETCH] Loaded 7199 read receipts, 873 messages with reactions
[19:41:24] [FAKE MODE] Enriched 50 messages with readBy data
[19:41:24] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18384, 18385, 18386, 18387, 18388]
[19:41:25] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:41:25] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:41:25] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:41:25] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=true
[19:41:25] [GIF] msgId=18430 globally completed - showing static frame
[19:41:25] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:41:25] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:41:25] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:41:26] [MENU] dismissAnyExistingMenu called
[19:41:26] [MENU] dismissAnyExistingMenu completed
[19:41:26] [MENU] Created button 'Reply' at index 0
[19:41:26] [MENU] Created button 'Edit' at index 1
[19:41:26] [MENU] Created button 'Copy' at index 2
[19:41:26] [MENU] Created button 'Delete' at index 3
[19:41:26] [MENU] Menu added at y=454.5
[19:41:27] [MENU] menuButtonTouchDown - button title: Edit, tag: 1
[19:41:27] [MENU] menuButtonTapped - button title: Edit, tag: 1
[19:41:27] [MENU] Button frame: (0.0, 44.0, 120.0, 44.0), superview: true
[19:41:27] [MENU] Found action closure, dismissing menu first
[19:41:27] [MENU] dismissAnyExistingMenu called
[19:41:27] [MENU] Found menu with tag 9999, removing
[19:41:27] [MENU] Removing blur effect
[19:41:27] [MENU] Removing floating message snapshot
[19:41:27] [MENU] Recorded dismissal time for debounce
[19:41:27] [MENU] dismissAnyExistingMenu completed
[19:41:27] [MENU] Menu dismissed, executing action
[19:41:27] [MENU] Action executed
[19:41:27] [SCROLL_BTN] Showing button - 327pt from bottom > half 214pt
[19:41:32] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[19:41:32] [WS] Query connection error - cleaning up all agent connections and views
[19:41:32] [CLEANUP] ========================================
[19:41:32] [CLEANUP] Cleaning up all agent connections and views
[19:41:32] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:41:32] [CLEANUP] Stopped and removed 0 video connections
[19:41:32] [CLEANUP] Removed 0 video views
[19:41:32] [CLEANUP] Removed 0 feed scroll views
[19:41:32] [CLEANUP] Removed 0 status labels
[19:41:32] [CLEANUP] Reset agent query state
[19:41:32] [CLEANUP] Updated page indicator
[19:41:32] [CLEANUP] Rebuilt video layout
[19:41:32] [CLEANUP] ✅ All agent connections and views cleaned up
[19:41:32] [CLEANUP] ========================================
[19:41:32] [SERVER] Starting reconnect polling (5s interval)
[19:41:37] [SERVER] Polling - attempting to reconnect...
[19:41:42] [SERVER] Polling - attempting to reconnect...
[19:41:44] ReloadData 11 - applying tab 0 filtering after message edit
[19:41:44] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18384, 18385, 18386, 18387, 18388]
[19:41:44] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:41:44] [GIF] SKIP - same msg, completed
[19:41:45] [CLIENT_SIG] Event received: type=2 messageId=18432
[19:41:45] [CHAT] edit_message.php HTTP 200
── Body ──
{"ok":true,"message":"Message updated","session_id":"ILUIWU","message_id":18432,"event_type":2}
[19:41:45] [WS_EVENT] Received event: type=2, messageId=18432
[19:41:45] [WS_EVENT] Message edited/updated: 18432
[19:41:45] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18384, 18385, 18386, 18387, 18388]
[19:41:45] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:41:45] [GIF] SKIP - same msg, completed
[19:41:46] [COMBINED_FETCH] Loaded 7199 read receipts, 873 messages with reactions
[19:41:46] [LOCK] Lock button tapped - locking app immediately
[19:41:46] [LOCK] Received lock app notification
[19:41:46] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18384, 18385, 18386, 18387, 18388]
[19:41:46] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:41:46] [GIF] SKIP - same msg, completed
[19:41:46] [LIFECYCLE] App resigning active - cleared crash flag
[19:41:47] [SERVER] Polling - attempting to reconnect...
[19:41:47] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:41:47] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:41:47] [LIFECYCLE] App entering background - cleared crash flag
[19:41:47] [CLIENT_SIG] Disconnecting
[19:41:47] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:41:47] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[19:41:47] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:41:47] In cleanupPeer
[19:41:47] In cleanupPeer
[19:41:47] [LIFECYCLE] WebRTC audio disabled
[19:41:47] [LIFECYCLE] AVAudioSession deactivated
[19:41:47] [LIFECYCLE] All connections stopped
[19:41:47] [CLIENT_SIG] WebSocket closed with code 1001
[19:41:47] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:41:47] [SERVER] Stopped reconnect polling
[19:41:47] [WS] URLSession invalidated successfully
[19:41:47] Will request stop of video 0
[19:41:47] Will request stop of video 0
[19:41:47] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:41:47] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:41:47] [PIP] Removing 0 tracks from PiP for connection 0
[19:41:47] [PIP] ✅ All tracks removed for connection 0
[19:41:47] [PIP] Removing 0 tracks from PiP for connection 0
[19:41:47] [PIP] ✅ All tracks removed for connection 0
[19:49:01] [CRASH] No crash detected
[19:49:01] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[19:49:01] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[19:49:01] [GIPHY] SDK not available - using REST API fallback
[19:49:01] [BACKGROUND] Background fetch enabled
[19:49:01] [AUTH] Starting PIN authentication
[19:49:01] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:49:01] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:49:01] [CLEANUP] No old timer messages to delete
[19:49:01] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:49:01] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:49:01] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[19:49:01] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18433)...
[19:49:01] [CLIENT_SIG] WebSocket opened
[19:49:01] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:49:01] [CLIENT_SIG] Connected! clientId=bp7vD3reGk4yNAl_
[19:49:01] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:49:01] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:49:01] [PRELOAD] No messages or parse error
[19:49:01] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:49:01] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:49:01] [USER] ✅ User registered successfully
[19:49:01] [PUSH] User registration after token update: success
[19:49:04] [PIN_AUTH] Correct PIN
[19:49:04] [SECURITY] Restored real session: ILUIWU
[19:49:04] [SECURITY] Restored real session: ILUIWU
[19:49:04] [SECURITY] Saved real session: ILUIWU
[19:49:04] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[19:49:04] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:49:04] Documents Directory: /var/mobile/Containers/Data/Application/BBFC9F60-CAC6-4879-97D2-CF4DDD0C5899/Documents
[19:49:04] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[19:49:04] [THEME] Applying current theme
[19:49:04] [CHAT] Applied day theme (mode: day)
[19:49:04] [SECURITY] Saved real session: ILUIWU
[19:49:04] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:49:04] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:49:04] [NETWORK] Network monitor started
[19:49:04] [NETWORK] Status changed: connected
[19:49:04] Did transition
[19:49:04] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[19:49:04] [VIEWER] Screen lock enabled - normal idle behavior
[19:49:04] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[19:49:04] [VCC] ========== VideoConnectionClass INIT ==========
[19:49:04] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[19:49:04] [DATA AUDIO] ========== setupWebRTC() START ==========
[19:49:04] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[19:49:04] [DATA AUDIO] Creating encoder/decoder factories...
[19:49:04] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[19:49:04] [CODEC] Viewer selected encoder: AV1 (best quality)
[19:49:04] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[19:49:04] [DATA AUDIO] ✅ Factory created
[19:49:04] [DATA AUDIO] RTCAudioSession locked
[19:49:04] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[19:49:04] [DATA AUDIO] RTCAudioSession unlocked
[19:49:04] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[19:49:04] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[19:49:04] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[19:49:04] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:49:04] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[19:49:04] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[19:49:04] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[19:49:04] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[19:49:04] Did transition
[19:49:04] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[19:49:04] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:49:04] [CHUNK] Merged 868 reactions synchronously
[19:49:04] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:49:04] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[19:49:04] [MIGRATION] No messages need sender_name backfill
[19:49:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[19:49:04] [GALLERY_DB] Raw datesent for msg 18430: '2026-01-21 18:17:11'
[19:49:04] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[19:49:04] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[19:49:04] [GALLERY_DB] ✅ Loaded 476 media messages
[19:49:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18433
[19:49:04] [GALLERY] Filtered 476 -> 436 (only with local thumbnails)
[19:49:04] [GALLERY] First 5 after sort (newest first):
[19:49:04] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[19:49:04] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[19:49:04] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[19:49:04] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[19:49:04] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[19:49:04] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[19:49:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18384, 18385, 18386, 18387, 18388]
[19:49:05] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[19:49:05] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:49:05] [GIF] msgId=18430 START fresh animation
[19:49:05] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:49:05] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:49:05] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:49:05] [USER] ✅ User registered successfully
[19:49:05] [USER] User registration successful
[19:49:05] [SERVER] Starting reconnect polling (5s interval)
[19:49:05] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[19:49:05] [ICONS] Offset applied: -14.6
[19:49:05] [ICONS] New left margin: 11.2, New right margin: 11.3
[19:49:05] [ICONS] Chat center: (31.2, 87.0)
[19:49:05] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[19:49:05] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[19:49:05] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[19:49:05] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[19:49:05] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[19:49:05] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[19:49:05] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[19:49:05] [ICONS] Screen width: 440.0
[19:49:05] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:49:05] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:49:05] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:49:05] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[19:49:05] [INCREMENTAL_SYNC] ✅ No new messages
[19:49:05] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[19:49:05] [UNSENT_RETRY] Checking for unsent messages...
[19:49:05] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[19:49:05] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[19:49:05] [UPLOAD_RECOVERY] Session: ILUIWU
[19:49:05] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[19:49:05] [UPLOAD_RECOVERY] Checking recent media messages on server...
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18428, file=f36a462089f1685a.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[19:49:05] [UPLOAD_RECOVERY] Verifying 11 media files exist on server...
[19:49:05] [PENDING_UPLOAD] Total pending upload messages: 0
[19:49:05] [UNSENT_RETRY] No unsent messages found
[19:49:05] new_session POST ok: token len=157
[19:49:05] HELLO → sent (fetched token, role=query)
[19:49:05] [SIG] hello_ok received for query connection - ready to query agents
[19:49:05] [SIG] get_agents request sent for sessionId=ILUIWU
[19:49:05] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:49:05] [SERVER] Stopped reconnect polling
[19:49:05] [SIG] agents_list received: []
[19:49:05] [SIG] agents_list received: []
[19:49:05] [UPLOAD_RECOVERY] ✅ All media files verified on server
[19:49:05] [COMBINED_FETCH] Loaded 7199 read receipts, 873 messages with reactions
[19:49:05] [READBY_ENRICH] Enriched 50 messages with readBy data
[19:49:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18384, 18385, 18386, 18387, 18388]
[19:49:05] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:49:05] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:49:05] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:49:05] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:49:05] [GIF] msgId=18430 CONTINUE animation (elapsed=0.6893410682678223s)
[19:49:05] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:49:05] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:49:05] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:49:14] [MENU] dismissAnyExistingMenu called
[19:49:14] [MENU] dismissAnyExistingMenu completed
[19:49:14] [SCROLL_BTN] Showing button - 380pt from bottom > half 379pt
[19:49:15] [MENU] dismissAnyExistingMenu called
[19:49:15] [MENU] dismissAnyExistingMenu completed
[19:49:17] [LOCK] Lock button tapped - locking app immediately
[19:49:17] [LOCK] Received lock app notification
[19:49:18] [LIFECYCLE] App resigning active - cleared crash flag
[19:49:19] [NETWORK] Status changed: connected
[19:49:19] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:51:59] [CRASH] No crash detected
[19:51:59] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[19:51:59] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[19:51:59] [GIPHY] SDK not available - using REST API fallback
[19:51:59] [BACKGROUND] Background fetch enabled
[19:51:59] [AUTH] Starting PIN authentication
[19:51:59] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:51:59] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:51:59] [CLEANUP] No old timer messages to delete
[19:51:59] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:51:59] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:51:59] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[19:51:59] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:51:59] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:51:59] [USER] ✅ User registered successfully
[19:51:59] [PUSH] User registration after token update: success
[19:51:59] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18433)...
[19:51:59] [PRELOAD] No messages or parse error
[19:52:00] [CLIENT_SIG] WebSocket opened
[19:52:00] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:52:00] [CLIENT_SIG] Connected! clientId=MNOpdpeBWrsnuXzl
[19:52:00] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:52:00] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:52:02] [PIN_AUTH] Correct PIN
[19:52:02] [SECURITY] Restored real session: ILUIWU
[19:52:02] [SECURITY] Restored real session: ILUIWU
[19:52:02] [SECURITY] Saved real session: ILUIWU
[19:52:02] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[19:52:02] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:52:02] Documents Directory: /var/mobile/Containers/Data/Application/FEAD2E1F-C4A1-4969-9070-16A67DA77312/Documents
[19:52:02] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[19:52:02] [THEME] Applying current theme
[19:52:02] [CHAT] Applied day theme (mode: day)
[19:52:02] [SECURITY] Saved real session: ILUIWU
[19:52:02] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:52:02] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:52:02] [NETWORK] Network monitor started
[19:52:02] [NETWORK] Status changed: connected
[19:52:02] Did transition
[19:52:02] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[19:52:02] [VIEWER] Screen lock enabled - normal idle behavior
[19:52:02] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[19:52:02] [VCC] ========== VideoConnectionClass INIT ==========
[19:52:02] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[19:52:02] [DATA AUDIO] ========== setupWebRTC() START ==========
[19:52:02] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[19:52:02] [DATA AUDIO] Creating encoder/decoder factories...
[19:52:02] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[19:52:02] [CODEC] Viewer selected encoder: AV1 (best quality)
[19:52:02] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[19:52:02] [DATA AUDIO] ✅ Factory created
[19:52:02] [DATA AUDIO] RTCAudioSession locked
[19:52:02] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[19:52:02] [DATA AUDIO] RTCAudioSession unlocked
[19:52:02] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[19:52:02] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[19:52:02] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[19:52:02] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:52:02] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[19:52:02] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[19:52:02] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[19:52:02] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[19:52:02] Did transition
[19:52:02] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[19:52:02] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:52:02] [CHUNK] Merged 868 reactions synchronously
[19:52:02] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:52:02] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[19:52:02] [MIGRATION] No messages need sender_name backfill
[19:52:02] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[19:52:02] [GALLERY_DB] Raw datesent for msg 18430: '2026-01-21 18:17:11'
[19:52:02] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[19:52:02] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[19:52:02] [USER] ✅ User registered successfully
[19:52:02] [USER] User registration successful
[19:52:02] [GALLERY_DB] ✅ Loaded 476 media messages
[19:52:02] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18433
[19:52:02] [INCREMENTAL_SYNC] ✅ No new messages
[19:52:02] [GALLERY] Filtered 476 -> 436 (only with local thumbnails)
[19:52:02] [GALLERY] First 5 after sort (newest first):
[19:52:02] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[19:52:02] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[19:52:02] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[19:52:02] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[19:52:02] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[19:52:02] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[19:52:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18384, 18385, 18386, 18387, 18388]
[19:52:02] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[19:52:02] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:52:02] [GIF] msgId=18430 START fresh animation
[19:52:02] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:52:02] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:52:02] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:52:02] [SERVER] Starting reconnect polling (5s interval)
[19:52:02] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[19:52:02] [ICONS] Offset applied: -14.6
[19:52:02] [ICONS] New left margin: 11.2, New right margin: 11.3
[19:52:02] [ICONS] Chat center: (31.2, 87.0)
[19:52:02] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[19:52:02] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[19:52:02] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[19:52:02] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[19:52:02] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[19:52:02] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[19:52:02] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[19:52:02] [ICONS] Screen width: 440.0
[19:52:02] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[19:52:02] [UNSENT_RETRY] Checking for unsent messages...
[19:52:02] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[19:52:02] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[19:52:02] [UPLOAD_RECOVERY] Session: ILUIWU
[19:52:02] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[19:52:02] [UPLOAD_RECOVERY] Checking recent media messages on server...
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18428, file=f36a462089f1685a.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[19:52:02] [UPLOAD_RECOVERY] Verifying 11 media files exist on server...
[19:52:02] [PENDING_UPLOAD] Total pending upload messages: 0
[19:52:02] [UNSENT_RETRY] No unsent messages found
[19:52:02] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:52:02] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:52:02] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:52:02] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[19:52:02] [UPLOAD_RECOVERY] ✅ All media files verified on server
[19:52:02] new_session POST ok: token len=157
[19:52:02] HELLO → sent (fetched token, role=query)
[19:52:02] [SIG] hello_ok received for query connection - ready to query agents
[19:52:02] [SIG] get_agents request sent for sessionId=ILUIWU
[19:52:02] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:52:02] [SERVER] Stopped reconnect polling
[19:52:02] [SIG] agents_list received: []
[19:52:02] [SIG] agents_list received: []
[19:52:03] [COMBINED_FETCH] Loaded 7199 read receipts, 873 messages with reactions
[19:52:03] [READBY_ENRICH] Enriched 50 messages with readBy data
[19:52:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18384, 18385, 18386, 18387, 18388]
[19:52:03] [CELL_UPLOAD] configure: msgId=18428, file=f36a462089f1685a.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[19:52:03] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[19:52:03] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f36a462089f1685a.jpg, overlayExists=true
[19:52:03] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:52:03] [GIF] msgId=18430 CONTINUE animation (elapsed=1.0060440301895142s)
[19:52:03] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:52:03] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:52:03] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:52:05] [LOCK] Lock button tapped - locking app immediately
[19:52:05] [LOCK] Received lock app notification
[19:52:05] [LIFECYCLE] App resigning active - cleared crash flag
[19:52:06] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:52:06] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:52:06] [LIFECYCLE] App entering background - cleared crash flag
[19:52:06] [CLIENT_SIG] Disconnecting
[19:52:06] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:52:06] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[19:52:06] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:52:06] In cleanupPeer
[19:52:06] In cleanupPeer
[19:52:06] [LIFECYCLE] WebRTC audio disabled
[19:52:06] [LIFECYCLE] AVAudioSession deactivated
[19:52:06] [LIFECYCLE] All connections stopped
[19:52:06] [CLIENT_SIG] WebSocket closed with code 1001
[19:52:06] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:52:06] [SERVER] Stopped reconnect polling
[19:52:06] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1001
[19:52:06] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[19:52:06] Will request stop of video 0
[19:52:06] Will request stop of video 0
[19:52:06] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[19:52:06] [WS] Query connection failed - cleaning up all agent connections and views
[19:52:06] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:52:06] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:52:06] [CLEANUP] ========================================
[19:52:06] [CLEANUP] Cleaning up all agent connections and views
[19:52:06] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:52:06] [CLEANUP] Stopped and removed 0 video connections
[19:52:06] [CLEANUP] Removed 0 video views
[19:52:06] [CLEANUP] Removed 0 feed scroll views
[19:52:06] [CLEANUP] Removed 0 status labels
[19:52:06] [CLEANUP] Reset agent query state
[19:52:06] [CLEANUP] Updated page indicator
[19:52:06] [CLEANUP] Rebuilt video layout
[19:52:06] [CLEANUP] ✅ All agent connections and views cleaned up
[19:52:06] [CLEANUP] ========================================
[19:52:06] [SERVER] Skipping reconnect polling - app is in background
[19:52:06] [WS] URLSession invalidated successfully
[19:52:06] [PIP] Removing 0 tracks from PiP for connection 0
[19:52:06] [PIP] ✅ All tracks removed for connection 0
[19:52:06] [PIP] Removing 0 tracks from PiP for connection 0
[19:52:06] [PIP] ✅ All tracks removed for connection 0
[19:52:06] [CLEANUP] ========================================
[19:52:06] [CLEANUP] Cleaning up all agent connections and views
[19:52:06] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:52:06] [CLEANUP] Stopped and removed 0 video connections
[19:52:06] [CLEANUP] Removed 0 video views
[19:52:06] [CLEANUP] Removed 0 feed scroll views
[19:52:06] [CLEANUP] Removed 0 status labels
[19:52:06] [CLEANUP] Reset agent query state
[19:52:06] [CLEANUP] Updated page indicator
[19:52:06] [CLEANUP] Rebuilt video layout
[19:52:06] [CLEANUP] ✅ All agent connections and views cleaned up
[19:52:06] [CLEANUP] ========================================
[19:52:06] [SERVER] Skipping reconnect polling - app is in background
[19:54:05] [CRASH] No crash detected
[19:54:05] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[19:54:05] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[19:54:05] [GIPHY] SDK not available - using REST API fallback
[19:54:05] [BACKGROUND] Background fetch enabled
[19:54:05] [CLEANUP] No old timer messages to delete
[19:54:05] [AUTH] Starting PIN authentication
[19:54:05] [PUSH] Notification tapped - session_id: ILUIWU
[19:54:05] [PUSH] Max message_id before tap: 18433
[19:54:05] [PUSH] Stored pending session: ILUIWU
[19:54:05] [PUSH_EMBED] 📩 Received embedded message: id=18434, type=0, sender=Esra
[19:54:05] [PUSH_EMBED] ✅ Saved message 18434 to local DB (sync)
[19:54:05] [PUSH_EMBED] Created new cache with embedded message 18434
[19:54:05] [PUSH_EMBED] Fetching evolution data for message 18434 in background
[19:54:05] [PUSH_EMBED] ✅ Fully processed message 18434
[19:54:05] [PUSH] Embedded message handled instantly on tap
[19:54:05] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:54:05] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:54:05] [PUSH] Fetching server messages since_id=18433 to catch coalesced notifications on tap
[19:54:05] [PUSH_PRELOAD] Fetching up to 50 messages since_id=18433 to catch coalesced notifications
[19:54:05] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:54:05] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[19:54:05] [PUSH_EMBED] Got evolution data for message 18434, saving to local DB
[19:54:05] [PUSH_EMBED] Saved evolution data for message 18434
[19:54:05] [PRELOAD] Cache has only 1 messages (from push) - will load full history
[19:54:05] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:54:05] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:54:05] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18434)...
[19:54:05] [USER] ✅ User registered successfully
[19:54:05] [PUSH] User registration after token update: success
[19:54:05] [PUSH_PRELOAD] Fetched 1 messages - caching for instant display
[19:54:05] [PUSH_PRELOAD] ⚡ Pre-cached 1 messages for instant display (preserved 0 from push)
[19:54:05] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:54:05] [PUSH] Server fetch on tap completed (success=true)
[19:54:05] [PRELOAD] No messages or parse error
[19:54:05] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:54:05] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:54:05] [CLIENT_SIG] WebSocket opened
[19:54:05] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:54:05] [CLIENT_SIG] Connected! clientId=Dm5pL2J7D3Cr_dBT
[19:54:06] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:54:06] [CLIENT_SIG] - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:54:06] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:54:06] [PUSH] Silent push received
[19:54:06] [PUSH_EMBED] 📩 Received embedded message: id=18434, type=0, sender=Esra
[19:54:06] [PUSH_EMBED] ✅ Saved message 18434 to local DB (sync)
[19:54:06] [PUSH_EMBED] Created new cache with embedded message 18434
[19:54:06] [PUSH_EMBED] Fetching evolution data for message 18434 in background
[19:54:06] [PUSH_EMBED] ✅ Fully processed message 18434
[19:54:06] [PUSH] Embedded message handled instantly from silent push
[19:54:06] [PUSH_EMBED] Got evolution data for message 18434, saving to local DB
[19:54:06] [PUSH_EMBED] Saved evolution data for message 18434
[19:54:07] [PIN_AUTH] Correct PIN
[19:54:07] [SECURITY] Restored real session: ILUIWU
[19:54:07] [SECURITY] Restored real session: ILUIWU
[19:54:07] [SECURITY] Saved real session: ILUIWU
[19:54:07] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[19:54:07] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:54:07] Documents Directory: /var/mobile/Containers/Data/Application/FEAD2E1F-C4A1-4969-9070-16A67DA77312/Documents
[19:54:07] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[19:54:07] [THEME] Applying current theme
[19:54:07] [CHAT] Applied day theme (mode: day)
[19:54:07] [SECURITY] Saved real session: ILUIWU
[19:54:07] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:54:07] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:54:07] [NETWORK] Network monitor started
[19:54:07] [NETWORK] Status changed: connected
[19:54:07] Did transition
[19:54:07] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[19:54:07] [VIEWER] Screen lock enabled - normal idle behavior
[19:54:07] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[19:54:07] [VCC] ========== VideoConnectionClass INIT ==========
[19:54:07] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[19:54:07] [DATA AUDIO] ========== setupWebRTC() START ==========
[19:54:07] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[19:54:07] [DATA AUDIO] Creating encoder/decoder factories...
[19:54:07] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[19:54:07] [CODEC] Viewer selected encoder: AV1 (best quality)
[19:54:07] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[19:54:07] [DATA AUDIO] ✅ Factory created
[19:54:07] [DATA AUDIO] RTCAudioSession locked
[19:54:07] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[19:54:07] [DATA AUDIO] RTCAudioSession unlocked
[19:54:07] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[19:54:07] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[19:54:07] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[19:54:07] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:54:07] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[19:54:07] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[19:54:07] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[19:54:07] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[19:54:07] Did transition
[19:54:07] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[19:54:07] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:54:07] [CHUNK] Merged 868 reactions synchronously
[19:54:07] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:54:07] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[19:54:07] [MIGRATION] No messages need sender_name backfill
[19:54:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[19:54:07] [GALLERY_DB] Raw datesent for msg 18430: '2026-01-21 18:17:11'
[19:54:07] [GALLERY_DB] Raw datesent for msg 18409: '2026-01-21 15:37:22'
[19:54:07] [GALLERY_DB] Raw datesent for msg 18407: '2026-01-21 15:35:55'
[19:54:07] [USER] ✅ User registered successfully
[19:54:07] [USER] User registration successful
[19:54:07] [GALLERY_DB] ✅ Loaded 476 media messages
[19:54:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18434
[19:54:07] [INCREMENTAL_SYNC] ✅ No new messages
[19:54:07] [GALLERY] Filtered 476 -> 436 (only with local thumbnails)
[19:54:07] [GALLERY] First 5 after sort (newest first):
[19:54:07] [GALLERY] 0: id=18409, date=2026-01-21 15:37:22, file=f733dc0a9f704916.jpg
[19:54:07] [GALLERY] 1: id=18407, date=2026-01-21 15:35:55, file=7494d317859e38fb.jpg
[19:54:07] [GALLERY] 2: id=18380, date=2026-01-21 10:30:35, file=47f0a79ffd2469ec.jpg
[19:54:07] [GALLERY] 3: id=18378, date=2026-01-21 10:26:20, file=7fcf17ed21a942d6.jpg
[19:54:07] [GALLERY] 4: id=18340, date=2026-01-21 08:29:40, file=a4f205035ad487c7.jpg
[19:54:07] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[19:54:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18385, 18386, 18387, 18388, 18389]
[19:54:07] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[19:54:07] [SERVER] Starting reconnect polling (5s interval)
[19:54:07] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[19:54:07] [ICONS] Offset applied: -14.6
[19:54:07] [ICONS] New left margin: 11.2, New right margin: 11.3
[19:54:07] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=true owner=false animating=false completed=false
[19:54:07] [GIF] msgId=18430 START fresh animation
[19:54:07] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:54:07] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:54:07] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:54:07] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18433 → 18434
[19:54:07] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[19:54:07] [UNSENT_RETRY] Checking for unsent messages...
[19:54:07] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[19:54:07] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[19:54:07] [UPLOAD_RECOVERY] Session: ILUIWU
[19:54:07] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[19:54:07] [UPLOAD_RECOVERY] Checking recent media messages on server...
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18428, file=f36a462089f1685a.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[19:54:07] [UPLOAD_RECOVERY] Verifying 11 media files exist on server...
[19:54:07] [PENDING_UPLOAD] Total pending upload messages: 0
[19:54:07] [UNSENT_RETRY] No unsent messages found
[19:54:07] [ICONS] Chat center: (31.2, 87.0)
[19:54:07] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[19:54:07] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[19:54:07] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[19:54:07] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[19:54:07] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[19:54:07] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[19:54:07] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[19:54:07] [ICONS] Screen width: 440.0
[19:54:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:54:07] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:54:07] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[19:54:07] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[19:54:07] [UPLOAD_RECOVERY] ✅ All media files verified on server
[19:54:07] new_session POST ok: token len=157
[19:54:07] HELLO → sent (fetched token, role=query)
[19:54:07] [SIG] hello_ok received for query connection - ready to query agents
[19:54:07] [SIG] get_agents request sent for sessionId=ILUIWU
[19:54:07] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:54:07] [SERVER] Stopped reconnect polling
[19:54:07] [SIG] agents_list received: []
[19:54:07] [SIG] agents_list received: []
[19:54:08] [COMBINED_FETCH] Loaded 7200 read receipts, 875 messages with reactions
[19:54:08] [READBY_ENRICH] Enriched 50 messages with readBy data
[19:54:08] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18385, 18386, 18387, 18388, 18389]
[19:54:08] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=true animating=false completed=false
[19:54:08] [GIF] msgId=18430 CONTINUE animation (elapsed=0.6861100196838379s)
[19:54:08] [CELL_UPLOAD] configure: msgId=18430, file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=true, uploadStatus=0
[19:54:08] [CELL_UPLOAD] → giphy file, no upload needed, setting complete
[19:54:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif, overlayExists=true
[19:54:10] [PUSH] Silent push received
[19:54:10] [PUSH_EMBED] No embedded message_data in notification
[19:54:10] [PUSH] No embedded data, pre-loading messages from server
[19:54:10] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:54:10] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:54:10] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[19:54:10] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:54:10] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18434, AnyHashable("aps"): {
"content-available" = 1;
}]
[19:54:10] [PUSH] Parsed message_id: 18434
[19:54:10] [PUSH] Parsed operation_type: 3
[19:54:10] [PUSH] Taking direct action: opType=3, messageId=18434
[19:54:10] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18434
[19:54:11] [CLIENT_SIG] Event received: type=3 messageId=18434
[19:54:11] [WS_EVENT] Received event: type=3, messageId=18434
[19:54:11] [WS_EVENT] Read receipt for message 18434 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:54:13] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:54:14] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:54:14] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[19:54:14] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=51
[19:54:14] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-1, 18434, 18433, 18432, 18431]
[19:54:14] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:54:14] [GIF] SKIP - same msg, completed
[19:54:14] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:54:14] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:54:16] [CLIENT_SIG] Event received: type=0 messageId=18435
[19:54:16] [WS_EVENT] Received event: type=0, messageId=18435
[19:54:16] [WS_EVENT] 📨 New message notification (msgId=18435) - triggering incremental refresh, currentMsgCount=51
[19:54:16] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[19:54:16] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18434
[19:54:16] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-01-21 18:54:16 +0000 - type: unknown, operation_type: 0, message_id: 18435, session_id: ILUIWU, state: 0
[19:54:16] [PUSH_DEBUG] Full userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 18435, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 18:54:13";
"file_name" = "";
message = "Oki Im not gonna say but.. \Ud83e\Udd13\Ud83e\Udd23";
"message_id" = 18435;
"message_type" = 0;
"prev_session_message_id" = 18434;
"replied_message" = "But please when you reconnect I don't want you to be sorry. If you tell sorry a single time, you'll get punished \Ud83d\Ude08";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18432;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}]
[19:54:16] [PUSH] App active - suppressing notification UI, posting internal event
[19:54:16] [PUSH_EMBED] 📩 Received embedded message: id=18435, type=0, sender=Esra
[19:54:16] [PUSH_EMBED] ✅ Saved message 18435 to local DB (sync)
[19:54:16] [PUSH_EMBED] Inserted message 18435 into existing cache (now 51 messages)
[19:54:16] [PUSH_EMBED] Fetching evolution data for message 18435 in background
[19:54:16] [PUSH_EMBED] ✅ Fully processed message 18435
[19:54:16] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 18435, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 18:54:13";
"file_name" = "";
message = "Oki Im not gonna say but.. \Ud83e\Udd13\Ud83e\Udd23";
"message_id" = 18435;
"message_type" = 0;
"prev_session_message_id" = 18434;
"replied_message" = "But please when you reconnect I don't want you to be sorry. If you tell sorry a single time, you'll get punished \Ud83d\Ude08";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18432;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}]
[19:54:16] [PUSH_EMBED_VC] Processing embedded message: id=18435, type=0, sender=Esra, prevId=18434
[19:54:16] [PUSH_EMBED_VC] Inserted message 18435 into allMessagesWithReadBy (now 52 messages)
[19:54:16] [PUSH_EMBED_VC] ✅ Previous message 18434 exists in memory
[19:54:16] [PUSH] ⚡ Embedded message handled directly in ViewController
[19:54:16] [PUSH] Parsed message_id: 18435
[19:54:16] [PUSH] Parsed operation_type: 0
[19:54:16] [PUSH] Taking direct action: opType=0, messageId=18435
[19:54:16] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18435
[19:54:16] [PUSH] ⚡ Message 18435 already in memory - skipping duplicate notification entirely
[19:54:16] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[19:54:16] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[19:54:16] [PUSH_UI] Message 18435 already in memory - skipping insert
[19:54:16] [PUSH_EMBED_VC] Saved message 18435 to local DB
[19:54:16] [PUSH] Silent push received
[19:54:16] [PUSH_EMBED] 📩 Received embedded message: id=18435, type=0, sender=Esra
[19:54:16] [INCREMENTAL_SYNC] ✅ Found 2 new messages
[19:54:16] [PUSH_EMBED] ✅ Saved message 18435 to local DB (sync)
[19:54:16] [PUSH_EMBED] Fetching evolution data for message 18435 in background
[19:54:16] [PUSH_EMBED] ✅ Fully processed message 18435
[19:54:16] [PUSH] Embedded message handled instantly from silent push
[19:54:16] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[19:54:16] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[19:54:16] [PUSH_UI] Message 18435 already in memory - skipping insert
[19:54:16] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 18435, AnyHashable("message_data"): {
datesent = "2026-01-21 18:54:13";
"file_name" = "";
message = "Oki Im not gonna say but.. \Ud83e\Udd13\Ud83e\Udd23";
"message_id" = 18435;
"message_type" = 0;
"prev_session_message_id" = 18434;
"replied_message" = "But please when you reconnect I don't want you to be sorry. If you tell sorry a single time, you'll get punished \Ud83d\Ude08";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18432;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}]
[19:54:16] [PUSH_EMBED_VC] Message 18435 already in memory - skipping
[19:54:16] [PUSH] ⚡ Embedded message handled directly in ViewController
[19:54:16] [PUSH] Parsed message_id: 18435
[19:54:16] [PUSH] Parsed operation_type: 0
[19:54:16] [PUSH] Taking direct action: opType=0, messageId=18435
[19:54:16] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18435
[19:54:16] [PUSH] ⚡ Message 18435 already in memory - skipping duplicate notification entirely
[19:54:16] [INCREMENTAL_SYNC] Replaced optimistic message (id=-1) with server message (id=18436)
[19:54:16] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=2
[19:54:16] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:54:16] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[19:54:16] [PUSH_EMBED] Got evolution data for message 18435, saving to local DB
[19:54:16] [PUSH_EMBED] Saved evolution data for message 18435
[19:54:16] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[18385, 18386, 18387, 18388, 18389]
[19:54:16] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18434 → 18435
[19:54:16] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:54:16] [GIF] SKIP - same msg, completed
[19:54:18] [CLIENT_SIG] Event received: type=0 messageId=18436
[19:54:18] [WS_EVENT] Received event: type=0, messageId=18436
[19:54:18] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18436,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:54:15"}
[19:54:18] [WS_EVENT] 📨 New message notification (msgId=18436) - triggering incremental refresh, currentMsgCount=52
[19:54:18] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[19:54:18] [CHAT] receive_message.php JSON: ["ok": 1, "message_id": 18436, "message_type": 0, "session_id": ILUIWU, "datesent_utc": 2026-01-21 18:54:15, "file_name": ]
[19:54:18] [DB_UPGRADE] Upgrading message ID: -1 → 18436, preserveOriginalDate=false
[19:54:18] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18436
[19:54:18] [DB_UPGRADE] ⚠️ No rows affected - message -1 not found in DB
[19:54:18] [SEND_UPGRADE] ⚠️ Server ID 18436 already exists - removing provisional entry -1
[19:54:18] ReloadData 9
[19:54:18] [PUSH_EMBED] Got evolution data for message 18435, saving to local DB
[19:54:18] [PUSH_EMBED] Saved evolution data for message 18435
[19:54:18] [INCREMENTAL_SYNC] ✅ No new messages
[19:54:18] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[19:54:21] [PUSH] Silent push received
[19:54:21] [PUSH_EMBED] No embedded message_data in notification
[19:54:21] [PUSH] No embedded data, pre-loading messages from server
[19:54:21] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:54:21] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:54:21] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [18386, 18385]
[19:54:21] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[19:54:21] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:54:21] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("message_id"): 18435, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[19:54:21] [PUSH] Parsed message_id: 18435
[19:54:21] [PUSH] Parsed operation_type: 3
[19:54:21] [PUSH] Taking direct action: opType=3, messageId=18435
[19:54:21] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18435
[19:54:21] [PUSH] Silent push received
[19:54:21] [PUSH_EMBED] No embedded message_data in notification
[19:54:21] [PUSH] No embedded data, pre-loading messages from server
[19:54:21] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:54:21] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:54:21] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [18386, 18385]
[19:54:21] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[19:54:21] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:54:21] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("message_id"): 18436, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[19:54:21] [PUSH] Parsed message_id: 18436
[19:54:21] [PUSH] Parsed operation_type: 3
[19:54:21] [PUSH] Taking direct action: opType=3, messageId=18436
[19:54:21] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18436
[19:54:22] [CLIENT_SIG] Event received: type=3 messageId=18435
[19:54:22] [WS_EVENT] Received event: type=3, messageId=18435
[19:54:22] [WS_EVENT] Read receipt for message 18435 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:54:22] [CLIENT_SIG] Event received: type=3 messageId=18436
[19:54:22] [WS_EVENT] Received event: type=3, messageId=18436
[19:54:22] [WS_EVENT] Read receipt for message 18436 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:54:33] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:54:33] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=52, isReloading=false
[19:54:33] [SEND_MESSAGE] ✅ Added optimistic message id=-2 to arrays, newMsgCount=53
[19:54:33] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[-2, 18436, 18435, 18434, 18433]
[19:54:33] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:54:33] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:54:35] [CLIENT_SIG] Event received: type=0 messageId=18437
[19:54:35] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18437,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:54:33"}
[19:54:35] [WS_EVENT] Received event: type=0, messageId=18437
[19:54:35] [WS_EVENT] 📨 New message notification (msgId=18437) - triggering incremental refresh, currentMsgCount=53
[19:54:35] [CHAT] receive_message.php JSON: ["ok": 1, "session_id": ILUIWU, "file_name": , "message_type": 0, "message_id": 18437, "datesent_utc": 2026-01-21 18:54:33]
[19:54:35] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[19:54:35] [DB_UPGRADE] Upgrading message ID: -2 → 18437, preserveOriginalDate=false
[19:54:35] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18436
[19:54:35] [DB_UPGRADE] ✅ Upgraded -2 → 18437 with send_status=0, 1 row(s) affected
[19:54:35] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -2 → 18437
[19:54:35] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -2 → 18437
[19:54:35] ReloadData 9
[19:54:35] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:54:35] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:54:35] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[19:54:35] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18385, 18386, 18387, 18388, 18389]
[19:54:49] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:54:49] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=53, isReloading=false
[19:54:49] [SEND_MESSAGE] ✅ Added optimistic message id=-3 to arrays, newMsgCount=54
[19:54:49] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[-3, 18437, 18436, 18435, 18434]
[19:54:49] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:54:49] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:54:51] [CLIENT_SIG] Event received: type=0 messageId=18438
[19:54:51] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18438,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:54:49"}
[19:54:51] [WS_EVENT] Received event: type=0, messageId=18438
[19:54:51] [WS_EVENT] 📨 New message notification (msgId=18438) - triggering incremental refresh, currentMsgCount=54
[19:54:51] [CHAT] receive_message.php JSON: ["session_id": ILUIWU, "file_name": , "datesent_utc": 2026-01-21 18:54:49, "ok": 1, "message_type": 0, "message_id": 18438]
[19:54:51] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[19:54:51] [DB_UPGRADE] Upgrading message ID: -3 → 18438, preserveOriginalDate=false
[19:54:51] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18437
[19:54:51] [DB_UPGRADE] ✅ Upgraded -3 → 18438 with send_status=0, 1 row(s) affected
[19:54:51] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -3 → 18438
[19:54:51] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -3 → 18438
[19:54:51] ReloadData 9
[19:54:51] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:54:51] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:54:51] [GIF] SKIP - same msg, completed
[19:54:51] [LOCK] Lock button tapped - locking app immediately
[19:54:51] [LOCK] Received lock app notification
[19:54:51] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:54:51] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=54
[19:54:51] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[18385, 18386, 18387, 18388, 18389]
[19:54:51] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:54:51] [GIF] SKIP - same msg, completed
[19:54:51] [LIFECYCLE] App resigning active - cleared crash flag
[19:54:52] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:54:52] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:54:52] [LIFECYCLE] App entering background - cleared crash flag
[19:54:52] [CLIENT_SIG] Disconnecting
[19:54:52] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:54:52] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[19:54:52] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:54:52] In cleanupPeer
[19:54:52] In cleanupPeer
[19:54:52] [LIFECYCLE] WebRTC audio disabled
[19:54:52] [LIFECYCLE] AVAudioSession deactivated
[19:54:52] [LIFECYCLE] All connections stopped
[19:54:52] [CLIENT_SIG] WebSocket closed with code 1001
[19:54:52] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:54:52] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:54:52] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:54:52] [SERVER] Stopped reconnect polling
[19:54:52] Will request stop of video 0
[19:54:52] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[19:54:52] [WS] Query connection error - cleaning up all agent connections and views
[19:54:52] Will request stop of video 0
[19:54:52] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[19:54:52] [WS] Query connection failed - cleaning up all agent connections and views
[19:54:52] [PIP] Removing 0 tracks from PiP for connection 0
[19:54:52] [PIP] ✅ All tracks removed for connection 0
[19:54:52] [CLEANUP] ========================================
[19:54:52] [CLEANUP] Cleaning up all agent connections and views
[19:54:52] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:54:52] [CLEANUP] Stopped and removed 0 video connections
[19:54:52] [CLEANUP] Removed 0 video views
[19:54:52] [CLEANUP] Removed 0 feed scroll views
[19:54:52] [CLEANUP] Removed 0 status labels
[19:54:52] [CLEANUP] Reset agent query state
[19:54:52] [CLEANUP] Updated page indicator
[19:54:52] [CLEANUP] Rebuilt video layout
[19:54:52] [CLEANUP] ✅ All agent connections and views cleaned up
[19:54:52] [CLEANUP] ========================================
[19:54:52] [SERVER] Skipping reconnect polling - app is in background
[19:54:52] [WS] URLSession invalidated successfully
[19:54:52] [PIP] Removing 0 tracks from PiP for connection 0
[19:54:52] [PIP] ✅ All tracks removed for connection 0
[19:54:52] [CLEANUP] ========================================
[19:54:52] [CLEANUP] Cleaning up all agent connections and views
[19:54:52] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:54:52] [CLEANUP] Stopped and removed 0 video connections
[19:54:52] [CLEANUP] Removed 0 video views
[19:54:52] [CLEANUP] Removed 0 feed scroll views
[19:54:52] [CLEANUP] Removed 0 status labels
[19:54:52] [CLEANUP] Reset agent query state
[19:54:52] [CLEANUP] Updated page indicator
[19:54:52] [CLEANUP] Rebuilt video layout
[19:54:52] [CLEANUP] ✅ All agent connections and views cleaned up
[19:54:52] [CLEANUP] ========================================
[19:54:52] [SERVER] Skipping reconnect polling - app is in background
[19:55:04] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[19:55:04] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:55:04] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:55:04] [PUSH] Notification tapped - session_id: ILUIWU
[19:55:04] [PUSH] Max message_id before tap: 18438
[19:55:04] [PUSH] Stored pending session: ILUIWU
[19:55:04] [PUSH_EMBED] No embedded message_data in notification
[19:55:04] [PUSH] Pre-loading messages on notification tap...
[19:55:04] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:55:04] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:55:04] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:55:04] [LIFECYCLE] App entering foreground - restoring connections
[19:55:04] [UPLOAD_RETRY] No pending uploads to retry
[19:55:04] [LIFECYCLE] Merged 868 reactions from local DB
[19:55:04] [LIFECYCLE] WebRTC audio re-enabled
[19:55:04] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:55:04] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:55:04] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:55:04] [VIEWER] Reconnecting after background - querying agents
[19:55:04] [UNSENT_RETRY] Checking for unsent messages...
[19:55:04] [PENDING_UPLOAD] Total pending upload messages: 0
[19:55:04] [UNSENT_RETRY] No unsent messages found
[19:55:04] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:55:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[18385, 18386, 18387, 18388, 18389]
[19:55:04] [PRELOAD_CACHE] Preserving 5 push-inserted messages: [18389, 18388, 18387, 18386, 18385]
[19:55:04] [PUSH_PRELOAD] ⚡ Pre-cached 55 messages for instant display (preserved 5 from push)
[19:55:04] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:55:04] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:55:04] [GIF] SKIP - same msg, completed
[19:55:04] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 0, AnyHashable("message_id"): 18439, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}]
[19:55:04] [PUSH] Parsed message_id: 18439
[19:55:04] [PUSH] Parsed operation_type: 0
[19:55:04] [PUSH] Taking direct action: opType=0, messageId=18439
[19:55:04] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18439
[19:55:04] [PUSH] Handling message fetch for opType=0, messageId=18439
[19:55:04] [PUSH] Requesting URL: https://crivello.dyndns.org:443/WebRTC/chat/chat_get_messages.php?session_id=ILUIWU&viewer=1&messages=18439
[19:55:04] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:55:04] HELLO → sent (cached token, role=query)
[19:55:04] [SIG] hello_ok received for query connection - ready to query agents
[19:55:04] [SIG] get_agents request sent for sessionId=ILUIWU
[19:55:04] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:55:04] [CLIENT_SIG] WebSocket opened
[19:55:04] [SERVER] Stopped reconnect polling
[19:55:04] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:55:04] [CLIENT_SIG] Connected! clientId=GoqLtFmVxl9f6qZY
[19:55:04] [SIG] agents_list received: []
[19:55:04] [SIG] agents_list received: []
[19:55:04] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:55:04] [CLIENT_SIG] - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:55:04] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:55:04] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:55:04] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:55:04] [PUSH] handlePollEventsNotification userInfo: [:]
[19:55:04] [PUSH] No message_id in userInfo
[19:55:04] [PUSH] No operation_type in userInfo
[19:55:04] [FAST_REFRESH] Evolution disabled - performing incremental sync
[19:55:04] [FAST_REFRESH] Already have 54 messages - skipping local DB load
[19:55:04] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[19:55:04] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[19:55:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[19:55:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18439
[19:55:04] [COMBINED_FETCH] Loaded 7205 read receipts, 875 messages with reactions
[19:55:04] [FOREGROUND] Enriched 2 messages with readBy data from server
[19:55:04] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:55:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[18385, 18386, 18387, 18388, 18389]
[19:55:05] [GIF] configure msgId=18430 file=giphy:https://media3.giphy.com/media/v1.Y2lkPWE5ZTU0NDAzZGQ1dXAwMm5qMXVzanR0b2V2OTg0Y2c0cmxlOWN4ZzVid25iNHdvMyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/5WSdgFuyGNK7Zt8ajG/giphy.gif msgChanged=false owner=false animating=false completed=true
[19:55:05] [GIF] SKIP - same msg, completed
[19:55:05] [PIN_AUTH] Correct PIN
[19:55:05] [SECURITY] Restored real session: ILUIWU
[19:55:05] [SECURITY] Restored real session: ILUIWU
[19:55:06] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[19:55:06] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[19:55:06] [AUTH] Cache had 55 messages, maxExistingId=18438, inserted 1 truly new
[19:55:06] [AUTH] UI update complete
[19:55:06] [FAKE MODE] Exiting fake mode, restoring real session
[19:55:06] [SECURITY] Restored real session: ILUIWU
[19:55:06] [SECURITY] Saved real session: ILUIWU
[19:55:06] [FAKE MODE] ✅ Restored real session: ILUIWU
[19:55:06] [FAKE MODE] Loaded 50 messages (limited to page size)
[19:55:06] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:06] [CELL_UPLOAD] → not my message, setting complete
[19:55:06] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:06] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18438 → 18439
[19:55:06] DOWNLOADIIING t_41101b95fabc37ab.jpg
[19:55:06] DOWNLOADIIING 41101b95fabc37ab.jpg
[19:55:06] [MEDIA_DOWNLOAD] ✅ t_41101b95fabc37ab.jpg complete
[19:55:06] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:06] [MEDIA_DOWNLOAD] ✅ Set thumbnail for cell: 41101b95fabc37ab.jpg from downloaded: t_41101b95fabc37ab.jpg
[19:55:06] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:06] [CELL_UPLOAD] → not my message, setting complete
[19:55:06] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:06] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18390, 18391, 18392, 18393, 18394]
[19:55:06] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:06] [CELL_UPLOAD] → not my message, setting complete
[19:55:06] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:06] [MEDIA_DOWNLOAD] ✅ 41101b95fabc37ab.jpg complete
[19:55:06] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:06] [MEDIA_DOWNLOAD] ✅ Set thumbnail for cell: 41101b95fabc37ab.jpg from downloaded: 41101b95fabc37ab.jpg
[19:55:06] [PUSH] Silent push received
[19:55:06] [PUSH_EMBED] No embedded message_data in notification
[19:55:06] [PUSH] No embedded data, pre-loading messages from server
[19:55:06] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:55:06] [PUSH] Silent push received
[19:55:06] [PUSH_EMBED] No embedded message_data in notification
[19:55:06] [PUSH] No embedded data, pre-loading messages from server
[19:55:06] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:55:07] [PUSH] get_message response: HTTP 200, 640 bytes
[19:55:07] [PUSH] get_message response body: [{"message_type":1,"message_id":18439,"session_id":"ILUIWU","message":"","file_name":"41101b95fabc37ab.jpg","msgread":0,"datesent":"2026-01-21 18:54:54","timer":0,"timer_started_at":null,"timer_played":0,"sender_id":"EDAD55A1-003F-415D-AA60-672B34B504FE","sender_name":"Esra","distance":null,"link_url":null,"link_title":null,"link_description":null,"link_image_url":null,"reply_to_id":18433,"replied_message":"Just be the free lady who decides when her boyfriend deserves attention, and I want you to act as such 🥰","replied_sender_id":"3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF","replied_sender_name":"Laurent","read_by":[],"reactions":[]}]
[19:55:07] [PUSH] Updated readBy in allMessagesWithReadBy for message 18439: readBy=0
[19:55:07] [PUSH] Updated readBy in chatMessages for message 18439: readBy=0
[19:55:07] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:55:07] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:55:07] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:55:07] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[19:55:07] [USER] ✅ User registered successfully
[19:55:07] [PUSH] User registration after token update: success
[19:55:07] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:55:07] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18439, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}]
[19:55:07] [PUSH] Parsed message_id: 18439
[19:55:07] [PUSH] Parsed operation_type: 0
[19:55:07] [PUSH] Taking direct action: opType=0, messageId=18439
[19:55:07] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18439
[19:55:07] [PUSH] ⚡ Message 18439 already in memory - skipping duplicate notification entirely
[19:55:07] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:55:07] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[19:55:07] [INCREMENTAL_SYNC] ✅ No new messages
[19:55:07] [FAST_REFRESH] Incremental sync complete - 50 messages
[19:55:07] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:55:07] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18439]
[19:55:07] [PUSH] Parsed message_id: 18439
[19:55:07] [PUSH] Parsed operation_type: 3
[19:55:07] [PUSH] Taking direct action: opType=3, messageId=18439
[19:55:07] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18439
[19:55:08] [COMBINED_FETCH] Loaded 7205 read receipts, 876 messages with reactions
[19:55:08] [FAST_REFRESH] Enriched 50 messages with readBy data
[19:55:08] [COMBINED_FETCH] Loaded 7205 read receipts, 876 messages with reactions
[19:55:08] [FAKE MODE] Enriched 50 messages with readBy data
[19:55:08] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:55:08] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18390, 18391, 18392, 18393, 18394]
[19:55:08] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:08] [CELL_UPLOAD] → not my message, setting complete
[19:55:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:10] [CLIENT_SIG] Event received: type=3 messageId=18439
[19:55:10] [WS_EVENT] Received event: type=3, messageId=18439
[19:55:10] [WS_EVENT] Read receipt for message 18439 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:55:10] [PUSH] Silent push received
[19:55:10] [PUSH_EMBED] No embedded message_data in notification
[19:55:10] [PUSH] No embedded data, pre-loading messages from server
[19:55:10] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:55:10] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:55:10] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[19:55:10] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:55:10] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18439]
[19:55:10] [PUSH] Parsed message_id: 18439
[19:55:10] [PUSH] Parsed operation_type: 3
[19:55:10] [PUSH] Taking direct action: opType=3, messageId=18439
[19:55:10] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18439
[19:55:14] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[19:55:14] [WS] Query connection error - cleaning up all agent connections and views
[19:55:14] [CLEANUP] ========================================
[19:55:14] [CLEANUP] Cleaning up all agent connections and views
[19:55:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:55:14] [CLEANUP] Stopped and removed 0 video connections
[19:55:14] [CLEANUP] Removed 0 video views
[19:55:14] [CLEANUP] Removed 0 feed scroll views
[19:55:14] [CLEANUP] Removed 0 status labels
[19:55:14] [CLEANUP] Reset agent query state
[19:55:14] [CLEANUP] Updated page indicator
[19:55:14] [CLEANUP] Rebuilt video layout
[19:55:14] [CLEANUP] ✅ All agent connections and views cleaned up
[19:55:14] [CLEANUP] ========================================
[19:55:14] [SERVER] Starting reconnect polling (5s interval)
[19:55:18] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:55:18] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[19:55:18] [SEND_MESSAGE] ✅ Added optimistic message id=-4 to arrays, newMsgCount=51
[19:55:18] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-4, 18439, 18438, 18437, 18436]
[19:55:18] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:18] [CELL_UPLOAD] → not my message, setting complete
[19:55:18] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:18] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:55:18] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:55:19] [SERVER] Polling - attempting to reconnect...
[19:55:20] [CLIENT_SIG] Event received: type=0 messageId=18440
[19:55:20] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18440,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:55:18"}
[19:55:20] [WS_EVENT] Received event: type=0, messageId=18440
[19:55:20] [WS_EVENT] 📨 New message notification (msgId=18440) - triggering incremental refresh, currentMsgCount=51
[19:55:20] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[19:55:20] [CHAT] receive_message.php JSON: ["ok": 1, "session_id": ILUIWU, "file_name": , "message_type": 0, "message_id": 18440, "datesent_utc": 2026-01-21 18:55:18]
[19:55:20] [DB_UPGRADE] Upgrading message ID: -4 → 18440, preserveOriginalDate=false
[19:55:20] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18439
[19:55:20] [DB_UPGRADE] ✅ Upgraded -4 → 18440 with send_status=0, 1 row(s) affected
[19:55:20] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -4 → 18440
[19:55:20] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -4 → 18440
[19:55:20] ReloadData 9
[19:55:20] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:20] [CELL_UPLOAD] → not my message, setting complete
[19:55:20] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:20] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:55:20] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:55:20] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[19:55:20] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18390, 18391, 18392, 18393, 18394]
[19:55:20] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:20] [CELL_UPLOAD] → not my message, setting complete
[19:55:20] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:22] [PUSH] Silent push received
[19:55:22] [PUSH_EMBED] No embedded message_data in notification
[19:55:22] [PUSH] No embedded data, pre-loading messages from server
[19:55:22] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:55:22] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:55:23] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [18390]
[19:55:23] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[19:55:23] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:55:23] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18440, AnyHashable("session_id"): ILUIWU]
[19:55:23] [PUSH] Parsed message_id: 18440
[19:55:23] [PUSH] Parsed operation_type: 3
[19:55:23] [PUSH] Taking direct action: opType=3, messageId=18440
[19:55:23] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18440
[19:55:23] [CLIENT_SIG] Event received: type=3 messageId=18440
[19:55:23] [WS_EVENT] Received event: type=3, messageId=18440
[19:55:23] [WS_EVENT] Read receipt for message 18440 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:55:24] [SERVER] Polling - attempting to reconnect...
[19:55:25] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:55:25] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[19:55:25] [SEND_MESSAGE] ✅ Added optimistic message id=-5 to arrays, newMsgCount=52
[19:55:25] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-5, 18440, 18439, 18438, 18437]
[19:55:25] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:25] [CELL_UPLOAD] → not my message, setting complete
[19:55:25] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:25] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:55:25] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:55:26] [CLIENT_SIG] Event received: type=0 messageId=18441
[19:55:26] [WS_EVENT] Received event: type=0, messageId=18441
[19:55:26] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18441,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:55:25"}
[19:55:26] [WS_EVENT] 📨 New message notification (msgId=18441) - triggering incremental refresh, currentMsgCount=52
[19:55:26] [CHAT] receive_message.php JSON: ["message_id": 18441, "ok": 1, "file_name": , "message_type": 0, "session_id": ILUIWU, "datesent_utc": 2026-01-21 18:55:25]
[19:55:26] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[19:55:26] [DB_UPGRADE] Upgrading message ID: -5 → 18441, preserveOriginalDate=false
[19:55:26] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18440
[19:55:26] [DB_UPGRADE] ✅ Upgraded -5 → 18441 with send_status=0, 1 row(s) affected
[19:55:26] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -5 → 18441
[19:55:26] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -5 → 18441
[19:55:26] ReloadData 9
[19:55:26] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:55:27] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:27] [CELL_UPLOAD] → not my message, setting complete
[19:55:27] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:27] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:55:27] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[19:55:27] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[18390, 18391, 18392, 18393, 18394]
[19:55:27] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:55:27] [CELL_UPLOAD] → not my message, setting complete
[19:55:27] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:55:29] [SERVER] Polling - attempting to reconnect...
[19:55:30] [PUSH] Silent push received
[19:55:30] [PUSH_EMBED] No embedded message_data in notification
[19:55:30] [PUSH] No embedded data, pre-loading messages from server
[19:55:30] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:55:30] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:55:30] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [18391, 18390]
[19:55:30] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[19:55:30] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:55:30] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18441]
[19:55:30] [PUSH] Parsed message_id: 18441
[19:55:30] [PUSH] Parsed operation_type: 3
[19:55:30] [PUSH] Taking direct action: opType=3, messageId=18441
[19:55:30] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18441
[19:55:30] [CLIENT_SIG] Event received: type=3 messageId=18441
[19:55:30] [WS_EVENT] Received event: type=3, messageId=18441
[19:55:30] [WS_EVENT] Read receipt for message 18441 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:55:34] [SERVER] Polling - attempting to reconnect...
[19:55:36] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:55:38] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:55:39] [SERVER] Polling - attempting to reconnect...
[19:55:40] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:55:41] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:55:42] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:55:44] [SERVER] Polling - attempting to reconnect...
[19:55:49] [SERVER] Polling - attempting to reconnect...
[19:55:54] [SERVER] Polling - attempting to reconnect...
[19:55:56] [LIFECYCLE] App resigning active - cleared crash flag
[19:55:56] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[19:55:56] [SECURITY] Saved background timestamp
[19:55:56] [LIFECYCLE] App entering background - cleared crash flag
[19:55:56] [CLIENT_SIG] Disconnecting
[19:55:56] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:55:56] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[19:55:56] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:55:56] In cleanupPeer
[19:55:56] In cleanupPeer
[19:55:56] [LIFECYCLE] WebRTC audio disabled
[19:55:56] [LIFECYCLE] AVAudioSession deactivated
[19:55:56] [LIFECYCLE] All connections stopped
[19:55:56] [CLIENT_SIG] WebSocket closed with code 1001
[19:55:56] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:55:56] [SERVER] Stopped reconnect polling
[19:55:56] [WS] URLSession invalidated successfully
[19:55:56] Will request stop of video 0
[19:55:56] Will request stop of video 0
[19:55:56] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:55:56] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:55:56] [PIP] Removing 0 tracks from PiP for connection 0
[19:55:56] [PIP] ✅ All tracks removed for connection 0
[19:55:56] [PIP] Removing 0 tracks from PiP for connection 0
[19:55:56] [PIP] ✅ All tracks removed for connection 0
[19:56:29] [WS] Connection failed: The operation couldn’t be completed. Software caused connection abort
[19:56:29] [WS] Query connection failed - cleaning up all agent connections and views
[19:56:29] [CLEANUP] ========================================
[19:56:29] [CLEANUP] Cleaning up all agent connections and views
[19:56:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:56:29] [CLEANUP] Stopped and removed 0 video connections
[19:56:29] [CLEANUP] Removed 0 video views
[19:56:29] [CLEANUP] Removed 0 feed scroll views
[19:56:29] [CLEANUP] Removed 0 status labels
[19:56:29] [CLEANUP] Reset agent query state
[19:56:29] [CLEANUP] Updated page indicator
[19:56:29] [CLEANUP] Rebuilt video layout
[19:56:29] [CLEANUP] ✅ All agent connections and views cleaned up
[19:56:29] [CLEANUP] ========================================
[19:56:29] [SERVER] Skipping reconnect polling - app is in background
[19:56:30] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:56:30] [SECURITY] Timeout check: elapsed=34.30516290664673s, timeout=300.0s
[19:56:30] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:56:30] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:56:30] [LIFECYCLE] App entering foreground - restoring connections
[19:56:30] [UPLOAD_RETRY] No pending uploads to retry
[19:56:30] [LIFECYCLE] Merged 868 reactions from local DB
[19:56:30] [LIFECYCLE] WebRTC audio re-enabled
[19:56:30] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:56:30] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:56:30] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:56:30] [VIEWER] Reconnecting after background - querying agents
[19:56:30] [UNSENT_RETRY] Checking for unsent messages...
[19:56:30] [PENDING_UPLOAD] Total pending upload messages: 0
[19:56:30] [UNSENT_RETRY] No unsent messages found
[19:56:30] [PUSH] Notification tapped - session_id: ILUIWU
[19:56:30] [PUSH] Max message_id before tap: 18441
[19:56:30] [PUSH] Stored pending session: ILUIWU
[19:56:30] [PUSH_EMBED] 📩 Received embedded message: id=18442, type=0, sender=Esra
[19:56:30] [PUSH_EMBED] ✅ Saved message 18442 to local DB (sync)
[19:56:30] [PUSH_EMBED] Inserted message 18442 into existing cache (now 53 messages)
[19:56:30] [PUSH_EMBED] Fetching evolution data for message 18442 in background
[19:56:30] [PUSH_EMBED] ✅ Fully processed message 18442
[19:56:30] [PUSH] Embedded message handled instantly on tap
[19:56:30] [PUSH] Fetching server messages since_id=18441 to catch coalesced notifications on tap
[19:56:30] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[19:56:30] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[19:56:30] [PUSH_PRELOAD] Fetching up to 50 messages since_id=18441 to catch coalesced notifications
[19:56:30] [PUSH_UI] Inserted message 18442 into UI (now 53 messages)
[19:56:30] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:56:30] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:56:30] [PUSH_EMBED] Got evolution data for message 18442, saving to local DB
[19:56:30] [PUSH_EMBED] Saved evolution data for message 18442
[19:56:30] [PUSH_PRELOAD] Fetched 1 messages - caching for instant display
[19:56:30] [PRELOAD_CACHE] Preserving 52 push-inserted messages: [18441, 18440, 18439, 18438, 18437, 18436, 18435, 18434, 18433, 18432, 18431, 18430, 18429, 18428, 18427, 18426, 18425, 18424, 18423, 18422, 18421, 18420, 18419, 18418, 18417, 18416, 18415, 18414, 18413, 18412, 18411, 18410, 18409, 18408, 18407, 18406, 18405, 18404, 18403, 18402, 18401, 18400, 18399, 18398, 18397, 18396, 18395, 18394, 18393, 18392, 18391, 18390]
[19:56:30] [PUSH_PRELOAD] ⚡ Pre-cached 53 messages for instant display (preserved 52 from push)
[19:56:30] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:56:30] [PUSH] Server fetch on tap completed (success=true)
[19:56:30] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 18442, AnyHashable("message_data"): {
datesent = "2026-01-21 18:56:25";
"file_name" = "";
message = "I want you to do 5 1-0s until tomorrow lunch time\Ud83d\Ude0f";
"message_id" = 18442;
"message_type" = 0;
"prev_session_message_id" = 18441;
"replied_message" = "If my baby is in the mood and wants to give me orders for tonight in bed and / or tomorrow morning at wake up and / or under shower, her slave will have no other choice than to obey. If my baby is less in the mood, then absolutely no problem \U2764\Ufe0f";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18429;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("session_id"): ILUIWU]
[19:56:30] [PUSH_EMBED_VC] Message 18442 already in memory - skipping
[19:56:30] [PUSH] ⚡ Embedded message handled directly in ViewController
[19:56:30] [PUSH] Parsed message_id: 18442
[19:56:30] [PUSH] Parsed operation_type: 0
[19:56:30] [PUSH] Taking direct action: opType=0, messageId=18442
[19:56:30] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18442
[19:56:30] [PUSH] ⚡ Message 18442 already in memory - skipping duplicate notification entirely
[19:56:30] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18442, 18390, 18391, 18392, 18393]
[19:56:30] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:56:30] [CELL_UPLOAD] → not my message, setting complete
[19:56:30] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:56:30] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18441 → 18442
[19:56:30] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[19:56:30] [WS] Opening session at ws://crivello.dyndns.org:8081/
[19:56:30] [CLIENT_SIG] WebSocket opened
[19:56:30] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:56:30] [CLIENT_SIG] Connected! clientId=8IRSrYLE6c7uftd0
[19:56:30] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:56:30] [CLIENT_SIG] - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:56:30] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:56:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[19:56:31] HELLO → sent (cached token, role=query)
[19:56:31] [SIG] hello_ok received for query connection - ready to query agents
[19:56:31] [SIG] get_agents request sent for sessionId=ILUIWU
[19:56:31] [SIG] get_agents request sent for sessionId=iosILUIWU
[19:56:31] [SERVER] Stopped reconnect polling
[19:56:31] [SIG] agents_list received: []
[19:56:31] [SIG] agents_list received: []
[19:56:31] [COMBINED_FETCH] Loaded 7208 read receipts, 877 messages with reactions
[19:56:31] [FOREGROUND] Enriched 1 messages with readBy data from server
[19:56:31] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[19:56:31] [SECURITY] Within timeout - cleared background flag
[19:56:31] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:56:31] [PUSH] handlePollEventsNotification userInfo: [:]
[19:56:31] [PUSH] No message_id in userInfo
[19:56:31] [PUSH] No operation_type in userInfo
[19:56:31] [FAST_REFRESH] Evolution disabled - performing incremental sync
[19:56:31] [FAST_REFRESH] Already have 53 messages - skipping local DB load
[19:56:31] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[19:56:31] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:56:31] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[19:56:31] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[19:56:31] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18442
[19:56:31] [INCREMENTAL_SYNC] ✅ No new messages
[19:56:31] [FAST_REFRESH] Incremental sync complete - 53 messages
[19:56:31] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18442, 18390, 18391, 18392, 18393]
[19:56:31] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:56:31] [CELL_UPLOAD] → not my message, setting complete
[19:56:31] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:56:31] [COMBINED_FETCH] Loaded 7208 read receipts, 877 messages with reactions
[19:56:31] [FAST_REFRESH] Enriched 53 messages with readBy data
[19:56:31] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18442, 18390, 18391, 18392, 18393]
[19:56:31] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:56:31] [CELL_UPLOAD] → not my message, setting complete
[19:56:31] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:56:32] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[19:56:32] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[19:56:32] [PUSH] Silent push received
[19:56:32] [PUSH_EMBED] 📩 Received embedded message: id=18442, type=0, sender=Esra
[19:56:32] [PUSH_EMBED] ✅ Saved message 18442 to local DB (sync)
[19:56:32] [PUSH_EMBED] Fetching evolution data for message 18442 in background
[19:56:32] [PUSH_EMBED] ✅ Fully processed message 18442
[19:56:32] [PUSH] Embedded message handled instantly from silent push
[19:56:32] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[19:56:32] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[19:56:32] [PUSH_UI] Message 18442 already in memory - skipping insert
[19:56:32] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 0, AnyHashable("message_id"): 18442, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 18:56:25";
"file_name" = "";
message = "I want you to do 5 1-0s until tomorrow lunch time\Ud83d\Ude0f";
"message_id" = 18442;
"message_type" = 0;
"prev_session_message_id" = 18441;
"replied_message" = "If my baby is in the mood and wants to give me orders for tonight in bed and / or tomorrow morning at wake up and / or under shower, her slave will have no other choice than to obey. If my baby is less in the mood, then absolutely no problem \U2764\Ufe0f";
"replied_sender_id" = "3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF";
"replied_sender_name" = Laurent;
"reply_to_id" = 18429;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}]
[19:56:32] [PUSH_EMBED_VC] Message 18442 already in memory - skipping
[19:56:32] [PUSH] ⚡ Embedded message handled directly in ViewController
[19:56:32] [PUSH] Parsed message_id: 18442
[19:56:32] [PUSH] Parsed operation_type: 0
[19:56:32] [PUSH] Taking direct action: opType=0, messageId=18442
[19:56:32] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18442
[19:56:32] [PUSH] ⚡ Message 18442 already in memory - skipping duplicate notification entirely
[19:56:32] [PUSH_EMBED] Got evolution data for message 18442, saving to local DB
[19:56:32] [PUSH_EMBED] Saved evolution data for message 18442
[19:56:32] [PUSH] Silent push received
[19:56:32] [PUSH_EMBED] No embedded message_data in notification
[19:56:32] [PUSH] No embedded data, pre-loading messages from server
[19:56:32] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:56:33] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:56:33] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [18392, 18391, 18390]
[19:56:33] [PUSH_PRELOAD] ⚡ Pre-cached 53 messages for instant display (preserved 3 from push)
[19:56:33] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:56:33] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 18442, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
"content-available" = 1;
}]
[19:56:33] [PUSH] Parsed message_id: 18442
[19:56:33] [PUSH] Parsed operation_type: 3
[19:56:33] [PUSH] Taking direct action: opType=3, messageId=18442
[19:56:33] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18442
[19:56:33] [CLIENT_SIG] Event received: type=3 messageId=18442
[19:56:33] [WS_EVENT] Received event: type=3, messageId=18442
[19:56:33] [WS_EVENT] Read receipt for message 18442 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:56:40] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[19:56:40] [WS] Query connection error - cleaning up all agent connections and views
[19:56:40] [CLEANUP] ========================================
[19:56:40] [CLEANUP] Cleaning up all agent connections and views
[19:56:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[19:56:40] [CLEANUP] Stopped and removed 0 video connections
[19:56:40] [CLEANUP] Removed 0 video views
[19:56:40] [CLEANUP] Removed 0 feed scroll views
[19:56:40] [CLEANUP] Removed 0 status labels
[19:56:40] [CLEANUP] Reset agent query state
[19:56:40] [CLEANUP] Updated page indicator
[19:56:40] [CLEANUP] Rebuilt video layout
[19:56:40] [CLEANUP] ✅ All agent connections and views cleaned up
[19:56:40] [CLEANUP] ========================================
[19:56:40] [SERVER] Starting reconnect polling (5s interval)
[19:56:45] [SERVER] Polling - attempting to reconnect...
[19:56:48] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:56:48] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=53, isReloading=false
[19:56:48] [SEND_MESSAGE] ✅ Added optimistic message id=-6 to arrays, newMsgCount=54
[19:56:48] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[-6, 18442, 18441, 18440, 18439]
[19:56:48] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:56:48] [CELL_UPLOAD] → not my message, setting complete
[19:56:48] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:56:48] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:56:48] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:56:50] [CLIENT_SIG] Event received: type=0 messageId=18443
[19:56:50] [WS_EVENT] Received event: type=0, messageId=18443
[19:56:50] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18443,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:56:48"}
[19:56:50] [WS_EVENT] 📨 New message notification (msgId=18443) - triggering incremental refresh, currentMsgCount=54
[19:56:50] [CHAT] receive_message.php JSON: ["session_id": ILUIWU, "file_name": , "datesent_utc": 2026-01-21 18:56:48, "message_id": 18443, "ok": 1, "message_type": 0]
[19:56:50] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[19:56:50] [DB_UPGRADE] Upgrading message ID: -6 → 18443, preserveOriginalDate=false
[19:56:50] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18442
[19:56:50] [DB_UPGRADE] ✅ Upgraded -6 → 18443 with send_status=0, 1 row(s) affected
[19:56:50] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -6 → 18443
[19:56:50] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -6 → 18443
[19:56:50] ReloadData 9
[19:56:50] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:56:50] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:56:50] [CELL_UPLOAD] → not my message, setting complete
[19:56:50] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:56:50] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:56:50] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=54
[19:56:50] [MENU] dismissAnyExistingMenu called
[19:56:50] [MENU] dismissAnyExistingMenu completed
[19:56:50] [EMOJI_PICKER] Starting emoji picker for message 18442
[19:56:50] [MENU] Created button 'Reply' at index 0
[19:56:50] [MENU] Created button 'Copy' at index 1
[19:56:50] [MENU] Created button 'Delete' at index 2
[19:56:50] [MENU] Menu added at y=539.0
[19:56:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[18390, 18391, 18392, 18393, 18394]
[19:56:50] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:56:50] [CELL_UPLOAD] → not my message, setting complete
[19:56:50] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:56:50] [EMOJI_PICKER] ✅ Fetched 6 recent emojis
[19:56:50] [EMOJI_PICKER] ✅ Creating picker with 6 recent emojis
[19:56:50] [EMOJI_PICKER] ✅ Picker shown at y=337.0
[19:56:50] [SERVER] Polling - attempting to reconnect...
[19:56:51] [REACTION] add 👄 to message 18442 (alreadyReacted: false)
[19:56:51] [MENU] dismissAnyExistingMenu called
[19:56:51] [MENU] Found menu with tag 9999, removing
[19:56:51] [MENU] Removing blur effect
[19:56:51] [MENU] Removing floating message snapshot
[19:56:51] [MENU] Dismissing emoji picker
[19:56:51] [MENU] Recorded dismissal time for debounce
[19:56:51] [MENU] dismissAnyExistingMenu completed
[19:56:52] [REACTION] Added 👄 reaction to message 18442
[19:56:54] [MENU] dismissAnyExistingMenu called
[19:56:54] [MENU] dismissAnyExistingMenu completed
[19:56:55] [SERVER] Polling - attempting to reconnect...
[19:56:58] [LOCK] Lock button tapped - locking app immediately
[19:56:58] [LOCK] Received lock app notification
[19:56:58] [LIFECYCLE] App resigning active - cleared crash flag
[19:56:59] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:56:59] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:56:59] [LIFECYCLE] App entering background - cleared crash flag
[19:56:59] [CLIENT_SIG] Disconnecting
[19:56:59] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:56:59] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[19:56:59] [WS] Canceling WebSocket for query connection to iosILUIWU
[19:56:59] In cleanupPeer
[19:56:59] In cleanupPeer
[19:56:59] [LIFECYCLE] WebRTC audio disabled
[19:56:59] [LIFECYCLE] AVAudioSession deactivated
[19:56:59] [LIFECYCLE] All connections stopped
[19:56:59] [CLIENT_SIG] WebSocket closed with code 1001
[19:56:59] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:56:59] [SERVER] Stopped reconnect polling
[19:56:59] [WS] URLSession invalidated successfully
[19:56:59] Will request stop of video 0
[19:56:59] Will request stop of video 0
[19:56:59] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:56:59] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:56:59] [PIP] Removing 0 tracks from PiP for connection 0
[19:56:59] [PIP] ✅ All tracks removed for connection 0
[19:56:59] [PIP] Removing 0 tracks from PiP for connection 0
[19:56:59] [PIP] ✅ All tracks removed for connection 0
[19:57:42] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:57:42] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:57:42] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:57:42] [LIFECYCLE] App entering foreground - restoring connections
[19:57:42] [UPLOAD_RETRY] No pending uploads to retry
[19:57:42] [LIFECYCLE] Merged 869 reactions from local DB
[19:57:42] [LIFECYCLE] WebRTC audio re-enabled
[19:57:42] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:57:42] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:57:42] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:57:42] [VIEWER] Reconnecting after background - querying agents
[19:57:42] [UNSENT_RETRY] Checking for unsent messages...
[19:57:42] [PENDING_UPLOAD] Total pending upload messages: 0
[19:57:42] [UNSENT_RETRY] No unsent messages found
[19:57:43] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[18390, 18391, 18392, 18393, 18394]
[19:57:43] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:57:43] [CELL_UPLOAD] → not my message, setting complete
[19:57:43] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:57:43] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[19:57:43] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:57:43] [PUSH] handlePollEventsNotification userInfo: [:]
[19:57:43] [PUSH] No message_id in userInfo
[19:57:43] [PUSH] No operation_type in userInfo
[19:57:43] [FAST_REFRESH] Evolution disabled - performing incremental sync
[19:57:43] [FAST_REFRESH] Already have 54 messages - skipping local DB load
[19:57:43] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[19:57:43] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[19:57:43] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[19:57:43] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18443
[19:57:43] [CLIENT_SIG] WebSocket opened
[19:57:43] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:57:43] [CLIENT_SIG] Connected! clientId=lBQOtIB-_p04CUVO
[19:57:43] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:57:43] [CLIENT_SIG] - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:57:43] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:57:43] [INCREMENTAL_SYNC] ✅ No new messages
[19:57:43] [FAST_REFRESH] Incremental sync complete - 54 messages
[19:57:43] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[18390, 18391, 18392, 18393, 18394]
[19:57:43] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:57:43] [CELL_UPLOAD] → not my message, setting complete
[19:57:43] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:57:43] [PUSH] Silent push received
[19:57:43] [PUSH_EMBED] No embedded message_data in notification
[19:57:43] [PUSH] No embedded data, pre-loading messages from server
[19:57:43] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:57:43] [COMBINED_FETCH] Loaded 7209 read receipts, 878 messages with reactions
[19:57:43] [FOREGROUND] Enriched 1 messages with readBy data from server
[19:57:43] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:57:43] [PRELOAD_CACHE] Preserving 4 push-inserted messages: [18393, 18392, 18391, 18390]
[19:57:43] [PUSH_PRELOAD] ⚡ Pre-cached 54 messages for instant display (preserved 4 from push)
[19:57:43] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:57:43] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("message_id"): 18443]
[19:57:43] [PUSH] Parsed message_id: 18443
[19:57:43] [PUSH] Parsed operation_type: 3
[19:57:43] [PUSH] Taking direct action: opType=3, messageId=18443
[19:57:43] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18443
[19:57:43] [COMBINED_FETCH] Loaded 7209 read receipts, 878 messages with reactions
[19:57:43] [FAST_REFRESH] Enriched 54 messages with readBy data
[19:57:43] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:57:43] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[18390, 18391, 18392, 18393, 18394]
[19:57:43] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:57:43] [CELL_UPLOAD] → not my message, setting complete
[19:57:43] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:57:44] [PIN_AUTH] Correct PIN
[19:57:44] [SECURITY] Restored real session: ILUIWU
[19:57:44] [SECURITY] Restored real session: ILUIWU
[19:57:44] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[19:57:44] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[19:57:44] [AUTH] Cache had 54 messages, maxExistingId=18443, inserted 0 truly new
[19:57:44] [AUTH] UI update complete
[19:57:44] [FAKE MODE] Exiting fake mode, restoring real session
[19:57:44] [SECURITY] Restored real session: ILUIWU
[19:57:44] [SECURITY] Saved real session: ILUIWU
[19:57:44] [FAKE MODE] ✅ Restored real session: ILUIWU
[19:57:44] [FAKE MODE] Loaded 50 messages (limited to page size)
[19:57:44] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[19:57:44] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[19:57:44] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:57:44] [CELL_UPLOAD] → not my message, setting complete
[19:57:44] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:57:44] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18394, 18395, 18396, 18397, 18398]
[19:57:44] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:57:44] [CELL_UPLOAD] → not my message, setting complete
[19:57:44] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:57:44] [USER] ✅ User registered successfully
[19:57:44] [PUSH] User registration after token update: success
[19:57:45] [COMBINED_FETCH] Loaded 7209 read receipts, 878 messages with reactions
[19:57:45] [FAKE MODE] Enriched 50 messages with readBy data
[19:57:45] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18394, 18395, 18396, 18397, 18398]
[19:57:45] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:57:45] [CELL_UPLOAD] → not my message, setting complete
[19:57:45] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:57:47] [MENU] dismissAnyExistingMenu called
[19:57:47] [MENU] dismissAnyExistingMenu completed
[19:57:49] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:57:49] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:57:50] [CLIENT_SIG] Event received: type=0 messageId=18444
[19:57:50] [WS_EVENT] Received event: type=0, messageId=18444
[19:57:50] [WS_EVENT] 📨 New message notification (msgId=18444) - triggering incremental refresh, currentMsgCount=50
[19:57:50] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[19:57:50] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18443
[19:57:50] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-01-21 18:57:50 +0000 - type: unknown, operation_type: 0, message_id: 18444, session_id: ILUIWU, state: 0
[19:57:50] [PUSH_DEBUG] Full userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 18:57:49";
"file_name" = "";
message = "You should start in 1 hr";
"message_id" = 18444;
"message_type" = 0;
"prev_session_message_id" = 18443;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18444]
[19:57:50] [PUSH] App active - suppressing notification UI, posting internal event
[19:57:50] [PUSH_EMBED] 📩 Received embedded message: id=18444, type=0, sender=Esra
[19:57:50] [PUSH_EMBED] ✅ Saved message 18444 to local DB (sync)
[19:57:50] [PUSH_EMBED] Created new cache with embedded message 18444
[19:57:50] [PUSH_EMBED] Fetching evolution data for message 18444 in background
[19:57:50] [PUSH_EMBED] ✅ Fully processed message 18444
[19:57:50] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 18:57:49";
"file_name" = "";
message = "You should start in 1 hr";
"message_id" = 18444;
"message_type" = 0;
"prev_session_message_id" = 18443;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18444]
[19:57:50] [PUSH_EMBED_VC] Processing embedded message: id=18444, type=0, sender=Esra, prevId=18443
[19:57:50] [PUSH_EMBED_VC] Inserted message 18444 into allMessagesWithReadBy (now 51 messages)
[19:57:50] [PUSH_EMBED_VC] ✅ Previous message 18443 exists in memory
[19:57:50] [PUSH] ⚡ Embedded message handled directly in ViewController
[19:57:50] [PUSH] Parsed message_id: 18444
[19:57:50] [PUSH] Parsed operation_type: 0
[19:57:50] [PUSH] Taking direct action: opType=0, messageId=18444
[19:57:50] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18444
[19:57:50] [PUSH] ⚡ Message 18444 already in memory - skipping duplicate notification entirely
[19:57:50] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[19:57:50] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[19:57:50] [PUSH_UI] Message 18444 already in memory - skipping insert
[19:57:50] [PUSH_EMBED_VC] Saved message 18444 to local DB
[19:57:50] [PUSH] Silent push received
[19:57:50] [PUSH_EMBED] 📩 Received embedded message: id=18444, type=0, sender=Esra
[19:57:50] [PUSH_EMBED] ✅ Saved message 18444 to local DB (sync)
[19:57:50] [PUSH_EMBED] Created new cache with embedded message 18444
[19:57:50] [PUSH_EMBED] Fetching evolution data for message 18444 in background
[19:57:50] [PUSH_EMBED] ✅ Fully processed message 18444
[19:57:50] [PUSH] Embedded message handled instantly from silent push
[19:57:50] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[19:57:50] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[19:57:50] [PUSH_UI] Message 18444 already in memory - skipping insert
[19:57:50] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
alert = {
body = "New message received";
title = Eye;
};
badge = 1;
"content-available" = 1;
sound = default;
}, AnyHashable("message_data"): {
datesent = "2026-01-21 18:57:49";
"file_name" = "";
message = "You should start in 1 hr";
"message_id" = 18444;
"message_type" = 0;
"prev_session_message_id" = 18443;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18444]
[19:57:50] [PUSH_EMBED_VC] Message 18444 already in memory - skipping
[19:57:50] [PUSH] ⚡ Embedded message handled directly in ViewController
[19:57:50] [PUSH] Parsed message_id: 18444
[19:57:50] [PUSH] Parsed operation_type: 0
[19:57:50] [PUSH] Taking direct action: opType=0, messageId=18444
[19:57:50] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18444
[19:57:50] [PUSH] ⚡ Message 18444 already in memory - skipping duplicate notification entirely
[19:57:50] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:57:50] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:57:50] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[19:57:50] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[19:57:50] [PUSH_EMBED] Got evolution data for message 18444, saving to local DB
[19:57:50] [PUSH_EMBED] Saved evolution data for message 18444
[19:57:50] [PUSH_EMBED] Got evolution data for message 18444, saving to local DB
[19:57:50] [PUSH_EMBED] Saved evolution data for message 18444
[19:57:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[18394, 18395, 18396, 18397, 18398]
[19:57:50] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:57:50] [CELL_UPLOAD] → not my message, setting complete
[19:57:50] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:57:50] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18443 → 18444
[19:57:52] [PUSH] Silent push received
[19:57:52] [PUSH_EMBED] No embedded message_data in notification
[19:57:52] [PUSH] No embedded data, pre-loading messages from server
[19:57:52] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:57:52] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:57:52] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[19:57:52] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:57:52] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("message_id"): 18444]
[19:57:52] [PUSH] Parsed message_id: 18444
[19:57:52] [PUSH] Parsed operation_type: 3
[19:57:52] [PUSH] Taking direct action: opType=3, messageId=18444
[19:57:52] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18444
[19:57:52] [CLIENT_SIG] Event received: type=3 messageId=18444
[19:57:52] [WS_EVENT] Received event: type=3, messageId=18444
[19:57:52] [WS_EVENT] Read receipt for message 18444 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:57:52] [SCROLL_BTN] Showing button - 310pt from bottom > half 223pt
[19:57:58] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:57:58] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[19:57:58] [SEND_MESSAGE] ✅ Added optimistic message id=-7 to arrays, newMsgCount=52
[19:57:58] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-7, 18444, 18443, 18442, 18441]
[19:57:58] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:57:58] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:57:58] [CELL_UPLOAD] configure: msgId=18439, file=41101b95fabc37ab.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[19:57:58] [CELL_UPLOAD] → not my message, setting complete
[19:57:58] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=41101b95fabc37ab.jpg, overlayExists=true
[19:58:00] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:58:00] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=52, isReloading=false
[19:58:00] [SEND_MESSAGE] ✅ Added optimistic message id=-8 to arrays, newMsgCount=53
[19:58:00] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[-8, -7, 18444, 18443, 18442]
[19:58:00] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:58:00] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:58:00] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18445,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:57:58"}
[19:58:00] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-01-21 18:57:58, "message_type": 0, "file_name": , "ok": 1, "session_id": ILUIWU, "message_id": 18445]
[19:58:00] [DB_UPGRADE] Upgrading message ID: -7 → 18445, preserveOriginalDate=false
[19:58:00] [DB_UPGRADE] ✅ Upgraded -7 → 18445 with send_status=0, 1 row(s) affected
[19:58:00] [CLIENT_SIG] Event received: type=0 messageId=18445
[19:58:00] [WS_EVENT] Received event: type=0, messageId=18445
[19:58:00] [WS_EVENT] 📨 New message notification (msgId=18445) - triggering incremental refresh, currentMsgCount=53
[19:58:00] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[19:58:00] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18445
[19:58:00] [SEND_UPGRADE] ✅ Updated chatMessages[1].id: -7 → 18445
[19:58:00] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[1].id: -7 → 18445
[19:58:00] ReloadData 9
[19:58:01] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[19:58:01] [INCREMENTAL_SYNC] Replaced optimistic message (id=-8) with server message (id=18446)
[19:58:01] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[19:58:01] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[19:58:01] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[18394, 18395, 18396, 18397, 18398]
[19:58:02] [CLIENT_SIG] Event received: type=0 messageId=18446
[19:58:02] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18446,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:58:00"}
[19:58:02] [WS_EVENT] Received event: type=0, messageId=18446
[19:58:02] [WS_EVENT] 📨 New message notification (msgId=18446) - triggering incremental refresh, currentMsgCount=53
[19:58:02] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[19:58:02] [CHAT] receive_message.php JSON: ["file_name": , "ok": 1, "datesent_utc": 2026-01-21 18:58:00, "session_id": ILUIWU, "message_id": 18446, "message_type": 0]
[19:58:02] [DB_UPGRADE] Upgrading message ID: -8 → 18446, preserveOriginalDate=false
[19:58:02] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18446
[19:58:02] [DB_UPGRADE] ⚠️ No rows affected - message -8 not found in DB
[19:58:02] [SEND_UPGRADE] ⚠️ Server ID 18446 already exists - removing provisional entry -8
[19:58:02] ReloadData 9
[19:58:02] [INCREMENTAL_SYNC] ✅ No new messages
[19:58:02] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[19:58:03] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:58:03] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=53, isReloading=false
[19:58:03] [SEND_MESSAGE] ✅ Added optimistic message id=-9 to arrays, newMsgCount=54
[19:58:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[-9, 18446, 18445, 18444, 18443]
[19:58:03] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:58:03] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:58:05] [PUSH] Silent push received
[19:58:05] [PUSH_EMBED] No embedded message_data in notification
[19:58:05] [PUSH] No embedded data, pre-loading messages from server
[19:58:05] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:58:05] [PUSH] Silent push received
[19:58:05] [PUSH_EMBED] No embedded message_data in notification
[19:58:05] [PUSH] No embedded data, pre-loading messages from server
[19:58:05] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:58:05] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:58:05] [CLIENT_SIG] Event received: type=0 messageId=18447
[19:58:05] [WS_EVENT] Received event: type=0, messageId=18447
[19:58:05] [WS_EVENT] 📨 New message notification (msgId=18447) - triggering incremental refresh, currentMsgCount=54
[19:58:05] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[19:58:05] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18447
[19:58:05] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:58:05] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=54, isReloading=true
[19:58:05] [SEND_MESSAGE] ✅ Added optimistic message id=-10 to arrays, newMsgCount=55
[19:58:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=55, first5Ids=[-10, -9, 18446, 18445, 18444]
[19:58:05] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [18397, 18396, 18395]
[19:58:05] [PUSH_PRELOAD] ⚡ Pre-cached 53 messages for instant display (preserved 3 from push)
[19:58:05] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18447,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:58:03"}
[19:58:05] [CHAT] receive_message.php JSON: ["ok": 1, "session_id": ILUIWU, "message_id": 18447, "message_type": 0, "datesent_utc": 2026-01-21 18:58:03, "file_name": ]
[19:58:05] [DB_UPGRADE] Upgrading message ID: -9 → 18447, preserveOriginalDate=false
[19:58:05] [DB_UPGRADE] ❌ Step fail: UNIQUE constraint failed: local_messages.message_id
[19:58:05] [INCREMENTAL_SYNC] ✅ No new messages
[19:58:05] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:58:05] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [18397, 18396, 18395]
[19:58:05] [PUSH_PRELOAD] ⚡ Pre-cached 53 messages for instant display (preserved 3 from push)
[19:58:05] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:58:05] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:58:05] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:58:05] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:58:05] ReloadData 9
[19:58:05] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 18445, AnyHashable("session_id"): ILUIWU]
[19:58:05] [PUSH] Parsed message_id: 18445
[19:58:05] [PUSH] Parsed operation_type: 3
[19:58:05] [PUSH] Taking direct action: opType=3, messageId=18445
[19:58:05] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18445
[19:58:05] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18446, AnyHashable("aps"): {
"content-available" = 1;
}]
[19:58:05] [PUSH] Parsed message_id: 18446
[19:58:05] [PUSH] Parsed operation_type: 3
[19:58:05] [PUSH] Taking direct action: opType=3, messageId=18446
[19:58:05] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18446
[19:58:05] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=55
[19:58:07] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[19:58:07] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=55, isReloading=false
[19:58:07] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18448,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:58:05"}
[19:58:07] [CHAT] receive_message.php JSON: ["message_id": 18448, "message_type": 0, "session_id": ILUIWU, "datesent_utc": 2026-01-21 18:58:05, "file_name": , "ok": 1]
[19:58:07] [DB_UPGRADE] Upgrading message ID: -10 → 18448, preserveOriginalDate=false
[19:58:07] [DB_UPGRADE] ✅ Upgraded -10 → 18448 with send_status=0, 1 row(s) affected
[19:58:07] [SEND_MESSAGE] ✅ Added optimistic message id=-11 to arrays, newMsgCount=56
[19:58:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=56, first5Ids=[-11, -10, 18447, 18446, 18445]
[19:58:07] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[19:58:07] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[19:58:07] [CLIENT_SIG] Event received: type=0 messageId=18448
[19:58:07] [WS_EVENT] Received event: type=0, messageId=18448
[19:58:07] [WS_EVENT] 📨 New message notification (msgId=18448) - triggering incremental refresh, currentMsgCount=56
[19:58:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=56
[19:58:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18448
[19:58:07] [SEND_UPGRADE] ✅ Updated chatMessages[1].id: -10 → 18448
[19:58:07] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[1].id: -10 → 18448
[19:58:07] ReloadData 9
[19:58:08] [CLIENT_SIG] Event received: type=3 messageId=18445
[19:58:08] [WS_EVENT] Received event: type=3, messageId=18445
[19:58:08] [WS_EVENT] Read receipt for message 18445 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:58:08] [INCREMENTAL_SYNC] ✅ No new messages
[19:58:08] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=56
[19:58:08] [CLIENT_SIG] Event received: type=3 messageId=18446
[19:58:08] [WS_EVENT] Received event: type=3, messageId=18446
[19:58:08] [WS_EVENT] Read receipt for message 18446 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:58:09] [LIFECYCLE] App resigning active - cleared crash flag
[19:58:09] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[19:58:09] [SECURITY] Saved background timestamp
[19:58:09] [LIFECYCLE] App entering background - cleared crash flag
[19:58:09] [CLIENT_SIG] Disconnecting
[19:58:09] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:58:09] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=-1
[19:58:09] In cleanupPeer
[19:58:09] In cleanupPeer
[19:58:09] [LIFECYCLE] WebRTC audio disabled
[19:58:09] [LIFECYCLE] AVAudioSession deactivated
[19:58:09] [LIFECYCLE] All connections stopped
[19:58:09] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18449,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 18:58:08"}
[19:58:09] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-01-21 18:58:08, "ok": 1, "session_id": ILUIWU, "message_type": 0, "message_id": 18449, "file_name": ]
[19:58:09] [DB_UPGRADE] Upgrading message ID: -11 → 18449, preserveOriginalDate=false
[19:58:09] [DB_UPGRADE] ⚠️ No rows affected - message -11 not found in DB
[19:58:10] [CLIENT_SIG] WebSocket closed with code 1001
[19:58:10] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:58:10] [SERVER] Stopped reconnect polling
[19:58:10] Will request stop of video 0
[19:58:10] Will request stop of video 0
[19:58:10] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:58:10] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:58:10] ReloadData 9
[19:58:10] [PIP] Removing 0 tracks from PiP for connection 0
[19:58:10] [PIP] ✅ All tracks removed for connection 0
[19:58:10] [PIP] Removing 0 tracks from PiP for connection 0
[19:58:10] [PIP] ✅ All tracks removed for connection 0
[19:58:10] [PUSH] Silent push received
[19:58:10] [PUSH_EMBED] No embedded message_data in notification
[19:58:10] [PUSH] No embedded data, pre-loading messages from server
[19:58:10] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:58:10] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:58:10] [PRELOAD_CACHE] Preserving 5 push-inserted messages: [18399, 18398, 18397, 18396, 18395]
[19:58:10] [PUSH_PRELOAD] ⚡ Pre-cached 55 messages for instant display (preserved 5 from push)
[19:58:10] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:58:10] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 18448, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[19:58:10] [PUSH] Parsed message_id: 18448
[19:58:10] [PUSH] Parsed operation_type: 3
[19:58:10] [PUSH] Taking direct action: opType=3, messageId=18448
[19:58:10] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18448
[19:58:11] [SECURITY] Timeout check: elapsed=1.158776044845581s, timeout=300.0s
[19:58:11] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[19:58:11] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:58:11] [LIFECYCLE] App entering foreground - restoring connections
[19:58:11] [UPLOAD_RETRY] No pending uploads to retry
[19:58:11] [LIFECYCLE] Merged 869 reactions from local DB
[19:58:11] [LIFECYCLE] WebRTC audio re-enabled
[19:58:11] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[19:58:11] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[19:58:11] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:58:11] [VIEWER] Reconnecting after background - querying agents
[19:58:11] [UNSENT_RETRY] Checking for unsent messages...
[19:58:11] [PENDING_UPLOAD] Total pending upload messages: 0
[19:58:11] [UNSENT_RETRY] No unsent messages found
[19:58:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=56, first5Ids=[18449, 18448, 18447, 18446, 18445]
[19:58:11] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[19:58:11] [SECURITY] Within timeout - cleared background flag
[19:58:11] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[19:58:11] [PUSH] handlePollEventsNotification userInfo: [:]
[19:58:11] [PUSH] No message_id in userInfo
[19:58:11] [PUSH] No operation_type in userInfo
[19:58:11] [FAST_REFRESH] Evolution disabled - performing incremental sync
[19:58:11] [FAST_REFRESH] Already have 56 messages - skipping local DB load
[19:58:11] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[19:58:11] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[19:58:11] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=56
[19:58:11] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18449
[19:58:11] [CLIENT_SIG] WebSocket opened
[19:58:11] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:58:11] [CLIENT_SIG] Connected! clientId=5KHq4QHIBphAc-Vv
[19:58:11] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:58:11] [CLIENT_SIG] - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:58:11] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:58:11] [INCREMENTAL_SYNC] ✅ No new messages
[19:58:11] [FAST_REFRESH] Incremental sync complete - 56 messages
[19:58:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=56, first5Ids=[18449, 18448, 18447, 18446, 18445]
[19:58:11] [CLIENT_SIG] Event received: type=3 messageId=18448
[19:58:11] [WS_EVENT] Received event: type=3, messageId=18448
[19:58:11] [WS_EVENT] Read receipt for message 18448 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:58:11] [COMBINED_FETCH] Loaded 7215 read receipts, 878 messages with reactions
[19:58:11] [FOREGROUND] Enriched 2 messages with readBy data from server
[19:58:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=56, first5Ids=[18449, 18448, 18447, 18446, 18445]
[19:58:11] [COMBINED_FETCH] Loaded 7215 read receipts, 878 messages with reactions
[19:58:11] [FAST_REFRESH] Enriched 56 messages with readBy data
[19:58:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=56, first5Ids=[18449, 18448, 18447, 18446, 18445]
[19:58:12] [MUTE] Status sent to server: muted=1, response code=200
[19:58:12] [MUTE] Status sent to server: muted=1, response code=200
[19:58:12] [PUSH] Silent push received
[19:58:12] [PUSH_EMBED] No embedded message_data in notification
[19:58:12] [PUSH] No embedded data, pre-loading messages from server
[19:58:12] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:58:12] [PUSH] Silent push received
[19:58:12] [PUSH_EMBED] No embedded message_data in notification
[19:58:12] [PUSH] No embedded data, pre-loading messages from server
[19:58:12] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:58:12] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:58:12] [PRELOAD_CACHE] Preserving 5 push-inserted messages: [18399, 18398, 18397, 18396, 18395]
[19:58:12] [PUSH_PRELOAD] ⚡ Pre-cached 55 messages for instant display (preserved 5 from push)
[19:58:12] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:58:12] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 18447, AnyHashable("aps"): {
"content-available" = 1;
}]
[19:58:12] [PUSH] Parsed message_id: 18447
[19:58:12] [PUSH] Parsed operation_type: 3
[19:58:12] [PUSH] Taking direct action: opType=3, messageId=18447
[19:58:12] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18447
[19:58:12] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:58:12] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:58:12] [PRELOAD_CACHE] Preserving 5 push-inserted messages: [18399, 18398, 18397, 18396, 18395]
[19:58:12] [PUSH_PRELOAD] ⚡ Pre-cached 55 messages for instant display (preserved 5 from push)
[19:58:12] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:58:12] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 18449, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
[19:58:12] [PUSH] Parsed message_id: 18449
[19:58:12] [PUSH] Parsed operation_type: 3
[19:58:12] [PUSH] Taking direct action: opType=3, messageId=18449
[19:58:12] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18449
[19:58:13] [LOCK] Lock button tapped - locking app immediately
[19:58:13] [LOCK] Received lock app notification
[19:58:13] [CLIENT_SIG] Event received: type=3 messageId=18447
[19:58:13] [WS_EVENT] Received event: type=3, messageId=18447
[19:58:13] [WS_EVENT] Read receipt for message 18447 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:58:13] [CLIENT_SIG] Event received: type=3 messageId=18449
[19:58:13] [WS_EVENT] Received event: type=3, messageId=18449
[19:58:13] [WS_EVENT] Read receipt for message 18449 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:58:13] [LIFECYCLE] App resigning active - cleared crash flag
[19:58:14] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[19:58:14] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[19:58:14] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[19:58:14] [LIFECYCLE] App entering background - cleared crash flag
[19:58:14] [CLIENT_SIG] Disconnecting
[19:58:14] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[19:58:14] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=-1
[19:58:14] In cleanupPeer
[19:58:14] In cleanupPeer
[19:58:14] [LIFECYCLE] WebRTC audio disabled
[19:58:14] [LIFECYCLE] AVAudioSession deactivated
[19:58:14] [LIFECYCLE] All connections stopped
[19:58:14] [CLIENT_SIG] WebSocket closed with code 1001
[19:58:14] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[19:58:14] [SERVER] Stopped reconnect polling
[19:58:14] Will request stop of video 0
[19:58:14] Will request stop of video 0
[19:58:14] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[19:58:14] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[19:58:14] [PIP] Removing 0 tracks from PiP for connection 0
[19:58:14] [PIP] ✅ All tracks removed for connection 0
[19:58:14] [PIP] Removing 0 tracks from PiP for connection 0
[19:58:14] [PIP] ✅ All tracks removed for connection 0
[19:58:15] [PUSH] Silent push received
[19:58:15] [PUSH_EMBED] 📩 Received embedded message: id=18450, type=0, sender=Esra
[19:58:15] [PUSH_EMBED] ✅ Saved message 18450 to local DB (sync)
[19:58:15] [PUSH_EMBED] Inserted message 18450 into existing cache (now 56 messages)
[19:58:15] [PUSH_EMBED] Fetching evolution data for message 18450 in background
[19:58:15] [PUSH_EMBED] ✅ Fully processed message 18450
[19:58:15] [PUSH] Embedded message handled instantly from silent push
[19:58:15] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[19:58:15] [PUSH_UI_BLACKOUT] blackoutView=false, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[19:58:15] [PUSH_UI] Inserted message 18450 into UI (now 57 messages)
[19:58:15] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
datesent = "2026-01-21 18:58:12";
"file_name" = "";
message = "For the next sessions I\U2019ll let you know \Ud83d\Ude0f";
"message_id" = 18450;
"message_type" = 0;
"prev_session_message_id" = 18449;
"sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
"sender_name" = Esra;
"session_id" = ILUIWU;
timer = 0;
}, AnyHashable("message_id"): 18450, AnyHashable("session_id"): ILUIWU]
[19:58:15] [PUSH_EMBED_VC] Message 18450 already in memory - skipping
[19:58:15] [PUSH] ⚡ Embedded message handled directly in ViewController
[19:58:15] [PUSH] Parsed message_id: 18450
[19:58:15] [PUSH] Parsed operation_type: 0
[19:58:15] [PUSH] Taking direct action: opType=0, messageId=18450
[19:58:15] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=18450
[19:58:15] [PUSH] ⚡ Message 18450 already in memory - skipping duplicate notification entirely
[19:58:15] [PUSH_EMBED] Got evolution data for message 18450, saving to local DB
[19:58:15] [PUSH_EMBED] Saved evolution data for message 18450
[19:58:16] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18450, 18449, 18448, 18447, 18446]
[19:58:16] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 18449 → 18450
[19:58:19] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:58:19] [PUSH] Silent push received
[19:58:19] [PUSH_EMBED] No embedded message_data in notification
[19:58:19] [PUSH] No embedded data, pre-loading messages from server
[19:58:19] [PUSH_PRELOAD] Fetching messages for instant display cache
[19:58:19] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[19:58:19] [PRELOAD_CACHE] Preserving 6 push-inserted messages: [18400, 18399, 18398, 18397, 18396, 18395]
[19:58:19] [PUSH_PRELOAD] ⚡ Pre-cached 56 messages for instant display (preserved 6 from push)
[19:58:19] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[19:58:19] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 18450, AnyHashable("aps"): {
"content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
[19:58:19] [PUSH] Parsed message_id: 18450
[19:58:19] [PUSH] Parsed operation_type: 3
[19:58:19] [PUSH] Taking direct action: opType=3, messageId=18450
[19:58:19] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=18450
[19:58:19] [CLIENT_SIG] WebSocket opened
[19:58:19] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[19:58:19] [CLIENT_SIG] Connected! clientId=wYUFmhOjUWwRE-JO
[19:58:19] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[19:58:19] [CLIENT_SIG] - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[19:58:19] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[19:58:19] [CLIENT_SIG] Event received: type=3 messageId=18450
[19:58:19] [WS_EVENT] Received event: type=3, messageId=18450
[19:58:19] [WS_EVENT] Read receipt for message 18450 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[20:00:49] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[20:00:49] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[20:00:49] [LIFECYCLE] App entering foreground - restoring connections
[20:00:49] [LIFECYCLE] Away > 2 minutes (154s) - will scroll to bottom
[20:00:49] [UPLOAD_RETRY] No pending uploads to retry
[20:00:49] [LIFECYCLE] Merged 869 reactions from local DB
[20:00:49] [LIFECYCLE] WebRTC audio re-enabled
[20:00:49] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[20:00:49] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[20:00:49] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[20:00:49] [VIEWER] Reconnecting after background - querying agents
[20:00:49] [UNSENT_RETRY] Checking for unsent messages...
[20:00:49] [PENDING_UPLOAD] Total pending upload messages: 0
[20:00:49] [UNSENT_RETRY] No unsent messages found
[20:00:49] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[20:00:49] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[20:00:49] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalWebSocketTask <993FA04D-7827-4411-B1BC-9A841D07A0D8>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <993FA04D-7827-4411-B1BC-9A841D07A0D8>.<1>}
[20:00:49] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[20:00:49] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18450, 18449, 18448, 18447, 18446]
[20:00:49] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[20:00:49] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[20:00:49] [PUSH] handlePollEventsNotification userInfo: [:]
[20:00:49] [PUSH] No message_id in userInfo
[20:00:49] [PUSH] No operation_type in userInfo
[20:00:49] [FAST_REFRESH] Evolution disabled - performing incremental sync
[20:00:49] [FAST_REFRESH] Already have 57 messages - skipping local DB load
[20:00:49] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[20:00:49] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[20:00:49] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=57
[20:00:49] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18450
[20:00:49] [INCREMENTAL_SYNC] ✅ No new messages
[20:00:49] [FAST_REFRESH] Incremental sync complete - 57 messages
[20:00:49] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18450, 18449, 18448, 18447, 18446]
[20:00:49] [COMBINED_FETCH] Loaded 7216 read receipts, 878 messages with reactions
[20:00:49] [FOREGROUND] Enriched 0 messages with readBy data from server
[20:00:49] [COMBINED_FETCH] Loaded 7216 read receipts, 878 messages with reactions
[20:00:49] [FAST_REFRESH] Enriched 57 messages with readBy data
[20:00:49] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[20:00:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[18450, 18449, 18448, 18447, 18446]
[20:00:50] [PIN_AUTH] Correct PIN
[20:00:50] [SECURITY] Restored real session: ILUIWU
[20:00:50] [SECURITY] Restored real session: ILUIWU
[20:00:50] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[20:00:50] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[20:00:50] [AUTH] Cache had 56 messages, maxExistingId=18450, inserted 0 truly new
[20:00:50] [AUTH] UI update complete
[20:00:50] [FAKE MODE] Exiting fake mode, restoring real session
[20:00:50] [SECURITY] Restored real session: ILUIWU
[20:00:50] [SECURITY] Saved real session: ILUIWU
[20:00:50] [FAKE MODE] ✅ Restored real session: ILUIWU
[20:00:50] [FAKE MODE] Loaded 0 messages (limited to page size)
[20:00:50] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[20:00:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=0, first5Ids=[]
[20:00:50] [RELOAD_TAB] ⚠️ allMessagesWithReadBy is EMPTY - falling back to DB
[20:00:50] [RELOAD_TAB] Loaded 0 messages from DB (limited)
[20:00:50] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[20:00:50] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":1,"removed_from_other_channels":0}
[20:00:50] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[20:00:50] [USER] ✅ User registered successfully
[20:00:50] [PUSH] User registration after token update: success
[20:00:51] [COMBINED_FETCH] Loaded 7216 read receipts, 878 messages with reactions
[20:00:51] [FAKE MODE] Enriched 0 messages with readBy data
[20:00:51] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=0, first5Ids=[]
[20:00:51] [RELOAD_TAB] ⚠️ allMessagesWithReadBy is EMPTY - falling back to DB
[20:00:51] [RELOAD_TAB] Loaded 0 messages from DB (limited)
[20:00:51] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[20:00:52] [MENU] dismissAnyExistingMenu called
[20:00:52] [MENU] dismissAnyExistingMenu completed
[20:00:53] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[20:00:53] [CLIENT_SIG] WebSocket opened
[20:00:53] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[20:00:53] [CLIENT_SIG] Connected! clientId=okkxCZ77TkCADLU0
[20:00:53] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[20:00:53] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[20:00:54] [MENU] dismissAnyExistingMenu called
[20:00:54] [MENU] dismissAnyExistingMenu completed
[20:00:54] [CHAT] top pull-to-refresh triggered on tab 0
[20:00:54] [REFRESH_ALL] 🔄 refreshAllFromServer called from: pullToRefresh, currentMsgCount=0
[20:00:54] [REFRESH_ALL] 📸 Captured 0 message IDs before request
[20:00:54] [REFRESH_ALL] 📡 Fetching URL: https://crivello.dyndns.org:443/WebRTC/chat/chat_get_messages.php?viewer=1&session_id=ILUIWU&mark_read=0&viewer_id=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[20:00:54] [REFRESH_ALL] 🔄 refreshAllFromServer called from: editMessage, currentMsgCount=0
[20:00:54] [REFRESH_ALL] ⚠️ Already reloading - skipping request from: editMessage
[20:00:54] [PENDING_UPLOAD] Total pending upload messages: 0
[20:00:54] [PENDING_UPLOAD] Preserved 0 pending messages before server refresh
[20:00:54] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=0, first5Ids=[]
[20:00:54] [RELOAD_TAB] ⚠️ allMessagesWithReadBy is EMPTY - falling back to DB
[20:00:54] [RELOAD_TAB] Loaded 0 messages from DB (limited)
[20:00:54] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[20:00:55] DOWNLOADIIING t_A838C8A7-6ACB-4EC0-8A9C-B457DDC4006E.jpg
[20:00:55] DOWNLOADIIING t_203DADEC-DEED-4A33-908B-8F8E344461B1.jpg
[20:00:55] DOWNLOADIIING t_1b1a78050ebe099b.jpg
[20:00:55] DOWNLOADIIING t_bae538c2a3076c11.jpg
[20:00:55] DOWNLOADIIING t_ee42d57ffd8ab767.jpg
[20:00:55] DOWNLOADIIING t_5cfd84d52271d308.jpg
[20:00:55] DOWNLOADIIING t_919f4df51be24b2c.jpg
[20:00:55] DOWNLOADIIING t_0f2dda66cccdeadf.jpg
[20:00:55] DOWNLOADIIING t_32675c319a37fee7.jpg
[20:00:55] DOWNLOADIIING t_a45f085b5a2c50aa.jpg
[20:00:55] DOWNLOADIIING t_7cd3ce3d7797eb3c.jpg
[20:00:55] DOWNLOADIIING t_abb65f630e55dc61.jpg
[20:00:55] DOWNLOADIIING t_2a4c7380908d6595.jpg
[20:00:55] DOWNLOADIIING t_1ee77a72ee5013e0.jpg
[20:00:55] DOWNLOADIIING t_02f48c94671cc64e.jpg
[20:00:55] DOWNLOADIIING t_d0fd8cabebf807d5.jpg
[20:00:55] DOWNLOADIIING t_364b0669ed2f3378.jpg
[20:00:55] DOWNLOADIIING t_7f3c34ff05eb7c95.jpg
[20:00:55] DOWNLOADIIING t_66e5f4c7c82fef18.jpg
[20:00:55] DOWNLOADIIING t_f4d9bbe2fc21d5ae.jpg
[20:00:55] DOWNLOADIIING t_e1d06c52c18e20ce.jpg
[20:00:55] DOWNLOADIIING t_722d39e0d91dd954.jpg
[20:00:55] DOWNLOADIIING t_97828ef5de49a612.jpg
[20:00:55] DOWNLOADIIING t_98986cbb2cd2ae48.jpg
[20:00:55] [CHANNEL_SWITCH] 📊 About to set loaded messages. Count=7216
[20:00:55] [REFRESH_ALL] 📊 Server returned 7216 messages
[20:00:55] [REFRESH_ALL] 📊 Final merge: server=7216, preserved=0, total=7216
[20:00:55] [REFRESH_ALL] 📊 Displaying 50 of 7216 messages, hasMore=true
[20:00:55] [PULL_REFRESH] Loaded 50 messages (first page), displaying 50 for tab 0, hasMore: true
[20:00:55] ReloadData 15 (pull-to-refresh completed)
[20:00:55] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18401, 18402, 18403, 18404, 18405]
[20:00:55] [CELL_UPLOAD] configure: msgId=18407, file=7494d317859e38fb.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[20:00:55] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[20:00:55] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=7494d317859e38fb.jpg, overlayExists=true
[20:00:55] [SCROLL_BTN] Showing button - 4813pt from bottom > half 379pt
[20:00:56] [COMBINED_FETCH] Loaded 7216 read receipts, 878 messages with reactions
[20:00:58] [SCROLL_BTN] Showing button - 310pt from bottom > half 223pt
[20:00:59] ReloadData 14 (all 42 media thumbnails loaded) - applying tab 0 filtering
[20:00:59] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18401, 18402, 18403, 18404, 18405]
[20:01:11] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[20:01:11] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[20:01:11] [SEND_MESSAGE] ✅ Added optimistic message id=-12 to arrays, newMsgCount=51
[20:01:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-12, 18450, 18449, 18448, 18447]
[20:01:11] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[20:01:11] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[20:01:13] [CLIENT_SIG] Event received: type=0 messageId=18451
[20:01:13] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":18451,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-01-21 19:01:11"}
[20:01:13] [WS_EVENT] Received event: type=0, messageId=18451
[20:01:13] [CHAT] receive_message.php JSON: ["ok": 1, "datesent_utc": 2026-01-21 19:01:11, "message_id": 18451, "message_type": 0, "session_id": ILUIWU, "file_name": ]
[20:01:13] [WS_EVENT] 📨 New message notification (msgId=18451) - triggering incremental refresh, currentMsgCount=51
[20:01:13] [DB_UPGRADE] Upgrading message ID: -12 → 18451, preserveOriginalDate=false
[20:01:13] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[20:01:13] [DB_UPGRADE] ✅ Upgraded -12 → 18451 with send_status=0, 1 row(s) affected
[20:01:13] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18451
[20:01:13] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -12 → 18451
[20:01:13] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -12 → 18451
[20:01:13] ReloadData 9
[20:01:13] [INCREMENTAL_SYNC] ✅ No new messages
[20:01:13] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[20:01:13] [LOCK] Lock button tapped - locking app immediately
[20:01:13] [LOCK] Received lock app notification
[20:01:14] [LIFECYCLE] App resigning active - cleared crash flag
[20:01:15] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[20:01:15] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[20:01:15] [LIFECYCLE] App entering background - cleared crash flag
[20:01:15] [CLIENT_SIG] Disconnecting
[20:01:15] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[20:01:15] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=-1
[20:01:15] In cleanupPeer
[20:01:15] In cleanupPeer
[20:01:15] [LIFECYCLE] WebRTC audio disabled
[20:01:15] [LIFECYCLE] AVAudioSession deactivated
[20:01:15] [LIFECYCLE] All connections stopped
[20:01:15] [CLIENT_SIG] WebSocket closed with code 1001
[20:01:15] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[20:01:15] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}[20:27:54] [LOG] Pruned 1247 entries older than 3 hours
[20:27:54] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[20:27:54] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[20:27:54] [GIPHY] SDK not available - using REST API fallback
[20:27:54] [BACKGROUND] Background fetch enabled
[20:27:54] [AUTH] Starting PIN authentication
[20:27:54] [BACKGROUND] Background fetch triggered
[20:27:54] [BACKGROUND] Fetching recent messages for pre-cache
[20:27:54] [CLEANUP] ✅ Deleted 4 timer messages older than 24h
[20:27:54] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[20:27:54] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":1,"removed_from_other_channels":0}
[20:27:54] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[20:27:54] [USER] ✅ User registered successfully
[20:27:54] [PUSH] User registration after token update: success
[20:27:54] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=18451)...
[20:27:54] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[20:27:54] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[20:27:54] [PRELOAD] No messages or parse error
[20:27:54] [BACKGROUND] Pre-downloaded 0 thumbnails
[20:27:54] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[20:32:45] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[20:32:45] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[20:32:45] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[20:32:45] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[20:32:45] [CLIENT_SIG] WebSocket opened
[20:32:45] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[20:32:45] [CLIENT_SIG] Connected! clientId=JAy_YtbIAiyhsc_3
[20:32:45] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[20:32:45] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)[20:32:46] [LOG] Pruned 1603 entries older than 3 hours
[20:32:46] [SECURITY] Restored real session: ILUIWU
[20:32:46] [SECURITY] Restored real session: ILUIWU
[20:32:47] [SECURITY] Saved real session: ILUIWU
[20:32:47] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[20:32:47] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[20:32:47] Documents Directory: /var/mobile/Containers/Data/Application/FEAD2E1F-C4A1-4969-9070-16A67DA77312/Documents
[20:32:47] [THEME] Applying current theme
[20:32:47] [CHAT] Applied day theme (mode: day)
[20:32:47] [SECURITY] Saved real session: ILUIWU
[20:32:47] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[20:32:47] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[20:32:47] [NETWORK] Network monitor started
[20:32:47] [NETWORK] Status changed: connected
[20:32:47] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[20:32:47] Did transition
[20:32:47] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[20:32:47] [VIEWER] Screen lock enabled - normal idle behavior
[20:32:47] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[20:32:47] [VCC] ========== VideoConnectionClass INIT ==========
[20:32:47] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[20:32:47] [DATA AUDIO] ========== setupWebRTC() START ==========
[20:32:47] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[20:32:47] [DATA AUDIO] Creating encoder/decoder factories...
[20:32:47] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[20:32:47] [CODEC] Viewer selected encoder: AV1 (best quality)
[20:32:47] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[20:32:47] [DATA AUDIO] ✅ Factory created
[20:32:47] [DATA AUDIO] RTCAudioSession locked
[20:32:47] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[20:32:47] [DATA AUDIO] RTCAudioSession unlocked
[20:32:47] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[20:32:47] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[20:32:47] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[20:32:47] [WS] Opening session at ws://crivello.dyndns.org:8081/
[20:32:47] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[20:32:47] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[20:32:47] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[20:32:47] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[20:32:47] Did transition
[20:32:47] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[20:32:47] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[20:32:47] [CHUNK] Merged 884 reactions synchronously
[20:32:47] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[20:32:47] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[20:32:47] [MIGRATION] No messages need sender_name backfill
[20:32:47] [GALLERY_DB] ✅ Loaded 0 media messages
[20:32:47] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[20:32:47] [GALLERY] Filtered 0 -> 0 (only with local thumbnails)
[20:32:47] [GALLERY] First 5 after sort (newest first):
[20:32:47] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18451
[20:32:47] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[20:32:47] [SERVER] Starting reconnect polling (5s interval)
[20:32:47] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[20:32:47] [ICONS] Offset applied: -14.6
[20:32:47] [ICONS] New left margin: 11.2, New right margin: 11.3
[20:32:47] [INCREMENTAL_SYNC] ✅ No new messages
[20:32:47] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[20:32:47] [UNSENT_RETRY] Checking for unsent messages...
[20:32:47] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[20:32:47] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[20:32:47] [UPLOAD_RECOVERY] Session: ILUIWU
[20:32:47] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[20:32:47] [UPLOAD_RECOVERY] Checking recent media messages on server...
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18428, file=f36a462089f1685a.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18409, file=f733dc0a9f704916.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18407, file=7494d317859e38fb.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18380, file=47f0a79ffd2469ec.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18338, file=587faef97c05d266.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18329, file=41e6d3f8b6fc3362.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18320, file=79f8421197610988.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18312, file=077bf4aba425ab65.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18306, file=8c29dab4be6eb199.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18296, file=e27abe61119a26c3.mov, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] 📋 Recent media: msgId=18276, file=a9dc1013e9d5a3e6.jpg, upload_status=complete
[20:32:47] [UPLOAD_RECOVERY] Verifying 11 media files exist on server...
[20:32:47] [PENDING_UPLOAD] Total pending upload messages: 0
[20:32:47] [UNSENT_RETRY] No unsent messages found
[20:32:47] [UPLOAD_RECOVERY] ✅ All media files verified on server
[20:32:47] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18402, 18403, 18404, 18405, 18406]
[20:32:47] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[20:32:47] [CELL_UPLOAD] configure: msgId=18407, file=7494d317859e38fb.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[20:32:47] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[20:32:47] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=7494d317859e38fb.jpg, overlayExists=true
[20:32:47] [CELL_UPLOAD] configure: msgId=18409, file=f733dc0a9f704916.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[20:32:47] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[20:32:47] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=f733dc0a9f704916.jpg, overlayExists=true
[20:32:47] [ICONS] Chat center: (31.2, 87.0)
[20:32:47] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[20:32:47] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[20:32:47] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[20:32:47] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[20:32:47] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[20:32:47] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[20:32:47] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[20:32:47] [ICONS] Screen width: 440.0
[20:32:47] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[20:32:47] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[20:32:47] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[20:32:47] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[20:32:47] [USER] ✅ User registered successfully
[20:32:47] [USER] User registration successful
[20:32:47] new_session POST ok: token len=157
[20:32:47] HELLO → sent (fetched token, role=query)
[20:32:47] [SIG] hello_ok received for query connection - ready to query agents
[20:32:47] [SIG] get_agents request sent for sessionId=ILUIWU
[20:32:47] [SIG] get_agents request sent for sessionId=iosILUIWU
[20:32:47] [SERVER] Stopped reconnect polling
[20:32:47] [SIG] agents_list received: []
[20:32:47] [SIG] agents_list received: []
[20:32:47] [COMBINED_FETCH] Loaded 7217 read receipts, 878 messages with reactions
[20:32:47] [READBY_ENRICH] Enriched 50 messages with readBy data
[20:32:47] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18402, 18403, 18404, 18405, 18406]
[20:32:52] [MENU] dismissAnyExistingMenu called
[20:32:52] [MENU] dismissAnyExistingMenu completed
[20:32:54] [MENU] dismissAnyExistingMenu called
[20:32:54] [MENU] dismissAnyExistingMenu completed
[20:33:01] [SCROLL_BTN] Showing button - 306pt from bottom > half 223pt
[20:33:07] [SCROLL_BTN] Showing button - 310pt from bottom > half 223pt
[20:33:14] [LIFECYCLE] App resigning active - cleared crash flag
[20:33:14] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[20:33:14] [SECURITY] Saved background timestamp
[20:33:14] [LIFECYCLE] App entering background - cleared crash flag
[20:33:14] [CLIENT_SIG] Disconnecting
[20:33:14] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[20:33:14] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[20:33:14] [WS] Canceling WebSocket for query connection to iosILUIWU
[20:33:14] In cleanupPeer
[20:33:14] In cleanupPeer
[20:33:14] [LIFECYCLE] WebRTC audio disabled
[20:33:14] [LIFECYCLE] AVAudioSession deactivated
[20:33:14] [LIFECYCLE] All connections stopped
[20:33:14] [CLIENT_SIG] WebSocket closed with code 1001
[20:33:14] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[20:33:14] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[20:33:14] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[20:33:14] [SERVER] Stopped reconnect polling
[20:33:14] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[20:33:14] [WS] Query connection error - cleaning up all agent connections and views
[20:33:14] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[20:33:14] [WS] Query connection failed - cleaning up all agent connections and views
[20:33:14] Will request stop of video 0
[20:33:14] Will request stop of video 0
[20:33:14] [CLEANUP] ========================================
[20:33:14] [CLEANUP] Cleaning up all agent connections and views
[20:33:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[20:33:14] [CLEANUP] Stopped and removed 0 video connections
[20:33:14] [CLEANUP] Removed 0 video views
[20:33:14] [CLEANUP] Removed 0 feed scroll views
[20:33:14] [CLEANUP] Removed 0 status labels
[20:33:14] [CLEANUP] Reset agent query state
[20:33:14] [CLEANUP] Updated page indicator
[20:33:14] [CLEANUP] Rebuilt video layout
[20:33:14] [CLEANUP] ✅ All agent connections and views cleaned up
[20:33:14] [CLEANUP] ========================================
[20:33:14] [SERVER] Skipping reconnect polling - app is in background
[20:33:14] [WS] URLSession invalidated successfully
[20:33:14] [CLEANUP] ========================================
[20:33:14] [CLEANUP] Cleaning up all agent connections and views
[20:33:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[20:33:14] [CLEANUP] Stopped and removed 0 video connections
[20:33:14] [CLEANUP] Removed 0 video views
[20:33:14] [CLEANUP] Removed 0 feed scroll views
[20:33:14] [CLEANUP] Removed 0 status labels
[20:33:14] [CLEANUP] Reset agent query state
[20:33:14] [CLEANUP] Updated page indicator
[20:33:14] [CLEANUP] Rebuilt video layout
[20:33:14] [CLEANUP] ✅ All agent connections and views cleaned up
[20:33:14] [CLEANUP] ========================================
[20:33:14] [SERVER] Skipping reconnect polling - app is in background
[20:33:14] [PIP] Removing 0 tracks from PiP for connection 0
[20:33:14] [PIP] ✅ All tracks removed for connection 0
[20:33:14] [PIP] Removing 0 tracks from PiP for connection 0
[20:33:14] [PIP] ✅ All tracks removed for connection 0
[20:33:41] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[20:33:41] [WS] Opening session at ws://crivello.dyndns.org:8081/
[20:33:41] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[20:33:43] [SECURITY] Timeout check: elapsed=29.42506694793701s, timeout=300.0s
[20:33:43] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[20:33:43] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[20:33:43] [LIFECYCLE] App entering foreground - restoring connections
[20:33:43] [UPLOAD_RETRY] No pending uploads to retry
[20:33:43] [LIFECYCLE] Merged 884 reactions from local DB
[20:33:43] [LIFECYCLE] WebRTC audio re-enabled
[20:33:43] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[20:33:43] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[20:33:43] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[20:33:43] [VIEWER] Reconnecting after background - querying agents
[20:33:43] [UNSENT_RETRY] Checking for unsent messages...
[20:33:43] [PENDING_UPLOAD] Total pending upload messages: 0
[20:33:43] [UNSENT_RETRY] No unsent messages found
[20:33:43] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[20:33:43] [CLIENT_SIG] WebSocket opened
[20:33:43] HELLO → sent (cached token, role=query)
[20:33:43] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[20:33:43] [SIG] hello_ok received for query connection - ready to query agents
[20:33:43] [SIG] get_agents request sent for sessionId=ILUIWU
[20:33:43] [SIG] get_agents request sent for sessionId=iosILUIWU
[20:33:43] [CLIENT_SIG] Connected! clientId=vWGdiFgVrMOHNqjB
[20:33:43] [SERVER] Stopped reconnect polling
[20:33:43] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[20:33:43] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[20:33:43] [SIG] agents_list received: []
[20:33:43] [SIG] agents_list received: []
[20:33:43] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18402, 18403, 18404, 18405, 18406]
[20:33:44] [COMBINED_FETCH] Loaded 7217 read receipts, 878 messages with reactions
[20:33:44] [FOREGROUND] Enriched 0 messages with readBy data from server
[20:33:44] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[20:33:44] [SECURITY] Within timeout - cleared background flag
[20:33:44] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[20:33:44] [PUSH] handlePollEventsNotification userInfo: [:]
[20:33:44] [PUSH] No message_id in userInfo
[20:33:44] [PUSH] No operation_type in userInfo
[20:33:44] [FAST_REFRESH] Evolution disabled - performing incremental sync
[20:33:44] [FAST_REFRESH] Already have 50 messages - skipping local DB load
[20:33:44] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[20:33:44] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[20:33:44] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[20:33:44] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[20:33:44] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 18451
[20:33:44] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18402, 18403, 18404, 18405, 18406]
[20:33:44] [INCREMENTAL_SYNC] ✅ No new messages
[20:33:44] [FAST_REFRESH] Incremental sync complete - 50 messages
[20:33:44] [COMBINED_FETCH] Loaded 7217 read receipts, 878 messages with reactions
[20:33:44] [FAST_REFRESH] Enriched 50 messages with readBy data
[20:33:45] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[18402, 18403, 18404, 18405, 18406]
[20:33:47] [LOG] Long press on chat icon detected! Triggering log upload...
[20:33:47] [SCROLL_BTN] Showing button - 283pt from bottom > half 223pt