stream-chat-react-native-core 5.6.0 → 5.6.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/utils/DBSyncManager.js +6 -4
- package/lib/commonjs/utils/DBSyncManager.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/utils/DBSyncManager.js +6 -4
- package/lib/module/utils/DBSyncManager.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/package.json +1 -1
- package/src/utils/DBSyncManager.ts +2 -0
- package/src/version.json +1 -1
|
@@ -83,7 +83,7 @@ DBSyncManager.init = function () {
|
|
|
83
83
|
switch (_context.prev = _context.next) {
|
|
84
84
|
case 0:
|
|
85
85
|
if (!event.online) {
|
|
86
|
-
_context.next =
|
|
86
|
+
_context.next = 7;
|
|
87
87
|
break;
|
|
88
88
|
}
|
|
89
89
|
|
|
@@ -91,18 +91,20 @@ DBSyncManager.init = function () {
|
|
|
91
91
|
return DBSyncManager.syncAndExecutePendingTasks();
|
|
92
92
|
|
|
93
93
|
case 3:
|
|
94
|
+
DBSyncManager.syncStatus = true;
|
|
94
95
|
DBSyncManager.listeners.forEach(function (l) {
|
|
95
96
|
return l(true);
|
|
96
97
|
});
|
|
97
|
-
_context.next =
|
|
98
|
+
_context.next = 9;
|
|
98
99
|
break;
|
|
99
100
|
|
|
100
|
-
case
|
|
101
|
+
case 7:
|
|
102
|
+
DBSyncManager.syncStatus = false;
|
|
101
103
|
DBSyncManager.listeners.forEach(function (l) {
|
|
102
104
|
return l(false);
|
|
103
105
|
});
|
|
104
106
|
|
|
105
|
-
case
|
|
107
|
+
case 9:
|
|
106
108
|
case "end":
|
|
107
109
|
return _context.stop();
|
|
108
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["DBSyncManager.ts"],"names":["restBeforeNextTask","Promise","resolve","setTimeout","DBSyncManager","syncStatus","listeners","client","getSyncStatus","init","user","id","wsConnection","isHealthy","syncAndExecutePendingTasks","forEach","l","on","event","online","onSyncStatusChange","listener","push","unsubscribe","filter","el","sync","lastSyncedAt","currentUserId","cids","Date","toISOString","result","queries","events","reduce","concat","length","QuickSqliteClient","executeSqlBatch","resetDB","toString","executePendingTasks","queueTask","task","removeFromApi","executeTask","response","data","code","channel","channelType","channelId","type","sendReaction","payload","deleteReaction","deleteMessage","Error","queue","dropPendingTasks","conditions","tasks"],"mappings":"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","sourcesContent":["import type { AxiosError } from 'axios';\nimport type { APIErrorResponse, StreamChat } from 'stream-chat';\n\nimport { handleEventToSyncDB } from '../components/Chat/hooks/handleEventToSyncDB';\nimport { getAllChannelIds, getLastSyncedAt, upsertLastSyncedAt } from '../store/apis';\n\nimport { addPendingTask } from '../store/apis/addPendingTask';\n\nimport { deletePendingTask } from '../store/apis/deletePendingTask';\nimport { getPendingTasks } from '../store/apis/getPendingTasks';\nimport { QuickSqliteClient } from '../store/QuickSqliteClient';\nimport type { PendingTask, PreparedQueries } from '../store/types';\nimport type { DefaultStreamChatGenerics } from '../types/types';\n/**\n * DBSyncManager has the responsibility to sync the channel states\n * within local database whenever possible.\n *\n * Components can get the current sync status using DBSyncManager.getCurrentStatus().\n * Or components can attach a listener for status change as following:\n *\n * ```tsx\n * useEffect(() => {\n * const unsubscribe = DBSyncManager.onSyncStatusChange((syncStatus) => {\n * if (syncStatus) {\n * doSomething();\n * }\n * })\n *\n * return () => unsubscribe();\n * })\n * ```\n */\nconst restBeforeNextTask = () => new Promise((resolve) => setTimeout(resolve, 500));\n\nexport class DBSyncManager {\n static syncStatus = false;\n static listeners: Array<(status: boolean) => void> = [];\n static client: StreamChat | null = null;\n\n /**\n * Returns weather channel states in local DB are synced with backend or not.\n * @returns boolean\n */\n static getSyncStatus = () => this.syncStatus;\n\n /**\n * Initializes the DBSyncManager. This function should be called only once\n * throughout the lifetime of SDK.\n *\n * @param client\n */\n static init = async (client: StreamChat) => {\n this.client = client;\n // If the websocket connection is already active, then straightaway\n // call the sync api and also execute pending api calls.\n // Otherwise wait for `connection.changed` event.\n if (client.user?.id && client.wsConnection?.isHealthy) {\n await this.syncAndExecutePendingTasks();\n this.syncStatus = true;\n this.listeners.forEach((l) => l(true));\n }\n\n this.client.on('connection.changed', async (event) => {\n if (event.online) {\n await this.syncAndExecutePendingTasks();\n this.listeners.forEach((l) => l(true));\n } else {\n this.listeners.forEach((l) => l(false));\n }\n });\n };\n\n /**\n * Subscribes a listener for sync status change.\n *\n * @param listener {function}\n * @returns {function} to unsubscribe the listener.\n */\n static onSyncStatusChange = (listener: (status: boolean) => void) => {\n this.listeners.push(listener);\n\n return {\n unsubscribe: () => {\n this.listeners = this.listeners.filter((el) => el !== listener);\n },\n };\n };\n\n static sync = async () => {\n if (!this.client?.user) return;\n\n const lastSyncedAt = getLastSyncedAt({\n currentUserId: this.client.user.id,\n });\n const cids = getAllChannelIds();\n\n if (lastSyncedAt) {\n try {\n const result = await this.client.sync(cids, new Date(lastSyncedAt).toISOString());\n const queries = result.events.reduce<PreparedQueries[]>((queries, event) => {\n queries = queries.concat(handleEventToSyncDB(event, false));\n return queries;\n }, []);\n\n if (queries.length) {\n QuickSqliteClient.executeSqlBatch(queries);\n }\n } catch (e) {\n // Error will be raised by the sync API if there are too many events.\n // In that case reset the entire DB and start fresh.\n QuickSqliteClient.resetDB();\n }\n }\n upsertLastSyncedAt({\n currentUserId: this.client.user.id,\n lastSyncedAt: new Date().toString(),\n });\n };\n\n static syncAndExecutePendingTasks = async () => {\n if (!this.client) return;\n\n await this.executePendingTasks(this.client);\n await this.sync();\n };\n\n static queueTask = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >({\n client,\n task,\n }: {\n client: StreamChat<StreamChatGenerics>;\n task: PendingTask;\n }) => {\n const removeFromApi = addPendingTask(task);\n\n let response;\n try {\n response = await this.executeTask<StreamChatGenerics>({ client, task });\n } catch (e) {\n if ((e as AxiosError<APIErrorResponse>)?.response?.data?.code === 4) {\n // Error code 16 - message already exists\n // ignore\n } else {\n throw e;\n }\n }\n\n removeFromApi();\n\n return response;\n };\n\n static executeTask = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >({\n client,\n task,\n }: {\n client: StreamChat<StreamChatGenerics>;\n task: PendingTask;\n }) => {\n const channel = client.channel(task.channelType, task.channelId);\n\n if (task.type === 'send-reaction') {\n return await channel.sendReaction(...task.payload);\n }\n\n if (task.type === 'delete-reaction') {\n return await channel.deleteReaction(...task.payload);\n }\n\n if (task.type === 'delete-message') {\n return await client.deleteMessage(...task.payload);\n }\n\n throw new Error('Invalid task type');\n };\n\n static executePendingTasks = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >(\n client: StreamChat<StreamChatGenerics>,\n ) => {\n const queue = getPendingTasks();\n for (const task of queue) {\n if (!task.id) continue;\n\n try {\n await this.executeTask<StreamChatGenerics>({\n client,\n task,\n });\n } catch (e) {\n if ((e as AxiosError<APIErrorResponse>)?.response?.data?.code === 4) {\n // Error code 16 - message already exists\n // ignore\n } else {\n throw e;\n }\n }\n\n deletePendingTask({\n id: task.id,\n });\n await restBeforeNextTask();\n }\n };\n\n static dropPendingTasks = (conditions: { messageId: string }) => {\n const tasks = getPendingTasks(conditions);\n\n for (const task of tasks) {\n if (!task.id) continue;\n\n deletePendingTask({\n id: task.id,\n });\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["DBSyncManager.ts"],"names":["restBeforeNextTask","Promise","resolve","setTimeout","DBSyncManager","syncStatus","listeners","client","getSyncStatus","init","user","id","wsConnection","isHealthy","syncAndExecutePendingTasks","forEach","l","on","event","online","onSyncStatusChange","listener","push","unsubscribe","filter","el","sync","lastSyncedAt","currentUserId","cids","Date","toISOString","result","queries","events","reduce","concat","length","QuickSqliteClient","executeSqlBatch","resetDB","toString","executePendingTasks","queueTask","task","removeFromApi","executeTask","response","data","code","channel","channelType","channelId","type","sendReaction","payload","deleteReaction","deleteMessage","Error","queue","dropPendingTasks","conditions","tasks"],"mappings":";;;;;;;;;;;;;;;;;AAGA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;;;;;;;AAsBA,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB;AAAA,SAAM,IAAIC,OAAJ,CAAY,UAACC,OAAD;AAAA,WAAaC,UAAU,CAACD,OAAD,EAAU,GAAV,CAAvB;AAAA,GAAZ,CAAN;AAAA,CAA3B;;IAEaE,a;;;;AAAAA,a,CACJC,U,GAAa,K;AADTD,a,CAEJE,S,GAA8C,E;AAF1CF,a,CAGJG,M,GAA4B,I;;AAHxBH,a,CASJI,a,GAAgB;AAAA,SATZJ,aASkB,CAAKC,UAAX;AAAA,C;;AATZD,a,CAiBJK,I;6EAAO,kBAAOF,MAAP;AAAA;;AAAA;AAAA;AAAA;AAAA;AAjBHH,YAAAA,aAkBT,CAAKG,MAAL,GAAcA,MAAd;;AADY,kBAKR,gBAAAA,MAAM,CAACG,IAAP,0BAAaC,EAAb,4BAAmBJ,MAAM,CAACK,YAA1B,aAAmB,qBAAqBC,SALhC;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAjBHT,aAuBD,CAAKU,0BAAL,EANI;;AAAA;AAjBHV,YAAAA,aAwBP,CAAKC,UAAL,GAAkB,IAAlB;AAxBOD,YAAAA,aAyBP,CAAKE,SAAL,CAAeS,OAAf,CAAuB,UAACC,CAAD;AAAA,qBAAOA,CAAC,CAAC,IAAD,CAAR;AAAA,aAAvB;;AARU;AAjBHZ,YAAAA,aA4BT,CAAKG,MAAL,CAAYU,EAAZ,CAAe,oBAAf;AAAA,0FAAqC,iBAAOC,KAAP;AAAA;AAAA;AAAA;AAAA;AAAA,6BAC/BA,KAAK,CAACC,MADyB;AAAA;AAAA;AAAA;;AAAA;AAAA,+BA5B5Bf,aA8BC,CAAKU,0BAAL,EAF2B;;AAAA;AA5B5BV,wBAAAA,aA+BL,CAAKC,UAAL,GAAkB,IAAlB;AA/BKD,wBAAAA,aAgCL,CAAKE,SAAL,CAAeS,OAAf,CAAuB,UAACC,CAAD;AAAA,iCAAOA,CAAC,CAAC,IAAD,CAAR;AAAA,yBAAvB;AAJiC;AAAA;;AAAA;AA5B5BZ,wBAAAA,aAkCL,CAAKC,UAAL,GAAkB,KAAlB;AAlCKD,wBAAAA,aAmCL,CAAKE,SAAL,CAAeS,OAAf,CAAuB,UAACC,CAAD;AAAA,iCAAOA,CAAC,CAAC,KAAD,CAAR;AAAA,yBAAvB;;AAPiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAArC;;AAAA;AAAA;AAAA;AAAA;;AAXY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;;;;AAjBHZ,a,CA8CJgB,kB,GAAqB,UAACC,QAAD,EAAyC;AA9C1DjB,EAAAA,aA+CT,CAAKE,SAAL,CAAegB,IAAf,CAAoBD,QAApB;AAEA,SAAO;AACLE,IAAAA,WAAW,EAAE,uBAAM;AAlDZnB,MAAAA,aAmDL,CAAKE,SAAL,GAnDKF,aAmDY,CAAKE,SAAL,CAAekB,MAAf,CAAsB,UAACC,EAAD;AAAA,eAAQA,EAAE,KAAKJ,QAAf;AAAA,OAAtB,CAAjB;AACD;AAHI,GAAP;AAKD,C;;AAtDUjB,a,CAwDJsB,I,mEAAO;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAxDHtB,aAyDJ,CAAKG,MADE,aACP,sBAAaG,IADN;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAGNiB,UAAAA,YAHM,GAGS,2BAAgB;AACnCC,YAAAA,aAAa,EA5DNxB,aA4DQ,CAAKG,MAAL,CAAYG,IAAZ,CAAiBC;AADG,WAAhB,CAHT;AAMNkB,UAAAA,IANM,GAMC,6BAND;;AAAA,eAQRF,YARQ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,iBAxDHvB,aAkEgB,CAAKG,MAAL,CAAYmB,IAAZ,CAAiBG,IAAjB,EAAuB,IAAIC,IAAJ,CAASH,YAAT,EAAuBI,WAAvB,EAAvB,CAVb;;AAAA;AAUFC,UAAAA,MAVE;AAWFC,UAAAA,OAXE,GAWQD,MAAM,CAACE,MAAP,CAAcC,MAAd,CAAwC,UAACF,OAAD,EAAUf,KAAV,EAAoB;AAC1Ee,YAAAA,OAAO,GAAGA,OAAO,CAACG,MAAR,CAAe,8CAAoBlB,KAApB,EAA2B,KAA3B,CAAf,CAAV;AACA,mBAAOe,OAAP;AACD,WAHe,EAGb,EAHa,CAXR;;AAgBR,cAAIA,OAAO,CAACI,MAAZ,EAAoB;AAClBC,iDAAkBC,eAAlB,CAAkCN,OAAlC;AACD;;AAlBO;AAAA;;AAAA;AAAA;AAAA;;AAsBRK,+CAAkBE,OAAlB;;AAtBQ;AAyBZ,wCAAmB;AACjBZ,YAAAA,aAAa,EAlFNxB,aAkFQ,CAAKG,MAAL,CAAYG,IAAZ,CAAiBC,EADf;AAEjBgB,YAAAA,YAAY,EAAE,IAAIG,IAAJ,GAAWW,QAAX;AAFG,WAAnB;;AAzBY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,C;AAxDHrC,a,CAuFJU,0B,mEAA6B;AAAA;AAAA;AAAA;AAAA;AAAA,cAvFzBV,aAwFJ,CAAKG,MADwB;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA,iBAvFzBH,aA0FH,CAAKsC,mBAAL,CA1FGtC,aA0FsB,CAAKG,MAA9B,CAH4B;;AAAA;AAAA;AAAA,iBAvFzBH,aA2FH,CAAKsB,IAAL,EAJ4B;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,C;;AAvFzBtB,a,CA8FJuC,S;8EAAY;AAAA;;AAAA;AAAA;AAAA;AAAA;AAGjBpC,YAAAA,MAHiB,SAGjBA,MAHiB,EAIjBqC,IAJiB,SAIjBA,IAJiB;AASXC,YAAAA,aATW,GASK,oCAAeD,IAAf,CATL;AAAA;AAAA;AAAA,mBA9FRxC,aA2GU,CAAK0C,WAAL,CAAqC;AAAEvC,cAAAA,MAAM,EAANA,MAAF;AAAUqC,cAAAA,IAAI,EAAJA;AAAV,aAArC,CAbF;;AAAA;AAafG,YAAAA,QAbe;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,kBAeX,2DAAqCA,QAArC,iDAA+CC,IAA/C,oCAAqDC,IAArD,MAA8D,CAfnD;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAuBjBJ,YAAAA,aAAa;AAvBI,8CAyBVE,QAzBU;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;;;;AA9FR3C,a,CA0HJ0C,W;8EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAGnBvC,YAAAA,MAHmB,SAGnBA,MAHmB,EAInBqC,IAJmB,SAInBA,IAJmB;AASbM,YAAAA,OATa,GASH3C,MAAM,CAAC2C,OAAP,CAAeN,IAAI,CAACO,WAApB,EAAiCP,IAAI,CAACQ,SAAtC,CATG;;AAAA,kBAWfR,IAAI,CAACS,IAAL,KAAc,eAXC;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAYJH,OAAO,CAACI,YAAR,OAAAJ,OAAO,sCAAiBN,IAAI,CAACW,OAAtB,EAZH;;AAAA;AAAA;;AAAA;AAAA,kBAefX,IAAI,CAACS,IAAL,KAAc,iBAfC;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAgBJH,OAAO,CAACM,cAAR,OAAAN,OAAO,sCAAmBN,IAAI,CAACW,OAAxB,EAhBH;;AAAA;AAAA;;AAAA;AAAA,kBAmBfX,IAAI,CAACS,IAAL,KAAc,gBAnBC;AAAA;AAAA;AAAA;;AAAA;AAAA,mBAoBJ9C,MAAM,CAACkD,aAAP,OAAAlD,MAAM,sCAAkBqC,IAAI,CAACW,OAAvB,EApBF;;AAAA;AAAA;;AAAA;AAAA,kBAuBb,IAAIG,KAAJ,CAAU,mBAAV,CAvBa;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;;;;AA1HVtD,a,CAoJJsC,mB;8EAAsB,kBAG3BnC,MAH2B;AAAA;;AAAA;AAAA;AAAA;AAAA;AAKrBoD,YAAAA,KALqB,GAKb,uCALa;AAAA,wDAMRA,KANQ;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAMhBf,YAAAA,IANgB;;AAAA,gBAOpBA,IAAI,CAACjC,EAPe;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,mBApJlBP,aA8JC,CAAK0C,WAAL,CAAqC;AACzCvC,cAAAA,MAAM,EAANA,MADyC;AAEzCqC,cAAAA,IAAI,EAAJA;AAFyC,aAArC,CAViB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,kBAenB,4DAAqCG,QAArC,mDAA+CC,IAA/C,qCAAqDC,IAArD,MAA8D,CAf3C;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAuBzB,sDAAkB;AAChBtC,cAAAA,EAAE,EAAEiC,IAAI,CAACjC;AADO,aAAlB;AAvByB;AAAA,mBA0BnBX,kBAAkB,EA1BC;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,G;;;;;;;AApJlBI,a,CAkLJwD,gB,GAAmB,UAACC,UAAD,EAAuC;AAC/D,MAAMC,KAAK,GAAG,sCAAgBD,UAAhB,CAAd;;AAEA,wDAAmBC,KAAnB,2CAA0B;AAAA,QAAflB,IAAe;AACxB,QAAI,CAACA,IAAI,CAACjC,EAAV,EAAc;AAEd,8CAAkB;AAChBA,MAAAA,EAAE,EAAEiC,IAAI,CAACjC;AADO,KAAlB;AAGD;AACF,C","sourcesContent":["import type { AxiosError } from 'axios';\nimport type { APIErrorResponse, StreamChat } from 'stream-chat';\n\nimport { handleEventToSyncDB } from '../components/Chat/hooks/handleEventToSyncDB';\nimport { getAllChannelIds, getLastSyncedAt, upsertLastSyncedAt } from '../store/apis';\n\nimport { addPendingTask } from '../store/apis/addPendingTask';\n\nimport { deletePendingTask } from '../store/apis/deletePendingTask';\nimport { getPendingTasks } from '../store/apis/getPendingTasks';\nimport { QuickSqliteClient } from '../store/QuickSqliteClient';\nimport type { PendingTask, PreparedQueries } from '../store/types';\nimport type { DefaultStreamChatGenerics } from '../types/types';\n/**\n * DBSyncManager has the responsibility to sync the channel states\n * within local database whenever possible.\n *\n * Components can get the current sync status using DBSyncManager.getCurrentStatus().\n * Or components can attach a listener for status change as following:\n *\n * ```tsx\n * useEffect(() => {\n * const unsubscribe = DBSyncManager.onSyncStatusChange((syncStatus) => {\n * if (syncStatus) {\n * doSomething();\n * }\n * })\n *\n * return () => unsubscribe();\n * })\n * ```\n */\nconst restBeforeNextTask = () => new Promise((resolve) => setTimeout(resolve, 500));\n\nexport class DBSyncManager {\n static syncStatus = false;\n static listeners: Array<(status: boolean) => void> = [];\n static client: StreamChat | null = null;\n\n /**\n * Returns weather channel states in local DB are synced with backend or not.\n * @returns boolean\n */\n static getSyncStatus = () => this.syncStatus;\n\n /**\n * Initializes the DBSyncManager. This function should be called only once\n * throughout the lifetime of SDK.\n *\n * @param client\n */\n static init = async (client: StreamChat) => {\n this.client = client;\n // If the websocket connection is already active, then straightaway\n // call the sync api and also execute pending api calls.\n // Otherwise wait for `connection.changed` event.\n if (client.user?.id && client.wsConnection?.isHealthy) {\n await this.syncAndExecutePendingTasks();\n this.syncStatus = true;\n this.listeners.forEach((l) => l(true));\n }\n\n this.client.on('connection.changed', async (event) => {\n if (event.online) {\n await this.syncAndExecutePendingTasks();\n this.syncStatus = true;\n this.listeners.forEach((l) => l(true));\n } else {\n this.syncStatus = false;\n this.listeners.forEach((l) => l(false));\n }\n });\n };\n\n /**\n * Subscribes a listener for sync status change.\n *\n * @param listener {function}\n * @returns {function} to unsubscribe the listener.\n */\n static onSyncStatusChange = (listener: (status: boolean) => void) => {\n this.listeners.push(listener);\n\n return {\n unsubscribe: () => {\n this.listeners = this.listeners.filter((el) => el !== listener);\n },\n };\n };\n\n static sync = async () => {\n if (!this.client?.user) return;\n\n const lastSyncedAt = getLastSyncedAt({\n currentUserId: this.client.user.id,\n });\n const cids = getAllChannelIds();\n\n if (lastSyncedAt) {\n try {\n const result = await this.client.sync(cids, new Date(lastSyncedAt).toISOString());\n const queries = result.events.reduce<PreparedQueries[]>((queries, event) => {\n queries = queries.concat(handleEventToSyncDB(event, false));\n return queries;\n }, []);\n\n if (queries.length) {\n QuickSqliteClient.executeSqlBatch(queries);\n }\n } catch (e) {\n // Error will be raised by the sync API if there are too many events.\n // In that case reset the entire DB and start fresh.\n QuickSqliteClient.resetDB();\n }\n }\n upsertLastSyncedAt({\n currentUserId: this.client.user.id,\n lastSyncedAt: new Date().toString(),\n });\n };\n\n static syncAndExecutePendingTasks = async () => {\n if (!this.client) return;\n\n await this.executePendingTasks(this.client);\n await this.sync();\n };\n\n static queueTask = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >({\n client,\n task,\n }: {\n client: StreamChat<StreamChatGenerics>;\n task: PendingTask;\n }) => {\n const removeFromApi = addPendingTask(task);\n\n let response;\n try {\n response = await this.executeTask<StreamChatGenerics>({ client, task });\n } catch (e) {\n if ((e as AxiosError<APIErrorResponse>)?.response?.data?.code === 4) {\n // Error code 16 - message already exists\n // ignore\n } else {\n throw e;\n }\n }\n\n removeFromApi();\n\n return response;\n };\n\n static executeTask = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >({\n client,\n task,\n }: {\n client: StreamChat<StreamChatGenerics>;\n task: PendingTask;\n }) => {\n const channel = client.channel(task.channelType, task.channelId);\n\n if (task.type === 'send-reaction') {\n return await channel.sendReaction(...task.payload);\n }\n\n if (task.type === 'delete-reaction') {\n return await channel.deleteReaction(...task.payload);\n }\n\n if (task.type === 'delete-message') {\n return await client.deleteMessage(...task.payload);\n }\n\n throw new Error('Invalid task type');\n };\n\n static executePendingTasks = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >(\n client: StreamChat<StreamChatGenerics>,\n ) => {\n const queue = getPendingTasks();\n for (const task of queue) {\n if (!task.id) continue;\n\n try {\n await this.executeTask<StreamChatGenerics>({\n client,\n task,\n });\n } catch (e) {\n if ((e as AxiosError<APIErrorResponse>)?.response?.data?.code === 4) {\n // Error code 16 - message already exists\n // ignore\n } else {\n throw e;\n }\n }\n\n deletePendingTask({\n id: task.id,\n });\n await restBeforeNextTask();\n }\n };\n\n static dropPendingTasks = (conditions: { messageId: string }) => {\n const tasks = getPendingTasks(conditions);\n\n for (const task of tasks) {\n if (!task.id) continue;\n\n deletePendingTask({\n id: task.id,\n });\n }\n };\n}\n"]}
|
|
@@ -83,7 +83,7 @@ DBSyncManager.init = function () {
|
|
|
83
83
|
switch (_context.prev = _context.next) {
|
|
84
84
|
case 0:
|
|
85
85
|
if (!event.online) {
|
|
86
|
-
_context.next =
|
|
86
|
+
_context.next = 7;
|
|
87
87
|
break;
|
|
88
88
|
}
|
|
89
89
|
|
|
@@ -91,18 +91,20 @@ DBSyncManager.init = function () {
|
|
|
91
91
|
return DBSyncManager.syncAndExecutePendingTasks();
|
|
92
92
|
|
|
93
93
|
case 3:
|
|
94
|
+
DBSyncManager.syncStatus = true;
|
|
94
95
|
DBSyncManager.listeners.forEach(function (l) {
|
|
95
96
|
return l(true);
|
|
96
97
|
});
|
|
97
|
-
_context.next =
|
|
98
|
+
_context.next = 9;
|
|
98
99
|
break;
|
|
99
100
|
|
|
100
|
-
case
|
|
101
|
+
case 7:
|
|
102
|
+
DBSyncManager.syncStatus = false;
|
|
101
103
|
DBSyncManager.listeners.forEach(function (l) {
|
|
102
104
|
return l(false);
|
|
103
105
|
});
|
|
104
106
|
|
|
105
|
-
case
|
|
107
|
+
case 9:
|
|
106
108
|
case "end":
|
|
107
109
|
return _context.stop();
|
|
108
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["DBSyncManager.ts"],"names":["restBeforeNextTask","Promise","resolve","setTimeout","DBSyncManager","syncStatus","listeners","client","getSyncStatus","init","user","id","wsConnection","isHealthy","syncAndExecutePendingTasks","forEach","l","on","event","online","onSyncStatusChange","listener","push","unsubscribe","filter","el","sync","lastSyncedAt","currentUserId","cids","Date","toISOString","result","queries","events","reduce","concat","length","QuickSqliteClient","executeSqlBatch","resetDB","toString","executePendingTasks","queueTask","task","removeFromApi","executeTask","response","data","code","channel","channelType","channelId","type","sendReaction","payload","deleteReaction","deleteMessage","Error","queue","dropPendingTasks","conditions","tasks"],"mappings":"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","sourcesContent":["import type { AxiosError } from 'axios';\nimport type { APIErrorResponse, StreamChat } from 'stream-chat';\n\nimport { handleEventToSyncDB } from '../components/Chat/hooks/handleEventToSyncDB';\nimport { getAllChannelIds, getLastSyncedAt, upsertLastSyncedAt } from '../store/apis';\n\nimport { addPendingTask } from '../store/apis/addPendingTask';\n\nimport { deletePendingTask } from '../store/apis/deletePendingTask';\nimport { getPendingTasks } from '../store/apis/getPendingTasks';\nimport { QuickSqliteClient } from '../store/QuickSqliteClient';\nimport type { PendingTask, PreparedQueries } from '../store/types';\nimport type { DefaultStreamChatGenerics } from '../types/types';\n/**\n * DBSyncManager has the responsibility to sync the channel states\n * within local database whenever possible.\n *\n * Components can get the current sync status using DBSyncManager.getCurrentStatus().\n * Or components can attach a listener for status change as following:\n *\n * ```tsx\n * useEffect(() => {\n * const unsubscribe = DBSyncManager.onSyncStatusChange((syncStatus) => {\n * if (syncStatus) {\n * doSomething();\n * }\n * })\n *\n * return () => unsubscribe();\n * })\n * ```\n */\nconst restBeforeNextTask = () => new Promise((resolve) => setTimeout(resolve, 500));\n\nexport class DBSyncManager {\n static syncStatus = false;\n static listeners: Array<(status: boolean) => void> = [];\n static client: StreamChat | null = null;\n\n /**\n * Returns weather channel states in local DB are synced with backend or not.\n * @returns boolean\n */\n static getSyncStatus = () => this.syncStatus;\n\n /**\n * Initializes the DBSyncManager. This function should be called only once\n * throughout the lifetime of SDK.\n *\n * @param client\n */\n static init = async (client: StreamChat) => {\n this.client = client;\n // If the websocket connection is already active, then straightaway\n // call the sync api and also execute pending api calls.\n // Otherwise wait for `connection.changed` event.\n if (client.user?.id && client.wsConnection?.isHealthy) {\n await this.syncAndExecutePendingTasks();\n this.syncStatus = true;\n this.listeners.forEach((l) => l(true));\n }\n\n this.client.on('connection.changed', async (event) => {\n if (event.online) {\n await this.syncAndExecutePendingTasks();\n this.listeners.forEach((l) => l(true));\n } else {\n this.listeners.forEach((l) => l(false));\n }\n });\n };\n\n /**\n * Subscribes a listener for sync status change.\n *\n * @param listener {function}\n * @returns {function} to unsubscribe the listener.\n */\n static onSyncStatusChange = (listener: (status: boolean) => void) => {\n this.listeners.push(listener);\n\n return {\n unsubscribe: () => {\n this.listeners = this.listeners.filter((el) => el !== listener);\n },\n };\n };\n\n static sync = async () => {\n if (!this.client?.user) return;\n\n const lastSyncedAt = getLastSyncedAt({\n currentUserId: this.client.user.id,\n });\n const cids = getAllChannelIds();\n\n if (lastSyncedAt) {\n try {\n const result = await this.client.sync(cids, new Date(lastSyncedAt).toISOString());\n const queries = result.events.reduce<PreparedQueries[]>((queries, event) => {\n queries = queries.concat(handleEventToSyncDB(event, false));\n return queries;\n }, []);\n\n if (queries.length) {\n QuickSqliteClient.executeSqlBatch(queries);\n }\n } catch (e) {\n // Error will be raised by the sync API if there are too many events.\n // In that case reset the entire DB and start fresh.\n QuickSqliteClient.resetDB();\n }\n }\n upsertLastSyncedAt({\n currentUserId: this.client.user.id,\n lastSyncedAt: new Date().toString(),\n });\n };\n\n static syncAndExecutePendingTasks = async () => {\n if (!this.client) return;\n\n await this.executePendingTasks(this.client);\n await this.sync();\n };\n\n static queueTask = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >({\n client,\n task,\n }: {\n client: StreamChat<StreamChatGenerics>;\n task: PendingTask;\n }) => {\n const removeFromApi = addPendingTask(task);\n\n let response;\n try {\n response = await this.executeTask<StreamChatGenerics>({ client, task });\n } catch (e) {\n if ((e as AxiosError<APIErrorResponse>)?.response?.data?.code === 4) {\n // Error code 16 - message already exists\n // ignore\n } else {\n throw e;\n }\n }\n\n removeFromApi();\n\n return response;\n };\n\n static executeTask = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >({\n client,\n task,\n }: {\n client: StreamChat<StreamChatGenerics>;\n task: PendingTask;\n }) => {\n const channel = client.channel(task.channelType, task.channelId);\n\n if (task.type === 'send-reaction') {\n return await channel.sendReaction(...task.payload);\n }\n\n if (task.type === 'delete-reaction') {\n return await channel.deleteReaction(...task.payload);\n }\n\n if (task.type === 'delete-message') {\n return await client.deleteMessage(...task.payload);\n }\n\n throw new Error('Invalid task type');\n };\n\n static executePendingTasks = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >(\n client: StreamChat<StreamChatGenerics>,\n ) => {\n const queue = getPendingTasks();\n for (const task of queue) {\n if (!task.id) continue;\n\n try {\n await this.executeTask<StreamChatGenerics>({\n client,\n task,\n });\n } catch (e) {\n if ((e as AxiosError<APIErrorResponse>)?.response?.data?.code === 4) {\n // Error code 16 - message already exists\n // ignore\n } else {\n throw e;\n }\n }\n\n deletePendingTask({\n id: task.id,\n });\n await restBeforeNextTask();\n }\n };\n\n static dropPendingTasks = (conditions: { messageId: string }) => {\n const tasks = getPendingTasks(conditions);\n\n for (const task of tasks) {\n if (!task.id) continue;\n\n deletePendingTask({\n id: task.id,\n });\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["DBSyncManager.ts"],"names":["restBeforeNextTask","Promise","resolve","setTimeout","DBSyncManager","syncStatus","listeners","client","getSyncStatus","init","user","id","wsConnection","isHealthy","syncAndExecutePendingTasks","forEach","l","on","event","online","onSyncStatusChange","listener","push","unsubscribe","filter","el","sync","lastSyncedAt","currentUserId","cids","Date","toISOString","result","queries","events","reduce","concat","length","QuickSqliteClient","executeSqlBatch","resetDB","toString","executePendingTasks","queueTask","task","removeFromApi","executeTask","response","data","code","channel","channelType","channelId","type","sendReaction","payload","deleteReaction","deleteMessage","Error","queue","dropPendingTasks","conditions","tasks"],"mappings":"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","sourcesContent":["import type { AxiosError } from 'axios';\nimport type { APIErrorResponse, StreamChat } from 'stream-chat';\n\nimport { handleEventToSyncDB } from '../components/Chat/hooks/handleEventToSyncDB';\nimport { getAllChannelIds, getLastSyncedAt, upsertLastSyncedAt } from '../store/apis';\n\nimport { addPendingTask } from '../store/apis/addPendingTask';\n\nimport { deletePendingTask } from '../store/apis/deletePendingTask';\nimport { getPendingTasks } from '../store/apis/getPendingTasks';\nimport { QuickSqliteClient } from '../store/QuickSqliteClient';\nimport type { PendingTask, PreparedQueries } from '../store/types';\nimport type { DefaultStreamChatGenerics } from '../types/types';\n/**\n * DBSyncManager has the responsibility to sync the channel states\n * within local database whenever possible.\n *\n * Components can get the current sync status using DBSyncManager.getCurrentStatus().\n * Or components can attach a listener for status change as following:\n *\n * ```tsx\n * useEffect(() => {\n * const unsubscribe = DBSyncManager.onSyncStatusChange((syncStatus) => {\n * if (syncStatus) {\n * doSomething();\n * }\n * })\n *\n * return () => unsubscribe();\n * })\n * ```\n */\nconst restBeforeNextTask = () => new Promise((resolve) => setTimeout(resolve, 500));\n\nexport class DBSyncManager {\n static syncStatus = false;\n static listeners: Array<(status: boolean) => void> = [];\n static client: StreamChat | null = null;\n\n /**\n * Returns weather channel states in local DB are synced with backend or not.\n * @returns boolean\n */\n static getSyncStatus = () => this.syncStatus;\n\n /**\n * Initializes the DBSyncManager. This function should be called only once\n * throughout the lifetime of SDK.\n *\n * @param client\n */\n static init = async (client: StreamChat) => {\n this.client = client;\n // If the websocket connection is already active, then straightaway\n // call the sync api and also execute pending api calls.\n // Otherwise wait for `connection.changed` event.\n if (client.user?.id && client.wsConnection?.isHealthy) {\n await this.syncAndExecutePendingTasks();\n this.syncStatus = true;\n this.listeners.forEach((l) => l(true));\n }\n\n this.client.on('connection.changed', async (event) => {\n if (event.online) {\n await this.syncAndExecutePendingTasks();\n this.syncStatus = true;\n this.listeners.forEach((l) => l(true));\n } else {\n this.syncStatus = false;\n this.listeners.forEach((l) => l(false));\n }\n });\n };\n\n /**\n * Subscribes a listener for sync status change.\n *\n * @param listener {function}\n * @returns {function} to unsubscribe the listener.\n */\n static onSyncStatusChange = (listener: (status: boolean) => void) => {\n this.listeners.push(listener);\n\n return {\n unsubscribe: () => {\n this.listeners = this.listeners.filter((el) => el !== listener);\n },\n };\n };\n\n static sync = async () => {\n if (!this.client?.user) return;\n\n const lastSyncedAt = getLastSyncedAt({\n currentUserId: this.client.user.id,\n });\n const cids = getAllChannelIds();\n\n if (lastSyncedAt) {\n try {\n const result = await this.client.sync(cids, new Date(lastSyncedAt).toISOString());\n const queries = result.events.reduce<PreparedQueries[]>((queries, event) => {\n queries = queries.concat(handleEventToSyncDB(event, false));\n return queries;\n }, []);\n\n if (queries.length) {\n QuickSqliteClient.executeSqlBatch(queries);\n }\n } catch (e) {\n // Error will be raised by the sync API if there are too many events.\n // In that case reset the entire DB and start fresh.\n QuickSqliteClient.resetDB();\n }\n }\n upsertLastSyncedAt({\n currentUserId: this.client.user.id,\n lastSyncedAt: new Date().toString(),\n });\n };\n\n static syncAndExecutePendingTasks = async () => {\n if (!this.client) return;\n\n await this.executePendingTasks(this.client);\n await this.sync();\n };\n\n static queueTask = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >({\n client,\n task,\n }: {\n client: StreamChat<StreamChatGenerics>;\n task: PendingTask;\n }) => {\n const removeFromApi = addPendingTask(task);\n\n let response;\n try {\n response = await this.executeTask<StreamChatGenerics>({ client, task });\n } catch (e) {\n if ((e as AxiosError<APIErrorResponse>)?.response?.data?.code === 4) {\n // Error code 16 - message already exists\n // ignore\n } else {\n throw e;\n }\n }\n\n removeFromApi();\n\n return response;\n };\n\n static executeTask = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >({\n client,\n task,\n }: {\n client: StreamChat<StreamChatGenerics>;\n task: PendingTask;\n }) => {\n const channel = client.channel(task.channelType, task.channelId);\n\n if (task.type === 'send-reaction') {\n return await channel.sendReaction(...task.payload);\n }\n\n if (task.type === 'delete-reaction') {\n return await channel.deleteReaction(...task.payload);\n }\n\n if (task.type === 'delete-message') {\n return await client.deleteMessage(...task.payload);\n }\n\n throw new Error('Invalid task type');\n };\n\n static executePendingTasks = async <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n >(\n client: StreamChat<StreamChatGenerics>,\n ) => {\n const queue = getPendingTasks();\n for (const task of queue) {\n if (!task.id) continue;\n\n try {\n await this.executeTask<StreamChatGenerics>({\n client,\n task,\n });\n } catch (e) {\n if ((e as AxiosError<APIErrorResponse>)?.response?.data?.code === 4) {\n // Error code 16 - message already exists\n // ignore\n } else {\n throw e;\n }\n }\n\n deletePendingTask({\n id: task.id,\n });\n await restBeforeNextTask();\n }\n };\n\n static dropPendingTasks = (conditions: { messageId: string }) => {\n const tasks = getPendingTasks(conditions);\n\n for (const task of tasks) {\n if (!task.id) continue;\n\n deletePendingTask({\n id: task.id,\n });\n }\n };\n}\n"]}
|
package/lib/module/version.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stream-chat-react-native-core",
|
|
3
3
|
"description": "The official React Native and Expo components for Stream Chat, a service for building chat applications",
|
|
4
|
-
"version": "5.6.
|
|
4
|
+
"version": "5.6.1-beta.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"company": "Stream.io Inc",
|
|
7
7
|
"name": "Stream.io Inc"
|
|
@@ -63,8 +63,10 @@ export class DBSyncManager {
|
|
|
63
63
|
this.client.on('connection.changed', async (event) => {
|
|
64
64
|
if (event.online) {
|
|
65
65
|
await this.syncAndExecutePendingTasks();
|
|
66
|
+
this.syncStatus = true;
|
|
66
67
|
this.listeners.forEach((l) => l(true));
|
|
67
68
|
} else {
|
|
69
|
+
this.syncStatus = false;
|
|
68
70
|
this.listeners.forEach((l) => l(false));
|
|
69
71
|
}
|
|
70
72
|
});
|
package/src/version.json
CHANGED