@fluidframework/routerlicious-driver 1.3.0 → 2.0.0-dev.1.4.5.105745

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 (76) hide show
  1. package/.mocharc.js +12 -0
  2. package/dist/cache.d.ts +4 -0
  3. package/dist/cache.d.ts.map +1 -1
  4. package/dist/cache.js +9 -1
  5. package/dist/cache.js.map +1 -1
  6. package/dist/documentDeltaConnection.d.ts.map +1 -1
  7. package/dist/documentDeltaConnection.js +3 -6
  8. package/dist/documentDeltaConnection.js.map +1 -1
  9. package/dist/documentService.d.ts +2 -1
  10. package/dist/documentService.d.ts.map +1 -1
  11. package/dist/documentService.js +4 -2
  12. package/dist/documentService.js.map +1 -1
  13. package/dist/documentServiceFactory.d.ts.map +1 -1
  14. package/dist/documentServiceFactory.js +7 -3
  15. package/dist/documentServiceFactory.js.map +1 -1
  16. package/dist/packageVersion.d.ts +1 -1
  17. package/dist/packageVersion.d.ts.map +1 -1
  18. package/dist/packageVersion.js +1 -1
  19. package/dist/packageVersion.js.map +1 -1
  20. package/dist/policies.d.ts +6 -0
  21. package/dist/policies.d.ts.map +1 -1
  22. package/dist/policies.js.map +1 -1
  23. package/dist/restWrapper.js +2 -1
  24. package/dist/restWrapper.js.map +1 -1
  25. package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  26. package/dist/shreddedSummaryDocumentStorageService.js +3 -0
  27. package/dist/shreddedSummaryDocumentStorageService.js.map +1 -1
  28. package/dist/tokens.d.ts +7 -0
  29. package/dist/tokens.d.ts.map +1 -1
  30. package/dist/tokens.js.map +1 -1
  31. package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  32. package/dist/wholeSummaryDocumentStorageService.js +3 -0
  33. package/dist/wholeSummaryDocumentStorageService.js.map +1 -1
  34. package/lib/cache.d.ts +4 -0
  35. package/lib/cache.d.ts.map +1 -1
  36. package/lib/cache.js +7 -0
  37. package/lib/cache.js.map +1 -1
  38. package/lib/documentDeltaConnection.d.ts.map +1 -1
  39. package/lib/documentDeltaConnection.js +3 -6
  40. package/lib/documentDeltaConnection.js.map +1 -1
  41. package/lib/documentService.d.ts +2 -1
  42. package/lib/documentService.d.ts.map +1 -1
  43. package/lib/documentService.js +4 -2
  44. package/lib/documentService.js.map +1 -1
  45. package/lib/documentServiceFactory.d.ts.map +1 -1
  46. package/lib/documentServiceFactory.js +8 -4
  47. package/lib/documentServiceFactory.js.map +1 -1
  48. package/lib/packageVersion.d.ts +1 -1
  49. package/lib/packageVersion.d.ts.map +1 -1
  50. package/lib/packageVersion.js +1 -1
  51. package/lib/packageVersion.js.map +1 -1
  52. package/lib/policies.d.ts +6 -0
  53. package/lib/policies.d.ts.map +1 -1
  54. package/lib/policies.js.map +1 -1
  55. package/lib/restWrapper.js +2 -1
  56. package/lib/restWrapper.js.map +1 -1
  57. package/lib/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  58. package/lib/shreddedSummaryDocumentStorageService.js +3 -0
  59. package/lib/shreddedSummaryDocumentStorageService.js.map +1 -1
  60. package/lib/tokens.d.ts +7 -0
  61. package/lib/tokens.d.ts.map +1 -1
  62. package/lib/tokens.js.map +1 -1
  63. package/lib/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  64. package/lib/wholeSummaryDocumentStorageService.js +3 -0
  65. package/lib/wholeSummaryDocumentStorageService.js.map +1 -1
  66. package/package.json +22 -18
  67. package/src/cache.ts +9 -0
  68. package/src/documentDeltaConnection.ts +3 -5
  69. package/src/documentService.ts +4 -1
  70. package/src/documentServiceFactory.ts +10 -3
  71. package/src/packageVersion.ts +1 -1
  72. package/src/policies.ts +6 -0
  73. package/src/restWrapper.ts +1 -1
  74. package/src/shreddedSummaryDocumentStorageService.ts +3 -0
  75. package/src/tokens.ts +7 -2
  76. package/src/wholeSummaryDocumentStorageService.ts +3 -0
@@ -1 +1 @@
1
- {"version":3,"file":"shreddedSummaryDocumentStorageService.js","sourceRoot":"","sources":["../src/shreddedSummaryDocumentStorageService.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n stringToBuffer,\n Uint8ArrayToString,\n} from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n ISummaryContext,\n IDocumentStorageServicePolicies,\n} from \"@fluidframework/driver-definitions\";\nimport { buildHierarchy } from \"@fluidframework/protocol-base\";\nimport {\n ICreateBlobResponse,\n ISnapshotTreeEx,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n GitManager,\n ISummaryUploadManager,\n SummaryTreeUploadManager,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ICache, InMemoryCache } from \"./cache\";\nimport { RetriableGitManager } from \"./retriableGitManager\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\nconst isNode = typeof window === \"undefined\";\n\n/**\n * Document access to underlying storage for routerlicious driver.\n * Uploads summaries piece-by-piece traversing the tree recursively.\n * Downloads summaries piece-by-piece on-demand, or up-front when prefetch is enabled.\n */\nexport class ShreddedSummaryDocumentStorageService implements IDocumentStorageService {\n // The values of this cache is useless. We only need the keys. So we are always putting\n // empty strings as values.\n protected readonly blobsShaCache = new Map<string, string>();\n private readonly blobCache: ICache<ArrayBufferLike> | undefined;\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> | undefined;\n\n public get repositoryUrl(): string {\n return \"\";\n }\n\n private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {\n const manager = await this.getStorageManager();\n return new SummaryTreeUploadManager(\n new RetriableGitManager(manager, this.logger),\n this.blobsShaCache,\n this.getPreviousFullSnapshot.bind(this),\n );\n }\n\n constructor(\n protected readonly id: string,\n protected readonly manager: GitManager,\n protected readonly logger: ITelemetryLogger,\n public readonly policies: IDocumentStorageServicePolicies = {},\n driverPolicies?: IRouterliciousDriverPolicies,\n blobCache?: ICache<ArrayBufferLike>,\n snapshotTreeCache?: ICache<ISnapshotTreeVersion>,\n private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async () => this.manager,\n ) {\n if (driverPolicies?.enableRestLess === true || isNode) {\n this.blobCache = blobCache ?? new InMemoryCache();\n this.snapshotTreeCache = snapshotTreeCache ?? new InMemoryCache();\n }\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n const id = versionId ? versionId : this.id;\n const commits = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getVersions\",\n versionId: id,\n count,\n },\n async () => {\n const manager = await this.getStorageManager();\n return manager.getCommits(id, count);\n },\n );\n return commits.map((commit) => ({\n date: commit.commit.author.date,\n id: commit.sha,\n treeId: commit.commit.tree.sha,\n }));\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTreeEx | null> {\n let requestVersion = version;\n if (!requestVersion) {\n const versions = await this.getVersions(this.id, 1);\n if (versions.length === 0) {\n return null;\n }\n\n requestVersion = versions[0];\n }\n\n const cachedSnapshotTree = await this.snapshotTreeCache?.get(this.getCacheKey(requestVersion.treeId));\n if (cachedSnapshotTree) {\n return cachedSnapshotTree.snapshotTree as ISnapshotTreeEx;\n }\n\n const rawTree = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getSnapshotTree\",\n treeId: requestVersion.treeId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getTree(requestVersion!.treeId);\n event.end({\n size: response.tree.length,\n });\n return response;\n },\n );\n const tree = buildHierarchy(rawTree, this.blobsShaCache, true);\n await this.snapshotTreeCache?.put(\n this.getCacheKey(tree.id),\n { id: requestVersion.id, snapshotTree: tree },\n );\n return tree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const cachedBlob = await this.blobCache?.get(this.getCacheKey(blobId));\n if (cachedBlob) {\n return cachedBlob;\n }\n\n const value = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"readBlob\",\n blobId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getBlob(blobId);\n event.end({\n size: response.size,\n });\n return response;\n },\n );\n this.blobsShaCache.set(value.sha, \"\");\n const bufferContent = stringToBuffer(value.content, value.encoding);\n await this.blobCache?.put(this.getCacheKey(value.sha), bufferContent);\n return bufferContent;\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n const summaryHandle = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"uploadSummaryWithContext\",\n },\n async () => {\n const summaryUploadManager = await this.getSummaryUploadManager();\n return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? \"\", \"channel\");\n },\n );\n return summaryHandle;\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n throw new Error(\"NOT IMPLEMENTED!\");\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n const uint8ArrayFile = new Uint8Array(file);\n return PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"createBlob\",\n size: uint8ArrayFile.length,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.createBlob(\n Uint8ArrayToString(\n uint8ArrayFile, \"base64\"),\n \"base64\").then((r) => ({ id: r.sha, url: r.url }));\n event.end({\n blobId: response.id,\n });\n return response;\n },\n );\n }\n\n private async getPreviousFullSnapshot(parentHandle: string): Promise<ISnapshotTreeEx | null | undefined> {\n return parentHandle\n ? this.getVersions(parentHandle, 1)\n .then(async (versions) => {\n // Clear the cache as the getSnapshotTree call will fill the cache.\n this.blobsShaCache.clear();\n return this.getSnapshotTree(versions[0]);\n })\n : undefined;\n }\n\n private getCacheKey(blobId: string): string {\n return `${this.id}:${blobId}`;\n }\n}\n"]}
1
+ {"version":3,"file":"shreddedSummaryDocumentStorageService.js","sourceRoot":"","sources":["../src/shreddedSummaryDocumentStorageService.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n stringToBuffer,\n Uint8ArrayToString,\n} from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n ISummaryContext,\n IDocumentStorageServicePolicies,\n} from \"@fluidframework/driver-definitions\";\nimport { buildHierarchy } from \"@fluidframework/protocol-base\";\nimport {\n ICreateBlobResponse,\n ISnapshotTreeEx,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n GitManager,\n ISummaryUploadManager,\n SummaryTreeUploadManager,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ICache, InMemoryCache } from \"./cache\";\nimport { RetriableGitManager } from \"./retriableGitManager\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\nconst isNode = typeof window === \"undefined\";\n\n/**\n * Document access to underlying storage for routerlicious driver.\n * Uploads summaries piece-by-piece traversing the tree recursively.\n * Downloads summaries piece-by-piece on-demand, or up-front when prefetch is enabled.\n */\nexport class ShreddedSummaryDocumentStorageService implements IDocumentStorageService {\n // The values of this cache is useless. We only need the keys. So we are always putting\n // empty strings as values.\n protected readonly blobsShaCache = new Map<string, string>();\n private readonly blobCache: ICache<ArrayBufferLike> | undefined;\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> | undefined;\n\n public get repositoryUrl(): string {\n return \"\";\n }\n\n private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {\n const manager = await this.getStorageManager();\n return new SummaryTreeUploadManager(\n new RetriableGitManager(manager, this.logger),\n this.blobsShaCache,\n this.getPreviousFullSnapshot.bind(this),\n );\n }\n\n constructor(\n protected readonly id: string,\n protected readonly manager: GitManager,\n protected readonly logger: ITelemetryLogger,\n public readonly policies: IDocumentStorageServicePolicies = {},\n driverPolicies?: IRouterliciousDriverPolicies,\n blobCache?: ICache<ArrayBufferLike>,\n snapshotTreeCache?: ICache<ISnapshotTreeVersion>,\n private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async () => this.manager,\n ) {\n if (driverPolicies?.enableRestLess === true || isNode) {\n this.blobCache = blobCache ?? new InMemoryCache();\n this.snapshotTreeCache = snapshotTreeCache ?? new InMemoryCache();\n }\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n const id = versionId ? versionId : this.id;\n const commits = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getVersions\",\n versionId: id,\n count,\n },\n async () => {\n const manager = await this.getStorageManager();\n return manager.getCommits(id, count);\n },\n );\n return commits.map((commit) => ({\n date: commit.commit.author.date,\n id: commit.sha,\n treeId: commit.commit.tree.sha,\n }));\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTreeEx | null> {\n let requestVersion = version;\n if (!requestVersion) {\n const versions = await this.getVersions(this.id, 1);\n if (versions.length === 0) {\n return null;\n }\n\n requestVersion = versions[0];\n }\n\n const cachedSnapshotTree = await this.snapshotTreeCache?.get(this.getCacheKey(requestVersion.treeId));\n if (cachedSnapshotTree) {\n return cachedSnapshotTree.snapshotTree as ISnapshotTreeEx;\n }\n\n const rawTree = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getSnapshotTree\",\n treeId: requestVersion.treeId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getTree(requestVersion!.treeId);\n event.end({\n size: response.tree.length,\n });\n return response;\n },\n );\n const tree = buildHierarchy(rawTree, this.blobsShaCache, true);\n await this.snapshotTreeCache?.put(\n this.getCacheKey(tree.id),\n { id: requestVersion.id, snapshotTree: tree },\n );\n return tree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const cachedBlob = await this.blobCache?.get(this.getCacheKey(blobId));\n if (cachedBlob) {\n return cachedBlob;\n }\n\n const value = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"readBlob\",\n blobId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getBlob(blobId);\n event.end({\n size: response.size,\n });\n return response;\n },\n );\n this.blobsShaCache.set(value.sha, \"\");\n const bufferContent = stringToBuffer(value.content, value.encoding);\n await this.blobCache?.put(this.getCacheKey(value.sha), bufferContent);\n return bufferContent;\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n const summaryHandle = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"uploadSummaryWithContext\",\n proposalHandle: context.proposalHandle,\n ackHandle: context.ackHandle,\n referenceSequenceNumber: context.referenceSequenceNumber,\n },\n async () => {\n const summaryUploadManager = await this.getSummaryUploadManager();\n return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? \"\", \"channel\");\n },\n );\n return summaryHandle;\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n throw new Error(\"NOT IMPLEMENTED!\");\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n const uint8ArrayFile = new Uint8Array(file);\n return PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"createBlob\",\n size: uint8ArrayFile.length,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.createBlob(\n Uint8ArrayToString(\n uint8ArrayFile, \"base64\"),\n \"base64\").then((r) => ({ id: r.sha, url: r.url }));\n event.end({\n blobId: response.id,\n });\n return response;\n },\n );\n }\n\n private async getPreviousFullSnapshot(parentHandle: string): Promise<ISnapshotTreeEx | null | undefined> {\n return parentHandle\n ? this.getVersions(parentHandle, 1)\n .then(async (versions) => {\n // Clear the cache as the getSnapshotTree call will fill the cache.\n this.blobsShaCache.clear();\n return this.getSnapshotTree(versions[0]);\n })\n : undefined;\n }\n\n private getCacheKey(blobId: string): string {\n return `${this.id}:${blobId}`;\n }\n}\n"]}
package/dist/tokens.d.ts CHANGED
@@ -10,7 +10,14 @@ export interface ITokenService {
10
10
  extractClaims(token: string): ITokenClaims;
11
11
  }
12
12
  export interface ITokenResponse {
13
+ /**
14
+ * {@link https://jwt.io/introduction/ | JSON Web Token (JWT)} value.
15
+ */
13
16
  jwt: string;
17
+ /**
18
+ * Flag indicating whether token was obtained from local cache.
19
+ * Undefined indicates that the source of the token could not be determined.
20
+ */
14
21
  fromCache?: boolean;
15
22
  }
16
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAE3B,GAAG,EAAE,MAAM,CAAC;IAGZ,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B;;;;;;;OAOG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAErG;;;;;;;OAOG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEpG;;;;;;;;;;;;;OAaG;IACH,0BAA0B,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzF"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B;;;;;;;OAOG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAErG;;;;;;;OAOG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEpG;;;;;;;;;;;;;OAaG;IACH,0BAA0B,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzF"}
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITokenClaims } from \"@fluidframework/protocol-definitions\";\n\n/**\n * The ITokenService abstracts the discovery of claims contained within a token\n */\nexport interface ITokenService {\n extractClaims(token: string): ITokenClaims;\n}\n\nexport interface ITokenResponse {\n // JWT value\n jwt: string;\n\n // Flag indicating whether token was obtained from local cache\n fromCache?: boolean;\n}\n\n/**\n * Abstracts the token fetching mechanism for a hosting application.\n * The hosting application is responsible for providing an implementation.\n */\nexport interface ITokenProvider {\n /**\n * Fetches the orderer token from host.\n * @param tenantId - Tenant ID.\n * @param documentId - Optional. Document ID is only required for document-scoped requests.\n * @param refresh - Optional flag indicating whether token fetch must bypass local cache.\n * @returns TokenResponse object representing token value along with flag indicating\n * whether token came from cache.\n */\n fetchOrdererToken(tenantId: string, documentId?: string, refresh?: boolean): Promise<ITokenResponse>;\n\n /**\n * Fetches the storage token from host.\n * @param tenantId - Tenant ID.\n * @param documentId - Document ID.\n * @param refresh - Optional flag indicating whether token fetch must bypass local cache.\n * @returns TokenResponse object representing token value along with flag indicating\n * whether token came from cache.\n */\n fetchStorageToken(tenantId: string, documentId: string, refresh?: boolean): Promise<ITokenResponse>;\n\n /**\n * A callback triggered directly after creating the document. In this callback the client has the opportunity, to\n * verify against an authorization service, if the user who claims to create the document is the same user who\n * created it.\n *\n * @remarks Notes:\n * * Using the callback may have performance impact on the document creation process.\n * * Any exceptions thrown in the callback would fail the creation workflow\n * (see {@link RouterliciousDocumentServiceFactory.createContainer} for more details).\n *\n * @param documentId - Document ID.\n * @param creationToken - A special token that doesn't provide any kind of access, but it has the user's payload\n * and document id. It can be used to validate the identity of the document creator.\n */\n documentPostCreateCallback?(documentId: string, creationToken: string): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITokenClaims } from \"@fluidframework/protocol-definitions\";\n\n/**\n * The ITokenService abstracts the discovery of claims contained within a token\n */\nexport interface ITokenService {\n extractClaims(token: string): ITokenClaims;\n}\n\nexport interface ITokenResponse {\n /**\n * {@link https://jwt.io/introduction/ | JSON Web Token (JWT)} value.\n */\n jwt: string;\n\n /**\n * Flag indicating whether token was obtained from local cache.\n * Undefined indicates that the source of the token could not be determined.\n */\n fromCache?: boolean;\n}\n\n/**\n * Abstracts the token fetching mechanism for a hosting application.\n * The hosting application is responsible for providing an implementation.\n */\nexport interface ITokenProvider {\n /**\n * Fetches the orderer token from host.\n * @param tenantId - Tenant ID.\n * @param documentId - Optional. Document ID is only required for document-scoped requests.\n * @param refresh - Optional flag indicating whether token fetch must bypass local cache.\n * @returns TokenResponse object representing token value along with flag indicating\n * whether token came from cache.\n */\n fetchOrdererToken(tenantId: string, documentId?: string, refresh?: boolean): Promise<ITokenResponse>;\n\n /**\n * Fetches the storage token from host.\n * @param tenantId - Tenant ID.\n * @param documentId - Document ID.\n * @param refresh - Optional flag indicating whether token fetch must bypass local cache.\n * @returns TokenResponse object representing token value along with flag indicating\n * whether token came from cache.\n */\n fetchStorageToken(tenantId: string, documentId: string, refresh?: boolean): Promise<ITokenResponse>;\n\n /**\n * A callback triggered directly after creating the document. In this callback the client has the opportunity, to\n * verify against an authorization service, if the user who claims to create the document is the same user who\n * created it.\n *\n * @remarks Notes:\n * * Using the callback may have performance impact on the document creation process.\n * * Any exceptions thrown in the callback would fail the creation workflow\n * (see {@link RouterliciousDocumentServiceFactory.createContainer} for more details).\n *\n * @param documentId - Document ID.\n * @param creationToken - A special token that doesn't provide any kind of access, but it has the user's payload\n * and document id. It can be used to validate the identity of the document creator.\n */\n documentPostCreateCallback?(documentId: string, creationToken: string): Promise<void>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"wholeSummaryDocumentStorageService.d.ts","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAM3E,OAAO,EACH,uBAAuB,EACvB,eAAe,EACf,+BAA+B,EAClC,MAAM,oCAAoC,CAAC;AAI5C,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAEH,UAAU,EAGb,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAI1D,qBAAa,kCAAmC,YAAW,uBAAuB;IAa1E,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB;aAC3B,QAAQ,EAAE,+BAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IApBtC,OAAO,CAAC,iBAAiB,CAAiB;IAE1C,IAAW,aAAa,IAAI,MAAM,CAEjC;YAEa,uBAAuB;gBAMd,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,gBAAgB,EAC3B,QAAQ,GAAE,+BAAoC,EAC7C,cAAc,CAAC,0CAA8B,EAC7C,SAAS,GAAE,MAAM,CAAC,eAAe,CAAuB,EACxD,iBAAiB,GAAE,MAAM,CAAC,oBAAoB,CAAuB,EACrE,iBAAiB,CAAC,wBAAY,EAC9B,iBAAiB,GAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CACc;IAIvF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0CzE,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAclE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA4BlD,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1F,eAAe,CAAC,aAAa,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAqBrE,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAsB9D,yBAAyB;YAkDzB,aAAa;IAS3B,OAAO,CAAC,WAAW;CAGtB"}
1
+ {"version":3,"file":"wholeSummaryDocumentStorageService.d.ts","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAM3E,OAAO,EACH,uBAAuB,EACvB,eAAe,EACf,+BAA+B,EAClC,MAAM,oCAAoC,CAAC;AAI5C,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAEH,UAAU,EAGb,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAI1D,qBAAa,kCAAmC,YAAW,uBAAuB;IAa1E,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU;IACtC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB;aAC3B,QAAQ,EAAE,+BAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IApBtC,OAAO,CAAC,iBAAiB,CAAiB;IAE1C,IAAW,aAAa,IAAI,MAAM,CAEjC;YAEa,uBAAuB;gBAMd,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,gBAAgB,EAC3B,QAAQ,GAAE,+BAAoC,EAC7C,cAAc,CAAC,0CAA8B,EAC7C,SAAS,GAAE,MAAM,CAAC,eAAe,CAAuB,EACxD,iBAAiB,GAAE,MAAM,CAAC,oBAAoB,CAAuB,EACrE,iBAAiB,CAAC,wBAAY,EAC9B,iBAAiB,GAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CACc;IAIvF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0CzE,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAclE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA4BlD,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB1F,eAAe,CAAC,aAAa,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAqBrE,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAsB9D,yBAAyB;YAkDzB,aAAa;IAS3B,OAAO,CAAC,WAAW;CAGtB"}
@@ -102,6 +102,9 @@ class WholeSummaryDocumentStorageService {
102
102
  async uploadSummaryWithContext(summary, context) {
103
103
  const summaryHandle = await telemetry_utils_1.PerformanceEvent.timedExecAsync(this.logger, {
104
104
  eventName: "uploadSummaryWithContext",
105
+ proposalHandle: context.proposalHandle,
106
+ ackHandle: context.ackHandle,
107
+ referenceSequenceNumber: context.referenceSequenceNumber,
105
108
  }, async () => {
106
109
  var _a;
107
110
  const summaryUploadManager = await this.getSummaryUploadManager();
@@ -1 +1 @@
1
- {"version":3,"file":"wholeSummaryDocumentStorageService.js","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,+DAIsC;AAMtC,+DAEsC;AAQtC,mFAKgD;AAChD,qEAAmE;AACnE,mCAAgD;AAIhD,MAAM,gBAAgB,GAAW,QAAQ,CAAC;AAE1C,MAAa,kCAAkC;IAY3C,YACuB,EAAU,EACV,OAAmB,EACnB,MAAwB,EAC3B,WAA4C,EAAE,EAC7C,cAA6C,EAC7C,YAAqC,IAAI,qBAAa,EAAE,EACxD,oBAAkD,IAAI,qBAAa,EAAE,EACrE,iBAA8B,EAC9B,oBAAqE,KAAK,EAAE,YAAY,EAAE,EAAE,CACzG,YAAY,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO;QAT7E,OAAE,GAAF,EAAE,CAAQ;QACV,YAAO,GAAP,OAAO,CAAY;QACnB,WAAM,GAAN,MAAM,CAAkB;QAC3B,aAAQ,GAAR,QAAQ,CAAsC;QAC7C,mBAAc,GAAd,cAAc,CAA+B;QAC7C,cAAS,GAAT,SAAS,CAA+C;QACxD,sBAAiB,GAAjB,iBAAiB,CAAoD;QACrE,sBAAiB,GAAjB,iBAAiB,CAAa;QAC9B,sBAAiB,GAAjB,iBAAiB,CAC8D;QArB5F,sBAAiB,GAAY,IAAI,CAAC;IAuB1C,CAAC;IArBD,IAAW,aAAa;QACpB,OAAO,EAAE,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,uBAAuB;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/C,OAAO,IAAI,kDAAyB,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAgBM,KAAK,CAAC,WAAW,CAAC,SAAwB,EAAE,KAAa;;QAC5D,IAAI,SAAS,KAAK,IAAI,CAAC,EAAE,IAAI,SAAS,KAAK,IAAI,EAAE;YAC7C,4FAA4F;YAC5F,OAAO,CAAC;oBACJ,EAAE,EAAE,SAAS;oBACb,MAAM,EAAE,SAAU;iBACrB,CAAC,CAAC;SACN;QACD,gGAAgG;QAChG,qDAAqD;QACrD,IAAI,IAAI,CAAC,iBAAiB,IAAI,KAAK,KAAK,CAAC,EAAE;YACvC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,CAAC,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,eAAe,CAAA,CAAC,CAAC;gBACrE,MAAM,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC/D,MAAM,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YACjE,OAAO,CAAC;oBACJ,EAAE,EAAE,GAAG;oBACP,MAAM,EAAE,YAAY,CAAC,EAAG;iBAC3B,CAAC,CAAC;SACN;QAED,+DAA+D;QAC/D,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,kCAAgB,CAAC,cAAc,CACjD,IAAI,CAAC,MAAM,EACX;YACI,SAAS,EAAE,aAAa;YACxB,SAAS,EAAE,EAAE;YACb,KAAK;SACR,EACD,KAAK,IAAI,EAAE;YACP,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/C,OAAO,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC,CACJ,CAAC;QACF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;YAC/B,EAAE,EAAE,MAAM,CAAC,GAAG;YACd,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;SACjC,CAAC,CAAC,CAAC;IACR,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,OAAkB;QAC3C,IAAI,cAAc,GAAG,OAAO,CAAC;QAC7B,IAAI,CAAC,cAAc,EAAE;YACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB,OAAO,IAAI,CAAC;aACf;YAED,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;SAChC;QAED,OAAO,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;IAClF,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,MAAc;QAChC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,IAAI,UAAU,KAAK,SAAS,EAAE;YAC1B,OAAO,UAAU,CAAC;SACrB;QAED,MAAM,IAAI,GAAG,MAAM,kCAAgB,CAAC,cAAc,CAC9C,IAAI,CAAC,MAAM,EACX;YACI,SAAS,EAAE,UAAU;YACrB,MAAM;SACT,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/C,KAAK,CAAC,GAAG,CAAC;gBACN,IAAI,EAAE,QAAQ,CAAC,IAAI;aACtB,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QACpB,CAAC,CACJ,CAAC;QACF,MAAM,WAAW,GAAG,IAAA,6BAAc,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEhE,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;QAElE,OAAO,WAAW,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,wBAAwB,CAAC,OAAqB,EAAE,OAAwB;QACjF,MAAM,aAAa,GAAG,MAAM,kCAAgB,CAAC,cAAc,CACvD,IAAI,CAAC,MAAM,EACX;YACI,SAAS,EAAE,0BAA0B;SACxC,EACD,KAAK,IAAI,EAAE;;YACP,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAClE,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAA,OAAO,CAAC,SAAS,mCAAI,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9F,CAAC,CACJ,CAAC;QACF,OAAO,aAAa,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,aAA6B;QACtD,MAAM,gBAAgB,GAAG,MAAM,kCAAgB,CAAC,cAAc,CAC1D,IAAI,CAAC,MAAM,EACX;YACI,SAAS,EAAE,qBAAqB;YAChC,MAAM,EAAE,aAAa,CAAC,MAAM;SAC/B,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;;YACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAChE,KAAK,CAAC,GAAG,CAAC;gBACN,IAAI,EAAE,MAAA,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,0CAAE,OAAO,CAAC,MAAM;aAC1C,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QACpB,CAAC,CACJ,CAAC;QAEF,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAA,sEAA6C,EAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACpG,OAAO,IAAA,mDAAoC,EAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAqB;QACzC,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,kCAAgB,CAAC,cAAc,CAClC,IAAI,CAAC,MAAM,EACX;YACI,SAAS,EAAE,YAAY;YACvB,IAAI,EAAE,cAAc,CAAC,MAAM;SAC9B,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CACrC,IAAA,iCAAkB,EACd,cAAc,EAAE,QAAQ,CAAC,EAC7B,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACvD,KAAK,CAAC,GAAG,CAAC;gBACN,MAAM,EAAE,QAAQ,CAAC,EAAE;aACtB,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QACpB,CAAC,CACJ,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,SAAiB,EAAE,YAAsB;QAC7E,MAAM,yBAAyB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAChG,IAAI,yBAAyB,KAAK,SAAS,EAAE;YACzC,OAAO,EAAE,EAAE,EAAE,yBAAyB,CAAC,EAAE,EAAE,YAAY,EAAE,yBAAyB,CAAC,YAAY,EAAE,CAAC;SACrG;QAED,MAAM,gBAAgB,GAAG,MAAM,kCAAgB,CAAC,cAAc,CAC1D,IAAI,CAAC,MAAM,EACX;YACI,SAAS,EAAE,qBAAqB;YAChC,MAAM,EAAE,SAAS;SACpB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;;YACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACrD,KAAK,CAAC,GAAG,CAAC;gBACN,IAAI,EAAE,MAAA,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,0CAAE,OAAO,CAAC,MAAM;aAC1C,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QACpB,CAAC,CACJ,CAAC;QACF,MAAM,sBAAsB,GAAG,IAAA,sEAA6C,EAAC,gBAAgB,CAAC,CAAC;QAC/F,MAAM,kBAAkB,GAAW,gBAAgB,CAAC,EAAE,CAAC;QACvD,MAAM,cAAc,GAAG,sBAAsB,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9D,IAAA,qBAAM,EAAC,cAAc,KAAK,SAAS,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACpF,MAAM,mBAAmB,GAAG,EAAE,EAAE,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,CAAC,YAAY,EAAE,CAAC;QAE1G,MAAM,OAAO,GAAmB;YAC5B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CACtB,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,EAChC,mBAAmB,CACtB;YACD,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,KAAK,CAAC;SACnD,CAAC;QACF,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,sGAAsG;YACtG,4GAA4G;YAC5G,0GAA0G;YAC1G,wBAAwB;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CACnC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAC3B,mBAAmB,CACtB,CAAC,CAAC;SACN;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE3B,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,KAA+B;QACvD,MAAM,cAAc,GAAoB,EAAE,CAAC;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACtC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAEO,WAAW,CAAC,MAAc;QAC9B,OAAO,GAAG,IAAI,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;IAClC,CAAC;CACJ;AArOD,gFAqOC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n assert,\n stringToBuffer,\n Uint8ArrayToString,\n} from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n ISummaryContext,\n IDocumentStorageServicePolicies,\n} from \"@fluidframework/driver-definitions\";\nimport {\n convertSnapshotAndBlobsToSummaryTree,\n} from \"@fluidframework/driver-utils\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n convertWholeFlatSummaryToSnapshotTreeAndBlobs,\n GitManager,\n ISummaryUploadManager,\n WholeSummaryUploadManager,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { ICache, InMemoryCache } from \"./cache\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\n\nconst latestSnapshotId: string = \"latest\";\n\nexport class WholeSummaryDocumentStorageService implements IDocumentStorageService {\n private firstVersionsCall: boolean = true;\n\n public get repositoryUrl(): string {\n return \"\";\n }\n\n private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {\n const manager = await this.getStorageManager();\n return new WholeSummaryUploadManager(manager);\n }\n\n constructor(\n protected readonly id: string,\n protected readonly manager: GitManager,\n protected readonly logger: ITelemetryLogger,\n public readonly policies: IDocumentStorageServicePolicies = {},\n private readonly driverPolicies?: IRouterliciousDriverPolicies,\n private readonly blobCache: ICache<ArrayBufferLike> = new InMemoryCache(),\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> = new InMemoryCache(),\n private readonly noCacheGitManager?: GitManager,\n private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async (disableCache) =>\n disableCache && this.noCacheGitManager !== undefined ? this.noCacheGitManager : this.manager,\n ) {\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n if (versionId !== this.id && versionId !== null) {\n // Blobs/Trees in this scenario will never have multiple versions, so return versionId as is\n return [{\n id: versionId,\n treeId: undefined!,\n }];\n }\n // If this is the first versions call for the document, we know we will want the latest summary.\n // Fetch latest summary, cache it, and return its id.\n if (this.firstVersionsCall && count === 1) {\n this.firstVersionsCall = false;\n const { id: _id, snapshotTree } = !this.driverPolicies?.enableDiscovery ?\n await this.fetchAndCacheSnapshotTree(latestSnapshotId, false) :\n await this.fetchAndCacheSnapshotTree(latestSnapshotId, true);\n return [{\n id: _id,\n treeId: snapshotTree.id!,\n }];\n }\n\n // Otherwise, get the latest version of the document as normal.\n const id = versionId ? versionId : this.id;\n const commits = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getVersions\",\n versionId: id,\n count,\n },\n async () => {\n const manager = await this.getStorageManager();\n return manager.getCommits(id, count);\n },\n );\n return commits.map((commit) => ({\n date: commit.commit.author.date,\n id: commit.sha,\n treeId: commit.commit.tree.sha,\n }));\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n let requestVersion = version;\n if (!requestVersion) {\n const versions = await this.getVersions(this.id, 1);\n if (versions.length === 0) {\n return null;\n }\n\n requestVersion = versions[0];\n }\n\n return (await this.fetchAndCacheSnapshotTree(requestVersion.id)).snapshotTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const cachedBlob = await this.blobCache.get(this.getCacheKey(blobId));\n if (cachedBlob !== undefined) {\n return cachedBlob;\n }\n\n const blob = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"readBlob\",\n blobId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getBlob(blobId);\n event.end({\n size: response.size,\n });\n return response;\n },\n );\n const bufferValue = stringToBuffer(blob.content, blob.encoding);\n\n await this.blobCache.put(this.getCacheKey(blob.sha), bufferValue);\n\n return bufferValue;\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n const summaryHandle = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"uploadSummaryWithContext\",\n },\n async () => {\n const summaryUploadManager = await this.getSummaryUploadManager();\n return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? \"\", \"channel\");\n },\n );\n return summaryHandle;\n }\n\n public async downloadSummary(summaryHandle: ISummaryHandle): Promise<ISummaryTree> {\n const wholeFlatSummary = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getWholeFlatSummary\",\n treeId: summaryHandle.handle,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getSummary(summaryHandle.handle);\n event.end({\n size: response.trees[0]?.entries.length,\n });\n return response;\n },\n );\n\n const { blobs, snapshotTree } = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary, \"\");\n return convertSnapshotAndBlobsToSummaryTree(snapshotTree, blobs);\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n const uint8ArrayFile = new Uint8Array(file);\n return PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"createBlob\",\n size: uint8ArrayFile.length,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.createBlob(\n Uint8ArrayToString(\n uint8ArrayFile, \"base64\"),\n \"base64\").then((r) => ({ id: r.sha, url: r.url }));\n event.end({\n blobId: response.id,\n });\n return response;\n },\n );\n }\n\n private async fetchAndCacheSnapshotTree(versionId: string, disableCache?: boolean): Promise<ISnapshotTreeVersion> {\n const cachedSnapshotTreeVersion = await this.snapshotTreeCache.get(this.getCacheKey(versionId));\n if (cachedSnapshotTreeVersion !== undefined) {\n return { id: cachedSnapshotTreeVersion.id, snapshotTree: cachedSnapshotTreeVersion.snapshotTree };\n }\n\n const wholeFlatSummary = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getWholeFlatSummary\",\n treeId: versionId,\n },\n async (event) => {\n const manager = await this.getStorageManager(disableCache);\n const response = await manager.getSummary(versionId);\n event.end({\n size: response.trees[0]?.entries.length,\n });\n return response;\n },\n );\n const normalizedWholeSummary = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary);\n const wholeFlatSummaryId: string = wholeFlatSummary.id;\n const snapshotTreeId = normalizedWholeSummary.snapshotTree.id;\n assert(snapshotTreeId !== undefined, 0x275 /* \"Root tree should contain the id\" */);\n const snapshotTreeVersion = { id: wholeFlatSummaryId, snapshotTree: normalizedWholeSummary.snapshotTree };\n\n const cachePs: Promise<any>[] = [\n this.snapshotTreeCache.put(\n this.getCacheKey(snapshotTreeId),\n snapshotTreeVersion,\n ),\n this.initBlobCache(normalizedWholeSummary.blobs),\n ];\n if (snapshotTreeId !== versionId) {\n // versionId could be \"latest\". When summarizer checks cache for \"latest\", we want it to be available.\n // TODO: For in-memory cache, <latest,snapshotTree> will be a shared pointer with <snapshotId,snapshotTree>,\n // However, for something like Redis, this will cache the same value twice. Alternatively, could we simply\n // cache with versionId?\n cachePs.push(this.snapshotTreeCache.put(\n this.getCacheKey(versionId),\n snapshotTreeVersion,\n ));\n }\n\n await Promise.all(cachePs);\n\n return snapshotTreeVersion;\n }\n\n private async initBlobCache(blobs: Map<string, ArrayBuffer>): Promise<void> {\n const blobCachePutPs: Promise<void>[] = [];\n blobs.forEach((value, id) => {\n const cacheKey = this.getCacheKey(id);\n blobCachePutPs.push(this.blobCache.put(cacheKey, value));\n });\n await Promise.all(blobCachePutPs);\n }\n\n private getCacheKey(blobId: string): string {\n return `${this.id}:${blobId}`;\n }\n}\n"]}
1
+ {"version":3,"file":"wholeSummaryDocumentStorageService.js","sourceRoot":"","sources":["../src/wholeSummaryDocumentStorageService.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n assert,\n stringToBuffer,\n Uint8ArrayToString,\n} from \"@fluidframework/common-utils\";\nimport {\n IDocumentStorageService,\n ISummaryContext,\n IDocumentStorageServicePolicies,\n} from \"@fluidframework/driver-definitions\";\nimport {\n convertSnapshotAndBlobsToSummaryTree,\n} from \"@fluidframework/driver-utils\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n convertWholeFlatSummaryToSnapshotTreeAndBlobs,\n GitManager,\n ISummaryUploadManager,\n WholeSummaryUploadManager,\n} from \"@fluidframework/server-services-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { ICache, InMemoryCache } from \"./cache\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\n\nconst latestSnapshotId: string = \"latest\";\n\nexport class WholeSummaryDocumentStorageService implements IDocumentStorageService {\n private firstVersionsCall: boolean = true;\n\n public get repositoryUrl(): string {\n return \"\";\n }\n\n private async getSummaryUploadManager(): Promise<ISummaryUploadManager> {\n const manager = await this.getStorageManager();\n return new WholeSummaryUploadManager(manager);\n }\n\n constructor(\n protected readonly id: string,\n protected readonly manager: GitManager,\n protected readonly logger: ITelemetryLogger,\n public readonly policies: IDocumentStorageServicePolicies = {},\n private readonly driverPolicies?: IRouterliciousDriverPolicies,\n private readonly blobCache: ICache<ArrayBufferLike> = new InMemoryCache(),\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion> = new InMemoryCache(),\n private readonly noCacheGitManager?: GitManager,\n private readonly getStorageManager: (disableCache?: boolean) => Promise<GitManager> = async (disableCache) =>\n disableCache && this.noCacheGitManager !== undefined ? this.noCacheGitManager : this.manager,\n ) {\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n if (versionId !== this.id && versionId !== null) {\n // Blobs/Trees in this scenario will never have multiple versions, so return versionId as is\n return [{\n id: versionId,\n treeId: undefined!,\n }];\n }\n // If this is the first versions call for the document, we know we will want the latest summary.\n // Fetch latest summary, cache it, and return its id.\n if (this.firstVersionsCall && count === 1) {\n this.firstVersionsCall = false;\n const { id: _id, snapshotTree } = !this.driverPolicies?.enableDiscovery ?\n await this.fetchAndCacheSnapshotTree(latestSnapshotId, false) :\n await this.fetchAndCacheSnapshotTree(latestSnapshotId, true);\n return [{\n id: _id,\n treeId: snapshotTree.id!,\n }];\n }\n\n // Otherwise, get the latest version of the document as normal.\n const id = versionId ? versionId : this.id;\n const commits = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getVersions\",\n versionId: id,\n count,\n },\n async () => {\n const manager = await this.getStorageManager();\n return manager.getCommits(id, count);\n },\n );\n return commits.map((commit) => ({\n date: commit.commit.author.date,\n id: commit.sha,\n treeId: commit.commit.tree.sha,\n }));\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n let requestVersion = version;\n if (!requestVersion) {\n const versions = await this.getVersions(this.id, 1);\n if (versions.length === 0) {\n return null;\n }\n\n requestVersion = versions[0];\n }\n\n return (await this.fetchAndCacheSnapshotTree(requestVersion.id)).snapshotTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const cachedBlob = await this.blobCache.get(this.getCacheKey(blobId));\n if (cachedBlob !== undefined) {\n return cachedBlob;\n }\n\n const blob = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"readBlob\",\n blobId,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getBlob(blobId);\n event.end({\n size: response.size,\n });\n return response;\n },\n );\n const bufferValue = stringToBuffer(blob.content, blob.encoding);\n\n await this.blobCache.put(this.getCacheKey(blob.sha), bufferValue);\n\n return bufferValue;\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n const summaryHandle = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"uploadSummaryWithContext\",\n proposalHandle: context.proposalHandle,\n ackHandle: context.ackHandle,\n referenceSequenceNumber: context.referenceSequenceNumber,\n },\n async () => {\n const summaryUploadManager = await this.getSummaryUploadManager();\n return summaryUploadManager.writeSummaryTree(summary, context.ackHandle ?? \"\", \"channel\");\n },\n );\n return summaryHandle;\n }\n\n public async downloadSummary(summaryHandle: ISummaryHandle): Promise<ISummaryTree> {\n const wholeFlatSummary = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getWholeFlatSummary\",\n treeId: summaryHandle.handle,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.getSummary(summaryHandle.handle);\n event.end({\n size: response.trees[0]?.entries.length,\n });\n return response;\n },\n );\n\n const { blobs, snapshotTree } = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary, \"\");\n return convertSnapshotAndBlobsToSummaryTree(snapshotTree, blobs);\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n const uint8ArrayFile = new Uint8Array(file);\n return PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"createBlob\",\n size: uint8ArrayFile.length,\n },\n async (event) => {\n const manager = await this.getStorageManager();\n const response = await manager.createBlob(\n Uint8ArrayToString(\n uint8ArrayFile, \"base64\"),\n \"base64\").then((r) => ({ id: r.sha, url: r.url }));\n event.end({\n blobId: response.id,\n });\n return response;\n },\n );\n }\n\n private async fetchAndCacheSnapshotTree(versionId: string, disableCache?: boolean): Promise<ISnapshotTreeVersion> {\n const cachedSnapshotTreeVersion = await this.snapshotTreeCache.get(this.getCacheKey(versionId));\n if (cachedSnapshotTreeVersion !== undefined) {\n return { id: cachedSnapshotTreeVersion.id, snapshotTree: cachedSnapshotTreeVersion.snapshotTree };\n }\n\n const wholeFlatSummary = await PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"getWholeFlatSummary\",\n treeId: versionId,\n },\n async (event) => {\n const manager = await this.getStorageManager(disableCache);\n const response = await manager.getSummary(versionId);\n event.end({\n size: response.trees[0]?.entries.length,\n });\n return response;\n },\n );\n const normalizedWholeSummary = convertWholeFlatSummaryToSnapshotTreeAndBlobs(wholeFlatSummary);\n const wholeFlatSummaryId: string = wholeFlatSummary.id;\n const snapshotTreeId = normalizedWholeSummary.snapshotTree.id;\n assert(snapshotTreeId !== undefined, 0x275 /* \"Root tree should contain the id\" */);\n const snapshotTreeVersion = { id: wholeFlatSummaryId, snapshotTree: normalizedWholeSummary.snapshotTree };\n\n const cachePs: Promise<any>[] = [\n this.snapshotTreeCache.put(\n this.getCacheKey(snapshotTreeId),\n snapshotTreeVersion,\n ),\n this.initBlobCache(normalizedWholeSummary.blobs),\n ];\n if (snapshotTreeId !== versionId) {\n // versionId could be \"latest\". When summarizer checks cache for \"latest\", we want it to be available.\n // TODO: For in-memory cache, <latest,snapshotTree> will be a shared pointer with <snapshotId,snapshotTree>,\n // However, for something like Redis, this will cache the same value twice. Alternatively, could we simply\n // cache with versionId?\n cachePs.push(this.snapshotTreeCache.put(\n this.getCacheKey(versionId),\n snapshotTreeVersion,\n ));\n }\n\n await Promise.all(cachePs);\n\n return snapshotTreeVersion;\n }\n\n private async initBlobCache(blobs: Map<string, ArrayBuffer>): Promise<void> {\n const blobCachePutPs: Promise<void>[] = [];\n blobs.forEach((value, id) => {\n const cacheKey = this.getCacheKey(id);\n blobCachePutPs.push(this.blobCache.put(cacheKey, value));\n });\n await Promise.all(blobCachePutPs);\n }\n\n private getCacheKey(blobId: string): string {\n return `${this.id}:${blobId}`;\n }\n}\n"]}
package/lib/cache.d.ts CHANGED
@@ -11,4 +11,8 @@ export declare class InMemoryCache<T> implements ICache<T> {
11
11
  get(key: string): Promise<T | undefined>;
12
12
  put(key: string, value: T): Promise<void>;
13
13
  }
14
+ export declare class NullCache<T> implements ICache<T> {
15
+ get(key: string): Promise<T | undefined>;
16
+ put(key: string, value: T): Promise<void>;
17
+ }
14
18
  //# sourceMappingURL=cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,MAAM,CAAC,CAAC;IACrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAEtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzD"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,MAAM,CAAC,CAAC;IACrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAEtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzD;AAED,qBAAa,SAAS,CAAC,CAAC,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAEzD"}
package/lib/cache.js CHANGED
@@ -13,4 +13,11 @@ export class InMemoryCache {
13
13
  this.cache.set(key, value);
14
14
  }
15
15
  }
16
+ export class NullCache {
17
+ async get(key) {
18
+ return undefined;
19
+ }
20
+ async put(key, value) {
21
+ }
22
+ }
16
23
  //# sourceMappingURL=cache.js.map
package/lib/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,OAAO,aAAa;IAA1B;QACqB,UAAK,GAAmB,IAAI,GAAG,EAAE,CAAC;IASvD,CAAC;IAPU,KAAK,CAAC,GAAG,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAQ;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport interface ICache<T> {\n get(key: string): Promise<T | undefined>;\n put(key: string, value: T): Promise<void>;\n}\n\nexport class InMemoryCache<T> implements ICache<T> {\n private readonly cache: Map<string, T> = new Map();\n\n public async get(key: string): Promise<T | undefined> {\n return this.cache.get(key);\n }\n\n public async put(key: string, value: T): Promise<void> {\n this.cache.set(key, value);\n }\n}\n"]}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,OAAO,aAAa;IAA1B;QACqB,UAAK,GAAmB,IAAI,GAAG,EAAE,CAAC;IASvD,CAAC;IAPU,KAAK,CAAC,GAAG,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAQ;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,OAAO,SAAS;IACX,KAAK,CAAC,GAAG,CAAC,GAAW;QACxB,OAAO,SAAS,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAQ;IACtC,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport interface ICache<T> {\n get(key: string): Promise<T | undefined>;\n put(key: string, value: T): Promise<void>;\n}\n\nexport class InMemoryCache<T> implements ICache<T> {\n private readonly cache: Map<string, T> = new Map();\n\n public async get(key: string): Promise<T | undefined> {\n return this.cache.get(key);\n }\n\n public async put(key: string, value: T): Promise<void> {\n this.cache.set(key, value);\n }\n}\n\nexport class NullCache<T> implements ICache<T> {\n public async get(key: string): Promise<T | undefined> {\n return undefined;\n }\n\n public async put(key: string, value: T): Promise<void> {\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"documentDeltaConnection.d.ts","sourceRoot":"","sources":["../src/documentDeltaConnection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAY,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,EAAE,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAMnE;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,uBAAuB;WAChD,MAAM,CACtB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,EAAE,EAAE,OAAO,oBAAoB,EAC/B,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,gBAAgB,EACxB,SAAS,SAAQ,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAgCzD;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,QAAQ,UAAO,GAAG,eAAe;CAU9F"}
1
+ {"version":3,"file":"documentDeltaConnection.d.ts","sourceRoot":"","sources":["../src/documentDeltaConnection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAY,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,EAAE,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAMnE;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,uBAAuB;WAChD,MAAM,CACtB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,EAAE,EAAE,OAAO,oBAAoB,EAC/B,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,gBAAgB,EACxB,SAAS,SAAQ,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAgCzD;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,QAAQ,UAAO,GAAG,eAAe;CAQ9F"}
@@ -43,12 +43,9 @@ export class R11sDocumentDeltaConnection extends DocumentDeltaConnection {
43
43
  // Note: we suspect the incoming error object is either:
44
44
  // - a socketError: add it to the R11sError object for driver to be able to parse it and reason over it.
45
45
  // - anything else: let base class handle it
46
- if (canRetry && Number.isInteger(error === null || error === void 0 ? void 0 : error.code) && typeof (error === null || error === void 0 ? void 0 : error.message) === "string") {
47
- return errorObjectFromSocketError(error, handler);
48
- }
49
- else {
50
- return super.createErrorObject(handler, error, canRetry);
51
- }
46
+ return canRetry && Number.isInteger(error === null || error === void 0 ? void 0 : error.code) && typeof (error === null || error === void 0 ? void 0 : error.message) === "string"
47
+ ? errorObjectFromSocketError(error, handler)
48
+ : super.createErrorObject(handler, error, canRetry);
52
49
  }
53
50
  }
54
51
  //# sourceMappingURL=documentDeltaConnection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"documentDeltaConnection.js","sourceRoot":"","sources":["../src/documentDeltaConnection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAKtE,OAAO,EAAE,0BAA0B,EAAoB,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,UAAU,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAElE;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,uBAAuB;IAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,CACtB,QAAgB,EAChB,EAAU,EACV,KAAoB,EACpB,EAA+B,EAC/B,MAAe,EACf,GAAW,EACX,MAAwB,EACxB,SAAS,GAAG,KAAK;QACjB,MAAM,MAAM,GAAG,EAAE,CACb,GAAG,EACH;YACI,KAAK,EAAE;gBACH,UAAU,EAAE,EAAE;gBACd,QAAQ;aACX;YACD,YAAY,EAAE,KAAK;YACnB,8DAA8D;YAC9D,UAAU,EAAE,CAAC,WAAW,CAAC;YACzB,OAAO,EAAE,SAAS;SACrB,CAAC,CAAC;QAEP,MAAM,cAAc,GAAa;YAC7B,MAAM;YACN,EAAE;YACF,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ;YACR,KAAK;YACL,QAAQ,EAAE,gBAAgB;YAC1B,cAAc,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SAC5F,CAAC;QAEF,wCAAwC;QACxC,MAAM,2BAA2B,GAAG,IAAI,CAAC;QACzC,MAAM,eAAe,GAAG,IAAI,2BAA2B,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAAC;QAEzG,MAAM,eAAe,CAAC,UAAU,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAC5D,OAAO,eAAe,CAAC;IAC3B,CAAC;IAED;;OAEG;IACO,iBAAiB,CAAC,OAAe,EAAE,KAAW,EAAE,QAAQ,GAAG,IAAI;QACrE,wDAAwD;QACxD,wGAAwG;QACxG,4CAA4C;QAC5C,IAAI,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC,IAAI,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,CAAA,KAAK,QAAQ,EAAE;YACjF,OAAO,0BAA0B,CAAC,KAAyB,EAAE,OAAO,CAAC,CAAC;SACzE;aAAM;YACH,OAAO,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;SAC5D;IACL,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { DocumentDeltaConnection } from \"@fluidframework/driver-base\";\nimport { IDocumentDeltaConnection } from \"@fluidframework/driver-definitions\";\nimport { IAnyDriverError } from \"@fluidframework/driver-utils\";\nimport { IClient, IConnect } from \"@fluidframework/protocol-definitions\";\nimport type { io as SocketIOClientStatic } from \"socket.io-client\";\nimport { errorObjectFromSocketError, IR11sSocketError } from \"./errorUtils\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\n\nconst protocolVersions = [\"^0.4.0\", \"^0.3.0\", \"^0.2.0\", \"^0.1.0\"];\n\n/**\n * Wrapper over the shared one for driver specific translation.\n */\nexport class R11sDocumentDeltaConnection extends DocumentDeltaConnection {\n public static async create(\n tenantId: string,\n id: string,\n token: string | null,\n io: typeof SocketIOClientStatic,\n client: IClient,\n url: string,\n logger: ITelemetryLogger,\n timeoutMs = 20000): Promise<IDocumentDeltaConnection> {\n const socket = io(\n url,\n {\n query: {\n documentId: id,\n tenantId,\n },\n reconnection: false,\n // Default to websocket connection, with long-polling disabled\n transports: [\"websocket\"],\n timeout: timeoutMs,\n });\n\n const connectMessage: IConnect = {\n client,\n id,\n mode: client.mode,\n tenantId,\n token, // Token is going to indicate tenant level information, etc...\n versions: protocolVersions,\n relayUserAgent: [client.details.environment, ` driverVersion:${driverVersion}`].join(\";\"),\n };\n\n // TODO: expose to host at factory level\n const enableLongPollingDowngrades = true;\n const deltaConnection = new R11sDocumentDeltaConnection(socket, id, logger, enableLongPollingDowngrades);\n\n await deltaConnection.initialize(connectMessage, timeoutMs);\n return deltaConnection;\n }\n\n /**\n * Error raising for socket.io issues\n */\n protected createErrorObject(handler: string, error?: any, canRetry = true): IAnyDriverError {\n // Note: we suspect the incoming error object is either:\n // - a socketError: add it to the R11sError object for driver to be able to parse it and reason over it.\n // - anything else: let base class handle it\n if (canRetry && Number.isInteger(error?.code) && typeof error?.message === \"string\") {\n return errorObjectFromSocketError(error as IR11sSocketError, handler);\n } else {\n return super.createErrorObject(handler, error, canRetry);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"documentDeltaConnection.js","sourceRoot":"","sources":["../src/documentDeltaConnection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAKtE,OAAO,EAAE,0BAA0B,EAAoB,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,UAAU,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAElE;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,uBAAuB;IAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,CACtB,QAAgB,EAChB,EAAU,EACV,KAAoB,EACpB,EAA+B,EAC/B,MAAe,EACf,GAAW,EACX,MAAwB,EACxB,SAAS,GAAG,KAAK;QACjB,MAAM,MAAM,GAAG,EAAE,CACb,GAAG,EACH;YACI,KAAK,EAAE;gBACH,UAAU,EAAE,EAAE;gBACd,QAAQ;aACX;YACD,YAAY,EAAE,KAAK;YACnB,8DAA8D;YAC9D,UAAU,EAAE,CAAC,WAAW,CAAC;YACzB,OAAO,EAAE,SAAS;SACrB,CAAC,CAAC;QAEP,MAAM,cAAc,GAAa;YAC7B,MAAM;YACN,EAAE;YACF,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ;YACR,KAAK;YACL,QAAQ,EAAE,gBAAgB;YAC1B,cAAc,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SAC5F,CAAC;QAEF,wCAAwC;QACxC,MAAM,2BAA2B,GAAG,IAAI,CAAC;QACzC,MAAM,eAAe,GAAG,IAAI,2BAA2B,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAAC;QAEzG,MAAM,eAAe,CAAC,UAAU,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAC5D,OAAO,eAAe,CAAC;IAC3B,CAAC;IAED;;OAEG;IACO,iBAAiB,CAAC,OAAe,EAAE,KAAW,EAAE,QAAQ,GAAG,IAAI;QACrE,wDAAwD;QACxD,wGAAwG;QACxG,4CAA4C;QAC5C,OAAO,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC,IAAI,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,CAAA,KAAK,QAAQ;YAClF,CAAC,CAAC,0BAA0B,CAAC,KAAyB,EAAE,OAAO,CAAC;YAChE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { DocumentDeltaConnection } from \"@fluidframework/driver-base\";\nimport { IDocumentDeltaConnection } from \"@fluidframework/driver-definitions\";\nimport { IAnyDriverError } from \"@fluidframework/driver-utils\";\nimport { IClient, IConnect } from \"@fluidframework/protocol-definitions\";\nimport type { io as SocketIOClientStatic } from \"socket.io-client\";\nimport { errorObjectFromSocketError, IR11sSocketError } from \"./errorUtils\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\n\nconst protocolVersions = [\"^0.4.0\", \"^0.3.0\", \"^0.2.0\", \"^0.1.0\"];\n\n/**\n * Wrapper over the shared one for driver specific translation.\n */\nexport class R11sDocumentDeltaConnection extends DocumentDeltaConnection {\n public static async create(\n tenantId: string,\n id: string,\n token: string | null,\n io: typeof SocketIOClientStatic,\n client: IClient,\n url: string,\n logger: ITelemetryLogger,\n timeoutMs = 20000): Promise<IDocumentDeltaConnection> {\n const socket = io(\n url,\n {\n query: {\n documentId: id,\n tenantId,\n },\n reconnection: false,\n // Default to websocket connection, with long-polling disabled\n transports: [\"websocket\"],\n timeout: timeoutMs,\n });\n\n const connectMessage: IConnect = {\n client,\n id,\n mode: client.mode,\n tenantId,\n token, // Token is going to indicate tenant level information, etc...\n versions: protocolVersions,\n relayUserAgent: [client.details.environment, ` driverVersion:${driverVersion}`].join(\";\"),\n };\n\n // TODO: expose to host at factory level\n const enableLongPollingDowngrades = true;\n const deltaConnection = new R11sDocumentDeltaConnection(socket, id, logger, enableLongPollingDowngrades);\n\n await deltaConnection.initialize(connectMessage, timeoutMs);\n return deltaConnection;\n }\n\n /**\n * Error raising for socket.io issues\n */\n protected createErrorObject(handler: string, error?: any, canRetry = true): IAnyDriverError {\n // Note: we suspect the incoming error object is either:\n // - a socketError: add it to the R11sError object for driver to be able to parse it and reason over it.\n // - anything else: let base class handle it\n return canRetry && Number.isInteger(error?.code) && typeof error?.message === \"string\"\n ? errorObjectFromSocketError(error as IR11sSocketError, handler)\n : super.createErrorObject(handler, error, canRetry);\n }\n}\n"]}
@@ -17,6 +17,7 @@ export declare class DocumentService implements api.IDocumentService {
17
17
  private _resolvedUrl;
18
18
  protected ordererUrl: string;
19
19
  private deltaStorageUrl;
20
+ private deltaStreamUrl;
20
21
  private storageUrl;
21
22
  private readonly logger;
22
23
  protected tokenProvider: ITokenProvider;
@@ -32,7 +33,7 @@ export declare class DocumentService implements api.IDocumentService {
32
33
  private noCacheStorageManager;
33
34
  private ordererRestWrapper;
34
35
  get resolvedUrl(): api.IResolvedUrl;
35
- constructor(_resolvedUrl: api.IResolvedUrl, ordererUrl: string, deltaStorageUrl: string, storageUrl: string, logger: ITelemetryLogger, tokenProvider: ITokenProvider, tenantId: string, documentId: string, driverPolicies: IRouterliciousDriverPolicies, blobCache: ICache<ArrayBufferLike>, snapshotTreeCache: ICache<ISnapshotTreeVersion>, discoverFluidResolvedUrl: () => Promise<api.IFluidResolvedUrl>);
36
+ constructor(_resolvedUrl: api.IResolvedUrl, ordererUrl: string, deltaStorageUrl: string, deltaStreamUrl: string, storageUrl: string, logger: ITelemetryLogger, tokenProvider: ITokenProvider, tenantId: string, documentId: string, driverPolicies: IRouterliciousDriverPolicies, blobCache: ICache<ArrayBufferLike>, snapshotTreeCache: ICache<ISnapshotTreeVersion>, discoverFluidResolvedUrl: () => Promise<api.IFluidResolvedUrl>);
36
37
  private documentStorageService;
37
38
  dispose(): void;
38
39
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"documentService.d.ts","sourceRoot":"","sources":["../src/documentService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,GAAG,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAI/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAKtE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAUrD;;;GAGG;AACH,qBAAa,eAAgB,YAAW,GAAG,CAAC,gBAAgB;IAapD,OAAO,CAAC,YAAY;IACpB,SAAS,CAAC,UAAU,EAAE,MAAM;IAC5B,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,SAAS,CAAC,aAAa,EAAE,cAAc;IACvC,SAAS,CAAC,QAAQ,EAAE,MAAM;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,wBAAwB;IAvB7C,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,SAAS,CAA4B;IAE7C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,qBAAqB,CAAyB;IACtD,OAAO,CAAC,kBAAkB,CAA0B;IAEpD,IAAW,WAAW,qBAErB;gBAGW,YAAY,EAAE,GAAG,CAAC,YAAY,EAC5B,UAAU,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EACT,MAAM,EAAE,gBAAgB,EAC/B,aAAa,EAAE,cAAc,EAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EACX,cAAc,EAAE,4BAA4B,EAC5C,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,EAClC,iBAAiB,EAAE,MAAM,CAAC,oBAAoB,CAAC,EAC/C,wBAAwB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAInF,OAAO,CAAC,sBAAsB,CAAqC;IAE5D,OAAO;IAEd;;;;OAIG;IACU,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAgErE;;;;OAIG;IACU,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAsC/E;;;;OAIG;IACU,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAoCzF;;OAEG;YACW,gBAAgB;YAahB,oBAAoB;IASlC;;OAEG;IACH,OAAO,CAAC,iCAAiC;CAY5C"}
1
+ {"version":3,"file":"documentService.d.ts","sourceRoot":"","sources":["../src/documentService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,GAAG,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAI/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAKtE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAUrD;;;GAGG;AACH,qBAAa,eAAgB,YAAW,GAAG,CAAC,gBAAgB;IAapD,OAAO,CAAC,YAAY;IACpB,SAAS,CAAC,UAAU,EAAE,MAAM;IAC5B,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,SAAS,CAAC,aAAa,EAAE,cAAc;IACvC,SAAS,CAAC,QAAQ,EAAE,MAAM;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,wBAAwB;IAxB7C,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,SAAS,CAA4B;IAE7C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,qBAAqB,CAAyB;IACtD,OAAO,CAAC,kBAAkB,CAA0B;IAEpD,IAAW,WAAW,qBAErB;gBAGW,YAAY,EAAE,GAAG,CAAC,YAAY,EAC5B,UAAU,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EACT,MAAM,EAAE,gBAAgB,EAC/B,aAAa,EAAE,cAAc,EAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EACX,cAAc,EAAE,4BAA4B,EAC5C,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,EAClC,iBAAiB,EAAE,MAAM,CAAC,oBAAoB,CAAC,EAC/C,wBAAwB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAInF,OAAO,CAAC,sBAAsB,CAAqC;IAE5D,OAAO;IAEd;;;;OAIG;IACU,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAgErE;;;;OAIG;IACU,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAsC/E;;;;OAIG;IACU,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAqCzF;;OAEG;YACW,gBAAgB;YAahB,oBAAoB;IAUlC;;OAEG;IACH,OAAO,CAAC,iCAAiC;CAY5C"}
@@ -25,10 +25,11 @@ const RediscoverAfterTimeSinceDiscoveryMs = 5 * 60000; // 5 minute
25
25
  * clients.
26
26
  */
27
27
  export class DocumentService {
28
- constructor(_resolvedUrl, ordererUrl, deltaStorageUrl, storageUrl, logger, tokenProvider, tenantId, documentId, driverPolicies, blobCache, snapshotTreeCache, discoverFluidResolvedUrl) {
28
+ constructor(_resolvedUrl, ordererUrl, deltaStorageUrl, deltaStreamUrl, storageUrl, logger, tokenProvider, tenantId, documentId, driverPolicies, blobCache, snapshotTreeCache, discoverFluidResolvedUrl) {
29
29
  this._resolvedUrl = _resolvedUrl;
30
30
  this.ordererUrl = ordererUrl;
31
31
  this.deltaStorageUrl = deltaStorageUrl;
32
+ this.deltaStreamUrl = deltaStreamUrl;
32
33
  this.storageUrl = storageUrl;
33
34
  this.logger = logger;
34
35
  this.tokenProvider = tokenProvider;
@@ -117,7 +118,7 @@ export class DocumentService {
117
118
  await this.refreshDiscovery();
118
119
  }
119
120
  const ordererToken = await this.tokenProvider.fetchOrdererToken(this.tenantId, this.documentId, refreshToken);
120
- return R11sDocumentDeltaConnection.create(this.tenantId, this.documentId, ordererToken.jwt, io, client, this.ordererUrl, this.logger);
121
+ return R11sDocumentDeltaConnection.create(this.tenantId, this.documentId, ordererToken.jwt, io, client, this.deltaStreamUrl, this.logger);
121
122
  };
122
123
  // Attempt to establish connection.
123
124
  // Retry with new token on authorization error; otherwise, allow container layer to handle.
@@ -151,6 +152,7 @@ export class DocumentService {
151
152
  this.storageUrl = fluidResolvedUrl.endpoints.storageUrl;
152
153
  this.ordererUrl = fluidResolvedUrl.endpoints.ordererUrl;
153
154
  this.deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl;
155
+ this.deltaStreamUrl = fluidResolvedUrl.endpoints.deltaStreamUrl || this.ordererUrl;
154
156
  this.lastDiscoveredAt = Date.now();
155
157
  }
156
158
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"documentService.js","sourceRoot":"","sources":["../src/documentService.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\";\nimport * as api from \"@fluidframework/driver-definitions\";\nimport { RateLimiter } from \"@fluidframework/driver-utils\";\nimport { IClient } from \"@fluidframework/protocol-definitions\";\nimport { GitManager, Historian, RestWrapper } from \"@fluidframework/server-services-client\";\nimport io from \"socket.io-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { DeltaStorageService, DocumentDeltaStorageService } from \"./deltaStorageService\";\nimport { DocumentStorageService } from \"./documentStorageService\";\nimport { R11sDocumentDeltaConnection } from \"./documentDeltaConnection\";\nimport { NullBlobStorageService } from \"./nullBlobStorageService\";\nimport { ITokenProvider } from \"./tokens\";\nimport { RouterliciousOrdererRestWrapper, RouterliciousStorageRestWrapper } from \"./restWrapper\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ICache } from \"./cache\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\n/**\n * Amount of time between discoveries within which we don't need to rediscover on re-connect.\n * Currently, R11s defines session length at 10 minutes. To avoid any weird unknown edge-cases though,\n * we set the limit to 5 minutes here.\n * In the future, we likely want to retrieve this information from service's \"inactive session\" definition.\n */\nconst RediscoverAfterTimeSinceDiscoveryMs = 5 * 60000; // 5 minute\n\n/**\n * The DocumentService manages the Socket.IO connection and manages routing requests to connected\n * clients.\n */\nexport class DocumentService implements api.IDocumentService {\n private lastDiscoveredAt: number = Date.now();\n private discoverP: Promise<void> | undefined;\n\n private storageManager: GitManager | undefined;\n private noCacheStorageManager: GitManager | undefined;\n private ordererRestWrapper: RestWrapper | undefined;\n\n public get resolvedUrl() {\n return this._resolvedUrl;\n }\n\n constructor(\n private _resolvedUrl: api.IResolvedUrl,\n protected ordererUrl: string,\n private deltaStorageUrl: string,\n private storageUrl: string,\n private readonly logger: ITelemetryLogger,\n protected tokenProvider: ITokenProvider,\n protected tenantId: string,\n protected documentId: string,\n private readonly driverPolicies: IRouterliciousDriverPolicies,\n private readonly blobCache: ICache<ArrayBufferLike>,\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion>,\n private readonly discoverFluidResolvedUrl: () => Promise<api.IFluidResolvedUrl>,\n ) {\n }\n\n private documentStorageService: DocumentStorageService | undefined;\n\n public dispose() { }\n\n /**\n * Connects to a storage endpoint for snapshot service.\n *\n * @returns returns the document storage service for routerlicious driver.\n */\n public async connectToStorage(): Promise<api.IDocumentStorageService> {\n if (this.documentStorageService !== undefined) {\n return this.documentStorageService;\n }\n\n if (this.storageUrl === undefined) {\n return new NullBlobStorageService();\n }\n\n const getStorageManager = async (disableCache?: boolean): Promise<GitManager> => {\n const shouldUpdateDiscoveredSessionInfo = this.shouldUpdateDiscoveredSessionInfo();\n if (shouldUpdateDiscoveredSessionInfo) {\n await this.refreshDiscovery();\n }\n if (!this.storageManager || !this.noCacheStorageManager || shouldUpdateDiscoveredSessionInfo) {\n const rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentStorageRequests);\n const storageRestWrapper = await RouterliciousStorageRestWrapper.load(\n this.tenantId,\n this.documentId,\n this.tokenProvider,\n this.logger,\n rateLimiter,\n this.driverPolicies.enableRestLess,\n this.storageUrl,\n );\n const historian = new Historian(\n this.storageUrl,\n true,\n false,\n storageRestWrapper);\n this.storageManager = new GitManager(historian);\n const noCacheHistorian = new Historian(\n this.storageUrl,\n true,\n true,\n storageRestWrapper);\n this.noCacheStorageManager = new GitManager(noCacheHistorian);\n }\n\n return disableCache ? this.noCacheStorageManager : this.storageManager;\n };\n // Initialize storageManager and noCacheStorageManager\n const storageManager = await getStorageManager();\n const noCacheStorageManager = await getStorageManager(true);\n const documentStorageServicePolicies: api.IDocumentStorageServicePolicies = {\n caching: this.driverPolicies.enablePrefetch\n ? api.LoaderCachingPolicy.Prefetch\n : api.LoaderCachingPolicy.NoCaching,\n minBlobSize: this.driverPolicies.aggregateBlobsSmallerThanBytes,\n };\n\n this.documentStorageService = new DocumentStorageService(\n this.documentId,\n storageManager,\n this.logger,\n documentStorageServicePolicies,\n this.driverPolicies,\n this.blobCache,\n this.snapshotTreeCache,\n noCacheStorageManager,\n getStorageManager);\n return this.documentStorageService;\n }\n\n /**\n * Connects to a delta storage endpoint for getting ops between a range.\n *\n * @returns returns the document delta storage service for routerlicious driver.\n */\n public async connectToDeltaStorage(): Promise<api.IDocumentDeltaStorageService> {\n await this.connectToStorage();\n assert(!!this.documentStorageService, 0x0b1 /* \"Storage service not initialized\" */);\n\n const getRestWrapper = async (): Promise<RestWrapper> => {\n const shouldUpdateDiscoveredSessionInfo = this.shouldUpdateDiscoveredSessionInfo();\n if (shouldUpdateDiscoveredSessionInfo) {\n await this.refreshDiscovery();\n }\n if (!this.ordererRestWrapper || shouldUpdateDiscoveredSessionInfo) {\n const rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);\n this.ordererRestWrapper = await RouterliciousOrdererRestWrapper.load(\n this.tenantId,\n this.documentId,\n this.tokenProvider,\n this.logger,\n rateLimiter,\n this.driverPolicies.enableRestLess,\n );\n }\n return this.ordererRestWrapper;\n };\n const restWrapper = await getRestWrapper();\n const deltaStorageService = new DeltaStorageService(\n this.deltaStorageUrl,\n restWrapper,\n this.logger,\n getRestWrapper,\n () => this.deltaStorageUrl,\n );\n return new DocumentDeltaStorageService(\n this.tenantId,\n this.documentId,\n deltaStorageService,\n this.documentStorageService,\n );\n }\n\n /**\n * Connects to a delta stream endpoint for emitting ops.\n *\n * @returns returns the document delta stream service for routerlicious driver.\n */\n public async connectToDeltaStream(client: IClient): Promise<api.IDocumentDeltaConnection> {\n const connect = async (refreshToken?: boolean) => {\n if (this.shouldUpdateDiscoveredSessionInfo()) {\n await this.refreshDiscovery();\n }\n const ordererToken = await this.tokenProvider.fetchOrdererToken(\n this.tenantId,\n this.documentId,\n refreshToken,\n );\n return R11sDocumentDeltaConnection.create(\n this.tenantId,\n this.documentId,\n ordererToken.jwt,\n io,\n client,\n this.ordererUrl,\n this.logger,\n );\n };\n\n // Attempt to establish connection.\n // Retry with new token on authorization error; otherwise, allow container layer to handle.\n try {\n const connection = await connect();\n return connection;\n } catch (error: any) {\n if (error?.statusCode === 401) {\n // Fetch new token and retry once,\n // otherwise 401 will be bubbled up as non-retriable AuthorizationError.\n return connect(true /* refreshToken */);\n }\n throw error;\n }\n }\n\n /**\n * Re-discover session URLs if necessary.\n */\n private async refreshDiscovery(): Promise<void> {\n if (!this.discoverP) {\n this.discoverP = PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"refreshSessionDiscovery\",\n },\n async () => this.refreshDiscoveryCore(),\n );\n }\n return this.discoverP;\n }\n\n private async refreshDiscoveryCore(): Promise<void> {\n const fluidResolvedUrl = await this.discoverFluidResolvedUrl();\n this._resolvedUrl = fluidResolvedUrl;\n this.storageUrl = fluidResolvedUrl.endpoints.storageUrl;\n this.ordererUrl = fluidResolvedUrl.endpoints.ordererUrl;\n this.deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl;\n this.lastDiscoveredAt = Date.now();\n }\n\n /**\n * Whether enough time has passed since last disconnect to warrant a new discovery call on reconnect.\n */\n private shouldUpdateDiscoveredSessionInfo(): boolean {\n if (!this.driverPolicies.enableDiscovery) {\n return false;\n }\n const now = Date.now();\n // When connection is disconnected, we cannot know if session has moved or document has been deleted\n // without re-doing discovery on the next attempt to connect.\n // Disconnect event is not so reliable in local testing. To ensure re-discovery when necessary,\n // re-discover if enough time has passed since last discovery.\n const pastLastDiscoveryTimeThreshold = (now - this.lastDiscoveredAt) > RediscoverAfterTimeSinceDiscoveryMs;\n return pastLastDiscoveryTimeThreshold;\n }\n}\n"]}
1
+ {"version":3,"file":"documentService.js","sourceRoot":"","sources":["../src/documentService.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\";\nimport * as api from \"@fluidframework/driver-definitions\";\nimport { RateLimiter } from \"@fluidframework/driver-utils\";\nimport { IClient } from \"@fluidframework/protocol-definitions\";\nimport { GitManager, Historian, RestWrapper } from \"@fluidframework/server-services-client\";\nimport io from \"socket.io-client\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { DeltaStorageService, DocumentDeltaStorageService } from \"./deltaStorageService\";\nimport { DocumentStorageService } from \"./documentStorageService\";\nimport { R11sDocumentDeltaConnection } from \"./documentDeltaConnection\";\nimport { NullBlobStorageService } from \"./nullBlobStorageService\";\nimport { ITokenProvider } from \"./tokens\";\nimport { RouterliciousOrdererRestWrapper, RouterliciousStorageRestWrapper } from \"./restWrapper\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ICache } from \"./cache\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\n/**\n * Amount of time between discoveries within which we don't need to rediscover on re-connect.\n * Currently, R11s defines session length at 10 minutes. To avoid any weird unknown edge-cases though,\n * we set the limit to 5 minutes here.\n * In the future, we likely want to retrieve this information from service's \"inactive session\" definition.\n */\nconst RediscoverAfterTimeSinceDiscoveryMs = 5 * 60000; // 5 minute\n\n/**\n * The DocumentService manages the Socket.IO connection and manages routing requests to connected\n * clients.\n */\nexport class DocumentService implements api.IDocumentService {\n private lastDiscoveredAt: number = Date.now();\n private discoverP: Promise<void> | undefined;\n\n private storageManager: GitManager | undefined;\n private noCacheStorageManager: GitManager | undefined;\n private ordererRestWrapper: RestWrapper | undefined;\n\n public get resolvedUrl() {\n return this._resolvedUrl;\n }\n\n constructor(\n private _resolvedUrl: api.IResolvedUrl,\n protected ordererUrl: string,\n private deltaStorageUrl: string,\n private deltaStreamUrl: string,\n private storageUrl: string,\n private readonly logger: ITelemetryLogger,\n protected tokenProvider: ITokenProvider,\n protected tenantId: string,\n protected documentId: string,\n private readonly driverPolicies: IRouterliciousDriverPolicies,\n private readonly blobCache: ICache<ArrayBufferLike>,\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion>,\n private readonly discoverFluidResolvedUrl: () => Promise<api.IFluidResolvedUrl>,\n ) {\n }\n\n private documentStorageService: DocumentStorageService | undefined;\n\n public dispose() { }\n\n /**\n * Connects to a storage endpoint for snapshot service.\n *\n * @returns returns the document storage service for routerlicious driver.\n */\n public async connectToStorage(): Promise<api.IDocumentStorageService> {\n if (this.documentStorageService !== undefined) {\n return this.documentStorageService;\n }\n\n if (this.storageUrl === undefined) {\n return new NullBlobStorageService();\n }\n\n const getStorageManager = async (disableCache?: boolean): Promise<GitManager> => {\n const shouldUpdateDiscoveredSessionInfo = this.shouldUpdateDiscoveredSessionInfo();\n if (shouldUpdateDiscoveredSessionInfo) {\n await this.refreshDiscovery();\n }\n if (!this.storageManager || !this.noCacheStorageManager || shouldUpdateDiscoveredSessionInfo) {\n const rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentStorageRequests);\n const storageRestWrapper = await RouterliciousStorageRestWrapper.load(\n this.tenantId,\n this.documentId,\n this.tokenProvider,\n this.logger,\n rateLimiter,\n this.driverPolicies.enableRestLess,\n this.storageUrl,\n );\n const historian = new Historian(\n this.storageUrl,\n true,\n false,\n storageRestWrapper);\n this.storageManager = new GitManager(historian);\n const noCacheHistorian = new Historian(\n this.storageUrl,\n true,\n true,\n storageRestWrapper);\n this.noCacheStorageManager = new GitManager(noCacheHistorian);\n }\n\n return disableCache ? this.noCacheStorageManager : this.storageManager;\n };\n // Initialize storageManager and noCacheStorageManager\n const storageManager = await getStorageManager();\n const noCacheStorageManager = await getStorageManager(true);\n const documentStorageServicePolicies: api.IDocumentStorageServicePolicies = {\n caching: this.driverPolicies.enablePrefetch\n ? api.LoaderCachingPolicy.Prefetch\n : api.LoaderCachingPolicy.NoCaching,\n minBlobSize: this.driverPolicies.aggregateBlobsSmallerThanBytes,\n };\n\n this.documentStorageService = new DocumentStorageService(\n this.documentId,\n storageManager,\n this.logger,\n documentStorageServicePolicies,\n this.driverPolicies,\n this.blobCache,\n this.snapshotTreeCache,\n noCacheStorageManager,\n getStorageManager);\n return this.documentStorageService;\n }\n\n /**\n * Connects to a delta storage endpoint for getting ops between a range.\n *\n * @returns returns the document delta storage service for routerlicious driver.\n */\n public async connectToDeltaStorage(): Promise<api.IDocumentDeltaStorageService> {\n await this.connectToStorage();\n assert(!!this.documentStorageService, 0x0b1 /* \"Storage service not initialized\" */);\n\n const getRestWrapper = async (): Promise<RestWrapper> => {\n const shouldUpdateDiscoveredSessionInfo = this.shouldUpdateDiscoveredSessionInfo();\n if (shouldUpdateDiscoveredSessionInfo) {\n await this.refreshDiscovery();\n }\n if (!this.ordererRestWrapper || shouldUpdateDiscoveredSessionInfo) {\n const rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);\n this.ordererRestWrapper = await RouterliciousOrdererRestWrapper.load(\n this.tenantId,\n this.documentId,\n this.tokenProvider,\n this.logger,\n rateLimiter,\n this.driverPolicies.enableRestLess,\n );\n }\n return this.ordererRestWrapper;\n };\n const restWrapper = await getRestWrapper();\n const deltaStorageService = new DeltaStorageService(\n this.deltaStorageUrl,\n restWrapper,\n this.logger,\n getRestWrapper,\n () => this.deltaStorageUrl,\n );\n return new DocumentDeltaStorageService(\n this.tenantId,\n this.documentId,\n deltaStorageService,\n this.documentStorageService,\n );\n }\n\n /**\n * Connects to a delta stream endpoint for emitting ops.\n *\n * @returns returns the document delta stream service for routerlicious driver.\n */\n public async connectToDeltaStream(client: IClient): Promise<api.IDocumentDeltaConnection> {\n const connect = async (refreshToken?: boolean) => {\n if (this.shouldUpdateDiscoveredSessionInfo()) {\n await this.refreshDiscovery();\n }\n const ordererToken = await this.tokenProvider.fetchOrdererToken(\n this.tenantId,\n this.documentId,\n refreshToken,\n );\n\n return R11sDocumentDeltaConnection.create(\n this.tenantId,\n this.documentId,\n ordererToken.jwt,\n io,\n client,\n this.deltaStreamUrl,\n this.logger,\n );\n };\n\n // Attempt to establish connection.\n // Retry with new token on authorization error; otherwise, allow container layer to handle.\n try {\n const connection = await connect();\n return connection;\n } catch (error: any) {\n if (error?.statusCode === 401) {\n // Fetch new token and retry once,\n // otherwise 401 will be bubbled up as non-retriable AuthorizationError.\n return connect(true /* refreshToken */);\n }\n throw error;\n }\n }\n\n /**\n * Re-discover session URLs if necessary.\n */\n private async refreshDiscovery(): Promise<void> {\n if (!this.discoverP) {\n this.discoverP = PerformanceEvent.timedExecAsync(\n this.logger,\n {\n eventName: \"refreshSessionDiscovery\",\n },\n async () => this.refreshDiscoveryCore(),\n );\n }\n return this.discoverP;\n }\n\n private async refreshDiscoveryCore(): Promise<void> {\n const fluidResolvedUrl = await this.discoverFluidResolvedUrl();\n this._resolvedUrl = fluidResolvedUrl;\n this.storageUrl = fluidResolvedUrl.endpoints.storageUrl;\n this.ordererUrl = fluidResolvedUrl.endpoints.ordererUrl;\n this.deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl;\n this.deltaStreamUrl = fluidResolvedUrl.endpoints.deltaStreamUrl || this.ordererUrl;\n this.lastDiscoveredAt = Date.now();\n }\n\n /**\n * Whether enough time has passed since last disconnect to warrant a new discovery call on reconnect.\n */\n private shouldUpdateDiscoveredSessionInfo(): boolean {\n if (!this.driverPolicies.enableDiscovery) {\n return false;\n }\n const now = Date.now();\n // When connection is disconnected, we cannot know if session has moved or document has been deleted\n // without re-doing discovery on the next attempt to connect.\n // Disconnect event is not so reliable in local testing. To ensure re-discovery when necessary,\n // re-discover if enough time has passed since last discovery.\n const pastLastDiscoveryTimeThreshold = (now - this.lastDiscoveredAt) > RediscoverAfterTimeSinceDiscoveryMs;\n return pastLastDiscoveryTimeThreshold;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"documentServiceFactory.d.ts","sourceRoot":"","sources":["../src/documentServiceFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,gBAAgB,EAChB,uBAAuB,EAEvB,YAAY,EACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAQpE,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAElE,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAkB1C;;;GAGG;AACH,qBAAa,mCAAoC,YAAW,uBAAuB;IAO3E,OAAO,CAAC,QAAQ,CAAC,aAAa;IANlC,SAAgB,YAAY,YAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAClE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6C;gBAG1D,aAAa,EAAE,cAAc,EAC9C,cAAc,GAAE,OAAO,CAAC,4BAA4B,CAAM;IAQ9D;;;;;OAKG;IACU,eAAe,CACxB,gBAAgB,EAAE,YAAY,GAAG,SAAS,EAC1C,WAAW,EAAE,YAAY,EACzB,MAAM,CAAC,EAAE,oBAAoB,EAC7B,kBAAkB,CAAC,EAAE,OAAO,GAC7B,OAAO,CAAC,gBAAgB,CAAC;IA+F5B;;;;OAIG;IACU,qBAAqB,CAC9B,WAAW,EAAE,YAAY,EACzB,MAAM,CAAC,EAAE,oBAAoB,EAC7B,kBAAkB,CAAC,EAAE,OAAO,EAC5B,OAAO,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,gBAAgB,CAAC;CAyD/B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAE1C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU;;IAH3B;;OAEG;IACc,UAAU,EAAE,KAAK;IAKtC,SAAgB,IAAI,6BAA6B;IAEjD,IAAW,KAAK,uBAAoC;CACvD"}
1
+ {"version":3,"file":"documentServiceFactory.d.ts","sourceRoot":"","sources":["../src/documentServiceFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,gBAAgB,EAChB,uBAAuB,EAEvB,YAAY,EACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAQpE,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAElE,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAmB1C;;;GAGG;AACH,qBAAa,mCAAoC,YAAW,uBAAuB;IAO3E,OAAO,CAAC,QAAQ,CAAC,aAAa;IANlC,SAAgB,YAAY,YAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;gBAG5C,aAAa,EAAE,cAAc,EAC9C,cAAc,GAAE,OAAO,CAAC,4BAA4B,CAAM;IAY9D;;;;;OAKG;IACU,eAAe,CACxB,gBAAgB,EAAE,YAAY,GAAG,SAAS,EAC1C,WAAW,EAAE,YAAY,EACzB,MAAM,CAAC,EAAE,oBAAoB,EAC7B,kBAAkB,CAAC,EAAE,OAAO,GAC7B,OAAO,CAAC,gBAAgB,CAAC;IA+F5B;;;;OAIG;IACU,qBAAqB,CAC9B,WAAW,EAAE,YAAY,EACzB,MAAM,CAAC,EAAE,oBAAoB,EAC7B,kBAAkB,CAAC,EAAE,OAAO,EAC5B,OAAO,CAAC,EAAE,QAAQ,GACnB,OAAO,CAAC,gBAAgB,CAAC;CA2D/B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAE1C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU;;IAH3B;;OAEG;IACc,UAAU,EAAE,KAAK;IAKtC,SAAgB,IAAI,6BAA6B;IAEjD,IAAW,KAAK,uBAAoC;CACvD"}
@@ -9,7 +9,7 @@ import { DocumentService } from "./documentService";
9
9
  import { RouterliciousOrdererRestWrapper } from "./restWrapper";
10
10
  import { convertSummaryToCreateNewSummary } from "./createNewUtils";
11
11
  import { parseFluidUrl, replaceDocumentIdInPath, getDiscoveredFluidResolvedUrl } from "./urlUtils";
12
- import { InMemoryCache } from "./cache";
12
+ import { InMemoryCache, NullCache } from "./cache";
13
13
  import { pkgVersion as driverVersion } from "./packageVersion";
14
14
  const defaultRouterliciousDriverPolicies = {
15
15
  enablePrefetch: true,
@@ -19,6 +19,7 @@ const defaultRouterliciousDriverPolicies = {
19
19
  enableDiscovery: false,
20
20
  enableWholeSummaryUpload: false,
21
21
  enableRestLess: true,
22
+ enableInternalSummaryCaching: true,
22
23
  };
23
24
  /**
24
25
  * Factory for creating the routerlicious document service. Use this if you want to
@@ -28,9 +29,11 @@ export class RouterliciousDocumentServiceFactory {
28
29
  constructor(tokenProvider, driverPolicies = {}) {
29
30
  this.tokenProvider = tokenProvider;
30
31
  this.protocolName = "fluid:";
31
- this.blobCache = new InMemoryCache();
32
- this.snapshotTreeCache = new InMemoryCache();
33
32
  this.driverPolicies = Object.assign(Object.assign({}, defaultRouterliciousDriverPolicies), driverPolicies);
33
+ this.blobCache = new InMemoryCache();
34
+ this.snapshotTreeCache = this.driverPolicies.enableInternalSummaryCaching
35
+ ? new InMemoryCache()
36
+ : new NullCache();
34
37
  }
35
38
  /**
36
39
  * {@inheritDoc @fluidframework/driver-definitions#IDocumentServiceFactory.createContainer}
@@ -130,10 +133,11 @@ export class RouterliciousDocumentServiceFactory {
130
133
  const storageUrl = fluidResolvedUrl.endpoints.storageUrl;
131
134
  const ordererUrl = fluidResolvedUrl.endpoints.ordererUrl;
132
135
  const deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl;
136
+ const deltaStreamUrl = fluidResolvedUrl.endpoints.deltaStreamUrl || ordererUrl; // backward compatibility
133
137
  if (!ordererUrl || !deltaStorageUrl) {
134
138
  throw new Error(`All endpoints urls must be provided. [ordererUrl:${ordererUrl}][deltaStorageUrl:${deltaStorageUrl}]`);
135
139
  }
136
- return new DocumentService(fluidResolvedUrl, ordererUrl, deltaStorageUrl, storageUrl, logger2, this.tokenProvider, tenantId, documentId, this.driverPolicies, this.blobCache, this.snapshotTreeCache, discoverFluidResolvedUrl);
140
+ return new DocumentService(fluidResolvedUrl, ordererUrl, deltaStorageUrl, deltaStreamUrl, storageUrl, logger2, this.tokenProvider, tenantId, documentId, this.driverPolicies, this.blobCache, this.snapshotTreeCache, discoverFluidResolvedUrl);
137
141
  }
138
142
  }
139
143
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"documentServiceFactory.js","sourceRoot":"","sources":["../src/documentServiceFactory.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\";\nimport {\n IDocumentService,\n IDocumentServiceFactory,\n IFluidResolvedUrl,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport {\n ensureFluidResolvedUrl,\n getDocAttributesFromProtocolSummary,\n getQuorumValuesFromProtocolSummary,\n RateLimiter,\n} from \"@fluidframework/driver-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISession } from \"@fluidframework/server-services-client\";\nimport { DocumentService } from \"./documentService\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ITokenProvider } from \"./tokens\";\nimport { RouterliciousOrdererRestWrapper } from \"./restWrapper\";\nimport { convertSummaryToCreateNewSummary } from \"./createNewUtils\";\nimport { parseFluidUrl, replaceDocumentIdInPath, getDiscoveredFluidResolvedUrl } from \"./urlUtils\";\nimport { InMemoryCache } from \"./cache\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\nconst defaultRouterliciousDriverPolicies: IRouterliciousDriverPolicies = {\n enablePrefetch: true,\n maxConcurrentStorageRequests: 100,\n maxConcurrentOrdererRequests: 100,\n aggregateBlobsSmallerThanBytes: undefined,\n enableDiscovery: false,\n enableWholeSummaryUpload: false,\n enableRestLess: true,\n};\n\n/**\n * Factory for creating the routerlicious document service. Use this if you want to\n * use the routerlicious implementation.\n */\nexport class RouterliciousDocumentServiceFactory implements IDocumentServiceFactory {\n public readonly protocolName = \"fluid:\";\n private readonly driverPolicies: IRouterliciousDriverPolicies;\n private readonly blobCache = new InMemoryCache<ArrayBufferLike>();\n private readonly snapshotTreeCache = new InMemoryCache<ISnapshotTreeVersion>();\n\n constructor(\n private readonly tokenProvider: ITokenProvider,\n driverPolicies: Partial<IRouterliciousDriverPolicies> = {},\n ) {\n this.driverPolicies = {\n ...defaultRouterliciousDriverPolicies,\n ...driverPolicies,\n };\n }\n\n /**\n * {@inheritDoc @fluidframework/driver-definitions#IDocumentServiceFactory.createContainer}\n *\n * @throws {@link DocumentPostCreateError}\n * If an exception is thrown while invoking the provided {@link ITokenProvider.documentPostCreateCallback}.\n */\n public async createContainer(\n createNewSummary: ISummaryTree | undefined,\n resolvedUrl: IResolvedUrl,\n logger?: ITelemetryBaseLogger,\n clientIsSummarizer?: boolean,\n ): Promise<IDocumentService> {\n ensureFluidResolvedUrl(resolvedUrl);\n if (createNewSummary === undefined) {\n throw new Error(\"Empty file summary creation isn't supported in this driver.\");\n }\n assert(!!resolvedUrl.endpoints.ordererUrl, 0x0b2 /* \"Missing orderer URL!\" */);\n let parsedUrl = parseFluidUrl(resolvedUrl.url);\n if (!parsedUrl.pathname) {\n throw new Error(\"Parsed url should contain tenant and doc Id!!\");\n }\n const [, tenantId] = parsedUrl.pathname.split(\"/\");\n\n const protocolSummary = createNewSummary.tree[\".protocol\"] as ISummaryTree;\n const appSummary = createNewSummary.tree[\".app\"] as ISummaryTree;\n if (!(protocolSummary && appSummary)) {\n throw new Error(\"Protocol and App Summary required in the full summary\");\n }\n const documentAttributes = getDocAttributesFromProtocolSummary(protocolSummary);\n const quorumValues = getQuorumValuesFromProtocolSummary(protocolSummary);\n\n const logger2 = ChildLogger.create(logger, \"RouterliciousDriver\");\n const rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);\n const ordererRestWrapper = await RouterliciousOrdererRestWrapper.load(\n tenantId,\n undefined,\n this.tokenProvider,\n logger2,\n rateLimiter,\n this.driverPolicies.enableRestLess,\n resolvedUrl.endpoints.ordererUrl,\n );\n\n // @TODO: Remove returned \"string\" type when removing back-compat code\n const res = await ordererRestWrapper.post<{ id: string; token?: string; session?: ISession; } | string>(\n `/documents/${tenantId}`,\n {\n summary: convertSummaryToCreateNewSummary(appSummary),\n sequenceNumber: documentAttributes.sequenceNumber,\n values: quorumValues,\n enableDiscovery: this.driverPolicies.enableDiscovery,\n generateToken: this.tokenProvider.documentPostCreateCallback !== undefined,\n },\n );\n\n // For supporting backward compatibility, when the request has generateToken === true, it will return\n // an object instead of string\n // @TODO: Remove the logic when no need to support back-compat\n\n let documentId: string;\n let token: string | undefined;\n let session: ISession | undefined;\n if (typeof res === \"string\") {\n documentId = res;\n } else {\n documentId = res.id;\n token = res.token;\n session = this.driverPolicies.enableDiscovery ? res.session : undefined;\n }\n parsedUrl = parseFluidUrl(resolvedUrl.url);\n\n // @TODO: Remove token from the condition, checking the documentPostCreateCallback !== undefined\n // is sufficient to determine if the token will be undefined or not.\n if (token && this.tokenProvider.documentPostCreateCallback !== undefined) {\n try {\n await this.tokenProvider.documentPostCreateCallback(documentId, token);\n } catch (error: any) {\n throw new DocumentPostCreateError(error);\n }\n }\n\n parsedUrl.set(\"pathname\", replaceDocumentIdInPath(parsedUrl.pathname, documentId));\n const deltaStorageUrl = resolvedUrl.endpoints.deltaStorageUrl;\n if (!deltaStorageUrl) {\n throw new Error(\n `All endpoints urls must be provided. [deltaStorageUrl:${deltaStorageUrl}]`);\n }\n const parsedDeltaStorageUrl = new URL(deltaStorageUrl);\n parsedDeltaStorageUrl.pathname = replaceDocumentIdInPath(parsedDeltaStorageUrl.pathname, documentId);\n\n return this.createDocumentService(\n {\n ...resolvedUrl,\n url: parsedUrl.toString(),\n id: documentId,\n endpoints: {\n ...resolvedUrl.endpoints,\n deltaStorageUrl: parsedDeltaStorageUrl.toString(),\n },\n },\n logger,\n clientIsSummarizer,\n session,\n );\n }\n\n /**\n * {@inheritDoc @fluidframework/driver-definitions#IDocumentServiceFactory.createDocumentService}\n *\n * @returns Routerlicious document service.\n */\n public async createDocumentService(\n resolvedUrl: IResolvedUrl,\n logger?: ITelemetryBaseLogger,\n clientIsSummarizer?: boolean,\n session?: ISession,\n ): Promise<IDocumentService> {\n ensureFluidResolvedUrl(resolvedUrl);\n\n const parsedUrl = parseFluidUrl(resolvedUrl.url);\n const [, tenantId, documentId] = parsedUrl.pathname.split(\"/\");\n if (!documentId || !tenantId) {\n throw new Error(\n `Couldn't parse documentId and/or tenantId. [documentId:${documentId}][tenantId:${tenantId}]`);\n }\n const logger2 = ChildLogger.create(logger, \"RouterliciousDriver\", { all: { driverVersion } });\n\n const discoverFluidResolvedUrl = async (): Promise<IFluidResolvedUrl> => {\n if (!this.driverPolicies.enableDiscovery) {\n return resolvedUrl;\n }\n const rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);\n const ordererRestWrapper = await RouterliciousOrdererRestWrapper.load(\n tenantId,\n documentId,\n this.tokenProvider,\n logger2,\n rateLimiter,\n this.driverPolicies.enableRestLess,\n resolvedUrl.endpoints.ordererUrl,\n );\n // The service responds with the current document session associated with the container.\n const discoveredSession = await ordererRestWrapper.get<ISession>(\n `/documents/${tenantId}/session/${documentId}`,\n );\n return getDiscoveredFluidResolvedUrl(resolvedUrl, discoveredSession);\n };\n const fluidResolvedUrl: IFluidResolvedUrl = session !== undefined\n ? getDiscoveredFluidResolvedUrl(resolvedUrl, session)\n : await discoverFluidResolvedUrl();\n\n const storageUrl = fluidResolvedUrl.endpoints.storageUrl;\n const ordererUrl = fluidResolvedUrl.endpoints.ordererUrl;\n const deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl;\n if (!ordererUrl || !deltaStorageUrl) {\n throw new Error(\n `All endpoints urls must be provided. [ordererUrl:${ordererUrl}][deltaStorageUrl:${deltaStorageUrl}]`);\n }\n\n return new DocumentService(\n fluidResolvedUrl,\n ordererUrl,\n deltaStorageUrl,\n storageUrl,\n logger2,\n this.tokenProvider,\n tenantId,\n documentId,\n this.driverPolicies,\n this.blobCache,\n this.snapshotTreeCache,\n discoverFluidResolvedUrl);\n }\n}\n\n/**\n * Error returned by {@link RouterliciousDocumentServiceFactory.createContainer} when an error is thrown\n * in {@link ITokenProvider.documentPostCreateCallback}.\n * It is the consumer's responsibility to ensure that any state related to container creation is appropriately\n * cleaned up in the event of failure.\n * This includes the document itself, which will have been created by the time this error was thrown.\n *\n * @remarks TODO: examples of suggested actions for recovery.\n * - How would a user delete the created document?\n * - What would a retry pattern look like here?\n */\nexport class DocumentPostCreateError extends Error {\n public constructor(\n /**\n * Inner error being wrapped.\n */\n private readonly innerError: Error,\n ) {\n super(innerError.message);\n }\n\n public readonly name = \"DocumentPostCreateError\";\n\n public get stack() { return this.innerError.stack; }\n}\n"]}
1
+ {"version":3,"file":"documentServiceFactory.js","sourceRoot":"","sources":["../src/documentServiceFactory.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\";\nimport {\n IDocumentService,\n IDocumentServiceFactory,\n IFluidResolvedUrl,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport {\n ensureFluidResolvedUrl,\n getDocAttributesFromProtocolSummary,\n getQuorumValuesFromProtocolSummary,\n RateLimiter,\n} from \"@fluidframework/driver-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { ISession } from \"@fluidframework/server-services-client\";\nimport { DocumentService } from \"./documentService\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ITokenProvider } from \"./tokens\";\nimport { RouterliciousOrdererRestWrapper } from \"./restWrapper\";\nimport { convertSummaryToCreateNewSummary } from \"./createNewUtils\";\nimport { parseFluidUrl, replaceDocumentIdInPath, getDiscoveredFluidResolvedUrl } from \"./urlUtils\";\nimport { ICache, InMemoryCache, NullCache } from \"./cache\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\nconst defaultRouterliciousDriverPolicies: IRouterliciousDriverPolicies = {\n enablePrefetch: true,\n maxConcurrentStorageRequests: 100,\n maxConcurrentOrdererRequests: 100,\n aggregateBlobsSmallerThanBytes: undefined,\n enableDiscovery: false,\n enableWholeSummaryUpload: false,\n enableRestLess: true,\n enableInternalSummaryCaching: true,\n};\n\n/**\n * Factory for creating the routerlicious document service. Use this if you want to\n * use the routerlicious implementation.\n */\nexport class RouterliciousDocumentServiceFactory implements IDocumentServiceFactory {\n public readonly protocolName = \"fluid:\";\n private readonly driverPolicies: IRouterliciousDriverPolicies;\n private readonly blobCache: ICache<ArrayBufferLike>;\n private readonly snapshotTreeCache: ICache<ISnapshotTreeVersion>;\n\n constructor(\n private readonly tokenProvider: ITokenProvider,\n driverPolicies: Partial<IRouterliciousDriverPolicies> = {},\n ) {\n this.driverPolicies = {\n ...defaultRouterliciousDriverPolicies,\n ...driverPolicies,\n };\n this.blobCache = new InMemoryCache<ArrayBufferLike>();\n this.snapshotTreeCache = this.driverPolicies.enableInternalSummaryCaching\n ? new InMemoryCache<ISnapshotTreeVersion>()\n : new NullCache<ISnapshotTreeVersion>();\n }\n\n /**\n * {@inheritDoc @fluidframework/driver-definitions#IDocumentServiceFactory.createContainer}\n *\n * @throws {@link DocumentPostCreateError}\n * If an exception is thrown while invoking the provided {@link ITokenProvider.documentPostCreateCallback}.\n */\n public async createContainer(\n createNewSummary: ISummaryTree | undefined,\n resolvedUrl: IResolvedUrl,\n logger?: ITelemetryBaseLogger,\n clientIsSummarizer?: boolean,\n ): Promise<IDocumentService> {\n ensureFluidResolvedUrl(resolvedUrl);\n if (createNewSummary === undefined) {\n throw new Error(\"Empty file summary creation isn't supported in this driver.\");\n }\n assert(!!resolvedUrl.endpoints.ordererUrl, 0x0b2 /* \"Missing orderer URL!\" */);\n let parsedUrl = parseFluidUrl(resolvedUrl.url);\n if (!parsedUrl.pathname) {\n throw new Error(\"Parsed url should contain tenant and doc Id!!\");\n }\n const [, tenantId] = parsedUrl.pathname.split(\"/\");\n\n const protocolSummary = createNewSummary.tree[\".protocol\"] as ISummaryTree;\n const appSummary = createNewSummary.tree[\".app\"] as ISummaryTree;\n if (!(protocolSummary && appSummary)) {\n throw new Error(\"Protocol and App Summary required in the full summary\");\n }\n const documentAttributes = getDocAttributesFromProtocolSummary(protocolSummary);\n const quorumValues = getQuorumValuesFromProtocolSummary(protocolSummary);\n\n const logger2 = ChildLogger.create(logger, \"RouterliciousDriver\");\n const rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);\n const ordererRestWrapper = await RouterliciousOrdererRestWrapper.load(\n tenantId,\n undefined,\n this.tokenProvider,\n logger2,\n rateLimiter,\n this.driverPolicies.enableRestLess,\n resolvedUrl.endpoints.ordererUrl,\n );\n\n // @TODO: Remove returned \"string\" type when removing back-compat code\n const res = await ordererRestWrapper.post<{ id: string; token?: string; session?: ISession; } | string>(\n `/documents/${tenantId}`,\n {\n summary: convertSummaryToCreateNewSummary(appSummary),\n sequenceNumber: documentAttributes.sequenceNumber,\n values: quorumValues,\n enableDiscovery: this.driverPolicies.enableDiscovery,\n generateToken: this.tokenProvider.documentPostCreateCallback !== undefined,\n },\n );\n\n // For supporting backward compatibility, when the request has generateToken === true, it will return\n // an object instead of string\n // @TODO: Remove the logic when no need to support back-compat\n\n let documentId: string;\n let token: string | undefined;\n let session: ISession | undefined;\n if (typeof res === \"string\") {\n documentId = res;\n } else {\n documentId = res.id;\n token = res.token;\n session = this.driverPolicies.enableDiscovery ? res.session : undefined;\n }\n parsedUrl = parseFluidUrl(resolvedUrl.url);\n\n // @TODO: Remove token from the condition, checking the documentPostCreateCallback !== undefined\n // is sufficient to determine if the token will be undefined or not.\n if (token && this.tokenProvider.documentPostCreateCallback !== undefined) {\n try {\n await this.tokenProvider.documentPostCreateCallback(documentId, token);\n } catch (error: any) {\n throw new DocumentPostCreateError(error);\n }\n }\n\n parsedUrl.set(\"pathname\", replaceDocumentIdInPath(parsedUrl.pathname, documentId));\n const deltaStorageUrl = resolvedUrl.endpoints.deltaStorageUrl;\n if (!deltaStorageUrl) {\n throw new Error(\n `All endpoints urls must be provided. [deltaStorageUrl:${deltaStorageUrl}]`);\n }\n const parsedDeltaStorageUrl = new URL(deltaStorageUrl);\n parsedDeltaStorageUrl.pathname = replaceDocumentIdInPath(parsedDeltaStorageUrl.pathname, documentId);\n\n return this.createDocumentService(\n {\n ...resolvedUrl,\n url: parsedUrl.toString(),\n id: documentId,\n endpoints: {\n ...resolvedUrl.endpoints,\n deltaStorageUrl: parsedDeltaStorageUrl.toString(),\n },\n },\n logger,\n clientIsSummarizer,\n session,\n );\n }\n\n /**\n * {@inheritDoc @fluidframework/driver-definitions#IDocumentServiceFactory.createDocumentService}\n *\n * @returns Routerlicious document service.\n */\n public async createDocumentService(\n resolvedUrl: IResolvedUrl,\n logger?: ITelemetryBaseLogger,\n clientIsSummarizer?: boolean,\n session?: ISession,\n ): Promise<IDocumentService> {\n ensureFluidResolvedUrl(resolvedUrl);\n\n const parsedUrl = parseFluidUrl(resolvedUrl.url);\n const [, tenantId, documentId] = parsedUrl.pathname.split(\"/\");\n if (!documentId || !tenantId) {\n throw new Error(\n `Couldn't parse documentId and/or tenantId. [documentId:${documentId}][tenantId:${tenantId}]`);\n }\n const logger2 = ChildLogger.create(logger, \"RouterliciousDriver\", { all: { driverVersion } });\n\n const discoverFluidResolvedUrl = async (): Promise<IFluidResolvedUrl> => {\n if (!this.driverPolicies.enableDiscovery) {\n return resolvedUrl;\n }\n const rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);\n const ordererRestWrapper = await RouterliciousOrdererRestWrapper.load(\n tenantId,\n documentId,\n this.tokenProvider,\n logger2,\n rateLimiter,\n this.driverPolicies.enableRestLess,\n resolvedUrl.endpoints.ordererUrl,\n );\n // The service responds with the current document session associated with the container.\n const discoveredSession = await ordererRestWrapper.get<ISession>(\n `/documents/${tenantId}/session/${documentId}`,\n );\n return getDiscoveredFluidResolvedUrl(resolvedUrl, discoveredSession);\n };\n const fluidResolvedUrl: IFluidResolvedUrl = session !== undefined\n ? getDiscoveredFluidResolvedUrl(resolvedUrl, session)\n : await discoverFluidResolvedUrl();\n\n const storageUrl = fluidResolvedUrl.endpoints.storageUrl;\n const ordererUrl = fluidResolvedUrl.endpoints.ordererUrl;\n const deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl;\n const deltaStreamUrl = fluidResolvedUrl.endpoints.deltaStreamUrl || ordererUrl; // backward compatibility\n if (!ordererUrl || !deltaStorageUrl) {\n throw new Error(\n `All endpoints urls must be provided. [ordererUrl:${ordererUrl}][deltaStorageUrl:${deltaStorageUrl}]`);\n }\n\n return new DocumentService(\n fluidResolvedUrl,\n ordererUrl,\n deltaStorageUrl,\n deltaStreamUrl,\n storageUrl,\n logger2,\n this.tokenProvider,\n tenantId,\n documentId,\n this.driverPolicies,\n this.blobCache,\n this.snapshotTreeCache,\n discoverFluidResolvedUrl);\n }\n}\n\n/**\n * Error returned by {@link RouterliciousDocumentServiceFactory.createContainer} when an error is thrown\n * in {@link ITokenProvider.documentPostCreateCallback}.\n * It is the consumer's responsibility to ensure that any state related to container creation is appropriately\n * cleaned up in the event of failure.\n * This includes the document itself, which will have been created by the time this error was thrown.\n *\n * @remarks TODO: examples of suggested actions for recovery.\n * - How would a user delete the created document?\n * - What would a retry pattern look like here?\n */\nexport class DocumentPostCreateError extends Error {\n public constructor(\n /**\n * Inner error being wrapped.\n */\n private readonly innerError: Error,\n ) {\n super(innerError.message);\n }\n\n public readonly name = \"DocumentPostCreateError\";\n\n public get stack() { return this.innerError.stack; }\n}\n"]}