@fluidframework/container-loader 1.2.6 → 2.0.0-dev.1.3.0.96595
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.
- package/.mocharc.js +12 -0
- package/dist/audience.d.ts +2 -6
- package/dist/audience.d.ts.map +1 -1
- package/dist/audience.js +6 -11
- package/dist/audience.js.map +1 -1
- package/dist/catchUpMonitor.d.ts +29 -0
- package/dist/catchUpMonitor.d.ts.map +1 -0
- package/dist/catchUpMonitor.js +43 -0
- package/dist/catchUpMonitor.js.map +1 -0
- package/dist/collabWindowTracker.d.ts +1 -1
- package/dist/collabWindowTracker.d.ts.map +1 -1
- package/dist/collabWindowTracker.js +12 -4
- package/dist/collabWindowTracker.js.map +1 -1
- package/dist/connectionManager.d.ts +5 -5
- package/dist/connectionManager.d.ts.map +1 -1
- package/dist/connectionManager.js +43 -22
- package/dist/connectionManager.js.map +1 -1
- package/dist/connectionState.d.ts +0 -5
- package/dist/connectionState.d.ts.map +1 -1
- package/dist/connectionState.js +0 -5
- package/dist/connectionState.js.map +1 -1
- package/dist/connectionStateHandler.d.ts +84 -22
- package/dist/connectionStateHandler.d.ts.map +1 -1
- package/dist/connectionStateHandler.js +172 -59
- package/dist/connectionStateHandler.js.map +1 -1
- package/dist/container.d.ts +29 -17
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +181 -171
- package/dist/container.js.map +1 -1
- package/dist/containerContext.d.ts +18 -7
- package/dist/containerContext.d.ts.map +1 -1
- package/dist/containerContext.js +18 -8
- package/dist/containerContext.js.map +1 -1
- package/dist/containerStorageAdapter.d.ts +11 -25
- package/dist/containerStorageAdapter.d.ts.map +1 -1
- package/dist/containerStorageAdapter.js +51 -17
- package/dist/containerStorageAdapter.js.map +1 -1
- package/dist/contracts.d.ts +5 -5
- package/dist/contracts.js.map +1 -1
- package/dist/deltaManager.d.ts +4 -1
- package/dist/deltaManager.d.ts.map +1 -1
- package/dist/deltaManager.js +39 -12
- package/dist/deltaManager.js.map +1 -1
- package/dist/deltaManagerProxy.d.ts +4 -1
- package/dist/deltaManagerProxy.d.ts.map +1 -1
- package/dist/deltaQueue.d.ts +9 -2
- package/dist/deltaQueue.d.ts.map +1 -1
- package/dist/deltaQueue.js +31 -26
- package/dist/deltaQueue.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +8 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +4 -3
- package/dist/loader.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/protocol.d.ts +27 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +79 -0
- package/dist/protocol.js.map +1 -0
- package/dist/protocolTreeDocumentStorageService.d.ts +1 -1
- package/dist/protocolTreeDocumentStorageService.d.ts.map +1 -1
- package/dist/retriableDocumentStorageService.d.ts +2 -2
- package/dist/retriableDocumentStorageService.d.ts.map +1 -1
- package/dist/retriableDocumentStorageService.js +2 -2
- package/dist/retriableDocumentStorageService.js.map +1 -1
- package/lib/audience.d.ts +2 -6
- package/lib/audience.d.ts.map +1 -1
- package/lib/audience.js +6 -11
- package/lib/audience.js.map +1 -1
- package/lib/catchUpMonitor.d.ts +29 -0
- package/lib/catchUpMonitor.d.ts.map +1 -0
- package/lib/catchUpMonitor.js +39 -0
- package/lib/catchUpMonitor.js.map +1 -0
- package/lib/collabWindowTracker.d.ts +1 -1
- package/lib/collabWindowTracker.d.ts.map +1 -1
- package/lib/collabWindowTracker.js +13 -5
- package/lib/collabWindowTracker.js.map +1 -1
- package/lib/connectionManager.d.ts +5 -5
- package/lib/connectionManager.d.ts.map +1 -1
- package/lib/connectionManager.js +44 -25
- package/lib/connectionManager.js.map +1 -1
- package/lib/connectionState.d.ts +0 -5
- package/lib/connectionState.d.ts.map +1 -1
- package/lib/connectionState.js +0 -5
- package/lib/connectionState.js.map +1 -1
- package/lib/connectionStateHandler.d.ts +84 -22
- package/lib/connectionStateHandler.d.ts.map +1 -1
- package/lib/connectionStateHandler.js +171 -59
- package/lib/connectionStateHandler.js.map +1 -1
- package/lib/container.d.ts +29 -17
- package/lib/container.d.ts.map +1 -1
- package/lib/container.js +184 -174
- package/lib/container.js.map +1 -1
- package/lib/containerContext.d.ts +18 -7
- package/lib/containerContext.d.ts.map +1 -1
- package/lib/containerContext.js +19 -9
- package/lib/containerContext.js.map +1 -1
- package/lib/containerStorageAdapter.d.ts +11 -25
- package/lib/containerStorageAdapter.d.ts.map +1 -1
- package/lib/containerStorageAdapter.js +51 -16
- package/lib/containerStorageAdapter.js.map +1 -1
- package/lib/contracts.d.ts +5 -5
- package/lib/contracts.js.map +1 -1
- package/lib/deltaManager.d.ts +4 -1
- package/lib/deltaManager.d.ts.map +1 -1
- package/lib/deltaManager.js +41 -14
- package/lib/deltaManager.js.map +1 -1
- package/lib/deltaManagerProxy.d.ts +4 -1
- package/lib/deltaManagerProxy.d.ts.map +1 -1
- package/lib/deltaQueue.d.ts +9 -2
- package/lib/deltaQueue.d.ts.map +1 -1
- package/lib/deltaQueue.js +32 -27
- package/lib/deltaQueue.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/loader.d.ts +8 -1
- package/lib/loader.d.ts.map +1 -1
- package/lib/loader.js +4 -3
- package/lib/loader.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/protocol.d.ts +27 -0
- package/lib/protocol.d.ts.map +1 -0
- package/lib/protocol.js +75 -0
- package/lib/protocol.js.map +1 -0
- package/lib/protocolTreeDocumentStorageService.d.ts +1 -1
- package/lib/protocolTreeDocumentStorageService.d.ts.map +1 -1
- package/lib/retriableDocumentStorageService.d.ts +2 -2
- package/lib/retriableDocumentStorageService.d.ts.map +1 -1
- package/lib/retriableDocumentStorageService.js +2 -2
- package/lib/retriableDocumentStorageService.js.map +1 -1
- package/package.json +27 -19
- package/src/audience.ts +8 -14
- package/src/catchUpMonitor.ts +59 -0
- package/src/collabWindowTracker.ts +15 -6
- package/src/connectionManager.ts +56 -33
- package/src/connectionState.ts +0 -6
- package/src/connectionStateHandler.ts +235 -70
- package/src/container.ts +241 -218
- package/src/containerContext.ts +22 -8
- package/src/containerStorageAdapter.ts +71 -16
- package/src/contracts.ts +7 -7
- package/src/deltaManager.ts +48 -15
- package/src/deltaQueue.ts +34 -28
- package/src/index.ts +4 -0
- package/src/loader.ts +14 -3
- package/src/packageVersion.ts +1 -1
- package/src/protocol.ts +120 -0
- package/src/retriableDocumentStorageService.ts +8 -2
|
@@ -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,
|
|
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
|
|
52
|
-
* ContainerContext should only take an IQuorumClients
|
|
53
|
-
*
|
|
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,
|
|
1
|
+
{"version":3,"file":"containerContext.d.ts","sourceRoot":"","sources":["../src/containerContext.ts"],"names":[],"mappings":"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"}
|
package/lib/containerContext.js
CHANGED
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { LazyPromise } from "@fluidframework/common-utils";
|
|
6
6
|
import { AttachState, } from "@fluidframework/container-definitions";
|
|
7
7
|
import { isFluidResolvedUrl } from "@fluidframework/driver-utils";
|
|
8
8
|
import { PerformanceEvent } from "@fluidframework/telemetry-utils";
|
|
9
9
|
const PackageNotFactoryError = "Code package does not implement IRuntimeFactory";
|
|
10
10
|
export class ContainerContext {
|
|
11
|
-
constructor(container, scope, codeLoader, _codeDetails, _baseSnapshot, deltaManager, quorum, loader, submitFn,
|
|
11
|
+
constructor(container, scope, codeLoader, _codeDetails, _baseSnapshot, deltaManager, quorum, loader, submitFn, submitSummaryFn,
|
|
12
|
+
/** @returns clientSequenceNumber of last message in a batch */
|
|
13
|
+
submitBatchFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState) {
|
|
12
14
|
this.container = container;
|
|
13
15
|
this.scope = scope;
|
|
14
16
|
this.codeLoader = codeLoader;
|
|
@@ -17,6 +19,8 @@ export class ContainerContext {
|
|
|
17
19
|
this.deltaManager = deltaManager;
|
|
18
20
|
this.loader = loader;
|
|
19
21
|
this.submitFn = submitFn;
|
|
22
|
+
this.submitSummaryFn = submitSummaryFn;
|
|
23
|
+
this.submitBatchFn = submitBatchFn;
|
|
20
24
|
this.submitSignalFn = submitSignalFn;
|
|
21
25
|
this.closeFn = closeFn;
|
|
22
26
|
this.version = version;
|
|
@@ -24,13 +28,14 @@ export class ContainerContext {
|
|
|
24
28
|
this.existing = existing;
|
|
25
29
|
this.pendingLocalState = pendingLocalState;
|
|
26
30
|
this._disposed = false;
|
|
31
|
+
this._connected = this.container.connected;
|
|
27
32
|
this._quorum = quorum;
|
|
28
33
|
this.taggedLogger = container.subLogger;
|
|
29
34
|
this._fluidModuleP = new LazyPromise(async () => this.loadCodeModule(_codeDetails));
|
|
30
35
|
this.attachListener();
|
|
31
36
|
}
|
|
32
|
-
static async createOrLoad(container, scope, codeLoader, codeDetails, baseSnapshot, deltaManager, quorum, loader, submitFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState) {
|
|
33
|
-
const context = new ContainerContext(container, scope, codeLoader, codeDetails, baseSnapshot, deltaManager, quorum, loader, submitFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState);
|
|
37
|
+
static async createOrLoad(container, scope, codeLoader, codeDetails, baseSnapshot, deltaManager, quorum, loader, submitFn, submitSummaryFn, submitBatchFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState) {
|
|
38
|
+
const context = new ContainerContext(container, scope, codeLoader, codeDetails, baseSnapshot, deltaManager, quorum, loader, submitFn, submitSummaryFn, submitBatchFn, submitSignalFn, closeFn, version, updateDirtyContainerState, existing, pendingLocalState);
|
|
34
39
|
await context.instantiateRuntime(existing);
|
|
35
40
|
return context;
|
|
36
41
|
}
|
|
@@ -50,8 +55,12 @@ export class ContainerContext {
|
|
|
50
55
|
get clientDetails() {
|
|
51
56
|
return this.container.clientDetails;
|
|
52
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* When true, ops are free to flow
|
|
60
|
+
* When false, ops should be kept as pending or rejected
|
|
61
|
+
*/
|
|
53
62
|
get connected() {
|
|
54
|
-
return this.
|
|
63
|
+
return this._connected;
|
|
55
64
|
}
|
|
56
65
|
get canSummarize() {
|
|
57
66
|
return "summarize" in this.runtime;
|
|
@@ -83,9 +92,10 @@ export class ContainerContext {
|
|
|
83
92
|
get codeDetails() { return this._codeDetails; }
|
|
84
93
|
get quorum() { return this._quorum; }
|
|
85
94
|
/**
|
|
86
|
-
* @deprecated
|
|
87
|
-
* ContainerContext should only take an IQuorumClients
|
|
88
|
-
*
|
|
95
|
+
* @deprecated Temporary migratory API, to be removed when customers no longer need it.
|
|
96
|
+
* When removed, `ContainerContext` should only take an {@link @fluidframework/container-definitions#IQuorumClients}
|
|
97
|
+
* rather than an {@link @fluidframework/protocol-definitions#IQuorum}.
|
|
98
|
+
* See {@link @fluidframework/container-definitions#IContainerContext} for more details.
|
|
89
99
|
*/
|
|
90
100
|
getSpecifiedCodeDetails() {
|
|
91
101
|
var _a;
|
|
@@ -118,7 +128,7 @@ export class ContainerContext {
|
|
|
118
128
|
}
|
|
119
129
|
setConnectionState(connected, clientId) {
|
|
120
130
|
const runtime = this.runtime;
|
|
121
|
-
|
|
131
|
+
this._connected = connected;
|
|
122
132
|
runtime.setConnectionState(connected, clientId);
|
|
123
133
|
}
|
|
124
134
|
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,47 +2,33 @@
|
|
|
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 { 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
|
|
14
|
+
export declare class ContainerStorageAdapter implements IDocumentStorageService, IDisposable {
|
|
15
|
+
private readonly logger;
|
|
16
|
+
private readonly captureProtocolSummary?;
|
|
16
17
|
private readonly blobContents;
|
|
17
|
-
|
|
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;
|
|
21
26
|
get repositoryUrl(): string;
|
|
22
27
|
getSnapshotTree(version?: IVersion, scenarioName?: string): Promise<ISnapshotTree | null>;
|
|
23
28
|
readBlob(id: string): Promise<ArrayBufferLike>;
|
|
24
|
-
getVersions(versionId: string | null, count: number, scenarioName?: string): Promise<IVersion[]>;
|
|
29
|
+
getVersions(versionId: string | null, count: number, scenarioName?: string, fetchSource?: FetchSource): Promise<IVersion[]>;
|
|
25
30
|
uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string>;
|
|
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;
|
|
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"}
|
|
@@ -2,14 +2,42 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
import { assert } from "@fluidframework/common-utils";
|
|
6
|
+
import { UsageError } from "@fluidframework/driver-utils";
|
|
7
|
+
import { ProtocolTreeStorageService } from "./protocolTreeDocumentStorageService";
|
|
8
|
+
import { RetriableDocumentStorageService } from "./retriableDocumentStorageService";
|
|
5
9
|
/**
|
|
6
10
|
* This class wraps the actual storage and make sure no wrong apis are called according to
|
|
7
11
|
* container attach state.
|
|
8
12
|
*/
|
|
9
13
|
export class ContainerStorageAdapter {
|
|
10
|
-
constructor(
|
|
11
|
-
this.
|
|
14
|
+
constructor(detachedBlobStorage, logger, captureProtocolSummary) {
|
|
15
|
+
this.logger = logger;
|
|
16
|
+
this.captureProtocolSummary = captureProtocolSummary;
|
|
12
17
|
this.blobContents = {};
|
|
18
|
+
this.disposed = false;
|
|
19
|
+
this._storageService = new BlobOnlyStorage(detachedBlobStorage, logger);
|
|
20
|
+
}
|
|
21
|
+
dispose(error) {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
(_b = (_a = this._storageService) === null || _a === void 0 ? void 0 : _a.dispose) === null || _b === void 0 ? void 0 : _b.call(_a, error);
|
|
24
|
+
this.disposed = true;
|
|
25
|
+
}
|
|
26
|
+
async connectToService(service) {
|
|
27
|
+
var _a, _b;
|
|
28
|
+
if (!(this._storageService instanceof BlobOnlyStorage)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const storageService = await service.connectToStorage();
|
|
32
|
+
const retriableStorage = this._storageService =
|
|
33
|
+
new RetriableDocumentStorageService(storageService, this.logger);
|
|
34
|
+
if (this.captureProtocolSummary !== undefined) {
|
|
35
|
+
this.logger.sendTelemetryEvent({ eventName: "summarizeProtocolTreeEnabled" });
|
|
36
|
+
this._storageService =
|
|
37
|
+
new ProtocolTreeStorageService(retriableStorage, this.captureProtocolSummary);
|
|
38
|
+
}
|
|
39
|
+
// ensure we did not lose that policy in the process of wrapping
|
|
40
|
+
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" */);
|
|
13
41
|
}
|
|
14
42
|
loadSnapshotForRehydratingContainer(snapshotTree) {
|
|
15
43
|
this.getBlobContents(snapshotTree);
|
|
@@ -26,44 +54,44 @@ export class ContainerStorageAdapter {
|
|
|
26
54
|
// back-compat 0.40 containerRuntime requests policies even in detached container if storage is present
|
|
27
55
|
// and storage is always present in >=0.41.
|
|
28
56
|
try {
|
|
29
|
-
return this.
|
|
57
|
+
return this._storageService.policies;
|
|
30
58
|
}
|
|
31
59
|
catch (e) { }
|
|
32
60
|
return undefined;
|
|
33
61
|
}
|
|
34
62
|
get repositoryUrl() {
|
|
35
|
-
return this.
|
|
63
|
+
return this._storageService.repositoryUrl;
|
|
36
64
|
}
|
|
37
65
|
async getSnapshotTree(version, scenarioName) {
|
|
38
|
-
return this.
|
|
66
|
+
return this._storageService.getSnapshotTree(version, scenarioName);
|
|
39
67
|
}
|
|
40
68
|
async readBlob(id) {
|
|
41
69
|
const blob = this.blobContents[id];
|
|
42
70
|
if (blob !== undefined) {
|
|
43
71
|
return blob;
|
|
44
72
|
}
|
|
45
|
-
return this.
|
|
73
|
+
return this._storageService.readBlob(id);
|
|
46
74
|
}
|
|
47
|
-
async getVersions(versionId, count, scenarioName) {
|
|
48
|
-
return this.
|
|
75
|
+
async getVersions(versionId, count, scenarioName, fetchSource) {
|
|
76
|
+
return this._storageService.getVersions(versionId, count, scenarioName, fetchSource);
|
|
49
77
|
}
|
|
50
78
|
async uploadSummaryWithContext(summary, context) {
|
|
51
|
-
return this.
|
|
79
|
+
return this._storageService.uploadSummaryWithContext(summary, context);
|
|
52
80
|
}
|
|
53
81
|
async downloadSummary(handle) {
|
|
54
|
-
return this.
|
|
82
|
+
return this._storageService.downloadSummary(handle);
|
|
55
83
|
}
|
|
56
84
|
async createBlob(file) {
|
|
57
|
-
return this.
|
|
85
|
+
return this._storageService.createBlob(file);
|
|
58
86
|
}
|
|
59
87
|
}
|
|
60
88
|
/**
|
|
61
89
|
* Storage which only supports createBlob() and readBlob(). This is used with IDetachedBlobStorage to support
|
|
62
90
|
* blobs in detached containers.
|
|
63
91
|
*/
|
|
64
|
-
|
|
65
|
-
constructor(
|
|
66
|
-
this.
|
|
92
|
+
class BlobOnlyStorage {
|
|
93
|
+
constructor(detachedStorage, logger) {
|
|
94
|
+
this.detachedStorage = detachedStorage;
|
|
67
95
|
this.logger = logger;
|
|
68
96
|
/* eslint-disable @typescript-eslint/unbound-method */
|
|
69
97
|
this.getSnapshotTree = this.notCalled;
|
|
@@ -73,10 +101,16 @@ export class BlobOnlyStorage {
|
|
|
73
101
|
this.downloadSummary = this.notCalled;
|
|
74
102
|
}
|
|
75
103
|
async createBlob(content) {
|
|
76
|
-
return this.
|
|
104
|
+
return this.verifyStorage().createBlob(content);
|
|
77
105
|
}
|
|
78
106
|
async readBlob(blobId) {
|
|
79
|
-
return this.
|
|
107
|
+
return this.verifyStorage().readBlob(blobId);
|
|
108
|
+
}
|
|
109
|
+
verifyStorage() {
|
|
110
|
+
if (this.detachedStorage === undefined) {
|
|
111
|
+
throw new UsageError("Real storage calls not allowed in Unattached container");
|
|
112
|
+
}
|
|
113
|
+
return this.detachedStorage;
|
|
80
114
|
}
|
|
81
115
|
get policies() {
|
|
82
116
|
return this.notCalled();
|
|
@@ -86,6 +120,7 @@ export class BlobOnlyStorage {
|
|
|
86
120
|
}
|
|
87
121
|
/* eslint-enable @typescript-eslint/unbound-method */
|
|
88
122
|
notCalled() {
|
|
123
|
+
this.verifyStorage();
|
|
89
124
|
try {
|
|
90
125
|
// some browsers may not populate stack unless exception is thrown
|
|
91
126
|
throw new Error("BlobOnlyStorage not implemented method used");
|
|
@@ -1 +1 @@
|
|
|
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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { ISnapshotTreeWithBlobContents } from \"@fluidframework/container-definitions\";\nimport {\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(versionId: string | null, count: number, scenarioName?: string): Promise<IVersion[]> {\n return this.storageGetter().getVersions(versionId, count, scenarioName);\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"]}
|
package/lib/contracts.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export interface IConnectionManager {
|
|
|
37
37
|
*/
|
|
38
38
|
prepareMessageToSend(message: Omit<IDocumentMessage, "clientSequenceNumber">): IDocumentMessage | undefined;
|
|
39
39
|
/**
|
|
40
|
-
* Called before
|
|
40
|
+
* Called before incoming message is processed. Incoming messages can be combing from connection,
|
|
41
41
|
* but also could come from storage.
|
|
42
42
|
* This call allows connection manager to adjust knowledge about acked ops sent on previous connection.
|
|
43
43
|
* Can be called at any time, including when there is no active connection.
|
|
@@ -65,11 +65,11 @@ export interface IConnectionManager {
|
|
|
65
65
|
}
|
|
66
66
|
/**
|
|
67
67
|
* This interface represents a set of callbacks provided by DeltaManager to IConnectionManager on its creation
|
|
68
|
-
* IConnectionManager instance will use them to communicate to DeltaManager
|
|
68
|
+
* IConnectionManager instance will use them to communicate to DeltaManager about various events.
|
|
69
69
|
*/
|
|
70
70
|
export interface IConnectionManagerFactoryArgs {
|
|
71
71
|
/**
|
|
72
|
-
* Called by connection manager for each
|
|
72
|
+
* Called by connection manager for each incoming op. Some ops maybe delivered before
|
|
73
73
|
* connectHandler is called (initial ops on socket connection)
|
|
74
74
|
*/
|
|
75
75
|
readonly incomingOpHandler: (messages: ISequencedDocumentMessage[], reason: string) => void;
|
|
@@ -86,8 +86,8 @@ export interface IConnectionManagerFactoryArgs {
|
|
|
86
86
|
*/
|
|
87
87
|
readonly reconnectionDelayHandler: (delayMs: number, error: unknown) => void;
|
|
88
88
|
/**
|
|
89
|
-
* Called by connection manager
|
|
90
|
-
* Expects dispose() call in
|
|
89
|
+
* Called by connection manager whenever critical error happens and container should be closed.
|
|
90
|
+
* Expects dispose() call in response to this call.
|
|
91
91
|
*/
|
|
92
92
|
readonly closeHandler: (error?: any) => void;
|
|
93
93
|
/**
|
package/lib/contracts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAMH,cAAc,GACjB,MAAM,uCAAuC,CAAC;AAW/C,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACrB,gCAAe,CAAA;IACf,sCAAqB,CAAA;IACrB,oCAAmB,CAAA;AACvB,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB;AAqID;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,WAA0C,EAAyB,EAAE;IAChG,IAAI,oBAAoB,CAAC;IACzB,IAAI,WAAW,IAAI,MAAM,IAAI,WAAW,EAAE;QACtC,oBAAoB,GAAG,WAAW,CAAC;KACtC;SAAM,IAAI,cAAc,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,EAAE;QAC7C,oBAAoB,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,IAAI,CAAC;KACpD;SAAM;QACH,oBAAoB,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC;KAC/C;IACD,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;AAC1C,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n ITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport {\n IDeltaQueue,\n ReadOnlyInfo,\n IConnectionDetails,\n ICriticalContainerError,\n IFluidCodeDetails,\n isFluidPackage,\n} from \"@fluidframework/container-definitions\";\nimport {\n ConnectionMode,\n IDocumentMessage,\n ISequencedDocumentMessage,\n IClientConfiguration,\n IClientDetails,\n ISignalMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport { IContainerPackageInfo } from \"@fluidframework/driver-definitions\";\n\nexport enum ReconnectMode {\n Never = \"Never\",\n Disabled = \"Disabled\",\n Enabled = \"Enabled\",\n}\n\n/**\n * Connection manager (implements this interface) is responsible for maintaining connection\n * to relay service.\n */\nexport interface IConnectionManager {\n readonly connected: boolean;\n\n readonly clientId: string | undefined;\n\n /** The queue of outbound delta messages */\n readonly outbound: IDeltaQueue<IDocumentMessage[]>;\n\n /** Details of client */\n readonly clientDetails: IClientDetails;\n\n /** Protocol version being used to communicate with the service */\n readonly version: string;\n\n /** Max message size allowed to the delta manager */\n readonly maxMessageSize: number;\n\n /** Service configuration provided by the service. */\n readonly serviceConfiguration: IClientConfiguration | undefined;\n\n readonly readOnlyInfo: ReadOnlyInfo;\n\n // Various connectivity
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAMH,cAAc,GACjB,MAAM,uCAAuC,CAAC;AAW/C,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACrB,gCAAe,CAAA;IACf,sCAAqB,CAAA;IACrB,oCAAmB,CAAA;AACvB,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB;AAqID;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,WAA0C,EAAyB,EAAE;IAChG,IAAI,oBAAoB,CAAC;IACzB,IAAI,WAAW,IAAI,MAAM,IAAI,WAAW,EAAE;QACtC,oBAAoB,GAAG,WAAW,CAAC;KACtC;SAAM,IAAI,cAAc,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,EAAE;QAC7C,oBAAoB,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC,IAAI,CAAC;KACpD;SAAM;QACH,oBAAoB,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,CAAC;KAC/C;IACD,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;AAC1C,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n ITelemetryProperties,\n} from \"@fluidframework/common-definitions\";\nimport {\n IDeltaQueue,\n ReadOnlyInfo,\n IConnectionDetails,\n ICriticalContainerError,\n IFluidCodeDetails,\n isFluidPackage,\n} from \"@fluidframework/container-definitions\";\nimport {\n ConnectionMode,\n IDocumentMessage,\n ISequencedDocumentMessage,\n IClientConfiguration,\n IClientDetails,\n ISignalMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport { IContainerPackageInfo } from \"@fluidframework/driver-definitions\";\n\nexport enum ReconnectMode {\n Never = \"Never\",\n Disabled = \"Disabled\",\n Enabled = \"Enabled\",\n}\n\n/**\n * Connection manager (implements this interface) is responsible for maintaining connection\n * to relay service.\n */\nexport interface IConnectionManager {\n readonly connected: boolean;\n\n readonly clientId: string | undefined;\n\n /** The queue of outbound delta messages */\n readonly outbound: IDeltaQueue<IDocumentMessage[]>;\n\n /** Details of client */\n readonly clientDetails: IClientDetails;\n\n /** Protocol version being used to communicate with the service */\n readonly version: string;\n\n /** Max message size allowed to the delta manager */\n readonly maxMessageSize: number;\n\n /** Service configuration provided by the service. */\n readonly serviceConfiguration: IClientConfiguration | undefined;\n\n readonly readOnlyInfo: ReadOnlyInfo;\n\n // Various connectivity properties for telemetry describing type of current connection\n // Things like connection mode, service info, etc.\n // Called when connection state changes (connect / disconnect)\n readonly connectionProps: ITelemetryProperties;\n\n // Verbose information about connection logged to telemetry in case of issues with\n // maintaining healthy connection, including op gaps, not receiving join op in time, etc.\n // Contains details information, like sequence numbers at connection time, initial ops info, etc.\n readonly connectionVerboseProps: ITelemetryProperties;\n\n /**\n * Prepares message to be sent. Fills in clientSequenceNumber.\n * Called only when active connection is present.\n */\n prepareMessageToSend(message: Omit<IDocumentMessage, \"clientSequenceNumber\">): IDocumentMessage | undefined;\n\n /**\n * Called before incoming message is processed. Incoming messages can be combing from connection,\n * but also could come from storage.\n * This call allows connection manager to adjust knowledge about acked ops sent on previous connection.\n * Can be called at any time, including when there is no active connection.\n */\n beforeProcessingIncomingOp(message: ISequencedDocumentMessage): void;\n\n /**\n * Submits signal to relay service.\n * Called only when active connection is present.\n */\n submitSignal(content: any): void;\n\n /**\n * Submits messages to relay service.\n * Called only when active connection is present.\n */\n sendMessages(messages: IDocumentMessage[]): void;\n\n /**\n * Initiates connection to relay service (noop if already connected).\n */\n connect(connectionMode?: ConnectionMode): void;\n\n /**\n * Disposed connection manager\n */\n dispose(error?: ICriticalContainerError): void;\n\n get connectionMode(): ConnectionMode;\n}\n\n/**\n * This interface represents a set of callbacks provided by DeltaManager to IConnectionManager on its creation\n * IConnectionManager instance will use them to communicate to DeltaManager about various events.\n */\nexport interface IConnectionManagerFactoryArgs {\n /**\n * Called by connection manager for each incoming op. Some ops maybe delivered before\n * connectHandler is called (initial ops on socket connection)\n */\n readonly incomingOpHandler: (messages: ISequencedDocumentMessage[], reason: string) => void;\n\n /**\n * Called by connection manager for each incoming signals.\n * Maybe called before connectHandler is called (initial signals on socket connection)\n */\n readonly signalHandler: (message: ISignalMessage) => void;\n\n /**\n * Called when connection manager experiences delay in connecting to relay service.\n * This can happen because client is offline, or service is busy and asks to not connect for some time.\n * Can be called many times while not connected.\n * Situation is considered resolved when connection is established and connectHandler is called.\n */\n readonly reconnectionDelayHandler: (delayMs: number, error: unknown) => void;\n\n /**\n * Called by connection manager whenever critical error happens and container should be closed.\n * Expects dispose() call in response to this call.\n */\n readonly closeHandler: (error?: any) => void;\n\n /**\n * Called whenever connection to relay service is lost.\n */\n readonly disconnectHandler: (reason: string) => void;\n\n /**\n * Called whenever new connection to rely service is established\n */\n readonly connectHandler: (connection: IConnectionDetails) => void;\n\n /**\n * Called whenever ping/pong messages are roundtripped on connection.\n */\n readonly pongHandler: (latency: number) => void;\n\n /**\n * Called whenever connection type changes from writable to read-only or vice versa.\n * Connection can be read-only if user has no edit permissions, or if container forced\n * connection to be read-only.\n * This should not be confused with \"read\" / \"write\"connection mode which is internal\n * optimization.\n */\n readonly readonlyChangeHandler: (readonly?: boolean) => void;\n}\n\n/**\n *\n * @param codeDetails- - Data structure used to describe the code to load on the Fluid document\n * @returns The name of the Fluid package\n */\nexport const getPackageName = (codeDetails: IFluidCodeDetails | undefined): IContainerPackageInfo => {\n let containerPackageName;\n if (codeDetails && \"name\" in codeDetails) {\n containerPackageName = codeDetails;\n } else if (isFluidPackage(codeDetails?.package)) {\n containerPackageName = codeDetails?.package.name;\n } else {\n containerPackageName = codeDetails?.package;\n }\n return { name: containerPackageName };\n};\n"]}
|
package/lib/deltaManager.d.ts
CHANGED
|
@@ -36,6 +36,9 @@ export declare class DeltaManager<TConnectionManager extends IConnectionManager>
|
|
|
36
36
|
get IDeltaSender(): this;
|
|
37
37
|
private pending;
|
|
38
38
|
private fetchReason;
|
|
39
|
+
private readonly mc;
|
|
40
|
+
private currentlyProcessingOps;
|
|
41
|
+
private readonly preventConcurrentOpSend;
|
|
39
42
|
private minSequenceNumber;
|
|
40
43
|
private lastQueuedSequenceNumber;
|
|
41
44
|
private lastObservedSeqNumber;
|
|
@@ -80,7 +83,7 @@ export declare class DeltaManager<TConnectionManager extends IConnectionManager>
|
|
|
80
83
|
get outbound(): IDeltaQueue<IDocumentMessage[]>;
|
|
81
84
|
get readOnlyInfo(): import("@fluidframework/container-definitions").ReadOnlyInfo;
|
|
82
85
|
get clientDetails(): import("@fluidframework/protocol-definitions").IClientDetails;
|
|
83
|
-
submit(type: MessageType, contents
|
|
86
|
+
submit(type: MessageType, contents?: string, batch?: boolean, metadata?: any): number;
|
|
84
87
|
submitSignal(content: any): void;
|
|
85
88
|
flush(): void;
|
|
86
89
|
get connectionProps(): ITelemetryProperties;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deltaManager.d.ts","sourceRoot":"","sources":["../src/deltaManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,qBAAqB,EACrB,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,uBAAuB,EACvB,kBAAkB,EAErB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAU,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"deltaManager.d.ts","sourceRoot":"","sources":["../src/deltaManager.ts"],"names":[],"mappings":"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"}
|