@fluidframework/container-runtime 2.23.0-325054 → 2.30.0

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 (236) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/api-report/container-runtime.legacy.alpha.api.md +0 -246
  3. package/dist/blobManager/blobManager.d.ts +11 -9
  4. package/dist/blobManager/blobManager.d.ts.map +1 -1
  5. package/dist/blobManager/blobManager.js +38 -39
  6. package/dist/blobManager/blobManager.js.map +1 -1
  7. package/dist/blobManager/blobManagerSnapSum.d.ts +2 -4
  8. package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  9. package/dist/blobManager/blobManagerSnapSum.js +6 -6
  10. package/dist/blobManager/blobManagerSnapSum.js.map +1 -1
  11. package/dist/channelCollection.d.ts +1 -7
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +1 -26
  14. package/dist/channelCollection.js.map +1 -1
  15. package/dist/connectionTelemetry.d.ts +0 -43
  16. package/dist/connectionTelemetry.d.ts.map +1 -1
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/containerRuntime.d.ts +21 -141
  19. package/dist/containerRuntime.d.ts.map +1 -1
  20. package/dist/containerRuntime.js +49 -290
  21. package/dist/containerRuntime.js.map +1 -1
  22. package/dist/dataStoreContext.d.ts +0 -13
  23. package/dist/dataStoreContext.d.ts.map +1 -1
  24. package/dist/dataStoreContext.js +2 -25
  25. package/dist/dataStoreContext.js.map +1 -1
  26. package/dist/gc/garbageCollection.d.ts.map +1 -1
  27. package/dist/gc/garbageCollection.js +2 -20
  28. package/dist/gc/garbageCollection.js.map +1 -1
  29. package/dist/gc/gcConfigs.d.ts.map +1 -1
  30. package/dist/gc/gcConfigs.js +0 -2
  31. package/dist/gc/gcConfigs.js.map +1 -1
  32. package/dist/gc/gcDefinitions.d.ts +8 -24
  33. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  34. package/dist/gc/gcDefinitions.js +1 -3
  35. package/dist/gc/gcDefinitions.js.map +1 -1
  36. package/dist/gc/gcHelpers.d.ts.map +1 -1
  37. package/dist/gc/gcHelpers.js +1 -4
  38. package/dist/gc/gcHelpers.js.map +1 -1
  39. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  40. package/dist/gc/gcSummaryStateTracker.js +0 -1
  41. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  42. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  43. package/dist/gc/gcTelemetry.js +4 -16
  44. package/dist/gc/gcTelemetry.js.map +1 -1
  45. package/dist/index.d.ts +2 -2
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +2 -2
  48. package/dist/index.js.map +1 -1
  49. package/dist/legacy.d.ts +0 -29
  50. package/dist/messageTypes.d.ts.map +1 -1
  51. package/dist/messageTypes.js.map +1 -1
  52. package/dist/packageVersion.d.ts +1 -1
  53. package/dist/packageVersion.d.ts.map +1 -1
  54. package/dist/packageVersion.js +1 -1
  55. package/dist/packageVersion.js.map +1 -1
  56. package/dist/signalTelemetryProcessing.d.ts +33 -0
  57. package/dist/signalTelemetryProcessing.d.ts.map +1 -0
  58. package/dist/signalTelemetryProcessing.js +149 -0
  59. package/dist/signalTelemetryProcessing.js.map +1 -0
  60. package/dist/summary/documentSchema.d.ts +7 -31
  61. package/dist/summary/documentSchema.d.ts.map +1 -1
  62. package/dist/summary/documentSchema.js +2 -18
  63. package/dist/summary/documentSchema.js.map +1 -1
  64. package/dist/summary/index.d.ts +2 -1
  65. package/dist/summary/index.d.ts.map +1 -1
  66. package/dist/summary/index.js +7 -1
  67. package/dist/summary/index.js.map +1 -1
  68. package/dist/summary/orderedClientElection.d.ts +1 -3
  69. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  70. package/dist/summary/orderedClientElection.js.map +1 -1
  71. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -3
  72. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  73. package/dist/summary/runWhileConnectedCoordinator.js +2 -7
  74. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  75. package/dist/summary/runningSummarizer.d.ts +1 -2
  76. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  77. package/dist/summary/runningSummarizer.js +4 -23
  78. package/dist/summary/runningSummarizer.js.map +1 -1
  79. package/dist/summary/summarizer.d.ts +2 -5
  80. package/dist/summary/summarizer.d.ts.map +1 -1
  81. package/dist/summary/summarizer.js +3 -11
  82. package/dist/summary/summarizer.js.map +1 -1
  83. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  84. package/dist/summary/summarizerClientElection.js +0 -1
  85. package/dist/summary/summarizerClientElection.js.map +1 -1
  86. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  87. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  88. package/dist/summary/summarizerHeuristics.js.map +1 -1
  89. package/dist/summary/summarizerTypes.d.ts +109 -22
  90. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  91. package/dist/summary/summarizerTypes.js.map +1 -1
  92. package/dist/summary/summaryFormat.d.ts +3 -9
  93. package/dist/summary/summaryFormat.d.ts.map +1 -1
  94. package/dist/summary/summaryFormat.js.map +1 -1
  95. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  96. package/dist/summary/summaryGenerator.js +3 -9
  97. package/dist/summary/summaryGenerator.js.map +1 -1
  98. package/dist/summary/summaryHelpers.d.ts +19 -0
  99. package/dist/summary/summaryHelpers.d.ts.map +1 -0
  100. package/dist/summary/summaryHelpers.js +90 -0
  101. package/dist/summary/summaryHelpers.js.map +1 -0
  102. package/dist/summary/summaryManager.d.ts.map +1 -1
  103. package/dist/summary/summaryManager.js +0 -2
  104. package/dist/summary/summaryManager.js.map +1 -1
  105. package/lib/blobManager/blobManager.d.ts +11 -9
  106. package/lib/blobManager/blobManager.d.ts.map +1 -1
  107. package/lib/blobManager/blobManager.js +37 -37
  108. package/lib/blobManager/blobManager.js.map +1 -1
  109. package/lib/blobManager/blobManagerSnapSum.d.ts +2 -4
  110. package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
  111. package/lib/blobManager/blobManagerSnapSum.js +6 -6
  112. package/lib/blobManager/blobManagerSnapSum.js.map +1 -1
  113. package/lib/channelCollection.d.ts +1 -7
  114. package/lib/channelCollection.d.ts.map +1 -1
  115. package/lib/channelCollection.js +2 -29
  116. package/lib/channelCollection.js.map +1 -1
  117. package/lib/connectionTelemetry.d.ts +0 -43
  118. package/lib/connectionTelemetry.d.ts.map +1 -1
  119. package/lib/connectionTelemetry.js.map +1 -1
  120. package/lib/containerRuntime.d.ts +21 -141
  121. package/lib/containerRuntime.d.ts.map +1 -1
  122. package/lib/containerRuntime.js +51 -298
  123. package/lib/containerRuntime.js.map +1 -1
  124. package/lib/dataStoreContext.d.ts +0 -13
  125. package/lib/dataStoreContext.d.ts.map +1 -1
  126. package/lib/dataStoreContext.js +2 -25
  127. package/lib/dataStoreContext.js.map +1 -1
  128. package/lib/gc/garbageCollection.d.ts.map +1 -1
  129. package/lib/gc/garbageCollection.js +3 -23
  130. package/lib/gc/garbageCollection.js.map +1 -1
  131. package/lib/gc/gcConfigs.d.ts.map +1 -1
  132. package/lib/gc/gcConfigs.js +0 -2
  133. package/lib/gc/gcConfigs.js.map +1 -1
  134. package/lib/gc/gcDefinitions.d.ts +8 -24
  135. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  136. package/lib/gc/gcDefinitions.js +1 -3
  137. package/lib/gc/gcDefinitions.js.map +1 -1
  138. package/lib/gc/gcHelpers.d.ts.map +1 -1
  139. package/lib/gc/gcHelpers.js +1 -4
  140. package/lib/gc/gcHelpers.js.map +1 -1
  141. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  142. package/lib/gc/gcSummaryStateTracker.js +0 -1
  143. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  144. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  145. package/lib/gc/gcTelemetry.js +5 -19
  146. package/lib/gc/gcTelemetry.js.map +1 -1
  147. package/lib/index.d.ts +2 -2
  148. package/lib/index.d.ts.map +1 -1
  149. package/lib/index.js +2 -2
  150. package/lib/index.js.map +1 -1
  151. package/lib/legacy.d.ts +0 -29
  152. package/lib/messageTypes.d.ts.map +1 -1
  153. package/lib/messageTypes.js.map +1 -1
  154. package/lib/packageVersion.d.ts +1 -1
  155. package/lib/packageVersion.d.ts.map +1 -1
  156. package/lib/packageVersion.js +1 -1
  157. package/lib/packageVersion.js.map +1 -1
  158. package/lib/signalTelemetryProcessing.d.ts +33 -0
  159. package/lib/signalTelemetryProcessing.d.ts.map +1 -0
  160. package/lib/signalTelemetryProcessing.js +145 -0
  161. package/lib/signalTelemetryProcessing.js.map +1 -0
  162. package/lib/summary/documentSchema.d.ts +7 -31
  163. package/lib/summary/documentSchema.d.ts.map +1 -1
  164. package/lib/summary/documentSchema.js +2 -18
  165. package/lib/summary/documentSchema.js.map +1 -1
  166. package/lib/summary/index.d.ts +2 -1
  167. package/lib/summary/index.d.ts.map +1 -1
  168. package/lib/summary/index.js +1 -0
  169. package/lib/summary/index.js.map +1 -1
  170. package/lib/summary/orderedClientElection.d.ts +1 -3
  171. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  172. package/lib/summary/orderedClientElection.js.map +1 -1
  173. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -3
  174. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  175. package/lib/summary/runWhileConnectedCoordinator.js +2 -7
  176. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  177. package/lib/summary/runningSummarizer.d.ts +1 -2
  178. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  179. package/lib/summary/runningSummarizer.js +4 -23
  180. package/lib/summary/runningSummarizer.js.map +1 -1
  181. package/lib/summary/summarizer.d.ts +2 -5
  182. package/lib/summary/summarizer.d.ts.map +1 -1
  183. package/lib/summary/summarizer.js +3 -11
  184. package/lib/summary/summarizer.js.map +1 -1
  185. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  186. package/lib/summary/summarizerClientElection.js +0 -1
  187. package/lib/summary/summarizerClientElection.js.map +1 -1
  188. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  189. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  190. package/lib/summary/summarizerHeuristics.js.map +1 -1
  191. package/lib/summary/summarizerTypes.d.ts +109 -22
  192. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  193. package/lib/summary/summarizerTypes.js.map +1 -1
  194. package/lib/summary/summaryFormat.d.ts +3 -9
  195. package/lib/summary/summaryFormat.d.ts.map +1 -1
  196. package/lib/summary/summaryFormat.js.map +1 -1
  197. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  198. package/lib/summary/summaryGenerator.js +3 -9
  199. package/lib/summary/summaryGenerator.js.map +1 -1
  200. package/lib/summary/summaryHelpers.d.ts +19 -0
  201. package/lib/summary/summaryHelpers.d.ts.map +1 -0
  202. package/lib/summary/summaryHelpers.js +84 -0
  203. package/lib/summary/summaryHelpers.js.map +1 -0
  204. package/lib/summary/summaryManager.d.ts.map +1 -1
  205. package/lib/summary/summaryManager.js +0 -2
  206. package/lib/summary/summaryManager.js.map +1 -1
  207. package/package.json +27 -20
  208. package/src/blobManager/blobManager.ts +70 -62
  209. package/src/blobManager/blobManagerSnapSum.ts +7 -9
  210. package/src/channelCollection.ts +3 -31
  211. package/src/connectionTelemetry.ts +0 -51
  212. package/src/containerRuntime.ts +111 -522
  213. package/src/dataStoreContext.ts +2 -32
  214. package/src/gc/garbageCollection.ts +9 -26
  215. package/src/gc/gcConfigs.ts +3 -6
  216. package/src/gc/gcDefinitions.ts +10 -28
  217. package/src/gc/gcHelpers.ts +0 -5
  218. package/src/gc/gcSummaryStateTracker.ts +1 -2
  219. package/src/gc/gcTelemetry.ts +6 -13
  220. package/src/index.ts +6 -6
  221. package/src/messageTypes.ts +0 -2
  222. package/src/packageVersion.ts +1 -1
  223. package/src/signalTelemetryProcessing.ts +233 -0
  224. package/src/summary/documentSchema.ts +7 -38
  225. package/src/summary/index.ts +12 -0
  226. package/src/summary/orderedClientElection.ts +1 -3
  227. package/src/summary/runWhileConnectedCoordinator.ts +3 -8
  228. package/src/summary/runningSummarizer.ts +12 -20
  229. package/src/summary/summarizer.ts +6 -18
  230. package/src/summary/summarizerClientElection.ts +0 -2
  231. package/src/summary/summarizerHeuristics.ts +1 -2
  232. package/src/summary/summarizerTypes.ts +119 -23
  233. package/src/summary/summaryFormat.ts +4 -13
  234. package/src/summary/summaryGenerator.ts +1 -8
  235. package/src/summary/summaryHelpers.ts +118 -0
  236. package/src/summary/summaryManager.ts +0 -2
@@ -0,0 +1,233 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type { ISignalEnvelope } from "@fluidframework/core-interfaces/internal";
7
+ import type {
8
+ ITelemetryLoggerExt,
9
+ TelemetryEventPropertyTypeExt,
10
+ } from "@fluidframework/telemetry-utils/internal";
11
+
12
+ const defaultTelemetrySignalSampleCount = 100;
13
+
14
+ /**
15
+ * Set of stats/values used to keep track of telemetry related to signals.
16
+ */
17
+ interface ISignalTelemetryTracking {
18
+ /**
19
+ * Accumulates the total number of broadcast signals sent during the current signal latency measurement window.
20
+ * This value represents the total number of signals sent since the latency measurement began and is used
21
+ * logged in telemetry when the latency measurement completes.
22
+ */
23
+ totalSignalsSentInLatencyWindow: number;
24
+
25
+ /**
26
+ * Counts the number of broadcast signals sent since the last latency measurement was initiated.
27
+ * This counter increments with each broadcast signal sent. When a new latency measurement starts,
28
+ * this counter is added to `totalSignalsSentInLatencyWindow` and then reset to zero.
29
+ */
30
+ signalsSentSinceLastLatencyMeasurement: number;
31
+
32
+ /**
33
+ * Number of signals that were expected but not received.
34
+ */
35
+ signalsLost: number;
36
+
37
+ /**
38
+ * Number of signals received out of order/non-sequentially.
39
+ */
40
+ signalsOutOfOrder: number;
41
+
42
+ /**
43
+ * Timestamp before submitting the signal we will trace.
44
+ */
45
+ signalTimestamp: number;
46
+
47
+ /**
48
+ * Signal we will trace for roundtrip latency.
49
+ */
50
+ roundTripSignalSequenceNumber: number | undefined;
51
+
52
+ /**
53
+ * Next expected signal sequence number to be received.
54
+ */
55
+ trackingSignalSequenceNumber: number | undefined;
56
+
57
+ /**
58
+ * Inclusive lower bound of signal monitoring window.
59
+ * Used by the logic that checks if signals are received out of order.
60
+ */
61
+ minimumTrackingSignalSequenceNumber: number | undefined;
62
+ }
63
+
64
+ export class SignalTelemetryManager {
65
+ private readonly signalTracking: ISignalTelemetryTracking = {
66
+ totalSignalsSentInLatencyWindow: 0,
67
+ signalsLost: 0,
68
+ signalsOutOfOrder: 0,
69
+ signalsSentSinceLastLatencyMeasurement: 0,
70
+ signalTimestamp: 0,
71
+ roundTripSignalSequenceNumber: undefined,
72
+ trackingSignalSequenceNumber: undefined,
73
+ minimumTrackingSignalSequenceNumber: undefined,
74
+ };
75
+
76
+ /**
77
+ * Identifier to track broadcast signals being submitted in order to
78
+ * allow collection of data around the roundtrip of signal messages.
79
+ */
80
+ private broadcastSignalSequenceNumber: number = 0;
81
+
82
+ /**
83
+ * Resets the signal tracking state in the {@link SignalTelemetryManager}.
84
+ */
85
+ public resetTracking(): void {
86
+ this.signalTracking.signalsLost = 0;
87
+ this.signalTracking.signalsOutOfOrder = 0;
88
+ this.signalTracking.signalTimestamp = 0;
89
+ this.signalTracking.signalsSentSinceLastLatencyMeasurement = 0;
90
+ this.signalTracking.totalSignalsSentInLatencyWindow = 0;
91
+ this.signalTracking.roundTripSignalSequenceNumber = undefined;
92
+ this.signalTracking.trackingSignalSequenceNumber = undefined;
93
+ this.signalTracking.minimumTrackingSignalSequenceNumber = undefined;
94
+ }
95
+
96
+ /**
97
+ * Perform telemetry-related processing of incoming signals.
98
+ * @param envelope - The signal envelope to process.
99
+ * @param logger - The telemetry logger to use for emitting telemetry events.
100
+ * @param consecutiveReconnects - The number of consecutive reconnects that have occurred. Only used for logging.
101
+ */
102
+ public trackReceivedSignal(
103
+ envelope: ISignalEnvelope,
104
+ logger: ITelemetryLoggerExt,
105
+ consecutiveReconnects: number,
106
+ ): void {
107
+ const {
108
+ clientBroadcastSignalSequenceNumber,
109
+ contents: envelopeContents,
110
+ address: envelopeAddress,
111
+ } = envelope;
112
+
113
+ if (clientBroadcastSignalSequenceNumber === undefined) {
114
+ return undefined;
115
+ }
116
+
117
+ // If no tracking window has been set, nothing to do
118
+ if (
119
+ this.signalTracking.trackingSignalSequenceNumber === undefined ||
120
+ this.signalTracking.minimumTrackingSignalSequenceNumber === undefined
121
+ ) {
122
+ return undefined;
123
+ }
124
+
125
+ if (
126
+ clientBroadcastSignalSequenceNumber >= this.signalTracking.trackingSignalSequenceNumber
127
+ ) {
128
+ // Calculate the number of signals lost and log the event.
129
+ const signalsLost =
130
+ clientBroadcastSignalSequenceNumber - this.signalTracking.trackingSignalSequenceNumber;
131
+ if (signalsLost > 0) {
132
+ this.signalTracking.signalsLost += signalsLost;
133
+ logger.sendErrorEvent({
134
+ eventName: "SignalLost",
135
+ details: {
136
+ signalsLost, // Number of lost signals detected.
137
+ expectedSequenceNumber: this.signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
138
+ clientBroadcastSignalSequenceNumber, // Actual signal sequence number received.
139
+ },
140
+ });
141
+ }
142
+ // Update the tracking signal sequence number to the next expected signal in the sequence.
143
+ this.signalTracking.trackingSignalSequenceNumber =
144
+ clientBroadcastSignalSequenceNumber + 1;
145
+ } else if (
146
+ // Check if this is a signal in range of interest.
147
+ clientBroadcastSignalSequenceNumber >=
148
+ this.signalTracking.minimumTrackingSignalSequenceNumber
149
+ ) {
150
+ this.signalTracking.signalsOutOfOrder++;
151
+ const details: TelemetryEventPropertyTypeExt = {
152
+ expectedSequenceNumber: this.signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
153
+ clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
154
+ };
155
+ // Only log `contents.type` when address is for container to avoid chance that contents type is customer data.
156
+ if (envelopeAddress === undefined) {
157
+ details.contentsType = envelopeContents.type; // Type of signal that was received out of order.
158
+ }
159
+ logger.sendTelemetryEvent({
160
+ eventName: "SignalOutOfOrder",
161
+ details,
162
+ });
163
+ }
164
+
165
+ if (
166
+ this.signalTracking.roundTripSignalSequenceNumber !== undefined &&
167
+ clientBroadcastSignalSequenceNumber >= this.signalTracking.roundTripSignalSequenceNumber
168
+ ) {
169
+ if (
170
+ clientBroadcastSignalSequenceNumber ===
171
+ this.signalTracking.roundTripSignalSequenceNumber
172
+ ) {
173
+ // Latency tracked signal has been received.
174
+ // We now emit telemetry with the roundtrip duration of the tracked signal.
175
+ // The telemetry event also includes metrics for broadcast signals (sent, lost, and out of order),
176
+ // and these metrics are reset after emitting the event.
177
+ const duration = Date.now() - this.signalTracking.signalTimestamp;
178
+ logger.sendPerformanceEvent({
179
+ eventName: "SignalLatency",
180
+ details: {
181
+ duration, // Roundtrip duration of the tracked signal in milliseconds.
182
+ sent: this.signalTracking.totalSignalsSentInLatencyWindow, // Signals sent since the last logged SignalLatency event.
183
+ lost: this.signalTracking.signalsLost, // Signals lost since the last logged SignalLatency event.
184
+ outOfOrder: this.signalTracking.signalsOutOfOrder, // Out of order signals since the last logged SignalLatency event.
185
+ reconnectCount: consecutiveReconnects, // Container reconnect count.
186
+ },
187
+ });
188
+ this.signalTracking.signalsLost = 0;
189
+ this.signalTracking.signalsOutOfOrder = 0;
190
+ this.signalTracking.signalTimestamp = 0;
191
+ this.signalTracking.totalSignalsSentInLatencyWindow = 0;
192
+ }
193
+ this.signalTracking.roundTripSignalSequenceNumber = undefined;
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Updates tracking state for broadcast signals based on the provided signal envelope, and updates the
199
+ * envelope with additional information that the signal needs to have stamped on it.
200
+ * @remarks Do not call this for non-broadcast signals.
201
+ * @param envelope - The signal envelope to process.
202
+ */
203
+ public applyTrackingToBroadcastSignalEnvelope(envelope: ISignalEnvelope): void {
204
+ const broadcastSignalSequenceNumber = ++this.broadcastSignalSequenceNumber;
205
+
206
+ // Stamp with the broadcast signal sequence number.
207
+ envelope.clientBroadcastSignalSequenceNumber = broadcastSignalSequenceNumber;
208
+
209
+ this.signalTracking.signalsSentSinceLastLatencyMeasurement++;
210
+
211
+ // If we don't have a signal monitoring window yet,
212
+ // initialize tracking to expect the next signal sent by the connected client.
213
+ if (
214
+ this.signalTracking.minimumTrackingSignalSequenceNumber === undefined ||
215
+ this.signalTracking.trackingSignalSequenceNumber === undefined
216
+ ) {
217
+ this.signalTracking.minimumTrackingSignalSequenceNumber = broadcastSignalSequenceNumber;
218
+ this.signalTracking.trackingSignalSequenceNumber = broadcastSignalSequenceNumber;
219
+ }
220
+
221
+ // Start tracking roundtrip for a new signal only if we are not tracking one already (and sampling logic is met)
222
+ if (
223
+ this.signalTracking.roundTripSignalSequenceNumber === undefined &&
224
+ broadcastSignalSequenceNumber % defaultTelemetrySignalSampleCount === 1
225
+ ) {
226
+ this.signalTracking.signalTimestamp = Date.now();
227
+ this.signalTracking.roundTripSignalSequenceNumber = broadcastSignalSequenceNumber;
228
+ this.signalTracking.totalSignalsSentInLatencyWindow +=
229
+ this.signalTracking.signalsSentSinceLastLatencyMeasurement;
230
+ this.signalTracking.signalsSentSinceLastLatencyMeasurement = 0;
231
+ }
232
+ }
233
+ }
@@ -13,9 +13,7 @@ import { pkgVersion } from "../packageVersion.js";
13
13
  * Please note that for all property types we should use undefined to indicate that particular capability is off.
14
14
  * Using false, or some string value (like "off") will result in clients who do not understand that property failing, whereas
15
15
  * we want them to continue to collaborate alongside clients who support that capability, but such capability is shipping dark for now.
16
- * @legacy
17
- * @alpha
18
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
16
+ * @internal
19
17
  */
20
18
  export type DocumentSchemaValueType = string | string[] | true | number | undefined;
21
19
 
@@ -58,9 +56,7 @@ export type IdCompressorMode = "on" | "delayed" | undefined;
58
56
  *
59
57
  * For now we are limiting it to just plain properties, and only really simple types, but that can be changed in the future.
60
58
  *
61
- * @legacy
62
- * @alpha
63
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
59
+ * @internal
64
60
  */
65
61
  export interface IDocumentSchema {
66
62
  // version that describes how data is stored in this structure.
@@ -80,9 +76,7 @@ export interface IDocumentSchema {
80
76
  * ContainerMessageType.DocumentSchemaChange messages use CAS (Compare-and-swap) semantics, and convey
81
77
  * regSeq of last known schema change (known to a client proposing schema change).
82
78
  * @see ContainerRuntimeDocumentSchemaMessage
83
- * @legacy
84
- * @alpha
85
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
79
+ * @internal
86
80
  */
87
81
  export type IDocumentSchemaChangeMessage = IDocumentSchema;
88
82
 
@@ -92,9 +86,7 @@ export type IDocumentSchemaChangeMessage = IDocumentSchema;
92
86
  * WARNING: This type is used to infer IDocumentSchemaCurrent type!
93
87
  * Any changes here (including renaming of properties) are potentially changing document format and should be considered carefully!
94
88
  *
95
- * @legacy
96
- * @alpha
97
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
89
+ * @internal
98
90
  */
99
91
  export interface IDocumentSchemaFeatures {
100
92
  // Tells if client uses legacy behavior of changing schema.
@@ -123,17 +115,13 @@ export interface IDocumentSchemaFeatures {
123
115
  * This must be bumped whenever the format of document schema or protocol for changing the current document schema changes.
124
116
  * Ex: adding a new configuration property (under IDocumentSchema.runtime) does not require changing this version.
125
117
  * Ex: Changing the 'document schema acceptance' mechanism from convert-and-swap to one requiring consensus does require changing this version.
126
- * @legacy
127
- * @alpha
128
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
118
+ * @internal
129
119
  */
130
120
  export const currentDocumentVersionSchema = 1;
131
121
 
132
122
  /**
133
123
  * Current document schema.
134
- * @legacy
135
- * @alpha
136
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
124
+ * @internal
137
125
  */
138
126
  // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
139
127
  export type IDocumentSchemaCurrent = {
@@ -441,9 +429,7 @@ function arrayToProp(arr: string[]): string[] | undefined {
441
429
  * Clients can retry, but current implementation is simply - they will not (and will rely on next session / reload to do
442
430
  * recalc and decide if schema needs to be changed or not).
443
431
  *
444
- * @legacy
445
- * @alpha
446
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
432
+ * @internal
447
433
  * @sealed
448
434
  */
449
435
  export class DocumentsSchemaController {
@@ -614,23 +600,6 @@ export class DocumentsSchemaController {
614
600
  }
615
601
  }
616
602
 
617
- /**
618
- * Process document schema change message
619
- * Called by ContainerRuntime whenever it sees document schema messages.
620
- * @param content - content of the message
621
- * @param local - whether op is local
622
- * @param sequenceNumber - sequence number of the op
623
- * @returns - true if schema was accepted, otherwise false (rejected due to failed CAS)
624
- * @deprecated It has been replaced by processDocumentSchemaMessages instead.
625
- */
626
- public processDocumentSchemaOp(
627
- content: IDocumentSchemaChangeMessage,
628
- local: boolean,
629
- sequenceNumber: number,
630
- ): boolean {
631
- return this.processDocumentSchemaMessages([content], local, sequenceNumber);
632
- }
633
-
634
603
  /**
635
604
  * Process document schema change messages
636
605
  * Called by ContainerRuntime whenever it sees document schema messages.
@@ -65,6 +65,11 @@ export {
65
65
  SubmitSummaryFailureData,
66
66
  SummaryStage,
67
67
  IRetriableFailureError,
68
+ type ISummaryConfiguration,
69
+ type ISummaryConfigurationDisableHeuristics,
70
+ type ISummaryConfigurationDisableSummarizer,
71
+ type ISummaryConfigurationHeuristics,
72
+ type ISummaryBaseConfiguration,
68
73
  } from "./summarizerTypes.js";
69
74
  export {
70
75
  IAckedSummary,
@@ -103,6 +108,13 @@ export {
103
108
  IFluidDataStoreAttributes2,
104
109
  OmitAttributesVersions,
105
110
  } from "./summaryFormat.js";
111
+ export {
112
+ formCreateSummarizerFn,
113
+ validateSummaryHeuristicConfiguration,
114
+ summarizerRequestUrl,
115
+ DefaultSummaryConfiguration,
116
+ isSummariesDisabled,
117
+ } from "./summaryHelpers.js";
106
118
  export {
107
119
  IdCompressorMode,
108
120
  IDocumentSchemaCurrent,
@@ -271,9 +271,7 @@ export interface IOrderedClientElectionEvents extends IEvent {
271
271
 
272
272
  /**
273
273
  * Serialized state of IOrderedClientElection.
274
- * @legacy
275
- * @alpha
276
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
274
+ * @internal
277
275
  */
278
276
  export interface ISerializedElection {
279
277
  /**
@@ -6,16 +6,13 @@
6
6
  import type { SummarizerStopReason } from "@fluidframework/container-runtime-definitions/internal";
7
7
  import { assert, Deferred } from "@fluidframework/core-utils/internal";
8
8
 
9
- // eslint-disable-next-line import/no-deprecated
10
9
  import { IConnectableRuntime, ISummaryCancellationToken } from "./summarizerTypes.js";
11
10
 
12
11
  /**
13
12
  * Similar to AbortController, but using promise instead of events
14
- * @legacy
15
- * @alpha
16
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
13
+ * @internal
17
14
  */
18
- // eslint-disable-next-line import/no-deprecated
15
+
19
16
  export interface ICancellableSummarizerController extends ISummaryCancellationToken {
20
17
  stop(reason: SummarizerStopReason): void;
21
18
  }
@@ -25,7 +22,7 @@ export interface ICancellableSummarizerController extends ISummaryCancellationTo
25
22
  * This object implements ISummaryCancellationToken interface but cancellation is never leveraged.
26
23
  * @internal
27
24
  */
28
- // eslint-disable-next-line import/no-deprecated
25
+
29
26
  export const neverCancelledSummaryToken: ISummaryCancellationToken = {
30
27
  cancelled: false,
31
28
  waitCancelled: new Promise(() => {}),
@@ -68,7 +65,6 @@ export class RunWhileConnectedCoordinator implements ICancellableSummarizerContr
68
65
  }
69
66
 
70
67
  public static async create(
71
- // eslint-disable-next-line import/no-deprecated
72
68
  runtime: IConnectableRuntime,
73
69
  active: () => boolean,
74
70
  ): Promise<RunWhileConnectedCoordinator> {
@@ -78,7 +74,6 @@ export class RunWhileConnectedCoordinator implements ICancellableSummarizerContr
78
74
  }
79
75
 
80
76
  protected constructor(
81
- // eslint-disable-next-line import/no-deprecated
82
77
  private readonly runtime: IConnectableRuntime,
83
78
  private readonly active: () => boolean,
84
79
  ) {}
@@ -26,17 +26,15 @@ import {
26
26
  type ITelemetryLoggerExt,
27
27
  } from "@fluidframework/telemetry-utils/internal";
28
28
 
29
- import { ISummaryConfiguration } from "../containerRuntime.js";
30
29
  import { opSize } from "../opProperties.js";
31
30
 
32
31
  import { SummarizeHeuristicRunner } from "./summarizerHeuristics.js";
33
- import {
32
+ import type {
33
+ ISummaryConfiguration,
34
34
  EnqueueSummarizeResult,
35
35
  IEnqueueSummarizeOptions,
36
36
  IOnDemandSummarizeOptions,
37
- // eslint-disable-next-line import/no-deprecated
38
37
  IRefreshSummaryAckOptions,
39
- // eslint-disable-next-line import/no-deprecated
40
38
  ISubmitSummaryOptions,
41
39
  ISummarizeHeuristicData,
42
40
  ISummarizeHeuristicRunner,
@@ -44,12 +42,10 @@ import {
44
42
  ISummarizeResults,
45
43
  ISummarizeRunnerTelemetry,
46
44
  ISummarizeTelemetryProperties,
47
- // eslint-disable-next-line import/no-deprecated
48
45
  ISummarizerRuntime,
49
- // eslint-disable-next-line import/no-deprecated
50
46
  ISummaryCancellationToken,
51
47
  SubmitSummaryResult,
52
- type IRetriableFailureError,
48
+ IRetriableFailureError,
53
49
  } from "./summarizerTypes.js";
54
50
  import {
55
51
  IAckedSummary,
@@ -92,16 +88,16 @@ export class RunningSummarizer
92
88
  logger: ITelemetryBaseLogger,
93
89
  summaryWatcher: IClientSummaryWatcher,
94
90
  configuration: ISummaryConfiguration,
95
- // eslint-disable-next-line import/no-deprecated
91
+
96
92
  submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
97
- // eslint-disable-next-line import/no-deprecated
93
+
98
94
  refreshLatestSummaryAckCallback: (options: IRefreshSummaryAckOptions) => Promise<void>,
99
95
  heuristicData: ISummarizeHeuristicData,
100
96
  summaryCollection: SummaryCollection,
101
- // eslint-disable-next-line import/no-deprecated
97
+
102
98
  cancellationToken: ISummaryCancellationToken,
103
99
  stopSummarizerCallback: (reason: SummarizerStopReason) => void,
104
- // eslint-disable-next-line import/no-deprecated
100
+
105
101
  runtime: ISummarizerRuntime,
106
102
  ): Promise<RunningSummarizer> {
107
103
  const summarizer = new RunningSummarizer(
@@ -218,19 +214,17 @@ export class RunningSummarizer
218
214
  private readonly summaryWatcher: IClientSummaryWatcher,
219
215
  private readonly configuration: ISummaryConfiguration,
220
216
  private readonly submitSummaryCallback: (
221
- // eslint-disable-next-line import/no-deprecated
222
217
  options: ISubmitSummaryOptions,
223
218
  ) => Promise<SubmitSummaryResult>,
224
219
  private readonly refreshLatestSummaryAckCallback: (
225
- // eslint-disable-next-line import/no-deprecated
226
220
  options: IRefreshSummaryAckOptions,
227
221
  ) => Promise<void>,
228
222
  private readonly heuristicData: ISummarizeHeuristicData,
229
223
  private readonly summaryCollection: SummaryCollection,
230
- // eslint-disable-next-line import/no-deprecated
224
+
231
225
  private readonly cancellationToken: ISummaryCancellationToken,
232
226
  private readonly stopSummarizerCallback: (reason: SummarizerStopReason) => void,
233
- // eslint-disable-next-line import/no-deprecated
227
+
234
228
  private readonly runtime: ISummarizerRuntime,
235
229
  ) {
236
230
  super();
@@ -308,7 +302,7 @@ export class RunningSummarizer
308
302
  () => {
309
303
  this.totalSuccessfulAttempts++;
310
304
  },
311
- // eslint-disable-next-line import/no-deprecated
305
+
312
306
  async (options: IRefreshSummaryAckOptions) => {
313
307
  if (immediatelyRefreshLatestSummaryAck) {
314
308
  await this.refreshLatestSummaryAckAndHandleError(options);
@@ -357,7 +351,6 @@ export class RunningSummarizer
357
351
  await this.lockedSummaryAction(
358
352
  () => {},
359
353
  async () => {
360
- // eslint-disable-next-line import/no-deprecated
361
354
  const options: IRefreshSummaryAckOptions = {
362
355
  proposalHandle: summaryOpHandle,
363
356
  ackHandle: summaryAckHandle,
@@ -371,7 +364,6 @@ export class RunningSummarizer
371
364
  }
372
365
 
373
366
  private readonly refreshLatestSummaryAckAndHandleError = async (
374
- // eslint-disable-next-line import/no-deprecated
375
367
  options: IRefreshSummaryAckOptions,
376
368
  ): Promise<void> => {
377
369
  return this.refreshLatestSummaryAckCallback(options).catch(async (error) => {
@@ -647,7 +639,7 @@ export class RunningSummarizer
647
639
  logger: this.mc.logger,
648
640
  properties: { all: summarizeProps },
649
641
  });
650
- // eslint-disable-next-line import/no-deprecated
642
+
651
643
  const summaryOptions: ISubmitSummaryOptions = {
652
644
  ...options,
653
645
  summaryLogger,
@@ -764,7 +756,7 @@ export class RunningSummarizer
764
756
  logger: this.mc.logger,
765
757
  properties: { all: summarizeProps },
766
758
  });
767
- // eslint-disable-next-line import/no-deprecated
759
+
768
760
  const summaryOptions: ISubmitSummaryOptions = {
769
761
  ...summarizeOptions,
770
762
  summaryLogger,
@@ -19,38 +19,31 @@ import {
19
19
  wrapErrorAndLog,
20
20
  } from "@fluidframework/telemetry-utils/internal";
21
21
 
22
- import { ISummaryConfiguration } from "../containerRuntime.js";
23
-
24
- // eslint-disable-next-line import/no-deprecated
25
22
  import { ICancellableSummarizerController } from "./runWhileConnectedCoordinator.js";
26
23
  import { RunningSummarizer } from "./runningSummarizer.js";
27
24
  import { SummarizeHeuristicData } from "./summarizerHeuristics.js";
28
25
  import {
29
26
  EnqueueSummarizeResult,
30
- // eslint-disable-next-line import/no-deprecated
31
27
  IConnectableRuntime,
32
28
  IEnqueueSummarizeOptions,
33
29
  IOnDemandSummarizeOptions,
34
30
  ISummarizeHeuristicData,
35
31
  ISummarizeResults,
36
32
  ISummarizer,
37
- // eslint-disable-next-line import/no-deprecated
38
33
  ISummarizerInternalsProvider,
39
- // eslint-disable-next-line import/no-deprecated
40
34
  ISummarizerRuntime,
41
35
  ISummarizingWarning,
42
36
  type IRetriableFailureError,
37
+ type ISummaryConfiguration,
43
38
  } from "./summarizerTypes.js";
44
39
  import { SummaryCollection } from "./summaryCollection.js";
45
40
  import { SummarizeResultBuilder } from "./summaryGenerator.js";
46
41
 
47
- const summarizingError = "summarizingError";
48
-
49
42
  export class SummarizingWarning
50
43
  extends LoggingError
51
44
  implements ISummarizingWarning, IFluidErrorBase
52
45
  {
53
- readonly errorType = summarizingError;
46
+ readonly errorType = "summarizingError";
54
47
  readonly canRetry = true;
55
48
 
56
49
  constructor(
@@ -80,9 +73,7 @@ export const createSummarizingWarning = (
80
73
  * Summarizer is responsible for coordinating when to generate and send summaries.
81
74
  * It is the main entry point for summary work.
82
75
  * It is created only by summarizing container (i.e. one with clientType === "summarizer")
83
- * @legacy
84
- * @alpha
85
- * @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
76
+ * @internal
86
77
  */
87
78
  export class Summarizer extends TypedEventEmitter<ISummarizerEvents> implements ISummarizer {
88
79
  public get ISummarizer(): this {
@@ -101,21 +92,19 @@ export class Summarizer extends TypedEventEmitter<ISummarizerEvents> implements
101
92
  * Reference to runtime that created this object.
102
93
  * i.e. runtime with clientType === "summarizer"
103
94
  */
104
- // eslint-disable-next-line import/no-deprecated
95
+
105
96
  private readonly runtime: ISummarizerRuntime,
106
97
  private readonly configurationGetter: () => ISummaryConfiguration,
107
98
  /**
108
99
  * Represents an object that can generate summary.
109
100
  * In practical terms, it's same runtime (this.runtime) with clientType === "summarizer".
110
101
  */
111
- // eslint-disable-next-line import/no-deprecated
102
+
112
103
  private readonly internalsProvider: ISummarizerInternalsProvider,
113
104
  handleContext: IFluidHandleContext,
114
105
  public readonly summaryCollection: SummaryCollection,
115
106
  private readonly runCoordinatorCreateFn: (
116
- // eslint-disable-next-line import/no-deprecated
117
107
  runtime: IConnectableRuntime,
118
- // eslint-disable-next-line import/no-deprecated
119
108
  ) => Promise<ICancellableSummarizerController>,
120
109
  ) {
121
110
  super();
@@ -165,7 +154,6 @@ export class Summarizer extends TypedEventEmitter<ISummarizerEvents> implements
165
154
  }
166
155
 
167
156
  private async runCore(onBehalfOf: string): Promise<SummarizerStopReason> {
168
- // eslint-disable-next-line import/no-deprecated
169
157
  const runCoordinator: ICancellableSummarizerController = await this.runCoordinatorCreateFn(
170
158
  this.runtime,
171
159
  );
@@ -251,7 +239,7 @@ export class Summarizer extends TypedEventEmitter<ISummarizerEvents> implements
251
239
  */
252
240
  private async start(
253
241
  onBehalfOf: string,
254
- // eslint-disable-next-line import/no-deprecated
242
+
255
243
  runCoordinator: ICancellableSummarizerController,
256
244
  ): Promise<RunningSummarizer> {
257
245
  if (this.runningSummarizer) {
@@ -11,7 +11,6 @@ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
11
11
 
12
12
  import {
13
13
  IOrderedClientElection,
14
- // eslint-disable-next-line import/no-deprecated
15
14
  ISerializedElection,
16
15
  ITrackedClient,
17
16
  } from "./orderedClientElection.js";
@@ -120,7 +119,6 @@ export class SummarizerClientElection
120
119
  });
121
120
  }
122
121
 
123
- // eslint-disable-next-line import/no-deprecated
124
122
  public serialize(): ISerializedElection {
125
123
  const { electedClientId, electedParentId, electionSequenceNumber } =
126
124
  this.clientElection.serialize();
@@ -6,8 +6,7 @@
6
6
  import { Timer } from "@fluidframework/core-utils/internal";
7
7
  import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
8
8
 
9
- import { ISummaryConfigurationHeuristics } from "../containerRuntime.js";
10
-
9
+ import type { ISummaryConfigurationHeuristics } from "./summarizerTypes.js";
11
10
  import {
12
11
  ISummarizeAttempt,
13
12
  ISummarizeHeuristicData,