@fluidframework/driver-utils 2.0.0-dev.2.3.0.115467 → 2.0.0-dev.4.1.0.148229
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/.eslintrc.js +17 -19
- package/.mocharc.js +2 -2
- package/api-extractor.json +2 -2
- package/dist/buildSnapshotTree.d.ts.map +1 -1
- package/dist/buildSnapshotTree.js.map +1 -1
- package/dist/documentStorageServiceProxy.d.ts.map +1 -1
- package/dist/documentStorageServiceProxy.js.map +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js.map +1 -1
- package/dist/fluidResolvedUrl.d.ts +8 -0
- package/dist/fluidResolvedUrl.d.ts.map +1 -1
- package/dist/fluidResolvedUrl.js +8 -0
- package/dist/fluidResolvedUrl.js.map +1 -1
- package/dist/index.d.ts +4 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -19
- package/dist/index.js.map +1 -1
- package/dist/insecureUrlResolver.d.ts.map +1 -1
- package/dist/insecureUrlResolver.js +2 -1
- package/dist/insecureUrlResolver.js.map +1 -1
- package/dist/messageRecognition.d.ts +0 -20
- package/dist/messageRecognition.d.ts.map +1 -1
- package/dist/messageRecognition.js +1 -37
- package/dist/messageRecognition.js.map +1 -1
- package/dist/network.d.ts +0 -15
- package/dist/network.d.ts.map +1 -1
- package/dist/network.js +4 -3
- package/dist/network.js.map +1 -1
- package/dist/networkUtils.d.ts +0 -10
- package/dist/networkUtils.d.ts.map +1 -1
- package/dist/networkUtils.js +3 -35
- package/dist/networkUtils.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/parallelRequests.d.ts.map +1 -1
- package/dist/parallelRequests.js +52 -23
- package/dist/parallelRequests.js.map +1 -1
- package/dist/prefetchDocumentStorageService.d.ts.map +1 -1
- package/dist/prefetchDocumentStorageService.js.map +1 -1
- package/dist/rateLimiter.d.ts.map +1 -1
- package/dist/rateLimiter.js.map +1 -1
- package/dist/readAndParse.d.ts.map +1 -1
- package/dist/readAndParse.js.map +1 -1
- package/dist/runWithRetry.d.ts.map +1 -1
- package/dist/runWithRetry.js +10 -0
- package/dist/runWithRetry.js.map +1 -1
- package/dist/summaryForCreateNew.d.ts +21 -1
- package/dist/summaryForCreateNew.d.ts.map +1 -1
- package/dist/summaryForCreateNew.js +26 -1
- package/dist/summaryForCreateNew.js.map +1 -1
- package/dist/treeConversions.d.ts.map +1 -1
- package/dist/treeConversions.js +6 -10
- package/dist/treeConversions.js.map +1 -1
- package/lib/buildSnapshotTree.d.ts.map +1 -1
- package/lib/buildSnapshotTree.js.map +1 -1
- package/lib/documentStorageServiceProxy.d.ts.map +1 -1
- package/lib/documentStorageServiceProxy.js.map +1 -1
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js.map +1 -1
- package/lib/fluidResolvedUrl.d.ts +8 -0
- package/lib/fluidResolvedUrl.d.ts.map +1 -1
- package/lib/fluidResolvedUrl.js +8 -0
- package/lib/fluidResolvedUrl.js.map +1 -1
- package/lib/index.d.ts +4 -10
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -9
- package/lib/index.js.map +1 -1
- package/lib/insecureUrlResolver.d.ts.map +1 -1
- package/lib/insecureUrlResolver.js +2 -1
- package/lib/insecureUrlResolver.js.map +1 -1
- package/lib/messageRecognition.d.ts +0 -20
- package/lib/messageRecognition.d.ts.map +1 -1
- package/lib/messageRecognition.js +1 -36
- package/lib/messageRecognition.js.map +1 -1
- package/lib/network.d.ts +0 -15
- package/lib/network.d.ts.map +1 -1
- package/lib/network.js +4 -3
- package/lib/network.js.map +1 -1
- package/lib/networkUtils.d.ts +0 -10
- package/lib/networkUtils.d.ts.map +1 -1
- package/lib/networkUtils.js +2 -33
- package/lib/networkUtils.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/parallelRequests.d.ts.map +1 -1
- package/lib/parallelRequests.js +53 -24
- package/lib/parallelRequests.js.map +1 -1
- package/lib/prefetchDocumentStorageService.d.ts.map +1 -1
- package/lib/prefetchDocumentStorageService.js.map +1 -1
- package/lib/rateLimiter.d.ts.map +1 -1
- package/lib/rateLimiter.js.map +1 -1
- package/lib/readAndParse.d.ts.map +1 -1
- package/lib/readAndParse.js.map +1 -1
- package/lib/runWithRetry.d.ts.map +1 -1
- package/lib/runWithRetry.js +10 -0
- package/lib/runWithRetry.js.map +1 -1
- package/lib/summaryForCreateNew.d.ts +21 -1
- package/lib/summaryForCreateNew.d.ts.map +1 -1
- package/lib/summaryForCreateNew.js +24 -0
- package/lib/summaryForCreateNew.js.map +1 -1
- package/lib/treeConversions.d.ts.map +1 -1
- package/lib/treeConversions.js +9 -13
- package/lib/treeConversions.js.map +1 -1
- package/package.json +54 -52
- package/prettier.config.cjs +1 -1
- package/src/buildSnapshotTree.ts +54 -51
- package/src/documentStorageServiceProxy.ts +49 -43
- package/src/error.ts +5 -7
- package/src/fluidResolvedUrl.ts +17 -6
- package/src/index.ts +4 -14
- package/src/insecureUrlResolver.ts +127 -116
- package/src/messageRecognition.ts +14 -44
- package/src/network.ts +112 -126
- package/src/networkUtils.ts +19 -48
- package/src/packageVersion.ts +1 -1
- package/src/parallelRequests.ts +591 -510
- package/src/prefetchDocumentStorageService.ts +76 -74
- package/src/rateLimiter.ts +29 -29
- package/src/readAndParse.ts +7 -4
- package/src/runWithRetry.ts +106 -84
- package/src/summaryForCreateNew.ts +74 -25
- package/src/treeConversions.ts +47 -70
- package/tsconfig.esnext.json +6 -6
- package/tsconfig.json +8 -12
- package/dist/blobAggregationStorage.d.ts +0 -43
- package/dist/blobAggregationStorage.d.ts.map +0 -1
- package/dist/blobAggregationStorage.js +0 -318
- package/dist/blobAggregationStorage.js.map +0 -1
- package/dist/blobCacheStorageService.d.ts +0 -16
- package/dist/blobCacheStorageService.d.ts.map +0 -1
- package/dist/blobCacheStorageService.js +0 -29
- package/dist/blobCacheStorageService.js.map +0 -1
- package/dist/emptyDocumentDeltaStorageService.d.ts +0 -13
- package/dist/emptyDocumentDeltaStorageService.d.ts.map +0 -1
- package/dist/emptyDocumentDeltaStorageService.js +0 -20
- package/dist/emptyDocumentDeltaStorageService.js.map +0 -1
- package/dist/multiDocumentServiceFactory.d.ts +0 -16
- package/dist/multiDocumentServiceFactory.d.ts.map +0 -1
- package/dist/multiDocumentServiceFactory.js +0 -63
- package/dist/multiDocumentServiceFactory.js.map +0 -1
- package/dist/multiUrlResolver.d.ts +0 -20
- package/dist/multiUrlResolver.d.ts.map +0 -1
- package/dist/multiUrlResolver.js +0 -45
- package/dist/multiUrlResolver.js.map +0 -1
- package/dist/treeUtils.d.ts +0 -51
- package/dist/treeUtils.d.ts.map +0 -1
- package/dist/treeUtils.js +0 -85
- package/dist/treeUtils.js.map +0 -1
- package/lib/blobAggregationStorage.d.ts +0 -43
- package/lib/blobAggregationStorage.d.ts.map +0 -1
- package/lib/blobAggregationStorage.js +0 -313
- package/lib/blobAggregationStorage.js.map +0 -1
- package/lib/blobCacheStorageService.d.ts +0 -16
- package/lib/blobCacheStorageService.d.ts.map +0 -1
- package/lib/blobCacheStorageService.js +0 -25
- package/lib/blobCacheStorageService.js.map +0 -1
- package/lib/emptyDocumentDeltaStorageService.d.ts +0 -13
- package/lib/emptyDocumentDeltaStorageService.d.ts.map +0 -1
- package/lib/emptyDocumentDeltaStorageService.js +0 -16
- package/lib/emptyDocumentDeltaStorageService.js.map +0 -1
- package/lib/multiDocumentServiceFactory.d.ts +0 -16
- package/lib/multiDocumentServiceFactory.d.ts.map +0 -1
- package/lib/multiDocumentServiceFactory.js +0 -59
- package/lib/multiDocumentServiceFactory.js.map +0 -1
- package/lib/multiUrlResolver.d.ts +0 -20
- package/lib/multiUrlResolver.d.ts.map +0 -1
- package/lib/multiUrlResolver.js +0 -40
- package/lib/multiUrlResolver.js.map +0 -1
- package/lib/treeUtils.d.ts +0 -51
- package/lib/treeUtils.d.ts.map +0 -1
- package/lib/treeUtils.js +0 -80
- package/lib/treeUtils.js.map +0 -1
- package/src/blobAggregationStorage.ts +0 -374
- package/src/blobCacheStorageService.ts +0 -32
- package/src/emptyDocumentDeltaStorageService.ts +0 -24
- package/src/multiDocumentServiceFactory.ts +0 -80
- package/src/multiUrlResolver.ts +0 -51
- package/src/treeUtils.ts +0 -111
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { MessageType } from "@fluidframework/protocol-definitions";
|
|
5
|
+
import { MessageType, } from "@fluidframework/protocol-definitions";
|
|
6
6
|
/**
|
|
7
7
|
* Tells if message was sent by container runtime
|
|
8
8
|
* @privateRemarks ADO #1385: To be moved to container-definitions
|
|
@@ -11,41 +11,6 @@ import { MessageType } from "@fluidframework/protocol-definitions";
|
|
|
11
11
|
export function isRuntimeMessage(message) {
|
|
12
12
|
return message.type === MessageType.Operation;
|
|
13
13
|
}
|
|
14
|
-
var RuntimeMessage;
|
|
15
|
-
(function (RuntimeMessage) {
|
|
16
|
-
RuntimeMessage["FluidDataStoreOp"] = "component";
|
|
17
|
-
RuntimeMessage["Attach"] = "attach";
|
|
18
|
-
RuntimeMessage["ChunkedOp"] = "chunkedOp";
|
|
19
|
-
RuntimeMessage["BlobAttach"] = "blobAttach";
|
|
20
|
-
RuntimeMessage["Rejoin"] = "rejoin";
|
|
21
|
-
RuntimeMessage["Alias"] = "alias";
|
|
22
|
-
RuntimeMessage["Operation"] = "op";
|
|
23
|
-
})(RuntimeMessage || (RuntimeMessage = {}));
|
|
24
|
-
/**
|
|
25
|
-
* Determines whether or not the message type is one of the following: (legacy)
|
|
26
|
-
*
|
|
27
|
-
* - "component"
|
|
28
|
-
*
|
|
29
|
-
* - "attach"
|
|
30
|
-
*
|
|
31
|
-
* - "chunkedOp"
|
|
32
|
-
*
|
|
33
|
-
* - "blobAttach"
|
|
34
|
-
*
|
|
35
|
-
* - "rejoin"
|
|
36
|
-
*
|
|
37
|
-
* - "alias"
|
|
38
|
-
*
|
|
39
|
-
* - "op"
|
|
40
|
-
*
|
|
41
|
-
* @deprecated This API should not be used.
|
|
42
|
-
*/
|
|
43
|
-
export function isUnpackedRuntimeMessage(message) {
|
|
44
|
-
if (Object.values(RuntimeMessage).includes(message.type)) {
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
14
|
// ADO #1385: staging code changes across layers.
|
|
50
15
|
// Eventually to be replaced by MessageType.accept
|
|
51
16
|
export var MessageType2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageRecognition.js","sourceRoot":"","sources":["../src/messageRecognition.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"messageRecognition.js","sourceRoot":"","sources":["../src/messageRecognition.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAGN,WAAW,GACX,MAAM,sCAAsC,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACzD,OAAO,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED,iDAAiD;AACjD,kDAAkD;AAClD,MAAM,CAAN,IAAY,YAEX;AAFD,WAAY,YAAY;IACvB,iCAAiB,CAAA;AAClB,CAAC,EAFW,YAAY,KAAZ,YAAY,QAEvB;AAED,mEAAmE;AACnE,MAAM,UAAU,uBAAuB,CACtC,OAAqD;IAErD,6FAA6F;IAC7F,mEAAmE;IACnE,OAAO,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM,CAAC;AAClF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tMessageType,\n} from \"@fluidframework/protocol-definitions\";\n\n/**\n * Tells if message was sent by container runtime\n * @privateRemarks ADO #1385: To be moved to container-definitions\n * @returns whether the message is a runtime message\n */\nexport function isRuntimeMessage(message: { type: string }): boolean {\n\treturn message.type === MessageType.Operation;\n}\n\n// ADO #1385: staging code changes across layers.\n// Eventually to be replaced by MessageType.accept\nexport enum MessageType2 {\n\tAccept = \"accept\",\n}\n\n// ADO #1385: To be moved to packages/protocol-base/src/protocol.ts\nexport function canBeCoalescedByService(\n\tmessage: ISequencedDocumentMessage | IDocumentMessage,\n): boolean {\n\t// This assumes that in the future relay service may implement coalescing of accept messages,\n\t// same way it was doing coalescing of immediate noops in the past.\n\treturn message.type === MessageType.NoOp || message.type === MessageType2.Accept;\n}\n"]}
|
package/lib/network.d.ts
CHANGED
|
@@ -11,21 +11,6 @@ export declare enum OnlineStatus {
|
|
|
11
11
|
Unknown = 2
|
|
12
12
|
}
|
|
13
13
|
export declare function isOnline(): OnlineStatus;
|
|
14
|
-
/**
|
|
15
|
-
* Interface describing errors and warnings raised by any driver code.
|
|
16
|
-
* Not expected to be implemented by a class or an object literal, but rather used in place of
|
|
17
|
-
* any or unknown in various function signatures that pass errors around.
|
|
18
|
-
*
|
|
19
|
-
* "Any" in the interface name is a nod to the fact that errorType has lost its type constraint.
|
|
20
|
-
* It will be either DriverErrorType or the specific driver's specialized error type enum,
|
|
21
|
-
* but we can't reference a specific driver's error type enum in this code.
|
|
22
|
-
*
|
|
23
|
-
* @deprecated - In favour of {@link @fluidframework/driver-definitions#IAnyDriverError} so that
|
|
24
|
-
* it can used from the base to upper layers.
|
|
25
|
-
*/
|
|
26
|
-
export interface IAnyDriverError extends Omit<IDriverErrorBase, "errorType"> {
|
|
27
|
-
readonly errorType: string;
|
|
28
|
-
}
|
|
29
14
|
/** Telemetry props with driver-specific required properties */
|
|
30
15
|
export declare type DriverErrorTelemetryProps = ITelemetryProperties & {
|
|
31
16
|
driverVersion: string | undefined;
|
package/lib/network.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"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"}
|
package/lib/network.js
CHANGED
|
@@ -14,7 +14,9 @@ export var OnlineStatus;
|
|
|
14
14
|
// No solution for node.js (other than resolve dns names / ping specific sites)
|
|
15
15
|
// Can also use window.addEventListener("online" / "offline")
|
|
16
16
|
export function isOnline() {
|
|
17
|
-
if (typeof navigator === "object" &&
|
|
17
|
+
if (typeof navigator === "object" &&
|
|
18
|
+
navigator !== null &&
|
|
19
|
+
typeof navigator.onLine === "boolean") {
|
|
18
20
|
return navigator.onLine ? OnlineStatus.Online : OnlineStatus.Offline;
|
|
19
21
|
}
|
|
20
22
|
return OnlineStatus.Unknown;
|
|
@@ -112,6 +114,5 @@ export const canRetryOnError = (error) => (error === null || error === void 0 ?
|
|
|
112
114
|
/** Check retryAfterSeconds property on error */
|
|
113
115
|
export const getRetryDelaySecondsFromError = (error) => error === null || error === void 0 ? void 0 : error.retryAfterSeconds;
|
|
114
116
|
/** Check retryAfterSeconds property on error and convert to ms */
|
|
115
|
-
export const getRetryDelayFromError = (error) => (error === null || error === void 0 ? void 0 : error.retryAfterSeconds) !== undefined ?
|
|
116
|
-
error.retryAfterSeconds * 1000 : undefined;
|
|
117
|
+
export const getRetryDelayFromError = (error) => (error === null || error === void 0 ? void 0 : error.retryAfterSeconds) !== undefined ? error.retryAfterSeconds * 1000 : undefined;
|
|
117
118
|
//# sourceMappingURL=network.js.map
|
package/lib/network.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.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 {\n IThrottlingWarning,\n IDriverErrorBase,\n IAuthorizationError,\n DriverErrorType,\n ILocationRedirectionError,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport { ITelemetryProperties } from \"@fluidframework/common-definitions\";\nimport { IFluidErrorBase, LoggingError } from \"@fluidframework/telemetry-utils\";\n\nexport enum OnlineStatus {\n Offline,\n Online,\n Unknown,\n}\n\n// It tells if we have local connection only - we might not have connection to web.\n// No solution for node.js (other than resolve dns names / ping specific sites)\n// Can also use window.addEventListener(\"online\" / \"offline\")\nexport function isOnline(): OnlineStatus {\n if (typeof navigator === \"object\" && navigator !== null && typeof navigator.onLine === \"boolean\") {\n return navigator.onLine ? OnlineStatus.Online : OnlineStatus.Offline;\n }\n return OnlineStatus.Unknown;\n}\n\n/**\n * Interface describing errors and warnings raised by any driver code.\n * Not expected to be implemented by a class or an object literal, but rather used in place of\n * any or unknown in various function signatures that pass errors around.\n *\n * \"Any\" in the interface name is a nod to the fact that errorType has lost its type constraint.\n * It will be either DriverErrorType or the specific driver's specialized error type enum,\n * but we can't reference a specific driver's error type enum in this code.\n *\n * @deprecated - In favour of {@link @fluidframework/driver-definitions#IAnyDriverError} so that\n * it can used from the base to upper layers.\n*/\nexport interface IAnyDriverError extends Omit<IDriverErrorBase, \"errorType\"> {\n readonly errorType: string;\n}\n\n/** Telemetry props with driver-specific required properties */\nexport type DriverErrorTelemetryProps = ITelemetryProperties & { driverVersion: string | undefined; };\n\n/**\n * Generic network error class.\n */\nexport class GenericNetworkError extends LoggingError implements IDriverErrorBase, IFluidErrorBase {\n readonly errorType = DriverErrorType.genericNetworkError;\n\n constructor(\n message: string,\n readonly canRetry: boolean,\n props: DriverErrorTelemetryProps,\n ) {\n super(message, props);\n }\n}\n\n/**\n * FluidInvalidSchema error class.\n */\n export class FluidInvalidSchemaError extends LoggingError implements IDriverErrorBase, IFluidErrorBase {\n readonly errorType = DriverErrorType.fluidInvalidSchema;\n readonly canRetry = false;\n\n constructor(\n message: string,\n props: DriverErrorTelemetryProps,\n ) {\n super(message, props);\n }\n}\n\nexport class DeltaStreamConnectionForbiddenError extends LoggingError implements IDriverErrorBase, IFluidErrorBase {\n static readonly errorType = DriverErrorType.deltaStreamConnectionForbidden;\n readonly errorType = DeltaStreamConnectionForbiddenError.errorType;\n readonly canRetry = false;\n\n constructor(message: string, props: DriverErrorTelemetryProps) {\n super(message, { ...props, statusCode: 400 });\n }\n}\n\nexport class AuthorizationError extends LoggingError implements IAuthorizationError, IFluidErrorBase {\n readonly errorType = DriverErrorType.authorizationError;\n readonly canRetry = false;\n\n constructor(\n message: string,\n readonly claims: string | undefined,\n readonly tenantId: string | undefined,\n props: DriverErrorTelemetryProps,\n ) {\n // don't log claims or tenantId\n super(message, props, new Set([\"claims\", \"tenantId\"]));\n }\n}\n\nexport class LocationRedirectionError extends LoggingError implements ILocationRedirectionError, IFluidErrorBase {\n readonly errorType = DriverErrorType.locationRedirection;\n readonly canRetry = false;\n\n constructor(\n message: string,\n readonly redirectUrl: IResolvedUrl,\n props: DriverErrorTelemetryProps,\n ) {\n // do not log redirectURL\n super(message, props, new Set([\"redirectUrl\"]));\n }\n}\n\nexport class NetworkErrorBasic<T extends string> extends LoggingError implements IFluidErrorBase {\n constructor(\n message: string,\n readonly errorType: T,\n readonly canRetry: boolean,\n props: DriverErrorTelemetryProps,\n ) {\n super(message, props);\n }\n}\n\nexport class NonRetryableError<T extends string> extends NetworkErrorBasic<T> {\n constructor(\n message: string,\n readonly errorType: T,\n props: DriverErrorTelemetryProps,\n ) {\n super(message, errorType, false, props);\n }\n}\n\nexport class RetryableError<T extends string> extends NetworkErrorBasic<T> {\n constructor(\n message: string,\n readonly errorType: T,\n props: DriverErrorTelemetryProps,\n ) {\n super(message, errorType, true, props);\n }\n}\n\n/**\n * Throttling error class - used to communicate all throttling errors\n */\nexport class ThrottlingError extends LoggingError implements IThrottlingWarning, IFluidErrorBase {\n readonly errorType = DriverErrorType.throttlingError;\n readonly canRetry = true;\n\n constructor(\n message: string,\n readonly retryAfterSeconds: number,\n props: DriverErrorTelemetryProps,\n ) {\n super(message, props);\n }\n}\n\nexport const createWriteError = (message: string, props: DriverErrorTelemetryProps) =>\n new NonRetryableError(message, DriverErrorType.writeError, props);\n\nexport function createGenericNetworkError(\n message: string,\n retryInfo: { canRetry: boolean; retryAfterMs?: number; },\n props: DriverErrorTelemetryProps,\n): ThrottlingError | GenericNetworkError {\n if (retryInfo.retryAfterMs !== undefined && retryInfo.canRetry) {\n return new ThrottlingError(\n message, retryInfo.retryAfterMs / 1000, props);\n }\n return new GenericNetworkError(message, retryInfo.canRetry, props);\n}\n\n/**\n * Check if a connection error can be retried. Unless explicitly allowed, retry is disallowed.\n * I.e. asserts or unexpected exceptions in our code result in container failure.\n * @param error - The error to inspect for ability to retry\n */\nexport const canRetryOnError = (error: any): boolean => error?.canRetry === true;\n\n/** Check retryAfterSeconds property on error */\nexport const getRetryDelaySecondsFromError = (error: any): number | undefined =>\n error?.retryAfterSeconds as number | undefined;\n\n/** Check retryAfterSeconds property on error and convert to ms */\nexport const getRetryDelayFromError = (error: any): number | undefined => error?.retryAfterSeconds !== undefined ?\n error.retryAfterSeconds * 1000 : undefined;\n"]}
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.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 {\n\tIThrottlingWarning,\n\tIDriverErrorBase,\n\tIAuthorizationError,\n\tDriverErrorType,\n\tILocationRedirectionError,\n\tIResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport { ITelemetryProperties } from \"@fluidframework/common-definitions\";\nimport { IFluidErrorBase, LoggingError } from \"@fluidframework/telemetry-utils\";\n\nexport enum OnlineStatus {\n\tOffline,\n\tOnline,\n\tUnknown,\n}\n\n// It tells if we have local connection only - we might not have connection to web.\n// No solution for node.js (other than resolve dns names / ping specific sites)\n// Can also use window.addEventListener(\"online\" / \"offline\")\nexport function isOnline(): OnlineStatus {\n\tif (\n\t\ttypeof navigator === \"object\" &&\n\t\tnavigator !== null &&\n\t\ttypeof navigator.onLine === \"boolean\"\n\t) {\n\t\treturn navigator.onLine ? OnlineStatus.Online : OnlineStatus.Offline;\n\t}\n\treturn OnlineStatus.Unknown;\n}\n\n/** Telemetry props with driver-specific required properties */\nexport type DriverErrorTelemetryProps = ITelemetryProperties & {\n\tdriverVersion: string | undefined;\n};\n\n/**\n * Generic network error class.\n */\nexport class GenericNetworkError extends LoggingError implements IDriverErrorBase, IFluidErrorBase {\n\treadonly errorType = DriverErrorType.genericNetworkError;\n\n\tconstructor(message: string, readonly canRetry: boolean, props: DriverErrorTelemetryProps) {\n\t\tsuper(message, props);\n\t}\n}\n\n/**\n * FluidInvalidSchema error class.\n */\nexport class FluidInvalidSchemaError\n\textends LoggingError\n\timplements IDriverErrorBase, IFluidErrorBase\n{\n\treadonly errorType = DriverErrorType.fluidInvalidSchema;\n\treadonly canRetry = false;\n\n\tconstructor(message: string, props: DriverErrorTelemetryProps) {\n\t\tsuper(message, props);\n\t}\n}\n\nexport class DeltaStreamConnectionForbiddenError\n\textends LoggingError\n\timplements IDriverErrorBase, IFluidErrorBase\n{\n\tstatic readonly errorType = DriverErrorType.deltaStreamConnectionForbidden;\n\treadonly errorType = DeltaStreamConnectionForbiddenError.errorType;\n\treadonly canRetry = false;\n\n\tconstructor(message: string, props: DriverErrorTelemetryProps) {\n\t\tsuper(message, { ...props, statusCode: 400 });\n\t}\n}\n\nexport class AuthorizationError\n\textends LoggingError\n\timplements IAuthorizationError, IFluidErrorBase\n{\n\treadonly errorType = DriverErrorType.authorizationError;\n\treadonly canRetry = false;\n\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly claims: string | undefined,\n\t\treadonly tenantId: string | undefined,\n\t\tprops: DriverErrorTelemetryProps,\n\t) {\n\t\t// don't log claims or tenantId\n\t\tsuper(message, props, new Set([\"claims\", \"tenantId\"]));\n\t}\n}\n\nexport class LocationRedirectionError\n\textends LoggingError\n\timplements ILocationRedirectionError, IFluidErrorBase\n{\n\treadonly errorType = DriverErrorType.locationRedirection;\n\treadonly canRetry = false;\n\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly redirectUrl: IResolvedUrl,\n\t\tprops: DriverErrorTelemetryProps,\n\t) {\n\t\t// do not log redirectURL\n\t\tsuper(message, props, new Set([\"redirectUrl\"]));\n\t}\n}\n\nexport class NetworkErrorBasic<T extends string> extends LoggingError implements IFluidErrorBase {\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly errorType: T,\n\t\treadonly canRetry: boolean,\n\t\tprops: DriverErrorTelemetryProps,\n\t) {\n\t\tsuper(message, props);\n\t}\n}\n\nexport class NonRetryableError<T extends string> extends NetworkErrorBasic<T> {\n\tconstructor(message: string, readonly errorType: T, props: DriverErrorTelemetryProps) {\n\t\tsuper(message, errorType, false, props);\n\t}\n}\n\nexport class RetryableError<T extends string> extends NetworkErrorBasic<T> {\n\tconstructor(message: string, readonly errorType: T, props: DriverErrorTelemetryProps) {\n\t\tsuper(message, errorType, true, props);\n\t}\n}\n\n/**\n * Throttling error class - used to communicate all throttling errors\n */\nexport class ThrottlingError extends LoggingError implements IThrottlingWarning, IFluidErrorBase {\n\treadonly errorType = DriverErrorType.throttlingError;\n\treadonly canRetry = true;\n\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly retryAfterSeconds: number,\n\t\tprops: DriverErrorTelemetryProps,\n\t) {\n\t\tsuper(message, props);\n\t}\n}\n\nexport const createWriteError = (message: string, props: DriverErrorTelemetryProps) =>\n\tnew NonRetryableError(message, DriverErrorType.writeError, props);\n\nexport function createGenericNetworkError(\n\tmessage: string,\n\tretryInfo: { canRetry: boolean; retryAfterMs?: number },\n\tprops: DriverErrorTelemetryProps,\n): ThrottlingError | GenericNetworkError {\n\tif (retryInfo.retryAfterMs !== undefined && retryInfo.canRetry) {\n\t\treturn new ThrottlingError(message, retryInfo.retryAfterMs / 1000, props);\n\t}\n\treturn new GenericNetworkError(message, retryInfo.canRetry, props);\n}\n\n/**\n * Check if a connection error can be retried. Unless explicitly allowed, retry is disallowed.\n * I.e. asserts or unexpected exceptions in our code result in container failure.\n * @param error - The error to inspect for ability to retry\n */\nexport const canRetryOnError = (error: any): boolean => error?.canRetry === true;\n\n/** Check retryAfterSeconds property on error */\nexport const getRetryDelaySecondsFromError = (error: any): number | undefined =>\n\terror?.retryAfterSeconds as number | undefined;\n\n/** Check retryAfterSeconds property on error and convert to ms */\nexport const getRetryDelayFromError = (error: any): number | undefined =>\n\terror?.retryAfterSeconds !== undefined ? error.retryAfterSeconds * 1000 : undefined;\n"]}
|
package/lib/networkUtils.d.ts
CHANGED
|
@@ -4,14 +4,4 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { ITelemetryErrorEvent, ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
6
6
|
export declare function logNetworkFailure(logger: ITelemetryLogger, event: ITelemetryErrorEvent, error?: any): void;
|
|
7
|
-
/**
|
|
8
|
-
* Wait for browser to get to connected state.
|
|
9
|
-
* If connected, waits minimum of minDelay anyway (between network retries)
|
|
10
|
-
* If disconnected, polls every 30 seconds anyway, to make sure we are not getting stuck because of wrong signal
|
|
11
|
-
* Note that browsers will have false positives (like having Hyper-V adapter on machine,
|
|
12
|
-
* or machine connected to router that is not connected to internet)
|
|
13
|
-
* But there should be no false negatives.
|
|
14
|
-
* The only exception - Opera returns false when user enters "Work Offline" mode, regardless of actual connectivity.
|
|
15
|
-
*/
|
|
16
|
-
export declare function waitForConnectedState(minDelay: number): Promise<void>;
|
|
17
7
|
//# sourceMappingURL=networkUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"networkUtils.d.ts","sourceRoot":"","sources":["../src/networkUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAG5F,wBAAgB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"networkUtils.d.ts","sourceRoot":"","sources":["../src/networkUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAG5F,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,oBAAoB,EAC3B,KAAK,CAAC,EAAE,GAAG,QAmBX"}
|
package/lib/networkUtils.js
CHANGED
|
@@ -7,9 +7,8 @@ export function logNetworkFailure(logger, event, error) {
|
|
|
7
7
|
var _a, _b;
|
|
8
8
|
const newEvent = Object.assign({}, event);
|
|
9
9
|
const errorOnlineProp = error.online;
|
|
10
|
-
newEvent.online =
|
|
11
|
-
? errorOnlineProp
|
|
12
|
-
: OnlineStatus[isOnline()];
|
|
10
|
+
newEvent.online =
|
|
11
|
+
typeof errorOnlineProp === "string" ? errorOnlineProp : OnlineStatus[isOnline()];
|
|
13
12
|
if (typeof navigator === "object" && navigator !== null) {
|
|
14
13
|
const nav = navigator;
|
|
15
14
|
const connection = (_b = (_a = nav.connection) !== null && _a !== void 0 ? _a : nav.mozConnection) !== null && _b !== void 0 ? _b : nav.webkitConnection;
|
|
@@ -21,34 +20,4 @@ export function logNetworkFailure(logger, event, error) {
|
|
|
21
20
|
newEvent.category = canRetryOnError(error) ? "generic" : "error";
|
|
22
21
|
logger.sendTelemetryEvent(newEvent, error);
|
|
23
22
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Wait for browser to get to connected state.
|
|
26
|
-
* If connected, waits minimum of minDelay anyway (between network retries)
|
|
27
|
-
* If disconnected, polls every 30 seconds anyway, to make sure we are not getting stuck because of wrong signal
|
|
28
|
-
* Note that browsers will have false positives (like having Hyper-V adapter on machine,
|
|
29
|
-
* or machine connected to router that is not connected to internet)
|
|
30
|
-
* But there should be no false negatives.
|
|
31
|
-
* The only exception - Opera returns false when user enters "Work Offline" mode, regardless of actual connectivity.
|
|
32
|
-
*/
|
|
33
|
-
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
34
|
-
export function waitForConnectedState(minDelay) {
|
|
35
|
-
// Use this frequency to poll even when we are offline and able to setup online/offline listener
|
|
36
|
-
// This is mostly safety net
|
|
37
|
-
const offlinePollFrequency = 30000;
|
|
38
|
-
return new Promise((resolve) => {
|
|
39
|
-
let listener = resolve;
|
|
40
|
-
let delay = minDelay;
|
|
41
|
-
if (isOnline() === OnlineStatus.Offline) {
|
|
42
|
-
if ((window === null || window === void 0 ? void 0 : window.addEventListener) !== undefined) {
|
|
43
|
-
listener = () => {
|
|
44
|
-
resolve();
|
|
45
|
-
window.removeEventListener("online", listener);
|
|
46
|
-
};
|
|
47
|
-
window.addEventListener("online", listener, false);
|
|
48
|
-
delay = Math.max(minDelay, offlinePollFrequency);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
setTimeout(listener, delay);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
23
|
//# sourceMappingURL=networkUtils.js.map
|
package/lib/networkUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"networkUtils.js","sourceRoot":"","sources":["../src/networkUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEpE,MAAM,UAAU,iBAAiB,
|
|
1
|
+
{"version":3,"file":"networkUtils.js","sourceRoot":"","sources":["../src/networkUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEpE,MAAM,UAAU,iBAAiB,CAChC,MAAwB,EACxB,KAA2B,EAC3B,KAAW;;IAEX,MAAM,QAAQ,qBAAQ,KAAK,CAAE,CAAC;IAE9B,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM;QACd,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;IAElF,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE;QACxD,MAAM,GAAG,GAAG,SAAgB,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAA,MAAA,GAAG,CAAC,UAAU,mCAAI,GAAG,CAAC,aAAa,mCAAI,GAAG,CAAC,gBAAgB,CAAC;QAC/E,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAC1D,QAAQ,CAAC,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;SAC1C;KACD;IAED,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryErrorEvent, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { isOnline, OnlineStatus, canRetryOnError } from \"./network\";\n\nexport function logNetworkFailure(\n\tlogger: ITelemetryLogger,\n\tevent: ITelemetryErrorEvent,\n\terror?: any,\n) {\n\tconst newEvent = { ...event };\n\n\tconst errorOnlineProp = error.online;\n\tnewEvent.online =\n\t\ttypeof errorOnlineProp === \"string\" ? errorOnlineProp : OnlineStatus[isOnline()];\n\n\tif (typeof navigator === \"object\" && navigator !== null) {\n\t\tconst nav = navigator as any;\n\t\tconst connection = nav.connection ?? nav.mozConnection ?? nav.webkitConnection;\n\t\tif (connection !== null && typeof connection === \"object\") {\n\t\t\tnewEvent.connectionType = connection.type;\n\t\t}\n\t}\n\n\t// non-retryable errors are fatal and should be logged as errors\n\tnewEvent.category = canRetryOnError(error) ? \"generic\" : \"error\";\n\tlogger.sendTelemetryEvent(newEvent, error);\n}\n"]}
|
package/lib/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/driver-utils";
|
|
8
|
-
export declare const pkgVersion = "2.0.0-dev.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-dev.4.1.0.148229";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/lib/packageVersion.js
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export const pkgName = "@fluidframework/driver-utils";
|
|
8
|
-
export const pkgVersion = "2.0.0-dev.
|
|
8
|
+
export const pkgVersion = "2.0.0-dev.4.1.0.148229";
|
|
9
9
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,8BAA8B,CAAC;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,wBAAwB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/driver-utils\";\nexport const pkgVersion = \"2.0.0-dev.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,8BAA8B,CAAC;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,wBAAwB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/driver-utils\";\nexport const pkgVersion = \"2.0.0-dev.4.1.0.148229\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallelRequests.d.ts","sourceRoot":"","sources":["../src/parallelRequests.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE5F,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAWhG;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAgB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"parallelRequests.d.ts","sourceRoot":"","sources":["../src/parallelRequests.ts"],"names":[],"mappings":"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"}
|
package/lib/parallelRequests.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { assert, Deferred, performance } from "@fluidframework/common-utils";
|
|
6
6
|
import { PerformanceEvent } from "@fluidframework/telemetry-utils";
|
|
7
7
|
import { getRetryDelayFromError, canRetryOnError, createGenericNetworkError } from "./network";
|
|
8
|
-
import {
|
|
8
|
+
import { logNetworkFailure } from "./networkUtils";
|
|
9
9
|
// For now, this package is versioned and released in unison with the specific drivers
|
|
10
10
|
import { pkgVersion as driverVersion } from "./packageVersion";
|
|
11
11
|
const MaxFetchDelayInMs = 10000;
|
|
@@ -36,10 +36,14 @@ export class ParallelRequests {
|
|
|
36
36
|
this.requests = 0;
|
|
37
37
|
this.latestRequested = from;
|
|
38
38
|
this.nextToDeliver = from;
|
|
39
|
-
this.knewTo =
|
|
39
|
+
this.knewTo = to !== undefined;
|
|
40
|
+
}
|
|
41
|
+
get working() {
|
|
42
|
+
return this.workingState === "working";
|
|
43
|
+
}
|
|
44
|
+
get canceled() {
|
|
45
|
+
return this.workingState === "canceled";
|
|
40
46
|
}
|
|
41
|
-
get working() { return this.workingState === "working"; }
|
|
42
|
-
get canceled() { return this.workingState === "canceled"; }
|
|
43
47
|
cancel() {
|
|
44
48
|
if (this.working) {
|
|
45
49
|
this.workingState = "canceled";
|
|
@@ -173,7 +177,7 @@ export class ParallelRequests {
|
|
|
173
177
|
if (this.working) {
|
|
174
178
|
const fromOrig = from;
|
|
175
179
|
const length = payload.length;
|
|
176
|
-
let fullChunk =
|
|
180
|
+
let fullChunk = requestedLength <= length; // we can possible get more than we asked.
|
|
177
181
|
if (length !== 0) {
|
|
178
182
|
// We can get more than we asked for!
|
|
179
183
|
// This can screw up logic in dispatch!
|
|
@@ -294,6 +298,19 @@ export class Queue {
|
|
|
294
298
|
return this.deferred.promise;
|
|
295
299
|
}
|
|
296
300
|
}
|
|
301
|
+
const waitForOnline = async () => {
|
|
302
|
+
var _a;
|
|
303
|
+
// Only wait if we have a strong signal that we're offline - otherwise assume we're online.
|
|
304
|
+
if (((_a = globalThis.navigator) === null || _a === void 0 ? void 0 : _a.onLine) === false && globalThis.addEventListener !== undefined) {
|
|
305
|
+
return new Promise((resolve) => {
|
|
306
|
+
const resolveAndRemoveListener = () => {
|
|
307
|
+
resolve();
|
|
308
|
+
globalThis.removeEventListener("online", resolveAndRemoveListener);
|
|
309
|
+
};
|
|
310
|
+
globalThis.addEventListener("online", resolveAndRemoveListener);
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
};
|
|
297
314
|
/**
|
|
298
315
|
* Retrieve single batch of ops
|
|
299
316
|
* @param request - request index
|
|
@@ -310,25 +327,23 @@ export class Queue {
|
|
|
310
327
|
async function getSingleOpBatch(get, props, strongTo, logger, signal, scenarioName) {
|
|
311
328
|
let lastSuccessTime;
|
|
312
329
|
let retry = 0;
|
|
313
|
-
const deltas = [];
|
|
314
330
|
const nothing = { partial: false, cancel: true, payload: [] };
|
|
315
331
|
while ((signal === null || signal === void 0 ? void 0 : signal.aborted) !== true) {
|
|
316
332
|
retry++;
|
|
317
333
|
let delay = Math.min(MaxFetchDelayInMs, MissingFetchDelayInMs * Math.pow(2, retry));
|
|
318
334
|
const startTime = performance.now();
|
|
319
335
|
try {
|
|
320
|
-
// Issue async request for deltas
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
return { payload: deltas, cancel: false, partial: partialResult };
|
|
336
|
+
// Issue async request for deltas
|
|
337
|
+
const { messages, partialResult } = await get(Object.assign(Object.assign({}, props), { retry }));
|
|
338
|
+
// If we got messages back, return them. Return regardless of whether we got messages back if we didn't
|
|
339
|
+
// specify a "to", since we don't have an expectation of how many to receive.
|
|
340
|
+
if (messages.length !== 0 || !strongTo) {
|
|
341
|
+
return { payload: messages, cancel: false, partial: partialResult };
|
|
327
342
|
}
|
|
328
|
-
//
|
|
329
|
-
// Attempt to fetch more deltas. If we didn't receive any in the previous call we up our retry
|
|
330
|
-
// count since something prevented us from seeing those deltas
|
|
343
|
+
// Otherwise, the storage gave us back an empty set of ops but we were expecting a non-empty set.
|
|
331
344
|
if (lastSuccessTime === undefined) {
|
|
345
|
+
// Take timestamp of the first time server responded successfully, even though it wasn't with the ops we asked for.
|
|
346
|
+
// If we keep getting empty responses we'll eventually fail out below.
|
|
332
347
|
lastSuccessTime = performance.now();
|
|
333
348
|
}
|
|
334
349
|
else if (performance.now() - lastSuccessTime > 30000) {
|
|
@@ -344,7 +359,6 @@ async function getSingleOpBatch(get, props, strongTo, logger, signal, scenarioNa
|
|
|
344
359
|
}
|
|
345
360
|
catch (error) {
|
|
346
361
|
const canRetry = canRetryOnError(error);
|
|
347
|
-
lastSuccessTime = undefined;
|
|
348
362
|
const retryAfter = getRetryDelayFromError(error);
|
|
349
363
|
// This will log to error table only if the error is non-retryable
|
|
350
364
|
logNetworkFailure(logger, Object.assign(Object.assign({ eventName: "GetDeltas_Error" }, props), { retry, duration: performance.now() - startTime, retryAfter, reason: scenarioName }), error);
|
|
@@ -352,11 +366,20 @@ async function getSingleOpBatch(get, props, strongTo, logger, signal, scenarioNa
|
|
|
352
366
|
// It's game over scenario.
|
|
353
367
|
throw error;
|
|
354
368
|
}
|
|
355
|
-
if (retryAfter !== undefined
|
|
369
|
+
if (retryAfter !== undefined) {
|
|
370
|
+
// If the error told us to wait, then we will wait for that specific amount rather than the default.
|
|
356
371
|
delay = retryAfter;
|
|
357
372
|
}
|
|
358
373
|
}
|
|
359
|
-
|
|
374
|
+
// If we get here something has gone wrong - either got an unexpected empty set of messages back or a real error.
|
|
375
|
+
// Either way we will wait a little bit before retrying.
|
|
376
|
+
await new Promise((resolve) => {
|
|
377
|
+
setTimeout(resolve, delay);
|
|
378
|
+
});
|
|
379
|
+
// If we believe we're offline, we assume there's no point in trying until we at least think we're online.
|
|
380
|
+
// NOTE: This isn't strictly true for drivers that don't require network (e.g. local driver). Really this logic
|
|
381
|
+
// should probably live in the driver.
|
|
382
|
+
await waitForOnline();
|
|
360
383
|
}
|
|
361
384
|
return nothing;
|
|
362
385
|
}
|
|
@@ -402,16 +425,20 @@ export function requestOps(get, concurrency, fromTotal, toTotal, payloadSize, lo
|
|
|
402
425
|
// waits (up to 10 seconds) and fetches (can take infinite amount of time).
|
|
403
426
|
// While every such case should be improved and take into account signal (and thus cancel immediately),
|
|
404
427
|
// it is beneficial to have catch-all
|
|
405
|
-
const listener = (event) => {
|
|
428
|
+
const listener = (event) => {
|
|
429
|
+
manager.cancel();
|
|
430
|
+
};
|
|
406
431
|
if (signal !== undefined) {
|
|
407
432
|
signal.addEventListener("abort", listener);
|
|
408
433
|
}
|
|
409
|
-
manager
|
|
434
|
+
manager
|
|
435
|
+
.run(concurrency)
|
|
410
436
|
.finally(() => {
|
|
411
437
|
if (signal !== undefined) {
|
|
412
438
|
signal.removeEventListener("abort", listener);
|
|
413
439
|
}
|
|
414
|
-
})
|
|
440
|
+
})
|
|
441
|
+
.then(() => {
|
|
415
442
|
const props = {
|
|
416
443
|
lastFetch,
|
|
417
444
|
length,
|
|
@@ -421,7 +448,7 @@ export function requestOps(get, concurrency, fromTotal, toTotal, payloadSize, lo
|
|
|
421
448
|
telemetryEvent.cancel(Object.assign(Object.assign({}, props), { error: "ops request cancelled by client" }));
|
|
422
449
|
}
|
|
423
450
|
else {
|
|
424
|
-
assert(toTotal === undefined || lastFetch !== undefined && lastFetch >= toTotal - 1, 0x270 /* "All requested ops fetched" */);
|
|
451
|
+
assert(toTotal === undefined || (lastFetch !== undefined && lastFetch >= toTotal - 1), 0x270 /* "All requested ops fetched" */);
|
|
425
452
|
telemetryEvent.end(props);
|
|
426
453
|
}
|
|
427
454
|
queue.pushDone();
|
|
@@ -437,7 +464,9 @@ export function requestOps(get, concurrency, fromTotal, toTotal, payloadSize, lo
|
|
|
437
464
|
return queue;
|
|
438
465
|
}
|
|
439
466
|
export const emptyMessageStream = {
|
|
440
|
-
read: async () => {
|
|
467
|
+
read: async () => {
|
|
468
|
+
return { done: true };
|
|
469
|
+
},
|
|
441
470
|
};
|
|
442
471
|
export function streamFromMessages(messagesArg) {
|
|
443
472
|
let messages = messagesArg;
|