@fluidframework/driver-utils 2.0.0-internal.2.2.1 → 2.0.0-internal.2.3.1
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 +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/mapWithExpiration.d.ts +34 -0
- package/dist/mapWithExpiration.d.ts.map +1 -0
- package/dist/mapWithExpiration.js +103 -0
- package/dist/mapWithExpiration.js.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/mapWithExpiration.d.ts +34 -0
- package/lib/mapWithExpiration.d.ts.map +1 -0
- package/lib/mapWithExpiration.js +99 -0
- package/lib/mapWithExpiration.js.map +1 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/package.json +12 -10
- package/src/index.ts +1 -0
- package/src/mapWithExpiration.ts +117 -0
- package/src/packageVersion.ts +1 -1
package/.eslintrc.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
module.exports = {
|
|
7
7
|
"extends": [
|
|
8
|
-
require.resolve("@fluidframework/eslint-config-fluid"), "prettier"
|
|
8
|
+
require.resolve("@fluidframework/eslint-config-fluid/minimal"), "prettier"
|
|
9
9
|
],
|
|
10
10
|
"parserOptions": {
|
|
11
11
|
"project": ["./tsconfig.json", "./src/test/tsconfig.json"]
|
package/dist/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export { EmptyDocumentDeltaStorageService } from "./emptyDocumentDeltaStorageSer
|
|
|
10
10
|
export { UsageError } from "./error";
|
|
11
11
|
export { ensureFluidResolvedUrl, isFluidResolvedUrl } from "./fluidResolvedUrl";
|
|
12
12
|
export { InsecureUrlResolver } from "./insecureUrlResolver";
|
|
13
|
+
export { MapWithExpiration } from "./mapWithExpiration";
|
|
13
14
|
export { canBeCoalescedByService, isRuntimeMessage, isUnpackedRuntimeMessage, MessageType2, } from "./messageRecognition";
|
|
14
15
|
export { MultiDocumentServiceFactory } from "./multiDocumentServiceFactory";
|
|
15
16
|
export { configurableUrlResolver, MultiUrlResolver } from "./multiUrlResolver";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACN,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EAChB,mCAAmC,EACnC,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,6BAA6B,EAC7B,eAAe,EACf,QAAQ,EACR,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACN,4BAA4B,EAC5B,mCAAmC,EACnC,kCAAkC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,oCAAoC,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACN,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EAChB,mCAAmC,EACnC,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,6BAA6B,EAC7B,eAAe,EACf,QAAQ,EACR,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACN,4BAA4B,EAC5B,mCAAmC,EACnC,kCAAkC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,oCAAoC,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
8
|
-
exports.SummaryTreeAssembler = void 0;
|
|
7
|
+
exports.convertSummaryTreeToSnapshotITree = exports.getQuorumValuesFromProtocolSummary = exports.getDocAttributesFromProtocolSummary = exports.combineAppAndProtocolSummary = exports.runWithRetry = exports.readAndParse = exports.RateLimiter = exports.PrefetchDocumentStorageService = exports.streamObserver = exports.streamFromMessages = exports.requestOps = exports.Queue = exports.ParallelRequests = exports.emptyMessageStream = exports.waitForConnectedState = exports.logNetworkFailure = exports.ThrottlingError = exports.RetryableError = exports.OnlineStatus = exports.NonRetryableError = exports.NetworkErrorBasic = exports.LocationRedirectionError = exports.isOnline = exports.getRetryDelaySecondsFromError = exports.getRetryDelayFromError = exports.GenericNetworkError = exports.FluidInvalidSchemaError = exports.DeltaStreamConnectionForbiddenError = exports.createWriteError = exports.createGenericNetworkError = exports.canRetryOnError = exports.AuthorizationError = exports.MultiUrlResolver = exports.configurableUrlResolver = exports.MultiDocumentServiceFactory = exports.MessageType2 = exports.isUnpackedRuntimeMessage = exports.isRuntimeMessage = exports.canBeCoalescedByService = exports.MapWithExpiration = exports.InsecureUrlResolver = exports.isFluidResolvedUrl = exports.ensureFluidResolvedUrl = exports.UsageError = exports.EmptyDocumentDeltaStorageService = exports.DocumentStorageServiceProxy = exports.buildSnapshotTree = exports.BlobCacheStorageService = exports.SnapshotExtractor = exports.BlobAggregationStorage = void 0;
|
|
8
|
+
exports.SummaryTreeAssembler = exports.convertSnapshotAndBlobsToSummaryTree = void 0;
|
|
9
9
|
var blobAggregationStorage_1 = require("./blobAggregationStorage");
|
|
10
10
|
Object.defineProperty(exports, "BlobAggregationStorage", { enumerable: true, get: function () { return blobAggregationStorage_1.BlobAggregationStorage; } });
|
|
11
11
|
Object.defineProperty(exports, "SnapshotExtractor", { enumerable: true, get: function () { return blobAggregationStorage_1.SnapshotExtractor; } });
|
|
@@ -24,6 +24,8 @@ Object.defineProperty(exports, "ensureFluidResolvedUrl", { enumerable: true, get
|
|
|
24
24
|
Object.defineProperty(exports, "isFluidResolvedUrl", { enumerable: true, get: function () { return fluidResolvedUrl_1.isFluidResolvedUrl; } });
|
|
25
25
|
var insecureUrlResolver_1 = require("./insecureUrlResolver");
|
|
26
26
|
Object.defineProperty(exports, "InsecureUrlResolver", { enumerable: true, get: function () { return insecureUrlResolver_1.InsecureUrlResolver; } });
|
|
27
|
+
var mapWithExpiration_1 = require("./mapWithExpiration");
|
|
28
|
+
Object.defineProperty(exports, "MapWithExpiration", { enumerable: true, get: function () { return mapWithExpiration_1.MapWithExpiration; } });
|
|
27
29
|
var messageRecognition_1 = require("./messageRecognition");
|
|
28
30
|
Object.defineProperty(exports, "canBeCoalescedByService", { enumerable: true, get: function () { return messageRecognition_1.canBeCoalescedByService; } });
|
|
29
31
|
Object.defineProperty(exports, "isRuntimeMessage", { enumerable: true, get: function () { return messageRecognition_1.isRuntimeMessage; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;AAEH,mEAAqF;AAA5E,gIAAA,sBAAsB,OAAA;AAAE,2HAAA,iBAAiB,OAAA;AAClD,qEAAoE;AAA3D,kIAAA,uBAAuB,OAAA;AAChC,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AACpC,uFAAsF;AAA7E,oJAAA,gCAAgC,OAAA;AACzC,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AACnB,uDAAgF;AAAvE,0HAAA,sBAAsB,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AACnD,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,2DAK8B;AAJ7B,6HAAA,uBAAuB,OAAA;AACvB,sHAAA,gBAAgB,OAAA;AAChB,8HAAA,wBAAwB,OAAA;AACxB,kHAAA,YAAY,OAAA;AAEb,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AACpC,uDAA+E;AAAtE,2HAAA,uBAAuB,OAAA;AAAE,oHAAA,gBAAgB,OAAA;AAClD,qCAmBmB;AAlBlB,6GAAA,kBAAkB,OAAA;AAClB,0GAAA,eAAe,OAAA;AACf,oHAAA,yBAAyB,OAAA;AACzB,2GAAA,gBAAgB,OAAA;AAChB,8HAAA,mCAAmC,OAAA;AAEnC,kHAAA,uBAAuB,OAAA;AACvB,8GAAA,mBAAmB,OAAA;AACnB,iHAAA,sBAAsB,OAAA;AACtB,wHAAA,6BAA6B,OAAA;AAE7B,mGAAA,QAAQ,OAAA;AACR,mHAAA,wBAAwB,OAAA;AACxB,4GAAA,iBAAiB,OAAA;AACjB,4GAAA,iBAAiB,OAAA;AACjB,uGAAA,YAAY,OAAA;AACZ,yGAAA,cAAc,OAAA;AACd,0GAAA,eAAe,OAAA;AAEhB,+CAA0E;AAAjE,iHAAA,iBAAiB,OAAA;AAAE,qHAAA,qBAAqB,OAAA;AACjD,uDAO4B;AAN3B,sHAAA,kBAAkB,OAAA;AAClB,oHAAA,gBAAgB,OAAA;AAChB,yGAAA,KAAK,OAAA;AACL,8GAAA,UAAU,OAAA;AACV,sHAAA,kBAAkB,OAAA;AAClB,kHAAA,cAAc,OAAA;AAEf,mFAAkF;AAAzE,gJAAA,8BAA8B,OAAA;AACvC,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,+CAAyD;AAArC,4GAAA,YAAY,OAAA;AAChC,6DAI+B;AAH9B,mIAAA,4BAA4B,OAAA;AAC5B,0IAAA,mCAAmC,OAAA;AACnC,yIAAA,kCAAkC,OAAA;AAEnC,qDAAsE;AAA7D,oIAAA,iCAAiC,OAAA;AAC1C,yCAAqH;AAA5G,iIAAA,oCAAoC,OAAA;AAA8B,iHAAA,oBAAoB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { BlobAggregationStorage, SnapshotExtractor } from \"./blobAggregationStorage\";\nexport { BlobCacheStorageService } from \"./blobCacheStorageService\";\nexport { buildSnapshotTree } from \"./buildSnapshotTree\";\nexport { DocumentStorageServiceProxy } from \"./documentStorageServiceProxy\";\nexport { EmptyDocumentDeltaStorageService } from \"./emptyDocumentDeltaStorageService\";\nexport { UsageError } from \"./error\";\nexport { ensureFluidResolvedUrl, isFluidResolvedUrl } from \"./fluidResolvedUrl\";\nexport { InsecureUrlResolver } from \"./insecureUrlResolver\";\nexport {\n\tcanBeCoalescedByService,\n\tisRuntimeMessage,\n\tisUnpackedRuntimeMessage,\n\tMessageType2,\n} from \"./messageRecognition\";\nexport { MultiDocumentServiceFactory } from \"./multiDocumentServiceFactory\";\nexport { configurableUrlResolver, MultiUrlResolver } from \"./multiUrlResolver\";\nexport {\n\tAuthorizationError,\n\tcanRetryOnError,\n\tcreateGenericNetworkError,\n\tcreateWriteError,\n\tDeltaStreamConnectionForbiddenError,\n\tDriverErrorTelemetryProps,\n\tFluidInvalidSchemaError,\n\tGenericNetworkError,\n\tgetRetryDelayFromError,\n\tgetRetryDelaySecondsFromError,\n\tIAnyDriverError,\n\tisOnline,\n\tLocationRedirectionError,\n\tNetworkErrorBasic,\n\tNonRetryableError,\n\tOnlineStatus,\n\tRetryableError,\n\tThrottlingError,\n} from \"./network\";\nexport { logNetworkFailure, waitForConnectedState } from \"./networkUtils\";\nexport {\n\temptyMessageStream,\n\tParallelRequests,\n\tQueue,\n\trequestOps,\n\tstreamFromMessages,\n\tstreamObserver,\n} from \"./parallelRequests\";\nexport { PrefetchDocumentStorageService } from \"./prefetchDocumentStorageService\";\nexport { RateLimiter } from \"./rateLimiter\";\nexport { readAndParse } from \"./readAndParse\";\nexport { IProgress, runWithRetry } from \"./runWithRetry\";\nexport {\n\tcombineAppAndProtocolSummary,\n\tgetDocAttributesFromProtocolSummary,\n\tgetQuorumValuesFromProtocolSummary,\n} from \"./summaryForCreateNew\";\nexport { convertSummaryTreeToSnapshotITree } from \"./treeConversions\";\nexport { convertSnapshotAndBlobsToSummaryTree, ISummaryTreeAssemblerProps, SummaryTreeAssembler } from \"./treeUtils\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;AAEH,mEAAqF;AAA5E,gIAAA,sBAAsB,OAAA;AAAE,2HAAA,iBAAiB,OAAA;AAClD,qEAAoE;AAA3D,kIAAA,uBAAuB,OAAA;AAChC,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AACpC,uFAAsF;AAA7E,oJAAA,gCAAgC,OAAA;AACzC,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AACnB,uDAAgF;AAAvE,0HAAA,sBAAsB,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AACnD,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,2DAK8B;AAJ7B,6HAAA,uBAAuB,OAAA;AACvB,sHAAA,gBAAgB,OAAA;AAChB,8HAAA,wBAAwB,OAAA;AACxB,kHAAA,YAAY,OAAA;AAEb,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AACpC,uDAA+E;AAAtE,2HAAA,uBAAuB,OAAA;AAAE,oHAAA,gBAAgB,OAAA;AAClD,qCAmBmB;AAlBlB,6GAAA,kBAAkB,OAAA;AAClB,0GAAA,eAAe,OAAA;AACf,oHAAA,yBAAyB,OAAA;AACzB,2GAAA,gBAAgB,OAAA;AAChB,8HAAA,mCAAmC,OAAA;AAEnC,kHAAA,uBAAuB,OAAA;AACvB,8GAAA,mBAAmB,OAAA;AACnB,iHAAA,sBAAsB,OAAA;AACtB,wHAAA,6BAA6B,OAAA;AAE7B,mGAAA,QAAQ,OAAA;AACR,mHAAA,wBAAwB,OAAA;AACxB,4GAAA,iBAAiB,OAAA;AACjB,4GAAA,iBAAiB,OAAA;AACjB,uGAAA,YAAY,OAAA;AACZ,yGAAA,cAAc,OAAA;AACd,0GAAA,eAAe,OAAA;AAEhB,+CAA0E;AAAjE,iHAAA,iBAAiB,OAAA;AAAE,qHAAA,qBAAqB,OAAA;AACjD,uDAO4B;AAN3B,sHAAA,kBAAkB,OAAA;AAClB,oHAAA,gBAAgB,OAAA;AAChB,yGAAA,KAAK,OAAA;AACL,8GAAA,UAAU,OAAA;AACV,sHAAA,kBAAkB,OAAA;AAClB,kHAAA,cAAc,OAAA;AAEf,mFAAkF;AAAzE,gJAAA,8BAA8B,OAAA;AACvC,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,+CAAyD;AAArC,4GAAA,YAAY,OAAA;AAChC,6DAI+B;AAH9B,mIAAA,4BAA4B,OAAA;AAC5B,0IAAA,mCAAmC,OAAA;AACnC,yIAAA,kCAAkC,OAAA;AAEnC,qDAAsE;AAA7D,oIAAA,iCAAiC,OAAA;AAC1C,yCAAqH;AAA5G,iIAAA,oCAAoC,OAAA;AAA8B,iHAAA,oBAAoB,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { BlobAggregationStorage, SnapshotExtractor } from \"./blobAggregationStorage\";\nexport { BlobCacheStorageService } from \"./blobCacheStorageService\";\nexport { buildSnapshotTree } from \"./buildSnapshotTree\";\nexport { DocumentStorageServiceProxy } from \"./documentStorageServiceProxy\";\nexport { EmptyDocumentDeltaStorageService } from \"./emptyDocumentDeltaStorageService\";\nexport { UsageError } from \"./error\";\nexport { ensureFluidResolvedUrl, isFluidResolvedUrl } from \"./fluidResolvedUrl\";\nexport { InsecureUrlResolver } from \"./insecureUrlResolver\";\nexport { MapWithExpiration } from \"./mapWithExpiration\";\nexport {\n\tcanBeCoalescedByService,\n\tisRuntimeMessage,\n\tisUnpackedRuntimeMessage,\n\tMessageType2,\n} from \"./messageRecognition\";\nexport { MultiDocumentServiceFactory } from \"./multiDocumentServiceFactory\";\nexport { configurableUrlResolver, MultiUrlResolver } from \"./multiUrlResolver\";\nexport {\n\tAuthorizationError,\n\tcanRetryOnError,\n\tcreateGenericNetworkError,\n\tcreateWriteError,\n\tDeltaStreamConnectionForbiddenError,\n\tDriverErrorTelemetryProps,\n\tFluidInvalidSchemaError,\n\tGenericNetworkError,\n\tgetRetryDelayFromError,\n\tgetRetryDelaySecondsFromError,\n\tIAnyDriverError,\n\tisOnline,\n\tLocationRedirectionError,\n\tNetworkErrorBasic,\n\tNonRetryableError,\n\tOnlineStatus,\n\tRetryableError,\n\tThrottlingError,\n} from \"./network\";\nexport { logNetworkFailure, waitForConnectedState } from \"./networkUtils\";\nexport {\n\temptyMessageStream,\n\tParallelRequests,\n\tQueue,\n\trequestOps,\n\tstreamFromMessages,\n\tstreamObserver,\n} from \"./parallelRequests\";\nexport { PrefetchDocumentStorageService } from \"./prefetchDocumentStorageService\";\nexport { RateLimiter } from \"./rateLimiter\";\nexport { readAndParse } from \"./readAndParse\";\nexport { IProgress, runWithRetry } from \"./runWithRetry\";\nexport {\n\tcombineAppAndProtocolSummary,\n\tgetDocAttributesFromProtocolSummary,\n\tgetQuorumValuesFromProtocolSummary,\n} from \"./summaryForCreateNew\";\nexport { convertSummaryTreeToSnapshotITree } from \"./treeConversions\";\nexport { convertSnapshotAndBlobsToSummaryTree, ISummaryTreeAssemblerProps, SummaryTreeAssembler } from \"./treeUtils\";\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* An extension of Map that expires (deletes) entries after a period of inactivity.
|
|
7
|
+
* The policy is based on the last time a key was written to.
|
|
8
|
+
*/
|
|
9
|
+
export declare class MapWithExpiration<TKey = any, TValue = any> extends Map<TKey, TValue> {
|
|
10
|
+
private readonly expiryMs;
|
|
11
|
+
/** Timestamps (as epoch ms numbers) of when each key was last refreshed */
|
|
12
|
+
private readonly lastRefreshedTimes;
|
|
13
|
+
constructor(expiryMs: number);
|
|
14
|
+
private refresh;
|
|
15
|
+
/**
|
|
16
|
+
* Returns true if the key is present and expired, false if it's not expired, and undefined if it's not found
|
|
17
|
+
* If cleanUp is passed as true, then delete any expired entry before returning.
|
|
18
|
+
*/
|
|
19
|
+
private checkExpiry;
|
|
20
|
+
private clearExpiredEntries;
|
|
21
|
+
get size(): number;
|
|
22
|
+
has(key: TKey): boolean;
|
|
23
|
+
get(key: TKey): TValue | undefined;
|
|
24
|
+
set(key: TKey, value: TValue): this;
|
|
25
|
+
delete(key: TKey): boolean;
|
|
26
|
+
clear(): void;
|
|
27
|
+
forEach(callbackfn: (value: TValue, key: TKey, map: Map<TKey, TValue>) => void, thisArg?: any): void;
|
|
28
|
+
entries(): IterableIterator<[TKey, TValue]>;
|
|
29
|
+
keys(): IterableIterator<TKey>;
|
|
30
|
+
values(): IterableIterator<TValue>;
|
|
31
|
+
[Symbol.iterator](): IterableIterator<[TKey, TValue]>;
|
|
32
|
+
valueOf(): Object;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=mapWithExpiration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapWithExpiration.d.ts","sourceRoot":"","sources":["../src/mapWithExpiration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,IAAI,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;IAK1E,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ7B,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2B;gBAGzC,QAAQ,EAAE,MAAM;IAKrC,OAAO,CAAC,OAAO;IAIf;;;OAGG;IACH,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,mBAAmB;IAK3B,IAAI,IAAI,IAAI,MAAM,CAGjB;IAED,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAKvB,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS;IAKlC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMnC,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAK1B,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAgBpG,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAI3C,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC;IAI9B,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIlC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAKrD,OAAO;CAIV"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.MapWithExpiration = void 0;
|
|
8
|
+
const common_utils_1 = require("@fluidframework/common-utils");
|
|
9
|
+
/**
|
|
10
|
+
* An extension of Map that expires (deletes) entries after a period of inactivity.
|
|
11
|
+
* The policy is based on the last time a key was written to.
|
|
12
|
+
*/
|
|
13
|
+
class MapWithExpiration extends Map {
|
|
14
|
+
constructor(expiryMs) {
|
|
15
|
+
super();
|
|
16
|
+
this.expiryMs = expiryMs;
|
|
17
|
+
/** Timestamps (as epoch ms numbers) of when each key was last refreshed */
|
|
18
|
+
this.lastRefreshedTimes = new Map();
|
|
19
|
+
}
|
|
20
|
+
refresh(key) {
|
|
21
|
+
this.lastRefreshedTimes.set(key, (new Date()).valueOf());
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns true if the key is present and expired, false if it's not expired, and undefined if it's not found
|
|
25
|
+
* If cleanUp is passed as true, then delete any expired entry before returning.
|
|
26
|
+
*/
|
|
27
|
+
checkExpiry(key, cleanUp = false) {
|
|
28
|
+
const refreshTime = this.lastRefreshedTimes.get(key);
|
|
29
|
+
(0, common_utils_1.assert)((refreshTime !== undefined) === super.has(key), 0x50c /* freshness map out of sync */);
|
|
30
|
+
if (refreshTime === undefined) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const expired = (new Date()).valueOf() - refreshTime >= this.expiryMs;
|
|
34
|
+
if (expired && cleanUp) {
|
|
35
|
+
this.delete(key);
|
|
36
|
+
}
|
|
37
|
+
return expired;
|
|
38
|
+
}
|
|
39
|
+
clearExpiredEntries() {
|
|
40
|
+
// forEach clears out any expired entries
|
|
41
|
+
this.forEach(() => { });
|
|
42
|
+
}
|
|
43
|
+
get size() {
|
|
44
|
+
this.clearExpiredEntries();
|
|
45
|
+
return super.size;
|
|
46
|
+
}
|
|
47
|
+
has(key) {
|
|
48
|
+
this.checkExpiry(key, true /* cleanUp */);
|
|
49
|
+
return super.has(key);
|
|
50
|
+
}
|
|
51
|
+
get(key) {
|
|
52
|
+
this.checkExpiry(key, true /* cleanUp */);
|
|
53
|
+
return super.get(key);
|
|
54
|
+
}
|
|
55
|
+
set(key, value) {
|
|
56
|
+
// Sliding window expiration policy (on write)
|
|
57
|
+
this.refresh(key);
|
|
58
|
+
return super.set(key, value);
|
|
59
|
+
}
|
|
60
|
+
delete(key) {
|
|
61
|
+
this.lastRefreshedTimes.delete(key);
|
|
62
|
+
return super.delete(key);
|
|
63
|
+
}
|
|
64
|
+
clear() {
|
|
65
|
+
this.lastRefreshedTimes.clear();
|
|
66
|
+
super.clear();
|
|
67
|
+
}
|
|
68
|
+
forEach(callbackfn, thisArg) {
|
|
69
|
+
const expiredKeys = [];
|
|
70
|
+
super.forEach((v, k, m) => {
|
|
71
|
+
if (this.checkExpiry(k) === true) {
|
|
72
|
+
expiredKeys.push(k);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
callbackfn.bind(thisArg)(v, k, m);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// Clean up keys we know are expired now that we're done iterating
|
|
79
|
+
expiredKeys.forEach((key) => { this.delete(key); });
|
|
80
|
+
}
|
|
81
|
+
entries() {
|
|
82
|
+
this.clearExpiredEntries();
|
|
83
|
+
return super.entries();
|
|
84
|
+
}
|
|
85
|
+
keys() {
|
|
86
|
+
this.clearExpiredEntries();
|
|
87
|
+
return super.keys();
|
|
88
|
+
}
|
|
89
|
+
values() {
|
|
90
|
+
this.clearExpiredEntries();
|
|
91
|
+
return super.values();
|
|
92
|
+
}
|
|
93
|
+
[Symbol.iterator]() {
|
|
94
|
+
this.clearExpiredEntries();
|
|
95
|
+
return super[Symbol.iterator]();
|
|
96
|
+
}
|
|
97
|
+
valueOf() {
|
|
98
|
+
this.clearExpiredEntries();
|
|
99
|
+
return super.valueOf();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.MapWithExpiration = MapWithExpiration;
|
|
103
|
+
//# sourceMappingURL=mapWithExpiration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapWithExpiration.js","sourceRoot":"","sources":["../src/mapWithExpiration.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 { assert } from \"@fluidframework/common-utils\";\n\n/**\n * An extension of Map that expires (deletes) entries after a period of inactivity.\n * The policy is based on the last time a key was written to.\n */\nexport class MapWithExpiration<TKey = any, TValue = any> extends Map<TKey, TValue> {\n /** Timestamps (as epoch ms numbers) of when each key was last refreshed */\n private readonly lastRefreshedTimes = new Map<TKey, number>();\n\n constructor(\n private readonly expiryMs: number,\n ) {\n super();\n }\n\n private refresh(key: TKey): void {\n this.lastRefreshedTimes.set(key, (new Date()).valueOf());\n }\n\n /**\n * Returns true if the key is present and expired, false if it's not expired, and undefined if it's not found\n * If cleanUp is passed as true, then delete any expired entry before returning.\n */\n private checkExpiry(key: TKey, cleanUp: boolean = false): boolean | undefined {\n const refreshTime = this.lastRefreshedTimes.get(key);\n assert((refreshTime !== undefined) === super.has(key), 0x50c /* freshness map out of sync */);\n\n if (refreshTime === undefined) {\n return undefined;\n }\n const expired = (new Date()).valueOf() - refreshTime >= this.expiryMs;\n if (expired && cleanUp) {\n this.delete(key);\n }\n return expired;\n }\n\n private clearExpiredEntries() {\n // forEach clears out any expired entries\n this.forEach(() => {});\n }\n\n get size(): number {\n this.clearExpiredEntries();\n return super.size;\n }\n\n has(key: TKey): boolean {\n this.checkExpiry(key, true /* cleanUp */);\n return super.has(key);\n }\n\n get(key: TKey): TValue | undefined {\n this.checkExpiry(key, true /* cleanUp */);\n return super.get(key);\n }\n\n set(key: TKey, value: TValue): this {\n // Sliding window expiration policy (on write)\n this.refresh(key);\n return super.set(key, value);\n }\n\n delete(key: TKey): boolean {\n this.lastRefreshedTimes.delete(key);\n return super.delete(key);\n }\n\n clear(): void {\n this.lastRefreshedTimes.clear();\n super.clear();\n }\n\n forEach(callbackfn: (value: TValue, key: TKey, map: Map<TKey, TValue>) => void, thisArg?: any): void {\n const expiredKeys: TKey[] = [];\n super.forEach((v, k, m) => {\n if (this.checkExpiry(k) === true) {\n expiredKeys.push(k);\n } else {\n callbackfn.bind(thisArg)(v, k, m);\n }\n },\n // Note we don't pass thisArg here, since we bind it directly to callbackFn and don't need it otherwise\n );\n\n // Clean up keys we know are expired now that we're done iterating\n expiredKeys.forEach((key: TKey) => { this.delete(key); });\n }\n\n entries(): IterableIterator<[TKey, TValue]> {\n this.clearExpiredEntries();\n return super.entries();\n }\n keys(): IterableIterator<TKey> {\n this.clearExpiredEntries();\n return super.keys();\n }\n values(): IterableIterator<TValue> {\n this.clearExpiredEntries();\n return super.values();\n }\n [Symbol.iterator](): IterableIterator<[TKey, TValue]> {\n this.clearExpiredEntries();\n return super[Symbol.iterator]();\n }\n\n valueOf() {\n this.clearExpiredEntries();\n return super.valueOf();\n }\n}\n"]}
|
package/dist/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-internal.2.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-internal.2.3.1";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/driver-utils";
|
|
11
|
-
exports.pkgVersion = "2.0.0-internal.2.
|
|
11
|
+
exports.pkgVersion = "2.0.0-internal.2.3.1";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,8BAA8B,CAAC;AACzC,QAAA,UAAU,GAAG,sBAAsB,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-internal.2.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,8BAA8B,CAAC;AACzC,QAAA,UAAU,GAAG,sBAAsB,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-internal.2.3.1\";\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export { EmptyDocumentDeltaStorageService } from "./emptyDocumentDeltaStorageSer
|
|
|
10
10
|
export { UsageError } from "./error";
|
|
11
11
|
export { ensureFluidResolvedUrl, isFluidResolvedUrl } from "./fluidResolvedUrl";
|
|
12
12
|
export { InsecureUrlResolver } from "./insecureUrlResolver";
|
|
13
|
+
export { MapWithExpiration } from "./mapWithExpiration";
|
|
13
14
|
export { canBeCoalescedByService, isRuntimeMessage, isUnpackedRuntimeMessage, MessageType2, } from "./messageRecognition";
|
|
14
15
|
export { MultiDocumentServiceFactory } from "./multiDocumentServiceFactory";
|
|
15
16
|
export { configurableUrlResolver, MultiUrlResolver } from "./multiUrlResolver";
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACN,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EAChB,mCAAmC,EACnC,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,6BAA6B,EAC7B,eAAe,EACf,QAAQ,EACR,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACN,4BAA4B,EAC5B,mCAAmC,EACnC,kCAAkC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,oCAAoC,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACN,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EAChB,mCAAmC,EACnC,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,6BAA6B,EAC7B,eAAe,EACf,QAAQ,EACR,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACN,4BAA4B,EAC5B,mCAAmC,EACnC,kCAAkC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,oCAAoC,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -10,6 +10,7 @@ export { EmptyDocumentDeltaStorageService } from "./emptyDocumentDeltaStorageSer
|
|
|
10
10
|
export { UsageError } from "./error";
|
|
11
11
|
export { ensureFluidResolvedUrl, isFluidResolvedUrl } from "./fluidResolvedUrl";
|
|
12
12
|
export { InsecureUrlResolver } from "./insecureUrlResolver";
|
|
13
|
+
export { MapWithExpiration } from "./mapWithExpiration";
|
|
13
14
|
export { canBeCoalescedByService, isRuntimeMessage, isUnpackedRuntimeMessage, MessageType2, } from "./messageRecognition";
|
|
14
15
|
export { MultiDocumentServiceFactory } from "./multiDocumentServiceFactory";
|
|
15
16
|
export { configurableUrlResolver, MultiUrlResolver } from "./multiUrlResolver";
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACN,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EAChB,mCAAmC,EAEnC,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,6BAA6B,EAE7B,QAAQ,EACR,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAa,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACN,4BAA4B,EAC5B,mCAAmC,EACnC,kCAAkC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,oCAAoC,EAA8B,oBAAoB,EAAE,MAAM,aAAa,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { BlobAggregationStorage, SnapshotExtractor } from \"./blobAggregationStorage\";\nexport { BlobCacheStorageService } from \"./blobCacheStorageService\";\nexport { buildSnapshotTree } from \"./buildSnapshotTree\";\nexport { DocumentStorageServiceProxy } from \"./documentStorageServiceProxy\";\nexport { EmptyDocumentDeltaStorageService } from \"./emptyDocumentDeltaStorageService\";\nexport { UsageError } from \"./error\";\nexport { ensureFluidResolvedUrl, isFluidResolvedUrl } from \"./fluidResolvedUrl\";\nexport { InsecureUrlResolver } from \"./insecureUrlResolver\";\nexport {\n\tcanBeCoalescedByService,\n\tisRuntimeMessage,\n\tisUnpackedRuntimeMessage,\n\tMessageType2,\n} from \"./messageRecognition\";\nexport { MultiDocumentServiceFactory } from \"./multiDocumentServiceFactory\";\nexport { configurableUrlResolver, MultiUrlResolver } from \"./multiUrlResolver\";\nexport {\n\tAuthorizationError,\n\tcanRetryOnError,\n\tcreateGenericNetworkError,\n\tcreateWriteError,\n\tDeltaStreamConnectionForbiddenError,\n\tDriverErrorTelemetryProps,\n\tFluidInvalidSchemaError,\n\tGenericNetworkError,\n\tgetRetryDelayFromError,\n\tgetRetryDelaySecondsFromError,\n\tIAnyDriverError,\n\tisOnline,\n\tLocationRedirectionError,\n\tNetworkErrorBasic,\n\tNonRetryableError,\n\tOnlineStatus,\n\tRetryableError,\n\tThrottlingError,\n} from \"./network\";\nexport { logNetworkFailure, waitForConnectedState } from \"./networkUtils\";\nexport {\n\temptyMessageStream,\n\tParallelRequests,\n\tQueue,\n\trequestOps,\n\tstreamFromMessages,\n\tstreamObserver,\n} from \"./parallelRequests\";\nexport { PrefetchDocumentStorageService } from \"./prefetchDocumentStorageService\";\nexport { RateLimiter } from \"./rateLimiter\";\nexport { readAndParse } from \"./readAndParse\";\nexport { IProgress, runWithRetry } from \"./runWithRetry\";\nexport {\n\tcombineAppAndProtocolSummary,\n\tgetDocAttributesFromProtocolSummary,\n\tgetQuorumValuesFromProtocolSummary,\n} from \"./summaryForCreateNew\";\nexport { convertSummaryTreeToSnapshotITree } from \"./treeConversions\";\nexport { convertSnapshotAndBlobsToSummaryTree, ISummaryTreeAssemblerProps, SummaryTreeAssembler } from \"./treeUtils\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACN,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EAChB,mCAAmC,EAEnC,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,6BAA6B,EAE7B,QAAQ,EACR,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAa,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACN,4BAA4B,EAC5B,mCAAmC,EACnC,kCAAkC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,oCAAoC,EAA8B,oBAAoB,EAAE,MAAM,aAAa,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { BlobAggregationStorage, SnapshotExtractor } from \"./blobAggregationStorage\";\nexport { BlobCacheStorageService } from \"./blobCacheStorageService\";\nexport { buildSnapshotTree } from \"./buildSnapshotTree\";\nexport { DocumentStorageServiceProxy } from \"./documentStorageServiceProxy\";\nexport { EmptyDocumentDeltaStorageService } from \"./emptyDocumentDeltaStorageService\";\nexport { UsageError } from \"./error\";\nexport { ensureFluidResolvedUrl, isFluidResolvedUrl } from \"./fluidResolvedUrl\";\nexport { InsecureUrlResolver } from \"./insecureUrlResolver\";\nexport { MapWithExpiration } from \"./mapWithExpiration\";\nexport {\n\tcanBeCoalescedByService,\n\tisRuntimeMessage,\n\tisUnpackedRuntimeMessage,\n\tMessageType2,\n} from \"./messageRecognition\";\nexport { MultiDocumentServiceFactory } from \"./multiDocumentServiceFactory\";\nexport { configurableUrlResolver, MultiUrlResolver } from \"./multiUrlResolver\";\nexport {\n\tAuthorizationError,\n\tcanRetryOnError,\n\tcreateGenericNetworkError,\n\tcreateWriteError,\n\tDeltaStreamConnectionForbiddenError,\n\tDriverErrorTelemetryProps,\n\tFluidInvalidSchemaError,\n\tGenericNetworkError,\n\tgetRetryDelayFromError,\n\tgetRetryDelaySecondsFromError,\n\tIAnyDriverError,\n\tisOnline,\n\tLocationRedirectionError,\n\tNetworkErrorBasic,\n\tNonRetryableError,\n\tOnlineStatus,\n\tRetryableError,\n\tThrottlingError,\n} from \"./network\";\nexport { logNetworkFailure, waitForConnectedState } from \"./networkUtils\";\nexport {\n\temptyMessageStream,\n\tParallelRequests,\n\tQueue,\n\trequestOps,\n\tstreamFromMessages,\n\tstreamObserver,\n} from \"./parallelRequests\";\nexport { PrefetchDocumentStorageService } from \"./prefetchDocumentStorageService\";\nexport { RateLimiter } from \"./rateLimiter\";\nexport { readAndParse } from \"./readAndParse\";\nexport { IProgress, runWithRetry } from \"./runWithRetry\";\nexport {\n\tcombineAppAndProtocolSummary,\n\tgetDocAttributesFromProtocolSummary,\n\tgetQuorumValuesFromProtocolSummary,\n} from \"./summaryForCreateNew\";\nexport { convertSummaryTreeToSnapshotITree } from \"./treeConversions\";\nexport { convertSnapshotAndBlobsToSummaryTree, ISummaryTreeAssemblerProps, SummaryTreeAssembler } from \"./treeUtils\";\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* An extension of Map that expires (deletes) entries after a period of inactivity.
|
|
7
|
+
* The policy is based on the last time a key was written to.
|
|
8
|
+
*/
|
|
9
|
+
export declare class MapWithExpiration<TKey = any, TValue = any> extends Map<TKey, TValue> {
|
|
10
|
+
private readonly expiryMs;
|
|
11
|
+
/** Timestamps (as epoch ms numbers) of when each key was last refreshed */
|
|
12
|
+
private readonly lastRefreshedTimes;
|
|
13
|
+
constructor(expiryMs: number);
|
|
14
|
+
private refresh;
|
|
15
|
+
/**
|
|
16
|
+
* Returns true if the key is present and expired, false if it's not expired, and undefined if it's not found
|
|
17
|
+
* If cleanUp is passed as true, then delete any expired entry before returning.
|
|
18
|
+
*/
|
|
19
|
+
private checkExpiry;
|
|
20
|
+
private clearExpiredEntries;
|
|
21
|
+
get size(): number;
|
|
22
|
+
has(key: TKey): boolean;
|
|
23
|
+
get(key: TKey): TValue | undefined;
|
|
24
|
+
set(key: TKey, value: TValue): this;
|
|
25
|
+
delete(key: TKey): boolean;
|
|
26
|
+
clear(): void;
|
|
27
|
+
forEach(callbackfn: (value: TValue, key: TKey, map: Map<TKey, TValue>) => void, thisArg?: any): void;
|
|
28
|
+
entries(): IterableIterator<[TKey, TValue]>;
|
|
29
|
+
keys(): IterableIterator<TKey>;
|
|
30
|
+
values(): IterableIterator<TValue>;
|
|
31
|
+
[Symbol.iterator](): IterableIterator<[TKey, TValue]>;
|
|
32
|
+
valueOf(): Object;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=mapWithExpiration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapWithExpiration.d.ts","sourceRoot":"","sources":["../src/mapWithExpiration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,IAAI,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;IAK1E,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ7B,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2B;gBAGzC,QAAQ,EAAE,MAAM;IAKrC,OAAO,CAAC,OAAO;IAIf;;;OAGG;IACH,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,mBAAmB;IAK3B,IAAI,IAAI,IAAI,MAAM,CAGjB;IAED,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAKvB,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS;IAKlC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMnC,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAK1B,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAgBpG,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAI3C,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC;IAI9B,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIlC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAKrD,OAAO;CAIV"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { assert } from "@fluidframework/common-utils";
|
|
6
|
+
/**
|
|
7
|
+
* An extension of Map that expires (deletes) entries after a period of inactivity.
|
|
8
|
+
* The policy is based on the last time a key was written to.
|
|
9
|
+
*/
|
|
10
|
+
export class MapWithExpiration extends Map {
|
|
11
|
+
constructor(expiryMs) {
|
|
12
|
+
super();
|
|
13
|
+
this.expiryMs = expiryMs;
|
|
14
|
+
/** Timestamps (as epoch ms numbers) of when each key was last refreshed */
|
|
15
|
+
this.lastRefreshedTimes = new Map();
|
|
16
|
+
}
|
|
17
|
+
refresh(key) {
|
|
18
|
+
this.lastRefreshedTimes.set(key, (new Date()).valueOf());
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns true if the key is present and expired, false if it's not expired, and undefined if it's not found
|
|
22
|
+
* If cleanUp is passed as true, then delete any expired entry before returning.
|
|
23
|
+
*/
|
|
24
|
+
checkExpiry(key, cleanUp = false) {
|
|
25
|
+
const refreshTime = this.lastRefreshedTimes.get(key);
|
|
26
|
+
assert((refreshTime !== undefined) === super.has(key), 0x50c /* freshness map out of sync */);
|
|
27
|
+
if (refreshTime === undefined) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
const expired = (new Date()).valueOf() - refreshTime >= this.expiryMs;
|
|
31
|
+
if (expired && cleanUp) {
|
|
32
|
+
this.delete(key);
|
|
33
|
+
}
|
|
34
|
+
return expired;
|
|
35
|
+
}
|
|
36
|
+
clearExpiredEntries() {
|
|
37
|
+
// forEach clears out any expired entries
|
|
38
|
+
this.forEach(() => { });
|
|
39
|
+
}
|
|
40
|
+
get size() {
|
|
41
|
+
this.clearExpiredEntries();
|
|
42
|
+
return super.size;
|
|
43
|
+
}
|
|
44
|
+
has(key) {
|
|
45
|
+
this.checkExpiry(key, true /* cleanUp */);
|
|
46
|
+
return super.has(key);
|
|
47
|
+
}
|
|
48
|
+
get(key) {
|
|
49
|
+
this.checkExpiry(key, true /* cleanUp */);
|
|
50
|
+
return super.get(key);
|
|
51
|
+
}
|
|
52
|
+
set(key, value) {
|
|
53
|
+
// Sliding window expiration policy (on write)
|
|
54
|
+
this.refresh(key);
|
|
55
|
+
return super.set(key, value);
|
|
56
|
+
}
|
|
57
|
+
delete(key) {
|
|
58
|
+
this.lastRefreshedTimes.delete(key);
|
|
59
|
+
return super.delete(key);
|
|
60
|
+
}
|
|
61
|
+
clear() {
|
|
62
|
+
this.lastRefreshedTimes.clear();
|
|
63
|
+
super.clear();
|
|
64
|
+
}
|
|
65
|
+
forEach(callbackfn, thisArg) {
|
|
66
|
+
const expiredKeys = [];
|
|
67
|
+
super.forEach((v, k, m) => {
|
|
68
|
+
if (this.checkExpiry(k) === true) {
|
|
69
|
+
expiredKeys.push(k);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
callbackfn.bind(thisArg)(v, k, m);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
// Clean up keys we know are expired now that we're done iterating
|
|
76
|
+
expiredKeys.forEach((key) => { this.delete(key); });
|
|
77
|
+
}
|
|
78
|
+
entries() {
|
|
79
|
+
this.clearExpiredEntries();
|
|
80
|
+
return super.entries();
|
|
81
|
+
}
|
|
82
|
+
keys() {
|
|
83
|
+
this.clearExpiredEntries();
|
|
84
|
+
return super.keys();
|
|
85
|
+
}
|
|
86
|
+
values() {
|
|
87
|
+
this.clearExpiredEntries();
|
|
88
|
+
return super.values();
|
|
89
|
+
}
|
|
90
|
+
[Symbol.iterator]() {
|
|
91
|
+
this.clearExpiredEntries();
|
|
92
|
+
return super[Symbol.iterator]();
|
|
93
|
+
}
|
|
94
|
+
valueOf() {
|
|
95
|
+
this.clearExpiredEntries();
|
|
96
|
+
return super.valueOf();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=mapWithExpiration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapWithExpiration.js","sourceRoot":"","sources":["../src/mapWithExpiration.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 { assert } from \"@fluidframework/common-utils\";\n\n/**\n * An extension of Map that expires (deletes) entries after a period of inactivity.\n * The policy is based on the last time a key was written to.\n */\nexport class MapWithExpiration<TKey = any, TValue = any> extends Map<TKey, TValue> {\n /** Timestamps (as epoch ms numbers) of when each key was last refreshed */\n private readonly lastRefreshedTimes = new Map<TKey, number>();\n\n constructor(\n private readonly expiryMs: number,\n ) {\n super();\n }\n\n private refresh(key: TKey): void {\n this.lastRefreshedTimes.set(key, (new Date()).valueOf());\n }\n\n /**\n * Returns true if the key is present and expired, false if it's not expired, and undefined if it's not found\n * If cleanUp is passed as true, then delete any expired entry before returning.\n */\n private checkExpiry(key: TKey, cleanUp: boolean = false): boolean | undefined {\n const refreshTime = this.lastRefreshedTimes.get(key);\n assert((refreshTime !== undefined) === super.has(key), 0x50c /* freshness map out of sync */);\n\n if (refreshTime === undefined) {\n return undefined;\n }\n const expired = (new Date()).valueOf() - refreshTime >= this.expiryMs;\n if (expired && cleanUp) {\n this.delete(key);\n }\n return expired;\n }\n\n private clearExpiredEntries() {\n // forEach clears out any expired entries\n this.forEach(() => {});\n }\n\n get size(): number {\n this.clearExpiredEntries();\n return super.size;\n }\n\n has(key: TKey): boolean {\n this.checkExpiry(key, true /* cleanUp */);\n return super.has(key);\n }\n\n get(key: TKey): TValue | undefined {\n this.checkExpiry(key, true /* cleanUp */);\n return super.get(key);\n }\n\n set(key: TKey, value: TValue): this {\n // Sliding window expiration policy (on write)\n this.refresh(key);\n return super.set(key, value);\n }\n\n delete(key: TKey): boolean {\n this.lastRefreshedTimes.delete(key);\n return super.delete(key);\n }\n\n clear(): void {\n this.lastRefreshedTimes.clear();\n super.clear();\n }\n\n forEach(callbackfn: (value: TValue, key: TKey, map: Map<TKey, TValue>) => void, thisArg?: any): void {\n const expiredKeys: TKey[] = [];\n super.forEach((v, k, m) => {\n if (this.checkExpiry(k) === true) {\n expiredKeys.push(k);\n } else {\n callbackfn.bind(thisArg)(v, k, m);\n }\n },\n // Note we don't pass thisArg here, since we bind it directly to callbackFn and don't need it otherwise\n );\n\n // Clean up keys we know are expired now that we're done iterating\n expiredKeys.forEach((key: TKey) => { this.delete(key); });\n }\n\n entries(): IterableIterator<[TKey, TValue]> {\n this.clearExpiredEntries();\n return super.entries();\n }\n keys(): IterableIterator<TKey> {\n this.clearExpiredEntries();\n return super.keys();\n }\n values(): IterableIterator<TValue> {\n this.clearExpiredEntries();\n return super.values();\n }\n [Symbol.iterator](): IterableIterator<[TKey, TValue]> {\n this.clearExpiredEntries();\n return super[Symbol.iterator]();\n }\n\n valueOf() {\n this.clearExpiredEntries();\n return super.valueOf();\n }\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-internal.2.
|
|
8
|
+
export declare const pkgVersion = "2.0.0-internal.2.3.1";
|
|
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-internal.2.
|
|
8
|
+
export const pkgVersion = "2.0.0-internal.2.3.1";
|
|
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,sBAAsB,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-internal.2.
|
|
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,sBAAsB,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-internal.2.3.1\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/driver-utils",
|
|
3
|
-
"version": "2.0.0-internal.2.
|
|
3
|
+
"version": "2.0.0-internal.2.3.1",
|
|
4
4
|
"description": "Collection of utility functions for Fluid drivers",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -64,12 +64,12 @@
|
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
66
66
|
"@fluidframework/common-utils": "^1.0.0",
|
|
67
|
-
"@fluidframework/core-interfaces": ">=2.0.0-internal.2.
|
|
68
|
-
"@fluidframework/driver-definitions": ">=2.0.0-internal.2.
|
|
67
|
+
"@fluidframework/core-interfaces": ">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0",
|
|
68
|
+
"@fluidframework/driver-definitions": ">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0",
|
|
69
69
|
"@fluidframework/gitresources": "^0.1038.2000",
|
|
70
70
|
"@fluidframework/protocol-base": "^0.1038.2000",
|
|
71
71
|
"@fluidframework/protocol-definitions": "^1.1.0",
|
|
72
|
-
"@fluidframework/telemetry-utils": ">=2.0.0-internal.2.
|
|
72
|
+
"@fluidframework/telemetry-utils": ">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0",
|
|
73
73
|
"axios": "^0.26.0",
|
|
74
74
|
"url": "^0.11.0",
|
|
75
75
|
"uuid": "^8.3.1"
|
|
@@ -78,14 +78,15 @@
|
|
|
78
78
|
"@fluid-tools/build-cli": "^0.7.0",
|
|
79
79
|
"@fluidframework/build-common": "^1.1.0",
|
|
80
80
|
"@fluidframework/build-tools": "^0.7.0",
|
|
81
|
-
"@fluidframework/driver-utils-previous": "npm:@fluidframework/driver-utils@2.0.0-internal.2.
|
|
82
|
-
"@fluidframework/eslint-config-fluid": "^
|
|
83
|
-
"@fluidframework/mocha-test-setup": ">=2.0.0-internal.2.
|
|
84
|
-
"@fluidframework/runtime-utils": ">=2.0.0-internal.2.
|
|
81
|
+
"@fluidframework/driver-utils-previous": "npm:@fluidframework/driver-utils@2.0.0-internal.2.3.0",
|
|
82
|
+
"@fluidframework/eslint-config-fluid": "^2.0.0",
|
|
83
|
+
"@fluidframework/mocha-test-setup": ">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0",
|
|
84
|
+
"@fluidframework/runtime-utils": ">=2.0.0-internal.2.3.1 <2.0.0-internal.3.0.0",
|
|
85
85
|
"@microsoft/api-extractor": "^7.22.2",
|
|
86
86
|
"@rushstack/eslint-config": "^2.5.1",
|
|
87
87
|
"@types/mocha": "^9.1.1",
|
|
88
88
|
"@types/node": "^14.18.0",
|
|
89
|
+
"@types/sinon": "^7.0.13",
|
|
89
90
|
"concurrently": "^6.2.0",
|
|
90
91
|
"copyfiles": "^2.4.1",
|
|
91
92
|
"cross-env": "^7.0.2",
|
|
@@ -94,11 +95,12 @@
|
|
|
94
95
|
"nyc": "^15.0.0",
|
|
95
96
|
"prettier": "~2.6.2",
|
|
96
97
|
"rimraf": "^2.6.2",
|
|
98
|
+
"sinon": "^7.4.2",
|
|
97
99
|
"typescript": "~4.5.5"
|
|
98
100
|
},
|
|
99
101
|
"typeValidation": {
|
|
100
|
-
"version": "2.0.0-internal.2.
|
|
101
|
-
"baselineRange": "2.0.0-internal.2.
|
|
102
|
+
"version": "2.0.0-internal.2.3.1",
|
|
103
|
+
"baselineRange": "2.0.0-internal.2.3.0",
|
|
102
104
|
"broken": {}
|
|
103
105
|
}
|
|
104
106
|
}
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ export { EmptyDocumentDeltaStorageService } from "./emptyDocumentDeltaStorageSer
|
|
|
11
11
|
export { UsageError } from "./error";
|
|
12
12
|
export { ensureFluidResolvedUrl, isFluidResolvedUrl } from "./fluidResolvedUrl";
|
|
13
13
|
export { InsecureUrlResolver } from "./insecureUrlResolver";
|
|
14
|
+
export { MapWithExpiration } from "./mapWithExpiration";
|
|
14
15
|
export {
|
|
15
16
|
canBeCoalescedByService,
|
|
16
17
|
isRuntimeMessage,
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { assert } from "@fluidframework/common-utils";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* An extension of Map that expires (deletes) entries after a period of inactivity.
|
|
10
|
+
* The policy is based on the last time a key was written to.
|
|
11
|
+
*/
|
|
12
|
+
export class MapWithExpiration<TKey = any, TValue = any> extends Map<TKey, TValue> {
|
|
13
|
+
/** Timestamps (as epoch ms numbers) of when each key was last refreshed */
|
|
14
|
+
private readonly lastRefreshedTimes = new Map<TKey, number>();
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
private readonly expiryMs: number,
|
|
18
|
+
) {
|
|
19
|
+
super();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private refresh(key: TKey): void {
|
|
23
|
+
this.lastRefreshedTimes.set(key, (new Date()).valueOf());
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Returns true if the key is present and expired, false if it's not expired, and undefined if it's not found
|
|
28
|
+
* If cleanUp is passed as true, then delete any expired entry before returning.
|
|
29
|
+
*/
|
|
30
|
+
private checkExpiry(key: TKey, cleanUp: boolean = false): boolean | undefined {
|
|
31
|
+
const refreshTime = this.lastRefreshedTimes.get(key);
|
|
32
|
+
assert((refreshTime !== undefined) === super.has(key), 0x50c /* freshness map out of sync */);
|
|
33
|
+
|
|
34
|
+
if (refreshTime === undefined) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const expired = (new Date()).valueOf() - refreshTime >= this.expiryMs;
|
|
38
|
+
if (expired && cleanUp) {
|
|
39
|
+
this.delete(key);
|
|
40
|
+
}
|
|
41
|
+
return expired;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private clearExpiredEntries() {
|
|
45
|
+
// forEach clears out any expired entries
|
|
46
|
+
this.forEach(() => {});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
get size(): number {
|
|
50
|
+
this.clearExpiredEntries();
|
|
51
|
+
return super.size;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
has(key: TKey): boolean {
|
|
55
|
+
this.checkExpiry(key, true /* cleanUp */);
|
|
56
|
+
return super.has(key);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
get(key: TKey): TValue | undefined {
|
|
60
|
+
this.checkExpiry(key, true /* cleanUp */);
|
|
61
|
+
return super.get(key);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
set(key: TKey, value: TValue): this {
|
|
65
|
+
// Sliding window expiration policy (on write)
|
|
66
|
+
this.refresh(key);
|
|
67
|
+
return super.set(key, value);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
delete(key: TKey): boolean {
|
|
71
|
+
this.lastRefreshedTimes.delete(key);
|
|
72
|
+
return super.delete(key);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
clear(): void {
|
|
76
|
+
this.lastRefreshedTimes.clear();
|
|
77
|
+
super.clear();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
forEach(callbackfn: (value: TValue, key: TKey, map: Map<TKey, TValue>) => void, thisArg?: any): void {
|
|
81
|
+
const expiredKeys: TKey[] = [];
|
|
82
|
+
super.forEach((v, k, m) => {
|
|
83
|
+
if (this.checkExpiry(k) === true) {
|
|
84
|
+
expiredKeys.push(k);
|
|
85
|
+
} else {
|
|
86
|
+
callbackfn.bind(thisArg)(v, k, m);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
// Note we don't pass thisArg here, since we bind it directly to callbackFn and don't need it otherwise
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
// Clean up keys we know are expired now that we're done iterating
|
|
93
|
+
expiredKeys.forEach((key: TKey) => { this.delete(key); });
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
entries(): IterableIterator<[TKey, TValue]> {
|
|
97
|
+
this.clearExpiredEntries();
|
|
98
|
+
return super.entries();
|
|
99
|
+
}
|
|
100
|
+
keys(): IterableIterator<TKey> {
|
|
101
|
+
this.clearExpiredEntries();
|
|
102
|
+
return super.keys();
|
|
103
|
+
}
|
|
104
|
+
values(): IterableIterator<TValue> {
|
|
105
|
+
this.clearExpiredEntries();
|
|
106
|
+
return super.values();
|
|
107
|
+
}
|
|
108
|
+
[Symbol.iterator](): IterableIterator<[TKey, TValue]> {
|
|
109
|
+
this.clearExpiredEntries();
|
|
110
|
+
return super[Symbol.iterator]();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
valueOf() {
|
|
114
|
+
this.clearExpiredEntries();
|
|
115
|
+
return super.valueOf();
|
|
116
|
+
}
|
|
117
|
+
}
|
package/src/packageVersion.ts
CHANGED