musora-content-services 2.108.0 → 2.110.3
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/CHANGELOG.md +20 -0
- package/CLAUDE.md +2 -2
- package/package.json +1 -1
- package/src/contentMetaData.js +0 -5
- package/src/contentTypeConfig.js +11 -73
- package/src/index.d.ts +0 -20
- package/src/index.js +0 -20
- package/src/services/content.js +1 -1
- package/src/services/contentAggregator.js +1 -4
- package/src/services/railcontent.js +0 -163
- package/src/services/sanity.js +258 -7
- package/src/services/sync/adapters/factory.ts +6 -6
- package/src/services/sync/adapters/lokijs.ts +174 -1
- package/src/services/sync/context/providers/durability.ts +1 -0
- package/src/services/sync/database/factory.ts +12 -5
- package/src/services/sync/effects/index.ts +6 -0
- package/src/services/sync/effects/logout-warning.ts +47 -0
- package/src/services/sync/errors/boundary.ts +4 -6
- package/src/services/sync/errors/index.ts +16 -0
- package/src/services/sync/fetch.ts +5 -5
- package/src/services/sync/manager.ts +80 -40
- package/src/services/sync/repositories/base.ts +1 -8
- package/src/services/sync/retry.ts +4 -4
- package/src/services/sync/store/index.ts +34 -31
- package/src/services/sync/store/push-coalescer.ts +3 -3
- package/src/services/sync/store-configs.ts +10 -8
- package/src/services/sync/telemetry/flood-prevention.ts +27 -0
- package/src/services/sync/telemetry/index.ts +71 -9
- package/src/services/sync/telemetry/sampling.ts +2 -6
- package/src/services/user/types.d.ts +0 -7
- package/test/sync/adapter.ts +2 -34
- package/test/sync/initialize-sync-manager.js +8 -25
- package/.claude/settings.local.json +0 -9
- package/src/services/sync/concurrency-safety.ts +0 -4
package/test/sync/adapter.ts
CHANGED
|
@@ -1,41 +1,9 @@
|
|
|
1
1
|
import adapterFactory from '../../src/services/sync/adapters/factory'
|
|
2
2
|
import LokiJSAdapter from '../../src/services/sync/adapters/lokijs'
|
|
3
|
-
import EventEmitter from '../../src/services/sync/utils/event-emitter'
|
|
4
3
|
|
|
5
|
-
export default function syncStoreAdapter(userId: string
|
|
4
|
+
export default function syncStoreAdapter(userId: string) {
|
|
6
5
|
return adapterFactory(LokiJSAdapter, `user:${userId}`, {
|
|
7
6
|
useWebWorker: false,
|
|
8
|
-
useIncrementalIndexedDB: true
|
|
9
|
-
extraLokiOptions: {
|
|
10
|
-
autosave: true,
|
|
11
|
-
autosaveInterval: 300, // increase for better performance at cost of potential data loss on tab close/crash
|
|
12
|
-
},
|
|
13
|
-
onQuotaExceededError: () => {
|
|
14
|
-
// Browser ran out of disk space or possibly in incognito mode
|
|
15
|
-
// called ONLY at startup
|
|
16
|
-
// ideal place to trigger banner (?) to user when also offline?
|
|
17
|
-
// (so that the non-customizable browser default onbeforeunload confirmation (in offline-unload-warning.ts) has context and makes sense)
|
|
18
|
-
bus.emit('quotaExceededError')
|
|
19
|
-
},
|
|
20
|
-
onSetUpError: () => {
|
|
21
|
-
// TODO - Database failed to load -- offer the user to reload the app or log out
|
|
22
|
-
},
|
|
23
|
-
extraIncrementalIDBOptions: {
|
|
24
|
-
lazyCollections: ['content_like'],
|
|
25
|
-
onDidOverwrite: () => {
|
|
26
|
-
// Called when this adapter is forced to overwrite contents of IndexedDB.
|
|
27
|
-
// This happens if there's another open tab of the same app that's making changes.
|
|
28
|
-
// this scenario is handled-ish in `idb-clobber-avoidance`
|
|
29
|
-
},
|
|
30
|
-
onversionchange: () => {
|
|
31
|
-
// no-op
|
|
32
|
-
// indexeddb was deleted in another browser tab (user logged out), so we must make sure we delete
|
|
33
|
-
// in-memory db in this tab as well,
|
|
34
|
-
// but we rely on sync manager setup/teardown to `unsafeResetDatabase` and redirect for this,
|
|
35
|
-
// though reloading the page might be useful as well
|
|
36
|
-
},
|
|
37
|
-
},
|
|
7
|
+
useIncrementalIndexedDB: true
|
|
38
8
|
})
|
|
39
9
|
}
|
|
40
|
-
|
|
41
|
-
export class SyncAdapterEventBus extends EventEmitter<{ quotaExceededError: [] }> {}
|
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
import { SyncManager, SyncContext } from '../../src/services/sync/index'
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
BaseConnectivityProvider,
|
|
5
|
-
BaseDurabilityProvider,
|
|
6
|
-
BaseTabsProvider,
|
|
7
|
-
BaseVisibilityProvider,
|
|
8
|
-
} from '../../src/services/sync/context/providers/'
|
|
9
|
-
import adapterFactory from '../../src/services/sync/adapters/factory'
|
|
10
|
-
import LokiJSAdapter from '../../src/services/sync/adapters/lokijs'
|
|
11
|
-
import EventEmitter from '../../src/services/sync/utils/event-emitter'
|
|
12
|
-
import { InitialStrategy, PollingStrategy } from '../../src/services/sync/strategies/index'
|
|
13
|
-
import { SyncTelemetry, SentryLike } from '../../src/services/sync/telemetry/index'
|
|
2
|
+
import { InitialStrategy } from '../../src/services/sync/strategies/index'
|
|
3
|
+
import { SyncTelemetry, SeverityLevel, SentryLike } from '../../src/services/sync/telemetry/index'
|
|
14
4
|
import {
|
|
15
5
|
ContentLike,
|
|
16
6
|
ContentProgress,
|
|
@@ -19,7 +9,7 @@ import {
|
|
|
19
9
|
} from '../../src/services/sync/models/index'
|
|
20
10
|
import syncDatabaseFactory from '../../src/services/sync/database/factory'
|
|
21
11
|
|
|
22
|
-
import syncAdapter
|
|
12
|
+
import syncAdapter from './adapter'
|
|
23
13
|
|
|
24
14
|
export function initializeSyncManager(userId) {
|
|
25
15
|
if (SyncManager.getInstanceOrNull()) {
|
|
@@ -45,10 +35,9 @@ export function initializeSyncManager(userId) {
|
|
|
45
35
|
},
|
|
46
36
|
}
|
|
47
37
|
|
|
48
|
-
SyncTelemetry.setInstance(new SyncTelemetry(userId, { Sentry: dummySentry }))
|
|
38
|
+
SyncTelemetry.setInstance(new SyncTelemetry(userId, { Sentry: dummySentry, level: SeverityLevel.WARNING, pretty: false }))
|
|
49
39
|
|
|
50
|
-
const
|
|
51
|
-
const adapter = syncAdapter(userId, adapterBus)
|
|
40
|
+
const adapter = syncAdapter(userId)
|
|
52
41
|
const db = syncDatabaseFactory(adapter)
|
|
53
42
|
|
|
54
43
|
const context = new SyncContext({
|
|
@@ -88,16 +77,10 @@ export function initializeSyncManager(userId) {
|
|
|
88
77
|
const manager = new SyncManager(context, db)
|
|
89
78
|
|
|
90
79
|
const initialStrategy = manager.createStrategy(InitialStrategy)
|
|
91
|
-
const aggressivePollingStrategy = manager.createStrategy(PollingStrategy, 3600_000)
|
|
92
|
-
|
|
93
|
-
manager.syncStoresWithStrategies(
|
|
94
|
-
manager.storesForModels([ContentLike, ContentProgress, Practice, PracticeDayNote]),
|
|
95
|
-
[initialStrategy, aggressivePollingStrategy]
|
|
96
|
-
)
|
|
97
80
|
|
|
98
|
-
manager.
|
|
99
|
-
|
|
100
|
-
[]
|
|
81
|
+
manager.registerStrategies(
|
|
82
|
+
[ContentLike, ContentProgress, Practice, PracticeDayNote],
|
|
83
|
+
[initialStrategy]
|
|
101
84
|
)
|
|
102
85
|
|
|
103
86
|
SyncManager.assignAndSetupInstance(manager)
|