@powerhousedao/reactor 6.0.0-dev.5 → 6.0.0-dev.50
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 +6 -1
- package/dist/src/cache/kysely-operation-index.d.ts.map +1 -1
- package/dist/src/cache/kysely-operation-index.js +102 -7
- 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 +16 -12
- package/dist/src/cache/kysely-write-cache.js.map +1 -1
- package/dist/src/cache/operation-index-types.d.ts +16 -2
- 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 +134 -43
- 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 +23 -7
- package/dist/src/core/reactor-builder.d.ts.map +1 -1
- package/dist/src/core/reactor-builder.js +96 -24
- 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 +235 -576
- 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 +39 -3
- package/dist/src/core/utils.d.ts.map +1 -1
- package/dist/src/core/utils.js +63 -9
- 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 +354 -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 +94 -580
- package/dist/src/executor/simple-job-executor.js.map +1 -1
- package/dist/src/executor/types.d.ts +1 -3
- 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 +12 -2
- 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 +11 -9
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -5
- 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 +1 -1
- package/dist/src/processors/index.d.ts.map +1 -1
- package/dist/src/processors/index.js.map +1 -1
- package/dist/src/processors/processor-manager.d.ts +2 -2
- package/dist/src/processors/processor-manager.d.ts.map +1 -1
- package/dist/src/processors/processor-manager.js.map +1 -1
- package/dist/src/processors/relational/types.d.ts +2 -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 +2 -0
- package/dist/src/processors/relational/utils.d.ts.map +1 -0
- package/dist/src/processors/relational/utils.js +2 -0
- package/dist/src/processors/relational/utils.js.map +1 -0
- package/dist/src/processors/utils.d.ts +2 -2
- 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 +33 -1
- package/dist/src/queue/queue.d.ts.map +1 -1
- package/dist/src/queue/queue.js +135 -1
- 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.d.ts +1 -1
- package/dist/src/read-models/base-read-model.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 +6 -3
- 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/read-models/interfaces.d.ts +1 -1
- package/dist/src/read-models/interfaces.d.ts.map +1 -1
- package/dist/src/registry/index.d.ts +1 -1
- package/dist/src/registry/index.d.ts.map +1 -1
- package/dist/src/registry/interfaces.d.ts +8 -0
- package/dist/src/registry/interfaces.d.ts.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 +56 -108
- 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 +8 -7
- 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 +5 -4
- 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-cursor-storage.d.ts +1 -1
- package/dist/src/storage/kysely/sync-cursor-storage.d.ts.map +1 -1
- package/dist/src/storage/kysely/sync-cursor-storage.js +6 -2
- package/dist/src/storage/kysely/sync-cursor-storage.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/storage/kysely/types.d.ts +2 -0
- package/dist/src/storage/kysely/types.d.ts.map +1 -1
- package/dist/src/storage/migrations/011_add_cursor_type_column.d.ts +3 -0
- package/dist/src/storage/migrations/011_add_cursor_type_column.d.ts.map +1 -0
- package/dist/src/storage/migrations/011_add_cursor_type_column.js +29 -0
- package/dist/src/storage/migrations/011_add_cursor_type_column.js.map +1 -0
- package/dist/src/storage/migrations/012_add_source_remote_column.d.ts +3 -0
- package/dist/src/storage/migrations/012_add_source_remote_column.d.ts.map +1 -0
- package/dist/src/storage/migrations/012_add_source_remote_column.js +7 -0
- package/dist/src/storage/migrations/012_add_source_remote_column.js.map +1 -0
- package/dist/src/storage/migrations/migrator.d.ts.map +1 -1
- package/dist/src/storage/migrations/migrator.js +4 -0
- package/dist/src/storage/migrations/migrator.js.map +1 -1
- package/dist/src/subs/subscription-notification-read-model.d.ts +3 -2
- package/dist/src/subs/subscription-notification-read-model.d.ts.map +1 -1
- package/dist/src/subs/subscription-notification-read-model.js +1 -1
- package/dist/src/subs/subscription-notification-read-model.js.map +1 -1
- package/dist/src/sync/batch-aggregator.d.ts +25 -0
- package/dist/src/sync/batch-aggregator.d.ts.map +1 -0
- package/dist/src/sync/batch-aggregator.js +94 -0
- package/dist/src/sync/batch-aggregator.js.map +1 -0
- package/dist/src/sync/buffered-mailbox.d.ts +36 -0
- package/dist/src/sync/buffered-mailbox.d.ts.map +1 -0
- package/dist/src/sync/buffered-mailbox.js +164 -0
- package/dist/src/sync/buffered-mailbox.js.map +1 -0
- package/dist/src/sync/channels/{gql-channel.d.ts → gql-req-channel.d.ts} +44 -42
- package/dist/src/sync/channels/gql-req-channel.d.ts.map +1 -0
- package/dist/src/sync/channels/gql-req-channel.js +500 -0
- package/dist/src/sync/channels/gql-req-channel.js.map +1 -0
- package/dist/src/sync/channels/gql-request-channel-factory.d.ts +32 -0
- package/dist/src/sync/channels/gql-request-channel-factory.d.ts.map +1 -0
- package/dist/src/sync/channels/gql-request-channel-factory.js +105 -0
- package/dist/src/sync/channels/gql-request-channel-factory.js.map +1 -0
- package/dist/src/sync/channels/gql-res-channel.d.ts +25 -0
- package/dist/src/sync/channels/gql-res-channel.d.ts.map +1 -0
- package/dist/src/sync/channels/gql-res-channel.js +79 -0
- package/dist/src/sync/channels/gql-res-channel.js.map +1 -0
- package/dist/src/sync/channels/gql-response-channel-factory.d.ts +13 -0
- package/dist/src/sync/channels/gql-response-channel-factory.d.ts.map +1 -0
- package/dist/src/sync/channels/gql-response-channel-factory.js +14 -0
- package/dist/src/sync/channels/gql-response-channel-factory.js.map +1 -0
- package/dist/src/sync/channels/index.d.ts +6 -4
- package/dist/src/sync/channels/index.d.ts.map +1 -1
- package/dist/src/sync/channels/index.js +6 -4
- package/dist/src/sync/channels/index.js.map +1 -1
- package/dist/src/sync/channels/interval-poll-timer.d.ts +38 -0
- package/dist/src/sync/channels/interval-poll-timer.d.ts.map +1 -0
- package/dist/src/sync/channels/interval-poll-timer.js +117 -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 +15 -1
- package/dist/src/sync/channels/utils.d.ts.map +1 -1
- package/dist/src/sync/channels/utils.js +66 -2
- package/dist/src/sync/channels/utils.js.map +1 -1
- package/dist/src/sync/index.d.ts +10 -6
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +7 -5
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/interfaces.d.ts +34 -21
- package/dist/src/sync/interfaces.d.ts.map +1 -1
- package/dist/src/sync/mailbox.d.ts +51 -12
- package/dist/src/sync/mailbox.d.ts.map +1 -1
- package/dist/src/sync/mailbox.js +89 -6
- 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 +16 -6
- package/dist/src/sync/sync-manager.d.ts.map +1 -1
- package/dist/src/sync/sync-manager.js +204 -94
- package/dist/src/sync/sync-manager.js.map +1 -1
- package/dist/src/sync/sync-operation.d.ts +4 -2
- package/dist/src/sync/sync-operation.d.ts.map +1 -1
- package/dist/src/sync/sync-operation.js +8 -1
- package/dist/src/sync/sync-operation.js.map +1 -1
- package/dist/src/sync/sync-status-tracker.d.ts +31 -0
- package/dist/src/sync/sync-status-tracker.d.ts.map +1 -0
- package/dist/src/sync/sync-status-tracker.js +137 -0
- package/dist/src/sync/sync-status-tracker.js.map +1 -0
- package/dist/src/sync/types.d.ts +79 -2
- package/dist/src/sync/types.d.ts.map +1 -1
- package/dist/src/sync/types.js +15 -0
- package/dist/src/sync/types.js.map +1 -1
- package/dist/src/sync/utils.d.ts +28 -1
- package/dist/src/sync/utils.d.ts.map +1 -1
- package/dist/src/sync/utils.js +136 -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 +12 -13
- package/dist/src/processors/types.d.ts +0 -63
- package/dist/src/processors/types.d.ts.map +0 -1
- package/dist/src/processors/types.js +0 -2
- package/dist/src/processors/types.js.map +0 -1
- 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
- package/dist/src/sync/channels/composite-channel-factory.d.ts +0 -30
- package/dist/src/sync/channels/composite-channel-factory.d.ts.map +0 -1
- package/dist/src/sync/channels/composite-channel-factory.js +0 -87
- package/dist/src/sync/channels/composite-channel-factory.js.map +0 -1
- package/dist/src/sync/channels/gql-channel-factory.d.ts +0 -25
- package/dist/src/sync/channels/gql-channel-factory.d.ts.map +0 -1
- package/dist/src/sync/channels/gql-channel-factory.js +0 -76
- package/dist/src/sync/channels/gql-channel-factory.js.map +0 -1
- package/dist/src/sync/channels/gql-channel.d.ts.map +0 -1
- package/dist/src/sync/channels/gql-channel.js +0 -423
- package/dist/src/sync/channels/gql-channel.js.map +0 -1
- package/dist/src/sync/channels/polling-channel.d.ts +0 -39
- package/dist/src/sync/channels/polling-channel.d.ts.map +0 -1
- package/dist/src/sync/channels/polling-channel.js +0 -72
- package/dist/src/sync/channels/polling-channel.js.map +0 -1
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
export var SyncStatus;
|
|
2
|
+
(function (SyncStatus) {
|
|
3
|
+
SyncStatus["Synced"] = "SYNCED";
|
|
4
|
+
SyncStatus["Outgoing"] = "OUTGOING";
|
|
5
|
+
SyncStatus["Incoming"] = "INCOMING";
|
|
6
|
+
SyncStatus["OutgoingAndIncoming"] = "OUTGOING_AND_INCOMING";
|
|
7
|
+
SyncStatus["Error"] = "ERROR";
|
|
8
|
+
})(SyncStatus || (SyncStatus = {}));
|
|
9
|
+
export class SyncStatusTracker {
|
|
10
|
+
remotes = new Map();
|
|
11
|
+
seen = new Set();
|
|
12
|
+
callbacks = new Set();
|
|
13
|
+
getStatus(documentId) {
|
|
14
|
+
if (!this.seen.has(documentId)) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
let totalInbox = 0;
|
|
18
|
+
let totalOutbox = 0;
|
|
19
|
+
let totalErrors = 0;
|
|
20
|
+
for (const documents of this.remotes.values()) {
|
|
21
|
+
const counts = documents.get(documentId);
|
|
22
|
+
if (counts) {
|
|
23
|
+
totalInbox += counts.inboxCount;
|
|
24
|
+
totalOutbox += counts.outboxCount;
|
|
25
|
+
totalErrors += counts.errorCount;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return deriveStatus(totalInbox, totalOutbox, totalErrors);
|
|
29
|
+
}
|
|
30
|
+
onChange(callback) {
|
|
31
|
+
this.callbacks.add(callback);
|
|
32
|
+
return () => {
|
|
33
|
+
this.callbacks.delete(callback);
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
trackRemote(remoteName, channel) {
|
|
37
|
+
this.remotes.set(remoteName, new Map());
|
|
38
|
+
channel.inbox.onAdded((syncOps) => this.handleAdded(remoteName, "inbox", syncOps));
|
|
39
|
+
channel.inbox.onRemoved((syncOps) => this.handleRemoved(remoteName, "inbox", syncOps));
|
|
40
|
+
channel.outbox.onAdded((syncOps) => this.handleAdded(remoteName, "outbox", syncOps));
|
|
41
|
+
channel.outbox.onRemoved((syncOps) => this.handleRemoved(remoteName, "outbox", syncOps));
|
|
42
|
+
channel.deadLetter.onAdded((syncOps) => this.handleAdded(remoteName, "deadLetter", syncOps));
|
|
43
|
+
}
|
|
44
|
+
untrackRemote(remoteName) {
|
|
45
|
+
const documents = this.remotes.get(remoteName);
|
|
46
|
+
if (!documents) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const affectedDocumentIds = [...documents.keys()];
|
|
50
|
+
this.remotes.delete(remoteName);
|
|
51
|
+
for (const documentId of affectedDocumentIds) {
|
|
52
|
+
this.notifyChange(documentId);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
clear() {
|
|
56
|
+
this.remotes.clear();
|
|
57
|
+
this.seen.clear();
|
|
58
|
+
this.callbacks.clear();
|
|
59
|
+
}
|
|
60
|
+
handleAdded(remoteName, mailboxType, syncOps) {
|
|
61
|
+
const changedDocuments = new Set();
|
|
62
|
+
for (const syncOp of syncOps) {
|
|
63
|
+
if (mailboxType === "inbox" && !syncOp.remoteName) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const counts = this.getOrCreateCounts(remoteName, syncOp.documentId);
|
|
67
|
+
this.seen.add(syncOp.documentId);
|
|
68
|
+
if (mailboxType === "inbox") {
|
|
69
|
+
counts.inboxCount++;
|
|
70
|
+
}
|
|
71
|
+
else if (mailboxType === "outbox") {
|
|
72
|
+
counts.outboxCount++;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
counts.errorCount++;
|
|
76
|
+
}
|
|
77
|
+
changedDocuments.add(syncOp.documentId);
|
|
78
|
+
}
|
|
79
|
+
for (const documentId of changedDocuments) {
|
|
80
|
+
this.notifyChange(documentId);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
handleRemoved(remoteName, mailboxType, syncOps) {
|
|
84
|
+
const changedDocuments = new Set();
|
|
85
|
+
for (const syncOp of syncOps) {
|
|
86
|
+
const counts = this.getOrCreateCounts(remoteName, syncOp.documentId);
|
|
87
|
+
if (mailboxType === "inbox") {
|
|
88
|
+
counts.inboxCount = Math.max(0, counts.inboxCount - 1);
|
|
89
|
+
}
|
|
90
|
+
else if (mailboxType === "outbox") {
|
|
91
|
+
counts.outboxCount = Math.max(0, counts.outboxCount - 1);
|
|
92
|
+
}
|
|
93
|
+
changedDocuments.add(syncOp.documentId);
|
|
94
|
+
}
|
|
95
|
+
for (const documentId of changedDocuments) {
|
|
96
|
+
this.notifyChange(documentId);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
getOrCreateCounts(remoteName, documentId) {
|
|
100
|
+
let documents = this.remotes.get(remoteName);
|
|
101
|
+
if (!documents) {
|
|
102
|
+
documents = new Map();
|
|
103
|
+
this.remotes.set(remoteName, documents);
|
|
104
|
+
}
|
|
105
|
+
let counts = documents.get(documentId);
|
|
106
|
+
if (!counts) {
|
|
107
|
+
counts = { inboxCount: 0, outboxCount: 0, errorCount: 0 };
|
|
108
|
+
documents.set(documentId, counts);
|
|
109
|
+
}
|
|
110
|
+
return counts;
|
|
111
|
+
}
|
|
112
|
+
notifyChange(documentId) {
|
|
113
|
+
const status = this.getStatus(documentId);
|
|
114
|
+
if (status === undefined) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
for (const callback of [...this.callbacks]) {
|
|
118
|
+
callback(documentId, status);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function deriveStatus(inboxCount, outboxCount, errorCount) {
|
|
123
|
+
if (errorCount > 0) {
|
|
124
|
+
return SyncStatus.Error;
|
|
125
|
+
}
|
|
126
|
+
if (inboxCount > 0 && outboxCount > 0) {
|
|
127
|
+
return SyncStatus.OutgoingAndIncoming;
|
|
128
|
+
}
|
|
129
|
+
if (inboxCount > 0) {
|
|
130
|
+
return SyncStatus.Incoming;
|
|
131
|
+
}
|
|
132
|
+
if (outboxCount > 0) {
|
|
133
|
+
return SyncStatus.Outgoing;
|
|
134
|
+
}
|
|
135
|
+
return SyncStatus.Synced;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=sync-status-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-status-tracker.js","sourceRoot":"","sources":["../../../src/sync/sync-status-tracker.ts"],"names":[],"mappings":"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"}
|
package/dist/src/sync/types.d.ts
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
|
-
import type { OperationWithContext } from "
|
|
2
|
-
export
|
|
1
|
+
import type { OperationWithContext } from "@powerhousedao/shared/document-model";
|
|
2
|
+
export declare enum ChannelScheme {
|
|
3
|
+
CONNECT = "connect",
|
|
4
|
+
SWITCHBOARD = "switchboard"
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Dynamic JWT token handler for generating authentication tokens per-request.
|
|
8
|
+
* Called with the target URL to enable audience-specific tokens (aud claim).
|
|
9
|
+
* Returns undefined if no authentication is available (e.g., user not logged in).
|
|
10
|
+
*/
|
|
11
|
+
export type JwtHandler = (url: string) => Promise<string | undefined>;
|
|
12
|
+
export type RemoteOptions = {
|
|
13
|
+
sinceTimestampUtcMs: string;
|
|
14
|
+
};
|
|
3
15
|
export type RemoteFilter = {
|
|
4
16
|
documentId: string[];
|
|
5
17
|
scope: string[];
|
|
@@ -7,6 +19,7 @@ export type RemoteFilter = {
|
|
|
7
19
|
};
|
|
8
20
|
export type RemoteCursor = {
|
|
9
21
|
remoteName: string;
|
|
22
|
+
cursorType: string;
|
|
10
23
|
cursorOrdinal: number;
|
|
11
24
|
lastSyncedAtUtcMs?: number;
|
|
12
25
|
};
|
|
@@ -19,6 +32,8 @@ export type SyncEnvelope = {
|
|
|
19
32
|
channelMeta: ChannelMeta;
|
|
20
33
|
operations?: OperationWithContext[];
|
|
21
34
|
cursor?: RemoteCursor;
|
|
35
|
+
key?: string;
|
|
36
|
+
dependsOn?: string[];
|
|
22
37
|
};
|
|
23
38
|
export declare enum SyncOperationStatus {
|
|
24
39
|
Unknown = -1,
|
|
@@ -57,4 +72,66 @@ export type RemoteRecord = {
|
|
|
57
72
|
options: RemoteOptions;
|
|
58
73
|
status: RemoteStatus;
|
|
59
74
|
};
|
|
75
|
+
/**
|
|
76
|
+
* Event types for sync lifecycle events.
|
|
77
|
+
* These events track the sync progress of a job's operations to remotes.
|
|
78
|
+
* Uses a separate namespace (20000 range) from ReactorEventTypes (10000 range).
|
|
79
|
+
*/
|
|
80
|
+
export declare const SyncEventTypes: {
|
|
81
|
+
readonly SYNC_PENDING: 20001;
|
|
82
|
+
readonly SYNC_SUCCEEDED: 20002;
|
|
83
|
+
readonly SYNC_FAILED: 20003;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Event emitted when all SyncOperations for a job are queued in outboxes.
|
|
87
|
+
*/
|
|
88
|
+
export type SyncPendingEvent = {
|
|
89
|
+
jobId: string;
|
|
90
|
+
syncOperationCount: number;
|
|
91
|
+
remoteNames: string[];
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Event emitted when all sync operations for a job succeed.
|
|
95
|
+
*/
|
|
96
|
+
export type SyncSucceededEvent = {
|
|
97
|
+
jobId: string;
|
|
98
|
+
syncOperationCount: number;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Event emitted when at least one sync operation for a job fails.
|
|
102
|
+
*/
|
|
103
|
+
export type SyncFailedEvent = {
|
|
104
|
+
jobId: string;
|
|
105
|
+
successCount: number;
|
|
106
|
+
failureCount: number;
|
|
107
|
+
errors: Array<{
|
|
108
|
+
remoteName: string;
|
|
109
|
+
documentId: string;
|
|
110
|
+
error: string;
|
|
111
|
+
}>;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Status of a sync operation result.
|
|
115
|
+
*/
|
|
116
|
+
export type SyncResultStatus = "succeeded" | "failed";
|
|
117
|
+
/**
|
|
118
|
+
* Error information for a failed sync operation to a specific remote.
|
|
119
|
+
*/
|
|
120
|
+
export type SyncResultError = {
|
|
121
|
+
remoteName: string;
|
|
122
|
+
documentId: string;
|
|
123
|
+
error: string;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Result of waiting for sync operations to complete for a job.
|
|
127
|
+
* Returned by ISyncManager.waitForSync().
|
|
128
|
+
*/
|
|
129
|
+
export type SyncResult = {
|
|
130
|
+
jobId: string;
|
|
131
|
+
status: SyncResultStatus;
|
|
132
|
+
syncOperationCount: number;
|
|
133
|
+
successCount: number;
|
|
134
|
+
failureCount: number;
|
|
135
|
+
errors: SyncResultError[];
|
|
136
|
+
};
|
|
60
137
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sync/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sync/types.ts"],"names":[],"mappings":"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"}
|
package/dist/src/sync/types.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export var ChannelScheme;
|
|
2
|
+
(function (ChannelScheme) {
|
|
3
|
+
ChannelScheme["CONNECT"] = "connect";
|
|
4
|
+
ChannelScheme["SWITCHBOARD"] = "switchboard";
|
|
5
|
+
})(ChannelScheme || (ChannelScheme = {}));
|
|
1
6
|
export var SyncOperationStatus;
|
|
2
7
|
(function (SyncOperationStatus) {
|
|
3
8
|
SyncOperationStatus[SyncOperationStatus["Unknown"] = -1] = "Unknown";
|
|
@@ -13,4 +18,14 @@ export var ChannelErrorSource;
|
|
|
13
18
|
ChannelErrorSource["Inbox"] = "inbox";
|
|
14
19
|
ChannelErrorSource["Outbox"] = "outbox";
|
|
15
20
|
})(ChannelErrorSource || (ChannelErrorSource = {}));
|
|
21
|
+
/**
|
|
22
|
+
* Event types for sync lifecycle events.
|
|
23
|
+
* These events track the sync progress of a job's operations to remotes.
|
|
24
|
+
* Uses a separate namespace (20000 range) from ReactorEventTypes (10000 range).
|
|
25
|
+
*/
|
|
26
|
+
export const SyncEventTypes = {
|
|
27
|
+
SYNC_PENDING: 20001,
|
|
28
|
+
SYNC_SUCCEEDED: 20002,
|
|
29
|
+
SYNC_FAILED: 20003,
|
|
30
|
+
};
|
|
16
31
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/sync/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/sync/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4CAA2B,CAAA;AAC7B,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAyCD,MAAM,CAAN,IAAY,mBAMX;AAND,WAAY,mBAAmB;IAC7B,oEAAY,CAAA;IACZ,qFAAoB,CAAA;IACpB,qFAAoB,CAAA;IACpB,mEAAW,CAAA;IACX,+DAAS,CAAA;AACX,CAAC,EANW,mBAAmB,KAAnB,mBAAmB,QAM9B;AAED,MAAM,CAAN,IAAY,kBAKX;AALD,WAAY,kBAAkB;IAC5B,mCAAa,CAAA;IACb,yCAAmB,CAAA;IACnB,qCAAe,CAAA;IACf,uCAAiB,CAAA;AACnB,CAAC,EALW,kBAAkB,KAAlB,kBAAkB,QAK7B;AAqCD;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE,KAAK;CACV,CAAC"}
|
package/dist/src/sync/utils.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type { OperationWithContext } from "
|
|
1
|
+
import type { OperationWithContext } from "@powerhousedao/shared/document-model";
|
|
2
|
+
import { type OperationIndexEntry } from "../cache/operation-index-types.js";
|
|
3
|
+
import type { JobWriteReadyEvent } from "../events/types.js";
|
|
4
|
+
import type { PreparedBatch } from "./batch-aggregator.js";
|
|
5
|
+
import type { IMailbox } from "./mailbox.js";
|
|
2
6
|
import type { ChannelHealth, RemoteFilter } from "./types.js";
|
|
3
7
|
export type OperationBatch = {
|
|
4
8
|
documentId: string;
|
|
@@ -6,6 +10,14 @@ export type OperationBatch = {
|
|
|
6
10
|
scope: string;
|
|
7
11
|
operations: OperationWithContext[];
|
|
8
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* Trims a mailbox using the jobIds from a batch.
|
|
15
|
+
*/
|
|
16
|
+
export declare function trimMailboxFromBatch(mailbox: IMailbox, batch: PreparedBatch): void;
|
|
17
|
+
/**
|
|
18
|
+
* Trims a mailbox using the ack ordinal.
|
|
19
|
+
*/
|
|
20
|
+
export declare function trimMailboxFromAckOrdinal(mailbox: IMailbox, ackOrdinal: number): void;
|
|
9
21
|
/**
|
|
10
22
|
* Filters operations based on a remote's filter criteria.
|
|
11
23
|
*
|
|
@@ -32,5 +44,20 @@ export declare function createIdleHealth(): ChannelHealth;
|
|
|
32
44
|
* This ensures operations are grouped for efficient processing while maintaining
|
|
33
45
|
* causality across documents and scopes.
|
|
34
46
|
*/
|
|
47
|
+
/**
|
|
48
|
+
* Sorts envelopes by the timestamp of their first operation.
|
|
49
|
+
* Envelopes without operations are placed at the end.
|
|
50
|
+
*/
|
|
51
|
+
export declare function sortEnvelopesByFirstOperationTimestamp<T extends {
|
|
52
|
+
operations?: ReadonlyArray<{
|
|
53
|
+
operation: {
|
|
54
|
+
timestampUtcMs: string;
|
|
55
|
+
};
|
|
56
|
+
}> | null | undefined;
|
|
57
|
+
}>(envelopes: T[]): T[];
|
|
35
58
|
export declare function batchOperationsByDocument(operations: OperationWithContext[]): OperationBatch[];
|
|
59
|
+
export declare function getMaxOrdinal(operations: OperationWithContext[]): number;
|
|
60
|
+
export declare function filterByCollectionMembership(operations: OperationWithContext[], collectionId: string, collectionMemberships?: Record<string, string[]>): OperationWithContext[];
|
|
61
|
+
export declare function toOperationWithContext(entry: OperationIndexEntry): OperationWithContext;
|
|
62
|
+
export declare function mergeCollectionMemberships(events: JobWriteReadyEvent[]): Record<string, string[]>;
|
|
36
63
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/sync/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/sync/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,oBAAoB,EAAE,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,aAAa,GACnB,IAAI,CAuBN;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,QAAQ,EACjB,UAAU,EAAE,MAAM,QA0BnB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,oBAAoB,EAAE,EAClC,MAAM,EAAE,YAAY,GACnB,oBAAoB,EAAE,CAmBxB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD;AAED;;;;;;;;;;;GAWG;AACH;;;GAGG;AACH,wBAAgB,sCAAsC,CACpD,CAAC,SAAS;IACR,UAAU,CAAC,EACP,aAAa,CAAC;QAAE,SAAS,EAAE;YAAE,cAAc,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,GACxD,IAAI,GACJ,SAAS,CAAC;CACf,EACD,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAWrB;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,oBAAoB,EAAE,GACjC,cAAc,EAAE,CAsClB;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAKxE;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,oBAAoB,EAAE,EAClC,YAAY,EAAE,MAAM,EACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC/C,oBAAoB,EAAE,CAYxB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,mBAAmB,GACzB,oBAAoB,CAkBtB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,kBAAkB,EAAE,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CA2C1B"}
|
package/dist/src/sync/utils.js
CHANGED
|
@@ -1,3 +1,53 @@
|
|
|
1
|
+
import { driveCollectionId, } from "../cache/operation-index-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Trims a mailbox using the jobIds from a batch.
|
|
4
|
+
*/
|
|
5
|
+
export function trimMailboxFromBatch(mailbox, batch) {
|
|
6
|
+
const toRemove = [];
|
|
7
|
+
// we want to guarantee:
|
|
8
|
+
//
|
|
9
|
+
// 1. sync ops are still in the inbox when marked as executed
|
|
10
|
+
// 2. we remove syncops as a batch after they have been executed
|
|
11
|
+
for (const syncOp of batch.entries) {
|
|
12
|
+
for (const item of mailbox.items) {
|
|
13
|
+
if (syncOp.event.jobId === item.jobId) {
|
|
14
|
+
toRemove.push(item);
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (toRemove.length > 0) {
|
|
20
|
+
for (const syncOp of toRemove) {
|
|
21
|
+
syncOp.executed();
|
|
22
|
+
}
|
|
23
|
+
mailbox.remove(...toRemove);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Trims a mailbox using the ack ordinal.
|
|
28
|
+
*/
|
|
29
|
+
export function trimMailboxFromAckOrdinal(mailbox, ackOrdinal) {
|
|
30
|
+
const toRemove = [];
|
|
31
|
+
// we want to guarantee:
|
|
32
|
+
//
|
|
33
|
+
// 1. sync ops are still in the mailbox when marked as applied
|
|
34
|
+
// 2. we remove syncops as a single batch
|
|
35
|
+
for (const syncOp of mailbox.items) {
|
|
36
|
+
let maxOrdinal = 0;
|
|
37
|
+
for (const op of syncOp.operations) {
|
|
38
|
+
maxOrdinal = Math.max(maxOrdinal, op.context.ordinal);
|
|
39
|
+
}
|
|
40
|
+
if (maxOrdinal <= ackOrdinal) {
|
|
41
|
+
toRemove.push(syncOp);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (toRemove.length > 0) {
|
|
45
|
+
for (const syncOp of toRemove) {
|
|
46
|
+
syncOp.executed();
|
|
47
|
+
}
|
|
48
|
+
mailbox.remove(...toRemove);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
1
51
|
/**
|
|
2
52
|
* Filters operations based on a remote's filter criteria.
|
|
3
53
|
*
|
|
@@ -43,6 +93,23 @@ export function createIdleHealth() {
|
|
|
43
93
|
* This ensures operations are grouped for efficient processing while maintaining
|
|
44
94
|
* causality across documents and scopes.
|
|
45
95
|
*/
|
|
96
|
+
/**
|
|
97
|
+
* Sorts envelopes by the timestamp of their first operation.
|
|
98
|
+
* Envelopes without operations are placed at the end.
|
|
99
|
+
*/
|
|
100
|
+
export function sortEnvelopesByFirstOperationTimestamp(envelopes) {
|
|
101
|
+
return envelopes.slice().sort((a, b) => {
|
|
102
|
+
const aTimestamp = a.operations?.[0]?.operation.timestampUtcMs;
|
|
103
|
+
const bTimestamp = b.operations?.[0]?.operation.timestampUtcMs;
|
|
104
|
+
if (!aTimestamp && !bTimestamp)
|
|
105
|
+
return 0;
|
|
106
|
+
if (!aTimestamp)
|
|
107
|
+
return 1;
|
|
108
|
+
if (!bTimestamp)
|
|
109
|
+
return -1;
|
|
110
|
+
return new Date(aTimestamp).getTime() - new Date(bTimestamp).getTime();
|
|
111
|
+
});
|
|
112
|
+
}
|
|
46
113
|
export function batchOperationsByDocument(operations) {
|
|
47
114
|
const batches = [];
|
|
48
115
|
let currentDocId = null;
|
|
@@ -75,4 +142,73 @@ export function batchOperationsByDocument(operations) {
|
|
|
75
142
|
flushBatch();
|
|
76
143
|
return batches;
|
|
77
144
|
}
|
|
145
|
+
export function getMaxOrdinal(operations) {
|
|
146
|
+
return operations.reduce((maxOrdinal, operation) => Math.max(maxOrdinal, operation.context.ordinal), 0);
|
|
147
|
+
}
|
|
148
|
+
export function filterByCollectionMembership(operations, collectionId, collectionMemberships) {
|
|
149
|
+
if (!collectionMemberships) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
return operations.filter((op) => {
|
|
153
|
+
const documentId = op.context.documentId;
|
|
154
|
+
if (!(documentId in collectionMemberships)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
return collectionMemberships[documentId].includes(collectionId);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
export function toOperationWithContext(entry) {
|
|
161
|
+
return {
|
|
162
|
+
operation: {
|
|
163
|
+
id: entry.id,
|
|
164
|
+
index: entry.index,
|
|
165
|
+
skip: entry.skip,
|
|
166
|
+
hash: entry.hash,
|
|
167
|
+
timestampUtcMs: entry.timestampUtcMs,
|
|
168
|
+
action: entry.action,
|
|
169
|
+
},
|
|
170
|
+
context: {
|
|
171
|
+
documentId: entry.documentId,
|
|
172
|
+
documentType: entry.documentType,
|
|
173
|
+
scope: entry.scope,
|
|
174
|
+
branch: entry.branch,
|
|
175
|
+
ordinal: entry.ordinal ?? 0,
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
export function mergeCollectionMemberships(events) {
|
|
180
|
+
const mergedMemberships = {};
|
|
181
|
+
for (const event of events) {
|
|
182
|
+
if (event.collectionMemberships) {
|
|
183
|
+
for (const [docId, collections] of Object.entries(event.collectionMemberships)) {
|
|
184
|
+
if (!(docId in mergedMemberships)) {
|
|
185
|
+
mergedMemberships[docId] = [];
|
|
186
|
+
}
|
|
187
|
+
for (const c of collections) {
|
|
188
|
+
if (!mergedMemberships[docId].includes(c)) {
|
|
189
|
+
mergedMemberships[docId].push(c);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
for (const op of event.operations) {
|
|
195
|
+
const action = op.operation.action;
|
|
196
|
+
if (action.type !== "ADD_RELATIONSHIP") {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const input = action.input;
|
|
200
|
+
if (!input?.sourceId || !input.targetId) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const collectionId = driveCollectionId(op.context.branch, input.sourceId);
|
|
204
|
+
if (!(input.targetId in mergedMemberships)) {
|
|
205
|
+
mergedMemberships[input.targetId] = [];
|
|
206
|
+
}
|
|
207
|
+
if (!mergedMemberships[input.targetId].includes(collectionId)) {
|
|
208
|
+
mergedMemberships[input.targetId].push(collectionId);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return mergedMemberships;
|
|
213
|
+
}
|
|
78
214
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/sync/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/sync/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,GAElB,MAAM,mCAAmC,CAAC;AAc3C;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAiB,EACjB,KAAoB;IAEpB,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,wBAAwB;IACxB,EAAE;IACF,6DAA6D;IAC7D,gEAAgE;IAChE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;gBACtC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAiB,EACjB,UAAkB;IAElB,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,wBAAwB;IACxB,EAAE;IACF,8DAA8D;IAC9D,yCAAyC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACnC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAkC,EAClC,MAAoB;IAEpB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QAC9B,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IACE,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YAC5B,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAClD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,KAAK,EAAE,MAAM;QACb,YAAY,EAAE,CAAC;KAChB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH;;;GAGG;AACH,MAAM,UAAU,sCAAsC,CAOpD,SAAc;IACd,OAAO,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC;QAC/D,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC;QAE/D,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,CAAC,CAAC;QAE3B,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,UAAkC;IAElC,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,YAAY,GAA2B,EAAE,CAAC;IAE9C,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IACE,YAAY,CAAC,MAAM,KAAK,CAAC;YACzB,YAAY,KAAK,IAAI;YACrB,YAAY,KAAK,IAAI,EACrB,CAAC;YACD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,UAAU,EAAE,YAAY;YACxB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;YACtC,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,YAAY;SACzB,CAAC,CAAC;QACH,YAAY,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;QACpC,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC/B,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YACrD,UAAU,EAAE,CAAC;YACb,YAAY,GAAG,KAAK,CAAC;YACrB,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,UAAU,EAAE,CAAC;IACb,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkC;IAC9D,OAAO,UAAU,CAAC,MAAM,CACtB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAC1E,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,UAAkC,EAClC,YAAoB,EACpB,qBAAgD;IAEhD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;QACzC,IAAI,CAAC,CAAC,UAAU,IAAI,qBAAqB,CAAC,EAAE,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAA0B;IAE1B,OAAO;QACL,SAAS,EAAE;YACT,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,MAAM,EAAE,KAAK,CAAC,MAAM;SACR;QACd,OAAO,EAAE;YACP,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,CAAC;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAA4B;IAE5B,MAAM,iBAAiB,GAA6B,EAAE,CAAC;IAEvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAC/C,KAAK,CAAC,qBAAqB,CAC5B,EAAE,CAAC;gBACF,IAAI,CAAC,CAAC,KAAK,IAAI,iBAAiB,CAAC,EAAE,CAAC;oBAClC,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAChC,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;oBAC5B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC1C,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,MAG3B,CAAC;YACF,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACvC,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1E,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,iBAAiB,CAAC,EAAE,CAAC;gBAC3C,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACzC,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9D,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
type OperationIndex = {
|
|
2
2
|
index: number;
|
|
3
3
|
skip: number;
|
|
4
|
-
id
|
|
5
|
-
timestampUtcMs
|
|
4
|
+
id: string;
|
|
5
|
+
timestampUtcMs: string;
|
|
6
6
|
};
|
|
7
7
|
/**
|
|
8
8
|
* Sorts operations by index and skip number.
|
|
@@ -10,9 +10,13 @@ type OperationIndex = {
|
|
|
10
10
|
*/
|
|
11
11
|
export declare function sortOperations<TOpIndex extends OperationIndex>(operations: TOpIndex[]): TOpIndex[];
|
|
12
12
|
/**
|
|
13
|
-
* Reshuffles operations by timestamp
|
|
13
|
+
* Reshuffles operations by timestamp, then original index, then ID.
|
|
14
14
|
* Used for merging concurrent operations from different branches.
|
|
15
15
|
*
|
|
16
|
+
* When timestamps are equal, operations are sorted by their original index to preserve
|
|
17
|
+
* ordering of operations created together (e.g., CREATE_DOCUMENT at index 0 must come
|
|
18
|
+
* before UPGRADE_DOCUMENT at index 1). ID is used as a final tiebreaker for determinism.
|
|
19
|
+
*
|
|
16
20
|
* Example:
|
|
17
21
|
* [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, 2:0, B3:0, B4:2, B5:0]
|
|
18
22
|
* GC => [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, B4:2, B5:0]
|
|
@@ -20,11 +24,17 @@ export declare function sortOperations<TOpIndex extends OperationIndex>(operatio
|
|
|
20
24
|
* Reshuffle(6:4) => [6:4, 7:0, 8:0, 9:0, 10:0, 11:0]
|
|
21
25
|
* merge => [0:0, 1:0, 6:4, 7:0, 8:0, 9:0, 10:0, 11:0]
|
|
22
26
|
*/
|
|
23
|
-
export declare function reshuffleByTimestamp<TOp extends OperationIndex>(startIndex:
|
|
27
|
+
export declare function reshuffleByTimestamp<TOp extends OperationIndex>(startIndex: {
|
|
28
|
+
index: number;
|
|
29
|
+
skip: number;
|
|
30
|
+
}, opsA: TOp[], opsB: TOp[]): TOp[];
|
|
24
31
|
/**
|
|
25
32
|
* Reshuffles operations by timestamp first, then by original index value.
|
|
26
33
|
* Used for merging concurrent operations while preserving index ordering for operations with same timestamp.
|
|
27
34
|
*/
|
|
28
|
-
export declare function reshuffleByTimestampAndIndex<TOp extends OperationIndex>(startIndex:
|
|
35
|
+
export declare function reshuffleByTimestampAndIndex<TOp extends OperationIndex>(startIndex: {
|
|
36
|
+
index: number;
|
|
37
|
+
skip: number;
|
|
38
|
+
}, opsA: TOp[], opsB: TOp[]): TOp[];
|
|
29
39
|
export {};
|
|
30
40
|
//# sourceMappingURL=reshuffle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reshuffle.d.ts","sourceRoot":"","sources":["../../../src/utils/reshuffle.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,
|
|
1
|
+
{"version":3,"file":"reshuffle.d.ts","sourceRoot":"","sources":["../../../src/utils/reshuffle.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,SAAS,cAAc,EAC5D,UAAU,EAAE,QAAQ,EAAE,GACrB,QAAQ,EAAE,CAKZ;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,SAAS,cAAc,EAC7D,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC3C,IAAI,EAAE,GAAG,EAAE,EACX,IAAI,EAAE,GAAG,EAAE,GACV,GAAG,EAAE,CAoBP;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,SAAS,cAAc,EACrE,UAAU,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC3C,IAAI,EAAE,GAAG,EAAE,EACX,IAAI,EAAE,GAAG,EAAE,GACV,GAAG,EAAE,CAoBP"}
|
|
@@ -9,9 +9,13 @@ export function sortOperations(operations) {
|
|
|
9
9
|
.sort((a, b) => a.index - b.index);
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Reshuffles operations by timestamp
|
|
12
|
+
* Reshuffles operations by timestamp, then original index, then ID.
|
|
13
13
|
* Used for merging concurrent operations from different branches.
|
|
14
14
|
*
|
|
15
|
+
* When timestamps are equal, operations are sorted by their original index to preserve
|
|
16
|
+
* ordering of operations created together (e.g., CREATE_DOCUMENT at index 0 must come
|
|
17
|
+
* before UPGRADE_DOCUMENT at index 1). ID is used as a final tiebreaker for determinism.
|
|
18
|
+
*
|
|
15
19
|
* Example:
|
|
16
20
|
* [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, 2:0, B3:0, B4:2, B5:0]
|
|
17
21
|
* GC => [0:0, 1:0, 2:0, A3:0, A4:0, A5:0] + [0:0, 1:0, B4:2, B5:0]
|
|
@@ -21,8 +25,18 @@ export function sortOperations(operations) {
|
|
|
21
25
|
*/
|
|
22
26
|
export function reshuffleByTimestamp(startIndex, opsA, opsB) {
|
|
23
27
|
return [...opsA, ...opsB]
|
|
24
|
-
.sort((a, b) =>
|
|
25
|
-
new Date(
|
|
28
|
+
.sort((a, b) => {
|
|
29
|
+
const timestampDiff = new Date(a.timestampUtcMs).getTime() -
|
|
30
|
+
new Date(b.timestampUtcMs).getTime();
|
|
31
|
+
if (timestampDiff !== 0) {
|
|
32
|
+
return timestampDiff;
|
|
33
|
+
}
|
|
34
|
+
const indexDiff = a.index - b.index;
|
|
35
|
+
if (indexDiff !== 0) {
|
|
36
|
+
return indexDiff;
|
|
37
|
+
}
|
|
38
|
+
return a.id.localeCompare(b.id);
|
|
39
|
+
})
|
|
26
40
|
.map((op, i) => ({
|
|
27
41
|
...op,
|
|
28
42
|
index: startIndex.index + i,
|
|
@@ -35,9 +49,18 @@ export function reshuffleByTimestamp(startIndex, opsA, opsB) {
|
|
|
35
49
|
*/
|
|
36
50
|
export function reshuffleByTimestampAndIndex(startIndex, opsA, opsB) {
|
|
37
51
|
return [...opsA, ...opsB]
|
|
38
|
-
.sort((a, b) =>
|
|
39
|
-
|
|
40
|
-
|
|
52
|
+
.sort((a, b) => {
|
|
53
|
+
const indexDiff = a.index - b.index;
|
|
54
|
+
if (indexDiff !== 0) {
|
|
55
|
+
return indexDiff;
|
|
56
|
+
}
|
|
57
|
+
const timestampDiff = new Date(a.timestampUtcMs).getTime() -
|
|
58
|
+
new Date(b.timestampUtcMs).getTime();
|
|
59
|
+
if (timestampDiff !== 0) {
|
|
60
|
+
return timestampDiff;
|
|
61
|
+
}
|
|
62
|
+
return a.id.localeCompare(b.id);
|
|
63
|
+
})
|
|
41
64
|
.map((op, i) => ({
|
|
42
65
|
...op,
|
|
43
66
|
index: startIndex.index + i,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reshuffle.js","sourceRoot":"","sources":["../../../src/utils/reshuffle.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAsB;IAEtB,OAAO,UAAU;SACd,KAAK,EAAE;SACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"reshuffle.js","sourceRoot":"","sources":["../../../src/utils/reshuffle.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAsB;IAEtB,OAAO,UAAU;SACd,KAAK,EAAE;SACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;SAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAA2C,EAC3C,IAAW,EACX,IAAW;IAEX,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,aAAa,GACjB,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;YACpC,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACpC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACf,GAAG,EAAE;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,GAAG,CAAC;QAC3B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACpC,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,UAA2C,EAC3C,IAAW,EACX,IAAW;IAEX,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACpC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,aAAa,GACjB,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;YACpC,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACf,GAAG,EAAE;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,GAAG,CAAC;QAC3B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACpC,CAAC,CAAC,CAAC;AACR,CAAC"}
|