@fluidframework/container-runtime 2.0.0-dev.2.2.0.111723 → 2.0.0-dev.3.1.0.125672

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 (365) hide show
  1. package/.eslintrc.js +21 -10
  2. package/.mocharc.js +2 -2
  3. package/api-extractor.json +2 -2
  4. package/dist/batchTracker.d.ts +1 -2
  5. package/dist/batchTracker.d.ts.map +1 -1
  6. package/dist/batchTracker.js +2 -1
  7. package/dist/batchTracker.js.map +1 -1
  8. package/dist/blobManager.d.ts +62 -28
  9. package/dist/blobManager.d.ts.map +1 -1
  10. package/dist/blobManager.js +256 -102
  11. package/dist/blobManager.js.map +1 -1
  12. package/dist/connectionTelemetry.d.ts.map +1 -1
  13. package/dist/connectionTelemetry.js +11 -9
  14. package/dist/connectionTelemetry.js.map +1 -1
  15. package/dist/containerHandleContext.d.ts.map +1 -1
  16. package/dist/containerHandleContext.js +3 -1
  17. package/dist/containerHandleContext.js.map +1 -1
  18. package/dist/containerRuntime.d.ts +110 -78
  19. package/dist/containerRuntime.d.ts.map +1 -1
  20. package/dist/containerRuntime.js +336 -331
  21. package/dist/containerRuntime.js.map +1 -1
  22. package/dist/dataStore.d.ts.map +1 -1
  23. package/dist/dataStore.js +11 -9
  24. package/dist/dataStore.js.map +1 -1
  25. package/dist/dataStoreContext.d.ts +2 -1
  26. package/dist/dataStoreContext.d.ts.map +1 -1
  27. package/dist/dataStoreContext.js +40 -23
  28. package/dist/dataStoreContext.js.map +1 -1
  29. package/dist/dataStoreContexts.d.ts.map +1 -1
  30. package/dist/dataStoreContexts.js +7 -3
  31. package/dist/dataStoreContexts.js.map +1 -1
  32. package/dist/dataStoreRegistry.d.ts.map +1 -1
  33. package/dist/dataStoreRegistry.js +3 -1
  34. package/dist/dataStoreRegistry.js.map +1 -1
  35. package/dist/dataStores.d.ts +12 -9
  36. package/dist/dataStores.d.ts.map +1 -1
  37. package/dist/dataStores.js +69 -46
  38. package/dist/dataStores.js.map +1 -1
  39. package/dist/deltaScheduler.d.ts.map +1 -1
  40. package/dist/deltaScheduler.js +8 -3
  41. package/dist/deltaScheduler.js.map +1 -1
  42. package/dist/garbageCollection.d.ts +57 -42
  43. package/dist/garbageCollection.d.ts.map +1 -1
  44. package/dist/garbageCollection.js +371 -239
  45. package/dist/garbageCollection.js.map +1 -1
  46. package/dist/garbageCollectionConstants.d.ts +23 -0
  47. package/dist/garbageCollectionConstants.d.ts.map +1 -0
  48. package/dist/garbageCollectionConstants.js +36 -0
  49. package/dist/garbageCollectionConstants.js.map +1 -0
  50. package/dist/garbageCollectionHelpers.d.ts +15 -0
  51. package/dist/garbageCollectionHelpers.d.ts.map +1 -0
  52. package/dist/garbageCollectionHelpers.js +27 -0
  53. package/dist/garbageCollectionHelpers.js.map +1 -0
  54. package/dist/gcSweepReadyUsageDetection.d.ts +5 -5
  55. package/dist/gcSweepReadyUsageDetection.d.ts.map +1 -1
  56. package/dist/gcSweepReadyUsageDetection.js +15 -11
  57. package/dist/gcSweepReadyUsageDetection.js.map +1 -1
  58. package/dist/index.d.ts +4 -3
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +5 -6
  61. package/dist/index.js.map +1 -1
  62. package/dist/opLifecycle/batchManager.d.ts +42 -0
  63. package/dist/opLifecycle/batchManager.d.ts.map +1 -0
  64. package/dist/opLifecycle/batchManager.js +124 -0
  65. package/dist/opLifecycle/batchManager.js.map +1 -0
  66. package/dist/opLifecycle/definitions.d.ts +64 -0
  67. package/dist/opLifecycle/definitions.d.ts.map +1 -0
  68. package/dist/opLifecycle/definitions.js +7 -0
  69. package/dist/opLifecycle/definitions.js.map +1 -0
  70. package/dist/opLifecycle/index.d.ts +12 -0
  71. package/dist/opLifecycle/index.d.ts.map +1 -0
  72. package/dist/opLifecycle/index.js +22 -0
  73. package/dist/opLifecycle/index.js.map +1 -0
  74. package/dist/{opCompressor.d.ts → opLifecycle/opCompressor.d.ts} +3 -3
  75. package/dist/opLifecycle/opCompressor.d.ts.map +1 -0
  76. package/dist/opLifecycle/opCompressor.js +67 -0
  77. package/dist/opLifecycle/opCompressor.js.map +1 -0
  78. package/dist/{opDecompressor.d.ts → opLifecycle/opDecompressor.d.ts} +2 -1
  79. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -0
  80. package/dist/{opDecompressor.js → opLifecycle/opDecompressor.js} +37 -21
  81. package/dist/opLifecycle/opDecompressor.js.map +1 -0
  82. package/dist/opLifecycle/opSplitter.d.ts +49 -0
  83. package/dist/opLifecycle/opSplitter.d.ts.map +1 -0
  84. package/dist/opLifecycle/opSplitter.js +173 -0
  85. package/dist/opLifecycle/opSplitter.js.map +1 -0
  86. package/dist/opLifecycle/outbox.d.ts +52 -0
  87. package/dist/opLifecycle/outbox.d.ts.map +1 -0
  88. package/dist/opLifecycle/outbox.js +164 -0
  89. package/dist/opLifecycle/outbox.js.map +1 -0
  90. package/dist/opLifecycle/remoteMessageProcessor.d.ts +26 -0
  91. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -0
  92. package/dist/opLifecycle/remoteMessageProcessor.js +96 -0
  93. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -0
  94. package/dist/opProperties.d.ts.map +1 -1
  95. package/dist/opProperties.js +1 -3
  96. package/dist/opProperties.js.map +1 -1
  97. package/dist/orderedClientElection.d.ts.map +1 -1
  98. package/dist/orderedClientElection.js +10 -4
  99. package/dist/orderedClientElection.js.map +1 -1
  100. package/dist/packageVersion.d.ts +1 -1
  101. package/dist/packageVersion.js +1 -1
  102. package/dist/packageVersion.js.map +1 -1
  103. package/dist/pendingStateManager.d.ts +4 -13
  104. package/dist/pendingStateManager.d.ts.map +1 -1
  105. package/dist/pendingStateManager.js +134 -161
  106. package/dist/pendingStateManager.js.map +1 -1
  107. package/dist/runWhileConnectedCoordinator.d.ts.map +1 -1
  108. package/dist/runWhileConnectedCoordinator.js.map +1 -1
  109. package/dist/runningSummarizer.d.ts.map +1 -1
  110. package/dist/runningSummarizer.js +34 -22
  111. package/dist/runningSummarizer.js.map +1 -1
  112. package/dist/scheduleManager.d.ts +0 -1
  113. package/dist/scheduleManager.d.ts.map +1 -1
  114. package/dist/scheduleManager.js +11 -21
  115. package/dist/scheduleManager.js.map +1 -1
  116. package/dist/serializedSnapshotStorage.d.ts.map +1 -1
  117. package/dist/serializedSnapshotStorage.js +3 -1
  118. package/dist/serializedSnapshotStorage.js.map +1 -1
  119. package/dist/summarizer.d.ts +2 -3
  120. package/dist/summarizer.d.ts.map +1 -1
  121. package/dist/summarizer.js +39 -18
  122. package/dist/summarizer.js.map +1 -1
  123. package/dist/summarizerClientElection.d.ts +1 -2
  124. package/dist/summarizerClientElection.d.ts.map +1 -1
  125. package/dist/summarizerClientElection.js +3 -30
  126. package/dist/summarizerClientElection.js.map +1 -1
  127. package/dist/summarizerHandle.d.ts.map +1 -1
  128. package/dist/summarizerHandle.js.map +1 -1
  129. package/dist/summarizerHeuristics.d.ts.map +1 -1
  130. package/dist/summarizerHeuristics.js +6 -9
  131. package/dist/summarizerHeuristics.js.map +1 -1
  132. package/dist/summarizerTypes.d.ts +22 -25
  133. package/dist/summarizerTypes.d.ts.map +1 -1
  134. package/dist/summarizerTypes.js.map +1 -1
  135. package/dist/summaryCollection.d.ts.map +1 -1
  136. package/dist/summaryCollection.js +18 -8
  137. package/dist/summaryCollection.js.map +1 -1
  138. package/dist/summaryFormat.d.ts.map +1 -1
  139. package/dist/summaryFormat.js +18 -11
  140. package/dist/summaryFormat.js.map +1 -1
  141. package/dist/summaryGenerator.d.ts.map +1 -1
  142. package/dist/summaryGenerator.js +32 -14
  143. package/dist/summaryGenerator.js.map +1 -1
  144. package/dist/summaryManager.d.ts.map +1 -1
  145. package/dist/summaryManager.js +21 -9
  146. package/dist/summaryManager.js.map +1 -1
  147. package/dist/throttler.d.ts +2 -2
  148. package/dist/throttler.d.ts.map +1 -1
  149. package/dist/throttler.js +4 -4
  150. package/dist/throttler.js.map +1 -1
  151. package/garbageCollection.md +15 -2
  152. package/lib/batchTracker.d.ts +1 -2
  153. package/lib/batchTracker.d.ts.map +1 -1
  154. package/lib/batchTracker.js +2 -1
  155. package/lib/batchTracker.js.map +1 -1
  156. package/lib/blobManager.d.ts +62 -28
  157. package/lib/blobManager.d.ts.map +1 -1
  158. package/lib/blobManager.js +259 -105
  159. package/lib/blobManager.js.map +1 -1
  160. package/lib/connectionTelemetry.d.ts.map +1 -1
  161. package/lib/connectionTelemetry.js +11 -9
  162. package/lib/connectionTelemetry.js.map +1 -1
  163. package/lib/containerHandleContext.d.ts.map +1 -1
  164. package/lib/containerHandleContext.js +3 -1
  165. package/lib/containerHandleContext.js.map +1 -1
  166. package/lib/containerRuntime.d.ts +110 -78
  167. package/lib/containerRuntime.d.ts.map +1 -1
  168. package/lib/containerRuntime.js +340 -334
  169. package/lib/containerRuntime.js.map +1 -1
  170. package/lib/dataStore.d.ts.map +1 -1
  171. package/lib/dataStore.js +11 -9
  172. package/lib/dataStore.js.map +1 -1
  173. package/lib/dataStoreContext.d.ts +2 -1
  174. package/lib/dataStoreContext.d.ts.map +1 -1
  175. package/lib/dataStoreContext.js +41 -24
  176. package/lib/dataStoreContext.js.map +1 -1
  177. package/lib/dataStoreContexts.d.ts.map +1 -1
  178. package/lib/dataStoreContexts.js +7 -3
  179. package/lib/dataStoreContexts.js.map +1 -1
  180. package/lib/dataStoreRegistry.d.ts.map +1 -1
  181. package/lib/dataStoreRegistry.js +3 -1
  182. package/lib/dataStoreRegistry.js.map +1 -1
  183. package/lib/dataStores.d.ts +12 -9
  184. package/lib/dataStores.d.ts.map +1 -1
  185. package/lib/dataStores.js +75 -52
  186. package/lib/dataStores.js.map +1 -1
  187. package/lib/deltaScheduler.d.ts.map +1 -1
  188. package/lib/deltaScheduler.js +9 -4
  189. package/lib/deltaScheduler.js.map +1 -1
  190. package/lib/garbageCollection.d.ts +57 -42
  191. package/lib/garbageCollection.d.ts.map +1 -1
  192. package/lib/garbageCollection.js +364 -232
  193. package/lib/garbageCollection.js.map +1 -1
  194. package/lib/garbageCollectionConstants.d.ts +23 -0
  195. package/lib/garbageCollectionConstants.d.ts.map +1 -0
  196. package/lib/garbageCollectionConstants.js +33 -0
  197. package/lib/garbageCollectionConstants.js.map +1 -0
  198. package/lib/garbageCollectionHelpers.d.ts +15 -0
  199. package/lib/garbageCollectionHelpers.d.ts.map +1 -0
  200. package/lib/garbageCollectionHelpers.js +23 -0
  201. package/lib/garbageCollectionHelpers.js.map +1 -0
  202. package/lib/gcSweepReadyUsageDetection.d.ts +5 -5
  203. package/lib/gcSweepReadyUsageDetection.d.ts.map +1 -1
  204. package/lib/gcSweepReadyUsageDetection.js +15 -11
  205. package/lib/gcSweepReadyUsageDetection.js.map +1 -1
  206. package/lib/index.d.ts +4 -3
  207. package/lib/index.d.ts.map +1 -1
  208. package/lib/index.js +3 -3
  209. package/lib/index.js.map +1 -1
  210. package/lib/opLifecycle/batchManager.d.ts +42 -0
  211. package/lib/opLifecycle/batchManager.d.ts.map +1 -0
  212. package/lib/opLifecycle/batchManager.js +120 -0
  213. package/lib/opLifecycle/batchManager.js.map +1 -0
  214. package/lib/opLifecycle/definitions.d.ts +64 -0
  215. package/lib/opLifecycle/definitions.d.ts.map +1 -0
  216. package/lib/opLifecycle/definitions.js +6 -0
  217. package/lib/opLifecycle/definitions.js.map +1 -0
  218. package/lib/opLifecycle/index.d.ts +12 -0
  219. package/lib/opLifecycle/index.d.ts.map +1 -0
  220. package/lib/opLifecycle/index.js +11 -0
  221. package/lib/opLifecycle/index.js.map +1 -0
  222. package/lib/{opCompressor.d.ts → opLifecycle/opCompressor.d.ts} +3 -3
  223. package/lib/opLifecycle/opCompressor.d.ts.map +1 -0
  224. package/lib/opLifecycle/opCompressor.js +63 -0
  225. package/lib/opLifecycle/opCompressor.js.map +1 -0
  226. package/lib/{opDecompressor.d.ts → opLifecycle/opDecompressor.d.ts} +2 -1
  227. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -0
  228. package/lib/{opDecompressor.js → opLifecycle/opDecompressor.js} +37 -21
  229. package/lib/opLifecycle/opDecompressor.js.map +1 -0
  230. package/lib/opLifecycle/opSplitter.d.ts +49 -0
  231. package/lib/opLifecycle/opSplitter.d.ts.map +1 -0
  232. package/lib/opLifecycle/opSplitter.js +168 -0
  233. package/lib/opLifecycle/opSplitter.js.map +1 -0
  234. package/lib/opLifecycle/outbox.d.ts +52 -0
  235. package/lib/opLifecycle/outbox.d.ts.map +1 -0
  236. package/lib/opLifecycle/outbox.js +160 -0
  237. package/lib/opLifecycle/outbox.js.map +1 -0
  238. package/lib/opLifecycle/remoteMessageProcessor.d.ts +26 -0
  239. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -0
  240. package/lib/opLifecycle/remoteMessageProcessor.js +91 -0
  241. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -0
  242. package/lib/opProperties.d.ts.map +1 -1
  243. package/lib/opProperties.js +1 -3
  244. package/lib/opProperties.js.map +1 -1
  245. package/lib/orderedClientElection.d.ts.map +1 -1
  246. package/lib/orderedClientElection.js +10 -4
  247. package/lib/orderedClientElection.js.map +1 -1
  248. package/lib/packageVersion.d.ts +1 -1
  249. package/lib/packageVersion.js +1 -1
  250. package/lib/packageVersion.js.map +1 -1
  251. package/lib/pendingStateManager.d.ts +4 -13
  252. package/lib/pendingStateManager.d.ts.map +1 -1
  253. package/lib/pendingStateManager.js +134 -161
  254. package/lib/pendingStateManager.js.map +1 -1
  255. package/lib/runWhileConnectedCoordinator.d.ts.map +1 -1
  256. package/lib/runWhileConnectedCoordinator.js.map +1 -1
  257. package/lib/runningSummarizer.d.ts.map +1 -1
  258. package/lib/runningSummarizer.js +35 -23
  259. package/lib/runningSummarizer.js.map +1 -1
  260. package/lib/scheduleManager.d.ts +0 -1
  261. package/lib/scheduleManager.d.ts.map +1 -1
  262. package/lib/scheduleManager.js +11 -21
  263. package/lib/scheduleManager.js.map +1 -1
  264. package/lib/serializedSnapshotStorage.d.ts.map +1 -1
  265. package/lib/serializedSnapshotStorage.js +3 -1
  266. package/lib/serializedSnapshotStorage.js.map +1 -1
  267. package/lib/summarizer.d.ts +2 -3
  268. package/lib/summarizer.d.ts.map +1 -1
  269. package/lib/summarizer.js +39 -18
  270. package/lib/summarizer.js.map +1 -1
  271. package/lib/summarizerClientElection.d.ts +1 -2
  272. package/lib/summarizerClientElection.d.ts.map +1 -1
  273. package/lib/summarizerClientElection.js +3 -30
  274. package/lib/summarizerClientElection.js.map +1 -1
  275. package/lib/summarizerHandle.d.ts.map +1 -1
  276. package/lib/summarizerHandle.js.map +1 -1
  277. package/lib/summarizerHeuristics.d.ts.map +1 -1
  278. package/lib/summarizerHeuristics.js +6 -9
  279. package/lib/summarizerHeuristics.js.map +1 -1
  280. package/lib/summarizerTypes.d.ts +22 -25
  281. package/lib/summarizerTypes.d.ts.map +1 -1
  282. package/lib/summarizerTypes.js.map +1 -1
  283. package/lib/summaryCollection.d.ts.map +1 -1
  284. package/lib/summaryCollection.js +18 -8
  285. package/lib/summaryCollection.js.map +1 -1
  286. package/lib/summaryFormat.d.ts.map +1 -1
  287. package/lib/summaryFormat.js +20 -13
  288. package/lib/summaryFormat.js.map +1 -1
  289. package/lib/summaryGenerator.d.ts.map +1 -1
  290. package/lib/summaryGenerator.js +32 -14
  291. package/lib/summaryGenerator.js.map +1 -1
  292. package/lib/summaryManager.d.ts.map +1 -1
  293. package/lib/summaryManager.js +21 -9
  294. package/lib/summaryManager.js.map +1 -1
  295. package/lib/throttler.d.ts +2 -2
  296. package/lib/throttler.d.ts.map +1 -1
  297. package/lib/throttler.js +4 -4
  298. package/lib/throttler.js.map +1 -1
  299. package/package.json +28 -38
  300. package/prettier.config.cjs +1 -1
  301. package/src/batchTracker.ts +55 -50
  302. package/src/blobManager.ts +802 -541
  303. package/src/connectionTelemetry.ts +280 -249
  304. package/src/containerHandleContext.ts +27 -29
  305. package/src/containerRuntime.ts +3125 -2982
  306. package/src/dataStore.ts +172 -159
  307. package/src/dataStoreContext.ts +1049 -992
  308. package/src/dataStoreContexts.ts +178 -161
  309. package/src/dataStoreRegistry.ts +25 -20
  310. package/src/dataStores.ts +785 -711
  311. package/src/deltaScheduler.ts +158 -150
  312. package/src/garbageCollection.ts +1797 -1558
  313. package/src/garbageCollectionConstants.ts +38 -0
  314. package/src/garbageCollectionHelpers.ts +37 -0
  315. package/src/gcSweepReadyUsageDetection.ts +90 -84
  316. package/src/index.ts +68 -69
  317. package/src/opLifecycle/batchManager.ts +167 -0
  318. package/src/opLifecycle/definitions.ts +70 -0
  319. package/src/opLifecycle/index.ts +18 -0
  320. package/src/opLifecycle/opCompressor.ts +82 -0
  321. package/src/opLifecycle/opDecompressor.ts +124 -0
  322. package/src/opLifecycle/opSplitter.ts +238 -0
  323. package/src/opLifecycle/outbox.ts +228 -0
  324. package/src/opLifecycle/remoteMessageProcessor.ts +106 -0
  325. package/src/opProperties.ts +11 -9
  326. package/src/orderedClientElection.ts +489 -457
  327. package/src/packageVersion.ts +1 -1
  328. package/src/pendingStateManager.ts +379 -381
  329. package/src/runWhileConnectedCoordinator.ts +78 -71
  330. package/src/runningSummarizer.ts +619 -582
  331. package/src/scheduleManager.ts +299 -280
  332. package/src/serializedSnapshotStorage.ts +116 -111
  333. package/src/summarizer.ts +417 -381
  334. package/src/summarizerClientElection.ts +107 -129
  335. package/src/summarizerHandle.ts +11 -9
  336. package/src/summarizerHeuristics.ts +183 -186
  337. package/src/summarizerTypes.ts +344 -333
  338. package/src/summaryCollection.ts +378 -349
  339. package/src/summaryFormat.ts +146 -127
  340. package/src/summaryGenerator.ts +464 -406
  341. package/src/summaryManager.ts +377 -348
  342. package/src/throttler.ts +131 -122
  343. package/tsconfig.esnext.json +6 -6
  344. package/tsconfig.json +9 -13
  345. package/dist/batchManager.d.ts +0 -42
  346. package/dist/batchManager.d.ts.map +0 -1
  347. package/dist/batchManager.js +0 -83
  348. package/dist/batchManager.js.map +0 -1
  349. package/dist/opCompressor.d.ts.map +0 -1
  350. package/dist/opCompressor.js +0 -50
  351. package/dist/opCompressor.js.map +0 -1
  352. package/dist/opDecompressor.d.ts.map +0 -1
  353. package/dist/opDecompressor.js.map +0 -1
  354. package/lib/batchManager.d.ts +0 -42
  355. package/lib/batchManager.d.ts.map +0 -1
  356. package/lib/batchManager.js +0 -79
  357. package/lib/batchManager.js.map +0 -1
  358. package/lib/opCompressor.d.ts.map +0 -1
  359. package/lib/opCompressor.js +0 -46
  360. package/lib/opCompressor.js.map +0 -1
  361. package/lib/opDecompressor.d.ts.map +0 -1
  362. package/lib/opDecompressor.js.map +0 -1
  363. package/src/batchManager.ts +0 -108
  364. package/src/opCompressor.ts +0 -59
  365. package/src/opDecompressor.ts +0 -82
@@ -6,18 +6,22 @@
6
6
  import { IEvent, IEventProvider, ITelemetryLogger } from "@fluidframework/common-definitions";
7
7
  import { TypedEventEmitter } from "@fluidframework/common-utils";
8
8
  import { IClientDetails, MessageType } from "@fluidframework/protocol-definitions";
9
- import { IOrderedClientElection, ISerializedElection, ITrackedClient } from "./orderedClientElection";
9
+ import {
10
+ IOrderedClientElection,
11
+ ISerializedElection,
12
+ ITrackedClient,
13
+ } from "./orderedClientElection";
10
14
  import { ISummaryCollectionOpEvents } from "./summaryCollection";
11
15
 
12
16
  export const summarizerClientType = "summarizer";
13
17
 
14
18
  export interface ISummarizerClientElectionEvents extends IEvent {
15
- (event: "electedSummarizerChanged", handler: () => void): void;
19
+ (event: "electedSummarizerChanged", handler: () => void): void;
16
20
  }
17
21
 
18
22
  export interface ISummarizerClientElection extends IEventProvider<ISummarizerClientElectionEvents> {
19
- readonly electedClientId: string | undefined;
20
- readonly electedParentId: string | undefined;
23
+ readonly electedClientId: string | undefined;
24
+ readonly electedParentId: string | undefined;
21
25
  }
22
26
 
23
27
  /**
@@ -26,136 +30,110 @@ export interface ISummarizerClientElection extends IEventProvider<ISummarizerCli
26
30
  * for some configured number of ops.
27
31
  */
28
32
  export class SummarizerClientElection
29
- extends TypedEventEmitter<ISummarizerClientElectionEvents>
30
- implements ISummarizerClientElection {
31
- /**
32
- * Used to calculate number of ops since last summary ack for the current elected client.
33
- * This will be undefined if there is no elected summarizer, or no summary ack has been
34
- * observed since this client was elected.
35
- * When a summary ack comes in, this will be set to the sequence number of the summary ack.
36
- */
37
- private lastSummaryAckSeqForClient: number | undefined;
38
- /**
39
- * Used to prevent excess logging by recording the sequence number that we last reported at,
40
- * and making sure we don't report another event to telemetry. If things work as intended,
41
- * this is not needed, otherwise it could report an event on every op in worst case scenario.
42
- */
43
- private lastReportedSeq = 0;
33
+ extends TypedEventEmitter<ISummarizerClientElectionEvents>
34
+ implements ISummarizerClientElection
35
+ {
36
+ /**
37
+ * Used to calculate number of ops since last summary ack for the current elected client.
38
+ * This will be undefined if there is no elected summarizer, or no summary ack has been
39
+ * observed since this client was elected.
40
+ * When a summary ack comes in, this will be set to the sequence number of the summary ack.
41
+ */
42
+ private lastSummaryAckSeqForClient: number | undefined;
43
+ /**
44
+ * Used to prevent excess logging by recording the sequence number that we last reported at,
45
+ * and making sure we don't report another event to telemetry. If things work as intended,
46
+ * this is not needed, otherwise it could report an event on every op in worst case scenario.
47
+ */
48
+ private lastReportedSeq = 0;
44
49
 
45
- public get electedClientId() {
46
- return this.clientElection.electedClient?.clientId;
47
- }
48
- public get electedParentId() {
49
- return this.clientElection.electedParent?.clientId;
50
- }
50
+ public get electedClientId() {
51
+ return this.clientElection.electedClient?.clientId;
52
+ }
53
+ public get electedParentId() {
54
+ return this.clientElection.electedParent?.clientId;
55
+ }
51
56
 
52
- constructor(
53
- private readonly logger: ITelemetryLogger,
54
- private readonly summaryCollection: IEventProvider<ISummaryCollectionOpEvents>,
55
- public readonly clientElection: IOrderedClientElection,
56
- private readonly maxOpsSinceLastSummary: number,
57
- private readonly electionEnabled: boolean,
58
- ) {
59
- super();
60
- // On every inbound op, if enough ops pass without seeing a summary ack (per elected client),
61
- // elect a new client and log to telemetry.
62
- this.summaryCollection.on("default", ({ sequenceNumber }) => {
63
- const electedClientId = this.electedClientId;
64
- if (electedClientId === undefined) {
65
- // Reset election if no elected client, but eligible clients are connected.
66
- // This should be uncommon, but is possible if the initial state of the
67
- // ordered client election contains an undefined client id or one not found
68
- // in the quorum (the latter would already log an error).
69
- if (this.clientElection.eligibleCount > 0) {
70
- this.clientElection.resetElectedClient(sequenceNumber);
71
- }
72
- return;
73
- }
74
- let electionSequenceNumber = this.clientElection.electionSequenceNumber;
75
- const opsWithoutSummary = sequenceNumber - (this.lastSummaryAckSeqForClient ?? electionSequenceNumber);
76
- if (opsWithoutSummary > this.maxOpsSinceLastSummary) {
77
- // Log and elect a new summarizer client.
78
- const opsSinceLastReport = sequenceNumber - this.lastReportedSeq;
79
- if (opsSinceLastReport > this.maxOpsSinceLastSummary) {
80
- this.logger.sendTelemetryEvent({
81
- eventName: "ElectedClientNotSummarizing",
82
- electedClientId,
83
- lastSummaryAckSeqForClient: this.lastSummaryAckSeqForClient,
84
- electionSequenceNumber,
85
- nextElectedClientId: this.clientElection.peekNextElectedClient()?.clientId,
86
- electionEnabled: this.electionEnabled,
87
- });
88
- this.lastReportedSeq = sequenceNumber;
89
- }
57
+ constructor(
58
+ private readonly logger: ITelemetryLogger,
59
+ private readonly summaryCollection: IEventProvider<ISummaryCollectionOpEvents>,
60
+ public readonly clientElection: IOrderedClientElection,
61
+ private readonly maxOpsSinceLastSummary: number,
62
+ ) {
63
+ super();
64
+ // On every inbound op, if enough ops pass without seeing a summary ack (per elected client),
65
+ // elect a new client and log to telemetry.
66
+ this.summaryCollection.on("default", ({ sequenceNumber }) => {
67
+ const electedClientId = this.electedClientId;
68
+ if (electedClientId === undefined) {
69
+ // Reset election if no elected client, but eligible clients are connected.
70
+ // This should be uncommon, but is possible if the initial state of the
71
+ // ordered client election contains an undefined client id or one not found
72
+ // in the quorum (the latter would already log an error).
73
+ if (this.clientElection.eligibleCount > 0) {
74
+ this.clientElection.resetElectedClient(sequenceNumber);
75
+ }
76
+ return;
77
+ }
78
+ const electionSequenceNumber = this.clientElection.electionSequenceNumber;
79
+ const opsWithoutSummary =
80
+ sequenceNumber - (this.lastSummaryAckSeqForClient ?? electionSequenceNumber);
81
+ if (opsWithoutSummary > this.maxOpsSinceLastSummary) {
82
+ // Log and elect a new summarizer client.
83
+ const opsSinceLastReport = sequenceNumber - this.lastReportedSeq;
84
+ if (opsSinceLastReport > this.maxOpsSinceLastSummary) {
85
+ this.logger.sendTelemetryEvent({
86
+ eventName: "ElectedClientNotSummarizing",
87
+ electedClientId,
88
+ lastSummaryAckSeqForClient: this.lastSummaryAckSeqForClient,
89
+ electionSequenceNumber,
90
+ nextElectedClientId: this.clientElection.peekNextElectedClient()?.clientId,
91
+ });
92
+ this.lastReportedSeq = sequenceNumber;
93
+ }
94
+ }
95
+ });
90
96
 
91
- if (this.electionEnabled) {
92
- const previousParentId = this.electedParentId;
93
- this.clientElection.incrementElectedClient(sequenceNumber);
97
+ // When a summary ack comes in, reset our op seq counter.
98
+ this.summaryCollection.on(MessageType.SummaryAck, (op) => {
99
+ this.lastSummaryAckSeqForClient = op.sequenceNumber;
100
+ });
94
101
 
95
- // Verify that state incremented as expected. This should be reliable,
96
- // since all of OrderedClientElection is synchronous.
97
- electionSequenceNumber = this.clientElection.electionSequenceNumber;
98
- if (sequenceNumber > (this.lastSummaryAckSeqForClient ?? electionSequenceNumber)) {
99
- if (opsSinceLastReport > this.maxOpsSinceLastSummary) {
100
- this.logger.sendErrorEvent({
101
- eventName: "UnexpectedElectionSequenceNumber",
102
- // Expected to be undefined
103
- lastSummaryAckSeqForClient: this.lastSummaryAckSeqForClient,
104
- // Expected to be same as op sequenceNumber
105
- electionSequenceNumber,
106
- sequenceNumber,
107
- previousClientId: electedClientId,
108
- previousParentId,
109
- electedParentId: this.electedParentId,
110
- electedClientId: this.electedClientId,
111
- opsSinceLastReport,
112
- maxOpsSinceLastSummary,
113
- });
114
- }
115
- }
116
- }
117
- }
118
- });
102
+ // Use oldest client election for unanimously and deterministically deciding
103
+ // which client should summarize.
104
+ this.clientElection.on("election", (client, sequenceNumber) => {
105
+ this.lastSummaryAckSeqForClient = undefined;
106
+ if (client === undefined && this.clientElection.eligibleCount > 0) {
107
+ // If no client is valid for election, reset to the oldest again.
108
+ // Also make extra sure not to get stuck in an infinite loop here:
109
+ // If there are no eligible clients, just wait until a client joins
110
+ // and will be auto-elected.
111
+ this.clientElection.resetElectedClient(sequenceNumber);
112
+ }
113
+ // Election can trigger a change in SummaryManager state.
114
+ this.emit("electedSummarizerChanged");
115
+ });
116
+ }
119
117
 
120
- // When a summary ack comes in, reset our op seq counter.
121
- this.summaryCollection.on(MessageType.SummaryAck, (op) => {
122
- this.lastSummaryAckSeqForClient = op.sequenceNumber;
123
- });
118
+ public serialize(): ISerializedElection {
119
+ const { electedClientId, electedParentId, electionSequenceNumber } =
120
+ this.clientElection.serialize();
121
+ return {
122
+ electedClientId,
123
+ electedParentId,
124
+ electionSequenceNumber: this.lastSummaryAckSeqForClient ?? electionSequenceNumber,
125
+ };
126
+ }
124
127
 
125
- // Use oldest client election for unanimously and deterministically deciding
126
- // which client should summarize.
127
- this.clientElection.on("election", (client, sequenceNumber) => {
128
- this.lastSummaryAckSeqForClient = undefined;
129
- if (client === undefined && this.clientElection.eligibleCount > 0) {
130
- // If no client is valid for election, reset to the oldest again.
131
- // Also make extra sure not to get stuck in an infinite loop here:
132
- // If there are no eligible clients, just wait until a client joins
133
- // and will be auto-elected.
134
- this.clientElection.resetElectedClient(sequenceNumber);
135
- }
136
- // Election can trigger a change in SummaryManager state.
137
- this.emit("electedSummarizerChanged");
138
- });
139
- }
128
+ public static isClientEligible(client: ITrackedClient): boolean {
129
+ const details = client.client.details;
130
+ if (details === undefined) {
131
+ // Very old clients back-compat
132
+ return true;
133
+ }
134
+ return SummarizerClientElection.clientDetailsPermitElection(details);
135
+ }
140
136
 
141
- public serialize(): ISerializedElection {
142
- const { electedClientId, electedParentId, electionSequenceNumber } = this.clientElection.serialize();
143
- return {
144
- electedClientId,
145
- electedParentId,
146
- electionSequenceNumber: this.lastSummaryAckSeqForClient ?? electionSequenceNumber,
147
- };
148
- }
149
-
150
- public static isClientEligible(client: ITrackedClient): boolean {
151
- const details = client.client.details;
152
- if (details === undefined) {
153
- // Very old clients back-compat
154
- return true;
155
- }
156
- return SummarizerClientElection.clientDetailsPermitElection(details);
157
- }
158
-
159
- public static readonly clientDetailsPermitElection = (details: IClientDetails): boolean =>
160
- details.capabilities.interactive || details.type === summarizerClientType;
137
+ public static readonly clientDetailsPermitElection = (details: IClientDetails): boolean =>
138
+ details.capabilities.interactive || details.type === summarizerClientType;
161
139
  }
@@ -7,15 +7,17 @@ import { IFluidHandle } from "@fluidframework/core-interfaces";
7
7
 
8
8
  // TODO #2425 Expose Summarizer handle as FluidObjectHandle w/ tests
9
9
  export class SummarizerHandle extends FluidObjectHandle {
10
- public async get(): Promise<any> {
11
- throw Error("Do not try to get a summarizer object from the handle. Reference it directly.");
12
- }
10
+ public async get(): Promise<any> {
11
+ throw Error(
12
+ "Do not try to get a summarizer object from the handle. Reference it directly.",
13
+ );
14
+ }
13
15
 
14
- public attach(): void {
15
- return;
16
- }
16
+ public attach(): void {
17
+ return;
18
+ }
17
19
 
18
- public bind(handle: IFluidHandle) {
19
- return;
20
- }
20
+ public bind(handle: IFluidHandle) {
21
+ return;
22
+ }
21
23
  }