@powerhousedao/reactor 6.0.0-dev.4 → 6.0.0-dev.41
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 +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 +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 +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 +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 +11 -13
- 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
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type MailboxItem, type MailboxCallback, type IMailbox } from "./mailbox.js";
|
|
2
|
+
export declare class BufferedMailbox<T extends MailboxItem> implements IMailbox<T> {
|
|
3
|
+
private itemsMap;
|
|
4
|
+
private addedCallbacks;
|
|
5
|
+
private removedCallbacks;
|
|
6
|
+
private addedBuffer;
|
|
7
|
+
private removedBuffer;
|
|
8
|
+
private addedTimer;
|
|
9
|
+
private removedTimer;
|
|
10
|
+
private readonly milliseconds;
|
|
11
|
+
private readonly maxQueued;
|
|
12
|
+
private paused;
|
|
13
|
+
constructor(milliseconds: number, maxQueued: number);
|
|
14
|
+
get items(): ReadonlyArray<T>;
|
|
15
|
+
get(id: string): T | undefined;
|
|
16
|
+
add(item: T): void;
|
|
17
|
+
remove(item: T): void;
|
|
18
|
+
onAdded(callback: MailboxCallback<T>): void;
|
|
19
|
+
onRemoved(callback: MailboxCallback<T>): void;
|
|
20
|
+
pause(): void;
|
|
21
|
+
resume(): void;
|
|
22
|
+
isPaused(): boolean;
|
|
23
|
+
flush(): void;
|
|
24
|
+
private scheduleAddedFlush;
|
|
25
|
+
private scheduleRemovedFlush;
|
|
26
|
+
private flushAdded;
|
|
27
|
+
private flushRemoved;
|
|
28
|
+
private invokeCallbacks;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=buffered-mailbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffered-mailbox.d.ts","sourceRoot":"","sources":["../../../src/sync/buffered-mailbox.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,QAAQ,EAEd,MAAM,cAAc,CAAC;AAEtB,qBAAa,eAAe,CAAC,CAAC,SAAS,WAAW,CAAE,YAAW,QAAQ,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAKnD,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;IAelB,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAerB,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;IAYb,MAAM,IAAI,IAAI;IAUd,QAAQ,IAAI,OAAO;IAInB,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,eAAe;CAgBxB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { MailboxAggregateError, } from "./mailbox.js";
|
|
2
|
+
export class BufferedMailbox {
|
|
3
|
+
itemsMap = new Map();
|
|
4
|
+
addedCallbacks = [];
|
|
5
|
+
removedCallbacks = [];
|
|
6
|
+
addedBuffer = [];
|
|
7
|
+
removedBuffer = [];
|
|
8
|
+
addedTimer = null;
|
|
9
|
+
removedTimer = null;
|
|
10
|
+
milliseconds;
|
|
11
|
+
maxQueued;
|
|
12
|
+
paused = false;
|
|
13
|
+
constructor(milliseconds, maxQueued) {
|
|
14
|
+
this.milliseconds = milliseconds;
|
|
15
|
+
this.maxQueued = maxQueued;
|
|
16
|
+
}
|
|
17
|
+
get items() {
|
|
18
|
+
return Array.from(this.itemsMap.values());
|
|
19
|
+
}
|
|
20
|
+
get(id) {
|
|
21
|
+
return this.itemsMap.get(id);
|
|
22
|
+
}
|
|
23
|
+
add(item) {
|
|
24
|
+
this.itemsMap.set(item.id, item);
|
|
25
|
+
this.addedBuffer.push(item);
|
|
26
|
+
if (this.paused) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (this.addedBuffer.length >= this.maxQueued) {
|
|
30
|
+
this.flushAdded();
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.scheduleAddedFlush();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
remove(item) {
|
|
37
|
+
this.itemsMap.delete(item.id);
|
|
38
|
+
this.removedBuffer.push(item);
|
|
39
|
+
if (this.paused) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (this.removedBuffer.length >= this.maxQueued) {
|
|
43
|
+
this.flushRemoved();
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this.scheduleRemovedFlush();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
onAdded(callback) {
|
|
50
|
+
this.addedCallbacks.push(callback);
|
|
51
|
+
}
|
|
52
|
+
onRemoved(callback) {
|
|
53
|
+
this.removedCallbacks.push(callback);
|
|
54
|
+
}
|
|
55
|
+
pause() {
|
|
56
|
+
this.paused = true;
|
|
57
|
+
if (this.addedTimer !== null) {
|
|
58
|
+
clearTimeout(this.addedTimer);
|
|
59
|
+
this.addedTimer = null;
|
|
60
|
+
}
|
|
61
|
+
if (this.removedTimer !== null) {
|
|
62
|
+
clearTimeout(this.removedTimer);
|
|
63
|
+
this.removedTimer = null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
resume() {
|
|
67
|
+
this.paused = false;
|
|
68
|
+
if (this.addedBuffer.length > 0) {
|
|
69
|
+
this.scheduleAddedFlush();
|
|
70
|
+
}
|
|
71
|
+
if (this.removedBuffer.length > 0) {
|
|
72
|
+
this.scheduleRemovedFlush();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
isPaused() {
|
|
76
|
+
return this.paused;
|
|
77
|
+
}
|
|
78
|
+
flush() {
|
|
79
|
+
this.flushAdded();
|
|
80
|
+
this.flushRemoved();
|
|
81
|
+
}
|
|
82
|
+
scheduleAddedFlush() {
|
|
83
|
+
if (this.addedTimer !== null) {
|
|
84
|
+
clearTimeout(this.addedTimer);
|
|
85
|
+
}
|
|
86
|
+
this.addedTimer = setTimeout(() => {
|
|
87
|
+
this.flushAdded();
|
|
88
|
+
}, this.milliseconds);
|
|
89
|
+
}
|
|
90
|
+
scheduleRemovedFlush() {
|
|
91
|
+
if (this.removedTimer !== null) {
|
|
92
|
+
clearTimeout(this.removedTimer);
|
|
93
|
+
}
|
|
94
|
+
this.removedTimer = setTimeout(() => {
|
|
95
|
+
this.flushRemoved();
|
|
96
|
+
}, this.milliseconds);
|
|
97
|
+
}
|
|
98
|
+
flushAdded() {
|
|
99
|
+
if (this.addedTimer !== null) {
|
|
100
|
+
clearTimeout(this.addedTimer);
|
|
101
|
+
this.addedTimer = null;
|
|
102
|
+
}
|
|
103
|
+
const items = this.addedBuffer;
|
|
104
|
+
this.addedBuffer = [];
|
|
105
|
+
if (items.length > 0) {
|
|
106
|
+
this.invokeCallbacks(this.addedCallbacks, items);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
flushRemoved() {
|
|
110
|
+
if (this.removedTimer !== null) {
|
|
111
|
+
clearTimeout(this.removedTimer);
|
|
112
|
+
this.removedTimer = null;
|
|
113
|
+
}
|
|
114
|
+
const items = this.removedBuffer;
|
|
115
|
+
this.removedBuffer = [];
|
|
116
|
+
if (items.length > 0) {
|
|
117
|
+
this.invokeCallbacks(this.removedCallbacks, items);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
invokeCallbacks(callbacks, items) {
|
|
121
|
+
const callbacksCopy = [...callbacks];
|
|
122
|
+
const errors = [];
|
|
123
|
+
for (const callback of callbacksCopy) {
|
|
124
|
+
try {
|
|
125
|
+
callback(items);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
errors.push(error instanceof Error ? error : new Error(String(error)));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (errors.length > 0) {
|
|
132
|
+
throw new MailboxAggregateError(errors);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=buffered-mailbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffered-mailbox.js","sourceRoot":"","sources":["../../../src/sync/buffered-mailbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
+
import type { IOperationIndex } from "../../cache/operation-index-types.js";
|
|
1
2
|
import type { ILogger } from "../../logging/types.js";
|
|
2
3
|
import type { ISyncCursorStorage } from "../../storage/interfaces.js";
|
|
3
4
|
import type { IChannel, IChannelFactory } from "../interfaces.js";
|
|
4
|
-
import type { ChannelConfig, RemoteFilter } from "../types.js";
|
|
5
|
+
import type { ChannelConfig, JwtHandler, RemoteFilter } from "../types.js";
|
|
5
6
|
/**
|
|
6
7
|
* Factory for creating channel instances of multiple types.
|
|
7
8
|
*
|
|
8
9
|
* Supports both "gql" channels for network-based synchronization and
|
|
9
10
|
* "internal" channels for in-process communication.
|
|
11
|
+
*
|
|
12
|
+
* The optional jwtHandler enables dynamic JWT token generation per-request
|
|
13
|
+
* for GQL channels, useful for short-lived tokens with audience-specific claims.
|
|
10
14
|
*/
|
|
11
15
|
export declare class CompositeChannelFactory implements IChannelFactory {
|
|
12
16
|
private readonly logger;
|
|
13
|
-
|
|
17
|
+
private readonly jwtHandler?;
|
|
18
|
+
constructor(logger: ILogger, jwtHandler?: JwtHandler);
|
|
14
19
|
/**
|
|
15
20
|
* Creates a new channel instance based on the configuration type.
|
|
16
21
|
*
|
|
@@ -20,10 +25,11 @@ export declare class CompositeChannelFactory implements IChannelFactory {
|
|
|
20
25
|
* @param cursorStorage - Storage for persisting synchronization cursors
|
|
21
26
|
* @param collectionId - Collection ID for filtering
|
|
22
27
|
* @param filter - Remote filter configuration
|
|
28
|
+
* @param operationIndex - Operation index for querying timestamps
|
|
23
29
|
* @returns A new channel instance
|
|
24
30
|
* @throws Error if config.type is not supported or required parameters are missing
|
|
25
31
|
*/
|
|
26
|
-
instance(remoteId: string, remoteName: string, config: ChannelConfig, cursorStorage: ISyncCursorStorage, collectionId: string, filter: RemoteFilter): IChannel;
|
|
32
|
+
instance(remoteId: string, remoteName: string, config: ChannelConfig, cursorStorage: ISyncCursorStorage, collectionId: string, filter: RemoteFilter, operationIndex: IOperationIndex): IChannel;
|
|
27
33
|
private createGqlChannel;
|
|
28
34
|
private createPollingChannel;
|
|
29
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composite-channel-factory.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/composite-channel-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"composite-channel-factory.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/composite-channel-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3E;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;gBAE7B,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,UAAU;IAKpD;;;;;;;;;;;;OAYG;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;IAsBX,OAAO,CAAC,gBAAgB;IAwExB,OAAO,CAAC,oBAAoB;CAO7B"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { GqlChannel } from "./gql-channel.js";
|
|
2
|
+
import { IntervalPollTimer } from "./interval-poll-timer.js";
|
|
2
3
|
import { PollingChannel } from "./polling-channel.js";
|
|
3
4
|
/**
|
|
4
5
|
* Factory for creating channel instances of multiple types.
|
|
5
6
|
*
|
|
6
7
|
* Supports both "gql" channels for network-based synchronization and
|
|
7
8
|
* "internal" channels for in-process communication.
|
|
9
|
+
*
|
|
10
|
+
* The optional jwtHandler enables dynamic JWT token generation per-request
|
|
11
|
+
* for GQL channels, useful for short-lived tokens with audience-specific claims.
|
|
8
12
|
*/
|
|
9
13
|
export class CompositeChannelFactory {
|
|
10
14
|
logger;
|
|
11
|
-
|
|
15
|
+
jwtHandler;
|
|
16
|
+
constructor(logger, jwtHandler) {
|
|
12
17
|
this.logger = logger;
|
|
18
|
+
this.jwtHandler = jwtHandler;
|
|
13
19
|
}
|
|
14
20
|
/**
|
|
15
21
|
* Creates a new channel instance based on the configuration type.
|
|
@@ -20,19 +26,20 @@ export class CompositeChannelFactory {
|
|
|
20
26
|
* @param cursorStorage - Storage for persisting synchronization cursors
|
|
21
27
|
* @param collectionId - Collection ID for filtering
|
|
22
28
|
* @param filter - Remote filter configuration
|
|
29
|
+
* @param operationIndex - Operation index for querying timestamps
|
|
23
30
|
* @returns A new channel instance
|
|
24
31
|
* @throws Error if config.type is not supported or required parameters are missing
|
|
25
32
|
*/
|
|
26
|
-
instance(remoteId, remoteName, config, cursorStorage, collectionId, filter) {
|
|
33
|
+
instance(remoteId, remoteName, config, cursorStorage, collectionId, filter, operationIndex) {
|
|
27
34
|
if (config.type === "gql") {
|
|
28
|
-
return this.createGqlChannel(remoteId, remoteName, config, cursorStorage, collectionId, filter);
|
|
35
|
+
return this.createGqlChannel(remoteId, remoteName, config, cursorStorage, collectionId, filter, operationIndex);
|
|
29
36
|
}
|
|
30
37
|
if (config.type === "polling") {
|
|
31
38
|
return this.createPollingChannel(remoteId, remoteName, cursorStorage);
|
|
32
39
|
}
|
|
33
40
|
throw new Error(`CompositeChannelFactory does not support channel type "${config.type}"`);
|
|
34
41
|
}
|
|
35
|
-
createGqlChannel(remoteId, remoteName, config, cursorStorage, collectionId, filter) {
|
|
42
|
+
createGqlChannel(remoteId, remoteName, config, cursorStorage, collectionId, filter, operationIndex) {
|
|
36
43
|
const url = config.parameters.url;
|
|
37
44
|
if (typeof url !== "string" || !url) {
|
|
38
45
|
throw new Error('CompositeChannelFactory requires "url" parameter for gql channels');
|
|
@@ -41,18 +48,14 @@ export class CompositeChannelFactory {
|
|
|
41
48
|
url,
|
|
42
49
|
collectionId,
|
|
43
50
|
filter,
|
|
51
|
+
jwtHandler: this.jwtHandler,
|
|
44
52
|
};
|
|
45
|
-
|
|
46
|
-
if (typeof config.parameters.authToken !== "string") {
|
|
47
|
-
throw new Error('"authToken" parameter must be a string');
|
|
48
|
-
}
|
|
49
|
-
gqlConfig.authToken = config.parameters.authToken;
|
|
50
|
-
}
|
|
53
|
+
let pollIntervalMs = 2000;
|
|
51
54
|
if (config.parameters.pollIntervalMs !== undefined) {
|
|
52
55
|
if (typeof config.parameters.pollIntervalMs !== "number") {
|
|
53
56
|
throw new Error('"pollIntervalMs" parameter must be a number');
|
|
54
57
|
}
|
|
55
|
-
|
|
58
|
+
pollIntervalMs = config.parameters.pollIntervalMs;
|
|
56
59
|
}
|
|
57
60
|
if (config.parameters.retryBaseDelayMs !== undefined) {
|
|
58
61
|
if (typeof config.parameters.retryBaseDelayMs !== "number") {
|
|
@@ -78,7 +81,8 @@ export class CompositeChannelFactory {
|
|
|
78
81
|
}
|
|
79
82
|
gqlConfig.fetchFn = config.parameters.fetchFn;
|
|
80
83
|
}
|
|
81
|
-
|
|
84
|
+
const pollTimer = new IntervalPollTimer(pollIntervalMs);
|
|
85
|
+
return new GqlChannel(this.logger, remoteId, remoteName, cursorStorage, gqlConfig, operationIndex, pollTimer);
|
|
82
86
|
}
|
|
83
87
|
createPollingChannel(remoteId, remoteName, cursorStorage) {
|
|
84
88
|
return new PollingChannel(remoteId, remoteName, cursorStorage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composite-channel-factory.js","sourceRoot":"","sources":["../../../../src/sync/channels/composite-channel-factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"composite-channel-factory.js","sourceRoot":"","sources":["../../../../src/sync/channels/composite-channel-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,31 @@
|
|
|
1
|
+
import type { IOperationIndex } from "../../cache/operation-index-types.js";
|
|
1
2
|
import type { ILogger } from "../../logging/types.js";
|
|
2
3
|
import type { ISyncCursorStorage } from "../../storage/interfaces.js";
|
|
3
4
|
import type { IChannel, IChannelFactory } from "../interfaces.js";
|
|
4
|
-
import type { ChannelConfig, RemoteFilter } from "../types.js";
|
|
5
|
+
import type { ChannelConfig, JwtHandler, RemoteFilter } from "../types.js";
|
|
5
6
|
/**
|
|
6
7
|
* Factory for creating GqlChannel instances.
|
|
7
8
|
*
|
|
8
9
|
* Extracts GraphQL-specific configuration from ChannelConfig.parameters and
|
|
9
10
|
* instantiates GqlChannel instances for network-based synchronization.
|
|
11
|
+
*
|
|
12
|
+
* The optional jwtHandler enables dynamic JWT token generation per-request,
|
|
13
|
+
* which is useful for short-lived tokens with audience-specific claims.
|
|
10
14
|
*/
|
|
11
15
|
export declare class GqlChannelFactory implements IChannelFactory {
|
|
12
16
|
private readonly logger;
|
|
13
|
-
|
|
17
|
+
private readonly jwtHandler?;
|
|
18
|
+
constructor(logger: ILogger, jwtHandler?: JwtHandler);
|
|
14
19
|
/**
|
|
15
20
|
* Creates a new GqlChannel instance with the given configuration.
|
|
16
21
|
* See GqlChannelConfig for the expected parameters.
|
|
17
22
|
*
|
|
18
23
|
* @param config - Channel configuration including type and parameters
|
|
19
24
|
* @param cursorStorage - Storage for persisting synchronization cursors
|
|
25
|
+
* @param operationIndex - Operation index for querying timestamps
|
|
20
26
|
* @returns A new GqlChannel instance
|
|
21
27
|
* @throws Error if config.type is not "gql" or required parameters are missing
|
|
22
28
|
*/
|
|
23
|
-
instance(remoteId: string, remoteName: string, config: ChannelConfig, cursorStorage: ISyncCursorStorage, collectionId: string, filter: RemoteFilter): IChannel;
|
|
29
|
+
instance(remoteId: string, remoteName: string, config: ChannelConfig, cursorStorage: ISyncCursorStorage, collectionId: string, filter: RemoteFilter, operationIndex: IOperationIndex): IChannel;
|
|
24
30
|
}
|
|
25
31
|
//# sourceMappingURL=gql-channel-factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gql-channel-factory.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"gql-channel-factory.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3E;;;;;;;;GAQG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;gBAE7B,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,UAAU;IAKpD;;;;;;;;;OASG;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;CAuEZ"}
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import { GqlChannel } from "./gql-channel.js";
|
|
2
|
+
import { IntervalPollTimer } from "./interval-poll-timer.js";
|
|
2
3
|
/**
|
|
3
4
|
* Factory for creating GqlChannel instances.
|
|
4
5
|
*
|
|
5
6
|
* Extracts GraphQL-specific configuration from ChannelConfig.parameters and
|
|
6
7
|
* instantiates GqlChannel instances for network-based synchronization.
|
|
8
|
+
*
|
|
9
|
+
* The optional jwtHandler enables dynamic JWT token generation per-request,
|
|
10
|
+
* which is useful for short-lived tokens with audience-specific claims.
|
|
7
11
|
*/
|
|
8
12
|
export class GqlChannelFactory {
|
|
9
13
|
logger;
|
|
10
|
-
|
|
14
|
+
jwtHandler;
|
|
15
|
+
constructor(logger, jwtHandler) {
|
|
11
16
|
this.logger = logger;
|
|
17
|
+
this.jwtHandler = jwtHandler;
|
|
12
18
|
}
|
|
13
19
|
/**
|
|
14
20
|
* Creates a new GqlChannel instance with the given configuration.
|
|
@@ -16,10 +22,11 @@ export class GqlChannelFactory {
|
|
|
16
22
|
*
|
|
17
23
|
* @param config - Channel configuration including type and parameters
|
|
18
24
|
* @param cursorStorage - Storage for persisting synchronization cursors
|
|
25
|
+
* @param operationIndex - Operation index for querying timestamps
|
|
19
26
|
* @returns A new GqlChannel instance
|
|
20
27
|
* @throws Error if config.type is not "gql" or required parameters are missing
|
|
21
28
|
*/
|
|
22
|
-
instance(remoteId, remoteName, config, cursorStorage, collectionId, filter) {
|
|
29
|
+
instance(remoteId, remoteName, config, cursorStorage, collectionId, filter, operationIndex) {
|
|
23
30
|
if (config.type !== "gql") {
|
|
24
31
|
throw new Error(`GqlChannelFactory can only create channels of type "gql", got "${config.type}"`);
|
|
25
32
|
}
|
|
@@ -33,18 +40,14 @@ export class GqlChannelFactory {
|
|
|
33
40
|
url,
|
|
34
41
|
collectionId,
|
|
35
42
|
filter,
|
|
43
|
+
jwtHandler: this.jwtHandler,
|
|
36
44
|
};
|
|
37
|
-
|
|
38
|
-
if (typeof config.parameters.authToken !== "string") {
|
|
39
|
-
throw new Error('"authToken" parameter must be a string');
|
|
40
|
-
}
|
|
41
|
-
gqlConfig.authToken = config.parameters.authToken;
|
|
42
|
-
}
|
|
45
|
+
let pollIntervalMs = 2000;
|
|
43
46
|
if (config.parameters.pollIntervalMs !== undefined) {
|
|
44
47
|
if (typeof config.parameters.pollIntervalMs !== "number") {
|
|
45
48
|
throw new Error('"pollIntervalMs" parameter must be a number');
|
|
46
49
|
}
|
|
47
|
-
|
|
50
|
+
pollIntervalMs = config.parameters.pollIntervalMs;
|
|
48
51
|
}
|
|
49
52
|
if (config.parameters.retryBaseDelayMs !== undefined) {
|
|
50
53
|
if (typeof config.parameters.retryBaseDelayMs !== "number") {
|
|
@@ -70,7 +73,8 @@ export class GqlChannelFactory {
|
|
|
70
73
|
}
|
|
71
74
|
gqlConfig.fetchFn = config.parameters.fetchFn;
|
|
72
75
|
}
|
|
73
|
-
|
|
76
|
+
const pollTimer = new IntervalPollTimer(pollIntervalMs);
|
|
77
|
+
return new GqlChannel(this.logger, remoteId, remoteName, cursorStorage, gqlConfig, operationIndex, pollTimer);
|
|
74
78
|
}
|
|
75
79
|
}
|
|
76
80
|
//# sourceMappingURL=gql-channel-factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gql-channel-factory.js","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel-factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gql-channel-factory.js","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
+
import type { IOperationIndex } from "../../cache/operation-index-types.js";
|
|
1
2
|
import type { ILogger } from "../../logging/types.js";
|
|
2
3
|
import type { ISyncCursorStorage } from "../../storage/interfaces.js";
|
|
3
4
|
import type { IChannel } from "../interfaces.js";
|
|
4
|
-
import {
|
|
5
|
+
import { type IMailbox } from "../mailbox.js";
|
|
5
6
|
import type { SyncOperation } from "../sync-operation.js";
|
|
6
|
-
import type { RemoteFilter } from "../types.js";
|
|
7
|
+
import type { JwtHandler, RemoteFilter } from "../types.js";
|
|
8
|
+
import type { IPollTimer } from "./poll-timer.js";
|
|
7
9
|
/**
|
|
8
10
|
* Configuration parameters for GqlChannel
|
|
9
11
|
*/
|
|
10
12
|
export type GqlChannelConfig = {
|
|
11
13
|
/** The GraphQL endpoint URL */
|
|
12
14
|
url: string;
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
/** Polling interval in milliseconds (default: 5000) */
|
|
16
|
-
pollIntervalMs?: number;
|
|
15
|
+
/** Dynamic JWT token handler for generating fresh tokens per-request */
|
|
16
|
+
jwtHandler?: JwtHandler;
|
|
17
17
|
/** Base delay for exponential backoff retries in milliseconds (default: 1000) */
|
|
18
18
|
retryBaseDelayMs?: number;
|
|
19
19
|
/** Maximum delay for exponential backoff retries in milliseconds (default: 300000) */
|
|
@@ -32,19 +32,21 @@ export type GqlChannelConfig = {
|
|
|
32
32
|
*/
|
|
33
33
|
export declare class GqlChannel implements IChannel {
|
|
34
34
|
private readonly logger;
|
|
35
|
-
readonly inbox:
|
|
36
|
-
readonly outbox:
|
|
37
|
-
readonly deadLetter:
|
|
35
|
+
readonly inbox: IMailbox<SyncOperation>;
|
|
36
|
+
readonly outbox: IMailbox<SyncOperation>;
|
|
37
|
+
readonly deadLetter: IMailbox<SyncOperation>;
|
|
38
|
+
readonly config: GqlChannelConfig;
|
|
39
|
+
private readonly bufferedOutbox;
|
|
38
40
|
private readonly channelId;
|
|
39
41
|
private readonly remoteName;
|
|
40
42
|
private readonly cursorStorage;
|
|
41
|
-
private readonly
|
|
43
|
+
private readonly operationIndex;
|
|
44
|
+
private readonly pollTimer;
|
|
42
45
|
private isShutdown;
|
|
43
|
-
private pollTimer?;
|
|
44
46
|
private failureCount;
|
|
45
47
|
private lastSuccessUtcMs?;
|
|
46
48
|
private lastFailureUtcMs?;
|
|
47
|
-
constructor(logger: ILogger, channelId: string, remoteName: string, cursorStorage: ISyncCursorStorage, config: GqlChannelConfig);
|
|
49
|
+
constructor(logger: ILogger, channelId: string, remoteName: string, cursorStorage: ISyncCursorStorage, config: GqlChannelConfig, operationIndex: IOperationIndex, pollTimer: IPollTimer);
|
|
48
50
|
/**
|
|
49
51
|
* Shuts down the channel and prevents further operations.
|
|
50
52
|
*/
|
|
@@ -53,10 +55,6 @@ export declare class GqlChannel implements IChannel {
|
|
|
53
55
|
* Initializes the channel by registering it on the remote server and starting polling.
|
|
54
56
|
*/
|
|
55
57
|
init(): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Starts the polling loop to fetch operations from the remote.
|
|
58
|
-
*/
|
|
59
|
-
private startPolling;
|
|
60
58
|
/**
|
|
61
59
|
* Polls the remote for new sync envelopes.
|
|
62
60
|
*/
|
|
@@ -82,9 +80,10 @@ export declare class GqlChannel implements IChannel {
|
|
|
82
80
|
*/
|
|
83
81
|
private handleOutboxAdded;
|
|
84
82
|
/**
|
|
85
|
-
* Pushes
|
|
83
|
+
* Pushes multiple sync operations to the remote via a single GraphQL mutation.
|
|
84
|
+
* Creates one SyncEnvelope per SyncOperation with key/dependsOn for batch ordering.
|
|
86
85
|
*/
|
|
87
|
-
private
|
|
86
|
+
private pushSyncOperations;
|
|
88
87
|
/**
|
|
89
88
|
* Serializes a SyncEnvelope for GraphQL transport.
|
|
90
89
|
*
|
|
@@ -97,6 +96,10 @@ export declare class GqlChannel implements IChannel {
|
|
|
97
96
|
* Serializes an action for GraphQL transport, converting signature tuples to strings.
|
|
98
97
|
*/
|
|
99
98
|
private serializeAction;
|
|
99
|
+
/**
|
|
100
|
+
* Gets the authorization header value using jwtHandler.
|
|
101
|
+
*/
|
|
102
|
+
private getAuthorizationHeader;
|
|
100
103
|
/**
|
|
101
104
|
* Executes a GraphQL query or mutation against the remote endpoint.
|
|
102
105
|
*/
|
|
@@ -114,5 +117,6 @@ export declare class GqlChannel implements IChannel {
|
|
|
114
117
|
lastFailureUtcMs?: number;
|
|
115
118
|
failureCount: number;
|
|
116
119
|
};
|
|
120
|
+
get poller(): IPollTimer;
|
|
117
121
|
}
|
|
118
122
|
//# sourceMappingURL=gql-channel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gql-channel.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"gql-channel.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel.ts"],"names":[],"mappings":"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"}
|