@fluidframework/container-loader 2.0.0-dev-rc.5.0.0.268409 → 2.0.0-dev-rc.5.0.0.270401
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/api-report/container-loader.alpha.api.md +59 -4
- package/api-report/container-loader.beta.api.md +7 -3
- package/api-report/container-loader.public.api.md +7 -3
- package/dist/audience.js +2 -1
- package/dist/audience.js.map +1 -1
- package/dist/catchUpMonitor.js +11 -8
- package/dist/catchUpMonitor.js.map +1 -1
- package/dist/connectionManager.d.ts +2 -2
- package/dist/connectionManager.d.ts.map +1 -1
- package/dist/connectionManager.js +91 -63
- package/dist/connectionManager.js.map +1 -1
- package/dist/connectionStateHandler.js +35 -11
- package/dist/connectionStateHandler.js.map +1 -1
- package/dist/container.d.ts +2 -2
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +156 -123
- package/dist/container.js.map +1 -1
- package/dist/containerContext.d.ts +2 -2
- package/dist/containerContext.d.ts.map +1 -1
- package/dist/containerContext.js +34 -8
- package/dist/containerContext.js.map +1 -1
- package/dist/containerStorageAdapter.js +17 -9
- package/dist/containerStorageAdapter.js.map +1 -1
- package/dist/contracts.d.ts +2 -2
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js.map +1 -1
- package/dist/debugLogger.js +2 -0
- package/dist/debugLogger.js.map +1 -1
- package/dist/deltaManager.d.ts +2 -2
- package/dist/deltaManager.d.ts.map +1 -1
- package/dist/deltaManager.js +48 -35
- package/dist/deltaManager.js.map +1 -1
- package/dist/deltaQueue.js +14 -7
- package/dist/deltaQueue.js.map +1 -1
- package/dist/error.js +5 -4
- package/dist/error.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/legacy.d.ts +5 -0
- package/dist/loader.js +5 -1
- package/dist/loader.js.map +1 -1
- package/dist/noopHeuristic.d.ts +1 -1
- package/dist/noopHeuristic.d.ts.map +1 -1
- package/dist/noopHeuristic.js +3 -1
- package/dist/noopHeuristic.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/protocol/index.d.ts +7 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +12 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/protocol.d.ts +52 -0
- package/dist/protocol/protocol.d.ts.map +1 -0
- package/dist/protocol/protocol.js +115 -0
- package/dist/protocol/protocol.js.map +1 -0
- package/dist/protocol/quorum.d.ts +185 -0
- package/dist/protocol/quorum.d.ts.map +1 -0
- package/dist/protocol/quorum.js +440 -0
- package/dist/protocol/quorum.js.map +1 -0
- package/dist/protocol.d.ts +2 -3
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +4 -2
- package/dist/protocol.js.map +1 -1
- package/dist/protocolTreeDocumentStorageService.d.ts +7 -7
- package/dist/protocolTreeDocumentStorageService.d.ts.map +1 -1
- package/dist/protocolTreeDocumentStorageService.js +16 -7
- package/dist/protocolTreeDocumentStorageService.js.map +1 -1
- package/dist/retriableDocumentStorageService.js +4 -1
- package/dist/retriableDocumentStorageService.js.map +1 -1
- package/dist/serializedStateManager.d.ts +1 -2
- package/dist/serializedStateManager.d.ts.map +1 -1
- package/dist/serializedStateManager.js +10 -2
- package/dist/serializedStateManager.js.map +1 -1
- package/lib/audience.js +2 -1
- package/lib/audience.js.map +1 -1
- package/lib/catchUpMonitor.js +11 -8
- package/lib/catchUpMonitor.js.map +1 -1
- package/lib/connectionManager.d.ts +2 -2
- package/lib/connectionManager.d.ts.map +1 -1
- package/lib/connectionManager.js +91 -63
- package/lib/connectionManager.js.map +1 -1
- package/lib/connectionStateHandler.js +35 -11
- package/lib/connectionStateHandler.js.map +1 -1
- package/lib/container.d.ts +2 -2
- package/lib/container.d.ts.map +1 -1
- package/lib/container.js +156 -123
- package/lib/container.js.map +1 -1
- package/lib/containerContext.d.ts +2 -2
- package/lib/containerContext.d.ts.map +1 -1
- package/lib/containerContext.js +34 -8
- package/lib/containerContext.js.map +1 -1
- package/lib/containerStorageAdapter.js +17 -9
- package/lib/containerStorageAdapter.js.map +1 -1
- package/lib/contracts.d.ts +2 -2
- package/lib/contracts.d.ts.map +1 -1
- package/lib/contracts.js.map +1 -1
- package/lib/debugLogger.js +2 -0
- package/lib/debugLogger.js.map +1 -1
- package/lib/deltaManager.d.ts +2 -2
- package/lib/deltaManager.d.ts.map +1 -1
- package/lib/deltaManager.js +48 -35
- package/lib/deltaManager.js.map +1 -1
- package/lib/deltaQueue.js +14 -7
- package/lib/deltaQueue.js.map +1 -1
- package/lib/error.js +5 -4
- package/lib/error.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/legacy.d.ts +5 -0
- package/lib/loader.js +5 -1
- package/lib/loader.js.map +1 -1
- package/lib/noopHeuristic.d.ts +1 -1
- package/lib/noopHeuristic.d.ts.map +1 -1
- package/lib/noopHeuristic.js +3 -1
- package/lib/noopHeuristic.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/protocol/index.d.ts +7 -0
- package/lib/protocol/index.d.ts.map +1 -0
- package/lib/protocol/index.js +7 -0
- package/lib/protocol/index.js.map +1 -0
- package/lib/protocol/protocol.d.ts +52 -0
- package/lib/protocol/protocol.d.ts.map +1 -0
- package/lib/protocol/protocol.js +111 -0
- package/lib/protocol/protocol.js.map +1 -0
- package/lib/protocol/quorum.d.ts +185 -0
- package/lib/protocol/quorum.d.ts.map +1 -0
- package/lib/protocol/quorum.js +431 -0
- package/lib/protocol/quorum.js.map +1 -0
- package/lib/protocol.d.ts +2 -3
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +3 -1
- package/lib/protocol.js.map +1 -1
- package/lib/protocolTreeDocumentStorageService.d.ts +7 -7
- package/lib/protocolTreeDocumentStorageService.d.ts.map +1 -1
- package/lib/protocolTreeDocumentStorageService.js +16 -7
- package/lib/protocolTreeDocumentStorageService.js.map +1 -1
- package/lib/retriableDocumentStorageService.js +4 -1
- package/lib/retriableDocumentStorageService.js.map +1 -1
- package/lib/serializedStateManager.d.ts +1 -2
- package/lib/serializedStateManager.d.ts.map +1 -1
- package/lib/serializedStateManager.js +10 -2
- package/lib/serializedStateManager.js.map +1 -1
- package/package.json +13 -11
- package/src/catchUpMonitor.ts +1 -1
- package/src/connectionManager.ts +3 -7
- package/src/container.ts +4 -4
- package/src/containerContext.ts +2 -5
- package/src/contracts.ts +3 -6
- package/src/deltaManager.ts +3 -5
- package/src/index.ts +7 -0
- package/src/noopHeuristic.ts +1 -1
- package/src/packageVersion.ts +1 -1
- package/src/protocol/README.md +10 -0
- package/src/protocol/index.ts +16 -0
- package/src/protocol/protocol.ts +185 -0
- package/src/protocol/quorum.ts +584 -0
- package/src/protocol.ts +4 -6
- package/src/protocolTreeDocumentStorageService.ts +16 -8
- package/src/serializedStateManager.ts +1 -1
- package/tsconfig.json +2 -0
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { FluidObject } from '@fluidframework/core-interfaces';
|
|
8
8
|
import { IAudienceOwner } from '@fluidframework/container-definitions/internal';
|
|
9
9
|
import { IClientDetails } from '@fluidframework/driver-definitions';
|
|
10
|
+
import { ICommittedProposal } from '@fluidframework/driver-definitions/internal';
|
|
10
11
|
import { IConfigProviderBase } from '@fluidframework/core-interfaces';
|
|
11
12
|
import { IContainer } from '@fluidframework/container-definitions/internal';
|
|
12
13
|
import { IDocumentAttributes } from '@fluidframework/driver-definitions/internal';
|
|
@@ -18,11 +19,14 @@ import { IHostLoader } from '@fluidframework/container-definitions/internal';
|
|
|
18
19
|
import { ILoader } from '@fluidframework/container-definitions/internal';
|
|
19
20
|
import { ILoaderOptions as ILoaderOptions_2 } from '@fluidframework/container-definitions/internal';
|
|
20
21
|
import { ILocationRedirectionError } from '@fluidframework/driver-definitions/internal';
|
|
21
|
-
import {
|
|
22
|
+
import { IProcessMessageResult } from '@fluidframework/driver-definitions/internal';
|
|
22
23
|
import { IProvideFluidCodeDetailsComparer } from '@fluidframework/container-definitions/internal';
|
|
23
|
-
import {
|
|
24
|
+
import { IQuorum } from '@fluidframework/driver-definitions/internal';
|
|
24
25
|
import { IRequest } from '@fluidframework/core-interfaces';
|
|
25
|
-
import {
|
|
26
|
+
import { ISequencedClient } from '@fluidframework/driver-definitions';
|
|
27
|
+
import { ISequencedDocumentMessage } from '@fluidframework/driver-definitions/internal';
|
|
28
|
+
import { ISequencedProposal } from '@fluidframework/driver-definitions/internal';
|
|
29
|
+
import { ISignalMessage } from '@fluidframework/driver-definitions/internal';
|
|
26
30
|
import { ITelemetryBaseLogger } from '@fluidframework/core-interfaces';
|
|
27
31
|
import { ITelemetryLoggerExt } from '@fluidframework/telemetry-utils/internal';
|
|
28
32
|
import { IUrlResolver } from '@fluidframework/driver-definitions/internal';
|
|
@@ -35,6 +39,24 @@ export enum ConnectionState {
|
|
|
35
39
|
EstablishingConnection = 3
|
|
36
40
|
}
|
|
37
41
|
|
|
42
|
+
// @alpha (undocumented)
|
|
43
|
+
export interface IBaseProtocolHandler {
|
|
44
|
+
// (undocumented)
|
|
45
|
+
readonly attributes: IDocumentAttributes;
|
|
46
|
+
// (undocumented)
|
|
47
|
+
close(): void;
|
|
48
|
+
// (undocumented)
|
|
49
|
+
getProtocolState(): IScribeProtocolState;
|
|
50
|
+
// (undocumented)
|
|
51
|
+
processMessage(message: ISequencedDocumentMessage, local: boolean): IProcessMessageResult;
|
|
52
|
+
// (undocumented)
|
|
53
|
+
readonly quorum: IQuorum;
|
|
54
|
+
// (undocumented)
|
|
55
|
+
setConnectionState(connected: boolean, clientId: string | undefined): any;
|
|
56
|
+
// (undocumented)
|
|
57
|
+
snapshot(): IQuorumSnapshot;
|
|
58
|
+
}
|
|
59
|
+
|
|
38
60
|
// @alpha @deprecated (undocumented)
|
|
39
61
|
export interface ICodeDetailsLoader extends Partial<IProvideFluidCodeDetailsComparer> {
|
|
40
62
|
load(source: IFluidCodeDetails): Promise<IFluidModuleWithDetails>;
|
|
@@ -94,13 +116,37 @@ export interface IParsedUrl {
|
|
|
94
116
|
}
|
|
95
117
|
|
|
96
118
|
// @alpha (undocumented)
|
|
97
|
-
export interface IProtocolHandler extends
|
|
119
|
+
export interface IProtocolHandler extends IBaseProtocolHandler {
|
|
98
120
|
// (undocumented)
|
|
99
121
|
readonly audience: IAudienceOwner;
|
|
100
122
|
// (undocumented)
|
|
101
123
|
processSignal(message: ISignalMessage): any;
|
|
102
124
|
}
|
|
103
125
|
|
|
126
|
+
// @alpha
|
|
127
|
+
export interface IQuorumSnapshot {
|
|
128
|
+
// (undocumented)
|
|
129
|
+
members: QuorumClientsSnapshot;
|
|
130
|
+
// (undocumented)
|
|
131
|
+
proposals: QuorumProposalsSnapshot["proposals"];
|
|
132
|
+
// (undocumented)
|
|
133
|
+
values: QuorumProposalsSnapshot["values"];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// @alpha (undocumented)
|
|
137
|
+
export interface IScribeProtocolState {
|
|
138
|
+
// (undocumented)
|
|
139
|
+
members: [string, ISequencedClient][];
|
|
140
|
+
// (undocumented)
|
|
141
|
+
minimumSequenceNumber: number;
|
|
142
|
+
// (undocumented)
|
|
143
|
+
proposals: [number, ISequencedProposal, string[]][];
|
|
144
|
+
// (undocumented)
|
|
145
|
+
sequenceNumber: number;
|
|
146
|
+
// (undocumented)
|
|
147
|
+
values: [string, ICommittedProposal][];
|
|
148
|
+
}
|
|
149
|
+
|
|
104
150
|
// @alpha
|
|
105
151
|
export class Loader implements IHostLoader {
|
|
106
152
|
constructor(loaderProps: ILoaderProps);
|
|
@@ -123,6 +169,15 @@ export class Loader implements IHostLoader {
|
|
|
123
169
|
// @alpha
|
|
124
170
|
export type ProtocolHandlerBuilder = (attributes: IDocumentAttributes, snapshot: IQuorumSnapshot, sendProposal: (key: string, value: any) => number) => IProtocolHandler;
|
|
125
171
|
|
|
172
|
+
// @alpha
|
|
173
|
+
export type QuorumClientsSnapshot = [string, ISequencedClient][];
|
|
174
|
+
|
|
175
|
+
// @alpha
|
|
176
|
+
export type QuorumProposalsSnapshot = {
|
|
177
|
+
proposals: [number, ISequencedProposal, string[]][];
|
|
178
|
+
values: [string, ICommittedProposal][];
|
|
179
|
+
};
|
|
180
|
+
|
|
126
181
|
// @alpha
|
|
127
182
|
export function resolveWithLocationRedirectionHandling<T>(api: (request: IRequest) => Promise<T>, request: IRequest, urlResolver: IUrlResolver, logger?: ITelemetryBaseLogger): Promise<T>;
|
|
128
183
|
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { FluidObject } from '@fluidframework/core-interfaces';
|
|
8
8
|
import { IAudienceOwner } from '@fluidframework/container-definitions/internal';
|
|
9
9
|
import { IClientDetails } from '@fluidframework/driver-definitions';
|
|
10
|
+
import { ICommittedProposal } from '@fluidframework/driver-definitions/internal';
|
|
10
11
|
import { IConfigProviderBase } from '@fluidframework/core-interfaces';
|
|
11
12
|
import { IContainer } from '@fluidframework/container-definitions/internal';
|
|
12
13
|
import { IDocumentAttributes } from '@fluidframework/driver-definitions/internal';
|
|
@@ -18,11 +19,14 @@ import { IHostLoader } from '@fluidframework/container-definitions/internal';
|
|
|
18
19
|
import { ILoader } from '@fluidframework/container-definitions/internal';
|
|
19
20
|
import { ILoaderOptions as ILoaderOptions_2 } from '@fluidframework/container-definitions/internal';
|
|
20
21
|
import { ILocationRedirectionError } from '@fluidframework/driver-definitions/internal';
|
|
21
|
-
import {
|
|
22
|
+
import { IProcessMessageResult } from '@fluidframework/driver-definitions/internal';
|
|
22
23
|
import { IProvideFluidCodeDetailsComparer } from '@fluidframework/container-definitions/internal';
|
|
23
|
-
import {
|
|
24
|
+
import { IQuorum } from '@fluidframework/driver-definitions/internal';
|
|
24
25
|
import { IRequest } from '@fluidframework/core-interfaces';
|
|
25
|
-
import {
|
|
26
|
+
import { ISequencedClient } from '@fluidframework/driver-definitions';
|
|
27
|
+
import { ISequencedDocumentMessage } from '@fluidframework/driver-definitions/internal';
|
|
28
|
+
import { ISequencedProposal } from '@fluidframework/driver-definitions/internal';
|
|
29
|
+
import { ISignalMessage } from '@fluidframework/driver-definitions/internal';
|
|
26
30
|
import { ITelemetryBaseLogger } from '@fluidframework/core-interfaces';
|
|
27
31
|
import { ITelemetryLoggerExt } from '@fluidframework/telemetry-utils/internal';
|
|
28
32
|
import { IUrlResolver } from '@fluidframework/driver-definitions/internal';
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { FluidObject } from '@fluidframework/core-interfaces';
|
|
8
8
|
import { IAudienceOwner } from '@fluidframework/container-definitions/internal';
|
|
9
9
|
import { IClientDetails } from '@fluidframework/driver-definitions';
|
|
10
|
+
import { ICommittedProposal } from '@fluidframework/driver-definitions/internal';
|
|
10
11
|
import { IConfigProviderBase } from '@fluidframework/core-interfaces';
|
|
11
12
|
import { IContainer } from '@fluidframework/container-definitions/internal';
|
|
12
13
|
import { IDocumentAttributes } from '@fluidframework/driver-definitions/internal';
|
|
@@ -18,11 +19,14 @@ import { IHostLoader } from '@fluidframework/container-definitions/internal';
|
|
|
18
19
|
import { ILoader } from '@fluidframework/container-definitions/internal';
|
|
19
20
|
import { ILoaderOptions as ILoaderOptions_2 } from '@fluidframework/container-definitions/internal';
|
|
20
21
|
import { ILocationRedirectionError } from '@fluidframework/driver-definitions/internal';
|
|
21
|
-
import {
|
|
22
|
+
import { IProcessMessageResult } from '@fluidframework/driver-definitions/internal';
|
|
22
23
|
import { IProvideFluidCodeDetailsComparer } from '@fluidframework/container-definitions/internal';
|
|
23
|
-
import {
|
|
24
|
+
import { IQuorum } from '@fluidframework/driver-definitions/internal';
|
|
24
25
|
import { IRequest } from '@fluidframework/core-interfaces';
|
|
25
|
-
import {
|
|
26
|
+
import { ISequencedClient } from '@fluidframework/driver-definitions';
|
|
27
|
+
import { ISequencedDocumentMessage } from '@fluidframework/driver-definitions/internal';
|
|
28
|
+
import { ISequencedProposal } from '@fluidframework/driver-definitions/internal';
|
|
29
|
+
import { ISignalMessage } from '@fluidframework/driver-definitions/internal';
|
|
26
30
|
import { ITelemetryBaseLogger } from '@fluidframework/core-interfaces';
|
|
27
31
|
import { ITelemetryLoggerExt } from '@fluidframework/telemetry-utils/internal';
|
|
28
32
|
import { IUrlResolver } from '@fluidframework/driver-definitions/internal';
|
package/dist/audience.js
CHANGED
|
@@ -11,9 +11,10 @@ const internal_1 = require("@fluidframework/core-utils/internal");
|
|
|
11
11
|
* Audience represents all clients connected to the op stream.
|
|
12
12
|
*/
|
|
13
13
|
class Audience extends client_utils_1.TypedEventEmitter {
|
|
14
|
+
members = new Map();
|
|
15
|
+
_currentClientId;
|
|
14
16
|
constructor() {
|
|
15
17
|
super();
|
|
16
|
-
this.members = new Map();
|
|
17
18
|
// We are expecting this class to have many listeners, so we suppress noisy "MaxListenersExceededWarning" logging.
|
|
18
19
|
super.setMaxListeners(0);
|
|
19
20
|
}
|
package/dist/audience.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience.js","sourceRoot":"","sources":["../src/audience.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAAiE;AAGjE,kEAA6D;AAG7D;;GAEG;AACH,MAAa,QAAS,SAAQ,gCAAkC;
|
|
1
|
+
{"version":3,"file":"audience.js","sourceRoot":"","sources":["../src/audience.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAAiE;AAGjE,kEAA6D;AAG7D;;GAEG;AACH,MAAa,QAAS,SAAQ,gCAAkC;IAC9C,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC9C,gBAAgB,CAAqB;IAE7C;QACC,KAAK,EAAE,CAAC;QACR,kHAAkH;QAClH,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAEM,OAAO;QACb,OAAO,IAAI,CAAC,gBAAgB,KAAK,SAAS;YACzC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC;gBACA,QAAQ,EAAE,IAAI,CAAC,gBAAgB;gBAC/B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;aAC5C,CAAC;IACN,CAAC;IAEM,kBAAkB,CAAC,QAAgB;QACzC,IAAI,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;YACjC,0EAA0E;YAC1E,yEAAyE;YACzE,qGAAqG;YACrG,IAAI,CAAC,IAAI,CACR,aAAa,EACb,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAkB,CAAC,EACvE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAkB,CAC9D,CAAC;QACH,CAAC;IACF,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,QAAgB,EAAE,OAAgB;QAClD,mGAAmG;QACnG,+FAA+F;QAC/F,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAA,iBAAM,EACL,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAClD,KAAK,CAAC,wDAAwD,CAC9D,CAAC;QACH,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;IACF,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,QAAgB;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACb,CAAC;aAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACI,UAAU;QAChB,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,QAAgB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;CACD;AAtFD,4BAsFC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { IAudienceEvents, ISelf } from \"@fluidframework/container-definitions\";\nimport { IAudienceOwner } from \"@fluidframework/container-definitions/internal\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { IClient } from \"@fluidframework/driver-definitions\";\n\n/**\n * Audience represents all clients connected to the op stream.\n */\nexport class Audience extends TypedEventEmitter<IAudienceEvents> implements IAudienceOwner {\n\tprivate readonly members = new Map<string, IClient>();\n\tprivate _currentClientId: string | undefined;\n\n\tconstructor() {\n\t\tsuper();\n\t\t// We are expecting this class to have many listeners, so we suppress noisy \"MaxListenersExceededWarning\" logging.\n\t\tsuper.setMaxListeners(0);\n\t}\n\n\tpublic getSelf(): ISelf | undefined {\n\t\treturn this._currentClientId === undefined\n\t\t\t? undefined\n\t\t\t: {\n\t\t\t\t\tclientId: this._currentClientId,\n\t\t\t\t\tclient: this.getMember(this._currentClientId),\n\t\t\t };\n\t}\n\n\tpublic setCurrentClientId(clientId: string): void {\n\t\tif (this._currentClientId !== clientId) {\n\t\t\tconst oldId = this._currentClientId;\n\t\t\tthis._currentClientId = clientId;\n\t\t\t// this.getMember(clientId) could resolve to undefined in these two cases:\n\t\t\t// 1) Feature gates controlling ConnectionStateHandler() behavior are off\n\t\t\t// 2) we are loading from stashed state and audience is empty, but we remember and set prior clientId\n\t\t\tthis.emit(\n\t\t\t\t\"selfChanged\",\n\t\t\t\toldId === undefined ? undefined : ({ clientId: oldId } satisfies ISelf),\n\t\t\t\t{ clientId, client: this.getMember(clientId) } satisfies ISelf,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a new client to the audience\n\t */\n\tpublic addMember(clientId: string, details: IClient) {\n\t\t// Given that signal delivery is unreliable process, we might observe same client being added twice\n\t\t// In such case we should see exactly same payload (IClient), and should not raise event twice!\n\t\tif (this.members.has(clientId)) {\n\t\t\tconst client = this.members.get(clientId);\n\t\t\tassert(\n\t\t\t\tJSON.stringify(client) === JSON.stringify(details),\n\t\t\t\t0x4b2 /* new client has different payload from existing one */,\n\t\t\t);\n\t\t} else {\n\t\t\tthis.members.set(clientId, details);\n\t\t\tthis.emit(\"addMember\", clientId, details);\n\t\t}\n\t}\n\n\t/**\n\t * Removes a client from the audience. Only emits an event if a client is actually removed\n\t * @returns if a client was removed from the audience\n\t */\n\tpublic removeMember(clientId: string): boolean {\n\t\tconst removedClient = this.members.get(clientId);\n\t\tif (removedClient !== undefined) {\n\t\t\tthis.members.delete(clientId);\n\t\t\tthis.emit(\"removeMember\", clientId, removedClient);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves all the members in the audience.\n\t *\n\t * @remarks When the container is disconnected, this will keep returning the audience as it was last seen before the\n\t * container disconnected.\n\t */\n\tpublic getMembers(): Map<string, IClient> {\n\t\treturn new Map(this.members);\n\t}\n\n\t/**\n\t * Retrieves a specific member of the audience.\n\t *\n\t * @remarks When the container is disconnected, this will keep returning members from the audience as it was last seen\n\t * before the container disconnected.\n\t */\n\tpublic getMember(clientId: string): IClient | undefined {\n\t\treturn this.members.get(clientId);\n\t}\n}\n"]}
|
package/dist/catchUpMonitor.js
CHANGED
|
@@ -11,26 +11,29 @@ const internal_1 = require("@fluidframework/core-utils/internal");
|
|
|
11
11
|
* that were known at the time the monitor was created.
|
|
12
12
|
*/
|
|
13
13
|
class CatchUpMonitor {
|
|
14
|
+
deltaManager;
|
|
15
|
+
listener;
|
|
16
|
+
targetSeqNumber;
|
|
17
|
+
caughtUp = false;
|
|
18
|
+
opHandler = (message) => {
|
|
19
|
+
if (!this.caughtUp && message.sequenceNumber >= this.targetSeqNumber) {
|
|
20
|
+
this.caughtUp = true;
|
|
21
|
+
this.listener();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
14
24
|
/**
|
|
15
25
|
* Create the CatchUpMonitor, setting the target sequence number to wait for based on DeltaManager's current state.
|
|
16
26
|
*/
|
|
17
27
|
constructor(deltaManager, listener) {
|
|
18
28
|
this.deltaManager = deltaManager;
|
|
19
29
|
this.listener = listener;
|
|
20
|
-
this.caughtUp = false;
|
|
21
|
-
this.opHandler = (message) => {
|
|
22
|
-
if (!this.caughtUp && message.sequenceNumber >= this.targetSeqNumber) {
|
|
23
|
-
this.caughtUp = true;
|
|
24
|
-
this.listener();
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
this.disposed = false;
|
|
28
30
|
this.targetSeqNumber = this.deltaManager.lastKnownSeqNumber;
|
|
29
31
|
(0, internal_1.assert)(this.targetSeqNumber >= this.deltaManager.lastSequenceNumber, 0x37c /* Cannot wait for seqNumber below last processed sequence number */);
|
|
30
32
|
this.deltaManager.on("op", this.opHandler);
|
|
31
33
|
// Simulate the last processed op to set caughtUp in case we already are
|
|
32
34
|
this.opHandler({ sequenceNumber: this.deltaManager.lastSequenceNumber });
|
|
33
35
|
}
|
|
36
|
+
disposed = false;
|
|
34
37
|
dispose() {
|
|
35
38
|
if (this.disposed) {
|
|
36
39
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catchUpMonitor.js","sourceRoot":"","sources":["../src/catchUpMonitor.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,kEAA6D;AAS7D;;;GAGG;AACH,MAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"catchUpMonitor.js","sourceRoot":"","sources":["../src/catchUpMonitor.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,kEAA6D;AAS7D;;;GAGG;AACH,MAAa,cAAc;IAeR;IACA;IAfD,eAAe,CAAS;IACjC,QAAQ,GAAY,KAAK,CAAC;IAEjB,SAAS,GAAG,CAAC,OAA0D,EAAE,EAAE;QAC3F,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACtE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjB,CAAC;IACF,CAAC,CAAC;IAEF;;OAEG;IACH,YACkB,YAAqC,EACrC,QAA0B;QAD1B,iBAAY,GAAZ,YAAY,CAAyB;QACrC,aAAQ,GAAR,QAAQ,CAAkB;QAE3C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;QAE5D,IAAA,iBAAM,EACL,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAC5D,KAAK,CAAC,oEAAoE,CAC1E,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAE3C,wEAAwE;QACxE,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC1E,CAAC;IAEM,QAAQ,GAAY,KAAK,CAAC;IAC1B,OAAO;QACb,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;CACD;AAxCD,wCAwCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDeltaManager } from \"@fluidframework/container-definitions/internal\";\nimport { IDisposable } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\n/** @see CatchUpMonitor for usage */\ntype CaughtUpListener = () => void;\n\n/** Monitor that emits an event when a Container has caught up to a given point in the op stream */\nexport type ICatchUpMonitor = IDisposable;\n\n/**\n * Monitors a Container's DeltaManager, notifying listeners when all ops have been processed\n * that were known at the time the monitor was created.\n */\nexport class CatchUpMonitor implements ICatchUpMonitor {\n\tprivate readonly targetSeqNumber: number;\n\tprivate caughtUp: boolean = false;\n\n\tprivate readonly opHandler = (message: Pick<ISequencedDocumentMessage, \"sequenceNumber\">) => {\n\t\tif (!this.caughtUp && message.sequenceNumber >= this.targetSeqNumber) {\n\t\t\tthis.caughtUp = true;\n\t\t\tthis.listener();\n\t\t}\n\t};\n\n\t/**\n\t * Create the CatchUpMonitor, setting the target sequence number to wait for based on DeltaManager's current state.\n\t */\n\tconstructor(\n\t\tprivate readonly deltaManager: IDeltaManager<any, any>,\n\t\tprivate readonly listener: CaughtUpListener,\n\t) {\n\t\tthis.targetSeqNumber = this.deltaManager.lastKnownSeqNumber;\n\n\t\tassert(\n\t\t\tthis.targetSeqNumber >= this.deltaManager.lastSequenceNumber,\n\t\t\t0x37c /* Cannot wait for seqNumber below last processed sequence number */,\n\t\t);\n\n\t\tthis.deltaManager.on(\"op\", this.opHandler);\n\n\t\t// Simulate the last processed op to set caughtUp in case we already are\n\t\tthis.opHandler({ sequenceNumber: this.deltaManager.lastSequenceNumber });\n\t}\n\n\tpublic disposed: boolean = false;\n\tpublic dispose() {\n\t\tif (this.disposed) {\n\t\t\treturn;\n\t\t}\n\t\tthis.disposed = true;\n\n\t\tthis.deltaManager.off(\"op\", this.opHandler);\n\t}\n}\n"]}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
import { ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
6
6
|
import { IDeltaQueue, ReadOnlyInfo } from "@fluidframework/container-definitions/internal";
|
|
7
7
|
import { ITelemetryBaseProperties } from "@fluidframework/core-interfaces";
|
|
8
|
-
import { ConnectionMode, IClient, IClientDetails
|
|
9
|
-
import { IDocumentService, IClientConfiguration, IDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
8
|
+
import { ConnectionMode, IClient, IClientDetails } from "@fluidframework/driver-definitions";
|
|
9
|
+
import { IDocumentService, IClientConfiguration, IDocumentMessage, ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
10
10
|
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
|
|
11
11
|
import { IConnectionDetailsInternal, IConnectionManager, IConnectionManagerFactoryArgs, IConnectionStateChangeReason, ReconnectMode } from "./contracts.js";
|
|
12
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectionManager.d.ts","sourceRoot":"","sources":["../src/connectionManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAC3F,OAAO,EAAe,wBAAwB,EAAY,MAAM,iCAAiC,CAAC;AAElG,OAAO,
|
|
1
|
+
{"version":3,"file":"connectionManager.d.ts","sourceRoot":"","sources":["../src/connectionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,26 @@ const clientNoDeltaStream = {
|
|
|
38
38
|
};
|
|
39
39
|
const clientIdNoDeltaStream = "storage-only client";
|
|
40
40
|
class NoDeltaStream extends client_utils_1.TypedEventEmitter {
|
|
41
|
+
storageOnlyReason;
|
|
42
|
+
readonlyConnectionReason;
|
|
43
|
+
clientId = clientIdNoDeltaStream;
|
|
44
|
+
claims = {
|
|
45
|
+
scopes: [internal_2.ScopeType.DocRead],
|
|
46
|
+
};
|
|
47
|
+
mode = "read";
|
|
48
|
+
existing = true;
|
|
49
|
+
maxMessageSize = 0;
|
|
50
|
+
version = "";
|
|
51
|
+
initialMessages = [];
|
|
52
|
+
initialSignals = [];
|
|
53
|
+
initialClients = [
|
|
54
|
+
{ client: clientNoDeltaStream, clientId: clientIdNoDeltaStream },
|
|
55
|
+
];
|
|
56
|
+
serviceConfiguration = {
|
|
57
|
+
maxMessageSize: 0,
|
|
58
|
+
blockSize: 0,
|
|
59
|
+
};
|
|
60
|
+
checkpointSequenceNumber = undefined;
|
|
41
61
|
/**
|
|
42
62
|
* Connection which is not connected to socket.
|
|
43
63
|
* @param storageOnlyReason - Reason on why the connection to delta stream is not allowed.
|
|
@@ -47,25 +67,6 @@ class NoDeltaStream extends client_utils_1.TypedEventEmitter {
|
|
|
47
67
|
super();
|
|
48
68
|
this.storageOnlyReason = storageOnlyReason;
|
|
49
69
|
this.readonlyConnectionReason = readonlyConnectionReason;
|
|
50
|
-
this.clientId = clientIdNoDeltaStream;
|
|
51
|
-
this.claims = {
|
|
52
|
-
scopes: [internal_2.ScopeType.DocRead],
|
|
53
|
-
};
|
|
54
|
-
this.mode = "read";
|
|
55
|
-
this.existing = true;
|
|
56
|
-
this.maxMessageSize = 0;
|
|
57
|
-
this.version = "";
|
|
58
|
-
this.initialMessages = [];
|
|
59
|
-
this.initialSignals = [];
|
|
60
|
-
this.initialClients = [
|
|
61
|
-
{ client: clientNoDeltaStream, clientId: clientIdNoDeltaStream },
|
|
62
|
-
];
|
|
63
|
-
this.serviceConfiguration = {
|
|
64
|
-
maxMessageSize: 0,
|
|
65
|
-
blockSize: 0,
|
|
66
|
-
};
|
|
67
|
-
this.checkpointSequenceNumber = undefined;
|
|
68
|
-
this._disposed = false;
|
|
69
70
|
}
|
|
70
71
|
submit(messages) {
|
|
71
72
|
this.emit("nack", this.clientId, messages.map((operation) => {
|
|
@@ -81,6 +82,7 @@ class NoDeltaStream extends client_utils_1.TypedEventEmitter {
|
|
|
81
82
|
content: { message: "Cannot submit signal with storage-only connection", code: 403 },
|
|
82
83
|
});
|
|
83
84
|
}
|
|
85
|
+
_disposed = false;
|
|
84
86
|
get disposed() {
|
|
85
87
|
return this._disposed;
|
|
86
88
|
}
|
|
@@ -109,9 +111,47 @@ const waitForOnline = async () => {
|
|
|
109
111
|
* Exposes various controls to influence this process, including manual reconnects, forced read-only mode, etc.
|
|
110
112
|
*/
|
|
111
113
|
class ConnectionManager {
|
|
114
|
+
serviceProvider;
|
|
115
|
+
containerDirty;
|
|
116
|
+
client;
|
|
117
|
+
logger;
|
|
118
|
+
props;
|
|
119
|
+
/** Connection mode used when reconnecting on error or disconnect. */
|
|
120
|
+
defaultReconnectionMode;
|
|
121
|
+
/**
|
|
122
|
+
* Tracks the current in-progress connection attempt. Undefined if there is none.
|
|
123
|
+
* Note: Once the connection attempt fires and the code becomes asynchronous, its possible that a new connection
|
|
124
|
+
* attempt was fired and this.pendingConnection was overwritten to reflect the new attempt.
|
|
125
|
+
*/
|
|
126
|
+
pendingConnection;
|
|
127
|
+
connection;
|
|
128
|
+
/** Details about connection. undefined if there is no active connection. */
|
|
129
|
+
_connectionDetails;
|
|
130
|
+
/** file ACL - whether user has only read-only access to a file */
|
|
131
|
+
_readonlyPermissions;
|
|
132
|
+
/** tracks host requiring read-only mode. */
|
|
133
|
+
_forceReadonly = false;
|
|
134
|
+
/**
|
|
135
|
+
* Controls whether the DeltaManager will automatically reconnect to the delta stream after receiving a disconnect.
|
|
136
|
+
*/
|
|
137
|
+
_reconnectMode;
|
|
138
|
+
/** True if there is pending (async) reconnection from "read" to "write" */
|
|
139
|
+
pendingReconnect = false;
|
|
140
|
+
clientSequenceNumber = 0;
|
|
141
|
+
clientSequenceNumberObserved = 0;
|
|
142
|
+
/** Counts the number of non-runtime ops sent by the client which may not be acked. */
|
|
143
|
+
localOpsToIgnore = 0;
|
|
144
|
+
/** track clientId used last time when we sent any ops */
|
|
145
|
+
lastSubmittedClientId;
|
|
146
|
+
connectFirstConnection = true;
|
|
147
|
+
_connectionVerboseProps = {};
|
|
148
|
+
_connectionProps = {};
|
|
149
|
+
_disposed = false;
|
|
150
|
+
_outbound;
|
|
112
151
|
get connectionVerboseProps() {
|
|
113
152
|
return this._connectionVerboseProps;
|
|
114
153
|
}
|
|
154
|
+
clientDetails;
|
|
115
155
|
/**
|
|
116
156
|
* The current connection mode, initially read.
|
|
117
157
|
*/
|
|
@@ -232,50 +272,6 @@ class ConnectionManager {
|
|
|
232
272
|
this.client = client;
|
|
233
273
|
this.logger = logger;
|
|
234
274
|
this.props = props;
|
|
235
|
-
/** tracks host requiring read-only mode. */
|
|
236
|
-
this._forceReadonly = false;
|
|
237
|
-
/** True if there is pending (async) reconnection from "read" to "write" */
|
|
238
|
-
this.pendingReconnect = false;
|
|
239
|
-
this.clientSequenceNumber = 0;
|
|
240
|
-
this.clientSequenceNumberObserved = 0;
|
|
241
|
-
/** Counts the number of non-runtime ops sent by the client which may not be acked. */
|
|
242
|
-
this.localOpsToIgnore = 0;
|
|
243
|
-
this.connectFirstConnection = true;
|
|
244
|
-
this._connectionVerboseProps = {};
|
|
245
|
-
this._connectionProps = {};
|
|
246
|
-
this._disposed = false;
|
|
247
|
-
this.opHandler = (documentId, messagesArg) => {
|
|
248
|
-
const messages = Array.isArray(messagesArg) ? messagesArg : [messagesArg];
|
|
249
|
-
this.props.incomingOpHandler(messages, "opHandler");
|
|
250
|
-
};
|
|
251
|
-
this.signalHandler = (signalsArg) => {
|
|
252
|
-
const signals = Array.isArray(signalsArg) ? signalsArg : [signalsArg];
|
|
253
|
-
this.props.signalHandler(signals);
|
|
254
|
-
};
|
|
255
|
-
// Always connect in write mode after getting nacked.
|
|
256
|
-
this.nackHandler = (documentId, messages) => {
|
|
257
|
-
const message = messages[0];
|
|
258
|
-
if (this._readonlyPermissions === true) {
|
|
259
|
-
this.props.closeHandler((0, internal_3.createWriteError)("writeOnReadOnlyDocument", { driverVersion: undefined }));
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
const reconnectInfo = getNackReconnectInfo(message.content);
|
|
263
|
-
// If the nack indicates we cannot retry, then close the container outright
|
|
264
|
-
if (!reconnectInfo.canRetry) {
|
|
265
|
-
this.props.closeHandler(reconnectInfo);
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
this.reconnectOnError("write", reconnectInfo);
|
|
269
|
-
};
|
|
270
|
-
// Connection mode is always read on disconnect/error unless the system mode was write.
|
|
271
|
-
this.disconnectHandlerInternal = (disconnectReason) => {
|
|
272
|
-
// Note: we might get multiple disconnect calls on same socket, as early disconnect notification
|
|
273
|
-
// ("server_disconnect", ODSP-specific) is mapped to "disconnect"
|
|
274
|
-
this.reconnectOnError(this.defaultReconnectionMode, disconnectReason);
|
|
275
|
-
};
|
|
276
|
-
this.errorHandler = (error) => {
|
|
277
|
-
this.reconnectOnError(this.defaultReconnectionMode, error);
|
|
278
|
-
};
|
|
279
275
|
this.clientDetails = this.client.details;
|
|
280
276
|
this.defaultReconnectionMode = this.client.mode;
|
|
281
277
|
this._reconnectMode = reconnectAllowed ? contracts_js_1.ReconnectMode.Enabled : contracts_js_1.ReconnectMode.Never;
|
|
@@ -884,6 +880,38 @@ class ConnectionManager {
|
|
|
884
880
|
}
|
|
885
881
|
}
|
|
886
882
|
}
|
|
883
|
+
opHandler = (documentId, messagesArg) => {
|
|
884
|
+
const messages = Array.isArray(messagesArg) ? messagesArg : [messagesArg];
|
|
885
|
+
this.props.incomingOpHandler(messages, "opHandler");
|
|
886
|
+
};
|
|
887
|
+
signalHandler = (signalsArg) => {
|
|
888
|
+
const signals = Array.isArray(signalsArg) ? signalsArg : [signalsArg];
|
|
889
|
+
this.props.signalHandler(signals);
|
|
890
|
+
};
|
|
891
|
+
// Always connect in write mode after getting nacked.
|
|
892
|
+
nackHandler = (documentId, messages) => {
|
|
893
|
+
const message = messages[0];
|
|
894
|
+
if (this._readonlyPermissions === true) {
|
|
895
|
+
this.props.closeHandler((0, internal_3.createWriteError)("writeOnReadOnlyDocument", { driverVersion: undefined }));
|
|
896
|
+
return;
|
|
897
|
+
}
|
|
898
|
+
const reconnectInfo = getNackReconnectInfo(message.content);
|
|
899
|
+
// If the nack indicates we cannot retry, then close the container outright
|
|
900
|
+
if (!reconnectInfo.canRetry) {
|
|
901
|
+
this.props.closeHandler(reconnectInfo);
|
|
902
|
+
return;
|
|
903
|
+
}
|
|
904
|
+
this.reconnectOnError("write", reconnectInfo);
|
|
905
|
+
};
|
|
906
|
+
// Connection mode is always read on disconnect/error unless the system mode was write.
|
|
907
|
+
disconnectHandlerInternal = (disconnectReason) => {
|
|
908
|
+
// Note: we might get multiple disconnect calls on same socket, as early disconnect notification
|
|
909
|
+
// ("server_disconnect", ODSP-specific) is mapped to "disconnect"
|
|
910
|
+
this.reconnectOnError(this.defaultReconnectionMode, disconnectReason);
|
|
911
|
+
};
|
|
912
|
+
errorHandler = (error) => {
|
|
913
|
+
this.reconnectOnError(this.defaultReconnectionMode, error);
|
|
914
|
+
};
|
|
887
915
|
}
|
|
888
916
|
exports.ConnectionManager = ConnectionManager;
|
|
889
917
|
//# sourceMappingURL=connectionManager.js.map
|