@buoy-gg/storage 7.0.40 → 7.0.42

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 (215) hide show
  1. package/README.md +11 -86
  2. package/lib/commonjs/index.js +1 -346
  3. package/lib/commonjs/preset.js +1 -80
  4. package/lib/commonjs/storage/components/DiffViewer/TreeDiffViewer.js +1 -36
  5. package/lib/commonjs/storage/components/DiffViewer/modes/ThemedSplitView.js +1 -12
  6. package/lib/commonjs/storage/components/DiffViewer/themes/diffThemes.js +1 -24
  7. package/lib/commonjs/storage/components/GameUIStorageBrowser.js +3 -1258
  8. package/lib/commonjs/storage/components/MMKVInstanceInfoPanel.js +1 -257
  9. package/lib/commonjs/storage/components/MMKVInstanceSelector.js +1 -418
  10. package/lib/commonjs/storage/components/SelectionActionBar.js +1 -207
  11. package/lib/commonjs/storage/components/StorageActionButtons.js +1 -241
  12. package/lib/commonjs/storage/components/StorageBrowserMode.js +1 -61
  13. package/lib/commonjs/storage/components/StorageEventActionButton.js +1 -121
  14. package/lib/commonjs/storage/components/StorageEventCard.js +1 -117
  15. package/lib/commonjs/storage/components/StorageEventDetailContent.js +1 -494
  16. package/lib/commonjs/storage/components/StorageEventFilterView.js +1 -159
  17. package/lib/commonjs/storage/components/StorageEventsSection.js +1 -24
  18. package/lib/commonjs/storage/components/StorageFilterCards.js +1 -231
  19. package/lib/commonjs/storage/components/StorageKeyCard.js +1 -520
  20. package/lib/commonjs/storage/components/StorageKeyDetailScreen.js +1 -579
  21. package/lib/commonjs/storage/components/StorageKeyRow.js +1 -559
  22. package/lib/commonjs/storage/components/StorageKeySection.js +1 -160
  23. package/lib/commonjs/storage/components/StorageKeyStats.js +1 -344
  24. package/lib/commonjs/storage/components/StorageModalWithTabs.js +1 -954
  25. package/lib/commonjs/storage/components/StorageSaveNotice.js +1 -171
  26. package/lib/commonjs/storage/components/StorageSection.js +1 -43
  27. package/lib/commonjs/storage/components/StorageTypeFilterBar.js +1 -143
  28. package/lib/commonjs/storage/hooks/useAsyncStorageKeys.js +1 -141
  29. package/lib/commonjs/storage/hooks/useMMKVInstances.js +1 -210
  30. package/lib/commonjs/storage/hooks/useMMKVKeys.js +1 -376
  31. package/lib/commonjs/storage/hooks/useSecureStoreKeys.js +1 -159
  32. package/lib/commonjs/storage/hooks/useStorageEvents.js +1 -61
  33. package/lib/commonjs/storage/stores/storageEventStore.js +1 -312
  34. package/lib/commonjs/storage/sync/storageSyncAdapter.js +1 -478
  35. package/lib/commonjs/storage/types.js +1 -5
  36. package/lib/commonjs/storage/utils/AsyncStorageListener.js +1 -691
  37. package/lib/commonjs/storage/utils/AsyncStorageListener.web.js +1 -0
  38. package/lib/commonjs/storage/utils/MMKVInstanceRegistry.js +1 -203
  39. package/lib/commonjs/storage/utils/MMKVListener.js +1 -416
  40. package/lib/commonjs/storage/utils/SecureStoreRegistry.js +1 -200
  41. package/lib/commonjs/storage/utils/asyncStorageCompat.js +1 -89
  42. package/lib/commonjs/storage/utils/browserStorageLifecycle.js +1 -0
  43. package/lib/commonjs/storage/utils/browserStorageLifecycle.web.js +1 -0
  44. package/lib/commonjs/storage/utils/clearAllStorage.js +1 -48
  45. package/lib/commonjs/storage/utils/deleteStorageKeys.js +1 -82
  46. package/lib/commonjs/storage/utils/lineDiff.js +1 -30
  47. package/lib/commonjs/storage/utils/mmkvAvailability.js +1 -62
  48. package/lib/commonjs/storage/utils/mmkvAvailability.web.js +1 -0
  49. package/lib/commonjs/storage/utils/mmkvTypeDetection.js +1 -154
  50. package/lib/commonjs/storage/utils/requiredStorageKeyScope.js +1 -17
  51. package/lib/commonjs/storage/utils/setStorageValue.js +1 -218
  52. package/lib/commonjs/storage/utils/snapshotProvider.js +1 -382
  53. package/lib/commonjs/storage/utils/storageActionHelpers.js +1 -46
  54. package/lib/commonjs/storage/utils/storageBrowserRefresh.js +1 -49
  55. package/lib/commonjs/storage/utils/storageLabels.js +1 -0
  56. package/lib/commonjs/storage/utils/storageLabels.web.js +1 -0
  57. package/lib/commonjs/storage/utils/storageOps.js +1 -53
  58. package/lib/commonjs/storage/utils/storageQueryUtils.js +1 -35
  59. package/lib/commonjs/storage/utils/storageTimeTravelUtils.js +1 -288
  60. package/lib/commonjs/storage/utils/valueType.js +1 -83
  61. package/lib/module/index.js +1 -112
  62. package/lib/module/preset.js +1 -76
  63. package/lib/module/storage/components/DiffViewer/TreeDiffViewer.js +1 -32
  64. package/lib/module/storage/components/DiffViewer/modes/ThemedSplitView.js +1 -9
  65. package/lib/module/storage/components/DiffViewer/themes/diffThemes.js +1 -10
  66. package/lib/module/storage/components/GameUIStorageBrowser.js +3 -1256
  67. package/lib/module/storage/components/MMKVInstanceInfoPanel.js +1 -253
  68. package/lib/module/storage/components/MMKVInstanceSelector.js +1 -414
  69. package/lib/module/storage/components/SelectionActionBar.js +1 -204
  70. package/lib/module/storage/components/StorageActionButtons.js +1 -237
  71. package/lib/module/storage/components/StorageBrowserMode.js +1 -57
  72. package/lib/module/storage/components/StorageEventActionButton.js +1 -118
  73. package/lib/module/storage/components/StorageEventCard.js +1 -112
  74. package/lib/module/storage/components/StorageEventDetailContent.js +1 -490
  75. package/lib/module/storage/components/StorageEventFilterView.js +1 -155
  76. package/lib/module/storage/components/StorageEventsSection.js +1 -20
  77. package/lib/module/storage/components/StorageFilterCards.js +1 -227
  78. package/lib/module/storage/components/StorageKeyCard.js +1 -517
  79. package/lib/module/storage/components/StorageKeyDetailScreen.js +1 -577
  80. package/lib/module/storage/components/StorageKeyRow.js +1 -554
  81. package/lib/module/storage/components/StorageKeySection.js +1 -155
  82. package/lib/module/storage/components/StorageKeyStats.js +1 -341
  83. package/lib/module/storage/components/StorageModalWithTabs.js +1 -949
  84. package/lib/module/storage/components/StorageSaveNotice.js +1 -168
  85. package/lib/module/storage/components/StorageSection.js +1 -40
  86. package/lib/module/storage/components/StorageTypeFilterBar.js +1 -138
  87. package/lib/module/storage/hooks/useAsyncStorageKeys.js +1 -136
  88. package/lib/module/storage/hooks/useMMKVInstances.js +1 -204
  89. package/lib/module/storage/hooks/useMMKVKeys.js +1 -371
  90. package/lib/module/storage/hooks/useSecureStoreKeys.js +1 -156
  91. package/lib/module/storage/hooks/useStorageEvents.js +1 -58
  92. package/lib/module/storage/stores/storageEventStore.js +1 -301
  93. package/lib/module/storage/sync/storageSyncAdapter.js +1 -474
  94. package/lib/module/storage/types.js +1 -3
  95. package/lib/module/storage/utils/AsyncStorageListener.js +1 -679
  96. package/lib/module/storage/utils/AsyncStorageListener.web.js +1 -0
  97. package/lib/module/storage/utils/MMKVInstanceRegistry.js +1 -197
  98. package/lib/module/storage/utils/MMKVListener.js +1 -403
  99. package/lib/module/storage/utils/SecureStoreRegistry.js +1 -194
  100. package/lib/module/storage/utils/asyncStorageCompat.js +1 -81
  101. package/lib/module/storage/utils/browserStorageLifecycle.js +1 -0
  102. package/lib/module/storage/utils/browserStorageLifecycle.web.js +1 -0
  103. package/lib/module/storage/utils/clearAllStorage.js +1 -43
  104. package/lib/module/storage/utils/deleteStorageKeys.js +1 -78
  105. package/lib/module/storage/utils/lineDiff.js +1 -12
  106. package/lib/module/storage/utils/mmkvAvailability.js +1 -56
  107. package/lib/module/storage/utils/mmkvAvailability.web.js +1 -0
  108. package/lib/module/storage/utils/mmkvTypeDetection.js +1 -148
  109. package/lib/module/storage/utils/requiredStorageKeyScope.js +1 -13
  110. package/lib/module/storage/utils/setStorageValue.js +1 -209
  111. package/lib/module/storage/utils/snapshotProvider.js +1 -380
  112. package/lib/module/storage/utils/storageActionHelpers.js +1 -42
  113. package/lib/module/storage/utils/storageBrowserRefresh.js +1 -44
  114. package/lib/module/storage/utils/storageLabels.js +1 -0
  115. package/lib/module/storage/utils/storageLabels.web.js +1 -0
  116. package/lib/module/storage/utils/storageOps.js +1 -46
  117. package/lib/module/storage/utils/storageQueryUtils.js +1 -30
  118. package/lib/module/storage/utils/storageTimeTravelUtils.js +1 -281
  119. package/lib/module/storage/utils/valueType.js +1 -76
  120. package/lib/typescript/index.d.ts +1 -0
  121. package/lib/typescript/storage/components/MMKVInstanceSelector.d.ts +0 -8
  122. package/lib/typescript/storage/components/StorageEventCard.d.ts +0 -7
  123. package/lib/typescript/storage/components/StorageKeyRow.d.ts +2 -6
  124. package/lib/typescript/storage/components/StorageTypeFilterBar.d.ts +0 -15
  125. package/lib/typescript/storage/hooks/useSecureStoreKeys.d.ts +2 -2
  126. package/lib/typescript/storage/sync/storageSyncAdapter.d.ts +7 -13
  127. package/lib/typescript/storage/utils/AsyncStorageListener.web.d.ts +24 -0
  128. package/lib/typescript/storage/utils/browserStorageLifecycle.d.ts +3 -0
  129. package/lib/typescript/storage/utils/browserStorageLifecycle.web.d.ts +2 -0
  130. package/lib/typescript/storage/utils/mmkvAvailability.web.d.ts +4 -0
  131. package/lib/typescript/storage/utils/storageLabels.d.ts +8 -0
  132. package/lib/typescript/storage/utils/storageLabels.web.d.ts +8 -0
  133. package/lib/web/index.mjs +4 -0
  134. package/package.json +40 -14
  135. package/lib/commonjs/storage/components/DiffViewer/DiffOptionsPanel.js +0 -356
  136. package/lib/commonjs/storage/components/DiffViewer/components/DiffSummary.js +0 -122
  137. package/lib/commonjs/storage/components/StorageKeyEditorScreen.js +0 -414
  138. package/lib/commonjs/storage/components/StorageScalarKeyEditor.js +0 -61
  139. package/lib/commonjs/storage/components/StorageValueEditModal.js +0 -24
  140. package/lib/commonjs/storage/hooks/useKeyEditor.js +0 -31
  141. package/lib/commonjs/storage/hooks/useTreeDraft.js +0 -25
  142. package/lib/module/storage/components/DiffViewer/DiffOptionsPanel.js +0 -352
  143. package/lib/module/storage/components/DiffViewer/components/DiffSummary.js +0 -118
  144. package/lib/module/storage/components/StorageKeyEditorScreen.js +0 -410
  145. package/lib/module/storage/components/StorageScalarKeyEditor.js +0 -57
  146. package/lib/module/storage/components/StorageValueEditModal.js +0 -20
  147. package/lib/module/storage/hooks/useKeyEditor.js +0 -27
  148. package/lib/module/storage/hooks/useTreeDraft.js +0 -21
  149. package/lib/typescript/index.d.ts.map +0 -1
  150. package/lib/typescript/preset.d.ts.map +0 -1
  151. package/lib/typescript/storage/components/DiffViewer/DiffOptionsPanel.d.ts +0 -18
  152. package/lib/typescript/storage/components/DiffViewer/DiffOptionsPanel.d.ts.map +0 -1
  153. package/lib/typescript/storage/components/DiffViewer/TreeDiffViewer.d.ts.map +0 -1
  154. package/lib/typescript/storage/components/DiffViewer/components/DiffSummary.d.ts +0 -12
  155. package/lib/typescript/storage/components/DiffViewer/components/DiffSummary.d.ts.map +0 -1
  156. package/lib/typescript/storage/components/DiffViewer/modes/ThemedSplitView.d.ts.map +0 -1
  157. package/lib/typescript/storage/components/DiffViewer/themes/diffThemes.d.ts.map +0 -1
  158. package/lib/typescript/storage/components/GameUIStorageBrowser.d.ts.map +0 -1
  159. package/lib/typescript/storage/components/MMKVInstanceInfoPanel.d.ts.map +0 -1
  160. package/lib/typescript/storage/components/MMKVInstanceSelector.d.ts.map +0 -1
  161. package/lib/typescript/storage/components/SelectionActionBar.d.ts.map +0 -1
  162. package/lib/typescript/storage/components/StorageActionButtons.d.ts.map +0 -1
  163. package/lib/typescript/storage/components/StorageBrowserMode.d.ts.map +0 -1
  164. package/lib/typescript/storage/components/StorageEventActionButton.d.ts.map +0 -1
  165. package/lib/typescript/storage/components/StorageEventCard.d.ts.map +0 -1
  166. package/lib/typescript/storage/components/StorageEventDetailContent.d.ts.map +0 -1
  167. package/lib/typescript/storage/components/StorageEventFilterView.d.ts.map +0 -1
  168. package/lib/typescript/storage/components/StorageEventsSection.d.ts.map +0 -1
  169. package/lib/typescript/storage/components/StorageFilterCards.d.ts.map +0 -1
  170. package/lib/typescript/storage/components/StorageKeyCard.d.ts.map +0 -1
  171. package/lib/typescript/storage/components/StorageKeyDetailScreen.d.ts.map +0 -1
  172. package/lib/typescript/storage/components/StorageKeyEditorScreen.d.ts +0 -42
  173. package/lib/typescript/storage/components/StorageKeyEditorScreen.d.ts.map +0 -1
  174. package/lib/typescript/storage/components/StorageKeyRow.d.ts.map +0 -1
  175. package/lib/typescript/storage/components/StorageKeySection.d.ts.map +0 -1
  176. package/lib/typescript/storage/components/StorageKeyStats.d.ts.map +0 -1
  177. package/lib/typescript/storage/components/StorageModalWithTabs.d.ts.map +0 -1
  178. package/lib/typescript/storage/components/StorageSaveNotice.d.ts.map +0 -1
  179. package/lib/typescript/storage/components/StorageScalarKeyEditor.d.ts +0 -24
  180. package/lib/typescript/storage/components/StorageScalarKeyEditor.d.ts.map +0 -1
  181. package/lib/typescript/storage/components/StorageSection.d.ts.map +0 -1
  182. package/lib/typescript/storage/components/StorageTypeFilterBar.d.ts.map +0 -1
  183. package/lib/typescript/storage/components/StorageValueEditModal.d.ts +0 -14
  184. package/lib/typescript/storage/components/StorageValueEditModal.d.ts.map +0 -1
  185. package/lib/typescript/storage/hooks/useAsyncStorageKeys.d.ts.map +0 -1
  186. package/lib/typescript/storage/hooks/useKeyEditor.d.ts +0 -27
  187. package/lib/typescript/storage/hooks/useKeyEditor.d.ts.map +0 -1
  188. package/lib/typescript/storage/hooks/useMMKVInstances.d.ts.map +0 -1
  189. package/lib/typescript/storage/hooks/useMMKVKeys.d.ts.map +0 -1
  190. package/lib/typescript/storage/hooks/useSecureStoreKeys.d.ts.map +0 -1
  191. package/lib/typescript/storage/hooks/useStorageEvents.d.ts.map +0 -1
  192. package/lib/typescript/storage/hooks/useTreeDraft.d.ts +0 -16
  193. package/lib/typescript/storage/hooks/useTreeDraft.d.ts.map +0 -1
  194. package/lib/typescript/storage/stores/storageEventStore.d.ts.map +0 -1
  195. package/lib/typescript/storage/sync/storageSyncAdapter.d.ts.map +0 -1
  196. package/lib/typescript/storage/types.d.ts.map +0 -1
  197. package/lib/typescript/storage/utils/AsyncStorageListener.d.ts.map +0 -1
  198. package/lib/typescript/storage/utils/MMKVInstanceRegistry.d.ts.map +0 -1
  199. package/lib/typescript/storage/utils/MMKVListener.d.ts.map +0 -1
  200. package/lib/typescript/storage/utils/SecureStoreRegistry.d.ts.map +0 -1
  201. package/lib/typescript/storage/utils/asyncStorageCompat.d.ts.map +0 -1
  202. package/lib/typescript/storage/utils/clearAllStorage.d.ts.map +0 -1
  203. package/lib/typescript/storage/utils/deleteStorageKeys.d.ts.map +0 -1
  204. package/lib/typescript/storage/utils/lineDiff.d.ts.map +0 -1
  205. package/lib/typescript/storage/utils/mmkvAvailability.d.ts.map +0 -1
  206. package/lib/typescript/storage/utils/mmkvTypeDetection.d.ts.map +0 -1
  207. package/lib/typescript/storage/utils/requiredStorageKeyScope.d.ts.map +0 -1
  208. package/lib/typescript/storage/utils/setStorageValue.d.ts.map +0 -1
  209. package/lib/typescript/storage/utils/snapshotProvider.d.ts.map +0 -1
  210. package/lib/typescript/storage/utils/storageActionHelpers.d.ts.map +0 -1
  211. package/lib/typescript/storage/utils/storageBrowserRefresh.d.ts.map +0 -1
  212. package/lib/typescript/storage/utils/storageOps.d.ts.map +0 -1
  213. package/lib/typescript/storage/utils/storageQueryUtils.d.ts.map +0 -1
  214. package/lib/typescript/storage/utils/storageTimeTravelUtils.d.ts.map +0 -1
  215. package/lib/typescript/storage/utils/valueType.d.ts.map +0 -1
@@ -1,679 +1 @@
1
- "use strict";
2
-
3
- import { asyncStorage as AsyncStorage, asyncStorageCaps, readMany } from "./asyncStorageCompat";
4
-
5
- // AsyncStorage method signatures - matching the actual AsyncStorage API
6
-
7
- // v3-only batch methods (replace multiSet/multiRemove)
8
-
9
- /**
10
- * The pristine (un-swizzled) AsyncStorage methods, stashed on globalThis under a
11
- * cross-realm Symbol.
12
- *
13
- * Why this exists: the listener below is a module-scope singleton. Metro Fast
14
- * Refresh re-evaluates the module and builds a NEW instance whose `original*`
15
- * fields are all null — but `AsyncStorage.setItem` still points at the OLD
16
- * instance's `swizzled_setItem`. Without a stash, `initialize()` sees the
17
- * existing swizzle, has no way to recover the real methods, and bails; the
18
- * listener then never attaches, so storage events stop for the rest of the
19
- * session (writes still work, they just go unrecorded). Keeping the originals
20
- * off the instance lets a fresh instance re-attach cleanly.
21
- */
22
-
23
- const ORIGINALS_KEY = Symbol.for("@buoy-gg/storage.asyncStorageOriginals");
24
- function readStashedOriginals() {
25
- return globalThis[ORIGINALS_KEY] ?? null;
26
- }
27
- function stashOriginals(originals) {
28
- globalThis[ORIGINALS_KEY] = originals;
29
- }
30
-
31
- // Event types for AsyncStorage operations
32
-
33
- /**
34
- * Singleton class for intercepting and monitoring AsyncStorage operations
35
- *
36
- * This class uses method swizzling to intercept all AsyncStorage operations
37
- * (setItem, removeItem, mergeItem, clear, multiSet, multiRemove, multiMerge)
38
- * and emits events to registered listeners. It maintains the original functionality
39
- * while providing observability for debugging and development tools.
40
- *
41
- * Supports both async-storage v2 (multiGet/multiSet/multiRemove/mergeItem) and
42
- * v3 (getMany/setMany/removeMany, no merge). On v3 the renamed batch methods are
43
- * swizzled and normalized back to the same v2-shaped events, so the rest of the
44
- * tool — event store, time-travel, desktop sync — is version-agnostic. v3 dropped
45
- * the merge API entirely, so no merge events can occur there.
46
- *
47
- * @example
48
- * ```typescript
49
- * // Start listening to all AsyncStorage operations
50
- * startListening();
51
- *
52
- * // Add a listener for storage events
53
- * const unsubscribe = addListener((event) => {
54
- * console.log(`${event.action}:`, event.data);
55
- * });
56
- *
57
- * // Clean up
58
- * unsubscribe();
59
- * stopListening();
60
- * ```
61
- *
62
- * @performance Uses method interception rather than polling for zero-overhead when inactive
63
- * @performance Includes key filtering to prevent dev tools from triggering self-events
64
- */
65
- class AsyncStorageListener {
66
- listeners = [];
67
- isListening = false;
68
- isInitialized = false;
69
- isPaused = false;
70
-
71
- // Keys to ignore for dev tools to prevent self-triggering
72
- // Only ignore specific keys that would cause infinite loops in the storage browser
73
- ignoredKeys = new Set(["@react_buoy_storage_event_filters",
74
- // Storage events filter settings
75
- "@react_buoy_storage_key_filters",
76
- // Storage browser key filters
77
- "@react_buoy_storage_is_monitoring",
78
- // Storage monitoring toggle
79
- "REACT_QUERY_OFFLINE_CACHE" // React Query cache
80
- ]);
81
-
82
- // Store original methods
83
- originalSetItem = null;
84
- originalRemoveItem = null;
85
- originalMergeItem = null;
86
- originalClear = null;
87
- // v2 batch originals
88
- originalMultiSet = null;
89
- originalMultiRemove = null;
90
- originalMultiMerge = null;
91
- // v3 batch originals
92
- originalSetMany = null;
93
- originalRemoveMany = null;
94
-
95
- /**
96
- * Determines if a storage key should be ignored to prevent infinite loops
97
- *
98
- * Dev tools often store their own state in AsyncStorage, which would trigger
99
- * events and cause infinite loops or unnecessary noise.
100
- *
101
- * @param key - The storage key to check
102
- * @returns True if the key should be ignored, false otherwise
103
- */
104
- shouldIgnoreKey(key) {
105
- // Check exact matches
106
- if (this.ignoredKeys.has(key)) return true;
107
-
108
- // Check prefix matches
109
- for (const ignoredKey of this.ignoredKeys) {
110
- if (key.startsWith(ignoredKey)) return true;
111
- }
112
- return false;
113
- }
114
-
115
- /**
116
- * Copy a set of pristine methods onto this instance's `original*` fields.
117
- *
118
- * Used both when capturing them for the first time and when adopting the
119
- * global stash after a Fast Refresh, so `restoreOriginalMethods()` and the
120
- * swizzles always have real methods to call through to.
121
- */
122
- adoptOriginals(originals) {
123
- this.originalSetItem = originals.setItem;
124
- this.originalRemoveItem = originals.removeItem;
125
- this.originalClear = originals.clear;
126
- this.originalMergeItem = originals.mergeItem;
127
- this.originalMultiSet = originals.multiSet;
128
- this.originalMultiRemove = originals.multiRemove;
129
- this.originalMultiMerge = originals.multiMerge;
130
- this.originalSetMany = originals.setMany;
131
- this.originalRemoveMany = originals.removeMany;
132
- }
133
-
134
- /**
135
- * Initialize the listener by loading AsyncStorage and storing original methods
136
- *
137
- * This method performs safety checks to ensure we don't double-initialize
138
- * and verifies that AsyncStorage methods haven't already been swizzled.
139
- *
140
- * @returns Promise<boolean> - True if initialization succeeded, false otherwise
141
- *
142
- * @throws Will log errors if AsyncStorage is already swizzled by another instance
143
- */
144
- async initialize() {
145
- if (this.isInitialized) {
146
- // Already initialized - skipping
147
- return true;
148
- }
149
-
150
- // Already swizzled — by a previous instance of this class that Fast Refresh
151
- // replaced, or by a duplicate copy of the package. Adopt the stashed
152
- // originals so this instance can restore + re-swizzle. Bailing here is what
153
- // used to kill storage events until a full app reload.
154
- if (AsyncStorage.setItem.name === "swizzled_setItem") {
155
- const stashed = readStashedOriginals();
156
- if (!stashed) {
157
- // Swizzled by something we didn't install and whose originals we never
158
- // captured — taking the current methods as "originals" would bake the
159
- // foreign swizzle in permanently, so stay out of the way.
160
- return false;
161
- }
162
- this.adoptOriginals(stashed);
163
- this.isInitialized = true;
164
- return true;
165
- }
166
-
167
- // Store original methods (these should be the real AsyncStorage methods).
168
- // Single-item + clear are identical across v2/v3.
169
- const originals = {
170
- setItem: AsyncStorage.setItem.bind(AsyncStorage),
171
- removeItem: AsyncStorage.removeItem.bind(AsyncStorage),
172
- clear: AsyncStorage.clear.bind(AsyncStorage),
173
- mergeItem: null,
174
- multiSet: null,
175
- multiRemove: null,
176
- multiMerge: null,
177
- setMany: null,
178
- removeMany: null
179
- };
180
- if (asyncStorageCaps.hasLegacyMultiApi) {
181
- // v2: multiSet/multiRemove + merge API
182
- originals.multiSet = AsyncStorage.multiSet.bind(AsyncStorage);
183
- originals.multiRemove = AsyncStorage.multiRemove.bind(AsyncStorage);
184
- originals.mergeItem = AsyncStorage.mergeItem.bind(AsyncStorage);
185
- originals.multiMerge = AsyncStorage.multiMerge ? AsyncStorage.multiMerge.bind(AsyncStorage) : null;
186
- } else {
187
- // v3: setMany/removeMany; merge API was removed (nothing to capture)
188
- originals.setMany = AsyncStorage.setMany.bind(AsyncStorage);
189
- originals.removeMany = AsyncStorage.removeMany.bind(AsyncStorage);
190
- }
191
-
192
- // Keep them reachable across a module re-evaluation, then adopt.
193
- stashOriginals(originals);
194
- this.adoptOriginals(originals);
195
-
196
- // Original methods stored successfully
197
- this.isInitialized = true;
198
- return true;
199
- }
200
-
201
- /**
202
- * Restore original AsyncStorage methods to their unmodified state
203
- *
204
- * This method undoes the method swizzling by restoring the original
205
- * AsyncStorage methods that were saved during initialization.
206
- */
207
- restoreOriginalMethods() {
208
- if (!AsyncStorage || !this.originalSetItem) {
209
- return;
210
- }
211
- AsyncStorage.setItem = this.originalSetItem;
212
- if (this.originalRemoveItem) {
213
- AsyncStorage.removeItem = this.originalRemoveItem;
214
- }
215
- if (this.originalClear) {
216
- AsyncStorage.clear = this.originalClear;
217
- }
218
- // v2 batch + merge
219
- if (this.originalMergeItem) {
220
- AsyncStorage.mergeItem = this.originalMergeItem;
221
- }
222
- if (this.originalMultiSet) {
223
- AsyncStorage.multiSet = this.originalMultiSet;
224
- }
225
- if (this.originalMultiRemove) {
226
- AsyncStorage.multiRemove = this.originalMultiRemove;
227
- }
228
- if (this.originalMultiMerge) {
229
- AsyncStorage.multiMerge = this.originalMultiMerge;
230
- }
231
- // v3 batch
232
- if (this.originalSetMany) {
233
- AsyncStorage.setMany = this.originalSetMany;
234
- }
235
- if (this.originalRemoveMany) {
236
- AsyncStorage.removeMany = this.originalRemoveMany;
237
- }
238
- }
239
-
240
- /**
241
- * Emit an AsyncStorage event to all registered listeners
242
- *
243
- * @param event - The AsyncStorage event to emit
244
- *
245
- * @performance Skips processing when no listeners are registered or when paused
246
- */
247
- emit(event) {
248
- // Skip emitting if paused (used during time-travel operations)
249
- if (this.isPaused) {
250
- return;
251
- }
252
-
253
- // Skip emitting if there are no listeners
254
- if (this.listeners.length === 0) {
255
- return;
256
- }
257
- this.listeners.forEach(listener => {
258
- try {
259
- listener(event);
260
- } catch (error) {
261
- // Error in event listener - continuing with others
262
- }
263
- });
264
- }
265
-
266
- /**
267
- * Shared core for batch writes (v2 multiSet/multiMerge, v3 setMany).
268
- *
269
- * Captures previous values for the affected keys, runs the original native
270
- * operation, and emits a normalized event. `action` distinguishes a plain set
271
- * from a merge so time-travel can replay them differently.
272
- */
273
- async handleBatchSet(pairs, runOriginal, action = "multiSet") {
274
- // Filter out ignored keys
275
- const filteredPairs = pairs.filter(([key]) => !this.shouldIgnoreKey(key));
276
- if (filteredPairs.length === 0) {
277
- return runOriginal();
278
- }
279
-
280
- // Capture previous values for all keys being written
281
- const keysToSet = filteredPairs.map(([key]) => key);
282
- let prevPairs = [];
283
- try {
284
- prevPairs = await readMany(keysToSet);
285
- } catch {
286
- // Failed to capture previous values
287
- }
288
-
289
- // Execute the operation
290
- const result = await runOriginal();
291
-
292
- // Emit event with previous values
293
- this.emit({
294
- action,
295
- timestamp: new Date(),
296
- data: {
297
- pairs: filteredPairs,
298
- prevPairs
299
- }
300
- });
301
- return result;
302
- }
303
-
304
- /**
305
- * Shared core for batch removals (v2 multiRemove, v3 removeMany).
306
- */
307
- async handleBatchRemove(keys, runOriginal) {
308
- // Filter out ignored keys
309
- const filteredKeys = keys.filter(key => !this.shouldIgnoreKey(key));
310
- if (filteredKeys.length === 0) {
311
- return runOriginal();
312
- }
313
-
314
- // Capture previous values for all keys being removed
315
- let prevPairs = [];
316
- try {
317
- prevPairs = await readMany(filteredKeys);
318
- } catch {
319
- // Failed to capture previous values
320
- }
321
-
322
- // Execute the operation
323
- const result = await runOriginal();
324
-
325
- // Emit event with previous values
326
- this.emit({
327
- action: "multiRemove",
328
- timestamp: new Date(),
329
- data: {
330
- keys: filteredKeys,
331
- prevPairs
332
- }
333
- });
334
- return result;
335
- }
336
-
337
- /**
338
- * Start intercepting AsyncStorage operations by swizzling methods
339
- *
340
- * This method replaces all AsyncStorage methods with wrapped versions
341
- * that emit events while preserving the original functionality.
342
- *
343
- * @throws Will log errors if initialization fails or methods are already swizzled
344
- *
345
- * @performance Uses method swizzling for minimal runtime overhead
346
- * @performance Includes safety checks to prevent double-initialization
347
- */
348
- async startListening() {
349
- if (this.isListening) {
350
- return;
351
- }
352
- const initialized = await this.initialize();
353
- if (!initialized) {
354
- return;
355
- }
356
-
357
- // Check if methods are already swizzled (this can happen if initialize was called twice somehow)
358
- if (AsyncStorage && AsyncStorage.setItem.name === "swizzled_setItem") {
359
- this.restoreOriginalMethods();
360
- }
361
-
362
- // Starting to listen for AsyncStorage operations
363
-
364
- // Swizzle setItem
365
- const swizzled_setItem = async (key, value) => {
366
- // Only capture and emit if key is not ignored
367
- if (!this.shouldIgnoreKey(key)) {
368
- // Capture previous value before the operation
369
- const prevValue = this.originalSetItem ? await AsyncStorage.getItem(key) : null;
370
-
371
- // Execute the operation
372
- const result = this.originalSetItem ? await this.originalSetItem(key, value) : undefined;
373
-
374
- // Emit event with previous value
375
- this.emit({
376
- action: "setItem",
377
- timestamp: new Date(),
378
- data: {
379
- key,
380
- value,
381
- prevValue
382
- }
383
- });
384
- return result;
385
- }
386
- return this.originalSetItem ? this.originalSetItem(key, value) : Promise.resolve();
387
- };
388
- Object.defineProperty(swizzled_setItem, "name", {
389
- value: "swizzled_setItem"
390
- });
391
- if (AsyncStorage) {
392
- AsyncStorage.setItem = swizzled_setItem;
393
- }
394
-
395
- // Swizzle removeItem
396
- if (AsyncStorage) {
397
- AsyncStorage.removeItem = async key => {
398
- // Only capture and emit if key is not ignored
399
- if (!this.shouldIgnoreKey(key)) {
400
- // Capture previous value before the operation
401
- const prevValue = this.originalRemoveItem ? await AsyncStorage.getItem(key) : null;
402
-
403
- // Execute the operation
404
- const result = this.originalRemoveItem ? await this.originalRemoveItem(key) : undefined;
405
-
406
- // Emit event with previous value
407
- this.emit({
408
- action: "removeItem",
409
- timestamp: new Date(),
410
- data: {
411
- key,
412
- prevValue
413
- }
414
- });
415
- return result;
416
- }
417
- return this.originalRemoveItem ? this.originalRemoveItem(key) : Promise.resolve();
418
- };
419
- }
420
-
421
- // Swizzle mergeItem (v2 only — v3 removed the merge API)
422
- if (asyncStorageCaps.hasMergeApi && AsyncStorage) {
423
- AsyncStorage.mergeItem = async (key, value) => {
424
- // Only capture and emit if key is not ignored
425
- if (!this.shouldIgnoreKey(key)) {
426
- // Capture previous value before the operation
427
- const prevValue = this.originalMergeItem ? await AsyncStorage.getItem(key) : null;
428
-
429
- // Execute the operation
430
- const result = this.originalMergeItem ? await this.originalMergeItem(key, value) : undefined;
431
-
432
- // Emit event with previous value
433
- this.emit({
434
- action: "mergeItem",
435
- timestamp: new Date(),
436
- data: {
437
- key,
438
- value,
439
- prevValue
440
- }
441
- });
442
- return result;
443
- }
444
- return this.originalMergeItem ? this.originalMergeItem(key, value) : Promise.resolve();
445
- };
446
- }
447
-
448
- // Swizzle clear
449
- if (AsyncStorage) {
450
- AsyncStorage.clear = async () => {
451
- // Capture all key-value pairs before clearing
452
- let prevPairs = [];
453
- try {
454
- const allKeys = await AsyncStorage.getAllKeys();
455
- // Filter out ignored keys
456
- const keysToCapture = allKeys.filter(key => !this.shouldIgnoreKey(key));
457
- if (keysToCapture.length > 0) {
458
- prevPairs = await readMany(keysToCapture);
459
- }
460
- } catch {
461
- // Failed to capture previous state
462
- }
463
-
464
- // Execute the operation
465
- const result = this.originalClear ? await this.originalClear() : undefined;
466
-
467
- // Emit event with previous pairs
468
- this.emit({
469
- action: "clear",
470
- timestamp: new Date(),
471
- data: {
472
- prevPairs
473
- }
474
- });
475
- return result;
476
- };
477
- }
478
-
479
- // Swizzle the batch methods for whichever API the installed version exposes.
480
- if (asyncStorageCaps.hasLegacyMultiApi && AsyncStorage) {
481
- // ── v2: multiSet / multiRemove / multiMerge ──
482
- AsyncStorage.multiSet = keyValuePairs => this.handleBatchSet(keyValuePairs, () => this.originalMultiSet ? this.originalMultiSet(keyValuePairs) : Promise.resolve());
483
- AsyncStorage.multiRemove = keys => this.handleBatchRemove(keys, () => this.originalMultiRemove ? this.originalMultiRemove(keys) : Promise.resolve());
484
- if (this.originalMultiMerge) {
485
- AsyncStorage.multiMerge = keyValuePairs => this.handleBatchSet(keyValuePairs, () => this.originalMultiMerge ? this.originalMultiMerge(keyValuePairs) : Promise.resolve(), "multiMerge");
486
- }
487
- } else if (AsyncStorage) {
488
- // ── v3: setMany / removeMany (normalized back to multiSet/multiRemove events) ──
489
- AsyncStorage.setMany = entries => this.handleBatchSet(Object.entries(entries), () => this.originalSetMany ? this.originalSetMany(entries) : Promise.resolve());
490
- AsyncStorage.removeMany = keys => this.handleBatchRemove(keys, () => this.originalRemoveMany ? this.originalRemoveMany(keys) : Promise.resolve());
491
- }
492
- this.isListening = true;
493
- // Started listening successfully
494
- }
495
-
496
- /**
497
- * Stop listening and restore original AsyncStorage methods
498
- *
499
- * This method undoes all method swizzling and restores AsyncStorage
500
- * to its original state.
501
- */
502
- stopListening() {
503
- if (!this.isListening) {
504
- return;
505
- }
506
- if (!AsyncStorage) {
507
- return;
508
- }
509
-
510
- // Stopping listener and restoring original methods
511
- this.restoreOriginalMethods();
512
- this.isListening = false;
513
- // Stopped listening successfully
514
- }
515
-
516
- /**
517
- * Add a listener for AsyncStorage events
518
- *
519
- * @param listener - Callback function to handle AsyncStorage events
520
- * @returns Unsubscribe function to remove the listener
521
- *
522
- * @example
523
- * ```typescript
524
- * const unsubscribe = asyncStorageListener.addListener((event) => {
525
- * console.log('Storage operation:', event.action, event.data);
526
- * });
527
- *
528
- * // Later, remove the listener
529
- * unsubscribe();
530
- * ```
531
- */
532
- addListener(listener) {
533
- this.listeners.push(listener);
534
-
535
- // Return unsubscribe function
536
- return () => {
537
- const index = this.listeners.indexOf(listener);
538
- if (index > -1) {
539
- this.listeners.splice(index, 1);
540
- }
541
- };
542
- }
543
-
544
- /**
545
- * Remove all registered event listeners
546
- *
547
- * Clears the internal listeners array, stopping all event notifications.
548
- */
549
- removeAllListeners() {
550
- this.listeners = [];
551
- // Removed all listeners
552
- }
553
-
554
- /**
555
- * Check if the listener is currently active and intercepting operations
556
- *
557
- * @returns True if currently listening to AsyncStorage operations
558
- */
559
- get isActive() {
560
- return this.isListening;
561
- }
562
-
563
- /**
564
- * Get the number of currently registered event listeners
565
- *
566
- * @returns Number of active listeners
567
- */
568
- get listenerCount() {
569
- return this.listeners.length;
570
- }
571
-
572
- /**
573
- * Pause event emission (used during time-travel operations)
574
- *
575
- * When paused, storage operations still execute but events are not emitted.
576
- * This prevents circular event triggering during replay/jump operations.
577
- */
578
- pause() {
579
- this.isPaused = true;
580
- }
581
-
582
- /**
583
- * Resume event emission after pausing
584
- */
585
- resume() {
586
- this.isPaused = false;
587
- }
588
-
589
- /**
590
- * Check if event emission is currently paused
591
- *
592
- * @returns True if paused, false otherwise
593
- */
594
- get paused() {
595
- return this.isPaused;
596
- }
597
- }
598
-
599
- /**
600
- * Singleton instance of AsyncStorageListener
601
- *
602
- * This ensures only one listener instance exists across the entire application,
603
- * preventing conflicts and duplicate event handling.
604
- */
605
- const asyncStorageListener = new AsyncStorageListener();
606
-
607
- /**
608
- * Start listening to AsyncStorage operations
609
- *
610
- * @returns Promise that resolves when listening starts successfully
611
- */
612
- export const startListening = () => asyncStorageListener.startListening();
613
-
614
- /**
615
- * Stop listening to AsyncStorage operations
616
- */
617
- export const stopListening = () => asyncStorageListener.stopListening();
618
-
619
- /**
620
- * Add an event listener for AsyncStorage operations
621
- *
622
- * @param listener - Callback function to handle events
623
- * @returns Unsubscribe function to remove the listener
624
- */
625
- export const addListener = listener => asyncStorageListener.addListener(listener);
626
-
627
- /**
628
- * Remove all registered event listeners
629
- */
630
- export const removeAllListeners = () => asyncStorageListener.removeAllListeners();
631
-
632
- /**
633
- * Check if currently listening to AsyncStorage operations
634
- *
635
- * @returns True if actively intercepting AsyncStorage methods
636
- */
637
- export const isListening = () => asyncStorageListener.isActive;
638
-
639
- /**
640
- * Get the current number of registered event listeners
641
- *
642
- * @returns Number of active listeners
643
- */
644
- export const getListenerCount = () => asyncStorageListener.listenerCount;
645
-
646
- /**
647
- * Pause event emission (used during time-travel operations)
648
- *
649
- * When paused, storage operations still execute but events are not emitted.
650
- * This prevents circular event triggering during replay/jump operations.
651
- */
652
- export const pauseCapture = () => asyncStorageListener.pause();
653
-
654
- /**
655
- * Resume event emission after pausing
656
- */
657
- export const resumeCapture = () => asyncStorageListener.resume();
658
-
659
- /**
660
- * Check if event emission is currently paused
661
- *
662
- * @returns True if paused, false otherwise
663
- */
664
- export const isPaused = () => asyncStorageListener.paused;
665
-
666
- /**
667
- * Export the singleton instance for advanced usage
668
- *
669
- * @example
670
- * ```typescript
671
- * import asyncStorageListener from './AsyncStorageListener';
672
- *
673
- * // Access advanced methods directly
674
- * if (asyncStorageListener.isActive) {
675
- * console.log(`${asyncStorageListener.listenerCount} listeners active`);
676
- * }
677
- * ```
678
- */
679
- export default asyncStorageListener;
1
+ "use strict";import{asyncStorage as e,asyncStorageCaps as u,readMany as h}from"./asyncStorageCompat";const c=Symbol.for("@buoy-gg/storage.asyncStorageOriginals");function d(){return globalThis[c]??null}function M(o){globalThis[c]=o}class I{listeners=[];isListening=false;isInitialized=false;isPaused=false;ignoredKeys=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]);originalSetItem=null;originalRemoveItem=null;originalMergeItem=null;originalClear=null;originalMultiSet=null;originalMultiRemove=null;originalMultiMerge=null;originalSetMany=null;originalRemoveMany=null;shouldIgnoreKey(i){if(this.ignoredKeys.has(i))return true;for(const s of this.ignoredKeys){if(i.startsWith(s))return true}return false}adoptOriginals(i){this.originalSetItem=i.setItem;this.originalRemoveItem=i.removeItem;this.originalClear=i.clear;this.originalMergeItem=i.mergeItem;this.originalMultiSet=i.multiSet;this.originalMultiRemove=i.multiRemove;this.originalMultiMerge=i.multiMerge;this.originalSetMany=i.setMany;this.originalRemoveMany=i.removeMany}async initialize(){if(this.isInitialized){return true}if(e.setItem.name==="swizzled_setItem"){const s=d();if(!s){return false}this.adoptOriginals(s);this.isInitialized=true;return true}const i={setItem:e.setItem.bind(e),removeItem:e.removeItem.bind(e),clear:e.clear.bind(e),mergeItem:null,multiSet:null,multiRemove:null,multiMerge:null,setMany:null,removeMany:null};if(u.hasLegacyMultiApi){i.multiSet=e.multiSet.bind(e);i.multiRemove=e.multiRemove.bind(e);i.mergeItem=e.mergeItem.bind(e);i.multiMerge=e.multiMerge?e.multiMerge.bind(e):null}else{i.setMany=e.setMany.bind(e);i.removeMany=e.removeMany.bind(e)}M(i);this.adoptOriginals(i);this.isInitialized=true;return true}restoreOriginalMethods(){if(!e||!this.originalSetItem){return}e.setItem=this.originalSetItem;if(this.originalRemoveItem){e.removeItem=this.originalRemoveItem}if(this.originalClear){e.clear=this.originalClear}if(this.originalMergeItem){e.mergeItem=this.originalMergeItem}if(this.originalMultiSet){e.multiSet=this.originalMultiSet}if(this.originalMultiRemove){e.multiRemove=this.originalMultiRemove}if(this.originalMultiMerge){e.multiMerge=this.originalMultiMerge}if(this.originalSetMany){e.setMany=this.originalSetMany}if(this.originalRemoveMany){e.removeMany=this.originalRemoveMany}}emit(i){if(this.isPaused){return}if(this.listeners.length===0){return}this.listeners.forEach(s=>{try{s(i)}catch(t){}})}async handleBatchSet(i,s,t="multiSet"){const r=i.filter(([g])=>!this.shouldIgnoreKey(g));if(r.length===0){return s()}const n=r.map(([g])=>g);let a=[];try{a=await h(n)}catch{}const m=await s();this.emit({action:t,timestamp:new Date,data:{pairs:r,prevPairs:a}});return m}async handleBatchRemove(i,s){const t=i.filter(a=>!this.shouldIgnoreKey(a));if(t.length===0){return s()}let r=[];try{r=await h(t)}catch{}const n=await s();this.emit({action:"multiRemove",timestamp:new Date,data:{keys:t,prevPairs:r}});return n}async startListening(){if(this.isListening){return}const i=await this.initialize();if(!i){return}if(e&&e.setItem.name==="swizzled_setItem"){this.restoreOriginalMethods()}const s=async(t,r)=>{if(!this.shouldIgnoreKey(t)){const n=this.originalSetItem?await e.getItem(t):null;const a=this.originalSetItem?await this.originalSetItem(t,r):void 0;this.emit({action:"setItem",timestamp:new Date,data:{key:t,value:r,prevValue:n}});return a}return this.originalSetItem?this.originalSetItem(t,r):Promise.resolve()};Object.defineProperty(s,"name",{value:"swizzled_setItem"});if(e){e.setItem=s}if(e){e.removeItem=async t=>{if(!this.shouldIgnoreKey(t)){const r=this.originalRemoveItem?await e.getItem(t):null;const n=this.originalRemoveItem?await this.originalRemoveItem(t):void 0;this.emit({action:"removeItem",timestamp:new Date,data:{key:t,prevValue:r}});return n}return this.originalRemoveItem?this.originalRemoveItem(t):Promise.resolve()}}if(u.hasMergeApi&&e){e.mergeItem=async(t,r)=>{if(!this.shouldIgnoreKey(t)){const n=this.originalMergeItem?await e.getItem(t):null;const a=this.originalMergeItem?await this.originalMergeItem(t,r):void 0;this.emit({action:"mergeItem",timestamp:new Date,data:{key:t,value:r,prevValue:n}});return a}return this.originalMergeItem?this.originalMergeItem(t,r):Promise.resolve()}}if(e){e.clear=async()=>{let t=[];try{const n=await e.getAllKeys();const a=n.filter(m=>!this.shouldIgnoreKey(m));if(a.length>0){t=await h(a)}}catch{}const r=this.originalClear?await this.originalClear():void 0;this.emit({action:"clear",timestamp:new Date,data:{prevPairs:t}});return r}}if(u.hasLegacyMultiApi&&e){e.multiSet=t=>this.handleBatchSet(t,()=>this.originalMultiSet?this.originalMultiSet(t):Promise.resolve());e.multiRemove=t=>this.handleBatchRemove(t,()=>this.originalMultiRemove?this.originalMultiRemove(t):Promise.resolve());if(this.originalMultiMerge){e.multiMerge=t=>this.handleBatchSet(t,()=>this.originalMultiMerge?this.originalMultiMerge(t):Promise.resolve(),"multiMerge")}}else if(e){e.setMany=t=>this.handleBatchSet(Object.entries(t),()=>this.originalSetMany?this.originalSetMany(t):Promise.resolve());e.removeMany=t=>this.handleBatchRemove(t,()=>this.originalRemoveMany?this.originalRemoveMany(t):Promise.resolve())}this.isListening=true}stopListening(){if(!this.isListening){return}if(!e){return}this.restoreOriginalMethods();this.isListening=false}addListener(i){this.listeners.push(i);return()=>{const s=this.listeners.indexOf(i);if(s>-1){this.listeners.splice(s,1)}}}removeAllListeners(){this.listeners=[]}get isActive(){return this.isListening}get listenerCount(){return this.listeners.length}pause(){this.isPaused=true}resume(){this.isPaused=false}get paused(){return this.isPaused}}const l=new I;export const startListening=()=>l.startListening();export const stopListening=()=>l.stopListening();export const addListener=o=>l.addListener(o);export const removeAllListeners=()=>l.removeAllListeners();export const isListening=()=>l.isActive;export const getListenerCount=()=>l.listenerCount;export const pauseCapture=()=>l.pause();export const resumeCapture=()=>l.resume();export const isPaused=()=>l.paused;export default l;
@@ -0,0 +1 @@
1
+ "use strict";import{subscribeToBrowserStorage as f}from"@buoy-gg/shared-ui/utils";const t=new Set;let r;let n=false;const p=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]);const u=e=>[...p].some(i=>e.startsWith(i));export async function startListening(){if(r||typeof window==="undefined")return;r=f(e=>{if(n||e.area!=="localStorage"||e.key!==void 0&&u(e.key))return;const{area:i,action:a,...s}=e;if(s.prevPairs)s.prevPairs=s.prevPairs.filter(([o])=>!u(o));const c={action:a,data:s,timestamp:new Date};for(const o of[...t]){try{o(c)}catch{}}})}export function stopListening(){r?.();r=void 0}export function addListener(e){t.add(e);return()=>{t.delete(e)}}export function removeAllListeners(){t.clear()}export function isListening(){return!!r}export function getListenerCount(){return t.size}export function pauseCapture(){n=true}export function resumeCapture(){n=false}export function isPaused(){return n}const d={startListening,stopListening,addListener,removeAllListeners,pause:pauseCapture,resume:resumeCapture,get isActive(){return isListening()},get listenerCount(){return t.size},get paused(){return n}};export default d;