@fluidframework/driver-utils 2.118.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -4
- package/README.md +53 -50
- package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
- package/dist/adapters/compression/documentServiceCompressionAdapter.js +1 -0
- package/dist/adapters/compression/documentServiceCompressionAdapter.js.map +1 -1
- package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.js +1 -0
- package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.js.map +1 -1
- package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts.map +1 -1
- package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js +49 -51
- package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js.map +1 -1
- package/dist/adapters/predefinedAdapters.js +2 -3
- package/dist/adapters/predefinedAdapters.js.map +1 -1
- package/dist/blob.js +13 -6
- package/dist/blob.js.map +1 -1
- package/dist/buildSnapshotTree.js +1 -2
- package/dist/buildSnapshotTree.js.map +1 -1
- package/dist/cacheUtils.js +2 -2
- package/dist/cacheUtils.js.map +1 -1
- package/dist/documentServiceFactoryProxy.js +1 -0
- package/dist/documentServiceFactoryProxy.js.map +1 -1
- package/dist/documentServiceProxy.js +1 -0
- package/dist/documentServiceProxy.js.map +1 -1
- package/dist/documentStorageServiceProxy.js +2 -0
- package/dist/documentStorageServiceProxy.js.map +1 -1
- package/dist/error.js +2 -2
- package/dist/error.js.map +1 -1
- package/dist/insecureUrlResolver.js +8 -1
- package/dist/insecureUrlResolver.js.map +1 -1
- package/dist/messageRecognition.js +2 -3
- package/dist/messageRecognition.js.map +1 -1
- package/dist/network.d.ts.map +1 -1
- package/dist/network.js +26 -18
- package/dist/network.js.map +1 -1
- package/dist/networkUtils.js +1 -2
- package/dist/networkUtils.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/parallelRequests.js +20 -13
- package/dist/parallelRequests.js.map +1 -1
- package/dist/prefetchDocumentStorageService.js +3 -6
- package/dist/prefetchDocumentStorageService.js.map +1 -1
- package/dist/protocol/gitHelper.js +3 -4
- package/dist/protocol/gitHelper.js.map +1 -1
- package/dist/rateLimiter.js +11 -10
- package/dist/rateLimiter.js.map +1 -1
- package/dist/readAndParse.js +1 -2
- package/dist/readAndParse.js.map +1 -1
- package/dist/runWithRetry.js +2 -3
- package/dist/runWithRetry.js.map +1 -1
- package/dist/storageUtils.js +2 -3
- package/dist/storageUtils.js.map +1 -1
- package/dist/summaryForCreateNew.js +3 -4
- package/dist/summaryForCreateNew.js.map +1 -1
- package/dist/treeConversions.js +1 -2
- package/dist/treeConversions.js.map +1 -1
- package/lib/adapters/compression/documentServiceCompressionAdapter.js +1 -0
- package/lib/adapters/compression/documentServiceCompressionAdapter.js.map +1 -1
- package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.js +1 -0
- package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.js.map +1 -1
- package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts.map +1 -1
- package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js +50 -52
- package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js.map +1 -1
- package/lib/blob.js +13 -6
- package/lib/blob.js.map +1 -1
- package/lib/documentServiceFactoryProxy.js +1 -0
- package/lib/documentServiceFactoryProxy.js.map +1 -1
- package/lib/documentServiceProxy.js +1 -0
- package/lib/documentServiceProxy.js.map +1 -1
- package/lib/documentStorageServiceProxy.js +2 -0
- package/lib/documentStorageServiceProxy.js.map +1 -1
- package/lib/error.js +2 -2
- package/lib/error.js.map +1 -1
- package/lib/insecureUrlResolver.js +8 -1
- package/lib/insecureUrlResolver.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/network.d.ts.map +1 -1
- package/lib/network.js +23 -15
- package/lib/network.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/parallelRequests.js +16 -9
- package/lib/parallelRequests.js.map +1 -1
- package/lib/prefetchDocumentStorageService.js +3 -6
- package/lib/prefetchDocumentStorageService.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/rateLimiter.js +11 -10
- package/lib/rateLimiter.js.map +1 -1
- package/package.json +29 -42
- package/src/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.ts +16 -16
- package/src/packageVersion.ts +1 -1
- package/tsconfig.json +1 -1
- package/internal.d.ts +0 -11
- package/legacy.d.ts +0 -11
- /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
- /package/api-extractor/{api-extractor.legacy.json → api-extractor-report.legacy.json} +0 -0
|
@@ -9,12 +9,9 @@ import { canRetryOnError } from "./network.js";
|
|
|
9
9
|
* @internal
|
|
10
10
|
*/
|
|
11
11
|
export class PrefetchDocumentStorageService extends DocumentStorageServiceProxy {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
this.prefetchCache = new Map();
|
|
16
|
-
this.prefetchEnabled = true;
|
|
17
|
-
}
|
|
12
|
+
// BlobId -> blob prefetchCache cache
|
|
13
|
+
prefetchCache = new Map();
|
|
14
|
+
prefetchEnabled = true;
|
|
18
15
|
get policies() {
|
|
19
16
|
const policies = this.internalStorageService.policies;
|
|
20
17
|
if (policies) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefetchDocumentStorageService.js","sourceRoot":"","sources":["../src/prefetchDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,2BAA2B;
|
|
1
|
+
{"version":3,"file":"prefetchDocumentStorageService.js","sourceRoot":"","sources":["../src/prefetchDocumentStorageService.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 type {\n\tIDocumentStorageServicePolicies,\n\tISnapshotTree,\n\tIVersion,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { LoaderCachingPolicy } from \"@fluidframework/driver-definitions/internal\";\n\nimport { DocumentStorageServiceProxy } from \"./documentStorageServiceProxy.js\";\nimport { canRetryOnError } from \"./network.js\";\n\n/**\n * @internal\n */\nexport class PrefetchDocumentStorageService extends DocumentStorageServiceProxy {\n\t// BlobId -> blob prefetchCache cache\n\tprivate readonly prefetchCache = new Map<string, Promise<ArrayBufferLike>>();\n\tprivate prefetchEnabled = true;\n\n\tpublic get policies(): IDocumentStorageServicePolicies | undefined {\n\t\tconst policies = this.internalStorageService.policies;\n\t\tif (policies) {\n\t\t\treturn { ...policies, caching: LoaderCachingPolicy.NoCaching };\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @rushstack/no-new-null -- TODO: use `undefined` instead\n\tpublic async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n\t\tconst p = this.internalStorageService.getSnapshotTree(version);\n\t\tif (this.prefetchEnabled) {\n\t\t\t// Fire-and-forget prefetch - we don't care if it succeeds.\n\t\t\t// The .catch() prevents unhandled rejection when p rejects, since\n\t\t\t// p.then() creates a derived promise that also rejects if p rejects.\n\t\t\t// Callers awaiting the returned p will still receive the error.\n\t\t\tp.then((tree: ISnapshotTree | null | undefined) => {\n\t\t\t\tif (tree === null || tree === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.prefetchTree(tree);\n\t\t\t}).catch(() => {\n\t\t\t\t// Intentionally empty - error will be handled by caller awaiting p\n\t\t\t});\n\t\t}\n\t\treturn p;\n\t}\n\n\tpublic async readBlob(blobId: string): Promise<ArrayBufferLike> {\n\t\treturn this.cachedRead(blobId);\n\t}\n\tpublic stopPrefetch(): void {\n\t\tthis.prefetchEnabled = false;\n\t\tthis.prefetchCache.clear();\n\t}\n\n\tprivate async cachedRead(blobId: string): Promise<ArrayBufferLike> {\n\t\tif (this.prefetchEnabled) {\n\t\t\tconst prefetchedBlobP = this.prefetchCache.get(blobId);\n\t\t\tif (prefetchedBlobP !== undefined) {\n\t\t\t\treturn prefetchedBlobP;\n\t\t\t}\n\t\t\tconst prefetchedBlobPFromStorage = this.internalStorageService.readBlob(blobId);\n\t\t\t// Attach error handler for side effects only:\n\t\t\t// 1. Clear cache on retryable errors so next read retries\n\t\t\t// 2. Prevent unhandled rejection warning for fire-and-forget prefetch\n\t\t\t// Note: Callers who await the cached promise will still see the rejection\n\t\t\tprefetchedBlobPFromStorage.catch((error) => {\n\t\t\t\t// Only clear cache if our promise is still the cached one\n\t\t\t\t// (avoids race condition with concurrent requests)\n\t\t\t\tif (\n\t\t\t\t\tcanRetryOnError(error) &&\n\t\t\t\t\tthis.prefetchCache.get(blobId) === prefetchedBlobPFromStorage\n\t\t\t\t) {\n\t\t\t\t\tthis.prefetchCache.delete(blobId);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.prefetchCache.set(blobId, prefetchedBlobPFromStorage);\n\t\t\treturn prefetchedBlobPFromStorage;\n\t\t}\n\t\treturn this.internalStorageService.readBlob(blobId);\n\t}\n\n\tprivate prefetchTree(tree: ISnapshotTree): void {\n\t\tconst secondary: string[] = [];\n\t\tthis.prefetchTreeCore(tree, secondary);\n\n\t\tfor (const blob of secondary) {\n\t\t\t// Skip if already cached (avoids unnecessary async overhead)\n\t\t\tif (this.prefetchCache.has(blob)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Fire-and-forget prefetch. The .catch() prevents unhandled rejection\n\t\t\t// since cachedRead is async and returns a separate promise chain.\n\t\t\tthis.cachedRead(blob).catch(() => {});\n\t\t}\n\t}\n\n\tprivate prefetchTreeCore(tree: ISnapshotTree, secondary: string[]): void {\n\t\tfor (const [blobKey, blob] of Object.entries(tree.blobs)) {\n\t\t\tif (blobKey.startsWith(\".\") || blobKey === \"header\" || blobKey.startsWith(\"quorum\")) {\n\t\t\t\t// Skip if already cached (avoids unnecessary async overhead)\n\t\t\t\tif (blob !== null && !this.prefetchCache.has(blob)) {\n\t\t\t\t\t// Fire-and-forget prefetch. The .catch() prevents unhandled rejection\n\t\t\t\t\t// since cachedRead is async and returns a separate promise chain.\n\t\t\t\t\tthis.cachedRead(blob).catch(() => {});\n\t\t\t\t}\n\t\t\t} else if (!blobKey.startsWith(\"deltas\") && blob !== null) {\n\t\t\t\tsecondary.push(blob);\n\t\t\t}\n\t\t}\n\n\t\tfor (const subTree of Object.values(tree.trees)) {\n\t\t\tthis.prefetchTreeCore(subTree, secondary);\n\t\t}\n\t}\n}\n"]}
|
package/lib/public.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
/*
|
|
7
7
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib
|
|
8
|
+
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib" in @fluid-tools/build-cli.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
export {
|
package/lib/rateLimiter.js
CHANGED
|
@@ -7,23 +7,24 @@ import { assert } from "@fluidframework/core-utils/internal";
|
|
|
7
7
|
* @legacy @beta
|
|
8
8
|
*/
|
|
9
9
|
export class RateLimiter {
|
|
10
|
+
maxRequests;
|
|
11
|
+
tasks = [];
|
|
10
12
|
constructor(maxRequests) {
|
|
11
13
|
this.maxRequests = maxRequests;
|
|
12
|
-
this.tasks = [];
|
|
13
|
-
// Run when one of the tasks finished running.
|
|
14
|
-
// Release next task if we have one, or allow more tasks to run in future.
|
|
15
|
-
this.release = () => {
|
|
16
|
-
const task = this.tasks.shift();
|
|
17
|
-
if (task !== undefined) {
|
|
18
|
-
return task();
|
|
19
|
-
}
|
|
20
|
-
this.maxRequests++;
|
|
21
|
-
};
|
|
22
14
|
assert(maxRequests > 0, 0x0ae /* "Tried to create rate limiter with 0 max requests!" */);
|
|
23
15
|
}
|
|
24
16
|
get waitQueueLength() {
|
|
25
17
|
return this.tasks.length;
|
|
26
18
|
}
|
|
19
|
+
// Run when one of the tasks finished running.
|
|
20
|
+
// Release next task if we have one, or allow more tasks to run in future.
|
|
21
|
+
release = () => {
|
|
22
|
+
const task = this.tasks.shift();
|
|
23
|
+
if (task !== undefined) {
|
|
24
|
+
return task();
|
|
25
|
+
}
|
|
26
|
+
this.maxRequests++;
|
|
27
|
+
};
|
|
27
28
|
async acquire() {
|
|
28
29
|
if (this.maxRequests > 0) {
|
|
29
30
|
this.maxRequests--;
|
package/lib/rateLimiter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../src/rateLimiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D;;GAEG;AACH,MAAM,OAAO,WAAW;
|
|
1
|
+
{"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../src/rateLimiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D;;GAEG;AACH,MAAM,OAAO,WAAW;IAEH;IADH,KAAK,GAAmB,EAAE,CAAC;IAC5C,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QACtC,MAAM,CAAC,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC1F,CAAC;IAED,IAAW,eAAe;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,8CAA8C;IAC9C,0EAA0E;IACvD,OAAO,GAAG,GAAS,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,IAAI,EAAE,CAAC;QACf,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC;IAEQ,KAAK,CAAC,OAAO;QACtB,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACR,CAAC;QAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAI,IAAsB;QAC9C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\n/**\n * @legacy @beta\n */\nexport class RateLimiter {\n\tprivate readonly tasks: (() => void)[] = [];\n\tconstructor(private maxRequests: number) {\n\t\tassert(maxRequests > 0, 0x0ae /* \"Tried to create rate limiter with 0 max requests!\" */);\n\t}\n\n\tpublic get waitQueueLength(): number {\n\t\treturn this.tasks.length;\n\t}\n\n\t// Run when one of the tasks finished running.\n\t// Release next task if we have one, or allow more tasks to run in future.\n\tprotected readonly release = (): void => {\n\t\tconst task = this.tasks.shift();\n\t\tif (task !== undefined) {\n\t\t\treturn task();\n\t\t}\n\t\tthis.maxRequests++;\n\t};\n\n\tprotected async acquire(): Promise<void> {\n\t\tif (this.maxRequests > 0) {\n\t\t\tthis.maxRequests--;\n\t\t\treturn;\n\t\t}\n\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.tasks.push(resolve);\n\t\t});\n\t}\n\n\tpublic async schedule<T>(work: () => Promise<T>): Promise<T> {\n\t\tawait this.acquire();\n\t\treturn work().finally(this.release);\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/driver-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Collection of utility functions for Fluid drivers",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -14,38 +14,24 @@
|
|
|
14
14
|
"type": "module",
|
|
15
15
|
"exports": {
|
|
16
16
|
".": {
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"require": {
|
|
22
|
-
"types": "./dist/public.d.ts",
|
|
23
|
-
"default": "./dist/index.js"
|
|
17
|
+
"types": "./lib/public.d.ts",
|
|
18
|
+
"default": "./lib/index.js",
|
|
19
|
+
"internal-entrypoint-generation": {
|
|
20
|
+
"types": "./dist/public.d.ts"
|
|
24
21
|
}
|
|
25
22
|
},
|
|
26
23
|
"./legacy": {
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"require": {
|
|
32
|
-
"types": "./dist/legacy.d.ts",
|
|
33
|
-
"default": "./dist/index.js"
|
|
24
|
+
"types": "./lib/legacy.d.ts",
|
|
25
|
+
"default": "./lib/index.js",
|
|
26
|
+
"internal-entrypoint-generation": {
|
|
27
|
+
"types": "./dist/legacy.d.ts"
|
|
34
28
|
}
|
|
35
29
|
},
|
|
36
30
|
"./internal": {
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
"default": "./lib/index.js"
|
|
40
|
-
},
|
|
41
|
-
"require": {
|
|
42
|
-
"types": "./dist/index.d.ts",
|
|
43
|
-
"default": "./dist/index.js"
|
|
44
|
-
}
|
|
31
|
+
"types": "./lib/index.d.ts",
|
|
32
|
+
"default": "./lib/index.js"
|
|
45
33
|
}
|
|
46
34
|
},
|
|
47
|
-
"main": "lib/index.js",
|
|
48
|
-
"types": "lib/public.d.ts",
|
|
49
35
|
"c8": {
|
|
50
36
|
"all": true,
|
|
51
37
|
"cache-dir": "nyc/.cache",
|
|
@@ -69,18 +55,18 @@
|
|
|
69
55
|
"temp-directory": "nyc/.nyc_output"
|
|
70
56
|
},
|
|
71
57
|
"dependencies": {
|
|
72
|
-
"@fluid-internal/client-utils": "~
|
|
73
|
-
"@fluidframework/core-interfaces": "~
|
|
74
|
-
"@fluidframework/core-utils": "~
|
|
75
|
-
"@fluidframework/driver-definitions": "~
|
|
76
|
-
"@fluidframework/telemetry-utils": "~
|
|
58
|
+
"@fluid-internal/client-utils": "~3.0.0",
|
|
59
|
+
"@fluidframework/core-interfaces": "~3.0.0",
|
|
60
|
+
"@fluidframework/core-utils": "~3.0.0",
|
|
61
|
+
"@fluidframework/driver-definitions": "~3.0.0",
|
|
62
|
+
"@fluidframework/telemetry-utils": "~3.0.0",
|
|
77
63
|
"lz4js": "^0.2.0",
|
|
78
64
|
"uuid": "^11.1.0"
|
|
79
65
|
},
|
|
80
66
|
"devDependencies": {
|
|
81
67
|
"@arethetypeswrong/cli": "^0.18.5",
|
|
82
68
|
"@biomejs/biome": "~2.4.5",
|
|
83
|
-
"@fluid-internal/mocha-test-setup": "~
|
|
69
|
+
"@fluid-internal/mocha-test-setup": "~3.0.0",
|
|
84
70
|
"@fluid-tools/build-cli": "^0.67.0",
|
|
85
71
|
"@fluidframework/build-common": "^2.0.3",
|
|
86
72
|
"@fluidframework/build-tools": "^0.67.0",
|
|
@@ -101,7 +87,7 @@
|
|
|
101
87
|
"mocha-multi-reporters": "^1.5.1",
|
|
102
88
|
"rimraf": "^6.1.3",
|
|
103
89
|
"sinon": "^18.0.1",
|
|
104
|
-
"typescript": "~
|
|
90
|
+
"typescript": "~6.0.3"
|
|
105
91
|
},
|
|
106
92
|
"typeValidation": {
|
|
107
93
|
"broken": {},
|
|
@@ -110,20 +96,21 @@
|
|
|
110
96
|
"scripts": {
|
|
111
97
|
"build": "fluid-build . --task build",
|
|
112
98
|
"build:api-reports": "concurrently \"npm:build:api-reports:*\"",
|
|
113
|
-
"build:api-reports:current": "api-extractor run --local --config api-extractor/api-extractor.current.json",
|
|
114
|
-
"build:api-reports:legacy": "api-extractor run --local --config api-extractor/api-extractor.legacy.json",
|
|
99
|
+
"build:api-reports:current": "api-extractor run --local --config api-extractor/api-extractor-report.current.json",
|
|
100
|
+
"build:api-reports:legacy": "api-extractor run --local --config api-extractor/api-extractor-report.legacy.json",
|
|
101
|
+
"build:cjs": "fluid-tsc commonjs --project ./tsconfig.cjs.json && copyfiles -f ../../../common/build/build-common/src/cjs/package.json ./dist",
|
|
115
102
|
"build:commonjs": "fluid-build . --task commonjs",
|
|
116
103
|
"build:compile": "fluid-build . --task compile",
|
|
117
|
-
"build:docs": "api-extractor run --local",
|
|
104
|
+
"build:docs": "api-extractor run --local --config api-extractor/api-extractor-model.json",
|
|
118
105
|
"build:entrypoints": "fluid-build . --task build:entrypoints",
|
|
119
106
|
"build:entrypoints:cjs": "flub generate entrypoints --resolutionConditions require --outFileLegacyBeta legacy --outDir ./dist",
|
|
120
|
-
"build:entrypoints:esm": "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib
|
|
121
|
-
"build:
|
|
107
|
+
"build:entrypoints:esm": "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib",
|
|
108
|
+
"build:esm": "tsc --project ./tsconfig.json",
|
|
122
109
|
"build:genver": "gen-version",
|
|
123
110
|
"build:test": "concurrently npm:build:test:esm npm:build:test:cjs",
|
|
124
111
|
"build:test:cjs": "fluid-tsc commonjs --project ./src/test/tsconfig.cjs.json",
|
|
125
112
|
"build:test:esm": "tsc --project ./src/test/tsconfig.json",
|
|
126
|
-
"check:are-the-types-wrong": "attw --pack .",
|
|
113
|
+
"check:are-the-types-wrong": "attw --pack . --profile esm-only",
|
|
127
114
|
"check:biome": "biome check .",
|
|
128
115
|
"check:exports": "concurrently \"npm:check:exports:*\"",
|
|
129
116
|
"check:exports:bundle-release-tags": "api-extractor run --config api-extractor/api-extractor-lint-bundle.json",
|
|
@@ -132,10 +119,11 @@
|
|
|
132
119
|
"check:exports:esm:legacy": "api-extractor run --config api-extractor/api-extractor-lint-legacy.esm.json",
|
|
133
120
|
"check:exports:esm:public": "api-extractor run --config api-extractor/api-extractor-lint-public.esm.json",
|
|
134
121
|
"check:format": "npm run check:biome",
|
|
122
|
+
"check:types:inexactOptionalPropertyTypes": "tsc --project ./tsconfig.json --noEmit --exactOptionalPropertyTypes false --skipLibCheck --emitDeclarationOnly false --tsBuildInfoFile ./tsconfig.inexactOptionalPropertyTypes.tsbuildinfo",
|
|
135
123
|
"ci:build:api-reports": "concurrently \"npm:ci:build:api-reports:*\"",
|
|
136
|
-
"ci:build:api-reports:current": "api-extractor run --config api-extractor/api-extractor.current.json",
|
|
137
|
-
"ci:build:api-reports:legacy": "api-extractor run --config api-extractor/api-extractor.legacy.json",
|
|
138
|
-
"ci:build:docs": "api-extractor run",
|
|
124
|
+
"ci:build:api-reports:current": "api-extractor run --config api-extractor/api-extractor-report.current.json",
|
|
125
|
+
"ci:build:api-reports:legacy": "api-extractor run --config api-extractor/api-extractor-report.legacy.json",
|
|
126
|
+
"ci:build:docs": "api-extractor run --config api-extractor/api-extractor-model.json",
|
|
139
127
|
"clean": "rimraf --glob dist lib {alpha,beta,internal,legacy}.d.ts \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc",
|
|
140
128
|
"eslint": "eslint --quiet --format stylish src",
|
|
141
129
|
"eslint:fix": "eslint --quiet --format stylish src --fix --fix-type problem,suggestion,layout",
|
|
@@ -149,7 +137,6 @@
|
|
|
149
137
|
"test:mocha:cjs": "cross-env FLUID_TEST_MODULE_SYSTEM=CJS mocha",
|
|
150
138
|
"test:mocha:esm": "mocha",
|
|
151
139
|
"test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
|
|
152
|
-
"tsc": "fluid-tsc commonjs --project ./tsconfig.cjs.json && copyfiles -f ../../../common/build/build-common/src/cjs/package.json ./dist",
|
|
153
140
|
"typetests:gen": "flub generate typetests --dir . -v"
|
|
154
141
|
}
|
|
155
142
|
}
|
package/src/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { IsoBuffer, Uint8ArrayToArrayBufferLike } from "@fluid-internal/client-utils";
|
|
7
7
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
8
8
|
import {
|
|
9
9
|
type ISummaryBlob,
|
|
@@ -89,7 +89,7 @@ export class DocumentStorageServiceCompressionAdapter extends DocumentStorageSer
|
|
|
89
89
|
private static writeAlgorithmToBlob(
|
|
90
90
|
blob: ArrayBufferLike,
|
|
91
91
|
algorithm: number,
|
|
92
|
-
): ArrayBufferLike
|
|
92
|
+
): ArrayBufferLike {
|
|
93
93
|
if (algorithm === SummaryCompressionAlgorithm.None) {
|
|
94
94
|
const firstByte = IsoBuffer.from(blob)[0];
|
|
95
95
|
// eslint-disable-next-line no-bitwise
|
|
@@ -105,7 +105,7 @@ export class DocumentStorageServiceCompressionAdapter extends DocumentStorageSer
|
|
|
105
105
|
const prefix = 0xb0 | algorithm;
|
|
106
106
|
newBlob[0] = prefix;
|
|
107
107
|
newBlob.set(blobView, 1);
|
|
108
|
-
return
|
|
108
|
+
return Uint8ArrayToArrayBufferLike(newBlob);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/**
|
|
@@ -113,11 +113,9 @@ export class DocumentStorageServiceCompressionAdapter extends DocumentStorageSer
|
|
|
113
113
|
* @param blob - The blob to remove the prefix from.
|
|
114
114
|
* @returns The blob without the prefix.
|
|
115
115
|
*/
|
|
116
|
-
private static removePrefixFromBlobIfPresent(
|
|
117
|
-
blob: ArrayBufferLike,
|
|
118
|
-
): ArrayBufferLike | Buffer {
|
|
116
|
+
private static removePrefixFromBlobIfPresent(blob: ArrayBufferLike): ArrayBufferLike {
|
|
119
117
|
const blobView = new Uint8Array(blob);
|
|
120
|
-
return this.hasPrefix(blob) ?
|
|
118
|
+
return this.hasPrefix(blob) ? Uint8ArrayToArrayBufferLike(blobView.subarray(1)) : blob;
|
|
121
119
|
}
|
|
122
120
|
|
|
123
121
|
/**
|
|
@@ -147,7 +145,10 @@ export class DocumentStorageServiceCompressionAdapter extends DocumentStorageSer
|
|
|
147
145
|
const original = DocumentStorageServiceCompressionAdapter.toBinaryArray(
|
|
148
146
|
summaryBlob.content,
|
|
149
147
|
);
|
|
150
|
-
const processed = DocumentStorageServiceCompressionAdapter.encodeBlob(
|
|
148
|
+
const processed = DocumentStorageServiceCompressionAdapter.encodeBlob(
|
|
149
|
+
Uint8ArrayToArrayBufferLike(original),
|
|
150
|
+
config,
|
|
151
|
+
);
|
|
151
152
|
const newSummaryBlob = {
|
|
152
153
|
type: SummaryType.Blob,
|
|
153
154
|
content: IsoBuffer.from(processed),
|
|
@@ -169,7 +170,9 @@ export class DocumentStorageServiceCompressionAdapter extends DocumentStorageSer
|
|
|
169
170
|
const original = DocumentStorageServiceCompressionAdapter.toBinaryArray(
|
|
170
171
|
summaryBlob.content,
|
|
171
172
|
);
|
|
172
|
-
const processed = DocumentStorageServiceCompressionAdapter.decodeBlob(
|
|
173
|
+
const processed = DocumentStorageServiceCompressionAdapter.decodeBlob(
|
|
174
|
+
Uint8ArrayToArrayBufferLike(original),
|
|
175
|
+
);
|
|
173
176
|
const newSummaryBlob = {
|
|
174
177
|
type: SummaryType.Blob,
|
|
175
178
|
content: IsoBuffer.from(processed),
|
|
@@ -198,8 +201,8 @@ export class DocumentStorageServiceCompressionAdapter extends DocumentStorageSer
|
|
|
198
201
|
} else if (algorithm === SummaryCompressionAlgorithm.None) {
|
|
199
202
|
maybeCompressed = file;
|
|
200
203
|
} else if (algorithm === SummaryCompressionAlgorithm.LZ4) {
|
|
201
|
-
const compressed = compress(
|
|
202
|
-
maybeCompressed = compressed;
|
|
204
|
+
const compressed = compress(new Uint8Array(file));
|
|
205
|
+
maybeCompressed = Uint8ArrayToArrayBufferLike(compressed);
|
|
203
206
|
} else {
|
|
204
207
|
throw new Error(`Unknown Algorithm ${config.algorithm}`);
|
|
205
208
|
}
|
|
@@ -217,8 +220,7 @@ export class DocumentStorageServiceCompressionAdapter extends DocumentStorageSer
|
|
|
217
220
|
*/
|
|
218
221
|
private static decodeBlob(file: ArrayBufferLike): ArrayBufferLike {
|
|
219
222
|
let decompressed: ArrayBufferLike;
|
|
220
|
-
|
|
221
|
-
let originalBlob: any;
|
|
223
|
+
let originalBlob: ArrayBufferLike;
|
|
222
224
|
let algorithm: SummaryCompressionAlgorithm;
|
|
223
225
|
if (this.hasPrefix(file)) {
|
|
224
226
|
algorithm = DocumentStorageServiceCompressionAdapter.readAlgorithmFromBlob(file);
|
|
@@ -228,11 +230,9 @@ export class DocumentStorageServiceCompressionAdapter extends DocumentStorageSer
|
|
|
228
230
|
originalBlob = file;
|
|
229
231
|
}
|
|
230
232
|
if (algorithm === SummaryCompressionAlgorithm.None) {
|
|
231
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
232
233
|
decompressed = originalBlob;
|
|
233
234
|
} else if (algorithm === SummaryCompressionAlgorithm.LZ4) {
|
|
234
|
-
|
|
235
|
-
decompressed = decompress(originalBlob) as ArrayBufferLike;
|
|
235
|
+
decompressed = Uint8ArrayToArrayBufferLike(decompress(new Uint8Array(originalBlob)));
|
|
236
236
|
} else {
|
|
237
237
|
throw new Error(`Unknown Algorithm ${algorithm}`);
|
|
238
238
|
}
|
package/src/packageVersion.ts
CHANGED
package/tsconfig.json
CHANGED
package/internal.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/*
|
|
7
|
-
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib --node10TypeCompat" in @fluid-tools/build-cli.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export * from "./lib/index.js";
|
package/legacy.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/*
|
|
7
|
-
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib --node10TypeCompat" in @fluid-tools/build-cli.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export * from "./lib/legacy.js";
|
|
File without changes
|
|
File without changes
|