@powerhousedao/reactor 6.0.0-dev.4 → 6.0.0-dev.40
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/dist/src/cache/collection-membership-cache.d.ts +13 -0
- package/dist/src/cache/collection-membership-cache.d.ts.map +1 -0
- package/dist/src/cache/collection-membership-cache.js +33 -0
- package/dist/src/cache/collection-membership-cache.js.map +1 -0
- package/dist/src/cache/document-meta-cache.d.ts.map +1 -1
- package/dist/src/cache/document-meta-cache.js +4 -4
- package/dist/src/cache/document-meta-cache.js.map +1 -1
- package/dist/src/cache/kysely-operation-index.d.ts +5 -1
- package/dist/src/cache/kysely-operation-index.d.ts.map +1 -1
- package/dist/src/cache/kysely-operation-index.js +96 -6
- package/dist/src/cache/kysely-operation-index.js.map +1 -1
- package/dist/src/cache/kysely-write-cache.d.ts.map +1 -1
- package/dist/src/cache/kysely-write-cache.js +11 -11
- package/dist/src/cache/kysely-write-cache.js.map +1 -1
- package/dist/src/cache/operation-index-types.d.ts +13 -1
- package/dist/src/cache/operation-index-types.d.ts.map +1 -1
- package/dist/src/cache/operation-index-types.js.map +1 -1
- package/dist/src/client/reactor-client.d.ts +13 -10
- package/dist/src/client/reactor-client.d.ts.map +1 -1
- package/dist/src/client/reactor-client.js +133 -42
- package/dist/src/client/reactor-client.js.map +1 -1
- package/dist/src/client/types.d.ts +25 -6
- package/dist/src/client/types.d.ts.map +1 -1
- package/dist/src/client/types.js.map +1 -1
- package/dist/src/core/reactor-builder.d.ts +11 -7
- package/dist/src/core/reactor-builder.d.ts.map +1 -1
- package/dist/src/core/reactor-builder.js +61 -22
- package/dist/src/core/reactor-builder.js.map +1 -1
- package/dist/src/core/reactor-client-builder.d.ts +5 -4
- package/dist/src/core/reactor-client-builder.d.ts.map +1 -1
- package/dist/src/core/reactor-client-builder.js +14 -5
- package/dist/src/core/reactor-client-builder.js.map +1 -1
- package/dist/src/core/reactor.d.ts +20 -80
- package/dist/src/core/reactor.d.ts.map +1 -1
- package/dist/src/core/reactor.js +234 -575
- package/dist/src/core/reactor.js.map +1 -1
- package/dist/src/core/types.d.ts +63 -28
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/utils.d.ts +37 -2
- package/dist/src/core/utils.d.ts.map +1 -1
- package/dist/src/core/utils.js +57 -8
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/events/types.d.ts +35 -10
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +7 -5
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/executor/document-action-handler.d.ts +37 -0
- package/dist/src/executor/document-action-handler.d.ts.map +1 -0
- package/dist/src/executor/document-action-handler.js +349 -0
- package/dist/src/executor/document-action-handler.js.map +1 -0
- package/dist/src/executor/signature-verifier.d.ts +9 -0
- package/dist/src/executor/signature-verifier.d.ts.map +1 -0
- package/dist/src/executor/signature-verifier.js +70 -0
- package/dist/src/executor/signature-verifier.js.map +1 -0
- package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -1
- package/dist/src/executor/simple-job-executor-manager.js +20 -10
- package/dist/src/executor/simple-job-executor-manager.js.map +1 -1
- package/dist/src/executor/simple-job-executor.d.ts +6 -46
- package/dist/src/executor/simple-job-executor.d.ts.map +1 -1
- package/dist/src/executor/simple-job-executor.js +64 -565
- package/dist/src/executor/simple-job-executor.js.map +1 -1
- package/dist/src/executor/types.d.ts +0 -2
- package/dist/src/executor/types.d.ts.map +1 -1
- package/dist/src/executor/types.js.map +1 -1
- package/dist/src/executor/util.d.ts +11 -1
- package/dist/src/executor/util.d.ts.map +1 -1
- package/dist/src/executor/util.js +47 -1
- package/dist/src/executor/util.js.map +1 -1
- package/dist/src/index.d.ts +10 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/job-tracker/in-memory-job-tracker.d.ts +4 -3
- package/dist/src/job-tracker/in-memory-job-tracker.d.ts.map +1 -1
- package/dist/src/job-tracker/in-memory-job-tracker.js +20 -18
- package/dist/src/job-tracker/in-memory-job-tracker.js.map +1 -1
- package/dist/src/job-tracker/interfaces.d.ts +3 -1
- package/dist/src/job-tracker/interfaces.d.ts.map +1 -1
- package/dist/src/logging/console.d.ts +1 -22
- package/dist/src/logging/console.d.ts.map +1 -1
- package/dist/src/logging/console.js +1 -107
- package/dist/src/logging/console.js.map +1 -1
- package/dist/src/logging/types.d.ts +1 -11
- package/dist/src/logging/types.d.ts.map +1 -1
- package/dist/src/processors/index.d.ts.map +1 -1
- package/dist/src/processors/relational/relational-db-processor.d.ts +47 -0
- package/dist/src/processors/relational/relational-db-processor.d.ts.map +1 -0
- package/dist/src/processors/relational/relational-db-processor.js +45 -0
- package/dist/src/processors/relational/relational-db-processor.js.map +1 -0
- package/dist/src/processors/relational/types.d.ts +27 -0
- package/dist/src/processors/relational/types.d.ts.map +1 -0
- package/dist/src/processors/relational/types.js +2 -0
- package/dist/src/processors/relational/types.js.map +1 -0
- package/dist/src/processors/relational/utils.d.ts +29 -0
- package/dist/src/processors/relational/utils.d.ts.map +1 -0
- package/dist/src/processors/relational/utils.js +67 -0
- package/dist/src/processors/relational/utils.js.map +1 -0
- package/dist/src/processors/types.d.ts +10 -2
- package/dist/src/processors/types.d.ts.map +1 -1
- package/dist/src/processors/utils.d.ts.map +1 -1
- package/dist/src/processors/utils.js +2 -1
- package/dist/src/processors/utils.js.map +1 -1
- package/dist/src/queue/queue.d.ts +25 -0
- package/dist/src/queue/queue.d.ts.map +1 -1
- package/dist/src/queue/queue.js +56 -0
- package/dist/src/queue/queue.js.map +1 -1
- package/dist/src/queue/types.d.ts +3 -3
- package/dist/src/queue/types.d.ts.map +1 -1
- package/dist/src/read-models/base-read-model.js +4 -4
- package/dist/src/read-models/base-read-model.js.map +1 -1
- package/dist/src/read-models/coordinator.d.ts +2 -2
- package/dist/src/read-models/coordinator.d.ts.map +1 -1
- package/dist/src/read-models/coordinator.js +8 -8
- package/dist/src/read-models/coordinator.js.map +1 -1
- package/dist/src/read-models/document-view.d.ts +5 -2
- package/dist/src/read-models/document-view.d.ts.map +1 -1
- package/dist/src/read-models/document-view.js +130 -48
- package/dist/src/read-models/document-view.js.map +1 -1
- package/dist/src/shared/awaiter.d.ts +2 -2
- package/dist/src/shared/awaiter.d.ts.map +1 -1
- package/dist/src/shared/awaiter.js +11 -11
- package/dist/src/shared/awaiter.js.map +1 -1
- package/dist/src/shared/collect-all-pages.d.ts +7 -0
- package/dist/src/shared/collect-all-pages.d.ts.map +1 -0
- package/dist/src/shared/collect-all-pages.js +17 -0
- package/dist/src/shared/collect-all-pages.js.map +1 -0
- package/dist/src/shared/drive-url.d.ts +15 -0
- package/dist/src/shared/drive-url.d.ts.map +1 -0
- package/dist/src/shared/drive-url.js +17 -0
- package/dist/src/shared/drive-url.js.map +1 -0
- package/dist/src/shared/factories.d.ts +6 -2
- package/dist/src/shared/factories.d.ts.map +1 -1
- package/dist/src/shared/factories.js +10 -2
- package/dist/src/shared/factories.js.map +1 -1
- package/dist/src/shared/types.d.ts +32 -6
- package/dist/src/shared/types.d.ts.map +1 -1
- package/dist/src/shared/types.js +4 -4
- package/dist/src/shared/types.js.map +1 -1
- package/dist/src/signer/passthrough-signer.d.ts +1 -1
- package/dist/src/signer/passthrough-signer.d.ts.map +1 -1
- package/dist/src/signer/passthrough-signer.js +1 -3
- package/dist/src/signer/passthrough-signer.js.map +1 -1
- package/dist/src/storage/interfaces.d.ts +52 -94
- package/dist/src/storage/interfaces.d.ts.map +1 -1
- package/dist/src/storage/interfaces.js.map +1 -1
- package/dist/src/storage/kysely/document-indexer.d.ts +6 -6
- package/dist/src/storage/kysely/document-indexer.d.ts.map +1 -1
- package/dist/src/storage/kysely/document-indexer.js +123 -52
- package/dist/src/storage/kysely/document-indexer.js.map +1 -1
- package/dist/src/storage/kysely/store.d.ts +4 -3
- package/dist/src/storage/kysely/store.d.ts.map +1 -1
- package/dist/src/storage/kysely/store.js +52 -21
- package/dist/src/storage/kysely/store.js.map +1 -1
- package/dist/src/storage/kysely/sync-remote-storage.js +1 -1
- package/dist/src/storage/kysely/sync-remote-storage.js.map +1 -1
- package/dist/src/subs/subscription-notification-read-model.d.ts +1 -1
- package/dist/src/subs/subscription-notification-read-model.js +1 -1
- package/dist/src/sync/buffered-mailbox.d.ts +30 -0
- package/dist/src/sync/buffered-mailbox.d.ts.map +1 -0
- package/dist/src/sync/buffered-mailbox.js +136 -0
- package/dist/src/sync/buffered-mailbox.js.map +1 -0
- package/dist/src/sync/channels/composite-channel-factory.d.ts +9 -3
- package/dist/src/sync/channels/composite-channel-factory.d.ts.map +1 -1
- package/dist/src/sync/channels/composite-channel-factory.js +16 -12
- package/dist/src/sync/channels/composite-channel-factory.js.map +1 -1
- package/dist/src/sync/channels/gql-channel-factory.d.ts +9 -3
- package/dist/src/sync/channels/gql-channel-factory.d.ts.map +1 -1
- package/dist/src/sync/channels/gql-channel-factory.js +14 -10
- package/dist/src/sync/channels/gql-channel-factory.js.map +1 -1
- package/dist/src/sync/channels/gql-channel.d.ts +22 -18
- package/dist/src/sync/channels/gql-channel.d.ts.map +1 -1
- package/dist/src/sync/channels/gql-channel.js +128 -64
- package/dist/src/sync/channels/gql-channel.js.map +1 -1
- package/dist/src/sync/channels/index.d.ts +2 -0
- package/dist/src/sync/channels/index.d.ts.map +1 -1
- package/dist/src/sync/channels/index.js +2 -0
- package/dist/src/sync/channels/index.js.map +1 -1
- package/dist/src/sync/channels/interval-poll-timer.d.ts +24 -0
- package/dist/src/sync/channels/interval-poll-timer.d.ts.map +1 -0
- package/dist/src/sync/channels/interval-poll-timer.js +69 -0
- package/dist/src/sync/channels/interval-poll-timer.js.map +1 -0
- package/dist/src/sync/channels/poll-timer.d.ts +14 -0
- package/dist/src/sync/channels/poll-timer.d.ts.map +1 -0
- package/dist/src/sync/channels/poll-timer.js +2 -0
- package/dist/src/sync/channels/poll-timer.js.map +1 -0
- package/dist/src/sync/channels/utils.d.ts.map +1 -1
- package/dist/src/sync/channels/utils.js +2 -2
- package/dist/src/sync/channels/utils.js.map +1 -1
- package/dist/src/sync/index.d.ts +6 -4
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +4 -3
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/interfaces.d.ts +18 -6
- package/dist/src/sync/interfaces.d.ts.map +1 -1
- package/dist/src/sync/mailbox.d.ts +21 -3
- package/dist/src/sync/mailbox.d.ts.map +1 -1
- package/dist/src/sync/mailbox.js +55 -2
- package/dist/src/sync/mailbox.js.map +1 -1
- package/dist/src/sync/sync-awaiter.d.ts +34 -0
- package/dist/src/sync/sync-awaiter.d.ts.map +1 -0
- package/dist/src/sync/sync-awaiter.js +124 -0
- package/dist/src/sync/sync-awaiter.js.map +1 -0
- package/dist/src/sync/sync-manager.d.ts +19 -5
- package/dist/src/sync/sync-manager.d.ts.map +1 -1
- package/dist/src/sync/sync-manager.js +318 -33
- package/dist/src/sync/sync-manager.js.map +1 -1
- package/dist/src/sync/sync-operation.d.ts +3 -1
- package/dist/src/sync/sync-operation.d.ts.map +1 -1
- package/dist/src/sync/sync-operation.js +5 -1
- package/dist/src/sync/sync-operation.js.map +1 -1
- package/dist/src/sync/types.d.ts +73 -1
- package/dist/src/sync/types.d.ts.map +1 -1
- package/dist/src/sync/types.js +10 -0
- package/dist/src/sync/types.js.map +1 -1
- package/dist/src/sync/utils.d.ts +11 -0
- package/dist/src/sync/utils.d.ts.map +1 -1
- package/dist/src/sync/utils.js +17 -0
- package/dist/src/sync/utils.js.map +1 -1
- package/dist/src/utils/reshuffle.d.ts +15 -5
- package/dist/src/utils/reshuffle.d.ts.map +1 -1
- package/dist/src/utils/reshuffle.js +29 -6
- package/dist/src/utils/reshuffle.js.map +1 -1
- package/package.json +8 -10
- package/dist/src/storage/consistency-aware-legacy-storage.d.ts +0 -33
- package/dist/src/storage/consistency-aware-legacy-storage.d.ts.map +0 -1
- package/dist/src/storage/consistency-aware-legacy-storage.js +0 -65
- package/dist/src/storage/consistency-aware-legacy-storage.js.map +0 -1
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { IOperationIndex } from "../cache/operation-index-types.js";
|
|
1
2
|
import type { ShutdownStatus } from "../shared/types.js";
|
|
2
3
|
import type { ISyncCursorStorage } from "../storage/interfaces.js";
|
|
3
4
|
import type { SyncOperation } from "./sync-operation.js";
|
|
4
|
-
import type {
|
|
5
|
-
import type { ChannelConfig, RemoteFilter, RemoteOptions } from "./types.js";
|
|
5
|
+
import type { IMailbox } from "./mailbox.js";
|
|
6
|
+
import type { ChannelConfig, RemoteFilter, RemoteOptions, SyncResult } from "./types.js";
|
|
6
7
|
/**
|
|
7
8
|
* Represents a bidirectional synchronization channel between two reactor instances.
|
|
8
9
|
*
|
|
@@ -22,17 +23,17 @@ export interface IChannel {
|
|
|
22
23
|
* Mailbox containing sync operations received from the remote that need to be applied locally.
|
|
23
24
|
* Consumers should register callbacks via onAdded to process incoming sync operations.
|
|
24
25
|
*/
|
|
25
|
-
inbox:
|
|
26
|
+
inbox: IMailbox<SyncOperation>;
|
|
26
27
|
/**
|
|
27
28
|
* Mailbox containing sync operations that need to be sent to the remote.
|
|
28
29
|
* The channel is responsible for transporting these sync operations and handling ACKs.
|
|
29
30
|
*/
|
|
30
|
-
outbox:
|
|
31
|
+
outbox: IMailbox<SyncOperation>;
|
|
31
32
|
/**
|
|
32
33
|
* Mailbox containing sync operations that failed and cannot be retried.
|
|
33
34
|
* These sync operations require manual intervention or should be logged for debugging.
|
|
34
35
|
*/
|
|
35
|
-
deadLetter:
|
|
36
|
+
deadLetter: IMailbox<SyncOperation>;
|
|
36
37
|
/**
|
|
37
38
|
* Initializes the channel asynchronously.
|
|
38
39
|
* For remote channels, this typically involves registering the channel on the remote server.
|
|
@@ -67,9 +68,10 @@ export interface IChannelFactory {
|
|
|
67
68
|
* @param cursorStorage - Storage for persisting synchronization cursors
|
|
68
69
|
* @param collectionId - Collection ID to synchronize
|
|
69
70
|
* @param filter - Filter to apply to operations
|
|
71
|
+
* @param operationIndex - Operation index for querying timestamps
|
|
70
72
|
* @returns A new channel instance
|
|
71
73
|
*/
|
|
72
|
-
instance(remoteId: string, remoteName: string, config: ChannelConfig, cursorStorage: ISyncCursorStorage, collectionId: string, filter: RemoteFilter): IChannel;
|
|
74
|
+
instance(remoteId: string, remoteName: string, config: ChannelConfig, cursorStorage: ISyncCursorStorage, collectionId: string, filter: RemoteFilter, operationIndex: IOperationIndex): IChannel;
|
|
73
75
|
}
|
|
74
76
|
/**
|
|
75
77
|
* Represents a configured remote with an active channel.
|
|
@@ -176,5 +178,15 @@ export interface ISyncManager {
|
|
|
176
178
|
* @returns Array of all remotes
|
|
177
179
|
*/
|
|
178
180
|
list(): Remote[];
|
|
181
|
+
/**
|
|
182
|
+
* Waits for sync operations for a job to complete.
|
|
183
|
+
* Resolves when SYNC_SUCCEEDED is emitted.
|
|
184
|
+
* Rejects when SYNC_FAILED is emitted.
|
|
185
|
+
*
|
|
186
|
+
* @param jobId - The job id to wait for
|
|
187
|
+
* @param signal - Optional abort signal
|
|
188
|
+
* @returns The sync result
|
|
189
|
+
*/
|
|
190
|
+
waitForSync(jobId: string, signal?: AbortSignal): Promise<SyncResult>;
|
|
179
191
|
}
|
|
180
192
|
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/sync/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/sync/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAE/B;;;OAGG;IACH,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEhC;;;OAGG;IACH,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEpC;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;OAEG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;;;;OAKG;IACH,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;;;;;;OAWG;IACH,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,kBAAkB,EACjC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,eAAe,GAC9B,QAAQ,CAAC;CACb;AAED;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,MAAM,EAAE,YAAY,CAAC;IAErB;;OAEG;IACH,OAAO,EAAE,aAAa,CAAC;IAEvB;;OAEG;IACH,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;OAOG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;;;;;;OAOG;IACH,QAAQ,IAAI,cAAc,CAAC;IAE3B;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAEhC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B;;;;;;;;;;;;;;OAcG;IACH,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,aAAa,EAC5B,MAAM,CAAC,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,aAAa,EACvB,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB;;;;;;;;;OASG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC;;;;OAIG;IACH,IAAI,IAAI,MAAM,EAAE,CAAC;IAEjB;;;;;;;;OAQG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACvE"}
|
|
@@ -1,21 +1,39 @@
|
|
|
1
1
|
export type MailboxItem = {
|
|
2
2
|
id: string;
|
|
3
3
|
};
|
|
4
|
-
type MailboxCallback<T extends MailboxItem> = (
|
|
4
|
+
export type MailboxCallback<T extends MailboxItem> = (items: T[]) => void;
|
|
5
|
+
export interface IMailbox<T extends MailboxItem> {
|
|
6
|
+
readonly items: ReadonlyArray<T>;
|
|
7
|
+
get(id: string): T | undefined;
|
|
8
|
+
add(item: T): void;
|
|
9
|
+
remove(item: T): void;
|
|
10
|
+
onAdded(callback: MailboxCallback<T>): void;
|
|
11
|
+
onRemoved(callback: MailboxCallback<T>): void;
|
|
12
|
+
pause(): void;
|
|
13
|
+
resume(): void;
|
|
14
|
+
flush(): void;
|
|
15
|
+
isPaused(): boolean;
|
|
16
|
+
}
|
|
5
17
|
export declare class MailboxAggregateError extends Error {
|
|
6
18
|
errors: Error[];
|
|
7
19
|
constructor(errors: Error[]);
|
|
8
20
|
}
|
|
9
|
-
export declare class Mailbox<T extends MailboxItem> {
|
|
21
|
+
export declare class Mailbox<T extends MailboxItem> implements IMailbox<T> {
|
|
10
22
|
private itemsMap;
|
|
11
23
|
private addedCallbacks;
|
|
12
24
|
private removedCallbacks;
|
|
25
|
+
private paused;
|
|
26
|
+
private addedBuffer;
|
|
27
|
+
private removedBuffer;
|
|
13
28
|
get items(): ReadonlyArray<T>;
|
|
14
29
|
get(id: string): T | undefined;
|
|
15
30
|
add(item: T): void;
|
|
16
31
|
remove(item: T): void;
|
|
17
32
|
onAdded(callback: MailboxCallback<T>): void;
|
|
18
33
|
onRemoved(callback: MailboxCallback<T>): void;
|
|
34
|
+
pause(): void;
|
|
35
|
+
resume(): void;
|
|
36
|
+
flush(): void;
|
|
37
|
+
isPaused(): boolean;
|
|
19
38
|
}
|
|
20
|
-
export {};
|
|
21
39
|
//# sourceMappingURL=mailbox.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../../src/sync/mailbox.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../../../src/sync/mailbox.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;AAE1E,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,WAAW;IAC7C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAC/B,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACnB,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5C,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9C,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,IAAI,OAAO,CAAC;CACrB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,MAAM,EAAE,KAAK,EAAE,CAAC;gBAEJ,MAAM,EAAE,KAAK,EAAE;CAQ5B;AAED,qBAAa,OAAO,CAAC,CAAC,SAAS,WAAW,CAAE,YAAW,QAAQ,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,aAAa,CAAW;IAEhC,IAAI,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,CAE5B;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI9B,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAoBlB,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAoBrB,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3C,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI;IAI7C,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAKd,KAAK,IAAI,IAAI;IAuCb,QAAQ,IAAI,OAAO;CAGpB"}
|
package/dist/src/sync/mailbox.js
CHANGED
|
@@ -11,6 +11,9 @@ export class Mailbox {
|
|
|
11
11
|
itemsMap = new Map();
|
|
12
12
|
addedCallbacks = [];
|
|
13
13
|
removedCallbacks = [];
|
|
14
|
+
paused = false;
|
|
15
|
+
addedBuffer = [];
|
|
16
|
+
removedBuffer = [];
|
|
14
17
|
get items() {
|
|
15
18
|
return Array.from(this.itemsMap.values());
|
|
16
19
|
}
|
|
@@ -19,11 +22,15 @@ export class Mailbox {
|
|
|
19
22
|
}
|
|
20
23
|
add(item) {
|
|
21
24
|
this.itemsMap.set(item.id, item);
|
|
25
|
+
if (this.paused) {
|
|
26
|
+
this.addedBuffer.push(item);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
22
29
|
const callbacks = [...this.addedCallbacks];
|
|
23
30
|
const errors = [];
|
|
24
31
|
for (const callback of callbacks) {
|
|
25
32
|
try {
|
|
26
|
-
callback(item);
|
|
33
|
+
callback([item]);
|
|
27
34
|
}
|
|
28
35
|
catch (error) {
|
|
29
36
|
errors.push(error instanceof Error ? error : new Error(String(error)));
|
|
@@ -35,11 +42,15 @@ export class Mailbox {
|
|
|
35
42
|
}
|
|
36
43
|
remove(item) {
|
|
37
44
|
this.itemsMap.delete(item.id);
|
|
45
|
+
if (this.paused) {
|
|
46
|
+
this.removedBuffer.push(item);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
38
49
|
const callbacks = [...this.removedCallbacks];
|
|
39
50
|
const errors = [];
|
|
40
51
|
for (const callback of callbacks) {
|
|
41
52
|
try {
|
|
42
|
-
callback(item);
|
|
53
|
+
callback([item]);
|
|
43
54
|
}
|
|
44
55
|
catch (error) {
|
|
45
56
|
errors.push(error instanceof Error ? error : new Error(String(error)));
|
|
@@ -55,5 +66,47 @@ export class Mailbox {
|
|
|
55
66
|
onRemoved(callback) {
|
|
56
67
|
this.removedCallbacks.push(callback);
|
|
57
68
|
}
|
|
69
|
+
pause() {
|
|
70
|
+
this.paused = true;
|
|
71
|
+
}
|
|
72
|
+
resume() {
|
|
73
|
+
this.paused = false;
|
|
74
|
+
this.flush();
|
|
75
|
+
}
|
|
76
|
+
flush() {
|
|
77
|
+
const addedItems = this.addedBuffer;
|
|
78
|
+
this.addedBuffer = [];
|
|
79
|
+
const errors = [];
|
|
80
|
+
if (addedItems.length > 0) {
|
|
81
|
+
const callbacks = [...this.addedCallbacks];
|
|
82
|
+
for (const callback of callbacks) {
|
|
83
|
+
try {
|
|
84
|
+
callback(addedItems);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
errors.push(error instanceof Error ? error : new Error(String(error)));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const removedItems = this.removedBuffer;
|
|
92
|
+
this.removedBuffer = [];
|
|
93
|
+
if (removedItems.length > 0) {
|
|
94
|
+
const callbacks = [...this.removedCallbacks];
|
|
95
|
+
for (const callback of callbacks) {
|
|
96
|
+
try {
|
|
97
|
+
callback(removedItems);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
errors.push(error instanceof Error ? error : new Error(String(error)));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (errors.length > 0) {
|
|
105
|
+
throw new MailboxAggregateError(errors);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
isPaused() {
|
|
109
|
+
return this.paused;
|
|
110
|
+
}
|
|
58
111
|
}
|
|
59
112
|
//# sourceMappingURL=mailbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../../src/sync/mailbox.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../../src/sync/mailbox.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,MAAM,CAAU;IAEhB,YAAY,MAAe;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,KAAK,CACH,gCAAgC,MAAM,CAAC,MAAM,cAAc,QAAQ,EAAE,CACtE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,OAAO;IACV,QAAQ,GAAmB,IAAI,GAAG,EAAE,CAAC;IACrC,cAAc,GAAyB,EAAE,CAAC;IAC1C,gBAAgB,GAAyB,EAAE,CAAC;IAC5C,MAAM,GAAY,KAAK,CAAC;IACxB,WAAW,GAAQ,EAAE,CAAC;IACtB,aAAa,GAAQ,EAAE,CAAC;IAEhC,IAAI,KAAK;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,IAAO;QACT,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAO;QACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,QAA4B;QAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,QAA4B;QACpC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,KAAK;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC1D,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAExB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,QAAQ,CAAC,YAAY,CAAC,CAAC;gBACzB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC1D,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { IEventBus } from "../events/interfaces.js";
|
|
2
|
+
import { type SyncResult } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Provides a promise-based interface for waiting on sync completion.
|
|
5
|
+
* Subscribes to sync events at construction and tracks completed sync results
|
|
6
|
+
* to provide a fast path for jobs that have already synced.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SyncAwaiter {
|
|
9
|
+
private readonly eventBus;
|
|
10
|
+
private readonly completedResults;
|
|
11
|
+
private readonly pendingWaiters;
|
|
12
|
+
private readonly unsubscribers;
|
|
13
|
+
private isShutdown;
|
|
14
|
+
constructor(eventBus: IEventBus);
|
|
15
|
+
/**
|
|
16
|
+
* Waits for sync operations for a job to complete.
|
|
17
|
+
* Resolves when SYNC_SUCCEEDED is emitted.
|
|
18
|
+
* Rejects when SYNC_FAILED is emitted.
|
|
19
|
+
*
|
|
20
|
+
* @param jobId - The job id to wait for
|
|
21
|
+
* @param signal - Optional abort signal
|
|
22
|
+
* @returns The sync result
|
|
23
|
+
*/
|
|
24
|
+
waitForSync(jobId: string, signal?: AbortSignal): Promise<SyncResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Shuts down the sync awaiter. This will synchronously reject all pending waiters.
|
|
27
|
+
*/
|
|
28
|
+
shutdown(): void;
|
|
29
|
+
private subscribeToEvents;
|
|
30
|
+
private handleSyncSucceeded;
|
|
31
|
+
private handleSyncFailed;
|
|
32
|
+
private resolveWaiters;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=sync-awaiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-awaiter.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-awaiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAC;AAQpB;;;;GAIG;AACH,qBAAa,WAAW;IAMV,OAAO,CAAC,QAAQ,CAAC,QAAQ;IALrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiC;IAClE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,UAAU,CAAS;gBAEE,QAAQ,EAAE,SAAS;IAIhD;;;;;;;;OAQG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAyCrE;;OAEG;IACH,QAAQ,IAAI,IAAI;IAgBhB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,cAAc;CAgBvB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { SyncEventTypes, } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Provides a promise-based interface for waiting on sync completion.
|
|
4
|
+
* Subscribes to sync events at construction and tracks completed sync results
|
|
5
|
+
* to provide a fast path for jobs that have already synced.
|
|
6
|
+
*/
|
|
7
|
+
export class SyncAwaiter {
|
|
8
|
+
eventBus;
|
|
9
|
+
completedResults = new Map();
|
|
10
|
+
pendingWaiters = new Map();
|
|
11
|
+
unsubscribers = [];
|
|
12
|
+
isShutdown = false;
|
|
13
|
+
constructor(eventBus) {
|
|
14
|
+
this.eventBus = eventBus;
|
|
15
|
+
this.subscribeToEvents();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Waits for sync operations for a job to complete.
|
|
19
|
+
* Resolves when SYNC_SUCCEEDED is emitted.
|
|
20
|
+
* Rejects when SYNC_FAILED is emitted.
|
|
21
|
+
*
|
|
22
|
+
* @param jobId - The job id to wait for
|
|
23
|
+
* @param signal - Optional abort signal
|
|
24
|
+
* @returns The sync result
|
|
25
|
+
*/
|
|
26
|
+
waitForSync(jobId, signal) {
|
|
27
|
+
if (signal?.aborted) {
|
|
28
|
+
return Promise.reject(new Error("Operation aborted"));
|
|
29
|
+
}
|
|
30
|
+
if (this.isShutdown) {
|
|
31
|
+
return Promise.reject(new Error("SyncAwaiter is shutdown"));
|
|
32
|
+
}
|
|
33
|
+
const completedResult = this.completedResults.get(jobId);
|
|
34
|
+
if (completedResult) {
|
|
35
|
+
return Promise.resolve(completedResult);
|
|
36
|
+
}
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
const waiter = { resolve, reject, signal };
|
|
39
|
+
const existingWaiters = this.pendingWaiters.get(jobId) || [];
|
|
40
|
+
existingWaiters.push(waiter);
|
|
41
|
+
this.pendingWaiters.set(jobId, existingWaiters);
|
|
42
|
+
if (signal) {
|
|
43
|
+
const abortHandler = () => {
|
|
44
|
+
const waiters = this.pendingWaiters.get(jobId);
|
|
45
|
+
if (waiters) {
|
|
46
|
+
const index = waiters.indexOf(waiter);
|
|
47
|
+
if (index !== -1) {
|
|
48
|
+
waiters.splice(index, 1);
|
|
49
|
+
if (waiters.length === 0) {
|
|
50
|
+
this.pendingWaiters.delete(jobId);
|
|
51
|
+
}
|
|
52
|
+
waiter.reject(new Error("Operation aborted"));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
signal.addEventListener("abort", abortHandler, { once: true });
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Shuts down the sync awaiter. This will synchronously reject all pending waiters.
|
|
62
|
+
*/
|
|
63
|
+
shutdown() {
|
|
64
|
+
this.isShutdown = true;
|
|
65
|
+
for (const unsubscribe of this.unsubscribers) {
|
|
66
|
+
unsubscribe();
|
|
67
|
+
}
|
|
68
|
+
this.unsubscribers.length = 0;
|
|
69
|
+
for (const [, waiters] of this.pendingWaiters) {
|
|
70
|
+
for (const waiter of waiters) {
|
|
71
|
+
waiter.reject(new Error("SyncAwaiter shutdown"));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
this.pendingWaiters.clear();
|
|
75
|
+
}
|
|
76
|
+
subscribeToEvents() {
|
|
77
|
+
this.unsubscribers.push(this.eventBus.subscribe(SyncEventTypes.SYNC_SUCCEEDED, (_type, event) => {
|
|
78
|
+
this.handleSyncSucceeded(event);
|
|
79
|
+
}));
|
|
80
|
+
this.unsubscribers.push(this.eventBus.subscribe(SyncEventTypes.SYNC_FAILED, (_type, event) => {
|
|
81
|
+
this.handleSyncFailed(event);
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
handleSyncSucceeded(event) {
|
|
85
|
+
const result = {
|
|
86
|
+
jobId: event.jobId,
|
|
87
|
+
status: "succeeded",
|
|
88
|
+
syncOperationCount: event.syncOperationCount,
|
|
89
|
+
successCount: event.syncOperationCount,
|
|
90
|
+
failureCount: 0,
|
|
91
|
+
errors: [],
|
|
92
|
+
};
|
|
93
|
+
this.completedResults.set(event.jobId, result);
|
|
94
|
+
this.resolveWaiters(event.jobId, result);
|
|
95
|
+
}
|
|
96
|
+
handleSyncFailed(event) {
|
|
97
|
+
const result = {
|
|
98
|
+
jobId: event.jobId,
|
|
99
|
+
status: "failed",
|
|
100
|
+
syncOperationCount: event.successCount + event.failureCount,
|
|
101
|
+
successCount: event.successCount,
|
|
102
|
+
failureCount: event.failureCount,
|
|
103
|
+
errors: event.errors,
|
|
104
|
+
};
|
|
105
|
+
this.completedResults.set(event.jobId, result);
|
|
106
|
+
this.resolveWaiters(event.jobId, result);
|
|
107
|
+
}
|
|
108
|
+
resolveWaiters(jobId, result) {
|
|
109
|
+
const waiters = this.pendingWaiters.get(jobId);
|
|
110
|
+
if (!waiters || waiters.length === 0) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.pendingWaiters.delete(jobId);
|
|
114
|
+
for (const waiter of waiters) {
|
|
115
|
+
if (waiter.signal?.aborted) {
|
|
116
|
+
waiter.reject(new Error("Operation aborted"));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
waiter.resolve(result);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=sync-awaiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-awaiter.js","sourceRoot":"","sources":["../../../src/sync/sync-awaiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,29 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type IOperationIndex } from "../cache/operation-index-types.js";
|
|
2
2
|
import type { IReactor } from "../core/types.js";
|
|
3
3
|
import type { IEventBus } from "../events/interfaces.js";
|
|
4
4
|
import type { ILogger } from "../logging/types.js";
|
|
5
5
|
import { type JobInfo, type ShutdownStatus } from "../shared/types.js";
|
|
6
6
|
import type { ISyncCursorStorage, ISyncRemoteStorage } from "../storage/interfaces.js";
|
|
7
7
|
import type { IChannelFactory, ISyncManager, Remote } from "./interfaces.js";
|
|
8
|
-
import type { ChannelConfig, RemoteFilter, RemoteOptions } from "./types.js";
|
|
8
|
+
import type { ChannelConfig, RemoteFilter, RemoteOptions, SyncResult } from "./types.js";
|
|
9
9
|
export declare class SyncManager implements ISyncManager {
|
|
10
10
|
private readonly logger;
|
|
11
11
|
private readonly remoteStorage;
|
|
12
12
|
private readonly cursorStorage;
|
|
13
13
|
private readonly channelFactory;
|
|
14
|
-
private readonly
|
|
14
|
+
private readonly operationIndex;
|
|
15
15
|
private readonly reactor;
|
|
16
16
|
private readonly eventBus;
|
|
17
17
|
private readonly remotes;
|
|
18
18
|
private readonly awaiter;
|
|
19
|
+
private readonly syncAwaiter;
|
|
20
|
+
private readonly jobSyncStates;
|
|
19
21
|
private isShutdown;
|
|
20
22
|
private eventUnsubscribe?;
|
|
23
|
+
private failedEventUnsubscribe?;
|
|
24
|
+
private writeReadyQueue;
|
|
25
|
+
private processingWriteReady;
|
|
26
|
+
private readonly pendingBatches;
|
|
21
27
|
loadJobs: Map<string, JobInfo>;
|
|
22
28
|
constructor(logger: ILogger, remoteStorage: ISyncRemoteStorage, cursorStorage: ISyncCursorStorage, channelFactory: IChannelFactory, operationIndex: IOperationIndex, reactor: IReactor, eventBus: IEventBus);
|
|
23
29
|
startup(): Promise<void>;
|
|
@@ -28,10 +34,18 @@ export declare class SyncManager implements ISyncManager {
|
|
|
28
34
|
private backfillOutbox;
|
|
29
35
|
remove(name: string): Promise<void>;
|
|
30
36
|
list(): Remote[];
|
|
37
|
+
waitForSync(jobId: string, signal?: AbortSignal): Promise<SyncResult>;
|
|
31
38
|
private wireChannelCallbacks;
|
|
32
|
-
private
|
|
33
|
-
private
|
|
39
|
+
private enqueueWriteReady;
|
|
40
|
+
private processWriteReadyQueue;
|
|
41
|
+
private handleWriteReadyAsync;
|
|
42
|
+
private handleJobFailedForBatch;
|
|
43
|
+
private processCompleteBatch;
|
|
44
|
+
private handleInboxAdded;
|
|
34
45
|
private handleOutboxJob;
|
|
35
46
|
private applyInboxJob;
|
|
47
|
+
private applyInboxBatch;
|
|
48
|
+
private markSyncOpCompleted;
|
|
49
|
+
private filterByCollectionMembership;
|
|
36
50
|
}
|
|
37
51
|
//# sourceMappingURL=sync-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-manager.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sync-manager.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-manager.ts"],"names":[],"mappings":"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"}
|