@fluidframework/container-runtime 0.52.0 → 0.54.0-47413

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 (132) hide show
  1. package/dist/containerHandleContext.d.ts +0 -1
  2. package/dist/containerHandleContext.d.ts.map +1 -1
  3. package/dist/containerHandleContext.js +0 -1
  4. package/dist/containerHandleContext.js.map +1 -1
  5. package/dist/containerRuntime.d.ts +43 -19
  6. package/dist/containerRuntime.d.ts.map +1 -1
  7. package/dist/containerRuntime.js +201 -111
  8. package/dist/containerRuntime.js.map +1 -1
  9. package/dist/dataStoreContext.d.ts +33 -4
  10. package/dist/dataStoreContext.d.ts.map +1 -1
  11. package/dist/dataStoreContext.js +45 -17
  12. package/dist/dataStoreContext.js.map +1 -1
  13. package/dist/dataStores.d.ts +14 -10
  14. package/dist/dataStores.d.ts.map +1 -1
  15. package/dist/dataStores.js +73 -41
  16. package/dist/dataStores.js.map +1 -1
  17. package/dist/garbageCollection.d.ts +82 -15
  18. package/dist/garbageCollection.d.ts.map +1 -1
  19. package/dist/garbageCollection.js +359 -26
  20. package/dist/garbageCollection.js.map +1 -1
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +11 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/packageVersion.d.ts +1 -1
  26. package/dist/packageVersion.d.ts.map +1 -1
  27. package/dist/packageVersion.js +1 -1
  28. package/dist/packageVersion.js.map +1 -1
  29. package/dist/pendingStateManager.d.ts +0 -1
  30. package/dist/pendingStateManager.d.ts.map +1 -1
  31. package/dist/pendingStateManager.js +0 -36
  32. package/dist/pendingStateManager.js.map +1 -1
  33. package/dist/runningSummarizer.d.ts +3 -2
  34. package/dist/runningSummarizer.d.ts.map +1 -1
  35. package/dist/runningSummarizer.js +6 -6
  36. package/dist/runningSummarizer.js.map +1 -1
  37. package/dist/summarizer.d.ts +23 -3
  38. package/dist/summarizer.d.ts.map +1 -1
  39. package/dist/summarizer.js +135 -45
  40. package/dist/summarizer.js.map +1 -1
  41. package/dist/summarizerTypes.d.ts +3 -10
  42. package/dist/summarizerTypes.d.ts.map +1 -1
  43. package/dist/summarizerTypes.js.map +1 -1
  44. package/dist/summaryFormat.d.ts +10 -1
  45. package/dist/summaryFormat.d.ts.map +1 -1
  46. package/dist/summaryFormat.js +2 -1
  47. package/dist/summaryFormat.js.map +1 -1
  48. package/dist/summaryGenerator.d.ts.map +1 -1
  49. package/dist/summaryGenerator.js +1 -3
  50. package/dist/summaryGenerator.js.map +1 -1
  51. package/dist/summaryManager.d.ts +0 -15
  52. package/dist/summaryManager.d.ts.map +1 -1
  53. package/dist/summaryManager.js +1 -35
  54. package/dist/summaryManager.js.map +1 -1
  55. package/lib/containerHandleContext.d.ts +0 -1
  56. package/lib/containerHandleContext.d.ts.map +1 -1
  57. package/lib/containerHandleContext.js +0 -1
  58. package/lib/containerHandleContext.js.map +1 -1
  59. package/lib/containerRuntime.d.ts +43 -19
  60. package/lib/containerRuntime.d.ts.map +1 -1
  61. package/lib/containerRuntime.js +206 -117
  62. package/lib/containerRuntime.js.map +1 -1
  63. package/lib/dataStoreContext.d.ts +33 -4
  64. package/lib/dataStoreContext.d.ts.map +1 -1
  65. package/lib/dataStoreContext.js +45 -17
  66. package/lib/dataStoreContext.js.map +1 -1
  67. package/lib/dataStores.d.ts +14 -10
  68. package/lib/dataStores.d.ts.map +1 -1
  69. package/lib/dataStores.js +76 -44
  70. package/lib/dataStores.js.map +1 -1
  71. package/lib/garbageCollection.d.ts +82 -15
  72. package/lib/garbageCollection.d.ts.map +1 -1
  73. package/lib/garbageCollection.js +361 -28
  74. package/lib/garbageCollection.js.map +1 -1
  75. package/lib/index.d.ts +2 -2
  76. package/lib/index.d.ts.map +1 -1
  77. package/lib/index.js +2 -1
  78. package/lib/index.js.map +1 -1
  79. package/lib/packageVersion.d.ts +1 -1
  80. package/lib/packageVersion.d.ts.map +1 -1
  81. package/lib/packageVersion.js +1 -1
  82. package/lib/packageVersion.js.map +1 -1
  83. package/lib/pendingStateManager.d.ts +0 -1
  84. package/lib/pendingStateManager.d.ts.map +1 -1
  85. package/lib/pendingStateManager.js +0 -36
  86. package/lib/pendingStateManager.js.map +1 -1
  87. package/lib/runningSummarizer.d.ts +3 -2
  88. package/lib/runningSummarizer.d.ts.map +1 -1
  89. package/lib/runningSummarizer.js +6 -6
  90. package/lib/runningSummarizer.js.map +1 -1
  91. package/lib/summarizer.d.ts +23 -3
  92. package/lib/summarizer.d.ts.map +1 -1
  93. package/lib/summarizer.js +135 -45
  94. package/lib/summarizer.js.map +1 -1
  95. package/lib/summarizerTypes.d.ts +3 -10
  96. package/lib/summarizerTypes.d.ts.map +1 -1
  97. package/lib/summarizerTypes.js.map +1 -1
  98. package/lib/summaryFormat.d.ts +10 -1
  99. package/lib/summaryFormat.d.ts.map +1 -1
  100. package/lib/summaryFormat.js +1 -0
  101. package/lib/summaryFormat.js.map +1 -1
  102. package/lib/summaryGenerator.d.ts.map +1 -1
  103. package/lib/summaryGenerator.js +1 -3
  104. package/lib/summaryGenerator.js.map +1 -1
  105. package/lib/summaryManager.d.ts +0 -15
  106. package/lib/summaryManager.d.ts.map +1 -1
  107. package/lib/summaryManager.js +1 -34
  108. package/lib/summaryManager.js.map +1 -1
  109. package/package.json +14 -14
  110. package/src/containerHandleContext.ts +0 -1
  111. package/src/containerRuntime.ts +280 -140
  112. package/src/dataStoreContext.ts +59 -20
  113. package/src/dataStores.ts +116 -54
  114. package/src/garbageCollection.ts +492 -29
  115. package/src/index.ts +20 -2
  116. package/src/packageVersion.ts +1 -1
  117. package/src/pendingStateManager.ts +0 -43
  118. package/src/runningSummarizer.ts +12 -10
  119. package/src/summarizer.ts +154 -53
  120. package/src/summarizerTypes.ts +3 -11
  121. package/src/summaryFormat.ts +11 -1
  122. package/src/summaryGenerator.ts +2 -3
  123. package/src/summaryManager.ts +2 -49
  124. package/dist/localStorageFeatureGates.d.ts +0 -13
  125. package/dist/localStorageFeatureGates.d.ts.map +0 -1
  126. package/dist/localStorageFeatureGates.js +0 -31
  127. package/dist/localStorageFeatureGates.js.map +0 -1
  128. package/lib/localStorageFeatureGates.d.ts +0 -13
  129. package/lib/localStorageFeatureGates.d.ts.map +0 -1
  130. package/lib/localStorageFeatureGates.js +0 -27
  131. package/lib/localStorageFeatureGates.js.map +0 -1
  132. package/src/localStorageFeatureGates.ts +0 -27
@@ -5,8 +5,9 @@
5
5
  /// <reference types="node" />
6
6
  import { EventEmitter } from "events";
7
7
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
8
+ import { ILoader } from "@fluidframework/container-definitions";
8
9
  import { IFluidErrorBase, LoggingError } from "@fluidframework/telemetry-utils";
9
- import { IRequest, IResponse, IFluidHandleContext, IFluidHandle } from "@fluidframework/core-interfaces";
10
+ import { IFluidHandleContext, IFluidHandle } from "@fluidframework/core-interfaces";
10
11
  import { ISummaryConfiguration } from "@fluidframework/protocol-definitions";
11
12
  import { ICancellableSummarizerController } from "./runWhileConnectedCoordinator";
12
13
  import { SummaryCollection } from "./summaryCollection";
@@ -39,13 +40,13 @@ export declare class Summarizer extends EventEmitter implements ISummarizer {
39
40
  readonly summaryCollection: SummaryCollection;
40
41
  private readonly runCoordinatorCreateFn;
41
42
  get IFluidLoadable(): this;
42
- get IFluidRouter(): this;
43
43
  get ISummarizer(): this;
44
44
  private readonly logger;
45
45
  private runningSummarizer?;
46
46
  private systemOpListener?;
47
47
  private opListener?;
48
48
  private _disposed;
49
+ private starting;
49
50
  private readonly innerHandle;
50
51
  get handle(): IFluidHandle<this>;
51
52
  private readonly stopDeferred;
@@ -58,6 +59,16 @@ export declare class Summarizer extends EventEmitter implements ISummarizer {
58
59
  * In practical terms, it's same runtime (this.runtime) with clientType === "summarizer".
59
60
  */
60
61
  internalsProvider: ISummarizerInternalsProvider, handleContext: IFluidHandleContext, summaryCollection: SummaryCollection, runCoordinatorCreateFn: (runtime: IConnectableRuntime) => Promise<ICancellableSummarizerController>);
62
+ /**
63
+ * Creates a Summarizer and its underlying client.
64
+ * Note that different implementations of ILoader will handle the URL differently.
65
+ * ILoader provided by a ContainerRuntime is a RelativeLoader, which will treat URL's
66
+ * starting with "/" as relative to the Container. The general ILoader
67
+ * interface will expect an absolute URL and will not handle "/".
68
+ * @param loader - the loader that resolves the request
69
+ * @param url - the URL used to resolve the container
70
+ */
71
+ static create(loader: ILoader, url: string): Promise<ISummarizer>;
61
72
  run(onBehalfOf: string, options?: Readonly<Partial<ISummarizerOptions>>): Promise<SummarizerStopReason>;
62
73
  /**
63
74
  * Stops the summarizer from running. This will complete
@@ -65,8 +76,17 @@ export declare class Summarizer extends EventEmitter implements ISummarizer {
65
76
  * @param reason - reason code for stopping
66
77
  */
67
78
  stop(reason: SummarizerStopReason): void;
68
- request(request: IRequest): Promise<IResponse>;
69
79
  private runCore;
80
+ /**
81
+ * Put the summarizer in a started state, including creating and initializing the RunningSummarizer.
82
+ * The start request can come either from the SummaryManager (in the auto-summarize case) or from the user
83
+ * (in the on-demand case).
84
+ * @param onBehalfOf - ID of the client that requested that the summarizer start
85
+ * @param runCoordinator - cancellation token
86
+ * @param options - options to forward to the RunningSummarizer
87
+ * @returns - Promise that is fulfilled when the RunningSummarizer is ready
88
+ */
89
+ private start;
70
90
  /**
71
91
  * Disposes of resources after running. This cleanup will
72
92
  * clear any outstanding timers and reset some of the state
@@ -1 +1 @@
1
- {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"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"}
package/lib/summarizer.js CHANGED
@@ -4,11 +4,16 @@
4
4
  */
5
5
  import { EventEmitter } from "events";
6
6
  import { Deferred } from "@fluidframework/common-utils";
7
+ import { LoaderHeader } from "@fluidframework/container-definitions";
8
+ import { UsageError } from "@fluidframework/container-utils";
9
+ import { DriverHeader } from "@fluidframework/driver-definitions";
10
+ import { requestFluidObject } from "@fluidframework/runtime-utils";
7
11
  import { ChildLogger, LoggingError, wrapErrorAndLog } from "@fluidframework/telemetry-utils";
8
- import { create404Response } from "@fluidframework/runtime-utils";
12
+ import { summarizerClientType } from "./summarizerClientElection";
9
13
  import { SummarizerHandle } from "./summarizerHandle";
10
14
  import { RunningSummarizer } from "./runningSummarizer";
11
15
  import { SummarizeHeuristicData } from "./summarizerHeuristics";
16
+ import { SummarizeResultBuilder } from "./summaryGenerator";
12
17
  const summarizingError = "summarizingError";
13
18
  export class SummarizingWarning extends LoggingError {
14
19
  constructor(errorMessage, fluidErrorCode, logged = false) {
@@ -46,16 +51,59 @@ export class Summarizer extends EventEmitter {
46
51
  this.summaryCollection = summaryCollection;
47
52
  this.runCoordinatorCreateFn = runCoordinatorCreateFn;
48
53
  this._disposed = false;
54
+ this.starting = false;
49
55
  this.stopDeferred = new Deferred();
50
56
  this.summarizeOnDemand = (...args) => {
51
- if (this._disposed || this.runningSummarizer === undefined || this.runningSummarizer.disposed) {
52
- throw Error("Summarizer is not running or already disposed.");
57
+ var _a;
58
+ try {
59
+ if (this._disposed || ((_a = this.runningSummarizer) === null || _a === void 0 ? void 0 : _a.disposed)) {
60
+ throw new UsageError("Summarizer is already disposed.");
61
+ }
62
+ if (this.runtime.summarizerClientId !== undefined &&
63
+ this.runtime.summarizerClientId !== this.runtime.clientId) {
64
+ // If there is an elected summarizer, and it's not this one, don't allow on-demand summary.
65
+ // This is to prevent the on-demand summary and heuristic-based summary from stepping on
66
+ // each other.
67
+ throw new UsageError("On-demand summary attempted while an elected summarizer is present");
68
+ }
69
+ const builder = new SummarizeResultBuilder();
70
+ if (this.runningSummarizer) {
71
+ // Summarizer is already running. Go ahead and start.
72
+ return this.runningSummarizer.summarizeOnDemand(builder, ...args);
73
+ }
74
+ // Summarizer isn't running, so we need to start it, which is an async operation.
75
+ // Manage the promise related to creating the cancellation token here.
76
+ // The promises related to starting, summarizing,
77
+ // and submitting are communicated to the caller through the results builder.
78
+ const coordinatorCreateP = this.runCoordinatorCreateFn(this.runtime);
79
+ coordinatorCreateP.then((runCoordinator) => {
80
+ // Successully created the cancellation token. Start the summarizer.
81
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
82
+ const startP = this.start(this.runtime.clientId, runCoordinator, { disableHeuristics: true });
83
+ startP.then(async (runningSummarizer) => {
84
+ // Successfully started the summarizer. Run it.
85
+ runningSummarizer.summarizeOnDemand(builder, ...args);
86
+ // Wait for a command to stop or loss of connectivity before tearing down the summarizer and client.
87
+ const stopReason = await Promise.race([this.stopDeferred.promise, runCoordinator.waitCancelled]);
88
+ await runningSummarizer.waitStop(false);
89
+ runCoordinator.stop(stopReason);
90
+ this.dispose();
91
+ this.runtime.closeFn();
92
+ }).catch((reason) => {
93
+ builder.fail("Failed to start summarizer", reason);
94
+ });
95
+ }).catch((reason) => {
96
+ builder.fail("Failed to create cancellation token", reason);
97
+ });
98
+ return builder.build();
99
+ }
100
+ catch (error) {
101
+ throw SummarizingWarning.wrap(error, "summarizerRun", false /* logged */, this.logger);
53
102
  }
54
- return this.runningSummarizer.summarizeOnDemand(...args);
55
103
  };
56
104
  this.enqueueSummarize = (...args) => {
57
105
  if (this._disposed || this.runningSummarizer === undefined || this.runningSummarizer.disposed) {
58
- throw Error("Summarizer is not running or already disposed.");
106
+ throw new UsageError("Summarizer is not running or already disposed.");
59
107
  }
60
108
  return this.runningSummarizer.enqueueSummarize(...args);
61
109
  };
@@ -63,9 +111,37 @@ export class Summarizer extends EventEmitter {
63
111
  this.innerHandle = new SummarizerHandle(this, url, handleContext);
64
112
  }
65
113
  get IFluidLoadable() { return this; }
66
- get IFluidRouter() { return this; }
67
114
  get ISummarizer() { return this; }
68
115
  get handle() { return this.innerHandle; }
116
+ /**
117
+ * Creates a Summarizer and its underlying client.
118
+ * Note that different implementations of ILoader will handle the URL differently.
119
+ * ILoader provided by a ContainerRuntime is a RelativeLoader, which will treat URL's
120
+ * starting with "/" as relative to the Container. The general ILoader
121
+ * interface will expect an absolute URL and will not handle "/".
122
+ * @param loader - the loader that resolves the request
123
+ * @param url - the URL used to resolve the container
124
+ */
125
+ static async create(loader, url) {
126
+ const request = {
127
+ headers: {
128
+ [LoaderHeader.cache]: false,
129
+ [LoaderHeader.clientDetails]: {
130
+ capabilities: { interactive: false },
131
+ type: summarizerClientType,
132
+ },
133
+ [DriverHeader.summarizingClient]: true,
134
+ [LoaderHeader.reconnect]: false,
135
+ },
136
+ url,
137
+ };
138
+ const resolvedContainer = await loader.resolve(request);
139
+ const fluidObject = await requestFluidObject(resolvedContainer, { url: "_summarizer" });
140
+ if (fluidObject.ISummarizer === undefined) {
141
+ throw new UsageError("Fluid object does not implement ISummarizer");
142
+ }
143
+ return fluidObject.ISummarizer;
144
+ }
69
145
  async run(onBehalfOf, options) {
70
146
  try {
71
147
  return await this.runCore(onBehalfOf, options);
@@ -87,23 +163,7 @@ export class Summarizer extends EventEmitter {
87
163
  stop(reason) {
88
164
  this.stopDeferred.resolve(reason);
89
165
  }
90
- async request(request) {
91
- if (request.url === "/" || request.url === "") {
92
- return {
93
- mimeType: "fluid/object",
94
- status: 200,
95
- value: this,
96
- };
97
- }
98
- return create404Response(request);
99
- }
100
166
  async runCore(onBehalfOf, options) {
101
- // Initialize values and first ack (time is not exact)
102
- this.logger.sendTelemetryEvent({
103
- eventName: "RunningSummarizer",
104
- onBehalfOf,
105
- initSummarySeqNumber: this.runtime.deltaManager.initialSequenceNumber,
106
- });
107
167
  const runCoordinator = await this.runCoordinatorCreateFn(this.runtime);
108
168
  // Wait for either external signal to cancel, or loss of connectivity.
109
169
  const stopP = Promise.race([runCoordinator.waitCancelled, this.stopDeferred.promise]);
@@ -117,10 +177,60 @@ export class Summarizer extends EventEmitter {
117
177
  if (runCoordinator.cancelled) {
118
178
  return runCoordinator.waitCancelled;
119
179
  }
180
+ const runningSummarizer = await this.start(onBehalfOf, runCoordinator, options);
181
+ // Wait for either external signal to cancel, or loss of connectivity.
182
+ const stopReason = await stopP;
183
+ // There are two possible approaches here:
184
+ // 1. Propagate cancellation from this.stopDeferred to runCoordinator. This will ensure that we move to the exit
185
+ // faster, including breaking out of the RunningSummarizer.trySummarize() faster.
186
+ // We could create new coordinator and pass it to waitStop() -> trySummarizeOnce("lastSummary") flow.
187
+ // The con of this approach is that we might cancel active summary, and lastSummary will fail because it
188
+ // did not wait for ack/nack from previous summary. Plus we disregard any 429 kind of info from service
189
+ // that way (i.e. trySummarize() loop might have been waiting for 5 min because storage told us so).
190
+ // In general, it's more wasted resources.
191
+ // 2. We can not do it and make waitStop() do last summary only if there was no active summary. This ensures
192
+ // that client behaves properly (from server POV) and we do not waste resources. But, it may mean we wait
193
+ // substantially longer for trySummarize() retries to play out and thus this summary loop may run into
194
+ // conflict with new summarizer client starting on different client.
195
+ // As of now, #2 is implemented. It's more forward looking, as issue #7279 suggests changing design for new
196
+ // summarizer client to not be created until current summarizer fully moves to exit, and that would reduce
197
+ // cons of #2 substantially.
198
+ // Cleanup after running
199
+ await runningSummarizer.waitStop(!runCoordinator.cancelled /* allowLastSummary */);
200
+ // Propagate reason and ensure that if someone is waiting for cancellation token, they are moving to exit
201
+ runCoordinator.stop(stopReason);
202
+ return stopReason;
203
+ }
204
+ /**
205
+ * Put the summarizer in a started state, including creating and initializing the RunningSummarizer.
206
+ * The start request can come either from the SummaryManager (in the auto-summarize case) or from the user
207
+ * (in the on-demand case).
208
+ * @param onBehalfOf - ID of the client that requested that the summarizer start
209
+ * @param runCoordinator - cancellation token
210
+ * @param options - options to forward to the RunningSummarizer
211
+ * @returns - Promise that is fulfilled when the RunningSummarizer is ready
212
+ */
213
+ async start(onBehalfOf, runCoordinator, options) {
214
+ if (this.runningSummarizer) {
215
+ if (this.runningSummarizer.disposed) {
216
+ throw new UsageError("Starting a disposed summarizer");
217
+ }
218
+ return this.runningSummarizer;
219
+ }
220
+ if (this.starting) {
221
+ throw new UsageError("Attempting to start a summarizer that is already starting");
222
+ }
223
+ this.starting = true;
224
+ // Initialize values and first ack (time is not exact)
225
+ this.logger.sendTelemetryEvent({
226
+ eventName: "RunningSummarizer",
227
+ onBehalfOf,
228
+ initSummarySeqNumber: this.runtime.deltaManager.initialSequenceNumber,
229
+ });
120
230
  // Summarizing container ID (with clientType === "summarizer")
121
231
  const clientId = this.runtime.clientId;
122
232
  if (clientId === undefined) {
123
- throw Error("clientId should be defined if connected.");
233
+ throw new UsageError("clientId should be defined if connected.");
124
234
  }
125
235
  const runningSummarizer = await RunningSummarizer.start(this.logger, this.summaryCollection.createWatcher(clientId), this.configurationGetter(), async (...args) => this.internalsProvider.submitSummary(...args), // submitSummaryCallback
126
236
  new SummarizeHeuristicData(this.runtime.deltaManager.lastSequenceNumber, {
@@ -132,6 +242,7 @@ export class Summarizer extends EventEmitter {
132
242
  }
133
243
  }, this.summaryCollection, runCoordinator /* cancellationToken */, (reason) => runCoordinator.stop(reason), /* stopSummarizerCallback */ options);
134
244
  this.runningSummarizer = runningSummarizer;
245
+ this.starting = false;
135
246
  // Handle summary acks
136
247
  // Note: no exceptions are thrown from handleSummaryAcks handler as it handles all exceptions
137
248
  this.handleSummaryAcks().catch((error) => {
@@ -142,28 +253,7 @@ export class Summarizer extends EventEmitter {
142
253
  this.runtime.deltaManager.inbound.on("op", this.systemOpListener);
143
254
  this.opListener = (error, op) => runningSummarizer.handleOp(error, op);
144
255
  this.runtime.on("batchEnd", this.opListener);
145
- // Wait for either external signal to cancel, or loss of connectivity.
146
- const stopReason = await stopP;
147
- // There are two possible approaches here:
148
- // 1. Propagate cancellation from this.stopDeferred to runCoordinator. This will ensure that we move to the exit
149
- // faster, including breaking out of the RunningSummarizer.trySummarize() faster.
150
- // We could create new coordinator and pass it to waitStop() -> trySummarizeOnce("lastSummary") flow.
151
- // The con of this approach is that we might cancel active summary, and lastSummary will fail because it
152
- // did not wait for ack/nack from previous summary. Plus we disregard any 429 kind of info from service
153
- // that way (i.e. trySummarize() loop might have been waiting for 5 min because storage told us so).
154
- // In general, it's more wasted resources.
155
- // 2. We can not do it and make waitStop() do last summary only if there was no active summary. This ensures
156
- // that client behaves properly (from server POV) and we do not waste resources. But, it may mean we wait
157
- // substantially longer for trySummarize() retries to play out and thus this summary loop may run into
158
- // conflict with new summarizer client starting on different client.
159
- // As of now, #2 is implemented. It's more forward looking, as issue #7279 suggests changing design for new
160
- // summarizer client to not be created until current summarizer fully moves to exit, and that would reduce
161
- // cons of #2 substantially.
162
- // Cleanup after running
163
- await runningSummarizer.waitStop(!runCoordinator.cancelled /* allowLastSummary */);
164
- // Propagate reason and ensure that if someone is waiting for cancellation token, they are moving to exit
165
- runCoordinator.stop(stopReason);
166
- return stopReason;
256
+ return runningSummarizer;
167
257
  }
168
258
  /**
169
259
  * Disposes of resources after running. This cleanup will
@@ -1 +1 @@
1
- {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,OAAO,EAAE,WAAW,EAAmB,YAAY,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAW9G,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AASxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAE5C,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAIhD,YACI,YAAoB,EACX,cAAsB,EACtB,SAAkB,KAAK;QAEhC,KAAK,CAAC,YAAY,CAAC,CAAC;QAHX,mBAAc,GAAd,cAAc,CAAQ;QACtB,WAAM,GAAN,MAAM,CAAiB;QAN3B,cAAS,GAAG,gBAAgB,CAAC;QAC7B,aAAQ,GAAG,IAAI,CAAC;IAQzB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAU,EAAE,SAAiB,EAAE,SAAkB,KAAK,EAAE,MAAwB;QACxF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACzF,OAAO,eAAe,CAAqB,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,wBAAwB,GACjC,CAAC,SAAiB,EAAE,MAAe,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAEjG;;;;GAIG;AACH,MAAM,OAAO,UAAW,SAAQ,YAAY;IAgBxC,YACI,GAAW;IACX;;OAEG;IACc,OAA2B,EAC3B,mBAAgD;IACjE;;MAEE;IACe,iBAA+C,EAChE,aAAkC,EAClB,iBAAoC,EACnC,sBAC8D;QAE/E,KAAK,EAAE,CAAC;QAXS,YAAO,GAAP,OAAO,CAAoB;QAC3B,wBAAmB,GAAnB,mBAAmB,CAA6B;QAIhD,sBAAiB,GAAjB,iBAAiB,CAA8B;QAEhD,sBAAiB,GAAjB,iBAAiB,CAAmB;QACnC,2BAAsB,GAAtB,sBAAsB,CACwC;QArB3E,cAAS,GAAY,KAAK,CAAC;QAKlB,iBAAY,GAAG,IAAI,QAAQ,EAAwB,CAAC;QAiLrD,sBAAiB,GAAqC,CAAC,GAAG,IAAI,EAAE,EAAE;YAC9E,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;gBAC3F,MAAM,KAAK,CAAC,gDAAgD,CAAC,CAAC;aACjE;YACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEc,qBAAgB,GAAoC,CAAC,GAAG,IAAI,EAAE,EAAE;YAC5E,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;gBAC3F,MAAM,KAAK,CAAC,gDAAgD,CAAC,CAAC;aACjE;YACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC;QA1KE,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACpE,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IACtE,CAAC;IAlCD,IAAW,cAAc,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAW,YAAY,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAC1C,IAAW,WAAW,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAUzC,IAAW,MAAM,KAAyB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAwB7D,KAAK,CAAC,GAAG,CACZ,UAAkB,EAClB,OAA+C;QAC/C,IAAI;YACA,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;SAClD;QAAC,OAAO,KAAK,EAAE;YACZ,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACjC,MAAM,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAC1F;gBAAS;YACN,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SAC1B;IACL,CAAC;IAED;;;;OAIG;IACI,IAAI,CAAC,MAA4B;QACpC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAiB;QAClC,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,KAAK,EAAE,EAAE;YAC3C,OAAO;gBACH,QAAQ,EAAE,cAAc;gBACxB,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,IAAI;aACd,CAAC;SACL;QACD,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,OAAO,CACjB,UAAkB,EAClB,OAA+C;QAC/C,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC3B,SAAS,EAAE,mBAAmB;YAC9B,UAAU;YACV,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,qBAAqB;SACxE,CAAC,CAAC;QAEH,MAAM,cAAc,GAAqC,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzG,sEAAsE;QACtE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QACtF,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACvB,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;gBAC3B,SAAS,EAAE,oBAAoB;gBAC/B,UAAU;gBACV,MAAM;aACT,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,IAAI,cAAc,CAAC,SAAS,EAAE;YAC1B,OAAO,cAAc,CAAC,aAAa,CAAC;SACvC;QAED,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS,EAAE;YACxB,MAAM,KAAK,CAAC,0CAA0C,CAAC,CAAC;SAC3D;QAED,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,CAAC,KAAK,CACnD,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC,EAC9C,IAAI,CAAC,mBAAmB,EAAE,EAC1B,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,EAAE,wBAAwB;QAC1F,IAAI,sBAAsB,CACtB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAC5C;YACI,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,qBAAqB;YAClE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACjB,CACb,EACD,CAAC,SAAiB,EAAE,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACjB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;aAC5E;QACL,CAAC,EACD,IAAI,CAAC,iBAAiB,EACtB,cAAc,CAAC,uBAAuB,EACtC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,4BAA4B,CACrE,OAAO,CACV,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAE3C,sBAAsB;QACtB,6FAA6F;QAC7F,IAAI,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,4BAA4B,EAAE,EAAE,KAAK,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAA6B,EAAE,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAElE,IAAI,CAAC,UAAU,GAAG,CAAC,KAAU,EAAE,EAA6B,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7C,sEAAsE;QACtE,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC;QAE/B,0CAA0C;QAC1C,gHAAgH;QAChH,oFAAoF;QACpF,wGAAwG;QACxG,2GAA2G;QAC3G,0GAA0G;QAC1G,uGAAuG;QACvG,6CAA6C;QAC7C,4GAA4G;QAC5G,4GAA4G;QAC5G,yGAAyG;QACzG,uEAAuE;QACvE,2GAA2G;QAC3G,0GAA0G;QAC1G,4BAA4B;QAE5B,wBAAwB;QACxB,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAEnF,yGAAyG;QACzG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEhC,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACI,OAAO;QACV,iGAAiG;QACjG,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAE1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;SACtC;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACtE;QACD,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;SAC5D;IACL,CAAC;IAgBO,KAAK,CAAC,iBAAiB;;QAC3B,IAAI,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC;QACxE,OAAO,IAAI,CAAC,iBAAiB,EAAE;YAC3B,MAAM,aAAa,SAAG,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,mCAAI,IAAI,CAAC,MAAM,CAAC;YACtG,IAAI;gBACA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;gBAC3E,iBAAiB,GAAG,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC;gBAE1D,MAAM,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAChD,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAC7B,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAC9B,iBAAiB,EACjB,aAAa,CAChB,CAAC;aACL;YAAC,OAAO,KAAK,EAAE;gBACZ,aAAa,CAAC,cAAc,CAAC;oBACzB,SAAS,EAAE,uBAAuB;oBAClC,uBAAuB,EAAE,iBAAiB;iBAC7C,EAAE,KAAK,CAAC,CAAC;aACb;YACD,iBAAiB,EAAE,CAAC;SACvB;IACL,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { EventEmitter } from \"events\";\nimport { Deferred } from \"@fluidframework/common-utils\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { ChildLogger, IFluidErrorBase, LoggingError, wrapErrorAndLog } from \"@fluidframework/telemetry-utils\";\nimport {\n IRequest,\n IResponse,\n IFluidHandleContext,\n IFluidHandle,\n} from \"@fluidframework/core-interfaces\";\nimport {\n ISequencedDocumentMessage,\n ISummaryConfiguration,\n} from \"@fluidframework/protocol-definitions\";\nimport { create404Response } from \"@fluidframework/runtime-utils\";\nimport { ICancellableSummarizerController } from \"./runWhileConnectedCoordinator\";\nimport { SummaryCollection } from \"./summaryCollection\";\nimport { SummarizerHandle } from \"./summarizerHandle\";\nimport { RunningSummarizer } from \"./runningSummarizer\";\nimport {\n ISummarizer,\n ISummarizerInternalsProvider,\n ISummarizerOptions,\n ISummarizerRuntime,\n ISummarizingWarning,\n SummarizerStopReason,\n} from \"./summarizerTypes\";\nimport { SummarizeHeuristicData } from \"./summarizerHeuristics\";\nimport { IConnectableRuntime } from \".\";\n\nconst summarizingError = \"summarizingError\";\n\nexport class SummarizingWarning extends LoggingError implements ISummarizingWarning, IFluidErrorBase {\n readonly errorType = summarizingError;\n readonly canRetry = true;\n\n constructor(\n errorMessage: string,\n readonly fluidErrorCode: string,\n readonly logged: boolean = false,\n ) {\n super(errorMessage);\n }\n\n static wrap(error: any, errorCode: string, logged: boolean = false, logger: ITelemetryLogger) {\n const newErrorFn = (errMsg: string) => new SummarizingWarning(errMsg, errorCode, logged);\n return wrapErrorAndLog<SummarizingWarning>(error, newErrorFn, logger);\n }\n}\n\nexport const createSummarizingWarning =\n (errorCode: string, logged: boolean) => new SummarizingWarning(errorCode, errorCode, logged);\n\n/**\n * Summarizer is responsible for coordinating when to generate and send summaries.\n * It is the main entry point for summary work.\n * It is created only by summarizing container (i.e. one with clientType === \"summarizer\")\n */\nexport class Summarizer extends EventEmitter implements ISummarizer {\n public get IFluidLoadable() { return this; }\n public get IFluidRouter() { return this; }\n public get ISummarizer() { return this; }\n\n private readonly logger: ITelemetryLogger;\n private runningSummarizer?: RunningSummarizer;\n private systemOpListener?: (op: ISequencedDocumentMessage) => void;\n private opListener?: (error: any, op: ISequencedDocumentMessage) => void;\n private _disposed: boolean = false;\n\n private readonly innerHandle: IFluidHandle<this>;\n\n public get handle(): IFluidHandle<this> { return this.innerHandle; }\n private readonly stopDeferred = new Deferred<SummarizerStopReason>();\n\n constructor(\n url: string,\n /** Reference to runtime that created this object.\n * i.e. runtime with clientType === \"summarizer\"\n */\n private readonly runtime: ISummarizerRuntime,\n private readonly configurationGetter: () => ISummaryConfiguration,\n /** Represents an object that can generate summary.\n * In practical terms, it's same runtime (this.runtime) with clientType === \"summarizer\".\n */\n private readonly internalsProvider: ISummarizerInternalsProvider,\n handleContext: IFluidHandleContext,\n public readonly summaryCollection: SummaryCollection,\n private readonly runCoordinatorCreateFn:\n (runtime: IConnectableRuntime) => Promise<ICancellableSummarizerController>,\n ) {\n super();\n this.logger = ChildLogger.create(this.runtime.logger, \"Summarizer\");\n this.innerHandle = new SummarizerHandle(this, url, handleContext);\n }\n\n public async run(\n onBehalfOf: string,\n options?: Readonly<Partial<ISummarizerOptions>>): Promise<SummarizerStopReason> {\n try {\n return await this.runCore(onBehalfOf, options);\n } catch (error) {\n this.stop(\"summarizerException\");\n throw SummarizingWarning.wrap(error, \"summarizerRun\", false /* logged */, this.logger);\n } finally {\n this.dispose();\n this.runtime.closeFn();\n }\n }\n\n /**\n * Stops the summarizer from running. This will complete\n * the run promise, and also close the container.\n * @param reason - reason code for stopping\n */\n public stop(reason: SummarizerStopReason) {\n this.stopDeferred.resolve(reason);\n }\n\n public async request(request: IRequest): Promise<IResponse> {\n if (request.url === \"/\" || request.url === \"\") {\n return {\n mimeType: \"fluid/object\",\n status: 200,\n value: this,\n };\n }\n return create404Response(request);\n }\n\n private async runCore(\n onBehalfOf: string,\n options?: Readonly<Partial<ISummarizerOptions>>): Promise<SummarizerStopReason> {\n // Initialize values and first ack (time is not exact)\n this.logger.sendTelemetryEvent({\n eventName: \"RunningSummarizer\",\n onBehalfOf,\n initSummarySeqNumber: this.runtime.deltaManager.initialSequenceNumber,\n });\n\n const runCoordinator: ICancellableSummarizerController = await this.runCoordinatorCreateFn(this.runtime);\n\n // Wait for either external signal to cancel, or loss of connectivity.\n const stopP = Promise.race([runCoordinator.waitCancelled, this.stopDeferred.promise]);\n void stopP.then((reason) => {\n this.logger.sendTelemetryEvent({\n eventName: \"StoppingSummarizer\",\n onBehalfOf,\n reason,\n });\n });\n\n if (runCoordinator.cancelled) {\n return runCoordinator.waitCancelled;\n }\n\n // Summarizing container ID (with clientType === \"summarizer\")\n const clientId = this.runtime.clientId;\n if (clientId === undefined) {\n throw Error(\"clientId should be defined if connected.\");\n }\n\n const runningSummarizer = await RunningSummarizer.start(\n this.logger,\n this.summaryCollection.createWatcher(clientId),\n this.configurationGetter(),\n async (...args) => this.internalsProvider.submitSummary(...args), // submitSummaryCallback\n new SummarizeHeuristicData(\n this.runtime.deltaManager.lastSequenceNumber,\n { /** summary attempt baseline for heuristics */\n refSequenceNumber: this.runtime.deltaManager.initialSequenceNumber,\n summaryTime: Date.now(),\n } as const,\n ),\n (errorCode: string) => {\n if (!this._disposed) {\n this.emit(\"summarizingError\", createSummarizingWarning(errorCode, true));\n }\n },\n this.summaryCollection,\n runCoordinator /* cancellationToken */,\n (reason) => runCoordinator.stop(reason), /* stopSummarizerCallback */\n options,\n );\n this.runningSummarizer = runningSummarizer;\n\n // Handle summary acks\n // Note: no exceptions are thrown from handleSummaryAcks handler as it handles all exceptions\n this.handleSummaryAcks().catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"HandleSummaryAckFatalError\" }, error);\n });\n\n // Listen for ops\n this.systemOpListener = (op: ISequencedDocumentMessage) => runningSummarizer.handleSystemOp(op);\n this.runtime.deltaManager.inbound.on(\"op\", this.systemOpListener);\n\n this.opListener = (error: any, op: ISequencedDocumentMessage) => runningSummarizer.handleOp(error, op);\n this.runtime.on(\"batchEnd\", this.opListener);\n\n // Wait for either external signal to cancel, or loss of connectivity.\n const stopReason = await stopP;\n\n // There are two possible approaches here:\n // 1. Propagate cancellation from this.stopDeferred to runCoordinator. This will ensure that we move to the exit\n // faster, including breaking out of the RunningSummarizer.trySummarize() faster.\n // We could create new coordinator and pass it to waitStop() -> trySummarizeOnce(\"lastSummary\") flow.\n // The con of this approach is that we might cancel active summary, and lastSummary will fail because it\n // did not wait for ack/nack from previous summary. Plus we disregard any 429 kind of info from service\n // that way (i.e. trySummarize() loop might have been waiting for 5 min because storage told us so).\n // In general, it's more wasted resources.\n // 2. We can not do it and make waitStop() do last summary only if there was no active summary. This ensures\n // that client behaves properly (from server POV) and we do not waste resources. But, it may mean we wait\n // substantially longer for trySummarize() retries to play out and thus this summary loop may run into\n // conflict with new summarizer client starting on different client.\n // As of now, #2 is implemented. It's more forward looking, as issue #7279 suggests changing design for new\n // summarizer client to not be created until current summarizer fully moves to exit, and that would reduce\n // cons of #2 substantially.\n\n // Cleanup after running\n await runningSummarizer.waitStop(!runCoordinator.cancelled /* allowLastSummary */);\n\n // Propagate reason and ensure that if someone is waiting for cancellation token, they are moving to exit\n runCoordinator.stop(stopReason);\n\n return stopReason;\n }\n\n /**\n * Disposes of resources after running. This cleanup will\n * clear any outstanding timers and reset some of the state\n * properties.\n * Called by ContainerRuntime when it is disposed, as well as at the end the run().\n */\n public dispose() {\n // Given that the call can come from own ContainerRuntime, ensure that we stop all the processes.\n this.stop(\"summarizerClientDisconnected\");\n\n this._disposed = true;\n if (this.runningSummarizer) {\n this.runningSummarizer.dispose();\n this.runningSummarizer = undefined;\n }\n if (this.systemOpListener) {\n this.runtime.deltaManager.inbound.off(\"op\", this.systemOpListener);\n }\n if (this.opListener) {\n this.runtime.removeListener(\"batchEnd\", this.opListener);\n }\n }\n\n public readonly summarizeOnDemand: ISummarizer[\"summarizeOnDemand\"] = (...args) => {\n if (this._disposed || this.runningSummarizer === undefined || this.runningSummarizer.disposed) {\n throw Error(\"Summarizer is not running or already disposed.\");\n }\n return this.runningSummarizer.summarizeOnDemand(...args);\n };\n\n public readonly enqueueSummarize: ISummarizer[\"enqueueSummarize\"] = (...args) => {\n if (this._disposed || this.runningSummarizer === undefined || this.runningSummarizer.disposed) {\n throw Error(\"Summarizer is not running or already disposed.\");\n }\n return this.runningSummarizer.enqueueSummarize(...args);\n };\n\n private async handleSummaryAcks() {\n let refSequenceNumber = this.runtime.deltaManager.initialSequenceNumber;\n while (this.runningSummarizer) {\n const summaryLogger = this.runningSummarizer.tryGetCorrelatedLogger(refSequenceNumber) ?? this.logger;\n try {\n const ack = await this.summaryCollection.waitSummaryAck(refSequenceNumber);\n refSequenceNumber = ack.summaryOp.referenceSequenceNumber;\n\n await this.internalsProvider.refreshLatestSummaryAck(\n ack.summaryOp.contents.handle,\n ack.summaryAck.contents.handle,\n refSequenceNumber,\n summaryLogger,\n );\n } catch (error) {\n summaryLogger.sendErrorEvent({\n eventName: \"HandleSummaryAckError\",\n referenceSequenceNumber: refSequenceNumber,\n }, error);\n }\n refSequenceNumber++;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { EventEmitter } from \"events\";\nimport { Deferred } from \"@fluidframework/common-utils\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { ILoader, LoaderHeader } from \"@fluidframework/container-definitions\";\nimport { UsageError } from \"@fluidframework/container-utils\";\nimport { DriverHeader } from \"@fluidframework/driver-definitions\";\nimport { requestFluidObject } from \"@fluidframework/runtime-utils\";\nimport { ChildLogger, IFluidErrorBase, LoggingError, wrapErrorAndLog } from \"@fluidframework/telemetry-utils\";\nimport {\n FluidObject,\n IFluidHandleContext,\n IFluidHandle,\n IRequest,\n} from \"@fluidframework/core-interfaces\";\nimport {\n ISequencedDocumentMessage,\n ISummaryConfiguration,\n} from \"@fluidframework/protocol-definitions\";\nimport { ICancellableSummarizerController } from \"./runWhileConnectedCoordinator\";\nimport { summarizerClientType } from \"./summarizerClientElection\";\nimport { SummaryCollection } from \"./summaryCollection\";\nimport { SummarizerHandle } from \"./summarizerHandle\";\nimport { RunningSummarizer } from \"./runningSummarizer\";\nimport {\n ISummarizer,\n ISummarizerInternalsProvider,\n ISummarizerOptions,\n ISummarizerRuntime,\n ISummarizingWarning,\n SummarizerStopReason,\n} from \"./summarizerTypes\";\nimport { SummarizeHeuristicData } from \"./summarizerHeuristics\";\nimport { SummarizeResultBuilder } from \"./summaryGenerator\";\nimport { IConnectableRuntime } from \".\";\n\nconst summarizingError = \"summarizingError\";\n\nexport class SummarizingWarning extends LoggingError implements ISummarizingWarning, IFluidErrorBase {\n readonly errorType = summarizingError;\n readonly canRetry = true;\n\n constructor(\n errorMessage: string,\n readonly fluidErrorCode: string,\n readonly logged: boolean = false,\n ) {\n super(errorMessage);\n }\n\n static wrap(error: any, errorCode: string, logged: boolean = false, logger: ITelemetryLogger) {\n const newErrorFn = (errMsg: string) => new SummarizingWarning(errMsg, errorCode, logged);\n return wrapErrorAndLog<SummarizingWarning>(error, newErrorFn, logger);\n }\n}\n\nexport const createSummarizingWarning =\n (errorCode: string, logged: boolean) => new SummarizingWarning(errorCode, errorCode, logged);\n\n/**\n * Summarizer is responsible for coordinating when to generate and send summaries.\n * It is the main entry point for summary work.\n * It is created only by summarizing container (i.e. one with clientType === \"summarizer\")\n */\nexport class Summarizer extends EventEmitter implements ISummarizer {\n public get IFluidLoadable() { return this; }\n public get ISummarizer() { return this; }\n\n private readonly logger: ITelemetryLogger;\n private runningSummarizer?: RunningSummarizer;\n private systemOpListener?: (op: ISequencedDocumentMessage) => void;\n private opListener?: (error: any, op: ISequencedDocumentMessage) => void;\n private _disposed: boolean = false;\n private starting: boolean = false;\n\n private readonly innerHandle: IFluidHandle<this>;\n\n public get handle(): IFluidHandle<this> { return this.innerHandle; }\n private readonly stopDeferred = new Deferred<SummarizerStopReason>();\n\n constructor(\n url: string,\n /** Reference to runtime that created this object.\n * i.e. runtime with clientType === \"summarizer\"\n */\n private readonly runtime: ISummarizerRuntime,\n private readonly configurationGetter: () => ISummaryConfiguration,\n /** Represents an object that can generate summary.\n * In practical terms, it's same runtime (this.runtime) with clientType === \"summarizer\".\n */\n private readonly internalsProvider: ISummarizerInternalsProvider,\n handleContext: IFluidHandleContext,\n public readonly summaryCollection: SummaryCollection,\n private readonly runCoordinatorCreateFn:\n (runtime: IConnectableRuntime) => Promise<ICancellableSummarizerController>,\n ) {\n super();\n this.logger = ChildLogger.create(this.runtime.logger, \"Summarizer\");\n this.innerHandle = new SummarizerHandle(this, url, handleContext);\n }\n\n /**\n * Creates a Summarizer and its underlying client.\n * Note that different implementations of ILoader will handle the URL differently.\n * ILoader provided by a ContainerRuntime is a RelativeLoader, which will treat URL's\n * starting with \"/\" as relative to the Container. The general ILoader\n * interface will expect an absolute URL and will not handle \"/\".\n * @param loader - the loader that resolves the request\n * @param url - the URL used to resolve the container\n */\n public static async create(\n loader: ILoader,\n url: string): Promise<ISummarizer> {\n const request: IRequest = {\n headers: {\n [LoaderHeader.cache]: false,\n [LoaderHeader.clientDetails]: {\n capabilities: { interactive: false },\n type: summarizerClientType,\n },\n [DriverHeader.summarizingClient]: true,\n [LoaderHeader.reconnect]: false,\n },\n url,\n };\n\n const resolvedContainer = await loader.resolve(request);\n const fluidObject =\n await requestFluidObject<FluidObject<ISummarizer>>(resolvedContainer, { url: \"_summarizer\" });\n if (fluidObject.ISummarizer === undefined) {\n throw new UsageError(\"Fluid object does not implement ISummarizer\");\n }\n return fluidObject.ISummarizer;\n }\n\n public async run(\n onBehalfOf: string,\n options?: Readonly<Partial<ISummarizerOptions>>): Promise<SummarizerStopReason> {\n try {\n return await this.runCore(onBehalfOf, options);\n } catch (error) {\n this.stop(\"summarizerException\");\n throw SummarizingWarning.wrap(error, \"summarizerRun\", false /* logged */, this.logger);\n } finally {\n this.dispose();\n this.runtime.closeFn();\n }\n }\n\n /**\n * Stops the summarizer from running. This will complete\n * the run promise, and also close the container.\n * @param reason - reason code for stopping\n */\n public stop(reason: SummarizerStopReason) {\n this.stopDeferred.resolve(reason);\n }\n\n private async runCore(\n onBehalfOf: string,\n options?: Readonly<Partial<ISummarizerOptions>>): Promise<SummarizerStopReason> {\n const runCoordinator: ICancellableSummarizerController = await this.runCoordinatorCreateFn(this.runtime);\n\n // Wait for either external signal to cancel, or loss of connectivity.\n const stopP = Promise.race([runCoordinator.waitCancelled, this.stopDeferred.promise]);\n void stopP.then((reason) => {\n this.logger.sendTelemetryEvent({\n eventName: \"StoppingSummarizer\",\n onBehalfOf,\n reason,\n });\n });\n\n if (runCoordinator.cancelled) {\n return runCoordinator.waitCancelled;\n }\n\n const runningSummarizer = await this.start(onBehalfOf, runCoordinator, options);\n\n // Wait for either external signal to cancel, or loss of connectivity.\n const stopReason = await stopP;\n\n // There are two possible approaches here:\n // 1. Propagate cancellation from this.stopDeferred to runCoordinator. This will ensure that we move to the exit\n // faster, including breaking out of the RunningSummarizer.trySummarize() faster.\n // We could create new coordinator and pass it to waitStop() -> trySummarizeOnce(\"lastSummary\") flow.\n // The con of this approach is that we might cancel active summary, and lastSummary will fail because it\n // did not wait for ack/nack from previous summary. Plus we disregard any 429 kind of info from service\n // that way (i.e. trySummarize() loop might have been waiting for 5 min because storage told us so).\n // In general, it's more wasted resources.\n // 2. We can not do it and make waitStop() do last summary only if there was no active summary. This ensures\n // that client behaves properly (from server POV) and we do not waste resources. But, it may mean we wait\n // substantially longer for trySummarize() retries to play out and thus this summary loop may run into\n // conflict with new summarizer client starting on different client.\n // As of now, #2 is implemented. It's more forward looking, as issue #7279 suggests changing design for new\n // summarizer client to not be created until current summarizer fully moves to exit, and that would reduce\n // cons of #2 substantially.\n\n // Cleanup after running\n await runningSummarizer.waitStop(!runCoordinator.cancelled /* allowLastSummary */);\n\n // Propagate reason and ensure that if someone is waiting for cancellation token, they are moving to exit\n runCoordinator.stop(stopReason);\n\n return stopReason;\n }\n\n /**\n * Put the summarizer in a started state, including creating and initializing the RunningSummarizer.\n * The start request can come either from the SummaryManager (in the auto-summarize case) or from the user\n * (in the on-demand case).\n * @param onBehalfOf - ID of the client that requested that the summarizer start\n * @param runCoordinator - cancellation token\n * @param options - options to forward to the RunningSummarizer\n * @returns - Promise that is fulfilled when the RunningSummarizer is ready\n */\n private async start(\n onBehalfOf: string,\n runCoordinator: ICancellableSummarizerController,\n options?: Readonly<Partial<ISummarizerOptions>>): Promise<RunningSummarizer> {\n if (this.runningSummarizer) {\n if (this.runningSummarizer.disposed) {\n throw new UsageError(\"Starting a disposed summarizer\");\n }\n return this.runningSummarizer;\n }\n if (this.starting) {\n throw new UsageError(\"Attempting to start a summarizer that is already starting\");\n }\n this.starting = true;\n // Initialize values and first ack (time is not exact)\n this.logger.sendTelemetryEvent({\n eventName: \"RunningSummarizer\",\n onBehalfOf,\n initSummarySeqNumber: this.runtime.deltaManager.initialSequenceNumber,\n });\n\n // Summarizing container ID (with clientType === \"summarizer\")\n const clientId = this.runtime.clientId;\n if (clientId === undefined) {\n throw new UsageError(\"clientId should be defined if connected.\");\n }\n\n const runningSummarizer = await RunningSummarizer.start(\n this.logger,\n this.summaryCollection.createWatcher(clientId),\n this.configurationGetter(),\n async (...args) => this.internalsProvider.submitSummary(...args), // submitSummaryCallback\n new SummarizeHeuristicData(\n this.runtime.deltaManager.lastSequenceNumber,\n { /** summary attempt baseline for heuristics */\n refSequenceNumber: this.runtime.deltaManager.initialSequenceNumber,\n summaryTime: Date.now(),\n } as const,\n ),\n (errorCode: string) => {\n if (!this._disposed) {\n this.emit(\"summarizingError\", createSummarizingWarning(errorCode, true));\n }\n },\n this.summaryCollection,\n runCoordinator /* cancellationToken */,\n (reason) => runCoordinator.stop(reason), /* stopSummarizerCallback */\n options,\n );\n this.runningSummarizer = runningSummarizer;\n this.starting = false;\n\n // Handle summary acks\n // Note: no exceptions are thrown from handleSummaryAcks handler as it handles all exceptions\n this.handleSummaryAcks().catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"HandleSummaryAckFatalError\" }, error);\n });\n\n // Listen for ops\n this.systemOpListener = (op: ISequencedDocumentMessage) => runningSummarizer.handleSystemOp(op);\n this.runtime.deltaManager.inbound.on(\"op\", this.systemOpListener);\n\n this.opListener = (error: any, op: ISequencedDocumentMessage) => runningSummarizer.handleOp(error, op);\n this.runtime.on(\"batchEnd\", this.opListener);\n\n return runningSummarizer;\n }\n\n /**\n * Disposes of resources after running. This cleanup will\n * clear any outstanding timers and reset some of the state\n * properties.\n * Called by ContainerRuntime when it is disposed, as well as at the end the run().\n */\n public dispose() {\n // Given that the call can come from own ContainerRuntime, ensure that we stop all the processes.\n this.stop(\"summarizerClientDisconnected\");\n\n this._disposed = true;\n if (this.runningSummarizer) {\n this.runningSummarizer.dispose();\n this.runningSummarizer = undefined;\n }\n if (this.systemOpListener) {\n this.runtime.deltaManager.inbound.off(\"op\", this.systemOpListener);\n }\n if (this.opListener) {\n this.runtime.removeListener(\"batchEnd\", this.opListener);\n }\n }\n\n public readonly summarizeOnDemand: ISummarizer[\"summarizeOnDemand\"] = (...args) => {\n try {\n if (this._disposed || this.runningSummarizer?.disposed) {\n throw new UsageError(\"Summarizer is already disposed.\");\n }\n if (this.runtime.summarizerClientId !== undefined &&\n this.runtime.summarizerClientId !== this.runtime.clientId) {\n // If there is an elected summarizer, and it's not this one, don't allow on-demand summary.\n // This is to prevent the on-demand summary and heuristic-based summary from stepping on\n // each other.\n throw new UsageError(\"On-demand summary attempted while an elected summarizer is present\");\n }\n const builder = new SummarizeResultBuilder();\n if (this.runningSummarizer) {\n // Summarizer is already running. Go ahead and start.\n return this.runningSummarizer.summarizeOnDemand(builder, ...args);\n }\n\n // Summarizer isn't running, so we need to start it, which is an async operation.\n // Manage the promise related to creating the cancellation token here.\n // The promises related to starting, summarizing,\n // and submitting are communicated to the caller through the results builder.\n const coordinatorCreateP = this.runCoordinatorCreateFn(this.runtime);\n\n coordinatorCreateP.then((runCoordinator) => {\n // Successully created the cancellation token. Start the summarizer.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const startP = this.start(this.runtime.clientId!, runCoordinator, { disableHeuristics: true });\n startP.then(async (runningSummarizer) => {\n // Successfully started the summarizer. Run it.\n runningSummarizer.summarizeOnDemand(builder, ...args);\n // Wait for a command to stop or loss of connectivity before tearing down the summarizer and client.\n const stopReason = await Promise.race([this.stopDeferred.promise, runCoordinator.waitCancelled]);\n await runningSummarizer.waitStop(false);\n runCoordinator.stop(stopReason);\n this.dispose();\n this.runtime.closeFn();\n }).catch((reason) => {\n builder.fail(\"Failed to start summarizer\", reason);\n });\n }).catch((reason) => {\n builder.fail(\"Failed to create cancellation token\", reason);\n });\n\n return builder.build();\n }\n catch (error) {\n throw SummarizingWarning.wrap(error, \"summarizerRun\", false /* logged */, this.logger);\n }\n };\n\n public readonly enqueueSummarize: ISummarizer[\"enqueueSummarize\"] = (...args) => {\n if (this._disposed || this.runningSummarizer === undefined || this.runningSummarizer.disposed) {\n throw new UsageError(\"Summarizer is not running or already disposed.\");\n }\n return this.runningSummarizer.enqueueSummarize(...args);\n };\n\n private async handleSummaryAcks() {\n let refSequenceNumber = this.runtime.deltaManager.initialSequenceNumber;\n while (this.runningSummarizer) {\n const summaryLogger = this.runningSummarizer.tryGetCorrelatedLogger(refSequenceNumber) ?? this.logger;\n try {\n const ack = await this.summaryCollection.waitSummaryAck(refSequenceNumber);\n refSequenceNumber = ack.summaryOp.referenceSequenceNumber;\n\n await this.internalsProvider.refreshLatestSummaryAck(\n ack.summaryOp.contents.handle,\n ack.summaryAck.contents.handle,\n refSequenceNumber,\n summaryLogger,\n );\n } catch (error) {\n summaryLogger.sendErrorEvent({\n eventName: \"HandleSummaryAckError\",\n referenceSequenceNumber: refSequenceNumber,\n }, error);\n }\n refSequenceNumber++;\n }\n }\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { IEvent, IEventProvider, ITelemetryLogger } from "@fluidframework/common-definitions";
6
- import { IFluidRouter, IFluidLoadable } from "@fluidframework/core-interfaces";
6
+ import { IFluidLoadable } from "@fluidframework/core-interfaces";
7
7
  import { ContainerWarning, IDeltaManager } from "@fluidframework/container-definitions";
8
8
  import { ISequencedDocumentMessage, ISummaryTree, IDocumentMessage } from "@fluidframework/protocol-definitions";
9
9
  import { ISummaryStats } from "@fluidframework/runtime-definitions";
@@ -189,13 +189,6 @@ export interface ISummarizeResults {
189
189
  /** Resolves when we receive a summaryAck or summaryNack. */
190
190
  readonly receivedSummaryAckOrNack: Promise<SummarizeResultPart<IAckSummaryResult, INackSummaryResult>>;
191
191
  }
192
- export declare type OnDemandSummarizeResult = (ISummarizeResults & {
193
- /** Indicates that an already running summarize attempt does not exist. */
194
- readonly alreadyRunning?: undefined;
195
- }) | {
196
- /** Resolves when an already running summarize attempt completes. */
197
- readonly alreadyRunning: Promise<void>;
198
- };
199
192
  export declare type EnqueueSummarizeResult = (ISummarizeResults & {
200
193
  /**
201
194
  * Indicates that another summarize attempt is not already enqueued,
@@ -239,7 +232,7 @@ export interface ISummarizerEvents extends IEvent {
239
232
  */
240
233
  (event: "summarizingError", listener: (error: ISummarizingWarning) => void): any;
241
234
  }
242
- export interface ISummarizer extends IEventProvider<ISummarizerEvents>, IFluidRouter, IFluidLoadable, Partial<IProvideSummarizer> {
235
+ export interface ISummarizer extends IEventProvider<ISummarizerEvents>, IFluidLoadable, Partial<IProvideSummarizer> {
243
236
  stop(reason: SummarizerStopReason): void;
244
237
  run(onBehalfOf: string, options?: Readonly<Partial<ISummarizerOptions>>): Promise<SummarizerStopReason>;
245
238
  /**
@@ -251,7 +244,7 @@ export interface ISummarizer extends IEventProvider<ISummarizerEvents>, IFluidRo
251
244
  * that resolve as the summarize attempt progresses. They will resolve with success
252
245
  * false if a failure is encountered.
253
246
  */
254
- summarizeOnDemand(options: IOnDemandSummarizeOptions): OnDemandSummarizeResult;
247
+ summarizeOnDemand(options: IOnDemandSummarizeOptions): ISummarizeResults;
255
248
  /**
256
249
  * Enqueue an attempt to summarize after the specified sequence number.
257
250
  * If afterSequenceNumber is provided, the summarize attempt is "enqueued"
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerTypes.d.ts","sourceRoot":"","sources":["../src/summarizerTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summarizerTypes.d.ts","sourceRoot":"","sources":["../src/summarizerTypes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerTypes.js","sourceRoot":"","sources":["../src/summarizerTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAA6B,aAAa,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IEvent,\n IEventProvider,\n ITelemetryLogger,\n} from \"@fluidframework/common-definitions\";\nimport {\n IFluidRouter,\n IFluidLoadable,\n} from \"@fluidframework/core-interfaces\";\nimport { ContainerWarning, IDeltaManager } from \"@fluidframework/container-definitions\";\nimport {\n ISequencedDocumentMessage,\n ISummaryTree,\n IDocumentMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport { ISummaryStats } from \"@fluidframework/runtime-definitions\";\nimport { ISummaryAckMessage, ISummaryNackMessage, ISummaryOpMessage } from \"./summaryCollection\";\n\ndeclare module \"@fluidframework/core-interfaces\" {\n export interface IFluidObject {\n /** @deprecated - use `FluidObject<ISummarizer>` instead */\n readonly ISummarizer?: ISummarizer;\n\n }\n}\n\n/**\n * @deprecated - This will be removed in a later release.\n */\nexport const ISummarizer: keyof IProvideSummarizer = \"ISummarizer\";\n\n/**\n * @deprecated - This will be removed in a later release.\n */\nexport interface IProvideSummarizer {\n /**\n * @deprecated - This will be removed in a later release.\n */\n readonly ISummarizer: ISummarizer;\n}\n\n/**\n * Similar to AbortSignal, but using promise instead of events\n * @param T - cancellation reason type\n */\nexport interface ICancellationToken<T> {\n /** Tells if this cancellable token is cancelled */\n readonly cancelled: boolean;\n /**\n * Promise that gets fulfilled when this cancellable token is cancelled\n * @returns reason of cancellation\n */\n readonly waitCancelled: Promise<T>;\n}\n\n/* Similar to AbortSignal, but using promise instead of events */\nexport type ISummaryCancellationToken = ICancellationToken<SummarizerStopReason>;\n\nexport interface ISummarizerInternalsProvider {\n /** Encapsulates the work to walk the internals of the running container to generate a summary */\n submitSummary(options: ISubmitSummaryOptions): Promise<SubmitSummaryResult>;\n\n /** Callback whenever a new SummaryAck is received, to update internal tracking state */\n refreshLatestSummaryAck(\n proposalHandle: string,\n ackHandle: string,\n summaryRefSeq: number,\n summaryLogger: ITelemetryLogger,\n ): Promise<void>;\n}\n\n/** Options that control the behavior of a running summarizer. */\nexport interface ISummarizerOptions {\n /**\n * Set to true to disable the default heuristics from running; false by default.\n * This affects only the heuristics around when a summarizer should\n * submit summaries. So when it is disabled, summarizer clients should\n * not be expected to summarize unless an on-demand summary is requested.\n */\n disableHeuristics: boolean;\n}\n\nexport interface ISummarizingWarning extends ContainerWarning {\n readonly errorType: \"summarizingError\";\n readonly logged: boolean;\n}\n\nexport interface IConnectableRuntime {\n readonly disposed: boolean;\n readonly connected: boolean;\n readonly clientId: string | undefined;\n readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n once(event: \"connected\" | \"disconnected\" | \"dispose\", listener: () => void): this;\n}\n\nexport interface ISummarizerRuntime extends IConnectableRuntime {\n readonly logger: ITelemetryLogger;\n /** clientId of parent (non-summarizing) container that owns summarizer container */\n readonly summarizerClientId: string | undefined;\n closeFn(): void;\n on(event: \"batchEnd\", listener: (error: any, op: ISequencedDocumentMessage) => void): this;\n removeListener(event: \"batchEnd\", listener: (error: any, op: ISequencedDocumentMessage) => void): this;\n}\n\n/** Options affecting summarize behavior. */\nexport interface ISummarizeOptions {\n /** True to generate the full tree with no handle reuse optimizations; defaults to false */\n readonly fullTree?: boolean,\n /** True to ask the server what the latest summary is first; defaults to false */\n readonly refreshLatestAck?: boolean,\n}\n\nexport interface ISubmitSummaryOptions extends ISummarizeOptions {\n /** Logger to use for correlated summary events */\n readonly summaryLogger: ITelemetryLogger,\n /** Tells when summary process should be cancelled */\n readonly cancellationToken: ISummaryCancellationToken,\n}\n\nexport interface IOnDemandSummarizeOptions extends ISummarizeOptions {\n /** Reason for generating summary. */\n readonly reason: string;\n}\n\n/** Options to use when enqueueing a summarize attempt. */\nexport interface IEnqueueSummarizeOptions extends IOnDemandSummarizeOptions {\n /** If specified, The summarize attempt will not occur until after this sequence number. */\n readonly afterSequenceNumber?: number;\n /**\n * True to override the existing enqueued summarize attempt if there is one.\n * This will guarantee that this attempt gets enqueued. If override is false,\n * than an existing enqueued summarize attempt will block a new one from being\n * enqueued. There can only be one enqueued at a time. Defaults to false.\n */\n readonly override?: boolean;\n}\n\n/**\n * In addition to the normal summary tree + stats, this contains additional stats\n * only relevant at the root of the tree.\n */\nexport interface IGeneratedSummaryStats extends ISummaryStats {\n readonly dataStoreCount: number;\n readonly summarizedDataStoreCount: number;\n}\n\n/** Base results for all submitSummary attempts. */\nexport interface IBaseSummarizeResult {\n readonly stage: \"base\";\n /** Error object related to failed summarize attempt. */\n readonly error: any;\n /** Reference sequence number as of the generate summary attempt. */\n readonly referenceSequenceNumber: number;\n}\n\n/** Results of submitSummary after generating the summary tree. */\nexport interface IGenerateSummaryTreeResult extends Omit<IBaseSummarizeResult, \"stage\"> {\n readonly stage: \"generate\";\n /** Generated summary tree. */\n readonly summaryTree: ISummaryTree;\n /** Stats for generated summary tree. */\n readonly summaryStats: IGeneratedSummaryStats;\n /** Time it took to generate the summary tree and stats. */\n readonly generateDuration: number;\n}\n\n/** Results of submitSummary after uploading the tree to storage. */\nexport interface IUploadSummaryResult extends Omit<IGenerateSummaryTreeResult, \"stage\"> {\n readonly stage: \"upload\";\n /** The handle returned by storage pointing to the uploaded summary tree. */\n readonly handle: string;\n /** Time it took to upload the summary tree to storage. */\n readonly uploadDuration: number;\n}\n\n/** Results of submitSummary after submitting the summarize op. */\nexport interface ISubmitSummaryOpResult extends Omit<IUploadSummaryResult, \"stage\" | \"error\"> {\n readonly stage: \"submit\";\n /** The client sequence number of the summarize op submitted for the summary. */\n readonly clientSequenceNumber: number;\n /** Time it took to submit the summarize op to the broadcasting service. */\n readonly submitOpDuration: number;\n}\n\n/**\n * Strict type representing result of a submitSummary attempt.\n * The result consists of 4 possible stages, each with its own data.\n * The data is cumulative, so each stage will contain the data from the previous stages.\n * If the final \"submitted\" stage is not reached, the result may contain the error object.\n * Stages:\n * 1. \"base\" - stopped before the summary tree was even generated, and the result only contains the base data\n * 2. \"generate\" - the summary tree was generated, and the result will contain that tree + stats\n * 3. \"upload\" - the summary was uploaded to storage, and the result contains the server-provided handle\n * 4. \"submit\" - the summarize op was submitted, and the result contains the op client sequence number.\n */\nexport type SubmitSummaryResult =\n | IBaseSummarizeResult\n | IGenerateSummaryTreeResult\n | IUploadSummaryResult\n | ISubmitSummaryOpResult;\n\nexport interface IBroadcastSummaryResult {\n readonly summarizeOp: ISummaryOpMessage;\n readonly broadcastDuration: number;\n}\n\nexport interface IAckSummaryResult {\n readonly summaryAckOp: ISummaryAckMessage;\n readonly ackNackDuration: number;\n}\n\nexport interface INackSummaryResult {\n readonly summaryNackOp: ISummaryNackMessage;\n readonly ackNackDuration: number;\n}\n\nexport type SummarizeResultPart<TSuccess, TFailure = undefined> = {\n success: true;\n data: TSuccess;\n} | {\n success: false;\n data: TFailure | undefined;\n message: string;\n error: any;\n retryAfterSeconds?: number;\n};\n\nexport interface ISummarizeResults {\n /** Resolves when we generate, upload, and submit the summary. */\n readonly summarySubmitted: Promise<SummarizeResultPart<SubmitSummaryResult>>;\n /** Resolves when we observe our summarize op broadcast. */\n readonly summaryOpBroadcasted: Promise<SummarizeResultPart<IBroadcastSummaryResult>>;\n /** Resolves when we receive a summaryAck or summaryNack. */\n readonly receivedSummaryAckOrNack: Promise<SummarizeResultPart<IAckSummaryResult, INackSummaryResult>>;\n}\n\nexport type OnDemandSummarizeResult = (ISummarizeResults & {\n /** Indicates that an already running summarize attempt does not exist. */\n readonly alreadyRunning?: undefined;\n}) | {\n /** Resolves when an already running summarize attempt completes. */\n readonly alreadyRunning: Promise<void>;\n};\n\nexport type EnqueueSummarizeResult = (ISummarizeResults & {\n /**\n * Indicates that another summarize attempt is not already enqueued,\n * and this attempt has been enqueued.\n */\n readonly alreadyEnqueued?: undefined;\n}) | (ISummarizeResults & {\n /** Indicates that another summarize attempt was already enqueued. */\n readonly alreadyEnqueued: true;\n /**\n * Indicates that the other enqueued summarize attempt was abandoned,\n * and this attempt has been enqueued enqueued.\n */\n readonly overridden: true;\n}) | {\n /** Indicates that another summarize attempt was already enqueued. */\n readonly alreadyEnqueued: true;\n /**\n * Indicates that the other enqueued summarize attempt remains enqueued,\n * and this attempt has not been enqueued.\n */\n readonly overridden?: undefined;\n};\n\nexport type SummarizerStopReason =\n /** Summarizer client failed to summarize in all 3 consecutive attempts. */\n | \"failToSummarize\"\n /** Parent client reported that it is no longer connected. */\n | \"parentNotConnected\"\n /**\n * Parent client reported that it is no longer elected the summarizer.\n * This is the normal flow; a disconnect will always trigger the parent\n * client to no longer be elected as responsible for summaries. Then it\n * tries to stop its spawned summarizer client.\n */\n | \"parentShouldNotSummarize\"\n /** Summarizer client was disconnected */\n | \"summarizerClientDisconnected\"\n /* running summarizer threw an exception */\n | \"summarizerException\";\n\nexport interface ISummarizerEvents extends IEvent {\n /**\n * An event indicating that the Summarizer is having problems summarizing\n */\n (event: \"summarizingError\", listener: (error: ISummarizingWarning) => void);\n}\n\nexport interface ISummarizer extends\n IEventProvider<ISummarizerEvents>, IFluidRouter, IFluidLoadable, Partial<IProvideSummarizer>{\n stop(reason: SummarizerStopReason): void;\n run(onBehalfOf: string, options?: Readonly<Partial<ISummarizerOptions>>): Promise<SummarizerStopReason>;\n\n /**\n * Attempts to generate a summary on demand. If already running, takes no action.\n * @param options - options controlling the summarize attempt\n * @returns an alreadyRunning promise if a summarize attempt is already in progress,\n * which will resolve when the current attempt completes. At that point caller can\n * decide to try again or not. Otherwise, it will return an object containing promises\n * that resolve as the summarize attempt progresses. They will resolve with success\n * false if a failure is encountered.\n */\n summarizeOnDemand(options: IOnDemandSummarizeOptions): OnDemandSummarizeResult;\n /**\n * Enqueue an attempt to summarize after the specified sequence number.\n * If afterSequenceNumber is provided, the summarize attempt is \"enqueued\"\n * to run once an eligible op comes in with sequenceNumber \\>= afterSequenceNumber.\n * @param options - options controlling the summarize attempt\n * @returns an object containing an alreadyEnqueued flag to indicate if another\n * summarize attempt has already been enqueued. It also may contain an overridden flag\n * when alreadyEnqueued is true, that indicates whether this attempt forced the\n * previous attempt to abort. If this attempt becomes enqueued, it returns an object\n * containing promises that resolve as the summarize attempt progresses. They will\n * resolve with success false if a failure is encountered.\n */\n enqueueSummarize(options: IEnqueueSummarizeOptions): EnqueueSummarizeResult;\n}\n\n/** Data about an attempt to summarize used for heuristics. */\nexport interface ISummarizeAttempt {\n /** Reference sequence number when summary was generated or attempted */\n readonly refSequenceNumber: number;\n\n /** Time of summary attempt after it was sent or attempted */\n readonly summaryTime: number;\n\n /** Sequence number of summary op */\n summarySequenceNumber?: number;\n}\n\n/** Data relevant for summary heuristics. */\nexport interface ISummarizeHeuristicData {\n /** Latest received op sequence number */\n lastOpSequenceNumber: number;\n\n /** Most recent summary attempt from this client */\n readonly lastAttempt: ISummarizeAttempt;\n\n /** Most recent summary that received an ack */\n readonly lastSuccessfulSummary: Readonly<ISummarizeAttempt>;\n\n /**\n * Initializes lastAttempt and lastSuccessfulAttempt based on the last summary.\n * @param lastSummary - last ack summary\n */\n initialize(lastSummary: ISummarizeAttempt): void;\n\n /**\n * Records a summary attempt. If the attempt was successfully sent,\n * provide the reference sequence number, otherwise it will be set\n * to the last seen op sequence number.\n * @param referenceSequenceNumber - reference sequence number of sent summary\n */\n recordAttempt(referenceSequenceNumber?: number): void;\n\n /** Mark that the last sent summary attempt has received an ack */\n markLastAttemptAsSuccessful(): void;\n}\n\n/** Responsible for running heuristics determining when to summarize. */\nexport interface ISummarizeHeuristicRunner {\n /** Runs the heuristic to determine if it should try to summarize */\n run(): void;\n\n /** Runs a different heuristic to check if it should summarize before closing */\n shouldRunLastSummary(): boolean;\n\n /** Disposes of resources */\n dispose(): void;\n}\n"]}
1
+ {"version":3,"file":"summarizerTypes.js","sourceRoot":"","sources":["../src/summarizerTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2BH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAA6B,aAAa,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IEvent,\n IEventProvider,\n ITelemetryLogger,\n} from \"@fluidframework/common-definitions\";\nimport {\n IFluidLoadable,\n} from \"@fluidframework/core-interfaces\";\nimport { ContainerWarning, IDeltaManager } from \"@fluidframework/container-definitions\";\nimport {\n ISequencedDocumentMessage,\n ISummaryTree,\n IDocumentMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport { ISummaryStats } from \"@fluidframework/runtime-definitions\";\nimport { ISummaryAckMessage, ISummaryNackMessage, ISummaryOpMessage } from \"./summaryCollection\";\n\ndeclare module \"@fluidframework/core-interfaces\" {\n export interface IFluidObject {\n /** @deprecated - use `FluidObject<ISummarizer>` instead */\n readonly ISummarizer?: ISummarizer;\n\n }\n}\n\n/**\n * @deprecated - This will be removed in a later release.\n */\nexport const ISummarizer: keyof IProvideSummarizer = \"ISummarizer\";\n\n/**\n * @deprecated - This will be removed in a later release.\n */\nexport interface IProvideSummarizer {\n /**\n * @deprecated - This will be removed in a later release.\n */\n readonly ISummarizer: ISummarizer;\n}\n\n/**\n * Similar to AbortSignal, but using promise instead of events\n * @param T - cancellation reason type\n */\nexport interface ICancellationToken<T> {\n /** Tells if this cancellable token is cancelled */\n readonly cancelled: boolean;\n /**\n * Promise that gets fulfilled when this cancellable token is cancelled\n * @returns reason of cancellation\n */\n readonly waitCancelled: Promise<T>;\n}\n\n/* Similar to AbortSignal, but using promise instead of events */\nexport type ISummaryCancellationToken = ICancellationToken<SummarizerStopReason>;\n\nexport interface ISummarizerInternalsProvider {\n /** Encapsulates the work to walk the internals of the running container to generate a summary */\n submitSummary(options: ISubmitSummaryOptions): Promise<SubmitSummaryResult>;\n\n /** Callback whenever a new SummaryAck is received, to update internal tracking state */\n refreshLatestSummaryAck(\n proposalHandle: string,\n ackHandle: string,\n summaryRefSeq: number,\n summaryLogger: ITelemetryLogger,\n ): Promise<void>;\n}\n\n/** Options that control the behavior of a running summarizer. */\nexport interface ISummarizerOptions {\n /**\n * Set to true to disable the default heuristics from running; false by default.\n * This affects only the heuristics around when a summarizer should\n * submit summaries. So when it is disabled, summarizer clients should\n * not be expected to summarize unless an on-demand summary is requested.\n */\n disableHeuristics: boolean;\n}\n\nexport interface ISummarizingWarning extends ContainerWarning {\n readonly errorType: \"summarizingError\";\n readonly logged: boolean;\n}\n\nexport interface IConnectableRuntime {\n readonly disposed: boolean;\n readonly connected: boolean;\n readonly clientId: string | undefined;\n readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n once(event: \"connected\" | \"disconnected\" | \"dispose\", listener: () => void): this;\n}\n\nexport interface ISummarizerRuntime extends IConnectableRuntime {\n readonly logger: ITelemetryLogger;\n /** clientId of parent (non-summarizing) container that owns summarizer container */\n readonly summarizerClientId: string | undefined;\n closeFn(): void;\n on(event: \"batchEnd\", listener: (error: any, op: ISequencedDocumentMessage) => void): this;\n removeListener(event: \"batchEnd\", listener: (error: any, op: ISequencedDocumentMessage) => void): this;\n}\n\n/** Options affecting summarize behavior. */\nexport interface ISummarizeOptions {\n /** True to generate the full tree with no handle reuse optimizations; defaults to false */\n readonly fullTree?: boolean,\n /** True to ask the server what the latest summary is first; defaults to false */\n readonly refreshLatestAck?: boolean,\n}\n\nexport interface ISubmitSummaryOptions extends ISummarizeOptions {\n /** Logger to use for correlated summary events */\n readonly summaryLogger: ITelemetryLogger,\n /** Tells when summary process should be cancelled */\n readonly cancellationToken: ISummaryCancellationToken,\n}\n\nexport interface IOnDemandSummarizeOptions extends ISummarizeOptions {\n /** Reason for generating summary. */\n readonly reason: string;\n}\n\n/** Options to use when enqueueing a summarize attempt. */\nexport interface IEnqueueSummarizeOptions extends IOnDemandSummarizeOptions {\n /** If specified, The summarize attempt will not occur until after this sequence number. */\n readonly afterSequenceNumber?: number;\n /**\n * True to override the existing enqueued summarize attempt if there is one.\n * This will guarantee that this attempt gets enqueued. If override is false,\n * than an existing enqueued summarize attempt will block a new one from being\n * enqueued. There can only be one enqueued at a time. Defaults to false.\n */\n readonly override?: boolean;\n}\n\n/**\n * In addition to the normal summary tree + stats, this contains additional stats\n * only relevant at the root of the tree.\n */\nexport interface IGeneratedSummaryStats extends ISummaryStats {\n readonly dataStoreCount: number;\n readonly summarizedDataStoreCount: number;\n}\n\n/** Base results for all submitSummary attempts. */\nexport interface IBaseSummarizeResult {\n readonly stage: \"base\";\n /** Error object related to failed summarize attempt. */\n readonly error: any;\n /** Reference sequence number as of the generate summary attempt. */\n readonly referenceSequenceNumber: number;\n}\n\n/** Results of submitSummary after generating the summary tree. */\nexport interface IGenerateSummaryTreeResult extends Omit<IBaseSummarizeResult, \"stage\"> {\n readonly stage: \"generate\";\n /** Generated summary tree. */\n readonly summaryTree: ISummaryTree;\n /** Stats for generated summary tree. */\n readonly summaryStats: IGeneratedSummaryStats;\n /** Time it took to generate the summary tree and stats. */\n readonly generateDuration: number;\n}\n\n/** Results of submitSummary after uploading the tree to storage. */\nexport interface IUploadSummaryResult extends Omit<IGenerateSummaryTreeResult, \"stage\"> {\n readonly stage: \"upload\";\n /** The handle returned by storage pointing to the uploaded summary tree. */\n readonly handle: string;\n /** Time it took to upload the summary tree to storage. */\n readonly uploadDuration: number;\n}\n\n/** Results of submitSummary after submitting the summarize op. */\nexport interface ISubmitSummaryOpResult extends Omit<IUploadSummaryResult, \"stage\" | \"error\"> {\n readonly stage: \"submit\";\n /** The client sequence number of the summarize op submitted for the summary. */\n readonly clientSequenceNumber: number;\n /** Time it took to submit the summarize op to the broadcasting service. */\n readonly submitOpDuration: number;\n}\n\n/**\n * Strict type representing result of a submitSummary attempt.\n * The result consists of 4 possible stages, each with its own data.\n * The data is cumulative, so each stage will contain the data from the previous stages.\n * If the final \"submitted\" stage is not reached, the result may contain the error object.\n * Stages:\n * 1. \"base\" - stopped before the summary tree was even generated, and the result only contains the base data\n * 2. \"generate\" - the summary tree was generated, and the result will contain that tree + stats\n * 3. \"upload\" - the summary was uploaded to storage, and the result contains the server-provided handle\n * 4. \"submit\" - the summarize op was submitted, and the result contains the op client sequence number.\n */\nexport type SubmitSummaryResult =\n | IBaseSummarizeResult\n | IGenerateSummaryTreeResult\n | IUploadSummaryResult\n | ISubmitSummaryOpResult;\n\nexport interface IBroadcastSummaryResult {\n readonly summarizeOp: ISummaryOpMessage;\n readonly broadcastDuration: number;\n}\n\nexport interface IAckSummaryResult {\n readonly summaryAckOp: ISummaryAckMessage;\n readonly ackNackDuration: number;\n}\n\nexport interface INackSummaryResult {\n readonly summaryNackOp: ISummaryNackMessage;\n readonly ackNackDuration: number;\n}\n\nexport type SummarizeResultPart<TSuccess, TFailure = undefined> = {\n success: true;\n data: TSuccess;\n} | {\n success: false;\n data: TFailure | undefined;\n message: string;\n error: any;\n retryAfterSeconds?: number;\n};\n\nexport interface ISummarizeResults {\n /** Resolves when we generate, upload, and submit the summary. */\n readonly summarySubmitted: Promise<SummarizeResultPart<SubmitSummaryResult>>;\n /** Resolves when we observe our summarize op broadcast. */\n readonly summaryOpBroadcasted: Promise<SummarizeResultPart<IBroadcastSummaryResult>>;\n /** Resolves when we receive a summaryAck or summaryNack. */\n readonly receivedSummaryAckOrNack: Promise<SummarizeResultPart<IAckSummaryResult, INackSummaryResult>>;\n}\n\nexport type EnqueueSummarizeResult = (ISummarizeResults & {\n /**\n * Indicates that another summarize attempt is not already enqueued,\n * and this attempt has been enqueued.\n */\n readonly alreadyEnqueued?: undefined;\n}) | (ISummarizeResults & {\n /** Indicates that another summarize attempt was already enqueued. */\n readonly alreadyEnqueued: true;\n /**\n * Indicates that the other enqueued summarize attempt was abandoned,\n * and this attempt has been enqueued enqueued.\n */\n readonly overridden: true;\n}) | {\n /** Indicates that another summarize attempt was already enqueued. */\n readonly alreadyEnqueued: true;\n /**\n * Indicates that the other enqueued summarize attempt remains enqueued,\n * and this attempt has not been enqueued.\n */\n readonly overridden?: undefined;\n};\n\nexport type SummarizerStopReason =\n /** Summarizer client failed to summarize in all 3 consecutive attempts. */\n | \"failToSummarize\"\n /** Parent client reported that it is no longer connected. */\n | \"parentNotConnected\"\n /**\n * Parent client reported that it is no longer elected the summarizer.\n * This is the normal flow; a disconnect will always trigger the parent\n * client to no longer be elected as responsible for summaries. Then it\n * tries to stop its spawned summarizer client.\n */\n | \"parentShouldNotSummarize\"\n /** Summarizer client was disconnected */\n | \"summarizerClientDisconnected\"\n /* running summarizer threw an exception */\n | \"summarizerException\";\n\nexport interface ISummarizerEvents extends IEvent {\n /**\n * An event indicating that the Summarizer is having problems summarizing\n */\n (event: \"summarizingError\", listener: (error: ISummarizingWarning) => void);\n}\n\nexport interface ISummarizer extends\n IEventProvider<ISummarizerEvents>, IFluidLoadable, Partial<IProvideSummarizer>{\n stop(reason: SummarizerStopReason): void;\n\n run(onBehalfOf: string, options?: Readonly<Partial<ISummarizerOptions>>): Promise<SummarizerStopReason>;\n\n /**\n * Attempts to generate a summary on demand. If already running, takes no action.\n * @param options - options controlling the summarize attempt\n * @returns an alreadyRunning promise if a summarize attempt is already in progress,\n * which will resolve when the current attempt completes. At that point caller can\n * decide to try again or not. Otherwise, it will return an object containing promises\n * that resolve as the summarize attempt progresses. They will resolve with success\n * false if a failure is encountered.\n */\n summarizeOnDemand(options: IOnDemandSummarizeOptions): ISummarizeResults;\n /**\n * Enqueue an attempt to summarize after the specified sequence number.\n * If afterSequenceNumber is provided, the summarize attempt is \"enqueued\"\n * to run once an eligible op comes in with sequenceNumber \\>= afterSequenceNumber.\n * @param options - options controlling the summarize attempt\n * @returns an object containing an alreadyEnqueued flag to indicate if another\n * summarize attempt has already been enqueued. It also may contain an overridden flag\n * when alreadyEnqueued is true, that indicates whether this attempt forced the\n * previous attempt to abort. If this attempt becomes enqueued, it returns an object\n * containing promises that resolve as the summarize attempt progresses. They will\n * resolve with success false if a failure is encountered.\n */\n enqueueSummarize(options: IEnqueueSummarizeOptions): EnqueueSummarizeResult;\n}\n\n/** Data about an attempt to summarize used for heuristics. */\nexport interface ISummarizeAttempt {\n /** Reference sequence number when summary was generated or attempted */\n readonly refSequenceNumber: number;\n\n /** Time of summary attempt after it was sent or attempted */\n readonly summaryTime: number;\n\n /** Sequence number of summary op */\n summarySequenceNumber?: number;\n}\n\n/** Data relevant for summary heuristics. */\nexport interface ISummarizeHeuristicData {\n /** Latest received op sequence number */\n lastOpSequenceNumber: number;\n\n /** Most recent summary attempt from this client */\n readonly lastAttempt: ISummarizeAttempt;\n\n /** Most recent summary that received an ack */\n readonly lastSuccessfulSummary: Readonly<ISummarizeAttempt>;\n\n /**\n * Initializes lastAttempt and lastSuccessfulAttempt based on the last summary.\n * @param lastSummary - last ack summary\n */\n initialize(lastSummary: ISummarizeAttempt): void;\n\n /**\n * Records a summary attempt. If the attempt was successfully sent,\n * provide the reference sequence number, otherwise it will be set\n * to the last seen op sequence number.\n * @param referenceSequenceNumber - reference sequence number of sent summary\n */\n recordAttempt(referenceSequenceNumber?: number): void;\n\n /** Mark that the last sent summary attempt has received an ack */\n markLastAttemptAsSuccessful(): void;\n}\n\n/** Responsible for running heuristics determining when to summarize. */\nexport interface ISummarizeHeuristicRunner {\n /** Runs the heuristic to determine if it should try to summarize */\n run(): void;\n\n /** Runs a different heuristic to check if it should summarize before closing */\n shouldRunLastSummary(): boolean;\n\n /** Disposes of resources */\n dispose(): void;\n}\n"]}
@@ -43,7 +43,7 @@ export declare type WriteFluidDataStoreAttributes = IFluidDataStoreAttributes1 |
43
43
  export declare function getAttributesFormatVersion(attributes: ReadFluidDataStoreAttributes): number;
44
44
  export declare function hasIsolatedChannels(attributes: ReadFluidDataStoreAttributes): boolean;
45
45
  export declare type GCVersion = number;
46
- export interface IContainerRuntimeMetadata {
46
+ export interface IContainerRuntimeMetadata extends ICreateContainerMetadata {
47
47
  readonly summaryFormatVersion: 1;
48
48
  /** The last message processed at the time of summary. Only primitive propertiy types are added to the summary. */
49
49
  readonly message: ISummaryMetadataMessage | undefined;
@@ -51,6 +51,14 @@ export interface IContainerRuntimeMetadata {
51
51
  readonly disableIsolatedChannels?: true;
52
52
  /** 0 to disable GC, > 0 to enable GC, undefined defaults to disabled. */
53
53
  readonly gcFeature?: GCVersion;
54
+ /** Counter of the last summary happened, increments every time we summarize */
55
+ readonly summaryCount?: number;
56
+ }
57
+ export interface ICreateContainerMetadata {
58
+ /** Runtime version of the container when it was first created */
59
+ createContainerRuntimeVersion?: string;
60
+ /** Timestamp of the container when it was first created */
61
+ createContainerTimestamp?: number;
54
62
  }
55
63
  /** The properties of an ISequencedDocumentMessage to be stored in the metadata blob in summary. */
56
64
  export declare type ISummaryMetadataMessage = Pick<ISequencedDocumentMessage, "clientId" | "clientSequenceNumber" | "minimumSequenceNumber" | "referenceSequenceNumber" | "sequenceNumber" | "timestamp" | "type">;
@@ -60,6 +68,7 @@ export declare type ISummaryMetadataMessage = Pick<ISequencedDocumentMessage, "c
60
68
  */
61
69
  export declare const extractSummaryMetadataMessage: (message?: ISequencedDocumentMessage | undefined) => ISummaryMetadataMessage | undefined;
62
70
  export declare function getMetadataFormatVersion(metadata?: IContainerRuntimeMetadata): number;
71
+ export declare const aliasBlobName = ".aliases";
63
72
  export declare const metadataBlobName = ".metadata";
64
73
  export declare const chunksBlobName = ".chunks";
65
74
  export declare const electedSummarizerBlobName = ".electedSummarizer";