@powerhousedao/reactor 5.1.0-dev.3 → 5.1.0-dev.30

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.
Files changed (168) hide show
  1. package/dist/src/cache/document-meta-cache-types.d.ts +114 -0
  2. package/dist/src/cache/document-meta-cache-types.d.ts.map +1 -0
  3. package/dist/src/cache/document-meta-cache-types.js +2 -0
  4. package/dist/src/cache/document-meta-cache-types.js.map +1 -0
  5. package/dist/src/cache/document-meta-cache.d.ts +30 -0
  6. package/dist/src/cache/document-meta-cache.d.ts.map +1 -0
  7. package/dist/src/cache/document-meta-cache.js +128 -0
  8. package/dist/src/cache/document-meta-cache.js.map +1 -0
  9. package/dist/src/cache/kysely-operation-index.d.ts +4 -2
  10. package/dist/src/cache/kysely-operation-index.d.ts.map +1 -1
  11. package/dist/src/cache/kysely-operation-index.js +54 -0
  12. package/dist/src/cache/kysely-operation-index.js.map +1 -1
  13. package/dist/src/cache/kysely-write-cache.d.ts.map +1 -1
  14. package/dist/src/cache/kysely-write-cache.js +2 -1
  15. package/dist/src/cache/kysely-write-cache.js.map +1 -1
  16. package/dist/src/cache/operation-index-types.d.ts +3 -2
  17. package/dist/src/cache/operation-index-types.d.ts.map +1 -1
  18. package/dist/src/cache/operation-index-types.js.map +1 -1
  19. package/dist/src/client/reactor-client.d.ts +7 -8
  20. package/dist/src/client/reactor-client.d.ts.map +1 -1
  21. package/dist/src/client/reactor-client.js +48 -45
  22. package/dist/src/client/reactor-client.js.map +1 -1
  23. package/dist/src/client/types.d.ts +10 -10
  24. package/dist/src/client/types.d.ts.map +1 -1
  25. package/dist/src/core/reactor-builder.d.ts +15 -11
  26. package/dist/src/core/reactor-builder.d.ts.map +1 -1
  27. package/dist/src/core/reactor-builder.js +57 -19
  28. package/dist/src/core/reactor-builder.js.map +1 -1
  29. package/dist/src/core/{builder.d.ts → reactor-client-builder.d.ts} +12 -4
  30. package/dist/src/core/reactor-client-builder.d.ts.map +1 -0
  31. package/dist/src/core/{builder.js → reactor-client-builder.js} +44 -23
  32. package/dist/src/core/reactor-client-builder.js.map +1 -0
  33. package/dist/src/core/reactor.d.ts +12 -12
  34. package/dist/src/core/reactor.d.ts.map +1 -1
  35. package/dist/src/core/reactor.js +61 -36
  36. package/dist/src/core/reactor.js.map +1 -1
  37. package/dist/src/core/types.d.ts +49 -14
  38. package/dist/src/core/types.d.ts.map +1 -1
  39. package/dist/src/core/utils.d.ts +9 -1
  40. package/dist/src/core/utils.d.ts.map +1 -1
  41. package/dist/src/core/utils.js +30 -0
  42. package/dist/src/core/utils.js.map +1 -1
  43. package/dist/src/events/types.d.ts +1 -0
  44. package/dist/src/events/types.d.ts.map +1 -1
  45. package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -1
  46. package/dist/src/executor/simple-job-executor-manager.js +1 -0
  47. package/dist/src/executor/simple-job-executor-manager.js.map +1 -1
  48. package/dist/src/executor/simple-job-executor.d.ts +17 -2
  49. package/dist/src/executor/simple-job-executor.d.ts.map +1 -1
  50. package/dist/src/executor/simple-job-executor.js +283 -192
  51. package/dist/src/executor/simple-job-executor.js.map +1 -1
  52. package/dist/src/executor/util.d.ts +14 -5
  53. package/dist/src/executor/util.d.ts.map +1 -1
  54. package/dist/src/executor/util.js +36 -9
  55. package/dist/src/executor/util.js.map +1 -1
  56. package/dist/src/index.d.ts +12 -5
  57. package/dist/src/index.d.ts.map +1 -1
  58. package/dist/src/index.js +9 -3
  59. package/dist/src/index.js.map +1 -1
  60. package/dist/src/logging/console.d.ts +13 -0
  61. package/dist/src/logging/console.d.ts.map +1 -0
  62. package/dist/src/logging/console.js +77 -0
  63. package/dist/src/logging/console.js.map +1 -0
  64. package/dist/src/logging/types.d.ts +11 -0
  65. package/dist/src/logging/types.d.ts.map +1 -0
  66. package/dist/src/logging/types.js +2 -0
  67. package/dist/src/logging/types.js.map +1 -0
  68. package/dist/src/queue/types.d.ts +2 -0
  69. package/dist/src/queue/types.d.ts.map +1 -1
  70. package/dist/src/queue/types.js.map +1 -1
  71. package/dist/src/read-models/base-read-model.d.ts +60 -0
  72. package/dist/src/read-models/base-read-model.d.ts.map +1 -0
  73. package/dist/src/read-models/base-read-model.js +143 -0
  74. package/dist/src/read-models/base-read-model.js.map +1 -0
  75. package/dist/src/read-models/coordinator.d.ts +3 -1
  76. package/dist/src/read-models/coordinator.d.ts.map +1 -1
  77. package/dist/src/read-models/coordinator.js +8 -7
  78. package/dist/src/read-models/coordinator.js.map +1 -1
  79. package/dist/src/read-models/document-view.d.ts +6 -7
  80. package/dist/src/read-models/document-view.d.ts.map +1 -1
  81. package/dist/src/read-models/document-view.js +16 -81
  82. package/dist/src/read-models/document-view.js.map +1 -1
  83. package/dist/src/read-models/types.d.ts +2 -1
  84. package/dist/src/read-models/types.d.ts.map +1 -1
  85. package/dist/src/registry/implementation.d.ts +42 -34
  86. package/dist/src/registry/implementation.d.ts.map +1 -1
  87. package/dist/src/registry/implementation.js +168 -48
  88. package/dist/src/registry/implementation.js.map +1 -1
  89. package/dist/src/registry/interfaces.d.ts +69 -8
  90. package/dist/src/registry/interfaces.d.ts.map +1 -1
  91. package/dist/src/shared/errors.d.ts +24 -0
  92. package/dist/src/shared/errors.d.ts.map +1 -1
  93. package/dist/src/shared/errors.js +42 -0
  94. package/dist/src/shared/errors.js.map +1 -1
  95. package/dist/src/shared/types.d.ts +4 -0
  96. package/dist/src/shared/types.d.ts.map +1 -1
  97. package/dist/src/shared/types.js.map +1 -1
  98. package/dist/src/signer/passthrough-signer.d.ts +9 -3
  99. package/dist/src/signer/passthrough-signer.d.ts.map +1 -1
  100. package/dist/src/signer/passthrough-signer.js +13 -0
  101. package/dist/src/signer/passthrough-signer.js.map +1 -1
  102. package/dist/src/signer/types.d.ts +12 -10
  103. package/dist/src/signer/types.d.ts.map +1 -1
  104. package/dist/src/storage/consistency-aware-legacy-storage.d.ts +33 -0
  105. package/dist/src/storage/consistency-aware-legacy-storage.d.ts.map +1 -0
  106. package/dist/src/storage/consistency-aware-legacy-storage.js +65 -0
  107. package/dist/src/storage/consistency-aware-legacy-storage.js.map +1 -0
  108. package/dist/src/storage/interfaces.d.ts +81 -0
  109. package/dist/src/storage/interfaces.d.ts.map +1 -1
  110. package/dist/src/storage/interfaces.js.map +1 -1
  111. package/dist/src/storage/kysely/store.d.ts.map +1 -1
  112. package/dist/src/storage/kysely/store.js +1 -0
  113. package/dist/src/storage/kysely/store.js.map +1 -1
  114. package/dist/src/storage/migrations/008_create_view_state_table.d.ts +1 -1
  115. package/dist/src/storage/migrations/008_create_view_state_table.d.ts.map +1 -1
  116. package/dist/src/storage/migrations/008_create_view_state_table.js +2 -1
  117. package/dist/src/storage/migrations/008_create_view_state_table.js.map +1 -1
  118. package/dist/src/storage/migrations/run-migrations.js +3 -3
  119. package/dist/src/storage/migrations/run-migrations.js.map +1 -1
  120. package/dist/src/subs/subscription-notification-read-model.d.ts +16 -0
  121. package/dist/src/subs/subscription-notification-read-model.d.ts.map +1 -0
  122. package/dist/src/subs/subscription-notification-read-model.js +51 -0
  123. package/dist/src/subs/subscription-notification-read-model.js.map +1 -0
  124. package/dist/src/sync/channels/composite-channel-factory.d.ts +27 -0
  125. package/dist/src/sync/channels/composite-channel-factory.d.ts.map +1 -0
  126. package/dist/src/sync/channels/composite-channel-factory.js +83 -0
  127. package/dist/src/sync/channels/composite-channel-factory.js.map +1 -0
  128. package/dist/src/sync/channels/gql-channel-factory.d.ts +2 -2
  129. package/dist/src/sync/channels/gql-channel-factory.d.ts.map +1 -1
  130. package/dist/src/sync/channels/gql-channel-factory.js +3 -1
  131. package/dist/src/sync/channels/gql-channel-factory.js.map +1 -1
  132. package/dist/src/sync/channels/gql-channel.d.ts +21 -0
  133. package/dist/src/sync/channels/gql-channel.d.ts.map +1 -1
  134. package/dist/src/sync/channels/gql-channel.js +108 -13
  135. package/dist/src/sync/channels/gql-channel.js.map +1 -1
  136. package/dist/src/sync/channels/index.d.ts +2 -1
  137. package/dist/src/sync/channels/index.d.ts.map +1 -1
  138. package/dist/src/sync/channels/index.js +2 -1
  139. package/dist/src/sync/channels/index.js.map +1 -1
  140. package/dist/src/sync/channels/polling-channel.d.ts +39 -0
  141. package/dist/src/sync/channels/polling-channel.d.ts.map +1 -0
  142. package/dist/src/sync/channels/polling-channel.js +70 -0
  143. package/dist/src/sync/channels/polling-channel.js.map +1 -0
  144. package/dist/src/sync/channels/utils.d.ts +4 -2
  145. package/dist/src/sync/channels/utils.d.ts.map +1 -1
  146. package/dist/src/sync/channels/utils.js +52 -6
  147. package/dist/src/sync/channels/utils.js.map +1 -1
  148. package/dist/src/sync/errors.d.ts +1 -1
  149. package/dist/src/sync/errors.d.ts.map +1 -1
  150. package/dist/src/sync/errors.js +2 -2
  151. package/dist/src/sync/errors.js.map +1 -1
  152. package/dist/src/sync/index.d.ts +2 -2
  153. package/dist/src/sync/index.d.ts.map +1 -1
  154. package/dist/src/sync/index.js +2 -2
  155. package/dist/src/sync/index.js.map +1 -1
  156. package/dist/src/sync/interfaces.d.ts +16 -1
  157. package/dist/src/sync/interfaces.d.ts.map +1 -1
  158. package/dist/src/sync/sync-manager.d.ts +1 -0
  159. package/dist/src/sync/sync-manager.d.ts.map +1 -1
  160. package/dist/src/sync/sync-manager.js +52 -4
  161. package/dist/src/sync/sync-manager.js.map +1 -1
  162. package/package.json +4 -4
  163. package/dist/src/core/builder.d.ts.map +0 -1
  164. package/dist/src/core/builder.js.map +0 -1
  165. package/dist/src/sync/channels/internal-channel.d.ts +0 -57
  166. package/dist/src/sync/channels/internal-channel.d.ts.map +0 -1
  167. package/dist/src/sync/channels/internal-channel.js +0 -106
  168. package/dist/src/sync/channels/internal-channel.js.map +0 -1
@@ -0,0 +1,83 @@
1
+ import { GqlChannel } from "./gql-channel.js";
2
+ import { PollingChannel } from "./polling-channel.js";
3
+ /**
4
+ * Factory for creating channel instances of multiple types.
5
+ *
6
+ * Supports both "gql" channels for network-based synchronization and
7
+ * "internal" channels for in-process communication.
8
+ */
9
+ export class CompositeChannelFactory {
10
+ /**
11
+ * Creates a new channel instance based on the configuration type.
12
+ *
13
+ * @param remoteId - Unique identifier for the remote
14
+ * @param remoteName - Human-readable name for the remote
15
+ * @param config - Channel configuration including type and parameters
16
+ * @param cursorStorage - Storage for persisting synchronization cursors
17
+ * @param collectionId - Collection ID for filtering
18
+ * @param filter - Remote filter configuration
19
+ * @returns A new channel instance
20
+ * @throws Error if config.type is not supported or required parameters are missing
21
+ */
22
+ instance(remoteId, remoteName, config, cursorStorage, collectionId, filter) {
23
+ if (config.type === "gql") {
24
+ return this.createGqlChannel(remoteId, remoteName, config, cursorStorage, collectionId, filter);
25
+ }
26
+ if (config.type === "polling") {
27
+ return this.createPollingChannel(remoteId, remoteName, cursorStorage);
28
+ }
29
+ throw new Error(`CompositeChannelFactory does not support channel type "${config.type}"`);
30
+ }
31
+ createGqlChannel(remoteId, remoteName, config, cursorStorage, collectionId, filter) {
32
+ const url = config.parameters.url;
33
+ if (typeof url !== "string" || !url) {
34
+ throw new Error('CompositeChannelFactory requires "url" parameter for gql channels');
35
+ }
36
+ const gqlConfig = {
37
+ url,
38
+ collectionId,
39
+ filter,
40
+ };
41
+ if (config.parameters.authToken !== undefined) {
42
+ if (typeof config.parameters.authToken !== "string") {
43
+ throw new Error('"authToken" parameter must be a string');
44
+ }
45
+ gqlConfig.authToken = config.parameters.authToken;
46
+ }
47
+ if (config.parameters.pollIntervalMs !== undefined) {
48
+ if (typeof config.parameters.pollIntervalMs !== "number") {
49
+ throw new Error('"pollIntervalMs" parameter must be a number');
50
+ }
51
+ gqlConfig.pollIntervalMs = config.parameters.pollIntervalMs;
52
+ }
53
+ if (config.parameters.retryBaseDelayMs !== undefined) {
54
+ if (typeof config.parameters.retryBaseDelayMs !== "number") {
55
+ throw new Error('"retryBaseDelayMs" parameter must be a number');
56
+ }
57
+ gqlConfig.retryBaseDelayMs = config.parameters.retryBaseDelayMs;
58
+ }
59
+ if (config.parameters.retryMaxDelayMs !== undefined) {
60
+ if (typeof config.parameters.retryMaxDelayMs !== "number") {
61
+ throw new Error('"retryMaxDelayMs" parameter must be a number');
62
+ }
63
+ gqlConfig.retryMaxDelayMs = config.parameters.retryMaxDelayMs;
64
+ }
65
+ if (config.parameters.maxFailures !== undefined) {
66
+ if (typeof config.parameters.maxFailures !== "number") {
67
+ throw new Error('"maxFailures" parameter must be a number');
68
+ }
69
+ gqlConfig.maxFailures = config.parameters.maxFailures;
70
+ }
71
+ if (config.parameters.fetchFn !== undefined) {
72
+ if (typeof config.parameters.fetchFn !== "function") {
73
+ throw new Error('"fetchFn" parameter must be a function');
74
+ }
75
+ gqlConfig.fetchFn = config.parameters.fetchFn;
76
+ }
77
+ return new GqlChannel(remoteId, remoteName, cursorStorage, gqlConfig);
78
+ }
79
+ createPollingChannel(remoteId, remoteName, cursorStorage) {
80
+ return new PollingChannel(remoteId, remoteName, cursorStorage);
81
+ }
82
+ }
83
+ //# sourceMappingURL=composite-channel-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-channel-factory.js","sourceRoot":"","sources":["../../../../src/sync/channels/composite-channel-factory.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { ISyncCursorStorage } from "../../storage/interfaces.js";
2
2
  import type { IChannel, IChannelFactory } from "../interfaces.js";
3
- import type { ChannelConfig } from "../types.js";
3
+ import type { ChannelConfig, RemoteFilter } from "../types.js";
4
4
  /**
5
5
  * Factory for creating GqlChannel instances.
6
6
  *
@@ -17,6 +17,6 @@ export declare class GqlChannelFactory implements IChannelFactory {
17
17
  * @returns A new GqlChannel instance
18
18
  * @throws Error if config.type is not "gql" or required parameters are missing
19
19
  */
20
- instance(remoteId: string, remoteName: string, config: ChannelConfig, cursorStorage: ISyncCursorStorage): IChannel;
20
+ instance(remoteId: string, remoteName: string, config: ChannelConfig, cursorStorage: ISyncCursorStorage, collectionId: string, filter: RemoteFilter): IChannel;
21
21
  }
22
22
  //# 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,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACvD;;;;;;;;OAQG;IACH,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,kBAAkB,GAChC,QAAQ;CAgEZ"}
1
+ {"version":3,"file":"gql-channel-factory.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel-factory.ts"],"names":[],"mappings":"AAAA,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;AAG/D;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACvD;;;;;;;;OAQG;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,GACnB,QAAQ;CAkEZ"}
@@ -15,7 +15,7 @@ export class GqlChannelFactory {
15
15
  * @returns A new GqlChannel instance
16
16
  * @throws Error if config.type is not "gql" or required parameters are missing
17
17
  */
18
- instance(remoteId, remoteName, config, cursorStorage) {
18
+ instance(remoteId, remoteName, config, cursorStorage, collectionId, filter) {
19
19
  if (config.type !== "gql") {
20
20
  throw new Error(`GqlChannelFactory can only create channels of type "gql", got "${config.type}"`);
21
21
  }
@@ -27,6 +27,8 @@ export class GqlChannelFactory {
27
27
  // Extract optional parameters with validation
28
28
  const gqlConfig = {
29
29
  url,
30
+ collectionId,
31
+ filter,
30
32
  };
31
33
  if (config.parameters.authToken !== undefined) {
32
34
  if (typeof config.parameters.authToken !== "string") {
@@ -1 +1 @@
1
- {"version":3,"file":"gql-channel-factory.js","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gql-channel-factory.js","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel-factory.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { ISyncCursorStorage } from "../../storage/interfaces.js";
2
2
  import type { IChannel } from "../interfaces.js";
3
3
  import { Mailbox } from "../mailbox.js";
4
4
  import type { SyncOperation } from "../sync-operation.js";
5
+ import type { RemoteFilter } from "../types.js";
5
6
  /**
6
7
  * Configuration parameters for GqlChannel
7
8
  */
@@ -20,6 +21,10 @@ export type GqlChannelConfig = {
20
21
  maxFailures?: number;
21
22
  /** Custom fetch function for testing (default: global fetch) */
22
23
  fetchFn?: typeof fetch;
24
+ /** Collection ID to synchronize */
25
+ collectionId: string;
26
+ /** Filter to apply to operations */
27
+ filter: RemoteFilter;
23
28
  };
24
29
  /**
25
30
  * GraphQL-based synchronization channel for network communication between reactors.
@@ -42,6 +47,10 @@ export declare class GqlChannel implements IChannel {
42
47
  * Shuts down the channel and prevents further operations.
43
48
  */
44
49
  shutdown(): void;
50
+ /**
51
+ * Initializes the channel by registering it on the remote server and starting polling.
52
+ */
53
+ init(): Promise<void>;
45
54
  /**
46
55
  * Starts the polling loop to fetch operations from the remote.
47
56
  */
@@ -58,6 +67,10 @@ export declare class GqlChannel implements IChannel {
58
67
  * Queries the remote GraphQL endpoint for sync envelopes.
59
68
  */
60
69
  private pollSyncEnvelopes;
70
+ /**
71
+ * Registers or updates this channel on the remote server via GraphQL mutation.
72
+ */
73
+ private touchRemoteChannel;
61
74
  /**
62
75
  * Handles sync operations added to the outbox by sending them to the remote.
63
76
  */
@@ -68,8 +81,16 @@ export declare class GqlChannel implements IChannel {
68
81
  private pushSyncOperation;
69
82
  /**
70
83
  * Serializes a SyncEnvelope for GraphQL transport.
84
+ *
85
+ * Signatures are serialized as comma-separated strings since GraphQL schema
86
+ * defines them as [String!]!. Extra context fields (resultingState, ordinal)
87
+ * are stripped since they are not defined in OperationContextInput.
71
88
  */
72
89
  private serializeEnvelope;
90
+ /**
91
+ * Serializes an action for GraphQL transport, converting signature tuples to strings.
92
+ */
93
+ private serializeAction;
73
94
  /**
74
95
  * Executes a GraphQL query or mutation against the remote endpoint.
75
96
  */
@@ -1 +1 @@
1
- {"version":3,"file":"gql-channel.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,qBAAa,UAAW,YAAW,QAAQ;IACzC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAE5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,OAAO,CAAC,gBAAgB,CAAC,CAAS;gBAGhC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,kBAAkB,EACjC,MAAM,EAAE,gBAAgB;IA6B1B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAQhB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;YACW,IAAI;IAuClB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;YACW,iBAAiB;IAkD/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;YACW,iBAAiB;IA6B/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;YACW,cAAc;IA4D5B;;OAEG;IACG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD;;OAEG;IACH,SAAS,IAAI;QACX,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;QACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB;CAaF"}
1
+ {"version":3,"file":"gql-channel.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAgB,YAAY,EAAgB,MAAM,aAAa,CAAC;AAI5E;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,qBAAa,UAAW,YAAW,QAAQ;IACzC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAE5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,OAAO,CAAC,gBAAgB,CAAC,CAAS;gBAGhC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,kBAAkB,EACjC,MAAM,EAAE,gBAAgB;IA4B1B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAQhB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;YACW,IAAI;IAsDlB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;YACW,iBAAiB;IA2E/B;;OAEG;YACW,kBAAkB;IAuBhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;YACW,iBAAiB;IA6B/B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;YACW,cAAc;IA4D5B;;OAEG;IACG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD;;OAEG;IACH,SAAS,IAAI;QACX,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;QACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB;CAaF"}
@@ -30,6 +30,8 @@ export class GqlChannel {
30
30
  retryMaxDelayMs: config.retryMaxDelayMs ?? 300000,
31
31
  maxFailures: config.maxFailures ?? 5,
32
32
  fetchFn: config.fetchFn,
33
+ collectionId: config.collectionId,
34
+ filter: config.filter,
33
35
  };
34
36
  this.isShutdown = false;
35
37
  this.failureCount = 0;
@@ -39,8 +41,6 @@ export class GqlChannel {
39
41
  this.outbox.onAdded((syncOp) => {
40
42
  this.handleOutboxAdded(syncOp);
41
43
  });
42
- // Start polling
43
- this.startPolling();
44
44
  }
45
45
  /**
46
46
  * Shuts down the channel and prevents further operations.
@@ -52,6 +52,13 @@ export class GqlChannel {
52
52
  this.pollTimer = undefined;
53
53
  }
54
54
  }
55
+ /**
56
+ * Initializes the channel by registering it on the remote server and starting polling.
57
+ */
58
+ async init() {
59
+ await this.touchRemoteChannel();
60
+ this.startPolling();
61
+ }
55
62
  /**
56
63
  * Starts the polling loop to fetch operations from the remote.
57
64
  */
@@ -59,11 +66,11 @@ export class GqlChannel {
59
66
  if (this.isShutdown) {
60
67
  return;
61
68
  }
62
- this.pollTimer = setTimeout(() => {
63
- void this.poll().then(() => {
69
+ void this.poll().then(() => {
70
+ this.pollTimer = setTimeout(() => {
64
71
  this.startPolling(); // Schedule next poll
65
- });
66
- }, this.config.pollIntervalMs);
72
+ }, this.config.pollIntervalMs);
73
+ });
67
74
  }
68
75
  /**
69
76
  * Polls the remote for new sync envelopes.
@@ -92,12 +99,25 @@ export class GqlChannel {
92
99
  this.handlePollError(error);
93
100
  return;
94
101
  }
102
+ let maxCursorOrdinal = cursorOrdinal;
95
103
  for (const envelope of envelopes) {
96
- if (envelope.type === "operations" && envelope.operations) {
104
+ if (envelope.type.toLowerCase() === "operations" && envelope.operations) {
97
105
  const syncOp = envelopeToSyncOperation(envelope, this.remoteName);
98
106
  syncOp.transported();
99
107
  this.inbox.add(syncOp);
100
108
  }
109
+ if (envelope.cursor && envelope.cursor.cursorOrdinal > maxCursorOrdinal) {
110
+ maxCursorOrdinal = envelope.cursor.cursorOrdinal;
111
+ }
112
+ }
113
+ if (maxCursorOrdinal > cursorOrdinal) {
114
+ try {
115
+ await this.updateCursor(maxCursorOrdinal);
116
+ }
117
+ catch (error) {
118
+ this.handlePollError(error);
119
+ return;
120
+ }
101
121
  }
102
122
  this.lastSuccessUtcMs = Date.now();
103
123
  this.failureCount = 0;
@@ -133,16 +153,41 @@ export class GqlChannel {
133
153
  hash
134
154
  skip
135
155
  error
136
- resultingState
137
156
  id
138
- action
157
+ action {
158
+ id
159
+ type
160
+ timestampUtcMs
161
+ input
162
+ scope
163
+ attachments {
164
+ data
165
+ mimeType
166
+ hash
167
+ extension
168
+ fileName
169
+ }
170
+ context {
171
+ signer {
172
+ user {
173
+ address
174
+ networkId
175
+ chainId
176
+ }
177
+ app {
178
+ name
179
+ key
180
+ }
181
+ signatures
182
+ }
183
+ }
184
+ }
139
185
  }
140
186
  context {
141
187
  documentId
142
188
  documentType
143
189
  scope
144
190
  branch
145
- resultingState
146
191
  }
147
192
  }
148
193
  cursor {
@@ -160,6 +205,29 @@ export class GqlChannel {
160
205
  const response = await this.executeGraphQL(query, variables);
161
206
  return response.pollSyncEnvelopes;
162
207
  }
208
+ /**
209
+ * Registers or updates this channel on the remote server via GraphQL mutation.
210
+ */
211
+ async touchRemoteChannel() {
212
+ const mutation = `
213
+ mutation TouchChannel($input: TouchChannelInput!) {
214
+ touchChannel(input: $input)
215
+ }
216
+ `;
217
+ const variables = {
218
+ input: {
219
+ id: this.channelId,
220
+ name: this.channelId,
221
+ collectionId: this.config.collectionId,
222
+ filter: {
223
+ documentId: this.config.filter.documentId,
224
+ scope: this.config.filter.scope,
225
+ branch: this.config.filter.branch,
226
+ },
227
+ },
228
+ };
229
+ await this.executeGraphQL(mutation, variables);
230
+ }
163
231
  /**
164
232
  * Handles sync operations added to the outbox by sending them to the remote.
165
233
  */
@@ -201,6 +269,10 @@ export class GqlChannel {
201
269
  }
202
270
  /**
203
271
  * Serializes a SyncEnvelope for GraphQL transport.
272
+ *
273
+ * Signatures are serialized as comma-separated strings since GraphQL schema
274
+ * defines them as [String!]!. Extra context fields (resultingState, ordinal)
275
+ * are stripped since they are not defined in OperationContextInput.
204
276
  */
205
277
  serializeEnvelope(envelope) {
206
278
  return {
@@ -213,15 +285,38 @@ export class GqlChannel {
213
285
  hash: opWithContext.operation.hash,
214
286
  skip: opWithContext.operation.skip,
215
287
  error: opWithContext.operation.error,
216
- resultingState: opWithContext.operation.resultingState,
217
288
  id: opWithContext.operation.id,
218
- action: opWithContext.operation.action,
289
+ action: this.serializeAction(opWithContext.operation.action),
290
+ },
291
+ context: {
292
+ documentId: opWithContext.context.documentId,
293
+ documentType: opWithContext.context.documentType,
294
+ scope: opWithContext.context.scope,
295
+ branch: opWithContext.context.branch,
219
296
  },
220
- context: opWithContext.context,
221
297
  })),
222
298
  cursor: envelope.cursor,
223
299
  };
224
300
  }
301
+ /**
302
+ * Serializes an action for GraphQL transport, converting signature tuples to strings.
303
+ */
304
+ serializeAction(action) {
305
+ const signer = action.context?.signer;
306
+ if (!signer?.signatures) {
307
+ return action;
308
+ }
309
+ return {
310
+ ...action,
311
+ context: {
312
+ ...action.context,
313
+ signer: {
314
+ ...signer,
315
+ signatures: signer.signatures.map((sig) => Array.isArray(sig) ? sig.join(", ") : sig),
316
+ },
317
+ },
318
+ };
319
+ }
225
320
  /**
226
321
  * Executes a GraphQL query or mutation against the remote endpoint.
227
322
  */
@@ -1 +1 @@
1
- {"version":3,"file":"gql-channel.js","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gql-channel.js","sourceRoot":"","sources":["../../../../src/sync/channels/gql-channel.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- export { InternalChannel } from "./internal-channel.js";
1
+ export { PollingChannel } from "./polling-channel.js";
2
2
  export { GqlChannel, type GqlChannelConfig } from "./gql-channel.js";
3
3
  export { GqlChannelFactory } from "./gql-channel-factory.js";
4
+ export { CompositeChannelFactory } from "./composite-channel-factory.js";
4
5
  export { envelopeToSyncOperation } from "./utils.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
@@ -1,5 +1,6 @@
1
- export { InternalChannel } from "./internal-channel.js";
1
+ export { PollingChannel } from "./polling-channel.js";
2
2
  export { GqlChannel } from "./gql-channel.js";
3
3
  export { GqlChannelFactory } from "./gql-channel-factory.js";
4
+ export { CompositeChannelFactory } from "./composite-channel-factory.js";
4
5
  export { envelopeToSyncOperation } from "./utils.js";
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sync/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAyB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sync/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAyB,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { ISyncCursorStorage } from "../../storage/interfaces.js";
2
+ import type { IChannel } from "../interfaces.js";
3
+ import type { SyncOperation } from "../sync-operation.js";
4
+ import { Mailbox } from "../mailbox.js";
5
+ import type { SyncEnvelope } from "../types.js";
6
+ /**
7
+ * Channel for cursor-based polling by external clients.
8
+ *
9
+ * PollingChannel does NOT auto-remove operations from the outbox.
10
+ * Operations remain until explicitly acknowledged via cursor
11
+ * advancement through updateCursor().
12
+ */
13
+ export declare class PollingChannel implements IChannel {
14
+ readonly inbox: Mailbox<SyncOperation>;
15
+ readonly outbox: Mailbox<SyncOperation>;
16
+ readonly deadLetter: Mailbox<SyncOperation>;
17
+ private readonly channelId;
18
+ private readonly remoteName;
19
+ private readonly cursorStorage;
20
+ private isShutdown;
21
+ constructor(channelId: string, remoteName: string, cursorStorage: ISyncCursorStorage);
22
+ shutdown(): void;
23
+ init(): Promise<void>;
24
+ /**
25
+ * Receives a sync envelope from a peer channel.
26
+ *
27
+ * @param envelope - The sync envelope to receive
28
+ * @throws {PollingChannelError} If channel is shutdown
29
+ */
30
+ receive(envelope: SyncEnvelope): void;
31
+ /**
32
+ * Advances the cursor and removes acknowledged operations from outbox.
33
+ * Operations with ordinal <= cursorOrdinal are considered acknowledged.
34
+ *
35
+ * @param cursorOrdinal - The last processed ordinal (exclusive)
36
+ */
37
+ updateCursor(cursorOrdinal: number): Promise<void>;
38
+ }
39
+ //# sourceMappingURL=polling-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling-channel.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/polling-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAgB,YAAY,EAAE,MAAM,aAAa,CAAC;AAG9D;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAE5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,UAAU,CAAU;gBAG1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,kBAAkB;IAYnC,QAAQ,IAAI,IAAI;IAIV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAcrC;;;;;OAKG;IACG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBzD"}
@@ -0,0 +1,70 @@
1
+ import { PollingChannelError } from "../errors.js";
2
+ import { Mailbox } from "../mailbox.js";
3
+ import { envelopeToSyncOperation } from "./utils.js";
4
+ /**
5
+ * Channel for cursor-based polling by external clients.
6
+ *
7
+ * PollingChannel does NOT auto-remove operations from the outbox.
8
+ * Operations remain until explicitly acknowledged via cursor
9
+ * advancement through updateCursor().
10
+ */
11
+ export class PollingChannel {
12
+ inbox;
13
+ outbox;
14
+ deadLetter;
15
+ channelId;
16
+ remoteName;
17
+ cursorStorage;
18
+ isShutdown;
19
+ constructor(channelId, remoteName, cursorStorage) {
20
+ this.channelId = channelId;
21
+ this.remoteName = remoteName;
22
+ this.cursorStorage = cursorStorage;
23
+ this.isShutdown = false;
24
+ this.inbox = new Mailbox();
25
+ this.outbox = new Mailbox();
26
+ this.deadLetter = new Mailbox();
27
+ }
28
+ shutdown() {
29
+ this.isShutdown = true;
30
+ }
31
+ async init() { }
32
+ /**
33
+ * Receives a sync envelope from a peer channel.
34
+ *
35
+ * @param envelope - The sync envelope to receive
36
+ * @throws {PollingChannelError} If channel is shutdown
37
+ */
38
+ receive(envelope) {
39
+ if (this.isShutdown) {
40
+ throw new PollingChannelError(`Channel ${this.channelId} is shutdown and cannot receive envelopes`);
41
+ }
42
+ if (envelope.type === "operations" && envelope.operations) {
43
+ const syncOp = envelopeToSyncOperation(envelope, this.remoteName);
44
+ syncOp.transported();
45
+ this.inbox.add(syncOp);
46
+ }
47
+ }
48
+ /**
49
+ * Advances the cursor and removes acknowledged operations from outbox.
50
+ * Operations with ordinal <= cursorOrdinal are considered acknowledged.
51
+ *
52
+ * @param cursorOrdinal - The last processed ordinal (exclusive)
53
+ */
54
+ async updateCursor(cursorOrdinal) {
55
+ const cursor = {
56
+ remoteName: this.remoteName,
57
+ cursorOrdinal,
58
+ lastSyncedAtUtcMs: Date.now(),
59
+ };
60
+ await this.cursorStorage.upsert(cursor);
61
+ for (const op of this.outbox.items) {
62
+ const maxOrdinal = Math.max(...op.operations.map((o) => o.operation.index));
63
+ if (maxOrdinal <= cursorOrdinal) {
64
+ op.executed();
65
+ this.outbox.remove(op);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=polling-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling-channel.js","sourceRoot":"","sources":["../../../../src/sync/channels/polling-channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IAChB,KAAK,CAAyB;IAC9B,MAAM,CAAyB;IAC/B,UAAU,CAAyB;IAE3B,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,aAAa,CAAqB;IAC3C,UAAU,CAAU;IAE5B,YACE,SAAiB,EACjB,UAAkB,EAClB,aAAiC;QAEjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,EAAiB,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAiB,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,EAAiB,CAAC;IACjD,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,KAAmB,CAAC;IAE9B;;;;;OAKG;IACH,OAAO,CAAC,QAAsB;QAC5B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,mBAAmB,CAC3B,WAAW,IAAI,CAAC,SAAS,2CAA2C,CACrE,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAClE,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,aAAqB;QACtC,MAAM,MAAM,GAAiB;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,aAAa;YACb,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE;SAC9B,CAAC;QAEF,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAExC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAC/C,CAAC;YACF,IAAI,UAAU,IAAI,aAAa,EAAE,CAAC;gBAChC,EAAE,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -4,11 +4,13 @@ import type { SyncEnvelope } from "../types.js";
4
4
  * Converts a SyncEnvelope containing operations into a SyncOperation.
5
5
  *
6
6
  * Extracts the necessary metadata from the envelope's operations to create
7
- * a sync operation that can be processed by the receiving channel.
7
+ * a sync operation that can be processed by the receiving channel. Also
8
+ * deserializes any signatures from comma-separated strings back to tuples,
9
+ * as GraphQL transport serializes Signature tuples for compatibility.
8
10
  *
9
11
  * @param envelope - The sync envelope containing operations
10
12
  * @param remoteName - The name of the remote this sync operation is associated with
11
- * @returns A new SyncOperation containing the envelope's operations
13
+ * @returns A new SyncOperation containing the envelope's operations with deserialized signatures
12
14
  * @throws Error if envelope has no operations or operations array is empty
13
15
  */
14
16
  export declare function envelopeToSyncOperation(envelope: SyncEnvelope, remoteName: string): SyncOperation;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,aAAa,CAuBf"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAqDhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,aAAa,CA2Bf"}