@fluidframework/driver-utils 2.118.1 → 3.0.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.
Files changed (99) hide show
  1. package/CHANGELOG.md +34 -4
  2. package/README.md +53 -50
  3. package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
  4. package/dist/adapters/compression/documentServiceCompressionAdapter.js +1 -0
  5. package/dist/adapters/compression/documentServiceCompressionAdapter.js.map +1 -1
  6. package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.js +1 -0
  7. package/dist/adapters/compression/documentServiceFactoryCompressionAdapter.js.map +1 -1
  8. package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts.map +1 -1
  9. package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js +49 -51
  10. package/dist/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js.map +1 -1
  11. package/dist/adapters/predefinedAdapters.js +2 -3
  12. package/dist/adapters/predefinedAdapters.js.map +1 -1
  13. package/dist/blob.js +13 -6
  14. package/dist/blob.js.map +1 -1
  15. package/dist/buildSnapshotTree.js +1 -2
  16. package/dist/buildSnapshotTree.js.map +1 -1
  17. package/dist/cacheUtils.js +2 -2
  18. package/dist/cacheUtils.js.map +1 -1
  19. package/dist/documentServiceFactoryProxy.js +1 -0
  20. package/dist/documentServiceFactoryProxy.js.map +1 -1
  21. package/dist/documentServiceProxy.js +1 -0
  22. package/dist/documentServiceProxy.js.map +1 -1
  23. package/dist/documentStorageServiceProxy.js +2 -0
  24. package/dist/documentStorageServiceProxy.js.map +1 -1
  25. package/dist/error.js +2 -2
  26. package/dist/error.js.map +1 -1
  27. package/dist/insecureUrlResolver.js +8 -1
  28. package/dist/insecureUrlResolver.js.map +1 -1
  29. package/dist/messageRecognition.js +2 -3
  30. package/dist/messageRecognition.js.map +1 -1
  31. package/dist/network.d.ts.map +1 -1
  32. package/dist/network.js +26 -18
  33. package/dist/network.js.map +1 -1
  34. package/dist/networkUtils.js +1 -2
  35. package/dist/networkUtils.js.map +1 -1
  36. package/dist/packageVersion.d.ts +1 -1
  37. package/dist/packageVersion.d.ts.map +1 -1
  38. package/dist/packageVersion.js +1 -1
  39. package/dist/packageVersion.js.map +1 -1
  40. package/dist/parallelRequests.js +20 -13
  41. package/dist/parallelRequests.js.map +1 -1
  42. package/dist/prefetchDocumentStorageService.js +3 -6
  43. package/dist/prefetchDocumentStorageService.js.map +1 -1
  44. package/dist/protocol/gitHelper.js +3 -4
  45. package/dist/protocol/gitHelper.js.map +1 -1
  46. package/dist/rateLimiter.js +11 -10
  47. package/dist/rateLimiter.js.map +1 -1
  48. package/dist/readAndParse.js +1 -2
  49. package/dist/readAndParse.js.map +1 -1
  50. package/dist/runWithRetry.js +2 -3
  51. package/dist/runWithRetry.js.map +1 -1
  52. package/dist/storageUtils.js +2 -3
  53. package/dist/storageUtils.js.map +1 -1
  54. package/dist/summaryForCreateNew.js +3 -4
  55. package/dist/summaryForCreateNew.js.map +1 -1
  56. package/dist/treeConversions.js +1 -2
  57. package/dist/treeConversions.js.map +1 -1
  58. package/lib/adapters/compression/documentServiceCompressionAdapter.js +1 -0
  59. package/lib/adapters/compression/documentServiceCompressionAdapter.js.map +1 -1
  60. package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.js +1 -0
  61. package/lib/adapters/compression/documentServiceFactoryCompressionAdapter.js.map +1 -1
  62. package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.d.ts.map +1 -1
  63. package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js +50 -52
  64. package/lib/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.js.map +1 -1
  65. package/lib/blob.js +13 -6
  66. package/lib/blob.js.map +1 -1
  67. package/lib/documentServiceFactoryProxy.js +1 -0
  68. package/lib/documentServiceFactoryProxy.js.map +1 -1
  69. package/lib/documentServiceProxy.js +1 -0
  70. package/lib/documentServiceProxy.js.map +1 -1
  71. package/lib/documentStorageServiceProxy.js +2 -0
  72. package/lib/documentStorageServiceProxy.js.map +1 -1
  73. package/lib/error.js +2 -2
  74. package/lib/error.js.map +1 -1
  75. package/lib/insecureUrlResolver.js +8 -1
  76. package/lib/insecureUrlResolver.js.map +1 -1
  77. package/lib/legacy.d.ts +1 -1
  78. package/lib/network.d.ts.map +1 -1
  79. package/lib/network.js +23 -15
  80. package/lib/network.js.map +1 -1
  81. package/lib/packageVersion.d.ts +1 -1
  82. package/lib/packageVersion.d.ts.map +1 -1
  83. package/lib/packageVersion.js +1 -1
  84. package/lib/packageVersion.js.map +1 -1
  85. package/lib/parallelRequests.js +16 -9
  86. package/lib/parallelRequests.js.map +1 -1
  87. package/lib/prefetchDocumentStorageService.js +3 -6
  88. package/lib/prefetchDocumentStorageService.js.map +1 -1
  89. package/lib/public.d.ts +1 -1
  90. package/lib/rateLimiter.js +11 -10
  91. package/lib/rateLimiter.js.map +1 -1
  92. package/package.json +29 -42
  93. package/src/adapters/compression/summaryblob/documentStorageServiceSummaryBlobCompressionAdapter.ts +16 -16
  94. package/src/packageVersion.ts +1 -1
  95. package/tsconfig.json +1 -1
  96. package/internal.d.ts +0 -11
  97. package/legacy.d.ts +0 -11
  98. /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
  99. /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
- constructor() {
13
- super(...arguments);
14
- // BlobId -> blob prefetchCache cache
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":"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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"]}
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 --node10TypeCompat" in @fluid-tools/build-cli.
8
+ * Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib" in @fluid-tools/build-cli.
9
9
  */
10
10
 
11
11
  export {
@@ -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--;
@@ -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;IAEvB,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QADtB,UAAK,GAAmB,EAAE,CAAC;QAS5C,8CAA8C;QAC9C,0EAA0E;QACvD,YAAO,GAAG,GAAS,EAAE;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,IAAI,EAAE,CAAC;YACf,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC,CAAC;QAfD,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;IAYS,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"]}
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": "2.118.1",
3
+ "version": "3.0.1",
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
- "import": {
18
- "types": "./lib/public.d.ts",
19
- "default": "./lib/index.js"
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
- "import": {
28
- "types": "./lib/legacy.d.ts",
29
- "default": "./lib/index.js"
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
- "import": {
38
- "types": "./lib/index.d.ts",
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": "~2.118.1",
73
- "@fluidframework/core-interfaces": "~2.118.1",
74
- "@fluidframework/core-utils": "~2.118.1",
75
- "@fluidframework/driver-definitions": "~2.118.1",
76
- "@fluidframework/telemetry-utils": "~2.118.1",
58
+ "@fluid-internal/client-utils": "~3.0.1",
59
+ "@fluidframework/core-interfaces": "~3.0.1",
60
+ "@fluidframework/core-utils": "~3.0.1",
61
+ "@fluidframework/driver-definitions": "~3.0.1",
62
+ "@fluidframework/telemetry-utils": "~3.0.1",
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": "~2.118.1",
69
+ "@fluid-internal/mocha-test-setup": "~3.0.1",
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": "~5.4.5"
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 --node10TypeCompat",
121
- "build:esnext": "tsc --project ./tsconfig.json",
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
  }
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { type Buffer, IsoBuffer } from "@fluid-internal/client-utils";
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 | Buffer {
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 IsoBuffer.from(newBlob);
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) ? IsoBuffer.from(blobView.subarray(1)) : 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(original, config);
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(original);
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(file as Uint8Array) as ArrayBufferLike;
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
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO: use a real type
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
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
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
  }
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/driver-utils";
9
- export const pkgVersion = "2.118.1";
9
+ export const pkgVersion = "3.0.1";
package/tsconfig.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../../../common/build/build-common/tsconfig.node16.json",
2
+ "extends": "../../../common/build/build-common/tsconfig.node20.json",
3
3
  "include": ["src/**/*"],
4
4
  "exclude": ["src/test/**/*"],
5
5
  "compilerOptions": {
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";