@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
package/src/realtime.spec.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import {
|
|
2
|
+
import { io } from "socket.io-client";
|
|
3
|
+
import { AuthType } from "./core/types";
|
|
4
|
+
import { RealtimeModule, RealtimePlatform } from "./realtime";
|
|
3
5
|
|
|
4
6
|
// Mock socket.io-client
|
|
5
7
|
const mockSocket = {
|
|
@@ -9,7 +11,11 @@ const mockSocket = {
|
|
|
9
11
|
emit: vi.fn(),
|
|
10
12
|
connect: vi.fn(),
|
|
11
13
|
disconnect: vi.fn(),
|
|
14
|
+
removeAllListeners: vi.fn(),
|
|
12
15
|
id: "mock-socket-id",
|
|
16
|
+
// Manager handle: RealtimeModule mutates manager.opts on credential
|
|
17
|
+
// refresh and registers a reconnect_attempt safety net.
|
|
18
|
+
io: { opts: {} as Record<string, unknown>, on: vi.fn() },
|
|
13
19
|
};
|
|
14
20
|
|
|
15
21
|
vi.mock("socket.io-client", () => ({
|
|
@@ -67,6 +73,7 @@ describe("RealtimeModule", () => {
|
|
|
67
73
|
baseURL: "http://localhost:3000",
|
|
68
74
|
});
|
|
69
75
|
expect(rnInstance).toBeDefined();
|
|
76
|
+
expect((rnInstance as any).config.platform).toBe(RealtimePlatform.ReactNative);
|
|
70
77
|
|
|
71
78
|
// Restore
|
|
72
79
|
if (originalUA) {
|
|
@@ -76,6 +83,105 @@ describe("RealtimeModule", () => {
|
|
|
76
83
|
});
|
|
77
84
|
}
|
|
78
85
|
});
|
|
86
|
+
|
|
87
|
+
it("detects React Native via navigator.product (RN sets no userAgent)", () => {
|
|
88
|
+
// Real RN runtimes define navigator.product === "ReactNative" and NO
|
|
89
|
+
// userAgent — the old UA-only sniff misdetected RN as Web, skipping
|
|
90
|
+
// the extraHeaders auth path (cookie-auth sockets connected as guest).
|
|
91
|
+
const originalNavigator = (global as any).navigator;
|
|
92
|
+
Object.defineProperty(global, "navigator", {
|
|
93
|
+
value: { product: "ReactNative" },
|
|
94
|
+
writable: true,
|
|
95
|
+
});
|
|
96
|
+
const rnInstance = new RealtimeModule({ baseURL: "http://localhost:3000" });
|
|
97
|
+
expect((rnInstance as any).config.platform).toBe(RealtimePlatform.ReactNative);
|
|
98
|
+
Object.defineProperty(global, "navigator", {
|
|
99
|
+
value: originalNavigator,
|
|
100
|
+
writable: true,
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("keeps detecting Web in a browser-like environment", () => {
|
|
105
|
+
const webInstance = new RealtimeModule({ baseURL: "http://localhost:3000" });
|
|
106
|
+
expect((webInstance as any).config.platform).toBe(RealtimePlatform.Web);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("classifies GJS (imports.gi global) as Node — before the Web branch", () => {
|
|
110
|
+
// GJS has window/document layout stubs in the GNOME bundles, so the
|
|
111
|
+
// Web classification would otherwise win — but GJS has no XHR for a
|
|
112
|
+
// polling-first handshake and its libsoup WebSocket polyfill accepts
|
|
113
|
+
// custom headers, so it must take the non-Web (extraHeaders) path.
|
|
114
|
+
(globalThis as any).imports = { gi: {} };
|
|
115
|
+
try {
|
|
116
|
+
const gjsInstance = new RealtimeModule({ baseURL: "http://localhost:3000" });
|
|
117
|
+
expect((gjsInstance as any).config.platform).toBe(RealtimePlatform.Node);
|
|
118
|
+
} finally {
|
|
119
|
+
delete (globalThis as any).imports;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe("GJS handshake", () => {
|
|
125
|
+
function ioOptions(): Record<string, any> {
|
|
126
|
+
const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
|
|
127
|
+
return calls[calls.length - 1]?.[1] ?? {};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
it("connects websocket-first with token auth in extraHeaders", async () => {
|
|
131
|
+
(globalThis as any).imports = { gi: {} };
|
|
132
|
+
try {
|
|
133
|
+
const rt = new RealtimeModule({
|
|
134
|
+
baseURL: "http://localhost:3000",
|
|
135
|
+
auth: { useToken: true, token: "key:secret", type: AuthType.Token },
|
|
136
|
+
});
|
|
137
|
+
await (rt as any).connect();
|
|
138
|
+
|
|
139
|
+
const options = ioOptions();
|
|
140
|
+
expect(options.transports).toEqual(["websocket", "polling"]);
|
|
141
|
+
expect(options.extraHeaders.Authorization).toBe("token key:secret");
|
|
142
|
+
expect(options.extraHeaders.Origin).toBe("http://localhost:3000");
|
|
143
|
+
expect(options.transportOptions.websocket.extraHeaders.Authorization).toBe(
|
|
144
|
+
"token key:secret",
|
|
145
|
+
);
|
|
146
|
+
rt.disconnect();
|
|
147
|
+
} finally {
|
|
148
|
+
delete (globalThis as any).imports;
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
describe("React Native handshake", () => {
|
|
154
|
+
function ioOptions(): Record<string, any> {
|
|
155
|
+
const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
|
|
156
|
+
return calls[calls.length - 1]?.[1] ?? {};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
it("routes the sid session cookie into extraHeaders on RN (cookie auth)", async () => {
|
|
160
|
+
const originalNavigator = (global as any).navigator;
|
|
161
|
+
Object.defineProperty(global, "navigator", {
|
|
162
|
+
value: { product: "ReactNative" },
|
|
163
|
+
writable: true,
|
|
164
|
+
});
|
|
165
|
+
const rt = new RealtimeModule({
|
|
166
|
+
baseURL: "http://localhost:3000",
|
|
167
|
+
auth: { sessionId: async () => "sid-abc" },
|
|
168
|
+
});
|
|
169
|
+
await (rt as any).connect();
|
|
170
|
+
|
|
171
|
+
const options = ioOptions();
|
|
172
|
+
// Native is websocket-first and must carry sid + Origin itself —
|
|
173
|
+
// there is no shared browser cookie jar on the socket handshake.
|
|
174
|
+
expect(options.transports).toEqual(["websocket", "polling"]);
|
|
175
|
+
expect(options.extraHeaders.Cookie).toBe("sid=sid-abc");
|
|
176
|
+
expect(options.extraHeaders.Origin).toBe("http://localhost:3000");
|
|
177
|
+
expect(options.transportOptions.websocket.extraHeaders.Cookie).toBe("sid=sid-abc");
|
|
178
|
+
|
|
179
|
+
rt.disconnect();
|
|
180
|
+
Object.defineProperty(global, "navigator", {
|
|
181
|
+
value: originalNavigator,
|
|
182
|
+
writable: true,
|
|
183
|
+
});
|
|
184
|
+
});
|
|
79
185
|
});
|
|
80
186
|
|
|
81
187
|
describe("connect", () => {
|
|
@@ -106,6 +212,7 @@ describe("RealtimeModule", () => {
|
|
|
106
212
|
describe("on", () => {
|
|
107
213
|
it("should register event handler and create socket listener dynamically", async () => {
|
|
108
214
|
const handler = vi.fn();
|
|
215
|
+
await (realtime as any).connect();
|
|
109
216
|
await realtime.on("custom_event", handler);
|
|
110
217
|
|
|
111
218
|
// Should create socket listener for new event
|
|
@@ -165,6 +272,7 @@ describe("RealtimeModule", () => {
|
|
|
165
272
|
const handler1 = vi.fn();
|
|
166
273
|
const handler2 = vi.fn();
|
|
167
274
|
|
|
275
|
+
await (realtime as any).connect();
|
|
168
276
|
await realtime.on("test_event", handler1);
|
|
169
277
|
await realtime.on("test_event", handler2);
|
|
170
278
|
|
|
@@ -182,11 +290,26 @@ describe("RealtimeModule", () => {
|
|
|
182
290
|
expect(handler2).toHaveBeenCalledWith(payload);
|
|
183
291
|
});
|
|
184
292
|
|
|
185
|
-
it("
|
|
293
|
+
it("does NOT connect when adding a handler — socket lifecycle is room-driven", async () => {
|
|
294
|
+
// The sync engine registers its handlers at construction; if that
|
|
295
|
+
// booted a socket, merely constructing a client for an unreachable
|
|
296
|
+
// host would start an unclosable infinite reconnect loop (the
|
|
297
|
+
// fixture/mock-story leak). Handlers wait for the first room join.
|
|
186
298
|
const handler = vi.fn();
|
|
187
299
|
await realtime.on("test_event", handler);
|
|
188
300
|
|
|
189
|
-
expect(
|
|
301
|
+
expect(io).not.toHaveBeenCalled();
|
|
302
|
+
expect((realtime as any).socket).toBeUndefined();
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
it("attaches handlers registered before the first room join once it connects", async () => {
|
|
306
|
+
const handler = vi.fn();
|
|
307
|
+
await realtime.on("pre_join_event", handler);
|
|
308
|
+
expect(io).not.toHaveBeenCalled();
|
|
309
|
+
|
|
310
|
+
await realtime.subscribeList("Task");
|
|
311
|
+
|
|
312
|
+
expect(mockSocket.on).toHaveBeenCalledWith("pre_join_event", expect.any(Function));
|
|
190
313
|
});
|
|
191
314
|
});
|
|
192
315
|
|
|
@@ -195,6 +318,7 @@ describe("RealtimeModule", () => {
|
|
|
195
318
|
const handler1 = vi.fn();
|
|
196
319
|
const handler2 = vi.fn();
|
|
197
320
|
|
|
321
|
+
await (realtime as any).connect();
|
|
198
322
|
await realtime.on("test_event", handler1);
|
|
199
323
|
await realtime.on("test_event", handler2);
|
|
200
324
|
|
|
@@ -217,6 +341,7 @@ describe("RealtimeModule", () => {
|
|
|
217
341
|
it("should remove socket listener when last handler is removed", async () => {
|
|
218
342
|
const handler = vi.fn();
|
|
219
343
|
|
|
344
|
+
await (realtime as any).connect();
|
|
220
345
|
await realtime.on("test_event", handler);
|
|
221
346
|
realtime.off("test_event", handler);
|
|
222
347
|
|
|
@@ -228,6 +353,7 @@ describe("RealtimeModule", () => {
|
|
|
228
353
|
const handler1 = vi.fn();
|
|
229
354
|
const handler2 = vi.fn();
|
|
230
355
|
|
|
356
|
+
await (realtime as any).connect();
|
|
231
357
|
await realtime.on("test_event", handler1);
|
|
232
358
|
await realtime.on("test_event", handler2);
|
|
233
359
|
|
|
@@ -249,10 +375,8 @@ describe("RealtimeModule", () => {
|
|
|
249
375
|
(realtime as any).socketHealthy = true;
|
|
250
376
|
|
|
251
377
|
await realtime.subscribeDoc("Task", "TASK-001");
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
name: "TASK-001",
|
|
255
|
-
});
|
|
378
|
+
// Positional args — frappe's socketio handler signature is (doctype, docname)
|
|
379
|
+
expect(mockSocket.emit).toHaveBeenCalledWith("doc_subscribe", "Task", "TASK-001");
|
|
256
380
|
});
|
|
257
381
|
|
|
258
382
|
it("should emit doc_unsubscribe event", async () => {
|
|
@@ -261,10 +385,7 @@ describe("RealtimeModule", () => {
|
|
|
261
385
|
(realtime as any).socket = mockSocket;
|
|
262
386
|
|
|
263
387
|
realtime.unsubscribeDoc("Task", "TASK-001");
|
|
264
|
-
expect(mockSocket.emit).toHaveBeenCalledWith("doc_unsubscribe",
|
|
265
|
-
doctype: "Task",
|
|
266
|
-
name: "TASK-001",
|
|
267
|
-
});
|
|
388
|
+
expect(mockSocket.emit).toHaveBeenCalledWith("doc_unsubscribe", "Task", "TASK-001");
|
|
268
389
|
});
|
|
269
390
|
|
|
270
391
|
it("should connect before subscribing if not connected", async () => {
|
|
@@ -274,26 +395,22 @@ describe("RealtimeModule", () => {
|
|
|
274
395
|
});
|
|
275
396
|
|
|
276
397
|
describe("subscribeList / unsubscribeList", () => {
|
|
277
|
-
it("should emit
|
|
398
|
+
it("should emit doctype_subscribe event", async () => {
|
|
278
399
|
mockSocket.connected = true;
|
|
279
400
|
(realtime as any).socketHealthy = true;
|
|
280
401
|
|
|
281
402
|
await realtime.subscribeList("Task", { status: "Open" });
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
filters: { status: "Open" },
|
|
285
|
-
});
|
|
403
|
+
// frappe has one realtime room per doctype; filters stay client-side
|
|
404
|
+
expect(mockSocket.emit).toHaveBeenCalledWith("doctype_subscribe", "Task");
|
|
286
405
|
});
|
|
287
406
|
|
|
288
|
-
it("should emit
|
|
407
|
+
it("should emit doctype_unsubscribe event", async () => {
|
|
289
408
|
mockSocket.connected = true;
|
|
290
409
|
(realtime as any).socketHealthy = true;
|
|
291
410
|
(realtime as any).socket = mockSocket;
|
|
292
411
|
|
|
293
412
|
realtime.unsubscribeList("Task");
|
|
294
|
-
expect(mockSocket.emit).toHaveBeenCalledWith("
|
|
295
|
-
doctype: "Task",
|
|
296
|
-
});
|
|
413
|
+
expect(mockSocket.emit).toHaveBeenCalledWith("doctype_unsubscribe", "Task");
|
|
297
414
|
});
|
|
298
415
|
});
|
|
299
416
|
|
|
@@ -347,6 +464,7 @@ describe("RealtimeModule", () => {
|
|
|
347
464
|
const handler1 = vi.fn();
|
|
348
465
|
const handler2 = vi.fn();
|
|
349
466
|
|
|
467
|
+
await (realtime as any).connect();
|
|
350
468
|
await realtime.on("event1", handler1);
|
|
351
469
|
await realtime.on("event2", handler2);
|
|
352
470
|
|
|
@@ -449,5 +567,331 @@ describe("RealtimeModule", () => {
|
|
|
449
567
|
expect(event1Calls.length).toBe(0);
|
|
450
568
|
expect(event2Calls.length).toBe(0);
|
|
451
569
|
});
|
|
570
|
+
|
|
571
|
+
it("should re-emit doc and list subscriptions on reconnect", async () => {
|
|
572
|
+
await realtime.subscribeDoc("Task", "TASK-001");
|
|
573
|
+
await realtime.subscribeList("Task", { status: "Open" });
|
|
574
|
+
|
|
575
|
+
// Drain the initial subscribe emits from the first connect
|
|
576
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
577
|
+
mockSocket.emit.mockClear();
|
|
578
|
+
|
|
579
|
+
// Simulate transport recovery: soft path keeps rooms, reconnect re-emits them
|
|
580
|
+
(realtime as any).socket = undefined;
|
|
581
|
+
(realtime as any).socketHealthy = false;
|
|
582
|
+
(realtime as any).isConnecting = false;
|
|
583
|
+
await (realtime as any).connect();
|
|
584
|
+
const connectHandler = mockSocket.on.mock.calls.find(
|
|
585
|
+
(call: any[]) => call[0] === "connect",
|
|
586
|
+
)?.[1];
|
|
587
|
+
connectHandler?.();
|
|
588
|
+
|
|
589
|
+
expect(mockSocket.emit).toHaveBeenCalledWith("doc_subscribe", "Task", "TASK-001");
|
|
590
|
+
expect(mockSocket.emit).toHaveBeenCalledWith("doctype_subscribe", "Task");
|
|
591
|
+
});
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
describe("updateAuth", () => {
|
|
595
|
+
it("should reconnect and preserve handlers after auth refresh", async () => {
|
|
596
|
+
const handler = vi.fn();
|
|
597
|
+
// A live room keeps the socket warranted across the rotation.
|
|
598
|
+
await realtime.subscribeList("Task");
|
|
599
|
+
await realtime.on("doc_changed", handler);
|
|
600
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
601
|
+
|
|
602
|
+
mockSocket.disconnect.mockClear();
|
|
603
|
+
mockSocket.on.mockClear();
|
|
604
|
+
|
|
605
|
+
await realtime.updateAuth({
|
|
606
|
+
useToken: true,
|
|
607
|
+
token: "new-token",
|
|
608
|
+
type: "token" as any,
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
// Soft disconnect tears down the socket but keeps handlers
|
|
612
|
+
expect(mockSocket.disconnect).toHaveBeenCalled();
|
|
613
|
+
// New connect should re-attach the preserved handler
|
|
614
|
+
const reattached = mockSocket.on.mock.calls.some((call: any[]) => call[0] === "doc_changed");
|
|
615
|
+
expect(reattached).toBe(true);
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
it("does not boot a socket on auth rotation while idle (no rooms)", async () => {
|
|
619
|
+
const handler = vi.fn();
|
|
620
|
+
await realtime.on("doc_changed", handler);
|
|
621
|
+
expect((realtime as any).socket).toBeUndefined();
|
|
622
|
+
|
|
623
|
+
await realtime.updateAuth({ useToken: true, token: "rotated" });
|
|
624
|
+
|
|
625
|
+
// Still idle: the next room join will connect with the fresh auth.
|
|
626
|
+
expect((realtime as any).socket).toBeUndefined();
|
|
627
|
+
expect(io).not.toHaveBeenCalled();
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
it("should reconnect when only room subscriptions exist (no handlers)", async () => {
|
|
631
|
+
mockSocket.connected = true;
|
|
632
|
+
(realtime as any).socketHealthy = true;
|
|
633
|
+
(realtime as any).socket = mockSocket;
|
|
634
|
+
await realtime.subscribeDoc("Task", "TASK-009");
|
|
635
|
+
|
|
636
|
+
mockSocket.disconnect.mockClear();
|
|
637
|
+
await realtime.updateAuth({ useToken: true, token: "rotated" });
|
|
638
|
+
|
|
639
|
+
expect(mockSocket.disconnect).toHaveBeenCalled();
|
|
640
|
+
// Rooms preserved → soft reconnect opened a new socket
|
|
641
|
+
expect((realtime as any).socket).toBeDefined();
|
|
642
|
+
expect((realtime as any).docRooms.size).toBe(1);
|
|
643
|
+
});
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
describe("subscribe before healthy", () => {
|
|
647
|
+
it("should emit doc_subscribe after the connect event (no race no-op)", async () => {
|
|
648
|
+
const subscribePromise = realtime.subscribeDoc("Task", "TASK-RACE");
|
|
649
|
+
// Connect handler is scheduled via setTimeout(0) in the mock
|
|
650
|
+
await subscribePromise;
|
|
651
|
+
|
|
652
|
+
expect(mockSocket.emit).toHaveBeenCalledWith("doc_subscribe", "Task", "TASK-RACE");
|
|
653
|
+
});
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
describe("idle teardown", () => {
|
|
657
|
+
it("tears the socket down when the last room is unsubscribed", async () => {
|
|
658
|
+
await realtime.subscribeDoc("Task", "TASK-001");
|
|
659
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
660
|
+
expect((realtime as any).socket).toBeDefined();
|
|
661
|
+
|
|
662
|
+
mockSocket.disconnect.mockClear();
|
|
663
|
+
realtime.unsubscribeDoc("Task", "TASK-001");
|
|
664
|
+
|
|
665
|
+
expect(mockSocket.disconnect).toHaveBeenCalled();
|
|
666
|
+
expect((realtime as any).socket).toBeUndefined();
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
it("keeps the socket while any room remains", async () => {
|
|
670
|
+
await realtime.subscribeDoc("Task", "TASK-001");
|
|
671
|
+
await realtime.subscribeList("Task");
|
|
672
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
673
|
+
|
|
674
|
+
mockSocket.disconnect.mockClear();
|
|
675
|
+
realtime.unsubscribeDoc("Task", "TASK-001");
|
|
676
|
+
|
|
677
|
+
// The doctype room still holds the socket open.
|
|
678
|
+
expect(mockSocket.disconnect).not.toHaveBeenCalled();
|
|
679
|
+
expect((realtime as any).socket).toBeDefined();
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
it("notifies lifecycle handlers on idle teardown", async () => {
|
|
683
|
+
const onDisconnect = vi.fn();
|
|
684
|
+
await realtime.on("disconnect", onDisconnect);
|
|
685
|
+
await realtime.subscribeList("Task");
|
|
686
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
687
|
+
|
|
688
|
+
realtime.unsubscribeList("Task");
|
|
689
|
+
|
|
690
|
+
expect(onDisconnect).toHaveBeenCalledWith({ reason: "idle-teardown" });
|
|
691
|
+
});
|
|
692
|
+
|
|
693
|
+
it("reconnects with preserved handlers on the next subscription after teardown", async () => {
|
|
694
|
+
const handler = vi.fn();
|
|
695
|
+
await realtime.on("doc_update", handler);
|
|
696
|
+
await realtime.subscribeList("Task");
|
|
697
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
698
|
+
realtime.unsubscribeList("Task");
|
|
699
|
+
expect((realtime as any).socket).toBeUndefined();
|
|
700
|
+
|
|
701
|
+
mockSocket.on.mockClear();
|
|
702
|
+
await realtime.subscribeList("ToDo");
|
|
703
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
704
|
+
|
|
705
|
+
expect((realtime as any).socket).toBeDefined();
|
|
706
|
+
expect(mockSocket.on).toHaveBeenCalledWith("doc_update", expect.any(Function));
|
|
707
|
+
});
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
describe("connect_error", () => {
|
|
711
|
+
it("should forward connect_error to registered handlers", async () => {
|
|
712
|
+
const onError = vi.fn();
|
|
713
|
+
await (realtime as any).connect();
|
|
714
|
+
await realtime.on("connect_error", onError);
|
|
715
|
+
|
|
716
|
+
const errorHandler = mockSocket.on.mock.calls.find(
|
|
717
|
+
(call: any[]) => call[0] === "connect_error",
|
|
718
|
+
)?.[1];
|
|
719
|
+
const err = new Error("auth failed");
|
|
720
|
+
errorHandler?.(err);
|
|
721
|
+
|
|
722
|
+
expect(onError).toHaveBeenCalledWith(err);
|
|
723
|
+
});
|
|
724
|
+
});
|
|
725
|
+
|
|
726
|
+
describe("token auth handshake", () => {
|
|
727
|
+
function ioOptions(): Record<string, any> {
|
|
728
|
+
const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
|
|
729
|
+
return calls[calls.length - 1]?.[1] ?? {};
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
it("attaches Authorization (never Origin) and handshakes over polling on web", async () => {
|
|
733
|
+
mockSocket.io.opts = {};
|
|
734
|
+
const rt = new RealtimeModule({
|
|
735
|
+
baseURL: "http://localhost:3000",
|
|
736
|
+
auth: { useToken: true, token: async () => "tok-1" },
|
|
737
|
+
});
|
|
738
|
+
await (rt as any).connect();
|
|
739
|
+
|
|
740
|
+
const options = ioOptions();
|
|
741
|
+
// Browsers can only attach headers to the polling (XHR) handshake —
|
|
742
|
+
// websocket upgrade rides the established session afterwards.
|
|
743
|
+
expect(options.transports).toEqual(["polling", "websocket"]);
|
|
744
|
+
expect(options.extraHeaders.Authorization).toBe("Bearer tok-1");
|
|
745
|
+
// Origin is a forbidden browser header: the browser always sends the
|
|
746
|
+
// page origin itself, and attempting to set it spams "Attempt to set a
|
|
747
|
+
// forbidden header was denied: Origin" on every polling request.
|
|
748
|
+
expect(options.extraHeaders.Origin).toBeUndefined();
|
|
749
|
+
// Headers are mirrored per-transport for node websocket handshakes
|
|
750
|
+
expect(options.transportOptions.polling.extraHeaders.Authorization).toBe("Bearer tok-1");
|
|
751
|
+
expect(options.transportOptions.websocket.extraHeaders.Authorization).toBe("Bearer tok-1");
|
|
752
|
+
rt.disconnect();
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
it("sets no forbidden header on web in any transport option (Origin, Cookie)", async () => {
|
|
756
|
+
const rt = new RealtimeModule({
|
|
757
|
+
baseURL: "http://localhost:3000",
|
|
758
|
+
auth: { useToken: true, token: "key:secret", type: "token" as any, sessionId: "sid-x" },
|
|
759
|
+
});
|
|
760
|
+
await (rt as any).connect();
|
|
761
|
+
|
|
762
|
+
const options = ioOptions();
|
|
763
|
+
expect(options.extraHeaders.Origin).toBeUndefined();
|
|
764
|
+
expect(options.extraHeaders.Cookie).toBeUndefined();
|
|
765
|
+
expect(options.transportOptions.polling.extraHeaders.Origin).toBeUndefined();
|
|
766
|
+
expect(options.transportOptions.polling.extraHeaders.Cookie).toBeUndefined();
|
|
767
|
+
expect(options.transportOptions.websocket.extraHeaders.Origin).toBeUndefined();
|
|
768
|
+
rt.disconnect();
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
it("derives the socket host from baseURL (LAN page → LAN socket)", async () => {
|
|
772
|
+
// The dev wrapper rewrites a loopback baseURL to the page hostname
|
|
773
|
+
// (features/backoffice/shared/env.ts); the socket must follow that
|
|
774
|
+
// hostname with the socketPort swapped in — not stay on localhost.
|
|
775
|
+
const rt = new RealtimeModule({
|
|
776
|
+
baseURL: "http://10.236.0.10:8000",
|
|
777
|
+
socketPort: 9000,
|
|
778
|
+
});
|
|
779
|
+
await (rt as any).connect();
|
|
780
|
+
|
|
781
|
+
const calls = (io as unknown as ReturnType<typeof vi.fn>).mock.calls;
|
|
782
|
+
expect(calls[calls.length - 1]?.[0]).toBe("http://10.236.0.10:9000/10.236.0.10");
|
|
783
|
+
rt.disconnect();
|
|
784
|
+
});
|
|
785
|
+
|
|
786
|
+
it("uses the token scheme when auth type is token", async () => {
|
|
787
|
+
const rt = new RealtimeModule({
|
|
788
|
+
baseURL: "http://localhost:3000",
|
|
789
|
+
auth: { useToken: true, token: "key:secret", type: "token" as any },
|
|
790
|
+
});
|
|
791
|
+
await (rt as any).connect();
|
|
792
|
+
|
|
793
|
+
expect(ioOptions().extraHeaders.Authorization).toBe("token key:secret");
|
|
794
|
+
rt.disconnect();
|
|
795
|
+
});
|
|
796
|
+
|
|
797
|
+
it("handshakes polling-first on web even without token auth", async () => {
|
|
798
|
+
// Cookie-session auth and reverse-proxy-injected Authorization only
|
|
799
|
+
// ride HTTP requests, and ws-upgrade-hostile dev proxies (vite
|
|
800
|
+
// middleware mode) hang raw upgrades — browsers always start on
|
|
801
|
+
// polling and let Socket.IO upgrade the established session.
|
|
802
|
+
const rt = new RealtimeModule({ baseURL: "http://localhost:3000" });
|
|
803
|
+
await (rt as any).connect();
|
|
804
|
+
|
|
805
|
+
expect(ioOptions().transports).toEqual(["polling", "websocket"]);
|
|
806
|
+
rt.disconnect();
|
|
807
|
+
});
|
|
808
|
+
|
|
809
|
+
it("keeps websocket-first transports off-web (node)", async () => {
|
|
810
|
+
const rt = new RealtimeModule({
|
|
811
|
+
baseURL: "http://localhost:3000",
|
|
812
|
+
platform: RealtimePlatform.Node,
|
|
813
|
+
});
|
|
814
|
+
await (rt as any).connect();
|
|
815
|
+
|
|
816
|
+
expect(ioOptions().transports).toEqual(["websocket", "polling"]);
|
|
817
|
+
rt.disconnect();
|
|
818
|
+
});
|
|
819
|
+
|
|
820
|
+
it("omits Authorization when the token getter resolves empty (signed out)", async () => {
|
|
821
|
+
const rt = new RealtimeModule({
|
|
822
|
+
baseURL: "http://localhost:3000",
|
|
823
|
+
auth: { useToken: true, token: async () => "" },
|
|
824
|
+
});
|
|
825
|
+
await (rt as any).connect();
|
|
826
|
+
|
|
827
|
+
expect(ioOptions().extraHeaders?.Authorization).toBeUndefined();
|
|
828
|
+
rt.disconnect();
|
|
829
|
+
});
|
|
830
|
+
|
|
831
|
+
it("re-resolves the token into manager opts on disconnect (refresh mid-session)", async () => {
|
|
832
|
+
let calls = 0;
|
|
833
|
+
const token = async () => (++calls === 1 ? "tok-1" : "tok-2");
|
|
834
|
+
mockSocket.io.opts = {};
|
|
835
|
+
const rt = new RealtimeModule({
|
|
836
|
+
baseURL: "http://localhost:3000",
|
|
837
|
+
auth: { useToken: true, token },
|
|
838
|
+
});
|
|
839
|
+
await (rt as any).connect();
|
|
840
|
+
expect(ioOptions().extraHeaders.Authorization).toBe("Bearer tok-1");
|
|
841
|
+
|
|
842
|
+
// Simulate a transport drop: the disconnect handler must refresh the
|
|
843
|
+
// credentials in the live manager opts before socket.io retries.
|
|
844
|
+
const disconnectHandler = mockSocket.on.mock.calls.find(
|
|
845
|
+
(call: any[]) => call[0] === "disconnect",
|
|
846
|
+
)?.[1];
|
|
847
|
+
disconnectHandler?.("transport close");
|
|
848
|
+
await (rt as any).refreshSocketAuth();
|
|
849
|
+
|
|
850
|
+
const opts = mockSocket.io.opts as any;
|
|
851
|
+
expect(opts.extraHeaders.Authorization).toBe("Bearer tok-2");
|
|
852
|
+
expect(opts.transportOptions.polling.extraHeaders.Authorization).toBe("Bearer tok-2");
|
|
853
|
+
rt.disconnect();
|
|
854
|
+
});
|
|
855
|
+
|
|
856
|
+
it("registers a reconnect_attempt refresh hook on the manager", async () => {
|
|
857
|
+
mockSocket.io.opts = {};
|
|
858
|
+
mockSocket.io.on.mockClear();
|
|
859
|
+
let calls = 0;
|
|
860
|
+
const token = async () => `tok-${++calls}`;
|
|
861
|
+
const rt = new RealtimeModule({
|
|
862
|
+
baseURL: "http://localhost:3000",
|
|
863
|
+
auth: { useToken: true, token },
|
|
864
|
+
});
|
|
865
|
+
await (rt as any).connect();
|
|
866
|
+
|
|
867
|
+
const reconnectHook = mockSocket.io.on.mock.calls.find(
|
|
868
|
+
(call: any[]) => call[0] === "reconnect_attempt",
|
|
869
|
+
)?.[1];
|
|
870
|
+
expect(reconnectHook).toBeDefined();
|
|
871
|
+
|
|
872
|
+
reconnectHook?.();
|
|
873
|
+
await (rt as any).refreshSocketAuth();
|
|
874
|
+
|
|
875
|
+
const opts = mockSocket.io.opts as any;
|
|
876
|
+
expect(opts.extraHeaders.Authorization).toBe("Bearer tok-2");
|
|
877
|
+
rt.disconnect();
|
|
878
|
+
});
|
|
879
|
+
|
|
880
|
+
it("preserves rooms across explicit token rotation (updateAuth)", async () => {
|
|
881
|
+
const rt = new RealtimeModule({
|
|
882
|
+
baseURL: "http://localhost:3000",
|
|
883
|
+
auth: { useToken: true, token: "old-token" },
|
|
884
|
+
});
|
|
885
|
+
await rt.subscribeDoc("Task", "TASK-100");
|
|
886
|
+
await rt.subscribeList("Task");
|
|
887
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
888
|
+
|
|
889
|
+
await rt.updateAuth({ useToken: true, token: "new-token" });
|
|
890
|
+
|
|
891
|
+
expect((rt as any).docRooms.size).toBe(1);
|
|
892
|
+
expect((rt as any).listRooms.size).toBe(1);
|
|
893
|
+
expect(ioOptions().extraHeaders.Authorization).toBe("Bearer new-token");
|
|
894
|
+
rt.disconnect();
|
|
895
|
+
});
|
|
452
896
|
});
|
|
453
897
|
});
|