@fluidframework/container-loader 2.0.0-internal.1.1.3 → 2.0.0-internal.1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/catchUpMonitor.d.ts +6 -17
  2. package/dist/catchUpMonitor.d.ts.map +1 -1
  3. package/dist/catchUpMonitor.js +5 -36
  4. package/dist/catchUpMonitor.js.map +1 -1
  5. package/dist/collabWindowTracker.d.ts +1 -1
  6. package/dist/collabWindowTracker.d.ts.map +1 -1
  7. package/dist/collabWindowTracker.js +2 -1
  8. package/dist/collabWindowTracker.js.map +1 -1
  9. package/dist/connectionManager.d.ts +1 -1
  10. package/dist/connectionManager.d.ts.map +1 -1
  11. package/dist/connectionManager.js +8 -11
  12. package/dist/connectionManager.js.map +1 -1
  13. package/dist/connectionStateHandler.d.ts +80 -26
  14. package/dist/connectionStateHandler.d.ts.map +1 -1
  15. package/dist/connectionStateHandler.js +170 -89
  16. package/dist/connectionStateHandler.js.map +1 -1
  17. package/dist/container.d.ts +22 -11
  18. package/dist/container.d.ts.map +1 -1
  19. package/dist/container.js +107 -125
  20. package/dist/container.js.map +1 -1
  21. package/dist/containerContext.d.ts +18 -7
  22. package/dist/containerContext.d.ts.map +1 -1
  23. package/dist/containerContext.js +18 -8
  24. package/dist/containerContext.js.map +1 -1
  25. package/dist/containerStorageAdapter.d.ts +10 -24
  26. package/dist/containerStorageAdapter.d.ts.map +1 -1
  27. package/dist/containerStorageAdapter.js +50 -16
  28. package/dist/containerStorageAdapter.js.map +1 -1
  29. package/dist/deltaManager.d.ts +1 -1
  30. package/dist/deltaManager.d.ts.map +1 -1
  31. package/dist/deltaManager.js +18 -6
  32. package/dist/deltaManager.js.map +1 -1
  33. package/dist/loader.d.ts +1 -1
  34. package/dist/loader.js.map +1 -1
  35. package/dist/packageVersion.d.ts +1 -1
  36. package/dist/packageVersion.js +1 -1
  37. package/dist/packageVersion.js.map +1 -1
  38. package/dist/protocol.d.ts.map +1 -1
  39. package/dist/protocol.js +2 -1
  40. package/dist/protocol.js.map +1 -1
  41. package/lib/catchUpMonitor.d.ts +6 -17
  42. package/lib/catchUpMonitor.d.ts.map +1 -1
  43. package/lib/catchUpMonitor.js +5 -35
  44. package/lib/catchUpMonitor.js.map +1 -1
  45. package/lib/collabWindowTracker.d.ts +1 -1
  46. package/lib/collabWindowTracker.d.ts.map +1 -1
  47. package/lib/collabWindowTracker.js +3 -2
  48. package/lib/collabWindowTracker.js.map +1 -1
  49. package/lib/connectionManager.d.ts +1 -1
  50. package/lib/connectionManager.d.ts.map +1 -1
  51. package/lib/connectionManager.js +9 -14
  52. package/lib/connectionManager.js.map +1 -1
  53. package/lib/connectionStateHandler.d.ts +80 -26
  54. package/lib/connectionStateHandler.d.ts.map +1 -1
  55. package/lib/connectionStateHandler.js +170 -90
  56. package/lib/connectionStateHandler.js.map +1 -1
  57. package/lib/container.d.ts +22 -11
  58. package/lib/container.d.ts.map +1 -1
  59. package/lib/container.js +110 -128
  60. package/lib/container.js.map +1 -1
  61. package/lib/containerContext.d.ts +18 -7
  62. package/lib/containerContext.d.ts.map +1 -1
  63. package/lib/containerContext.js +19 -9
  64. package/lib/containerContext.js.map +1 -1
  65. package/lib/containerStorageAdapter.d.ts +10 -24
  66. package/lib/containerStorageAdapter.d.ts.map +1 -1
  67. package/lib/containerStorageAdapter.js +50 -15
  68. package/lib/containerStorageAdapter.js.map +1 -1
  69. package/lib/deltaManager.d.ts +1 -1
  70. package/lib/deltaManager.d.ts.map +1 -1
  71. package/lib/deltaManager.js +18 -6
  72. package/lib/deltaManager.js.map +1 -1
  73. package/lib/loader.d.ts +1 -1
  74. package/lib/loader.js.map +1 -1
  75. package/lib/packageVersion.d.ts +1 -1
  76. package/lib/packageVersion.js +1 -1
  77. package/lib/packageVersion.js.map +1 -1
  78. package/lib/protocol.d.ts.map +1 -1
  79. package/lib/protocol.js +2 -1
  80. package/lib/protocol.js.map +1 -1
  81. package/package.json +13 -13
  82. package/src/catchUpMonitor.ts +7 -47
  83. package/src/collabWindowTracker.ts +4 -3
  84. package/src/connectionManager.ts +9 -11
  85. package/src/connectionStateHandler.ts +231 -106
  86. package/src/container.ts +132 -147
  87. package/src/containerContext.ts +22 -8
  88. package/src/containerStorageAdapter.ts +64 -15
  89. package/src/deltaManager.ts +20 -7
  90. package/src/loader.ts +1 -1
  91. package/src/packageVersion.ts +1 -1
  92. package/src/protocol.ts +2 -1
@@ -3,10 +3,10 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
6
- import { IAudience, IContainerContext, IDeltaManager, ILoader, ICriticalContainerError, AttachState, ILoaderOptions, IFluidCodeDetails, ICodeDetailsLoader, ISnapshotTreeWithBlobContents } from "@fluidframework/container-definitions";
6
+ import { IAudience, IContainerContext, IDeltaManager, ILoader, ICriticalContainerError, AttachState, ILoaderOptions, IFluidCodeDetails, ICodeDetailsLoader, ISnapshotTreeWithBlobContents, IBatchMessage } from "@fluidframework/container-definitions";
7
7
  import { IRequest, IResponse, FluidObject } from "@fluidframework/core-interfaces";
8
8
  import { IDocumentStorageService } from "@fluidframework/driver-definitions";
9
- import { IClientConfiguration, IClientDetails, IDocumentMessage, IQuorum, IQuorumClients, ISequencedDocumentMessage, ISignalMessage, ISnapshotTree, ISummaryTree, IVersion, MessageType } from "@fluidframework/protocol-definitions";
9
+ import { IClientConfiguration, IClientDetails, IDocumentMessage, IQuorum, IQuorumClients, ISequencedDocumentMessage, ISignalMessage, ISnapshotTree, ISummaryTree, IVersion, MessageType, ISummaryContent } from "@fluidframework/protocol-definitions";
10
10
  import { Container } from "./container";
11
11
  export declare class ContainerContext implements IContainerContext {
12
12
  private readonly container;
@@ -17,13 +17,16 @@ export declare class ContainerContext implements IContainerContext {
17
17
  readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;
18
18
  readonly loader: ILoader;
19
19
  readonly submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number;
20
+ readonly submitSummaryFn: (summaryOp: ISummaryContent) => number;
21
+ /** @returns clientSequenceNumber of last message in a batch */
22
+ readonly submitBatchFn: (batch: IBatchMessage[]) => number;
20
23
  readonly submitSignalFn: (contents: any) => void;
21
24
  readonly closeFn: (error?: ICriticalContainerError) => void;
22
25
  readonly version: string;
23
26
  readonly updateDirtyContainerState: (dirty: boolean) => void;
24
27
  readonly existing: boolean;
25
28
  readonly pendingLocalState?: unknown;
26
- static createOrLoad(container: Container, scope: FluidObject, codeLoader: ICodeDetailsLoader, codeDetails: IFluidCodeDetails, baseSnapshot: ISnapshotTree | undefined, deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>, quorum: IQuorum, loader: ILoader, submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number, submitSignalFn: (contents: any) => void, closeFn: (error?: ICriticalContainerError) => void, version: string, updateDirtyContainerState: (dirty: boolean) => void, existing: boolean, pendingLocalState?: unknown): Promise<ContainerContext>;
29
+ static createOrLoad(container: Container, scope: FluidObject, codeLoader: ICodeDetailsLoader, codeDetails: IFluidCodeDetails, baseSnapshot: ISnapshotTree | undefined, deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>, quorum: IQuorum, loader: ILoader, submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number, submitSummaryFn: (summaryOp: ISummaryContent) => number, submitBatchFn: (batch: IBatchMessage[]) => number, submitSignalFn: (contents: any) => void, closeFn: (error?: ICriticalContainerError) => void, version: string, updateDirtyContainerState: (dirty: boolean) => void, existing: boolean, pendingLocalState?: unknown): Promise<ContainerContext>;
27
30
  readonly taggedLogger: ITelemetryLogger;
28
31
  get clientId(): string | undefined;
29
32
  /**
@@ -31,6 +34,11 @@ export declare class ContainerContext implements IContainerContext {
31
34
  */
32
35
  get id(): string;
33
36
  get clientDetails(): IClientDetails;
37
+ private _connected;
38
+ /**
39
+ * When true, ops are free to flow
40
+ * When false, ops should be kept as pending or rejected
41
+ */
34
42
  get connected(): boolean;
35
43
  get canSummarize(): boolean;
36
44
  get serviceConfiguration(): IClientConfiguration | undefined;
@@ -46,11 +54,14 @@ export declare class ContainerContext implements IContainerContext {
46
54
  private readonly _quorum;
47
55
  get quorum(): IQuorumClients;
48
56
  private readonly _fluidModuleP;
49
- constructor(container: Container, scope: FluidObject, codeLoader: ICodeDetailsLoader, _codeDetails: IFluidCodeDetails, _baseSnapshot: ISnapshotTree | undefined, deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>, quorum: IQuorum, loader: ILoader, submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number, submitSignalFn: (contents: any) => void, closeFn: (error?: ICriticalContainerError) => void, version: string, updateDirtyContainerState: (dirty: boolean) => void, existing: boolean, pendingLocalState?: unknown);
57
+ constructor(container: Container, scope: FluidObject, codeLoader: ICodeDetailsLoader, _codeDetails: IFluidCodeDetails, _baseSnapshot: ISnapshotTree | undefined, deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>, quorum: IQuorum, loader: ILoader, submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number, submitSummaryFn: (summaryOp: ISummaryContent) => number,
58
+ /** @returns clientSequenceNumber of last message in a batch */
59
+ submitBatchFn: (batch: IBatchMessage[]) => number, submitSignalFn: (contents: any) => void, closeFn: (error?: ICriticalContainerError) => void, version: string, updateDirtyContainerState: (dirty: boolean) => void, existing: boolean, pendingLocalState?: unknown);
50
60
  /**
51
- * @deprecated - Temporary migratory API, to be removed when customers no longer need it. When removed,
52
- * ContainerContext should only take an IQuorumClients rather than an IQuorum. See IContainerContext for more
53
- * details.
61
+ * @deprecated Temporary migratory API, to be removed when customers no longer need it.
62
+ * When removed, `ContainerContext` should only take an {@link @fluidframework/container-definitions#IQuorumClients}
63
+ * rather than an {@link @fluidframework/protocol-definitions#IQuorum}.
64
+ * See {@link @fluidframework/container-definitions#IContainerContext} for more details.
54
65
  */
55
66
  getSpecifiedCodeDetails(): IFluidCodeDetails | undefined;
56
67
  dispose(error?: Error): void;
@@ -1 +1 @@
1
- {"version":3,"file":"containerContext.d.ts","sourceRoot":"","sources":["../src/containerContext.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EACH,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,OAAO,EAEP,uBAAuB,EACvB,WAAW,EACX,cAAc,EAGd,iBAAiB,EAGjB,kBAAkB,EAElB,6BAA6B,EAChC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACH,QAAQ,EACR,SAAS,EACT,WAAW,EACd,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,EACH,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,yBAAyB,EACzB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,WAAW,EACd,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,qBAAa,gBAAiB,YAAW,iBAAiB;IA6GlD,OAAO,CAAC,QAAQ,CAAC,SAAS;aACV,KAAK,EAAE,WAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,aAAa;aACL,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;aAExE,MAAM,EAAE,OAAO;aACf,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,MAAM;aACpF,cAAc,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI;aACvC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,uBAAuB,KAAK,IAAI;aAClD,OAAO,EAAE,MAAM;aACf,yBAAyB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI;aACnD,QAAQ,EAAE,OAAO;aACjB,iBAAiB,CAAC;WA1HlB,YAAY,CAC5B,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,kBAAkB,EAC9B,WAAW,EAAE,iBAAiB,EAC9B,YAAY,EAAE,aAAa,GAAG,SAAS,EACvC,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,EACxE,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,MAAM,EACpF,cAAc,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,EACvC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,uBAAuB,KAAK,IAAI,EAClD,OAAO,EAAE,MAAM,EACf,yBAAyB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,EACnD,QAAQ,EAAE,OAAO,EACjB,iBAAiB,CAAC,EAAE,OAAO,GAC5B,OAAO,CAAC,gBAAgB,CAAC;IAqB5B,SAAgB,YAAY,EAAE,gBAAgB,CAAC;IAE/C,IAAW,QAAQ,IAAI,MAAM,GAAG,SAAS,CAExC;IAED;;OAEG;IACH,IAAW,EAAE,IAAI,MAAM,CAMtB;IAED,IAAW,aAAa,IAAI,cAAc,CAEzC;IAED,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,IAAW,YAAY,IAAI,OAAO,CAEjC;IAED,IAAW,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAElE;IAED,IAAW,QAAQ,IAAI,SAAS,CAE/B;IAED,IAAW,OAAO,IAAI,cAAc,CAEnC;IAED,IAAW,YAAY,8BAEtB;IAED,IAAW,OAAO,IAAI,uBAAuB,CAE5C;IAED,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,KAAK,OAAO,GAKlB;IAED,OAAO,CAAC,SAAS,CAAS;IAE1B,IAAW,QAAQ,YAElB;IAED,IAAW,WAAW,sBAAgC;IAEtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,IAAW,MAAM,IAAI,cAAc,CAAyB;IAE5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;gBAG5C,SAAS,EAAE,SAAS,EACrB,KAAK,EAAE,WAAW,EACjB,UAAU,EAAE,kBAAkB,EAC9B,YAAY,EAAE,iBAAiB,EACxC,aAAa,EAAE,aAAa,GAAG,SAAS,EAChC,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,EACxF,MAAM,EAAE,OAAO,EACC,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,MAAM,EACpF,cAAc,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,EACvC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,uBAAuB,KAAK,IAAI,EAClD,OAAO,EAAE,MAAM,EACf,yBAAyB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,EACnD,QAAQ,EAAE,OAAO,EACjB,iBAAiB,CAAC,SAAS;IAW/C;;;;OAIG;IACI,uBAAuB,IAAI,iBAAiB,GAAG,SAAS;IAIxD,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAW5B,oBAAoB,IAAI,QAAQ,GAAG,SAAS;IAInD,IAAW,WAAW,IAAI,WAAW,CAEpC;IAED;;;;;;OAMG;IACI,aAAa,CAAC,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY;IAIpE,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM;IAQxD,OAAO,CAAC,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG;IAIxE,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO;IAI/C,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAI3C,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAItE,oBAAoB,IAAI,OAAO;IAItC;;;OAGG;IACU,SAAS,CAAC,qBAAqB,EAAE,iBAAiB;IAoCxD,eAAe,CAAC,QAAQ,EAAE,6BAA6B;YAQhD,iBAAiB;YAWjB,kBAAkB;IAKhC,OAAO,CAAC,cAAc;YAMR,cAAc;CAqB/B"}
1
+ {"version":3,"file":"containerContext.d.ts","sourceRoot":"","sources":["../src/containerContext.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,9 @@ const driver_utils_1 = require("@fluidframework/driver-utils");
11
11
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
12
12
  const PackageNotFactoryError = "Code package does not implement IRuntimeFactory";
13
13
  class ContainerContext {
14
- constructor(container, scope, codeLoader, _codeDetails, _baseSnapshot, deltaManager, quorum, loader, submitFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState) {
14
+ constructor(container, scope, codeLoader, _codeDetails, _baseSnapshot, deltaManager, quorum, loader, submitFn, submitSummaryFn,
15
+ /** @returns clientSequenceNumber of last message in a batch */
16
+ submitBatchFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState) {
15
17
  this.container = container;
16
18
  this.scope = scope;
17
19
  this.codeLoader = codeLoader;
@@ -20,6 +22,8 @@ class ContainerContext {
20
22
  this.deltaManager = deltaManager;
21
23
  this.loader = loader;
22
24
  this.submitFn = submitFn;
25
+ this.submitSummaryFn = submitSummaryFn;
26
+ this.submitBatchFn = submitBatchFn;
23
27
  this.submitSignalFn = submitSignalFn;
24
28
  this.closeFn = closeFn;
25
29
  this.version = version;
@@ -27,13 +31,14 @@ class ContainerContext {
27
31
  this.existing = existing;
28
32
  this.pendingLocalState = pendingLocalState;
29
33
  this._disposed = false;
34
+ this._connected = this.container.connected;
30
35
  this._quorum = quorum;
31
36
  this.taggedLogger = container.subLogger;
32
37
  this._fluidModuleP = new common_utils_1.LazyPromise(async () => this.loadCodeModule(_codeDetails));
33
38
  this.attachListener();
34
39
  }
35
- static async createOrLoad(container, scope, codeLoader, codeDetails, baseSnapshot, deltaManager, quorum, loader, submitFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState) {
36
- const context = new ContainerContext(container, scope, codeLoader, codeDetails, baseSnapshot, deltaManager, quorum, loader, submitFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState);
40
+ static async createOrLoad(container, scope, codeLoader, codeDetails, baseSnapshot, deltaManager, quorum, loader, submitFn, submitSummaryFn, submitBatchFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState) {
41
+ const context = new ContainerContext(container, scope, codeLoader, codeDetails, baseSnapshot, deltaManager, quorum, loader, submitFn, submitSummaryFn, submitBatchFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState);
37
42
  await context.instantiateRuntime(existing);
38
43
  return context;
39
44
  }
@@ -53,8 +58,12 @@ class ContainerContext {
53
58
  get clientDetails() {
54
59
  return this.container.clientDetails;
55
60
  }
61
+ /**
62
+ * When true, ops are free to flow
63
+ * When false, ops should be kept as pending or rejected
64
+ */
56
65
  get connected() {
57
- return this.container.connected;
66
+ return this._connected;
58
67
  }
59
68
  get canSummarize() {
60
69
  return "summarize" in this.runtime;
@@ -86,9 +95,10 @@ class ContainerContext {
86
95
  get codeDetails() { return this._codeDetails; }
87
96
  get quorum() { return this._quorum; }
88
97
  /**
89
- * @deprecated - Temporary migratory API, to be removed when customers no longer need it. When removed,
90
- * ContainerContext should only take an IQuorumClients rather than an IQuorum. See IContainerContext for more
91
- * details.
98
+ * @deprecated Temporary migratory API, to be removed when customers no longer need it.
99
+ * When removed, `ContainerContext` should only take an {@link @fluidframework/container-definitions#IQuorumClients}
100
+ * rather than an {@link @fluidframework/protocol-definitions#IQuorum}.
101
+ * See {@link @fluidframework/container-definitions#IContainerContext} for more details.
92
102
  */
93
103
  getSpecifiedCodeDetails() {
94
104
  var _a;
@@ -121,7 +131,7 @@ class ContainerContext {
121
131
  }
122
132
  setConnectionState(connected, clientId) {
123
133
  const runtime = this.runtime;
124
- (0, common_utils_1.assert)(connected === this.connected, 0x0de /* "Mismatch in connection state while setting" */);
134
+ this._connected = connected;
125
135
  runtime.setConnectionState(connected, clientId);
126
136
  }
127
137
  process(message, local, context) {
@@ -1 +1 @@
1
- {"version":3,"file":"containerContext.js","sourceRoot":"","sources":["../src/containerContext.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, LazyPromise } from \"@fluidframework/common-utils\";\nimport {\n IAudience,\n IContainerContext,\n IDeltaManager,\n ILoader,\n IRuntime,\n ICriticalContainerError,\n AttachState,\n ILoaderOptions,\n IRuntimeFactory,\n IProvideRuntimeFactory,\n IFluidCodeDetails,\n IFluidCodeDetailsComparer,\n IProvideFluidCodeDetailsComparer,\n ICodeDetailsLoader,\n IFluidModuleWithDetails,\n ISnapshotTreeWithBlobContents,\n} from \"@fluidframework/container-definitions\";\nimport {\n IRequest,\n IResponse,\n FluidObject,\n} from \"@fluidframework/core-interfaces\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { isFluidResolvedUrl } from \"@fluidframework/driver-utils\";\nimport {\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n IQuorum,\n IQuorumClients,\n ISequencedDocumentMessage,\n ISignalMessage,\n ISnapshotTree,\n ISummaryTree,\n IVersion,\n MessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { Container } from \"./container\";\n\nconst PackageNotFactoryError = \"Code package does not implement IRuntimeFactory\";\n\nexport class ContainerContext implements IContainerContext {\n public static async createOrLoad(\n container: Container,\n scope: FluidObject,\n codeLoader: ICodeDetailsLoader,\n codeDetails: IFluidCodeDetails,\n baseSnapshot: ISnapshotTree | undefined,\n deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n loader: ILoader,\n submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n submitSignalFn: (contents: any) => void,\n closeFn: (error?: ICriticalContainerError) => void,\n version: string,\n updateDirtyContainerState: (dirty: boolean) => void,\n existing: boolean,\n pendingLocalState?: unknown,\n ): Promise<ContainerContext> {\n const context = new ContainerContext(\n container,\n scope,\n codeLoader,\n codeDetails,\n baseSnapshot,\n deltaManager,\n quorum,\n loader,\n submitFn,\n submitSignalFn,\n closeFn,\n version,\n updateDirtyContainerState,\n existing,\n pendingLocalState);\n await context.instantiateRuntime(existing);\n return context;\n }\n\n public readonly taggedLogger: ITelemetryLogger;\n\n public get clientId(): string | undefined {\n return this.container.clientId;\n }\n\n /**\n * DISCLAIMER: this id is only for telemetry purposes. Not suitable for any other usages.\n */\n public get id(): string {\n const resolvedUrl = this.container.resolvedUrl;\n if (isFluidResolvedUrl(resolvedUrl)) {\n return resolvedUrl.id;\n }\n return \"\";\n }\n\n public get clientDetails(): IClientDetails {\n return this.container.clientDetails;\n }\n\n public get connected(): boolean {\n return this.container.connected;\n }\n\n public get canSummarize(): boolean {\n return \"summarize\" in this.runtime;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.container.serviceConfiguration;\n }\n\n public get audience(): IAudience {\n return this.container.audience;\n }\n\n public get options(): ILoaderOptions {\n return this.container.options;\n }\n\n public get baseSnapshot() {\n return this._baseSnapshot;\n }\n\n public get storage(): IDocumentStorageService {\n return this.container.storage;\n }\n\n private _runtime: IRuntime | undefined;\n private get runtime() {\n if (this._runtime === undefined) {\n throw new Error(\"Attempted to access runtime before it was defined\");\n }\n return this._runtime;\n }\n\n private _disposed = false;\n\n public get disposed() {\n return this._disposed;\n }\n\n public get codeDetails() { return this._codeDetails; }\n\n private readonly _quorum: IQuorum;\n public get quorum(): IQuorumClients { return this._quorum; }\n\n private readonly _fluidModuleP: Promise<IFluidModuleWithDetails>;\n\n constructor(\n private readonly container: Container,\n public readonly scope: FluidObject,\n private readonly codeLoader: ICodeDetailsLoader,\n private readonly _codeDetails: IFluidCodeDetails,\n private _baseSnapshot: ISnapshotTree | undefined,\n public readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n public readonly loader: ILoader,\n public readonly submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n public readonly submitSignalFn: (contents: any) => void,\n public readonly closeFn: (error?: ICriticalContainerError) => void,\n public readonly version: string,\n public readonly updateDirtyContainerState: (dirty: boolean) => void,\n public readonly existing: boolean,\n public readonly pendingLocalState?: unknown,\n\n ) {\n this._quorum = quorum;\n this.taggedLogger = container.subLogger;\n this._fluidModuleP = new LazyPromise<IFluidModuleWithDetails>(\n async () => this.loadCodeModule(_codeDetails),\n );\n this.attachListener();\n }\n\n /**\n * @deprecated - Temporary migratory API, to be removed when customers no longer need it. When removed,\n * ContainerContext should only take an IQuorumClients rather than an IQuorum. See IContainerContext for more\n * details.\n */\n public getSpecifiedCodeDetails(): IFluidCodeDetails | undefined {\n return (this._quorum.get(\"code\") ?? this._quorum.get(\"code2\")) as IFluidCodeDetails | undefined;\n }\n\n public dispose(error?: Error): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n\n this.runtime.dispose(error);\n this._quorum.dispose();\n this.deltaManager.dispose();\n }\n\n public getLoadedFromVersion(): IVersion | undefined {\n return this.container.loadedFromVersion;\n }\n\n public get attachState(): AttachState {\n return this.container.attachState;\n }\n\n /**\n * Create a summary. Used when attaching or serializing a detached container.\n *\n * @param blobRedirectTable - A table passed during the attach process. While detached, blob upload is supported\n * using IDs generated locally. After attach, these IDs cannot be used, so this table maps the old local IDs to the\n * new storage IDs so requests can be redirected.\n */\n public createSummary(blobRedirectTable?: Map<string, string>): ISummaryTree {\n return this.runtime.createSummary(blobRedirectTable);\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n const runtime = this.runtime;\n\n assert(connected === this.connected, 0x0de /* \"Mismatch in connection state while setting\" */);\n\n runtime.setConnectionState(connected, clientId);\n }\n\n public process(message: ISequencedDocumentMessage, local: boolean, context: any) {\n this.runtime.process(message, local, context);\n }\n\n public processSignal(message: ISignalMessage, local: boolean) {\n this.runtime.processSignal(message, local);\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return this.runtime.request(path);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n return this.container.getAbsoluteUrl(relativeUrl);\n }\n\n public getPendingLocalState(): unknown {\n return this.runtime.getPendingLocalState();\n }\n\n /**\n * Determines if the current code details of the context\n * satisfy the incoming constraint code details\n */\n public async satisfies(constraintCodeDetails: IFluidCodeDetails) {\n const comparers: IFluidCodeDetailsComparer[] = [];\n\n const maybeCompareCodeLoader = this.codeLoader;\n if (maybeCompareCodeLoader.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareCodeLoader.IFluidCodeDetailsComparer);\n }\n\n const moduleWithDetails = await this._fluidModuleP;\n const maybeCompareExport: Partial<IProvideFluidCodeDetailsComparer> | undefined =\n moduleWithDetails.module?.fluidExport;\n if (maybeCompareExport?.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareExport.IFluidCodeDetailsComparer);\n }\n\n // if there are not comparers it is not possible to know\n // if the current satisfy the incoming, so return false,\n // as assuming they do not satisfy is safer .e.g we will\n // reload, rather than potentially running with\n // incompatible code\n if (comparers.length === 0) {\n return false;\n }\n\n for (const comparer of comparers) {\n const satisfies = await comparer.satisfies(\n moduleWithDetails.details,\n constraintCodeDetails,\n );\n if (satisfies === false) {\n return false;\n }\n }\n return true;\n }\n\n public notifyAttaching(snapshot: ISnapshotTreeWithBlobContents) {\n this._baseSnapshot = snapshot;\n this.runtime.notifyAttaching?.(snapshot);\n this.runtime.setAttachState(AttachState.Attaching);\n }\n\n // #region private\n\n private async getRuntimeFactory(): Promise<IRuntimeFactory> {\n const fluidExport: FluidObject<IProvideRuntimeFactory> | undefined =\n (await this._fluidModuleP).module?.fluidExport;\n const runtimeFactory = fluidExport?.IRuntimeFactory;\n if (runtimeFactory === undefined) {\n throw new Error(PackageNotFactoryError);\n }\n\n return runtimeFactory;\n }\n\n private async instantiateRuntime(existing: boolean) {\n const runtimeFactory = await this.getRuntimeFactory();\n this._runtime = await runtimeFactory.instantiateRuntime(this, existing);\n }\n\n private attachListener() {\n this.container.once(\"attached\", () => {\n this.runtime.setAttachState(AttachState.Attached);\n });\n }\n\n private async loadCodeModule(codeDetails: IFluidCodeDetails): Promise<IFluidModuleWithDetails> {\n const loadCodeResult = await PerformanceEvent.timedExecAsync(\n this.taggedLogger,\n { eventName: \"CodeLoad\" },\n async () => this.codeLoader.load(codeDetails),\n );\n\n if (\"module\" in loadCodeResult) {\n const { module, details } = loadCodeResult;\n return {\n module,\n details: details ?? codeDetails,\n };\n } else {\n // If \"module\" is not in the result, we are using a legacy ICodeLoader. Fix the result up with details.\n // Once usage drops to 0 we can remove this compat path.\n this.taggedLogger.sendTelemetryEvent({ eventName: \"LegacyCodeLoader\" });\n return loadCodeResult;\n }\n }\n // #endregion\n}\n"]}
1
+ {"version":3,"file":"containerContext.js","sourceRoot":"","sources":["../src/containerContext.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { LazyPromise } from \"@fluidframework/common-utils\";\nimport {\n IAudience,\n IContainerContext,\n IDeltaManager,\n ILoader,\n IRuntime,\n ICriticalContainerError,\n AttachState,\n ILoaderOptions,\n IRuntimeFactory,\n IProvideRuntimeFactory,\n IFluidCodeDetails,\n IFluidCodeDetailsComparer,\n IProvideFluidCodeDetailsComparer,\n ICodeDetailsLoader,\n IFluidModuleWithDetails,\n ISnapshotTreeWithBlobContents,\n IBatchMessage,\n} from \"@fluidframework/container-definitions\";\nimport {\n IRequest,\n IResponse,\n FluidObject,\n} from \"@fluidframework/core-interfaces\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { isFluidResolvedUrl } from \"@fluidframework/driver-utils\";\nimport {\n IClientConfiguration,\n IClientDetails,\n IDocumentMessage,\n IQuorum,\n IQuorumClients,\n ISequencedDocumentMessage,\n ISignalMessage,\n ISnapshotTree,\n ISummaryTree,\n IVersion,\n MessageType,\n ISummaryContent,\n} from \"@fluidframework/protocol-definitions\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { Container } from \"./container\";\n\nconst PackageNotFactoryError = \"Code package does not implement IRuntimeFactory\";\n\nexport class ContainerContext implements IContainerContext {\n public static async createOrLoad(\n container: Container,\n scope: FluidObject,\n codeLoader: ICodeDetailsLoader,\n codeDetails: IFluidCodeDetails,\n baseSnapshot: ISnapshotTree | undefined,\n deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n loader: ILoader,\n submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n submitSummaryFn: (summaryOp: ISummaryContent) => number,\n submitBatchFn: (batch: IBatchMessage[]) => number,\n submitSignalFn: (contents: any) => void,\n closeFn: (error?: ICriticalContainerError) => void,\n version: string,\n updateDirtyContainerState: (dirty: boolean) => void,\n existing: boolean,\n pendingLocalState?: unknown,\n ): Promise<ContainerContext> {\n const context = new ContainerContext(\n container,\n scope,\n codeLoader,\n codeDetails,\n baseSnapshot,\n deltaManager,\n quorum,\n loader,\n submitFn,\n submitSummaryFn,\n submitBatchFn,\n submitSignalFn,\n closeFn,\n version,\n updateDirtyContainerState,\n existing,\n pendingLocalState);\n await context.instantiateRuntime(existing);\n return context;\n }\n\n public readonly taggedLogger: ITelemetryLogger;\n\n public get clientId(): string | undefined {\n return this.container.clientId;\n }\n\n /**\n * DISCLAIMER: this id is only for telemetry purposes. Not suitable for any other usages.\n */\n public get id(): string {\n const resolvedUrl = this.container.resolvedUrl;\n if (isFluidResolvedUrl(resolvedUrl)) {\n return resolvedUrl.id;\n }\n return \"\";\n }\n\n public get clientDetails(): IClientDetails {\n return this.container.clientDetails;\n }\n\n private _connected: boolean;\n /**\n * When true, ops are free to flow\n * When false, ops should be kept as pending or rejected\n */\n public get connected(): boolean {\n return this._connected;\n }\n\n public get canSummarize(): boolean {\n return \"summarize\" in this.runtime;\n }\n\n public get serviceConfiguration(): IClientConfiguration | undefined {\n return this.container.serviceConfiguration;\n }\n\n public get audience(): IAudience {\n return this.container.audience;\n }\n\n public get options(): ILoaderOptions {\n return this.container.options;\n }\n\n public get baseSnapshot() {\n return this._baseSnapshot;\n }\n\n public get storage(): IDocumentStorageService {\n return this.container.storage;\n }\n\n private _runtime: IRuntime | undefined;\n private get runtime() {\n if (this._runtime === undefined) {\n throw new Error(\"Attempted to access runtime before it was defined\");\n }\n return this._runtime;\n }\n\n private _disposed = false;\n\n public get disposed() {\n return this._disposed;\n }\n\n public get codeDetails() { return this._codeDetails; }\n\n private readonly _quorum: IQuorum;\n public get quorum(): IQuorumClients { return this._quorum; }\n\n private readonly _fluidModuleP: Promise<IFluidModuleWithDetails>;\n\n constructor(\n private readonly container: Container,\n public readonly scope: FluidObject,\n private readonly codeLoader: ICodeDetailsLoader,\n private readonly _codeDetails: IFluidCodeDetails,\n private _baseSnapshot: ISnapshotTree | undefined,\n public readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n quorum: IQuorum,\n public readonly loader: ILoader,\n public readonly submitFn: (type: MessageType, contents: any, batch: boolean, appData: any) => number,\n public readonly submitSummaryFn: (summaryOp: ISummaryContent) => number,\n /** @returns clientSequenceNumber of last message in a batch */\n public readonly submitBatchFn: (batch: IBatchMessage[]) => number,\n public readonly submitSignalFn: (contents: any) => void,\n public readonly closeFn: (error?: ICriticalContainerError) => void,\n public readonly version: string,\n public readonly updateDirtyContainerState: (dirty: boolean) => void,\n public readonly existing: boolean,\n public readonly pendingLocalState?: unknown,\n\n ) {\n this._connected = this.container.connected;\n this._quorum = quorum;\n this.taggedLogger = container.subLogger;\n this._fluidModuleP = new LazyPromise<IFluidModuleWithDetails>(\n async () => this.loadCodeModule(_codeDetails),\n );\n this.attachListener();\n }\n\n /**\n * @deprecated Temporary migratory API, to be removed when customers no longer need it.\n * When removed, `ContainerContext` should only take an {@link @fluidframework/container-definitions#IQuorumClients}\n * rather than an {@link @fluidframework/protocol-definitions#IQuorum}.\n * See {@link @fluidframework/container-definitions#IContainerContext} for more details.\n */\n public getSpecifiedCodeDetails(): IFluidCodeDetails | undefined {\n return (this._quorum.get(\"code\") ?? this._quorum.get(\"code2\")) as IFluidCodeDetails | undefined;\n }\n\n public dispose(error?: Error): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n\n this.runtime.dispose(error);\n this._quorum.dispose();\n this.deltaManager.dispose();\n }\n\n public getLoadedFromVersion(): IVersion | undefined {\n return this.container.loadedFromVersion;\n }\n\n public get attachState(): AttachState {\n return this.container.attachState;\n }\n\n /**\n * Create a summary. Used when attaching or serializing a detached container.\n *\n * @param blobRedirectTable - A table passed during the attach process. While detached, blob upload is supported\n * using IDs generated locally. After attach, these IDs cannot be used, so this table maps the old local IDs to the\n * new storage IDs so requests can be redirected.\n */\n public createSummary(blobRedirectTable?: Map<string, string>): ISummaryTree {\n return this.runtime.createSummary(blobRedirectTable);\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n const runtime = this.runtime;\n this._connected = connected;\n runtime.setConnectionState(connected, clientId);\n }\n\n public process(message: ISequencedDocumentMessage, local: boolean, context: any) {\n this.runtime.process(message, local, context);\n }\n\n public processSignal(message: ISignalMessage, local: boolean) {\n this.runtime.processSignal(message, local);\n }\n\n public async request(path: IRequest): Promise<IResponse> {\n return this.runtime.request(path);\n }\n\n public async getAbsoluteUrl(relativeUrl: string): Promise<string | undefined> {\n return this.container.getAbsoluteUrl(relativeUrl);\n }\n\n public getPendingLocalState(): unknown {\n return this.runtime.getPendingLocalState();\n }\n\n /**\n * Determines if the current code details of the context\n * satisfy the incoming constraint code details\n */\n public async satisfies(constraintCodeDetails: IFluidCodeDetails) {\n const comparers: IFluidCodeDetailsComparer[] = [];\n\n const maybeCompareCodeLoader = this.codeLoader;\n if (maybeCompareCodeLoader.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareCodeLoader.IFluidCodeDetailsComparer);\n }\n\n const moduleWithDetails = await this._fluidModuleP;\n const maybeCompareExport: Partial<IProvideFluidCodeDetailsComparer> | undefined =\n moduleWithDetails.module?.fluidExport;\n if (maybeCompareExport?.IFluidCodeDetailsComparer !== undefined) {\n comparers.push(maybeCompareExport.IFluidCodeDetailsComparer);\n }\n\n // if there are not comparers it is not possible to know\n // if the current satisfy the incoming, so return false,\n // as assuming they do not satisfy is safer .e.g we will\n // reload, rather than potentially running with\n // incompatible code\n if (comparers.length === 0) {\n return false;\n }\n\n for (const comparer of comparers) {\n const satisfies = await comparer.satisfies(\n moduleWithDetails.details,\n constraintCodeDetails,\n );\n if (satisfies === false) {\n return false;\n }\n }\n return true;\n }\n\n public notifyAttaching(snapshot: ISnapshotTreeWithBlobContents) {\n this._baseSnapshot = snapshot;\n this.runtime.notifyAttaching?.(snapshot);\n this.runtime.setAttachState(AttachState.Attaching);\n }\n\n // #region private\n\n private async getRuntimeFactory(): Promise<IRuntimeFactory> {\n const fluidExport: FluidObject<IProvideRuntimeFactory> | undefined =\n (await this._fluidModuleP).module?.fluidExport;\n const runtimeFactory = fluidExport?.IRuntimeFactory;\n if (runtimeFactory === undefined) {\n throw new Error(PackageNotFactoryError);\n }\n\n return runtimeFactory;\n }\n\n private async instantiateRuntime(existing: boolean) {\n const runtimeFactory = await this.getRuntimeFactory();\n this._runtime = await runtimeFactory.instantiateRuntime(this, existing);\n }\n\n private attachListener() {\n this.container.once(\"attached\", () => {\n this.runtime.setAttachState(AttachState.Attached);\n });\n }\n\n private async loadCodeModule(codeDetails: IFluidCodeDetails): Promise<IFluidModuleWithDetails> {\n const loadCodeResult = await PerformanceEvent.timedExecAsync(\n this.taggedLogger,\n { eventName: \"CodeLoad\" },\n async () => this.codeLoader.load(codeDetails),\n );\n\n if (\"module\" in loadCodeResult) {\n const { module, details } = loadCodeResult;\n return {\n module,\n details: details ?? codeDetails,\n };\n } else {\n // If \"module\" is not in the result, we are using a legacy ICodeLoader. Fix the result up with details.\n // Once usage drops to 0 we can remove this compat path.\n this.taggedLogger.sendTelemetryEvent({ eventName: \"LegacyCodeLoader\" });\n return loadCodeResult;\n }\n }\n // #endregion\n}\n"]}
@@ -2,19 +2,24 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { ITelemetryLogger } from "@fluidframework/common-definitions";
5
+ import { IDisposable, ITelemetryLogger } from "@fluidframework/common-definitions";
6
6
  import { ISnapshotTreeWithBlobContents } from "@fluidframework/container-definitions";
7
- import { FetchSource, IDocumentStorageService, IDocumentStorageServicePolicies, ISummaryContext } from "@fluidframework/driver-definitions";
7
+ import { FetchSource, IDocumentService, IDocumentStorageService, IDocumentStorageServicePolicies, ISummaryContext } from "@fluidframework/driver-definitions";
8
8
  import { ICreateBlobResponse, ISnapshotTree, ISummaryHandle, ISummaryTree, IVersion } from "@fluidframework/protocol-definitions";
9
9
  import { IDetachedBlobStorage } from "./loader";
10
10
  /**
11
11
  * This class wraps the actual storage and make sure no wrong apis are called according to
12
12
  * container attach state.
13
13
  */
14
- export declare class ContainerStorageAdapter implements IDocumentStorageService {
15
- private readonly storageGetter;
14
+ export declare class ContainerStorageAdapter implements IDocumentStorageService, IDisposable {
15
+ private readonly logger;
16
+ private readonly captureProtocolSummary?;
16
17
  private readonly blobContents;
17
- constructor(storageGetter: () => IDocumentStorageService);
18
+ private _storageService;
19
+ constructor(detachedBlobStorage: IDetachedBlobStorage | undefined, logger: ITelemetryLogger, captureProtocolSummary?: (() => ISummaryTree) | undefined);
20
+ disposed: boolean;
21
+ dispose(error?: Error): void;
22
+ connectToService(service: IDocumentService): Promise<void>;
18
23
  loadSnapshotForRehydratingContainer(snapshotTree: ISnapshotTreeWithBlobContents): void;
19
24
  private getBlobContents;
20
25
  get policies(): IDocumentStorageServicePolicies | undefined;
@@ -26,23 +31,4 @@ export declare class ContainerStorageAdapter implements IDocumentStorageService
26
31
  downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree>;
27
32
  createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse>;
28
33
  }
29
- /**
30
- * Storage which only supports createBlob() and readBlob(). This is used with IDetachedBlobStorage to support
31
- * blobs in detached containers.
32
- */
33
- export declare class BlobOnlyStorage implements IDocumentStorageService {
34
- private readonly blobStorage;
35
- private readonly logger;
36
- constructor(blobStorage: IDetachedBlobStorage, logger: ITelemetryLogger);
37
- createBlob(content: ArrayBufferLike): Promise<ICreateBlobResponse>;
38
- readBlob(blobId: string): Promise<ArrayBufferLike>;
39
- get policies(): IDocumentStorageServicePolicies | undefined;
40
- get repositoryUrl(): string;
41
- getSnapshotTree: () => Promise<ISnapshotTree | null>;
42
- getVersions: () => Promise<IVersion[]>;
43
- write: () => Promise<IVersion>;
44
- uploadSummaryWithContext: () => Promise<string>;
45
- downloadSummary: () => Promise<ISummaryTree>;
46
- private notCalled;
47
- }
48
34
  //# sourceMappingURL=containerStorageAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"containerStorageAdapter.d.ts","sourceRoot":"","sources":["../src/containerStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EACH,WAAW,EACX,uBAAuB,EACvB,+BAA+B,EAC/B,eAAe,EAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,uBAAuB;IAEvD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAD1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0C;gBAC1C,aAAa,EAAE,MAAM,uBAAuB;IAElE,mCAAmC,CAAC,YAAY,EAAE,6BAA6B;IAItF,OAAO,CAAC,eAAe;IASvB,IAAW,QAAQ,IAAI,+BAA+B,GAAG,SAAS,CAOjE;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEY,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIzF,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQ9C,WAAW,CACpB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,WAAW,GAC1B,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIT,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1F,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAI9D,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAG/E;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,uBAAuB;IAEvD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,WAAW,EAAE,oBAAoB,EACjC,MAAM,EAAE,gBAAgB;IAGhC,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIlE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAI/D,IAAW,QAAQ,IAAI,+BAA+B,GAAG,SAAS,CAEjE;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAGM,eAAe,EAAE,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAkB;IACtE,WAAW,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAkB;IACxD,KAAK,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAkB;IAChD,wBAAwB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAkB;IACjE,eAAe,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAkB;IAGrE,OAAO,CAAC,SAAS;CASpB"}
1
+ {"version":3,"file":"containerStorageAdapter.d.ts","sourceRoot":"","sources":["../src/containerStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EACH,WAAW,EACX,gBAAgB,EAChB,uBAAuB,EACvB,+BAA+B,EAC/B,eAAe,EAClB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAIhD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,uBAAuB,EAAE,WAAW;IAM5E,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IAN5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0C;IACvE,OAAO,CAAC,eAAe,CAAiD;gBAGpE,mBAAmB,EAAE,oBAAoB,GAAG,SAAS,EACpC,MAAM,EAAE,gBAAgB,EACxB,sBAAsB,CAAC,SAAQ,YAAY,aAAA;IAKhE,QAAQ,EAAE,OAAO,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAKf,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBhE,mCAAmC,CAAC,YAAY,EAAE,6BAA6B;IAItF,OAAO,CAAC,eAAe;IASvB,IAAW,QAAQ,IAAI,+BAA+B,GAAG,SAAS,CAOjE;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEY,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIzF,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQ9C,WAAW,CACpB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,WAAW,GAC1B,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIT,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1F,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAI9D,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAG/E"}
@@ -4,15 +4,43 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.BlobOnlyStorage = exports.ContainerStorageAdapter = void 0;
7
+ exports.ContainerStorageAdapter = void 0;
8
+ const common_utils_1 = require("@fluidframework/common-utils");
9
+ const driver_utils_1 = require("@fluidframework/driver-utils");
10
+ const protocolTreeDocumentStorageService_1 = require("./protocolTreeDocumentStorageService");
11
+ const retriableDocumentStorageService_1 = require("./retriableDocumentStorageService");
8
12
  /**
9
13
  * This class wraps the actual storage and make sure no wrong apis are called according to
10
14
  * container attach state.
11
15
  */
12
16
  class ContainerStorageAdapter {
13
- constructor(storageGetter) {
14
- this.storageGetter = storageGetter;
17
+ constructor(detachedBlobStorage, logger, captureProtocolSummary) {
18
+ this.logger = logger;
19
+ this.captureProtocolSummary = captureProtocolSummary;
15
20
  this.blobContents = {};
21
+ this.disposed = false;
22
+ this._storageService = new BlobOnlyStorage(detachedBlobStorage, logger);
23
+ }
24
+ dispose(error) {
25
+ var _a, _b;
26
+ (_b = (_a = this._storageService) === null || _a === void 0 ? void 0 : _a.dispose) === null || _b === void 0 ? void 0 : _b.call(_a, error);
27
+ this.disposed = true;
28
+ }
29
+ async connectToService(service) {
30
+ var _a, _b;
31
+ if (!(this._storageService instanceof BlobOnlyStorage)) {
32
+ return;
33
+ }
34
+ const storageService = await service.connectToStorage();
35
+ const retriableStorage = this._storageService =
36
+ new retriableDocumentStorageService_1.RetriableDocumentStorageService(storageService, this.logger);
37
+ if (this.captureProtocolSummary !== undefined) {
38
+ this.logger.sendTelemetryEvent({ eventName: "summarizeProtocolTreeEnabled" });
39
+ this._storageService =
40
+ new protocolTreeDocumentStorageService_1.ProtocolTreeStorageService(retriableStorage, this.captureProtocolSummary);
41
+ }
42
+ // ensure we did not lose that policy in the process of wrapping
43
+ (0, common_utils_1.assert)(((_a = storageService.policies) === null || _a === void 0 ? void 0 : _a.minBlobSize) === ((_b = this._storageService.policies) === null || _b === void 0 ? void 0 : _b.minBlobSize), 0x0e0 /* "lost minBlobSize policy" */);
16
44
  }
17
45
  loadSnapshotForRehydratingContainer(snapshotTree) {
18
46
  this.getBlobContents(snapshotTree);
@@ -29,35 +57,35 @@ class ContainerStorageAdapter {
29
57
  // back-compat 0.40 containerRuntime requests policies even in detached container if storage is present
30
58
  // and storage is always present in >=0.41.
31
59
  try {
32
- return this.storageGetter().policies;
60
+ return this._storageService.policies;
33
61
  }
34
62
  catch (e) { }
35
63
  return undefined;
36
64
  }
37
65
  get repositoryUrl() {
38
- return this.storageGetter().repositoryUrl;
66
+ return this._storageService.repositoryUrl;
39
67
  }
40
68
  async getSnapshotTree(version, scenarioName) {
41
- return this.storageGetter().getSnapshotTree(version, scenarioName);
69
+ return this._storageService.getSnapshotTree(version, scenarioName);
42
70
  }
43
71
  async readBlob(id) {
44
72
  const blob = this.blobContents[id];
45
73
  if (blob !== undefined) {
46
74
  return blob;
47
75
  }
48
- return this.storageGetter().readBlob(id);
76
+ return this._storageService.readBlob(id);
49
77
  }
50
78
  async getVersions(versionId, count, scenarioName, fetchSource) {
51
- return this.storageGetter().getVersions(versionId, count, scenarioName, fetchSource);
79
+ return this._storageService.getVersions(versionId, count, scenarioName, fetchSource);
52
80
  }
53
81
  async uploadSummaryWithContext(summary, context) {
54
- return this.storageGetter().uploadSummaryWithContext(summary, context);
82
+ return this._storageService.uploadSummaryWithContext(summary, context);
55
83
  }
56
84
  async downloadSummary(handle) {
57
- return this.storageGetter().downloadSummary(handle);
85
+ return this._storageService.downloadSummary(handle);
58
86
  }
59
87
  async createBlob(file) {
60
- return this.storageGetter().createBlob(file);
88
+ return this._storageService.createBlob(file);
61
89
  }
62
90
  }
63
91
  exports.ContainerStorageAdapter = ContainerStorageAdapter;
@@ -66,8 +94,8 @@ exports.ContainerStorageAdapter = ContainerStorageAdapter;
66
94
  * blobs in detached containers.
67
95
  */
68
96
  class BlobOnlyStorage {
69
- constructor(blobStorage, logger) {
70
- this.blobStorage = blobStorage;
97
+ constructor(detachedStorage, logger) {
98
+ this.detachedStorage = detachedStorage;
71
99
  this.logger = logger;
72
100
  /* eslint-disable @typescript-eslint/unbound-method */
73
101
  this.getSnapshotTree = this.notCalled;
@@ -77,10 +105,16 @@ class BlobOnlyStorage {
77
105
  this.downloadSummary = this.notCalled;
78
106
  }
79
107
  async createBlob(content) {
80
- return this.blobStorage.createBlob(content);
108
+ return this.verifyStorage().createBlob(content);
81
109
  }
82
110
  async readBlob(blobId) {
83
- return this.blobStorage.readBlob(blobId);
111
+ return this.verifyStorage().readBlob(blobId);
112
+ }
113
+ verifyStorage() {
114
+ if (this.detachedStorage === undefined) {
115
+ throw new driver_utils_1.UsageError("Real storage calls not allowed in Unattached container");
116
+ }
117
+ return this.detachedStorage;
84
118
  }
85
119
  get policies() {
86
120
  return this.notCalled();
@@ -90,6 +124,7 @@ class BlobOnlyStorage {
90
124
  }
91
125
  /* eslint-enable @typescript-eslint/unbound-method */
92
126
  notCalled() {
127
+ this.verifyStorage();
93
128
  try {
94
129
  // some browsers may not populate stack unless exception is thrown
95
130
  throw new Error("BlobOnlyStorage not implemented method used");
@@ -100,5 +135,4 @@ class BlobOnlyStorage {
100
135
  }
101
136
  }
102
137
  }
103
- exports.BlobOnlyStorage = BlobOnlyStorage;
104
138
  //# sourceMappingURL=containerStorageAdapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"containerStorageAdapter.js","sourceRoot":"","sources":["../src/containerStorageAdapter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAmBH;;;GAGG;AACH,MAAa,uBAAuB;IAEhC,YAA6B,aAA4C;QAA5C,kBAAa,GAAb,aAAa,CAA+B;QADxD,iBAAY,GAAuC,EAAE,CAAC;IACK,CAAC;IAEtE,mCAAmC,CAAC,YAA2C;QAClF,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAEO,eAAe,CAAC,YAA2C;QAC/D,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE;YAClE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;SACjC;QACD,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;YACxD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAC9B;IACL,CAAC;IAED,IAAW,QAAQ;QACf,uGAAuG;QACvG,2CAA2C;QAC3C,IAAI;YACA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC;SACxC;QAAC,OAAO,CAAC,EAAE,GAAE;QACd,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,aAAa,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,OAAkB,EAAE,YAAqB;QAClE,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvE,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,EAAU;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,OAAO,IAAI,CAAC;SACf;QACD,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,WAAW,CACpB,SAAwB,EACxB,KAAa,EACb,YAAqB,EACrB,WAAyB;QAEzB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACzF,CAAC;IAEM,KAAK,CAAC,wBAAwB,CAAC,OAAqB,EAAE,OAAwB;QACjF,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,MAAsB;QAC/C,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAqB;QACzC,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;CACJ;AA9DD,0DA8DC;AAED;;;GAGG;AACH,MAAa,eAAe;IACxB,YACqB,WAAiC,EACjC,MAAwB;QADxB,gBAAW,GAAX,WAAW,CAAsB;QACjC,WAAM,GAAN,MAAM,CAAkB;QAmB7C,sDAAsD;QAC/C,oBAAe,GAAwC,IAAI,CAAC,SAAS,CAAC;QACtE,gBAAW,GAA8B,IAAI,CAAC,SAAS,CAAC;QACxD,UAAK,GAA4B,IAAI,CAAC,SAAS,CAAC;QAChD,6BAAwB,GAA0B,IAAI,CAAC,SAAS,CAAC;QACjE,oBAAe,GAAgC,IAAI,CAAC,SAAS,CAAC;IAvBjE,CAAC;IAEE,KAAK,CAAC,UAAU,CAAC,OAAwB;QAC5C,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,MAAc;QAChC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC;IAQD,qDAAqD;IAE7C,SAAS;QACb,IAAI;YACA,kEAAkE;YAClE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAClE;QAAC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,EAAE,GAAG,CAAC,CAAC;YAC3E,MAAM,GAAG,CAAC;SACb;IACL,CAAC;CACJ;AAvCD,0CAuCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { ISnapshotTreeWithBlobContents } from \"@fluidframework/container-definitions\";\nimport {\n FetchSource,\n IDocumentStorageService,\n IDocumentStorageServicePolicies,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { IDetachedBlobStorage } from \"./loader\";\n\n/**\n * This class wraps the actual storage and make sure no wrong apis are called according to\n * container attach state.\n */\nexport class ContainerStorageAdapter implements IDocumentStorageService {\n private readonly blobContents: { [id: string]: ArrayBufferLike; } = {};\n constructor(private readonly storageGetter: () => IDocumentStorageService) {}\n\n public loadSnapshotForRehydratingContainer(snapshotTree: ISnapshotTreeWithBlobContents) {\n this.getBlobContents(snapshotTree);\n }\n\n private getBlobContents(snapshotTree: ISnapshotTreeWithBlobContents) {\n for (const [id, value] of Object.entries(snapshotTree.blobsContents)) {\n this.blobContents[id] = value;\n }\n for (const [_, tree] of Object.entries(snapshotTree.trees)) {\n this.getBlobContents(tree);\n }\n }\n\n public get policies(): IDocumentStorageServicePolicies | undefined {\n // back-compat 0.40 containerRuntime requests policies even in detached container if storage is present\n // and storage is always present in >=0.41.\n try {\n return this.storageGetter().policies;\n } catch (e) {}\n return undefined;\n }\n\n public get repositoryUrl(): string {\n return this.storageGetter().repositoryUrl;\n }\n\n public async getSnapshotTree(version?: IVersion, scenarioName?: string): Promise<ISnapshotTree | null> {\n return this.storageGetter().getSnapshotTree(version, scenarioName);\n }\n\n public async readBlob(id: string): Promise<ArrayBufferLike> {\n const blob = this.blobContents[id];\n if (blob !== undefined) {\n return blob;\n }\n return this.storageGetter().readBlob(id);\n }\n\n public async getVersions(\n versionId: string | null,\n count: number,\n scenarioName?: string,\n fetchSource?: FetchSource,\n ): Promise<IVersion[]> {\n return this.storageGetter().getVersions(versionId, count, scenarioName, fetchSource);\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n return this.storageGetter().uploadSummaryWithContext(summary, context);\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n return this.storageGetter().downloadSummary(handle);\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n return this.storageGetter().createBlob(file);\n }\n}\n\n/**\n * Storage which only supports createBlob() and readBlob(). This is used with IDetachedBlobStorage to support\n * blobs in detached containers.\n */\nexport class BlobOnlyStorage implements IDocumentStorageService {\n constructor(\n private readonly blobStorage: IDetachedBlobStorage,\n private readonly logger: ITelemetryLogger,\n ) { }\n\n public async createBlob(content: ArrayBufferLike): Promise<ICreateBlobResponse> {\n return this.blobStorage.createBlob(content);\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return this.blobStorage.readBlob(blobId);\n }\n\n public get policies(): IDocumentStorageServicePolicies | undefined {\n return this.notCalled();\n }\n\n public get repositoryUrl(): string {\n return this.notCalled();\n }\n\n /* eslint-disable @typescript-eslint/unbound-method */\n public getSnapshotTree: () => Promise<ISnapshotTree | null> = this.notCalled;\n public getVersions: () => Promise<IVersion[]> = this.notCalled;\n public write: () => Promise<IVersion> = this.notCalled;\n public uploadSummaryWithContext: () => Promise<string> = this.notCalled;\n public downloadSummary: () => Promise<ISummaryTree> = this.notCalled;\n /* eslint-enable @typescript-eslint/unbound-method */\n\n private notCalled(): never {\n try {\n // some browsers may not populate stack unless exception is thrown\n throw new Error(\"BlobOnlyStorage not implemented method used\");\n } catch (err) {\n this.logger.sendErrorEvent({ eventName: \"BlobOnlyStorageWrongCall\" }, err);\n throw err;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"containerStorageAdapter.js","sourceRoot":"","sources":["../src/containerStorageAdapter.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 { IDisposable, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ISnapshotTreeWithBlobContents } from \"@fluidframework/container-definitions\";\nimport {\n FetchSource,\n IDocumentService,\n IDocumentStorageService,\n IDocumentStorageServicePolicies,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport { UsageError } from \"@fluidframework/driver-utils\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { IDetachedBlobStorage } from \"./loader\";\nimport { ProtocolTreeStorageService } from \"./protocolTreeDocumentStorageService\";\nimport { RetriableDocumentStorageService } from \"./retriableDocumentStorageService\";\n\n/**\n * This class wraps the actual storage and make sure no wrong apis are called according to\n * container attach state.\n */\nexport class ContainerStorageAdapter implements IDocumentStorageService, IDisposable {\n private readonly blobContents: { [id: string]: ArrayBufferLike; } = {};\n private _storageService: IDocumentStorageService & Partial<IDisposable>;\n\n constructor(\n detachedBlobStorage: IDetachedBlobStorage | undefined,\n private readonly logger: ITelemetryLogger,\n private readonly captureProtocolSummary?: () => ISummaryTree,\n ) {\n this._storageService = new BlobOnlyStorage(detachedBlobStorage, logger);\n }\n\n disposed: boolean = false;\n dispose(error?: Error): void {\n this._storageService?.dispose?.(error);\n this.disposed = true;\n }\n\n public async connectToService(service: IDocumentService): Promise<void> {\n if (!(this._storageService instanceof BlobOnlyStorage)) {\n return;\n }\n\n const storageService = await service.connectToStorage();\n const retriableStorage = this._storageService =\n new RetriableDocumentStorageService(\n storageService,\n this.logger);\n\n if (this.captureProtocolSummary !== undefined) {\n this.logger.sendTelemetryEvent({ eventName: \"summarizeProtocolTreeEnabled\" });\n this._storageService =\n new ProtocolTreeStorageService(retriableStorage, 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 public loadSnapshotForRehydratingContainer(snapshotTree: ISnapshotTreeWithBlobContents) {\n this.getBlobContents(snapshotTree);\n }\n\n private getBlobContents(snapshotTree: ISnapshotTreeWithBlobContents) {\n for (const [id, value] of Object.entries(snapshotTree.blobsContents)) {\n this.blobContents[id] = value;\n }\n for (const [_, tree] of Object.entries(snapshotTree.trees)) {\n this.getBlobContents(tree);\n }\n }\n\n public get policies(): IDocumentStorageServicePolicies | undefined {\n // back-compat 0.40 containerRuntime requests policies even in detached container if storage is present\n // and storage is always present in >=0.41.\n try {\n return this._storageService.policies;\n } catch (e) {}\n return undefined;\n }\n\n public get repositoryUrl(): string {\n return this._storageService.repositoryUrl;\n }\n\n public async getSnapshotTree(version?: IVersion, scenarioName?: string): Promise<ISnapshotTree | null> {\n return this._storageService.getSnapshotTree(version, scenarioName);\n }\n\n public async readBlob(id: string): Promise<ArrayBufferLike> {\n const blob = this.blobContents[id];\n if (blob !== undefined) {\n return blob;\n }\n return this._storageService.readBlob(id);\n }\n\n public async getVersions(\n versionId: string | null,\n count: number,\n scenarioName?: string,\n fetchSource?: FetchSource,\n ): Promise<IVersion[]> {\n return this._storageService.getVersions(versionId, count, scenarioName, fetchSource);\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n return this._storageService.uploadSummaryWithContext(summary, context);\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n return this._storageService.downloadSummary(handle);\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n return this._storageService.createBlob(file);\n }\n}\n\n/**\n * Storage which only supports createBlob() and readBlob(). This is used with IDetachedBlobStorage to support\n * blobs in detached containers.\n */\nclass BlobOnlyStorage implements IDocumentStorageService {\n constructor(\n private readonly detachedStorage: IDetachedBlobStorage | undefined,\n private readonly logger: ITelemetryLogger,\n ) { }\n\n public async createBlob(content: ArrayBufferLike): Promise<ICreateBlobResponse> {\n return this.verifyStorage().createBlob(content);\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return this.verifyStorage().readBlob(blobId);\n }\n\n private verifyStorage(): IDetachedBlobStorage {\n if (this.detachedStorage === undefined) {\n throw new UsageError(\"Real storage calls not allowed in Unattached container\");\n }\n return this.detachedStorage;\n }\n\n public get policies(): IDocumentStorageServicePolicies | undefined {\n return this.notCalled();\n }\n\n public get repositoryUrl(): string {\n return this.notCalled();\n }\n\n /* eslint-disable @typescript-eslint/unbound-method */\n public getSnapshotTree: () => Promise<ISnapshotTree | null> = this.notCalled;\n public getVersions: () => Promise<IVersion[]> = this.notCalled;\n public write: () => Promise<IVersion> = this.notCalled;\n public uploadSummaryWithContext: () => Promise<string> = this.notCalled;\n public downloadSummary: () => Promise<ISummaryTree> = this.notCalled;\n /* eslint-enable @typescript-eslint/unbound-method */\n\n private notCalled(): never {\n this.verifyStorage();\n try {\n // some browsers may not populate stack unless exception is thrown\n throw new Error(\"BlobOnlyStorage not implemented method used\");\n } catch (err) {\n this.logger.sendErrorEvent({ eventName: \"BlobOnlyStorageWrongCall\" }, err);\n throw err;\n }\n }\n}\n"]}
@@ -83,7 +83,7 @@ export declare class DeltaManager<TConnectionManager extends IConnectionManager>
83
83
  get outbound(): IDeltaQueue<IDocumentMessage[]>;
84
84
  get readOnlyInfo(): import("@fluidframework/container-definitions").ReadOnlyInfo;
85
85
  get clientDetails(): import("@fluidframework/protocol-definitions").IClientDetails;
86
- submit(type: MessageType, contents: any, batch?: boolean, metadata?: any): number;
86
+ submit(type: MessageType, contents?: string, batch?: boolean, metadata?: any): number;
87
87
  submitSignal(content: any): void;
88
88
  flush(): void;
89
89
  get connectionProps(): ITelemetryProperties;
@@ -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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"}
@@ -153,7 +153,7 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
153
153
  this.close(new container_utils_1.UsageError("Making changes to data model is disallowed while processing ops."));
154
154
  }
155
155
  const messagePartial = {
156
- contents: JSON.stringify(contents),
156
+ contents,
157
157
  metadata,
158
158
  referenceSequenceNumber: this.lastProcessedSequenceNumber,
159
159
  type,
@@ -165,7 +165,9 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
165
165
  if (message === undefined) {
166
166
  return -1;
167
167
  }
168
- this.opsSize += message.contents.length;
168
+ if (contents !== undefined) {
169
+ this.opsSize += contents.length;
170
+ }
169
171
  this.messageBuffer.push(message);
170
172
  this.emit("submitOp", message);
171
173
  if (!batch) {
@@ -175,13 +177,23 @@ class DeltaManager extends common_utils_1.TypedEventEmitter {
175
177
  }
176
178
  submitSignal(content) { return this.connectionManager.submitSignal(content); }
177
179
  flush() {
178
- if (this.messageBuffer.length === 0) {
180
+ var _a, _b, _c;
181
+ const batch = this.messageBuffer;
182
+ if (batch.length === 0) {
179
183
  return;
180
184
  }
181
- // The prepareFlush event allows listeners to append metadata to the batch prior to submission.
182
- this.emit("prepareSend", this.messageBuffer);
183
- this.connectionManager.sendMessages(this.messageBuffer);
184
185
  this.messageBuffer = [];
186
+ // The prepareFlush event allows listeners to append metadata to the batch prior to submission.
187
+ this.emit("prepareSend", batch);
188
+ if (batch.length === 1) {
189
+ (0, common_utils_1.assert)(((_a = batch[0].metadata) === null || _a === void 0 ? void 0 : _a.batch) === undefined, 0x3c9 /* no batch markup on single message */);
190
+ }
191
+ else {
192
+ (0, common_utils_1.assert)(((_b = batch[0].metadata) === null || _b === void 0 ? void 0 : _b.batch) === true, 0x3ca /* no start batch markup */);
193
+ (0, common_utils_1.assert)(((_c = batch[batch.length - 1].metadata) === null || _c === void 0 ? void 0 : _c.batch) === false, 0x3cb /* no end batch markup */);
194
+ }
195
+ this.connectionManager.sendMessages(batch);
196
+ (0, common_utils_1.assert)(this.messageBuffer.length === 0, 0x3cc /* reentrancy */);
185
197
  }
186
198
  get connectionProps() {
187
199
  return Object.assign({ sequenceNumber: this.lastSequenceNumber, opsSize: this.opsSize > 0 ? this.opsSize : undefined }, this.connectionManager.connectionProps);