@multiplatform.one/frappe 6.0.4 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -12
- package/dist/cjs/auth.cjs +1 -1
- package/dist/cjs/auth.native.js.map +1 -1
- package/dist/cjs/call.cjs +1 -1
- package/dist/cjs/call.native.js.map +1 -1
- package/dist/cjs/collection.cjs +18 -4
- package/dist/cjs/collection.native.js +18 -4
- package/dist/cjs/collection.native.js.map +1 -1
- package/dist/cjs/core/http.cjs +92 -9
- package/dist/cjs/core/http.native.js +96 -7
- package/dist/cjs/core/http.native.js.map +1 -1
- package/dist/cjs/db.cjs +7 -7
- package/dist/cjs/db.native.js +4 -4
- package/dist/cjs/db.native.js.map +1 -1
- package/dist/cjs/doctype.cjs +97 -39
- package/dist/cjs/doctype.native.js +116 -46
- package/dist/cjs/doctype.native.js.map +1 -1
- package/dist/cjs/file.cjs +1 -1
- package/dist/cjs/file.native.js.map +1 -1
- package/dist/cjs/fixtureDb.cjs +3 -2
- package/dist/cjs/fixtureDb.native.js +2 -1
- package/dist/cjs/fixtureDb.native.js.map +1 -1
- package/dist/cjs/frappeApp.cjs +15 -14
- package/dist/cjs/frappeApp.native.js +16 -14
- package/dist/cjs/frappeApp.native.js.map +1 -1
- package/dist/cjs/frappeReact.cjs +198 -18
- package/dist/cjs/frappeReact.native.js +241 -18
- package/dist/cjs/frappeReact.native.js.map +1 -1
- package/dist/cjs/index.cjs +9 -4
- package/dist/cjs/index.native.js +9 -4
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/pacer.cjs +2 -2
- package/dist/cjs/pacer.native.js +2 -2
- package/dist/cjs/pacer.native.js.map +1 -1
- package/dist/cjs/realtime.cjs +186 -46
- package/dist/cjs/realtime.native.js +268 -48
- package/dist/cjs/realtime.native.js.map +1 -1
- package/dist/cjs/sync/backfill.cjs +32 -27
- package/dist/cjs/sync/backfill.native.js +49 -43
- package/dist/cjs/sync/backfill.native.js.map +1 -1
- package/dist/cjs/sync/index.cjs +90 -24
- package/dist/cjs/sync/index.native.js +112 -10
- package/dist/cjs/sync/index.native.js.map +1 -1
- package/dist/cjs/sync/merge.cjs +0 -3
- package/dist/cjs/sync/merge.native.js +0 -3
- package/dist/cjs/sync/merge.native.js.map +1 -1
- package/dist/cjs/sync/mutationEngine.cjs +25 -19
- package/dist/cjs/sync/mutationEngine.native.js +16 -13
- package/dist/cjs/sync/mutationEngine.native.js.map +1 -1
- package/dist/cjs/sync/mutationJournal.cjs +9 -4
- package/dist/cjs/sync/mutationJournal.native.js +7 -4
- package/dist/cjs/sync/mutationJournal.native.js.map +1 -1
- package/dist/cjs/sync/normalizedCache.cjs +7 -3
- package/dist/cjs/sync/normalizedCache.native.js +7 -2
- package/dist/cjs/sync/normalizedCache.native.js.map +1 -1
- package/dist/cjs/sync/persistence.cjs +63 -31
- package/dist/cjs/sync/persistence.native.js +120 -63
- package/dist/cjs/sync/persistence.native.js.map +1 -1
- package/dist/cjs/sync/realtime.cjs +124 -13
- package/dist/cjs/sync/realtime.native.js +163 -20
- package/dist/cjs/sync/realtime.native.js.map +1 -1
- package/dist/cjs/sync/rehydration.cjs +16 -10
- package/dist/cjs/sync/rehydration.native.js +16 -14
- package/dist/cjs/sync/rehydration.native.js.map +1 -1
- package/dist/cjs/sync/storage.cjs +3 -3
- package/dist/cjs/sync/storage.native.js +1 -1
- package/dist/cjs/sync/storage.native.js.map +1 -1
- package/dist/cjs/sync/subscriptionManager.cjs +255 -65
- package/dist/cjs/sync/subscriptionManager.native.js +330 -93
- package/dist/cjs/sync/subscriptionManager.native.js.map +1 -1
- package/dist/cjs/sync/types.cjs +2 -0
- package/dist/cjs/sync/types.native.js +2 -0
- package/dist/cjs/sync/types.native.js.map +1 -1
- package/dist/cjs/sync/virtualPageManager.cjs +9 -9
- package/dist/cjs/sync/virtualPageManager.native.js +5 -9
- package/dist/cjs/sync/virtualPageManager.native.js.map +1 -1
- package/dist/cjs/useLiveQuery.cjs +52 -0
- package/dist/cjs/useLiveQuery.native.js +59 -0
- package/dist/cjs/useLiveQuery.native.js.map +1 -0
- package/dist/cjs/util.cjs +11 -2
- package/dist/cjs/util.native.js +16 -2
- package/dist/cjs/util.native.js.map +1 -1
- package/dist/esm/auth.mjs +1 -1
- package/dist/esm/auth.mjs.map +1 -1
- package/dist/esm/auth.native.js.map +1 -1
- package/dist/esm/call.mjs +1 -1
- package/dist/esm/call.mjs.map +1 -1
- package/dist/esm/call.native.js.map +1 -1
- package/dist/esm/collection.mjs +18 -4
- package/dist/esm/collection.mjs.map +1 -1
- package/dist/esm/collection.native.js +18 -4
- package/dist/esm/collection.native.js.map +1 -1
- package/dist/esm/core/http.mjs +93 -10
- package/dist/esm/core/http.mjs.map +1 -1
- package/dist/esm/core/http.native.js +97 -8
- package/dist/esm/core/http.native.js.map +1 -1
- package/dist/esm/db.mjs +7 -7
- package/dist/esm/db.mjs.map +1 -1
- package/dist/esm/db.native.js +4 -4
- package/dist/esm/db.native.js.map +1 -1
- package/dist/esm/doctype.mjs +96 -39
- package/dist/esm/doctype.mjs.map +1 -1
- package/dist/esm/doctype.native.js +115 -46
- package/dist/esm/doctype.native.js.map +1 -1
- package/dist/esm/file.mjs +1 -1
- package/dist/esm/file.mjs.map +1 -1
- package/dist/esm/file.native.js.map +1 -1
- package/dist/esm/fixtureDb.mjs +3 -2
- package/dist/esm/fixtureDb.mjs.map +1 -1
- package/dist/esm/fixtureDb.native.js +2 -1
- package/dist/esm/fixtureDb.native.js.map +1 -1
- package/dist/esm/frappeApp.mjs +15 -14
- package/dist/esm/frappeApp.mjs.map +1 -1
- package/dist/esm/frappeApp.native.js +16 -14
- package/dist/esm/frappeApp.native.js.map +1 -1
- package/dist/esm/frappeReact.mjs +197 -19
- package/dist/esm/frappeReact.mjs.map +1 -1
- package/dist/esm/frappeReact.native.js +240 -19
- package/dist/esm/frappeReact.native.js.map +1 -1
- package/dist/esm/index.mjs +5 -4
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +5 -4
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/pacer.mjs +1 -1
- package/dist/esm/pacer.native.js +1 -1
- package/dist/esm/realtime.mjs +187 -47
- package/dist/esm/realtime.mjs.map +1 -1
- package/dist/esm/realtime.native.js +269 -49
- package/dist/esm/realtime.native.js.map +1 -1
- package/dist/esm/sync/backfill.mjs +32 -27
- package/dist/esm/sync/backfill.mjs.map +1 -1
- package/dist/esm/sync/backfill.native.js +49 -43
- package/dist/esm/sync/backfill.native.js.map +1 -1
- package/dist/esm/sync/index.mjs +90 -24
- package/dist/esm/sync/index.mjs.map +1 -1
- package/dist/esm/sync/index.native.js +112 -10
- package/dist/esm/sync/index.native.js.map +1 -1
- package/dist/esm/sync/merge.mjs +1 -1
- package/dist/esm/sync/merge.mjs.map +1 -1
- package/dist/esm/sync/merge.native.js +1 -1
- package/dist/esm/sync/merge.native.js.map +1 -1
- package/dist/esm/sync/mutationEngine.mjs +25 -19
- package/dist/esm/sync/mutationEngine.mjs.map +1 -1
- package/dist/esm/sync/mutationEngine.native.js +16 -13
- package/dist/esm/sync/mutationEngine.native.js.map +1 -1
- package/dist/esm/sync/mutationJournal.mjs +9 -4
- package/dist/esm/sync/mutationJournal.mjs.map +1 -1
- package/dist/esm/sync/mutationJournal.native.js +7 -4
- package/dist/esm/sync/mutationJournal.native.js.map +1 -1
- package/dist/esm/sync/normalizedCache.mjs +7 -3
- package/dist/esm/sync/normalizedCache.mjs.map +1 -1
- package/dist/esm/sync/normalizedCache.native.js +7 -2
- package/dist/esm/sync/normalizedCache.native.js.map +1 -1
- package/dist/esm/sync/persistence.mjs +64 -32
- package/dist/esm/sync/persistence.mjs.map +1 -1
- package/dist/esm/sync/persistence.native.js +121 -64
- package/dist/esm/sync/persistence.native.js.map +1 -1
- package/dist/esm/sync/realtime.mjs +124 -13
- package/dist/esm/sync/realtime.mjs.map +1 -1
- package/dist/esm/sync/realtime.native.js +163 -20
- package/dist/esm/sync/realtime.native.js.map +1 -1
- package/dist/esm/sync/rehydration.mjs +16 -10
- package/dist/esm/sync/rehydration.mjs.map +1 -1
- package/dist/esm/sync/rehydration.native.js +16 -14
- package/dist/esm/sync/rehydration.native.js.map +1 -1
- package/dist/esm/sync/storage.mjs +3 -3
- package/dist/esm/sync/storage.mjs.map +1 -1
- package/dist/esm/sync/storage.native.js +1 -1
- package/dist/esm/sync/storage.native.js.map +1 -1
- package/dist/esm/sync/subscriptionManager.mjs +255 -65
- package/dist/esm/sync/subscriptionManager.mjs.map +1 -1
- package/dist/esm/sync/subscriptionManager.native.js +330 -93
- package/dist/esm/sync/subscriptionManager.native.js.map +1 -1
- package/dist/esm/sync/types.mjs +2 -0
- package/dist/esm/sync/types.mjs.map +1 -1
- package/dist/esm/sync/types.native.js +2 -0
- package/dist/esm/sync/types.native.js.map +1 -1
- package/dist/esm/sync/virtualPageManager.mjs +9 -9
- package/dist/esm/sync/virtualPageManager.mjs.map +1 -1
- package/dist/esm/sync/virtualPageManager.native.js +5 -9
- package/dist/esm/sync/virtualPageManager.native.js.map +1 -1
- package/dist/esm/useLiveQuery.mjs +26 -0
- package/dist/esm/useLiveQuery.mjs.map +1 -0
- package/dist/esm/useLiveQuery.native.js +30 -0
- package/dist/esm/useLiveQuery.native.js.map +1 -0
- package/dist/esm/util.mjs +11 -3
- package/dist/esm/util.mjs.map +1 -1
- package/dist/esm/util.native.js +16 -3
- package/dist/esm/util.native.js.map +1 -1
- package/dist/jsx/auth.mjs +1 -1
- package/dist/jsx/auth.mjs.map +1 -1
- package/dist/jsx/auth.native.js.map +1 -1
- package/dist/jsx/call.mjs +1 -1
- package/dist/jsx/call.mjs.map +1 -1
- package/dist/jsx/call.native.js.map +1 -1
- package/dist/jsx/collection.mjs +18 -4
- package/dist/jsx/collection.mjs.map +1 -1
- package/dist/jsx/collection.native.js +18 -4
- package/dist/jsx/collection.native.js.map +1 -1
- package/dist/jsx/core/http.mjs +93 -10
- package/dist/jsx/core/http.mjs.map +1 -1
- package/dist/jsx/core/http.native.js +96 -7
- package/dist/jsx/core/http.native.js.map +1 -1
- package/dist/jsx/db.mjs +7 -7
- package/dist/jsx/db.mjs.map +1 -1
- package/dist/jsx/db.native.js +4 -4
- package/dist/jsx/db.native.js.map +1 -1
- package/dist/jsx/doctype.mjs +96 -39
- package/dist/jsx/doctype.mjs.map +1 -1
- package/dist/jsx/doctype.native.js +116 -46
- package/dist/jsx/doctype.native.js.map +1 -1
- package/dist/jsx/file.mjs +1 -1
- package/dist/jsx/file.mjs.map +1 -1
- package/dist/jsx/file.native.js.map +1 -1
- package/dist/jsx/fixtureDb.mjs +3 -2
- package/dist/jsx/fixtureDb.mjs.map +1 -1
- package/dist/jsx/fixtureDb.native.js +2 -1
- package/dist/jsx/fixtureDb.native.js.map +1 -1
- package/dist/jsx/frappeApp.mjs +15 -14
- package/dist/jsx/frappeApp.mjs.map +1 -1
- package/dist/jsx/frappeApp.native.js +16 -14
- package/dist/jsx/frappeApp.native.js.map +1 -1
- package/dist/jsx/frappeReact.mjs +197 -19
- package/dist/jsx/frappeReact.mjs.map +1 -1
- package/dist/jsx/frappeReact.native.js +241 -18
- package/dist/jsx/frappeReact.native.js.map +1 -1
- package/dist/jsx/index.js +5 -4
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +5 -4
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +9 -4
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/pacer.mjs +1 -1
- package/dist/jsx/pacer.native.js +2 -2
- package/dist/jsx/pacer.native.js.map +1 -1
- package/dist/jsx/realtime.mjs +187 -47
- package/dist/jsx/realtime.mjs.map +1 -1
- package/dist/jsx/realtime.native.js +268 -48
- package/dist/jsx/realtime.native.js.map +1 -1
- package/dist/jsx/sync/backfill.mjs +32 -27
- package/dist/jsx/sync/backfill.mjs.map +1 -1
- package/dist/jsx/sync/backfill.native.js +49 -43
- package/dist/jsx/sync/backfill.native.js.map +1 -1
- package/dist/jsx/sync/index.mjs +90 -24
- package/dist/jsx/sync/index.mjs.map +1 -1
- package/dist/jsx/sync/index.native.js +112 -10
- package/dist/jsx/sync/index.native.js.map +1 -1
- package/dist/jsx/sync/merge.mjs +1 -1
- package/dist/jsx/sync/merge.mjs.map +1 -1
- package/dist/jsx/sync/merge.native.js +0 -3
- package/dist/jsx/sync/merge.native.js.map +1 -1
- package/dist/jsx/sync/mutationEngine.mjs +25 -19
- package/dist/jsx/sync/mutationEngine.mjs.map +1 -1
- package/dist/jsx/sync/mutationEngine.native.js +16 -13
- package/dist/jsx/sync/mutationEngine.native.js.map +1 -1
- package/dist/jsx/sync/mutationJournal.mjs +9 -4
- package/dist/jsx/sync/mutationJournal.mjs.map +1 -1
- package/dist/jsx/sync/mutationJournal.native.js +7 -4
- package/dist/jsx/sync/mutationJournal.native.js.map +1 -1
- package/dist/jsx/sync/normalizedCache.mjs +7 -3
- package/dist/jsx/sync/normalizedCache.mjs.map +1 -1
- package/dist/jsx/sync/normalizedCache.native.js +7 -2
- package/dist/jsx/sync/normalizedCache.native.js.map +1 -1
- package/dist/jsx/sync/persistence.mjs +64 -32
- package/dist/jsx/sync/persistence.mjs.map +1 -1
- package/dist/jsx/sync/persistence.native.js +120 -63
- package/dist/jsx/sync/persistence.native.js.map +1 -1
- package/dist/jsx/sync/realtime.mjs +124 -13
- package/dist/jsx/sync/realtime.mjs.map +1 -1
- package/dist/jsx/sync/realtime.native.js +163 -20
- package/dist/jsx/sync/realtime.native.js.map +1 -1
- package/dist/jsx/sync/rehydration.mjs +16 -10
- package/dist/jsx/sync/rehydration.mjs.map +1 -1
- package/dist/jsx/sync/rehydration.native.js +16 -14
- package/dist/jsx/sync/rehydration.native.js.map +1 -1
- package/dist/jsx/sync/storage.mjs +3 -3
- package/dist/jsx/sync/storage.mjs.map +1 -1
- package/dist/jsx/sync/storage.native.js +1 -1
- package/dist/jsx/sync/storage.native.js.map +1 -1
- package/dist/jsx/sync/subscriptionManager.mjs +255 -65
- package/dist/jsx/sync/subscriptionManager.mjs.map +1 -1
- package/dist/jsx/sync/subscriptionManager.native.js +330 -93
- package/dist/jsx/sync/subscriptionManager.native.js.map +1 -1
- package/dist/jsx/sync/types.mjs +2 -0
- package/dist/jsx/sync/types.mjs.map +1 -1
- package/dist/jsx/sync/types.native.js +2 -0
- package/dist/jsx/sync/types.native.js.map +1 -1
- package/dist/jsx/sync/virtualPageManager.mjs +9 -9
- package/dist/jsx/sync/virtualPageManager.mjs.map +1 -1
- package/dist/jsx/sync/virtualPageManager.native.js +5 -9
- package/dist/jsx/sync/virtualPageManager.native.js.map +1 -1
- package/dist/jsx/useLiveQuery.mjs +26 -0
- package/dist/jsx/useLiveQuery.mjs.map +1 -0
- package/dist/jsx/useLiveQuery.native.js +59 -0
- package/dist/jsx/useLiveQuery.native.js.map +1 -0
- package/dist/jsx/util.mjs +11 -3
- package/dist/jsx/util.mjs.map +1 -1
- package/dist/jsx/util.native.js +16 -2
- package/dist/jsx/util.native.js.map +1 -1
- package/package.json +20 -17
- package/src/auth.ts +5 -1
- package/src/call.ts +5 -1
- package/src/collection.spec.ts +55 -0
- package/src/collection.ts +33 -4
- package/src/core/http.spec.ts +66 -0
- package/src/core/http.ts +115 -9
- package/src/core/httpNative.spec.ts +234 -0
- package/src/core/types.ts +2 -0
- package/src/db.spec.ts +91 -51
- package/src/db.ts +27 -8
- package/src/doctype.spec.ts +247 -39
- package/src/doctype.ts +203 -53
- package/src/file.ts +5 -1
- package/src/fixtureDb.ts +13 -2
- package/src/frappeApp.ts +18 -19
- package/src/frappeReact.spec.ts +565 -1
- package/src/frappeReact.ts +446 -38
- package/src/frappeReactLiveQueryGc.spec.ts +320 -0
- package/src/frappeReactNative.spec.ts +65 -0
- package/src/index.ts +10 -9
- package/src/pacer.ts +2 -2
- package/src/realtime.spec.ts +464 -20
- package/src/realtime.ts +284 -46
- package/src/sync/backfill.spec.ts +43 -0
- package/src/sync/backfill.ts +59 -39
- package/src/sync/debug.spec.ts +36 -0
- package/src/sync/filterValidation.spec.ts +197 -0
- package/src/sync/index.ts +98 -7
- package/src/sync/merge.ts +3 -3
- package/src/sync/mutationEngine.spec.ts +36 -4
- package/src/sync/mutationEngine.ts +30 -11
- package/src/sync/mutationJournal.ts +18 -4
- package/src/sync/normalizedCache.spec.ts +102 -0
- package/src/sync/normalizedCache.ts +19 -3
- package/src/sync/offlineRestore.spec.ts +423 -0
- package/src/sync/persistence.spec.ts +39 -7
- package/src/sync/persistence.ts +90 -18
- package/src/sync/persistenceGjs.spec.ts +143 -0
- package/src/sync/persistenceNative.spec.ts +139 -0
- package/src/sync/realtime.spec.ts +18 -1
- package/src/sync/realtime.ts +161 -13
- package/src/sync/rehydration.ts +23 -5
- package/src/sync/storage.ts +5 -4
- package/src/sync/subscriptionManager.spec.ts +94 -0
- package/src/sync/subscriptionManager.ts +304 -82
- package/src/sync/syncModule.spec.ts +137 -0
- package/src/sync/types.ts +39 -0
- package/src/sync/virtualPageManager.ts +8 -4
- package/src/useLiveQuery.ts +58 -0
- package/src/util.spec.ts +35 -4
- package/src/util.ts +37 -2
- package/types/auth.d.ts +13 -0
- package/types/auth.d.ts.map +1 -0
- package/types/call.d.ts +10 -0
- package/types/call.d.ts.map +1 -0
- package/types/collection.d.ts +127 -0
- package/types/collection.d.ts.map +1 -0
- package/types/common/types.d.ts +35 -0
- package/types/common/types.d.ts.map +1 -0
- package/types/core/http.d.ts +86 -0
- package/types/core/http.d.ts.map +1 -0
- package/types/core/types.d.ts +74 -0
- package/types/core/types.d.ts.map +1 -0
- package/types/core/wire.d.ts +405 -0
- package/types/core/wire.d.ts.map +1 -0
- package/types/db.d.ts +244 -0
- package/types/db.d.ts.map +1 -0
- package/types/devtools/FrappeDevtoolsPanel.d.ts +7 -0
- package/types/devtools/FrappeDevtoolsPanel.d.ts.map +1 -0
- package/types/devtools/index.d.ts +4 -0
- package/types/devtools/index.d.ts.map +1 -0
- package/types/devtools/plugin.d.ts +9 -0
- package/types/devtools/plugin.d.ts.map +1 -0
- package/types/devtools/theme.d.ts +15 -0
- package/types/devtools/theme.d.ts.map +1 -0
- package/types/doctype.d.ts +256 -0
- package/types/doctype.d.ts.map +1 -0
- package/types/file.d.ts +15 -0
- package/types/file.d.ts.map +1 -0
- package/types/fixtureDb.d.ts +76 -0
- package/types/fixtureDb.d.ts.map +1 -0
- package/types/fixtures.d.ts +55 -0
- package/types/fixtures.d.ts.map +1 -0
- package/types/frappeApp.d.ts +45 -0
- package/types/frappeApp.d.ts.map +1 -0
- package/types/frappeReact.d.ts +270 -0
- package/types/frappeReact.d.ts.map +1 -0
- package/types/index.d.ts +44 -0
- package/types/index.d.ts.map +1 -0
- package/types/optimistic.d.ts +38 -0
- package/types/optimistic.d.ts.map +1 -0
- package/types/pacer.d.ts +193 -0
- package/types/pacer.d.ts.map +1 -0
- package/types/plugin/index.d.ts +11 -0
- package/types/plugin/index.d.ts.map +1 -0
- package/types/realtime.d.ts +121 -0
- package/types/realtime.d.ts.map +1 -0
- package/types/sync/backfill.d.ts +60 -0
- package/types/sync/backfill.d.ts.map +1 -0
- package/types/sync/filters.d.ts +101 -0
- package/types/sync/filters.d.ts.map +1 -0
- package/types/sync/index.d.ts +181 -0
- package/types/sync/index.d.ts.map +1 -0
- package/types/sync/merge.d.ts +59 -0
- package/types/sync/merge.d.ts.map +1 -0
- package/types/sync/mutationEngine.d.ts +117 -0
- package/types/sync/mutationEngine.d.ts.map +1 -0
- package/types/sync/mutationJournal.d.ts +60 -0
- package/types/sync/mutationJournal.d.ts.map +1 -0
- package/types/sync/normalizedCache.d.ts +59 -0
- package/types/sync/normalizedCache.d.ts.map +1 -0
- package/types/sync/persistence.d.ts +185 -0
- package/types/sync/persistence.d.ts.map +1 -0
- package/types/sync/realtime.d.ts +121 -0
- package/types/sync/realtime.d.ts.map +1 -0
- package/types/sync/rehydration.d.ts +109 -0
- package/types/sync/rehydration.d.ts.map +1 -0
- package/types/sync/storage.d.ts +65 -0
- package/types/sync/storage.d.ts.map +1 -0
- package/types/sync/subscriptionManager.d.ts +161 -0
- package/types/sync/subscriptionManager.d.ts.map +1 -0
- package/types/sync/types.d.ts +435 -0
- package/types/sync/types.d.ts.map +1 -0
- package/types/sync/virtualPageManager.d.ts +190 -0
- package/types/sync/virtualPageManager.d.ts.map +1 -0
- package/types/useLiveQuery.d.ts +16 -0
- package/types/useLiveQuery.d.ts.map +1 -0
- package/types/util.d.ts +24 -0
- package/types/util.d.ts.map +1 -0
- package/dist/cjs/auth.spec.cjs +0 -322
- package/dist/cjs/auth.spec.native.js +0 -329
- package/dist/cjs/auth.spec.native.js.map +0 -1
- package/dist/cjs/call.spec.cjs +0 -427
- package/dist/cjs/call.spec.native.js +0 -430
- package/dist/cjs/call.spec.native.js.map +0 -1
- package/dist/cjs/collection.spec.cjs +0 -186
- package/dist/cjs/collection.spec.native.js +0 -216
- package/dist/cjs/collection.spec.native.js.map +0 -1
- package/dist/cjs/common/types.spec.cjs +0 -266
- package/dist/cjs/common/types.spec.native.js +0 -271
- package/dist/cjs/common/types.spec.native.js.map +0 -1
- package/dist/cjs/core/http.spec.cjs +0 -1259
- package/dist/cjs/core/http.spec.native.js +0 -1401
- package/dist/cjs/core/http.spec.native.js.map +0 -1
- package/dist/cjs/core/wire.spec.cjs +0 -478
- package/dist/cjs/core/wire.spec.native.js +0 -482
- package/dist/cjs/core/wire.spec.native.js.map +0 -1
- package/dist/cjs/db.spec.cjs +0 -862
- package/dist/cjs/db.spec.native.js +0 -865
- package/dist/cjs/db.spec.native.js.map +0 -1
- package/dist/cjs/doctype.spec.cjs +0 -460
- package/dist/cjs/doctype.spec.native.js +0 -538
- package/dist/cjs/doctype.spec.native.js.map +0 -1
- package/dist/cjs/file.spec.cjs +0 -315
- package/dist/cjs/file.spec.native.js +0 -342
- package/dist/cjs/file.spec.native.js.map +0 -1
- package/dist/cjs/frappeApp.spec.cjs +0 -306
- package/dist/cjs/frappeApp.spec.native.js +0 -308
- package/dist/cjs/frappeApp.spec.native.js.map +0 -1
- package/dist/cjs/frappeReact.spec.cjs +0 -531
- package/dist/cjs/frappeReact.spec.native.js +0 -670
- package/dist/cjs/frappeReact.spec.native.js.map +0 -1
- package/dist/cjs/optimistic.spec.cjs +0 -11
- package/dist/cjs/optimistic.spec.native.js +0 -19
- package/dist/cjs/optimistic.spec.native.js.map +0 -1
- package/dist/cjs/pacer.spec.cjs +0 -470
- package/dist/cjs/pacer.spec.native.js +0 -537
- package/dist/cjs/pacer.spec.native.js.map +0 -1
- package/dist/cjs/realtime.spec.cjs +0 -326
- package/dist/cjs/realtime.spec.native.js +0 -392
- package/dist/cjs/realtime.spec.native.js.map +0 -1
- package/dist/cjs/sync/backfill.spec.cjs +0 -586
- package/dist/cjs/sync/backfill.spec.native.js +0 -712
- package/dist/cjs/sync/backfill.spec.native.js.map +0 -1
- package/dist/cjs/sync/debug.spec.cjs +0 -125
- package/dist/cjs/sync/debug.spec.native.js +0 -133
- package/dist/cjs/sync/debug.spec.native.js.map +0 -1
- package/dist/cjs/sync/filters.spec.cjs +0 -168
- package/dist/cjs/sync/filters.spec.native.js +0 -173
- package/dist/cjs/sync/filters.spec.native.js.map +0 -1
- package/dist/cjs/sync/merge.spec.cjs +0 -908
- package/dist/cjs/sync/merge.spec.native.js +0 -937
- package/dist/cjs/sync/merge.spec.native.js.map +0 -1
- package/dist/cjs/sync/multiOrderBy.spec.cjs +0 -165
- package/dist/cjs/sync/multiOrderBy.spec.native.js +0 -229
- package/dist/cjs/sync/multiOrderBy.spec.native.js.map +0 -1
- package/dist/cjs/sync/mutationEngine.spec.cjs +0 -1158
- package/dist/cjs/sync/mutationEngine.spec.native.js +0 -1173
- package/dist/cjs/sync/mutationEngine.spec.native.js.map +0 -1
- package/dist/cjs/sync/mutationJournal.spec.cjs +0 -330
- package/dist/cjs/sync/mutationJournal.spec.native.js +0 -333
- package/dist/cjs/sync/mutationJournal.spec.native.js.map +0 -1
- package/dist/cjs/sync/mutations.spec.cjs +0 -327
- package/dist/cjs/sync/mutations.spec.native.js +0 -330
- package/dist/cjs/sync/mutations.spec.native.js.map +0 -1
- package/dist/cjs/sync/normalizedCache.spec.cjs +0 -302
- package/dist/cjs/sync/normalizedCache.spec.native.js +0 -311
- package/dist/cjs/sync/normalizedCache.spec.native.js.map +0 -1
- package/dist/cjs/sync/persistence.spec.cjs +0 -562
- package/dist/cjs/sync/persistence.spec.native.js +0 -572
- package/dist/cjs/sync/persistence.spec.native.js.map +0 -1
- package/dist/cjs/sync/realtime.spec.cjs +0 -499
- package/dist/cjs/sync/realtime.spec.native.js +0 -512
- package/dist/cjs/sync/realtime.spec.native.js.map +0 -1
- package/dist/cjs/sync/rehydration.spec.cjs +0 -731
- package/dist/cjs/sync/rehydration.spec.native.js +0 -736
- package/dist/cjs/sync/rehydration.spec.native.js.map +0 -1
- package/dist/cjs/sync/storage.spec.cjs +0 -446
- package/dist/cjs/sync/storage.spec.native.js +0 -470
- package/dist/cjs/sync/storage.spec.native.js.map +0 -1
- package/dist/cjs/sync/subscriptionManager.spec.cjs +0 -1102
- package/dist/cjs/sync/subscriptionManager.spec.native.js +0 -1136
- package/dist/cjs/sync/subscriptionManager.spec.native.js.map +0 -1
- package/dist/cjs/sync/subscriptions.spec.cjs +0 -937
- package/dist/cjs/sync/subscriptions.spec.native.js +0 -969
- package/dist/cjs/sync/subscriptions.spec.native.js.map +0 -1
- package/dist/cjs/sync/syncModule.spec.cjs +0 -206
- package/dist/cjs/sync/syncModule.spec.native.js +0 -222
- package/dist/cjs/sync/syncModule.spec.native.js.map +0 -1
- package/dist/cjs/sync/types.spec.cjs +0 -246
- package/dist/cjs/sync/types.spec.native.js +0 -256
- package/dist/cjs/sync/types.spec.native.js.map +0 -1
- package/dist/cjs/sync/virtualPageManager.spec.cjs +0 -801
- package/dist/cjs/sync/virtualPageManager.spec.native.js +0 -873
- package/dist/cjs/sync/virtualPageManager.spec.native.js.map +0 -1
- package/dist/cjs/util.spec.cjs +0 -43
- package/dist/cjs/util.spec.native.js +0 -48
- package/dist/cjs/util.spec.native.js.map +0 -1
- package/dist/esm/auth.spec.mjs +0 -323
- package/dist/esm/auth.spec.mjs.map +0 -1
- package/dist/esm/auth.spec.native.js +0 -327
- package/dist/esm/auth.spec.native.js.map +0 -1
- package/dist/esm/call.spec.mjs +0 -428
- package/dist/esm/call.spec.mjs.map +0 -1
- package/dist/esm/call.spec.native.js +0 -428
- package/dist/esm/call.spec.native.js.map +0 -1
- package/dist/esm/collection.spec.mjs +0 -187
- package/dist/esm/collection.spec.mjs.map +0 -1
- package/dist/esm/collection.spec.native.js +0 -214
- package/dist/esm/collection.spec.native.js.map +0 -1
- package/dist/esm/common/types.spec.mjs +0 -267
- package/dist/esm/common/types.spec.mjs.map +0 -1
- package/dist/esm/common/types.spec.native.js +0 -269
- package/dist/esm/common/types.spec.native.js.map +0 -1
- package/dist/esm/core/http.spec.mjs +0 -1260
- package/dist/esm/core/http.spec.mjs.map +0 -1
- package/dist/esm/core/http.spec.native.js +0 -1399
- package/dist/esm/core/http.spec.native.js.map +0 -1
- package/dist/esm/core/wire.spec.mjs +0 -479
- package/dist/esm/core/wire.spec.mjs.map +0 -1
- package/dist/esm/core/wire.spec.native.js +0 -480
- package/dist/esm/core/wire.spec.native.js.map +0 -1
- package/dist/esm/db.spec.mjs +0 -863
- package/dist/esm/db.spec.mjs.map +0 -1
- package/dist/esm/db.spec.native.js +0 -863
- package/dist/esm/db.spec.native.js.map +0 -1
- package/dist/esm/doctype.spec.mjs +0 -461
- package/dist/esm/doctype.spec.mjs.map +0 -1
- package/dist/esm/doctype.spec.native.js +0 -536
- package/dist/esm/doctype.spec.native.js.map +0 -1
- package/dist/esm/file.spec.mjs +0 -316
- package/dist/esm/file.spec.mjs.map +0 -1
- package/dist/esm/file.spec.native.js +0 -340
- package/dist/esm/file.spec.native.js.map +0 -1
- package/dist/esm/frappeApp.spec.mjs +0 -307
- package/dist/esm/frappeApp.spec.mjs.map +0 -1
- package/dist/esm/frappeApp.spec.native.js +0 -306
- package/dist/esm/frappeApp.spec.native.js.map +0 -1
- package/dist/esm/frappeReact.spec.mjs +0 -532
- package/dist/esm/frappeReact.spec.mjs.map +0 -1
- package/dist/esm/frappeReact.spec.native.js +0 -668
- package/dist/esm/frappeReact.spec.native.js.map +0 -1
- package/dist/esm/optimistic.spec.mjs +0 -12
- package/dist/esm/optimistic.spec.mjs.map +0 -1
- package/dist/esm/optimistic.spec.native.js +0 -17
- package/dist/esm/optimistic.spec.native.js.map +0 -1
- package/dist/esm/pacer.spec.mjs +0 -447
- package/dist/esm/pacer.spec.mjs.map +0 -1
- package/dist/esm/pacer.spec.native.js +0 -511
- package/dist/esm/pacer.spec.native.js.map +0 -1
- package/dist/esm/realtime.spec.mjs +0 -327
- package/dist/esm/realtime.spec.mjs.map +0 -1
- package/dist/esm/realtime.spec.native.js +0 -390
- package/dist/esm/realtime.spec.native.js.map +0 -1
- package/dist/esm/sync/backfill.spec.mjs +0 -563
- package/dist/esm/sync/backfill.spec.mjs.map +0 -1
- package/dist/esm/sync/backfill.spec.native.js +0 -686
- package/dist/esm/sync/backfill.spec.native.js.map +0 -1
- package/dist/esm/sync/debug.spec.mjs +0 -102
- package/dist/esm/sync/debug.spec.mjs.map +0 -1
- package/dist/esm/sync/debug.spec.native.js +0 -107
- package/dist/esm/sync/debug.spec.native.js.map +0 -1
- package/dist/esm/sync/filters.spec.mjs +0 -169
- package/dist/esm/sync/filters.spec.mjs.map +0 -1
- package/dist/esm/sync/filters.spec.native.js +0 -171
- package/dist/esm/sync/filters.spec.native.js.map +0 -1
- package/dist/esm/sync/merge.spec.mjs +0 -909
- package/dist/esm/sync/merge.spec.mjs.map +0 -1
- package/dist/esm/sync/merge.spec.native.js +0 -935
- package/dist/esm/sync/merge.spec.native.js.map +0 -1
- package/dist/esm/sync/multiOrderBy.spec.mjs +0 -166
- package/dist/esm/sync/multiOrderBy.spec.mjs.map +0 -1
- package/dist/esm/sync/multiOrderBy.spec.native.js +0 -227
- package/dist/esm/sync/multiOrderBy.spec.native.js.map +0 -1
- package/dist/esm/sync/mutationEngine.spec.mjs +0 -1159
- package/dist/esm/sync/mutationEngine.spec.mjs.map +0 -1
- package/dist/esm/sync/mutationEngine.spec.native.js +0 -1171
- package/dist/esm/sync/mutationEngine.spec.native.js.map +0 -1
- package/dist/esm/sync/mutationJournal.spec.mjs +0 -331
- package/dist/esm/sync/mutationJournal.spec.mjs.map +0 -1
- package/dist/esm/sync/mutationJournal.spec.native.js +0 -331
- package/dist/esm/sync/mutationJournal.spec.native.js.map +0 -1
- package/dist/esm/sync/mutations.spec.mjs +0 -328
- package/dist/esm/sync/mutations.spec.mjs.map +0 -1
- package/dist/esm/sync/mutations.spec.native.js +0 -328
- package/dist/esm/sync/mutations.spec.native.js.map +0 -1
- package/dist/esm/sync/normalizedCache.spec.mjs +0 -303
- package/dist/esm/sync/normalizedCache.spec.mjs.map +0 -1
- package/dist/esm/sync/normalizedCache.spec.native.js +0 -309
- package/dist/esm/sync/normalizedCache.spec.native.js.map +0 -1
- package/dist/esm/sync/persistence.spec.mjs +0 -563
- package/dist/esm/sync/persistence.spec.mjs.map +0 -1
- package/dist/esm/sync/persistence.spec.native.js +0 -570
- package/dist/esm/sync/persistence.spec.native.js.map +0 -1
- package/dist/esm/sync/realtime.spec.mjs +0 -500
- package/dist/esm/sync/realtime.spec.mjs.map +0 -1
- package/dist/esm/sync/realtime.spec.native.js +0 -510
- package/dist/esm/sync/realtime.spec.native.js.map +0 -1
- package/dist/esm/sync/rehydration.spec.mjs +0 -732
- package/dist/esm/sync/rehydration.spec.mjs.map +0 -1
- package/dist/esm/sync/rehydration.spec.native.js +0 -734
- package/dist/esm/sync/rehydration.spec.native.js.map +0 -1
- package/dist/esm/sync/storage.spec.mjs +0 -423
- package/dist/esm/sync/storage.spec.mjs.map +0 -1
- package/dist/esm/sync/storage.spec.native.js +0 -444
- package/dist/esm/sync/storage.spec.native.js.map +0 -1
- package/dist/esm/sync/subscriptionManager.spec.mjs +0 -1079
- package/dist/esm/sync/subscriptionManager.spec.mjs.map +0 -1
- package/dist/esm/sync/subscriptionManager.spec.native.js +0 -1110
- package/dist/esm/sync/subscriptionManager.spec.native.js.map +0 -1
- package/dist/esm/sync/subscriptions.spec.mjs +0 -914
- package/dist/esm/sync/subscriptions.spec.mjs.map +0 -1
- package/dist/esm/sync/subscriptions.spec.native.js +0 -943
- package/dist/esm/sync/subscriptions.spec.native.js.map +0 -1
- package/dist/esm/sync/syncModule.spec.mjs +0 -207
- package/dist/esm/sync/syncModule.spec.mjs.map +0 -1
- package/dist/esm/sync/syncModule.spec.native.js +0 -220
- package/dist/esm/sync/syncModule.spec.native.js.map +0 -1
- package/dist/esm/sync/types.spec.mjs +0 -247
- package/dist/esm/sync/types.spec.mjs.map +0 -1
- package/dist/esm/sync/types.spec.native.js +0 -254
- package/dist/esm/sync/types.spec.native.js.map +0 -1
- package/dist/esm/sync/virtualPageManager.spec.mjs +0 -802
- package/dist/esm/sync/virtualPageManager.spec.mjs.map +0 -1
- package/dist/esm/sync/virtualPageManager.spec.native.js +0 -871
- package/dist/esm/sync/virtualPageManager.spec.native.js.map +0 -1
- package/dist/esm/util.spec.mjs +0 -20
- package/dist/esm/util.spec.mjs.map +0 -1
- package/dist/esm/util.spec.native.js +0 -22
- package/dist/esm/util.spec.native.js.map +0 -1
- package/dist/jsx/auth.spec.mjs +0 -323
- package/dist/jsx/auth.spec.mjs.map +0 -1
- package/dist/jsx/auth.spec.native.js +0 -329
- package/dist/jsx/auth.spec.native.js.map +0 -1
- package/dist/jsx/call.spec.mjs +0 -428
- package/dist/jsx/call.spec.mjs.map +0 -1
- package/dist/jsx/call.spec.native.js +0 -430
- package/dist/jsx/call.spec.native.js.map +0 -1
- package/dist/jsx/collection.spec.mjs +0 -187
- package/dist/jsx/collection.spec.mjs.map +0 -1
- package/dist/jsx/collection.spec.native.js +0 -216
- package/dist/jsx/collection.spec.native.js.map +0 -1
- package/dist/jsx/common/types.spec.mjs +0 -267
- package/dist/jsx/common/types.spec.mjs.map +0 -1
- package/dist/jsx/common/types.spec.native.js +0 -271
- package/dist/jsx/common/types.spec.native.js.map +0 -1
- package/dist/jsx/core/http.spec.mjs +0 -1260
- package/dist/jsx/core/http.spec.mjs.map +0 -1
- package/dist/jsx/core/http.spec.native.js +0 -1401
- package/dist/jsx/core/http.spec.native.js.map +0 -1
- package/dist/jsx/core/wire.spec.mjs +0 -479
- package/dist/jsx/core/wire.spec.mjs.map +0 -1
- package/dist/jsx/core/wire.spec.native.js +0 -482
- package/dist/jsx/core/wire.spec.native.js.map +0 -1
- package/dist/jsx/db.spec.mjs +0 -863
- package/dist/jsx/db.spec.mjs.map +0 -1
- package/dist/jsx/db.spec.native.js +0 -865
- package/dist/jsx/db.spec.native.js.map +0 -1
- package/dist/jsx/doctype.spec.mjs +0 -461
- package/dist/jsx/doctype.spec.mjs.map +0 -1
- package/dist/jsx/doctype.spec.native.js +0 -538
- package/dist/jsx/doctype.spec.native.js.map +0 -1
- package/dist/jsx/file.spec.mjs +0 -316
- package/dist/jsx/file.spec.mjs.map +0 -1
- package/dist/jsx/file.spec.native.js +0 -342
- package/dist/jsx/file.spec.native.js.map +0 -1
- package/dist/jsx/frappeApp.spec.mjs +0 -307
- package/dist/jsx/frappeApp.spec.mjs.map +0 -1
- package/dist/jsx/frappeApp.spec.native.js +0 -308
- package/dist/jsx/frappeApp.spec.native.js.map +0 -1
- package/dist/jsx/frappeReact.spec.mjs +0 -532
- package/dist/jsx/frappeReact.spec.mjs.map +0 -1
- package/dist/jsx/frappeReact.spec.native.js +0 -670
- package/dist/jsx/frappeReact.spec.native.js.map +0 -1
- package/dist/jsx/optimistic.spec.mjs +0 -12
- package/dist/jsx/optimistic.spec.mjs.map +0 -1
- package/dist/jsx/optimistic.spec.native.js +0 -19
- package/dist/jsx/optimistic.spec.native.js.map +0 -1
- package/dist/jsx/pacer.spec.mjs +0 -447
- package/dist/jsx/pacer.spec.mjs.map +0 -1
- package/dist/jsx/pacer.spec.native.js +0 -537
- package/dist/jsx/pacer.spec.native.js.map +0 -1
- package/dist/jsx/realtime.spec.mjs +0 -327
- package/dist/jsx/realtime.spec.mjs.map +0 -1
- package/dist/jsx/realtime.spec.native.js +0 -392
- package/dist/jsx/realtime.spec.native.js.map +0 -1
- package/dist/jsx/sync/backfill.spec.mjs +0 -563
- package/dist/jsx/sync/backfill.spec.mjs.map +0 -1
- package/dist/jsx/sync/backfill.spec.native.js +0 -712
- package/dist/jsx/sync/backfill.spec.native.js.map +0 -1
- package/dist/jsx/sync/debug.spec.mjs +0 -102
- package/dist/jsx/sync/debug.spec.mjs.map +0 -1
- package/dist/jsx/sync/debug.spec.native.js +0 -133
- package/dist/jsx/sync/debug.spec.native.js.map +0 -1
- package/dist/jsx/sync/filters.spec.mjs +0 -169
- package/dist/jsx/sync/filters.spec.mjs.map +0 -1
- package/dist/jsx/sync/filters.spec.native.js +0 -173
- package/dist/jsx/sync/filters.spec.native.js.map +0 -1
- package/dist/jsx/sync/merge.spec.mjs +0 -909
- package/dist/jsx/sync/merge.spec.mjs.map +0 -1
- package/dist/jsx/sync/merge.spec.native.js +0 -937
- package/dist/jsx/sync/merge.spec.native.js.map +0 -1
- package/dist/jsx/sync/multiOrderBy.spec.mjs +0 -166
- package/dist/jsx/sync/multiOrderBy.spec.mjs.map +0 -1
- package/dist/jsx/sync/multiOrderBy.spec.native.js +0 -229
- package/dist/jsx/sync/multiOrderBy.spec.native.js.map +0 -1
- package/dist/jsx/sync/mutationEngine.spec.mjs +0 -1159
- package/dist/jsx/sync/mutationEngine.spec.mjs.map +0 -1
- package/dist/jsx/sync/mutationEngine.spec.native.js +0 -1173
- package/dist/jsx/sync/mutationEngine.spec.native.js.map +0 -1
- package/dist/jsx/sync/mutationJournal.spec.mjs +0 -331
- package/dist/jsx/sync/mutationJournal.spec.mjs.map +0 -1
- package/dist/jsx/sync/mutationJournal.spec.native.js +0 -333
- package/dist/jsx/sync/mutationJournal.spec.native.js.map +0 -1
- package/dist/jsx/sync/mutations.spec.mjs +0 -328
- package/dist/jsx/sync/mutations.spec.mjs.map +0 -1
- package/dist/jsx/sync/mutations.spec.native.js +0 -330
- package/dist/jsx/sync/mutations.spec.native.js.map +0 -1
- package/dist/jsx/sync/normalizedCache.spec.mjs +0 -303
- package/dist/jsx/sync/normalizedCache.spec.mjs.map +0 -1
- package/dist/jsx/sync/normalizedCache.spec.native.js +0 -311
- package/dist/jsx/sync/normalizedCache.spec.native.js.map +0 -1
- package/dist/jsx/sync/persistence.spec.mjs +0 -563
- package/dist/jsx/sync/persistence.spec.mjs.map +0 -1
- package/dist/jsx/sync/persistence.spec.native.js +0 -572
- package/dist/jsx/sync/persistence.spec.native.js.map +0 -1
- package/dist/jsx/sync/realtime.spec.mjs +0 -500
- package/dist/jsx/sync/realtime.spec.mjs.map +0 -1
- package/dist/jsx/sync/realtime.spec.native.js +0 -512
- package/dist/jsx/sync/realtime.spec.native.js.map +0 -1
- package/dist/jsx/sync/rehydration.spec.mjs +0 -732
- package/dist/jsx/sync/rehydration.spec.mjs.map +0 -1
- package/dist/jsx/sync/rehydration.spec.native.js +0 -736
- package/dist/jsx/sync/rehydration.spec.native.js.map +0 -1
- package/dist/jsx/sync/storage.spec.mjs +0 -423
- package/dist/jsx/sync/storage.spec.mjs.map +0 -1
- package/dist/jsx/sync/storage.spec.native.js +0 -470
- package/dist/jsx/sync/storage.spec.native.js.map +0 -1
- package/dist/jsx/sync/subscriptionManager.spec.mjs +0 -1079
- package/dist/jsx/sync/subscriptionManager.spec.mjs.map +0 -1
- package/dist/jsx/sync/subscriptionManager.spec.native.js +0 -1136
- package/dist/jsx/sync/subscriptionManager.spec.native.js.map +0 -1
- package/dist/jsx/sync/subscriptions.spec.mjs +0 -914
- package/dist/jsx/sync/subscriptions.spec.mjs.map +0 -1
- package/dist/jsx/sync/subscriptions.spec.native.js +0 -969
- package/dist/jsx/sync/subscriptions.spec.native.js.map +0 -1
- package/dist/jsx/sync/syncModule.spec.mjs +0 -207
- package/dist/jsx/sync/syncModule.spec.mjs.map +0 -1
- package/dist/jsx/sync/syncModule.spec.native.js +0 -222
- package/dist/jsx/sync/syncModule.spec.native.js.map +0 -1
- package/dist/jsx/sync/types.spec.mjs +0 -247
- package/dist/jsx/sync/types.spec.mjs.map +0 -1
- package/dist/jsx/sync/types.spec.native.js +0 -256
- package/dist/jsx/sync/types.spec.native.js.map +0 -1
- package/dist/jsx/sync/virtualPageManager.spec.mjs +0 -802
- package/dist/jsx/sync/virtualPageManager.spec.mjs.map +0 -1
- package/dist/jsx/sync/virtualPageManager.spec.native.js +0 -873
- package/dist/jsx/sync/virtualPageManager.spec.native.js.map +0 -1
- package/dist/jsx/util.spec.mjs +0 -20
- package/dist/jsx/util.spec.mjs.map +0 -1
- package/dist/jsx/util.spec.native.js +0 -48
- package/dist/jsx/util.spec.native.js.map +0 -1
package/src/sync/persistence.ts
CHANGED
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { Debouncer } from "@tanstack/pacer";
|
|
9
|
-
import { onVisibilityChange } from "@multiplatform.one/platform";
|
|
9
|
+
import { isNative, onVisibilityChange } from "@multiplatform.one/platform";
|
|
10
10
|
import type { FrappeDocData } from "../common/types";
|
|
11
|
+
import { isGjs } from "../util";
|
|
11
12
|
import type { MutationEngine } from "./mutationEngine";
|
|
12
13
|
import type { MutationJournal } from "./mutationJournal";
|
|
13
14
|
import type { NormalizedCache } from "./normalizedCache";
|
|
@@ -51,14 +52,29 @@ export class PersistenceManager {
|
|
|
51
52
|
private activeResponseTimers = new Set<ReturnType<typeof setTimeout>>();
|
|
52
53
|
/** Flag to prevent operations after destroy. */
|
|
53
54
|
private isDestroyed = false;
|
|
55
|
+
/**
|
|
56
|
+
* Resolves once the persisted snapshot (if any) has been restored into
|
|
57
|
+
* memory. Resolved immediately when persistence is disabled. Never rejects.
|
|
58
|
+
*/
|
|
59
|
+
private loadPromise: Promise<void> = Promise.resolve();
|
|
60
|
+
private readonly normalizedCache: NormalizedCache;
|
|
61
|
+
private readonly mutationJournal: MutationJournal;
|
|
62
|
+
private readonly subscriptionManager: SubscriptionManager;
|
|
63
|
+
private readonly mutationEngine: MutationEngine;
|
|
64
|
+
private readonly options: SyncOptions;
|
|
54
65
|
|
|
55
66
|
constructor(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
67
|
+
normalizedCache: NormalizedCache,
|
|
68
|
+
mutationJournal: MutationJournal,
|
|
69
|
+
subscriptionManager: SubscriptionManager,
|
|
70
|
+
mutationEngine: MutationEngine,
|
|
71
|
+
options: SyncOptions = {},
|
|
61
72
|
) {
|
|
73
|
+
this.normalizedCache = normalizedCache;
|
|
74
|
+
this.mutationJournal = mutationJournal;
|
|
75
|
+
this.subscriptionManager = subscriptionManager;
|
|
76
|
+
this.mutationEngine = mutationEngine;
|
|
77
|
+
this.options = options;
|
|
62
78
|
// Initialize tab coordination config
|
|
63
79
|
this.tabCoordinationConfig = {
|
|
64
80
|
activeTabPriority: options.tabCoordination?.activeTabPriority ?? true,
|
|
@@ -66,6 +82,19 @@ export class PersistenceManager {
|
|
|
66
82
|
handoffGracePeriod: options.tabCoordination?.handoffGracePeriod ?? 2000,
|
|
67
83
|
};
|
|
68
84
|
|
|
85
|
+
// React Native has window but no document/BroadcastChannel; it does have
|
|
86
|
+
// full KV storage (MMKV via PlatformStorageKV), so enable snapshot
|
|
87
|
+
// persistence and skip only the DOM-dependent cross-tab machinery.
|
|
88
|
+
// GJS (GNOME) takes the same branch: single window, no BroadcastChannel
|
|
89
|
+
// or real DOM (any window/document globals are layout stubs) — storage
|
|
90
|
+
// arrives via an app-provided `SyncOptions.storage` adapter (e.g. a Gio
|
|
91
|
+
// file-backed KV) and persistence stays a clean no-op without one, since
|
|
92
|
+
// setupPersistence bails when persistKey is unset.
|
|
93
|
+
if (isNative || isGjs()) {
|
|
94
|
+
this.setupPersistence();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
69
98
|
// Skip browser-only setup during SSR (document/window not available)
|
|
70
99
|
if (typeof window === "undefined" || typeof document === "undefined") {
|
|
71
100
|
return;
|
|
@@ -74,11 +103,29 @@ export class PersistenceManager {
|
|
|
74
103
|
this.setupPersistence();
|
|
75
104
|
this.setupBroadcastChannel();
|
|
76
105
|
|
|
77
|
-
|
|
106
|
+
// Leadership election only coordinates persistence snapshots and
|
|
107
|
+
// cross-tab broadcast, and every one of those paths is persistKey-gated
|
|
108
|
+
// (setupPersistence/setupBroadcastChannel/scheduleSave all bail without
|
|
109
|
+
// one). Electing without a persistKey did nothing except leak: each
|
|
110
|
+
// SyncModule armed a forever leader-heartbeat setInterval (+ a
|
|
111
|
+
// visibilitychange listener + periodic localStorage writes) whose
|
|
112
|
+
// closure pinned the module's whole sync graph. Fixture-mode consumers
|
|
113
|
+
// (tests, stories) create a SyncModule per fixture set, so the leaked
|
|
114
|
+
// heartbeats accumulated and wedged vitest forks-worker teardown.
|
|
115
|
+
if (this.options.persistKey && this.tabCoordinationConfig.activeTabPriority) {
|
|
78
116
|
this.setupTabCoordination();
|
|
79
117
|
}
|
|
80
118
|
}
|
|
81
119
|
|
|
120
|
+
/**
|
|
121
|
+
* Resolves when the initial snapshot restore has completed (immediately if
|
|
122
|
+
* persistence is off). `SyncModule.subscribe` awaits this so a fresh mount
|
|
123
|
+
* can re-adopt a restored subscription instead of racing the async load.
|
|
124
|
+
*/
|
|
125
|
+
whenReady(): Promise<void> {
|
|
126
|
+
return this.loadPromise;
|
|
127
|
+
}
|
|
128
|
+
|
|
82
129
|
/**
|
|
83
130
|
* Sets up persistence storage based on environment and options.
|
|
84
131
|
*/
|
|
@@ -91,12 +138,20 @@ export class PersistenceManager {
|
|
|
91
138
|
} else if (typeof indexedDB !== "undefined") {
|
|
92
139
|
this.persistenceStorage = new IndexedDBKV();
|
|
93
140
|
} else {
|
|
94
|
-
// PlatformStorageKV uses MMKV on native and localStorage on web
|
|
141
|
+
// PlatformStorageKV uses MMKV on native and localStorage on web. On
|
|
142
|
+
// GJS neither exists, so the store package degrades to an in-memory
|
|
143
|
+
// map — snapshots then die with the process. Say so instead of
|
|
144
|
+
// pretending persistKey persisted anything.
|
|
145
|
+
if (isGjs()) {
|
|
146
|
+
console.debug(
|
|
147
|
+
"[frappe-sync] persistKey set but no storage adapter on GJS — snapshots are in-memory only (pass SyncOptions.storage, e.g. a Gio file-backed KV, for real persistence)",
|
|
148
|
+
);
|
|
149
|
+
}
|
|
95
150
|
this.persistenceStorage = new PlatformStorageKV();
|
|
96
151
|
}
|
|
97
152
|
|
|
98
|
-
// Load persisted state if available
|
|
99
|
-
|
|
153
|
+
// Load persisted state if available; expose completion via whenReady()
|
|
154
|
+
this.loadPromise = this.load();
|
|
100
155
|
}
|
|
101
156
|
|
|
102
157
|
/**
|
|
@@ -270,12 +325,16 @@ export class PersistenceManager {
|
|
|
270
325
|
private async save() {
|
|
271
326
|
if (!this.options.persistKey || !this.persistenceStorage) return;
|
|
272
327
|
try {
|
|
328
|
+
// Expire restored subscriptions nobody re-adopted so they leave the
|
|
329
|
+
// snapshot instead of accumulating across reloads.
|
|
330
|
+
this.subscriptionManager.gcRestoredSubscriptions();
|
|
273
331
|
// Capture a minimal snapshot for fast resume after reload or tab switch
|
|
274
332
|
const snapshot = {
|
|
275
333
|
subs: [...this.subscriptionManager.getAllSubscriptions().values()].map((s) => ({
|
|
276
334
|
id: s.id,
|
|
277
335
|
query: s.query,
|
|
278
336
|
checkpoint: s.checkpoint,
|
|
337
|
+
cursor: s.cursor,
|
|
279
338
|
docIds: s.docIds,
|
|
280
339
|
})),
|
|
281
340
|
cache: this.normalizedCache.state,
|
|
@@ -299,16 +358,29 @@ export class PersistenceManager {
|
|
|
299
358
|
if (!raw) return;
|
|
300
359
|
const snap = JSON.parse(raw);
|
|
301
360
|
|
|
302
|
-
// Restore cache first so reads have data once subs are reinstated
|
|
303
|
-
|
|
304
|
-
|
|
361
|
+
// Restore cache first so reads have data once subs are reinstated.
|
|
362
|
+
// Merge per doc instead of replacing state wholesale: anything already
|
|
363
|
+
// in memory (e.g. an optimistic write that raced ahead of this load)
|
|
364
|
+
// is newer than the snapshot and wins. Per-doc upsert also keeps the
|
|
365
|
+
// cache's LRU bookkeeping and maxCacheSize bounds accurate.
|
|
366
|
+
if (snap?.cache && typeof snap.cache === "object") {
|
|
367
|
+
for (const bucket of Object.values(snap.cache as Record<string, unknown>)) {
|
|
368
|
+
const byId = (bucket as { byId?: Record<string, unknown> } | null)?.byId;
|
|
369
|
+
if (!byId || typeof byId !== "object") continue;
|
|
370
|
+
for (const doc of Object.values(byId) as FrappeDocData[]) {
|
|
371
|
+
if (!doc?.doctype || !doc?.name) continue;
|
|
372
|
+
if (this.normalizedCache.get(doc)) continue;
|
|
373
|
+
this.normalizedCache.upsert(doc, { replace: true });
|
|
374
|
+
}
|
|
375
|
+
}
|
|
305
376
|
}
|
|
306
377
|
|
|
307
|
-
// Rehydrate subscriptions
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
378
|
+
// Rehydrate subscriptions as dormant "restored" entries: they hold the
|
|
379
|
+
// persisted query, checkpoint, and membership for cache-first
|
|
380
|
+
// re-adoption, and are GC'd if nothing re-adopts them.
|
|
381
|
+
if (snap?.subs && Array.isArray(snap.subs)) {
|
|
382
|
+
for (const subscription of snap.subs) {
|
|
383
|
+
this.subscriptionManager.restoreSubscription(subscription);
|
|
312
384
|
}
|
|
313
385
|
}
|
|
314
386
|
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GJS (GNOME) persistence path: the GNOME bundles run with window/document
|
|
3
|
+
* LAYOUT STUBS (react-gnome polyfills), so the old DOM-presence branch would
|
|
4
|
+
* have started BroadcastChannel/tab-coordination machinery against fake
|
|
5
|
+
* globals. With `imports.gi` present the PersistenceManager must take the
|
|
6
|
+
* native-style branch: snapshot persistence through the provided storage
|
|
7
|
+
* adapter (a Gio file KV on GNOME), no BroadcastChannel, no tab
|
|
8
|
+
* coordination — and stay fully inert without persistKey.
|
|
9
|
+
*/
|
|
10
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
11
|
+
import { PersistenceManager } from "./persistence";
|
|
12
|
+
|
|
13
|
+
vi.mock("@multiplatform.one/platform", () => ({
|
|
14
|
+
isNative: false,
|
|
15
|
+
onAppFocus: vi.fn(() => vi.fn()),
|
|
16
|
+
onOnline: vi.fn(() => vi.fn()),
|
|
17
|
+
onVisibilityChange: vi.fn(() => vi.fn()),
|
|
18
|
+
}));
|
|
19
|
+
|
|
20
|
+
describe("PersistenceManager on GJS (imports.gi global)", () => {
|
|
21
|
+
let persistenceManager: PersistenceManager | undefined;
|
|
22
|
+
let mockStorage: any;
|
|
23
|
+
let mockNormalizedCache: any;
|
|
24
|
+
let mockMutationJournal: any;
|
|
25
|
+
let mockSubscriptionManager: any;
|
|
26
|
+
let mockMutationEngine: any;
|
|
27
|
+
let broadcastChannelSpy: any;
|
|
28
|
+
let originalBroadcastChannel: any;
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
vi.useFakeTimers();
|
|
32
|
+
|
|
33
|
+
mockStorage = {
|
|
34
|
+
getItem: vi.fn().mockResolvedValue(null),
|
|
35
|
+
setItem: vi.fn().mockResolvedValue(undefined),
|
|
36
|
+
removeItem: vi.fn().mockResolvedValue(undefined),
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
mockNormalizedCache = {
|
|
40
|
+
state: {},
|
|
41
|
+
get: vi.fn().mockReturnValue(undefined),
|
|
42
|
+
upsert: vi.fn(),
|
|
43
|
+
};
|
|
44
|
+
mockMutationJournal = { listPending: vi.fn().mockReturnValue([]), add: vi.fn() };
|
|
45
|
+
mockSubscriptionManager = {
|
|
46
|
+
getAllSubscriptions: vi.fn().mockReturnValue(new Map()),
|
|
47
|
+
restoreSubscription: vi.fn(),
|
|
48
|
+
gcRestoredSubscriptions: vi.fn(),
|
|
49
|
+
};
|
|
50
|
+
mockMutationEngine = { getTemporaryIdToRealNameMap: vi.fn().mockReturnValue(new Map()) };
|
|
51
|
+
|
|
52
|
+
// The GJS runtime marker. Unlike the RN spec, document stays DEFINED
|
|
53
|
+
// (happy-dom) — mirroring the GNOME bundles where react-gnome installs
|
|
54
|
+
// window/document layout stubs.
|
|
55
|
+
(globalThis as any).imports = { gi: {} };
|
|
56
|
+
|
|
57
|
+
originalBroadcastChannel = (globalThis as any).BroadcastChannel;
|
|
58
|
+
broadcastChannelSpy = vi.fn();
|
|
59
|
+
Object.defineProperty(globalThis, "BroadcastChannel", {
|
|
60
|
+
value: broadcastChannelSpy,
|
|
61
|
+
configurable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
afterEach(() => {
|
|
67
|
+
persistenceManager?.destroy();
|
|
68
|
+
persistenceManager = undefined;
|
|
69
|
+
delete (globalThis as any).imports;
|
|
70
|
+
Object.defineProperty(globalThis, "BroadcastChannel", {
|
|
71
|
+
value: originalBroadcastChannel,
|
|
72
|
+
configurable: true,
|
|
73
|
+
writable: true,
|
|
74
|
+
});
|
|
75
|
+
vi.useRealTimers();
|
|
76
|
+
vi.restoreAllMocks();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
function createManager(options: Record<string, unknown>) {
|
|
80
|
+
persistenceManager = new PersistenceManager(
|
|
81
|
+
mockNormalizedCache,
|
|
82
|
+
mockMutationJournal,
|
|
83
|
+
mockSubscriptionManager,
|
|
84
|
+
mockMutationEngine,
|
|
85
|
+
options,
|
|
86
|
+
);
|
|
87
|
+
return persistenceManager;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
it("activates snapshot persistence through the provided storage adapter", async () => {
|
|
91
|
+
const manager = createManager({ persistKey: "gjs-key", storage: mockStorage });
|
|
92
|
+
await manager.whenReady();
|
|
93
|
+
expect(mockStorage.getItem).toHaveBeenCalledWith("gjs-key");
|
|
94
|
+
|
|
95
|
+
manager.scheduleSave();
|
|
96
|
+
await vi.advanceTimersByTimeAsync(60);
|
|
97
|
+
expect(mockStorage.setItem).toHaveBeenCalledWith("gjs-key", expect.any(String));
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("restores a persisted snapshot on startup", async () => {
|
|
101
|
+
const snapshotSub = {
|
|
102
|
+
id: "sub-gjs",
|
|
103
|
+
query: { doctype: "Workspace" },
|
|
104
|
+
checkpoint: "2026-01-01T10:00:00",
|
|
105
|
+
docIds: ["w1"],
|
|
106
|
+
};
|
|
107
|
+
mockStorage.getItem.mockResolvedValue(
|
|
108
|
+
JSON.stringify({
|
|
109
|
+
subs: [snapshotSub],
|
|
110
|
+
cache: {
|
|
111
|
+
Workspace: { byId: { w1: { doctype: "Workspace", name: "w1" } }, allIds: ["w1"] },
|
|
112
|
+
},
|
|
113
|
+
journal: [],
|
|
114
|
+
temp: [],
|
|
115
|
+
}),
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const manager = createManager({ persistKey: "gjs-key", storage: mockStorage });
|
|
119
|
+
await manager.whenReady();
|
|
120
|
+
|
|
121
|
+
expect(mockSubscriptionManager.restoreSubscription).toHaveBeenCalledWith(snapshotSub);
|
|
122
|
+
expect(mockNormalizedCache.upsert).toHaveBeenCalledWith(
|
|
123
|
+
{ doctype: "Workspace", name: "w1" },
|
|
124
|
+
{ replace: true },
|
|
125
|
+
);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("skips BroadcastChannel and tab coordination even though document exists", () => {
|
|
129
|
+
expect(typeof document).not.toBe("undefined");
|
|
130
|
+
createManager({ persistKey: "gjs-key", storage: mockStorage });
|
|
131
|
+
expect(broadcastChannelSpy).not.toHaveBeenCalled();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("stays fully inert without persistKey", async () => {
|
|
135
|
+
const manager = createManager({});
|
|
136
|
+
await manager.whenReady();
|
|
137
|
+
manager.scheduleSave();
|
|
138
|
+
await vi.advanceTimersByTimeAsync(60);
|
|
139
|
+
|
|
140
|
+
expect(mockStorage.getItem).not.toHaveBeenCalled();
|
|
141
|
+
expect(mockStorage.setItem).not.toHaveBeenCalled();
|
|
142
|
+
});
|
|
143
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Native persistence path: RN has `window` but no `document` and no
|
|
3
|
+
* BroadcastChannel, yet full KV storage (MMKV via PlatformStorageKV). With
|
|
4
|
+
* `isNative` true the PersistenceManager must activate snapshot persistence
|
|
5
|
+
* and skip only the DOM-dependent cross-tab machinery — previously the
|
|
6
|
+
* `document` guard made persistence dead code on native.
|
|
7
|
+
*/
|
|
8
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
9
|
+
import { PersistenceManager } from "./persistence";
|
|
10
|
+
|
|
11
|
+
vi.mock("@multiplatform.one/platform", () => ({
|
|
12
|
+
isNative: true,
|
|
13
|
+
onAppFocus: vi.fn(() => vi.fn()),
|
|
14
|
+
onOnline: vi.fn(() => vi.fn()),
|
|
15
|
+
onVisibilityChange: vi.fn(() => vi.fn()),
|
|
16
|
+
}));
|
|
17
|
+
|
|
18
|
+
describe("PersistenceManager on React Native (isNative)", () => {
|
|
19
|
+
let persistenceManager: PersistenceManager | undefined;
|
|
20
|
+
let mockStorage: any;
|
|
21
|
+
let mockNormalizedCache: any;
|
|
22
|
+
let mockMutationJournal: any;
|
|
23
|
+
let mockSubscriptionManager: any;
|
|
24
|
+
let mockMutationEngine: any;
|
|
25
|
+
let broadcastChannelSpy: any;
|
|
26
|
+
let originalDocument: any;
|
|
27
|
+
let originalBroadcastChannel: any;
|
|
28
|
+
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
vi.useFakeTimers();
|
|
31
|
+
|
|
32
|
+
mockStorage = {
|
|
33
|
+
getItem: vi.fn().mockResolvedValue(null),
|
|
34
|
+
setItem: vi.fn().mockResolvedValue(undefined),
|
|
35
|
+
removeItem: vi.fn().mockResolvedValue(undefined),
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
mockNormalizedCache = {
|
|
39
|
+
state: {},
|
|
40
|
+
get: vi.fn().mockReturnValue(undefined),
|
|
41
|
+
upsert: vi.fn(),
|
|
42
|
+
};
|
|
43
|
+
mockMutationJournal = { listPending: vi.fn().mockReturnValue([]), add: vi.fn() };
|
|
44
|
+
mockSubscriptionManager = {
|
|
45
|
+
getAllSubscriptions: vi.fn().mockReturnValue(new Map()),
|
|
46
|
+
restoreSubscription: vi.fn(),
|
|
47
|
+
gcRestoredSubscriptions: vi.fn(),
|
|
48
|
+
};
|
|
49
|
+
mockMutationEngine = { getTemporaryIdToRealNameMap: vi.fn().mockReturnValue(new Map()) };
|
|
50
|
+
|
|
51
|
+
// Simulate the RN runtime: no document, no BroadcastChannel
|
|
52
|
+
originalDocument = (globalThis as any).document;
|
|
53
|
+
originalBroadcastChannel = (globalThis as any).BroadcastChannel;
|
|
54
|
+
Object.defineProperty(globalThis, "document", { value: undefined, configurable: true });
|
|
55
|
+
broadcastChannelSpy = vi.fn();
|
|
56
|
+
Object.defineProperty(globalThis, "BroadcastChannel", {
|
|
57
|
+
value: broadcastChannelSpy,
|
|
58
|
+
configurable: true,
|
|
59
|
+
writable: true,
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
persistenceManager?.destroy();
|
|
65
|
+
persistenceManager = undefined;
|
|
66
|
+
Object.defineProperty(globalThis, "document", { value: originalDocument, configurable: true });
|
|
67
|
+
Object.defineProperty(globalThis, "BroadcastChannel", {
|
|
68
|
+
value: originalBroadcastChannel,
|
|
69
|
+
configurable: true,
|
|
70
|
+
writable: true,
|
|
71
|
+
});
|
|
72
|
+
vi.useRealTimers();
|
|
73
|
+
vi.restoreAllMocks();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
function createManager(options: Record<string, unknown>) {
|
|
77
|
+
persistenceManager = new PersistenceManager(
|
|
78
|
+
mockNormalizedCache,
|
|
79
|
+
mockMutationJournal,
|
|
80
|
+
mockSubscriptionManager,
|
|
81
|
+
mockMutationEngine,
|
|
82
|
+
options,
|
|
83
|
+
);
|
|
84
|
+
return persistenceManager;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
it("activates snapshot persistence without a document", async () => {
|
|
88
|
+
const manager = createManager({ persistKey: "rn-key", storage: mockStorage });
|
|
89
|
+
await manager.whenReady();
|
|
90
|
+
expect(mockStorage.getItem).toHaveBeenCalledWith("rn-key");
|
|
91
|
+
|
|
92
|
+
manager.scheduleSave();
|
|
93
|
+
await vi.advanceTimersByTimeAsync(60);
|
|
94
|
+
expect(mockStorage.setItem).toHaveBeenCalledWith("rn-key", expect.any(String));
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("restores a persisted snapshot on startup", async () => {
|
|
98
|
+
const snapshotSub = {
|
|
99
|
+
id: "sub-rn",
|
|
100
|
+
query: { doctype: "ToDo" },
|
|
101
|
+
checkpoint: "2024-01-01T10:00:00",
|
|
102
|
+
docIds: ["t1"],
|
|
103
|
+
};
|
|
104
|
+
mockStorage.getItem.mockResolvedValue(
|
|
105
|
+
JSON.stringify({
|
|
106
|
+
subs: [snapshotSub],
|
|
107
|
+
cache: {
|
|
108
|
+
ToDo: { byId: { t1: { doctype: "ToDo", name: "t1" } }, allIds: ["t1"] },
|
|
109
|
+
},
|
|
110
|
+
journal: [],
|
|
111
|
+
temp: [],
|
|
112
|
+
}),
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const manager = createManager({ persistKey: "rn-key", storage: mockStorage });
|
|
116
|
+
await manager.whenReady();
|
|
117
|
+
|
|
118
|
+
expect(mockSubscriptionManager.restoreSubscription).toHaveBeenCalledWith(snapshotSub);
|
|
119
|
+
expect(mockNormalizedCache.upsert).toHaveBeenCalledWith(
|
|
120
|
+
{ doctype: "ToDo", name: "t1" },
|
|
121
|
+
{ replace: true },
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("skips BroadcastChannel and tab coordination on native", () => {
|
|
126
|
+
createManager({ persistKey: "rn-key", storage: mockStorage });
|
|
127
|
+
expect(broadcastChannelSpy).not.toHaveBeenCalled();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("stays fully inert without persistKey", async () => {
|
|
131
|
+
const manager = createManager({});
|
|
132
|
+
await manager.whenReady();
|
|
133
|
+
manager.scheduleSave();
|
|
134
|
+
await vi.advanceTimersByTimeAsync(60);
|
|
135
|
+
|
|
136
|
+
expect(mockStorage.getItem).not.toHaveBeenCalled();
|
|
137
|
+
expect(mockStorage.setItem).not.toHaveBeenCalled();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
@@ -34,6 +34,8 @@ describe("RealtimeHandler", () => {
|
|
|
34
34
|
}),
|
|
35
35
|
isHealthy: vi.fn().mockReturnValue(true),
|
|
36
36
|
disconnect: vi.fn(),
|
|
37
|
+
subscribeList: vi.fn().mockResolvedValue(undefined),
|
|
38
|
+
unsubscribeList: vi.fn(),
|
|
37
39
|
} as any;
|
|
38
40
|
|
|
39
41
|
mockNormalizedCache = {
|
|
@@ -71,6 +73,9 @@ describe("RealtimeHandler", () => {
|
|
|
71
73
|
{},
|
|
72
74
|
);
|
|
73
75
|
|
|
76
|
+
// Real Frappe v15 emits doc_update/list_update; designed names kept as forward-compat.
|
|
77
|
+
expect(mockRealtime.on).toHaveBeenCalledWith("doc_update", expect.any(Function));
|
|
78
|
+
expect(mockRealtime.on).toHaveBeenCalledWith("list_update", expect.any(Function));
|
|
74
79
|
expect(mockRealtime.on).toHaveBeenCalledWith("doc_changed", expect.any(Function));
|
|
75
80
|
expect(mockRealtime.on).toHaveBeenCalledWith("doc_deleted", expect.any(Function));
|
|
76
81
|
expect(mockRealtime.on).toHaveBeenCalledWith("perm_epoch_bump", expect.any(Function));
|
|
@@ -366,7 +371,9 @@ describe("RealtimeHandler", () => {
|
|
|
366
371
|
|
|
367
372
|
// Verify reconnection was cancelled
|
|
368
373
|
vi.advanceTimersByTime(5000);
|
|
369
|
-
|
|
374
|
+
// Initial setup: doc_update, list_update, doc_changed, doc_deleted,
|
|
375
|
+
// perm_epoch_bump, connected, disconnect (real Frappe protocol + lifecycle).
|
|
376
|
+
expect(mockRealtime.on).toHaveBeenCalledTimes(7);
|
|
370
377
|
});
|
|
371
378
|
});
|
|
372
379
|
|
|
@@ -505,6 +512,16 @@ describe("RealtimeHandler", () => {
|
|
|
505
512
|
// First establish connection
|
|
506
513
|
eventHandlers.connected();
|
|
507
514
|
|
|
515
|
+
// calculateReconnectDelay clamps to reconnectBaseDelay, so any negative
|
|
516
|
+
// jitter draw (Math.random() < 0.5) collapses to exactly 1000ms — with
|
|
517
|
+
// three real draws all three collapsed ~12.5% of runs, flaking the
|
|
518
|
+
// variance assertion below. Use deterministic distinct draws instead.
|
|
519
|
+
vi.spyOn(Math, "random")
|
|
520
|
+
.mockReturnValueOnce(0.6)
|
|
521
|
+
.mockReturnValueOnce(0.8)
|
|
522
|
+
.mockReturnValueOnce(0.95)
|
|
523
|
+
.mockReturnValue(0.5);
|
|
524
|
+
|
|
508
525
|
const delays: number[] = [];
|
|
509
526
|
|
|
510
527
|
// Collect multiple reconnection delays
|