@prabhask5/stellar-engine 1.1.6 → 1.1.8

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.
Files changed (265) hide show
  1. package/README.md +68 -25
  2. package/dist/actions/remoteChange.d.ts +143 -18
  3. package/dist/actions/remoteChange.d.ts.map +1 -1
  4. package/dist/actions/remoteChange.js +182 -58
  5. package/dist/actions/remoteChange.js.map +1 -1
  6. package/dist/actions/truncateTooltip.d.ts +56 -0
  7. package/dist/actions/truncateTooltip.d.ts.map +1 -0
  8. package/dist/actions/truncateTooltip.js +312 -0
  9. package/dist/actions/truncateTooltip.js.map +1 -0
  10. package/dist/auth/admin.d.ts +40 -3
  11. package/dist/auth/admin.d.ts.map +1 -1
  12. package/dist/auth/admin.js +45 -5
  13. package/dist/auth/admin.js.map +1 -1
  14. package/dist/auth/crypto.d.ts +55 -5
  15. package/dist/auth/crypto.d.ts.map +1 -1
  16. package/dist/auth/crypto.js +58 -5
  17. package/dist/auth/crypto.js.map +1 -1
  18. package/dist/auth/deviceVerification.d.ts +236 -20
  19. package/dist/auth/deviceVerification.d.ts.map +1 -1
  20. package/dist/auth/deviceVerification.js +293 -40
  21. package/dist/auth/deviceVerification.js.map +1 -1
  22. package/dist/auth/displayUtils.d.ts +98 -0
  23. package/dist/auth/displayUtils.d.ts.map +1 -0
  24. package/dist/auth/displayUtils.js +133 -0
  25. package/dist/auth/displayUtils.js.map +1 -0
  26. package/dist/auth/loginGuard.d.ts +108 -14
  27. package/dist/auth/loginGuard.d.ts.map +1 -1
  28. package/dist/auth/loginGuard.js +153 -31
  29. package/dist/auth/loginGuard.js.map +1 -1
  30. package/dist/auth/offlineCredentials.d.ts +132 -15
  31. package/dist/auth/offlineCredentials.d.ts.map +1 -1
  32. package/dist/auth/offlineCredentials.js +167 -23
  33. package/dist/auth/offlineCredentials.js.map +1 -1
  34. package/dist/auth/offlineLogin.d.ts +96 -10
  35. package/dist/auth/offlineLogin.d.ts.map +1 -1
  36. package/dist/auth/offlineLogin.js +82 -15
  37. package/dist/auth/offlineLogin.js.map +1 -1
  38. package/dist/auth/offlineSession.d.ts +83 -9
  39. package/dist/auth/offlineSession.d.ts.map +1 -1
  40. package/dist/auth/offlineSession.js +104 -13
  41. package/dist/auth/offlineSession.js.map +1 -1
  42. package/dist/auth/resolveAuthState.d.ts +70 -8
  43. package/dist/auth/resolveAuthState.d.ts.map +1 -1
  44. package/dist/auth/resolveAuthState.js +142 -46
  45. package/dist/auth/resolveAuthState.js.map +1 -1
  46. package/dist/auth/singleUser.d.ts +390 -37
  47. package/dist/auth/singleUser.d.ts.map +1 -1
  48. package/dist/auth/singleUser.js +505 -133
  49. package/dist/auth/singleUser.js.map +1 -1
  50. package/dist/bin/install-pwa.d.ts +25 -0
  51. package/dist/bin/install-pwa.d.ts.map +1 -0
  52. package/dist/bin/install-pwa.js +2197 -0
  53. package/dist/bin/install-pwa.js.map +1 -0
  54. package/dist/config.d.ts +132 -12
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +87 -9
  57. package/dist/config.js.map +1 -1
  58. package/dist/conflicts.d.ts +246 -23
  59. package/dist/conflicts.d.ts.map +1 -1
  60. package/dist/conflicts.js +495 -46
  61. package/dist/conflicts.js.map +1 -1
  62. package/dist/data.d.ts +338 -18
  63. package/dist/data.d.ts.map +1 -1
  64. package/dist/data.js +385 -34
  65. package/dist/data.js.map +1 -1
  66. package/dist/database.d.ts +72 -14
  67. package/dist/database.d.ts.map +1 -1
  68. package/dist/database.js +120 -29
  69. package/dist/database.js.map +1 -1
  70. package/dist/debug.d.ts +77 -1
  71. package/dist/debug.d.ts.map +1 -1
  72. package/dist/debug.js +88 -1
  73. package/dist/debug.js.map +1 -1
  74. package/dist/deviceId.d.ts +38 -7
  75. package/dist/deviceId.d.ts.map +1 -1
  76. package/dist/deviceId.js +68 -10
  77. package/dist/deviceId.js.map +1 -1
  78. package/dist/engine.d.ts +175 -3
  79. package/dist/engine.d.ts.map +1 -1
  80. package/dist/engine.js +831 -110
  81. package/dist/engine.js.map +1 -1
  82. package/dist/entries/actions.d.ts +14 -0
  83. package/dist/entries/actions.d.ts.map +1 -1
  84. package/dist/entries/actions.js +27 -1
  85. package/dist/entries/actions.js.map +1 -1
  86. package/dist/entries/auth.d.ts +16 -0
  87. package/dist/entries/auth.d.ts.map +1 -1
  88. package/dist/entries/auth.js +73 -1
  89. package/dist/entries/auth.js.map +1 -1
  90. package/dist/entries/config.d.ts +12 -0
  91. package/dist/entries/config.d.ts.map +1 -1
  92. package/dist/entries/config.js +18 -1
  93. package/dist/entries/config.js.map +1 -1
  94. package/dist/entries/kit.d.ts +21 -9
  95. package/dist/entries/kit.d.ts.map +1 -1
  96. package/dist/entries/kit.js +57 -8
  97. package/dist/entries/kit.js.map +1 -1
  98. package/dist/entries/stores.d.ts +11 -0
  99. package/dist/entries/stores.d.ts.map +1 -1
  100. package/dist/entries/stores.js +43 -2
  101. package/dist/entries/stores.js.map +1 -1
  102. package/dist/entries/types.d.ts +11 -1
  103. package/dist/entries/types.d.ts.map +1 -1
  104. package/dist/entries/types.js +10 -0
  105. package/dist/entries/types.js.map +1 -1
  106. package/dist/entries/utils.d.ts +7 -1
  107. package/dist/entries/utils.d.ts.map +1 -1
  108. package/dist/entries/utils.js +23 -2
  109. package/dist/entries/utils.js.map +1 -1
  110. package/dist/entries/vite.d.ts +20 -0
  111. package/dist/entries/vite.d.ts.map +1 -0
  112. package/dist/entries/vite.js +26 -0
  113. package/dist/entries/vite.js.map +1 -0
  114. package/dist/index.d.ts +33 -2
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +176 -21
  117. package/dist/index.js.map +1 -1
  118. package/dist/kit/auth.d.ts +80 -0
  119. package/dist/kit/auth.d.ts.map +1 -0
  120. package/dist/kit/auth.js +72 -0
  121. package/dist/kit/auth.js.map +1 -0
  122. package/dist/kit/confirm.d.ts +111 -0
  123. package/dist/kit/confirm.d.ts.map +1 -0
  124. package/dist/kit/confirm.js +169 -0
  125. package/dist/kit/confirm.js.map +1 -0
  126. package/dist/kit/loads.d.ts +189 -0
  127. package/dist/kit/loads.d.ts.map +1 -0
  128. package/dist/kit/loads.js +205 -0
  129. package/dist/kit/loads.js.map +1 -0
  130. package/dist/kit/server.d.ts +175 -0
  131. package/dist/kit/server.d.ts.map +1 -0
  132. package/dist/kit/server.js +297 -0
  133. package/dist/kit/server.js.map +1 -0
  134. package/dist/kit/sw.d.ts +176 -0
  135. package/dist/kit/sw.d.ts.map +1 -0
  136. package/dist/kit/sw.js +320 -0
  137. package/dist/kit/sw.js.map +1 -0
  138. package/dist/queue.d.ts +274 -0
  139. package/dist/queue.d.ts.map +1 -1
  140. package/dist/queue.js +556 -38
  141. package/dist/queue.js.map +1 -1
  142. package/dist/realtime.d.ts +241 -27
  143. package/dist/realtime.d.ts.map +1 -1
  144. package/dist/realtime.js +633 -109
  145. package/dist/realtime.js.map +1 -1
  146. package/dist/runtime/runtimeConfig.d.ts +91 -16
  147. package/dist/runtime/runtimeConfig.d.ts.map +1 -1
  148. package/dist/runtime/runtimeConfig.js +146 -19
  149. package/dist/runtime/runtimeConfig.js.map +1 -1
  150. package/dist/stores/authState.d.ts +150 -11
  151. package/dist/stores/authState.d.ts.map +1 -1
  152. package/dist/stores/authState.js +169 -17
  153. package/dist/stores/authState.js.map +1 -1
  154. package/dist/stores/network.d.ts +39 -0
  155. package/dist/stores/network.d.ts.map +1 -1
  156. package/dist/stores/network.js +169 -16
  157. package/dist/stores/network.js.map +1 -1
  158. package/dist/stores/remoteChanges.d.ts +327 -52
  159. package/dist/stores/remoteChanges.d.ts.map +1 -1
  160. package/dist/stores/remoteChanges.js +337 -75
  161. package/dist/stores/remoteChanges.js.map +1 -1
  162. package/dist/stores/sync.d.ts +130 -0
  163. package/dist/stores/sync.d.ts.map +1 -1
  164. package/dist/stores/sync.js +167 -7
  165. package/dist/stores/sync.js.map +1 -1
  166. package/dist/supabase/auth.d.ts +326 -19
  167. package/dist/supabase/auth.d.ts.map +1 -1
  168. package/dist/supabase/auth.js +374 -26
  169. package/dist/supabase/auth.js.map +1 -1
  170. package/dist/supabase/client.d.ts +79 -6
  171. package/dist/supabase/client.d.ts.map +1 -1
  172. package/dist/supabase/client.js +158 -15
  173. package/dist/supabase/client.js.map +1 -1
  174. package/dist/supabase/validate.d.ts +101 -7
  175. package/dist/supabase/validate.d.ts.map +1 -1
  176. package/dist/supabase/validate.js +117 -8
  177. package/dist/supabase/validate.js.map +1 -1
  178. package/dist/sw/build/vite-plugin.d.ts +74 -0
  179. package/dist/sw/build/vite-plugin.d.ts.map +1 -0
  180. package/dist/sw/build/vite-plugin.js +183 -0
  181. package/dist/sw/build/vite-plugin.js.map +1 -0
  182. package/dist/sw/sw.js +669 -0
  183. package/dist/types.d.ts +150 -45
  184. package/dist/types.d.ts.map +1 -1
  185. package/dist/types.js +12 -10
  186. package/dist/types.js.map +1 -1
  187. package/dist/utils.d.ts +55 -13
  188. package/dist/utils.d.ts.map +1 -1
  189. package/dist/utils.js +83 -22
  190. package/dist/utils.js.map +1 -1
  191. package/package.json +20 -22
  192. package/src/components/DeferredChangesBanner.svelte +477 -0
  193. package/src/components/SyncStatus.svelte +1732 -0
  194. package/dist/crdt/awareness.d.ts +0 -54
  195. package/dist/crdt/awareness.d.ts.map +0 -1
  196. package/dist/crdt/awareness.js +0 -219
  197. package/dist/crdt/awareness.js.map +0 -1
  198. package/dist/crdt/doc.d.ts +0 -56
  199. package/dist/crdt/doc.d.ts.map +0 -1
  200. package/dist/crdt/doc.js +0 -130
  201. package/dist/crdt/doc.js.map +0 -1
  202. package/dist/crdt/index.d.ts +0 -15
  203. package/dist/crdt/index.d.ts.map +0 -1
  204. package/dist/crdt/index.js +0 -20
  205. package/dist/crdt/index.js.map +0 -1
  206. package/dist/crdt/offline.d.ts +0 -91
  207. package/dist/crdt/offline.d.ts.map +0 -1
  208. package/dist/crdt/offline.js +0 -353
  209. package/dist/crdt/offline.js.map +0 -1
  210. package/dist/crdt/sync.d.ts +0 -58
  211. package/dist/crdt/sync.d.ts.map +0 -1
  212. package/dist/crdt/sync.js +0 -399
  213. package/dist/crdt/sync.js.map +0 -1
  214. package/dist/crdt/types.d.ts +0 -62
  215. package/dist/crdt/types.d.ts.map +0 -1
  216. package/dist/crdt/types.js +0 -7
  217. package/dist/crdt/types.js.map +0 -1
  218. package/dist/email/sendEmail.d.ts +0 -31
  219. package/dist/email/sendEmail.d.ts.map +0 -1
  220. package/dist/email/sendEmail.js +0 -39
  221. package/dist/email/sendEmail.js.map +0 -1
  222. package/dist/email/validateSmtp.d.ts +0 -18
  223. package/dist/email/validateSmtp.d.ts.map +0 -1
  224. package/dist/email/validateSmtp.js +0 -33
  225. package/dist/email/validateSmtp.js.map +0 -1
  226. package/dist/entries/crdt.d.ts +0 -3
  227. package/dist/entries/crdt.d.ts.map +0 -1
  228. package/dist/entries/crdt.js +0 -13
  229. package/dist/entries/crdt.js.map +0 -1
  230. package/dist/entries/email.d.ts +0 -4
  231. package/dist/entries/email.d.ts.map +0 -1
  232. package/dist/entries/email.js +0 -4
  233. package/dist/entries/email.js.map +0 -1
  234. package/dist/kit/authPresets.d.ts +0 -28
  235. package/dist/kit/authPresets.d.ts.map +0 -1
  236. package/dist/kit/authPresets.js +0 -23
  237. package/dist/kit/authPresets.js.map +0 -1
  238. package/dist/kit/configEndpoint.d.ts +0 -18
  239. package/dist/kit/configEndpoint.d.ts.map +0 -1
  240. package/dist/kit/configEndpoint.js +0 -27
  241. package/dist/kit/configEndpoint.js.map +0 -1
  242. package/dist/kit/deployEndpoint.d.ts +0 -22
  243. package/dist/kit/deployEndpoint.d.ts.map +0 -1
  244. package/dist/kit/deployEndpoint.js +0 -79
  245. package/dist/kit/deployEndpoint.js.map +0 -1
  246. package/dist/kit/layoutLoad.d.ts +0 -23
  247. package/dist/kit/layoutLoad.d.ts.map +0 -1
  248. package/dist/kit/layoutLoad.js +0 -41
  249. package/dist/kit/layoutLoad.js.map +0 -1
  250. package/dist/kit/protectedLoad.d.ts +0 -16
  251. package/dist/kit/protectedLoad.d.ts.map +0 -1
  252. package/dist/kit/protectedLoad.js +0 -28
  253. package/dist/kit/protectedLoad.js.map +0 -1
  254. package/dist/kit/setupLoad.d.ts +0 -11
  255. package/dist/kit/setupLoad.d.ts.map +0 -1
  256. package/dist/kit/setupLoad.js +0 -28
  257. package/dist/kit/setupLoad.js.map +0 -1
  258. package/dist/kit/validateEndpoint.d.ts +0 -9
  259. package/dist/kit/validateEndpoint.d.ts.map +0 -1
  260. package/dist/kit/validateEndpoint.js +0 -25
  261. package/dist/kit/validateEndpoint.js.map +0 -1
  262. package/dist/kit/vercelApi.d.ts +0 -6
  263. package/dist/kit/vercelApi.d.ts.map +0 -1
  264. package/dist/kit/vercelApi.js +0 -48
  265. package/dist/kit/vercelApi.js.map +0 -1
@@ -1,34 +1,164 @@
1
+ /**
2
+ * @fileoverview Sync Status Store
3
+ *
4
+ * Tracks the overall synchronization state between the local database and the
5
+ * remote Supabase backend. Provides a unified view of sync progress, errors,
6
+ * realtime connection health, and tab visibility for UI status indicators.
7
+ *
8
+ * **Svelte Store Pattern:**
9
+ * Uses a custom writable store created via `createSyncStatusStore()`. The store
10
+ * exposes the standard `subscribe` method for reactive UI binding, plus focused
11
+ * setter methods for each aspect of the sync state. Closure variables
12
+ * (`currentStatus`, `syncingStartTime`, `pendingStatusChange`) maintain
13
+ * timing state outside the store to implement the anti-flicker logic.
14
+ *
15
+ * **Reactive Architecture:**
16
+ * The sync engine calls `setStatus()` to transition through sync lifecycle phases
17
+ * (idle -> syncing -> idle/error). UI components subscribe to the store to display
18
+ * sync indicators, error banners, and connection badges. The store enforces a
19
+ * minimum display time for the 'syncing' state to prevent visual flickering on
20
+ * fast sync operations.
21
+ *
22
+ * @see {@link ../types} for the SyncStatus type definition
23
+ * @see {@link ./network} for the network connectivity store that gates sync
24
+ * @see {@link ./remoteChanges} for remote change tracking during sync
25
+ */
1
26
  import type { SyncStatus } from '../types';
27
+ /**
28
+ * Detailed sync error record for debugging and error history display.
29
+ * Stored in the `syncErrors` array (capped at `MAX_ERROR_HISTORY` entries).
30
+ */
2
31
  export interface SyncError {
32
+ /** Database table where the error occurred */
3
33
  table: string;
34
+ /** The sync operation that failed (e.g., 'push', 'pull', 'upsert') */
4
35
  operation: string;
36
+ /** Unique identifier of the entity involved in the failed operation */
5
37
  entityId: string;
38
+ /** Human-readable error message */
6
39
  message: string;
40
+ /** ISO 8601 timestamp of when the error occurred */
7
41
  timestamp: string;
8
42
  }
43
+ /**
44
+ * Supabase Realtime channel connection state.
45
+ * Tracks the lifecycle of the realtime subscription independently of sync status.
46
+ */
9
47
  export type RealtimeState = 'disconnected' | 'connecting' | 'connected' | 'error';
48
+ /**
49
+ * Complete internal state shape for the sync status store.
50
+ */
10
51
  interface SyncState {
52
+ /** Current high-level sync lifecycle phase */
11
53
  status: SyncStatus;
54
+ /** Number of local changes waiting to be pushed to the remote */
12
55
  pendingCount: number;
56
+ /** User-friendly error message for display in UI banners */
13
57
  lastError: string | null;
58
+ /** Raw technical error string for debugging (e.g., Supabase error codes) */
14
59
  lastErrorDetails: string | null;
60
+ /** Rolling history of detailed sync errors (capped at MAX_ERROR_HISTORY) */
15
61
  syncErrors: SyncError[];
62
+ /** ISO 8601 timestamp of the last successful sync completion */
16
63
  lastSyncTime: string | null;
64
+ /** Human-readable status message (e.g., "Syncing 3 changes...") */
17
65
  syncMessage: string | null;
66
+ /**
67
+ * Whether the browser tab is currently visible.
68
+ * Used to throttle or pause sync operations when the app is backgrounded.
69
+ */
18
70
  isTabVisible: boolean;
71
+ /**
72
+ * Current state of the Supabase Realtime channel connection.
73
+ * Tracked separately from `status` since realtime can disconnect
74
+ * independently of the push/pull sync cycle.
75
+ */
19
76
  realtimeState: RealtimeState;
20
77
  }
78
+ /**
79
+ * Singleton sync status store used throughout the application.
80
+ *
81
+ * @see {@link createSyncStatusStore} for implementation details
82
+ */
21
83
  export declare const syncStatusStore: {
22
84
  subscribe: (this: void, run: import("svelte/store").Subscriber<SyncState>, invalidate?: () => void) => import("svelte/store").Unsubscriber;
85
+ /**
86
+ * Set the high-level sync status with anti-flicker protection.
87
+ *
88
+ * Transition rules:
89
+ * - Redundant updates (same status) are ignored to prevent unnecessary re-renders,
90
+ * except for 'syncing' which always resets the timer.
91
+ * - Entering 'syncing' clears previous errors and records the start time.
92
+ * - Leaving 'syncing' enforces `MIN_SYNCING_TIME` ms minimum display duration.
93
+ * - Transitioning to 'idle' clears the `lastError` field.
94
+ *
95
+ * @param status - The new sync status to set
96
+ *
97
+ * @see {@link MIN_SYNCING_TIME} for the anti-flicker threshold
98
+ */
23
99
  setStatus: (status: SyncStatus) => void;
100
+ /**
101
+ * Update the count of local changes pending remote push.
102
+ *
103
+ * @param count - Number of pending changes
104
+ */
24
105
  setPendingCount: (count: number) => void;
106
+ /**
107
+ * Set or clear the error messages (both user-friendly and raw/technical).
108
+ *
109
+ * @param friendly - Human-readable error message for UI display, or null to clear
110
+ * @param raw - Optional raw technical error string for debugging
111
+ */
25
112
  setError: (friendly: string | null, raw?: string | null) => void;
113
+ /**
114
+ * Append a detailed sync error to the rolling error history.
115
+ * The history is capped at `MAX_ERROR_HISTORY` entries (oldest discarded first).
116
+ *
117
+ * @param error - The detailed sync error record to add
118
+ *
119
+ * @see {@link SyncError} for the error record structure
120
+ * @see {@link MAX_ERROR_HISTORY} for the history size limit
121
+ */
26
122
  addSyncError: (error: SyncError) => void;
123
+ /**
124
+ * Clear all entries from the sync error history.
125
+ * Typically called when a new sync cycle begins successfully.
126
+ */
27
127
  clearSyncErrors: () => void;
128
+ /**
129
+ * Record the timestamp of the last successful sync completion.
130
+ *
131
+ * @param time - ISO 8601 formatted timestamp string
132
+ */
28
133
  setLastSyncTime: (time: string) => void;
134
+ /**
135
+ * Set or clear the human-readable sync progress message.
136
+ *
137
+ * @param message - Status text (e.g., "Pushing 3 changes...") or null to clear
138
+ */
29
139
  setSyncMessage: (message: string | null) => void;
140
+ /**
141
+ * Update the tab visibility flag.
142
+ * Used by the sync engine to pause or throttle operations when backgrounded.
143
+ *
144
+ * @param visible - Whether the browser tab is currently visible
145
+ */
30
146
  setTabVisible: (visible: boolean) => void;
147
+ /**
148
+ * Update the Supabase Realtime channel connection state.
149
+ *
150
+ * @param realtimeState - The current realtime connection state
151
+ *
152
+ * @see {@link RealtimeState} for possible values
153
+ */
31
154
  setRealtimeState: (realtimeState: RealtimeState) => void;
155
+ /**
156
+ * Reset the entire store to its initial default state.
157
+ *
158
+ * Cleans up any pending delayed status transitions and resets all closure
159
+ * variables. Called during logout or app teardown to prevent stale state
160
+ * from carrying over.
161
+ */
32
162
  reset: () => void;
33
163
  };
34
164
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/stores/sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAElF,UAAU,SAAS;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;CAC9B;AA4HD,eAAO,MAAM,eAAe;;wBAhGJ,UAAU;6BAuDL,MAAM;yBACV,MAAM,GAAG,IAAI,QAAQ,MAAM,GAAG,IAAI;0BAMjC,SAAS;;4BAMP,MAAM;8BACJ,MAAM,GAAG,IAAI;6BAEd,OAAO;sCACE,aAAa;;CAwBG,CAAC"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/stores/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IAEd,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAElB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IAEjB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAEhB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAElF;;GAEG;AACH,UAAU,SAAS;IACjB,8CAA8C;IAC9C,MAAM,EAAE,UAAU,CAAC;IAEnB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IAErB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,4EAA4E;IAC5E,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC,4EAA4E;IAC5E,UAAU,EAAE,SAAS,EAAE,CAAC;IAExB,gEAAgE;IAChE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B,mEAAmE;IACnE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB;;;;OAIG;IACH,aAAa,EAAE,aAAa,CAAC;CAC9B;AA+QD;;;;GAIG;AACH,eAAO,MAAM,eAAe;;IA3LxB;;;;;;;;;;;;;OAaG;wBACiB,UAAU;IA4D9B;;;;OAIG;6BACsB,MAAM;IAE/B;;;;;OAKG;yBACkB,MAAM,GAAG,IAAI,QAAQ,MAAM,GAAG,IAAI;IAOvD;;;;;;;;OAQG;0BACmB,SAAS;IAM/B;;;OAGG;;IAGH;;;;OAIG;4BACqB,MAAM;IAE9B;;;;OAIG;8BACuB,MAAM,GAAG,IAAI;IAGvC;;;;;OAKG;6BACsB,OAAO;IAEhC;;;;;;OAMG;sCAC+B,aAAa;IAG/C;;;;;;OAMG;;CAiC+C,CAAC"}
@@ -1,8 +1,74 @@
1
+ /**
2
+ * @fileoverview Sync Status Store
3
+ *
4
+ * Tracks the overall synchronization state between the local database and the
5
+ * remote Supabase backend. Provides a unified view of sync progress, errors,
6
+ * realtime connection health, and tab visibility for UI status indicators.
7
+ *
8
+ * **Svelte Store Pattern:**
9
+ * Uses a custom writable store created via `createSyncStatusStore()`. The store
10
+ * exposes the standard `subscribe` method for reactive UI binding, plus focused
11
+ * setter methods for each aspect of the sync state. Closure variables
12
+ * (`currentStatus`, `syncingStartTime`, `pendingStatusChange`) maintain
13
+ * timing state outside the store to implement the anti-flicker logic.
14
+ *
15
+ * **Reactive Architecture:**
16
+ * The sync engine calls `setStatus()` to transition through sync lifecycle phases
17
+ * (idle -> syncing -> idle/error). UI components subscribe to the store to display
18
+ * sync indicators, error banners, and connection badges. The store enforces a
19
+ * minimum display time for the 'syncing' state to prevent visual flickering on
20
+ * fast sync operations.
21
+ *
22
+ * @see {@link ../types} for the SyncStatus type definition
23
+ * @see {@link ./network} for the network connectivity store that gates sync
24
+ * @see {@link ./remoteChanges} for remote change tracking during sync
25
+ */
1
26
  import { writable } from 'svelte/store';
2
- // Minimum time to show 'syncing' state to prevent flickering (ms)
27
+ // =============================================================================
28
+ // Constants
29
+ // =============================================================================
30
+ /**
31
+ * Minimum time (ms) to display the 'syncing' status in the UI.
32
+ * Prevents visual flickering when sync completes faster than the user can
33
+ * perceive the status change.
34
+ */
3
35
  const MIN_SYNCING_TIME = 500;
4
- // Max errors to keep in history
36
+ /**
37
+ * Maximum number of detailed error entries to retain in the `syncErrors` array.
38
+ * Older entries are discarded (FIFO) when this limit is reached.
39
+ */
5
40
  const MAX_ERROR_HISTORY = 10;
41
+ // =============================================================================
42
+ // Store Factory
43
+ // =============================================================================
44
+ /**
45
+ * Creates the singleton sync status store.
46
+ *
47
+ * The store implements anti-flicker logic for the 'syncing' status: when
48
+ * transitioning away from 'syncing', it ensures the syncing indicator was
49
+ * displayed for at least `MIN_SYNCING_TIME` ms. If the sync completed faster,
50
+ * the status transition is delayed to meet the minimum display time.
51
+ *
52
+ * Closure variables outside the store maintain timing state:
53
+ * - `currentStatus` - Tracks the last-set status for redundancy filtering
54
+ * - `syncingStartTime` - Records when 'syncing' status was entered
55
+ * - `pendingStatusChange` - Holds a delayed status transition (with its timeout handle)
56
+ *
57
+ * @returns A Svelte-compatible store with sync-specific setter methods
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * // Sync engine usage:
62
+ * syncStatusStore.setStatus('syncing');
63
+ * syncStatusStore.setSyncMessage('Pushing 5 changes...');
64
+ * await pushChanges();
65
+ * syncStatusStore.setStatus('idle');
66
+ *
67
+ * // Component usage:
68
+ * $: showSpinner = $syncStatusStore.status === 'syncing';
69
+ * $: showError = $syncStatusStore.lastError !== null;
70
+ * ```
71
+ */
6
72
  function createSyncStatusStore() {
7
73
  const { subscribe, set, update } = writable({
8
74
  status: 'idle',
@@ -15,33 +81,62 @@ function createSyncStatusStore() {
15
81
  isTabVisible: true,
16
82
  realtimeState: 'disconnected'
17
83
  });
84
+ // ---------------------------------------------------------------------------
85
+ // Anti-Flicker Timing State
86
+ // ---------------------------------------------------------------------------
87
+ /** The last status value that was actually applied to the store */
18
88
  let currentStatus = 'idle';
89
+ /** Timestamp when 'syncing' status was entered; null when not syncing */
19
90
  let syncingStartTime = null;
91
+ /**
92
+ * Holds a pending delayed status transition.
93
+ * When sync completes before `MIN_SYNCING_TIME`, the final status change
94
+ * is scheduled via setTimeout to prevent UI flickering.
95
+ */
20
96
  let pendingStatusChange = null;
97
+ // ---------------------------------------------------------------------------
98
+ // Store Methods
99
+ // ---------------------------------------------------------------------------
21
100
  return {
22
101
  subscribe,
102
+ /**
103
+ * Set the high-level sync status with anti-flicker protection.
104
+ *
105
+ * Transition rules:
106
+ * - Redundant updates (same status) are ignored to prevent unnecessary re-renders,
107
+ * except for 'syncing' which always resets the timer.
108
+ * - Entering 'syncing' clears previous errors and records the start time.
109
+ * - Leaving 'syncing' enforces `MIN_SYNCING_TIME` ms minimum display duration.
110
+ * - Transitioning to 'idle' clears the `lastError` field.
111
+ *
112
+ * @param status - The new sync status to set
113
+ *
114
+ * @see {@link MIN_SYNCING_TIME} for the anti-flicker threshold
115
+ */
23
116
  setStatus: (status) => {
24
- // Ignore redundant status updates to prevent unnecessary re-renders
117
+ /* Ignore redundant status updates to prevent unnecessary re-renders.
118
+ * Exception: 'syncing' is always processed to reset the timer. */
25
119
  if (status === currentStatus && status !== 'syncing') {
26
120
  return;
27
121
  }
28
- // Clear any pending status change
122
+ /* Clear any pending delayed status change from a previous transition */
29
123
  if (pendingStatusChange) {
30
124
  clearTimeout(pendingStatusChange.timeout);
31
125
  pendingStatusChange = null;
32
126
  }
33
127
  if (status === 'syncing') {
34
- // Starting sync - record the time and clear previous errors
128
+ /* Starting sync - record the time and clear previous errors */
35
129
  syncingStartTime = Date.now();
36
130
  currentStatus = status;
37
131
  update((state) => ({ ...state, status, lastError: null, syncErrors: [] }));
38
132
  }
39
133
  else if (syncingStartTime !== null) {
40
- // Ending sync - ensure minimum display time
134
+ /* Ending sync - enforce minimum display time to prevent flickering */
41
135
  const elapsed = Date.now() - syncingStartTime;
42
136
  const remaining = MIN_SYNCING_TIME - elapsed;
43
137
  if (remaining > 0) {
44
- // Delay the status change to prevent flickering
138
+ /* Sync completed too fast - delay the status change so the user
139
+ * can see the syncing indicator for at least MIN_SYNCING_TIME */
45
140
  pendingStatusChange = {
46
141
  status,
47
142
  timeout: setTimeout(() => {
@@ -57,6 +152,7 @@ function createSyncStatusStore() {
57
152
  };
58
153
  }
59
154
  else {
155
+ /* Sync took long enough - apply the status change immediately */
60
156
  syncingStartTime = null;
61
157
  currentStatus = status;
62
158
  update((state) => ({
@@ -67,6 +163,7 @@ function createSyncStatusStore() {
67
163
  }
68
164
  }
69
165
  else {
166
+ /* Direct status change (not coming from 'syncing') */
70
167
  currentStatus = status;
71
168
  update((state) => ({
72
169
  ...state,
@@ -75,22 +172,77 @@ function createSyncStatusStore() {
75
172
  }));
76
173
  }
77
174
  },
175
+ /**
176
+ * Update the count of local changes pending remote push.
177
+ *
178
+ * @param count - Number of pending changes
179
+ */
78
180
  setPendingCount: (count) => update((state) => ({ ...state, pendingCount: count })),
181
+ /**
182
+ * Set or clear the error messages (both user-friendly and raw/technical).
183
+ *
184
+ * @param friendly - Human-readable error message for UI display, or null to clear
185
+ * @param raw - Optional raw technical error string for debugging
186
+ */
79
187
  setError: (friendly, raw) => update((state) => ({
80
188
  ...state,
81
189
  lastError: friendly,
82
190
  lastErrorDetails: raw ?? null
83
191
  })),
192
+ /**
193
+ * Append a detailed sync error to the rolling error history.
194
+ * The history is capped at `MAX_ERROR_HISTORY` entries (oldest discarded first).
195
+ *
196
+ * @param error - The detailed sync error record to add
197
+ *
198
+ * @see {@link SyncError} for the error record structure
199
+ * @see {@link MAX_ERROR_HISTORY} for the history size limit
200
+ */
84
201
  addSyncError: (error) => update((state) => ({
85
202
  ...state,
86
203
  syncErrors: [...state.syncErrors, error].slice(-MAX_ERROR_HISTORY)
87
204
  })),
205
+ /**
206
+ * Clear all entries from the sync error history.
207
+ * Typically called when a new sync cycle begins successfully.
208
+ */
88
209
  clearSyncErrors: () => update((state) => ({ ...state, syncErrors: [] })),
210
+ /**
211
+ * Record the timestamp of the last successful sync completion.
212
+ *
213
+ * @param time - ISO 8601 formatted timestamp string
214
+ */
89
215
  setLastSyncTime: (time) => update((state) => ({ ...state, lastSyncTime: time })),
216
+ /**
217
+ * Set or clear the human-readable sync progress message.
218
+ *
219
+ * @param message - Status text (e.g., "Pushing 3 changes...") or null to clear
220
+ */
90
221
  setSyncMessage: (message) => update((state) => ({ ...state, syncMessage: message })),
222
+ /**
223
+ * Update the tab visibility flag.
224
+ * Used by the sync engine to pause or throttle operations when backgrounded.
225
+ *
226
+ * @param visible - Whether the browser tab is currently visible
227
+ */
91
228
  setTabVisible: (visible) => update((state) => ({ ...state, isTabVisible: visible })),
229
+ /**
230
+ * Update the Supabase Realtime channel connection state.
231
+ *
232
+ * @param realtimeState - The current realtime connection state
233
+ *
234
+ * @see {@link RealtimeState} for possible values
235
+ */
92
236
  setRealtimeState: (realtimeState) => update((state) => ({ ...state, realtimeState })),
237
+ /**
238
+ * Reset the entire store to its initial default state.
239
+ *
240
+ * Cleans up any pending delayed status transitions and resets all closure
241
+ * variables. Called during logout or app teardown to prevent stale state
242
+ * from carrying over.
243
+ */
93
244
  reset: () => {
245
+ /* Clean up pending anti-flicker timeout to avoid orphaned callbacks */
94
246
  if (pendingStatusChange) {
95
247
  clearTimeout(pendingStatusChange.timeout);
96
248
  pendingStatusChange = null;
@@ -111,5 +263,13 @@ function createSyncStatusStore() {
111
263
  }
112
264
  };
113
265
  }
266
+ // =============================================================================
267
+ // Singleton Store Instance
268
+ // =============================================================================
269
+ /**
270
+ * Singleton sync status store used throughout the application.
271
+ *
272
+ * @see {@link createSyncStatusStore} for implementation details
273
+ */
114
274
  export const syncStatusStore = createSyncStatusStore();
115
275
  //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/stores/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/stores/sync.ts"],"names":[],"mappings":"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"}