@fluidframework/container-loader 0.45.4 → 0.46.2

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 (52) hide show
  1. package/dist/container.d.ts.map +1 -1
  2. package/dist/container.js +11 -31
  3. package/dist/container.js.map +1 -1
  4. package/dist/deltaManager.d.ts +5 -0
  5. package/dist/deltaManager.d.ts.map +1 -1
  6. package/dist/deltaManager.js +27 -9
  7. package/dist/deltaManager.js.map +1 -1
  8. package/dist/loader.d.ts.map +1 -1
  9. package/dist/loader.js +0 -5
  10. package/dist/loader.js.map +1 -1
  11. package/dist/packageVersion.d.ts +1 -1
  12. package/dist/packageVersion.js +1 -1
  13. package/dist/packageVersion.js.map +1 -1
  14. package/dist/retriableDocumentStorageService.js +1 -1
  15. package/dist/retriableDocumentStorageService.js.map +1 -1
  16. package/dist/utils.d.ts.map +1 -1
  17. package/dist/utils.js +1 -1
  18. package/dist/utils.js.map +1 -1
  19. package/lib/container.d.ts.map +1 -1
  20. package/lib/container.js +13 -33
  21. package/lib/container.js.map +1 -1
  22. package/lib/deltaManager.d.ts +5 -0
  23. package/lib/deltaManager.d.ts.map +1 -1
  24. package/lib/deltaManager.js +30 -12
  25. package/lib/deltaManager.js.map +1 -1
  26. package/lib/loader.d.ts.map +1 -1
  27. package/lib/loader.js +0 -5
  28. package/lib/loader.js.map +1 -1
  29. package/lib/packageVersion.d.ts +1 -1
  30. package/lib/packageVersion.js +1 -1
  31. package/lib/packageVersion.js.map +1 -1
  32. package/lib/retriableDocumentStorageService.js +2 -2
  33. package/lib/retriableDocumentStorageService.js.map +1 -1
  34. package/lib/utils.d.ts.map +1 -1
  35. package/lib/utils.js +2 -2
  36. package/lib/utils.js.map +1 -1
  37. package/package.json +7 -9
  38. package/src/container.ts +13 -19
  39. package/src/deltaManager.ts +34 -12
  40. package/src/loader.ts +0 -7
  41. package/src/packageVersion.ts +1 -1
  42. package/src/retriableDocumentStorageService.ts +2 -2
  43. package/src/utils.ts +8 -2
  44. package/dist/debug.d.ts +0 -7
  45. package/dist/debug.d.ts.map +0 -1
  46. package/dist/debug.js +0 -15
  47. package/dist/debug.js.map +0 -1
  48. package/lib/debug.d.ts +0 -7
  49. package/lib/debug.d.ts.map +0 -1
  50. package/lib/debug.js +0 -9
  51. package/lib/debug.js.map +0 -1
  52. package/src/debug.ts +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
package/dist/container.js CHANGED
@@ -21,7 +21,6 @@ const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
21
21
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
22
22
  const audience_1 = require("./audience");
23
23
  const containerContext_1 = require("./containerContext");
24
- const debug_1 = require("./debug");
25
24
  const deltaManager_1 = require("./deltaManager");
26
25
  const deltaManagerProxy_1 = require("./deltaManagerProxy");
27
26
  const loader_1 = require("./loader");
@@ -349,7 +348,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
349
348
  common_utils_1.assert(pendingLocalState === undefined || loadOptions.loadMode === undefined, 0x1e1 /* "pending state requires immidiate connection!" */);
350
349
  const mode = (_a = loadOptions.loadMode) !== null && _a !== void 0 ? _a : defaultMode;
351
350
  const onClosed = (err) => {
352
- rej(err !== null && err !== void 0 ? err : container_utils_1.CreateContainerError("Container closed without an error"));
351
+ rej(err !== null && err !== void 0 ? err : new container_utils_1.GenericError("containerClosedWithoutErrorDuringLoad"));
353
352
  };
354
353
  container.on("closed", onClosed);
355
354
  container.load(version, mode, pendingLocalState)
@@ -360,11 +359,11 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
360
359
  event.end(props);
361
360
  res(container);
362
361
  }, (error) => {
363
- const err = container_utils_1.CreateContainerError(error);
362
+ const err = telemetry_utils_1.normalizeError(error);
364
363
  // Depending where error happens, we can be attempting to connect to web socket
365
364
  // and continuously retrying (consider offline mode)
366
365
  // Host has no container to close, so it's prudent to do it here
367
- container.close(error);
366
+ container.close(err);
368
367
  onClosed(err);
369
368
  });
370
369
  }), { start: true, end: true, cancel: "generic" });
@@ -750,7 +749,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
750
749
  this.deltaManager.inboundSignal.resume();
751
750
  return;
752
751
  }
753
- this.close(container_utils_1.CreateContainerError(new Error("ExistingContextDoesNotSatisfyIncomingProposal")));
752
+ this.close(new container_utils_1.GenericError("existingContextDoesNotSatisfyIncomingProposal"));
754
753
  }
755
754
  async snapshotCore(tagMessage, fullTree = false) {
756
755
  // Snapshots base document state and currently running context
@@ -1060,16 +1059,14 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
1060
1059
  }
1061
1060
  });
1062
1061
  protocol.quorum.on("approveProposal", (sequenceNumber, key, value) => {
1063
- debug_1.debug(`approved ${key}`);
1064
1062
  if (key === "code" || key === "code2") {
1065
- debug_1.debug(`codeProposal ${JSON.stringify(value)}`);
1066
1063
  if (!core_interfaces_1.isFluidCodeDetails(value)) {
1067
1064
  this.logger.sendErrorEvent({
1068
1065
  eventName: "CodeProposalNotIFluidCodeDetails",
1069
1066
  });
1070
1067
  }
1071
1068
  this.processCodeProposal().catch((error) => {
1072
- this.close(container_utils_1.CreateContainerError(error));
1069
+ this.close(telemetry_utils_1.normalizeError(error));
1073
1070
  throw error;
1074
1071
  });
1075
1072
  }
@@ -1187,18 +1184,14 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
1187
1184
  this.connectionTransitionTimes[value] = time;
1188
1185
  const duration = time - this.connectionTransitionTimes[oldState];
1189
1186
  let durationFromDisconnected;
1190
- let connectionMode;
1191
1187
  let connectionInitiationReason;
1192
1188
  let autoReconnect;
1193
1189
  let checkpointSequenceNumber;
1194
- let sequenceNumber;
1195
1190
  let opsBehind;
1196
1191
  if (value === ConnectionState.Disconnected) {
1197
1192
  autoReconnect = this._deltaManager.reconnectMode;
1198
1193
  }
1199
1194
  else {
1200
- connectionMode = this._deltaManager.connectionMode;
1201
- sequenceNumber = this.deltaManager.lastSequenceNumber;
1202
1195
  if (value === ConnectionState.Connected) {
1203
1196
  durationFromDisconnected = time - this.connectionTransitionTimes[ConnectionState.Disconnected];
1204
1197
  durationFromDisconnected = telemetry_utils_1.TelemetryLogger.formatTick(durationFromDisconnected);
@@ -1207,7 +1200,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
1207
1200
  // This info is of most interest on establishing connection only.
1208
1201
  checkpointSequenceNumber = this.deltaManager.lastKnownSeqNumber;
1209
1202
  if (this.deltaManager.hasCheckpointSequenceNumber) {
1210
- opsBehind = checkpointSequenceNumber - sequenceNumber;
1203
+ opsBehind = checkpointSequenceNumber - this.deltaManager.lastSequenceNumber;
1211
1204
  }
1212
1205
  }
1213
1206
  if (this.firstConnection) {
@@ -1220,24 +1213,11 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
1220
1213
  connectionInitiationReason = "AutoReconnect";
1221
1214
  }
1222
1215
  }
1223
- this.logger.sendPerformanceEvent({
1224
- eventName: `ConnectionStateChange_${ConnectionState[value]}`,
1225
- from: ConnectionState[oldState],
1226
- duration,
1216
+ this.logger.sendPerformanceEvent(Object.assign({ eventName: `ConnectionStateChange_${ConnectionState[value]}`, from: ConnectionState[oldState], duration,
1227
1217
  durationFromDisconnected,
1228
1218
  reason,
1229
- connectionInitiationReason,
1230
- socketDocumentId: this._deltaManager.socketDocumentId,
1231
- pendingClientId: this.connectionStateHandler.pendingClientId,
1232
- clientId: this.clientId,
1233
- connectionMode,
1234
- autoReconnect,
1235
- opsBehind,
1236
- online: driver_utils_1.OnlineStatus[driver_utils_1.isOnline()],
1237
- lastVisible: this.lastVisible !== undefined ? common_utils_1.performance.now() - this.lastVisible : undefined,
1238
- checkpointSequenceNumber,
1239
- sequenceNumber,
1240
- });
1219
+ connectionInitiationReason, socketDocumentId: this._deltaManager.socketDocumentId, pendingClientId: this.connectionStateHandler.pendingClientId, clientId: this.clientId, autoReconnect,
1220
+ opsBehind, online: driver_utils_1.OnlineStatus[driver_utils_1.isOnline()], lastVisible: this.lastVisible !== undefined ? common_utils_1.performance.now() - this.lastVisible : undefined, checkpointSequenceNumber }, this._deltaManager.connectionProps()));
1241
1221
  if (value === ConnectionState.Connected) {
1242
1222
  this.firstConnection = false;
1243
1223
  this.manualReconnectInProgress = false;
@@ -1281,7 +1261,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
1281
1261
  break;
1282
1262
  }
1283
1263
  default:
1284
- this.close(container_utils_1.CreateContainerError(`Runtime can't send arbitrary message type: ${type}`));
1264
+ this.close(new container_utils_1.GenericError("invalidContainerSubmitOpType", undefined /* error */, { messageType: type }));
1285
1265
  return -1;
1286
1266
  }
1287
1267
  return this.submitMessage(type, contents, batch, metadata);
@@ -1309,7 +1289,7 @@ class Container extends telemetry_utils_1.EventEmitterWithErrorHandling {
1309
1289
  }
1310
1290
  if (errorMsg !== undefined) {
1311
1291
  const error = new container_utils_1.DataCorruptionError(errorMsg, container_utils_1.extractSafePropertiesFromMessage(message));
1312
- this.close(container_utils_1.CreateContainerError(error));
1292
+ this.close(telemetry_utils_1.normalizeError(error));
1313
1293
  }
1314
1294
  }
1315
1295
  const local = this.clientId === message.clientId;
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.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\n// eslint-disable-next-line import/no-internal-modules\nimport merge from \"lodash/merge\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n IDisposable,\n ITelemetryLogger,\n} from \"@fluidframework/common-definitions\";\nimport { assert, performance, unreachableCase, Timer } from \"@fluidframework/common-utils\";\nimport {\n IRequest,\n IResponse,\n IFluidRouter,\n IFluidCodeDetails,\n isFluidCodeDetails,\n} from \"@fluidframework/core-interfaces\";\nimport {\n IAudience,\n IConnectionDetails,\n IContainer,\n IContainerEvents,\n IDeltaManager,\n ICriticalContainerError,\n ContainerWarning,\n AttachState,\n IThrottlingWarning,\n IPendingLocalState,\n ReadOnlyInfo,\n IContainerLoadMode,\n} from \"@fluidframework/container-definitions\";\nimport {\n CreateContainerError,\n DataCorruptionError,\n extractSafePropertiesFromMessage,\n UsageError,\n } from \"@fluidframework/container-utils\";\nimport {\n IDocumentService,\n IDocumentStorageService,\n IFluidResolvedUrl,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport {\n readAndParse,\n OnlineStatus,\n isOnline,\n ensureFluidResolvedUrl,\n combineAppAndProtocolSummary,\n runWithRetry,\n} from \"@fluidframework/driver-utils\";\nimport {\n isSystemMessage,\n ProtocolOpHandler,\n} from \"@fluidframework/protocol-base\";\nimport {\n FileMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n ICommittedProposal,\n IDocumentAttributes,\n IDocumentMessage,\n IProcessMessageResult,\n IQuorum,\n ISequencedClient,\n ISequencedDocumentMessage,\n ISequencedProposal,\n ISignalClient,\n ISignalMessage,\n ISnapshotTree,\n ITree,\n ITreeEntry,\n IVersion,\n MessageType,\n TreeEntry,\n ISummaryTree,\n IPendingProposal,\n SummaryType,\n ISummaryContent,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n ChildLogger,\n EventEmitterWithErrorHandling,\n PerformanceEvent,\n raiseConnectedEvent,\n TelemetryLogger,\n connectedEventName,\n disconnectedEventName,\n} from \"@fluidframework/telemetry-utils\";\nimport { Audience } from \"./audience\";\nimport { ContainerContext } from \"./containerContext\";\nimport { debug } from \"./debug\";\nimport { IConnectionArgs, DeltaManager, ReconnectMode } from \"./deltaManager\";\nimport { DeltaManagerProxy } from \"./deltaManagerProxy\";\nimport { ILoaderOptions, Loader, RelativeLoader } from \"./loader\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { ConnectionStateHandler, ILocalSequencedClient } from \"./connectionStateHandler\";\nimport { RetriableDocumentStorageService } from \"./retriableDocumentStorageService\";\nimport { ProtocolTreeStorageService } from \"./protocolTreeDocumentStorageService\";\nimport { BlobOnlyStorage, ContainerStorageAdapter } from \"./containerStorageAdapter\";\nimport { getSnapshotTreeFromSerializedContainer } from \"./utils\";\nimport { QuorumProxy } from \"./quorum\";\n\nconst detachedContainerRefSeqNumber = 0;\n\nconst dirtyContainerEvent = \"dirty\";\nconst savedContainerEvent = \"saved\";\n\nexport interface IContainerLoadOptions {\n /**\n * Disables the Container from reconnecting if false, allows reconnect otherwise.\n */\n canReconnect?: boolean;\n /**\n * Client details provided in the override will be merged over the default client.\n */\n clientDetailsOverride?: IClientDetails;\n resolvedUrl: IFluidResolvedUrl;\n /**\n * Control which snapshot version to load from. See IParsedUrl for detailed information.\n */\n version: string | undefined;\n /**\n * Loads the Container in paused state if true, unpaused otherwise.\n */\n loadMode?: IContainerLoadMode;\n}\n\nexport interface IContainerConfig {\n resolvedUrl?: IFluidResolvedUrl;\n canReconnect?: boolean;\n /**\n * Client details provided in the override will be merged over the default client.\n */\n clientDetailsOverride?: IClientDetails;\n}\n\nexport enum ConnectionState {\n /**\n * The document is no longer connected to the delta server\n */\n Disconnected,\n\n /**\n * The document has an inbound connection but is still pending for outbound deltas\n */\n Connecting,\n\n /**\n * The document is fully connected\n */\n Connected,\n}\n\n/**\n * Waits until container connects to delta storage and gets up-to-date\n * Useful when resolving URIs and hitting 404, due to container being loaded from (stale) snapshot and not being\n * up to date. Host may chose to wait in such case and retry resolving URI.\n * Warning: Will wait infinitely for connection to establish if there is no connection.\n * May result in deadlock if Container.setAutoReconnect(false) is called and never switched back to auto-reconnect.\n * @returns true: container is up to date, it processed all the ops that were know at the time of first connection\n * false: storage does not provide indication of how far the client is. Container processed\n * all the ops known to it, but it maybe still behind.\n */\nexport async function waitContainerToCatchUp(container: Container) {\n // Make sure we stop waiting if container is closed.\n if (container.closed) {\n throw new Error(\"Container is closed\");\n }\n\n return new Promise<boolean>((accept, reject) => {\n const deltaManager = container.deltaManager;\n\n container.on(\"closed\", reject);\n\n const waitForOps = () => {\n assert(container.connectionState !== ConnectionState.Disconnected,\n 0x0cd /* \"Container disconnected while waiting for ops!\" */);\n const hasCheckpointSequenceNumber = deltaManager.hasCheckpointSequenceNumber;\n\n const connectionOpSeqNumber = deltaManager.lastKnownSeqNumber;\n if (deltaManager.lastSequenceNumber === connectionOpSeqNumber) {\n accept(hasCheckpointSequenceNumber);\n return;\n }\n const callbackOps = (message) => {\n if (connectionOpSeqNumber <= message.sequenceNumber) {\n accept(hasCheckpointSequenceNumber);\n deltaManager.off(\"op\", callbackOps);\n }\n };\n deltaManager.on(\"op\", callbackOps);\n };\n\n // We can leverage DeltaManager's \"connect\" event here and test for ConnectionState.Disconnected\n // But that works only if service provides us checkPointSequenceNumber\n // Our internal testing is based on R11S that does not, but almost all tests connect as \"write\" and\n // use this function to catch up, so leveraging our own join op as a fence/barrier\n if (container.connectionState === ConnectionState.Connected) {\n waitForOps();\n return;\n }\n\n const callback = () => {\n container.off(connectedEventName, callback);\n waitForOps();\n };\n container.on(connectedEventName, callback);\n\n container.resume();\n });\n}\n\n// Here are key considerations when deciding conditions for when to send non-immediate noops:\n// 1. Sending them too often results in increase in file size and bandwidth, as well as catch up performance\n// 2. Sending too infrequently ensures that collab window is large, and as result Sequence DDS would have\n// large catchUp blobs - see Issue #6364\n// 3. Similarly, processes that rely on \"core\" snapshot (and can't parse trailing ops, including above), like search\n// parser in SPO, will result in non-accurate results due to presence of catch up blobs.\n// 4. Ordering service used 250ms timeout to coalesce non-immediate noops. It was changed to 2000 ms to allow more\n// aggressive noop sending from client side.\n// 5. Number of ops sent by all clients is proportional to number of \"write\" clients (every client sends noops),\n// but number of sequenced noops is a function of time (one op per 2 seconds at most).\n// We should consider impact to both outbound traffic (might be huge, depends on number of clients) and file size.\n// Please also see Issue #5629 for more discussions.\n//\n// With that, the current algorithm is as follows:\n// 1. Sent noop 2000 ms of receiving an op if no ops were sent by this client within this timeframe.\n// This will ensure that MSN moves forward with reasonable speed. If that results in too many sequenced noops,\n// server timeout of 2000ms should be reconsidered to be increased.\n// 2. If there are more than 50 ops received without sending any ops, send noop to keep collab window small.\n// Note that system ops (including noops themselves) are excluded, so it's 1 noop per 50 real ops.\nexport class CollabWindowTracker {\n private opsCountSinceNoop = 0;\n private readonly timer: Timer;\n\n constructor(\n private readonly submit: (type: MessageType, contents: any) => void,\n private readonly activeConnection: () => boolean,\n NoopTimeFrequency: number = 2000,\n private readonly NoopCountFrequency: number = 50,\n ) {\n this.timer = new Timer(NoopTimeFrequency, () => {\n // Can get here due to this.stopSequenceNumberUpdate() not resetting timer.\n // Also timer callback can fire even after timer cancellation if it was queued before cancellation.\n if (this.opsCountSinceNoop !== 0) {\n assert(this.activeConnection(),\n 0x241 /* \"disconnect should result in stopSequenceNumberUpdate() call\" */);\n this.submitNoop(false /* immediate */);\n }\n });\n }\n\n /**\n * Schedules as ack to the server to update the reference sequence number\n */\n public scheduleSequenceNumberUpdate(message: ISequencedDocumentMessage, immediateNoOp: boolean): void {\n // Exit early for inactive (not in quorum or not writers) clients.\n // They don't take part in the minimum sequence number calculation.\n if (!this.activeConnection()) {\n return;\n }\n\n // While processing a message, an immediate no-op can be requested.\n // i.e. to expedite approve or commit phase of quorum.\n if (immediateNoOp) {\n this.submitNoop(true /* immediate */);\n return;\n }\n\n // We don't acknowledge no-ops to avoid acknowledgement cycles (i.e. ack the MSN\n // update, which updates the MSN, then ack the update, etc...). Also, don't\n // count system messages in ops count.\n if (isSystemMessage(message)) {\n return;\n }\n assert(message.type !== MessageType.NoOp, 0x0ce /* \"Don't acknowledge no-ops\" */);\n\n this.opsCountSinceNoop++;\n if (this.opsCountSinceNoop >= this.NoopCountFrequency) {\n this.submitNoop(false /* immediate */);\n return;\n }\n if (this.opsCountSinceNoop === 1) {\n this.timer.restart();\n }\n assert(this.timer.hasTimer, 0x242 /* \"has timer\" */);\n }\n\n private submitNoop(immediate: boolean) {\n // Anything other than null is immediate noop\n this.submit(MessageType.NoOp, immediate ? \"\" : null);\n assert(this.opsCountSinceNoop === 0,\n 0x243 /* \"stopSequenceNumberUpdate should be called as result of sending any op!\" */);\n }\n\n public stopSequenceNumberUpdate(): void {\n this.opsCountSinceNoop = 0;\n // Ideally, we cancel timer here. But that will result in too often set/reset cycle if this client\n // keeps sending ops. In most cases it's actually better to let it expire (at most - 4 times per second)\n // for nothing, then have a ton of set/reset cycles.\n // Note that Timer.restart() is smart and will not change timer expiration if we keep extending timer\n // expiration - it will restart the timer instead when it fires with adjusted expiration.\n // this.timer.clear();\n }\n}\n\nconst getCodeProposal =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (quorum: IQuorum) => quorum.get(\"code\") ?? quorum.get(\"code2\");\n\nexport class Container extends EventEmitterWithErrorHandling<IContainerEvents> implements IContainer {\n public static version = \"^0.1.0\";\n\n /**\n * Load an existing container.\n */\n public static async load(\n loader: Loader,\n loadOptions: IContainerLoadOptions,\n pendingLocalState?: unknown,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {\n clientDetailsOverride: loadOptions.clientDetailsOverride,\n resolvedUrl: loadOptions.resolvedUrl,\n canReconnect: loadOptions.canReconnect,\n });\n\n return PerformanceEvent.timedExecAsync(\n container.logger,\n { eventName: \"Load\" },\n async (event) => new Promise<Container>((res, rej) => {\n const version = loadOptions.version;\n\n // always load unpaused with pending ops!\n // It is also default mode in general.\n const defaultMode: IContainerLoadMode = { opsBeforeReturn: \"cached\" };\n assert(pendingLocalState === undefined || loadOptions.loadMode === undefined,\n 0x1e1 /* \"pending state requires immidiate connection!\" */);\n const mode: IContainerLoadMode = loadOptions.loadMode ?? defaultMode;\n\n const onClosed = (err?: ICriticalContainerError) => {\n rej(err ?? CreateContainerError(\"Container closed without an error\"));\n };\n container.on(\"closed\", onClosed);\n\n container.load(version, mode, pendingLocalState)\n .finally(() => {\n container.removeListener(\"closed\", onClosed);\n })\n .then((props) => {\n event.end(props);\n res(container);\n },\n (error) => {\n const err = CreateContainerError(error);\n // Depending where error happens, we can be attempting to connect to web socket\n // and continuously retrying (consider offline mode)\n // Host has no container to close, so it's prudent to do it here\n container.close(error);\n onClosed(err);\n });\n }),\n { start: true, end: true, cancel: \"generic\" },\n );\n }\n\n /**\n * Create a new container in a detached state.\n */\n public static async createDetached(\n loader: Loader,\n codeDetails: IFluidCodeDetails,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {});\n await container.createDetached(codeDetails);\n return container;\n }\n\n /**\n * Create a new container in a detached state that is initialized with a\n * snapshot from a previous detached container.\n */\n public static async rehydrateDetachedFromSnapshot(\n loader: Loader,\n snapshot: string,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {});\n const deserializedSummary = JSON.parse(snapshot) as ISummaryTree;\n await container.rehydrateDetachedFromSnapshot(deserializedSummary);\n return container;\n }\n\n public subLogger: TelemetryLogger;\n\n // Tells if container can reconnect on losing fist connection\n // If false, container gets closed on loss of connection.\n private readonly _canReconnect: boolean = true;\n\n private readonly logger: ITelemetryLogger;\n\n private loaded = false;\n private _attachState = AttachState.Detached;\n\n private readonly _storage: ContainerStorageAdapter;\n public get storage(): IDocumentStorageService {\n return this._storage;\n }\n\n // Active chaincode and associated runtime\n private _storageService: IDocumentStorageService & IDisposable | undefined;\n private get storageService(): IDocumentStorageService {\n if (this._storageService === undefined) {\n throw new Error(\"Attempted to access storageService before it was defined\");\n }\n return this._storageService;\n }\n\n private readonly clientDetailsOverride: IClientDetails | undefined;\n private readonly _deltaManager: DeltaManager;\n private service: IDocumentService | undefined;\n private readonly _audience: Audience;\n\n private _context: ContainerContext | undefined;\n private get context() {\n if (this._context === undefined) {\n throw new Error(\"Attempted to access context before it was defined\");\n }\n return this._context;\n }\n private _protocolHandler: ProtocolOpHandler | undefined;\n private get protocolHandler() {\n if (this._protocolHandler === undefined) {\n throw new Error(\"Attempted to access protocolHandler before it was defined\");\n }\n return this._protocolHandler;\n }\n\n private resumedOpProcessingAfterLoad = false;\n private firstConnection = true;\n private manualReconnectInProgress = false;\n private readonly connectionTransitionTimes: number[] = [];\n private messageCountAfterDisconnection: number = 0;\n private _loadedFromVersion: IVersion | undefined;\n private _resolvedUrl: IFluidResolvedUrl | undefined;\n private attachStarted = false;\n private _dirtyContainer = false;\n\n private lastVisible: number | undefined;\n private readonly connectionStateHandler: ConnectionStateHandler;\n\n private _closed = false;\n\n private readonly collabWindowTracker = new CollabWindowTracker(\n (type, contents) => this.submitMessage(type, contents),\n () => this.activeConnection(),\n this.loader.services.options?.noopTimeFrequency,\n this.loader.services.options?.noopCountFrequency,\n );\n\n public get IFluidRouter(): IFluidRouter { return this; }\n\n public get resolvedUrl(): IResolvedUrl | undefined {\n return this._resolvedUrl;\n }\n\n public get loadedFromVersion(): IVersion | undefined {\n return this._loadedFromVersion;\n }\n\n /**\n * {@inheritDoc DeltaManager.readonly}\n * @deprecated - use readOnlyInfo\n */\n public get readonly() {\n return this._deltaManager.readonly;\n }\n\n /**\n * {@inheritDoc DeltaManager.readonlyPermissions}\n * @deprecated - use readOnlyInfo\n */\n public get readonlyPermissions() {\n return this._deltaManager.readonlyPermissions;\n }\n\n /**\n * {@inheritDoc DeltaManager.readOnlyInfo}\n */\n public get readOnlyInfo(): ReadOnlyInfo {\n return this._deltaManager.readOnlyInfo;\n }\n\n /**\n * {@inheritDoc DeltaManager.forceReadonly}\n */\n public forceReadonly(readonly: boolean) {\n this._deltaManager.forceReadonly(readonly);\n }\n\n public get closed(): boolean {\n return this._closed;\n }\n\n public get id(): string {\n return this._resolvedUrl?.id ?? \"\";\n }\n\n public get deltaManager(): IDeltaManager<ISequencedDocumentMessage, IDocumentMessage> {\n return this._deltaManager;\n }\n\n public get connectionState(): ConnectionState {\n return this.connectionStateHandler.connectionState;\n }\n\n public get connected(): boolean {\n return this.connectionStateHandler.connected;\n }\n\n /**\n * Service configuration details. If running in offline mode will be undefined otherwise will contain service\n * configuration details returned as part of the initial connection.\n */\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this._deltaManager.serviceConfiguration;\n }\n\n /**\n * The server provided id of the client.\n * Set once this.connected is true, otherwise undefined\n */\n public get clientId(): string | undefined {\n return this.connectionStateHandler.clientId;\n }\n\n /**\n * The server provided claims of the client.\n * Set once this.connected is true, otherwise undefined\n */\n public get scopes(): string[] | undefined {\n return this._deltaManager.scopes;\n }\n\n public get clientDetails(): IClientDetails {\n return this._deltaManager.clientDetails;\n }\n\n /**\n * @deprecated use codeDetails\n */\n public get chaincodePackage(): IFluidCodeDetails | undefined {\n return this.codeDetails;\n }\n\n public get codeDetails(): IFluidCodeDetails | undefined {\n return this._context?.codeDetails ?? this.getCodeDetailsFromQuorum();\n }\n\n /**\n * Retrieves the audience associated with the document\n */\n public get audience(): IAudience {\n return this._audience;\n }\n\n /**\n * Returns true if container is dirty.\n * Which means data loss if container is closed at that same moment\n * Most likely that happens when there is no network connection to ordering service\n */\n public get isDirty() {\n return this._dirtyContainer;\n }\n\n private get serviceFactory() {return this.loader.services.documentServiceFactory;}\n private get urlResolver() {return this.loader.services.urlResolver;}\n public get options(): ILoaderOptions { return this.loader.services.options; }\n private get scope() { return this.loader.services.scope;}\n private get codeLoader() { return this.loader.services.codeLoader;}\n\n constructor(\n private readonly loader: Loader,\n config: IContainerConfig,\n ) {\n super((name, error) => {\n this.logger.sendErrorEvent(\n {\n eventName: \"ContainerEventHandlerException\",\n name: typeof name === \"string\" ? name : undefined,\n },\n error);\n });\n this._audience = new Audience();\n\n this.clientDetailsOverride = config.clientDetailsOverride;\n this._resolvedUrl = config.resolvedUrl;\n if (config.canReconnect !== undefined) {\n this._canReconnect = config.canReconnect;\n }\n\n // Create logger for data stores to use\n const type = this.client.details.type;\n const interactive = this.client.details.capabilities.interactive;\n const clientType =\n `${interactive ? \"interactive\" : \"noninteractive\"}${type !== undefined && type !== \"\" ? `/${type}` : \"\"}`;\n // Need to use the property getter for docId because for detached flow we don't have the docId initially.\n // We assign the id later so property getter is used.\n this.subLogger = ChildLogger.create(\n loader.services.subLogger,\n undefined,\n {\n all: {\n clientType, // Differentiating summarizer container from main container\n loaderVersion: pkgVersion,\n containerId: uuid(),\n docId: () => this.id,\n containerAttachState: () => this._attachState,\n containerLoaded: () => this.loaded,\n },\n // we need to be judicious with our logging here to avoid generting too much data\n // all data logged here should be broadly applicable, and not specific to a\n // specific error or class of errors\n error: {\n // load information to associate errors with the specific load point\n dmInitialSeqNumber: () => this._deltaManager?.initialSequenceNumber,\n dmLastKnownSeqNumber: () => this._deltaManager?.lastKnownSeqNumber,\n containerLoadedFromVersionId: () => this.loadedFromVersion?.id,\n containerLoadedFromVersionDate: () => this.loadedFromVersion?.date,\n // message information to associate errors with the specific execution state\n dmLastMsqSeqNumber: () => this.deltaManager?.lastMessage?.sequenceNumber,\n dmLastMsqSeqTimestamp: () => this.deltaManager?.lastMessage?.timestamp,\n dmLastMsqSeqClientId: () => this.deltaManager?.lastMessage?.clientId,\n },\n });\n\n // Prefix all events in this file with container-loader\n this.logger = ChildLogger.create(this.subLogger, \"Container\");\n\n this.connectionStateHandler = new ConnectionStateHandler(\n {\n protocolHandler: () => this._protocolHandler,\n logConnectionStateChangeTelemetry: (value, oldState, reason) =>\n this.logConnectionStateChangeTelemetry(value, oldState, reason),\n shouldClientJoinWrite: () => this._deltaManager.shouldJoinWrite(),\n maxClientLeaveWaitTime: this.loader.services.options.maxClientLeaveWaitTime,\n triggerConnectionRecovery: (reason: string) => {\n // We get here when socket does not receive any ops on \"write\" connection, including\n // its own join op. Attempt recovery option.\n this._deltaManager.triggerConnectionRecovery(\n reason,\n {\n duration: performance.now() - this.connectionTransitionTimes[this.connectionState],\n },\n );\n },\n },\n this.logger,\n );\n\n this.connectionStateHandler.on(\"connectionStateChanged\", () => {\n if (this.loaded) {\n this.propagateConnectionState();\n }\n });\n\n this._deltaManager = this.createDeltaManager();\n this._storage = new ContainerStorageAdapter(\n () => {\n if (this.attachState !== AttachState.Attached) {\n if (this.loader.services.detachedBlobStorage !== undefined) {\n return new BlobOnlyStorage(this.loader.services.detachedBlobStorage, this.logger);\n }\n this.logger.sendErrorEvent({\n eventName: \"NoRealStorageInDetachedContainer\",\n });\n throw new Error(\"Real storage calls not allowed in Unattached container\");\n }\n return this.storageService;\n },\n );\n\n const isDomAvailable = typeof document === \"object\" &&\n document !== null &&\n typeof document.addEventListener === \"function\" &&\n document.addEventListener !== null;\n // keep track of last time page was visible for telemetry\n if (isDomAvailable) {\n this.lastVisible = document.hidden ? performance.now() : undefined;\n document.addEventListener(\"visibilitychange\", () => {\n if (document.hidden) {\n this.lastVisible = performance.now();\n } else {\n // settimeout so this will hopefully fire after disconnect event if being hidden caused it\n setTimeout(() => this.lastVisible = undefined, 0);\n }\n });\n }\n\n // We observed that most users of platform do not check Container.connected event on load, causing bugs.\n // As such, we are raising events when new listener pops up.\n // Note that we can raise both \"disconnected\" & \"connect\" events at the same time,\n // if we are in connecting stage.\n this.on(\"newListener\", (event: string, listener: (...args: any[]) => void) => {\n // Fire events on the end of JS turn, giving a chance for caller to be in consistent state.\n Promise.resolve().then(() => {\n switch (event) {\n case dirtyContainerEvent:\n if (this._dirtyContainer) {\n listener(this._dirtyContainer);\n }\n break;\n case savedContainerEvent:\n if (!this._dirtyContainer) {\n listener(this._dirtyContainer);\n }\n break;\n case connectedEventName:\n if (this.connected) {\n listener(event, this.clientId);\n }\n break;\n case disconnectedEventName:\n if (!this.connected) {\n listener(event);\n }\n break;\n default:\n }\n }).catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"RaiseConnectedEventError\" }, error);\n });\n });\n }\n\n /**\n * Retrieves the quorum associated with the document\n */\n public getQuorum(): IQuorum {\n return this.protocolHandler.quorum;\n }\n\n public close(error?: ICriticalContainerError) {\n if (this._closed) {\n return;\n }\n this._closed = true;\n\n // Ensure that we raise all key events even if one of these throws\n try {\n this._deltaManager.close(error);\n\n this._protocolHandler?.close();\n\n this._context?.dispose(error !== undefined ? new Error(error.message) : undefined);\n\n assert(this.connectionState === ConnectionState.Disconnected,\n 0x0cf /* \"disconnect event was not raised!\" */);\n\n this._storageService?.dispose();\n\n // Notify storage about critical errors. They may be due to disconnect between client & server knowledge\n // about file, like file being overwritten in storage, but client having stale local cache.\n // Driver need to ensure all caches are cleared on critical errors\n this.service?.dispose(error);\n } catch (exception) {\n this.logger.sendErrorEvent({ eventName: \"ContainerCloseException\"}, exception);\n }\n\n this.logger.sendTelemetryEvent(\n {\n eventName: \"ContainerClose\",\n loaded: this.loaded,\n },\n error,\n );\n\n this.emit(\"closed\", error);\n\n this.removeAllListeners();\n }\n\n public closeAndGetPendingLocalState(): string {\n // runtime matches pending ops to successful ones by clientId and client seq num, so we need to close the\n // container at the same time we get pending state, otherwise this container could reconnect and resubmit with\n // a new clientId and a future container using stale pending state without the new clientId would resubmit them\n\n assert(this.attachState === AttachState.Attached, 0x0d1 /* \"Container should be attached before close\" */);\n assert(this.resolvedUrl !== undefined && this.resolvedUrl.type === \"fluid\",\n 0x0d2 /* \"resolved url should be valid Fluid url\" */);\n const pendingState: IPendingLocalState = {\n pendingRuntimeState: this.context.getPendingLocalState(),\n url: this.resolvedUrl.url,\n };\n\n this.close();\n\n return JSON.stringify(pendingState);\n }\n\n public get attachState(): AttachState {\n return this._attachState;\n }\n\n public serialize(): string {\n assert(this.attachState === AttachState.Detached, 0x0d3 /* \"Should only be called in detached container\" */);\n\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n const combinedSummary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n return JSON.stringify(combinedSummary);\n }\n\n public async attach(request: IRequest): Promise<void> {\n if (!this.loaded) {\n throw new UsageError(\"containerMustBeLoadedBeforeAttaching\");\n }\n\n if (this.closed) {\n throw new UsageError(\"cannotAttachClosedContainer\");\n }\n\n // If container is already attached or attach is in progress, throw an error.\n assert(this._attachState === AttachState.Detached && !this.attachStarted,\n 0x205 /* \"attach() called more than once\" */);\n this.attachStarted = true;\n\n // If attachment blobs were uploaded in detached state we will go through a different attach flow\n const hasAttachmentBlobs = this.loader.services.detachedBlobStorage !== undefined\n && this.loader.services.detachedBlobStorage.size > 0;\n\n try {\n assert(this.deltaManager.inbound.length === 0, 0x0d6 /* \"Inbound queue should be empty when attaching\" */);\n\n let summary: ISummaryTree;\n if (!hasAttachmentBlobs) {\n // Get the document state post attach - possibly can just call attach but we need to change the\n // semantics around what the attach means as far as async code goes.\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n summary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n // Set the state as attaching as we are starting the process of attaching container.\n // This should be fired after taking the summary because it is the place where we are\n // starting to attach the container to storage.\n // Also, this should only be fired in detached container.\n this._attachState = AttachState.Attaching;\n this.context.notifyAttaching();\n }\n\n const createNewResolvedUrl = await this.urlResolver.resolve(request);\n ensureFluidResolvedUrl(createNewResolvedUrl);\n // Actually go and create the resolved document\n if (this.service === undefined) {\n this.service = await runWithRetry(\n async () => this.serviceFactory.createContainer(\n summary,\n createNewResolvedUrl,\n this.subLogger,\n ),\n \"containerAttach\",\n (id: string) => this._deltaManager.refreshDelayInfo(id),\n (id: string, delayMs: number, error: any) =>\n this._deltaManager.emitDelayInfo(id, delayMs, error),\n this.logger,\n );\n }\n const resolvedUrl = this.service.resolvedUrl;\n ensureFluidResolvedUrl(resolvedUrl);\n this._resolvedUrl = resolvedUrl;\n await this.connectStorageService();\n\n // upload blobs here (NYI)\n\n // post summary here\n if (hasAttachmentBlobs) {\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n summary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n this._attachState = AttachState.Attaching;\n this.context.notifyAttaching();\n\n await this.storageService.uploadSummaryWithContext(summary, {\n referenceSequenceNumber: 0,\n ackHandle: undefined,\n proposalHandle: undefined,\n });\n\n assert(!hasAttachmentBlobs, 0x206 /* \"attaching container with blobs is not yet implemented\" */);\n }\n\n this._attachState = AttachState.Attached;\n this.emit(\"attached\");\n\n // Propagate current connection state through the system.\n this.propagateConnectionState();\n if (!this.closed) {\n this.resumeInternal({ fetchOpsFromStorage: false, reason: \"createDetached\" });\n }\n } catch(error) {\n this.close(error);\n throw error;\n }\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return PerformanceEvent.timedExecAsync(this.logger, { eventName: \"Request\" }, async () => {\n return this.context.request(path);\n });\n }\n\n public async snapshot(tagMessage: string, fullTree: boolean = false): Promise<void> {\n // Only snapshot once a code quorum has been established\n if (!this.protocolHandler.quorum.has(\"code\") && !this.protocolHandler.quorum.has(\"code2\")) {\n this.logger.sendTelemetryEvent({ eventName: \"SkipSnapshot\" });\n return;\n }\n\n // Stop inbound message processing while we complete the snapshot\n try {\n await this.deltaManager.inbound.pause();\n await this.snapshotCore(tagMessage, fullTree);\n } catch (ex) {\n this.logger.sendErrorEvent({ eventName: \"SnapshotExceptionError\" }, ex);\n throw ex;\n } finally {\n this.deltaManager.inbound.resume();\n }\n }\n\n public setAutoReconnect(reconnect: boolean) {\n if (reconnect && this.closed) {\n throw new Error(\"Attempting to setAutoReconnect() a closed DeltaManager\");\n }\n\n this._deltaManager.setAutomaticReconnect(reconnect);\n\n this.logger.sendTelemetryEvent({\n eventName: reconnect ? \"AutoReconnectEnabled\" : \"AutoReconnectDisabled\",\n connectionMode: this._deltaManager.connectionMode,\n connectionState: ConnectionState[this.connectionState],\n });\n\n // If container state is not attached and resumed, then don't connect to delta stream. Also don't set the\n // manual reconnection flag to true as we haven't made the initial connection yet.\n if (reconnect && this._attachState === AttachState.Attached && this.resumedOpProcessingAfterLoad) {\n if (this.connectionState === ConnectionState.Disconnected) {\n // Only track this as a manual reconnection if we are truly the ones kicking it off.\n this.manualReconnectInProgress = true;\n }\n\n // Ensure connection to web socket\n this.connectToDeltaStream({ reason: \"autoReconnect\" }).catch((error) => {\n // All errors are reported through events (\"error\" / \"disconnected\") and telemetry in DeltaManager\n // So there shouldn't be a need to record error here.\n // But we have number of cases where reconnects do not happen, and no errors are recorded, so\n // adding this log point for easier diagnostics\n this.logger.sendTelemetryEvent({ eventName: \"setAutoReconnectError\" }, error);\n });\n }\n }\n\n public resume() {\n if (!this.closed) {\n // Note: no need to fetch ops as we do it preemptively as part of DeltaManager.attachOpHandler().\n // If there is gap, we will learn about it once connected, but the gap should be small (if any),\n // assuming that resume() is called quickly after initial container boot.\n this.resumeInternal({ reason: \"DocumentOpenResume\", fetchOpsFromStorage: false });\n }\n }\n\n protected resumeInternal(args: IConnectionArgs) {\n assert(!this.closed, 0x0d9 /* \"Attempting to setAutoReconnect() a closed DeltaManager\" */);\n\n // Resume processing ops\n if (!this.resumedOpProcessingAfterLoad) {\n this.resumedOpProcessingAfterLoad = true;\n this._deltaManager.inbound.resume();\n this._deltaManager.inboundSignal.resume();\n }\n\n // Ensure connection to web socket\n // All errors are reported through events (\"error\" / \"disconnected\") and telemetry in DeltaManager\n this.connectToDeltaStream(args).catch(() => { });\n }\n\n /**\n * Raise non-critical error to host. Calling this API will not close container.\n * For critical errors, please call Container.close(error).\n * @param error - an error to raise\n */\n public raiseContainerWarning(warning: ContainerWarning) {\n // Some \"warning\" events come from outside the container and are logged\n // elsewhere (e.g. summarizing container). We shouldn't log these here.\n if (warning.logged !== true) {\n this.logContainerError(warning);\n }\n this.emit(\"warning\", warning);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n if (this.resolvedUrl === undefined) {\n return undefined;\n }\n\n return this.urlResolver.getAbsoluteUrl(\n this.resolvedUrl,\n relativeUrl,\n this._context?.codeDetails);\n }\n\n public async proposeCodeDetails(codeDetails: IFluidCodeDetails) {\n if (!isFluidCodeDetails(codeDetails)) {\n throw new Error(\"Provided codeDetails are not IFluidCodeDetails\");\n }\n\n if (this.codeLoader.IFluidCodeDetailsComparer) {\n const comparision = await this.codeLoader.IFluidCodeDetailsComparer.compare(\n codeDetails,\n this.getCodeDetailsFromQuorum());\n if (comparision !== undefined && comparision <= 0) {\n throw new Error(\"Proposed code details should be greater than the current\");\n }\n }\n\n return this.getQuorum().propose(\"code\", codeDetails)\n .then(()=>true)\n .catch(()=>false);\n }\n\n private async processCodeProposal(): Promise<void> {\n const codeDetails = this.getCodeDetailsFromQuorum();\n\n await Promise.all([\n this.deltaManager.inbound.pause(),\n this.deltaManager.inboundSignal.pause()]);\n\n if ((await this.context.satisfies(codeDetails) === true)) {\n this.deltaManager.inbound.resume();\n this.deltaManager.inboundSignal.resume();\n return;\n }\n\n this.close(CreateContainerError(\n new Error(\"ExistingContextDoesNotSatisfyIncomingProposal\")));\n }\n\n private async snapshotCore(tagMessage: string, fullTree: boolean = false) {\n // Snapshots base document state and currently running context\n const root = this.snapshotBase();\n const dataStoreEntries = await this.context.snapshot(tagMessage, fullTree);\n\n // And then combine\n if (dataStoreEntries !== null) {\n root.entries.push(...dataStoreEntries.entries);\n }\n\n // Generate base snapshot message\n const deltaDetails =\n `${this._deltaManager.lastSequenceNumber}:${this._deltaManager.minimumSequenceNumber}`;\n const message = `Commit @${deltaDetails} ${tagMessage}`;\n\n // Pull in the prior version and snapshot tree to store against\n const lastVersion = await this.getVersion(this.id);\n\n const parents = lastVersion !== undefined ? [lastVersion.id] : [];\n\n // Write the full snapshot\n return this.storageService.write(root, parents, message, \"\");\n }\n\n private snapshotBase(): ITree {\n const entries: ITreeEntry[] = [];\n\n const quorumSnapshot = this.protocolHandler.quorum.snapshot();\n entries.push({\n mode: FileMode.File,\n path: \"quorumMembers\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.members),\n encoding: \"utf-8\",\n },\n });\n entries.push({\n mode: FileMode.File,\n path: \"quorumProposals\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.proposals),\n encoding: \"utf-8\",\n },\n });\n entries.push({\n mode: FileMode.File,\n path: \"quorumValues\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.values),\n encoding: \"utf-8\",\n },\n });\n\n // Save attributes for the document\n const documentAttributes = {\n branch: this.id,\n minimumSequenceNumber: this._deltaManager.minimumSequenceNumber,\n sequenceNumber: this._deltaManager.lastSequenceNumber,\n term: this._deltaManager.referenceTerm,\n };\n entries.push({\n mode: FileMode.File,\n path: \".attributes\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(documentAttributes),\n encoding: \"utf-8\",\n },\n });\n\n // Output the tree\n const root: ITree = {\n entries,\n };\n\n return root;\n }\n\n private async getVersion(version: string): Promise<IVersion | undefined> {\n const versions = await this.storageService.getVersions(version, 1);\n return versions[0];\n }\n\n private recordConnectStartTime() {\n if (this.connectionTransitionTimes[ConnectionState.Disconnected] === undefined) {\n this.connectionTransitionTimes[ConnectionState.Disconnected] = performance.now();\n }\n }\n\n private async connectToDeltaStream(args: IConnectionArgs) {\n this.recordConnectStartTime();\n\n // All agents need \"write\" access, including summarizer.\n if (!this._canReconnect || !this.client.details.capabilities.interactive) {\n args.mode = \"write\";\n }\n\n return this._deltaManager.connect(args);\n }\n\n /**\n * Load container.\n *\n * @param specifiedVersion - one of the following\n * - undefined - fetch latest snapshot\n * - otherwise, version sha to load snapshot\n */\n private async load(\n specifiedVersion: string | undefined,\n loadMode: IContainerLoadMode,\n pendingLocalState?: unknown,\n ) {\n if (this._resolvedUrl === undefined) {\n throw new Error(\"Attempting to load without a resolved url\");\n }\n this.service = await this.serviceFactory.createDocumentService(this._resolvedUrl, this.subLogger);\n\n let startConnectionP: Promise<IConnectionDetails> | undefined;\n\n // Ideally we always connect as \"read\" by default.\n // Currently that works with SPO & r11s, because we get \"write\" connection when connecting to non-existing file.\n // We should not rely on it by (one of them will address the issue, but we need to address both)\n // 1) switching create new flow to one where we create file by posting snapshot\n // 2) Fixing quorum workflows (have retry logic)\n // That all said, \"read\" does not work with memorylicious workflows (that opens two simultaneous\n // connections to same file) in two ways:\n // A) creation flow breaks (as one of the clients \"sees\" file as existing, and hits #2 above)\n // B) Once file is created, transition from view-only connection to write does not work - some bugs to be fixed.\n const connectionArgs: IConnectionArgs = { reason: \"DocumentOpen\", mode: \"write\", fetchOpsFromStorage: false };\n\n // Start websocket connection as soon as possible. Note that there is no op handler attached yet, but the\n // DeltaManager is resilient to this and will wait to start processing ops until after it is attached.\n if (loadMode.deltaConnection === undefined) {\n startConnectionP = this.connectToDeltaStream(connectionArgs);\n startConnectionP.catch((error) => { });\n }\n\n await this.connectStorageService();\n this._attachState = AttachState.Attached;\n\n // Fetch specified snapshot.\n const { snapshot, versionId } = await this.fetchSnapshotTree(specifiedVersion);\n assert(snapshot !== undefined, 0x237 /* \"Snapshot should exist\" */);\n\n const attributes = await this.getDocumentAttributes(this.storageService, snapshot);\n\n // Attach op handlers to start processing ops\n this.attachDeltaManagerOpHandler(attributes);\n\n // ...load in the existing quorum\n // Initialize the protocol handler\n const protocolHandlerP =\n this.loadAndInitializeProtocolState(attributes, this.storageService, snapshot);\n\n let opsBeforeReturnP: Promise<void> | undefined;\n\n // Initialize document details - if loading a snapshot use that - otherwise we need to wait on\n // the initial details\n switch (loadMode.opsBeforeReturn) {\n case undefined:\n if (loadMode.deltaConnection !== \"none\") {\n // Start prefetch, but not set opsBeforeReturnP - boot is not blocked by it!\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._deltaManager.preFetchOps(false);\n }\n break;\n case \"cached\":\n opsBeforeReturnP = this._deltaManager.preFetchOps(true);\n // Keep going with fetching ops from storage once we have all cached ops in.\n // Ops processing will start once cached ops are in and and will stop when queue is empty\n // (which in most cases will happen when we are done processing cached ops)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n opsBeforeReturnP.then(async () => this._deltaManager.preFetchOps(false));\n break;\n case \"all\":\n opsBeforeReturnP = this._deltaManager.preFetchOps(false);\n break;\n default:\n unreachableCase(loadMode.opsBeforeReturn);\n }\n\n this._protocolHandler = await protocolHandlerP;\n\n const codeDetails = this.getCodeDetailsFromQuorum();\n await this.instantiateContext(\n true, // existing\n codeDetails,\n snapshot,\n pendingLocalState,\n );\n\n // Propagate current connection state through the system.\n this.propagateConnectionState();\n\n // Internal context is fully loaded at this point\n this.loaded = true;\n\n // We might have hit some failure that did not manifest itself in exception in this flow,\n // do not start op processing in such case - static version of Container.load() will handle it correctly.\n if (!this.closed) {\n if (opsBeforeReturnP !== undefined) {\n this._deltaManager.inbound.resume();\n\n await opsBeforeReturnP;\n await this._deltaManager.inbound.waitTillProcessingDone();\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._deltaManager.inbound.pause();\n }\n\n switch (loadMode.deltaConnection) {\n case undefined:\n this.resume();\n break;\n case \"delayed\":\n this.resumedOpProcessingAfterLoad = true;\n this._deltaManager.inbound.resume();\n this._deltaManager.inboundSignal.resume();\n break;\n case \"none\":\n break;\n default:\n unreachableCase(loadMode.deltaConnection);\n }\n }\n\n // Safety net: static version of Container.load() should have learned about it through \"closed\" handler.\n // But if that did not happen for some reason, fail load for sure.\n // Otherwise we can get into situations where container is closed and does not try to connect to ordering\n // service, but caller does not know that (callers do expect container to be not closed on successful path\n // and listen only on \"closed\" event)\n if (this.closed) {\n throw new Error(\"Container was closed while load()\");\n }\n\n return {\n sequenceNumber: attributes.sequenceNumber,\n version: versionId,\n };\n }\n\n private async createDetached(source: IFluidCodeDetails) {\n const attributes: IDocumentAttributes = {\n branch: \"\",\n sequenceNumber: detachedContainerRefSeqNumber,\n term: 1,\n minimumSequenceNumber: 0,\n };\n\n // Seed the base quorum to be an empty list with a code quorum set\n const committedCodeProposal: ICommittedProposal = {\n key: \"code\",\n value: source,\n approvalSequenceNumber: 0,\n commitSequenceNumber: 0,\n sequenceNumber: 0,\n };\n\n const members: [string, ISequencedClient][] = [];\n const proposals: [number, ISequencedProposal, string[]][] = [];\n const values: [string, ICommittedProposal][] = [[\"code\", committedCodeProposal]];\n\n this.attachDeltaManagerOpHandler(attributes);\n\n // Need to just seed the source data in the code quorum. Quorum itself is empty\n this._protocolHandler = await this.initializeProtocolState(\n attributes,\n members,\n proposals,\n values);\n\n // The load context - given we seeded the quorum - will be great\n await this.instantiateContextDetached(\n false, // existing\n );\n\n this.propagateConnectionState();\n\n this.loaded = true;\n }\n\n private async rehydrateDetachedFromSnapshot(detachedContainerSnapshot: ISummaryTree) {\n const snapshotTree = getSnapshotTreeFromSerializedContainer(detachedContainerSnapshot);\n this._storage.loadSnapshotForRehydratingContainer(snapshotTree);\n const attributes = await this.getDocumentAttributes(this._storage, snapshotTree);\n assert(attributes.sequenceNumber === 0, 0x0db /* \"Seq number in detached container should be 0!!\" */);\n this.attachDeltaManagerOpHandler(attributes);\n\n // ...load in the existing quorum\n // Initialize the protocol handler\n this._protocolHandler =\n await this.loadAndInitializeProtocolState(attributes, this._storage, snapshotTree);\n\n await this.instantiateContextDetached(\n true, // existing\n snapshotTree,\n );\n\n this.loaded = true;\n\n this.propagateConnectionState();\n }\n\n private async connectStorageService(): Promise<void> {\n if (this._storageService !== undefined) {\n return;\n }\n\n assert(this.service !== undefined, 0x1ef /* \"services must be defined\" */);\n const storageService = await this.service.connectToStorage();\n\n this._storageService =\n new RetriableDocumentStorageService(storageService, this._deltaManager, this.logger);\n\n if(this.options.summarizeProtocolTree === true) {\n this._storageService =\n new ProtocolTreeStorageService(this._storageService, ()=>this.captureProtocolSummary());\n }\n\n // ensure we did not lose that policy in the process of wrapping\n assert(storageService.policies?.minBlobSize === this.storageService.policies?.minBlobSize,\n 0x0e0 /* \"lost minBlobSize policy\" */);\n }\n\n private async getDocumentAttributes(\n storage: IDocumentStorageService,\n tree: ISnapshotTree | undefined,\n ): Promise<IDocumentAttributes> {\n if (tree === undefined) {\n return {\n branch: this.id,\n minimumSequenceNumber: 0,\n sequenceNumber: 0,\n term: 1,\n };\n }\n\n // Backward compatibility: old docs would have \".attributes\" instead of \"attributes\"\n const attributesHash = \".protocol\" in tree.trees\n ? tree.trees[\".protocol\"].blobs.attributes\n : tree.blobs[\".attributes\"];\n\n const attributes = await readAndParse<IDocumentAttributes>(storage, attributesHash);\n\n // Backward compatibility for older summaries with no term\n if (attributes.term === undefined) {\n attributes.term = 1;\n }\n\n return attributes;\n }\n\n private async loadAndInitializeProtocolState(\n attributes: IDocumentAttributes,\n storage: IDocumentStorageService,\n snapshot: ISnapshotTree | undefined,\n ): Promise<ProtocolOpHandler> {\n let members: [string, ISequencedClient][] = [];\n let proposals: [number, ISequencedProposal, string[]][] = [];\n let values: [string, any][] = [];\n\n if (snapshot !== undefined) {\n const baseTree = \".protocol\" in snapshot.trees ? snapshot.trees[\".protocol\"] : snapshot;\n [members, proposals, values] = await Promise.all([\n readAndParse<[string, ISequencedClient][]>(storage, baseTree.blobs.quorumMembers),\n readAndParse<[number, ISequencedProposal, string[]][]>(storage, baseTree.blobs.quorumProposals),\n readAndParse<[string, ICommittedProposal][]>(storage, baseTree.blobs.quorumValues),\n ]);\n }\n\n const protocolHandler = await this.initializeProtocolState(\n attributes,\n members,\n proposals,\n values);\n\n return protocolHandler;\n }\n\n private async initializeProtocolState(\n attributes: IDocumentAttributes,\n members: [string, ISequencedClient][],\n proposals: [number, ISequencedProposal, string[]][],\n values: [string, any][],\n ): Promise<ProtocolOpHandler> {\n const protocol = new ProtocolOpHandler(\n attributes.minimumSequenceNumber,\n attributes.sequenceNumber,\n attributes.term,\n members,\n proposals,\n values,\n (key, value) => this.submitMessage(MessageType.Propose, { key, value }),\n (sequenceNumber) => this.submitMessage(MessageType.Reject, sequenceNumber));\n\n const protocolLogger = ChildLogger.create(this.subLogger, \"ProtocolHandler\");\n\n protocol.quorum.on(\"error\", (error) => {\n protocolLogger.sendErrorEvent(error);\n });\n\n // Track membership changes and update connection state accordingly\n protocol.quorum.on(\"addMember\", (clientId, details) => {\n this.connectionStateHandler.receivedAddMemberEvent(clientId);\n });\n\n protocol.quorum.on(\"removeMember\", (clientId) => {\n this.connectionStateHandler.receivedRemoveMemberEvent(clientId);\n });\n\n protocol.quorum.on(\"addProposal\", (proposal: IPendingProposal) => {\n if (proposal.key === \"code\" || proposal.key === \"code2\") {\n this.emit(\"codeDetailsProposed\", proposal.value, proposal);\n }\n });\n\n protocol.quorum.on(\n \"approveProposal\",\n (sequenceNumber, key, value) => {\n debug(`approved ${key}`);\n if (key === \"code\" || key === \"code2\") {\n debug(`codeProposal ${JSON.stringify(value)}`);\n if (!isFluidCodeDetails(value)) {\n this.logger.sendErrorEvent({\n eventName: \"CodeProposalNotIFluidCodeDetails\",\n });\n }\n this.processCodeProposal().catch((error) => {\n this.close(CreateContainerError(error));\n throw error;\n });\n }\n });\n\n return protocol;\n }\n\n private captureProtocolSummary(): ISummaryTree {\n const quorumSnapshot = this.protocolHandler.quorum.snapshot();\n\n // Save attributes for the document\n const documentAttributes: IDocumentAttributes = {\n branch: this.id,\n minimumSequenceNumber: this.protocolHandler.minimumSequenceNumber,\n sequenceNumber: this.protocolHandler.sequenceNumber,\n term: this.protocolHandler.term,\n };\n\n const summary: ISummaryTree = {\n tree: {\n attributes: {\n content: JSON.stringify(documentAttributes),\n type: SummaryType.Blob,\n },\n quorumMembers: {\n content: JSON.stringify(quorumSnapshot.members),\n type: SummaryType.Blob,\n },\n quorumProposals: {\n content: JSON.stringify(quorumSnapshot.proposals),\n type: SummaryType.Blob,\n },\n quorumValues: {\n content: JSON.stringify(quorumSnapshot.values),\n type: SummaryType.Blob,\n },\n },\n type: SummaryType.Tree,\n };\n\n return summary;\n }\n\n private getCodeDetailsFromQuorum(): IFluidCodeDetails {\n const quorum = this.protocolHandler.quorum;\n\n const pkg = getCodeProposal(quorum);\n\n return pkg as IFluidCodeDetails;\n }\n\n private get client(): IClient {\n const client: IClient = this.options?.client !== undefined\n ? (this.options.client as IClient)\n : {\n details: {\n capabilities: { interactive: true },\n },\n mode: \"read\", // default reconnection mode on lost connection / connection error\n permission: [],\n scopes: [],\n user: { id: \"\" },\n };\n\n if (this.clientDetailsOverride !== undefined) {\n merge(client.details, this.clientDetailsOverride);\n }\n\n return client;\n }\n\n /**\n * Returns true if connection is active, i.e. it's \"write\" connection and\n * container runtime was notified about this connection (i.e. we are up-to-date and could send ops).\n * This happens after client received its own joinOp and thus is in the quorum.\n * If it's not true, runtime is not in position to send ops.\n */\n private activeConnection() {\n return this.connectionState === ConnectionState.Connected && this._deltaManager.connectionMode === \"write\";\n }\n\n private createDeltaManager() {\n const deltaManager: DeltaManager = new DeltaManager(\n () => this.service,\n this.client,\n ChildLogger.create(this.subLogger, \"DeltaManager\"),\n this._canReconnect,\n () => this.activeConnection(),\n );\n\n // Disable inbound queues as Container is not ready to accept any ops until we are fully loaded!\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaManager.inbound.pause();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaManager.inboundSignal.pause();\n\n deltaManager.on(\"connect\", (details: IConnectionDetails, opsBehind?: number) => {\n this.connectionStateHandler.receivedConnectEvent(\n this._deltaManager.connectionMode,\n details,\n opsBehind,\n );\n\n // Back-compat for new client and old server.\n this._audience.clear();\n\n for (const priorClient of details.initialClients ?? []) {\n this._audience.addMember(priorClient.clientId, priorClient.client);\n }\n });\n\n deltaManager.on(\"disconnect\", (reason: string) => {\n this.manualReconnectInProgress = false;\n this.collabWindowTracker.stopSequenceNumberUpdate();\n this.connectionStateHandler.receivedDisconnectEvent(reason);\n });\n\n deltaManager.on(\"throttled\", (warning: IThrottlingWarning) => {\n this.raiseContainerWarning(warning);\n });\n\n deltaManager.on(\"readonly\", (readonly) => {\n this.emit(\"readonly\", readonly);\n });\n\n deltaManager.on(\"closed\", (error?: ICriticalContainerError) => {\n this.close(error);\n });\n\n return deltaManager;\n }\n\n private attachDeltaManagerOpHandler(attributes: IDocumentAttributes): void {\n this._deltaManager.attachOpHandler(\n attributes.minimumSequenceNumber,\n attributes.sequenceNumber,\n attributes.term ?? 1,\n {\n process: (message) => this.processRemoteMessage(message),\n processSignal: (message) => {\n this.processSignal(message);\n },\n });\n }\n\n private logConnectionStateChangeTelemetry(\n value: ConnectionState,\n oldState: ConnectionState,\n reason?: string,\n ) {\n // Log actual event\n const time = performance.now();\n this.connectionTransitionTimes[value] = time;\n const duration = time - this.connectionTransitionTimes[oldState];\n\n let durationFromDisconnected: number | undefined;\n let connectionMode: string | undefined;\n let connectionInitiationReason: string | undefined;\n let autoReconnect: ReconnectMode | undefined;\n let checkpointSequenceNumber: number | undefined;\n let sequenceNumber: number | undefined;\n let opsBehind: number | undefined;\n if (value === ConnectionState.Disconnected) {\n autoReconnect = this._deltaManager.reconnectMode;\n } else {\n connectionMode = this._deltaManager.connectionMode;\n sequenceNumber = this.deltaManager.lastSequenceNumber;\n if (value === ConnectionState.Connected) {\n durationFromDisconnected = time - this.connectionTransitionTimes[ConnectionState.Disconnected];\n durationFromDisconnected = TelemetryLogger.formatTick(durationFromDisconnected);\n } else {\n // This info is of most interest on establishing connection only.\n checkpointSequenceNumber = this.deltaManager.lastKnownSeqNumber;\n if (this.deltaManager.hasCheckpointSequenceNumber) {\n opsBehind = checkpointSequenceNumber - sequenceNumber;\n }\n }\n if (this.firstConnection) {\n connectionInitiationReason = \"InitialConnect\";\n } else if (this.manualReconnectInProgress) {\n connectionInitiationReason = \"ManualReconnect\";\n } else {\n connectionInitiationReason = \"AutoReconnect\";\n }\n }\n\n this.logger.sendPerformanceEvent({\n eventName: `ConnectionStateChange_${ConnectionState[value]}`,\n from: ConnectionState[oldState],\n duration,\n durationFromDisconnected,\n reason,\n connectionInitiationReason,\n socketDocumentId: this._deltaManager.socketDocumentId,\n pendingClientId: this.connectionStateHandler.pendingClientId,\n clientId: this.clientId,\n connectionMode,\n autoReconnect,\n opsBehind,\n online: OnlineStatus[isOnline()],\n lastVisible: this.lastVisible !== undefined ? performance.now() - this.lastVisible : undefined,\n checkpointSequenceNumber,\n sequenceNumber,\n });\n\n if (value === ConnectionState.Connected) {\n this.firstConnection = false;\n this.manualReconnectInProgress = false;\n }\n }\n\n private propagateConnectionState() {\n const logOpsOnReconnect: boolean =\n this.connectionState === ConnectionState.Connected &&\n !this.firstConnection &&\n this._deltaManager.connectionMode === \"write\";\n if (logOpsOnReconnect) {\n this.messageCountAfterDisconnection = 0;\n }\n\n const state = this.connectionState === ConnectionState.Connected;\n if (!this.context.disposed) {\n this.context.setConnectionState(state, this.clientId);\n }\n assert(this.protocolHandler !== undefined, 0x0dc /* \"Protocol handler should be set here\" */);\n this.protocolHandler.quorum.setConnectionState(state, this.clientId);\n raiseConnectedEvent(this.logger, this, state, this.clientId);\n\n if (logOpsOnReconnect) {\n this.logger.sendTelemetryEvent(\n { eventName: \"OpsSentOnReconnect\", count: this.messageCountAfterDisconnection });\n }\n }\n\n private submitContainerMessage(type: MessageType, contents: any, batch?: boolean, metadata?: any): number {\n const outboundMessageType: string = type;\n switch (outboundMessageType) {\n case MessageType.Operation:\n case MessageType.RemoteHelp:\n break;\n case MessageType.Summarize: {\n // github #6451: this is only needed for staging so the server\n // know when the protocol tree is included\n // this can be removed once all clients send\n // protocol tree by default\n const summary = contents as ISummaryContent;\n if(summary.details === undefined) {\n summary.details = {};\n }\n summary.details.includesProtocolTree =\n this.options.summarizeProtocolTree === true;\n break;\n }\n default:\n this.close(CreateContainerError(`Runtime can't send arbitrary message type: ${type}`));\n return -1;\n }\n return this.submitMessage(type, contents, batch, metadata);\n }\n\n private submitMessage(type: MessageType, contents: any, batch?: boolean, metadata?: any): number {\n if (this.connectionState !== ConnectionState.Connected) {\n this.logger.sendErrorEvent({ eventName: \"SubmitMessageWithNoConnection\", type });\n return -1;\n }\n\n this.messageCountAfterDisconnection += 1;\n this.collabWindowTracker.stopSequenceNumberUpdate();\n return this._deltaManager.submit(type, contents, batch, metadata);\n }\n\n private processRemoteMessage(message: ISequencedDocumentMessage): IProcessMessageResult {\n // Check and report if we're getting messages from a clientId that we previously\n // flagged as shouldHaveLeft, or from a client that's not in the quorum but should be\n if (message.clientId != null) {\n let errorMsg: string | undefined;\n const client: ILocalSequencedClient | undefined =\n this.getQuorum().getMember(message.clientId);\n if (client === undefined && message.type !== MessageType.ClientJoin) {\n errorMsg = \"messageClientIdMissingFromQuorum\";\n } else if (client?.shouldHaveLeft === true && message.type !== MessageType.NoOp) {\n errorMsg = \"messageClientIdShouldHaveLeft\";\n }\n if (errorMsg !== undefined) {\n const error = new DataCorruptionError(\n errorMsg,\n extractSafePropertiesFromMessage(message));\n this.close(CreateContainerError(error));\n }\n }\n\n const local = this.clientId === message.clientId;\n\n // Forward non system messages to the loaded runtime for processing\n if (!isSystemMessage(message)) {\n this.context.process(message, local, undefined);\n }\n\n // Allow the protocol handler to process the message\n const result = this.protocolHandler.processMessage(message, local);\n this.collabWindowTracker.scheduleSequenceNumberUpdate(message, result.immediateNoOp === true);\n\n this.emit(\"op\", message);\n\n return result;\n }\n\n private submitSignal(message: any) {\n this._deltaManager.submitSignal(JSON.stringify(message));\n }\n\n private processSignal(message: ISignalMessage) {\n // No clientId indicates a system signal message.\n if (message.clientId === null) {\n const innerContent = message.content as { content: any; type: string };\n if (innerContent.type === MessageType.ClientJoin) {\n const newClient = innerContent.content as ISignalClient;\n this._audience.addMember(newClient.clientId, newClient.client);\n } else if (innerContent.type === MessageType.ClientLeave) {\n const leftClientId = innerContent.content as string;\n this._audience.removeMember(leftClientId);\n }\n } else {\n const local = this.clientId === message.clientId;\n this.context.processSignal(message, local);\n }\n }\n\n /**\n * Get the most recent snapshot, or a specific version.\n * @param specifiedVersion - The specific version of the snapshot to retrieve\n * @returns The snapshot requested, or the latest snapshot if no version was specified, plus version ID\n */\n private async fetchSnapshotTree(specifiedVersion: string | undefined):\n Promise<{snapshot?: ISnapshotTree; versionId?: string}>\n {\n const version = await this.getVersion(specifiedVersion ?? this.id);\n\n if (version === undefined && specifiedVersion !== undefined) {\n // We should have a defined version to load from if specified version requested\n this.logger.sendErrorEvent({ eventName: \"NoVersionFoundWhenSpecified\", id: specifiedVersion });\n }\n this._loadedFromVersion = version;\n const snapshot = await this.storageService.getSnapshotTree(version) ?? undefined;\n\n if (snapshot === undefined && version !== undefined) {\n this.logger.sendErrorEvent({ eventName: \"getSnapshotTreeFailed\", id: version.id });\n }\n return { snapshot, versionId: version?.id };\n }\n\n private async instantiateContextDetached(\n existing: boolean,\n snapshot?: ISnapshotTree,\n pendingLocalState?: unknown,\n ) {\n const codeDetails = this.getCodeDetailsFromQuorum();\n if (codeDetails === undefined) {\n throw new Error(\"pkg should be provided in create flow!!\");\n }\n\n await this.instantiateContext(\n existing,\n codeDetails,\n snapshot,\n pendingLocalState,\n );\n }\n\n private async instantiateContext(\n existing: boolean,\n codeDetails: IFluidCodeDetails,\n snapshot?: ISnapshotTree,\n pendingLocalState?: unknown,\n ) {\n assert(this._context?.disposed !== false, 0x0dd /* \"Existing context not disposed\" */);\n // If this assert fires, our state tracking is likely not synchronized between COntainer & runtime.\n if (this._dirtyContainer) {\n this.logger.sendErrorEvent({ eventName: \"DirtyContainerReloadContainer\" });\n }\n\n // The relative loader will proxy requests to '/' to the loader itself assuming no non-cache flags\n // are set. Global requests will still go directly to the loader\n const loader = new RelativeLoader(this, this.loader);\n this._context = await ContainerContext.createOrLoad(\n this,\n this.scope,\n this.codeLoader,\n codeDetails,\n snapshot,\n new DeltaManagerProxy(this._deltaManager),\n new QuorumProxy(this.protocolHandler.quorum),\n loader,\n (warning: ContainerWarning) => this.raiseContainerWarning(warning),\n (type, contents, batch, metadata) => this.submitContainerMessage(type, contents, batch, metadata),\n (message) => this.submitSignal(message),\n (error?: ICriticalContainerError) => this.close(error),\n Container.version,\n (dirty: boolean) => {\n this._dirtyContainer = dirty;\n this.emit(dirty ? dirtyContainerEvent : savedContainerEvent);\n },\n existing,\n pendingLocalState,\n );\n\n this.emit(\"contextChanged\", codeDetails);\n }\n\n // Please avoid calling it directly.\n // raiseContainerWarning() is the right flow for most cases\n private logContainerError(warning: ContainerWarning) {\n this.logger.sendErrorEvent({ eventName: \"ContainerWarning\" }, warning);\n }\n}\n"]}
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.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\n// eslint-disable-next-line import/no-internal-modules\nimport merge from \"lodash/merge\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n IDisposable,\n ITelemetryLogger,\n} from \"@fluidframework/common-definitions\";\nimport { assert, performance, unreachableCase, Timer } from \"@fluidframework/common-utils\";\nimport {\n IRequest,\n IResponse,\n IFluidRouter,\n IFluidCodeDetails,\n isFluidCodeDetails,\n} from \"@fluidframework/core-interfaces\";\nimport {\n IAudience,\n IConnectionDetails,\n IContainer,\n IContainerEvents,\n IDeltaManager,\n ICriticalContainerError,\n ContainerWarning,\n AttachState,\n IThrottlingWarning,\n IPendingLocalState,\n ReadOnlyInfo,\n IContainerLoadMode,\n} from \"@fluidframework/container-definitions\";\nimport {\n DataCorruptionError,\n extractSafePropertiesFromMessage,\n GenericError,\n UsageError,\n } from \"@fluidframework/container-utils\";\nimport {\n IDocumentService,\n IDocumentStorageService,\n IFluidResolvedUrl,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport {\n readAndParse,\n OnlineStatus,\n isOnline,\n ensureFluidResolvedUrl,\n combineAppAndProtocolSummary,\n runWithRetry,\n} from \"@fluidframework/driver-utils\";\nimport {\n isSystemMessage,\n ProtocolOpHandler,\n} from \"@fluidframework/protocol-base\";\nimport {\n FileMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n ICommittedProposal,\n IDocumentAttributes,\n IDocumentMessage,\n IProcessMessageResult,\n IQuorum,\n ISequencedClient,\n ISequencedDocumentMessage,\n ISequencedProposal,\n ISignalClient,\n ISignalMessage,\n ISnapshotTree,\n ITree,\n ITreeEntry,\n IVersion,\n MessageType,\n TreeEntry,\n ISummaryTree,\n IPendingProposal,\n SummaryType,\n ISummaryContent,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n ChildLogger,\n EventEmitterWithErrorHandling,\n PerformanceEvent,\n raiseConnectedEvent,\n TelemetryLogger,\n connectedEventName,\n disconnectedEventName,\n normalizeError,\n} from \"@fluidframework/telemetry-utils\";\nimport { Audience } from \"./audience\";\nimport { ContainerContext } from \"./containerContext\";\nimport { IConnectionArgs, DeltaManager, ReconnectMode } from \"./deltaManager\";\nimport { DeltaManagerProxy } from \"./deltaManagerProxy\";\nimport { ILoaderOptions, Loader, RelativeLoader } from \"./loader\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { ConnectionStateHandler, ILocalSequencedClient } from \"./connectionStateHandler\";\nimport { RetriableDocumentStorageService } from \"./retriableDocumentStorageService\";\nimport { ProtocolTreeStorageService } from \"./protocolTreeDocumentStorageService\";\nimport { BlobOnlyStorage, ContainerStorageAdapter } from \"./containerStorageAdapter\";\nimport { getSnapshotTreeFromSerializedContainer } from \"./utils\";\nimport { QuorumProxy } from \"./quorum\";\n\nconst detachedContainerRefSeqNumber = 0;\n\nconst dirtyContainerEvent = \"dirty\";\nconst savedContainerEvent = \"saved\";\n\nexport interface IContainerLoadOptions {\n /**\n * Disables the Container from reconnecting if false, allows reconnect otherwise.\n */\n canReconnect?: boolean;\n /**\n * Client details provided in the override will be merged over the default client.\n */\n clientDetailsOverride?: IClientDetails;\n resolvedUrl: IFluidResolvedUrl;\n /**\n * Control which snapshot version to load from. See IParsedUrl for detailed information.\n */\n version: string | undefined;\n /**\n * Loads the Container in paused state if true, unpaused otherwise.\n */\n loadMode?: IContainerLoadMode;\n}\n\nexport interface IContainerConfig {\n resolvedUrl?: IFluidResolvedUrl;\n canReconnect?: boolean;\n /**\n * Client details provided in the override will be merged over the default client.\n */\n clientDetailsOverride?: IClientDetails;\n}\n\nexport enum ConnectionState {\n /**\n * The document is no longer connected to the delta server\n */\n Disconnected,\n\n /**\n * The document has an inbound connection but is still pending for outbound deltas\n */\n Connecting,\n\n /**\n * The document is fully connected\n */\n Connected,\n}\n\n/**\n * Waits until container connects to delta storage and gets up-to-date\n * Useful when resolving URIs and hitting 404, due to container being loaded from (stale) snapshot and not being\n * up to date. Host may chose to wait in such case and retry resolving URI.\n * Warning: Will wait infinitely for connection to establish if there is no connection.\n * May result in deadlock if Container.setAutoReconnect(false) is called and never switched back to auto-reconnect.\n * @returns true: container is up to date, it processed all the ops that were know at the time of first connection\n * false: storage does not provide indication of how far the client is. Container processed\n * all the ops known to it, but it maybe still behind.\n */\nexport async function waitContainerToCatchUp(container: Container) {\n // Make sure we stop waiting if container is closed.\n if (container.closed) {\n throw new Error(\"Container is closed\");\n }\n\n return new Promise<boolean>((accept, reject) => {\n const deltaManager = container.deltaManager;\n\n container.on(\"closed\", reject);\n\n const waitForOps = () => {\n assert(container.connectionState !== ConnectionState.Disconnected,\n 0x0cd /* \"Container disconnected while waiting for ops!\" */);\n const hasCheckpointSequenceNumber = deltaManager.hasCheckpointSequenceNumber;\n\n const connectionOpSeqNumber = deltaManager.lastKnownSeqNumber;\n if (deltaManager.lastSequenceNumber === connectionOpSeqNumber) {\n accept(hasCheckpointSequenceNumber);\n return;\n }\n const callbackOps = (message) => {\n if (connectionOpSeqNumber <= message.sequenceNumber) {\n accept(hasCheckpointSequenceNumber);\n deltaManager.off(\"op\", callbackOps);\n }\n };\n deltaManager.on(\"op\", callbackOps);\n };\n\n // We can leverage DeltaManager's \"connect\" event here and test for ConnectionState.Disconnected\n // But that works only if service provides us checkPointSequenceNumber\n // Our internal testing is based on R11S that does not, but almost all tests connect as \"write\" and\n // use this function to catch up, so leveraging our own join op as a fence/barrier\n if (container.connectionState === ConnectionState.Connected) {\n waitForOps();\n return;\n }\n\n const callback = () => {\n container.off(connectedEventName, callback);\n waitForOps();\n };\n container.on(connectedEventName, callback);\n\n container.resume();\n });\n}\n\n// Here are key considerations when deciding conditions for when to send non-immediate noops:\n// 1. Sending them too often results in increase in file size and bandwidth, as well as catch up performance\n// 2. Sending too infrequently ensures that collab window is large, and as result Sequence DDS would have\n// large catchUp blobs - see Issue #6364\n// 3. Similarly, processes that rely on \"core\" snapshot (and can't parse trailing ops, including above), like search\n// parser in SPO, will result in non-accurate results due to presence of catch up blobs.\n// 4. Ordering service used 250ms timeout to coalesce non-immediate noops. It was changed to 2000 ms to allow more\n// aggressive noop sending from client side.\n// 5. Number of ops sent by all clients is proportional to number of \"write\" clients (every client sends noops),\n// but number of sequenced noops is a function of time (one op per 2 seconds at most).\n// We should consider impact to both outbound traffic (might be huge, depends on number of clients) and file size.\n// Please also see Issue #5629 for more discussions.\n//\n// With that, the current algorithm is as follows:\n// 1. Sent noop 2000 ms of receiving an op if no ops were sent by this client within this timeframe.\n// This will ensure that MSN moves forward with reasonable speed. If that results in too many sequenced noops,\n// server timeout of 2000ms should be reconsidered to be increased.\n// 2. If there are more than 50 ops received without sending any ops, send noop to keep collab window small.\n// Note that system ops (including noops themselves) are excluded, so it's 1 noop per 50 real ops.\nexport class CollabWindowTracker {\n private opsCountSinceNoop = 0;\n private readonly timer: Timer;\n\n constructor(\n private readonly submit: (type: MessageType, contents: any) => void,\n private readonly activeConnection: () => boolean,\n NoopTimeFrequency: number = 2000,\n private readonly NoopCountFrequency: number = 50,\n ) {\n this.timer = new Timer(NoopTimeFrequency, () => {\n // Can get here due to this.stopSequenceNumberUpdate() not resetting timer.\n // Also timer callback can fire even after timer cancellation if it was queued before cancellation.\n if (this.opsCountSinceNoop !== 0) {\n assert(this.activeConnection(),\n 0x241 /* \"disconnect should result in stopSequenceNumberUpdate() call\" */);\n this.submitNoop(false /* immediate */);\n }\n });\n }\n\n /**\n * Schedules as ack to the server to update the reference sequence number\n */\n public scheduleSequenceNumberUpdate(message: ISequencedDocumentMessage, immediateNoOp: boolean): void {\n // Exit early for inactive (not in quorum or not writers) clients.\n // They don't take part in the minimum sequence number calculation.\n if (!this.activeConnection()) {\n return;\n }\n\n // While processing a message, an immediate no-op can be requested.\n // i.e. to expedite approve or commit phase of quorum.\n if (immediateNoOp) {\n this.submitNoop(true /* immediate */);\n return;\n }\n\n // We don't acknowledge no-ops to avoid acknowledgement cycles (i.e. ack the MSN\n // update, which updates the MSN, then ack the update, etc...). Also, don't\n // count system messages in ops count.\n if (isSystemMessage(message)) {\n return;\n }\n assert(message.type !== MessageType.NoOp, 0x0ce /* \"Don't acknowledge no-ops\" */);\n\n this.opsCountSinceNoop++;\n if (this.opsCountSinceNoop >= this.NoopCountFrequency) {\n this.submitNoop(false /* immediate */);\n return;\n }\n if (this.opsCountSinceNoop === 1) {\n this.timer.restart();\n }\n assert(this.timer.hasTimer, 0x242 /* \"has timer\" */);\n }\n\n private submitNoop(immediate: boolean) {\n // Anything other than null is immediate noop\n this.submit(MessageType.NoOp, immediate ? \"\" : null);\n assert(this.opsCountSinceNoop === 0,\n 0x243 /* \"stopSequenceNumberUpdate should be called as result of sending any op!\" */);\n }\n\n public stopSequenceNumberUpdate(): void {\n this.opsCountSinceNoop = 0;\n // Ideally, we cancel timer here. But that will result in too often set/reset cycle if this client\n // keeps sending ops. In most cases it's actually better to let it expire (at most - 4 times per second)\n // for nothing, then have a ton of set/reset cycles.\n // Note that Timer.restart() is smart and will not change timer expiration if we keep extending timer\n // expiration - it will restart the timer instead when it fires with adjusted expiration.\n // this.timer.clear();\n }\n}\n\nconst getCodeProposal =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (quorum: IQuorum) => quorum.get(\"code\") ?? quorum.get(\"code2\");\n\nexport class Container extends EventEmitterWithErrorHandling<IContainerEvents> implements IContainer {\n public static version = \"^0.1.0\";\n\n /**\n * Load an existing container.\n */\n public static async load(\n loader: Loader,\n loadOptions: IContainerLoadOptions,\n pendingLocalState?: unknown,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {\n clientDetailsOverride: loadOptions.clientDetailsOverride,\n resolvedUrl: loadOptions.resolvedUrl,\n canReconnect: loadOptions.canReconnect,\n });\n\n return PerformanceEvent.timedExecAsync(\n container.logger,\n { eventName: \"Load\" },\n async (event) => new Promise<Container>((res, rej) => {\n const version = loadOptions.version;\n\n // always load unpaused with pending ops!\n // It is also default mode in general.\n const defaultMode: IContainerLoadMode = { opsBeforeReturn: \"cached\" };\n assert(pendingLocalState === undefined || loadOptions.loadMode === undefined,\n 0x1e1 /* \"pending state requires immidiate connection!\" */);\n const mode: IContainerLoadMode = loadOptions.loadMode ?? defaultMode;\n\n const onClosed = (err?: ICriticalContainerError) => {\n rej(err ?? new GenericError(\"containerClosedWithoutErrorDuringLoad\"));\n };\n container.on(\"closed\", onClosed);\n\n container.load(version, mode, pendingLocalState)\n .finally(() => {\n container.removeListener(\"closed\", onClosed);\n })\n .then((props) => {\n event.end(props);\n res(container);\n },\n (error) => {\n const err = normalizeError(error);\n // Depending where error happens, we can be attempting to connect to web socket\n // and continuously retrying (consider offline mode)\n // Host has no container to close, so it's prudent to do it here\n container.close(err);\n onClosed(err);\n });\n }),\n { start: true, end: true, cancel: \"generic\" },\n );\n }\n\n /**\n * Create a new container in a detached state.\n */\n public static async createDetached(\n loader: Loader,\n codeDetails: IFluidCodeDetails,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {});\n await container.createDetached(codeDetails);\n return container;\n }\n\n /**\n * Create a new container in a detached state that is initialized with a\n * snapshot from a previous detached container.\n */\n public static async rehydrateDetachedFromSnapshot(\n loader: Loader,\n snapshot: string,\n ): Promise<Container> {\n const container = new Container(\n loader,\n {});\n const deserializedSummary = JSON.parse(snapshot) as ISummaryTree;\n await container.rehydrateDetachedFromSnapshot(deserializedSummary);\n return container;\n }\n\n public subLogger: TelemetryLogger;\n\n // Tells if container can reconnect on losing fist connection\n // If false, container gets closed on loss of connection.\n private readonly _canReconnect: boolean = true;\n\n private readonly logger: ITelemetryLogger;\n\n private loaded = false;\n private _attachState = AttachState.Detached;\n\n private readonly _storage: ContainerStorageAdapter;\n public get storage(): IDocumentStorageService {\n return this._storage;\n }\n\n // Active chaincode and associated runtime\n private _storageService: IDocumentStorageService & IDisposable | undefined;\n private get storageService(): IDocumentStorageService {\n if (this._storageService === undefined) {\n throw new Error(\"Attempted to access storageService before it was defined\");\n }\n return this._storageService;\n }\n\n private readonly clientDetailsOverride: IClientDetails | undefined;\n private readonly _deltaManager: DeltaManager;\n private service: IDocumentService | undefined;\n private readonly _audience: Audience;\n\n private _context: ContainerContext | undefined;\n private get context() {\n if (this._context === undefined) {\n throw new Error(\"Attempted to access context before it was defined\");\n }\n return this._context;\n }\n private _protocolHandler: ProtocolOpHandler | undefined;\n private get protocolHandler() {\n if (this._protocolHandler === undefined) {\n throw new Error(\"Attempted to access protocolHandler before it was defined\");\n }\n return this._protocolHandler;\n }\n\n private resumedOpProcessingAfterLoad = false;\n private firstConnection = true;\n private manualReconnectInProgress = false;\n private readonly connectionTransitionTimes: number[] = [];\n private messageCountAfterDisconnection: number = 0;\n private _loadedFromVersion: IVersion | undefined;\n private _resolvedUrl: IFluidResolvedUrl | undefined;\n private attachStarted = false;\n private _dirtyContainer = false;\n\n private lastVisible: number | undefined;\n private readonly connectionStateHandler: ConnectionStateHandler;\n\n private _closed = false;\n\n private readonly collabWindowTracker = new CollabWindowTracker(\n (type, contents) => this.submitMessage(type, contents),\n () => this.activeConnection(),\n this.loader.services.options?.noopTimeFrequency,\n this.loader.services.options?.noopCountFrequency,\n );\n\n public get IFluidRouter(): IFluidRouter { return this; }\n\n public get resolvedUrl(): IResolvedUrl | undefined {\n return this._resolvedUrl;\n }\n\n public get loadedFromVersion(): IVersion | undefined {\n return this._loadedFromVersion;\n }\n\n /**\n * {@inheritDoc DeltaManager.readonly}\n * @deprecated - use readOnlyInfo\n */\n public get readonly() {\n return this._deltaManager.readonly;\n }\n\n /**\n * {@inheritDoc DeltaManager.readonlyPermissions}\n * @deprecated - use readOnlyInfo\n */\n public get readonlyPermissions() {\n return this._deltaManager.readonlyPermissions;\n }\n\n /**\n * {@inheritDoc DeltaManager.readOnlyInfo}\n */\n public get readOnlyInfo(): ReadOnlyInfo {\n return this._deltaManager.readOnlyInfo;\n }\n\n /**\n * {@inheritDoc DeltaManager.forceReadonly}\n */\n public forceReadonly(readonly: boolean) {\n this._deltaManager.forceReadonly(readonly);\n }\n\n public get closed(): boolean {\n return this._closed;\n }\n\n public get id(): string {\n return this._resolvedUrl?.id ?? \"\";\n }\n\n public get deltaManager(): IDeltaManager<ISequencedDocumentMessage, IDocumentMessage> {\n return this._deltaManager;\n }\n\n public get connectionState(): ConnectionState {\n return this.connectionStateHandler.connectionState;\n }\n\n public get connected(): boolean {\n return this.connectionStateHandler.connected;\n }\n\n /**\n * Service configuration details. If running in offline mode will be undefined otherwise will contain service\n * configuration details returned as part of the initial connection.\n */\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this._deltaManager.serviceConfiguration;\n }\n\n /**\n * The server provided id of the client.\n * Set once this.connected is true, otherwise undefined\n */\n public get clientId(): string | undefined {\n return this.connectionStateHandler.clientId;\n }\n\n /**\n * The server provided claims of the client.\n * Set once this.connected is true, otherwise undefined\n */\n public get scopes(): string[] | undefined {\n return this._deltaManager.scopes;\n }\n\n public get clientDetails(): IClientDetails {\n return this._deltaManager.clientDetails;\n }\n\n /**\n * @deprecated use codeDetails\n */\n public get chaincodePackage(): IFluidCodeDetails | undefined {\n return this.codeDetails;\n }\n\n public get codeDetails(): IFluidCodeDetails | undefined {\n return this._context?.codeDetails ?? this.getCodeDetailsFromQuorum();\n }\n\n /**\n * Retrieves the audience associated with the document\n */\n public get audience(): IAudience {\n return this._audience;\n }\n\n /**\n * Returns true if container is dirty.\n * Which means data loss if container is closed at that same moment\n * Most likely that happens when there is no network connection to ordering service\n */\n public get isDirty() {\n return this._dirtyContainer;\n }\n\n private get serviceFactory() {return this.loader.services.documentServiceFactory;}\n private get urlResolver() {return this.loader.services.urlResolver;}\n public get options(): ILoaderOptions { return this.loader.services.options; }\n private get scope() { return this.loader.services.scope;}\n private get codeLoader() { return this.loader.services.codeLoader;}\n\n constructor(\n private readonly loader: Loader,\n config: IContainerConfig,\n ) {\n super((name, error) => {\n this.logger.sendErrorEvent(\n {\n eventName: \"ContainerEventHandlerException\",\n name: typeof name === \"string\" ? name : undefined,\n },\n error);\n });\n this._audience = new Audience();\n\n this.clientDetailsOverride = config.clientDetailsOverride;\n this._resolvedUrl = config.resolvedUrl;\n if (config.canReconnect !== undefined) {\n this._canReconnect = config.canReconnect;\n }\n\n // Create logger for data stores to use\n const type = this.client.details.type;\n const interactive = this.client.details.capabilities.interactive;\n const clientType =\n `${interactive ? \"interactive\" : \"noninteractive\"}${type !== undefined && type !== \"\" ? `/${type}` : \"\"}`;\n // Need to use the property getter for docId because for detached flow we don't have the docId initially.\n // We assign the id later so property getter is used.\n this.subLogger = ChildLogger.create(\n loader.services.subLogger,\n undefined,\n {\n all: {\n clientType, // Differentiating summarizer container from main container\n loaderVersion: pkgVersion,\n containerId: uuid(),\n docId: () => this.id,\n containerAttachState: () => this._attachState,\n containerLoaded: () => this.loaded,\n },\n // we need to be judicious with our logging here to avoid generting too much data\n // all data logged here should be broadly applicable, and not specific to a\n // specific error or class of errors\n error: {\n // load information to associate errors with the specific load point\n dmInitialSeqNumber: () => this._deltaManager?.initialSequenceNumber,\n dmLastKnownSeqNumber: () => this._deltaManager?.lastKnownSeqNumber,\n containerLoadedFromVersionId: () => this.loadedFromVersion?.id,\n containerLoadedFromVersionDate: () => this.loadedFromVersion?.date,\n // message information to associate errors with the specific execution state\n dmLastMsqSeqNumber: () => this.deltaManager?.lastMessage?.sequenceNumber,\n dmLastMsqSeqTimestamp: () => this.deltaManager?.lastMessage?.timestamp,\n dmLastMsqSeqClientId: () => this.deltaManager?.lastMessage?.clientId,\n },\n });\n\n // Prefix all events in this file with container-loader\n this.logger = ChildLogger.create(this.subLogger, \"Container\");\n\n this.connectionStateHandler = new ConnectionStateHandler(\n {\n protocolHandler: () => this._protocolHandler,\n logConnectionStateChangeTelemetry: (value, oldState, reason) =>\n this.logConnectionStateChangeTelemetry(value, oldState, reason),\n shouldClientJoinWrite: () => this._deltaManager.shouldJoinWrite(),\n maxClientLeaveWaitTime: this.loader.services.options.maxClientLeaveWaitTime,\n triggerConnectionRecovery: (reason: string) => {\n // We get here when socket does not receive any ops on \"write\" connection, including\n // its own join op. Attempt recovery option.\n this._deltaManager.triggerConnectionRecovery(\n reason,\n {\n duration: performance.now() - this.connectionTransitionTimes[this.connectionState],\n },\n );\n },\n },\n this.logger,\n );\n\n this.connectionStateHandler.on(\"connectionStateChanged\", () => {\n if (this.loaded) {\n this.propagateConnectionState();\n }\n });\n\n this._deltaManager = this.createDeltaManager();\n this._storage = new ContainerStorageAdapter(\n () => {\n if (this.attachState !== AttachState.Attached) {\n if (this.loader.services.detachedBlobStorage !== undefined) {\n return new BlobOnlyStorage(this.loader.services.detachedBlobStorage, this.logger);\n }\n this.logger.sendErrorEvent({\n eventName: \"NoRealStorageInDetachedContainer\",\n });\n throw new Error(\"Real storage calls not allowed in Unattached container\");\n }\n return this.storageService;\n },\n );\n\n const isDomAvailable = typeof document === \"object\" &&\n document !== null &&\n typeof document.addEventListener === \"function\" &&\n document.addEventListener !== null;\n // keep track of last time page was visible for telemetry\n if (isDomAvailable) {\n this.lastVisible = document.hidden ? performance.now() : undefined;\n document.addEventListener(\"visibilitychange\", () => {\n if (document.hidden) {\n this.lastVisible = performance.now();\n } else {\n // settimeout so this will hopefully fire after disconnect event if being hidden caused it\n setTimeout(() => this.lastVisible = undefined, 0);\n }\n });\n }\n\n // We observed that most users of platform do not check Container.connected event on load, causing bugs.\n // As such, we are raising events when new listener pops up.\n // Note that we can raise both \"disconnected\" & \"connect\" events at the same time,\n // if we are in connecting stage.\n this.on(\"newListener\", (event: string, listener: (...args: any[]) => void) => {\n // Fire events on the end of JS turn, giving a chance for caller to be in consistent state.\n Promise.resolve().then(() => {\n switch (event) {\n case dirtyContainerEvent:\n if (this._dirtyContainer) {\n listener(this._dirtyContainer);\n }\n break;\n case savedContainerEvent:\n if (!this._dirtyContainer) {\n listener(this._dirtyContainer);\n }\n break;\n case connectedEventName:\n if (this.connected) {\n listener(event, this.clientId);\n }\n break;\n case disconnectedEventName:\n if (!this.connected) {\n listener(event);\n }\n break;\n default:\n }\n }).catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"RaiseConnectedEventError\" }, error);\n });\n });\n }\n\n /**\n * Retrieves the quorum associated with the document\n */\n public getQuorum(): IQuorum {\n return this.protocolHandler.quorum;\n }\n\n public close(error?: ICriticalContainerError) {\n if (this._closed) {\n return;\n }\n this._closed = true;\n\n // Ensure that we raise all key events even if one of these throws\n try {\n this._deltaManager.close(error);\n\n this._protocolHandler?.close();\n\n this._context?.dispose(error !== undefined ? new Error(error.message) : undefined);\n\n assert(this.connectionState === ConnectionState.Disconnected,\n 0x0cf /* \"disconnect event was not raised!\" */);\n\n this._storageService?.dispose();\n\n // Notify storage about critical errors. They may be due to disconnect between client & server knowledge\n // about file, like file being overwritten in storage, but client having stale local cache.\n // Driver need to ensure all caches are cleared on critical errors\n this.service?.dispose(error);\n } catch (exception) {\n this.logger.sendErrorEvent({ eventName: \"ContainerCloseException\"}, exception);\n }\n\n this.logger.sendTelemetryEvent(\n {\n eventName: \"ContainerClose\",\n loaded: this.loaded,\n },\n error,\n );\n\n this.emit(\"closed\", error);\n\n this.removeAllListeners();\n }\n\n public closeAndGetPendingLocalState(): string {\n // runtime matches pending ops to successful ones by clientId and client seq num, so we need to close the\n // container at the same time we get pending state, otherwise this container could reconnect and resubmit with\n // a new clientId and a future container using stale pending state without the new clientId would resubmit them\n\n assert(this.attachState === AttachState.Attached, 0x0d1 /* \"Container should be attached before close\" */);\n assert(this.resolvedUrl !== undefined && this.resolvedUrl.type === \"fluid\",\n 0x0d2 /* \"resolved url should be valid Fluid url\" */);\n const pendingState: IPendingLocalState = {\n pendingRuntimeState: this.context.getPendingLocalState(),\n url: this.resolvedUrl.url,\n };\n\n this.close();\n\n return JSON.stringify(pendingState);\n }\n\n public get attachState(): AttachState {\n return this._attachState;\n }\n\n public serialize(): string {\n assert(this.attachState === AttachState.Detached, 0x0d3 /* \"Should only be called in detached container\" */);\n\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n const combinedSummary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n return JSON.stringify(combinedSummary);\n }\n\n public async attach(request: IRequest): Promise<void> {\n if (!this.loaded) {\n throw new UsageError(\"containerMustBeLoadedBeforeAttaching\");\n }\n\n if (this.closed) {\n throw new UsageError(\"cannotAttachClosedContainer\");\n }\n\n // If container is already attached or attach is in progress, throw an error.\n assert(this._attachState === AttachState.Detached && !this.attachStarted,\n 0x205 /* \"attach() called more than once\" */);\n this.attachStarted = true;\n\n // If attachment blobs were uploaded in detached state we will go through a different attach flow\n const hasAttachmentBlobs = this.loader.services.detachedBlobStorage !== undefined\n && this.loader.services.detachedBlobStorage.size > 0;\n\n try {\n assert(this.deltaManager.inbound.length === 0, 0x0d6 /* \"Inbound queue should be empty when attaching\" */);\n\n let summary: ISummaryTree;\n if (!hasAttachmentBlobs) {\n // Get the document state post attach - possibly can just call attach but we need to change the\n // semantics around what the attach means as far as async code goes.\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n summary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n // Set the state as attaching as we are starting the process of attaching container.\n // This should be fired after taking the summary because it is the place where we are\n // starting to attach the container to storage.\n // Also, this should only be fired in detached container.\n this._attachState = AttachState.Attaching;\n this.context.notifyAttaching();\n }\n\n const createNewResolvedUrl = await this.urlResolver.resolve(request);\n ensureFluidResolvedUrl(createNewResolvedUrl);\n // Actually go and create the resolved document\n if (this.service === undefined) {\n this.service = await runWithRetry(\n async () => this.serviceFactory.createContainer(\n summary,\n createNewResolvedUrl,\n this.subLogger,\n ),\n \"containerAttach\",\n (id: string) => this._deltaManager.refreshDelayInfo(id),\n (id: string, delayMs: number, error: any) =>\n this._deltaManager.emitDelayInfo(id, delayMs, error),\n this.logger,\n );\n }\n const resolvedUrl = this.service.resolvedUrl;\n ensureFluidResolvedUrl(resolvedUrl);\n this._resolvedUrl = resolvedUrl;\n await this.connectStorageService();\n\n // upload blobs here (NYI)\n\n // post summary here\n if (hasAttachmentBlobs) {\n const appSummary: ISummaryTree = this.context.createSummary();\n const protocolSummary = this.captureProtocolSummary();\n summary = combineAppAndProtocolSummary(appSummary, protocolSummary);\n\n this._attachState = AttachState.Attaching;\n this.context.notifyAttaching();\n\n await this.storageService.uploadSummaryWithContext(summary, {\n referenceSequenceNumber: 0,\n ackHandle: undefined,\n proposalHandle: undefined,\n });\n\n assert(!hasAttachmentBlobs, 0x206 /* \"attaching container with blobs is not yet implemented\" */);\n }\n\n this._attachState = AttachState.Attached;\n this.emit(\"attached\");\n\n // Propagate current connection state through the system.\n this.propagateConnectionState();\n if (!this.closed) {\n this.resumeInternal({ fetchOpsFromStorage: false, reason: \"createDetached\" });\n }\n } catch(error) {\n this.close(error);\n throw error;\n }\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return PerformanceEvent.timedExecAsync(this.logger, { eventName: \"Request\" }, async () => {\n return this.context.request(path);\n });\n }\n\n public async snapshot(tagMessage: string, fullTree: boolean = false): Promise<void> {\n // Only snapshot once a code quorum has been established\n if (!this.protocolHandler.quorum.has(\"code\") && !this.protocolHandler.quorum.has(\"code2\")) {\n this.logger.sendTelemetryEvent({ eventName: \"SkipSnapshot\" });\n return;\n }\n\n // Stop inbound message processing while we complete the snapshot\n try {\n await this.deltaManager.inbound.pause();\n await this.snapshotCore(tagMessage, fullTree);\n } catch (ex) {\n this.logger.sendErrorEvent({ eventName: \"SnapshotExceptionError\" }, ex);\n throw ex;\n } finally {\n this.deltaManager.inbound.resume();\n }\n }\n\n public setAutoReconnect(reconnect: boolean) {\n if (reconnect && this.closed) {\n throw new Error(\"Attempting to setAutoReconnect() a closed DeltaManager\");\n }\n\n this._deltaManager.setAutomaticReconnect(reconnect);\n\n this.logger.sendTelemetryEvent({\n eventName: reconnect ? \"AutoReconnectEnabled\" : \"AutoReconnectDisabled\",\n connectionMode: this._deltaManager.connectionMode,\n connectionState: ConnectionState[this.connectionState],\n });\n\n // If container state is not attached and resumed, then don't connect to delta stream. Also don't set the\n // manual reconnection flag to true as we haven't made the initial connection yet.\n if (reconnect && this._attachState === AttachState.Attached && this.resumedOpProcessingAfterLoad) {\n if (this.connectionState === ConnectionState.Disconnected) {\n // Only track this as a manual reconnection if we are truly the ones kicking it off.\n this.manualReconnectInProgress = true;\n }\n\n // Ensure connection to web socket\n this.connectToDeltaStream({ reason: \"autoReconnect\" }).catch((error) => {\n // All errors are reported through events (\"error\" / \"disconnected\") and telemetry in DeltaManager\n // So there shouldn't be a need to record error here.\n // But we have number of cases where reconnects do not happen, and no errors are recorded, so\n // adding this log point for easier diagnostics\n this.logger.sendTelemetryEvent({ eventName: \"setAutoReconnectError\" }, error);\n });\n }\n }\n\n public resume() {\n if (!this.closed) {\n // Note: no need to fetch ops as we do it preemptively as part of DeltaManager.attachOpHandler().\n // If there is gap, we will learn about it once connected, but the gap should be small (if any),\n // assuming that resume() is called quickly after initial container boot.\n this.resumeInternal({ reason: \"DocumentOpenResume\", fetchOpsFromStorage: false });\n }\n }\n\n protected resumeInternal(args: IConnectionArgs) {\n assert(!this.closed, 0x0d9 /* \"Attempting to setAutoReconnect() a closed DeltaManager\" */);\n\n // Resume processing ops\n if (!this.resumedOpProcessingAfterLoad) {\n this.resumedOpProcessingAfterLoad = true;\n this._deltaManager.inbound.resume();\n this._deltaManager.inboundSignal.resume();\n }\n\n // Ensure connection to web socket\n // All errors are reported through events (\"error\" / \"disconnected\") and telemetry in DeltaManager\n this.connectToDeltaStream(args).catch(() => { });\n }\n\n /**\n * Raise non-critical error to host. Calling this API will not close container.\n * For critical errors, please call Container.close(error).\n * @param error - an error to raise\n */\n public raiseContainerWarning(warning: ContainerWarning) {\n // Some \"warning\" events come from outside the container and are logged\n // elsewhere (e.g. summarizing container). We shouldn't log these here.\n if (warning.logged !== true) {\n this.logContainerError(warning);\n }\n this.emit(\"warning\", warning);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n if (this.resolvedUrl === undefined) {\n return undefined;\n }\n\n return this.urlResolver.getAbsoluteUrl(\n this.resolvedUrl,\n relativeUrl,\n this._context?.codeDetails);\n }\n\n public async proposeCodeDetails(codeDetails: IFluidCodeDetails) {\n if (!isFluidCodeDetails(codeDetails)) {\n throw new Error(\"Provided codeDetails are not IFluidCodeDetails\");\n }\n\n if (this.codeLoader.IFluidCodeDetailsComparer) {\n const comparision = await this.codeLoader.IFluidCodeDetailsComparer.compare(\n codeDetails,\n this.getCodeDetailsFromQuorum());\n if (comparision !== undefined && comparision <= 0) {\n throw new Error(\"Proposed code details should be greater than the current\");\n }\n }\n\n return this.getQuorum().propose(\"code\", codeDetails)\n .then(()=>true)\n .catch(()=>false);\n }\n\n private async processCodeProposal(): Promise<void> {\n const codeDetails = this.getCodeDetailsFromQuorum();\n\n await Promise.all([\n this.deltaManager.inbound.pause(),\n this.deltaManager.inboundSignal.pause()]);\n\n if ((await this.context.satisfies(codeDetails) === true)) {\n this.deltaManager.inbound.resume();\n this.deltaManager.inboundSignal.resume();\n return;\n }\n\n this.close(new GenericError(\"existingContextDoesNotSatisfyIncomingProposal\"));\n }\n\n private async snapshotCore(tagMessage: string, fullTree: boolean = false) {\n // Snapshots base document state and currently running context\n const root = this.snapshotBase();\n const dataStoreEntries = await this.context.snapshot(tagMessage, fullTree);\n\n // And then combine\n if (dataStoreEntries !== null) {\n root.entries.push(...dataStoreEntries.entries);\n }\n\n // Generate base snapshot message\n const deltaDetails =\n `${this._deltaManager.lastSequenceNumber}:${this._deltaManager.minimumSequenceNumber}`;\n const message = `Commit @${deltaDetails} ${tagMessage}`;\n\n // Pull in the prior version and snapshot tree to store against\n const lastVersion = await this.getVersion(this.id);\n\n const parents = lastVersion !== undefined ? [lastVersion.id] : [];\n\n // Write the full snapshot\n return this.storageService.write(root, parents, message, \"\");\n }\n\n private snapshotBase(): ITree {\n const entries: ITreeEntry[] = [];\n\n const quorumSnapshot = this.protocolHandler.quorum.snapshot();\n entries.push({\n mode: FileMode.File,\n path: \"quorumMembers\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.members),\n encoding: \"utf-8\",\n },\n });\n entries.push({\n mode: FileMode.File,\n path: \"quorumProposals\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.proposals),\n encoding: \"utf-8\",\n },\n });\n entries.push({\n mode: FileMode.File,\n path: \"quorumValues\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(quorumSnapshot.values),\n encoding: \"utf-8\",\n },\n });\n\n // Save attributes for the document\n const documentAttributes = {\n branch: this.id,\n minimumSequenceNumber: this._deltaManager.minimumSequenceNumber,\n sequenceNumber: this._deltaManager.lastSequenceNumber,\n term: this._deltaManager.referenceTerm,\n };\n entries.push({\n mode: FileMode.File,\n path: \".attributes\",\n type: TreeEntry.Blob,\n value: {\n contents: JSON.stringify(documentAttributes),\n encoding: \"utf-8\",\n },\n });\n\n // Output the tree\n const root: ITree = {\n entries,\n };\n\n return root;\n }\n\n private async getVersion(version: string): Promise<IVersion | undefined> {\n const versions = await this.storageService.getVersions(version, 1);\n return versions[0];\n }\n\n private recordConnectStartTime() {\n if (this.connectionTransitionTimes[ConnectionState.Disconnected] === undefined) {\n this.connectionTransitionTimes[ConnectionState.Disconnected] = performance.now();\n }\n }\n\n private async connectToDeltaStream(args: IConnectionArgs) {\n this.recordConnectStartTime();\n\n // All agents need \"write\" access, including summarizer.\n if (!this._canReconnect || !this.client.details.capabilities.interactive) {\n args.mode = \"write\";\n }\n\n return this._deltaManager.connect(args);\n }\n\n /**\n * Load container.\n *\n * @param specifiedVersion - one of the following\n * - undefined - fetch latest snapshot\n * - otherwise, version sha to load snapshot\n */\n private async load(\n specifiedVersion: string | undefined,\n loadMode: IContainerLoadMode,\n pendingLocalState?: unknown,\n ) {\n if (this._resolvedUrl === undefined) {\n throw new Error(\"Attempting to load without a resolved url\");\n }\n this.service = await this.serviceFactory.createDocumentService(this._resolvedUrl, this.subLogger);\n\n let startConnectionP: Promise<IConnectionDetails> | undefined;\n\n // Ideally we always connect as \"read\" by default.\n // Currently that works with SPO & r11s, because we get \"write\" connection when connecting to non-existing file.\n // We should not rely on it by (one of them will address the issue, but we need to address both)\n // 1) switching create new flow to one where we create file by posting snapshot\n // 2) Fixing quorum workflows (have retry logic)\n // That all said, \"read\" does not work with memorylicious workflows (that opens two simultaneous\n // connections to same file) in two ways:\n // A) creation flow breaks (as one of the clients \"sees\" file as existing, and hits #2 above)\n // B) Once file is created, transition from view-only connection to write does not work - some bugs to be fixed.\n const connectionArgs: IConnectionArgs = { reason: \"DocumentOpen\", mode: \"write\", fetchOpsFromStorage: false };\n\n // Start websocket connection as soon as possible. Note that there is no op handler attached yet, but the\n // DeltaManager is resilient to this and will wait to start processing ops until after it is attached.\n if (loadMode.deltaConnection === undefined) {\n startConnectionP = this.connectToDeltaStream(connectionArgs);\n startConnectionP.catch((error) => { });\n }\n\n await this.connectStorageService();\n this._attachState = AttachState.Attached;\n\n // Fetch specified snapshot.\n const { snapshot, versionId } = await this.fetchSnapshotTree(specifiedVersion);\n assert(snapshot !== undefined, 0x237 /* \"Snapshot should exist\" */);\n\n const attributes = await this.getDocumentAttributes(this.storageService, snapshot);\n\n // Attach op handlers to start processing ops\n this.attachDeltaManagerOpHandler(attributes);\n\n // ...load in the existing quorum\n // Initialize the protocol handler\n const protocolHandlerP =\n this.loadAndInitializeProtocolState(attributes, this.storageService, snapshot);\n\n let opsBeforeReturnP: Promise<void> | undefined;\n\n // Initialize document details - if loading a snapshot use that - otherwise we need to wait on\n // the initial details\n switch (loadMode.opsBeforeReturn) {\n case undefined:\n if (loadMode.deltaConnection !== \"none\") {\n // Start prefetch, but not set opsBeforeReturnP - boot is not blocked by it!\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._deltaManager.preFetchOps(false);\n }\n break;\n case \"cached\":\n opsBeforeReturnP = this._deltaManager.preFetchOps(true);\n // Keep going with fetching ops from storage once we have all cached ops in.\n // Ops processing will start once cached ops are in and and will stop when queue is empty\n // (which in most cases will happen when we are done processing cached ops)\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n opsBeforeReturnP.then(async () => this._deltaManager.preFetchOps(false));\n break;\n case \"all\":\n opsBeforeReturnP = this._deltaManager.preFetchOps(false);\n break;\n default:\n unreachableCase(loadMode.opsBeforeReturn);\n }\n\n this._protocolHandler = await protocolHandlerP;\n\n const codeDetails = this.getCodeDetailsFromQuorum();\n await this.instantiateContext(\n true, // existing\n codeDetails,\n snapshot,\n pendingLocalState,\n );\n\n // Propagate current connection state through the system.\n this.propagateConnectionState();\n\n // Internal context is fully loaded at this point\n this.loaded = true;\n\n // We might have hit some failure that did not manifest itself in exception in this flow,\n // do not start op processing in such case - static version of Container.load() will handle it correctly.\n if (!this.closed) {\n if (opsBeforeReturnP !== undefined) {\n this._deltaManager.inbound.resume();\n\n await opsBeforeReturnP;\n await this._deltaManager.inbound.waitTillProcessingDone();\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._deltaManager.inbound.pause();\n }\n\n switch (loadMode.deltaConnection) {\n case undefined:\n this.resume();\n break;\n case \"delayed\":\n this.resumedOpProcessingAfterLoad = true;\n this._deltaManager.inbound.resume();\n this._deltaManager.inboundSignal.resume();\n break;\n case \"none\":\n break;\n default:\n unreachableCase(loadMode.deltaConnection);\n }\n }\n\n // Safety net: static version of Container.load() should have learned about it through \"closed\" handler.\n // But if that did not happen for some reason, fail load for sure.\n // Otherwise we can get into situations where container is closed and does not try to connect to ordering\n // service, but caller does not know that (callers do expect container to be not closed on successful path\n // and listen only on \"closed\" event)\n if (this.closed) {\n throw new Error(\"Container was closed while load()\");\n }\n\n return {\n sequenceNumber: attributes.sequenceNumber,\n version: versionId,\n };\n }\n\n private async createDetached(source: IFluidCodeDetails) {\n const attributes: IDocumentAttributes = {\n branch: \"\",\n sequenceNumber: detachedContainerRefSeqNumber,\n term: 1,\n minimumSequenceNumber: 0,\n };\n\n // Seed the base quorum to be an empty list with a code quorum set\n const committedCodeProposal: ICommittedProposal = {\n key: \"code\",\n value: source,\n approvalSequenceNumber: 0,\n commitSequenceNumber: 0,\n sequenceNumber: 0,\n };\n\n const members: [string, ISequencedClient][] = [];\n const proposals: [number, ISequencedProposal, string[]][] = [];\n const values: [string, ICommittedProposal][] = [[\"code\", committedCodeProposal]];\n\n this.attachDeltaManagerOpHandler(attributes);\n\n // Need to just seed the source data in the code quorum. Quorum itself is empty\n this._protocolHandler = await this.initializeProtocolState(\n attributes,\n members,\n proposals,\n values);\n\n // The load context - given we seeded the quorum - will be great\n await this.instantiateContextDetached(\n false, // existing\n );\n\n this.propagateConnectionState();\n\n this.loaded = true;\n }\n\n private async rehydrateDetachedFromSnapshot(detachedContainerSnapshot: ISummaryTree) {\n const snapshotTree = getSnapshotTreeFromSerializedContainer(detachedContainerSnapshot);\n this._storage.loadSnapshotForRehydratingContainer(snapshotTree);\n const attributes = await this.getDocumentAttributes(this._storage, snapshotTree);\n assert(attributes.sequenceNumber === 0, 0x0db /* \"Seq number in detached container should be 0!!\" */);\n this.attachDeltaManagerOpHandler(attributes);\n\n // ...load in the existing quorum\n // Initialize the protocol handler\n this._protocolHandler =\n await this.loadAndInitializeProtocolState(attributes, this._storage, snapshotTree);\n\n await this.instantiateContextDetached(\n true, // existing\n snapshotTree,\n );\n\n this.loaded = true;\n\n this.propagateConnectionState();\n }\n\n private async connectStorageService(): Promise<void> {\n if (this._storageService !== undefined) {\n return;\n }\n\n assert(this.service !== undefined, 0x1ef /* \"services must be defined\" */);\n const storageService = await this.service.connectToStorage();\n\n this._storageService =\n new RetriableDocumentStorageService(storageService, this._deltaManager, this.logger);\n\n if(this.options.summarizeProtocolTree === true) {\n this._storageService =\n new ProtocolTreeStorageService(this._storageService, ()=>this.captureProtocolSummary());\n }\n\n // ensure we did not lose that policy in the process of wrapping\n assert(storageService.policies?.minBlobSize === this.storageService.policies?.minBlobSize,\n 0x0e0 /* \"lost minBlobSize policy\" */);\n }\n\n private async getDocumentAttributes(\n storage: IDocumentStorageService,\n tree: ISnapshotTree | undefined,\n ): Promise<IDocumentAttributes> {\n if (tree === undefined) {\n return {\n branch: this.id,\n minimumSequenceNumber: 0,\n sequenceNumber: 0,\n term: 1,\n };\n }\n\n // Backward compatibility: old docs would have \".attributes\" instead of \"attributes\"\n const attributesHash = \".protocol\" in tree.trees\n ? tree.trees[\".protocol\"].blobs.attributes\n : tree.blobs[\".attributes\"];\n\n const attributes = await readAndParse<IDocumentAttributes>(storage, attributesHash);\n\n // Backward compatibility for older summaries with no term\n if (attributes.term === undefined) {\n attributes.term = 1;\n }\n\n return attributes;\n }\n\n private async loadAndInitializeProtocolState(\n attributes: IDocumentAttributes,\n storage: IDocumentStorageService,\n snapshot: ISnapshotTree | undefined,\n ): Promise<ProtocolOpHandler> {\n let members: [string, ISequencedClient][] = [];\n let proposals: [number, ISequencedProposal, string[]][] = [];\n let values: [string, any][] = [];\n\n if (snapshot !== undefined) {\n const baseTree = \".protocol\" in snapshot.trees ? snapshot.trees[\".protocol\"] : snapshot;\n [members, proposals, values] = await Promise.all([\n readAndParse<[string, ISequencedClient][]>(storage, baseTree.blobs.quorumMembers),\n readAndParse<[number, ISequencedProposal, string[]][]>(storage, baseTree.blobs.quorumProposals),\n readAndParse<[string, ICommittedProposal][]>(storage, baseTree.blobs.quorumValues),\n ]);\n }\n\n const protocolHandler = await this.initializeProtocolState(\n attributes,\n members,\n proposals,\n values);\n\n return protocolHandler;\n }\n\n private async initializeProtocolState(\n attributes: IDocumentAttributes,\n members: [string, ISequencedClient][],\n proposals: [number, ISequencedProposal, string[]][],\n values: [string, any][],\n ): Promise<ProtocolOpHandler> {\n const protocol = new ProtocolOpHandler(\n attributes.minimumSequenceNumber,\n attributes.sequenceNumber,\n attributes.term,\n members,\n proposals,\n values,\n (key, value) => this.submitMessage(MessageType.Propose, { key, value }),\n (sequenceNumber) => this.submitMessage(MessageType.Reject, sequenceNumber));\n\n const protocolLogger = ChildLogger.create(this.subLogger, \"ProtocolHandler\");\n\n protocol.quorum.on(\"error\", (error) => {\n protocolLogger.sendErrorEvent(error);\n });\n\n // Track membership changes and update connection state accordingly\n protocol.quorum.on(\"addMember\", (clientId, details) => {\n this.connectionStateHandler.receivedAddMemberEvent(clientId);\n });\n\n protocol.quorum.on(\"removeMember\", (clientId) => {\n this.connectionStateHandler.receivedRemoveMemberEvent(clientId);\n });\n\n protocol.quorum.on(\"addProposal\", (proposal: IPendingProposal) => {\n if (proposal.key === \"code\" || proposal.key === \"code2\") {\n this.emit(\"codeDetailsProposed\", proposal.value, proposal);\n }\n });\n\n protocol.quorum.on(\n \"approveProposal\",\n (sequenceNumber, key, value) => {\n if (key === \"code\" || key === \"code2\") {\n if (!isFluidCodeDetails(value)) {\n this.logger.sendErrorEvent({\n eventName: \"CodeProposalNotIFluidCodeDetails\",\n });\n }\n this.processCodeProposal().catch((error) => {\n this.close(normalizeError(error));\n throw error;\n });\n }\n });\n\n return protocol;\n }\n\n private captureProtocolSummary(): ISummaryTree {\n const quorumSnapshot = this.protocolHandler.quorum.snapshot();\n\n // Save attributes for the document\n const documentAttributes: IDocumentAttributes = {\n branch: this.id,\n minimumSequenceNumber: this.protocolHandler.minimumSequenceNumber,\n sequenceNumber: this.protocolHandler.sequenceNumber,\n term: this.protocolHandler.term,\n };\n\n const summary: ISummaryTree = {\n tree: {\n attributes: {\n content: JSON.stringify(documentAttributes),\n type: SummaryType.Blob,\n },\n quorumMembers: {\n content: JSON.stringify(quorumSnapshot.members),\n type: SummaryType.Blob,\n },\n quorumProposals: {\n content: JSON.stringify(quorumSnapshot.proposals),\n type: SummaryType.Blob,\n },\n quorumValues: {\n content: JSON.stringify(quorumSnapshot.values),\n type: SummaryType.Blob,\n },\n },\n type: SummaryType.Tree,\n };\n\n return summary;\n }\n\n private getCodeDetailsFromQuorum(): IFluidCodeDetails {\n const quorum = this.protocolHandler.quorum;\n\n const pkg = getCodeProposal(quorum);\n\n return pkg as IFluidCodeDetails;\n }\n\n private get client(): IClient {\n const client: IClient = this.options?.client !== undefined\n ? (this.options.client as IClient)\n : {\n details: {\n capabilities: { interactive: true },\n },\n mode: \"read\", // default reconnection mode on lost connection / connection error\n permission: [],\n scopes: [],\n user: { id: \"\" },\n };\n\n if (this.clientDetailsOverride !== undefined) {\n merge(client.details, this.clientDetailsOverride);\n }\n\n return client;\n }\n\n /**\n * Returns true if connection is active, i.e. it's \"write\" connection and\n * container runtime was notified about this connection (i.e. we are up-to-date and could send ops).\n * This happens after client received its own joinOp and thus is in the quorum.\n * If it's not true, runtime is not in position to send ops.\n */\n private activeConnection() {\n return this.connectionState === ConnectionState.Connected && this._deltaManager.connectionMode === \"write\";\n }\n\n private createDeltaManager() {\n const deltaManager: DeltaManager = new DeltaManager(\n () => this.service,\n this.client,\n ChildLogger.create(this.subLogger, \"DeltaManager\"),\n this._canReconnect,\n () => this.activeConnection(),\n );\n\n // Disable inbound queues as Container is not ready to accept any ops until we are fully loaded!\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaManager.inbound.pause();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaManager.inboundSignal.pause();\n\n deltaManager.on(\"connect\", (details: IConnectionDetails, opsBehind?: number) => {\n this.connectionStateHandler.receivedConnectEvent(\n this._deltaManager.connectionMode,\n details,\n opsBehind,\n );\n\n // Back-compat for new client and old server.\n this._audience.clear();\n\n for (const priorClient of details.initialClients ?? []) {\n this._audience.addMember(priorClient.clientId, priorClient.client);\n }\n });\n\n deltaManager.on(\"disconnect\", (reason: string) => {\n this.manualReconnectInProgress = false;\n this.collabWindowTracker.stopSequenceNumberUpdate();\n this.connectionStateHandler.receivedDisconnectEvent(reason);\n });\n\n deltaManager.on(\"throttled\", (warning: IThrottlingWarning) => {\n this.raiseContainerWarning(warning);\n });\n\n deltaManager.on(\"readonly\", (readonly) => {\n this.emit(\"readonly\", readonly);\n });\n\n deltaManager.on(\"closed\", (error?: ICriticalContainerError) => {\n this.close(error);\n });\n\n return deltaManager;\n }\n\n private attachDeltaManagerOpHandler(attributes: IDocumentAttributes): void {\n this._deltaManager.attachOpHandler(\n attributes.minimumSequenceNumber,\n attributes.sequenceNumber,\n attributes.term ?? 1,\n {\n process: (message) => this.processRemoteMessage(message),\n processSignal: (message) => {\n this.processSignal(message);\n },\n });\n }\n\n private logConnectionStateChangeTelemetry(\n value: ConnectionState,\n oldState: ConnectionState,\n reason?: string,\n ) {\n // Log actual event\n const time = performance.now();\n this.connectionTransitionTimes[value] = time;\n const duration = time - this.connectionTransitionTimes[oldState];\n\n let durationFromDisconnected: number | undefined;\n let connectionInitiationReason: string | undefined;\n let autoReconnect: ReconnectMode | undefined;\n let checkpointSequenceNumber: number | undefined;\n let opsBehind: number | undefined;\n if (value === ConnectionState.Disconnected) {\n autoReconnect = this._deltaManager.reconnectMode;\n } else {\n if (value === ConnectionState.Connected) {\n durationFromDisconnected = time - this.connectionTransitionTimes[ConnectionState.Disconnected];\n durationFromDisconnected = TelemetryLogger.formatTick(durationFromDisconnected);\n } else {\n // This info is of most interest on establishing connection only.\n checkpointSequenceNumber = this.deltaManager.lastKnownSeqNumber;\n if (this.deltaManager.hasCheckpointSequenceNumber) {\n opsBehind = checkpointSequenceNumber - this.deltaManager.lastSequenceNumber;\n }\n }\n if (this.firstConnection) {\n connectionInitiationReason = \"InitialConnect\";\n } else if (this.manualReconnectInProgress) {\n connectionInitiationReason = \"ManualReconnect\";\n } else {\n connectionInitiationReason = \"AutoReconnect\";\n }\n }\n\n this.logger.sendPerformanceEvent({\n eventName: `ConnectionStateChange_${ConnectionState[value]}`,\n from: ConnectionState[oldState],\n duration,\n durationFromDisconnected,\n reason,\n connectionInitiationReason,\n socketDocumentId: this._deltaManager.socketDocumentId,\n pendingClientId: this.connectionStateHandler.pendingClientId,\n clientId: this.clientId,\n autoReconnect,\n opsBehind,\n online: OnlineStatus[isOnline()],\n lastVisible: this.lastVisible !== undefined ? performance.now() - this.lastVisible : undefined,\n checkpointSequenceNumber,\n ...this._deltaManager.connectionProps(),\n });\n\n if (value === ConnectionState.Connected) {\n this.firstConnection = false;\n this.manualReconnectInProgress = false;\n }\n }\n\n private propagateConnectionState() {\n const logOpsOnReconnect: boolean =\n this.connectionState === ConnectionState.Connected &&\n !this.firstConnection &&\n this._deltaManager.connectionMode === \"write\";\n if (logOpsOnReconnect) {\n this.messageCountAfterDisconnection = 0;\n }\n\n const state = this.connectionState === ConnectionState.Connected;\n if (!this.context.disposed) {\n this.context.setConnectionState(state, this.clientId);\n }\n assert(this.protocolHandler !== undefined, 0x0dc /* \"Protocol handler should be set here\" */);\n this.protocolHandler.quorum.setConnectionState(state, this.clientId);\n raiseConnectedEvent(this.logger, this, state, this.clientId);\n\n if (logOpsOnReconnect) {\n this.logger.sendTelemetryEvent(\n { eventName: \"OpsSentOnReconnect\", count: this.messageCountAfterDisconnection });\n }\n }\n\n private submitContainerMessage(type: MessageType, contents: any, batch?: boolean, metadata?: any): number {\n const outboundMessageType: string = type;\n switch (outboundMessageType) {\n case MessageType.Operation:\n case MessageType.RemoteHelp:\n break;\n case MessageType.Summarize: {\n // github #6451: this is only needed for staging so the server\n // know when the protocol tree is included\n // this can be removed once all clients send\n // protocol tree by default\n const summary = contents as ISummaryContent;\n if(summary.details === undefined) {\n summary.details = {};\n }\n summary.details.includesProtocolTree =\n this.options.summarizeProtocolTree === true;\n break;\n }\n default:\n this.close(new GenericError(\"invalidContainerSubmitOpType\",\n undefined /* error */,\n { messageType: type }));\n return -1;\n }\n return this.submitMessage(type, contents, batch, metadata);\n }\n\n private submitMessage(type: MessageType, contents: any, batch?: boolean, metadata?: any): number {\n if (this.connectionState !== ConnectionState.Connected) {\n this.logger.sendErrorEvent({ eventName: \"SubmitMessageWithNoConnection\", type });\n return -1;\n }\n\n this.messageCountAfterDisconnection += 1;\n this.collabWindowTracker.stopSequenceNumberUpdate();\n return this._deltaManager.submit(type, contents, batch, metadata);\n }\n\n private processRemoteMessage(message: ISequencedDocumentMessage): IProcessMessageResult {\n // Check and report if we're getting messages from a clientId that we previously\n // flagged as shouldHaveLeft, or from a client that's not in the quorum but should be\n if (message.clientId != null) {\n let errorMsg: string | undefined;\n const client: ILocalSequencedClient | undefined =\n this.getQuorum().getMember(message.clientId);\n if (client === undefined && message.type !== MessageType.ClientJoin) {\n errorMsg = \"messageClientIdMissingFromQuorum\";\n } else if (client?.shouldHaveLeft === true && message.type !== MessageType.NoOp) {\n errorMsg = \"messageClientIdShouldHaveLeft\";\n }\n if (errorMsg !== undefined) {\n const error = new DataCorruptionError(\n errorMsg,\n extractSafePropertiesFromMessage(message));\n this.close(normalizeError(error));\n }\n }\n\n const local = this.clientId === message.clientId;\n\n // Forward non system messages to the loaded runtime for processing\n if (!isSystemMessage(message)) {\n this.context.process(message, local, undefined);\n }\n\n // Allow the protocol handler to process the message\n const result = this.protocolHandler.processMessage(message, local);\n this.collabWindowTracker.scheduleSequenceNumberUpdate(message, result.immediateNoOp === true);\n\n this.emit(\"op\", message);\n\n return result;\n }\n\n private submitSignal(message: any) {\n this._deltaManager.submitSignal(JSON.stringify(message));\n }\n\n private processSignal(message: ISignalMessage) {\n // No clientId indicates a system signal message.\n if (message.clientId === null) {\n const innerContent = message.content as { content: any; type: string };\n if (innerContent.type === MessageType.ClientJoin) {\n const newClient = innerContent.content as ISignalClient;\n this._audience.addMember(newClient.clientId, newClient.client);\n } else if (innerContent.type === MessageType.ClientLeave) {\n const leftClientId = innerContent.content as string;\n this._audience.removeMember(leftClientId);\n }\n } else {\n const local = this.clientId === message.clientId;\n this.context.processSignal(message, local);\n }\n }\n\n /**\n * Get the most recent snapshot, or a specific version.\n * @param specifiedVersion - The specific version of the snapshot to retrieve\n * @returns The snapshot requested, or the latest snapshot if no version was specified, plus version ID\n */\n private async fetchSnapshotTree(specifiedVersion: string | undefined):\n Promise<{snapshot?: ISnapshotTree; versionId?: string}>\n {\n const version = await this.getVersion(specifiedVersion ?? this.id);\n\n if (version === undefined && specifiedVersion !== undefined) {\n // We should have a defined version to load from if specified version requested\n this.logger.sendErrorEvent({ eventName: \"NoVersionFoundWhenSpecified\", id: specifiedVersion });\n }\n this._loadedFromVersion = version;\n const snapshot = await this.storageService.getSnapshotTree(version) ?? undefined;\n\n if (snapshot === undefined && version !== undefined) {\n this.logger.sendErrorEvent({ eventName: \"getSnapshotTreeFailed\", id: version.id });\n }\n return { snapshot, versionId: version?.id };\n }\n\n private async instantiateContextDetached(\n existing: boolean,\n snapshot?: ISnapshotTree,\n pendingLocalState?: unknown,\n ) {\n const codeDetails = this.getCodeDetailsFromQuorum();\n if (codeDetails === undefined) {\n throw new Error(\"pkg should be provided in create flow!!\");\n }\n\n await this.instantiateContext(\n existing,\n codeDetails,\n snapshot,\n pendingLocalState,\n );\n }\n\n private async instantiateContext(\n existing: boolean,\n codeDetails: IFluidCodeDetails,\n snapshot?: ISnapshotTree,\n pendingLocalState?: unknown,\n ) {\n assert(this._context?.disposed !== false, 0x0dd /* \"Existing context not disposed\" */);\n // If this assert fires, our state tracking is likely not synchronized between COntainer & runtime.\n if (this._dirtyContainer) {\n this.logger.sendErrorEvent({ eventName: \"DirtyContainerReloadContainer\" });\n }\n\n // The relative loader will proxy requests to '/' to the loader itself assuming no non-cache flags\n // are set. Global requests will still go directly to the loader\n const loader = new RelativeLoader(this, this.loader);\n this._context = await ContainerContext.createOrLoad(\n this,\n this.scope,\n this.codeLoader,\n codeDetails,\n snapshot,\n new DeltaManagerProxy(this._deltaManager),\n new QuorumProxy(this.protocolHandler.quorum),\n loader,\n (warning: ContainerWarning) => this.raiseContainerWarning(warning),\n (type, contents, batch, metadata) => this.submitContainerMessage(type, contents, batch, metadata),\n (message) => this.submitSignal(message),\n (error?: ICriticalContainerError) => this.close(error),\n Container.version,\n (dirty: boolean) => {\n this._dirtyContainer = dirty;\n this.emit(dirty ? dirtyContainerEvent : savedContainerEvent);\n },\n existing,\n pendingLocalState,\n );\n\n this.emit(\"contextChanged\", codeDetails);\n }\n\n // Please avoid calling it directly.\n // raiseContainerWarning() is the right flow for most cases\n private logContainerError(warning: ContainerWarning) {\n this.logger.sendErrorEvent({ eventName: \"ContainerWarning\" }, warning);\n }\n}\n"]}
@@ -125,6 +125,11 @@ export declare class DeltaManager extends TypedEventEmitter<IDeltaManagerInterna
125
125
  */
126
126
  get reconnectMode(): ReconnectMode;
127
127
  shouldJoinWrite(): boolean;
128
+ /**
129
+ * Returns set of props that can be logged in telemetry that provide some insights / statistics
130
+ * about current or last connection (if there is no connection at the moment)
131
+ */
132
+ connectionProps(): ITelemetryProperties;
128
133
  /**
129
134
  * Enables or disables automatic reconnecting.
130
135
  * Will throw an error if reconnectMode set to Never.
@@ -1 +1 @@
1
- {"version":3,"file":"deltaManager.d.ts","sourceRoot":"","sources":["../src/deltaManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deltaManager.d.ts","sourceRoot":"","sources":["../src/deltaManager.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ function getNackReconnectInfo(nackContent) {
27
27
  const retryAfterMs = nackContent.retryAfter !== undefined ? nackContent.retryAfter * 1000 : undefined;
28
28
  return driver_utils_1.createGenericNetworkError(reason, canRetry, retryAfterMs, { statusCode: nackContent.code });
29
29
  }
30
- const createReconnectError = (prefix, err) => container_utils_1.wrapError(err, (errorMessage) => driver_utils_1.createGenericNetworkError(`${prefix}: ${errorMessage}`, true /* canRetry */));
30
+ const createReconnectError = (prefix, err) => container_utils_1.wrapError(err, (errorMessage) => new driver_utils_1.GenericNetworkError(`${prefix}: ${errorMessage}`, true /* canRetry */));
31
31
  var ReconnectMode;
32
32
  (function (ReconnectMode) {
33
33
  ReconnectMode["Never"] = "Never";
@@ -185,7 +185,7 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
185
185
  this.connection.submit(messages);
186
186
  });
187
187
  this._outbound.on("error", (error) => {
188
- this.close(container_utils_1.CreateContainerError(error));
188
+ this.close(telemetry_utils_1.normalizeError(error));
189
189
  });
190
190
  // Inbound signal queue
191
191
  this._inboundSignal = new deltaQueue_1.DeltaQueue((message) => {
@@ -198,7 +198,7 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
198
198
  });
199
199
  });
200
200
  this._inboundSignal.on("error", (error) => {
201
- this.close(container_utils_1.CreateContainerError(error));
201
+ this.close(telemetry_utils_1.normalizeError(error));
202
202
  });
203
203
  // Initially, all queues are created paused.
204
204
  // - outbound is flipped back and forth in setupNewSuccessfulConnection / disconnectFromDeltaStream
@@ -322,6 +322,24 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
322
322
  // We don't have to wait for ack for topmost NoOps. So subtract those.
323
323
  return this.clientSequenceNumberObserved < (this.clientSequenceNumber - this.trailingNoopCount);
324
324
  }
325
+ /**
326
+ * Returns set of props that can be logged in telemetry that provide some insights / statistics
327
+ * about current or last connection (if there is no connection at the moment)
328
+ */
329
+ connectionProps() {
330
+ if (this.connection !== undefined) {
331
+ return {
332
+ sequenceNumber: this.lastSequenceNumber,
333
+ connectionMode: this.connectionMode,
334
+ };
335
+ }
336
+ else {
337
+ return {
338
+ // Report how many ops this client sent in last disconnected session
339
+ sentOps: this.clientSequenceNumber,
340
+ };
341
+ }
342
+ }
325
343
  /**
326
344
  * Enables or disables automatic reconnecting.
327
345
  * Will throw an error if reconnectMode set to Never.
@@ -531,7 +549,7 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
531
549
  }
532
550
  // Socket.io error when we connect to wrong socket, or hit some multiplexing bug
533
551
  if (!driver_utils_1.canRetryOnError(origError)) {
534
- const error = container_utils_1.CreateContainerError(origError);
552
+ const error = telemetry_utils_1.normalizeError(origError);
535
553
  this.close(error);
536
554
  // eslint-disable-next-line @typescript-eslint/no-throw-literal
537
555
  throw error;
@@ -606,7 +624,7 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
606
624
  var _a, _b;
607
625
  if (this.readonly === true) {
608
626
  common_utils_1.assert(this.readOnlyInfo.readonly === true, 0x1f0 /* "Unexpected mismatch in readonly" */);
609
- const error = container_utils_1.CreateContainerError("Op is sent in read-only document state", {
627
+ const error = new container_utils_1.GenericError("deltaManagerReadonlySubmit", undefined /* error */, {
610
628
  readonly: this.readOnlyInfo.readonly,
611
629
  forcedReadonly: this.readOnlyInfo.forced,
612
630
  readonlyPermissions: this.readOnlyInfo.permissions,
@@ -774,7 +792,7 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
774
792
  this.throttlingIdSet.add(id);
775
793
  if (delayMs > 0 && (timeNow + delayMs > this.timeTillThrottling)) {
776
794
  this.timeTillThrottling = timeNow + delayMs;
777
- const throttlingWarning = container_utils_1.ThrottlingWarning.wrap(error, "Service busy/throttled", delayMs / 1000 /* retryAfterSeconds */);
795
+ const throttlingWarning = container_utils_1.ThrottlingWarning.wrap(error, "Service busy/throttled", delayMs / 1000 /* retryAfterSeconds */, this.logger);
778
796
  this.emit("throttled", throttlingWarning);
779
797
  }
780
798
  }
@@ -876,8 +894,8 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
876
894
  }
877
895
  // we do not know the gap, and we will not learn about it if socket is quite - have to ask.
878
896
  }
879
- else if (connection.mode !== "write") {
880
- this.fetchMissingDeltas("AfterConnection", this.lastQueuedSequenceNumber);
897
+ else if (connection.mode === "read") {
898
+ this.fetchMissingDeltas("AfterReadConnection", this.lastQueuedSequenceNumber);
881
899
  }
882
900
  }
883
901
  else {
@@ -1169,7 +1187,7 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
1169
1187
  }
1170
1188
  catch (error) {
1171
1189
  this.logger.sendErrorEvent({ eventName: "GetDeltas_Exception" }, error);
1172
- this.close(container_utils_1.CreateContainerError(error));
1190
+ this.close(telemetry_utils_1.normalizeError(error));
1173
1191
  }
1174
1192
  finally {
1175
1193
  this.refreshDelayInfo(this.deltaStorageDelayId);
@@ -1 +1 @@
1
- {"version":3,"file":"deltaManager.js","sourceRoot":"","sources":["../src/deltaManager.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 { default as AbortController } from \"abort-controller\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n IDisposable,\n ITelemetryLogger,\n IEventProvider,\n ITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport {\n IConnectionDetails,\n IDeltaHandlerStrategy,\n IDeltaManager,\n IDeltaManagerEvents,\n IDeltaQueue,\n ICriticalContainerError,\n IThrottlingWarning,\n ReadOnlyInfo,\n} from \"@fluidframework/container-definitions\";\nimport { assert, performance, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { TelemetryLogger, safeRaiseEvent, logIfFalse } from \"@fluidframework/telemetry-utils\";\nimport {\n IDocumentDeltaStorageService,\n IDocumentService,\n IDocumentDeltaConnection,\n IDocumentDeltaConnectionEvents,\n DriverError,\n DriverErrorType,\n} from \"@fluidframework/driver-definitions\";\nimport { isSystemMessage } from \"@fluidframework/protocol-base\";\nimport {\n ConnectionMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n INack,\n INackContent,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n ITrace,\n MessageType,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n canRetryOnError,\n createWriteError,\n createGenericNetworkError,\n getRetryDelayFromError,\n logNetworkFailure,\n waitForConnectedState,\n NonRetryableError,\n DeltaStreamConnectionForbiddenError,\n} from \"@fluidframework/driver-utils\";\nimport {\n ThrottlingWarning,\n CreateContainerError,\n CreateProcessingError,\n DataCorruptionError,\n wrapError,\n} from \"@fluidframework/container-utils\";\nimport { DeltaQueue } from \"./deltaQueue\";\n\nconst MaxReconnectDelayInMs = 8000;\nconst InitialReconnectDelayInMs = 1000;\nconst DefaultChunkSize = 16 * 1024;\n\nfunction getNackReconnectInfo(nackContent: INackContent) {\n const reason = `Nack: ${nackContent.message}`;\n const canRetry = nackContent.code !== 403;\n const retryAfterMs = nackContent.retryAfter !== undefined ? nackContent.retryAfter * 1000 : undefined;\n return createGenericNetworkError(reason, canRetry, retryAfterMs, { statusCode: nackContent.code });\n}\n\nconst createReconnectError = (prefix: string, err: any) =>\n wrapError(\n err,\n (errorMessage: string) => createGenericNetworkError(`${prefix}: ${errorMessage}`, true /* canRetry */),\n );\n\nexport interface IConnectionArgs {\n mode?: ConnectionMode;\n fetchOpsFromStorage?: boolean;\n reason: string;\n}\n\nexport enum ReconnectMode {\n Never = \"Never\",\n Disabled = \"Disabled\",\n Enabled = \"Enabled\",\n}\n\n/**\n * Includes events emitted by the concrete implementation DeltaManager\n * but not exposed on the public interface IDeltaManager\n */\nexport interface IDeltaManagerInternalEvents extends IDeltaManagerEvents {\n (event: \"throttled\", listener: (error: IThrottlingWarning) => void);\n (event: \"closed\", listener: (error?: ICriticalContainerError) => void);\n}\n\n/**\n * Implementation of IDocumentDeltaConnection that does not support submitting\n * or receiving ops. Used in storage-only mode.\n */\nclass NoDeltaStream\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable\n{\n clientId: string = \"storage-only client\";\n claims: ITokenClaims = {\n scopes: [ScopeType.DocRead],\n } as any;\n mode: ConnectionMode = \"read\";\n existing: boolean = true;\n maxMessageSize: number = 0;\n version: string = \"\";\n initialMessages: ISequencedDocumentMessage[] = [];\n initialSignals: ISignalMessage[] = [];\n initialClients: ISignalClient[] = [];\n serviceConfiguration: IClientConfiguration = undefined as any;\n checkpointSequenceNumber?: number | undefined = undefined;\n submit(messages: IDocumentMessage[]): void {\n this.emit(\"nack\", this.clientId, messages.map((operation) => {\n return {\n operation,\n content: { message: \"Cannot submit with storage-only connection\", code: 403 },\n };\n }));\n }\n submitSignal(message: any): void {\n this.emit(\"nack\", this.clientId, {\n operation: message,\n content: { message: \"Cannot submit signal with storage-only connection\", code: 403 },\n });\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n\n // back-compat: became @deprecated in 0.45 / driver-definitions 0.40\n public close(): void { this.dispose(); }\n}\n\n/**\n * Manages the flow of both inbound and outbound messages. This class ensures that shared objects receive delta\n * messages in order regardless of possible network conditions or timings causing out of order delivery.\n */\nexport class DeltaManager\n extends TypedEventEmitter<IDeltaManagerInternalEvents>\n implements\n IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n IEventProvider<IDeltaManagerInternalEvents>\n{\n public get active(): boolean { return this._active(); }\n\n public get disposed() { return this.closed; }\n\n public readonly clientDetails: IClientDetails;\n public get IDeltaSender() { return this; }\n\n /**\n * Controls whether the DeltaManager will automatically reconnect to the delta stream after receiving a disconnect.\n */\n private _reconnectMode: ReconnectMode;\n\n // file ACL - whether user has only read-only access to a file\n private _readonlyPermissions: boolean | undefined;\n\n // tracks host requiring read-only mode.\n private _forceReadonly = false;\n\n // Connection mode used when reconnecting on error or disconnect.\n private readonly defaultReconnectionMode: ConnectionMode;\n\n private pending: ISequencedDocumentMessage[] = [];\n private fetchReason: string | undefined;\n\n // The minimum sequence number and last sequence number received from the server\n private minSequenceNumber: number = 0;\n\n // There are three numbers we track\n // * lastQueuedSequenceNumber is the last queued sequence number. If there are gaps in seq numbers, then this number\n // is not updated until we cover that gap, so it increases each time by 1.\n // * lastObservedSeqNumber is an estimation of last known sequence number for container in storage. It's initially\n // populated at web socket connection time (if storage provides that info) and is updated once ops shows up.\n // It's never less than lastQueuedSequenceNumber\n // * lastProcessedSequenceNumber - last processed sequence number\n private lastQueuedSequenceNumber: number = 0;\n private lastObservedSeqNumber: number = 0;\n private lastProcessedSequenceNumber: number = 0;\n private lastProcessedMessage: ISequencedDocumentMessage | undefined;\n private baseTerm: number = 0;\n\n private prevEnqueueMessagesReason: string | undefined;\n private previouslyProcessedMessage: ISequencedDocumentMessage | undefined;\n\n // The sequence number we initially loaded from\n private initSequenceNumber: number = 0;\n\n private readonly _inbound: DeltaQueue<ISequencedDocumentMessage>;\n private readonly _inboundSignal: DeltaQueue<ISignalMessage>;\n private readonly _outbound: DeltaQueue<IDocumentMessage[]>;\n\n private connectionP: Promise<IDocumentDeltaConnection> | undefined;\n private connection: IDocumentDeltaConnection | undefined;\n private clientSequenceNumber = 0;\n private clientSequenceNumberObserved = 0;\n // Counts the number of noops sent by the client which may not be acked.\n private trailingNoopCount = 0;\n private closed = false;\n private readonly deltaStreamDelayId = uuid();\n private readonly deltaStorageDelayId = uuid();\n\n // track clientId used last time when we sent any ops\n private lastSubmittedClientId: string | undefined;\n\n private handler: IDeltaHandlerStrategy | undefined;\n private deltaStorage: IDocumentDeltaStorageService | undefined;\n\n private messageBuffer: IDocumentMessage[] = [];\n\n private connectFirstConnection = true;\n private readonly throttlingIdSet = new Set<string>();\n private timeTillThrottling: number = 0;\n\n private connectionStateProps: Record<string, string | number> = {};\n\n // True if current connection has checkpoint information\n // I.e. we know how far behind the client was at the time of establishing connection\n private _hasCheckpointSequenceNumber = false;\n\n private readonly closeAbortController = new AbortController();\n\n /**\n * Tells if current connection has checkpoint information.\n * I.e. we know how far behind the client was at the time of establishing connection\n */\n public get hasCheckpointSequenceNumber() {\n // Valid to be called only if we have active connection.\n assert(this.connection !== undefined, 0x0df /* \"Missing active connection\" */);\n return this._hasCheckpointSequenceNumber;\n }\n\n public get inbound(): IDeltaQueue<ISequencedDocumentMessage> {\n return this._inbound;\n }\n\n public get outbound(): IDeltaQueue<IDocumentMessage[]> {\n return this._outbound;\n }\n\n public get inboundSignal(): IDeltaQueue<ISignalMessage> {\n return this._inboundSignal;\n }\n\n public get initialSequenceNumber(): number {\n return this.initSequenceNumber;\n }\n\n public get lastSequenceNumber(): number {\n return this.lastProcessedSequenceNumber;\n }\n\n public get lastMessage() {\n return this.lastProcessedMessage;\n }\n\n public get lastKnownSeqNumber() {\n return this.lastObservedSeqNumber;\n }\n\n public get referenceTerm(): number {\n return this.baseTerm;\n }\n\n public get minimumSequenceNumber(): number {\n return this.minSequenceNumber;\n }\n\n public get maxMessageSize(): number {\n return this.connection?.serviceConfiguration?.maxMessageSize\n ?? this.connection?.maxMessageSize\n ?? DefaultChunkSize;\n }\n\n public get version(): string {\n if (this.connection === undefined) {\n throw new Error(\"Cannot check version without a connection\");\n }\n return this.connection.version;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.connection?.serviceConfiguration;\n }\n\n public get scopes(): string[] | undefined {\n return this.connection?.claims.scopes;\n }\n\n public get socketDocumentId(): string | undefined {\n return this.connection?.claims.documentId;\n }\n\n /**\n * The current connection mode, initially read.\n */\n public get connectionMode(): ConnectionMode {\n if (this.connection === undefined) {\n return \"read\";\n }\n return this.connection.mode;\n }\n\n /**\n * Tells if container is in read-only mode.\n * Data stores should listen for \"readonly\" notifications and disallow user\n * making changes to data stores.\n * Readonly state can be because of no storage write permission,\n * or due to host forcing readonly mode for container.\n * It is undefined if we have not yet established websocket connection\n * and do not know if user has write access to a file.\n * @deprecated - use readOnlyInfo\n */\n public get readonly() {\n if (this._forceReadonly) {\n return true;\n }\n return this._readonlyPermissions;\n }\n\n /**\n * Tells if user has no write permissions for file in storage\n * It is undefined if we have not yet established websocket connection\n * and do not know if user has write access to a file.\n * @deprecated - use readOnlyInfo\n */\n public get readonlyPermissions() {\n return this._readonlyPermissions;\n }\n\n public get readOnlyInfo(): ReadOnlyInfo {\n const storageOnly = this.connection !== undefined && this.connection instanceof NoDeltaStream;\n if (storageOnly || this._forceReadonly || this._readonlyPermissions === true) {\n return {\n readonly: true,\n forced: this._forceReadonly,\n permissions: this._readonlyPermissions,\n storageOnly,\n };\n }\n\n return { readonly: this._readonlyPermissions };\n }\n\n /**\n * Automatic reconnecting enabled or disabled.\n * If set to Never, then reconnecting will never be allowed.\n */\n public get reconnectMode(): ReconnectMode {\n return this._reconnectMode;\n }\n\n public shouldJoinWrite(): boolean {\n // We don't have to wait for ack for topmost NoOps. So subtract those.\n return this.clientSequenceNumberObserved < (this.clientSequenceNumber - this.trailingNoopCount);\n }\n\n /**\n * Enables or disables automatic reconnecting.\n * Will throw an error if reconnectMode set to Never.\n */\n public setAutomaticReconnect(reconnect: boolean): void {\n assert(\n this._reconnectMode !== ReconnectMode.Never,\n 0x0e1 /* \"Cannot toggle automatic reconnect if reconnect is set to Never.\" */);\n this._reconnectMode = reconnect ? ReconnectMode.Enabled : ReconnectMode.Disabled;\n }\n\n /**\n * Sends signal to runtime (and data stores) to be read-only.\n * Hosts may have read only views, indicating to data stores that no edits are allowed.\n * This is independent from this._readonlyPermissions (permissions) and this.connectionMode\n * (server can return \"write\" mode even when asked for \"read\")\n * Leveraging same \"readonly\" event as runtime & data stores should behave the same in such case\n * as in read-only permissions.\n * But this.active can be used by some DDSes to figure out if ops can be sent\n * (for example, read-only view still participates in code proposals / upgrades decisions)\n *\n * Forcing Readonly does not prevent DDS from generating ops. It is up to user code to honour\n * the readonly flag. If ops are generated, they will accumulate locally and not be sent. If\n * there are pending in the outbound queue, it will stop sending until force readonly is\n * cleared.\n *\n * @param readonly - set or clear force readonly.\n */\n public forceReadonly(readonly: boolean) {\n if (readonly !== this._forceReadonly) {\n this.logger.sendTelemetryEvent({\n eventName: \"ForceReadOnly\",\n value: readonly,\n });\n }\n const oldValue = this.readonly;\n this._forceReadonly = readonly;\n if (oldValue !== this.readonly) {\n let reconnect = false;\n if (this.readonly === true) {\n // If we switch to readonly while connected, we should disconnect first\n // See comment in the \"readonly\" event handler to deltaManager set up by\n // the ContainerRuntime constructor\n\n if (this.shouldJoinWrite()) {\n // If we have pending changes, then we will never send them - it smells like\n // host logic error.\n this.logger.sendErrorEvent({ eventName: \"ForceReadonlyPendingChanged\" });\n }\n\n reconnect = this.disconnectFromDeltaStream(\"Force readonly\");\n }\n safeRaiseEvent(this, this.logger, \"readonly\", this.readonly);\n if (reconnect) {\n // reconnect if we disconnected from before.\n this.triggerConnect({ reason: \"forceReadonly\", mode: \"read\", fetchOpsFromStorage: false });\n }\n }\n }\n\n public triggerConnectionRecovery(reason: string, props: ITelemetryProperties) {\n assert(this.connection !== undefined, 0x238 /* \"called only in connected state\" */);\n this.logger.sendErrorEvent({\n eventName: \"ConnectionRecovery\",\n reason,\n // This directly tells us if fetching ops is in flight, and thus likely the reason of\n // stalled op processing\n fetchReason: this.fetchReason,\n ...props,\n });\n this.disconnectFromDeltaStream(reason);\n this.triggerConnect({ reason, mode: \"read\", fetchOpsFromStorage: false });\n }\n\n private set_readonlyPermissions(readonly: boolean) {\n const oldValue = this.readonly;\n this._readonlyPermissions = readonly;\n if (oldValue !== this.readonly) {\n safeRaiseEvent(this, this.logger, \"readonly\", this.readonly);\n }\n }\n\n constructor(\n private readonly serviceProvider: () => IDocumentService | undefined,\n private client: IClient,\n private readonly logger: ITelemetryLogger,\n reconnectAllowed: boolean,\n private readonly _active: () => boolean,\n ) {\n super();\n\n this.clientDetails = this.client.details;\n this.defaultReconnectionMode = this.client.mode;\n this._reconnectMode = reconnectAllowed ? ReconnectMode.Enabled : ReconnectMode.Never;\n\n this._inbound = new DeltaQueue<ISequencedDocumentMessage>(\n (op) => {\n this.processInboundMessage(op);\n });\n\n this._inbound.on(\"error\", (error) => {\n this.close(CreateProcessingError(error, \"deltaManagerInboundErrorHandler\", this.lastMessage));\n });\n\n // Outbound message queue. The outbound queue is represented as a queue of an array of ops. Ops contained\n // within an array *must* fit within the maxMessageSize and are guaranteed to be ordered sequentially.\n this._outbound = new DeltaQueue<IDocumentMessage[]>(\n (messages) => {\n if (this.connection === undefined) {\n throw new Error(\"Attempted to submit an outbound message without connection\");\n }\n this.connection.submit(messages);\n });\n\n this._outbound.on(\"error\", (error) => {\n this.close(CreateContainerError(error));\n });\n\n // Inbound signal queue\n this._inboundSignal = new DeltaQueue<ISignalMessage>((message) => {\n if (this.handler === undefined) {\n throw new Error(\"Attempted to process an inbound signal without a handler attached\");\n }\n this.handler.processSignal({\n clientId: message.clientId,\n content: JSON.parse(message.content as string),\n });\n });\n\n this._inboundSignal.on(\"error\", (error) => {\n this.close(CreateContainerError(error));\n });\n\n // Initially, all queues are created paused.\n // - outbound is flipped back and forth in setupNewSuccessfulConnection / disconnectFromDeltaStream\n // - inbound & inboundSignal are resumed in attachOpHandler() when we have handler setup\n }\n\n public dispose() {\n throw new Error(\"Not implemented.\");\n }\n\n /**\n * Sets the sequence number from which inbound messages should be returned\n */\n public attachOpHandler(\n minSequenceNumber: number,\n sequenceNumber: number,\n term: number,\n handler: IDeltaHandlerStrategy,\n ) {\n this.initSequenceNumber = sequenceNumber;\n this.lastProcessedSequenceNumber = sequenceNumber;\n this.baseTerm = term;\n this.minSequenceNumber = minSequenceNumber;\n this.lastQueuedSequenceNumber = sequenceNumber;\n this.lastObservedSeqNumber = sequenceNumber;\n\n // We will use same check in other places to make sure all the seq number above are set properly.\n assert(this.handler === undefined, 0x0e2 /* \"DeltaManager already has attached op handler!\" */);\n this.handler = handler;\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n assert(!!(this.handler as any), 0x0e3 /* \"Newly set op handler is null/undefined!\" */);\n\n this._inbound.resume();\n this._inboundSignal.resume();\n\n // We could have connected to delta stream before getting here\n // If so, it's time to process any accumulated ops, as there might be no other event that\n // will force these pending ops to be processed.\n // Or request OPs from snapshot / or point zero (if we have no ops at all)\n if (this.pending.length > 0) {\n this.processPendingOps(\"DocumentOpen\");\n }\n }\n\n public async preFetchOps(cacheOnly: boolean) {\n // Note that might already got connected to delta stream by now.\n // If we did, then we proactively fetch ops at the end of setupNewSuccessfulConnection to ensure\n if (this.connection === undefined) {\n return this.fetchMissingDeltasCore(\"DocumentOpen\", cacheOnly, this.lastQueuedSequenceNumber, undefined);\n }\n }\n\n private static detailsFromConnection(connection: IDocumentDeltaConnection): IConnectionDetails {\n return {\n claims: connection.claims,\n clientId: connection.clientId,\n existing: connection.existing,\n checkpointSequenceNumber: connection.checkpointSequenceNumber,\n get initialClients() { return connection.initialClients; },\n maxMessageSize: connection.maxMessageSize,\n mode: connection.mode,\n serviceConfiguration: connection.serviceConfiguration,\n version: connection.version,\n };\n }\n\n public async connect(args: IConnectionArgs): Promise<IConnectionDetails> {\n const connection = await this.connectCore(args);\n return DeltaManager.detailsFromConnection(connection);\n }\n\n /**\n * Start the connection. Any error should result in container being close.\n * And report the error if it excape for any reason.\n * @param args - The connection arguments\n */\n private triggerConnect(args: IConnectionArgs) {\n assert(this.connection === undefined, 0x239 /* \"called only in disconnected state\" */);\n if (this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n this.connectCore(args).catch((err) => {\n // Errors are raised as \"error\" event and close container.\n // Have a catch-all case in case we missed something\n if (!this.closed) {\n this.logger.sendErrorEvent({ eventName: \"ConnectException\" }, err);\n }\n });\n }\n\n private async connectCore(args: IConnectionArgs): Promise<IDocumentDeltaConnection> {\n if (this.connection !== undefined) {\n return this.connection;\n }\n\n if (this.connectionP !== undefined) {\n return this.connectionP;\n }\n\n const fetchOpsFromStorage = args.fetchOpsFromStorage ?? true;\n let requestedMode = args.mode ?? this.defaultReconnectionMode;\n\n // if we have any non-acked ops from last connection, reconnect as \"write\".\n // without that we would connect in view-only mode, which will result in immediate\n // firing of \"connected\" event from Container and switch of current clientId (as tracked\n // by all DDSes). This will make it impossible to figure out if ops actually made it through,\n // so DDSes will immediately resubmit all pending ops, and some of them will be duplicates, corrupting document\n if (this.shouldJoinWrite()) {\n requestedMode = \"write\";\n }\n\n // Note: There is race condition here.\n // We want to issue request to storage as soon as possible, to\n // reduce latency of becoming current, thus this code here.\n // But there is no ordering between fetching OPs and connection to delta stream\n // As result, we might be behind by the time we connect to delta stream\n // In case of r/w connection, that's not an issue, because we will hear our\n // own \"join\" message and realize any gap client has in ops.\n // But for view-only connection, we have no such signal, and with no traffic\n // on the wire, we might be always behind.\n // See comment at the end of setupNewSuccessfulConnection()\n logIfFalse(\n this.handler !== undefined || !fetchOpsFromStorage,\n this.logger,\n \"CantFetchWithoutBaseline\"); // can't fetch if no baseline\n if (fetchOpsFromStorage && this.handler !== undefined) {\n this.fetchMissingDeltas(args.reason, this.lastQueuedSequenceNumber);\n }\n\n const docService = this.serviceProvider();\n if (docService === undefined) {\n throw new Error(\"Container is not attached\");\n }\n\n if (docService.policies?.storageOnly === true) {\n const connection = new NoDeltaStream();\n this.connectionP = new Promise((resolve) => {\n this.setupNewSuccessfulConnection(connection, \"read\");\n resolve(connection);\n });\n return this.connectionP;\n }\n\n // The promise returned from connectCore will settle with a resolved connection or reject with error\n const connectCore = async () => {\n let connection: IDocumentDeltaConnection | undefined;\n let delayMs = InitialReconnectDelayInMs;\n let connectRepeatCount = 0;\n const connectStartTime = performance.now();\n\n // This loop will keep trying to connect until successful, with a delay between each iteration.\n while (connection === undefined) {\n if (this.closed) {\n throw new Error(\"Attempting to connect a closed DeltaManager\");\n }\n connectRepeatCount++;\n\n try {\n this.client.mode = requestedMode;\n connection = await docService.connectToDeltaStream(this.client);\n } catch (origError) {\n if (typeof origError === \"object\" && origError !== null &&\n origError?.errorType === DeltaStreamConnectionForbiddenError.errorType) {\n connection = new NoDeltaStream();\n requestedMode = \"read\";\n break;\n }\n\n // Socket.io error when we connect to wrong socket, or hit some multiplexing bug\n if (!canRetryOnError(origError)) {\n const error = CreateContainerError(origError);\n this.close(error);\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw error;\n }\n\n // Log error once - we get too many errors in logs when we are offline,\n // and unfortunately there is no reliable way to detect that.\n if (connectRepeatCount === 1) {\n logNetworkFailure(\n this.logger,\n {\n delay: delayMs, // milliseconds\n eventName: \"DeltaConnectionFailureToConnect\",\n },\n origError);\n }\n\n const retryDelayFromError = getRetryDelayFromError(origError);\n delayMs = retryDelayFromError ?? Math.min(delayMs * 2, MaxReconnectDelayInMs);\n\n if (retryDelayFromError !== undefined) {\n this.emitDelayInfo(this.deltaStreamDelayId, retryDelayFromError, origError);\n }\n await waitForConnectedState(delayMs);\n }\n }\n\n // If we retried more than once, log an event about how long it took\n if (connectRepeatCount > 1) {\n this.logger.sendTelemetryEvent({\n attempts: connectRepeatCount,\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n eventName: \"MultipleDeltaConnectionFailures\",\n });\n }\n\n this.setupNewSuccessfulConnection(connection, requestedMode);\n\n return connection;\n };\n\n // This promise settles as soon as we know the outcome of the connection attempt\n this.connectionP = new Promise((resolve, reject) => {\n // Regardless of how the connection attempt concludes, we'll clear the promise and remove the listener\n\n // Reject the connection promise if the DeltaManager gets closed during connection\n const cleanupAndReject = (error) => {\n this.connectionP = undefined;\n this.removeListener(\"closed\", cleanupAndReject);\n reject(error);\n };\n this.on(\"closed\", cleanupAndReject);\n\n // Attempt the connection\n connectCore().then((connection) => {\n this.connectionP = undefined;\n this.removeListener(\"closed\", cleanupAndReject);\n resolve(connection);\n }).catch(cleanupAndReject);\n });\n\n return this.connectionP;\n }\n\n public flush() {\n if (this.messageBuffer.length === 0) {\n return;\n }\n\n // The prepareFlush event allows listeners to append metadata to the batch prior to submission.\n this.emit(\"prepareSend\", this.messageBuffer);\n\n this._outbound.push(this.messageBuffer);\n this.messageBuffer = [];\n }\n\n /**\n * Submits the given delta returning the client sequence number for the message. Contents is the actual\n * contents of the message. appData is optional metadata that can be attached to the op by the app.\n *\n * If batch is set to true then the submit will be batched - and as a result guaranteed to be ordered sequentially\n * in the global sequencing space. The batch will be flushed either when flush is called or when a non-batched\n * op is submitted.\n */\n public submit(type: MessageType, contents: any, batch = false, metadata?: any): number {\n // TODO need to fail if gets too large\n // const serializedContent = JSON.stringify(this.messageBuffer);\n // const maxOpSize = this.context.deltaManager.maxMessageSize;\n\n if (this.readonly === true) {\n assert(this.readOnlyInfo.readonly === true, 0x1f0 /* \"Unexpected mismatch in readonly\" */);\n const error = CreateContainerError(\"Op is sent in read-only document state\", {\n readonly: this.readOnlyInfo.readonly,\n forcedReadonly: this.readOnlyInfo.forced,\n readonlyPermissions: this.readOnlyInfo.permissions,\n storageOnly: this.readOnlyInfo.storageOnly,\n });\n this.close(error);\n return -1;\n }\n\n // reset clientSequenceNumber if we are using new clientId.\n // we keep info about old connection as long as possible to be able to account for all non-acked ops\n // that we pick up on next connection.\n assert(!!this.connection, 0x0e4 /* \"Lost old connection!\" */);\n if (this.lastSubmittedClientId !== this.connection?.clientId) {\n this.lastSubmittedClientId = this.connection?.clientId;\n this.clientSequenceNumber = 0;\n this.clientSequenceNumberObserved = 0;\n }\n\n const service = this.clientDetails.type === undefined || this.clientDetails.type === \"\"\n ? \"unknown\"\n : this.clientDetails.type;\n\n // Start adding trace for the op.\n const traces: ITrace[] = [\n {\n action: \"start\",\n service,\n timestamp: Date.now(),\n }];\n\n const message: IDocumentMessage = {\n clientSequenceNumber: ++this.clientSequenceNumber,\n contents: JSON.stringify(contents),\n metadata,\n referenceSequenceNumber: this.lastProcessedSequenceNumber,\n traces,\n type,\n };\n\n if (type === MessageType.NoOp) {\n this.trailingNoopCount++;\n } else {\n this.trailingNoopCount = 0;\n }\n\n this.emit(\"submitOp\", message);\n\n if (!batch) {\n this.flush();\n this.messageBuffer.push(message);\n this.flush();\n } else {\n this.messageBuffer.push(message);\n }\n\n return message.clientSequenceNumber;\n }\n\n public submitSignal(content: any) {\n if (this.connection !== undefined) {\n this.connection.submitSignal(content);\n } else {\n this.logger.sendErrorEvent({ eventName: \"submitSignalDisconnected\" });\n }\n }\n\n private async getDeltas(\n from: number, // inclusive\n to: number | undefined, // exclusive\n callback: (messages: ISequencedDocumentMessage[]) => void,\n cacheOnly: boolean)\n {\n const docService = this.serviceProvider();\n if (docService === undefined) {\n throw new Error(\"Delta manager is not attached\");\n }\n\n if (this.deltaStorage === undefined) {\n this.deltaStorage = await docService.connectToDeltaStorage();\n }\n\n let controller = this.closeAbortController;\n let listenerToClear: ((op: ISequencedDocumentMessage) => void) | undefined;\n\n if (to !== undefined) {\n const lastExpectedOp = to - 1; // make it inclusive!\n\n // It is possible that due to asynchrony (including await above), required ops were already\n // received through delta stream. Validate that before moving forward.\n if (this.lastQueuedSequenceNumber >= lastExpectedOp) {\n this.logger.sendPerformanceEvent({\n reason: this.fetchReason,\n eventName: \"ExtraStorageCall\",\n early: true,\n from,\n to,\n ...this.connectionStateProps,\n });\n return;\n }\n\n controller = new AbortController();\n\n assert(this.closeAbortController.signal.onabort === null, 0x1e8 /* \"reentrancy\" */);\n this.closeAbortController.signal.onabort = () => controller.abort();\n\n const listener = (op: ISequencedDocumentMessage) => {\n // Be prepared for the case where webSocket would receive the ops that we are trying to fill through\n // storage. Ideally it should never happen (i.e. ops on socket are always ordered, and thus once we\n // detected gap, this gap can't be filled in later on through websocket).\n // And in practice that does look like the case. The place where this code gets hit is if we lost\n // connection and reconnected (likely to another box), and new socket's initial ops contains these ops.\n assert(op.sequenceNumber === this.lastQueuedSequenceNumber, 0x23a /* \"seq#'s\" */);\n if (this.lastQueuedSequenceNumber >= lastExpectedOp) {\n controller.abort();\n this._inbound.off(\"push\", listener);\n }\n };\n this._inbound.on(\"push\", listener);\n listenerToClear = listener;\n }\n\n try {\n const stream = this.deltaStorage.fetchMessages(\n from, // inclusive\n to, // exclusive\n controller.signal,\n cacheOnly);\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const result = await stream.read();\n if (result.done) {\n break;\n }\n callback(result.value);\n }\n } finally {\n this.closeAbortController.signal.onabort = null;\n if (listenerToClear !== undefined) {\n this._inbound.off(\"push\", listenerToClear);\n }\n }\n }\n\n /**\n * Closes the connection and clears inbound & outbound queues.\n */\n public close(error?: ICriticalContainerError): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n this.closeAbortController.abort();\n\n // This raises \"disconnect\" event if we have active connection.\n this.disconnectFromDeltaStream(error !== undefined ? `${error.message}` : \"Container closed\");\n\n this._inbound.clear();\n this._outbound.clear();\n this._inboundSignal.clear();\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._inbound.pause();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._inboundSignal.pause();\n\n // Drop pending messages - this will ensure catchUp() does not go into infinite loop\n this.pending = [];\n\n // Notify everyone we are in read-only state.\n // Useful for data stores in case we hit some critical error,\n // to switch to a mode where user edits are not accepted\n this.set_readonlyPermissions(true);\n\n // This needs to be the last thing we do (before removing listeners), as it causes\n // Container to dispose context and break ability of data stores / runtime to \"hear\"\n // from delta manager, including notification (above) about readonly state.\n this.emit(\"closed\", error);\n\n this.removeAllListeners();\n }\n\n public refreshDelayInfo(id: string) {\n this.throttlingIdSet.delete(id);\n if (this.throttlingIdSet.size === 0) {\n this.timeTillThrottling = 0;\n }\n }\n\n /**\n * Emit info about a delay in service communication on account of throttling.\n * @param id - Id of the connection that is delayed\n * @param delayMs - Duration of the delay\n * @param error - error objecct indicating the throttling\n */\n public emitDelayInfo(id: string, delayMs: number, error: unknown) {\n const timeNow = Date.now();\n this.throttlingIdSet.add(id);\n if (delayMs > 0 && (timeNow + delayMs > this.timeTillThrottling)) {\n this.timeTillThrottling = timeNow + delayMs;\n\n const throttlingWarning: IThrottlingWarning =\n ThrottlingWarning.wrap(error, \"Service busy/throttled\", delayMs / 1000 /* retryAfterSeconds */);\n this.emit(\"throttled\", throttlingWarning);\n }\n }\n\n private readonly opHandler = (documentId: string, messagesArg: ISequencedDocumentMessage[]) => {\n const messages = Array.isArray(messagesArg) ? messagesArg : [messagesArg];\n this.enqueueMessages(messages, \"opHandler\");\n };\n\n private readonly signalHandler = (message: ISignalMessage) => {\n this._inboundSignal.push(message);\n };\n\n // Always connect in write mode after getting nacked.\n private readonly nackHandler = (documentId: string, messages: INack[]) => {\n const message = messages[0];\n // TODO: we should remove this check when service updates?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (this._readonlyPermissions) {\n this.close(createWriteError(\"WriteOnReadOnlyDocument\"));\n }\n\n // check message.content for Back-compat with old service.\n const reconnectInfo = message.content !== undefined\n ? getNackReconnectInfo(message.content) :\n createGenericNetworkError(`Nack: unknown reason`, true);\n\n if (this.reconnectMode !== ReconnectMode.Enabled) {\n this.logger.sendErrorEvent({\n eventName: \"NackWithNoReconnect\",\n reason: reconnectInfo.message,\n mode: this.connectionMode,\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.reconnectOnError(\n \"write\",\n reconnectInfo,\n );\n };\n\n // Connection mode is always read on disconnect/error unless the system mode was write.\n private readonly disconnectHandler = (disconnectReason) => {\n // Note: we might get multiple disconnect calls on same socket, as early disconnect notification\n // (\"server_disconnect\", ODSP-specific) is mapped to \"disconnect\"\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.reconnectOnError(\n this.defaultReconnectionMode,\n createReconnectError(\"Disconnect\", disconnectReason),\n );\n };\n\n private readonly errorHandler = (error) => {\n // Observation based on early pre-production telemetry:\n // We are getting transport errors from WebSocket here, right before or after \"disconnect\".\n // This happens only in Firefox.\n logNetworkFailure(this.logger, { eventName: \"DeltaConnectionError\" }, error);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.reconnectOnError(\n this.defaultReconnectionMode,\n createReconnectError(\"error\", error),\n );\n };\n\n private readonly pongHandler = (latency: number) => {\n this.emit(\"pong\", latency);\n };\n\n /**\n * Once we've successfully gotten a connection, we need to set up state, attach event listeners, and process\n * initial messages.\n * @param connection - The newly established connection\n */\n private setupNewSuccessfulConnection(connection: IDocumentDeltaConnection, requestedMode: ConnectionMode) {\n // Old connection should have been cleaned up before establishing a new one\n assert(this.connection === undefined, 0x0e6 /* \"old connection exists on new connection setup\" */);\n\n // back-compat: added in 0.45. Make it unconditional (i.e. use connection.disposable) in some future.\n const disposable = connection as Partial<IDisposable>;\n if (disposable.disposed === true) {\n this.logger.sendTelemetryEvent({ eventName: \"ReceivedClosedConnection\" });\n // Note: not checking this.reconnectMode mode here as nobody ever observed this connection, so\n // none of invariants is broken if reconnect happens.\n this.triggerConnect({\n reason: \"early connection closure\",\n mode: requestedMode,\n fetchOpsFromStorage: false,\n });\n return;\n }\n\n this.connection = connection;\n\n // Does information in scopes & mode matches?\n // If we asked for \"write\" and got \"read\", then file is read-only\n // But if we ask read, server can still give us write.\n const readonly = !connection.claims.scopes.includes(ScopeType.DocWrite);\n\n // This connection mode validation logic is moving to the driver layer in 0.44. These two asserts can be\n // removed after those packages have released and become ubiquitous.\n assert(requestedMode === \"read\" || readonly === (this.connectionMode === \"read\"),\n 0x0e7 /* \"claims/connectionMode mismatch\" */);\n assert(!readonly || this.connectionMode === \"read\", 0x0e8 /* \"readonly perf with write connection\" */);\n\n this.set_readonlyPermissions(readonly);\n\n this.refreshDelayInfo(this.deltaStreamDelayId);\n\n if (this.closed) {\n // Raise proper events, Log telemetry event and close connection.\n this.disconnectFromDeltaStream(`Disconnect on close`);\n return;\n }\n\n // We cancel all ops on lost of connectivity, and rely on DDSes to resubmit them.\n // Semantics are not well defined for batches (and they are broken right now on disconnects anyway),\n // but it's safe to assume (until better design is put into place) that batches should not exist\n // across multiple connections. Right now we assume runtime will not submit any ops in disconnected\n // state. As requirements change, so should these checks.\n assert(this.messageBuffer.length === 0, 0x0e9 /* \"messageBuffer is not empty on new connection\" */);\n\n this._outbound.resume();\n\n connection.on(\"op\", this.opHandler);\n connection.on(\"signal\", this.signalHandler);\n connection.on(\"nack\", this.nackHandler);\n connection.on(\"disconnect\", this.disconnectHandler);\n connection.on(\"error\", this.errorHandler);\n connection.on(\"pong\", this.pongHandler);\n\n // Initial messages are always sorted. However, due to early op handler installed by drivers and appending those\n // ops to initialMessages, resulting set is no longer sorted, which would result in client hitting storage to\n // fill in gap. We will recover by cancelling this request once we process remaining ops, but it's a waste that\n // we could avoid\n const initialMessages = connection.initialMessages.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\n this.connectionStateProps = {\n connectionLastQueuedSequenceNumber : this.lastQueuedSequenceNumber,\n connectionLastObservedSeqNumber: this.lastObservedSeqNumber,\n clientId: connection.clientId,\n mode: connection.mode,\n };\n this._hasCheckpointSequenceNumber = false;\n\n // Some storages may provide checkpointSequenceNumber to identify how far client is behind.\n const checkpointSequenceNumber = connection.checkpointSequenceNumber;\n if (checkpointSequenceNumber !== undefined) {\n this._hasCheckpointSequenceNumber = true;\n this.updateLatestKnownOpSeqNumber(checkpointSequenceNumber);\n }\n\n // Update knowledge of how far we are behind, before raising \"connect\" event\n // This is duplication of what enqueueMessages() does, but we have to raise event before we get there,\n // so duplicating update logic here as well.\n const last = initialMessages.length > 0 ? initialMessages[initialMessages.length - 1].sequenceNumber : -1;\n if (initialMessages.length > 0) {\n this._hasCheckpointSequenceNumber = true;\n this.updateLatestKnownOpSeqNumber(last);\n }\n\n // Notify of the connection\n // WARNING: This has to happen before processInitialMessages() call below.\n // If not, we may not update Container.pendingClientId in time before seeing our own join session op.\n this.emit(\n \"connect\",\n DeltaManager.detailsFromConnection(connection),\n this._hasCheckpointSequenceNumber ? this.lastObservedSeqNumber - this.lastSequenceNumber : undefined);\n\n this.enqueueMessages(\n initialMessages,\n this.connectFirstConnection ? \"InitialOps\" : \"ReconnectOps\");\n\n if (connection.initialSignals !== undefined) {\n for (const signal of connection.initialSignals) {\n this._inboundSignal.push(signal);\n }\n }\n\n // If we got some initial ops, then we know the gap and call above fetched ops to fill it.\n // Same is true for \"write\" mode even if we have no ops - we will get self \"join\" ops very very soon.\n // However if we are connecting as view-only, then there is no good signal to realize if client is behind.\n // Thus we have to hit storage to see if any ops are there.\n if (initialMessages.length === 0) {\n if (checkpointSequenceNumber !== undefined) {\n // We know how far we are behind (roughly). If it's non-zero gap, fetch ops right away.\n if (checkpointSequenceNumber > this.lastQueuedSequenceNumber) {\n this.fetchMissingDeltas(\"AfterConnection\", this.lastQueuedSequenceNumber);\n }\n // we do not know the gap, and we will not learn about it if socket is quite - have to ask.\n } else if (connection.mode !== \"write\") {\n this.fetchMissingDeltas(\"AfterConnection\", this.lastQueuedSequenceNumber);\n }\n } else {\n this.connectionStateProps.connectionInitialOpsFrom = initialMessages[0].sequenceNumber;\n this.connectionStateProps.connectionInitialOpsTo = last + 1;\n }\n\n this.connectFirstConnection = false;\n }\n\n /**\n * Disconnect the current connection.\n * @param reason - Text description of disconnect reason to emit with disconnect event\n */\n private disconnectFromDeltaStream(reason: string) {\n if (this.connection === undefined) {\n return false;\n }\n\n const connection = this.connection;\n // Avoid any re-entrancy - clear object reference\n this.connection = undefined;\n\n // Remove listeners first so we don't try to retrigger this flow accidentally through reconnectOnError\n connection.off(\"op\", this.opHandler);\n connection.off(\"signal\", this.signalHandler);\n connection.off(\"nack\", this.nackHandler);\n connection.off(\"disconnect\", this.disconnectHandler);\n connection.off(\"error\", this.errorHandler);\n connection.off(\"pong\", this.pongHandler);\n\n // We cancel all ops on lost of connectivity, and rely on DDSes to resubmit them.\n // Semantics are not well defined for batches (and they are broken right now on disconnects anyway),\n // but it's safe to assume (until better design is put into place) that batches should not exist\n // across multiple connections. Right now we assume runtime will not submit any ops in disconnected\n // state. As requirements change, so should these checks.\n assert(this.messageBuffer.length === 0, 0x0ea /* \"messageBuffer is not empty on disconnect\" */);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._outbound.pause();\n this._outbound.clear();\n this.emit(\"disconnect\", reason);\n\n // back-compat: added in 0.45. Make it unconditional (i.e. use connection.dispose()) in some future.\n const disposable = connection as Partial<IDisposable>;\n\n if (disposable.dispose !== undefined) {\n disposable.dispose();\n } else {\n connection.close();\n }\n\n this.connectionStateProps = {};\n\n return true;\n }\n\n /**\n * Disconnect the current connection and reconnect.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private async reconnectOnError(\n requestedMode: ConnectionMode,\n error: DriverError,\n ) {\n // We quite often get protocol errors before / after observing nack/disconnect\n // we do not want to run through same sequence twice.\n // If we're already disconnected/disconnecting it's not appropriate to call this again.\n assert(this.connection !== undefined, 0x0eb /* \"Missing connection for reconnect\" */);\n\n this.disconnectFromDeltaStream(error.message);\n\n // If reconnection is not an option, close the DeltaManager\n const canRetry = canRetryOnError(error);\n if (this.reconnectMode === ReconnectMode.Never || !canRetry) {\n // Do not raise container error if we are closing just because we lost connection.\n // Those errors (like IdleDisconnect) would show up in telemetry dashboards and\n // are very misleading, as first initial reaction - some logic is broken.\n this.close(canRetry ? undefined : error);\n }\n\n // If closed then we can't reconnect\n if (this.closed) {\n return;\n }\n\n if (this.reconnectMode === ReconnectMode.Enabled) {\n const delayMs = getRetryDelayFromError(error);\n if (delayMs !== undefined) {\n this.emitDelayInfo(this.deltaStreamDelayId, delayMs, error);\n await waitForConnectedState(delayMs);\n }\n\n this.triggerConnect({ reason: \"reconnect\", mode: requestedMode, fetchOpsFromStorage: false });\n }\n }\n\n // returns parts of message (in string format) that should never change for a given message.\n // Used for message comparison. It attempts to avoid comparing fields that potentially may differ.\n // for example, it's not clear if serverMetadata or timestamp property is a property of message or server state.\n // We only extract the most obvious fields that are sufficient (with high probability) to detect sequence number\n // reuse.\n // Also payload goes to telemetry, so no PII, including content!!\n // Note: It's possible for a duplicate op to be broadcasted and have everything the same except the timestamp.\n private comparableMessagePayload(m: ISequencedDocumentMessage) {\n return `${m.clientId}-${m.type}-${m.minimumSequenceNumber}-${m.referenceSequenceNumber}-${m.timestamp}`;\n }\n\n private enqueueMessages(\n messages: ISequencedDocumentMessage[],\n reason: string,\n allowGaps = false,\n ): void {\n if (this.handler === undefined) {\n // We did not setup handler yet.\n // This happens when we connect to web socket faster than we get attributes for container\n // and thus faster than attachOpHandler() is called\n // this.lastProcessedSequenceNumber is still zero, so we can't rely on this.fetchMissingDeltas()\n // to do the right thing.\n this.pending = this.pending.concat(messages);\n return;\n }\n\n // Pending ops should never just hang around for nothing.\n // This invariant will stay true through this function execution,\n // so there is no need to process pending ops here.\n // It's responsibility of\n // - attachOpHandler()\n // - fetchMissingDeltas() after it's done with querying storage\n assert(this.pending.length === 0 || this.fetchReason !== undefined, 0x1e9 /* \"Pending ops\" */);\n\n if (messages.length === 0) {\n return;\n }\n\n const from = messages[0].sequenceNumber;\n const last = messages[messages.length - 1].sequenceNumber;\n\n // Report stats about missing and duplicate ops\n // This helps better understand why we fetch ops from storage, and thus may delay\n // getting current / sending ops\n // It's possible that this batch is already too late - do not bother\n if (last > this.lastQueuedSequenceNumber) {\n let prev = from - 1;\n const initialGap = prev - this.lastQueuedSequenceNumber;\n let firstMissing: number | undefined;\n let duplicate = 0;\n let gap = 0;\n\n // Count all gaps and duplicates\n for (const message of messages) {\n if (message.sequenceNumber === prev) {\n duplicate++;\n } else if (message.sequenceNumber !== prev + 1) {\n gap++;\n if (firstMissing === undefined) {\n firstMissing = prev + 1;\n }\n }\n prev = message.sequenceNumber;\n }\n\n let eventName: string | undefined;\n\n // Report if we found some issues\n if (duplicate !== 0 || gap !== 0 && !allowGaps || initialGap > 0 && this.fetchReason === undefined) {\n eventName = \"enqueueMessages\";\n // Also report if we are fetching ops, and same range comes in, thus making this fetch obsolete.\n } else if (this.fetchReason !== undefined && this.fetchReason !== reason &&\n (from <= this.lastQueuedSequenceNumber + 1 && last > this.lastQueuedSequenceNumber)) {\n eventName = \"enqueueMessagesExtraFetch\";\n }\n\n // Report if there is something to report\n // Do not report when pending fetch is in progress, as such reporting will not\n // correctly take into account pending ops.\n if (eventName !== undefined) {\n this.logger.sendPerformanceEvent({\n eventName,\n reason,\n previousReason: this.prevEnqueueMessagesReason,\n from,\n to: last + 1, // exclusive, being consistent with the other telemetry / APIs\n length: messages.length,\n fetchReason: this.fetchReason,\n duplicate: duplicate > 0 ? duplicate : undefined,\n initialGap: initialGap !== 0 ? initialGap : undefined,\n gap: gap > 0 ? gap : undefined,\n firstMissing,\n dmInitialSeqNumber: this.initialSequenceNumber,\n ...this.connectionStateProps,\n });\n }\n }\n\n this.updateLatestKnownOpSeqNumber(messages[messages.length - 1].sequenceNumber);\n\n const n = this.previouslyProcessedMessage?.sequenceNumber;\n assert(n === undefined || n === this.lastQueuedSequenceNumber,\n 0x0ec /* \"Unexpected value for previously processed message's sequence number\" */);\n\n for (const message of messages) {\n // Check that the messages are arriving in the expected order\n if (message.sequenceNumber <= this.lastQueuedSequenceNumber) {\n // Validate that we do not have data loss, i.e. sequencing is reset and started again\n // with numbers that this client already observed before.\n if (this.previouslyProcessedMessage?.sequenceNumber === message.sequenceNumber) {\n const message1 = this.comparableMessagePayload(this.previouslyProcessedMessage);\n const message2 = this.comparableMessagePayload(message);\n if (message1 !== message2) {\n const error = new NonRetryableError(\n \"Two messages with same seq# and different payload!\",\n DriverErrorType.fileOverwrittenInStorage,\n {\n clientId: this.connection?.clientId,\n sequenceNumber: message.sequenceNumber,\n message1,\n message2,\n },\n );\n this.close(error);\n }\n }\n } else if (message.sequenceNumber !== this.lastQueuedSequenceNumber + 1) {\n this.pending.push(message);\n this.fetchMissingDeltas(reason, this.lastQueuedSequenceNumber, message.sequenceNumber);\n } else {\n this.lastQueuedSequenceNumber = message.sequenceNumber;\n this.previouslyProcessedMessage = message;\n this._inbound.push(message);\n }\n }\n\n // When / if we report a gap in ops in the future, we want telemetry to correctly reflect source\n // of prior ops. But if we have some out of order ops (this.pending), then reporting current reason\n // becomes not accurate, as the gap existed before current batch, so we should just report \"unknown\".\n this.prevEnqueueMessagesReason = this.pending.length > 0 ? \"unknown\" : reason;\n }\n\n private processInboundMessage(message: ISequencedDocumentMessage): void {\n const startTime = Date.now();\n this.lastProcessedMessage = message;\n\n // All non-system messages are coming from some client, and should have clientId\n // System messages may have no clientId (but some do, like propose, noop, summarize)\n assert(\n message.clientId !== undefined\n || isSystemMessage(message),\n 0x0ed /* \"non-system message have to have clientId\" */,\n );\n\n // if we have connection, and message is local, then we better treat is as local!\n assert(\n this.connection === undefined\n || this.connection.clientId !== message.clientId\n || this.lastSubmittedClientId === message.clientId,\n 0x0ee /* \"Not accounting local messages correctly\" */,\n );\n\n if (this.lastSubmittedClientId !== undefined && this.lastSubmittedClientId === message.clientId) {\n const clientSequenceNumber = message.clientSequenceNumber;\n\n assert(this.clientSequenceNumberObserved < clientSequenceNumber, 0x0ef /* \"client seq# not growing\" */);\n assert(clientSequenceNumber <= this.clientSequenceNumber,\n 0x0f0 /* \"Incoming local client seq# > generated by this client\" */);\n\n this.clientSequenceNumberObserved = clientSequenceNumber;\n }\n\n // TODO Remove after SPO picks up the latest build.\n if (\n typeof message.contents === \"string\"\n && message.contents !== \"\"\n && message.type !== MessageType.ClientLeave\n ) {\n message.contents = JSON.parse(message.contents);\n }\n\n // Add final ack trace.\n if (message.traces !== undefined && message.traces.length > 0) {\n const service = this.clientDetails.type === undefined || this.clientDetails.type === \"\"\n ? \"unknown\"\n : this.clientDetails.type;\n message.traces.push({\n action: \"end\",\n service,\n timestamp: Date.now(),\n });\n }\n\n // Watch the minimum sequence number and be ready to update as needed\n if (this.minSequenceNumber > message.minimumSequenceNumber) {\n throw new DataCorruptionError(\"msn moves backwards\", {\n ...extractLogSafeMessageProperties(message),\n clientId: this.connection?.clientId,\n });\n }\n this.minSequenceNumber = message.minimumSequenceNumber;\n\n if (message.sequenceNumber !== this.lastProcessedSequenceNumber + 1) {\n throw new DataCorruptionError(\"non-seq seq#\", {\n ...extractLogSafeMessageProperties(message),\n clientId: this.connection?.clientId,\n });\n }\n this.lastProcessedSequenceNumber = message.sequenceNumber;\n\n // Back-compat for older server with no term\n if (message.term === undefined) {\n message.term = 1;\n }\n this.baseTerm = message.term;\n\n if (this.handler === undefined) {\n throw new Error(\"Attempted to process an inbound message without a handler attached\");\n }\n this.handler.process(message);\n\n const endTime = Date.now();\n this.emit(\"op\", message, endTime - startTime);\n }\n\n /**\n * Retrieves the missing deltas between the given sequence numbers\n */\n private fetchMissingDeltas(reasonArg: string, lastKnowOp: number, to?: number) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.fetchMissingDeltasCore(reasonArg, false /* cacheOnly */, lastKnowOp, to);\n }\n\n /**\n * Retrieves the missing deltas between the given sequence numbers\n */\n private async fetchMissingDeltasCore(\n reason: string,\n cacheOnly: boolean,\n lastKnowOp: number,\n to?: number)\n {\n // Exit out early if we're already fetching deltas\n if (this.fetchReason !== undefined) {\n return;\n }\n\n if (this.closed) {\n this.logger.sendTelemetryEvent({ eventName: \"fetchMissingDeltasClosedConnection\" });\n return;\n }\n\n try {\n assert(lastKnowOp === this.lastQueuedSequenceNumber, 0x0f1 /* \"from arg\" */);\n let from = lastKnowOp + 1;\n\n const n = this.previouslyProcessedMessage?.sequenceNumber;\n if (n !== undefined) {\n // If we already processed at least one op, then we have this.previouslyProcessedMessage populated\n // and can use it to validate that we are operating on same file, i.e. it was not overwritten.\n // Knowing about this mechanism, we could ask for op we already observed to increase validation.\n // This is especially useful when coming out of offline mode or loading from\n // very old cached (by client / driver) snapshot.\n assert(n === lastKnowOp, 0x0f2 /* \"previouslyProcessedMessage\" */);\n assert(from > 1, 0x0f3 /* \"not positive\" */);\n from--;\n }\n\n const fetchReason = `${reason}_fetch`;\n this.fetchReason = fetchReason;\n\n await this.getDeltas(\n from,\n to,\n (messages) => {\n this.refreshDelayInfo(this.deltaStorageDelayId);\n this.enqueueMessages(messages, fetchReason);\n },\n cacheOnly);\n } catch (error) {\n this.logger.sendErrorEvent({eventName: \"GetDeltas_Exception\"}, error);\n this.close(CreateContainerError(error));\n } finally {\n this.refreshDelayInfo(this.deltaStorageDelayId);\n this.fetchReason = undefined;\n this.processPendingOps(reason);\n }\n }\n\n /**\n * Sorts pending ops and attempts to apply them\n */\n private processPendingOps(reason?: string): void {\n if (this.handler !== undefined) {\n const pendingSorted = this.pending.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n this.pending = [];\n // Given that we do not track where these ops came from any more, it's not very\n // actionably to report gaps in this range.\n this.enqueueMessages(pendingSorted, `${reason}_pending`, true /* allowGaps */);\n }\n }\n\n private updateLatestKnownOpSeqNumber(seq: number) {\n if (this.lastObservedSeqNumber < seq) {\n this.lastObservedSeqNumber = seq;\n }\n }\n}\n\n// TODO: move this elsewhere and use it more broadly for DataCorruptionError/DataProcessingError\nfunction extractLogSafeMessageProperties(message: Partial<ISequencedDocumentMessage>) {\n const safeProps = {\n messageClientId: message.clientId,\n sequenceNumber: message.sequenceNumber,\n clientSequenceNumber: message.clientSequenceNumber,\n referenceSequenceNumber: message.referenceSequenceNumber,\n minimumSequenceNumber: message.minimumSequenceNumber,\n messageTimestamp: message.timestamp,\n };\n\n return safeProps;\n}\n"]}
1
+ {"version":3,"file":"deltaManager.js","sourceRoot":"","sources":["../src/deltaManager.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 { default as AbortController } from \"abort-controller\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n IDisposable,\n ITelemetryLogger,\n IEventProvider,\n ITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport {\n IConnectionDetails,\n IDeltaHandlerStrategy,\n IDeltaManager,\n IDeltaManagerEvents,\n IDeltaQueue,\n ICriticalContainerError,\n IThrottlingWarning,\n ReadOnlyInfo,\n} from \"@fluidframework/container-definitions\";\nimport { assert, performance, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { TelemetryLogger, safeRaiseEvent, logIfFalse, normalizeError } from \"@fluidframework/telemetry-utils\";\nimport {\n IDocumentDeltaStorageService,\n IDocumentService,\n IDocumentDeltaConnection,\n IDocumentDeltaConnectionEvents,\n DriverError,\n DriverErrorType,\n} from \"@fluidframework/driver-definitions\";\nimport { isSystemMessage } from \"@fluidframework/protocol-base\";\nimport {\n ConnectionMode,\n IClient,\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n INack,\n INackContent,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n ITrace,\n MessageType,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n canRetryOnError,\n createWriteError,\n createGenericNetworkError,\n getRetryDelayFromError,\n logNetworkFailure,\n waitForConnectedState,\n NonRetryableError,\n DeltaStreamConnectionForbiddenError,\n GenericNetworkError,\n} from \"@fluidframework/driver-utils\";\nimport {\n ThrottlingWarning,\n CreateProcessingError,\n DataCorruptionError,\n wrapError,\n GenericError,\n} from \"@fluidframework/container-utils\";\nimport { DeltaQueue } from \"./deltaQueue\";\n\nconst MaxReconnectDelayInMs = 8000;\nconst InitialReconnectDelayInMs = 1000;\nconst DefaultChunkSize = 16 * 1024;\n\nfunction getNackReconnectInfo(nackContent: INackContent) {\n const reason = `Nack: ${nackContent.message}`;\n const canRetry = nackContent.code !== 403;\n const retryAfterMs = nackContent.retryAfter !== undefined ? nackContent.retryAfter * 1000 : undefined;\n return createGenericNetworkError(reason, canRetry, retryAfterMs, { statusCode: nackContent.code });\n}\n\nconst createReconnectError = (prefix: string, err: any) =>\n wrapError(\n err,\n (errorMessage: string) => new GenericNetworkError(`${prefix}: ${errorMessage}`, true /* canRetry */),\n );\n\nexport interface IConnectionArgs {\n mode?: ConnectionMode;\n fetchOpsFromStorage?: boolean;\n reason: string;\n}\n\nexport enum ReconnectMode {\n Never = \"Never\",\n Disabled = \"Disabled\",\n Enabled = \"Enabled\",\n}\n\n/**\n * Includes events emitted by the concrete implementation DeltaManager\n * but not exposed on the public interface IDeltaManager\n */\nexport interface IDeltaManagerInternalEvents extends IDeltaManagerEvents {\n (event: \"throttled\", listener: (error: IThrottlingWarning) => void);\n (event: \"closed\", listener: (error?: ICriticalContainerError) => void);\n}\n\n/**\n * Implementation of IDocumentDeltaConnection that does not support submitting\n * or receiving ops. Used in storage-only mode.\n */\nclass NoDeltaStream\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable\n{\n clientId: string = \"storage-only client\";\n claims: ITokenClaims = {\n scopes: [ScopeType.DocRead],\n } as any;\n mode: ConnectionMode = \"read\";\n existing: boolean = true;\n maxMessageSize: number = 0;\n version: string = \"\";\n initialMessages: ISequencedDocumentMessage[] = [];\n initialSignals: ISignalMessage[] = [];\n initialClients: ISignalClient[] = [];\n serviceConfiguration: IClientConfiguration = undefined as any;\n checkpointSequenceNumber?: number | undefined = undefined;\n submit(messages: IDocumentMessage[]): void {\n this.emit(\"nack\", this.clientId, messages.map((operation) => {\n return {\n operation,\n content: { message: \"Cannot submit with storage-only connection\", code: 403 },\n };\n }));\n }\n submitSignal(message: any): void {\n this.emit(\"nack\", this.clientId, {\n operation: message,\n content: { message: \"Cannot submit signal with storage-only connection\", code: 403 },\n });\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n\n // back-compat: became @deprecated in 0.45 / driver-definitions 0.40\n public close(): void { this.dispose(); }\n}\n\n/**\n * Manages the flow of both inbound and outbound messages. This class ensures that shared objects receive delta\n * messages in order regardless of possible network conditions or timings causing out of order delivery.\n */\nexport class DeltaManager\n extends TypedEventEmitter<IDeltaManagerInternalEvents>\n implements\n IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n IEventProvider<IDeltaManagerInternalEvents>\n{\n public get active(): boolean { return this._active(); }\n\n public get disposed() { return this.closed; }\n\n public readonly clientDetails: IClientDetails;\n public get IDeltaSender() { return this; }\n\n /**\n * Controls whether the DeltaManager will automatically reconnect to the delta stream after receiving a disconnect.\n */\n private _reconnectMode: ReconnectMode;\n\n // file ACL - whether user has only read-only access to a file\n private _readonlyPermissions: boolean | undefined;\n\n // tracks host requiring read-only mode.\n private _forceReadonly = false;\n\n // Connection mode used when reconnecting on error or disconnect.\n private readonly defaultReconnectionMode: ConnectionMode;\n\n private pending: ISequencedDocumentMessage[] = [];\n private fetchReason: string | undefined;\n\n // The minimum sequence number and last sequence number received from the server\n private minSequenceNumber: number = 0;\n\n // There are three numbers we track\n // * lastQueuedSequenceNumber is the last queued sequence number. If there are gaps in seq numbers, then this number\n // is not updated until we cover that gap, so it increases each time by 1.\n // * lastObservedSeqNumber is an estimation of last known sequence number for container in storage. It's initially\n // populated at web socket connection time (if storage provides that info) and is updated once ops shows up.\n // It's never less than lastQueuedSequenceNumber\n // * lastProcessedSequenceNumber - last processed sequence number\n private lastQueuedSequenceNumber: number = 0;\n private lastObservedSeqNumber: number = 0;\n private lastProcessedSequenceNumber: number = 0;\n private lastProcessedMessage: ISequencedDocumentMessage | undefined;\n private baseTerm: number = 0;\n\n private prevEnqueueMessagesReason: string | undefined;\n private previouslyProcessedMessage: ISequencedDocumentMessage | undefined;\n\n // The sequence number we initially loaded from\n private initSequenceNumber: number = 0;\n\n private readonly _inbound: DeltaQueue<ISequencedDocumentMessage>;\n private readonly _inboundSignal: DeltaQueue<ISignalMessage>;\n private readonly _outbound: DeltaQueue<IDocumentMessage[]>;\n\n private connectionP: Promise<IDocumentDeltaConnection> | undefined;\n private connection: IDocumentDeltaConnection | undefined;\n private clientSequenceNumber = 0;\n private clientSequenceNumberObserved = 0;\n // Counts the number of noops sent by the client which may not be acked.\n private trailingNoopCount = 0;\n private closed = false;\n private readonly deltaStreamDelayId = uuid();\n private readonly deltaStorageDelayId = uuid();\n\n // track clientId used last time when we sent any ops\n private lastSubmittedClientId: string | undefined;\n\n private handler: IDeltaHandlerStrategy | undefined;\n private deltaStorage: IDocumentDeltaStorageService | undefined;\n\n private messageBuffer: IDocumentMessage[] = [];\n\n private connectFirstConnection = true;\n private readonly throttlingIdSet = new Set<string>();\n private timeTillThrottling: number = 0;\n\n private connectionStateProps: Record<string, string | number> = {};\n\n // True if current connection has checkpoint information\n // I.e. we know how far behind the client was at the time of establishing connection\n private _hasCheckpointSequenceNumber = false;\n\n private readonly closeAbortController = new AbortController();\n\n /**\n * Tells if current connection has checkpoint information.\n * I.e. we know how far behind the client was at the time of establishing connection\n */\n public get hasCheckpointSequenceNumber() {\n // Valid to be called only if we have active connection.\n assert(this.connection !== undefined, 0x0df /* \"Missing active connection\" */);\n return this._hasCheckpointSequenceNumber;\n }\n\n public get inbound(): IDeltaQueue<ISequencedDocumentMessage> {\n return this._inbound;\n }\n\n public get outbound(): IDeltaQueue<IDocumentMessage[]> {\n return this._outbound;\n }\n\n public get inboundSignal(): IDeltaQueue<ISignalMessage> {\n return this._inboundSignal;\n }\n\n public get initialSequenceNumber(): number {\n return this.initSequenceNumber;\n }\n\n public get lastSequenceNumber(): number {\n return this.lastProcessedSequenceNumber;\n }\n\n public get lastMessage() {\n return this.lastProcessedMessage;\n }\n\n public get lastKnownSeqNumber() {\n return this.lastObservedSeqNumber;\n }\n\n public get referenceTerm(): number {\n return this.baseTerm;\n }\n\n public get minimumSequenceNumber(): number {\n return this.minSequenceNumber;\n }\n\n public get maxMessageSize(): number {\n return this.connection?.serviceConfiguration?.maxMessageSize\n ?? this.connection?.maxMessageSize\n ?? DefaultChunkSize;\n }\n\n public get version(): string {\n if (this.connection === undefined) {\n throw new Error(\"Cannot check version without a connection\");\n }\n return this.connection.version;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.connection?.serviceConfiguration;\n }\n\n public get scopes(): string[] | undefined {\n return this.connection?.claims.scopes;\n }\n\n public get socketDocumentId(): string | undefined {\n return this.connection?.claims.documentId;\n }\n\n /**\n * The current connection mode, initially read.\n */\n public get connectionMode(): ConnectionMode {\n if (this.connection === undefined) {\n return \"read\";\n }\n return this.connection.mode;\n }\n\n /**\n * Tells if container is in read-only mode.\n * Data stores should listen for \"readonly\" notifications and disallow user\n * making changes to data stores.\n * Readonly state can be because of no storage write permission,\n * or due to host forcing readonly mode for container.\n * It is undefined if we have not yet established websocket connection\n * and do not know if user has write access to a file.\n * @deprecated - use readOnlyInfo\n */\n public get readonly() {\n if (this._forceReadonly) {\n return true;\n }\n return this._readonlyPermissions;\n }\n\n /**\n * Tells if user has no write permissions for file in storage\n * It is undefined if we have not yet established websocket connection\n * and do not know if user has write access to a file.\n * @deprecated - use readOnlyInfo\n */\n public get readonlyPermissions() {\n return this._readonlyPermissions;\n }\n\n public get readOnlyInfo(): ReadOnlyInfo {\n const storageOnly = this.connection !== undefined && this.connection instanceof NoDeltaStream;\n if (storageOnly || this._forceReadonly || this._readonlyPermissions === true) {\n return {\n readonly: true,\n forced: this._forceReadonly,\n permissions: this._readonlyPermissions,\n storageOnly,\n };\n }\n\n return { readonly: this._readonlyPermissions };\n }\n\n /**\n * Automatic reconnecting enabled or disabled.\n * If set to Never, then reconnecting will never be allowed.\n */\n public get reconnectMode(): ReconnectMode {\n return this._reconnectMode;\n }\n\n public shouldJoinWrite(): boolean {\n // We don't have to wait for ack for topmost NoOps. So subtract those.\n return this.clientSequenceNumberObserved < (this.clientSequenceNumber - this.trailingNoopCount);\n }\n /**\n * Returns set of props that can be logged in telemetry that provide some insights / statistics\n * about current or last connection (if there is no connection at the moment)\n */\n public connectionProps(): ITelemetryProperties {\n if (this.connection !== undefined) {\n return {\n sequenceNumber: this.lastSequenceNumber,\n connectionMode: this.connectionMode,\n };\n } else {\n return {\n // Report how many ops this client sent in last disconnected session\n sentOps: this.clientSequenceNumber,\n };\n }\n }\n\n /**\n * Enables or disables automatic reconnecting.\n * Will throw an error if reconnectMode set to Never.\n */\n public setAutomaticReconnect(reconnect: boolean): void {\n assert(\n this._reconnectMode !== ReconnectMode.Never,\n 0x0e1 /* \"Cannot toggle automatic reconnect if reconnect is set to Never.\" */);\n this._reconnectMode = reconnect ? ReconnectMode.Enabled : ReconnectMode.Disabled;\n }\n\n /**\n * Sends signal to runtime (and data stores) to be read-only.\n * Hosts may have read only views, indicating to data stores that no edits are allowed.\n * This is independent from this._readonlyPermissions (permissions) and this.connectionMode\n * (server can return \"write\" mode even when asked for \"read\")\n * Leveraging same \"readonly\" event as runtime & data stores should behave the same in such case\n * as in read-only permissions.\n * But this.active can be used by some DDSes to figure out if ops can be sent\n * (for example, read-only view still participates in code proposals / upgrades decisions)\n *\n * Forcing Readonly does not prevent DDS from generating ops. It is up to user code to honour\n * the readonly flag. If ops are generated, they will accumulate locally and not be sent. If\n * there are pending in the outbound queue, it will stop sending until force readonly is\n * cleared.\n *\n * @param readonly - set or clear force readonly.\n */\n public forceReadonly(readonly: boolean) {\n if (readonly !== this._forceReadonly) {\n this.logger.sendTelemetryEvent({\n eventName: \"ForceReadOnly\",\n value: readonly,\n });\n }\n const oldValue = this.readonly;\n this._forceReadonly = readonly;\n if (oldValue !== this.readonly) {\n let reconnect = false;\n if (this.readonly === true) {\n // If we switch to readonly while connected, we should disconnect first\n // See comment in the \"readonly\" event handler to deltaManager set up by\n // the ContainerRuntime constructor\n\n if (this.shouldJoinWrite()) {\n // If we have pending changes, then we will never send them - it smells like\n // host logic error.\n this.logger.sendErrorEvent({ eventName: \"ForceReadonlyPendingChanged\" });\n }\n\n reconnect = this.disconnectFromDeltaStream(\"Force readonly\");\n }\n safeRaiseEvent(this, this.logger, \"readonly\", this.readonly);\n if (reconnect) {\n // reconnect if we disconnected from before.\n this.triggerConnect({ reason: \"forceReadonly\", mode: \"read\", fetchOpsFromStorage: false });\n }\n }\n }\n\n public triggerConnectionRecovery(reason: string, props: ITelemetryProperties) {\n assert(this.connection !== undefined, 0x238 /* \"called only in connected state\" */);\n this.logger.sendErrorEvent({\n eventName: \"ConnectionRecovery\",\n reason,\n // This directly tells us if fetching ops is in flight, and thus likely the reason of\n // stalled op processing\n fetchReason: this.fetchReason,\n ...props,\n });\n this.disconnectFromDeltaStream(reason);\n this.triggerConnect({ reason, mode: \"read\", fetchOpsFromStorage: false });\n }\n\n private set_readonlyPermissions(readonly: boolean) {\n const oldValue = this.readonly;\n this._readonlyPermissions = readonly;\n if (oldValue !== this.readonly) {\n safeRaiseEvent(this, this.logger, \"readonly\", this.readonly);\n }\n }\n\n constructor(\n private readonly serviceProvider: () => IDocumentService | undefined,\n private client: IClient,\n private readonly logger: ITelemetryLogger,\n reconnectAllowed: boolean,\n private readonly _active: () => boolean,\n ) {\n super();\n\n this.clientDetails = this.client.details;\n this.defaultReconnectionMode = this.client.mode;\n this._reconnectMode = reconnectAllowed ? ReconnectMode.Enabled : ReconnectMode.Never;\n\n this._inbound = new DeltaQueue<ISequencedDocumentMessage>(\n (op) => {\n this.processInboundMessage(op);\n });\n\n this._inbound.on(\"error\", (error) => {\n this.close(CreateProcessingError(error, \"deltaManagerInboundErrorHandler\", this.lastMessage));\n });\n\n // Outbound message queue. The outbound queue is represented as a queue of an array of ops. Ops contained\n // within an array *must* fit within the maxMessageSize and are guaranteed to be ordered sequentially.\n this._outbound = new DeltaQueue<IDocumentMessage[]>(\n (messages) => {\n if (this.connection === undefined) {\n throw new Error(\"Attempted to submit an outbound message without connection\");\n }\n this.connection.submit(messages);\n });\n\n this._outbound.on(\"error\", (error) => {\n this.close(normalizeError(error));\n });\n\n // Inbound signal queue\n this._inboundSignal = new DeltaQueue<ISignalMessage>((message) => {\n if (this.handler === undefined) {\n throw new Error(\"Attempted to process an inbound signal without a handler attached\");\n }\n this.handler.processSignal({\n clientId: message.clientId,\n content: JSON.parse(message.content as string),\n });\n });\n\n this._inboundSignal.on(\"error\", (error) => {\n this.close(normalizeError(error));\n });\n\n // Initially, all queues are created paused.\n // - outbound is flipped back and forth in setupNewSuccessfulConnection / disconnectFromDeltaStream\n // - inbound & inboundSignal are resumed in attachOpHandler() when we have handler setup\n }\n\n public dispose() {\n throw new Error(\"Not implemented.\");\n }\n\n /**\n * Sets the sequence number from which inbound messages should be returned\n */\n public attachOpHandler(\n minSequenceNumber: number,\n sequenceNumber: number,\n term: number,\n handler: IDeltaHandlerStrategy,\n ) {\n this.initSequenceNumber = sequenceNumber;\n this.lastProcessedSequenceNumber = sequenceNumber;\n this.baseTerm = term;\n this.minSequenceNumber = minSequenceNumber;\n this.lastQueuedSequenceNumber = sequenceNumber;\n this.lastObservedSeqNumber = sequenceNumber;\n\n // We will use same check in other places to make sure all the seq number above are set properly.\n assert(this.handler === undefined, 0x0e2 /* \"DeltaManager already has attached op handler!\" */);\n this.handler = handler;\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n assert(!!(this.handler as any), 0x0e3 /* \"Newly set op handler is null/undefined!\" */);\n\n this._inbound.resume();\n this._inboundSignal.resume();\n\n // We could have connected to delta stream before getting here\n // If so, it's time to process any accumulated ops, as there might be no other event that\n // will force these pending ops to be processed.\n // Or request OPs from snapshot / or point zero (if we have no ops at all)\n if (this.pending.length > 0) {\n this.processPendingOps(\"DocumentOpen\");\n }\n }\n\n public async preFetchOps(cacheOnly: boolean) {\n // Note that might already got connected to delta stream by now.\n // If we did, then we proactively fetch ops at the end of setupNewSuccessfulConnection to ensure\n if (this.connection === undefined) {\n return this.fetchMissingDeltasCore(\"DocumentOpen\", cacheOnly, this.lastQueuedSequenceNumber, undefined);\n }\n }\n\n private static detailsFromConnection(connection: IDocumentDeltaConnection): IConnectionDetails {\n return {\n claims: connection.claims,\n clientId: connection.clientId,\n existing: connection.existing,\n checkpointSequenceNumber: connection.checkpointSequenceNumber,\n get initialClients() { return connection.initialClients; },\n maxMessageSize: connection.maxMessageSize,\n mode: connection.mode,\n serviceConfiguration: connection.serviceConfiguration,\n version: connection.version,\n };\n }\n\n public async connect(args: IConnectionArgs): Promise<IConnectionDetails> {\n const connection = await this.connectCore(args);\n return DeltaManager.detailsFromConnection(connection);\n }\n\n /**\n * Start the connection. Any error should result in container being close.\n * And report the error if it excape for any reason.\n * @param args - The connection arguments\n */\n private triggerConnect(args: IConnectionArgs) {\n assert(this.connection === undefined, 0x239 /* \"called only in disconnected state\" */);\n if (this.reconnectMode !== ReconnectMode.Enabled) {\n return;\n }\n this.connectCore(args).catch((err) => {\n // Errors are raised as \"error\" event and close container.\n // Have a catch-all case in case we missed something\n if (!this.closed) {\n this.logger.sendErrorEvent({ eventName: \"ConnectException\" }, err);\n }\n });\n }\n\n private async connectCore(args: IConnectionArgs): Promise<IDocumentDeltaConnection> {\n if (this.connection !== undefined) {\n return this.connection;\n }\n\n if (this.connectionP !== undefined) {\n return this.connectionP;\n }\n\n const fetchOpsFromStorage = args.fetchOpsFromStorage ?? true;\n let requestedMode = args.mode ?? this.defaultReconnectionMode;\n\n // if we have any non-acked ops from last connection, reconnect as \"write\".\n // without that we would connect in view-only mode, which will result in immediate\n // firing of \"connected\" event from Container and switch of current clientId (as tracked\n // by all DDSes). This will make it impossible to figure out if ops actually made it through,\n // so DDSes will immediately resubmit all pending ops, and some of them will be duplicates, corrupting document\n if (this.shouldJoinWrite()) {\n requestedMode = \"write\";\n }\n\n // Note: There is race condition here.\n // We want to issue request to storage as soon as possible, to\n // reduce latency of becoming current, thus this code here.\n // But there is no ordering between fetching OPs and connection to delta stream\n // As result, we might be behind by the time we connect to delta stream\n // In case of r/w connection, that's not an issue, because we will hear our\n // own \"join\" message and realize any gap client has in ops.\n // But for view-only connection, we have no such signal, and with no traffic\n // on the wire, we might be always behind.\n // See comment at the end of setupNewSuccessfulConnection()\n logIfFalse(\n this.handler !== undefined || !fetchOpsFromStorage,\n this.logger,\n \"CantFetchWithoutBaseline\"); // can't fetch if no baseline\n if (fetchOpsFromStorage && this.handler !== undefined) {\n this.fetchMissingDeltas(args.reason, this.lastQueuedSequenceNumber);\n }\n\n const docService = this.serviceProvider();\n if (docService === undefined) {\n throw new Error(\"Container is not attached\");\n }\n\n if (docService.policies?.storageOnly === true) {\n const connection = new NoDeltaStream();\n this.connectionP = new Promise((resolve) => {\n this.setupNewSuccessfulConnection(connection, \"read\");\n resolve(connection);\n });\n return this.connectionP;\n }\n\n // The promise returned from connectCore will settle with a resolved connection or reject with error\n const connectCore = async () => {\n let connection: IDocumentDeltaConnection | undefined;\n let delayMs = InitialReconnectDelayInMs;\n let connectRepeatCount = 0;\n const connectStartTime = performance.now();\n\n // This loop will keep trying to connect until successful, with a delay between each iteration.\n while (connection === undefined) {\n if (this.closed) {\n throw new Error(\"Attempting to connect a closed DeltaManager\");\n }\n connectRepeatCount++;\n\n try {\n this.client.mode = requestedMode;\n connection = await docService.connectToDeltaStream(this.client);\n } catch (origError) {\n if (typeof origError === \"object\" && origError !== null &&\n origError?.errorType === DeltaStreamConnectionForbiddenError.errorType) {\n connection = new NoDeltaStream();\n requestedMode = \"read\";\n break;\n }\n\n // Socket.io error when we connect to wrong socket, or hit some multiplexing bug\n if (!canRetryOnError(origError)) {\n const error = normalizeError(origError);\n this.close(error);\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw error;\n }\n\n // Log error once - we get too many errors in logs when we are offline,\n // and unfortunately there is no reliable way to detect that.\n if (connectRepeatCount === 1) {\n logNetworkFailure(\n this.logger,\n {\n delay: delayMs, // milliseconds\n eventName: \"DeltaConnectionFailureToConnect\",\n },\n origError);\n }\n\n const retryDelayFromError = getRetryDelayFromError(origError);\n delayMs = retryDelayFromError ?? Math.min(delayMs * 2, MaxReconnectDelayInMs);\n\n if (retryDelayFromError !== undefined) {\n this.emitDelayInfo(this.deltaStreamDelayId, retryDelayFromError, origError);\n }\n await waitForConnectedState(delayMs);\n }\n }\n\n // If we retried more than once, log an event about how long it took\n if (connectRepeatCount > 1) {\n this.logger.sendTelemetryEvent({\n attempts: connectRepeatCount,\n duration: TelemetryLogger.formatTick(performance.now() - connectStartTime),\n eventName: \"MultipleDeltaConnectionFailures\",\n });\n }\n\n this.setupNewSuccessfulConnection(connection, requestedMode);\n\n return connection;\n };\n\n // This promise settles as soon as we know the outcome of the connection attempt\n this.connectionP = new Promise((resolve, reject) => {\n // Regardless of how the connection attempt concludes, we'll clear the promise and remove the listener\n\n // Reject the connection promise if the DeltaManager gets closed during connection\n const cleanupAndReject = (error) => {\n this.connectionP = undefined;\n this.removeListener(\"closed\", cleanupAndReject);\n reject(error);\n };\n this.on(\"closed\", cleanupAndReject);\n\n // Attempt the connection\n connectCore().then((connection) => {\n this.connectionP = undefined;\n this.removeListener(\"closed\", cleanupAndReject);\n resolve(connection);\n }).catch(cleanupAndReject);\n });\n\n return this.connectionP;\n }\n\n public flush() {\n if (this.messageBuffer.length === 0) {\n return;\n }\n\n // The prepareFlush event allows listeners to append metadata to the batch prior to submission.\n this.emit(\"prepareSend\", this.messageBuffer);\n\n this._outbound.push(this.messageBuffer);\n this.messageBuffer = [];\n }\n\n /**\n * Submits the given delta returning the client sequence number for the message. Contents is the actual\n * contents of the message. appData is optional metadata that can be attached to the op by the app.\n *\n * If batch is set to true then the submit will be batched - and as a result guaranteed to be ordered sequentially\n * in the global sequencing space. The batch will be flushed either when flush is called or when a non-batched\n * op is submitted.\n */\n public submit(type: MessageType, contents: any, batch = false, metadata?: any): number {\n // TODO need to fail if gets too large\n // const serializedContent = JSON.stringify(this.messageBuffer);\n // const maxOpSize = this.context.deltaManager.maxMessageSize;\n\n if (this.readonly === true) {\n assert(this.readOnlyInfo.readonly === true, 0x1f0 /* \"Unexpected mismatch in readonly\" */);\n const error = new GenericError(\"deltaManagerReadonlySubmit\", undefined /* error */, {\n readonly: this.readOnlyInfo.readonly,\n forcedReadonly: this.readOnlyInfo.forced,\n readonlyPermissions: this.readOnlyInfo.permissions,\n storageOnly: this.readOnlyInfo.storageOnly,\n });\n this.close(error);\n return -1;\n }\n\n // reset clientSequenceNumber if we are using new clientId.\n // we keep info about old connection as long as possible to be able to account for all non-acked ops\n // that we pick up on next connection.\n assert(!!this.connection, 0x0e4 /* \"Lost old connection!\" */);\n if (this.lastSubmittedClientId !== this.connection?.clientId) {\n this.lastSubmittedClientId = this.connection?.clientId;\n this.clientSequenceNumber = 0;\n this.clientSequenceNumberObserved = 0;\n }\n\n const service = this.clientDetails.type === undefined || this.clientDetails.type === \"\"\n ? \"unknown\"\n : this.clientDetails.type;\n\n // Start adding trace for the op.\n const traces: ITrace[] = [\n {\n action: \"start\",\n service,\n timestamp: Date.now(),\n }];\n\n const message: IDocumentMessage = {\n clientSequenceNumber: ++this.clientSequenceNumber,\n contents: JSON.stringify(contents),\n metadata,\n referenceSequenceNumber: this.lastProcessedSequenceNumber,\n traces,\n type,\n };\n\n if (type === MessageType.NoOp) {\n this.trailingNoopCount++;\n } else {\n this.trailingNoopCount = 0;\n }\n\n this.emit(\"submitOp\", message);\n\n if (!batch) {\n this.flush();\n this.messageBuffer.push(message);\n this.flush();\n } else {\n this.messageBuffer.push(message);\n }\n\n return message.clientSequenceNumber;\n }\n\n public submitSignal(content: any) {\n if (this.connection !== undefined) {\n this.connection.submitSignal(content);\n } else {\n this.logger.sendErrorEvent({ eventName: \"submitSignalDisconnected\" });\n }\n }\n\n private async getDeltas(\n from: number, // inclusive\n to: number | undefined, // exclusive\n callback: (messages: ISequencedDocumentMessage[]) => void,\n cacheOnly: boolean)\n {\n const docService = this.serviceProvider();\n if (docService === undefined) {\n throw new Error(\"Delta manager is not attached\");\n }\n\n if (this.deltaStorage === undefined) {\n this.deltaStorage = await docService.connectToDeltaStorage();\n }\n\n let controller = this.closeAbortController;\n let listenerToClear: ((op: ISequencedDocumentMessage) => void) | undefined;\n\n if (to !== undefined) {\n const lastExpectedOp = to - 1; // make it inclusive!\n\n // It is possible that due to asynchrony (including await above), required ops were already\n // received through delta stream. Validate that before moving forward.\n if (this.lastQueuedSequenceNumber >= lastExpectedOp) {\n this.logger.sendPerformanceEvent({\n reason: this.fetchReason,\n eventName: \"ExtraStorageCall\",\n early: true,\n from,\n to,\n ...this.connectionStateProps,\n });\n return;\n }\n\n controller = new AbortController();\n\n assert(this.closeAbortController.signal.onabort === null, 0x1e8 /* \"reentrancy\" */);\n this.closeAbortController.signal.onabort = () => controller.abort();\n\n const listener = (op: ISequencedDocumentMessage) => {\n // Be prepared for the case where webSocket would receive the ops that we are trying to fill through\n // storage. Ideally it should never happen (i.e. ops on socket are always ordered, and thus once we\n // detected gap, this gap can't be filled in later on through websocket).\n // And in practice that does look like the case. The place where this code gets hit is if we lost\n // connection and reconnected (likely to another box), and new socket's initial ops contains these ops.\n assert(op.sequenceNumber === this.lastQueuedSequenceNumber, 0x23a /* \"seq#'s\" */);\n if (this.lastQueuedSequenceNumber >= lastExpectedOp) {\n controller.abort();\n this._inbound.off(\"push\", listener);\n }\n };\n this._inbound.on(\"push\", listener);\n listenerToClear = listener;\n }\n\n try {\n const stream = this.deltaStorage.fetchMessages(\n from, // inclusive\n to, // exclusive\n controller.signal,\n cacheOnly);\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const result = await stream.read();\n if (result.done) {\n break;\n }\n callback(result.value);\n }\n } finally {\n this.closeAbortController.signal.onabort = null;\n if (listenerToClear !== undefined) {\n this._inbound.off(\"push\", listenerToClear);\n }\n }\n }\n\n /**\n * Closes the connection and clears inbound & outbound queues.\n */\n public close(error?: ICriticalContainerError): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n\n this.closeAbortController.abort();\n\n // This raises \"disconnect\" event if we have active connection.\n this.disconnectFromDeltaStream(error !== undefined ? `${error.message}` : \"Container closed\");\n\n this._inbound.clear();\n this._outbound.clear();\n this._inboundSignal.clear();\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._inbound.pause();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._inboundSignal.pause();\n\n // Drop pending messages - this will ensure catchUp() does not go into infinite loop\n this.pending = [];\n\n // Notify everyone we are in read-only state.\n // Useful for data stores in case we hit some critical error,\n // to switch to a mode where user edits are not accepted\n this.set_readonlyPermissions(true);\n\n // This needs to be the last thing we do (before removing listeners), as it causes\n // Container to dispose context and break ability of data stores / runtime to \"hear\"\n // from delta manager, including notification (above) about readonly state.\n this.emit(\"closed\", error);\n\n this.removeAllListeners();\n }\n\n public refreshDelayInfo(id: string) {\n this.throttlingIdSet.delete(id);\n if (this.throttlingIdSet.size === 0) {\n this.timeTillThrottling = 0;\n }\n }\n\n /**\n * Emit info about a delay in service communication on account of throttling.\n * @param id - Id of the connection that is delayed\n * @param delayMs - Duration of the delay\n * @param error - error objecct indicating the throttling\n */\n public emitDelayInfo(id: string, delayMs: number, error: unknown) {\n const timeNow = Date.now();\n this.throttlingIdSet.add(id);\n if (delayMs > 0 && (timeNow + delayMs > this.timeTillThrottling)) {\n this.timeTillThrottling = timeNow + delayMs;\n\n const throttlingWarning: IThrottlingWarning = ThrottlingWarning.wrap(\n error,\n \"Service busy/throttled\",\n delayMs / 1000 /* retryAfterSeconds */,\n this.logger,\n );\n this.emit(\"throttled\", throttlingWarning);\n }\n }\n\n private readonly opHandler = (documentId: string, messagesArg: ISequencedDocumentMessage[]) => {\n const messages = Array.isArray(messagesArg) ? messagesArg : [messagesArg];\n this.enqueueMessages(messages, \"opHandler\");\n };\n\n private readonly signalHandler = (message: ISignalMessage) => {\n this._inboundSignal.push(message);\n };\n\n // Always connect in write mode after getting nacked.\n private readonly nackHandler = (documentId: string, messages: INack[]) => {\n const message = messages[0];\n // TODO: we should remove this check when service updates?\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (this._readonlyPermissions) {\n this.close(createWriteError(\"WriteOnReadOnlyDocument\"));\n }\n\n // check message.content for Back-compat with old service.\n const reconnectInfo = message.content !== undefined\n ? getNackReconnectInfo(message.content) :\n createGenericNetworkError(`Nack: unknown reason`, true);\n\n if (this.reconnectMode !== ReconnectMode.Enabled) {\n this.logger.sendErrorEvent({\n eventName: \"NackWithNoReconnect\",\n reason: reconnectInfo.message,\n mode: this.connectionMode,\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.reconnectOnError(\n \"write\",\n reconnectInfo,\n );\n };\n\n // Connection mode is always read on disconnect/error unless the system mode was write.\n private readonly disconnectHandler = (disconnectReason) => {\n // Note: we might get multiple disconnect calls on same socket, as early disconnect notification\n // (\"server_disconnect\", ODSP-specific) is mapped to \"disconnect\"\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.reconnectOnError(\n this.defaultReconnectionMode,\n createReconnectError(\"Disconnect\", disconnectReason),\n );\n };\n\n private readonly errorHandler = (error) => {\n // Observation based on early pre-production telemetry:\n // We are getting transport errors from WebSocket here, right before or after \"disconnect\".\n // This happens only in Firefox.\n logNetworkFailure(this.logger, { eventName: \"DeltaConnectionError\" }, error);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.reconnectOnError(\n this.defaultReconnectionMode,\n createReconnectError(\"error\", error),\n );\n };\n\n private readonly pongHandler = (latency: number) => {\n this.emit(\"pong\", latency);\n };\n\n /**\n * Once we've successfully gotten a connection, we need to set up state, attach event listeners, and process\n * initial messages.\n * @param connection - The newly established connection\n */\n private setupNewSuccessfulConnection(connection: IDocumentDeltaConnection, requestedMode: ConnectionMode) {\n // Old connection should have been cleaned up before establishing a new one\n assert(this.connection === undefined, 0x0e6 /* \"old connection exists on new connection setup\" */);\n\n // back-compat: added in 0.45. Make it unconditional (i.e. use connection.disposable) in some future.\n const disposable = connection as Partial<IDisposable>;\n if (disposable.disposed === true) {\n this.logger.sendTelemetryEvent({ eventName: \"ReceivedClosedConnection\" });\n // Note: not checking this.reconnectMode mode here as nobody ever observed this connection, so\n // none of invariants is broken if reconnect happens.\n this.triggerConnect({\n reason: \"early connection closure\",\n mode: requestedMode,\n fetchOpsFromStorage: false,\n });\n return;\n }\n\n this.connection = connection;\n\n // Does information in scopes & mode matches?\n // If we asked for \"write\" and got \"read\", then file is read-only\n // But if we ask read, server can still give us write.\n const readonly = !connection.claims.scopes.includes(ScopeType.DocWrite);\n\n // This connection mode validation logic is moving to the driver layer in 0.44. These two asserts can be\n // removed after those packages have released and become ubiquitous.\n assert(requestedMode === \"read\" || readonly === (this.connectionMode === \"read\"),\n 0x0e7 /* \"claims/connectionMode mismatch\" */);\n assert(!readonly || this.connectionMode === \"read\", 0x0e8 /* \"readonly perf with write connection\" */);\n\n this.set_readonlyPermissions(readonly);\n\n this.refreshDelayInfo(this.deltaStreamDelayId);\n\n if (this.closed) {\n // Raise proper events, Log telemetry event and close connection.\n this.disconnectFromDeltaStream(`Disconnect on close`);\n return;\n }\n\n // We cancel all ops on lost of connectivity, and rely on DDSes to resubmit them.\n // Semantics are not well defined for batches (and they are broken right now on disconnects anyway),\n // but it's safe to assume (until better design is put into place) that batches should not exist\n // across multiple connections. Right now we assume runtime will not submit any ops in disconnected\n // state. As requirements change, so should these checks.\n assert(this.messageBuffer.length === 0, 0x0e9 /* \"messageBuffer is not empty on new connection\" */);\n\n this._outbound.resume();\n\n connection.on(\"op\", this.opHandler);\n connection.on(\"signal\", this.signalHandler);\n connection.on(\"nack\", this.nackHandler);\n connection.on(\"disconnect\", this.disconnectHandler);\n connection.on(\"error\", this.errorHandler);\n connection.on(\"pong\", this.pongHandler);\n\n // Initial messages are always sorted. However, due to early op handler installed by drivers and appending those\n // ops to initialMessages, resulting set is no longer sorted, which would result in client hitting storage to\n // fill in gap. We will recover by cancelling this request once we process remaining ops, but it's a waste that\n // we could avoid\n const initialMessages = connection.initialMessages.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n\n this.connectionStateProps = {\n connectionLastQueuedSequenceNumber : this.lastQueuedSequenceNumber,\n connectionLastObservedSeqNumber: this.lastObservedSeqNumber,\n clientId: connection.clientId,\n mode: connection.mode,\n };\n this._hasCheckpointSequenceNumber = false;\n\n // Some storages may provide checkpointSequenceNumber to identify how far client is behind.\n const checkpointSequenceNumber = connection.checkpointSequenceNumber;\n if (checkpointSequenceNumber !== undefined) {\n this._hasCheckpointSequenceNumber = true;\n this.updateLatestKnownOpSeqNumber(checkpointSequenceNumber);\n }\n\n // Update knowledge of how far we are behind, before raising \"connect\" event\n // This is duplication of what enqueueMessages() does, but we have to raise event before we get there,\n // so duplicating update logic here as well.\n const last = initialMessages.length > 0 ? initialMessages[initialMessages.length - 1].sequenceNumber : -1;\n if (initialMessages.length > 0) {\n this._hasCheckpointSequenceNumber = true;\n this.updateLatestKnownOpSeqNumber(last);\n }\n\n // Notify of the connection\n // WARNING: This has to happen before processInitialMessages() call below.\n // If not, we may not update Container.pendingClientId in time before seeing our own join session op.\n this.emit(\n \"connect\",\n DeltaManager.detailsFromConnection(connection),\n this._hasCheckpointSequenceNumber ? this.lastObservedSeqNumber - this.lastSequenceNumber : undefined);\n\n this.enqueueMessages(\n initialMessages,\n this.connectFirstConnection ? \"InitialOps\" : \"ReconnectOps\");\n\n if (connection.initialSignals !== undefined) {\n for (const signal of connection.initialSignals) {\n this._inboundSignal.push(signal);\n }\n }\n\n // If we got some initial ops, then we know the gap and call above fetched ops to fill it.\n // Same is true for \"write\" mode even if we have no ops - we will get self \"join\" ops very very soon.\n // However if we are connecting as view-only, then there is no good signal to realize if client is behind.\n // Thus we have to hit storage to see if any ops are there.\n if (initialMessages.length === 0) {\n if (checkpointSequenceNumber !== undefined) {\n // We know how far we are behind (roughly). If it's non-zero gap, fetch ops right away.\n if (checkpointSequenceNumber > this.lastQueuedSequenceNumber) {\n this.fetchMissingDeltas(\"AfterConnection\", this.lastQueuedSequenceNumber);\n }\n // we do not know the gap, and we will not learn about it if socket is quite - have to ask.\n } else if (connection.mode === \"read\") {\n this.fetchMissingDeltas(\"AfterReadConnection\", this.lastQueuedSequenceNumber);\n }\n } else {\n this.connectionStateProps.connectionInitialOpsFrom = initialMessages[0].sequenceNumber;\n this.connectionStateProps.connectionInitialOpsTo = last + 1;\n }\n\n this.connectFirstConnection = false;\n }\n\n /**\n * Disconnect the current connection.\n * @param reason - Text description of disconnect reason to emit with disconnect event\n */\n private disconnectFromDeltaStream(reason: string) {\n if (this.connection === undefined) {\n return false;\n }\n\n const connection = this.connection;\n // Avoid any re-entrancy - clear object reference\n this.connection = undefined;\n\n // Remove listeners first so we don't try to retrigger this flow accidentally through reconnectOnError\n connection.off(\"op\", this.opHandler);\n connection.off(\"signal\", this.signalHandler);\n connection.off(\"nack\", this.nackHandler);\n connection.off(\"disconnect\", this.disconnectHandler);\n connection.off(\"error\", this.errorHandler);\n connection.off(\"pong\", this.pongHandler);\n\n // We cancel all ops on lost of connectivity, and rely on DDSes to resubmit them.\n // Semantics are not well defined for batches (and they are broken right now on disconnects anyway),\n // but it's safe to assume (until better design is put into place) that batches should not exist\n // across multiple connections. Right now we assume runtime will not submit any ops in disconnected\n // state. As requirements change, so should these checks.\n assert(this.messageBuffer.length === 0, 0x0ea /* \"messageBuffer is not empty on disconnect\" */);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._outbound.pause();\n this._outbound.clear();\n this.emit(\"disconnect\", reason);\n\n // back-compat: added in 0.45. Make it unconditional (i.e. use connection.dispose()) in some future.\n const disposable = connection as Partial<IDisposable>;\n\n if (disposable.dispose !== undefined) {\n disposable.dispose();\n } else {\n connection.close();\n }\n\n this.connectionStateProps = {};\n\n return true;\n }\n\n /**\n * Disconnect the current connection and reconnect.\n * @param connection - The connection that wants to reconnect - no-op if it's different from this.connection\n * @param requestedMode - Read or write\n * @param error - Error reconnect information including whether or not to reconnect\n * @returns A promise that resolves when the connection is reestablished or we stop trying\n */\n private async reconnectOnError(\n requestedMode: ConnectionMode,\n error: DriverError,\n ) {\n // We quite often get protocol errors before / after observing nack/disconnect\n // we do not want to run through same sequence twice.\n // If we're already disconnected/disconnecting it's not appropriate to call this again.\n assert(this.connection !== undefined, 0x0eb /* \"Missing connection for reconnect\" */);\n\n this.disconnectFromDeltaStream(error.message);\n\n // If reconnection is not an option, close the DeltaManager\n const canRetry = canRetryOnError(error);\n if (this.reconnectMode === ReconnectMode.Never || !canRetry) {\n // Do not raise container error if we are closing just because we lost connection.\n // Those errors (like IdleDisconnect) would show up in telemetry dashboards and\n // are very misleading, as first initial reaction - some logic is broken.\n this.close(canRetry ? undefined : error);\n }\n\n // If closed then we can't reconnect\n if (this.closed) {\n return;\n }\n\n if (this.reconnectMode === ReconnectMode.Enabled) {\n const delayMs = getRetryDelayFromError(error);\n if (delayMs !== undefined) {\n this.emitDelayInfo(this.deltaStreamDelayId, delayMs, error);\n await waitForConnectedState(delayMs);\n }\n\n this.triggerConnect({ reason: \"reconnect\", mode: requestedMode, fetchOpsFromStorage: false });\n }\n }\n\n // returns parts of message (in string format) that should never change for a given message.\n // Used for message comparison. It attempts to avoid comparing fields that potentially may differ.\n // for example, it's not clear if serverMetadata or timestamp property is a property of message or server state.\n // We only extract the most obvious fields that are sufficient (with high probability) to detect sequence number\n // reuse.\n // Also payload goes to telemetry, so no PII, including content!!\n // Note: It's possible for a duplicate op to be broadcasted and have everything the same except the timestamp.\n private comparableMessagePayload(m: ISequencedDocumentMessage) {\n return `${m.clientId}-${m.type}-${m.minimumSequenceNumber}-${m.referenceSequenceNumber}-${m.timestamp}`;\n }\n\n private enqueueMessages(\n messages: ISequencedDocumentMessage[],\n reason: string,\n allowGaps = false,\n ): void {\n if (this.handler === undefined) {\n // We did not setup handler yet.\n // This happens when we connect to web socket faster than we get attributes for container\n // and thus faster than attachOpHandler() is called\n // this.lastProcessedSequenceNumber is still zero, so we can't rely on this.fetchMissingDeltas()\n // to do the right thing.\n this.pending = this.pending.concat(messages);\n return;\n }\n\n // Pending ops should never just hang around for nothing.\n // This invariant will stay true through this function execution,\n // so there is no need to process pending ops here.\n // It's responsibility of\n // - attachOpHandler()\n // - fetchMissingDeltas() after it's done with querying storage\n assert(this.pending.length === 0 || this.fetchReason !== undefined, 0x1e9 /* \"Pending ops\" */);\n\n if (messages.length === 0) {\n return;\n }\n\n const from = messages[0].sequenceNumber;\n const last = messages[messages.length - 1].sequenceNumber;\n\n // Report stats about missing and duplicate ops\n // This helps better understand why we fetch ops from storage, and thus may delay\n // getting current / sending ops\n // It's possible that this batch is already too late - do not bother\n if (last > this.lastQueuedSequenceNumber) {\n let prev = from - 1;\n const initialGap = prev - this.lastQueuedSequenceNumber;\n let firstMissing: number | undefined;\n let duplicate = 0;\n let gap = 0;\n\n // Count all gaps and duplicates\n for (const message of messages) {\n if (message.sequenceNumber === prev) {\n duplicate++;\n } else if (message.sequenceNumber !== prev + 1) {\n gap++;\n if (firstMissing === undefined) {\n firstMissing = prev + 1;\n }\n }\n prev = message.sequenceNumber;\n }\n\n let eventName: string | undefined;\n\n // Report if we found some issues\n if (duplicate !== 0 || gap !== 0 && !allowGaps || initialGap > 0 && this.fetchReason === undefined) {\n eventName = \"enqueueMessages\";\n // Also report if we are fetching ops, and same range comes in, thus making this fetch obsolete.\n } else if (this.fetchReason !== undefined && this.fetchReason !== reason &&\n (from <= this.lastQueuedSequenceNumber + 1 && last > this.lastQueuedSequenceNumber)) {\n eventName = \"enqueueMessagesExtraFetch\";\n }\n\n // Report if there is something to report\n // Do not report when pending fetch is in progress, as such reporting will not\n // correctly take into account pending ops.\n if (eventName !== undefined) {\n this.logger.sendPerformanceEvent({\n eventName,\n reason,\n previousReason: this.prevEnqueueMessagesReason,\n from,\n to: last + 1, // exclusive, being consistent with the other telemetry / APIs\n length: messages.length,\n fetchReason: this.fetchReason,\n duplicate: duplicate > 0 ? duplicate : undefined,\n initialGap: initialGap !== 0 ? initialGap : undefined,\n gap: gap > 0 ? gap : undefined,\n firstMissing,\n dmInitialSeqNumber: this.initialSequenceNumber,\n ...this.connectionStateProps,\n });\n }\n }\n\n this.updateLatestKnownOpSeqNumber(messages[messages.length - 1].sequenceNumber);\n\n const n = this.previouslyProcessedMessage?.sequenceNumber;\n assert(n === undefined || n === this.lastQueuedSequenceNumber,\n 0x0ec /* \"Unexpected value for previously processed message's sequence number\" */);\n\n for (const message of messages) {\n // Check that the messages are arriving in the expected order\n if (message.sequenceNumber <= this.lastQueuedSequenceNumber) {\n // Validate that we do not have data loss, i.e. sequencing is reset and started again\n // with numbers that this client already observed before.\n if (this.previouslyProcessedMessage?.sequenceNumber === message.sequenceNumber) {\n const message1 = this.comparableMessagePayload(this.previouslyProcessedMessage);\n const message2 = this.comparableMessagePayload(message);\n if (message1 !== message2) {\n const error = new NonRetryableError(\n \"Two messages with same seq# and different payload!\",\n DriverErrorType.fileOverwrittenInStorage,\n {\n clientId: this.connection?.clientId,\n sequenceNumber: message.sequenceNumber,\n message1,\n message2,\n },\n );\n this.close(error);\n }\n }\n } else if (message.sequenceNumber !== this.lastQueuedSequenceNumber + 1) {\n this.pending.push(message);\n this.fetchMissingDeltas(reason, this.lastQueuedSequenceNumber, message.sequenceNumber);\n } else {\n this.lastQueuedSequenceNumber = message.sequenceNumber;\n this.previouslyProcessedMessage = message;\n this._inbound.push(message);\n }\n }\n\n // When / if we report a gap in ops in the future, we want telemetry to correctly reflect source\n // of prior ops. But if we have some out of order ops (this.pending), then reporting current reason\n // becomes not accurate, as the gap existed before current batch, so we should just report \"unknown\".\n this.prevEnqueueMessagesReason = this.pending.length > 0 ? \"unknown\" : reason;\n }\n\n private processInboundMessage(message: ISequencedDocumentMessage): void {\n const startTime = Date.now();\n this.lastProcessedMessage = message;\n\n // All non-system messages are coming from some client, and should have clientId\n // System messages may have no clientId (but some do, like propose, noop, summarize)\n assert(\n message.clientId !== undefined\n || isSystemMessage(message),\n 0x0ed /* \"non-system message have to have clientId\" */,\n );\n\n // if we have connection, and message is local, then we better treat is as local!\n assert(\n this.connection === undefined\n || this.connection.clientId !== message.clientId\n || this.lastSubmittedClientId === message.clientId,\n 0x0ee /* \"Not accounting local messages correctly\" */,\n );\n\n if (this.lastSubmittedClientId !== undefined && this.lastSubmittedClientId === message.clientId) {\n const clientSequenceNumber = message.clientSequenceNumber;\n\n assert(this.clientSequenceNumberObserved < clientSequenceNumber, 0x0ef /* \"client seq# not growing\" */);\n assert(clientSequenceNumber <= this.clientSequenceNumber,\n 0x0f0 /* \"Incoming local client seq# > generated by this client\" */);\n\n this.clientSequenceNumberObserved = clientSequenceNumber;\n }\n\n // TODO Remove after SPO picks up the latest build.\n if (\n typeof message.contents === \"string\"\n && message.contents !== \"\"\n && message.type !== MessageType.ClientLeave\n ) {\n message.contents = JSON.parse(message.contents);\n }\n\n // Add final ack trace.\n if (message.traces !== undefined && message.traces.length > 0) {\n const service = this.clientDetails.type === undefined || this.clientDetails.type === \"\"\n ? \"unknown\"\n : this.clientDetails.type;\n message.traces.push({\n action: \"end\",\n service,\n timestamp: Date.now(),\n });\n }\n\n // Watch the minimum sequence number and be ready to update as needed\n if (this.minSequenceNumber > message.minimumSequenceNumber) {\n throw new DataCorruptionError(\"msn moves backwards\", {\n ...extractLogSafeMessageProperties(message),\n clientId: this.connection?.clientId,\n });\n }\n this.minSequenceNumber = message.minimumSequenceNumber;\n\n if (message.sequenceNumber !== this.lastProcessedSequenceNumber + 1) {\n throw new DataCorruptionError(\"non-seq seq#\", {\n ...extractLogSafeMessageProperties(message),\n clientId: this.connection?.clientId,\n });\n }\n this.lastProcessedSequenceNumber = message.sequenceNumber;\n\n // Back-compat for older server with no term\n if (message.term === undefined) {\n message.term = 1;\n }\n this.baseTerm = message.term;\n\n if (this.handler === undefined) {\n throw new Error(\"Attempted to process an inbound message without a handler attached\");\n }\n this.handler.process(message);\n\n const endTime = Date.now();\n this.emit(\"op\", message, endTime - startTime);\n }\n\n /**\n * Retrieves the missing deltas between the given sequence numbers\n */\n private fetchMissingDeltas(reasonArg: string, lastKnowOp: number, to?: number) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.fetchMissingDeltasCore(reasonArg, false /* cacheOnly */, lastKnowOp, to);\n }\n\n /**\n * Retrieves the missing deltas between the given sequence numbers\n */\n private async fetchMissingDeltasCore(\n reason: string,\n cacheOnly: boolean,\n lastKnowOp: number,\n to?: number)\n {\n // Exit out early if we're already fetching deltas\n if (this.fetchReason !== undefined) {\n return;\n }\n\n if (this.closed) {\n this.logger.sendTelemetryEvent({ eventName: \"fetchMissingDeltasClosedConnection\" });\n return;\n }\n\n try {\n assert(lastKnowOp === this.lastQueuedSequenceNumber, 0x0f1 /* \"from arg\" */);\n let from = lastKnowOp + 1;\n\n const n = this.previouslyProcessedMessage?.sequenceNumber;\n if (n !== undefined) {\n // If we already processed at least one op, then we have this.previouslyProcessedMessage populated\n // and can use it to validate that we are operating on same file, i.e. it was not overwritten.\n // Knowing about this mechanism, we could ask for op we already observed to increase validation.\n // This is especially useful when coming out of offline mode or loading from\n // very old cached (by client / driver) snapshot.\n assert(n === lastKnowOp, 0x0f2 /* \"previouslyProcessedMessage\" */);\n assert(from > 1, 0x0f3 /* \"not positive\" */);\n from--;\n }\n\n const fetchReason = `${reason}_fetch`;\n this.fetchReason = fetchReason;\n\n await this.getDeltas(\n from,\n to,\n (messages) => {\n this.refreshDelayInfo(this.deltaStorageDelayId);\n this.enqueueMessages(messages, fetchReason);\n },\n cacheOnly);\n } catch (error) {\n this.logger.sendErrorEvent({eventName: \"GetDeltas_Exception\"}, error);\n this.close(normalizeError(error));\n } finally {\n this.refreshDelayInfo(this.deltaStorageDelayId);\n this.fetchReason = undefined;\n this.processPendingOps(reason);\n }\n }\n\n /**\n * Sorts pending ops and attempts to apply them\n */\n private processPendingOps(reason?: string): void {\n if (this.handler !== undefined) {\n const pendingSorted = this.pending.sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n this.pending = [];\n // Given that we do not track where these ops came from any more, it's not very\n // actionably to report gaps in this range.\n this.enqueueMessages(pendingSorted, `${reason}_pending`, true /* allowGaps */);\n }\n }\n\n private updateLatestKnownOpSeqNumber(seq: number) {\n if (this.lastObservedSeqNumber < seq) {\n this.lastObservedSeqNumber = seq;\n }\n }\n}\n\n// TODO: move this elsewhere and use it more broadly for DataCorruptionError/DataProcessingError\nfunction extractLogSafeMessageProperties(message: Partial<ISequencedDocumentMessage>) {\n const safeProps = {\n messageClientId: message.clientId,\n sequenceNumber: message.sequenceNumber,\n clientSequenceNumber: message.clientSequenceNumber,\n referenceSequenceNumber: message.referenceSequenceNumber,\n minimumSequenceNumber: message.minimumSequenceNumber,\n messageTimestamp: message.timestamp,\n };\n\n return safeProps;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
package/dist/loader.js CHANGED
@@ -7,11 +7,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.Loader = exports.RelativeLoader = void 0;
8
8
  const uuid_1 = require("uuid");
9
9
  const container_definitions_1 = require("@fluidframework/container-definitions");
10
- const common_utils_1 = require("@fluidframework/common-utils");
11
10
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
12
11
  const driver_utils_1 = require("@fluidframework/driver-utils");
13
12
  const container_1 = require("./container");
14
- const debug_1 = require("./debug");
15
13
  const utils_1 = require("./utils");
16
14
  function canUseCache(request) {
17
15
  if (request.headers === undefined) {
@@ -118,7 +116,6 @@ class Loader {
118
116
  }
119
117
  get IFluidRouter() { return this; }
120
118
  async createDetachedContainer(codeDetails) {
121
- debug_1.debug(`Container creating in detached state: ${common_utils_1.performance.now()} `);
122
119
  const container = await container_1.Container.createDetached(this, codeDetails);
123
120
  if (this.cachingEnabled) {
124
121
  container.once("attached", () => {
@@ -132,7 +129,6 @@ class Loader {
132
129
  return container;
133
130
  }
134
131
  async rehydrateDetachedContainerFromSnapshot(snapshot) {
135
- debug_1.debug(`Container creating in detached state: ${common_utils_1.performance.now()} `);
136
132
  return container_1.Container.rehydrateDetachedFromSnapshot(this, snapshot);
137
133
  }
138
134
  async resolve(request, pendingLocalState) {
@@ -234,7 +230,6 @@ class Loader {
234
230
  // If set in both query string and headers, use query string
235
231
  request.headers[container_definitions_1.LoaderHeader.version] = (_b = parsed.version) !== null && _b !== void 0 ? _b : request.headers[container_definitions_1.LoaderHeader.version];
236
232
  const canCache = this.canCacheForRequest(request.headers);
237
- debug_1.debug(`${canCache} ${request.headers[container_definitions_1.LoaderHeader.version]}`);
238
233
  return {
239
234
  canCache,
240
235
  fromSequenceNumber,
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.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 { v4 as uuid } from \"uuid\";\nimport { ITelemetryBaseLogger, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n IFluidCodeDetails,\n IFluidObject,\n IFluidRouter,\n IProvideFluidCodeDetailsComparer,\n IRequest,\n IRequestHeader,\n IResponse,\n} from \"@fluidframework/core-interfaces\";\nimport {\n ICodeLoader,\n IContainer,\n IFluidModule,\n IHostLoader,\n ILoader,\n IPendingLocalState,\n ILoaderOptions as ILoaderOptions1,\n IProxyLoaderFactory,\n LoaderHeader,\n} from \"@fluidframework/container-definitions\";\nimport { performance } from \"@fluidframework/common-utils\";\nimport { ChildLogger, DebugLogger, PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport {\n IDocumentServiceFactory,\n IDocumentStorageService,\n IFluidResolvedUrl,\n IResolvedUrl,\n IUrlResolver,\n} from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n ensureFluidResolvedUrl,\n MultiUrlResolver,\n MultiDocumentServiceFactory,\n} from \"@fluidframework/driver-utils\";\nimport { Container } from \"./container\";\nimport { debug } from \"./debug\";\nimport { IParsedUrl, parseUrl } from \"./utils\";\n\nfunction canUseCache(request: IRequest): boolean {\n if (request.headers === undefined) {\n return true;\n }\n\n return request.headers[LoaderHeader.cache] !== false;\n}\n\nexport class RelativeLoader implements ILoader {\n constructor(\n private readonly container: Container,\n private readonly loader: ILoader | undefined,\n ) {\n }\n\n public get IFluidRouter(): IFluidRouter { return this; }\n\n public async resolve(request: IRequest): Promise<IContainer> {\n if (request.url.startsWith(\"/\")) {\n if (canUseCache(request)) {\n return this.container;\n } else {\n const resolvedUrl = this.container.resolvedUrl;\n ensureFluidResolvedUrl(resolvedUrl);\n const container = await Container.load(\n this.loader as Loader,\n {\n canReconnect: request.headers?.[LoaderHeader.reconnect],\n clientDetailsOverride: request.headers?.[LoaderHeader.clientDetails],\n resolvedUrl: {...resolvedUrl},\n version: request.headers?.[LoaderHeader.version] ?? undefined,\n loadMode: request.headers?.[LoaderHeader.loadMode],\n },\n );\n return container;\n }\n }\n\n if (this.loader === undefined) {\n throw new Error(\"Cannot resolve external containers\");\n }\n return this.loader.resolve(request);\n }\n\n public async request(request: IRequest): Promise<IResponse> {\n if (request.url.startsWith(\"/\")) {\n const container = await this.resolve(request);\n return container.request(request);\n }\n\n if (this.loader === undefined) {\n return {\n status: 404,\n value: \"Cannot request external containers\",\n mimeType: \"plain/text\",\n };\n }\n return this.loader.request(request);\n }\n}\n\nfunction createCachedResolver(resolver: IUrlResolver) {\n const cacheResolver = Object.create(resolver) as IUrlResolver;\n const resolveCache = new Map<string, Promise<IResolvedUrl | undefined>>();\n cacheResolver.resolve = async (request: IRequest): Promise<IResolvedUrl | undefined> => {\n if (!canUseCache(request)) {\n return resolver.resolve(request);\n }\n if (!resolveCache.has(request.url)) {\n resolveCache.set(request.url, resolver.resolve(request));\n }\n\n return resolveCache.get(request.url);\n };\n return cacheResolver;\n}\n\nexport interface ILoaderOptions extends ILoaderOptions1{\n summarizeProtocolTree?: true,\n}\n\n/**\n * Encapsulates a module entry point with corresponding code details.\n */\n export interface IFluidModuleWithDetails {\n /** Fluid code module that implements the runtime factory needed to instantiate the container runtime. */\n module: IFluidModule;\n /**\n * Code details associated with the module. Represents a document schema this module supports.\n * If the code loader implements the {@link @fluidframework/core-interfaces#IFluidCodeDetailsComparer} interface,\n * it'll be called to determine whether the module code details satisfy the new code proposal in the quorum.\n */\n details: IFluidCodeDetails;\n }\n\n/**\n * Fluid code loader resolves a code module matching the document schema, i.e. code details, such as\n * a package name and package version range.\n */\nexport interface ICodeDetailsLoader\n extends Partial<IProvideFluidCodeDetailsComparer> {\n /**\n * Load the code module (package) that is capable to interact with the document.\n *\n * @param source - Code proposal that articulates the current schema the document is written in.\n * @returns - Code module entry point along with the code details associated with it.\n */\n load(source: IFluidCodeDetails): Promise<IFluidModuleWithDetails>;\n}\n\n/**\n * Services and properties necessary for creating a loader\n */\nexport interface ILoaderProps {\n /**\n * The url resolver used by the loader for resolving external urls\n * into Fluid urls such that the container specified by the\n * external url can be loaded.\n */\n readonly urlResolver: IUrlResolver;\n /**\n * The document service factory take the Fluid url provided\n * by the resolved url and constucts all the necessary services\n * for communication with the container's server.\n */\n readonly documentServiceFactory: IDocumentServiceFactory;\n /**\n * The code loader handles loading the necessary code\n * for running a container once it is loaded.\n */\n readonly codeLoader: ICodeDetailsLoader | ICodeLoader;\n\n /**\n * A property bag of options used by various layers\n * to control features\n */\n readonly options?: ILoaderOptions;\n\n /**\n * Scope is provided to all container and is a set of shared\n * services for container's to integrate with their host environment.\n */\n readonly scope?: IFluidObject;\n\n /**\n * Proxy loader factories for loading containers via proxy in other contexts,\n * like web workers, or worker threads.\n */\n readonly proxyLoaderFactories?: Map<string, IProxyLoaderFactory>;\n\n /**\n * The logger that all telemetry should be pushed to.\n */\n readonly logger?: ITelemetryBaseLogger;\n\n /**\n * Blobs storage for detached containers.\n */\n readonly detachedBlobStorage?: IDetachedBlobStorage;\n}\n\n/**\n * Services and properties used by and exposed by the loader\n */\nexport interface ILoaderServices {\n /**\n * The url resolver used by the loader for resolving external urls\n * into Fluid urls such that the container specified by the\n * external url can be loaded.\n */\n readonly urlResolver: IUrlResolver;\n /**\n * The document service factory take the Fluid url provided\n * by the resolved url and constucts all the necessary services\n * for communication with the container's server.\n */\n readonly documentServiceFactory: IDocumentServiceFactory;\n /**\n * The code loader handles loading the necessary code\n * for running a container once it is loaded.\n */\n readonly codeLoader: ICodeDetailsLoader | ICodeLoader;\n\n /**\n * A property bag of options used by various layers\n * to control features\n */\n readonly options: ILoaderOptions;\n\n /**\n * Scope is provided to all container and is a set of shared\n * services for container's to integrate with their host environment.\n */\n readonly scope: IFluidObject;\n\n /**\n * Proxy loader factories for loading containers via proxy in other contexts,\n * like web workers, or worker threads.\n */\n readonly proxyLoaderFactories: Map<string, IProxyLoaderFactory>;\n\n /**\n * The logger downstream consumers should construct their loggers from\n */\n readonly subLogger: ITelemetryLogger;\n\n /**\n * Blobs storage for detached containers.\n */\n readonly detachedBlobStorage?: IDetachedBlobStorage;\n}\n\n/**\n * Subset of IDocumentStorageService which only supports createBlob() and readBlob(). This is used to support\n * blobs in detached containers.\n */\nexport type IDetachedBlobStorage = Pick<IDocumentStorageService, \"createBlob\" | \"readBlob\"> & {\n size: number;\n };\n\n/**\n * Manages Fluid resource loading\n */\nexport class Loader implements IHostLoader {\n private readonly containers = new Map<string, Promise<Container>>();\n public readonly services: ILoaderServices;\n private readonly logger: ITelemetryLogger;\n\n /**\n * @deprecated use constructor with loader props\n */\n public static _create(\n resolver: IUrlResolver | IUrlResolver[],\n documentServiceFactory: IDocumentServiceFactory | IDocumentServiceFactory[],\n codeLoader: ICodeDetailsLoader | ICodeLoader,\n options: ILoaderOptions,\n scope: IFluidObject,\n proxyLoaderFactories: Map<string, IProxyLoaderFactory>,\n logger?: ITelemetryBaseLogger,\n ) {\n return new Loader(\n {\n urlResolver: MultiUrlResolver.create(resolver),\n documentServiceFactory: MultiDocumentServiceFactory.create(documentServiceFactory),\n codeLoader,\n options,\n scope,\n proxyLoaderFactories,\n logger,\n });\n }\n\n constructor(loaderProps: ILoaderProps) {\n const scope = { ...loaderProps.scope };\n if (loaderProps.options?.provideScopeLoader !== false) {\n scope.ILoader = this;\n }\n\n this.services = {\n urlResolver: createCachedResolver(MultiUrlResolver.create(loaderProps.urlResolver)),\n documentServiceFactory: MultiDocumentServiceFactory.create(loaderProps.documentServiceFactory),\n codeLoader: loaderProps.codeLoader,\n options: loaderProps.options ?? {},\n scope,\n subLogger: DebugLogger.mixinDebugLogger(\"fluid:telemetry\", loaderProps.logger, { all:{loaderId: uuid()} }),\n proxyLoaderFactories: loaderProps.proxyLoaderFactories ?? new Map<string, IProxyLoaderFactory>(),\n detachedBlobStorage: loaderProps.detachedBlobStorage,\n };\n this.logger = ChildLogger.create(this.services.subLogger, \"Loader\");\n }\n\n public get IFluidRouter(): IFluidRouter { return this; }\n\n public async createDetachedContainer(codeDetails: IFluidCodeDetails): Promise<Container> {\n debug(`Container creating in detached state: ${performance.now()} `);\n\n const container = await Container.createDetached(\n this,\n codeDetails,\n );\n\n if (this.cachingEnabled) {\n container.once(\"attached\", () => {\n ensureFluidResolvedUrl(container.resolvedUrl);\n const parsedUrl = parseUrl(container.resolvedUrl.url);\n if (parsedUrl !== undefined) {\n this.addToContainerCache(parsedUrl.id, Promise.resolve(container));\n }\n });\n }\n\n return container;\n }\n\n public async rehydrateDetachedContainerFromSnapshot(snapshot: string): Promise<Container> {\n debug(`Container creating in detached state: ${performance.now()} `);\n\n return Container.rehydrateDetachedFromSnapshot(this, snapshot);\n }\n\n public async resolve(request: IRequest, pendingLocalState?: string): Promise<Container> {\n const eventName = pendingLocalState === undefined ? \"Resolve\" : \"ResolveWithPendingState\";\n return PerformanceEvent.timedExecAsync(this.logger, { eventName }, async () => {\n const resolved = await this.resolveCore(\n request,\n pendingLocalState !== undefined ? JSON.parse(pendingLocalState) : undefined,\n );\n return resolved.container;\n });\n }\n\n public async request(request: IRequest): Promise<IResponse> {\n return PerformanceEvent.timedExecAsync(this.logger, { eventName: \"Request\" }, async () => {\n const resolved = await this.resolveCore(request);\n return resolved.container.request({\n ...request,\n url: `${resolved.parsed.path}${resolved.parsed.query}`,\n });\n });\n }\n\n private getKeyForContainerCache(request: IRequest, parsedUrl: IParsedUrl): string {\n const key = request.headers?.[LoaderHeader.version] !== undefined\n ? `${parsedUrl.id}@${request.headers[LoaderHeader.version]}`\n : parsedUrl.id;\n return key;\n }\n\n private addToContainerCache(key: string, containerP: Promise<Container>) {\n this.containers.set(key, containerP);\n containerP.then((container) => {\n // If the container is closed or becomes closed after we resolve it, remove it from the cache.\n if (container.closed) {\n this.containers.delete(key);\n } else {\n container.once(\"closed\", () => {\n this.containers.delete(key);\n });\n }\n }).catch((error) => {});\n }\n\n private async resolveCore(\n request: IRequest,\n pendingLocalState?: IPendingLocalState,\n ): Promise<{ container: Container; parsed: IParsedUrl }> {\n const resolvedAsFluid = await this.services.urlResolver.resolve(request);\n ensureFluidResolvedUrl(resolvedAsFluid);\n\n // Parse URL into data stores\n const parsed = parseUrl(resolvedAsFluid.url);\n if (parsed === undefined) {\n throw new Error(`Invalid URL ${resolvedAsFluid.url}`);\n }\n\n if (pendingLocalState !== undefined) {\n const parsedPendingUrl = parseUrl(pendingLocalState.url);\n if (parsedPendingUrl?.id !== parsed.id ||\n parsedPendingUrl?.path.replace(/\\/$/, \"\") !== parsed.path.replace(/\\/$/, \"\")) {\n const message = `URL ${resolvedAsFluid.url} does not match pending state URL ${pendingLocalState.url}`;\n throw new Error(message);\n }\n }\n\n const { canCache, fromSequenceNumber } = this.parseHeader(parsed, request);\n const shouldCache = pendingLocalState !== undefined ? false : canCache;\n\n let container: Container;\n if (shouldCache) {\n const key = this.getKeyForContainerCache(request, parsed);\n const maybeContainer = await this.containers.get(key);\n if (maybeContainer !== undefined) {\n container = maybeContainer;\n } else {\n const containerP =\n this.loadContainer(\n request,\n resolvedAsFluid);\n this.addToContainerCache(key, containerP);\n container = await containerP;\n }\n } else {\n container =\n await this.loadContainer(\n request,\n resolvedAsFluid,\n pendingLocalState?.pendingRuntimeState);\n }\n\n if (container.deltaManager.lastSequenceNumber <= fromSequenceNumber) {\n await new Promise<void>((resolve, reject) => {\n function opHandler(message: ISequencedDocumentMessage) {\n if (message.sequenceNumber > fromSequenceNumber) {\n resolve();\n container.removeListener(\"op\", opHandler);\n }\n }\n\n container.on(\"op\", opHandler);\n });\n }\n\n return { container, parsed };\n }\n\n private get cachingEnabled() {\n return this.services.options.cache !== false;\n }\n\n private canCacheForRequest(headers: IRequestHeader): boolean {\n return this.cachingEnabled && headers[LoaderHeader.cache] !== false;\n }\n\n private parseHeader(parsed: IParsedUrl, request: IRequest) {\n let fromSequenceNumber = -1;\n\n request.headers = request.headers ?? {};\n\n const headerSeqNum = request.headers[LoaderHeader.sequenceNumber];\n if (headerSeqNum !== undefined) {\n fromSequenceNumber = headerSeqNum;\n }\n\n // If set in both query string and headers, use query string\n request.headers[LoaderHeader.version] = parsed.version ?? request.headers[LoaderHeader.version];\n\n const canCache = this.canCacheForRequest(request.headers);\n debug(`${canCache} ${request.headers[LoaderHeader.version]}`);\n\n return {\n canCache,\n fromSequenceNumber,\n };\n }\n\n private async loadContainer(\n request: IRequest,\n resolved: IFluidResolvedUrl,\n pendingLocalState?: unknown,\n ): Promise<Container> {\n return Container.load(\n this,\n {\n canReconnect: request.headers?.[LoaderHeader.reconnect],\n clientDetailsOverride: request.headers?.[LoaderHeader.clientDetails],\n resolvedUrl: resolved,\n version: request.headers?.[LoaderHeader.version] ?? undefined,\n loadMode: request.headers?.[LoaderHeader.loadMode],\n },\n pendingLocalState,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.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 { v4 as uuid } from \"uuid\";\nimport { ITelemetryBaseLogger, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n IFluidCodeDetails,\n IFluidObject,\n IFluidRouter,\n IProvideFluidCodeDetailsComparer,\n IRequest,\n IRequestHeader,\n IResponse,\n} from \"@fluidframework/core-interfaces\";\nimport {\n ICodeLoader,\n IContainer,\n IFluidModule,\n IHostLoader,\n ILoader,\n IPendingLocalState,\n ILoaderOptions as ILoaderOptions1,\n IProxyLoaderFactory,\n LoaderHeader,\n} from \"@fluidframework/container-definitions\";\nimport { ChildLogger, DebugLogger, PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport {\n IDocumentServiceFactory,\n IDocumentStorageService,\n IFluidResolvedUrl,\n IResolvedUrl,\n IUrlResolver,\n} from \"@fluidframework/driver-definitions\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport {\n ensureFluidResolvedUrl,\n MultiUrlResolver,\n MultiDocumentServiceFactory,\n} from \"@fluidframework/driver-utils\";\nimport { Container } from \"./container\";\nimport { IParsedUrl, parseUrl } from \"./utils\";\n\nfunction canUseCache(request: IRequest): boolean {\n if (request.headers === undefined) {\n return true;\n }\n\n return request.headers[LoaderHeader.cache] !== false;\n}\n\nexport class RelativeLoader implements ILoader {\n constructor(\n private readonly container: Container,\n private readonly loader: ILoader | undefined,\n ) {\n }\n\n public get IFluidRouter(): IFluidRouter { return this; }\n\n public async resolve(request: IRequest): Promise<IContainer> {\n if (request.url.startsWith(\"/\")) {\n if (canUseCache(request)) {\n return this.container;\n } else {\n const resolvedUrl = this.container.resolvedUrl;\n ensureFluidResolvedUrl(resolvedUrl);\n const container = await Container.load(\n this.loader as Loader,\n {\n canReconnect: request.headers?.[LoaderHeader.reconnect],\n clientDetailsOverride: request.headers?.[LoaderHeader.clientDetails],\n resolvedUrl: {...resolvedUrl},\n version: request.headers?.[LoaderHeader.version] ?? undefined,\n loadMode: request.headers?.[LoaderHeader.loadMode],\n },\n );\n return container;\n }\n }\n\n if (this.loader === undefined) {\n throw new Error(\"Cannot resolve external containers\");\n }\n return this.loader.resolve(request);\n }\n\n public async request(request: IRequest): Promise<IResponse> {\n if (request.url.startsWith(\"/\")) {\n const container = await this.resolve(request);\n return container.request(request);\n }\n\n if (this.loader === undefined) {\n return {\n status: 404,\n value: \"Cannot request external containers\",\n mimeType: \"plain/text\",\n };\n }\n return this.loader.request(request);\n }\n}\n\nfunction createCachedResolver(resolver: IUrlResolver) {\n const cacheResolver = Object.create(resolver) as IUrlResolver;\n const resolveCache = new Map<string, Promise<IResolvedUrl | undefined>>();\n cacheResolver.resolve = async (request: IRequest): Promise<IResolvedUrl | undefined> => {\n if (!canUseCache(request)) {\n return resolver.resolve(request);\n }\n if (!resolveCache.has(request.url)) {\n resolveCache.set(request.url, resolver.resolve(request));\n }\n\n return resolveCache.get(request.url);\n };\n return cacheResolver;\n}\n\nexport interface ILoaderOptions extends ILoaderOptions1{\n summarizeProtocolTree?: true,\n}\n\n/**\n * Encapsulates a module entry point with corresponding code details.\n */\n export interface IFluidModuleWithDetails {\n /** Fluid code module that implements the runtime factory needed to instantiate the container runtime. */\n module: IFluidModule;\n /**\n * Code details associated with the module. Represents a document schema this module supports.\n * If the code loader implements the {@link @fluidframework/core-interfaces#IFluidCodeDetailsComparer} interface,\n * it'll be called to determine whether the module code details satisfy the new code proposal in the quorum.\n */\n details: IFluidCodeDetails;\n }\n\n/**\n * Fluid code loader resolves a code module matching the document schema, i.e. code details, such as\n * a package name and package version range.\n */\nexport interface ICodeDetailsLoader\n extends Partial<IProvideFluidCodeDetailsComparer> {\n /**\n * Load the code module (package) that is capable to interact with the document.\n *\n * @param source - Code proposal that articulates the current schema the document is written in.\n * @returns - Code module entry point along with the code details associated with it.\n */\n load(source: IFluidCodeDetails): Promise<IFluidModuleWithDetails>;\n}\n\n/**\n * Services and properties necessary for creating a loader\n */\nexport interface ILoaderProps {\n /**\n * The url resolver used by the loader for resolving external urls\n * into Fluid urls such that the container specified by the\n * external url can be loaded.\n */\n readonly urlResolver: IUrlResolver;\n /**\n * The document service factory take the Fluid url provided\n * by the resolved url and constucts all the necessary services\n * for communication with the container's server.\n */\n readonly documentServiceFactory: IDocumentServiceFactory;\n /**\n * The code loader handles loading the necessary code\n * for running a container once it is loaded.\n */\n readonly codeLoader: ICodeDetailsLoader | ICodeLoader;\n\n /**\n * A property bag of options used by various layers\n * to control features\n */\n readonly options?: ILoaderOptions;\n\n /**\n * Scope is provided to all container and is a set of shared\n * services for container's to integrate with their host environment.\n */\n readonly scope?: IFluidObject;\n\n /**\n * Proxy loader factories for loading containers via proxy in other contexts,\n * like web workers, or worker threads.\n */\n readonly proxyLoaderFactories?: Map<string, IProxyLoaderFactory>;\n\n /**\n * The logger that all telemetry should be pushed to.\n */\n readonly logger?: ITelemetryBaseLogger;\n\n /**\n * Blobs storage for detached containers.\n */\n readonly detachedBlobStorage?: IDetachedBlobStorage;\n}\n\n/**\n * Services and properties used by and exposed by the loader\n */\nexport interface ILoaderServices {\n /**\n * The url resolver used by the loader for resolving external urls\n * into Fluid urls such that the container specified by the\n * external url can be loaded.\n */\n readonly urlResolver: IUrlResolver;\n /**\n * The document service factory take the Fluid url provided\n * by the resolved url and constucts all the necessary services\n * for communication with the container's server.\n */\n readonly documentServiceFactory: IDocumentServiceFactory;\n /**\n * The code loader handles loading the necessary code\n * for running a container once it is loaded.\n */\n readonly codeLoader: ICodeDetailsLoader | ICodeLoader;\n\n /**\n * A property bag of options used by various layers\n * to control features\n */\n readonly options: ILoaderOptions;\n\n /**\n * Scope is provided to all container and is a set of shared\n * services for container's to integrate with their host environment.\n */\n readonly scope: IFluidObject;\n\n /**\n * Proxy loader factories for loading containers via proxy in other contexts,\n * like web workers, or worker threads.\n */\n readonly proxyLoaderFactories: Map<string, IProxyLoaderFactory>;\n\n /**\n * The logger downstream consumers should construct their loggers from\n */\n readonly subLogger: ITelemetryLogger;\n\n /**\n * Blobs storage for detached containers.\n */\n readonly detachedBlobStorage?: IDetachedBlobStorage;\n}\n\n/**\n * Subset of IDocumentStorageService which only supports createBlob() and readBlob(). This is used to support\n * blobs in detached containers.\n */\nexport type IDetachedBlobStorage = Pick<IDocumentStorageService, \"createBlob\" | \"readBlob\"> & {\n size: number;\n };\n\n/**\n * Manages Fluid resource loading\n */\nexport class Loader implements IHostLoader {\n private readonly containers = new Map<string, Promise<Container>>();\n public readonly services: ILoaderServices;\n private readonly logger: ITelemetryLogger;\n\n /**\n * @deprecated use constructor with loader props\n */\n public static _create(\n resolver: IUrlResolver | IUrlResolver[],\n documentServiceFactory: IDocumentServiceFactory | IDocumentServiceFactory[],\n codeLoader: ICodeDetailsLoader | ICodeLoader,\n options: ILoaderOptions,\n scope: IFluidObject,\n proxyLoaderFactories: Map<string, IProxyLoaderFactory>,\n logger?: ITelemetryBaseLogger,\n ) {\n return new Loader(\n {\n urlResolver: MultiUrlResolver.create(resolver),\n documentServiceFactory: MultiDocumentServiceFactory.create(documentServiceFactory),\n codeLoader,\n options,\n scope,\n proxyLoaderFactories,\n logger,\n });\n }\n\n constructor(loaderProps: ILoaderProps) {\n const scope = { ...loaderProps.scope };\n if (loaderProps.options?.provideScopeLoader !== false) {\n scope.ILoader = this;\n }\n\n this.services = {\n urlResolver: createCachedResolver(MultiUrlResolver.create(loaderProps.urlResolver)),\n documentServiceFactory: MultiDocumentServiceFactory.create(loaderProps.documentServiceFactory),\n codeLoader: loaderProps.codeLoader,\n options: loaderProps.options ?? {},\n scope,\n subLogger: DebugLogger.mixinDebugLogger(\"fluid:telemetry\", loaderProps.logger, { all:{loaderId: uuid()} }),\n proxyLoaderFactories: loaderProps.proxyLoaderFactories ?? new Map<string, IProxyLoaderFactory>(),\n detachedBlobStorage: loaderProps.detachedBlobStorage,\n };\n this.logger = ChildLogger.create(this.services.subLogger, \"Loader\");\n }\n\n public get IFluidRouter(): IFluidRouter { return this; }\n\n public async createDetachedContainer(codeDetails: IFluidCodeDetails): Promise<Container> {\n const container = await Container.createDetached(\n this,\n codeDetails,\n );\n\n if (this.cachingEnabled) {\n container.once(\"attached\", () => {\n ensureFluidResolvedUrl(container.resolvedUrl);\n const parsedUrl = parseUrl(container.resolvedUrl.url);\n if (parsedUrl !== undefined) {\n this.addToContainerCache(parsedUrl.id, Promise.resolve(container));\n }\n });\n }\n\n return container;\n }\n\n public async rehydrateDetachedContainerFromSnapshot(snapshot: string): Promise<Container> {\n return Container.rehydrateDetachedFromSnapshot(this, snapshot);\n }\n\n public async resolve(request: IRequest, pendingLocalState?: string): Promise<Container> {\n const eventName = pendingLocalState === undefined ? \"Resolve\" : \"ResolveWithPendingState\";\n return PerformanceEvent.timedExecAsync(this.logger, { eventName }, async () => {\n const resolved = await this.resolveCore(\n request,\n pendingLocalState !== undefined ? JSON.parse(pendingLocalState) : undefined,\n );\n return resolved.container;\n });\n }\n\n public async request(request: IRequest): Promise<IResponse> {\n return PerformanceEvent.timedExecAsync(this.logger, { eventName: \"Request\" }, async () => {\n const resolved = await this.resolveCore(request);\n return resolved.container.request({\n ...request,\n url: `${resolved.parsed.path}${resolved.parsed.query}`,\n });\n });\n }\n\n private getKeyForContainerCache(request: IRequest, parsedUrl: IParsedUrl): string {\n const key = request.headers?.[LoaderHeader.version] !== undefined\n ? `${parsedUrl.id}@${request.headers[LoaderHeader.version]}`\n : parsedUrl.id;\n return key;\n }\n\n private addToContainerCache(key: string, containerP: Promise<Container>) {\n this.containers.set(key, containerP);\n containerP.then((container) => {\n // If the container is closed or becomes closed after we resolve it, remove it from the cache.\n if (container.closed) {\n this.containers.delete(key);\n } else {\n container.once(\"closed\", () => {\n this.containers.delete(key);\n });\n }\n }).catch((error) => {});\n }\n\n private async resolveCore(\n request: IRequest,\n pendingLocalState?: IPendingLocalState,\n ): Promise<{ container: Container; parsed: IParsedUrl }> {\n const resolvedAsFluid = await this.services.urlResolver.resolve(request);\n ensureFluidResolvedUrl(resolvedAsFluid);\n\n // Parse URL into data stores\n const parsed = parseUrl(resolvedAsFluid.url);\n if (parsed === undefined) {\n throw new Error(`Invalid URL ${resolvedAsFluid.url}`);\n }\n\n if (pendingLocalState !== undefined) {\n const parsedPendingUrl = parseUrl(pendingLocalState.url);\n if (parsedPendingUrl?.id !== parsed.id ||\n parsedPendingUrl?.path.replace(/\\/$/, \"\") !== parsed.path.replace(/\\/$/, \"\")) {\n const message = `URL ${resolvedAsFluid.url} does not match pending state URL ${pendingLocalState.url}`;\n throw new Error(message);\n }\n }\n\n const { canCache, fromSequenceNumber } = this.parseHeader(parsed, request);\n const shouldCache = pendingLocalState !== undefined ? false : canCache;\n\n let container: Container;\n if (shouldCache) {\n const key = this.getKeyForContainerCache(request, parsed);\n const maybeContainer = await this.containers.get(key);\n if (maybeContainer !== undefined) {\n container = maybeContainer;\n } else {\n const containerP =\n this.loadContainer(\n request,\n resolvedAsFluid);\n this.addToContainerCache(key, containerP);\n container = await containerP;\n }\n } else {\n container =\n await this.loadContainer(\n request,\n resolvedAsFluid,\n pendingLocalState?.pendingRuntimeState);\n }\n\n if (container.deltaManager.lastSequenceNumber <= fromSequenceNumber) {\n await new Promise<void>((resolve, reject) => {\n function opHandler(message: ISequencedDocumentMessage) {\n if (message.sequenceNumber > fromSequenceNumber) {\n resolve();\n container.removeListener(\"op\", opHandler);\n }\n }\n\n container.on(\"op\", opHandler);\n });\n }\n\n return { container, parsed };\n }\n\n private get cachingEnabled() {\n return this.services.options.cache !== false;\n }\n\n private canCacheForRequest(headers: IRequestHeader): boolean {\n return this.cachingEnabled && headers[LoaderHeader.cache] !== false;\n }\n\n private parseHeader(parsed: IParsedUrl, request: IRequest) {\n let fromSequenceNumber = -1;\n\n request.headers = request.headers ?? {};\n\n const headerSeqNum = request.headers[LoaderHeader.sequenceNumber];\n if (headerSeqNum !== undefined) {\n fromSequenceNumber = headerSeqNum;\n }\n\n // If set in both query string and headers, use query string\n request.headers[LoaderHeader.version] = parsed.version ?? request.headers[LoaderHeader.version];\n\n const canCache = this.canCacheForRequest(request.headers);\n\n return {\n canCache,\n fromSequenceNumber,\n };\n }\n\n private async loadContainer(\n request: IRequest,\n resolved: IFluidResolvedUrl,\n pendingLocalState?: unknown,\n ): Promise<Container> {\n return Container.load(\n this,\n {\n canReconnect: request.headers?.[LoaderHeader.reconnect],\n clientDetailsOverride: request.headers?.[LoaderHeader.clientDetails],\n resolvedUrl: resolved,\n version: request.headers?.[LoaderHeader.version] ?? undefined,\n loadMode: request.headers?.[LoaderHeader.loadMode],\n },\n pendingLocalState,\n );\n }\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/container-loader";
8
- export declare const pkgVersion = "0.45.4";
8
+ export declare const pkgVersion = "0.46.2";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -8,5 +8,5 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.pkgVersion = exports.pkgName = void 0;
10
10
  exports.pkgName = "@fluidframework/container-loader";
11
- exports.pkgVersion = "0.45.4";
11
+ exports.pkgVersion = "0.46.2";
12
12
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,kCAAkC,CAAC;AAC7C,QAAA,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-loader\";\nexport const pkgVersion = \"0.45.4\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,kCAAkC,CAAC;AAC7C,QAAA,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-loader\";\nexport const pkgVersion = \"0.46.2\";\n"]}
@@ -49,7 +49,7 @@ class RetriableDocumentStorageService {
49
49
  if (this._disposed) {
50
50
  return {
51
51
  retry: false,
52
- error: container_utils_1.CreateContainerError("Storage service disposed!!"),
52
+ error: new container_utils_1.GenericError("storageServiceDisposedCannotRetry"),
53
53
  };
54
54
  }
55
55
  return { retry: true, error: undefined };
@@ -1 +1 @@
1
- {"version":3,"file":"retriableDocumentStorageService.js","sourceRoot":"","sources":["../src/retriableDocumentStorageService.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 { CreateContainerError } from \"@fluidframework/container-utils\";\nimport {\n IDocumentStorageService,\n IDocumentStorageServicePolicies,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n ITree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { IDisposable, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { runWithRetry } from \"@fluidframework/driver-utils\";\nimport { DeltaManager } from \"./deltaManager\";\n\nexport class RetriableDocumentStorageService implements IDocumentStorageService, IDisposable {\n private _disposed = false;\n constructor(\n private readonly internalStorageService: IDocumentStorageService,\n private readonly deltaManager: Pick<DeltaManager, \"emitDelayInfo\" | \"refreshDelayInfo\">,\n private readonly logger: ITelemetryLogger,\n ) {\n }\n\n public get policies(): IDocumentStorageServicePolicies | undefined {\n return this.internalStorageService.policies;\n }\n public get disposed() {return this._disposed;}\n public dispose() {\n this._disposed = true;\n }\n\n public get repositoryUrl(): string {\n return this.internalStorageService.repositoryUrl;\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n return this.runWithRetry(\n async () => this.internalStorageService.getSnapshotTree(version),\n \"storage_getSnapshotTree\",\n );\n }\n\n public async readBlob(id: string): Promise<ArrayBufferLike> {\n return this.runWithRetry(\n async () => this.internalStorageService.readBlob(id),\n \"storage_readBlob\",\n );\n }\n\n public async getVersions(versionId: string, count: number): Promise<IVersion[]> {\n return this.runWithRetry(\n async () => this.internalStorageService.getVersions(versionId, count),\n \"storage_getVersions\",\n );\n }\n\n public async write(tree: ITree, parents: string[], message: string, ref: string): Promise<IVersion> {\n return this.runWithRetry(\n async () => this.internalStorageService.write(tree, parents, message, ref),\n \"storage_write\",\n );\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n return this.runWithRetry(\n async () => this.internalStorageService.uploadSummaryWithContext(summary, context),\n \"storage_uploadSummaryWithContext\",\n );\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n return this.runWithRetry(\n async () => this.internalStorageService.downloadSummary(handle),\n \"storage_downloadSummary\",\n );\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n return this.runWithRetry(\n async () => this.internalStorageService.createBlob(file),\n \"storage_createBlob\",\n );\n }\n\n private checkStorageDisposed() {\n if (this._disposed) {\n return {\n retry: false,\n error: CreateContainerError(\"Storage service disposed!!\"),\n };\n }\n return { retry: true, error: undefined };\n }\n\n private async runWithRetry<T>(api: () => Promise<T>, callName: string): Promise<T> {\n return runWithRetry(\n api,\n callName,\n (id: string) => this.deltaManager.refreshDelayInfo(id),\n (id: string, delayMs: number, error: any) =>\n this.deltaManager.emitDelayInfo(id, delayMs, error),\n this.logger,\n () => this.checkStorageDisposed(),\n );\n }\n}\n"]}
1
+ {"version":3,"file":"retriableDocumentStorageService.js","sourceRoot":"","sources":["../src/retriableDocumentStorageService.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 { GenericError } from \"@fluidframework/container-utils\";\nimport {\n IDocumentStorageService,\n IDocumentStorageServicePolicies,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n ITree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { IDisposable, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { runWithRetry } from \"@fluidframework/driver-utils\";\nimport { DeltaManager } from \"./deltaManager\";\n\nexport class RetriableDocumentStorageService implements IDocumentStorageService, IDisposable {\n private _disposed = false;\n constructor(\n private readonly internalStorageService: IDocumentStorageService,\n private readonly deltaManager: Pick<DeltaManager, \"emitDelayInfo\" | \"refreshDelayInfo\">,\n private readonly logger: ITelemetryLogger,\n ) {\n }\n\n public get policies(): IDocumentStorageServicePolicies | undefined {\n return this.internalStorageService.policies;\n }\n public get disposed() {return this._disposed;}\n public dispose() {\n this._disposed = true;\n }\n\n public get repositoryUrl(): string {\n return this.internalStorageService.repositoryUrl;\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n return this.runWithRetry(\n async () => this.internalStorageService.getSnapshotTree(version),\n \"storage_getSnapshotTree\",\n );\n }\n\n public async readBlob(id: string): Promise<ArrayBufferLike> {\n return this.runWithRetry(\n async () => this.internalStorageService.readBlob(id),\n \"storage_readBlob\",\n );\n }\n\n public async getVersions(versionId: string, count: number): Promise<IVersion[]> {\n return this.runWithRetry(\n async () => this.internalStorageService.getVersions(versionId, count),\n \"storage_getVersions\",\n );\n }\n\n public async write(tree: ITree, parents: string[], message: string, ref: string): Promise<IVersion> {\n return this.runWithRetry(\n async () => this.internalStorageService.write(tree, parents, message, ref),\n \"storage_write\",\n );\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n return this.runWithRetry(\n async () => this.internalStorageService.uploadSummaryWithContext(summary, context),\n \"storage_uploadSummaryWithContext\",\n );\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n return this.runWithRetry(\n async () => this.internalStorageService.downloadSummary(handle),\n \"storage_downloadSummary\",\n );\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n return this.runWithRetry(\n async () => this.internalStorageService.createBlob(file),\n \"storage_createBlob\",\n );\n }\n\n private checkStorageDisposed() {\n if (this._disposed) {\n return {\n retry: false,\n error: new GenericError(\"storageServiceDisposedCannotRetry\"),\n };\n }\n return { retry: true, error: undefined };\n }\n\n private async runWithRetry<T>(api: () => Promise<T>, callName: string): Promise<T> {\n return runWithRetry(\n api,\n callName,\n (id: string) => this.deltaManager.refreshDelayInfo(id),\n (id: string, delayMs: number, error: any) =>\n this.deltaManager.emitDelayInfo(id, delayMs, error),\n this.logger,\n () => this.checkStorageDisposed(),\n );\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAe,MAAM,sCAAsC,CAAC;AAIhG,MAAM,WAAW,6BAA8B,SAAQ,aAAa;IAChE,aAAa,EAAE;QAAC,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAA;KAAC,CAAC;IACjD,KAAK,EAAE;QAAC,CAAC,IAAI,EAAE,MAAM,GAAG,6BAA6B,CAAA;KAAC,CAAC;CAC1D;AAED,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAW5D;AAyDD;;;;GAIG;AACH,wBAAgB,0CAA0C,CACtD,mBAAmB,EAAE,YAAY,EACjC,cAAc,EAAE,YAAY,GAC7B,6BAA6B,CAW/B;AAID,eAAO,MAAM,sCAAsC,8BAA+B,YAAY,kCAU7F,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAe,MAAM,sCAAsC,CAAC;AAIhG,MAAM,WAAW,6BAA8B,SAAQ,aAAa;IAChE,aAAa,EAAE;QAAC,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAA;KAAC,CAAC;IACjD,KAAK,EAAE;QAAC,CAAC,IAAI,EAAE,MAAM,GAAG,6BAA6B,CAAA;KAAC,CAAC;CAC1D;AAED,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAW5D;AAyDD;;;;GAIG;AACH,wBAAgB,0CAA0C,CACtD,mBAAmB,EAAE,YAAY,EACjC,cAAc,EAAE,YAAY,GAC7B,6BAA6B,CAW/B;AAID,eAAO,MAAM,sCAAsC,8BAA+B,YAAY,kCAU7F,CAAC"}
package/dist/utils.js CHANGED
@@ -56,7 +56,7 @@ function convertSummaryToSnapshotWithEmbeddedBlobContents(summary) {
56
56
  const blobId = uuid_1.v4();
57
57
  treeNode.blobs[key] = blobId;
58
58
  const contentBuffer = typeof summaryObject.content === "string" ?
59
- common_utils_1.stringToBuffer(summaryObject.content, "utf8") : summaryObject.content;
59
+ common_utils_1.stringToBuffer(summaryObject.content, "utf8") : common_utils_1.Uint8ArrayToArrayBuffer(summaryObject.content);
60
60
  treeNode.blobsContents[blobId] = contentBuffer;
61
61
  // 0.43 back-compat old runtime will still expect content in the blobs only.
62
62
  // So need to put in blobs for now.
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6BAA4B;AAC5B,+BAAkC;AAClC,+DAAuG;AAsBvG,SAAgB,QAAQ,CAAC,GAAW;;IAChC,MAAM,MAAM,GAAG,WAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE;QACrC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;KAC/C;IACD,MAAM,KAAK,SAAG,MAAM,CAAC,MAAM,mCAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,2BAA2B,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,MAAK,CAAC,CAAC;QACxB,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAiB,EAAE;QAClF,CAAC,CAAC,SAAS,CAAC;AACpB,CAAC;AAXD,4BAWC;AAED;;;;;;;;;GASG;AACH,SAAS,gDAAgD,CACrD,OAAqB;IAErB,MAAM,QAAQ,GAAkC;QAC5C,KAAK,EAAE,EAAE;QACT,aAAa,EAAE,EAAE;QACjB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;QACX,EAAE,EAAE,SAAI,EAAE;QACV,YAAY,EAAE,OAAO,CAAC,YAAY;KACrC,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACpB,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAExC,QAAQ,aAAa,CAAC,IAAI,EAAE;YACxB,iBAAqB,CAAC,CAAC;gBACnB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,gDAAgD,CAAC,aAAa,CAAC,CAAC;gBACtF,MAAM;aACT;YACD;gBACI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC;gBACvC,MAAM;YACV,iBAAqB,CAAC,CAAC;gBACnB,MAAM,MAAM,GAAG,SAAI,EAAE,CAAC;gBACtB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;gBAC7B,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;oBAC7D,6BAAc,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC;gBAC1E,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC;gBAC/C,4EAA4E;gBAC5E,mCAAmC;gBACnC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,6BAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBACjE,MAAM;aACT;YACD;gBACI,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;gBACjF,MAAM;YACV,OAAO,CAAC,CAAC;gBACL,8BAAe,CAAC,aAAa,EAAE,qBAAsB,aAAqB,CAAC,IAAI,EAAE,CAAC,CAAC;aACtF;SACJ;KACJ;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,SAAgB,0CAA0C,CACtD,mBAAiC,EACjC,cAA4B;IAE5B,+DAA+D;IAC/D,MAAM,eAAe,GAAiB;QAClC,IAAI,cAAkB;QACtB,IAAI,oBAAO,cAAc,CAAC,IAAI,CAAE;KACnC,CAAC;IAEF,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,mBAAmB,CAAC;IACxD,MAAM,4BAA4B,GAC9B,gDAAgD,CAAC,eAAe,CAAC,CAAC;IACtE,OAAO,4BAA4B,CAAC;AACxC,CAAC;AAdD,gGAcC;AAED,+GAA+G;AAC/G,0CAA0C;AACnC,MAAM,sCAAsC,GAAG,CAAC,yBAAuC,EAAE,EAAE;IAC9F,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,IAAI,CAAC,WAAW,CAAiB,CAAC;IACxF,MAAM,cAAc,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAiB,CAAC;IAC9E,qBAAM,CAAC,mBAAmB,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EACpE,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACpE,MAAM,4BAA4B,GAAG,0CAA0C,CAC3E,mBAAmB,EACnB,cAAc,CACjB,CAAC;IACF,OAAO,4BAA4B,CAAC;AACxC,CAAC,CAAC;AAVW,QAAA,sCAAsC,0CAUjD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { parse } from \"url\";\nimport { v4 as uuid } from \"uuid\";\nimport { assert, bufferToString, stringToBuffer, unreachableCase } from \"@fluidframework/common-utils\";\nimport { ISummaryTree, ISnapshotTree, SummaryType } from \"@fluidframework/protocol-definitions\";\n\n// This is used when we rehydrate a container from the snapshot. Here we put the blob contents\n// in separate property: blobContents.\nexport interface ISnapshotTreeWithBlobContents extends ISnapshotTree {\n blobsContents: {[path: string]: ArrayBufferLike},\n trees: {[path: string]: ISnapshotTreeWithBlobContents},\n}\n\nexport interface IParsedUrl {\n id: string;\n path: string;\n query: string;\n /**\n * Null means do not use snapshots, undefined means load latest snapshot\n * otherwise it's version ID passed to IDocumentStorageService.getVersions() to figure out what snapshot to use.\n * If needed, can add undefined which is treated by Container.load() as load latest snapshot.\n */\n version: string | null | undefined;\n}\n\nexport function parseUrl(url: string): IParsedUrl | undefined {\n const parsed = parse(url, true);\n if (typeof parsed.pathname !== \"string\") {\n throw new Error(\"Failed to parse pathname\");\n }\n const query = parsed.search ?? \"\";\n const regex = /^\\/([^/]*\\/[^/]*)(\\/?.*)$/;\n const match = regex.exec(parsed.pathname);\n return (match?.length === 3)\n ? { id: match[1], path: match[2], query, version: parsed.query.version as string }\n : undefined;\n}\n\n/**\n * Converts summary tree (for upload) to snapshot tree (for download).\n * Summary tree blobs contain contents, but snapshot tree blobs normally\n * contain IDs pointing to storage. This will create 2 blob entries in the\n * snapshot tree for each blob in the summary tree. One will be the regular\n * path pointing to a uniquely generated ID. Then there will be another\n * entry with the path as that uniquely generated ID, and value as the\n * blob contents as a base-64 string.\n * @param summary - summary to convert\n */\nfunction convertSummaryToSnapshotWithEmbeddedBlobContents(\n summary: ISummaryTree,\n): ISnapshotTreeWithBlobContents {\n const treeNode: ISnapshotTreeWithBlobContents = {\n blobs: {},\n blobsContents: {},\n trees: {},\n commits: {},\n id: uuid(),\n unreferenced: summary.unreferenced,\n };\n const keys = Object.keys(summary.tree);\n for (const key of keys) {\n const summaryObject = summary.tree[key];\n\n switch (summaryObject.type) {\n case SummaryType.Tree: {\n treeNode.trees[key] = convertSummaryToSnapshotWithEmbeddedBlobContents(summaryObject);\n break;\n }\n case SummaryType.Attachment:\n treeNode.blobs[key] = summaryObject.id;\n break;\n case SummaryType.Blob: {\n const blobId = uuid();\n treeNode.blobs[key] = blobId;\n const contentBuffer = typeof summaryObject.content === \"string\" ?\n stringToBuffer(summaryObject.content, \"utf8\") : summaryObject.content;\n treeNode.blobsContents[blobId] = contentBuffer;\n // 0.43 back-compat old runtime will still expect content in the blobs only.\n // So need to put in blobs for now.\n treeNode.blobs[blobId] = bufferToString(contentBuffer, \"base64\");\n break;\n }\n case SummaryType.Handle:\n throw new Error(\"No handles should be there in summary in detached container!!\");\n break;\n default: {\n unreachableCase(summaryObject, `Unknown tree type ${(summaryObject as any).type}`);\n }\n }\n }\n return treeNode;\n}\n\n/**\n * Combine and convert protocol and app summary tree to format which is readable by container while rehydrating.\n * @param protocolSummaryTree - Protocol Summary Tree\n * @param appSummaryTree - App Summary Tree\n */\nexport function convertProtocolAndAppSummaryToSnapshotTree(\n protocolSummaryTree: ISummaryTree,\n appSummaryTree: ISummaryTree,\n): ISnapshotTreeWithBlobContents {\n // Shallow copy is fine, since we are doing a deep clone below.\n const combinedSummary: ISummaryTree = {\n type: SummaryType.Tree,\n tree: { ...appSummaryTree.tree },\n };\n\n combinedSummary.tree[\".protocol\"] = protocolSummaryTree;\n const snapshotTreeWithBlobContents =\n convertSummaryToSnapshotWithEmbeddedBlobContents(combinedSummary);\n return snapshotTreeWithBlobContents;\n}\n\n// This function converts the snapshot taken in detached container(by serialize api) to snapshotTree with which\n// a detached container can be rehydrated.\nexport const getSnapshotTreeFromSerializedContainer = (detachedContainerSnapshot: ISummaryTree) => {\n const protocolSummaryTree = detachedContainerSnapshot.tree[\".protocol\"] as ISummaryTree;\n const appSummaryTree = detachedContainerSnapshot.tree[\".app\"] as ISummaryTree;\n assert(protocolSummaryTree !== undefined && appSummaryTree !== undefined,\n 0x1e0 /* \"Protocol and App summary trees should be present\" */);\n const snapshotTreeWithBlobContents = convertProtocolAndAppSummaryToSnapshotTree(\n protocolSummaryTree,\n appSummaryTree,\n );\n return snapshotTreeWithBlobContents;\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.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 { parse } from \"url\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n assert,\n bufferToString,\n stringToBuffer,\n Uint8ArrayToArrayBuffer,\n unreachableCase,\n} from \"@fluidframework/common-utils\";\nimport { ISummaryTree, ISnapshotTree, SummaryType } from \"@fluidframework/protocol-definitions\";\n\n// This is used when we rehydrate a container from the snapshot. Here we put the blob contents\n// in separate property: blobContents.\nexport interface ISnapshotTreeWithBlobContents extends ISnapshotTree {\n blobsContents: {[path: string]: ArrayBufferLike},\n trees: {[path: string]: ISnapshotTreeWithBlobContents},\n}\n\nexport interface IParsedUrl {\n id: string;\n path: string;\n query: string;\n /**\n * Null means do not use snapshots, undefined means load latest snapshot\n * otherwise it's version ID passed to IDocumentStorageService.getVersions() to figure out what snapshot to use.\n * If needed, can add undefined which is treated by Container.load() as load latest snapshot.\n */\n version: string | null | undefined;\n}\n\nexport function parseUrl(url: string): IParsedUrl | undefined {\n const parsed = parse(url, true);\n if (typeof parsed.pathname !== \"string\") {\n throw new Error(\"Failed to parse pathname\");\n }\n const query = parsed.search ?? \"\";\n const regex = /^\\/([^/]*\\/[^/]*)(\\/?.*)$/;\n const match = regex.exec(parsed.pathname);\n return (match?.length === 3)\n ? { id: match[1], path: match[2], query, version: parsed.query.version as string }\n : undefined;\n}\n\n/**\n * Converts summary tree (for upload) to snapshot tree (for download).\n * Summary tree blobs contain contents, but snapshot tree blobs normally\n * contain IDs pointing to storage. This will create 2 blob entries in the\n * snapshot tree for each blob in the summary tree. One will be the regular\n * path pointing to a uniquely generated ID. Then there will be another\n * entry with the path as that uniquely generated ID, and value as the\n * blob contents as a base-64 string.\n * @param summary - summary to convert\n */\nfunction convertSummaryToSnapshotWithEmbeddedBlobContents(\n summary: ISummaryTree,\n): ISnapshotTreeWithBlobContents {\n const treeNode: ISnapshotTreeWithBlobContents = {\n blobs: {},\n blobsContents: {},\n trees: {},\n commits: {},\n id: uuid(),\n unreferenced: summary.unreferenced,\n };\n const keys = Object.keys(summary.tree);\n for (const key of keys) {\n const summaryObject = summary.tree[key];\n\n switch (summaryObject.type) {\n case SummaryType.Tree: {\n treeNode.trees[key] = convertSummaryToSnapshotWithEmbeddedBlobContents(summaryObject);\n break;\n }\n case SummaryType.Attachment:\n treeNode.blobs[key] = summaryObject.id;\n break;\n case SummaryType.Blob: {\n const blobId = uuid();\n treeNode.blobs[key] = blobId;\n const contentBuffer = typeof summaryObject.content === \"string\" ?\n stringToBuffer(summaryObject.content, \"utf8\") : Uint8ArrayToArrayBuffer(summaryObject.content);\n treeNode.blobsContents[blobId] = contentBuffer;\n // 0.43 back-compat old runtime will still expect content in the blobs only.\n // So need to put in blobs for now.\n treeNode.blobs[blobId] = bufferToString(contentBuffer, \"base64\");\n break;\n }\n case SummaryType.Handle:\n throw new Error(\"No handles should be there in summary in detached container!!\");\n break;\n default: {\n unreachableCase(summaryObject, `Unknown tree type ${(summaryObject as any).type}`);\n }\n }\n }\n return treeNode;\n}\n\n/**\n * Combine and convert protocol and app summary tree to format which is readable by container while rehydrating.\n * @param protocolSummaryTree - Protocol Summary Tree\n * @param appSummaryTree - App Summary Tree\n */\nexport function convertProtocolAndAppSummaryToSnapshotTree(\n protocolSummaryTree: ISummaryTree,\n appSummaryTree: ISummaryTree,\n): ISnapshotTreeWithBlobContents {\n // Shallow copy is fine, since we are doing a deep clone below.\n const combinedSummary: ISummaryTree = {\n type: SummaryType.Tree,\n tree: { ...appSummaryTree.tree },\n };\n\n combinedSummary.tree[\".protocol\"] = protocolSummaryTree;\n const snapshotTreeWithBlobContents =\n convertSummaryToSnapshotWithEmbeddedBlobContents(combinedSummary);\n return snapshotTreeWithBlobContents;\n}\n\n// This function converts the snapshot taken in detached container(by serialize api) to snapshotTree with which\n// a detached container can be rehydrated.\nexport const getSnapshotTreeFromSerializedContainer = (detachedContainerSnapshot: ISummaryTree) => {\n const protocolSummaryTree = detachedContainerSnapshot.tree[\".protocol\"] as ISummaryTree;\n const appSummaryTree = detachedContainerSnapshot.tree[\".app\"] as ISummaryTree;\n assert(protocolSummaryTree !== undefined && appSummaryTree !== undefined,\n 0x1e0 /* \"Protocol and App summary trees should be present\" */);\n const snapshotTreeWithBlobContents = convertProtocolAndAppSummaryToSnapshotTree(\n protocolSummaryTree,\n appSummaryTree,\n );\n return snapshotTreeWithBlobContents;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EACH,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,iBAAiB,EAEpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACH,SAAS,EAET,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EAChB,WAAW,EAGX,YAAY,EACZ,kBAAkB,EACrB,MAAM,uCAAuC,CAAC;AAO/C,OAAO,EAEH,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,EACf,MAAM,oCAAoC,CAAC;AAa5C,OAAO,EAGH,oBAAoB,EACpB,cAAc,EAGd,gBAAgB,EAEhB,OAAO,EAEP,yBAAyB,EAOzB,QAAQ,EACR,WAAW,EAMd,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAEH,6BAA6B,EAG7B,eAAe,EAGlB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,eAAe,EAA+B,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,EAAkB,MAAM,UAAU,CAAC;AAclE,MAAM,WAAW,qBAAqB;IAClC;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,qBAAqB,CAAC,EAAE,cAAc,CAAC;IACvC,WAAW,EAAE,iBAAiB,CAAC;IAC/B;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC7B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,qBAAqB,CAAC,EAAE,cAAc,CAAC;CAC1C;AAED,oBAAY,eAAe;IACvB;;OAEG;IACH,YAAY,IAAA;IAEZ;;OAEG;IACH,UAAU,IAAA;IAEV;;OAEG;IACH,SAAS,IAAA;CACZ;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,SAAS,oBA+ChE;AAqBD,qBAAa,mBAAmB;IAKxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAEjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAPvC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAGT,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,IAAI,EAClD,gBAAgB,EAAE,MAAM,OAAO,EAChD,iBAAiB,GAAE,MAAa,EACf,kBAAkB,GAAE,MAAW;IAapD;;OAEG;IACI,4BAA4B,CAAC,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI;IAiCrG,OAAO,CAAC,UAAU;IAOX,wBAAwB,IAAI,IAAI;CAS1C;AAMD,qBAAa,SAAU,SAAQ,6BAA6B,CAAC,gBAAgB,CAAE,YAAW,UAAU;IAqR5F,OAAO,CAAC,QAAQ,CAAC,MAAM;IApR3B,OAAc,OAAO,SAAY;IAEjC;;OAEG;WACiB,IAAI,CACpB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,qBAAqB,EAClC,iBAAiB,CAAC,EAAE,OAAO,GAC5B,OAAO,CAAC,SAAS,CAAC;IAgDrB;;OAEG;WACiB,cAAc,CAC9B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,iBAAiB,GAC/B,OAAO,CAAC,SAAS,CAAC;IAQrB;;;OAGG;WACiB,6BAA6B,CAC7C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,CAAC;IASd,SAAS,EAAE,eAAe,CAAC;IAIlC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAE/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAE1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAwB;IAE5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,IAAW,OAAO,IAAI,uBAAuB,CAE5C;IAGD,OAAO,CAAC,eAAe,CAAoD;IAC3E,OAAO,KAAK,cAAc,GAKzB;IAED,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA6B;IACnE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IAErC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,KAAK,OAAO,GAKlB;IACD,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,KAAK,eAAe,GAK1B;IAED,OAAO,CAAC,4BAA4B,CAAS;IAC7C,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAgB;IAC1D,OAAO,CAAC,8BAA8B,CAAa;IACnD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAyB;IAEhE,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAKlC;IAEF,IAAW,YAAY,IAAI,YAAY,CAAiB;IAExD,IAAW,WAAW,IAAI,YAAY,GAAG,SAAS,CAEjD;IAED,IAAW,iBAAiB,IAAI,QAAQ,GAAG,SAAS,CAEnD;IAED;;;OAGG;IACH,IAAW,QAAQ,wBAElB;IAED;;;OAGG;IACH,IAAW,mBAAmB,wBAE7B;IAED;;OAEG;IACH,IAAW,YAAY,IAAI,YAAY,CAEtC;IAED;;OAEG;IACI,aAAa,CAAC,QAAQ,EAAE,OAAO;IAItC,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED,IAAW,EAAE,IAAI,MAAM,CAEtB;IAED,IAAW,YAAY,IAAI,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,CAEpF;IAED,IAAW,eAAe,IAAI,eAAe,CAE5C;IAED,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED;;;OAGG;IACH,IAAW,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAElE;IAED;;;OAGG;IACH,IAAW,QAAQ,IAAI,MAAM,GAAG,SAAS,CAExC;IAED;;;OAGG;IACH,IAAW,MAAM,IAAI,MAAM,EAAE,GAAG,SAAS,CAExC;IAED,IAAW,aAAa,IAAI,cAAc,CAEzC;IAED;;OAEG;IACH,IAAW,gBAAgB,IAAI,iBAAiB,GAAG,SAAS,CAE3D;IAED,IAAW,WAAW,IAAI,iBAAiB,GAAG,SAAS,CAEtD;IAED;;OAEG;IACH,IAAW,QAAQ,IAAI,SAAS,CAE/B;IAED;;;;OAIG;IACH,IAAW,OAAO,YAEjB;IAED,OAAO,KAAK,cAAc,GAAwD;IAClF,OAAO,KAAK,WAAW,GAA6C;IACpE,IAAW,OAAO,IAAI,cAAc,CAAyC;IAC7E,OAAO,KAAK,KAAK,GAAwC;IACzD,OAAO,KAAK,UAAU,GAA6C;gBAG9C,MAAM,EAAE,MAAM,EAC/B,MAAM,EAAE,gBAAgB;IAwJ5B;;OAEG;IACI,SAAS,IAAI,OAAO;IAIpB,KAAK,CAAC,KAAK,CAAC,EAAE,uBAAuB;IAwCrC,4BAA4B,IAAI,MAAM;IAkB7C,IAAW,WAAW,IAAI,WAAW,CAEpC;IAEM,SAAS,IAAI,MAAM;IASb,MAAM,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6FxC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAM3C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5E,gBAAgB,CAAC,SAAS,EAAE,OAAO;IAgCnC,MAAM;IASb,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe;IAe9C;;;;OAIG;IACI,qBAAqB,CAAC,OAAO,EAAE,gBAAgB;IASzC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAWhE,kBAAkB,CAAC,WAAW,EAAE,iBAAiB;YAmBhD,mBAAmB;YAiBnB,YAAY;IAwB1B,OAAO,CAAC,YAAY;YAyDN,UAAU;IAKxB,OAAO,CAAC,sBAAsB;YAMhB,oBAAoB;IAWlC;;;;;;OAMG;YACW,IAAI;YAsIJ,cAAc;YAwCd,6BAA6B;YAsB7B,qBAAqB;YAqBrB,qBAAqB;YA4BrB,8BAA8B;YA2B9B,uBAAuB;IA0DrC,OAAO,CAAC,sBAAsB;IAoC9B,OAAO,CAAC,wBAAwB;IAQhC,OAAO,KAAK,MAAM,GAkBjB;IAED;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,kBAAkB;IAmD1B,OAAO,CAAC,2BAA2B;IAanC,OAAO,CAAC,iCAAiC;IAkEzC,OAAO,CAAC,wBAAwB;IAuBhC,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,oBAAoB;IAoC5B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAiBrB;;;;OAIG;YACW,iBAAiB;YAkBjB,0BAA0B;YAkB1B,kBAAkB;IA0ChC,OAAO,CAAC,iBAAiB;CAG5B"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
package/lib/container.js CHANGED
@@ -8,14 +8,13 @@ import { v4 as uuid } from "uuid";
8
8
  import { assert, performance, unreachableCase, Timer } from "@fluidframework/common-utils";
9
9
  import { isFluidCodeDetails, } from "@fluidframework/core-interfaces";
10
10
  import { AttachState, } from "@fluidframework/container-definitions";
11
- import { CreateContainerError, DataCorruptionError, extractSafePropertiesFromMessage, UsageError, } from "@fluidframework/container-utils";
11
+ import { DataCorruptionError, extractSafePropertiesFromMessage, GenericError, UsageError, } from "@fluidframework/container-utils";
12
12
  import { readAndParse, OnlineStatus, isOnline, ensureFluidResolvedUrl, combineAppAndProtocolSummary, runWithRetry, } from "@fluidframework/driver-utils";
13
13
  import { isSystemMessage, ProtocolOpHandler, } from "@fluidframework/protocol-base";
14
14
  import { FileMode, MessageType, TreeEntry, } from "@fluidframework/protocol-definitions";
15
- import { ChildLogger, EventEmitterWithErrorHandling, PerformanceEvent, raiseConnectedEvent, TelemetryLogger, connectedEventName, disconnectedEventName, } from "@fluidframework/telemetry-utils";
15
+ import { ChildLogger, EventEmitterWithErrorHandling, PerformanceEvent, raiseConnectedEvent, TelemetryLogger, connectedEventName, disconnectedEventName, normalizeError, } from "@fluidframework/telemetry-utils";
16
16
  import { Audience } from "./audience";
17
17
  import { ContainerContext } from "./containerContext";
18
- import { debug } from "./debug";
19
18
  import { DeltaManager } from "./deltaManager";
20
19
  import { DeltaManagerProxy } from "./deltaManagerProxy";
21
20
  import { RelativeLoader } from "./loader";
@@ -341,7 +340,7 @@ export class Container extends EventEmitterWithErrorHandling {
341
340
  assert(pendingLocalState === undefined || loadOptions.loadMode === undefined, 0x1e1 /* "pending state requires immidiate connection!" */);
342
341
  const mode = (_a = loadOptions.loadMode) !== null && _a !== void 0 ? _a : defaultMode;
343
342
  const onClosed = (err) => {
344
- rej(err !== null && err !== void 0 ? err : CreateContainerError("Container closed without an error"));
343
+ rej(err !== null && err !== void 0 ? err : new GenericError("containerClosedWithoutErrorDuringLoad"));
345
344
  };
346
345
  container.on("closed", onClosed);
347
346
  container.load(version, mode, pendingLocalState)
@@ -352,11 +351,11 @@ export class Container extends EventEmitterWithErrorHandling {
352
351
  event.end(props);
353
352
  res(container);
354
353
  }, (error) => {
355
- const err = CreateContainerError(error);
354
+ const err = normalizeError(error);
356
355
  // Depending where error happens, we can be attempting to connect to web socket
357
356
  // and continuously retrying (consider offline mode)
358
357
  // Host has no container to close, so it's prudent to do it here
359
- container.close(error);
358
+ container.close(err);
360
359
  onClosed(err);
361
360
  });
362
361
  }), { start: true, end: true, cancel: "generic" });
@@ -742,7 +741,7 @@ export class Container extends EventEmitterWithErrorHandling {
742
741
  this.deltaManager.inboundSignal.resume();
743
742
  return;
744
743
  }
745
- this.close(CreateContainerError(new Error("ExistingContextDoesNotSatisfyIncomingProposal")));
744
+ this.close(new GenericError("existingContextDoesNotSatisfyIncomingProposal"));
746
745
  }
747
746
  async snapshotCore(tagMessage, fullTree = false) {
748
747
  // Snapshots base document state and currently running context
@@ -1052,16 +1051,14 @@ export class Container extends EventEmitterWithErrorHandling {
1052
1051
  }
1053
1052
  });
1054
1053
  protocol.quorum.on("approveProposal", (sequenceNumber, key, value) => {
1055
- debug(`approved ${key}`);
1056
1054
  if (key === "code" || key === "code2") {
1057
- debug(`codeProposal ${JSON.stringify(value)}`);
1058
1055
  if (!isFluidCodeDetails(value)) {
1059
1056
  this.logger.sendErrorEvent({
1060
1057
  eventName: "CodeProposalNotIFluidCodeDetails",
1061
1058
  });
1062
1059
  }
1063
1060
  this.processCodeProposal().catch((error) => {
1064
- this.close(CreateContainerError(error));
1061
+ this.close(normalizeError(error));
1065
1062
  throw error;
1066
1063
  });
1067
1064
  }
@@ -1179,18 +1176,14 @@ export class Container extends EventEmitterWithErrorHandling {
1179
1176
  this.connectionTransitionTimes[value] = time;
1180
1177
  const duration = time - this.connectionTransitionTimes[oldState];
1181
1178
  let durationFromDisconnected;
1182
- let connectionMode;
1183
1179
  let connectionInitiationReason;
1184
1180
  let autoReconnect;
1185
1181
  let checkpointSequenceNumber;
1186
- let sequenceNumber;
1187
1182
  let opsBehind;
1188
1183
  if (value === ConnectionState.Disconnected) {
1189
1184
  autoReconnect = this._deltaManager.reconnectMode;
1190
1185
  }
1191
1186
  else {
1192
- connectionMode = this._deltaManager.connectionMode;
1193
- sequenceNumber = this.deltaManager.lastSequenceNumber;
1194
1187
  if (value === ConnectionState.Connected) {
1195
1188
  durationFromDisconnected = time - this.connectionTransitionTimes[ConnectionState.Disconnected];
1196
1189
  durationFromDisconnected = TelemetryLogger.formatTick(durationFromDisconnected);
@@ -1199,7 +1192,7 @@ export class Container extends EventEmitterWithErrorHandling {
1199
1192
  // This info is of most interest on establishing connection only.
1200
1193
  checkpointSequenceNumber = this.deltaManager.lastKnownSeqNumber;
1201
1194
  if (this.deltaManager.hasCheckpointSequenceNumber) {
1202
- opsBehind = checkpointSequenceNumber - sequenceNumber;
1195
+ opsBehind = checkpointSequenceNumber - this.deltaManager.lastSequenceNumber;
1203
1196
  }
1204
1197
  }
1205
1198
  if (this.firstConnection) {
@@ -1212,24 +1205,11 @@ export class Container extends EventEmitterWithErrorHandling {
1212
1205
  connectionInitiationReason = "AutoReconnect";
1213
1206
  }
1214
1207
  }
1215
- this.logger.sendPerformanceEvent({
1216
- eventName: `ConnectionStateChange_${ConnectionState[value]}`,
1217
- from: ConnectionState[oldState],
1218
- duration,
1208
+ this.logger.sendPerformanceEvent(Object.assign({ eventName: `ConnectionStateChange_${ConnectionState[value]}`, from: ConnectionState[oldState], duration,
1219
1209
  durationFromDisconnected,
1220
1210
  reason,
1221
- connectionInitiationReason,
1222
- socketDocumentId: this._deltaManager.socketDocumentId,
1223
- pendingClientId: this.connectionStateHandler.pendingClientId,
1224
- clientId: this.clientId,
1225
- connectionMode,
1226
- autoReconnect,
1227
- opsBehind,
1228
- online: OnlineStatus[isOnline()],
1229
- lastVisible: this.lastVisible !== undefined ? performance.now() - this.lastVisible : undefined,
1230
- checkpointSequenceNumber,
1231
- sequenceNumber,
1232
- });
1211
+ connectionInitiationReason, socketDocumentId: this._deltaManager.socketDocumentId, pendingClientId: this.connectionStateHandler.pendingClientId, clientId: this.clientId, autoReconnect,
1212
+ opsBehind, online: OnlineStatus[isOnline()], lastVisible: this.lastVisible !== undefined ? performance.now() - this.lastVisible : undefined, checkpointSequenceNumber }, this._deltaManager.connectionProps()));
1233
1213
  if (value === ConnectionState.Connected) {
1234
1214
  this.firstConnection = false;
1235
1215
  this.manualReconnectInProgress = false;
@@ -1273,7 +1253,7 @@ export class Container extends EventEmitterWithErrorHandling {
1273
1253
  break;
1274
1254
  }
1275
1255
  default:
1276
- this.close(CreateContainerError(`Runtime can't send arbitrary message type: ${type}`));
1256
+ this.close(new GenericError("invalidContainerSubmitOpType", undefined /* error */, { messageType: type }));
1277
1257
  return -1;
1278
1258
  }
1279
1259
  return this.submitMessage(type, contents, batch, metadata);
@@ -1301,7 +1281,7 @@ export class Container extends EventEmitterWithErrorHandling {
1301
1281
  }
1302
1282
  if (errorMsg !== undefined) {
1303
1283
  const error = new DataCorruptionError(errorMsg, extractSafePropertiesFromMessage(message));
1304
- this.close(CreateContainerError(error));
1284
+ this.close(normalizeError(error));
1305
1285
  }
1306
1286
  }
1307
1287
  const local = this.clientId === message.clientId;