@buoy-gg/time-machine 7.0.17

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 (60) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +55 -0
  3. package/lib/commonjs/components/TimeMachineBody.js +420 -0
  4. package/lib/commonjs/components/TimeMachineBody.js.map +1 -0
  5. package/lib/commonjs/components/TimeMachineModal.js +74 -0
  6. package/lib/commonjs/components/TimeMachineModal.js.map +1 -0
  7. package/lib/commonjs/hooks/useTimeMachine.js +24 -0
  8. package/lib/commonjs/hooks/useTimeMachine.js.map +1 -0
  9. package/lib/commonjs/index.js +64 -0
  10. package/lib/commonjs/index.js.map +1 -0
  11. package/lib/commonjs/package.json +1 -0
  12. package/lib/commonjs/preset.js +45 -0
  13. package/lib/commonjs/preset.js.map +1 -0
  14. package/lib/commonjs/store/snapshotVault.js +83 -0
  15. package/lib/commonjs/store/snapshotVault.js.map +1 -0
  16. package/lib/commonjs/store/timeMachineStore.js +335 -0
  17. package/lib/commonjs/store/timeMachineStore.js.map +1 -0
  18. package/lib/commonjs/sync/timeMachineSyncAdapter.js +139 -0
  19. package/lib/commonjs/sync/timeMachineSyncAdapter.js.map +1 -0
  20. package/lib/module/components/TimeMachineBody.js +415 -0
  21. package/lib/module/components/TimeMachineBody.js.map +1 -0
  22. package/lib/module/components/TimeMachineModal.js +68 -0
  23. package/lib/module/components/TimeMachineModal.js.map +1 -0
  24. package/lib/module/hooks/useTimeMachine.js +19 -0
  25. package/lib/module/hooks/useTimeMachine.js.map +1 -0
  26. package/lib/module/index.js +29 -0
  27. package/lib/module/index.js.map +1 -0
  28. package/lib/module/preset.js +40 -0
  29. package/lib/module/preset.js.map +1 -0
  30. package/lib/module/store/snapshotVault.js +74 -0
  31. package/lib/module/store/snapshotVault.js.map +1 -0
  32. package/lib/module/store/timeMachineStore.js +327 -0
  33. package/lib/module/store/timeMachineStore.js.map +1 -0
  34. package/lib/module/sync/timeMachineSyncAdapter.js +134 -0
  35. package/lib/module/sync/timeMachineSyncAdapter.js.map +1 -0
  36. package/lib/typescript/components/TimeMachineBody.d.ts +2 -0
  37. package/lib/typescript/components/TimeMachineBody.d.ts.map +1 -0
  38. package/lib/typescript/components/TimeMachineModal.d.ts +12 -0
  39. package/lib/typescript/components/TimeMachineModal.d.ts.map +1 -0
  40. package/lib/typescript/hooks/useTimeMachine.d.ts +6 -0
  41. package/lib/typescript/hooks/useTimeMachine.d.ts.map +1 -0
  42. package/lib/typescript/index.d.ts +18 -0
  43. package/lib/typescript/index.d.ts.map +1 -0
  44. package/lib/typescript/preset.d.ts +38 -0
  45. package/lib/typescript/preset.d.ts.map +1 -0
  46. package/lib/typescript/store/snapshotVault.d.ts +46 -0
  47. package/lib/typescript/store/snapshotVault.d.ts.map +1 -0
  48. package/lib/typescript/store/timeMachineStore.d.ts +97 -0
  49. package/lib/typescript/store/timeMachineStore.d.ts.map +1 -0
  50. package/lib/typescript/sync/timeMachineSyncAdapter.d.ts +59 -0
  51. package/lib/typescript/sync/timeMachineSyncAdapter.d.ts.map +1 -0
  52. package/package.json +59 -0
  53. package/src/components/TimeMachineBody.tsx +455 -0
  54. package/src/components/TimeMachineModal.tsx +75 -0
  55. package/src/hooks/useTimeMachine.ts +26 -0
  56. package/src/index.tsx +45 -0
  57. package/src/preset.tsx +38 -0
  58. package/src/store/snapshotVault.ts +117 -0
  59. package/src/store/timeMachineStore.ts +368 -0
  60. package/src/sync/timeMachineSyncAdapter.ts +128 -0
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "RESTORE_ORDER", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _timeMachineStore.RESTORE_ORDER;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "TimeMachineModal", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _TimeMachineModal.TimeMachineModal;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "TimeMachineToolView", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _TimeMachineModal.TimeMachineToolView;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "createTimeMachineTool", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _preset.createTimeMachineTool;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "replaceTimeMachineFromSnapshot", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _timeMachineStore.replaceTimeMachineFromSnapshot;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "setRemoteTimeMachineHandler", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _timeMachineStore.setRemoteTimeMachineHandler;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "timeMachineStore", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _timeMachineStore.timeMachineStore;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "timeMachineSyncAdapter", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _timeMachineSyncAdapter.timeMachineSyncAdapter;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "timeMachineToolPreset", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _preset.timeMachineToolPreset;
58
+ }
59
+ });
60
+ var _preset = require("./preset");
61
+ var _TimeMachineModal = require("./components/TimeMachineModal");
62
+ var _timeMachineSyncAdapter = require("./sync/timeMachineSyncAdapter");
63
+ var _timeMachineStore = require("./store/timeMachineStore");
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_preset","require","_TimeMachineModal","_timeMachineSyncAdapter","_timeMachineStore"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAAA,OAAA,GAAAC,OAAA;AAGA,IAAAC,iBAAA,GAAAD,OAAA;AAOA,IAAAE,uBAAA,GAAAF,OAAA;AAGA,IAAAG,iBAAA,GAAAH,OAAA","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createTimeMachineTool = createTimeMachineTool;
7
+ exports.timeMachineToolPreset = void 0;
8
+ var _sharedUi = require("@buoy-gg/shared-ui");
9
+ var _TimeMachineModal = require("./components/TimeMachineModal");
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
+ /**
12
+ * Pre-configured Time Machine tool for FloatingDevTools.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * import { timeMachineToolPreset } from '@buoy-gg/time-machine';
17
+ *
18
+ * <FloatingDevTools apps={[timeMachineToolPreset]} />
19
+ * ```
20
+ */
21
+
22
+ const timeMachineToolPreset = exports.timeMachineToolPreset = {
23
+ id: "time-machine",
24
+ name: "TIME MACHINE",
25
+ description: "Snapshot & restore app state (storage, stores, query cache)",
26
+ slot: "both",
27
+ icon: ({
28
+ size,
29
+ color
30
+ }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TimeMachineIcon, {
31
+ size: size,
32
+ color: color || _sharedUi.TIME_MACHINE_ICON_COLOR
33
+ }),
34
+ component: _TimeMachineModal.TimeMachineModal
35
+ };
36
+
37
+ /** Create a custom Time Machine tool configuration. */
38
+ function createTimeMachineTool(options = {}) {
39
+ return {
40
+ ...timeMachineToolPreset,
41
+ name: options.name ?? timeMachineToolPreset.name,
42
+ description: options.description ?? timeMachineToolPreset.description
43
+ };
44
+ }
45
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_sharedUi","require","_TimeMachineModal","_jsxRuntime","timeMachineToolPreset","exports","id","name","description","slot","icon","size","color","jsx","TimeMachineIcon","TIME_MACHINE_ICON_COLOR","component","TimeMachineModal","createTimeMachineTool","options"],"sourceRoot":"../../src","sources":["preset.tsx"],"mappings":";;;;;;;AAWA,IAAAA,SAAA,GAAAC,OAAA;AAIA,IAAAC,iBAAA,GAAAD,OAAA;AAAiE,IAAAE,WAAA,GAAAF,OAAA;AAfjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQO,MAAMG,qBAAqB,GAAAC,OAAA,CAAAD,qBAAA,GAAG;EACnCE,EAAE,EAAE,cAAc;EAClBC,IAAI,EAAE,cAAc;EACpBC,WAAW,EAAE,6DAA6D;EAC1EC,IAAI,EAAE,MAAe;EACrBC,IAAI,EAAEA,CAAC;IAAEC,IAAI;IAAEC;EAAwC,CAAC,kBACtD,IAAAT,WAAA,CAAAU,GAAA,EAACb,SAAA,CAAAc,eAAe;IAACH,IAAI,EAAEA,IAAK;IAACC,KAAK,EAAEA,KAAK,IAAIG;EAAwB,CAAE,CACxE;EACDC,SAAS,EAAEC;AACb,CAAC;;AAED;AACO,SAASC,qBAAqBA,CACnCC,OAAgD,GAAG,CAAC,CAAC,EACrD;EACA,OAAO;IACL,GAAGf,qBAAqB;IACxBG,IAAI,EAAEY,OAAO,CAACZ,IAAI,IAAIH,qBAAqB,CAACG,IAAI;IAChDC,WAAW,EAAEW,OAAO,CAACX,WAAW,IAAIJ,qBAAqB,CAACI;EAC5D,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.deleteSnapshot = deleteSnapshot;
7
+ exports.loadIndex = loadIndex;
8
+ exports.loadSnapshot = loadSnapshot;
9
+ exports.renameSnapshot = renameSnapshot;
10
+ exports.saveSnapshot = saveSnapshot;
11
+ var _sharedUi = require("@buoy-gg/shared-ui");
12
+ /**
13
+ * Snapshot persistence for Time Machine.
14
+ *
15
+ * Snapshots live ON-DEVICE in persistentStorage (FileSystem → AsyncStorage →
16
+ * localStorage → Memory fallback): no size caps, survives restarts, and never
17
+ * crosses the 2MB external-sync snapshot budget — only metadata does.
18
+ *
19
+ * Layout: ONE storage key per snapshot (persistentStorage's FileSystem
20
+ * backend writes one file per key, and its multiGet is sequential — a single
21
+ * big key beats many small ones), plus one index key holding the metadata
22
+ * list for cheap listing.
23
+ *
24
+ * Keys use the `@react_buoy` family so every tool's isDevToolsStorageKey
25
+ * filter (including our own storage provider) excludes the vault itself from
26
+ * snapshots — a snapshot must never contain snapshots.
27
+ */
28
+
29
+ const INDEX_KEY = "@react_buoy_time_machine:index";
30
+ const SNAP_PREFIX = "@react_buoy_time_machine:snap:";
31
+ async function loadIndex() {
32
+ try {
33
+ const raw = await _sharedUi.persistentStorage.getItem(INDEX_KEY);
34
+ if (!raw) return [];
35
+ const parsed = JSON.parse(raw);
36
+ return Array.isArray(parsed) ? parsed : [];
37
+ } catch {
38
+ return [];
39
+ }
40
+ }
41
+ async function saveIndex(metas) {
42
+ await _sharedUi.persistentStorage.setItem(INDEX_KEY, JSON.stringify(metas));
43
+ }
44
+
45
+ /** Persists the snapshot, stamps meta.sizeBytes, and updates the index. */
46
+ async function saveSnapshot(snapshot, metas) {
47
+ const serialized = JSON.stringify(snapshot);
48
+ snapshot.meta.sizeBytes = serialized.length;
49
+ await _sharedUi.persistentStorage.setItem(SNAP_PREFIX + snapshot.meta.id,
50
+ // Re-stringify so the persisted copy carries the final sizeBytes.
51
+ JSON.stringify(snapshot));
52
+ const next = [snapshot.meta, ...metas.filter(m => m.id !== snapshot.meta.id)];
53
+ await saveIndex(next);
54
+ return next;
55
+ }
56
+ async function loadSnapshot(id) {
57
+ try {
58
+ const raw = await _sharedUi.persistentStorage.getItem(SNAP_PREFIX + id);
59
+ return raw ? JSON.parse(raw) : null;
60
+ } catch {
61
+ return null;
62
+ }
63
+ }
64
+ async function deleteSnapshot(id, metas) {
65
+ await _sharedUi.persistentStorage.removeItem(SNAP_PREFIX + id);
66
+ const next = metas.filter(m => m.id !== id);
67
+ await saveIndex(next);
68
+ return next;
69
+ }
70
+ async function renameSnapshot(id, name, metas) {
71
+ const next = metas.map(m => m.id === id ? {
72
+ ...m,
73
+ name
74
+ } : m);
75
+ await saveIndex(next);
76
+ const stored = await loadSnapshot(id);
77
+ if (stored) {
78
+ stored.meta.name = name;
79
+ await _sharedUi.persistentStorage.setItem(SNAP_PREFIX + id, JSON.stringify(stored));
80
+ }
81
+ return next;
82
+ }
83
+ //# sourceMappingURL=snapshotVault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_sharedUi","require","INDEX_KEY","SNAP_PREFIX","loadIndex","raw","persistentStorage","getItem","parsed","JSON","parse","Array","isArray","saveIndex","metas","setItem","stringify","saveSnapshot","snapshot","serialized","meta","sizeBytes","length","id","next","filter","m","loadSnapshot","deleteSnapshot","removeItem","renameSnapshot","name","map","stored"],"sourceRoot":"../../../src","sources":["store/snapshotVault.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,335 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RESTORE_ORDER = void 0;
7
+ exports.replaceTimeMachineFromSnapshot = replaceTimeMachineFromSnapshot;
8
+ exports.setRemoteTimeMachineHandler = setRemoteTimeMachineHandler;
9
+ exports.timeMachineStore = void 0;
10
+ var _sharedUi = require("@buoy-gg/shared-ui");
11
+ var _snapshotVault = require("./snapshotVault");
12
+ /**
13
+ * Time Machine orchestrator — snapshot CRUD + capture/restore across every
14
+ * registered StateSnapshotProvider (storage, redux, zustand, jotai, query,
15
+ * plus any custom providers the app registers).
16
+ *
17
+ * Restore ordering is fixed: persisted storage FIRST (so store persist
18
+ * middleware writing through after an in-memory restore converges with what
19
+ * we just wrote), then redux → zustand → jotai, query LAST (restored queries
20
+ * may derive from store state). Custom providers run after, in data order.
21
+ *
22
+ * Two restore modes:
23
+ * - "live": in-place state replacement, capability-gated per source.
24
+ * - "reload": restore ONLY persisted storage, then reload the JS bundle —
25
+ * in-memory stores rebuild themselves from the restored storage.
26
+ * Baseline snapshots always use this path (clear + reload).
27
+ */
28
+
29
+ const RESTORE_ORDER = exports.RESTORE_ORDER = ["storage", "redux", "zustand", "jotai", "query"];
30
+
31
+ /** Provider capability row as mirrored to a remote dashboard. */
32
+
33
+ let remoteHandler = null;
34
+ function skippedResult(reason) {
35
+ return {
36
+ ok: false,
37
+ applied: 0,
38
+ skipped: [{
39
+ id: "*",
40
+ reason
41
+ }],
42
+ warnings: []
43
+ };
44
+ }
45
+ let idCounter = 0;
46
+ function nextId() {
47
+ idCounter += 1;
48
+ return `snap_${Date.now().toString(36)}_${idCounter.toString(36)}`;
49
+ }
50
+ class TimeMachineStore {
51
+ state = {
52
+ snapshots: [],
53
+ hasLoaded: false,
54
+ busy: null,
55
+ lastOutcome: null,
56
+ remoteProviders: null
57
+ };
58
+ listeners = new Set();
59
+ loadPromise = null;
60
+ getState() {
61
+ return this.state;
62
+ }
63
+ subscribe = listener => {
64
+ this.listeners.add(listener);
65
+ void this.ensureLoaded();
66
+ return () => {
67
+ this.listeners.delete(listener);
68
+ };
69
+ };
70
+ setState(patch) {
71
+ this.state = {
72
+ ...this.state,
73
+ ...patch
74
+ };
75
+ this.listeners.forEach(l => {
76
+ try {
77
+ l();
78
+ } catch {
79
+ // listener errors must not break the store
80
+ }
81
+ });
82
+ }
83
+ ensureLoaded() {
84
+ if (remoteHandler) return Promise.resolve(); // mirror mode — device owns the vault
85
+ if (!this.loadPromise) {
86
+ this.loadPromise = (0, _snapshotVault.loadIndex)().then(snapshots => {
87
+ if (remoteHandler) return;
88
+ this.setState({
89
+ snapshots,
90
+ hasLoaded: true
91
+ });
92
+ });
93
+ }
94
+ return this.loadPromise;
95
+ }
96
+
97
+ /** @internal Buoy Desktop: mirror the device's synced metadata payload. */
98
+ replaceFromSnapshot(payload) {
99
+ this.setState({
100
+ snapshots: payload.snapshots ?? [],
101
+ busy: payload.busy ?? null,
102
+ lastOutcome: payload.lastOutcome ?? null,
103
+ remoteProviders: payload.providers ?? [],
104
+ hasLoaded: true
105
+ });
106
+ }
107
+
108
+ /** Capture all capturable sources (or a subset) into a named snapshot. */
109
+ async capture(name, sourceIds) {
110
+ if (remoteHandler) {
111
+ const result = await remoteHandler("capture", {
112
+ name,
113
+ sourceIds
114
+ });
115
+ return result.snapshot;
116
+ }
117
+ await this.ensureLoaded();
118
+ this.setState({
119
+ busy: "capture"
120
+ });
121
+ try {
122
+ const providers = (0, _sharedUi.getStateSnapshotProviders)().filter(p => p.status().canCapture && (!sourceIds || sourceIds.includes(p.id)));
123
+ const data = {};
124
+ const sources = {};
125
+ for (const provider of providers) {
126
+ try {
127
+ const captured = await provider.capture();
128
+ data[provider.id] = (0, _sharedUi.superJsonSerialize)(captured.data);
129
+ sources[provider.id] = {
130
+ warnings: captured.warnings
131
+ };
132
+ } catch (e) {
133
+ sources[provider.id] = {
134
+ warnings: [`capture failed: ${String(e)}`]
135
+ };
136
+ }
137
+ }
138
+ const snapshot = {
139
+ meta: {
140
+ id: nextId(),
141
+ name: name.trim() || "Untitled snapshot",
142
+ createdAt: Date.now(),
143
+ sizeBytes: 0,
144
+ sources
145
+ },
146
+ data
147
+ };
148
+ const snapshots = await (0, _snapshotVault.saveSnapshot)(snapshot, this.state.snapshots);
149
+ this.setState({
150
+ snapshots
151
+ });
152
+ return snapshot.meta;
153
+ } finally {
154
+ this.setState({
155
+ busy: null
156
+ });
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Capture the fresh-install baseline: an EMPTY snapshot whose restore
162
+ * wipes app state (clear + reload) — regardless of what state the app is
163
+ * in when the button is pressed.
164
+ */
165
+ async captureBaseline() {
166
+ if (remoteHandler) {
167
+ const result = await remoteHandler("captureBaseline", {});
168
+ return result.snapshot;
169
+ }
170
+ await this.ensureLoaded();
171
+ const snapshot = {
172
+ meta: {
173
+ id: nextId(),
174
+ name: "Fresh install",
175
+ createdAt: Date.now(),
176
+ sizeBytes: 0,
177
+ baseline: true,
178
+ sources: {}
179
+ },
180
+ data: {}
181
+ };
182
+ const snapshots = await (0, _snapshotVault.saveSnapshot)(snapshot, this.state.snapshots);
183
+ this.setState({
184
+ snapshots
185
+ });
186
+ return snapshot.meta;
187
+ }
188
+ async restore(id, mode) {
189
+ if (remoteHandler) {
190
+ const outcome = await remoteHandler("restore", {
191
+ id,
192
+ mode
193
+ });
194
+ this.setState({
195
+ lastOutcome: outcome
196
+ });
197
+ return outcome;
198
+ }
199
+ await this.ensureLoaded();
200
+ this.setState({
201
+ busy: "restore"
202
+ });
203
+ try {
204
+ const stored = await (0, _snapshotVault.loadSnapshot)(id);
205
+ if (!stored) throw new Error(`No snapshot with id "${id}"`);
206
+ const outcome = {
207
+ snapshotId: id,
208
+ snapshotName: stored.meta.name,
209
+ mode,
210
+ at: Date.now(),
211
+ willReload: false,
212
+ results: {}
213
+ };
214
+ if (stored.meta.baseline) {
215
+ // Fresh install: wipe every clearable source, then reload so all
216
+ // in-memory state rebuilds from nothing.
217
+ for (const provider of (0, _sharedUi.getStateSnapshotProviders)()) {
218
+ if (provider.clear) {
219
+ try {
220
+ outcome.results[provider.id] = await provider.clear();
221
+ } catch (e) {
222
+ outcome.results[provider.id] = skippedResult(String(e));
223
+ }
224
+ }
225
+ }
226
+ outcome.willReload = this.scheduleReload("buoy time-machine baseline");
227
+ this.setState({
228
+ lastOutcome: outcome
229
+ });
230
+ return outcome;
231
+ }
232
+ const sourceIds = [...RESTORE_ORDER.filter(sid => sid in stored.data), ...Object.keys(stored.data).filter(sid => !RESTORE_ORDER.includes(sid))];
233
+ if (mode === "reload") {
234
+ // Storage only; everything in-memory rebuilds after the reload.
235
+ if (stored.data.storage) {
236
+ outcome.results.storage = await this.restoreSource("storage", stored.data.storage);
237
+ }
238
+ outcome.willReload = this.scheduleReload("buoy time-machine restore");
239
+ this.setState({
240
+ lastOutcome: outcome
241
+ });
242
+ return outcome;
243
+ }
244
+ for (const sid of sourceIds) {
245
+ outcome.results[sid] = await this.restoreSource(sid, stored.data[sid]);
246
+ }
247
+ this.setState({
248
+ lastOutcome: outcome
249
+ });
250
+ return outcome;
251
+ } finally {
252
+ this.setState({
253
+ busy: null
254
+ });
255
+ }
256
+ }
257
+ async restoreSource(sourceId, payload) {
258
+ const provider = (0, _sharedUi.getStateSnapshotProvider)(sourceId);
259
+ if (!provider) {
260
+ return skippedResult("provider not available (package missing or not initialized)");
261
+ }
262
+ const status = provider.status();
263
+ if (!status.canRestore) {
264
+ return skippedResult(status.detail ?? "restore unavailable");
265
+ }
266
+ try {
267
+ return await provider.restore((0, _sharedUi.superJsonDeserialize)(payload));
268
+ } catch (e) {
269
+ return skippedResult(String(e));
270
+ }
271
+ }
272
+ scheduleReload(reason) {
273
+ try {
274
+ (0, _sharedUi.scheduleReloadApp)({
275
+ reason
276
+ });
277
+ return true;
278
+ } catch {
279
+ // No reload mechanism (bare production build?) — restore still stands.
280
+ return false;
281
+ }
282
+ }
283
+ async delete(id) {
284
+ if (remoteHandler) {
285
+ await remoteHandler("delete", {
286
+ id
287
+ });
288
+ return;
289
+ }
290
+ await this.ensureLoaded();
291
+ const snapshots = await (0, _snapshotVault.deleteSnapshot)(id, this.state.snapshots);
292
+ this.setState({
293
+ snapshots
294
+ });
295
+ }
296
+ async rename(id, name) {
297
+ if (remoteHandler) {
298
+ await remoteHandler("rename", {
299
+ id,
300
+ name
301
+ });
302
+ return;
303
+ }
304
+ await this.ensureLoaded();
305
+ const snapshots = await (0, _snapshotVault.renameSnapshot)(id, name, this.state.snapshots);
306
+ this.setState({
307
+ snapshots
308
+ });
309
+ }
310
+ clearLastOutcome() {
311
+ this.setState({
312
+ lastOutcome: null
313
+ });
314
+ }
315
+ }
316
+ const timeMachineStore = exports.timeMachineStore = new TimeMachineStore();
317
+
318
+ /**
319
+ * Buoy Desktop: route every Time Machine operation through a remote handler
320
+ * (the device's sync adapter actions) instead of running locally. Pass null
321
+ * to detach. While attached, feed device payloads to
322
+ * {@link replaceTimeMachineFromSnapshot}.
323
+ */
324
+ function setRemoteTimeMachineHandler(handler) {
325
+ remoteHandler = handler;
326
+ if (!handler) {
327
+ timeMachineStore.replaceFromSnapshot({});
328
+ }
329
+ }
330
+
331
+ /** Buoy Desktop: mirror a device's synced Time Machine metadata payload. */
332
+ function replaceTimeMachineFromSnapshot(payload) {
333
+ timeMachineStore.replaceFromSnapshot(payload);
334
+ }
335
+ //# sourceMappingURL=timeMachineStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_sharedUi","require","_snapshotVault","RESTORE_ORDER","exports","remoteHandler","skippedResult","reason","ok","applied","skipped","id","warnings","idCounter","nextId","Date","now","toString","TimeMachineStore","state","snapshots","hasLoaded","busy","lastOutcome","remoteProviders","listeners","Set","loadPromise","getState","subscribe","listener","add","ensureLoaded","delete","setState","patch","forEach","l","Promise","resolve","loadIndex","then","replaceFromSnapshot","payload","providers","capture","name","sourceIds","result","snapshot","getStateSnapshotProviders","filter","p","status","canCapture","includes","data","sources","provider","captured","superJsonSerialize","e","String","meta","trim","createdAt","sizeBytes","saveSnapshot","captureBaseline","baseline","restore","mode","outcome","stored","loadSnapshot","Error","snapshotId","snapshotName","at","willReload","results","clear","scheduleReload","sid","Object","keys","storage","restoreSource","sourceId","getStateSnapshotProvider","canRestore","detail","superJsonDeserialize","scheduleReloadApp","deleteSnapshot","rename","renameSnapshot","clearLastOutcome","timeMachineStore","setRemoteTimeMachineHandler","handler","replaceTimeMachineFromSnapshot"],"sourceRoot":"../../../src","sources":["store/timeMachineStore.ts"],"mappings":"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","ignoreList":[]}