@verdant-web/store 2.0.1
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/LICENSE +21 -0
- package/README.md +1 -0
- package/dist/cjs/AckInfoStore.d.ts +10 -0
- package/dist/cjs/AckInfoStore.js +26 -0
- package/dist/cjs/AckInfoStore.js.map +1 -0
- package/dist/cjs/BackoffScheduler.d.ts +19 -0
- package/dist/cjs/BackoffScheduler.js +45 -0
- package/dist/cjs/BackoffScheduler.js.map +1 -0
- package/dist/cjs/BaselinesStore.d.ts +10 -0
- package/dist/cjs/BaselinesStore.js +36 -0
- package/dist/cjs/BaselinesStore.js.map +1 -0
- package/dist/cjs/DocumentManager.d.ts +28 -0
- package/dist/cjs/DocumentManager.js +45 -0
- package/dist/cjs/DocumentManager.js.map +1 -0
- package/dist/cjs/Entity.d.ts +96 -0
- package/dist/cjs/Entity.js +345 -0
- package/dist/cjs/Entity.js.map +1 -0
- package/dist/cjs/EntityStore.d.ts +36 -0
- package/dist/cjs/EntityStore.js +172 -0
- package/dist/cjs/EntityStore.js.map +1 -0
- package/dist/cjs/IDBService.d.ts +9 -0
- package/dist/cjs/IDBService.js +47 -0
- package/dist/cjs/IDBService.js.map +1 -0
- package/dist/cjs/LocalHistoryStore.d.ts +15 -0
- package/dist/cjs/LocalHistoryStore.js +53 -0
- package/dist/cjs/LocalHistoryStore.js.map +1 -0
- package/dist/cjs/LocalReplicaStore.d.ts +13 -0
- package/dist/cjs/LocalReplicaStore.js +49 -0
- package/dist/cjs/LocalReplicaStore.js.map +1 -0
- package/dist/cjs/MessageCreator.d.ts +19 -0
- package/dist/cjs/MessageCreator.js +104 -0
- package/dist/cjs/MessageCreator.js.map +1 -0
- package/dist/cjs/Metadata.d.ts +91 -0
- package/dist/cjs/Metadata.js +250 -0
- package/dist/cjs/Metadata.js.map +1 -0
- package/dist/cjs/OperationsStore.d.ts +38 -0
- package/dist/cjs/OperationsStore.js +146 -0
- package/dist/cjs/OperationsStore.js.map +1 -0
- package/dist/cjs/PresenceManager.d.ts +30 -0
- package/dist/cjs/PresenceManager.js +89 -0
- package/dist/cjs/PresenceManager.js.map +1 -0
- package/dist/cjs/Query.d.ts +26 -0
- package/dist/cjs/Query.js +86 -0
- package/dist/cjs/Query.js.map +1 -0
- package/dist/cjs/QueryMaker.d.ts +18 -0
- package/dist/cjs/QueryMaker.js +98 -0
- package/dist/cjs/QueryMaker.js.map +1 -0
- package/dist/cjs/QueryStore.d.ts +38 -0
- package/dist/cjs/QueryStore.js +146 -0
- package/dist/cjs/QueryStore.js.map +1 -0
- package/dist/cjs/SchemaStore.d.ts +9 -0
- package/dist/cjs/SchemaStore.js +35 -0
- package/dist/cjs/SchemaStore.js.map +1 -0
- package/dist/cjs/Storage.d.ts +147 -0
- package/dist/cjs/Storage.js +346 -0
- package/dist/cjs/Storage.js.map +1 -0
- package/dist/cjs/Sync.d.ts +117 -0
- package/dist/cjs/Sync.js +561 -0
- package/dist/cjs/Sync.js.map +1 -0
- package/dist/cjs/SyncHarness.d.ts +45 -0
- package/dist/cjs/SyncHarness.js +110 -0
- package/dist/cjs/SyncHarness.js.map +1 -0
- package/dist/cjs/UndoHistory.d.ts +16 -0
- package/dist/cjs/UndoHistory.js +51 -0
- package/dist/cjs/UndoHistory.js.map +1 -0
- package/dist/cjs/__tests__/batching.test.d.ts +1 -0
- package/dist/cjs/__tests__/batching.test.js +45 -0
- package/dist/cjs/__tests__/batching.test.js.map +1 -0
- package/dist/cjs/__tests__/documents.test.d.ts +1 -0
- package/dist/cjs/__tests__/documents.test.js +403 -0
- package/dist/cjs/__tests__/documents.test.js.map +1 -0
- package/dist/cjs/__tests__/fixtures/testStorage.d.ts +118 -0
- package/dist/cjs/__tests__/fixtures/testStorage.js +116 -0
- package/dist/cjs/__tests__/fixtures/testStorage.js.map +1 -0
- package/dist/cjs/__tests__/queries.test.d.ts +1 -0
- package/dist/cjs/__tests__/queries.test.js +263 -0
- package/dist/cjs/__tests__/queries.test.js.map +1 -0
- package/dist/cjs/__tests__/setup/indexedDB.d.ts +1 -0
- package/dist/cjs/__tests__/setup/indexedDB.js +4 -0
- package/dist/cjs/__tests__/setup/indexedDB.js.map +1 -0
- package/dist/cjs/__tests__/undo.test.d.ts +1 -0
- package/dist/cjs/__tests__/undo.test.js +87 -0
- package/dist/cjs/__tests__/undo.test.js.map +1 -0
- package/dist/cjs/client/Client.d.ts +86 -0
- package/dist/cjs/client/Client.js +227 -0
- package/dist/cjs/client/Client.js.map +1 -0
- package/dist/cjs/client/ClientDescriptor.d.ts +62 -0
- package/dist/cjs/client/ClientDescriptor.js +109 -0
- package/dist/cjs/client/ClientDescriptor.js.map +1 -0
- package/dist/cjs/constants.d.ts +1 -0
- package/dist/cjs/constants.js +5 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/context.d.ts +17 -0
- package/dist/cjs/context.js +3 -0
- package/dist/cjs/context.js.map +1 -0
- package/dist/cjs/files/EntityFile.d.ts +27 -0
- package/dist/cjs/files/EntityFile.js +72 -0
- package/dist/cjs/files/EntityFile.js.map +1 -0
- package/dist/cjs/files/FileManager.d.ts +42 -0
- package/dist/cjs/files/FileManager.js +146 -0
- package/dist/cjs/files/FileManager.js.map +1 -0
- package/dist/cjs/files/FileStorage.d.ts +27 -0
- package/dist/cjs/files/FileStorage.js +94 -0
- package/dist/cjs/files/FileStorage.js.map +1 -0
- package/dist/cjs/files/utils.d.ts +8 -0
- package/dist/cjs/files/utils.js +56 -0
- package/dist/cjs/files/utils.js.map +1 -0
- package/dist/cjs/files/utils.test.d.ts +1 -0
- package/dist/cjs/files/utils.test.js +81 -0
- package/dist/cjs/files/utils.test.js.map +1 -0
- package/dist/cjs/idb.d.ts +8 -0
- package/dist/cjs/idb.js +88 -0
- package/dist/cjs/idb.js.map +1 -0
- package/dist/cjs/index.d.ts +19 -0
- package/dist/cjs/index.js +21 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/indexes.d.ts +3 -0
- package/dist/cjs/indexes.js +20 -0
- package/dist/cjs/indexes.js.map +1 -0
- package/dist/cjs/metadata/AckInfoStore.d.ts +10 -0
- package/dist/cjs/metadata/AckInfoStore.js +26 -0
- package/dist/cjs/metadata/AckInfoStore.js.map +1 -0
- package/dist/cjs/metadata/BaselinesStore.d.ts +33 -0
- package/dist/cjs/metadata/BaselinesStore.js +60 -0
- package/dist/cjs/metadata/BaselinesStore.js.map +1 -0
- package/dist/cjs/metadata/LocalHistoryStore.d.ts +15 -0
- package/dist/cjs/metadata/LocalHistoryStore.js +53 -0
- package/dist/cjs/metadata/LocalHistoryStore.js.map +1 -0
- package/dist/cjs/metadata/LocalReplicaStore.d.ts +17 -0
- package/dist/cjs/metadata/LocalReplicaStore.js +48 -0
- package/dist/cjs/metadata/LocalReplicaStore.js.map +1 -0
- package/dist/cjs/metadata/MessageCreator.d.ts +19 -0
- package/dist/cjs/metadata/MessageCreator.js +128 -0
- package/dist/cjs/metadata/MessageCreator.js.map +1 -0
- package/dist/cjs/metadata/Metadata.d.ts +106 -0
- package/dist/cjs/metadata/Metadata.js +339 -0
- package/dist/cjs/metadata/Metadata.js.map +1 -0
- package/dist/cjs/metadata/OperationsStore.d.ts +50 -0
- package/dist/cjs/metadata/OperationsStore.js +146 -0
- package/dist/cjs/metadata/OperationsStore.js.map +1 -0
- package/dist/cjs/metadata/SchemaStore.d.ts +9 -0
- package/dist/cjs/metadata/SchemaStore.js +39 -0
- package/dist/cjs/metadata/SchemaStore.js.map +1 -0
- package/dist/cjs/metadata/openMetadataDatabase.d.ts +8 -0
- package/dist/cjs/metadata/openMetadataDatabase.js +106 -0
- package/dist/cjs/metadata/openMetadataDatabase.js.map +1 -0
- package/dist/cjs/openDocumentDatabase.d.ts +12 -0
- package/dist/cjs/openDocumentDatabase.js +432 -0
- package/dist/cjs/openDocumentDatabase.js.map +1 -0
- package/dist/cjs/queries/LiveQuery.d.ts +28 -0
- package/dist/cjs/queries/LiveQuery.js +96 -0
- package/dist/cjs/queries/LiveQuery.js.map +1 -0
- package/dist/cjs/queries/LiveQueryMaker.d.ts +15 -0
- package/dist/cjs/queries/LiveQueryMaker.js +42 -0
- package/dist/cjs/queries/LiveQueryMaker.js.map +1 -0
- package/dist/cjs/queries/LiveQueryStore.d.ts +33 -0
- package/dist/cjs/queries/LiveQueryStore.js +85 -0
- package/dist/cjs/queries/LiveQueryStore.js.map +1 -0
- package/dist/cjs/queries/Query.d.ts +18 -0
- package/dist/cjs/queries/Query.js +36 -0
- package/dist/cjs/queries/Query.js.map +1 -0
- package/dist/cjs/queries/QueryMaker.d.ts +14 -0
- package/dist/cjs/queries/QueryMaker.js +42 -0
- package/dist/cjs/queries/QueryMaker.js.map +1 -0
- package/dist/cjs/queries/QueryStore.d.ts +35 -0
- package/dist/cjs/queries/QueryStore.js +130 -0
- package/dist/cjs/queries/QueryStore.js.map +1 -0
- package/dist/cjs/queries/ranges.d.ts +2 -0
- package/dist/cjs/queries/ranges.js +70 -0
- package/dist/cjs/queries/ranges.js.map +1 -0
- package/dist/cjs/queries2/BaseQuery.d.ts +39 -0
- package/dist/cjs/queries2/BaseQuery.js +99 -0
- package/dist/cjs/queries2/BaseQuery.js.map +1 -0
- package/dist/cjs/queries2/CollectionQueries.d.ts +55 -0
- package/dist/cjs/queries2/CollectionQueries.js +83 -0
- package/dist/cjs/queries2/CollectionQueries.js.map +1 -0
- package/dist/cjs/queries2/FindAllQuery.d.ts +11 -0
- package/dist/cjs/queries2/FindAllQuery.js +34 -0
- package/dist/cjs/queries2/FindAllQuery.js.map +1 -0
- package/dist/cjs/queries2/FindInfiniteQuery.d.ts +18 -0
- package/dist/cjs/queries2/FindInfiniteQuery.js +61 -0
- package/dist/cjs/queries2/FindInfiniteQuery.js.map +1 -0
- package/dist/cjs/queries2/FindOneQuery.d.ts +11 -0
- package/dist/cjs/queries2/FindOneQuery.js +34 -0
- package/dist/cjs/queries2/FindOneQuery.js.map +1 -0
- package/dist/cjs/queries2/FindPageQuery.d.ts +23 -0
- package/dist/cjs/queries2/FindPageQuery.js +68 -0
- package/dist/cjs/queries2/FindPageQuery.js.map +1 -0
- package/dist/cjs/queries2/GetQuery.d.ts +10 -0
- package/dist/cjs/queries2/GetQuery.js +30 -0
- package/dist/cjs/queries2/GetQuery.js.map +1 -0
- package/dist/cjs/queries2/QueryCache.d.ts +16 -0
- package/dist/cjs/queries2/QueryCache.js +40 -0
- package/dist/cjs/queries2/QueryCache.js.map +1 -0
- package/dist/cjs/queries2/dbQueries.d.ts +22 -0
- package/dist/cjs/queries2/dbQueries.js +126 -0
- package/dist/cjs/queries2/dbQueries.js.map +1 -0
- package/dist/cjs/queries2/keys.d.ts +10 -0
- package/dist/cjs/queries2/keys.js +34 -0
- package/dist/cjs/queries2/keys.js.map +1 -0
- package/dist/cjs/queries2/ranges.d.ts +2 -0
- package/dist/cjs/queries2/ranges.js +70 -0
- package/dist/cjs/queries2/ranges.js.map +1 -0
- package/dist/cjs/queries2/types.d.ts +6 -0
- package/dist/cjs/queries2/types.js +3 -0
- package/dist/cjs/queries2/types.js.map +1 -0
- package/dist/cjs/queries2/utils.d.ts +1 -0
- package/dist/cjs/queries2/utils.js +20 -0
- package/dist/cjs/queries2/utils.js.map +1 -0
- package/dist/cjs/reactives/DocumentFamiliyCache.d.ts +47 -0
- package/dist/cjs/reactives/DocumentFamiliyCache.js +211 -0
- package/dist/cjs/reactives/DocumentFamiliyCache.js.map +1 -0
- package/dist/cjs/reactives/Entity.d.ts +191 -0
- package/dist/cjs/reactives/Entity.js +463 -0
- package/dist/cjs/reactives/Entity.js.map +1 -0
- package/dist/cjs/reactives/EntityStore.d.ts +84 -0
- package/dist/cjs/reactives/EntityStore.js +422 -0
- package/dist/cjs/reactives/EntityStore.js.map +1 -0
- package/dist/cjs/reactives/FakeWeakRef.d.ts +11 -0
- package/dist/cjs/reactives/FakeWeakRef.js +19 -0
- package/dist/cjs/reactives/FakeWeakRef.js.map +1 -0
- package/dist/cjs/sync/FileSync.d.ts +23 -0
- package/dist/cjs/sync/FileSync.js +85 -0
- package/dist/cjs/sync/FileSync.js.map +1 -0
- package/dist/cjs/sync/Heartbeat.d.ts +24 -0
- package/dist/cjs/sync/Heartbeat.js +56 -0
- package/dist/cjs/sync/Heartbeat.js.map +1 -0
- package/dist/cjs/sync/PresenceManager.d.ts +41 -0
- package/dist/cjs/sync/PresenceManager.js +108 -0
- package/dist/cjs/sync/PresenceManager.js.map +1 -0
- package/dist/cjs/sync/PushPullSync.d.ts +36 -0
- package/dist/cjs/sync/PushPullSync.js +142 -0
- package/dist/cjs/sync/PushPullSync.js.map +1 -0
- package/dist/cjs/sync/ServerSyncEndpointProvider.d.ts +27 -0
- package/dist/cjs/sync/ServerSyncEndpointProvider.js +65 -0
- package/dist/cjs/sync/ServerSyncEndpointProvider.js.map +1 -0
- package/dist/cjs/sync/Sync.d.ts +127 -0
- package/dist/cjs/sync/Sync.js +245 -0
- package/dist/cjs/sync/Sync.js.map +1 -0
- package/dist/cjs/sync/WebSocketSync.d.ts +41 -0
- package/dist/cjs/sync/WebSocketSync.js +184 -0
- package/dist/cjs/sync/WebSocketSync.js.map +1 -0
- package/dist/cjs/types.d.ts +5 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/Disposable.d.ts +6 -0
- package/dist/cjs/utils/Disposable.js +19 -0
- package/dist/cjs/utils/Disposable.js.map +1 -0
- package/dist/cjs/utils/Resolvable.d.ts +8 -0
- package/dist/cjs/utils/Resolvable.js +23 -0
- package/dist/cjs/utils/Resolvable.js.map +1 -0
- package/dist/cjs/v2/AckInfoStore.d.ts +10 -0
- package/dist/cjs/v2/AckInfoStore.js +26 -0
- package/dist/cjs/v2/AckInfoStore.js.map +1 -0
- package/dist/cjs/v2/BaselinesStore.d.ts +10 -0
- package/dist/cjs/v2/BaselinesStore.js +36 -0
- package/dist/cjs/v2/BaselinesStore.js.map +1 -0
- package/dist/cjs/v2/DocumentManager.d.ts +19 -0
- package/dist/cjs/v2/DocumentManager.js +47 -0
- package/dist/cjs/v2/DocumentManager.js.map +1 -0
- package/dist/cjs/v2/Entity.d.ts +87 -0
- package/dist/cjs/v2/Entity.js +305 -0
- package/dist/cjs/v2/Entity.js.map +1 -0
- package/dist/cjs/v2/EntityStore.d.ts +37 -0
- package/dist/cjs/v2/EntityStore.js +165 -0
- package/dist/cjs/v2/EntityStore.js.map +1 -0
- package/dist/cjs/v2/IDBService.d.ts +7 -0
- package/dist/cjs/v2/IDBService.js +26 -0
- package/dist/cjs/v2/IDBService.js.map +1 -0
- package/dist/cjs/v2/LocalHistoryStore.d.ts +15 -0
- package/dist/cjs/v2/LocalHistoryStore.js +53 -0
- package/dist/cjs/v2/LocalHistoryStore.js.map +1 -0
- package/dist/cjs/v2/LocalReplicaStore.d.ts +14 -0
- package/dist/cjs/v2/LocalReplicaStore.js +49 -0
- package/dist/cjs/v2/LocalReplicaStore.js.map +1 -0
- package/dist/cjs/v2/MessageCreator.d.ts +19 -0
- package/dist/cjs/v2/MessageCreator.js +99 -0
- package/dist/cjs/v2/MessageCreator.js.map +1 -0
- package/dist/cjs/v2/Metadata.d.ts +90 -0
- package/dist/cjs/v2/Metadata.js +251 -0
- package/dist/cjs/v2/Metadata.js.map +1 -0
- package/dist/cjs/v2/OperationsStore.d.ts +38 -0
- package/dist/cjs/v2/OperationsStore.js +146 -0
- package/dist/cjs/v2/OperationsStore.js.map +1 -0
- package/dist/cjs/v2/PresenceManager.d.ts +24 -0
- package/dist/cjs/v2/PresenceManager.js +73 -0
- package/dist/cjs/v2/PresenceManager.js.map +1 -0
- package/dist/cjs/v2/Query.d.ts +24 -0
- package/dist/cjs/v2/Query.js +79 -0
- package/dist/cjs/v2/Query.js.map +1 -0
- package/dist/cjs/v2/QueryMaker.d.ts +16 -0
- package/dist/cjs/v2/QueryMaker.js +84 -0
- package/dist/cjs/v2/QueryMaker.js.map +1 -0
- package/dist/cjs/v2/QueryStore.d.ts +26 -0
- package/dist/cjs/v2/QueryStore.js +136 -0
- package/dist/cjs/v2/QueryStore.js.map +1 -0
- package/dist/cjs/v2/SchemaStore.d.ts +9 -0
- package/dist/cjs/v2/SchemaStore.js +35 -0
- package/dist/cjs/v2/SchemaStore.js.map +1 -0
- package/dist/cjs/v2/Storage.d.ts +80 -0
- package/dist/cjs/v2/Storage.js +154 -0
- package/dist/cjs/v2/Storage.js.map +1 -0
- package/dist/cjs/v2/Sync.d.ts +42 -0
- package/dist/cjs/v2/Sync.js +98 -0
- package/dist/cjs/v2/Sync.js.map +1 -0
- package/dist/cjs/v2/SyncHarness.d.ts +45 -0
- package/dist/cjs/v2/SyncHarness.js +110 -0
- package/dist/cjs/v2/SyncHarness.js.map +1 -0
- package/dist/cjs/v2/__tests__/documents.test.d.ts +1 -0
- package/dist/cjs/v2/__tests__/documents.test.js +185 -0
- package/dist/cjs/v2/__tests__/documents.test.js.map +1 -0
- package/dist/cjs/v2/__tests__/fixtures/testStorage.d.ts +189 -0
- package/dist/cjs/v2/__tests__/fixtures/testStorage.js +93 -0
- package/dist/cjs/v2/__tests__/fixtures/testStorage.js.map +1 -0
- package/dist/cjs/v2/__tests__/queries.test.d.ts +1 -0
- package/dist/cjs/v2/__tests__/queries.test.js +92 -0
- package/dist/cjs/v2/__tests__/queries.test.js.map +1 -0
- package/dist/cjs/v2/__tests__/setup/indexedDB.d.ts +1 -0
- package/dist/cjs/v2/__tests__/setup/indexedDB.js +4 -0
- package/dist/cjs/v2/__tests__/setup/indexedDB.js.map +1 -0
- package/dist/cjs/v2/constants.d.ts +1 -0
- package/dist/cjs/v2/constants.js +5 -0
- package/dist/cjs/v2/constants.js.map +1 -0
- package/dist/cjs/v2/idb.d.ts +6 -0
- package/dist/cjs/v2/idb.js +71 -0
- package/dist/cjs/v2/idb.js.map +1 -0
- package/dist/cjs/v2/index.d.ts +6 -0
- package/dist/cjs/v2/index.js +14 -0
- package/dist/cjs/v2/index.js.map +1 -0
- package/dist/cjs/v2/indexes.d.ts +3 -0
- package/dist/cjs/v2/indexes.js +20 -0
- package/dist/cjs/v2/indexes.js.map +1 -0
- package/dist/cjs/v2/openDocumentDatabase.d.ts +9 -0
- package/dist/cjs/v2/openDocumentDatabase.js +100 -0
- package/dist/cjs/v2/openDocumentDatabase.js.map +1 -0
- package/dist/cjs/v2/types.d.ts +3 -0
- package/dist/cjs/v2/types.js +3 -0
- package/dist/cjs/v2/types.js.map +1 -0
- package/dist/esm/AckInfoStore.d.ts +10 -0
- package/dist/esm/AckInfoStore.js +22 -0
- package/dist/esm/AckInfoStore.js.map +1 -0
- package/dist/esm/BackoffScheduler.d.ts +19 -0
- package/dist/esm/BackoffScheduler.js +40 -0
- package/dist/esm/BackoffScheduler.js.map +1 -0
- package/dist/esm/BaselinesStore.d.ts +10 -0
- package/dist/esm/BaselinesStore.js +32 -0
- package/dist/esm/BaselinesStore.js.map +1 -0
- package/dist/esm/DocumentManager.d.ts +28 -0
- package/dist/esm/DocumentManager.js +41 -0
- package/dist/esm/DocumentManager.js.map +1 -0
- package/dist/esm/Entity.d.ts +96 -0
- package/dist/esm/Entity.js +337 -0
- package/dist/esm/Entity.js.map +1 -0
- package/dist/esm/EntityStore.d.ts +36 -0
- package/dist/esm/EntityStore.js +168 -0
- package/dist/esm/EntityStore.js.map +1 -0
- package/dist/esm/IDBService.d.ts +9 -0
- package/dist/esm/IDBService.js +43 -0
- package/dist/esm/IDBService.js.map +1 -0
- package/dist/esm/LocalHistoryStore.d.ts +15 -0
- package/dist/esm/LocalHistoryStore.js +49 -0
- package/dist/esm/LocalHistoryStore.js.map +1 -0
- package/dist/esm/LocalReplicaStore.d.ts +13 -0
- package/dist/esm/LocalReplicaStore.js +42 -0
- package/dist/esm/LocalReplicaStore.js.map +1 -0
- package/dist/esm/MessageCreator.d.ts +19 -0
- package/dist/esm/MessageCreator.js +97 -0
- package/dist/esm/MessageCreator.js.map +1 -0
- package/dist/esm/Metadata.d.ts +91 -0
- package/dist/esm/Metadata.js +245 -0
- package/dist/esm/Metadata.js.map +1 -0
- package/dist/esm/OperationsStore.d.ts +38 -0
- package/dist/esm/OperationsStore.js +142 -0
- package/dist/esm/OperationsStore.js.map +1 -0
- package/dist/esm/PresenceManager.d.ts +30 -0
- package/dist/esm/PresenceManager.js +85 -0
- package/dist/esm/PresenceManager.js.map +1 -0
- package/dist/esm/Query.d.ts +26 -0
- package/dist/esm/Query.js +82 -0
- package/dist/esm/Query.js.map +1 -0
- package/dist/esm/QueryMaker.d.ts +18 -0
- package/dist/esm/QueryMaker.js +94 -0
- package/dist/esm/QueryMaker.js.map +1 -0
- package/dist/esm/QueryStore.d.ts +38 -0
- package/dist/esm/QueryStore.js +142 -0
- package/dist/esm/QueryStore.js.map +1 -0
- package/dist/esm/SchemaStore.d.ts +9 -0
- package/dist/esm/SchemaStore.js +31 -0
- package/dist/esm/SchemaStore.js.map +1 -0
- package/dist/esm/Storage.d.ts +147 -0
- package/dist/esm/Storage.js +341 -0
- package/dist/esm/Storage.js.map +1 -0
- package/dist/esm/Sync.d.ts +117 -0
- package/dist/esm/Sync.js +553 -0
- package/dist/esm/Sync.js.map +1 -0
- package/dist/esm/SyncHarness.d.ts +45 -0
- package/dist/esm/SyncHarness.js +105 -0
- package/dist/esm/SyncHarness.js.map +1 -0
- package/dist/esm/UndoHistory.d.ts +16 -0
- package/dist/esm/UndoHistory.js +47 -0
- package/dist/esm/UndoHistory.js.map +1 -0
- package/dist/esm/__tests__/batching.test.d.ts +1 -0
- package/dist/esm/__tests__/batching.test.js +43 -0
- package/dist/esm/__tests__/batching.test.js.map +1 -0
- package/dist/esm/__tests__/documents.test.d.ts +1 -0
- package/dist/esm/__tests__/documents.test.js +401 -0
- package/dist/esm/__tests__/documents.test.js.map +1 -0
- package/dist/esm/__tests__/fixtures/testStorage.d.ts +118 -0
- package/dist/esm/__tests__/fixtures/testStorage.js +112 -0
- package/dist/esm/__tests__/fixtures/testStorage.js.map +1 -0
- package/dist/esm/__tests__/queries.test.d.ts +1 -0
- package/dist/esm/__tests__/queries.test.js +261 -0
- package/dist/esm/__tests__/queries.test.js.map +1 -0
- package/dist/esm/__tests__/setup/indexedDB.d.ts +1 -0
- package/dist/esm/__tests__/setup/indexedDB.js +2 -0
- package/dist/esm/__tests__/setup/indexedDB.js.map +1 -0
- package/dist/esm/__tests__/undo.test.d.ts +1 -0
- package/dist/esm/__tests__/undo.test.js +85 -0
- package/dist/esm/__tests__/undo.test.js.map +1 -0
- package/dist/esm/client/Client.d.ts +86 -0
- package/dist/esm/client/Client.js +223 -0
- package/dist/esm/client/Client.js.map +1 -0
- package/dist/esm/client/ClientDescriptor.d.ts +62 -0
- package/dist/esm/client/ClientDescriptor.js +105 -0
- package/dist/esm/client/ClientDescriptor.js.map +1 -0
- package/dist/esm/constants.d.ts +1 -0
- package/dist/esm/constants.js +2 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/context.d.ts +17 -0
- package/dist/esm/context.js +2 -0
- package/dist/esm/context.js.map +1 -0
- package/dist/esm/files/EntityFile.d.ts +27 -0
- package/dist/esm/files/EntityFile.js +68 -0
- package/dist/esm/files/EntityFile.js.map +1 -0
- package/dist/esm/files/FileManager.d.ts +42 -0
- package/dist/esm/files/FileManager.js +142 -0
- package/dist/esm/files/FileManager.js.map +1 -0
- package/dist/esm/files/FileStorage.d.ts +27 -0
- package/dist/esm/files/FileStorage.js +89 -0
- package/dist/esm/files/FileStorage.js.map +1 -0
- package/dist/esm/files/utils.d.ts +8 -0
- package/dist/esm/files/utils.js +47 -0
- package/dist/esm/files/utils.js.map +1 -0
- package/dist/esm/files/utils.test.d.ts +1 -0
- package/dist/esm/files/utils.test.js +79 -0
- package/dist/esm/files/utils.test.js.map +1 -0
- package/dist/esm/idb.d.ts +8 -0
- package/dist/esm/idb.js +80 -0
- package/dist/esm/idb.js.map +1 -0
- package/dist/esm/index.d.ts +19 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/indexes.d.ts +3 -0
- package/dist/esm/indexes.js +15 -0
- package/dist/esm/indexes.js.map +1 -0
- package/dist/esm/metadata/AckInfoStore.d.ts +10 -0
- package/dist/esm/metadata/AckInfoStore.js +22 -0
- package/dist/esm/metadata/AckInfoStore.js.map +1 -0
- package/dist/esm/metadata/BaselinesStore.d.ts +33 -0
- package/dist/esm/metadata/BaselinesStore.js +56 -0
- package/dist/esm/metadata/BaselinesStore.js.map +1 -0
- package/dist/esm/metadata/LocalHistoryStore.d.ts +15 -0
- package/dist/esm/metadata/LocalHistoryStore.js +49 -0
- package/dist/esm/metadata/LocalHistoryStore.js.map +1 -0
- package/dist/esm/metadata/LocalReplicaStore.d.ts +17 -0
- package/dist/esm/metadata/LocalReplicaStore.js +41 -0
- package/dist/esm/metadata/LocalReplicaStore.js.map +1 -0
- package/dist/esm/metadata/MessageCreator.d.ts +19 -0
- package/dist/esm/metadata/MessageCreator.js +124 -0
- package/dist/esm/metadata/MessageCreator.js.map +1 -0
- package/dist/esm/metadata/Metadata.d.ts +106 -0
- package/dist/esm/metadata/Metadata.js +335 -0
- package/dist/esm/metadata/Metadata.js.map +1 -0
- package/dist/esm/metadata/OperationsStore.d.ts +50 -0
- package/dist/esm/metadata/OperationsStore.js +142 -0
- package/dist/esm/metadata/OperationsStore.js.map +1 -0
- package/dist/esm/metadata/SchemaStore.d.ts +9 -0
- package/dist/esm/metadata/SchemaStore.js +35 -0
- package/dist/esm/metadata/SchemaStore.js.map +1 -0
- package/dist/esm/metadata/openMetadataDatabase.d.ts +8 -0
- package/dist/esm/metadata/openMetadataDatabase.js +102 -0
- package/dist/esm/metadata/openMetadataDatabase.js.map +1 -0
- package/dist/esm/openDocumentDatabase.d.ts +12 -0
- package/dist/esm/openDocumentDatabase.js +428 -0
- package/dist/esm/openDocumentDatabase.js.map +1 -0
- package/dist/esm/queries/LiveQuery.d.ts +28 -0
- package/dist/esm/queries/LiveQuery.js +92 -0
- package/dist/esm/queries/LiveQuery.js.map +1 -0
- package/dist/esm/queries/LiveQueryMaker.d.ts +15 -0
- package/dist/esm/queries/LiveQueryMaker.js +38 -0
- package/dist/esm/queries/LiveQueryMaker.js.map +1 -0
- package/dist/esm/queries/LiveQueryStore.d.ts +33 -0
- package/dist/esm/queries/LiveQueryStore.js +81 -0
- package/dist/esm/queries/LiveQueryStore.js.map +1 -0
- package/dist/esm/queries/Query.d.ts +18 -0
- package/dist/esm/queries/Query.js +32 -0
- package/dist/esm/queries/Query.js.map +1 -0
- package/dist/esm/queries/QueryMaker.d.ts +14 -0
- package/dist/esm/queries/QueryMaker.js +38 -0
- package/dist/esm/queries/QueryMaker.js.map +1 -0
- package/dist/esm/queries/QueryStore.d.ts +35 -0
- package/dist/esm/queries/QueryStore.js +126 -0
- package/dist/esm/queries/QueryStore.js.map +1 -0
- package/dist/esm/queries/ranges.d.ts +2 -0
- package/dist/esm/queries/ranges.js +66 -0
- package/dist/esm/queries/ranges.js.map +1 -0
- package/dist/esm/queries2/BaseQuery.d.ts +39 -0
- package/dist/esm/queries2/BaseQuery.js +95 -0
- package/dist/esm/queries2/BaseQuery.js.map +1 -0
- package/dist/esm/queries2/CollectionQueries.d.ts +55 -0
- package/dist/esm/queries2/CollectionQueries.js +79 -0
- package/dist/esm/queries2/CollectionQueries.js.map +1 -0
- package/dist/esm/queries2/FindAllQuery.d.ts +11 -0
- package/dist/esm/queries2/FindAllQuery.js +30 -0
- package/dist/esm/queries2/FindAllQuery.js.map +1 -0
- package/dist/esm/queries2/FindInfiniteQuery.d.ts +18 -0
- package/dist/esm/queries2/FindInfiniteQuery.js +57 -0
- package/dist/esm/queries2/FindInfiniteQuery.js.map +1 -0
- package/dist/esm/queries2/FindOneQuery.d.ts +11 -0
- package/dist/esm/queries2/FindOneQuery.js +30 -0
- package/dist/esm/queries2/FindOneQuery.js.map +1 -0
- package/dist/esm/queries2/FindPageQuery.d.ts +23 -0
- package/dist/esm/queries2/FindPageQuery.js +64 -0
- package/dist/esm/queries2/FindPageQuery.js.map +1 -0
- package/dist/esm/queries2/GetQuery.d.ts +10 -0
- package/dist/esm/queries2/GetQuery.js +26 -0
- package/dist/esm/queries2/GetQuery.js.map +1 -0
- package/dist/esm/queries2/QueryCache.d.ts +16 -0
- package/dist/esm/queries2/QueryCache.js +36 -0
- package/dist/esm/queries2/QueryCache.js.map +1 -0
- package/dist/esm/queries2/dbQueries.d.ts +22 -0
- package/dist/esm/queries2/dbQueries.js +120 -0
- package/dist/esm/queries2/dbQueries.js.map +1 -0
- package/dist/esm/queries2/keys.d.ts +10 -0
- package/dist/esm/queries2/keys.js +30 -0
- package/dist/esm/queries2/keys.js.map +1 -0
- package/dist/esm/queries2/ranges.d.ts +2 -0
- package/dist/esm/queries2/ranges.js +66 -0
- package/dist/esm/queries2/ranges.js.map +1 -0
- package/dist/esm/queries2/types.d.ts +6 -0
- package/dist/esm/queries2/types.js +2 -0
- package/dist/esm/queries2/types.js.map +1 -0
- package/dist/esm/queries2/utils.d.ts +1 -0
- package/dist/esm/queries2/utils.js +16 -0
- package/dist/esm/queries2/utils.js.map +1 -0
- package/dist/esm/reactives/DocumentFamiliyCache.d.ts +47 -0
- package/dist/esm/reactives/DocumentFamiliyCache.js +207 -0
- package/dist/esm/reactives/DocumentFamiliyCache.js.map +1 -0
- package/dist/esm/reactives/Entity.d.ts +191 -0
- package/dist/esm/reactives/Entity.js +458 -0
- package/dist/esm/reactives/Entity.js.map +1 -0
- package/dist/esm/reactives/EntityStore.d.ts +84 -0
- package/dist/esm/reactives/EntityStore.js +418 -0
- package/dist/esm/reactives/EntityStore.js.map +1 -0
- package/dist/esm/reactives/FakeWeakRef.d.ts +11 -0
- package/dist/esm/reactives/FakeWeakRef.js +15 -0
- package/dist/esm/reactives/FakeWeakRef.js.map +1 -0
- package/dist/esm/sync/FileSync.d.ts +23 -0
- package/dist/esm/sync/FileSync.js +81 -0
- package/dist/esm/sync/FileSync.js.map +1 -0
- package/dist/esm/sync/Heartbeat.d.ts +24 -0
- package/dist/esm/sync/Heartbeat.js +52 -0
- package/dist/esm/sync/Heartbeat.js.map +1 -0
- package/dist/esm/sync/PresenceManager.d.ts +41 -0
- package/dist/esm/sync/PresenceManager.js +104 -0
- package/dist/esm/sync/PresenceManager.js.map +1 -0
- package/dist/esm/sync/PushPullSync.d.ts +36 -0
- package/dist/esm/sync/PushPullSync.js +138 -0
- package/dist/esm/sync/PushPullSync.js.map +1 -0
- package/dist/esm/sync/ServerSyncEndpointProvider.d.ts +27 -0
- package/dist/esm/sync/ServerSyncEndpointProvider.js +58 -0
- package/dist/esm/sync/ServerSyncEndpointProvider.js.map +1 -0
- package/dist/esm/sync/Sync.d.ts +127 -0
- package/dist/esm/sync/Sync.js +240 -0
- package/dist/esm/sync/Sync.js.map +1 -0
- package/dist/esm/sync/WebsocketSync.d.ts +41 -0
- package/dist/esm/sync/WebsocketSync.js +180 -0
- package/dist/esm/sync/WebsocketSync.js.map +1 -0
- package/dist/esm/types.d.ts +5 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/Disposable.d.ts +6 -0
- package/dist/esm/utils/Disposable.js +15 -0
- package/dist/esm/utils/Disposable.js.map +1 -0
- package/dist/esm/utils/Resolvable.d.ts +8 -0
- package/dist/esm/utils/Resolvable.js +19 -0
- package/dist/esm/utils/Resolvable.js.map +1 -0
- package/dist/esm/v2/AckInfoStore.d.ts +10 -0
- package/dist/esm/v2/AckInfoStore.js +22 -0
- package/dist/esm/v2/AckInfoStore.js.map +1 -0
- package/dist/esm/v2/BaselinesStore.d.ts +10 -0
- package/dist/esm/v2/BaselinesStore.js +32 -0
- package/dist/esm/v2/BaselinesStore.js.map +1 -0
- package/dist/esm/v2/DocumentManager.d.ts +19 -0
- package/dist/esm/v2/DocumentManager.js +43 -0
- package/dist/esm/v2/DocumentManager.js.map +1 -0
- package/dist/esm/v2/Entity.d.ts +91 -0
- package/dist/esm/v2/Entity.js +305 -0
- package/dist/esm/v2/Entity.js.map +1 -0
- package/dist/esm/v2/EntityStore.d.ts +37 -0
- package/dist/esm/v2/EntityStore.js +166 -0
- package/dist/esm/v2/EntityStore.js.map +1 -0
- package/dist/esm/v2/IDBService.d.ts +7 -0
- package/dist/esm/v2/IDBService.js +22 -0
- package/dist/esm/v2/IDBService.js.map +1 -0
- package/dist/esm/v2/LocalHistoryStore.d.ts +15 -0
- package/dist/esm/v2/LocalHistoryStore.js +49 -0
- package/dist/esm/v2/LocalHistoryStore.js.map +1 -0
- package/dist/esm/v2/LocalReplicaStore.d.ts +14 -0
- package/dist/esm/v2/LocalReplicaStore.js +42 -0
- package/dist/esm/v2/LocalReplicaStore.js.map +1 -0
- package/dist/esm/v2/MessageCreator.d.ts +19 -0
- package/dist/esm/v2/MessageCreator.js +92 -0
- package/dist/esm/v2/MessageCreator.js.map +1 -0
- package/dist/esm/v2/Metadata.d.ts +90 -0
- package/dist/esm/v2/Metadata.js +246 -0
- package/dist/esm/v2/Metadata.js.map +1 -0
- package/dist/esm/v2/OperationsStore.d.ts +38 -0
- package/dist/esm/v2/OperationsStore.js +142 -0
- package/dist/esm/v2/OperationsStore.js.map +1 -0
- package/dist/esm/v2/PresenceManager.d.ts +24 -0
- package/dist/esm/v2/PresenceManager.js +69 -0
- package/dist/esm/v2/PresenceManager.js.map +1 -0
- package/dist/esm/v2/Query.d.ts +24 -0
- package/dist/esm/v2/Query.js +75 -0
- package/dist/esm/v2/Query.js.map +1 -0
- package/dist/esm/v2/QueryMaker.d.ts +16 -0
- package/dist/esm/v2/QueryMaker.js +80 -0
- package/dist/esm/v2/QueryMaker.js.map +1 -0
- package/dist/esm/v2/QueryStore.d.ts +26 -0
- package/dist/esm/v2/QueryStore.js +132 -0
- package/dist/esm/v2/QueryStore.js.map +1 -0
- package/dist/esm/v2/SchemaStore.d.ts +9 -0
- package/dist/esm/v2/SchemaStore.js +31 -0
- package/dist/esm/v2/SchemaStore.js.map +1 -0
- package/dist/esm/v2/Storage.d.ts +80 -0
- package/dist/esm/v2/Storage.js +149 -0
- package/dist/esm/v2/Storage.js.map +1 -0
- package/dist/esm/v2/Sync.d.ts +42 -0
- package/dist/esm/v2/Sync.js +94 -0
- package/dist/esm/v2/Sync.js.map +1 -0
- package/dist/esm/v2/SyncHarness.d.ts +45 -0
- package/dist/esm/v2/SyncHarness.js +105 -0
- package/dist/esm/v2/SyncHarness.js.map +1 -0
- package/dist/esm/v2/__tests__/documents.test.d.ts +1 -0
- package/dist/esm/v2/__tests__/documents.test.js +208 -0
- package/dist/esm/v2/__tests__/documents.test.js.map +1 -0
- package/dist/esm/v2/__tests__/fixtures/testStorage.d.ts +223 -0
- package/dist/esm/v2/__tests__/fixtures/testStorage.js +106 -0
- package/dist/esm/v2/__tests__/fixtures/testStorage.js.map +1 -0
- package/dist/esm/v2/__tests__/queries.test.d.ts +1 -0
- package/dist/esm/v2/__tests__/queries.test.js +90 -0
- package/dist/esm/v2/__tests__/queries.test.js.map +1 -0
- package/dist/esm/v2/__tests__/setup/indexedDB.d.ts +1 -0
- package/dist/esm/v2/__tests__/setup/indexedDB.js +2 -0
- package/dist/esm/v2/__tests__/setup/indexedDB.js.map +1 -0
- package/dist/esm/v2/constants.d.ts +1 -0
- package/dist/esm/v2/constants.js +2 -0
- package/dist/esm/v2/constants.js.map +1 -0
- package/dist/esm/v2/idb.d.ts +6 -0
- package/dist/esm/v2/idb.js +65 -0
- package/dist/esm/v2/idb.js.map +1 -0
- package/dist/esm/v2/index.d.ts +6 -0
- package/dist/esm/v2/index.js +5 -0
- package/dist/esm/v2/index.js.map +1 -0
- package/dist/esm/v2/indexes.d.ts +3 -0
- package/dist/esm/v2/indexes.js +15 -0
- package/dist/esm/v2/indexes.js.map +1 -0
- package/dist/esm/v2/openDocumentDatabase.d.ts +9 -0
- package/dist/esm/v2/openDocumentDatabase.js +96 -0
- package/dist/esm/v2/openDocumentDatabase.js.map +1 -0
- package/dist/esm/v2/types.d.ts +3 -0
- package/dist/esm/v2/types.js +2 -0
- package/dist/esm/v2/types.js.map +1 -0
- package/dist/tsconfig-cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +41 -0
- package/src/BackoffScheduler.ts +52 -0
- package/src/DocumentManager.ts +95 -0
- package/src/IDBService.ts +64 -0
- package/src/UndoHistory.ts +52 -0
- package/src/__tests__/batching.test.ts +55 -0
- package/src/__tests__/documents.test.ts +483 -0
- package/src/__tests__/fixtures/testStorage.ts +119 -0
- package/src/__tests__/queries.test.ts +311 -0
- package/src/__tests__/setup/indexedDB.ts +1 -0
- package/src/__tests__/undo.test.ts +108 -0
- package/src/client/Client.ts +307 -0
- package/src/client/ClientDescriptor.ts +172 -0
- package/src/constants.ts +1 -0
- package/src/context.ts +18 -0
- package/src/files/EntityFile.ts +74 -0
- package/src/files/FileManager.ts +195 -0
- package/src/files/FileStorage.ts +177 -0
- package/src/files/utils.test.ts +83 -0
- package/src/files/utils.ts +55 -0
- package/src/idb.ts +88 -0
- package/src/index.ts +40 -0
- package/src/indexes.ts +31 -0
- package/src/metadata/AckInfoStore.ts +30 -0
- package/src/metadata/BaselinesStore.ts +140 -0
- package/src/metadata/LocalReplicaStore.ts +60 -0
- package/src/metadata/MessageCreator.ts +153 -0
- package/src/metadata/Metadata.ts +492 -0
- package/src/metadata/OperationsStore.ts +268 -0
- package/src/metadata/SchemaStore.ts +47 -0
- package/src/metadata/openMetadataDatabase.ts +114 -0
- package/src/openDocumentDatabase.ts +632 -0
- package/src/queries2/BaseQuery.ts +149 -0
- package/src/queries2/CollectionQueries.ts +174 -0
- package/src/queries2/FindAllQuery.ts +34 -0
- package/src/queries2/FindInfiniteQuery.ts +66 -0
- package/src/queries2/FindOneQuery.ts +34 -0
- package/src/queries2/FindPageQuery.ts +80 -0
- package/src/queries2/GetQuery.ts +28 -0
- package/src/queries2/QueryCache.ts +49 -0
- package/src/queries2/dbQueries.ts +154 -0
- package/src/queries2/keys.ts +27 -0
- package/src/queries2/ranges.ts +107 -0
- package/src/queries2/types.ts +12 -0
- package/src/queries2/utils.ts +15 -0
- package/src/reactives/DocumentFamiliyCache.ts +289 -0
- package/src/reactives/Entity.ts +773 -0
- package/src/reactives/EntityStore.ts +627 -0
- package/src/reactives/FakeWeakRef.ts +18 -0
- package/src/reactives/design.tldr +808 -0
- package/src/sync/FileSync.ts +124 -0
- package/src/sync/Heartbeat.ts +70 -0
- package/src/sync/PresenceManager.ts +145 -0
- package/src/sync/PushPullSync.ts +185 -0
- package/src/sync/ServerSyncEndpointProvider.ts +85 -0
- package/src/sync/Sync.ts +418 -0
- package/src/sync/WebSocketSync.ts +240 -0
- package/src/types.ts +7 -0
- package/src/utils/Disposable.ts +14 -0
- package/src/utils/Resolvable.ts +24 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Heartbeat = void 0;
|
|
4
|
+
const common_1 = require("@verdant-web/common");
|
|
5
|
+
class Heartbeat extends common_1.EventSubscriber {
|
|
6
|
+
get interval() {
|
|
7
|
+
return this._interval;
|
|
8
|
+
}
|
|
9
|
+
constructor({ interval = 15 * 1000, deadlineLength = 3 * 1000, } = {}) {
|
|
10
|
+
super();
|
|
11
|
+
this.nextBeat = null;
|
|
12
|
+
this.deadline = null;
|
|
13
|
+
this.keepAlive = () => {
|
|
14
|
+
if (this.deadline) {
|
|
15
|
+
clearTimeout(this.deadline);
|
|
16
|
+
this.deadline = null;
|
|
17
|
+
this.start();
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
this.start = (immediate = false) => {
|
|
21
|
+
this.stop();
|
|
22
|
+
if (immediate) {
|
|
23
|
+
this.beat();
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this.nextBeat = setTimeout(this.beat, this._interval);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
this.stop = () => {
|
|
30
|
+
if (this.nextBeat) {
|
|
31
|
+
clearTimeout(this.nextBeat);
|
|
32
|
+
}
|
|
33
|
+
if (this.deadline) {
|
|
34
|
+
clearTimeout(this.deadline);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
this.beat = async () => {
|
|
38
|
+
this.emit('beat');
|
|
39
|
+
this.deadline = setTimeout(this.onDeadline, this.deadlineLength);
|
|
40
|
+
};
|
|
41
|
+
this.onDeadline = () => {
|
|
42
|
+
this.deadline = null;
|
|
43
|
+
this.emit('missed');
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Only takes affect after the next beat
|
|
47
|
+
*/
|
|
48
|
+
this.setInterval = (interval) => {
|
|
49
|
+
this._interval = interval;
|
|
50
|
+
};
|
|
51
|
+
this._interval = interval;
|
|
52
|
+
this.deadlineLength = deadlineLength;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.Heartbeat = Heartbeat;
|
|
56
|
+
//# sourceMappingURL=Heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Heartbeat.js","sourceRoot":"","sources":["../../../src/sync/Heartbeat.ts"],"names":[],"mappings":";;;AAAA,gDAAsD;AAEtD,MAAa,SAAU,SAAQ,wBAG7B;IAMD,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,YAAY,EACX,QAAQ,GAAG,EAAE,GAAG,IAAI,EACpB,cAAc,GAAG,CAAC,GAAG,IAAI,MAItB,EAAE;QACL,KAAK,EAAE,CAAC;QAdD,aAAQ,GAA0B,IAAI,CAAC;QACvC,aAAQ,GAA0B,IAAI,CAAC;QAkB/C,cAAS,GAAG,GAAG,EAAE;YAChB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAClB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,KAAK,EAAE,CAAC;aACb;QACF,CAAC,CAAC;QAEF,UAAK,GAAG,CAAC,SAAS,GAAG,KAAK,EAAE,EAAE;YAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,SAAS,EAAE;gBACd,IAAI,CAAC,IAAI,EAAE,CAAC;aACZ;iBAAM;gBACN,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;aACtD;QACF,CAAC,CAAC;QAEF,SAAI,GAAG,GAAG,EAAE;YACX,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAClB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC5B;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAClB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC5B;QACF,CAAC,CAAC;QAEM,SAAI,GAAG,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAClE,CAAC,CAAC;QAEM,eAAU,GAAG,GAAG,EAAE;YACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF;;WAEG;QACH,gBAAW,GAAG,CAAC,QAAgB,EAAE,EAAE;YAClC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC3B,CAAC,CAAC;QA7CD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACtC,CAAC;CA4CD;AAnED,8BAmEC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ServerMessage, EventSubscriber } from '@verdant-web/common';
|
|
2
|
+
import type { UserInfo } from '../index.js';
|
|
3
|
+
import { LocalReplicaInfo } from '../metadata/LocalReplicaStore.js';
|
|
4
|
+
export declare const HANDLE_MESSAGE: unique symbol;
|
|
5
|
+
export declare class PresenceManager<Profile = any, Presence = any> extends EventSubscriber<{
|
|
6
|
+
peerChanged: (userId: string, presence: UserInfo<Profile, Presence>) => void;
|
|
7
|
+
selfChanged: (presence: UserInfo<Profile, Presence>) => void;
|
|
8
|
+
peersChanged: (peers: Record<string, any>) => void;
|
|
9
|
+
peerLeft: (userId: string, lastPresence: UserInfo<Profile, Presence>) => void;
|
|
10
|
+
update: (presence: Partial<Presence>) => void;
|
|
11
|
+
}> {
|
|
12
|
+
private _peers;
|
|
13
|
+
private _self;
|
|
14
|
+
private _peerIds;
|
|
15
|
+
private _updateBatcher;
|
|
16
|
+
private _updateBatch;
|
|
17
|
+
get self(): UserInfo<Profile, Presence>;
|
|
18
|
+
get peers(): Record<string, UserInfo<Profile, Presence>>;
|
|
19
|
+
get peerIds(): string[];
|
|
20
|
+
get everyone(): {
|
|
21
|
+
[x: string]: UserInfo<Profile, Presence>;
|
|
22
|
+
};
|
|
23
|
+
constructor({ initialPresence, updateBatchTimeout, defaultProfile, }: {
|
|
24
|
+
initialPresence: Presence;
|
|
25
|
+
defaultProfile: Profile;
|
|
26
|
+
updateBatchTimeout?: number;
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Decides if an update is for the local user or not. Even if it's a different replica
|
|
30
|
+
* than the local one.
|
|
31
|
+
*
|
|
32
|
+
* If the replicaId matches, we use that first - we may not know the local replica's User ID yet,
|
|
33
|
+
* e.g. on the first presence update.
|
|
34
|
+
*
|
|
35
|
+
* Otherwise, match the user ID to our local copy.
|
|
36
|
+
*/
|
|
37
|
+
private isSelf;
|
|
38
|
+
[HANDLE_MESSAGE]: (localReplicaInfo: LocalReplicaInfo, message: ServerMessage) => Promise<void>;
|
|
39
|
+
update: (presence: Partial<Presence>) => Promise<void>;
|
|
40
|
+
flushPresenceUpdates: (presenceUpdates: Partial<Presence>[]) => void;
|
|
41
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PresenceManager = exports.HANDLE_MESSAGE = void 0;
|
|
5
|
+
const common_1 = require("@verdant-web/common");
|
|
6
|
+
exports.HANDLE_MESSAGE = Symbol('handleMessage');
|
|
7
|
+
class PresenceManager extends common_1.EventSubscriber {
|
|
8
|
+
get self() {
|
|
9
|
+
return this._self;
|
|
10
|
+
}
|
|
11
|
+
get peers() {
|
|
12
|
+
return this._peers;
|
|
13
|
+
}
|
|
14
|
+
get peerIds() {
|
|
15
|
+
return this._peerIds;
|
|
16
|
+
}
|
|
17
|
+
get everyone() {
|
|
18
|
+
const everyone = Object.assign({}, this._peers);
|
|
19
|
+
everyone[this.self.id] = this.self;
|
|
20
|
+
return everyone;
|
|
21
|
+
}
|
|
22
|
+
constructor({ initialPresence, updateBatchTimeout = 200, defaultProfile, }) {
|
|
23
|
+
super();
|
|
24
|
+
this._peers = {};
|
|
25
|
+
this._self = { profile: {} };
|
|
26
|
+
this._peerIds = new Array();
|
|
27
|
+
/**
|
|
28
|
+
* Decides if an update is for the local user or not. Even if it's a different replica
|
|
29
|
+
* than the local one.
|
|
30
|
+
*
|
|
31
|
+
* If the replicaId matches, we use that first - we may not know the local replica's User ID yet,
|
|
32
|
+
* e.g. on the first presence update.
|
|
33
|
+
*
|
|
34
|
+
* Otherwise, match the user ID to our local copy.
|
|
35
|
+
*/
|
|
36
|
+
this.isSelf = (localReplicaInfo, userInfo) => {
|
|
37
|
+
return (localReplicaInfo.id === userInfo.replicaId ||
|
|
38
|
+
this._self.id === userInfo.id);
|
|
39
|
+
};
|
|
40
|
+
this[_a] = async (localReplicaInfo, message) => {
|
|
41
|
+
let peersChanged = false;
|
|
42
|
+
const peerIdsSet = new Set(this.peerIds);
|
|
43
|
+
if (message.type === 'presence-changed') {
|
|
44
|
+
if (this.isSelf(localReplicaInfo, message.userInfo)) {
|
|
45
|
+
this._self = message.userInfo;
|
|
46
|
+
this.emit('selfChanged', message.userInfo);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
peerIdsSet.add(message.userInfo.id);
|
|
50
|
+
this._peers[message.userInfo.id] = message.userInfo;
|
|
51
|
+
peersChanged = true;
|
|
52
|
+
this.emit('peerChanged', message.userInfo.id, message.userInfo);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (message.type === 'sync-resp') {
|
|
56
|
+
// reset to provided presence data, which includes all peers.
|
|
57
|
+
this._peers = {};
|
|
58
|
+
peerIdsSet.clear();
|
|
59
|
+
for (const [id, userInfo] of Object.entries(message.peerPresence)) {
|
|
60
|
+
if (this.isSelf(localReplicaInfo, userInfo)) {
|
|
61
|
+
this._self = userInfo;
|
|
62
|
+
this.emit('selfChanged', userInfo);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
peersChanged = true;
|
|
66
|
+
peerIdsSet.add(id);
|
|
67
|
+
this._peers[id] = userInfo;
|
|
68
|
+
this.emit('peerChanged', id, userInfo);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (message.type === 'presence-offline') {
|
|
73
|
+
peerIdsSet.delete(message.userId);
|
|
74
|
+
const lastPresence = this._peers[message.userId];
|
|
75
|
+
delete this._peers[message.userId];
|
|
76
|
+
peersChanged = true;
|
|
77
|
+
this.emit('peerLeft', message.userId, lastPresence);
|
|
78
|
+
}
|
|
79
|
+
if (peersChanged) {
|
|
80
|
+
this._peerIds = Array.from(peerIdsSet);
|
|
81
|
+
this.emit('peersChanged', this._peers);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
this.update = async (presence) => {
|
|
85
|
+
this._updateBatch.update({
|
|
86
|
+
items: [presence],
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
this.flushPresenceUpdates = (presenceUpdates) => {
|
|
90
|
+
const presence = presenceUpdates.reduce((acc, update) => {
|
|
91
|
+
return Object.assign(Object.assign({}, acc), update);
|
|
92
|
+
}, this.self.presence);
|
|
93
|
+
this.emit('update', presence);
|
|
94
|
+
};
|
|
95
|
+
this.self.presence = initialPresence;
|
|
96
|
+
this.self.profile = defaultProfile;
|
|
97
|
+
this._updateBatcher = new common_1.Batcher(this.flushPresenceUpdates);
|
|
98
|
+
this._updateBatch = this._updateBatcher.add({
|
|
99
|
+
max: 25,
|
|
100
|
+
timeout: updateBatchTimeout,
|
|
101
|
+
items: [],
|
|
102
|
+
key: 'default',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.PresenceManager = PresenceManager;
|
|
107
|
+
_a = exports.HANDLE_MESSAGE;
|
|
108
|
+
//# sourceMappingURL=PresenceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PresenceManager.js","sourceRoot":"","sources":["../../../src/sync/PresenceManager.ts"],"names":[],"mappings":";;;;AAAA,gDAK6B;AAIhB,QAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAEtD,MAAa,eAGX,SAAQ,wBAMR;IAOD,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,IAAI,QAAQ;QACX,MAAM,QAAQ,qBAAQ,IAAI,CAAC,MAAM,CAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACnC,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,YAAY,EACX,eAAe,EACf,kBAAkB,GAAG,GAAG,EACxB,cAAc,GAKd;QACA,KAAK,EAAE,CAAC;QAjCD,WAAM,GAAG,EAAiD,CAAC;QAC3D,UAAK,GAAG,EAAE,OAAO,EAAE,EAAE,EAAiC,CAAC;QACvD,aAAQ,GAAG,IAAI,KAAK,EAAU,CAAC;QA4CvC;;;;;;;;WAQG;QACK,WAAM,GAAG,CAChB,gBAAkC,EAClC,QAAqC,EACpC,EAAE;YACH,OAAO,CACN,gBAAgB,CAAC,EAAE,KAAK,QAAQ,CAAC,SAAS;gBAC1C,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAC7B,CAAC;QACH,CAAC,CAAC;QAEF,QAAgB,GAAG,KAAK,EACvB,gBAAkC,EAClC,OAAsB,EACrB,EAAE;YACH,IAAI,YAAY,GAAG,KAAK,CAAC;YACzB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,IAAI,CAAC,OAAO,CAAC,CAAC;YAEjD,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE;gBACxC,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;oBACpD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;oBAC9B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;iBAC3C;qBAAM;oBACN,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACpC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;oBACpD,YAAY,GAAG,IAAI,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;iBAChE;aACD;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE;gBACxC,6DAA6D;gBAC7D,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,UAAU,CAAC,KAAK,EAAE,CAAC;gBAEnB,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;oBAClE,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,EAAE;wBAC5C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;wBACtB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;qBACnC;yBAAM;wBACN,YAAY,GAAG,IAAI,CAAC;wBACpB,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACnB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;wBAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;qBACvC;iBACD;aACD;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE;gBAC/C,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACjD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnC,YAAY,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;aACpD;YACD,IAAI,YAAY,EAAE;gBACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aACvC;QACF,CAAC,CAAC;QAEF,WAAM,GAAG,KAAK,EAAE,QAA2B,EAAE,EAAE;YAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;gBACxB,KAAK,EAAE,CAAC,QAAQ,CAAC;aACjB,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,yBAAoB,GAAG,CAAC,eAAoC,EAAE,EAAE;YAC/D,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBACvD,uCAAY,GAAG,GAAK,MAAM,EAAG;YAC9B,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,CAAC,CAAC;QAxFD,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC;QAEnC,IAAI,CAAC,cAAc,GAAG,IAAI,gBAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YAC3C,GAAG,EAAE,EAAE;YACP,OAAO,EAAE,kBAAkB;YAC3B,KAAK,EAAE,EAAE;YACT,GAAG,EAAE,SAAS;SACd,CAAC,CAAC;IACJ,CAAC;CA+ED;AArID,0CAqIC;KA1DC,sBAAc"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ClientMessage, EventSubscriber } from '@verdant-web/common';
|
|
2
|
+
import { Metadata } from '../metadata/Metadata.js';
|
|
3
|
+
import { PresenceManager } from './PresenceManager.js';
|
|
4
|
+
import { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';
|
|
5
|
+
import { SyncTransport, SyncTransportEvents } from './Sync.js';
|
|
6
|
+
export declare class PushPullSync extends EventSubscriber<SyncTransportEvents> implements SyncTransport {
|
|
7
|
+
readonly meta: Metadata;
|
|
8
|
+
readonly presence: PresenceManager;
|
|
9
|
+
private endpointProvider;
|
|
10
|
+
private heartbeat;
|
|
11
|
+
readonly mode = "pull";
|
|
12
|
+
private log;
|
|
13
|
+
private _isConnected;
|
|
14
|
+
private _status;
|
|
15
|
+
private _hasSynced;
|
|
16
|
+
constructor({ endpointProvider, meta, presence, interval, log, }: {
|
|
17
|
+
endpointProvider: ServerSyncEndpointProvider;
|
|
18
|
+
meta: Metadata;
|
|
19
|
+
presence: PresenceManager;
|
|
20
|
+
interval?: number;
|
|
21
|
+
log?: (...args: any[]) => any;
|
|
22
|
+
});
|
|
23
|
+
setInterval: (interval: number) => void;
|
|
24
|
+
get interval(): number;
|
|
25
|
+
private sendRequest;
|
|
26
|
+
private handleServerMessage;
|
|
27
|
+
send: (message: ClientMessage) => Promise<void> | undefined;
|
|
28
|
+
start(): void;
|
|
29
|
+
stop(): void;
|
|
30
|
+
dispose: () => void;
|
|
31
|
+
reconnect(): void;
|
|
32
|
+
private onHeartbeat;
|
|
33
|
+
private onHeartbeatMissed;
|
|
34
|
+
get isConnected(): boolean;
|
|
35
|
+
get status(): "active" | "paused";
|
|
36
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PushPullSync = void 0;
|
|
4
|
+
const common_1 = require("@verdant-web/common");
|
|
5
|
+
const Heartbeat_js_1 = require("./Heartbeat.js");
|
|
6
|
+
class PushPullSync extends common_1.EventSubscriber {
|
|
7
|
+
constructor({ endpointProvider, meta, presence, interval = 15 * 1000, log = () => { }, }) {
|
|
8
|
+
super();
|
|
9
|
+
this.mode = 'pull';
|
|
10
|
+
this._isConnected = false;
|
|
11
|
+
this._status = 'paused';
|
|
12
|
+
this._hasSynced = false;
|
|
13
|
+
this.setInterval = (interval) => {
|
|
14
|
+
this.heartbeat.setInterval(interval);
|
|
15
|
+
};
|
|
16
|
+
this.sendRequest = async (messages) => {
|
|
17
|
+
this.log('Sending sync request', messages);
|
|
18
|
+
try {
|
|
19
|
+
const { http: host, token } = await this.endpointProvider.getEndpoints();
|
|
20
|
+
const response = await fetch(host, {
|
|
21
|
+
method: 'POST',
|
|
22
|
+
headers: {
|
|
23
|
+
'Content-Type': 'application/json',
|
|
24
|
+
Authorization: `Bearer ${token}`,
|
|
25
|
+
},
|
|
26
|
+
body: JSON.stringify({
|
|
27
|
+
messages,
|
|
28
|
+
}),
|
|
29
|
+
credentials: 'include',
|
|
30
|
+
});
|
|
31
|
+
if (response.ok) {
|
|
32
|
+
this.heartbeat.keepAlive();
|
|
33
|
+
const json = (await response.json());
|
|
34
|
+
for (const message of json.messages) {
|
|
35
|
+
this.handleServerMessage(message);
|
|
36
|
+
}
|
|
37
|
+
if (!this._isConnected) {
|
|
38
|
+
this._isConnected = true;
|
|
39
|
+
this.emit('onlineChange', true);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.log('Sync request failed', response.status, await response.text());
|
|
44
|
+
if (this._isConnected) {
|
|
45
|
+
this._isConnected = false;
|
|
46
|
+
this.emit('onlineChange', false);
|
|
47
|
+
}
|
|
48
|
+
// only keep trying if the error was not 4xx
|
|
49
|
+
if (response.status >= 500) {
|
|
50
|
+
this.heartbeat.keepAlive();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (this._isConnected) {
|
|
56
|
+
this._isConnected = false;
|
|
57
|
+
this.emit('onlineChange', false);
|
|
58
|
+
}
|
|
59
|
+
this.log(error);
|
|
60
|
+
this.heartbeat.keepAlive();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
this.handleServerMessage = async (message) => {
|
|
64
|
+
if (message.type === 'sync-resp') {
|
|
65
|
+
if (message.ackThisNonce) {
|
|
66
|
+
// we need to ack the nonce to confirm that we received the sync-resp
|
|
67
|
+
this.log('Sending sync ack', message.ackThisNonce);
|
|
68
|
+
this.sendRequest([
|
|
69
|
+
await this.meta.messageCreator.createAck(message.ackThisNonce),
|
|
70
|
+
]);
|
|
71
|
+
}
|
|
72
|
+
// but we can go ahead and preemptively allow ops to be sent
|
|
73
|
+
this._hasSynced = true;
|
|
74
|
+
}
|
|
75
|
+
this.emit('message', message);
|
|
76
|
+
};
|
|
77
|
+
this.send = (message) => {
|
|
78
|
+
// only certain messages are sent for pull-based sync.
|
|
79
|
+
switch (message.type) {
|
|
80
|
+
case 'presence-update':
|
|
81
|
+
case 'sync':
|
|
82
|
+
case 'heartbeat':
|
|
83
|
+
return this.sendRequest([message]);
|
|
84
|
+
case 'op':
|
|
85
|
+
if (this._hasSynced) {
|
|
86
|
+
return this.sendRequest([message]);
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
this.dispose = () => { };
|
|
92
|
+
// on a heartbeat, do a sync
|
|
93
|
+
this.onHeartbeat = async () => {
|
|
94
|
+
// for HTTP sync we send presence first, so that the sync-resp message
|
|
95
|
+
// will include the client's own presence info and fill in missing profile
|
|
96
|
+
// data on the first request. otherwise it would have to wait for the second.
|
|
97
|
+
this.sendRequest([
|
|
98
|
+
await this.meta.messageCreator.createPresenceUpdate(this.presence.self.presence),
|
|
99
|
+
await this.meta.messageCreator.createSyncStep1(),
|
|
100
|
+
]);
|
|
101
|
+
};
|
|
102
|
+
// if the server fails to respond in a certain amount of time, we assume
|
|
103
|
+
// the connection is lost and go offline.
|
|
104
|
+
this.onHeartbeatMissed = async () => {
|
|
105
|
+
this.emit('onlineChange', false);
|
|
106
|
+
this.log('Missed heartbeat');
|
|
107
|
+
this._isConnected = false;
|
|
108
|
+
};
|
|
109
|
+
this.log = log;
|
|
110
|
+
this.meta = meta;
|
|
111
|
+
this.presence = presence;
|
|
112
|
+
this.endpointProvider = endpointProvider;
|
|
113
|
+
this.heartbeat = new Heartbeat_js_1.Heartbeat({
|
|
114
|
+
interval,
|
|
115
|
+
});
|
|
116
|
+
this.heartbeat.subscribe('beat', this.onHeartbeat);
|
|
117
|
+
this.heartbeat.subscribe('missed', this.onHeartbeatMissed);
|
|
118
|
+
}
|
|
119
|
+
get interval() {
|
|
120
|
+
return this.heartbeat.interval;
|
|
121
|
+
}
|
|
122
|
+
start() {
|
|
123
|
+
if (this.status === 'active') {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this.heartbeat.start(true);
|
|
127
|
+
this._status = 'active';
|
|
128
|
+
}
|
|
129
|
+
stop() {
|
|
130
|
+
this.heartbeat.stop();
|
|
131
|
+
this._status = 'paused';
|
|
132
|
+
}
|
|
133
|
+
reconnect() { }
|
|
134
|
+
get isConnected() {
|
|
135
|
+
return this._isConnected;
|
|
136
|
+
}
|
|
137
|
+
get status() {
|
|
138
|
+
return this._status;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.PushPullSync = PushPullSync;
|
|
142
|
+
//# sourceMappingURL=PushPullSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PushPullSync.js","sourceRoot":"","sources":["../../../src/sync/PushPullSync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ReplicaType } from '@verdant-web/common';
|
|
2
|
+
export interface ServerSyncEndpointProviderConfig {
|
|
3
|
+
/**
|
|
4
|
+
* The location of the endpoint used to retrieve an
|
|
5
|
+
* authorization token for the client.
|
|
6
|
+
*/
|
|
7
|
+
authEndpoint?: string;
|
|
8
|
+
/**
|
|
9
|
+
* A custom fetch function to retrieve authorization
|
|
10
|
+
* data.
|
|
11
|
+
*/
|
|
12
|
+
fetchAuth?: () => Promise<{
|
|
13
|
+
accessToken: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export declare class ServerSyncEndpointProvider {
|
|
17
|
+
private config;
|
|
18
|
+
private cached;
|
|
19
|
+
type: ReplicaType;
|
|
20
|
+
constructor(config: ServerSyncEndpointProviderConfig);
|
|
21
|
+
getEndpoints: () => Promise<{
|
|
22
|
+
http: string;
|
|
23
|
+
websocket: string;
|
|
24
|
+
files: string;
|
|
25
|
+
token: string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ServerSyncEndpointProvider = void 0;
|
|
7
|
+
const common_1 = require("@verdant-web/common");
|
|
8
|
+
const jwt_decode_1 = __importDefault(require("jwt-decode"));
|
|
9
|
+
class ServerSyncEndpointProvider {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.cached = null;
|
|
13
|
+
this.type = common_1.ReplicaType.Realtime;
|
|
14
|
+
this.getEndpoints = async () => {
|
|
15
|
+
if (this.cached) {
|
|
16
|
+
return this.cached;
|
|
17
|
+
}
|
|
18
|
+
let result;
|
|
19
|
+
if (this.config.fetchAuth) {
|
|
20
|
+
result = await this.config.fetchAuth();
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
result = await fetch(this.config.authEndpoint, {
|
|
24
|
+
credentials: 'include',
|
|
25
|
+
}).then((res) => {
|
|
26
|
+
if (!res.ok) {
|
|
27
|
+
throw new Error(`Auth endpoint returned non-200 response: ${res.status}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
return res.json();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
(0, common_1.assert)(result.accessToken, 'No access token provided from auth endpoint');
|
|
35
|
+
const decoded = jwt_decode_1.default(result.accessToken);
|
|
36
|
+
(0, common_1.assert)(decoded.url, 'No sync endpoint provided from auth endpoint');
|
|
37
|
+
(0, common_1.assert)(decoded.type !== undefined, 'No replica type provided from auth endpoint');
|
|
38
|
+
this.type = parseInt(decoded.type + '');
|
|
39
|
+
const url = new URL(decoded.url);
|
|
40
|
+
url.protocol = url.protocol.replace('ws', 'http');
|
|
41
|
+
const httpEndpoint = url.toString();
|
|
42
|
+
url.protocol = url.protocol.replace('http', 'ws');
|
|
43
|
+
const websocketEndpoint = url.toString();
|
|
44
|
+
let fileEndpoint = decoded.file;
|
|
45
|
+
if (!fileEndpoint) {
|
|
46
|
+
// default to http endpoint + '/files';
|
|
47
|
+
const fileUrl = new URL(httpEndpoint);
|
|
48
|
+
fileUrl.pathname = fileUrl.pathname + '/files';
|
|
49
|
+
fileEndpoint = fileUrl.toString();
|
|
50
|
+
}
|
|
51
|
+
this.cached = {
|
|
52
|
+
http: httpEndpoint,
|
|
53
|
+
websocket: websocketEndpoint,
|
|
54
|
+
files: fileEndpoint,
|
|
55
|
+
token: result.accessToken,
|
|
56
|
+
};
|
|
57
|
+
return this.cached;
|
|
58
|
+
};
|
|
59
|
+
if (!config.authEndpoint && !config.fetchAuth) {
|
|
60
|
+
throw new Error('Either authEndpoint or fetchAuth must be provided to ServerSyncEndpointProvider');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.ServerSyncEndpointProvider = ServerSyncEndpointProvider;
|
|
65
|
+
//# sourceMappingURL=ServerSyncEndpointProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerSyncEndpointProvider.js","sourceRoot":"","sources":["../../../src/sync/ServerSyncEndpointProvider.ts"],"names":[],"mappings":";;;;;;AAAA,gDAA0D;AAC1D,4DAAkD;AAiBlD,MAAa,0BAA0B;IAStC,YAAoB,MAAwC;QAAxC,WAAM,GAAN,MAAM,CAAkC;QARpD,WAAM,GAAG,IAKT,CAAC;QACT,SAAI,GAAgB,oBAAW,CAAC,QAAQ,CAAC;QAUzC,iBAAY,GAAG,KAAK,IAAI,EAAE;YACzB,IAAI,IAAI,CAAC,MAAM,EAAE;gBAChB,OAAO,IAAI,CAAC,MAAM,CAAC;aACnB;YAED,IAAI,MAA+B,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBAC1B,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;aACvC;iBAAM;gBACN,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAa,EAAE;oBAC/C,WAAW,EAAE,SAAS;iBACtB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;oBACf,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;wBACZ,MAAM,IAAI,KAAK,CACd,4CAA4C,GAAG,CAAC,MAAM,EAAE,CACxD,CAAC;qBACF;yBAAM;wBACN,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;qBAClB;gBACF,CAAC,CAAC,CAAC;aACH;YACD,IAAA,eAAM,EAAC,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAI,oBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACvD,IAAA,eAAM,EAAC,OAAO,CAAC,GAAG,EAAE,8CAA8C,CAAC,CAAC;YACpE,IAAA,eAAM,EACL,OAAO,CAAC,IAAI,KAAK,SAAS,EAC1B,6CAA6C,CAC7C,CAAC;YACF,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YACpC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAClD,MAAM,iBAAiB,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,YAAY,GAAW,OAAO,CAAC,IAAI,CAAC;YACxC,IAAI,CAAC,YAAY,EAAE;gBAClB,uCAAuC;gBACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;gBACtC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC/C,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;aAClC;YACD,IAAI,CAAC,MAAM,GAAG;gBACb,IAAI,EAAE,YAAY;gBAClB,SAAS,EAAE,iBAAiB;gBAC5B,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,MAAM,CAAC,WAAW;aACzB,CAAC;YACF,OAAO,IAAI,CAAC,MAAM,CAAC;QACpB,CAAC,CAAC;QAvDD,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YAC9C,MAAM,IAAI,KAAK,CACd,iFAAiF,CACjF,CAAC;SACF;IACF,CAAC;CAmDD;AAlED,gEAkEC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { ClientMessage, DocumentBaseline, EventSubscriber, FileData, Operation, ServerMessage } from '@verdant-web/common';
|
|
2
|
+
import { Metadata } from '../metadata/Metadata.js';
|
|
3
|
+
import { PresenceManager } from './PresenceManager.js';
|
|
4
|
+
import { FilePullResult, FileUploadResult } from './FileSync.js';
|
|
5
|
+
import { ServerSyncEndpointProviderConfig } from './ServerSyncEndpointProvider.js';
|
|
6
|
+
type SyncEvents = {
|
|
7
|
+
onlineChange: (isOnline: boolean) => void;
|
|
8
|
+
};
|
|
9
|
+
export type SyncTransportEvents = SyncEvents & {
|
|
10
|
+
message: (message: ServerMessage) => void;
|
|
11
|
+
};
|
|
12
|
+
export interface SyncTransport {
|
|
13
|
+
subscribe(event: 'onlineChange', handler: (online: boolean) => void): () => void;
|
|
14
|
+
readonly presence: PresenceManager;
|
|
15
|
+
readonly mode: SyncTransportMode;
|
|
16
|
+
send(message: ClientMessage): void;
|
|
17
|
+
start(): void;
|
|
18
|
+
stop(): void;
|
|
19
|
+
dispose(): void;
|
|
20
|
+
reconnect(): void;
|
|
21
|
+
readonly isConnected: boolean;
|
|
22
|
+
readonly status: 'active' | 'paused';
|
|
23
|
+
}
|
|
24
|
+
export interface Sync extends SyncTransport {
|
|
25
|
+
setMode(mode: SyncTransportMode): void;
|
|
26
|
+
setPullInterval(interval: number): void;
|
|
27
|
+
readonly pullInterval: number;
|
|
28
|
+
uploadFile(data: FileData): Promise<FileUploadResult>;
|
|
29
|
+
getFile(fileId: string): Promise<FilePullResult>;
|
|
30
|
+
}
|
|
31
|
+
export declare class NoSync extends EventSubscriber<SyncEvents> implements Sync {
|
|
32
|
+
readonly mode = "pull";
|
|
33
|
+
send(): void;
|
|
34
|
+
start(): void;
|
|
35
|
+
stop(): void;
|
|
36
|
+
dispose: () => void;
|
|
37
|
+
reconnect(): void;
|
|
38
|
+
setMode(): void;
|
|
39
|
+
setPullInterval(): void;
|
|
40
|
+
readonly isConnected = false;
|
|
41
|
+
readonly status = "paused";
|
|
42
|
+
readonly pullInterval = 0;
|
|
43
|
+
readonly presence: PresenceManager<{}, {}>;
|
|
44
|
+
uploadFile: () => Promise<{
|
|
45
|
+
success: boolean;
|
|
46
|
+
retry: boolean;
|
|
47
|
+
}>;
|
|
48
|
+
getFile: () => Promise<FilePullResult>;
|
|
49
|
+
}
|
|
50
|
+
export type SyncTransportMode = 'realtime' | 'pull';
|
|
51
|
+
export interface ServerSyncOptions<Profile = any, Presence = any> extends ServerSyncEndpointProviderConfig {
|
|
52
|
+
/**
|
|
53
|
+
* When a client first connects, it will use this presence value.
|
|
54
|
+
*/
|
|
55
|
+
initialPresence: Presence;
|
|
56
|
+
/**
|
|
57
|
+
* Before connecting to the server, the local client will have
|
|
58
|
+
* this value for their profile data. You can either cache and store
|
|
59
|
+
* profile data from a previous connection or provide defaults like
|
|
60
|
+
* empty strings.
|
|
61
|
+
*/
|
|
62
|
+
defaultProfile: Profile;
|
|
63
|
+
/**
|
|
64
|
+
* Provide `false` to disable transport selection. Transport selection
|
|
65
|
+
* automatically switches between HTTP and WebSocket based sync depending
|
|
66
|
+
* on the number of peers connected. If a user is alone, they will use
|
|
67
|
+
* HTTP push/pull to sync changes. If another user joins, both users will
|
|
68
|
+
* be upgraded to websockets.
|
|
69
|
+
*
|
|
70
|
+
* Turning off this feature allows you more control over the transport
|
|
71
|
+
* which can be useful for low-power devices or to save server traffic.
|
|
72
|
+
* To modify transport modes manually, utilize `client.sync.setMode`.
|
|
73
|
+
* The built-in behavior is essentially switching modes based on
|
|
74
|
+
* the number of peers detected by client.sync.presence.
|
|
75
|
+
*/
|
|
76
|
+
automaticTransportSelection?: boolean;
|
|
77
|
+
initialTransport?: SyncTransportMode;
|
|
78
|
+
autoStart?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Optionally specify an interval, in milliseconds, to poll the server
|
|
81
|
+
* when in pull mode.
|
|
82
|
+
*/
|
|
83
|
+
pullInterval?: number;
|
|
84
|
+
/**
|
|
85
|
+
* Presence updates are batched to reduce number of requests / messages
|
|
86
|
+
* sent to the server. You can specify the batching time slice, in milliseconds,
|
|
87
|
+
*/
|
|
88
|
+
presenceUpdateBatchTimeout?: number;
|
|
89
|
+
}
|
|
90
|
+
export declare class ServerSync<Profile = any, Presence = any> extends EventSubscriber<SyncEvents> implements Sync {
|
|
91
|
+
private webSocketSync;
|
|
92
|
+
private pushPullSync;
|
|
93
|
+
private fileSync;
|
|
94
|
+
private activeSync;
|
|
95
|
+
private endpointProvider;
|
|
96
|
+
private onData;
|
|
97
|
+
private meta;
|
|
98
|
+
readonly presence: PresenceManager<Profile, Presence>;
|
|
99
|
+
private log;
|
|
100
|
+
constructor({ authEndpoint, fetchAuth, initialPresence, automaticTransportSelection, autoStart, initialTransport, pullInterval, presenceUpdateBatchTimeout, defaultProfile, }: ServerSyncOptions<Profile, Presence>, { meta, log, onData, }: {
|
|
101
|
+
meta: Metadata;
|
|
102
|
+
log?: (...args: any[]) => void;
|
|
103
|
+
onData: (data: {
|
|
104
|
+
operations: Operation[];
|
|
105
|
+
baselines: DocumentBaseline[];
|
|
106
|
+
reset?: boolean;
|
|
107
|
+
}) => Promise<void>;
|
|
108
|
+
});
|
|
109
|
+
get canDoRealtime(): boolean;
|
|
110
|
+
private handleMessage;
|
|
111
|
+
private handleOnlineChange;
|
|
112
|
+
private handlePresenceUpdate;
|
|
113
|
+
setMode: (transport: SyncTransportMode) => void;
|
|
114
|
+
setPullInterval: (interval: number) => void;
|
|
115
|
+
get pullInterval(): number;
|
|
116
|
+
send: (message: ClientMessage) => void;
|
|
117
|
+
uploadFile: (info: FileData) => Promise<FileUploadResult>;
|
|
118
|
+
getFile: (id: string) => Promise<FilePullResult>;
|
|
119
|
+
start: () => void;
|
|
120
|
+
stop: () => void;
|
|
121
|
+
dispose: () => void;
|
|
122
|
+
reconnect: () => void;
|
|
123
|
+
get isConnected(): boolean;
|
|
124
|
+
get status(): "active" | "paused";
|
|
125
|
+
get mode(): SyncTransportMode;
|
|
126
|
+
}
|
|
127
|
+
export {};
|