@multiplatform.one/frappe 6.1.0 → 6.4.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 +10 -2
- package/dist/esm/util.mjs.map +1 -1
- package/dist/esm/util.native.js +15 -2
- 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 +10 -2
- 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 +445 -37
- package/src/frappeReactLiveQueryGc.spec.ts +320 -0
- package/src/frappeReactNative.spec.ts +65 -0
- package/src/index.ts +10 -9
- package/src/pacer.ts +1 -1
- 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 +34 -7
- 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
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { FrappeDocData } from "../common/types";
|
|
2
|
+
import type { DbModule } from "../db";
|
|
3
|
+
import type { RealtimeModule } from "../realtime";
|
|
4
|
+
import type { MutationJournal } from "./mutationJournal";
|
|
5
|
+
import type { NormalizedCache } from "./normalizedCache";
|
|
6
|
+
import type { RehydrationManager } from "./rehydration";
|
|
7
|
+
import type { SubscriptionManager } from "./subscriptionManager";
|
|
8
|
+
import type { SyncOptions, Mutation } from "./types";
|
|
9
|
+
export interface SortField {
|
|
10
|
+
field: string;
|
|
11
|
+
isAsc: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare class MutationEngine {
|
|
14
|
+
private temporaryIdToRealNameMap;
|
|
15
|
+
private globalOptimisticDocIds;
|
|
16
|
+
/** Pending mutations waiting to be batched */
|
|
17
|
+
private pendingBatch;
|
|
18
|
+
/** Debouncer for batch processing */
|
|
19
|
+
private batchDebouncer;
|
|
20
|
+
private readonly db;
|
|
21
|
+
private readonly realtime;
|
|
22
|
+
private readonly normalizedCache;
|
|
23
|
+
private readonly mutationJournal;
|
|
24
|
+
private readonly subscriptionManager;
|
|
25
|
+
private readonly rehydrationManager;
|
|
26
|
+
private readonly options;
|
|
27
|
+
constructor(db: DbModule, realtime: RealtimeModule | undefined, normalizedCache: NormalizedCache, mutationJournal: MutationJournal, subscriptionManager: SubscriptionManager, rehydrationManager: RehydrationManager, options?: SyncOptions);
|
|
28
|
+
/**
|
|
29
|
+
* Queue a mutation for batch processing.
|
|
30
|
+
* Returns a promise that resolves when the batch is processed.
|
|
31
|
+
*/
|
|
32
|
+
private queueForBatch;
|
|
33
|
+
/**
|
|
34
|
+
* Flush pending mutations as a batch.
|
|
35
|
+
*/
|
|
36
|
+
private flushBatch;
|
|
37
|
+
/**
|
|
38
|
+
* Force flush any pending batched mutations.
|
|
39
|
+
*/
|
|
40
|
+
forceBatchFlush(): Promise<void>;
|
|
41
|
+
mutate<Data extends FrappeDocData>(mutation: Mutation<Data>): Promise<void>;
|
|
42
|
+
private handleOptimisticUpdate;
|
|
43
|
+
private handleOptimisticCreate;
|
|
44
|
+
private handleServerCreate;
|
|
45
|
+
private handleServerUpdate;
|
|
46
|
+
private handleServerDelete;
|
|
47
|
+
private handleTemporaryToRealMapping;
|
|
48
|
+
private refetchAffectedDocs;
|
|
49
|
+
private handleMutationError;
|
|
50
|
+
/**
|
|
51
|
+
* Rolls back optimistic state when a mutation fails.
|
|
52
|
+
* Handles all operation types: create, update, and delete.
|
|
53
|
+
*/
|
|
54
|
+
private rollbackOptimisticState;
|
|
55
|
+
private handleFailedCreate;
|
|
56
|
+
private handleConflict;
|
|
57
|
+
/**
|
|
58
|
+
* Determines optimal placement for an optimistic item based on sort fields.
|
|
59
|
+
* Supports multi-column sorting with proper tie-breaking.
|
|
60
|
+
*
|
|
61
|
+
* @param subscription - The subscription to check placement against
|
|
62
|
+
* @param candidate - The document to place
|
|
63
|
+
* @returns Placement relative to current page:
|
|
64
|
+
* - 'before': Item belongs on a previous page
|
|
65
|
+
* - 'within': Item belongs on the current page
|
|
66
|
+
* - 'after': Item belongs on a later page
|
|
67
|
+
* - 'unknown': Cannot determine placement (needs full refresh)
|
|
68
|
+
*
|
|
69
|
+
* @remarks
|
|
70
|
+
* Uses page boundaries when available for O(1) placement checks.
|
|
71
|
+
* Falls back to comparing against first/last items in current page.
|
|
72
|
+
* Supports multi-field sorting with tie-breaking.
|
|
73
|
+
*/
|
|
74
|
+
private determineOptimisticPlacement;
|
|
75
|
+
private determinePlacementWithBoundaries;
|
|
76
|
+
private parseSortFields;
|
|
77
|
+
/**
|
|
78
|
+
* Replays pending mutations with simplified error handling and rate limiting.
|
|
79
|
+
*
|
|
80
|
+
* Since HTTP client now handles retries automatically for transient errors,
|
|
81
|
+
* we only need to handle:
|
|
82
|
+
* - Success → confirm and remove from journal
|
|
83
|
+
* - Conflict (409/412) → attempt merge resolution, then retry
|
|
84
|
+
* - Auth (401/403) → notify user, keep in journal for later retry
|
|
85
|
+
* - Permanent (4xx validation) → fail and remove from journal
|
|
86
|
+
* - Failed (exhausted retries) → keep in journal but notify
|
|
87
|
+
*
|
|
88
|
+
* The replay path uses plain CRUD without optimistic writes,
|
|
89
|
+
* since optimistic state is already reflected in the cache.
|
|
90
|
+
*
|
|
91
|
+
* Rate limiting is applied to prevent hammering the server when replaying
|
|
92
|
+
* large numbers of queued mutations after coming back online.
|
|
93
|
+
*/
|
|
94
|
+
replayPending(): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Classifies errors for journal management.
|
|
97
|
+
*/
|
|
98
|
+
private classifyError;
|
|
99
|
+
/**
|
|
100
|
+
* Helper to notify about mutation errors with proper typing
|
|
101
|
+
*/
|
|
102
|
+
private notifyMutationError;
|
|
103
|
+
/**
|
|
104
|
+
* Converts SyncOptions.fieldMergeConfig into the MergeConfig format
|
|
105
|
+
* expected by the merge() function.
|
|
106
|
+
*/
|
|
107
|
+
private buildMergeConfig;
|
|
108
|
+
/** Gets temporary to real name mapping. */
|
|
109
|
+
getTemporaryIdToRealNameMap(): Map<string, string>;
|
|
110
|
+
/** Clears all temporary mappings. */
|
|
111
|
+
clearTemporaryMappings(): void;
|
|
112
|
+
/**
|
|
113
|
+
* Disposes of resources.
|
|
114
|
+
*/
|
|
115
|
+
dispose(): void;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=mutationEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutationEngine.d.ts","sourceRoot":"","sources":["../../src/sync/mutationEngine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,OAAO,KAAK,EAAE,eAAe,EAAW,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAUjE,OAAO,KAAK,EAGV,WAAW,EACX,QAAQ,EAIT,MAAM,SAAS,CAAC;AASjB,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,wBAAwB,CAA6B;IAC7D,OAAO,CAAC,sBAAsB,CAAkC;IAChE,8CAA8C;IAC9C,OAAO,CAAC,YAAY,CAA6C;IACjE,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAGpC,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,cAAc,GAAG,SAAS,EACpC,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,mBAAmB,EAAE,mBAAmB,EACxC,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,GAAE,WAAgB;IAc3B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;YACW,UAAU;IAuExB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAKhC,MAAM,CAAC,IAAI,SAAS,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC;YAqHnD,sBAAsB;YAgBtB,sBAAsB;YAqDtB,kBAAkB;YAwBlB,kBAAkB;YAQlB,kBAAkB;IAwBhC,OAAO,CAAC,4BAA4B;YAiBtB,mBAAmB;YAmBnB,mBAAmB;IA4BjC;;;OAGG;YACW,uBAAuB;YA+CvB,kBAAkB;YAkBlB,cAAc;IAyD5B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,4BAA4B;IA6DpC,OAAO,CAAC,gCAAgC;IAkCxC,OAAO,CAAC,eAAe;IAoBvB;;;;;;;;;;;;;;;;OAgBG;IACG,aAAa;IA6FnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgD3B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAWxB,2CAA2C;IAC3C,2BAA2B,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIlD,qCAAqC;IACrC,sBAAsB;IAKtB;;OAEG;IACH,OAAO;CAMR"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { FrappeDoc, FrappeDocData } from "../common/types";
|
|
2
|
+
import type { Operation } from "./types";
|
|
3
|
+
import { Status } from "./types";
|
|
4
|
+
export declare const frappeSyncSequence = "frappe-sync-sequence";
|
|
5
|
+
export interface Pending {
|
|
6
|
+
createdAt?: number;
|
|
7
|
+
docname?: string;
|
|
8
|
+
doctype: string;
|
|
9
|
+
error?: Error | {
|
|
10
|
+
message: string;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
operation: Operation;
|
|
14
|
+
retryCount?: number;
|
|
15
|
+
sequence?: number;
|
|
16
|
+
snapshot?: FrappeDoc<FrappeDocData>;
|
|
17
|
+
status: Status;
|
|
18
|
+
ttl?: number;
|
|
19
|
+
values?: FrappeDoc<FrappeDocData>;
|
|
20
|
+
version?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface MutationJournalOptions {
|
|
23
|
+
enableAutoCleanup?: boolean;
|
|
24
|
+
storage?: Storage;
|
|
25
|
+
ttl?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class MutationJournal {
|
|
28
|
+
private cleanupTimer?;
|
|
29
|
+
private autoCleanupEnabled;
|
|
30
|
+
private ttl;
|
|
31
|
+
private pending;
|
|
32
|
+
private sequenceNumber;
|
|
33
|
+
private storage?;
|
|
34
|
+
constructor(options?: MutationJournalOptions);
|
|
35
|
+
add(id: string, entry: Pending): void;
|
|
36
|
+
get(id: string): Pending | undefined;
|
|
37
|
+
confirm(id: string): void;
|
|
38
|
+
fail(id: string, err?: Error | {
|
|
39
|
+
message: string;
|
|
40
|
+
[key: string]: unknown;
|
|
41
|
+
}): void;
|
|
42
|
+
listPending(): {
|
|
43
|
+
id: string;
|
|
44
|
+
entry: Pending;
|
|
45
|
+
}[];
|
|
46
|
+
getAllEntries(): Array<{
|
|
47
|
+
id: string;
|
|
48
|
+
entry: Pending;
|
|
49
|
+
}>;
|
|
50
|
+
cleanupExpired(): number;
|
|
51
|
+
stopAutoCleanup(): void;
|
|
52
|
+
clear(): void;
|
|
53
|
+
dispose(): void;
|
|
54
|
+
private getNextSequence;
|
|
55
|
+
private isExpired;
|
|
56
|
+
private startAutoCleanup;
|
|
57
|
+
private loadSequenceNumber;
|
|
58
|
+
private persistSequenceNumber;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=mutationJournal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutationJournal.d.ts","sourceRoot":"","sources":["../../src/sync/mutationJournal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,eAAO,MAAM,kBAAkB,yBAAyB,CAAC;AAEzD,MAAM,WAAW,OAAO;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC5D,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAC,CAAiC;IACtD,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAU;gBAEd,OAAO,CAAC,EAAE,sBAAsB;IAgB5C,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAU9B,GAAG,CAAC,EAAE,EAAE,MAAM;IAUd,OAAO,CAAC,EAAE,EAAE,MAAM;IAOlB,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE;IAS1E,WAAW;YACkB,MAAM;eAAS,OAAO;;IAcnD,aAAa,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAStD,cAAc;IAWd,eAAe;IAOf,KAAK;IAKL,OAAO;IAKP,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,qBAAqB;CAI9B"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { FrappeDoc, FrappeDocData } from "../common/types";
|
|
2
|
+
export type EntityState = Record<string, {
|
|
3
|
+
byId: Record<string, FrappeDoc<FrappeDocData>>;
|
|
4
|
+
allIds: string[];
|
|
5
|
+
}>;
|
|
6
|
+
export interface NormalizedCacheOptions {
|
|
7
|
+
/** Maximum number of documents to keep in cache (default: unlimited) */
|
|
8
|
+
maxSize?: number;
|
|
9
|
+
/** Callback when eviction occurs */
|
|
10
|
+
onEvict?: (doctype: string, name: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface UpsertOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Replace the cached document wholesale instead of merging fields.
|
|
15
|
+
* Use when the incoming doc is authoritative for its entire shape
|
|
16
|
+
* (e.g. restoring a rollback snapshot).
|
|
17
|
+
*/
|
|
18
|
+
replace?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Normalized cache with optional LRU eviction.
|
|
22
|
+
*
|
|
23
|
+
* Documents are stored by doctype and name for O(1) lookups.
|
|
24
|
+
* When maxSize is set, least recently used documents are evicted
|
|
25
|
+
* to keep the cache within bounds.
|
|
26
|
+
*/
|
|
27
|
+
export declare class NormalizedCache {
|
|
28
|
+
state: EntityState;
|
|
29
|
+
/** LRU tracking: composite key "doctype:name" -> last access timestamp */
|
|
30
|
+
private accessOrder;
|
|
31
|
+
private readonly maxSize;
|
|
32
|
+
private readonly onEvict?;
|
|
33
|
+
constructor(options?: NormalizedCacheOptions);
|
|
34
|
+
private makeKey;
|
|
35
|
+
private parseKey;
|
|
36
|
+
upsert<Data extends FrappeDocData>(doc: FrappeDoc<Data>, options?: UpsertOptions): void;
|
|
37
|
+
remove<Data extends FrappeDocData>(doc: Pick<FrappeDoc<Data>, "doctype" | "name">): void;
|
|
38
|
+
get<Data extends FrappeDocData>(doc: Pick<FrappeDoc<Data>, "doctype" | "name">): FrappeDoc<FrappeDocData>;
|
|
39
|
+
getStats(): {
|
|
40
|
+
size: number;
|
|
41
|
+
doctypes: {
|
|
42
|
+
doctype: string;
|
|
43
|
+
count: number;
|
|
44
|
+
}[];
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Evicts least recently used documents if cache exceeds maxSize.
|
|
48
|
+
*/
|
|
49
|
+
private evictIfNeeded;
|
|
50
|
+
/**
|
|
51
|
+
* Clears the entire cache.
|
|
52
|
+
*/
|
|
53
|
+
clear(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Gets the current cache size.
|
|
56
|
+
*/
|
|
57
|
+
get size(): number;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=normalizedCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizedCache.d.ts","sourceRoot":"","sources":["../../src/sync/normalizedCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG,MAAM,CAC9B,MAAM,EACN;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CACrE,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,KAAK,EAAE,WAAW,CAAM;IACxB,0EAA0E;IAC1E,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA0C;gBAEvD,OAAO,GAAE,sBAA2B;IAKhD,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,QAAQ;IAQhB,MAAM,CAAC,IAAI,SAAS,aAAa,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,GAAE,aAAkB;IAgCpF,MAAM,CAAC,IAAI,SAAS,aAAa,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAWjF,GAAG,CAAC,IAAI,SAAS,aAAa,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAY9E,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE;IAW5E;;OAEG;IACH,OAAO,CAAC,aAAa;IA8BrB;;OAEG;IACH,KAAK;IAKL;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistence manager for sync state snapshots.
|
|
3
|
+
*
|
|
4
|
+
* Handles saving and loading of subscriptions, cache, journal, and temporary
|
|
5
|
+
* ID mappings to/from persistent storage for fast resume after page reload.
|
|
6
|
+
*/
|
|
7
|
+
import type { FrappeDocData } from "../common/types";
|
|
8
|
+
import type { MutationEngine } from "./mutationEngine";
|
|
9
|
+
import type { MutationJournal } from "./mutationJournal";
|
|
10
|
+
import type { NormalizedCache } from "./normalizedCache";
|
|
11
|
+
import type { SubscriptionManager } from "./subscriptionManager";
|
|
12
|
+
import type { SyncOptions, Mutation } from "./types";
|
|
13
|
+
/**
|
|
14
|
+
* Manages persistence of sync state across sessions with active tab priority leadership.
|
|
15
|
+
*/
|
|
16
|
+
export declare class PersistenceManager {
|
|
17
|
+
private persistenceStorage?;
|
|
18
|
+
private readonly saveDebouncer;
|
|
19
|
+
private broadcastChannel?;
|
|
20
|
+
private isLeader;
|
|
21
|
+
private tabId;
|
|
22
|
+
private leaderCheckInterval;
|
|
23
|
+
private visibilityState;
|
|
24
|
+
private lastVisibilityChange;
|
|
25
|
+
private pendingOperations;
|
|
26
|
+
private acceptingNewWork;
|
|
27
|
+
private handoffInProgress;
|
|
28
|
+
private tabCoordinationConfig;
|
|
29
|
+
private readonly leaderKey;
|
|
30
|
+
/** Cleanup function returned by the visibility change lifecycle subscription. */
|
|
31
|
+
private cleanupVisibilityChange?;
|
|
32
|
+
/** Active response timers that need cleanup. */
|
|
33
|
+
private activeResponseTimers;
|
|
34
|
+
/** Flag to prevent operations after destroy. */
|
|
35
|
+
private isDestroyed;
|
|
36
|
+
/**
|
|
37
|
+
* Resolves once the persisted snapshot (if any) has been restored into
|
|
38
|
+
* memory. Resolved immediately when persistence is disabled. Never rejects.
|
|
39
|
+
*/
|
|
40
|
+
private loadPromise;
|
|
41
|
+
private readonly normalizedCache;
|
|
42
|
+
private readonly mutationJournal;
|
|
43
|
+
private readonly subscriptionManager;
|
|
44
|
+
private readonly mutationEngine;
|
|
45
|
+
private readonly options;
|
|
46
|
+
constructor(normalizedCache: NormalizedCache, mutationJournal: MutationJournal, subscriptionManager: SubscriptionManager, mutationEngine: MutationEngine, options?: SyncOptions);
|
|
47
|
+
/**
|
|
48
|
+
* Resolves when the initial snapshot restore has completed (immediately if
|
|
49
|
+
* persistence is off). `SyncModule.subscribe` awaits this so a fresh mount
|
|
50
|
+
* can re-adopt a restored subscription instead of racing the async load.
|
|
51
|
+
*/
|
|
52
|
+
whenReady(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Sets up persistence storage based on environment and options.
|
|
55
|
+
*/
|
|
56
|
+
private setupPersistence;
|
|
57
|
+
/**
|
|
58
|
+
* Sets up BroadcastChannel for cross-tab coordination.
|
|
59
|
+
* Handles both simple string messages and structured TabMessage types.
|
|
60
|
+
*/
|
|
61
|
+
private setupBroadcastChannel;
|
|
62
|
+
/**
|
|
63
|
+
* Handles a mutation relayed from another tab.
|
|
64
|
+
* Updates local cache with the mutation's effects.
|
|
65
|
+
*/
|
|
66
|
+
private handleRemoteMutation;
|
|
67
|
+
/**
|
|
68
|
+
* Broadcasts a mutation to other tabs.
|
|
69
|
+
* Called by SyncModule after a successful mutation.
|
|
70
|
+
*/
|
|
71
|
+
broadcastMutation(mutation: Mutation<FrappeDocData>): void;
|
|
72
|
+
/**
|
|
73
|
+
* Restores state received from a leadership handoff or sync-state message.
|
|
74
|
+
*/
|
|
75
|
+
private restoreStateFromHandoff;
|
|
76
|
+
/**
|
|
77
|
+
* Schedules a debounced save operation.
|
|
78
|
+
*/
|
|
79
|
+
scheduleSave(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Persists a snapshot of subscriptions, cache, journal, and temp mappings.
|
|
82
|
+
*/
|
|
83
|
+
private save;
|
|
84
|
+
/**
|
|
85
|
+
* Loads a previously persisted snapshot if present.
|
|
86
|
+
*/
|
|
87
|
+
private load;
|
|
88
|
+
/**
|
|
89
|
+
* Broadcasts a reset message to other tabs.
|
|
90
|
+
*/
|
|
91
|
+
broadcastReset(): void;
|
|
92
|
+
/**
|
|
93
|
+
* Broadcasts a backfill message to other tabs.
|
|
94
|
+
*/
|
|
95
|
+
broadcastBackfill(): void;
|
|
96
|
+
/**
|
|
97
|
+
* Broadcasts a generic change message to other tabs.
|
|
98
|
+
*/
|
|
99
|
+
broadcastChange(): void;
|
|
100
|
+
/**
|
|
101
|
+
* Sets up tab coordination with active tab priority.
|
|
102
|
+
*/
|
|
103
|
+
private setupTabCoordination;
|
|
104
|
+
/**
|
|
105
|
+
* Attempts to become the leader tab.
|
|
106
|
+
*/
|
|
107
|
+
private tryBecomeLeader;
|
|
108
|
+
/**
|
|
109
|
+
* Becomes the leader tab.
|
|
110
|
+
*/
|
|
111
|
+
private becomeLeader;
|
|
112
|
+
/**
|
|
113
|
+
* Updates leader timestamp in localStorage.
|
|
114
|
+
*/
|
|
115
|
+
private updateLeaderTimestamp;
|
|
116
|
+
/**
|
|
117
|
+
* Checks if this tab should remain leader.
|
|
118
|
+
*/
|
|
119
|
+
private checkLeadership;
|
|
120
|
+
/**
|
|
121
|
+
* Gets current leader data from localStorage.
|
|
122
|
+
*/
|
|
123
|
+
private getLeaderData;
|
|
124
|
+
/**
|
|
125
|
+
* Evaluates if this tab should take leadership based on visibility priority.
|
|
126
|
+
*/
|
|
127
|
+
private evaluateLeadershipPriority;
|
|
128
|
+
/**
|
|
129
|
+
* Considers handing off leadership when tab becomes hidden.
|
|
130
|
+
*/
|
|
131
|
+
private considerLeadershipHandoff;
|
|
132
|
+
/**
|
|
133
|
+
* Requests leadership handoff from current leader.
|
|
134
|
+
*/
|
|
135
|
+
private requestLeadershipHandoff;
|
|
136
|
+
/**
|
|
137
|
+
* Initiates graceful handoff to another tab.
|
|
138
|
+
*/
|
|
139
|
+
private initiateGracefulHandoff;
|
|
140
|
+
/**
|
|
141
|
+
* Waits for all pending operations to complete.
|
|
142
|
+
*/
|
|
143
|
+
private waitForPendingOperations;
|
|
144
|
+
/**
|
|
145
|
+
* Finds a suitable successor for leadership.
|
|
146
|
+
*/
|
|
147
|
+
private findSuccessor;
|
|
148
|
+
/**
|
|
149
|
+
* Checks if there are other active tabs.
|
|
150
|
+
*/
|
|
151
|
+
private checkForActiveTabs;
|
|
152
|
+
/**
|
|
153
|
+
* Captures current state for handoff.
|
|
154
|
+
*/
|
|
155
|
+
private captureState;
|
|
156
|
+
/**
|
|
157
|
+
* Broadcasts message to other tabs.
|
|
158
|
+
*/
|
|
159
|
+
private broadcastToTabs;
|
|
160
|
+
/**
|
|
161
|
+
* Handles becoming the leader.
|
|
162
|
+
*/
|
|
163
|
+
private onBecomeLeader;
|
|
164
|
+
/**
|
|
165
|
+
* Handles losing leadership.
|
|
166
|
+
*/
|
|
167
|
+
private onLoseLeadership;
|
|
168
|
+
/**
|
|
169
|
+
* Generates a unique tab ID.
|
|
170
|
+
*/
|
|
171
|
+
private generateTabId;
|
|
172
|
+
/**
|
|
173
|
+
* Tracks a pending operation.
|
|
174
|
+
*/
|
|
175
|
+
trackOperation<T>(operation: Promise<T>): Promise<T>;
|
|
176
|
+
/**
|
|
177
|
+
* Gets whether this tab is the leader.
|
|
178
|
+
*/
|
|
179
|
+
getIsLeader(): boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Cleans up timers, event listeners, and channels.
|
|
182
|
+
*/
|
|
183
|
+
destroy(): void;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/sync/persistence.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAa,QAAQ,EAAqC,MAAM,SAAS,CAAC;AAanG;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,kBAAkB,CAAC,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuD;IACrF,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAG5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,mBAAmB,CAA6C;IACxE,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,oBAAoB,CAAc;IAC1C,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,qBAAqB,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAClD,iFAAiF;IACjF,OAAO,CAAC,uBAAuB,CAAC,CAAa;IAC7C,gDAAgD;IAChD,OAAO,CAAC,oBAAoB,CAA4C;IACxE,gDAAgD;IAChD,OAAO,CAAC,WAAW,CAAS;IAC5B;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAGpC,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,mBAAmB,EAAE,mBAAmB,EACxC,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE,WAAgB;IAiD3B;;;;OAIG;IACH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoF7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC;IASnD;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAkC/B;;OAEG;IACH,YAAY;IAKZ;;OAEG;YACW,IAAI;IA0BlB;;OAEG;YACW,IAAI;IAqDlB;;OAEG;IACH,cAAc;IAMd;;OAEG;IACH,iBAAiB;IAMjB;;OAEG;IACH,eAAe;IAMf;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAelC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAQhC;;OAEG;YACW,uBAAuB;IAgCrC;;OAEG;YACW,wBAAwB;IAUtC;;OAEG;YACW,aAAa;IAyC3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;YACW,YAAY;IAS1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAgBvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAUpD;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO;CA+BR"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { DbModule } from "../db";
|
|
2
|
+
import type { RealtimeModule } from "../realtime";
|
|
3
|
+
import type { NormalizedCache } from "./normalizedCache";
|
|
4
|
+
import type { RehydrationManager } from "./rehydration";
|
|
5
|
+
import type { SubscriptionManager } from "./subscriptionManager";
|
|
6
|
+
import type { SyncOptions } from "./types";
|
|
7
|
+
export declare class RealtimeHandler {
|
|
8
|
+
private reconnectAttempts;
|
|
9
|
+
private reconnectTimer;
|
|
10
|
+
private hasConnected;
|
|
11
|
+
/** Live socket state: true between `connected` and `disconnect` events. */
|
|
12
|
+
private connected;
|
|
13
|
+
private connectionConfig;
|
|
14
|
+
/** Refcount of active subscriptions per doctype — drives doctype room membership. */
|
|
15
|
+
private watchedDoctypes;
|
|
16
|
+
/** In-flight authoritative fetches, deduping concurrent doc_update/list_update pairs. */
|
|
17
|
+
private inflightFetches;
|
|
18
|
+
private readonly db;
|
|
19
|
+
private readonly realtime;
|
|
20
|
+
private readonly normalizedCache;
|
|
21
|
+
private readonly subscriptionManager;
|
|
22
|
+
private readonly rehydrationManager;
|
|
23
|
+
private readonly options;
|
|
24
|
+
constructor(db: DbModule, realtime: RealtimeModule | undefined, normalizedCache: NormalizedCache, subscriptionManager: SubscriptionManager, rehydrationManager: RehydrationManager | undefined, options?: SyncOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Sets up realtime event handlers for document changes.
|
|
27
|
+
*
|
|
28
|
+
* Real Frappe (v15) wire protocol, verified live against a stock bench
|
|
29
|
+
* (see .test-evidence/storybook-rubric/p-results/frappe-realtime-live-e2e.md):
|
|
30
|
+
* - `doc_update` `{doctype, name, modified}` — emitted to the per-doc room
|
|
31
|
+
* `doc:{doctype}/{name}` on every save.
|
|
32
|
+
* - `list_update` `{doctype, name, user}` — emitted to the doctype room
|
|
33
|
+
* `doctype:{doctype}` on every save of a non-single, non-child doctype.
|
|
34
|
+
* - Deletion emits the SAME two events (payload indistinguishable from an
|
|
35
|
+
* update) — there is NO `doc_deleted` event. Deletions are detected here
|
|
36
|
+
* opportunistically when the authoritative re-fetch 404s, but the durable
|
|
37
|
+
* deletion signal remains the tombstone/CDC backfill (`Deleted Document`
|
|
38
|
+
* doctype maintained by the `live` app's on_trash hook).
|
|
39
|
+
*
|
|
40
|
+
* Both real events funnel into the same fetch-and-reconcile path, deduped
|
|
41
|
+
* so a doc_update/list_update pair for the same doc costs one fetch.
|
|
42
|
+
*/
|
|
43
|
+
private setupRealtimeHandlers;
|
|
44
|
+
/**
|
|
45
|
+
* Sets up connection management with exponential backoff and jitter.
|
|
46
|
+
*/
|
|
47
|
+
private setupConnectionManagement;
|
|
48
|
+
/**
|
|
49
|
+
* Handles successful connection.
|
|
50
|
+
*/
|
|
51
|
+
private onConnected;
|
|
52
|
+
/**
|
|
53
|
+
* Handles disconnection with automatic reconnection.
|
|
54
|
+
*/
|
|
55
|
+
private onDisconnected;
|
|
56
|
+
/**
|
|
57
|
+
* No-op placeholder retained for the disconnect backoff schedule below.
|
|
58
|
+
* Transport reconnect is owned by Socket.IO inside RealtimeModule; this
|
|
59
|
+
* layer only tracks attempts for logging / future health hooks.
|
|
60
|
+
*/
|
|
61
|
+
private attemptConnection;
|
|
62
|
+
/**
|
|
63
|
+
* Schedules a reconnection *watchdog* tick with exponential backoff and jitter.
|
|
64
|
+
* Does not open sockets — RealtimeModule already reconnects. Kept so disconnect
|
|
65
|
+
* storms remain observable (and existing unit tests stay meaningful).
|
|
66
|
+
*/
|
|
67
|
+
private scheduleReconnection;
|
|
68
|
+
/**
|
|
69
|
+
* Calculates the reconnection delay with exponential backoff and jitter.
|
|
70
|
+
*/
|
|
71
|
+
private calculateReconnectDelay;
|
|
72
|
+
/**
|
|
73
|
+
* Join the realtime doctype room for a doctype (refcounted). Called by the
|
|
74
|
+
* sync module whenever a subscription for the doctype is added. Room
|
|
75
|
+
* membership survives reconnects — RealtimeModule re-joins tracked rooms on
|
|
76
|
+
* every `connect`.
|
|
77
|
+
*
|
|
78
|
+
* Note: only doctype-level rooms are joined. `list_update` fires for every
|
|
79
|
+
* save of a regular doctype, which covers doc updates too; per-doc rooms
|
|
80
|
+
* would only add coverage for single/read-only doctypes.
|
|
81
|
+
*/
|
|
82
|
+
watchDoctype(doctype: string): void;
|
|
83
|
+
/** Release one reference to a doctype room; leaves the room on the last one. */
|
|
84
|
+
unwatchDoctype(doctype: string): void;
|
|
85
|
+
/** Leave all doctype rooms (used by cache resets/disposal). */
|
|
86
|
+
unwatchAll(): void;
|
|
87
|
+
/**
|
|
88
|
+
* Realtime handler: authoritative document changed.
|
|
89
|
+
* Fetches document via REST with current user context to respect permissions,
|
|
90
|
+
* updates cache, and reconciles subscription membership.
|
|
91
|
+
*
|
|
92
|
+
* Concurrent events for the same document (frappe emits doc_update AND
|
|
93
|
+
* list_update per save) share a single in-flight fetch.
|
|
94
|
+
*/
|
|
95
|
+
private onDocChanged;
|
|
96
|
+
private fetchAndReconcile;
|
|
97
|
+
/**
|
|
98
|
+
* Realtime handler: evicts document from cache and subscriptions.
|
|
99
|
+
*/
|
|
100
|
+
private onDocDeleted;
|
|
101
|
+
/**
|
|
102
|
+
* Checks if realtime is healthy for echo suppression decisions.
|
|
103
|
+
*/
|
|
104
|
+
isRealtimeHealthy(): boolean;
|
|
105
|
+
getIsConnected(): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Live connection snapshot for reconnect indicators.
|
|
108
|
+
* `connected` tracks the socket right now; `everConnected` distinguishes
|
|
109
|
+
* "reconnecting" (was up, dropped) from "never had realtime" (fixtures,
|
|
110
|
+
* SSR, no realtime module).
|
|
111
|
+
*/
|
|
112
|
+
getConnectionState(): {
|
|
113
|
+
connected: boolean;
|
|
114
|
+
everConnected: boolean;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Disposes of resources and clears timers.
|
|
118
|
+
*/
|
|
119
|
+
dispose(): void;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=realtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/sync/realtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,KAAK,EAAoB,WAAW,EAAE,MAAM,SAAS,CAAC;AAE7D,qBAAa,eAAe;IAC1B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA4C;IAClE,OAAO,CAAC,YAAY,CAAS;IAC7B,2EAA2E;IAC3E,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAA6B;IACrD,qFAAqF;IACrF,OAAO,CAAC,eAAe,CAA6B;IACpD,yFAAyF;IACzF,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiC;IACpE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAGpC,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,cAAc,GAAG,SAAS,EACpC,eAAe,EAAE,eAAe,EAChC,mBAAmB,EAAE,mBAAmB,EACxC,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,EAClD,OAAO,GAAE,WAAgB;IAkB3B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,qBAAqB;IAgE7B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAOjC;;OAEG;IACH,OAAO,CAAC,WAAW;IA0BnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuB/B;;;;;;;;;OASG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUnC,gFAAgF;IAChF,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUrC,+DAA+D;IAC/D,UAAU,IAAI,IAAI;IASlB;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;YAWN,iBAAiB;IAqC/B;;OAEG;YACW,YAAY;IA2B1B;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B,cAAc,IAAI,OAAO;IAIzB;;;;;OAKG;IACH,kBAAkB,IAAI;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE;IAIpE;;OAEG;IACH,OAAO;CAYR"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { DbModule } from "../db";
|
|
2
|
+
import type { MutationJournal } from "./mutationJournal";
|
|
3
|
+
import type { NormalizedCache } from "./normalizedCache";
|
|
4
|
+
import type { SubscriptionManager } from "./subscriptionManager";
|
|
5
|
+
import { RehydrationReason } from "./types";
|
|
6
|
+
import type { Subscription } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* Manages intelligent rehydration of subscriptions based on optimistic operations.
|
|
9
|
+
*
|
|
10
|
+
* The RehydrationManager determines when and how to refresh subscription data
|
|
11
|
+
* to maintain consistency after optimistic mutations. It uses different strategies
|
|
12
|
+
* based on the type of operation and its impact on pagination.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const manager = new RehydrationManager(db, cache, subscriptions, journal);
|
|
17
|
+
*
|
|
18
|
+
* // Schedule rehydration after creating a document
|
|
19
|
+
* manager.scheduleRehydration(subscription, 'create');
|
|
20
|
+
*
|
|
21
|
+
* // Register temporary ID mapping for later resolution
|
|
22
|
+
* manager.registerTempIdMapping('tmp_123', 'TASK-001');
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class RehydrationManager {
|
|
26
|
+
/** Queue of pending rehydration tasks, keyed by subscription ID */
|
|
27
|
+
private rehydrationQueue;
|
|
28
|
+
/** Debouncer for batching rehydration queue processing */
|
|
29
|
+
private readonly processDebouncer;
|
|
30
|
+
/** Maps temporary IDs to server-assigned IDs for optimistic creates */
|
|
31
|
+
private temporaryIdMap;
|
|
32
|
+
private readonly db;
|
|
33
|
+
private readonly cache;
|
|
34
|
+
private readonly subscriptionManager;
|
|
35
|
+
private readonly mutationJournal;
|
|
36
|
+
/** Notifies the sync store after rehydration mutates cache/membership. */
|
|
37
|
+
private readonly onChange?;
|
|
38
|
+
constructor(db: DbModule, cache: NormalizedCache, subscriptionManager: SubscriptionManager, mutationJournal: MutationJournal, onChange?: () => void);
|
|
39
|
+
/**
|
|
40
|
+
* Schedules a rehydration task for a subscription based on the reason.
|
|
41
|
+
* Coalesces multiple requests for the same subscription.
|
|
42
|
+
*
|
|
43
|
+
* @param subscription - The subscription to rehydrate
|
|
44
|
+
* @param reason - The reason for rehydration (affects strategy selection)
|
|
45
|
+
*
|
|
46
|
+
* @remarks
|
|
47
|
+
* Multiple rehydration requests for the same subscription are coalesced.
|
|
48
|
+
* Higher priority tasks override lower priority ones.
|
|
49
|
+
* Tasks are processed after a delay to batch multiple operations.
|
|
50
|
+
*/
|
|
51
|
+
scheduleRehydration(subscription: Subscription, reason: RehydrationReason): void;
|
|
52
|
+
/**
|
|
53
|
+
* Determines the rehydration strategy based on the reason.
|
|
54
|
+
*
|
|
55
|
+
* @param reason - The reason triggering rehydration
|
|
56
|
+
* @returns Strategy with type, priority, and delay
|
|
57
|
+
*
|
|
58
|
+
* @remarks
|
|
59
|
+
* Strategy selection matrix:
|
|
60
|
+
* - 'create': Fetch item only (low priority, 100ms delay)
|
|
61
|
+
* - 'delete': Full refresh (high priority, 500ms delay)
|
|
62
|
+
* - 'overflow': Full refresh (medium priority, 1000ms delay)
|
|
63
|
+
* - 'uncertain': Full refresh (low priority, 2000ms delay)
|
|
64
|
+
*/
|
|
65
|
+
private determineStrategy;
|
|
66
|
+
/**
|
|
67
|
+
* Schedules processing of the rehydration queue.
|
|
68
|
+
* Uses Pacer's Debouncer to batch multiple requests.
|
|
69
|
+
*/
|
|
70
|
+
private scheduleProcessing;
|
|
71
|
+
/**
|
|
72
|
+
* Processes all pending rehydration tasks.
|
|
73
|
+
*
|
|
74
|
+
* @remarks
|
|
75
|
+
* Tasks are processed in priority order (highest first).
|
|
76
|
+
* Within the same priority, earlier tasks are processed first.
|
|
77
|
+
* Failed tasks remain in the queue for retry.
|
|
78
|
+
*/
|
|
79
|
+
private processQueue;
|
|
80
|
+
/**
|
|
81
|
+
* Executes a single rehydration task.
|
|
82
|
+
*/
|
|
83
|
+
private executeRehydration;
|
|
84
|
+
/**
|
|
85
|
+
* Fetches only the optimistically created items to get server-generated fields.
|
|
86
|
+
*/
|
|
87
|
+
private fetchOptimisticItems;
|
|
88
|
+
/**
|
|
89
|
+
* Performs a full page refresh with reconciliation.
|
|
90
|
+
*/
|
|
91
|
+
private fullPageRefresh;
|
|
92
|
+
/**
|
|
93
|
+
* Reconciles server state with optimistic changes.
|
|
94
|
+
*/
|
|
95
|
+
private reconcilePage;
|
|
96
|
+
/**
|
|
97
|
+
* Gets pending create mutations for a doctype.
|
|
98
|
+
*/
|
|
99
|
+
private getPendingCreates;
|
|
100
|
+
/**
|
|
101
|
+
* Registers a temp ID to real name mapping.
|
|
102
|
+
*/
|
|
103
|
+
registerTempIdMapping(tempId: string, realName: string): void;
|
|
104
|
+
/**
|
|
105
|
+
* Clears the rehydration queue.
|
|
106
|
+
*/
|
|
107
|
+
clear(): void;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=rehydration.d.ts.map
|