AI Integration Quick Reference
AI Integration Quick Reference
Everything on this page is a no-op unless offline support is active for the logged-in user (
CometChat.isOfflineEnabled() is true). See Enable Offline Support.How catch-up works
A sync runs automatically whenever the connection settles, including the first connect after login or launch. It never runs on a brief connect-then-drop flap, and overlapping triggers coalesce: at most one follow-up sweep is queued behind the running one. It proceeds in two phases, in order:- Conversation phase — the conversation list is fetched as one fresh page (up to
maxConversations). A conversation-list UI can blind-replace its list with the result. - Message phase — the SDK replays the message changelog from the last sync point. New messages and updates to already-cached messages are merged into the cache. A cold start skips this phase.
DISCARDED). A first-ever sync (cold start) runs only the conversation phase: it seeds its starting point from the newest conversation and fetches no message history — older history is reached by scrolling online.
Listen for sync progress
Register aCometChat.SyncListener to observe the lifecycle of every automatic and manual sync. Each phase that runs fires started, then exactly one of completed / error. A cold start runs only the conversation phase, so no onMessageSync* callback fires.
- TypeScript
- JavaScript
The two phases are independent — a conversation-phase error does not stop the message phase. A phase error is informational: the cache is never left in a wrong state and the sweep resumes automatically. The error always carries a
code: FAILED_TO_FETCH when the request got no answer, ERROR_JSON_EXCEPTION when the server answered 2xx with an unreadable body (details.httpStatus holds the status), otherwise the server’s own code.
onMessageSyncCompleted reports the outcome:
Remove the listener with
CometChat.removeSyncListener("SYNC_LISTENER"). Registrations are kept across login, logout and restarts, so register once.
Receiving synced messages
If you already use aCometChat.MessageListener, synced messages still arrive there, so you usually do not need a SyncListener to keep your chat up to date:
- Genuinely new messages arrive one-by-one on
onTextMessageReceived(and the other typed variants), withmessage.getSource()set toSYNC. - Updates to already-cached messages arrive together on
onMessagesSynced(messages).
- TypeScript
- JavaScript
On reconnect, queued messages are sent first, then the sync runs.
forceSyncNow runs only the sync; it does not send queued messages (use retryMessage or retryAllFailedMessages for those).Check sync state
Poll the current sync state and the time of the last completed sync at any time.- TypeScript
- JavaScript
getSyncState() returns SYNCING while a sweep is in flight, otherwise IDLE (also when offline support is disabled). getLastSyncTimestamp() returns a server-provided epoch value in seconds, never the device clock, and 0 if the cache has never synced.
Trigger a manual sync
CallforceSyncNow to run a catch-up immediately — for example behind a pull-to-refresh. It routes through the same throttle as the automatic sync, so it will not start a second overlapping sweep or hammer the backend, and it is refused for 10 seconds after any sync ends, automatic or forced, whether or not that sync succeeded.
Pass a callback to learn whether the request was accepted; it receives no error (null) as soon as the catch-up starts. The sync’s actual progress and outcome still arrive on your registered SyncListener.
- TypeScript
- JavaScript
CometChat.forceSyncNow() with no argument; a rejected request is silently dropped.
When the cache resets
In rare cases the SDK cannot keep the existing cache — for example the encryption key became unrecoverable, or the database is corrupt. When this happens it rebuilds the cache from scratch and notifies anOfflineCacheResetListener. Any un-sent messages that were queued are lost in the rebuild; pendingMessagesLost reports how many, or -1 (CometChat.OFFLINE_PENDING_COUNT_UNKNOWN) when the count is unknown. Each lost message that could still be read fails with DISCARDED on onOutboxMessageFailed. A logout never fires it.
- TypeScript
- JavaScript
Remove the listener with
CometChat.removeOfflineCacheResetListener("RESET_LISTENER"). See Encrypt the Cache for the encryption-related reasons.
A cache that another tab (or process) holds locked or busy is never rebuilt; offline stays off for that session instead.
Manage the cache
Read the current cache size, or clear the cache entirely.- TypeScript
- JavaScript
getCacheSize() returns the size in bytes using the same measure as maxStorageSize — cached content before encryption, plus cached media bytes. It is not the size on disk and not everything your origin stores. It returns 0 when offline support is disabled.
You never need to clear the cache on logout — the SDK does it for you. The cache is stored per app and user: a reload with a still-valid session reuses it, and it is deleted on logout, token expiry, an app id change, or when a different user logs in. With offline off in your config, any offline data an earlier build left on the device is deleted when the session ends, and
logout() resolves after the deletion (in a browser this can take up to about 5 seconds per database while another tab still has it open). See Offline Support.