@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.
Files changed (286) hide show
  1. package/dist/src/cache/collection-membership-cache.d.ts +13 -0
  2. package/dist/src/cache/collection-membership-cache.d.ts.map +1 -0
  3. package/dist/src/cache/collection-membership-cache.js +33 -0
  4. package/dist/src/cache/collection-membership-cache.js.map +1 -0
  5. package/dist/src/cache/document-meta-cache.d.ts.map +1 -1
  6. package/dist/src/cache/document-meta-cache.js +4 -4
  7. package/dist/src/cache/document-meta-cache.js.map +1 -1
  8. package/dist/src/cache/kysely-operation-index.d.ts +6 -1
  9. package/dist/src/cache/kysely-operation-index.d.ts.map +1 -1
  10. package/dist/src/cache/kysely-operation-index.js +102 -7
  11. package/dist/src/cache/kysely-operation-index.js.map +1 -1
  12. package/dist/src/cache/kysely-write-cache.d.ts.map +1 -1
  13. package/dist/src/cache/kysely-write-cache.js +16 -12
  14. package/dist/src/cache/kysely-write-cache.js.map +1 -1
  15. package/dist/src/cache/operation-index-types.d.ts +16 -2
  16. package/dist/src/cache/operation-index-types.d.ts.map +1 -1
  17. package/dist/src/cache/operation-index-types.js.map +1 -1
  18. package/dist/src/client/reactor-client.d.ts +13 -10
  19. package/dist/src/client/reactor-client.d.ts.map +1 -1
  20. package/dist/src/client/reactor-client.js +134 -43
  21. package/dist/src/client/reactor-client.js.map +1 -1
  22. package/dist/src/client/types.d.ts +25 -6
  23. package/dist/src/client/types.d.ts.map +1 -1
  24. package/dist/src/client/types.js.map +1 -1
  25. package/dist/src/core/reactor-builder.d.ts +23 -7
  26. package/dist/src/core/reactor-builder.d.ts.map +1 -1
  27. package/dist/src/core/reactor-builder.js +96 -24
  28. package/dist/src/core/reactor-builder.js.map +1 -1
  29. package/dist/src/core/reactor-client-builder.d.ts +5 -4
  30. package/dist/src/core/reactor-client-builder.d.ts.map +1 -1
  31. package/dist/src/core/reactor-client-builder.js +14 -5
  32. package/dist/src/core/reactor-client-builder.js.map +1 -1
  33. package/dist/src/core/reactor.d.ts +20 -80
  34. package/dist/src/core/reactor.d.ts.map +1 -1
  35. package/dist/src/core/reactor.js +235 -576
  36. package/dist/src/core/reactor.js.map +1 -1
  37. package/dist/src/core/types.d.ts +63 -28
  38. package/dist/src/core/types.d.ts.map +1 -1
  39. package/dist/src/core/utils.d.ts +39 -3
  40. package/dist/src/core/utils.d.ts.map +1 -1
  41. package/dist/src/core/utils.js +63 -9
  42. package/dist/src/core/utils.js.map +1 -1
  43. package/dist/src/events/types.d.ts +35 -10
  44. package/dist/src/events/types.d.ts.map +1 -1
  45. package/dist/src/events/types.js +7 -5
  46. package/dist/src/events/types.js.map +1 -1
  47. package/dist/src/executor/document-action-handler.d.ts +37 -0
  48. package/dist/src/executor/document-action-handler.d.ts.map +1 -0
  49. package/dist/src/executor/document-action-handler.js +354 -0
  50. package/dist/src/executor/document-action-handler.js.map +1 -0
  51. package/dist/src/executor/signature-verifier.d.ts +9 -0
  52. package/dist/src/executor/signature-verifier.d.ts.map +1 -0
  53. package/dist/src/executor/signature-verifier.js +70 -0
  54. package/dist/src/executor/signature-verifier.js.map +1 -0
  55. package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -1
  56. package/dist/src/executor/simple-job-executor-manager.js +20 -10
  57. package/dist/src/executor/simple-job-executor-manager.js.map +1 -1
  58. package/dist/src/executor/simple-job-executor.d.ts +6 -46
  59. package/dist/src/executor/simple-job-executor.d.ts.map +1 -1
  60. package/dist/src/executor/simple-job-executor.js +94 -580
  61. package/dist/src/executor/simple-job-executor.js.map +1 -1
  62. package/dist/src/executor/types.d.ts +1 -3
  63. package/dist/src/executor/types.d.ts.map +1 -1
  64. package/dist/src/executor/types.js.map +1 -1
  65. package/dist/src/executor/util.d.ts +12 -2
  66. package/dist/src/executor/util.d.ts.map +1 -1
  67. package/dist/src/executor/util.js +47 -1
  68. package/dist/src/executor/util.js.map +1 -1
  69. package/dist/src/index.d.ts +11 -9
  70. package/dist/src/index.d.ts.map +1 -1
  71. package/dist/src/index.js +6 -5
  72. package/dist/src/index.js.map +1 -1
  73. package/dist/src/job-tracker/in-memory-job-tracker.d.ts +4 -3
  74. package/dist/src/job-tracker/in-memory-job-tracker.d.ts.map +1 -1
  75. package/dist/src/job-tracker/in-memory-job-tracker.js +20 -18
  76. package/dist/src/job-tracker/in-memory-job-tracker.js.map +1 -1
  77. package/dist/src/job-tracker/interfaces.d.ts +3 -1
  78. package/dist/src/job-tracker/interfaces.d.ts.map +1 -1
  79. package/dist/src/logging/console.d.ts +1 -22
  80. package/dist/src/logging/console.d.ts.map +1 -1
  81. package/dist/src/logging/console.js +1 -107
  82. package/dist/src/logging/console.js.map +1 -1
  83. package/dist/src/logging/types.d.ts +1 -11
  84. package/dist/src/logging/types.d.ts.map +1 -1
  85. package/dist/src/processors/index.d.ts +1 -1
  86. package/dist/src/processors/index.d.ts.map +1 -1
  87. package/dist/src/processors/index.js.map +1 -1
  88. package/dist/src/processors/processor-manager.d.ts +2 -2
  89. package/dist/src/processors/processor-manager.d.ts.map +1 -1
  90. package/dist/src/processors/processor-manager.js.map +1 -1
  91. package/dist/src/processors/relational/types.d.ts +2 -0
  92. package/dist/src/processors/relational/types.d.ts.map +1 -0
  93. package/dist/src/processors/relational/types.js +2 -0
  94. package/dist/src/processors/relational/types.js.map +1 -0
  95. package/dist/src/processors/relational/utils.d.ts +2 -0
  96. package/dist/src/processors/relational/utils.d.ts.map +1 -0
  97. package/dist/src/processors/relational/utils.js +2 -0
  98. package/dist/src/processors/relational/utils.js.map +1 -0
  99. package/dist/src/processors/utils.d.ts +2 -2
  100. package/dist/src/processors/utils.d.ts.map +1 -1
  101. package/dist/src/processors/utils.js +2 -1
  102. package/dist/src/processors/utils.js.map +1 -1
  103. package/dist/src/queue/queue.d.ts +33 -1
  104. package/dist/src/queue/queue.d.ts.map +1 -1
  105. package/dist/src/queue/queue.js +135 -1
  106. package/dist/src/queue/queue.js.map +1 -1
  107. package/dist/src/queue/types.d.ts +3 -3
  108. package/dist/src/queue/types.d.ts.map +1 -1
  109. package/dist/src/read-models/base-read-model.d.ts +1 -1
  110. package/dist/src/read-models/base-read-model.d.ts.map +1 -1
  111. package/dist/src/read-models/base-read-model.js +4 -4
  112. package/dist/src/read-models/base-read-model.js.map +1 -1
  113. package/dist/src/read-models/coordinator.d.ts +2 -2
  114. package/dist/src/read-models/coordinator.d.ts.map +1 -1
  115. package/dist/src/read-models/coordinator.js +8 -8
  116. package/dist/src/read-models/coordinator.js.map +1 -1
  117. package/dist/src/read-models/document-view.d.ts +6 -3
  118. package/dist/src/read-models/document-view.d.ts.map +1 -1
  119. package/dist/src/read-models/document-view.js +130 -48
  120. package/dist/src/read-models/document-view.js.map +1 -1
  121. package/dist/src/read-models/interfaces.d.ts +1 -1
  122. package/dist/src/read-models/interfaces.d.ts.map +1 -1
  123. package/dist/src/registry/index.d.ts +1 -1
  124. package/dist/src/registry/index.d.ts.map +1 -1
  125. package/dist/src/registry/interfaces.d.ts +8 -0
  126. package/dist/src/registry/interfaces.d.ts.map +1 -1
  127. package/dist/src/shared/awaiter.d.ts +2 -2
  128. package/dist/src/shared/awaiter.d.ts.map +1 -1
  129. package/dist/src/shared/awaiter.js +11 -11
  130. package/dist/src/shared/awaiter.js.map +1 -1
  131. package/dist/src/shared/collect-all-pages.d.ts +7 -0
  132. package/dist/src/shared/collect-all-pages.d.ts.map +1 -0
  133. package/dist/src/shared/collect-all-pages.js +17 -0
  134. package/dist/src/shared/collect-all-pages.js.map +1 -0
  135. package/dist/src/shared/drive-url.d.ts +15 -0
  136. package/dist/src/shared/drive-url.d.ts.map +1 -0
  137. package/dist/src/shared/drive-url.js +17 -0
  138. package/dist/src/shared/drive-url.js.map +1 -0
  139. package/dist/src/shared/factories.d.ts +6 -2
  140. package/dist/src/shared/factories.d.ts.map +1 -1
  141. package/dist/src/shared/factories.js +10 -2
  142. package/dist/src/shared/factories.js.map +1 -1
  143. package/dist/src/shared/types.d.ts +32 -6
  144. package/dist/src/shared/types.d.ts.map +1 -1
  145. package/dist/src/shared/types.js +4 -4
  146. package/dist/src/shared/types.js.map +1 -1
  147. package/dist/src/signer/passthrough-signer.d.ts +1 -1
  148. package/dist/src/signer/passthrough-signer.d.ts.map +1 -1
  149. package/dist/src/signer/passthrough-signer.js +1 -3
  150. package/dist/src/signer/passthrough-signer.js.map +1 -1
  151. package/dist/src/storage/interfaces.d.ts +56 -108
  152. package/dist/src/storage/interfaces.d.ts.map +1 -1
  153. package/dist/src/storage/interfaces.js.map +1 -1
  154. package/dist/src/storage/kysely/document-indexer.d.ts +8 -7
  155. package/dist/src/storage/kysely/document-indexer.d.ts.map +1 -1
  156. package/dist/src/storage/kysely/document-indexer.js +123 -52
  157. package/dist/src/storage/kysely/document-indexer.js.map +1 -1
  158. package/dist/src/storage/kysely/store.d.ts +5 -4
  159. package/dist/src/storage/kysely/store.d.ts.map +1 -1
  160. package/dist/src/storage/kysely/store.js +52 -21
  161. package/dist/src/storage/kysely/store.js.map +1 -1
  162. package/dist/src/storage/kysely/sync-cursor-storage.d.ts +1 -1
  163. package/dist/src/storage/kysely/sync-cursor-storage.d.ts.map +1 -1
  164. package/dist/src/storage/kysely/sync-cursor-storage.js +6 -2
  165. package/dist/src/storage/kysely/sync-cursor-storage.js.map +1 -1
  166. package/dist/src/storage/kysely/sync-remote-storage.js +1 -1
  167. package/dist/src/storage/kysely/sync-remote-storage.js.map +1 -1
  168. package/dist/src/storage/kysely/types.d.ts +2 -0
  169. package/dist/src/storage/kysely/types.d.ts.map +1 -1
  170. package/dist/src/storage/migrations/011_add_cursor_type_column.d.ts +3 -0
  171. package/dist/src/storage/migrations/011_add_cursor_type_column.d.ts.map +1 -0
  172. package/dist/src/storage/migrations/011_add_cursor_type_column.js +29 -0
  173. package/dist/src/storage/migrations/011_add_cursor_type_column.js.map +1 -0
  174. package/dist/src/storage/migrations/012_add_source_remote_column.d.ts +3 -0
  175. package/dist/src/storage/migrations/012_add_source_remote_column.d.ts.map +1 -0
  176. package/dist/src/storage/migrations/012_add_source_remote_column.js +7 -0
  177. package/dist/src/storage/migrations/012_add_source_remote_column.js.map +1 -0
  178. package/dist/src/storage/migrations/migrator.d.ts.map +1 -1
  179. package/dist/src/storage/migrations/migrator.js +4 -0
  180. package/dist/src/storage/migrations/migrator.js.map +1 -1
  181. package/dist/src/subs/subscription-notification-read-model.d.ts +3 -2
  182. package/dist/src/subs/subscription-notification-read-model.d.ts.map +1 -1
  183. package/dist/src/subs/subscription-notification-read-model.js +1 -1
  184. package/dist/src/subs/subscription-notification-read-model.js.map +1 -1
  185. package/dist/src/sync/batch-aggregator.d.ts +25 -0
  186. package/dist/src/sync/batch-aggregator.d.ts.map +1 -0
  187. package/dist/src/sync/batch-aggregator.js +94 -0
  188. package/dist/src/sync/batch-aggregator.js.map +1 -0
  189. package/dist/src/sync/buffered-mailbox.d.ts +36 -0
  190. package/dist/src/sync/buffered-mailbox.d.ts.map +1 -0
  191. package/dist/src/sync/buffered-mailbox.js +164 -0
  192. package/dist/src/sync/buffered-mailbox.js.map +1 -0
  193. package/dist/src/sync/channels/{gql-channel.d.ts → gql-req-channel.d.ts} +44 -42
  194. package/dist/src/sync/channels/gql-req-channel.d.ts.map +1 -0
  195. package/dist/src/sync/channels/gql-req-channel.js +500 -0
  196. package/dist/src/sync/channels/gql-req-channel.js.map +1 -0
  197. package/dist/src/sync/channels/gql-request-channel-factory.d.ts +32 -0
  198. package/dist/src/sync/channels/gql-request-channel-factory.d.ts.map +1 -0
  199. package/dist/src/sync/channels/gql-request-channel-factory.js +105 -0
  200. package/dist/src/sync/channels/gql-request-channel-factory.js.map +1 -0
  201. package/dist/src/sync/channels/gql-res-channel.d.ts +25 -0
  202. package/dist/src/sync/channels/gql-res-channel.d.ts.map +1 -0
  203. package/dist/src/sync/channels/gql-res-channel.js +79 -0
  204. package/dist/src/sync/channels/gql-res-channel.js.map +1 -0
  205. package/dist/src/sync/channels/gql-response-channel-factory.d.ts +13 -0
  206. package/dist/src/sync/channels/gql-response-channel-factory.d.ts.map +1 -0
  207. package/dist/src/sync/channels/gql-response-channel-factory.js +14 -0
  208. package/dist/src/sync/channels/gql-response-channel-factory.js.map +1 -0
  209. package/dist/src/sync/channels/index.d.ts +6 -4
  210. package/dist/src/sync/channels/index.d.ts.map +1 -1
  211. package/dist/src/sync/channels/index.js +6 -4
  212. package/dist/src/sync/channels/index.js.map +1 -1
  213. package/dist/src/sync/channels/interval-poll-timer.d.ts +38 -0
  214. package/dist/src/sync/channels/interval-poll-timer.d.ts.map +1 -0
  215. package/dist/src/sync/channels/interval-poll-timer.js +117 -0
  216. package/dist/src/sync/channels/interval-poll-timer.js.map +1 -0
  217. package/dist/src/sync/channels/poll-timer.d.ts +14 -0
  218. package/dist/src/sync/channels/poll-timer.d.ts.map +1 -0
  219. package/dist/src/sync/channels/poll-timer.js +2 -0
  220. package/dist/src/sync/channels/poll-timer.js.map +1 -0
  221. package/dist/src/sync/channels/utils.d.ts +15 -1
  222. package/dist/src/sync/channels/utils.d.ts.map +1 -1
  223. package/dist/src/sync/channels/utils.js +66 -2
  224. package/dist/src/sync/channels/utils.js.map +1 -1
  225. package/dist/src/sync/index.d.ts +10 -6
  226. package/dist/src/sync/index.d.ts.map +1 -1
  227. package/dist/src/sync/index.js +7 -5
  228. package/dist/src/sync/index.js.map +1 -1
  229. package/dist/src/sync/interfaces.d.ts +34 -21
  230. package/dist/src/sync/interfaces.d.ts.map +1 -1
  231. package/dist/src/sync/mailbox.d.ts +51 -12
  232. package/dist/src/sync/mailbox.d.ts.map +1 -1
  233. package/dist/src/sync/mailbox.js +89 -6
  234. package/dist/src/sync/mailbox.js.map +1 -1
  235. package/dist/src/sync/sync-awaiter.d.ts +34 -0
  236. package/dist/src/sync/sync-awaiter.d.ts.map +1 -0
  237. package/dist/src/sync/sync-awaiter.js +124 -0
  238. package/dist/src/sync/sync-awaiter.js.map +1 -0
  239. package/dist/src/sync/sync-manager.d.ts +16 -6
  240. package/dist/src/sync/sync-manager.d.ts.map +1 -1
  241. package/dist/src/sync/sync-manager.js +204 -94
  242. package/dist/src/sync/sync-manager.js.map +1 -1
  243. package/dist/src/sync/sync-operation.d.ts +4 -2
  244. package/dist/src/sync/sync-operation.d.ts.map +1 -1
  245. package/dist/src/sync/sync-operation.js +8 -1
  246. package/dist/src/sync/sync-operation.js.map +1 -1
  247. package/dist/src/sync/sync-status-tracker.d.ts +31 -0
  248. package/dist/src/sync/sync-status-tracker.d.ts.map +1 -0
  249. package/dist/src/sync/sync-status-tracker.js +137 -0
  250. package/dist/src/sync/sync-status-tracker.js.map +1 -0
  251. package/dist/src/sync/types.d.ts +79 -2
  252. package/dist/src/sync/types.d.ts.map +1 -1
  253. package/dist/src/sync/types.js +15 -0
  254. package/dist/src/sync/types.js.map +1 -1
  255. package/dist/src/sync/utils.d.ts +28 -1
  256. package/dist/src/sync/utils.d.ts.map +1 -1
  257. package/dist/src/sync/utils.js +136 -0
  258. package/dist/src/sync/utils.js.map +1 -1
  259. package/dist/src/utils/reshuffle.d.ts +15 -5
  260. package/dist/src/utils/reshuffle.d.ts.map +1 -1
  261. package/dist/src/utils/reshuffle.js +29 -6
  262. package/dist/src/utils/reshuffle.js.map +1 -1
  263. package/package.json +12 -13
  264. package/dist/src/processors/types.d.ts +0 -63
  265. package/dist/src/processors/types.d.ts.map +0 -1
  266. package/dist/src/processors/types.js +0 -2
  267. package/dist/src/processors/types.js.map +0 -1
  268. package/dist/src/storage/consistency-aware-legacy-storage.d.ts +0 -33
  269. package/dist/src/storage/consistency-aware-legacy-storage.d.ts.map +0 -1
  270. package/dist/src/storage/consistency-aware-legacy-storage.js +0 -65
  271. package/dist/src/storage/consistency-aware-legacy-storage.js.map +0 -1
  272. package/dist/src/sync/channels/composite-channel-factory.d.ts +0 -30
  273. package/dist/src/sync/channels/composite-channel-factory.d.ts.map +0 -1
  274. package/dist/src/sync/channels/composite-channel-factory.js +0 -87
  275. package/dist/src/sync/channels/composite-channel-factory.js.map +0 -1
  276. package/dist/src/sync/channels/gql-channel-factory.d.ts +0 -25
  277. package/dist/src/sync/channels/gql-channel-factory.d.ts.map +0 -1
  278. package/dist/src/sync/channels/gql-channel-factory.js +0 -76
  279. package/dist/src/sync/channels/gql-channel-factory.js.map +0 -1
  280. package/dist/src/sync/channels/gql-channel.d.ts.map +0 -1
  281. package/dist/src/sync/channels/gql-channel.js +0 -423
  282. package/dist/src/sync/channels/gql-channel.js.map +0 -1
  283. package/dist/src/sync/channels/polling-channel.d.ts +0 -39
  284. package/dist/src/sync/channels/polling-channel.d.ts.map +0 -1
  285. package/dist/src/sync/channels/polling-channel.js +0 -72
  286. package/dist/src/sync/channels/polling-channel.js.map +0 -1
@@ -0,0 +1,164 @@
1
+ import { MailboxAggregateError, } from "./mailbox.js";
2
+ import { SyncOperationStatus } from "./types.js";
3
+ export class BufferedMailbox {
4
+ itemsMap = new Map();
5
+ addedCallbacks = [];
6
+ removedCallbacks = [];
7
+ addedBuffer = [];
8
+ removedBuffer = [];
9
+ addedTimer = null;
10
+ removedTimer = null;
11
+ milliseconds;
12
+ maxQueued;
13
+ paused = false;
14
+ _ack = 0;
15
+ _latestOrdinal = 0;
16
+ constructor(milliseconds, maxQueued) {
17
+ this.milliseconds = milliseconds;
18
+ this.maxQueued = maxQueued;
19
+ }
20
+ init(ackOrdinal) {
21
+ this._ack = this._latestOrdinal = ackOrdinal;
22
+ }
23
+ get items() {
24
+ return Array.from(this.itemsMap.values());
25
+ }
26
+ get ackOrdinal() {
27
+ return this._ack;
28
+ }
29
+ get latestOrdinal() {
30
+ return this._latestOrdinal;
31
+ }
32
+ get(id) {
33
+ return this.itemsMap.get(id);
34
+ }
35
+ add(...items) {
36
+ for (const item of items) {
37
+ this.itemsMap.set(item.id, item);
38
+ // update latest ordinal
39
+ for (const op of item.operations) {
40
+ this._latestOrdinal = Math.max(this._latestOrdinal, op.context.ordinal);
41
+ }
42
+ // listen for updates to the syncop status
43
+ item.on((syncOp, _, next) => {
44
+ if (next === SyncOperationStatus.Applied) {
45
+ for (const op of syncOp.operations) {
46
+ this._ack = Math.max(this._ack, op.context.ordinal);
47
+ }
48
+ }
49
+ });
50
+ }
51
+ this.addedBuffer.push(...items);
52
+ if (this.paused) {
53
+ return;
54
+ }
55
+ if (this.addedBuffer.length >= this.maxQueued) {
56
+ this.flushAdded();
57
+ }
58
+ else {
59
+ this.scheduleAddedFlush();
60
+ }
61
+ }
62
+ remove(...items) {
63
+ for (const item of items) {
64
+ this.itemsMap.delete(item.id);
65
+ }
66
+ this.removedBuffer.push(...items);
67
+ if (this.paused) {
68
+ return;
69
+ }
70
+ if (this.removedBuffer.length >= this.maxQueued) {
71
+ this.flushRemoved();
72
+ }
73
+ else {
74
+ this.scheduleRemovedFlush();
75
+ }
76
+ }
77
+ onAdded(callback) {
78
+ this.addedCallbacks.push(callback);
79
+ }
80
+ onRemoved(callback) {
81
+ this.removedCallbacks.push(callback);
82
+ }
83
+ pause() {
84
+ this.paused = true;
85
+ if (this.addedTimer !== null) {
86
+ clearTimeout(this.addedTimer);
87
+ this.addedTimer = null;
88
+ }
89
+ if (this.removedTimer !== null) {
90
+ clearTimeout(this.removedTimer);
91
+ this.removedTimer = null;
92
+ }
93
+ }
94
+ resume() {
95
+ this.paused = false;
96
+ if (this.addedBuffer.length > 0) {
97
+ this.scheduleAddedFlush();
98
+ }
99
+ if (this.removedBuffer.length > 0) {
100
+ this.scheduleRemovedFlush();
101
+ }
102
+ }
103
+ isPaused() {
104
+ return this.paused;
105
+ }
106
+ flush() {
107
+ this.flushAdded();
108
+ this.flushRemoved();
109
+ }
110
+ scheduleAddedFlush() {
111
+ if (this.addedTimer !== null) {
112
+ clearTimeout(this.addedTimer);
113
+ }
114
+ this.addedTimer = setTimeout(() => {
115
+ this.flushAdded();
116
+ }, this.milliseconds);
117
+ }
118
+ scheduleRemovedFlush() {
119
+ if (this.removedTimer !== null) {
120
+ clearTimeout(this.removedTimer);
121
+ }
122
+ this.removedTimer = setTimeout(() => {
123
+ this.flushRemoved();
124
+ }, this.milliseconds);
125
+ }
126
+ flushAdded() {
127
+ if (this.addedTimer !== null) {
128
+ clearTimeout(this.addedTimer);
129
+ this.addedTimer = null;
130
+ }
131
+ const items = this.addedBuffer;
132
+ this.addedBuffer = [];
133
+ if (items.length > 0) {
134
+ this.invokeCallbacks(this.addedCallbacks, items);
135
+ }
136
+ }
137
+ flushRemoved() {
138
+ if (this.removedTimer !== null) {
139
+ clearTimeout(this.removedTimer);
140
+ this.removedTimer = null;
141
+ }
142
+ const items = this.removedBuffer;
143
+ this.removedBuffer = [];
144
+ if (items.length > 0) {
145
+ this.invokeCallbacks(this.removedCallbacks, items);
146
+ }
147
+ }
148
+ invokeCallbacks(callbacks, items) {
149
+ const callbacksCopy = [...callbacks];
150
+ const errors = [];
151
+ for (const callback of callbacksCopy) {
152
+ try {
153
+ callback(items);
154
+ }
155
+ catch (error) {
156
+ errors.push(error instanceof Error ? error : new Error(String(error)));
157
+ }
158
+ }
159
+ if (errors.length > 0) {
160
+ throw new MailboxAggregateError(errors);
161
+ }
162
+ }
163
+ }
164
+ //# 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,62 +1,62 @@
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 { Mailbox } from "../mailbox.js";
5
- import type { SyncOperation } from "../sync-operation.js";
6
- import type { RemoteFilter } from "../types.js";
5
+ import { type IMailbox } from "../mailbox.js";
6
+ import type { JwtHandler, RemoteFilter } from "../types.js";
7
+ import type { IPollTimer } from "./poll-timer.js";
7
8
  /**
8
9
  * Configuration parameters for GqlChannel
9
10
  */
10
11
  export type GqlChannelConfig = {
11
12
  /** The GraphQL endpoint URL */
12
13
  url: string;
13
- /** Authentication token for the remote */
14
- authToken?: string;
15
- /** Polling interval in milliseconds (default: 5000) */
16
- pollIntervalMs?: number;
17
- /** Base delay for exponential backoff retries in milliseconds (default: 1000) */
18
- retryBaseDelayMs?: number;
19
- /** Maximum delay for exponential backoff retries in milliseconds (default: 300000) */
20
- retryMaxDelayMs?: number;
21
- /** Maximum number of consecutive failures before marking as error (default: 5) */
22
- maxFailures?: number;
14
+ /** Dynamic JWT token handler for generating fresh tokens per-request */
15
+ jwtHandler?: JwtHandler;
23
16
  /** Custom fetch function for testing (default: global fetch) */
24
17
  fetchFn?: typeof fetch;
25
18
  /** Collection ID to synchronize */
26
19
  collectionId: string;
27
20
  /** Filter to apply to operations */
28
21
  filter: RemoteFilter;
22
+ /** Base delay in ms for exponential backoff on push retries */
23
+ retryBaseDelayMs: number;
24
+ /** Maximum delay in ms for exponential backoff on push retries */
25
+ retryMaxDelayMs: number;
29
26
  };
30
27
  /**
31
28
  * GraphQL-based synchronization channel for network communication between reactors.
32
29
  */
33
- export declare class GqlChannel implements IChannel {
30
+ export declare class GqlRequestChannel implements IChannel {
34
31
  private readonly logger;
35
- readonly inbox: Mailbox<SyncOperation>;
36
- readonly outbox: Mailbox<SyncOperation>;
37
- readonly deadLetter: Mailbox<SyncOperation>;
32
+ readonly inbox: IMailbox;
33
+ readonly outbox: IMailbox;
34
+ readonly deadLetter: IMailbox;
35
+ readonly config: GqlChannelConfig;
36
+ private readonly bufferedOutbox;
38
37
  private readonly channelId;
39
38
  private readonly remoteName;
40
39
  private readonly cursorStorage;
41
- private readonly config;
40
+ private readonly operationIndex;
41
+ private readonly pollTimer;
42
42
  private isShutdown;
43
- private pollTimer?;
44
43
  private failureCount;
45
44
  private lastSuccessUtcMs?;
46
45
  private lastFailureUtcMs?;
47
- constructor(logger: ILogger, channelId: string, remoteName: string, cursorStorage: ISyncCursorStorage, config: GqlChannelConfig);
46
+ private lastPersistedInboxOrdinal;
47
+ private lastPersistedOutboxOrdinal;
48
+ private pushFailureCount;
49
+ private pushRetryTimer;
50
+ private pushBlocked;
51
+ constructor(logger: ILogger, channelId: string, remoteName: string, cursorStorage: ISyncCursorStorage, config: GqlChannelConfig, operationIndex: IOperationIndex, pollTimer: IPollTimer);
48
52
  /**
49
53
  * Shuts down the channel and prevents further operations.
50
54
  */
51
- shutdown(): void;
55
+ shutdown(): Promise<void>;
52
56
  /**
53
57
  * Initializes the channel by registering it on the remote server and starting polling.
54
58
  */
55
59
  init(): Promise<void>;
56
- /**
57
- * Starts the polling loop to fetch operations from the remote.
58
- */
59
- private startPolling;
60
60
  /**
61
61
  * Polls the remote for new sync envelopes.
62
62
  */
@@ -78,33 +78,34 @@ export declare class GqlChannel implements IChannel {
78
78
  */
79
79
  private touchRemoteChannel;
80
80
  /**
81
- * Handles sync operations added to the outbox by sending them to the remote.
81
+ * Fire-and-forget push with retry on recoverable errors.
82
+ * On success, clears push blocked state. On recoverable error, blocks
83
+ * further pushes and schedules a retry. On unrecoverable error, moves
84
+ * ops to deadLetter.
82
85
  */
83
- private handleOutboxAdded;
86
+ private attemptPush;
84
87
  /**
85
- * Pushes a sync operation to the remote via GraphQL mutation.
88
+ * Schedules a retry of all current outbox items using exponential backoff.
86
89
  */
87
- private pushSyncOperation;
90
+ private schedulePushRetry;
88
91
  /**
89
- * Serializes a SyncEnvelope for GraphQL transport.
90
- *
91
- * Signatures are serialized as comma-separated strings since GraphQL schema
92
- * defines them as [String!]!. Extra context fields (resultingState, ordinal)
93
- * are stripped since they are not defined in OperationContextInput.
92
+ * Returns true if the error is recoverable (transient network/HTTP/parse
93
+ * failure). Returns false for explicit GraphQL server rejections.
94
94
  */
95
- private serializeEnvelope;
95
+ private isRecoverablePushError;
96
96
  /**
97
- * Serializes an action for GraphQL transport, converting signature tuples to strings.
97
+ * Pushes multiple sync operations to the remote via a single GraphQL mutation.
98
+ * Creates one SyncEnvelope per SyncOperation with key/dependsOn for batch ordering.
98
99
  */
99
- private serializeAction;
100
+ private pushSyncOperations;
100
101
  /**
101
- * Executes a GraphQL query or mutation against the remote endpoint.
102
+ * Gets the authorization header value using jwtHandler.
102
103
  */
103
- private executeGraphQL;
104
+ private getAuthorizationHeader;
104
105
  /**
105
- * Updates the synchronization cursor for this channel's remote.
106
+ * Executes a GraphQL query or mutation against the remote endpoint.
106
107
  */
107
- updateCursor(cursorOrdinal: number): Promise<void>;
108
+ private executeGraphQL;
108
109
  /**
109
110
  * Gets the current health status of the channel.
110
111
  */
@@ -114,5 +115,6 @@ export declare class GqlChannel implements IChannel {
114
115
  lastFailureUtcMs?: number;
115
116
  failureCount: number;
116
117
  };
118
+ get poller(): IPollTimer;
117
119
  }
118
- //# sourceMappingURL=gql-channel.d.ts.map
120
+ //# sourceMappingURL=gql-req-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gql-req-channel.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/gql-req-channel.ts"],"names":[],"mappings":"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"}