aitu-app 0.6.78 → 0.6.80
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/README.md +3 -3
- package/assets/CanvasAudioPlayer-CSFENxi6.js +2 -0
- package/assets/ChatDrawer-CWZQP5R5.css +1 -0
- package/assets/ChatDrawer-sVEVW11M.js +11 -0
- package/assets/ChatMessagesArea-Cnb94V8-.js +7 -0
- package/assets/ChatMessagesArea-PlF5AwzD.css +1 -0
- package/assets/DeferredAIInputBar-D99l6sBS.js +8 -0
- package/assets/DrawnixDeferredFeatures-78cIu-ev.js +2 -0
- package/assets/{KnowledgeBaseContent-DcX5Jofx.js → KnowledgeBaseContent-DZ-1fPZa.js} +10 -10
- package/assets/{MVCreator-DllHozYg.js → MVCreator-BV8KDR6E.js} +8 -8
- package/assets/ModelBenchmarkWorkbench-DL6r0Z_5.js +2 -0
- package/assets/MusicAnalyzer-D9Bpmhym.css +1 -0
- package/assets/{MusicAnalyzer-DDeT6g3c.js → MusicAnalyzer-DQtjf36o.js} +2 -2
- package/assets/{MusicAnalyzer-CHcQ5t4P.js → MusicAnalyzer-u_5sy56T.js} +1 -1
- package/assets/PromptHistoryTool-B-ktaOpK.js +2 -0
- package/assets/PromptHistoryTool-BH7hq916.css +1 -0
- package/assets/ResizableDivider-BpUFdkte.js +1 -0
- package/assets/TaskQueuePanel-BLD1r7_I.js +1 -0
- package/assets/{VideoAnalyzer-BSLz1FaI.js → VideoAnalyzer-Bjv9pyDs.js} +2 -2
- package/assets/ai-generation-preferences-service-BSpgVCHz.js +1 -0
- package/assets/arc-CnA_FoJK.js +1 -0
- package/assets/{arc-BU2KKCa_.js → arc-DDvk_-VM.js} +1 -1
- package/assets/{batch-image-generation-Bg68r_Ql.js → batch-image-generation-N-lwbjRE.js} +3 -3
- package/assets/{blockDiagram-38ab4fdb-BCGEnMME.js → blockDiagram-38ab4fdb-B2G4wjZe.js} +6 -6
- package/assets/{blockDiagram-38ab4fdb-CsZR5uC5.js → blockDiagram-38ab4fdb-DBkZWrKk.js} +1 -1
- package/assets/{browser-DpICcNby.js → browser-ZXTF4AKv.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-9fuiuFdV.js → c4Diagram-3d4e48cf-BFg-wccg.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-WM4wd_GR.js → c4Diagram-3d4e48cf-CmyNnfip.js} +1 -1
- package/assets/{canvas-insertion-CdUQF7IV.js → canvas-insertion-CKIoVZ9a.js} +1 -1
- package/assets/channel-BQh3J7kz.js +1 -0
- package/assets/channel-CPsF_uSp.js +1 -0
- package/assets/{classDiagram-70f12bd4-DcYDedz1.js → classDiagram-70f12bd4-BoP-e23u.js} +2 -2
- package/assets/{classDiagram-70f12bd4-CBVHTwQu.js → classDiagram-70f12bd4-UTHJc2XA.js} +1 -1
- package/assets/classDiagram-v2-f2320105-BeBc2H-D.js +2 -0
- package/assets/{classDiagram-v2-f2320105-jpCwaHEd.js → classDiagram-v2-f2320105-Bjwz5ljW.js} +1 -1
- package/assets/{clipper-jvd5rF5a.js → clipper-NoHaeWV4.js} +1 -1
- package/assets/clone-CA2KqVCK.js +1 -0
- package/assets/createText-2e5e7dd3-Bsu7vT-L.js +8 -0
- package/assets/{createText-2e5e7dd3-x5lOIwut.js → createText-2e5e7dd3-DrWUfa-s.js} +1 -1
- package/assets/{edges-e0da2a9e-CbrF4nbD.js → edges-e0da2a9e-B9sYOHRt.js} +1 -1
- package/assets/{edges-e0da2a9e-Ch6PBwWs.js → edges-e0da2a9e-DX4IQMED.js} +1 -1
- package/assets/{erDiagram-9861fffd-DSlNVuAZ.js → erDiagram-9861fffd-B-LfsIMf.js} +1 -1
- package/assets/{erDiagram-9861fffd-Bq07elcI.js → erDiagram-9861fffd-DPdud_LA.js} +1 -1
- package/assets/{flowDb-956e92f1-Ti5YC4Vv.js → flowDb-956e92f1-C3xKlizM.js} +1 -1
- package/assets/{flowDb-956e92f1-BqPCJlZp.js → flowDb-956e92f1-Ck5oiEta.js} +1 -1
- package/assets/{flowDiagram-66a62f08-CPDuG3rY.js → flowDiagram-66a62f08-Bkt2NoHM.js} +4 -4
- package/assets/{flowDiagram-66a62f08-D3GSABFi.js → flowDiagram-66a62f08-CJnxo6dI.js} +1 -1
- package/assets/flowDiagram-v2-96b9c2cf-MnwxRDMO.js +1 -0
- package/assets/flowDiagram-v2-96b9c2cf-U7nNPvdl.js +1 -0
- package/assets/{flowchart-elk-definition-4a651766-BH09NeLA.js → flowchart-elk-definition-4a651766-2XkrsdKI.js} +2 -2
- package/assets/{flowchart-elk-definition-4a651766-BLaLPCDV.js → flowchart-elk-definition-4a651766-ec8y1a8S.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-DL9ZeaEc.js → ganttDiagram-c361ad54-1TA0mZY_.js} +3 -3
- package/assets/{ganttDiagram-c361ad54-Sp9M1KHP.js → ganttDiagram-c361ad54-D-OrVtXV.js} +3 -3
- package/assets/{gitGraphDiagram-72cf32ee-BWwmRKo-.js → gitGraphDiagram-72cf32ee-Blt3RsBD.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-BSf1fsDV.js → gitGraphDiagram-72cf32ee-CKf6xgO1.js} +1 -1
- package/assets/{graph-g-2U7grQ.js → graph-CUYgHJmb.js} +1 -1
- package/assets/{graph--nPw8zXQ.js → graph-WeSRtsZO.js} +1 -1
- package/assets/{index-ZrVeQUWo.js → index--MqiaN5t.js} +1 -1
- package/assets/{index-C5eu4uSl.js → index-0b_TeH8L.js} +11 -11
- package/assets/{index-3862675e-BXwbZ2pz.js → index-3862675e-C2ipEQC8.js} +1 -1
- package/assets/{index-3862675e-D6Zy95zZ.js → index-3862675e-CeX6VlsU.js} +1 -1
- package/assets/{index-CLJUfzvO.js → index-B-J0JJak.js} +1 -1
- package/assets/{index-TkfyNewx.js → index-B7Hj7g41.js} +1 -1
- package/assets/{index-eZfwJ9bV.js → index-BS_v5cOh.js} +1 -1
- package/assets/index-Btk31p7r.js +1 -0
- package/assets/{index-DH12_HTj.js → index-C-Samsu3.js} +2 -2
- package/assets/index-C-llNX01.js +1 -0
- package/assets/index-C8c9icsH.js +2 -0
- package/assets/{index-D7b5fX1d.js → index-CAn2jfNg.js} +1 -1
- package/assets/{index-Dz8sghkK.js → index-CK2zt94U.js} +1 -1
- package/assets/{index-CfgvFFx3.js → index-CP51k4n6.js} +17 -17
- package/assets/{index-DI0OV6F8.js → index-CXBhIy30.js} +1 -1
- package/assets/index-C_Mj1wbj.js +2 -0
- package/assets/{index-BwSnJN93.js → index-CbfE0MBd.js} +1 -1
- package/assets/{index-C3qD42ws.js → index-CjeDxq0c.js} +1 -1
- package/assets/{index-DqMndQiP.js → index-Ct7OFnWK.js} +1 -1
- package/assets/{index-BaCHOxhI.js → index-CxxUIkx1.js} +1 -1
- package/assets/{index-B2dttXd7.js → index-D2Kc-3MO.js} +1 -1
- package/assets/{index-Bq8mPedC.js → index-DK0XEByD.js} +1 -1
- package/assets/{index-DllL1sx1.js → index-DQcV2DYj.js} +1 -1
- package/assets/{index-BP77pG9S.js → index-DSKRBuhn.js} +73 -73
- package/assets/{index-BXzGHPXz.js → index-DXqL8NRE.js} +2 -2
- package/assets/{index-B7V7-Vxz.js → index-DcLrRIlS.js} +1 -1
- package/assets/{index-D4pIkh3S.js → index-DdA-dF0D.js} +1 -1
- package/assets/{index-QkP3EC02.js → index-DdxTnVj5.js} +1 -1
- package/assets/{index-CmyOpFTN.js → index-DmrnShhc.js} +1 -1
- package/assets/{index-Bti3m-iW.js → index-QO0uGVDP.js} +1 -1
- package/assets/{index-BPR_DyGD.js → index-aIKXDB1M.js} +1 -1
- package/assets/{index-DIiIUyb-.js → index-n6JhNACm.js} +1 -1
- package/assets/{index-BWrcsh8u.js → index-qbS_W7PW.js} +1 -1
- package/assets/index-v7iKPBEu.css +1 -0
- package/assets/{infoDiagram-f8f76790-DpFqCCNv.js → infoDiagram-f8f76790-DEWQ3NXc.js} +1 -1
- package/assets/{infoDiagram-f8f76790-G2JpJJP7.js → infoDiagram-f8f76790-u_qjHFCm.js} +3 -3
- package/assets/{journeyDiagram-49397b02-DLLTobRM.js → journeyDiagram-49397b02-C8A30CBr.js} +1 -1
- package/assets/{journeyDiagram-49397b02-BdESGMrv.js → journeyDiagram-49397b02-hQJfqZih.js} +1 -1
- package/assets/{layout-WSR0vNPO.js → layout-CFKTKeqQ.js} +1 -1
- package/assets/{layout-CVkuImk4.js → layout-DvRyabpG.js} +1 -1
- package/assets/{line-D3bnG227.js → line-C72F34Po.js} +1 -1
- package/assets/{line-DQuMJveY.js → line-W5R41tQ1.js} +1 -1
- package/assets/{linear-CciP-97N.js → linear-7FXykgHM.js} +1 -1
- package/assets/{linear-Z6vFvuwc.js → linear-CVyOPUvz.js} +1 -1
- package/assets/main-BO0HWBB1.js +42 -0
- package/assets/{main-8DNjLY6L.css → main-DAuE07rf.css} +1 -1
- package/assets/{mermaid.core-CwZQb0ud.js → mermaid.core-2VcXhn43.js} +4 -4
- package/assets/{mindmap-definition-fc14e90a-BnJ8OOTI.js → mindmap-definition-fc14e90a-CcVXKGg4.js} +1 -1
- package/assets/{mindmap-definition-fc14e90a-CxQMydCW.js → mindmap-definition-fc14e90a-DRDYXe84.js} +2 -2
- package/assets/model-benchmark-launcher-C2qBiDlM.js +1 -0
- package/assets/{photo-wall-splitter-BZ88W5Zy.js → photo-wall-splitter-CFntSOdS.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-BSDdkTeu.js → pieDiagram-8a3498a8-Be9dl9pU.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-D6VtAoja.js → pieDiagram-8a3498a8-DXZOJYBv.js} +5 -5
- package/assets/ppt-generation-B5fKT_by.js +48 -0
- package/assets/{quadrantDiagram-120e2f19-C8k2xuBd.js → quadrantDiagram-120e2f19-DoU7aQSp.js} +3 -3
- package/assets/{quadrantDiagram-120e2f19-BbFV0VXY.js → quadrantDiagram-120e2f19-l5K9mx26.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-C3xMdzJV.js → requirementDiagram-deff3bca-DN_87Wxe.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-CpjqKjYZ.js → requirementDiagram-deff3bca-DOooq7kx.js} +1 -1
- package/assets/retry-image-BmIVuAVu.js +6 -0
- package/assets/{sankeyDiagram-04a897e0-Bjvig9bW.js → sankeyDiagram-04a897e0-BB33nO6_.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-BBJJgsFv.js → sankeyDiagram-04a897e0-CCa0hwml.js} +2 -2
- package/assets/{sequenceDiagram-704730f1-PFC_9IFI.js → sequenceDiagram-704730f1-CNhXZiix.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-DX1MmBN_.js → sequenceDiagram-704730f1-ZqQ1QrY-.js} +1 -1
- package/assets/settings-dialog-BFuWTeQR.js +1 -0
- package/assets/{skill-dsl-parser-syNWYxFu.js → skill-dsl-parser-b-aB3P5u.js} +1 -1
- package/assets/{stateDiagram-587899a1-Dc3mI_B_.js → stateDiagram-587899a1-BBlOIJr7.js} +1 -1
- package/assets/{stateDiagram-587899a1-SFMUVAam.js → stateDiagram-587899a1-BhomZ0AN.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-P4Yt2p_j.js → stateDiagram-v2-d93cdb3a-BpJsgMa0.js} +1 -1
- package/assets/stateDiagram-v2-d93cdb3a-CuOn9du2.js +1 -0
- package/assets/{styles-6aaf32cf-C3jnr3hV.js → styles-6aaf32cf-C2WEewoA.js} +1 -1
- package/assets/{styles-6aaf32cf-b6AdP7fu.js → styles-6aaf32cf-CTtf8moq.js} +1 -1
- package/assets/{styles-9a916d00-BUiD9iBe.js → styles-9a916d00-44Xi2-39.js} +1 -1
- package/assets/{styles-9a916d00-ii0XTdIm.js → styles-9a916d00-DUU3VgNe.js} +4 -4
- package/assets/{styles-c10674c1-DbTSpy3W.js → styles-c10674c1--AhWSGg7.js} +1 -1
- package/assets/styles-c10674c1-DS-wE3tK.js +116 -0
- package/assets/{svgDrawCommon-08f97a94-D4gIV05W.js → svgDrawCommon-08f97a94-CXcvtSSy.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-BK6lD4D6.js → svgDrawCommon-08f97a94-Dyqh4V2s.js} +1 -1
- package/assets/{timeline-definition-85554ec2-Bl2y548G.js → timeline-definition-85554ec2-k788753O.js} +1 -1
- package/assets/{timeline-definition-85554ec2-CWKg_JxG.js → timeline-definition-85554ec2-sw6-UuBe.js} +1 -1
- package/assets/tool-windows-BEnZdJqF.js +2948 -0
- package/assets/{tool-windows-CUNbW1Tz.css → tool-windows-D61Le6TE.css} +1 -1
- package/assets/ttd-dialog-BJzXAZ0l.js +99 -0
- package/assets/useCharacters-DRBoWvvj.css +1 -0
- package/assets/useCharacters-gsV4K8Hn.js +2 -0
- package/assets/{useWorkflowSubmission-BizuDmuw.js → useWorkflowSubmission-XRR21P6Y.js} +10 -10
- package/assets/{video-analyze-6v3Y-rUE.js → video-analyze-CpbnpSiI.js} +1 -1
- package/assets/{video-generation-DnmTlWnm.js → video-generation-BXhS7x-a.js} +2 -2
- package/assets/video-recovery-service-6G2lkWcu.js +1 -0
- package/assets/workflow-generation-utils-CYxtSHl0.js +3 -0
- package/assets/workflow-submission-service-DygSzydV.js +4 -0
- package/assets/{xychartDiagram-e933f94c-CJX9_9WF.js → xychartDiagram-e933f94c-CvTTDwPb.js} +3 -3
- package/assets/{xychartDiagram-e933f94c-Cep8CQEH.js → xychartDiagram-e933f94c-Ga9zi9ha.js} +1 -1
- package/changelog.json +45 -0
- package/idle-prefetch-manifest.json +310 -306
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/precache-manifest.json +10 -10
- package/sitemap.xml +37 -0
- package/sw-debug/app.js +269 -156
- package/sw-debug/backup-restore.js +235 -103
- package/sw-debug/crypto-helper.js +116 -120
- package/sw-debug/duplex-client.js +33 -19
- package/sw-debug/gist-management.js +938 -655
- package/sw-debug/sw-communication.js +87 -50
- package/sw.js +5 -5
- package/version.json +7 -17
- package/assets/CanvasAudioPlayer-DutgwdiU.js +0 -2
- package/assets/ChatDrawer-0jNvKIoI.css +0 -1
- package/assets/ChatDrawer-E6Fog16I.js +0 -11
- package/assets/ChatMessagesArea-Bgwiz_XP.js +0 -250
- package/assets/ChatMessagesArea-DyR_wHFQ.css +0 -1
- package/assets/DeferredAIInputBar-CPkD8Cv9.js +0 -8
- package/assets/DrawnixDeferredFeatures-Cul76-88.js +0 -2
- package/assets/ModelBenchmarkWorkbench-Dv9SNYTi.js +0 -2
- package/assets/MusicAnalyzer-DhtRGpAp.css +0 -1
- package/assets/ResizableDivider-CaG9JQbJ.js +0 -1
- package/assets/TaskQueuePanel-BNhNzGp5.js +0 -1
- package/assets/ai-generation-preferences-service-BF7QkuJp.js +0 -1
- package/assets/arc-DmGoDCEL.js +0 -1
- package/assets/channel-CZjE-WNp.js +0 -1
- package/assets/channel-SXZD6bG3.js +0 -1
- package/assets/classDiagram-v2-f2320105-CsxWGkSy.js +0 -2
- package/assets/clone-C4mvvMDb.js +0 -1
- package/assets/createText-2e5e7dd3-CkXS3l7I.js +0 -5
- package/assets/flowDiagram-v2-96b9c2cf-BCcJ-cre.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-DCVaFEgV.js +0 -1
- package/assets/index-3eqA7Bag.js +0 -1
- package/assets/index-7Q-aiwln.js +0 -4
- package/assets/index-B1XP5g7P.css +0 -1
- package/assets/index-BHPTfCZM.js +0 -1
- package/assets/index-BqHZCcen.js +0 -2
- package/assets/index-DcZrElEK.js +0 -2
- package/assets/index-gQ7LgvSv.js +0 -12
- package/assets/main-BFEkxCOK.js +0 -56
- package/assets/model-benchmark-launcher-Ct3lYXVq.js +0 -1
- package/assets/ppt-generation-FzjP_rp0.js +0 -48
- package/assets/settings-dialog-CQM4v791.js +0 -1
- package/assets/stateDiagram-v2-d93cdb3a-DmnBjHpC.js +0 -1
- package/assets/styles-c10674c1-Bt89Yy8Q.js +0 -116
- package/assets/tool-windows-DOIu9TAD.js +0 -2975
- package/assets/ttd-dialog-DI4kQSg8.js +0 -99
- package/assets/useCharacters-Chv4Ky7x.js +0 -7
- package/assets/useCharacters-OrDbG69o.css +0 -1
- package/assets/video-recovery-service-BeRoh0s2.js +0 -1
- package/assets/workflow-generation-utils-me381Cax.js +0 -3
- package/assets/workflow-submission-service-YOpo7g37.js +0 -4
|
@@ -28,9 +28,11 @@ const CACHE_STORAGE_NAME = 'drawnix-images';
|
|
|
28
28
|
* Check if Web Crypto API is available
|
|
29
29
|
*/
|
|
30
30
|
function isCryptoAvailable() {
|
|
31
|
-
return
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
return (
|
|
32
|
+
typeof crypto !== 'undefined' &&
|
|
33
|
+
crypto.subtle !== undefined &&
|
|
34
|
+
typeof crypto.subtle.importKey === 'function'
|
|
35
|
+
);
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
/**
|
|
@@ -79,9 +81,9 @@ function generatePasswordSeed() {
|
|
|
79
81
|
const stableInfo = [
|
|
80
82
|
deviceId,
|
|
81
83
|
navigator.language || 'en-US',
|
|
82
|
-
'drawnix-crypto-key'
|
|
84
|
+
'drawnix-crypto-key',
|
|
83
85
|
].join('-');
|
|
84
|
-
|
|
86
|
+
|
|
85
87
|
return `drawnix-v2-${stableInfo}`;
|
|
86
88
|
}
|
|
87
89
|
|
|
@@ -91,7 +93,7 @@ function generatePasswordSeed() {
|
|
|
91
93
|
async function deriveKey(password, salt) {
|
|
92
94
|
const encoder = new TextEncoder();
|
|
93
95
|
const passwordBuffer = encoder.encode(password);
|
|
94
|
-
|
|
96
|
+
|
|
95
97
|
const keyMaterial = await crypto.subtle.importKey(
|
|
96
98
|
'raw',
|
|
97
99
|
passwordBuffer,
|
|
@@ -99,13 +101,13 @@ async function deriveKey(password, salt) {
|
|
|
99
101
|
false,
|
|
100
102
|
['deriveKey']
|
|
101
103
|
);
|
|
102
|
-
|
|
104
|
+
|
|
103
105
|
return crypto.subtle.deriveKey(
|
|
104
106
|
{
|
|
105
107
|
name: 'PBKDF2',
|
|
106
108
|
salt: salt,
|
|
107
109
|
iterations: PBKDF2_ITERATIONS,
|
|
108
|
-
hash: 'SHA-256'
|
|
110
|
+
hash: 'SHA-256',
|
|
109
111
|
},
|
|
110
112
|
keyMaterial,
|
|
111
113
|
{ name: ALGORITHM, length: KEY_LENGTH },
|
|
@@ -116,34 +118,34 @@ async function deriveKey(password, salt) {
|
|
|
116
118
|
|
|
117
119
|
/**
|
|
118
120
|
* Decrypt Token (localStorage)
|
|
119
|
-
* @param {string} encryptedData
|
|
121
|
+
* @param {string} encryptedData
|
|
120
122
|
*/
|
|
121
123
|
export async function decryptToken(encryptedData) {
|
|
122
124
|
if (encryptedData.startsWith(FALLBACK_PREFIX)) {
|
|
123
125
|
const data = encryptedData.slice(FALLBACK_PREFIX.length);
|
|
124
126
|
return decodeURIComponent(globalThis.atob(data));
|
|
125
127
|
}
|
|
126
|
-
|
|
128
|
+
|
|
127
129
|
if (!isCryptoAvailable()) {
|
|
128
130
|
throw new Error('Web Crypto API not available');
|
|
129
131
|
}
|
|
130
|
-
|
|
132
|
+
|
|
131
133
|
try {
|
|
132
134
|
const parsed = JSON.parse(encryptedData);
|
|
133
|
-
|
|
135
|
+
|
|
134
136
|
const data = base64ToArrayBuffer(parsed.data);
|
|
135
137
|
const iv = base64ToArrayBuffer(parsed.iv);
|
|
136
138
|
const salt = base64ToArrayBuffer(parsed.salt);
|
|
137
|
-
|
|
139
|
+
|
|
138
140
|
const password = generatePasswordSeed();
|
|
139
141
|
const key = await deriveKey(password, new Uint8Array(salt));
|
|
140
|
-
|
|
142
|
+
|
|
141
143
|
const decrypted = await crypto.subtle.decrypt(
|
|
142
144
|
{ name: ALGORITHM, iv: iv },
|
|
143
145
|
key,
|
|
144
146
|
data
|
|
145
147
|
);
|
|
146
|
-
|
|
148
|
+
|
|
147
149
|
const decoder = new TextDecoder();
|
|
148
150
|
return decoder.decode(decrypted);
|
|
149
151
|
} catch (error) {
|
|
@@ -191,9 +193,9 @@ function decryptCustomPassword(encrypted) {
|
|
|
191
193
|
function getFromKVStore(key) {
|
|
192
194
|
return new Promise((resolve, reject) => {
|
|
193
195
|
const request = indexedDB.open(KV_DB_NAME);
|
|
194
|
-
|
|
196
|
+
|
|
195
197
|
request.onerror = () => reject(request.error);
|
|
196
|
-
|
|
198
|
+
|
|
197
199
|
request.onsuccess = () => {
|
|
198
200
|
const db = request.result;
|
|
199
201
|
if (!db.objectStoreNames.contains(KV_STORE_NAME)) {
|
|
@@ -201,17 +203,17 @@ function getFromKVStore(key) {
|
|
|
201
203
|
resolve(null);
|
|
202
204
|
return;
|
|
203
205
|
}
|
|
204
|
-
|
|
206
|
+
|
|
205
207
|
const transaction = db.transaction(KV_STORE_NAME, 'readonly');
|
|
206
208
|
const store = transaction.objectStore(KV_STORE_NAME);
|
|
207
209
|
const getReq = store.get(key);
|
|
208
|
-
|
|
210
|
+
|
|
209
211
|
getReq.onsuccess = () => {
|
|
210
212
|
resolve(getReq.result ? getReq.result.value : null);
|
|
211
213
|
};
|
|
212
|
-
|
|
214
|
+
|
|
213
215
|
getReq.onerror = () => reject(getReq.error);
|
|
214
|
-
|
|
216
|
+
|
|
215
217
|
transaction.oncomplete = () => db.close();
|
|
216
218
|
};
|
|
217
219
|
});
|
|
@@ -224,15 +226,15 @@ export async function getGistCredentials() {
|
|
|
224
226
|
try {
|
|
225
227
|
const config = await getFromKVStore(SYNC_CONFIG_KEY);
|
|
226
228
|
const storedPassword = await getFromKVStore(SYNC_PASSWORD_KEY);
|
|
227
|
-
|
|
229
|
+
|
|
228
230
|
let customPassword = null;
|
|
229
231
|
if (storedPassword && storedPassword.encrypted) {
|
|
230
232
|
customPassword = decryptCustomPassword(storedPassword.encrypted);
|
|
231
233
|
}
|
|
232
|
-
|
|
234
|
+
|
|
233
235
|
return {
|
|
234
236
|
gistId: config ? config.gistId : null,
|
|
235
|
-
customPassword
|
|
237
|
+
customPassword,
|
|
236
238
|
};
|
|
237
239
|
} catch (error) {
|
|
238
240
|
console.error('Failed to get gist credentials:', error);
|
|
@@ -246,7 +248,7 @@ export async function getGistCredentials() {
|
|
|
246
248
|
async function deriveGistKey(secret) {
|
|
247
249
|
const encoder = new TextEncoder();
|
|
248
250
|
const passwordData = encoder.encode(secret + FIXED_SALT);
|
|
249
|
-
|
|
251
|
+
|
|
250
252
|
const keyMaterial = await crypto.subtle.importKey(
|
|
251
253
|
'raw',
|
|
252
254
|
passwordData,
|
|
@@ -254,15 +256,15 @@ async function deriveGistKey(secret) {
|
|
|
254
256
|
false,
|
|
255
257
|
['deriveKey']
|
|
256
258
|
);
|
|
257
|
-
|
|
259
|
+
|
|
258
260
|
const salt = encoder.encode(FIXED_SALT);
|
|
259
|
-
|
|
261
|
+
|
|
260
262
|
return crypto.subtle.deriveKey(
|
|
261
263
|
{
|
|
262
264
|
name: 'PBKDF2',
|
|
263
265
|
salt: salt,
|
|
264
266
|
iterations: PBKDF2_ITERATIONS,
|
|
265
|
-
hash: 'SHA-256'
|
|
267
|
+
hash: 'SHA-256',
|
|
266
268
|
},
|
|
267
269
|
keyMaterial,
|
|
268
270
|
{ name: ALGORITHM, length: KEY_LENGTH },
|
|
@@ -277,12 +279,12 @@ async function deriveGistKey(secret) {
|
|
|
277
279
|
export async function decryptGistFile(content, gistId, customPassword) {
|
|
278
280
|
try {
|
|
279
281
|
const data = JSON.parse(content);
|
|
280
|
-
|
|
282
|
+
|
|
281
283
|
// Check if it's encrypted data
|
|
282
284
|
if (data.encrypted !== true || !data.iv || !data.data) {
|
|
283
285
|
return content; // Return as is if not encrypted
|
|
284
286
|
}
|
|
285
|
-
|
|
287
|
+
|
|
286
288
|
// Determine secret to use
|
|
287
289
|
let secret = gistId;
|
|
288
290
|
if (data.customPassword && customPassword) {
|
|
@@ -290,17 +292,17 @@ export async function decryptGistFile(content, gistId, customPassword) {
|
|
|
290
292
|
} else if (data.customPassword && !customPassword) {
|
|
291
293
|
throw new Error('File encrypted with custom password but none provided');
|
|
292
294
|
}
|
|
293
|
-
|
|
295
|
+
|
|
294
296
|
const key = await deriveGistKey(secret);
|
|
295
297
|
const iv = base64ToArrayBuffer(data.iv);
|
|
296
298
|
const encryptedData = base64ToArrayBuffer(data.data);
|
|
297
|
-
|
|
299
|
+
|
|
298
300
|
const decrypted = await crypto.subtle.decrypt(
|
|
299
301
|
{ name: ALGORITHM, iv: iv },
|
|
300
302
|
key,
|
|
301
303
|
encryptedData
|
|
302
304
|
);
|
|
303
|
-
|
|
305
|
+
|
|
304
306
|
const decoder = new TextDecoder();
|
|
305
307
|
return decoder.decode(decrypted);
|
|
306
308
|
} catch (error) {
|
|
@@ -383,42 +385,28 @@ export function getDeviceIdExported() {
|
|
|
383
385
|
function getAllFromStore(dbName, storeName) {
|
|
384
386
|
return new Promise((resolve, reject) => {
|
|
385
387
|
const request = indexedDB.open(dbName);
|
|
386
|
-
|
|
388
|
+
|
|
387
389
|
request.onerror = () => reject(request.error);
|
|
388
|
-
|
|
390
|
+
|
|
389
391
|
request.onsuccess = () => {
|
|
390
392
|
const db = request.result;
|
|
391
|
-
console.log(`[getAllFromStore] Opened ${dbName}, stores:`, [...db.objectStoreNames]);
|
|
392
|
-
|
|
393
393
|
if (!db.objectStoreNames.contains(storeName)) {
|
|
394
|
-
console.log(`[getAllFromStore] Store '${storeName}' not found`);
|
|
395
394
|
db.close();
|
|
396
395
|
resolve([]);
|
|
397
396
|
return;
|
|
398
397
|
}
|
|
399
|
-
|
|
398
|
+
|
|
400
399
|
const transaction = db.transaction(storeName, 'readonly');
|
|
401
400
|
const store = transaction.objectStore(storeName);
|
|
402
401
|
const getAllReq = store.getAll();
|
|
403
|
-
|
|
402
|
+
|
|
404
403
|
getAllReq.onsuccess = () => {
|
|
405
404
|
const results = getAllReq.result || [];
|
|
406
|
-
console.log(`[getAllFromStore] ${dbName}/${storeName}: ${results.length} items`);
|
|
407
|
-
|
|
408
|
-
// Check if this is localforage format (each item may be the actual value)
|
|
409
|
-
// localforage stores data directly, but we should verify the structure
|
|
410
|
-
if (results.length > 0) {
|
|
411
|
-
const sample = results[0];
|
|
412
|
-
console.log(`[getAllFromStore] Sample item structure:`,
|
|
413
|
-
sample ? Object.keys(sample).slice(0, 5) : 'empty'
|
|
414
|
-
);
|
|
415
|
-
}
|
|
416
|
-
|
|
417
405
|
resolve(results);
|
|
418
406
|
};
|
|
419
|
-
|
|
407
|
+
|
|
420
408
|
getAllReq.onerror = () => reject(getAllReq.error);
|
|
421
|
-
|
|
409
|
+
|
|
422
410
|
transaction.oncomplete = () => db.close();
|
|
423
411
|
};
|
|
424
412
|
});
|
|
@@ -430,9 +418,9 @@ function getAllFromStore(dbName, storeName) {
|
|
|
430
418
|
export async function diagnoseDatabase(dbName) {
|
|
431
419
|
return new Promise((resolve, reject) => {
|
|
432
420
|
const request = indexedDB.open(dbName);
|
|
433
|
-
|
|
421
|
+
|
|
434
422
|
request.onerror = () => reject(request.error);
|
|
435
|
-
|
|
423
|
+
|
|
436
424
|
request.onsuccess = async () => {
|
|
437
425
|
const db = request.result;
|
|
438
426
|
const result = {
|
|
@@ -440,38 +428,39 @@ export async function diagnoseDatabase(dbName) {
|
|
|
440
428
|
version: db.version,
|
|
441
429
|
stores: {},
|
|
442
430
|
};
|
|
443
|
-
|
|
431
|
+
|
|
444
432
|
const storeNames = [...db.objectStoreNames];
|
|
445
|
-
|
|
433
|
+
|
|
446
434
|
for (const storeName of storeNames) {
|
|
447
435
|
try {
|
|
448
436
|
const tx = db.transaction(storeName, 'readonly');
|
|
449
437
|
const store = tx.objectStore(storeName);
|
|
450
|
-
|
|
438
|
+
|
|
451
439
|
const countReq = store.count();
|
|
452
440
|
const count = await new Promise((res) => {
|
|
453
441
|
countReq.onsuccess = () => res(countReq.result);
|
|
454
442
|
countReq.onerror = () => res(-1);
|
|
455
443
|
});
|
|
456
|
-
|
|
444
|
+
|
|
457
445
|
// Get sample item
|
|
458
446
|
const getAllReq = store.getAll(null, 1);
|
|
459
447
|
const samples = await new Promise((res) => {
|
|
460
448
|
getAllReq.onsuccess = () => res(getAllReq.result || []);
|
|
461
449
|
getAllReq.onerror = () => res([]);
|
|
462
450
|
});
|
|
463
|
-
|
|
451
|
+
|
|
464
452
|
result.stores[storeName] = {
|
|
465
453
|
count,
|
|
466
454
|
keyPath: store.keyPath,
|
|
467
455
|
indexNames: [...store.indexNames],
|
|
468
|
-
sampleKeys:
|
|
456
|
+
sampleKeys:
|
|
457
|
+
samples.length > 0 ? Object.keys(samples[0]).slice(0, 8) : [],
|
|
469
458
|
};
|
|
470
459
|
} catch (e) {
|
|
471
460
|
result.stores[storeName] = { error: e.message };
|
|
472
461
|
}
|
|
473
462
|
}
|
|
474
|
-
|
|
463
|
+
|
|
475
464
|
db.close();
|
|
476
465
|
resolve(result);
|
|
477
466
|
};
|
|
@@ -511,8 +500,8 @@ export async function listCacheStorageMedia() {
|
|
|
511
500
|
try {
|
|
512
501
|
const cache = await caches.open(CACHE_STORAGE_NAME);
|
|
513
502
|
const keys = await cache.keys();
|
|
514
|
-
|
|
515
|
-
const mediaList = keys.map(request => {
|
|
503
|
+
|
|
504
|
+
const mediaList = keys.map((request) => {
|
|
516
505
|
const url = request.url;
|
|
517
506
|
return {
|
|
518
507
|
url,
|
|
@@ -520,7 +509,7 @@ export async function listCacheStorageMedia() {
|
|
|
520
509
|
filename: url.split('/').pop() || url,
|
|
521
510
|
};
|
|
522
511
|
});
|
|
523
|
-
|
|
512
|
+
|
|
524
513
|
return mediaList;
|
|
525
514
|
} catch (error) {
|
|
526
515
|
console.error('Failed to list cache storage media:', error);
|
|
@@ -535,17 +524,17 @@ export async function getCacheStorageStats() {
|
|
|
535
524
|
try {
|
|
536
525
|
const cache = await caches.open(CACHE_STORAGE_NAME);
|
|
537
526
|
const keys = await cache.keys();
|
|
538
|
-
|
|
527
|
+
|
|
539
528
|
let totalSize = 0;
|
|
540
529
|
let imageCount = 0;
|
|
541
530
|
let videoCount = 0;
|
|
542
|
-
|
|
531
|
+
|
|
543
532
|
for (const request of keys) {
|
|
544
533
|
const response = await cache.match(request);
|
|
545
534
|
if (response) {
|
|
546
535
|
const blob = await response.clone().blob();
|
|
547
536
|
totalSize += blob.size;
|
|
548
|
-
|
|
537
|
+
|
|
549
538
|
const contentType = response.headers.get('content-type') || '';
|
|
550
539
|
if (contentType.startsWith('image/')) {
|
|
551
540
|
imageCount++;
|
|
@@ -554,7 +543,7 @@ export async function getCacheStorageStats() {
|
|
|
554
543
|
}
|
|
555
544
|
}
|
|
556
545
|
}
|
|
557
|
-
|
|
546
|
+
|
|
558
547
|
return {
|
|
559
548
|
totalFiles: keys.length,
|
|
560
549
|
totalSize,
|
|
@@ -580,25 +569,28 @@ const UNIFIED_LOG_STORE = 'logs';
|
|
|
580
569
|
async function openUnifiedLogDb() {
|
|
581
570
|
return new Promise((resolve, reject) => {
|
|
582
571
|
const request = indexedDB.open(UNIFIED_LOG_DB, 1);
|
|
583
|
-
|
|
572
|
+
|
|
584
573
|
request.onerror = () => reject(request.error);
|
|
585
574
|
request.onsuccess = () => resolve(request.result);
|
|
586
|
-
|
|
575
|
+
|
|
587
576
|
request.onupgradeneeded = (event) => {
|
|
588
577
|
const db = event.target.result;
|
|
589
578
|
if (!db.objectStoreNames.contains(UNIFIED_LOG_STORE)) {
|
|
590
|
-
const store = db.createObjectStore(UNIFIED_LOG_STORE, {
|
|
579
|
+
const store = db.createObjectStore(UNIFIED_LOG_STORE, {
|
|
580
|
+
keyPath: 'id',
|
|
581
|
+
});
|
|
591
582
|
store.createIndex('timestamp', 'timestamp', { unique: false });
|
|
592
583
|
store.createIndex('category', 'category', { unique: false });
|
|
593
584
|
store.createIndex('level', 'level', { unique: false });
|
|
594
585
|
store.createIndex('sessionId', 'sessionId', { unique: false });
|
|
595
|
-
store.createIndex('category_timestamp', ['category', 'timestamp'], {
|
|
586
|
+
store.createIndex('category_timestamp', ['category', 'timestamp'], {
|
|
587
|
+
unique: false,
|
|
588
|
+
});
|
|
596
589
|
}
|
|
597
590
|
};
|
|
598
591
|
});
|
|
599
592
|
}
|
|
600
593
|
|
|
601
|
-
|
|
602
594
|
/**
|
|
603
595
|
* Query sync logs from IndexedDB (unified log database)
|
|
604
596
|
* @param {Object} query - Query parameters
|
|
@@ -607,15 +599,15 @@ async function openUnifiedLogDb() {
|
|
|
607
599
|
export async function querySyncLogs(query = {}) {
|
|
608
600
|
try {
|
|
609
601
|
const db = await openUnifiedLogDb();
|
|
610
|
-
|
|
602
|
+
|
|
611
603
|
return new Promise((resolve, reject) => {
|
|
612
604
|
const tx = db.transaction(UNIFIED_LOG_STORE, 'readonly');
|
|
613
605
|
const store = tx.objectStore(UNIFIED_LOG_STORE);
|
|
614
606
|
const index = store.index('timestamp');
|
|
615
|
-
|
|
607
|
+
|
|
616
608
|
const results = [];
|
|
617
609
|
const request = index.openCursor(null, 'prev'); // Descending by timestamp
|
|
618
|
-
|
|
610
|
+
|
|
619
611
|
request.onsuccess = () => {
|
|
620
612
|
const cursor = request.result;
|
|
621
613
|
if (!cursor) {
|
|
@@ -623,49 +615,52 @@ export async function querySyncLogs(query = {}) {
|
|
|
623
615
|
resolve(results);
|
|
624
616
|
return;
|
|
625
617
|
}
|
|
626
|
-
|
|
618
|
+
|
|
627
619
|
const entry = cursor.value;
|
|
628
|
-
|
|
620
|
+
|
|
629
621
|
// Only include 'sync' category logs
|
|
630
622
|
if (entry.category !== 'sync') {
|
|
631
623
|
cursor.continue();
|
|
632
624
|
return;
|
|
633
625
|
}
|
|
634
|
-
|
|
626
|
+
|
|
635
627
|
// Apply filters
|
|
636
628
|
if (query.level && entry.level !== query.level) {
|
|
637
629
|
cursor.continue();
|
|
638
630
|
return;
|
|
639
631
|
}
|
|
640
|
-
|
|
632
|
+
|
|
641
633
|
if (query.sessionId && entry.sessionId !== query.sessionId) {
|
|
642
634
|
cursor.continue();
|
|
643
635
|
return;
|
|
644
636
|
}
|
|
645
|
-
|
|
637
|
+
|
|
646
638
|
if (query.search) {
|
|
647
639
|
const searchLower = query.search.toLowerCase();
|
|
648
|
-
const matchesMessage = entry.message
|
|
649
|
-
|
|
640
|
+
const matchesMessage = entry.message
|
|
641
|
+
?.toLowerCase()
|
|
642
|
+
.includes(searchLower);
|
|
643
|
+
const matchesData =
|
|
644
|
+
entry.data &&
|
|
650
645
|
JSON.stringify(entry.data).toLowerCase().includes(searchLower);
|
|
651
646
|
if (!matchesMessage && !matchesData) {
|
|
652
647
|
cursor.continue();
|
|
653
648
|
return;
|
|
654
649
|
}
|
|
655
650
|
}
|
|
656
|
-
|
|
651
|
+
|
|
657
652
|
results.push(entry);
|
|
658
|
-
|
|
653
|
+
|
|
659
654
|
// Apply limit
|
|
660
655
|
if (query.limit && results.length >= query.limit) {
|
|
661
656
|
db.close();
|
|
662
657
|
resolve(results);
|
|
663
658
|
return;
|
|
664
659
|
}
|
|
665
|
-
|
|
660
|
+
|
|
666
661
|
cursor.continue();
|
|
667
662
|
};
|
|
668
|
-
|
|
663
|
+
|
|
669
664
|
request.onerror = () => {
|
|
670
665
|
db.close();
|
|
671
666
|
reject(request.error);
|
|
@@ -684,19 +679,19 @@ export async function querySyncLogs(query = {}) {
|
|
|
684
679
|
export async function getSyncLogStats() {
|
|
685
680
|
try {
|
|
686
681
|
const db = await openUnifiedLogDb();
|
|
687
|
-
|
|
682
|
+
|
|
688
683
|
return new Promise((resolve, reject) => {
|
|
689
684
|
const tx = db.transaction(UNIFIED_LOG_STORE, 'readonly');
|
|
690
685
|
const store = tx.objectStore(UNIFIED_LOG_STORE);
|
|
691
|
-
|
|
686
|
+
|
|
692
687
|
const stats = {
|
|
693
688
|
total: 0,
|
|
694
689
|
byLevel: { info: 0, success: 0, warning: 0, error: 0, debug: 0 },
|
|
695
690
|
sessions: new Set(),
|
|
696
691
|
};
|
|
697
|
-
|
|
692
|
+
|
|
698
693
|
const request = store.openCursor();
|
|
699
|
-
|
|
694
|
+
|
|
700
695
|
request.onsuccess = () => {
|
|
701
696
|
const cursor = request.result;
|
|
702
697
|
if (!cursor) {
|
|
@@ -706,28 +701,28 @@ export async function getSyncLogStats() {
|
|
|
706
701
|
resolve(stats);
|
|
707
702
|
return;
|
|
708
703
|
}
|
|
709
|
-
|
|
704
|
+
|
|
710
705
|
const entry = cursor.value;
|
|
711
|
-
|
|
706
|
+
|
|
712
707
|
// Only count 'sync' category logs
|
|
713
708
|
if (entry.category !== 'sync') {
|
|
714
709
|
cursor.continue();
|
|
715
710
|
return;
|
|
716
711
|
}
|
|
717
|
-
|
|
712
|
+
|
|
718
713
|
stats.total++;
|
|
719
|
-
|
|
714
|
+
|
|
720
715
|
if (stats.byLevel[entry.level] !== undefined) {
|
|
721
716
|
stats.byLevel[entry.level]++;
|
|
722
717
|
}
|
|
723
|
-
|
|
718
|
+
|
|
724
719
|
if (entry.sessionId) {
|
|
725
720
|
stats.sessions.add(entry.sessionId);
|
|
726
721
|
}
|
|
727
|
-
|
|
722
|
+
|
|
728
723
|
cursor.continue();
|
|
729
724
|
};
|
|
730
|
-
|
|
725
|
+
|
|
731
726
|
request.onerror = () => {
|
|
732
727
|
db.close();
|
|
733
728
|
reject(request.error);
|
|
@@ -746,32 +741,33 @@ export async function getSyncLogStats() {
|
|
|
746
741
|
export async function getSyncSessions() {
|
|
747
742
|
try {
|
|
748
743
|
const db = await openUnifiedLogDb();
|
|
749
|
-
|
|
744
|
+
|
|
750
745
|
return new Promise((resolve, reject) => {
|
|
751
746
|
const tx = db.transaction(UNIFIED_LOG_STORE, 'readonly');
|
|
752
747
|
const store = tx.objectStore(UNIFIED_LOG_STORE);
|
|
753
|
-
|
|
748
|
+
|
|
754
749
|
const sessionsMap = new Map();
|
|
755
750
|
const request = store.openCursor();
|
|
756
|
-
|
|
751
|
+
|
|
757
752
|
request.onsuccess = () => {
|
|
758
753
|
const cursor = request.result;
|
|
759
754
|
if (!cursor) {
|
|
760
755
|
db.close();
|
|
761
|
-
const sessions = Array.from(sessionsMap.values())
|
|
762
|
-
|
|
756
|
+
const sessions = Array.from(sessionsMap.values()).sort(
|
|
757
|
+
(a, b) => b.startTime - a.startTime
|
|
758
|
+
);
|
|
763
759
|
resolve(sessions);
|
|
764
760
|
return;
|
|
765
761
|
}
|
|
766
|
-
|
|
762
|
+
|
|
767
763
|
const entry = cursor.value;
|
|
768
|
-
|
|
764
|
+
|
|
769
765
|
// Only include 'sync' category logs
|
|
770
766
|
if (entry.category !== 'sync') {
|
|
771
767
|
cursor.continue();
|
|
772
768
|
return;
|
|
773
769
|
}
|
|
774
|
-
|
|
770
|
+
|
|
775
771
|
if (entry.sessionId) {
|
|
776
772
|
const existing = sessionsMap.get(entry.sessionId);
|
|
777
773
|
if (existing) {
|
|
@@ -789,10 +785,10 @@ export async function getSyncSessions() {
|
|
|
789
785
|
});
|
|
790
786
|
}
|
|
791
787
|
}
|
|
792
|
-
|
|
788
|
+
|
|
793
789
|
cursor.continue();
|
|
794
790
|
};
|
|
795
|
-
|
|
791
|
+
|
|
796
792
|
request.onerror = () => {
|
|
797
793
|
db.close();
|
|
798
794
|
reject(request.error);
|
|
@@ -812,14 +808,14 @@ export async function getSyncSessions() {
|
|
|
812
808
|
export async function clearSyncLogs(options = {}) {
|
|
813
809
|
try {
|
|
814
810
|
const db = await openUnifiedLogDb();
|
|
815
|
-
|
|
811
|
+
|
|
816
812
|
return new Promise((resolve, reject) => {
|
|
817
813
|
const tx = db.transaction(UNIFIED_LOG_STORE, 'readwrite');
|
|
818
814
|
const store = tx.objectStore(UNIFIED_LOG_STORE);
|
|
819
|
-
|
|
815
|
+
|
|
820
816
|
let deletedCount = 0;
|
|
821
817
|
const request = store.openCursor();
|
|
822
|
-
|
|
818
|
+
|
|
823
819
|
request.onsuccess = () => {
|
|
824
820
|
const cursor = request.result;
|
|
825
821
|
if (!cursor) {
|
|
@@ -827,17 +823,17 @@ export async function clearSyncLogs(options = {}) {
|
|
|
827
823
|
resolve(deletedCount);
|
|
828
824
|
return;
|
|
829
825
|
}
|
|
830
|
-
|
|
826
|
+
|
|
831
827
|
const entry = cursor.value;
|
|
832
|
-
|
|
828
|
+
|
|
833
829
|
// Only delete 'sync' category logs
|
|
834
830
|
if (entry.category !== 'sync') {
|
|
835
831
|
cursor.continue();
|
|
836
832
|
return;
|
|
837
833
|
}
|
|
838
|
-
|
|
834
|
+
|
|
839
835
|
let shouldDelete = false;
|
|
840
|
-
|
|
836
|
+
|
|
841
837
|
// Clear all sync logs if no options
|
|
842
838
|
if (!options.olderThan && !options.sessionId) {
|
|
843
839
|
shouldDelete = true;
|
|
@@ -845,20 +841,20 @@ export async function clearSyncLogs(options = {}) {
|
|
|
845
841
|
if (options.olderThan && entry.timestamp < options.olderThan) {
|
|
846
842
|
shouldDelete = true;
|
|
847
843
|
}
|
|
848
|
-
|
|
844
|
+
|
|
849
845
|
if (options.sessionId && entry.sessionId === options.sessionId) {
|
|
850
846
|
shouldDelete = true;
|
|
851
847
|
}
|
|
852
848
|
}
|
|
853
|
-
|
|
849
|
+
|
|
854
850
|
if (shouldDelete) {
|
|
855
851
|
cursor.delete();
|
|
856
852
|
deletedCount++;
|
|
857
853
|
}
|
|
858
|
-
|
|
854
|
+
|
|
859
855
|
cursor.continue();
|
|
860
856
|
};
|
|
861
|
-
|
|
857
|
+
|
|
862
858
|
request.onerror = () => {
|
|
863
859
|
db.close();
|
|
864
860
|
reject(request.error);
|