@fluidframework/container-runtime 2.0.0-dev.2.3.0.115467 → 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 (340) 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 +53 -34
  9. package/dist/blobManager.d.ts.map +1 -1
  10. package/dist/blobManager.js +236 -124
  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 +95 -46
  19. package/dist/containerRuntime.d.ts.map +1 -1
  20. package/dist/containerRuntime.js +288 -135
  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 +38 -21
  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 +68 -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 +50 -26
  43. package/dist/garbageCollection.d.ts.map +1 -1
  44. package/dist/garbageCollection.js +348 -196
  45. package/dist/garbageCollection.js.map +1 -1
  46. package/dist/garbageCollectionConstants.d.ts +7 -3
  47. package/dist/garbageCollectionConstants.d.ts.map +1 -1
  48. package/dist/garbageCollectionConstants.js +10 -8
  49. package/dist/garbageCollectionConstants.js.map +1 -1
  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 +14 -10
  57. package/dist/gcSweepReadyUsageDetection.js.map +1 -1
  58. package/dist/index.d.ts +3 -4
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +3 -5
  61. package/dist/index.js.map +1 -1
  62. package/dist/opLifecycle/batchManager.d.ts +13 -1
  63. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  64. package/dist/opLifecycle/batchManager.js +48 -7
  65. package/dist/opLifecycle/batchManager.js.map +1 -1
  66. package/dist/opLifecycle/definitions.d.ts +25 -1
  67. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  68. package/dist/opLifecycle/definitions.js.map +1 -1
  69. package/dist/opLifecycle/index.d.ts +2 -2
  70. package/dist/opLifecycle/index.d.ts.map +1 -1
  71. package/dist/opLifecycle/index.js +2 -1
  72. package/dist/opLifecycle/index.js.map +1 -1
  73. package/dist/opLifecycle/opCompressor.d.ts +1 -1
  74. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  75. package/dist/opLifecycle/opCompressor.js +24 -10
  76. package/dist/opLifecycle/opCompressor.js.map +1 -1
  77. package/dist/opLifecycle/opDecompressor.d.ts +2 -1
  78. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  79. package/dist/opLifecycle/opDecompressor.js +33 -17
  80. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  81. package/dist/opLifecycle/opSplitter.d.ts +34 -2
  82. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  83. package/dist/opLifecycle/opSplitter.js +117 -5
  84. package/dist/opLifecycle/opSplitter.js.map +1 -1
  85. package/dist/opLifecycle/outbox.d.ts +5 -0
  86. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  87. package/dist/opLifecycle/outbox.js +38 -27
  88. package/dist/opLifecycle/outbox.js.map +1 -1
  89. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  90. package/dist/opLifecycle/remoteMessageProcessor.js +17 -2
  91. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  92. package/dist/opProperties.d.ts.map +1 -1
  93. package/dist/opProperties.js +1 -3
  94. package/dist/opProperties.js.map +1 -1
  95. package/dist/orderedClientElection.d.ts.map +1 -1
  96. package/dist/orderedClientElection.js +10 -4
  97. package/dist/orderedClientElection.js.map +1 -1
  98. package/dist/packageVersion.d.ts +1 -1
  99. package/dist/packageVersion.js +1 -1
  100. package/dist/packageVersion.js.map +1 -1
  101. package/dist/pendingStateManager.d.ts +4 -13
  102. package/dist/pendingStateManager.d.ts.map +1 -1
  103. package/dist/pendingStateManager.js +134 -161
  104. package/dist/pendingStateManager.js.map +1 -1
  105. package/dist/runWhileConnectedCoordinator.d.ts.map +1 -1
  106. package/dist/runWhileConnectedCoordinator.js.map +1 -1
  107. package/dist/runningSummarizer.d.ts.map +1 -1
  108. package/dist/runningSummarizer.js +34 -22
  109. package/dist/runningSummarizer.js.map +1 -1
  110. package/dist/scheduleManager.d.ts +0 -1
  111. package/dist/scheduleManager.d.ts.map +1 -1
  112. package/dist/scheduleManager.js +11 -21
  113. package/dist/scheduleManager.js.map +1 -1
  114. package/dist/serializedSnapshotStorage.d.ts.map +1 -1
  115. package/dist/serializedSnapshotStorage.js +3 -1
  116. package/dist/serializedSnapshotStorage.js.map +1 -1
  117. package/dist/summarizer.d.ts +2 -3
  118. package/dist/summarizer.d.ts.map +1 -1
  119. package/dist/summarizer.js +39 -18
  120. package/dist/summarizer.js.map +1 -1
  121. package/dist/summarizerClientElection.d.ts +1 -2
  122. package/dist/summarizerClientElection.d.ts.map +1 -1
  123. package/dist/summarizerClientElection.js +3 -30
  124. package/dist/summarizerClientElection.js.map +1 -1
  125. package/dist/summarizerHandle.d.ts.map +1 -1
  126. package/dist/summarizerHandle.js.map +1 -1
  127. package/dist/summarizerHeuristics.d.ts.map +1 -1
  128. package/dist/summarizerHeuristics.js +6 -9
  129. package/dist/summarizerHeuristics.js.map +1 -1
  130. package/dist/summarizerTypes.d.ts +22 -25
  131. package/dist/summarizerTypes.d.ts.map +1 -1
  132. package/dist/summarizerTypes.js.map +1 -1
  133. package/dist/summaryCollection.d.ts.map +1 -1
  134. package/dist/summaryCollection.js +18 -8
  135. package/dist/summaryCollection.js.map +1 -1
  136. package/dist/summaryFormat.d.ts.map +1 -1
  137. package/dist/summaryFormat.js +18 -11
  138. package/dist/summaryFormat.js.map +1 -1
  139. package/dist/summaryGenerator.d.ts.map +1 -1
  140. package/dist/summaryGenerator.js +32 -14
  141. package/dist/summaryGenerator.js.map +1 -1
  142. package/dist/summaryManager.d.ts.map +1 -1
  143. package/dist/summaryManager.js +21 -9
  144. package/dist/summaryManager.js.map +1 -1
  145. package/dist/throttler.d.ts +2 -2
  146. package/dist/throttler.d.ts.map +1 -1
  147. package/dist/throttler.js +4 -4
  148. package/dist/throttler.js.map +1 -1
  149. package/garbageCollection.md +15 -2
  150. package/lib/batchTracker.d.ts +1 -2
  151. package/lib/batchTracker.d.ts.map +1 -1
  152. package/lib/batchTracker.js +2 -1
  153. package/lib/batchTracker.js.map +1 -1
  154. package/lib/blobManager.d.ts +53 -34
  155. package/lib/blobManager.d.ts.map +1 -1
  156. package/lib/blobManager.js +239 -127
  157. package/lib/blobManager.js.map +1 -1
  158. package/lib/connectionTelemetry.d.ts.map +1 -1
  159. package/lib/connectionTelemetry.js +11 -9
  160. package/lib/connectionTelemetry.js.map +1 -1
  161. package/lib/containerHandleContext.d.ts.map +1 -1
  162. package/lib/containerHandleContext.js +3 -1
  163. package/lib/containerHandleContext.js.map +1 -1
  164. package/lib/containerRuntime.d.ts +95 -46
  165. package/lib/containerRuntime.d.ts.map +1 -1
  166. package/lib/containerRuntime.js +291 -138
  167. package/lib/containerRuntime.js.map +1 -1
  168. package/lib/dataStore.d.ts.map +1 -1
  169. package/lib/dataStore.js +11 -9
  170. package/lib/dataStore.js.map +1 -1
  171. package/lib/dataStoreContext.d.ts +2 -1
  172. package/lib/dataStoreContext.d.ts.map +1 -1
  173. package/lib/dataStoreContext.js +40 -23
  174. package/lib/dataStoreContext.js.map +1 -1
  175. package/lib/dataStoreContexts.d.ts.map +1 -1
  176. package/lib/dataStoreContexts.js +7 -3
  177. package/lib/dataStoreContexts.js.map +1 -1
  178. package/lib/dataStoreRegistry.d.ts.map +1 -1
  179. package/lib/dataStoreRegistry.js +3 -1
  180. package/lib/dataStoreRegistry.js.map +1 -1
  181. package/lib/dataStores.d.ts +12 -9
  182. package/lib/dataStores.d.ts.map +1 -1
  183. package/lib/dataStores.js +74 -52
  184. package/lib/dataStores.js.map +1 -1
  185. package/lib/deltaScheduler.d.ts.map +1 -1
  186. package/lib/deltaScheduler.js +9 -4
  187. package/lib/deltaScheduler.js.map +1 -1
  188. package/lib/garbageCollection.d.ts +50 -26
  189. package/lib/garbageCollection.d.ts.map +1 -1
  190. package/lib/garbageCollection.js +347 -195
  191. package/lib/garbageCollection.js.map +1 -1
  192. package/lib/garbageCollectionConstants.d.ts +7 -3
  193. package/lib/garbageCollectionConstants.d.ts.map +1 -1
  194. package/lib/garbageCollectionConstants.js +9 -7
  195. package/lib/garbageCollectionConstants.js.map +1 -1
  196. package/lib/garbageCollectionHelpers.d.ts +15 -0
  197. package/lib/garbageCollectionHelpers.d.ts.map +1 -0
  198. package/lib/garbageCollectionHelpers.js +23 -0
  199. package/lib/garbageCollectionHelpers.js.map +1 -0
  200. package/lib/gcSweepReadyUsageDetection.d.ts +5 -5
  201. package/lib/gcSweepReadyUsageDetection.d.ts.map +1 -1
  202. package/lib/gcSweepReadyUsageDetection.js +14 -10
  203. package/lib/gcSweepReadyUsageDetection.js.map +1 -1
  204. package/lib/index.d.ts +3 -4
  205. package/lib/index.d.ts.map +1 -1
  206. package/lib/index.js +2 -3
  207. package/lib/index.js.map +1 -1
  208. package/lib/opLifecycle/batchManager.d.ts +13 -1
  209. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  210. package/lib/opLifecycle/batchManager.js +48 -7
  211. package/lib/opLifecycle/batchManager.js.map +1 -1
  212. package/lib/opLifecycle/definitions.d.ts +25 -1
  213. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  214. package/lib/opLifecycle/definitions.js.map +1 -1
  215. package/lib/opLifecycle/index.d.ts +2 -2
  216. package/lib/opLifecycle/index.d.ts.map +1 -1
  217. package/lib/opLifecycle/index.js +1 -1
  218. package/lib/opLifecycle/index.js.map +1 -1
  219. package/lib/opLifecycle/opCompressor.d.ts +1 -1
  220. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  221. package/lib/opLifecycle/opCompressor.js +24 -10
  222. package/lib/opLifecycle/opCompressor.js.map +1 -1
  223. package/lib/opLifecycle/opDecompressor.d.ts +2 -1
  224. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  225. package/lib/opLifecycle/opDecompressor.js +33 -17
  226. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  227. package/lib/opLifecycle/opSplitter.d.ts +34 -2
  228. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  229. package/lib/opLifecycle/opSplitter.js +116 -5
  230. package/lib/opLifecycle/opSplitter.js.map +1 -1
  231. package/lib/opLifecycle/outbox.d.ts +5 -0
  232. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  233. package/lib/opLifecycle/outbox.js +38 -27
  234. package/lib/opLifecycle/outbox.js.map +1 -1
  235. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  236. package/lib/opLifecycle/remoteMessageProcessor.js +17 -2
  237. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  238. package/lib/opProperties.d.ts.map +1 -1
  239. package/lib/opProperties.js +1 -3
  240. package/lib/opProperties.js.map +1 -1
  241. package/lib/orderedClientElection.d.ts.map +1 -1
  242. package/lib/orderedClientElection.js +10 -4
  243. package/lib/orderedClientElection.js.map +1 -1
  244. package/lib/packageVersion.d.ts +1 -1
  245. package/lib/packageVersion.js +1 -1
  246. package/lib/packageVersion.js.map +1 -1
  247. package/lib/pendingStateManager.d.ts +4 -13
  248. package/lib/pendingStateManager.d.ts.map +1 -1
  249. package/lib/pendingStateManager.js +134 -161
  250. package/lib/pendingStateManager.js.map +1 -1
  251. package/lib/runWhileConnectedCoordinator.d.ts.map +1 -1
  252. package/lib/runWhileConnectedCoordinator.js.map +1 -1
  253. package/lib/runningSummarizer.d.ts.map +1 -1
  254. package/lib/runningSummarizer.js +35 -23
  255. package/lib/runningSummarizer.js.map +1 -1
  256. package/lib/scheduleManager.d.ts +0 -1
  257. package/lib/scheduleManager.d.ts.map +1 -1
  258. package/lib/scheduleManager.js +11 -21
  259. package/lib/scheduleManager.js.map +1 -1
  260. package/lib/serializedSnapshotStorage.d.ts.map +1 -1
  261. package/lib/serializedSnapshotStorage.js +3 -1
  262. package/lib/serializedSnapshotStorage.js.map +1 -1
  263. package/lib/summarizer.d.ts +2 -3
  264. package/lib/summarizer.d.ts.map +1 -1
  265. package/lib/summarizer.js +39 -18
  266. package/lib/summarizer.js.map +1 -1
  267. package/lib/summarizerClientElection.d.ts +1 -2
  268. package/lib/summarizerClientElection.d.ts.map +1 -1
  269. package/lib/summarizerClientElection.js +3 -30
  270. package/lib/summarizerClientElection.js.map +1 -1
  271. package/lib/summarizerHandle.d.ts.map +1 -1
  272. package/lib/summarizerHandle.js.map +1 -1
  273. package/lib/summarizerHeuristics.d.ts.map +1 -1
  274. package/lib/summarizerHeuristics.js +6 -9
  275. package/lib/summarizerHeuristics.js.map +1 -1
  276. package/lib/summarizerTypes.d.ts +22 -25
  277. package/lib/summarizerTypes.d.ts.map +1 -1
  278. package/lib/summarizerTypes.js.map +1 -1
  279. package/lib/summaryCollection.d.ts.map +1 -1
  280. package/lib/summaryCollection.js +18 -8
  281. package/lib/summaryCollection.js.map +1 -1
  282. package/lib/summaryFormat.d.ts.map +1 -1
  283. package/lib/summaryFormat.js +20 -13
  284. package/lib/summaryFormat.js.map +1 -1
  285. package/lib/summaryGenerator.d.ts.map +1 -1
  286. package/lib/summaryGenerator.js +32 -14
  287. package/lib/summaryGenerator.js.map +1 -1
  288. package/lib/summaryManager.d.ts.map +1 -1
  289. package/lib/summaryManager.js +21 -9
  290. package/lib/summaryManager.js.map +1 -1
  291. package/lib/throttler.d.ts +2 -2
  292. package/lib/throttler.d.ts.map +1 -1
  293. package/lib/throttler.js +4 -4
  294. package/lib/throttler.js.map +1 -1
  295. package/package.json +27 -24
  296. package/prettier.config.cjs +1 -1
  297. package/src/batchTracker.ts +55 -50
  298. package/src/blobManager.ts +799 -593
  299. package/src/connectionTelemetry.ts +280 -249
  300. package/src/containerHandleContext.ts +27 -29
  301. package/src/containerRuntime.ts +3123 -2793
  302. package/src/dataStore.ts +172 -159
  303. package/src/dataStoreContext.ts +1048 -991
  304. package/src/dataStoreContexts.ts +178 -161
  305. package/src/dataStoreRegistry.ts +25 -20
  306. package/src/dataStores.ts +784 -711
  307. package/src/deltaScheduler.ts +158 -150
  308. package/src/garbageCollection.ts +1795 -1546
  309. package/src/garbageCollectionConstants.ts +10 -7
  310. package/src/garbageCollectionHelpers.ts +37 -0
  311. package/src/gcSweepReadyUsageDetection.ts +89 -83
  312. package/src/index.ts +67 -69
  313. package/src/opLifecycle/batchManager.ts +148 -86
  314. package/src/opLifecycle/definitions.ts +45 -19
  315. package/src/opLifecycle/index.ts +6 -5
  316. package/src/opLifecycle/opCompressor.ts +57 -39
  317. package/src/opLifecycle/opDecompressor.ts +104 -64
  318. package/src/opLifecycle/opSplitter.ts +226 -66
  319. package/src/opLifecycle/outbox.ts +206 -182
  320. package/src/opLifecycle/remoteMessageProcessor.ts +63 -47
  321. package/src/opProperties.ts +11 -9
  322. package/src/orderedClientElection.ts +489 -457
  323. package/src/packageVersion.ts +1 -1
  324. package/src/pendingStateManager.ts +379 -381
  325. package/src/runWhileConnectedCoordinator.ts +78 -71
  326. package/src/runningSummarizer.ts +619 -582
  327. package/src/scheduleManager.ts +299 -280
  328. package/src/serializedSnapshotStorage.ts +116 -111
  329. package/src/summarizer.ts +417 -381
  330. package/src/summarizerClientElection.ts +107 -129
  331. package/src/summarizerHandle.ts +11 -9
  332. package/src/summarizerHeuristics.ts +183 -186
  333. package/src/summarizerTypes.ts +344 -333
  334. package/src/summaryCollection.ts +378 -349
  335. package/src/summaryFormat.ts +146 -127
  336. package/src/summaryGenerator.ts +464 -406
  337. package/src/summaryManager.ts +377 -348
  338. package/src/throttler.ts +131 -122
  339. package/tsconfig.esnext.json +6 -6
  340. package/tsconfig.json +9 -13
package/src/throttler.ts CHANGED
@@ -4,28 +4,28 @@
4
4
  */
5
5
 
6
6
  export interface IThrottler {
7
- /**
8
- * Computes what the throttle delay should be, and records an attempt
9
- * which will be used for calculating future attempt delays.
10
- */
11
- getDelay(): number;
12
-
13
- /**
14
- * Number of attempts that occurred within the sliding window as of
15
- * the most recent delay computation.
16
- */
17
- readonly numAttempts: number;
18
-
19
- /** Width of sliding delay window in milliseconds. */
20
- readonly delayWindowMs: number;
21
- /** Maximum delay allowed in milliseconds. */
22
- readonly maxDelayMs: number;
23
- /**
24
- * Delay function used to calculate what the delay should be.
25
- * The input is the number of attempts that occurred within the sliding window.
26
- * The result is the calculated delay in milliseconds.
27
- */
28
- readonly delayFn: (numAttempts: number) => number;
7
+ /**
8
+ * Computes what the throttle delay should be, and records an attempt
9
+ * which will be used for calculating future attempt delays.
10
+ */
11
+ getDelay(): number;
12
+
13
+ /**
14
+ * Number of attempts that occurred within the sliding window as of
15
+ * the most recent delay computation.
16
+ */
17
+ readonly numAttempts: number;
18
+
19
+ /** Width of sliding delay window in milliseconds. */
20
+ readonly delayWindowMs: number;
21
+ /** Maximum delay allowed in milliseconds. */
22
+ readonly maxDelayMs: number;
23
+ /**
24
+ * Delay function used to calculate what the delay should be.
25
+ * The input is the number of attempts that occurred within the sliding window.
26
+ * The result is the calculated delay in milliseconds.
27
+ */
28
+ readonly delayFn: (numAttempts: number) => number;
29
29
  }
30
30
 
31
31
  /**
@@ -33,74 +33,74 @@ export interface IThrottler {
33
33
  * Delay is based on previous attempts within specified time window, subtracting delay time.
34
34
  */
35
35
  export class Throttler implements IThrottler {
36
- private startTimes: number[] = [];
37
-
38
- public get numAttempts() {
39
- return this.startTimes.length;
40
- }
41
-
42
- /**
43
- * Gets all attempt start times after compensating for the delay times
44
- * by adding the delay times to the actual times.
45
- */
46
- public getAttempts(): readonly number[] {
47
- return [...this.startTimes];
48
- }
49
-
50
- /**
51
- * Latest attempt time after compensating for the delay time itself
52
- * by adding the delay time to the actual time.
53
- */
54
- public get latestAttemptTime() {
55
- return this.startTimes.length > 0 ? this.startTimes[this.startTimes.length - 1] : undefined;
56
- }
57
-
58
- constructor(
59
- /** Width of sliding delay window in milliseconds. */
60
- public readonly delayWindowMs: number,
61
- /** Maximum delay allowed in milliseconds. */
62
- public readonly maxDelayMs: number,
63
- /**
64
- * Delay function used to calculate what the delay should be.
65
- * The input is the number of attempts that occurred within the sliding window.
66
- * The result is the calculated delay in milliseconds.
67
- */
68
- public readonly delayFn: (numAttempts: number) => number,
69
- ) { }
70
-
71
- public getDelay() {
72
- const now = Date.now();
73
-
74
- const latestAttemptTime = this.latestAttemptTime;
75
- if (latestAttemptTime !== undefined) {
76
- // If getDelay was called sooner than the most recent delay,
77
- // subtract the remaining time, since we previously added it.
78
- const earlyMs = latestAttemptTime - now;
79
- if (earlyMs > 0) {
80
- this.startTimes = this.startTimes.map((t) => t - earlyMs);
81
- }
82
- }
83
-
84
- // Remove all attempts that have already fallen out of the window.
85
- this.startTimes = this.startTimes.filter((t) => (now - t) < this.delayWindowMs);
86
-
87
- // Compute delay, but do not exceed the specified max delay.
88
- const delayMs = Math.min(this.delayFn(this.startTimes.length), this.maxDelayMs);
89
-
90
- // Record this attempt start time.
91
- this.startTimes.push(now);
92
-
93
- // Account for the delay time, by effectively removing it from the delay window.
94
- this.startTimes = this.startTimes.map((t) => t + delayMs);
95
-
96
- if (delayMs === this.maxDelayMs) {
97
- // We hit max delay, so adding more won't affect anything.
98
- // Shift off oldest time to stop this array from growing forever.
99
- this.startTimes.shift();
100
- }
101
-
102
- return delayMs;
103
- }
36
+ private startTimes: number[] = [];
37
+
38
+ public get numAttempts() {
39
+ return this.startTimes.length;
40
+ }
41
+
42
+ /**
43
+ * Gets all attempt start times after compensating for the delay times
44
+ * by adding the delay times to the actual times.
45
+ */
46
+ public getAttempts(): readonly number[] {
47
+ return [...this.startTimes];
48
+ }
49
+
50
+ /**
51
+ * Latest attempt time after compensating for the delay time itself
52
+ * by adding the delay time to the actual time.
53
+ */
54
+ public get latestAttemptTime() {
55
+ return this.startTimes.length > 0 ? this.startTimes[this.startTimes.length - 1] : undefined;
56
+ }
57
+
58
+ constructor(
59
+ /** Width of sliding delay window in milliseconds. */
60
+ public readonly delayWindowMs: number,
61
+ /** Maximum delay allowed in milliseconds. */
62
+ public readonly maxDelayMs: number,
63
+ /**
64
+ * Delay function used to calculate what the delay should be.
65
+ * The input is the number of attempts that occurred within the sliding window.
66
+ * The result is the calculated delay in milliseconds.
67
+ */
68
+ public readonly delayFn: (numAttempts: number) => number,
69
+ ) {}
70
+
71
+ public getDelay() {
72
+ const now = Date.now();
73
+
74
+ const latestAttemptTime = this.latestAttemptTime;
75
+ if (latestAttemptTime !== undefined) {
76
+ // If getDelay was called sooner than the most recent delay,
77
+ // subtract the remaining time, since we previously added it.
78
+ const earlyMs = latestAttemptTime - now;
79
+ if (earlyMs > 0) {
80
+ this.startTimes = this.startTimes.map((t) => t - earlyMs);
81
+ }
82
+ }
83
+
84
+ // Remove all attempts that have already fallen out of the window.
85
+ this.startTimes = this.startTimes.filter((t) => now - t < this.delayWindowMs);
86
+
87
+ // Compute delay, but do not exceed the specified max delay.
88
+ const delayMs = Math.min(this.delayFn(this.startTimes.length), this.maxDelayMs);
89
+
90
+ // Record this attempt start time.
91
+ this.startTimes.push(now);
92
+
93
+ // Account for the delay time, by effectively removing it from the delay window.
94
+ this.startTimes = this.startTimes.map((t) => t + delayMs);
95
+
96
+ if (delayMs === this.maxDelayMs) {
97
+ // We hit max delay, so adding more won't affect anything.
98
+ // Shift off oldest time to stop this array from growing forever.
99
+ this.startTimes.shift();
100
+ }
101
+
102
+ return delayMs;
103
+ }
104
104
  }
105
105
 
106
106
  /**
@@ -114,28 +114,37 @@ export class Throttler implements IThrottler {
114
114
  * Use initialDelay to decide what should happen when numAttempts is 0,
115
115
  * leave it undefined to not special case.
116
116
  */
117
- export const formExponentialFn = ({
118
- multiplier = 2,
119
- coefficient = 1,
120
- offset = 0,
121
- initialDelay = undefined as number | undefined,
122
- } = {}): IThrottler["delayFn"] => (numAttempts) => Math.max(0,
123
- numAttempts <= 0 && initialDelay !== undefined
124
- ? initialDelay
125
- : coefficient * (Math.pow(multiplier, numAttempts)) + offset);
117
+ export const formExponentialFn =
118
+ ({
119
+ multiplier = 2,
120
+ coefficient = 1,
121
+ offset = 0,
122
+ initialDelay = undefined as number | undefined,
123
+ } = {}): IThrottler["delayFn"] =>
124
+ (numAttempts) =>
125
+ Math.max(
126
+ 0,
127
+ numAttempts <= 0 && initialDelay !== undefined
128
+ ? initialDelay
129
+ : coefficient * Math.pow(multiplier, numAttempts) + offset,
130
+ );
126
131
 
127
132
  /** f(n) = C x (B^(n+A)) + F = (C x B^A) x B^n + F */
128
- export const formExponentialFnWithAttemptOffset = (attemptOffset: number, {
129
- multiplier = 2,
130
- coefficient = 1,
131
- offset = 0,
132
- initialDelay = undefined as number | undefined,
133
- } = {}) => formExponentialFn({
134
- multiplier,
135
- coefficient: coefficient * Math.pow(multiplier, attemptOffset),
136
- offset,
137
- initialDelay,
138
- });
133
+ export const formExponentialFnWithAttemptOffset = (
134
+ attemptOffset: number,
135
+ {
136
+ multiplier = 2,
137
+ coefficient = 1,
138
+ offset = 0,
139
+ initialDelay = undefined as number | undefined,
140
+ } = {},
141
+ ) =>
142
+ formExponentialFn({
143
+ multiplier,
144
+ coefficient: coefficient * Math.pow(multiplier, attemptOffset),
145
+ offset,
146
+ initialDelay,
147
+ });
139
148
 
140
149
  /**
141
150
  * Helper function to generate simple linear throttle functions.
@@ -144,17 +153,17 @@ export const formExponentialFnWithAttemptOffset = (attemptOffset: number, {
144
153
  * If not provided, coefficient will default to 1, and offset to 0, yielding:
145
154
  * 0 ms, 1 ms, 2 ms, 3 ms, ..., n ms delays; a linear back-off.
146
155
  */
147
- export const formLinearFn = ({
148
- coefficient = 1,
149
- offset = 0,
150
- } = {}): IThrottler["delayFn"] => (numAttempts) => Math.max(0,
151
- coefficient * numAttempts + offset);
156
+ export const formLinearFn =
157
+ ({ coefficient = 1, offset = 0 } = {}): IThrottler["delayFn"] =>
158
+ (numAttempts) =>
159
+ Math.max(0, coefficient * numAttempts + offset);
152
160
 
153
161
  /** f(n) = C x (n+A) + F = C x n + (C x A + F) */
154
- export const formLinearFnWithAttemptOffset = (attemptOffset: number, {
155
- coefficient = 1,
156
- offset = 0,
157
- } = {}) => formLinearFn({
158
- coefficient,
159
- offset: coefficient * attemptOffset + offset,
160
- });
162
+ export const formLinearFnWithAttemptOffset = (
163
+ attemptOffset: number,
164
+ { coefficient = 1, offset = 0 } = {},
165
+ ) =>
166
+ formLinearFn({
167
+ coefficient,
168
+ offset: coefficient * attemptOffset + offset,
169
+ });
@@ -1,7 +1,7 @@
1
1
  {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "./lib",
5
- "module": "esnext"
6
- },
7
- }
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./lib",
5
+ "module": "esnext",
6
+ },
7
+ }
package/tsconfig.json CHANGED
@@ -1,14 +1,10 @@
1
1
  {
2
- "extends": "@fluidframework/build-common/ts-common-config.json",
3
- "compilerOptions": {
4
- "composite": true,
5
- "rootDir": "./src",
6
- "outDir": "./dist"
7
- },
8
- "include": [
9
- "src/**/*"
10
- ],
11
- "exclude": [
12
- "src/test/**/*"
13
- ]
14
- }
2
+ "extends": "@fluidframework/build-common/ts-common-config.json",
3
+ "compilerOptions": {
4
+ "composite": true,
5
+ "rootDir": "./src",
6
+ "outDir": "./dist",
7
+ },
8
+ "include": ["src/**/*"],
9
+ "exclude": ["src/test/**/*"],
10
+ }