@fluidframework/routerlicious-driver 2.0.0-dev.2.3.0.115467 → 2.0.0-dev.4.1.0.148229

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/.eslintrc.js +10 -12
  2. package/.mocharc.js +2 -2
  3. package/README.md +1 -1
  4. package/api-extractor.json +2 -2
  5. package/dist/cache.d.ts +3 -0
  6. package/dist/cache.d.ts.map +1 -1
  7. package/dist/cache.js +6 -4
  8. package/dist/cache.js.map +1 -1
  9. package/dist/createNewUtils.d.ts.map +1 -1
  10. package/dist/createNewUtils.js +4 -2
  11. package/dist/createNewUtils.js.map +1 -1
  12. package/dist/defaultTokenProvider.d.ts.map +1 -1
  13. package/dist/defaultTokenProvider.js.map +1 -1
  14. package/dist/definitions.d.ts.map +1 -1
  15. package/dist/definitions.js.map +1 -1
  16. package/dist/deltaStorageService.d.ts.map +1 -1
  17. package/dist/deltaStorageService.js +4 -1
  18. package/dist/deltaStorageService.js.map +1 -1
  19. package/dist/documentDeltaConnection.d.ts.map +1 -1
  20. package/dist/documentDeltaConnection.js.map +1 -1
  21. package/dist/documentService.d.ts +4 -2
  22. package/dist/documentService.d.ts.map +1 -1
  23. package/dist/documentService.js +28 -41
  24. package/dist/documentService.js.map +1 -1
  25. package/dist/documentServiceFactory.d.ts +0 -1
  26. package/dist/documentServiceFactory.d.ts.map +1 -1
  27. package/dist/documentServiceFactory.js +26 -13
  28. package/dist/documentServiceFactory.js.map +1 -1
  29. package/dist/documentStorageService.d.ts +1 -1
  30. package/dist/documentStorageService.d.ts.map +1 -1
  31. package/dist/documentStorageService.js +8 -6
  32. package/dist/documentStorageService.js.map +1 -1
  33. package/dist/errorUtils.d.ts +11 -3
  34. package/dist/errorUtils.d.ts.map +1 -1
  35. package/dist/errorUtils.js +19 -6
  36. package/dist/errorUtils.js.map +1 -1
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +4 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/mapWithExpiration.d.ts +34 -0
  42. package/dist/mapWithExpiration.d.ts.map +1 -0
  43. package/dist/mapWithExpiration.js +105 -0
  44. package/dist/mapWithExpiration.js.map +1 -0
  45. package/dist/nullBlobStorageService.d.ts.map +1 -1
  46. package/dist/nullBlobStorageService.js.map +1 -1
  47. package/dist/packageVersion.d.ts +1 -1
  48. package/dist/packageVersion.js +1 -1
  49. package/dist/packageVersion.js.map +1 -1
  50. package/dist/policies.d.ts.map +1 -1
  51. package/dist/policies.js.map +1 -1
  52. package/dist/restWrapper.d.ts +8 -5
  53. package/dist/restWrapper.d.ts.map +1 -1
  54. package/dist/restWrapper.js +38 -44
  55. package/dist/restWrapper.js.map +1 -1
  56. package/dist/retriableGitManager.d.ts.map +1 -1
  57. package/dist/retriableGitManager.js.map +1 -1
  58. package/dist/shreddedSummaryDocumentStorageService.d.ts +1 -1
  59. package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  60. package/dist/shreddedSummaryDocumentStorageService.js +9 -5
  61. package/dist/shreddedSummaryDocumentStorageService.js.map +1 -1
  62. package/dist/tokens.d.ts +24 -7
  63. package/dist/tokens.d.ts.map +1 -1
  64. package/dist/tokens.js.map +1 -1
  65. package/dist/treeUtils.d.ts +51 -0
  66. package/dist/treeUtils.d.ts.map +1 -0
  67. package/dist/treeUtils.js +85 -0
  68. package/dist/treeUtils.js.map +1 -0
  69. package/dist/urlUtils.d.ts.map +1 -1
  70. package/dist/urlUtils.js.map +1 -1
  71. package/dist/wholeSummaryDocumentStorageService.d.ts +1 -1
  72. package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  73. package/dist/wholeSummaryDocumentStorageService.js +30 -17
  74. package/dist/wholeSummaryDocumentStorageService.js.map +1 -1
  75. package/lib/cache.d.ts +3 -0
  76. package/lib/cache.d.ts.map +1 -1
  77. package/lib/cache.js +6 -4
  78. package/lib/cache.js.map +1 -1
  79. package/lib/createNewUtils.d.ts.map +1 -1
  80. package/lib/createNewUtils.js +4 -2
  81. package/lib/createNewUtils.js.map +1 -1
  82. package/lib/defaultTokenProvider.d.ts.map +1 -1
  83. package/lib/defaultTokenProvider.js.map +1 -1
  84. package/lib/definitions.d.ts.map +1 -1
  85. package/lib/definitions.js.map +1 -1
  86. package/lib/deltaStorageService.d.ts.map +1 -1
  87. package/lib/deltaStorageService.js +4 -1
  88. package/lib/deltaStorageService.js.map +1 -1
  89. package/lib/documentDeltaConnection.d.ts.map +1 -1
  90. package/lib/documentDeltaConnection.js.map +1 -1
  91. package/lib/documentService.d.ts +4 -2
  92. package/lib/documentService.d.ts.map +1 -1
  93. package/lib/documentService.js +30 -24
  94. package/lib/documentService.js.map +1 -1
  95. package/lib/documentServiceFactory.d.ts +0 -1
  96. package/lib/documentServiceFactory.d.ts.map +1 -1
  97. package/lib/documentServiceFactory.js +27 -14
  98. package/lib/documentServiceFactory.js.map +1 -1
  99. package/lib/documentStorageService.d.ts +1 -1
  100. package/lib/documentStorageService.d.ts.map +1 -1
  101. package/lib/documentStorageService.js +9 -7
  102. package/lib/documentStorageService.js.map +1 -1
  103. package/lib/errorUtils.d.ts +11 -3
  104. package/lib/errorUtils.d.ts.map +1 -1
  105. package/lib/errorUtils.js +18 -5
  106. package/lib/errorUtils.js.map +1 -1
  107. package/lib/index.d.ts +2 -1
  108. package/lib/index.d.ts.map +1 -1
  109. package/lib/index.js +3 -1
  110. package/lib/index.js.map +1 -1
  111. package/lib/mapWithExpiration.d.ts +34 -0
  112. package/lib/mapWithExpiration.d.ts.map +1 -0
  113. package/lib/mapWithExpiration.js +101 -0
  114. package/lib/mapWithExpiration.js.map +1 -0
  115. package/lib/nullBlobStorageService.d.ts.map +1 -1
  116. package/lib/nullBlobStorageService.js.map +1 -1
  117. package/lib/packageVersion.d.ts +1 -1
  118. package/lib/packageVersion.js +1 -1
  119. package/lib/packageVersion.js.map +1 -1
  120. package/lib/policies.d.ts.map +1 -1
  121. package/lib/policies.js.map +1 -1
  122. package/lib/restWrapper.d.ts +8 -5
  123. package/lib/restWrapper.d.ts.map +1 -1
  124. package/lib/restWrapper.js +38 -44
  125. package/lib/restWrapper.js.map +1 -1
  126. package/lib/retriableGitManager.d.ts.map +1 -1
  127. package/lib/retriableGitManager.js.map +1 -1
  128. package/lib/shreddedSummaryDocumentStorageService.d.ts +1 -1
  129. package/lib/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  130. package/lib/shreddedSummaryDocumentStorageService.js +10 -6
  131. package/lib/shreddedSummaryDocumentStorageService.js.map +1 -1
  132. package/lib/tokens.d.ts +24 -7
  133. package/lib/tokens.d.ts.map +1 -1
  134. package/lib/tokens.js.map +1 -1
  135. package/lib/treeUtils.d.ts +51 -0
  136. package/lib/treeUtils.d.ts.map +1 -0
  137. package/lib/treeUtils.js +80 -0
  138. package/lib/treeUtils.js.map +1 -0
  139. package/lib/urlUtils.d.ts.map +1 -1
  140. package/lib/urlUtils.js.map +1 -1
  141. package/lib/wholeSummaryDocumentStorageService.d.ts +1 -1
  142. package/lib/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  143. package/lib/wholeSummaryDocumentStorageService.js +30 -17
  144. package/lib/wholeSummaryDocumentStorageService.js.map +1 -1
  145. package/package.json +55 -52
  146. package/prettier.config.cjs +1 -1
  147. package/src/cache.ts +21 -14
  148. package/src/createNewUtils.ts +24 -22
  149. package/src/defaultTokenProvider.ts +13 -15
  150. package/src/definitions.ts +2 -2
  151. package/src/deltaStorageService.ts +99 -95
  152. package/src/documentDeltaConnection.ts +53 -47
  153. package/src/documentService.ts +260 -241
  154. package/src/documentServiceFactory.ts +268 -237
  155. package/src/documentStorageService.ts +87 -83
  156. package/src/errorUtils.ts +91 -76
  157. package/src/index.ts +7 -1
  158. package/src/mapWithExpiration.ts +124 -0
  159. package/src/nullBlobStorageService.ts +24 -21
  160. package/src/packageVersion.ts +1 -1
  161. package/src/policies.ts +44 -44
  162. package/src/restWrapper.ts +270 -208
  163. package/src/retriableGitManager.ts +152 -151
  164. package/src/shreddedSummaryDocumentStorageService.ts +202 -194
  165. package/src/tokens.ts +69 -44
  166. package/src/treeUtils.ts +107 -0
  167. package/src/urlUtils.ts +26 -23
  168. package/src/wholeSummaryDocumentStorageService.ts +248 -228
  169. package/tsconfig.esnext.json +6 -6
  170. package/tsconfig.json +9 -13
@@ -6,6 +6,7 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.DocumentPostCreateError = exports.RouterliciousDocumentServiceFactory = void 0;
8
8
  const common_utils_1 = require("@fluidframework/common-utils");
9
+ const driver_definitions_1 = require("@fluidframework/driver-definitions");
9
10
  const driver_utils_1 = require("@fluidframework/driver-utils");
10
11
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
11
12
  const documentService_1 = require("./documentService");
@@ -14,6 +15,7 @@ const createNewUtils_1 = require("./createNewUtils");
14
15
  const urlUtils_1 = require("./urlUtils");
15
16
  const cache_1 = require("./cache");
16
17
  const packageVersion_1 = require("./packageVersion");
18
+ const maximumSnapshotCacheDurationMs = 432000000; // 5 days in ms
17
19
  const defaultRouterliciousDriverPolicies = {
18
20
  enablePrefetch: true,
19
21
  maxConcurrentStorageRequests: 100,
@@ -31,11 +33,12 @@ const defaultRouterliciousDriverPolicies = {
31
33
  class RouterliciousDocumentServiceFactory {
32
34
  constructor(tokenProvider, driverPolicies = {}) {
33
35
  this.tokenProvider = tokenProvider;
34
- this.protocolName = "fluid:";
36
+ // Use the maximum allowed by the policy (IDocumentStorageServicePolicies.maximumCacheDurationMs set below)
37
+ const snapshotCacheExpiryMs = maximumSnapshotCacheDurationMs;
35
38
  this.driverPolicies = Object.assign(Object.assign({}, defaultRouterliciousDriverPolicies), driverPolicies);
36
39
  this.blobCache = new cache_1.InMemoryCache();
37
40
  this.snapshotTreeCache = this.driverPolicies.enableInternalSummaryCaching
38
- ? new cache_1.InMemoryCache()
41
+ ? new cache_1.InMemoryCache(snapshotCacheExpiryMs)
39
42
  : new cache_1.NullCache();
40
43
  }
41
44
  /**
@@ -55,11 +58,11 @@ class RouterliciousDocumentServiceFactory {
55
58
  throw new Error("Parsed url should contain tenant and doc Id!!");
56
59
  }
57
60
  const [, tenantId] = parsedUrl.pathname.split("/");
58
- const protocolSummary = createNewSummary.tree[".protocol"];
59
- const appSummary = createNewSummary.tree[".app"];
60
- if (!(protocolSummary && appSummary)) {
61
+ if (!(0, driver_utils_1.isCombinedAppAndProtocolSummary)(createNewSummary)) {
61
62
  throw new Error("Protocol and App Summary required in the full summary");
62
63
  }
64
+ const protocolSummary = createNewSummary.tree[".protocol"];
65
+ const appSummary = createNewSummary.tree[".app"];
63
66
  const documentAttributes = (0, driver_utils_1.getDocAttributesFromProtocolSummary)(protocolSummary);
64
67
  const quorumValues = (0, driver_utils_1.getQuorumValuesFromProtocolSummary)(protocolSummary);
65
68
  const logger2 = telemetry_utils_1.ChildLogger.create(logger, "RouterliciousDriver");
@@ -78,8 +81,7 @@ class RouterliciousDocumentServiceFactory {
78
81
  sequenceNumber: documentAttributes.sequenceNumber,
79
82
  values: quorumValues,
80
83
  enableDiscovery: this.driverPolicies.enableDiscovery,
81
- generateToken: this.tokenProvider.documentPostCreateCallback !==
82
- undefined,
84
+ generateToken: this.tokenProvider.documentPostCreateCallback !== undefined,
83
85
  });
84
86
  event.end({
85
87
  docId: typeof postRes === "string" ? postRes : postRes.id,
@@ -137,19 +139,21 @@ class RouterliciousDocumentServiceFactory {
137
139
  if (!documentId || !tenantId) {
138
140
  throw new Error(`Couldn't parse documentId and/or tenantId. [documentId:${documentId}][tenantId:${tenantId}]`);
139
141
  }
140
- const logger2 = telemetry_utils_1.ChildLogger.create(logger, "RouterliciousDriver", { all: { driverVersion: packageVersion_1.pkgVersion } });
142
+ const logger2 = telemetry_utils_1.ChildLogger.create(logger, "RouterliciousDriver", {
143
+ all: { driverVersion: packageVersion_1.pkgVersion },
144
+ });
145
+ const rateLimiter = new driver_utils_1.RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);
146
+ const ordererRestWrapper = await restWrapper_1.RouterliciousOrdererRestWrapper.load(tenantId, documentId, this.tokenProvider, logger2, rateLimiter, this.driverPolicies.enableRestLess);
141
147
  const discoverFluidResolvedUrl = async () => {
142
148
  if (!this.driverPolicies.enableDiscovery) {
143
149
  return resolvedUrl;
144
150
  }
145
- const rateLimiter = new driver_utils_1.RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);
146
- const ordererRestWrapper = await restWrapper_1.RouterliciousOrdererRestWrapper.load(tenantId, documentId, this.tokenProvider, logger2, rateLimiter, this.driverPolicies.enableRestLess, resolvedUrl.endpoints.ordererUrl);
147
151
  const discoveredSession = await telemetry_utils_1.PerformanceEvent.timedExecAsync(logger2, {
148
152
  eventName: "DiscoverSession",
149
153
  docId: documentId,
150
154
  }, async () => {
151
155
  // The service responds with the current document session associated with the container.
152
- return ordererRestWrapper.get(`/documents/${tenantId}/session/${documentId}`);
156
+ return ordererRestWrapper.get(`${resolvedUrl.endpoints.ordererUrl}/documents/${tenantId}/session/${documentId}`);
153
157
  });
154
158
  return (0, urlUtils_1.getDiscoveredFluidResolvedUrl)(resolvedUrl, discoveredSession);
155
159
  };
@@ -163,7 +167,14 @@ class RouterliciousDocumentServiceFactory {
163
167
  if (!ordererUrl || !deltaStorageUrl) {
164
168
  throw new Error(`All endpoints urls must be provided. [ordererUrl:${ordererUrl}][deltaStorageUrl:${deltaStorageUrl}]`);
165
169
  }
166
- return new documentService_1.DocumentService(fluidResolvedUrl, ordererUrl, deltaStorageUrl, deltaStreamUrl, storageUrl, logger2, this.tokenProvider, tenantId, documentId, this.driverPolicies, this.blobCache, this.snapshotTreeCache, discoverFluidResolvedUrl);
170
+ const documentStorageServicePolicies = {
171
+ caching: this.driverPolicies.enablePrefetch
172
+ ? driver_definitions_1.LoaderCachingPolicy.Prefetch
173
+ : driver_definitions_1.LoaderCachingPolicy.NoCaching,
174
+ minBlobSize: this.driverPolicies.aggregateBlobsSmallerThanBytes,
175
+ maximumCacheDurationMs: maximumSnapshotCacheDurationMs,
176
+ };
177
+ return new documentService_1.DocumentService(fluidResolvedUrl, ordererUrl, deltaStorageUrl, deltaStreamUrl, storageUrl, logger2, this.tokenProvider, tenantId, documentId, ordererRestWrapper, documentStorageServicePolicies, this.driverPolicies, this.blobCache, this.snapshotTreeCache, discoverFluidResolvedUrl);
167
178
  }
168
179
  }
169
180
  exports.RouterliciousDocumentServiceFactory = RouterliciousDocumentServiceFactory;
@@ -188,7 +199,9 @@ class DocumentPostCreateError extends Error {
188
199
  this.innerError = innerError;
189
200
  this.name = "DocumentPostCreateError";
190
201
  }
191
- get stack() { return this.innerError.stack; }
202
+ get stack() {
203
+ return this.innerError.stack;
204
+ }
192
205
  }
193
206
  exports.DocumentPostCreateError = DocumentPostCreateError;
194
207
  //# sourceMappingURL=documentServiceFactory.js.map
@@ -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, PerformanceEvent } 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 const res = await PerformanceEvent.timedExecAsync(\n logger2,\n {\n eventName: \"CreateNew\",\n details: JSON.stringify({\n enableDiscovery: this.driverPolicies.enableDiscovery,\n sequenceNumber: documentAttributes.sequenceNumber,\n }),\n },\n async (event) => {\n // @TODO: Remove returned \"string\" type when removing back-compat code\n const postRes = await ordererRestWrapper.post<\n { id: string; token?: string; session?: ISession; } | string\n >(`/documents/${tenantId}`, {\n summary: convertSummaryToCreateNewSummary(appSummary),\n sequenceNumber: documentAttributes.sequenceNumber,\n values: quorumValues,\n enableDiscovery: this.driverPolicies.enableDiscovery,\n generateToken:\n this.tokenProvider.documentPostCreateCallback !==\n undefined,\n });\n\n event.end({\n docId: typeof postRes === \"string\" ? postRes : postRes.id,\n });\n return postRes;\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 try {\n await PerformanceEvent.timedExecAsync(\n logger2,\n {\n eventName: \"DocPostCreateCallback\",\n docId: documentId,\n },\n async () => {\n if (token && this.tokenProvider.documentPostCreateCallback !== undefined) {\n return this.tokenProvider.documentPostCreateCallback(documentId, token);\n }\n });\n } catch (error: any) {\n throw new DocumentPostCreateError(error);\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\n const discoveredSession = await PerformanceEvent.timedExecAsync(\n logger2,\n {\n eventName: \"DiscoverSession\",\n docId: documentId,\n },\n async () => {\n // The service responds with the current document session associated with the container.\n return 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"]}
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\tFiveDaysMs,\n\tIDocumentService,\n\tIDocumentServiceFactory,\n\tIDocumentStorageServicePolicies,\n\tIFluidResolvedUrl,\n\tIResolvedUrl,\n\tLoaderCachingPolicy,\n} from \"@fluidframework/driver-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tensureFluidResolvedUrl,\n\tgetDocAttributesFromProtocolSummary,\n\tgetQuorumValuesFromProtocolSummary,\n\tisCombinedAppAndProtocolSummary,\n\tRateLimiter,\n} from \"@fluidframework/driver-utils\";\nimport { ChildLogger, PerformanceEvent } 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 maximumSnapshotCacheDurationMs: FiveDaysMs = 432_000_000; // 5 days in ms\n\nconst defaultRouterliciousDriverPolicies: IRouterliciousDriverPolicies = {\n\tenablePrefetch: true,\n\tmaxConcurrentStorageRequests: 100,\n\tmaxConcurrentOrdererRequests: 100,\n\taggregateBlobsSmallerThanBytes: undefined,\n\tenableDiscovery: false,\n\tenableWholeSummaryUpload: false,\n\tenableRestLess: true,\n\tenableInternalSummaryCaching: 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\tprivate readonly driverPolicies: IRouterliciousDriverPolicies;\n\tprivate readonly blobCache: ICache<ArrayBufferLike>;\n\tprivate readonly snapshotTreeCache: ICache<ISnapshotTreeVersion>;\n\n\tconstructor(\n\t\tprivate readonly tokenProvider: ITokenProvider,\n\t\tdriverPolicies: Partial<IRouterliciousDriverPolicies> = {},\n\t) {\n\t\t// Use the maximum allowed by the policy (IDocumentStorageServicePolicies.maximumCacheDurationMs set below)\n\t\tconst snapshotCacheExpiryMs: FiveDaysMs = maximumSnapshotCacheDurationMs;\n\n\t\tthis.driverPolicies = {\n\t\t\t...defaultRouterliciousDriverPolicies,\n\t\t\t...driverPolicies,\n\t\t};\n\t\tthis.blobCache = new InMemoryCache<ArrayBufferLike>();\n\t\tthis.snapshotTreeCache = this.driverPolicies.enableInternalSummaryCaching\n\t\t\t? new InMemoryCache<ISnapshotTreeVersion>(snapshotCacheExpiryMs)\n\t\t\t: new NullCache<ISnapshotTreeVersion>();\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/driver-definitions#IDocumentServiceFactory.createContainer}\n\t *\n\t * @throws {@link DocumentPostCreateError}\n\t * If an exception is thrown while invoking the provided {@link ITokenProvider.documentPostCreateCallback}.\n\t */\n\tpublic async createContainer(\n\t\tcreateNewSummary: ISummaryTree | undefined,\n\t\tresolvedUrl: IResolvedUrl,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t): Promise<IDocumentService> {\n\t\tensureFluidResolvedUrl(resolvedUrl);\n\t\tif (createNewSummary === undefined) {\n\t\t\tthrow new Error(\"Empty file summary creation isn't supported in this driver.\");\n\t\t}\n\t\tassert(!!resolvedUrl.endpoints.ordererUrl, 0x0b2 /* \"Missing orderer URL!\" */);\n\t\tlet parsedUrl = parseFluidUrl(resolvedUrl.url);\n\t\tif (!parsedUrl.pathname) {\n\t\t\tthrow new Error(\"Parsed url should contain tenant and doc Id!!\");\n\t\t}\n\t\tconst [, tenantId] = parsedUrl.pathname.split(\"/\");\n\n\t\tif (!isCombinedAppAndProtocolSummary(createNewSummary)) {\n\t\t\tthrow new Error(\"Protocol and App Summary required in the full summary\");\n\t\t}\n\t\tconst protocolSummary = createNewSummary.tree[\".protocol\"];\n\t\tconst appSummary = createNewSummary.tree[\".app\"];\n\n\t\tconst documentAttributes = getDocAttributesFromProtocolSummary(protocolSummary);\n\t\tconst quorumValues = getQuorumValuesFromProtocolSummary(protocolSummary);\n\n\t\tconst logger2 = ChildLogger.create(logger, \"RouterliciousDriver\");\n\t\tconst rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);\n\t\tconst ordererRestWrapper = await RouterliciousOrdererRestWrapper.load(\n\t\t\ttenantId,\n\t\t\tundefined,\n\t\t\tthis.tokenProvider,\n\t\t\tlogger2,\n\t\t\trateLimiter,\n\t\t\tthis.driverPolicies.enableRestLess,\n\t\t\tresolvedUrl.endpoints.ordererUrl,\n\t\t);\n\n\t\tconst res = await PerformanceEvent.timedExecAsync(\n\t\t\tlogger2,\n\t\t\t{\n\t\t\t\teventName: \"CreateNew\",\n\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\tenableDiscovery: this.driverPolicies.enableDiscovery,\n\t\t\t\t\tsequenceNumber: documentAttributes.sequenceNumber,\n\t\t\t\t}),\n\t\t\t},\n\t\t\tasync (event) => {\n\t\t\t\t// @TODO: Remove returned \"string\" type when removing back-compat code\n\t\t\t\tconst postRes = await ordererRestWrapper.post<\n\t\t\t\t\t{ id: string; token?: string; session?: ISession } | string\n\t\t\t\t>(`/documents/${tenantId}`, {\n\t\t\t\t\tsummary: convertSummaryToCreateNewSummary(appSummary),\n\t\t\t\t\tsequenceNumber: documentAttributes.sequenceNumber,\n\t\t\t\t\tvalues: quorumValues,\n\t\t\t\t\tenableDiscovery: this.driverPolicies.enableDiscovery,\n\t\t\t\t\tgenerateToken: this.tokenProvider.documentPostCreateCallback !== undefined,\n\t\t\t\t});\n\n\t\t\t\tevent.end({\n\t\t\t\t\tdocId: typeof postRes === \"string\" ? postRes : postRes.id,\n\t\t\t\t});\n\t\t\t\treturn postRes;\n\t\t\t},\n\t\t);\n\n\t\t// For supporting backward compatibility, when the request has generateToken === true, it will return\n\t\t// an object instead of string\n\t\t// @TODO: Remove the logic when no need to support back-compat\n\n\t\tlet documentId: string;\n\t\tlet token: string | undefined;\n\t\tlet session: ISession | undefined;\n\t\tif (typeof res === \"string\") {\n\t\t\tdocumentId = res;\n\t\t} else {\n\t\t\tdocumentId = res.id;\n\t\t\ttoken = res.token;\n\t\t\tsession = this.driverPolicies.enableDiscovery ? res.session : undefined;\n\t\t}\n\t\tparsedUrl = parseFluidUrl(resolvedUrl.url);\n\n\t\t// @TODO: Remove token from the condition, checking the documentPostCreateCallback !== undefined\n\t\t// is sufficient to determine if the token will be undefined or not.\n\t\ttry {\n\t\t\tawait PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger2,\n\t\t\t\t{\n\t\t\t\t\teventName: \"DocPostCreateCallback\",\n\t\t\t\t\tdocId: documentId,\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\tif (token && this.tokenProvider.documentPostCreateCallback !== undefined) {\n\t\t\t\t\t\treturn this.tokenProvider.documentPostCreateCallback(documentId, token);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t} catch (error: any) {\n\t\t\tthrow new DocumentPostCreateError(error);\n\t\t}\n\n\t\tparsedUrl.set(\"pathname\", replaceDocumentIdInPath(parsedUrl.pathname, documentId));\n\t\tconst deltaStorageUrl = resolvedUrl.endpoints.deltaStorageUrl;\n\t\tif (!deltaStorageUrl) {\n\t\t\tthrow new Error(\n\t\t\t\t`All endpoints urls must be provided. [deltaStorageUrl:${deltaStorageUrl}]`,\n\t\t\t);\n\t\t}\n\t\tconst parsedDeltaStorageUrl = new URL(deltaStorageUrl);\n\t\tparsedDeltaStorageUrl.pathname = replaceDocumentIdInPath(\n\t\t\tparsedDeltaStorageUrl.pathname,\n\t\t\tdocumentId,\n\t\t);\n\n\t\treturn this.createDocumentService(\n\t\t\t{\n\t\t\t\t...resolvedUrl,\n\t\t\t\turl: parsedUrl.toString(),\n\t\t\t\tid: documentId,\n\t\t\t\tendpoints: {\n\t\t\t\t\t...resolvedUrl.endpoints,\n\t\t\t\t\tdeltaStorageUrl: parsedDeltaStorageUrl.toString(),\n\t\t\t\t},\n\t\t\t},\n\t\t\tlogger,\n\t\t\tclientIsSummarizer,\n\t\t\tsession,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/driver-definitions#IDocumentServiceFactory.createDocumentService}\n\t *\n\t * @returns Routerlicious document service.\n\t */\n\tpublic async createDocumentService(\n\t\tresolvedUrl: IResolvedUrl,\n\t\tlogger?: ITelemetryBaseLogger,\n\t\tclientIsSummarizer?: boolean,\n\t\tsession?: ISession,\n\t): Promise<IDocumentService> {\n\t\tensureFluidResolvedUrl(resolvedUrl);\n\t\tconst parsedUrl = parseFluidUrl(resolvedUrl.url);\n\t\tconst [, tenantId, documentId] = parsedUrl.pathname.split(\"/\");\n\t\tif (!documentId || !tenantId) {\n\t\t\tthrow new Error(\n\t\t\t\t`Couldn't parse documentId and/or tenantId. [documentId:${documentId}][tenantId:${tenantId}]`,\n\t\t\t);\n\t\t}\n\t\tconst logger2 = ChildLogger.create(logger, \"RouterliciousDriver\", {\n\t\t\tall: { driverVersion },\n\t\t});\n\n\t\tconst rateLimiter = new RateLimiter(this.driverPolicies.maxConcurrentOrdererRequests);\n\t\tconst ordererRestWrapper = await RouterliciousOrdererRestWrapper.load(\n\t\t\ttenantId,\n\t\t\tdocumentId,\n\t\t\tthis.tokenProvider,\n\t\t\tlogger2,\n\t\t\trateLimiter,\n\t\t\tthis.driverPolicies.enableRestLess,\n\t\t);\n\n\t\tconst discoverFluidResolvedUrl = async (): Promise<IFluidResolvedUrl> => {\n\t\t\tif (!this.driverPolicies.enableDiscovery) {\n\t\t\t\treturn resolvedUrl;\n\t\t\t}\n\n\t\t\tconst discoveredSession = await PerformanceEvent.timedExecAsync(\n\t\t\t\tlogger2,\n\t\t\t\t{\n\t\t\t\t\teventName: \"DiscoverSession\",\n\t\t\t\t\tdocId: documentId,\n\t\t\t\t},\n\t\t\t\tasync () => {\n\t\t\t\t\t// The service responds with the current document session associated with the container.\n\t\t\t\t\treturn ordererRestWrapper.get<ISession>(\n\t\t\t\t\t\t`${resolvedUrl.endpoints.ordererUrl}/documents/${tenantId}/session/${documentId}`,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn getDiscoveredFluidResolvedUrl(resolvedUrl, discoveredSession);\n\t\t};\n\t\tconst fluidResolvedUrl: IFluidResolvedUrl =\n\t\t\tsession !== undefined\n\t\t\t\t? getDiscoveredFluidResolvedUrl(resolvedUrl, session)\n\t\t\t\t: await discoverFluidResolvedUrl();\n\n\t\tconst storageUrl = fluidResolvedUrl.endpoints.storageUrl;\n\t\tconst ordererUrl = fluidResolvedUrl.endpoints.ordererUrl;\n\t\tconst deltaStorageUrl = fluidResolvedUrl.endpoints.deltaStorageUrl;\n\t\tconst deltaStreamUrl = fluidResolvedUrl.endpoints.deltaStreamUrl || ordererUrl; // backward compatibility\n\t\tif (!ordererUrl || !deltaStorageUrl) {\n\t\t\tthrow new Error(\n\t\t\t\t`All endpoints urls must be provided. [ordererUrl:${ordererUrl}][deltaStorageUrl:${deltaStorageUrl}]`,\n\t\t\t);\n\t\t}\n\n\t\tconst documentStorageServicePolicies: IDocumentStorageServicePolicies = {\n\t\t\tcaching: this.driverPolicies.enablePrefetch\n\t\t\t\t? LoaderCachingPolicy.Prefetch\n\t\t\t\t: LoaderCachingPolicy.NoCaching,\n\t\t\tminBlobSize: this.driverPolicies.aggregateBlobsSmallerThanBytes,\n\t\t\tmaximumCacheDurationMs: maximumSnapshotCacheDurationMs,\n\t\t};\n\n\t\treturn new DocumentService(\n\t\t\tfluidResolvedUrl,\n\t\t\tordererUrl,\n\t\t\tdeltaStorageUrl,\n\t\t\tdeltaStreamUrl,\n\t\t\tstorageUrl,\n\t\t\tlogger2,\n\t\t\tthis.tokenProvider,\n\t\t\ttenantId,\n\t\t\tdocumentId,\n\t\t\tordererRestWrapper,\n\t\t\tdocumentStorageServicePolicies,\n\t\t\tthis.driverPolicies,\n\t\t\tthis.blobCache,\n\t\t\tthis.snapshotTreeCache,\n\t\t\tdiscoverFluidResolvedUrl,\n\t\t);\n\t}\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\tpublic constructor(\n\t\t/**\n\t\t * Inner error being wrapped.\n\t\t */\n\t\tprivate readonly innerError: Error,\n\t) {\n\t\tsuper(innerError.message);\n\t}\n\n\tpublic readonly name = \"DocumentPostCreateError\";\n\n\tpublic get stack() {\n\t\treturn this.innerError.stack;\n\t}\n}\n"]}
@@ -17,7 +17,7 @@ export declare class DocumentStorageService extends DocumentStorageServiceProxy
17
17
  private _logTailSha;
18
18
  get logTailSha(): string | undefined;
19
19
  private static loadInternalDocumentStorageService;
20
- constructor(id: string, manager: GitManager, logger: ITelemetryLogger, policies?: IDocumentStorageServicePolicies, driverPolicies?: IRouterliciousDriverPolicies, blobCache?: ICache<ArrayBufferLike>, snapshotTreeCache?: ICache<ISnapshotTreeVersion>, noCacheGitManager?: GitManager | undefined, getStorageManager?: (disableCache?: boolean) => Promise<GitManager>);
20
+ constructor(id: string, manager: GitManager, logger: ITelemetryLogger, policies: IDocumentStorageServicePolicies, driverPolicies?: IRouterliciousDriverPolicies, blobCache?: ICache<ArrayBufferLike>, snapshotTreeCache?: ICache<ISnapshotTreeVersion>, noCacheGitManager?: GitManager | undefined, getStorageManager?: (disableCache?: boolean) => Promise<GitManager>);
21
21
  getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null>;
22
22
  }
23
23
  //# sourceMappingURL=documentStorageService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"documentStorageService.d.ts","sourceRoot":"","sources":["../src/documentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAEH,+BAA+B,EAElC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,aAAa,EACb,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACH,UAAU,EACb,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAkC,MAAM,8BAA8B,CAAC;AAC3G,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,qBAAa,sBAAuB,SAAQ,2BAA2B;aAgD/C,EAAE,EAAE,MAAM;IACnB,OAAO,EAAE,UAAU;IAMnB,iBAAiB,CAAC;IAtD7B,OAAO,CAAC,WAAW,CAAiC;IAEpD,IAAW,UAAU,IAAI,MAAM,GAAG,SAAS,CAE1C;IAED,OAAO,CAAC,MAAM,CAAC,kCAAkC;gBAyC7B,EAAE,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,EAC1B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,+BAAoC,EAC9C,cAAc,CAAC,EAAE,4BAA4B,EAC7C,SAAS,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,EACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC,oBAAoB,CAAC,EACzC,iBAAiB,CAAC,wBAAY,EACrC,iBAAiB,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC;IAe1D,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAOlF"}
1
+ {"version":3,"file":"documentStorageService.d.ts","sourceRoot":"","sources":["../src/documentStorageService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAEN,+BAA+B,EAE/B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EACN,2BAA2B,EAE3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,qBAAa,sBAAuB,SAAQ,2BAA2B;aAmDrD,EAAE,EAAE,MAAM;IACnB,OAAO,EAAE,UAAU;IAMnB,iBAAiB,CAAC;IAzD1B,OAAO,CAAC,WAAW,CAAiC;IAEpD,IAAW,UAAU,IAAI,MAAM,GAAG,SAAS,CAE1C;IAED,OAAO,CAAC,MAAM,CAAC,kCAAkC;gBA4ChC,EAAE,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,EAC1B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,+BAA+B,EACzC,cAAc,CAAC,EAAE,4BAA4B,EAC7C,SAAS,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,EACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC,oBAAoB,CAAC,EACzC,iBAAiB,CAAC,wBAAY,EACrC,iBAAiB,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC;IAiBvD,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAQ/E"}
@@ -10,7 +10,7 @@ const driver_utils_1 = require("@fluidframework/driver-utils");
10
10
  const wholeSummaryDocumentStorageService_1 = require("./wholeSummaryDocumentStorageService");
11
11
  const shreddedSummaryDocumentStorageService_1 = require("./shreddedSummaryDocumentStorageService");
12
12
  class DocumentStorageService extends driver_utils_1.DocumentStorageServiceProxy {
13
- constructor(id, manager, logger, policies = {}, driverPolicies, blobCache, snapshotTreeCache, noCacheGitManager, getStorageManager) {
13
+ constructor(id, manager, logger, policies, driverPolicies, blobCache, snapshotTreeCache, noCacheGitManager, getStorageManager) {
14
14
  super(DocumentStorageService.loadInternalDocumentStorageService(id, manager, logger, policies, driverPolicies, blobCache, snapshotTreeCache, noCacheGitManager, getStorageManager));
15
15
  this.id = id;
16
16
  this.manager = manager;
@@ -21,11 +21,12 @@ class DocumentStorageService extends driver_utils_1.DocumentStorageServiceProxy
21
21
  return this._logTailSha;
22
22
  }
23
23
  static loadInternalDocumentStorageService(id, manager, logger, policies, driverPolicies, blobCache, snapshotTreeCache, noCacheGitManager, getStorageManager) {
24
- const storageService = (driverPolicies === null || driverPolicies === void 0 ? void 0 : driverPolicies.enableWholeSummaryUpload) ?
25
- new wholeSummaryDocumentStorageService_1.WholeSummaryDocumentStorageService(id, manager, logger, policies, driverPolicies, blobCache, snapshotTreeCache, noCacheGitManager, getStorageManager) :
26
- new shreddedSummaryDocumentStorageService_1.ShreddedSummaryDocumentStorageService(id, manager, logger, policies, driverPolicies, blobCache, snapshotTreeCache, getStorageManager);
24
+ const storageService = (driverPolicies === null || driverPolicies === void 0 ? void 0 : driverPolicies.enableWholeSummaryUpload)
25
+ ? new wholeSummaryDocumentStorageService_1.WholeSummaryDocumentStorageService(id, manager, logger, policies, driverPolicies, blobCache, snapshotTreeCache, noCacheGitManager, getStorageManager)
26
+ : new shreddedSummaryDocumentStorageService_1.ShreddedSummaryDocumentStorageService(id, manager, logger, policies, driverPolicies, blobCache, snapshotTreeCache, getStorageManager);
27
27
  // TODO: worth prefetching latest summary making version + snapshot call with WholeSummary storage?
28
- if (!(driverPolicies === null || driverPolicies === void 0 ? void 0 : driverPolicies.enableWholeSummaryUpload) && policies.caching === driver_definitions_1.LoaderCachingPolicy.Prefetch) {
28
+ if (!(driverPolicies === null || driverPolicies === void 0 ? void 0 : driverPolicies.enableWholeSummaryUpload) &&
29
+ policies.caching === driver_definitions_1.LoaderCachingPolicy.Prefetch) {
29
30
  return new driver_utils_1.PrefetchDocumentStorageService(storageService);
30
31
  }
31
32
  return storageService;
@@ -33,7 +34,8 @@ class DocumentStorageService extends driver_utils_1.DocumentStorageServiceProxy
33
34
  async getSnapshotTree(version) {
34
35
  const tree = await this.internalStorageService.getSnapshotTree(version);
35
36
  if (tree !== null) {
36
- this._logTailSha = ".logTail" in tree.trees ? tree.trees[".logTail"].blobs.logTail : undefined;
37
+ this._logTailSha =
38
+ ".logTail" in tree.trees ? tree.trees[".logTail"].blobs.logTail : undefined;
37
39
  }
38
40
  return tree;
39
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"documentStorageService.js","sourceRoot":"","sources":["../src/documentStorageService.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,2EAI4C;AAQ5C,+DAA2G;AAG3G,6FAA0F;AAC1F,mGAAgG;AAGhG,MAAa,sBAAuB,SAAQ,0CAA2B;IA+CnE,YACoB,EAAU,EACnB,OAAmB,EAC1B,MAAwB,EACxB,WAA4C,EAAE,EAC9C,cAA6C,EAC7C,SAAmC,EACnC,iBAAgD,EACzC,iBAA8B,EACrC,iBAAmE;QAEnE,KAAK,CAAC,sBAAsB,CAAC,kCAAkC,CAC3D,EAAE,EACF,OAAO,EACP,MAAM,EACN,QAAQ,EACR,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,CACpB,CAAC,CAAC;QApBa,OAAE,GAAF,EAAE,CAAQ;QACnB,YAAO,GAAP,OAAO,CAAY;QAMnB,sBAAiB,GAAjB,iBAAiB,CAAa;QAtDjC,gBAAW,GAAuB,SAAS,CAAC;IAoEpD,CAAC;IAlED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAEO,MAAM,CAAC,kCAAkC,CAC7C,EAAU,EACV,OAAmB,EACnB,MAAwB,EACxB,QAAyC,EACzC,cAA6C,EAC7C,SAAmC,EACnC,iBAAgD,EAChD,iBAA8B,EAC9B,iBAAmE;QAEnE,MAAM,cAAc,GAAG,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,wBAAwB,EAAC,CAAC;YAC7D,IAAI,uEAAkC,CAClC,EAAE,EACF,OAAO,EACP,MAAM,EACN,QAAQ,EACR,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,CACpB,CAAC,CAAC;YACH,IAAI,6EAAqC,CACrC,EAAE,EACF,OAAO,EACP,MAAM,EACN,QAAQ,EACR,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,CACpB,CAAC;QACN,mGAAmG;QACnG,IAAI,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,wBAAwB,CAAA,IAAI,QAAQ,CAAC,OAAO,KAAK,wCAAmB,CAAC,QAAQ,EAAE;YAChG,OAAO,IAAI,6CAA8B,CAAC,cAAc,CAAC,CAAC;SAC7D;QACD,OAAO,cAAc,CAAC;IAC1B,CAAC;IA0BM,KAAK,CAAC,eAAe,CAAC,OAAkB;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,IAAI,KAAK,IAAI,EAAE;YACf,IAAI,CAAC,WAAW,GAAG,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;SAClG;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA9ED,wDA8EC","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 IDocumentStorageService,\n IDocumentStorageServicePolicies,\n LoaderCachingPolicy,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ISnapshotTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n GitManager,\n} from \"@fluidframework/server-services-client\";\nimport { DocumentStorageServiceProxy, PrefetchDocumentStorageService } from \"@fluidframework/driver-utils\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ICache } from \"./cache\";\nimport { WholeSummaryDocumentStorageService } from \"./wholeSummaryDocumentStorageService\";\nimport { ShreddedSummaryDocumentStorageService } from \"./shreddedSummaryDocumentStorageService\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\nexport class DocumentStorageService extends DocumentStorageServiceProxy {\n private _logTailSha: string | undefined = undefined;\n\n public get logTailSha(): string | undefined {\n return this._logTailSha;\n }\n\n private static loadInternalDocumentStorageService(\n id: string,\n manager: GitManager,\n logger: ITelemetryLogger,\n policies: IDocumentStorageServicePolicies,\n driverPolicies?: IRouterliciousDriverPolicies,\n blobCache?: ICache<ArrayBufferLike>,\n snapshotTreeCache?: ICache<ISnapshotTreeVersion>,\n noCacheGitManager?: GitManager,\n getStorageManager?: (disableCache?: boolean) => Promise<GitManager>,\n ): IDocumentStorageService {\n const storageService = driverPolicies?.enableWholeSummaryUpload ?\n new WholeSummaryDocumentStorageService(\n id,\n manager,\n logger,\n policies,\n driverPolicies,\n blobCache,\n snapshotTreeCache,\n noCacheGitManager,\n getStorageManager,\n ) :\n new ShreddedSummaryDocumentStorageService(\n id,\n manager,\n logger,\n policies,\n driverPolicies,\n blobCache,\n snapshotTreeCache,\n getStorageManager,\n );\n // TODO: worth prefetching latest summary making version + snapshot call with WholeSummary storage?\n if (!driverPolicies?.enableWholeSummaryUpload && policies.caching === LoaderCachingPolicy.Prefetch) {\n return new PrefetchDocumentStorageService(storageService);\n }\n return storageService;\n }\n\n constructor(\n public readonly id: string,\n public manager: GitManager,\n logger: ITelemetryLogger,\n policies: IDocumentStorageServicePolicies = {},\n driverPolicies?: IRouterliciousDriverPolicies,\n blobCache?: ICache<ArrayBufferLike>,\n snapshotTreeCache?: ICache<ISnapshotTreeVersion>,\n public noCacheGitManager?: GitManager,\n getStorageManager?: (disableCache?: boolean) => Promise<GitManager>,\n ) {\n super(DocumentStorageService.loadInternalDocumentStorageService(\n id,\n manager,\n logger,\n policies,\n driverPolicies,\n blobCache,\n snapshotTreeCache,\n noCacheGitManager,\n getStorageManager,\n ));\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n const tree = await this.internalStorageService.getSnapshotTree(version);\n if (tree !== null) {\n this._logTailSha = \".logTail\" in tree.trees ? tree.trees[\".logTail\"].blobs.logTail : undefined;\n }\n return tree;\n }\n}\n"]}
1
+ {"version":3,"file":"documentStorageService.js","sourceRoot":"","sources":["../src/documentStorageService.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,2EAI4C;AAG5C,+DAGsC;AAGtC,6FAA0F;AAC1F,mGAAgG;AAGhG,MAAa,sBAAuB,SAAQ,0CAA2B;IAkDtE,YACiB,EAAU,EACnB,OAAmB,EAC1B,MAAwB,EACxB,QAAyC,EACzC,cAA6C,EAC7C,SAAmC,EACnC,iBAAgD,EACzC,iBAA8B,EACrC,iBAAmE;QAEnE,KAAK,CACJ,sBAAsB,CAAC,kCAAkC,CACxD,EAAE,EACF,OAAO,EACP,MAAM,EACN,QAAQ,EACR,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,CACjB,CACD,CAAC;QAtBc,OAAE,GAAF,EAAE,CAAQ;QACnB,YAAO,GAAP,OAAO,CAAY;QAMnB,sBAAiB,GAAjB,iBAAiB,CAAa;QAzD9B,gBAAW,GAAuB,SAAS,CAAC;IAyEpD,CAAC;IAvED,IAAW,UAAU;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAEO,MAAM,CAAC,kCAAkC,CAChD,EAAU,EACV,OAAmB,EACnB,MAAwB,EACxB,QAAyC,EACzC,cAA6C,EAC7C,SAAmC,EACnC,iBAAgD,EAChD,iBAA8B,EAC9B,iBAAmE;QAEnE,MAAM,cAAc,GAAG,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,wBAAwB;YAC9D,CAAC,CAAC,IAAI,uEAAkC,CACtC,EAAE,EACF,OAAO,EACP,MAAM,EACN,QAAQ,EACR,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,CAChB;YACH,CAAC,CAAC,IAAI,6EAAqC,CACzC,EAAE,EACF,OAAO,EACP,MAAM,EACN,QAAQ,EACR,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,CAChB,CAAC;QACL,mGAAmG;QACnG,IACC,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,wBAAwB,CAAA;YACzC,QAAQ,CAAC,OAAO,KAAK,wCAAmB,CAAC,QAAQ,EAChD;YACD,OAAO,IAAI,6CAA8B,CAAC,cAAc,CAAC,CAAC;SAC1D;QACD,OAAO,cAAc,CAAC;IACvB,CAAC;IA4BM,KAAK,CAAC,eAAe,CAAC,OAAkB;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,IAAI,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,WAAW;gBACf,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;SAC7E;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AApFD,wDAoFC","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\tIDocumentStorageService,\n\tIDocumentStorageServicePolicies,\n\tLoaderCachingPolicy,\n} from \"@fluidframework/driver-definitions\";\nimport { ISnapshotTree, IVersion } from \"@fluidframework/protocol-definitions\";\nimport { GitManager } from \"@fluidframework/server-services-client\";\nimport {\n\tDocumentStorageServiceProxy,\n\tPrefetchDocumentStorageService,\n} from \"@fluidframework/driver-utils\";\nimport { IRouterliciousDriverPolicies } from \"./policies\";\nimport { ICache } from \"./cache\";\nimport { WholeSummaryDocumentStorageService } from \"./wholeSummaryDocumentStorageService\";\nimport { ShreddedSummaryDocumentStorageService } from \"./shreddedSummaryDocumentStorageService\";\nimport { ISnapshotTreeVersion } from \"./definitions\";\n\nexport class DocumentStorageService extends DocumentStorageServiceProxy {\n\tprivate _logTailSha: string | undefined = undefined;\n\n\tpublic get logTailSha(): string | undefined {\n\t\treturn this._logTailSha;\n\t}\n\n\tprivate static loadInternalDocumentStorageService(\n\t\tid: string,\n\t\tmanager: GitManager,\n\t\tlogger: ITelemetryLogger,\n\t\tpolicies: IDocumentStorageServicePolicies,\n\t\tdriverPolicies?: IRouterliciousDriverPolicies,\n\t\tblobCache?: ICache<ArrayBufferLike>,\n\t\tsnapshotTreeCache?: ICache<ISnapshotTreeVersion>,\n\t\tnoCacheGitManager?: GitManager,\n\t\tgetStorageManager?: (disableCache?: boolean) => Promise<GitManager>,\n\t): IDocumentStorageService {\n\t\tconst storageService = driverPolicies?.enableWholeSummaryUpload\n\t\t\t? new WholeSummaryDocumentStorageService(\n\t\t\t\t\tid,\n\t\t\t\t\tmanager,\n\t\t\t\t\tlogger,\n\t\t\t\t\tpolicies,\n\t\t\t\t\tdriverPolicies,\n\t\t\t\t\tblobCache,\n\t\t\t\t\tsnapshotTreeCache,\n\t\t\t\t\tnoCacheGitManager,\n\t\t\t\t\tgetStorageManager,\n\t\t\t )\n\t\t\t: new ShreddedSummaryDocumentStorageService(\n\t\t\t\t\tid,\n\t\t\t\t\tmanager,\n\t\t\t\t\tlogger,\n\t\t\t\t\tpolicies,\n\t\t\t\t\tdriverPolicies,\n\t\t\t\t\tblobCache,\n\t\t\t\t\tsnapshotTreeCache,\n\t\t\t\t\tgetStorageManager,\n\t\t\t );\n\t\t// TODO: worth prefetching latest summary making version + snapshot call with WholeSummary storage?\n\t\tif (\n\t\t\t!driverPolicies?.enableWholeSummaryUpload &&\n\t\t\tpolicies.caching === LoaderCachingPolicy.Prefetch\n\t\t) {\n\t\t\treturn new PrefetchDocumentStorageService(storageService);\n\t\t}\n\t\treturn storageService;\n\t}\n\n\tconstructor(\n\t\tpublic readonly id: string,\n\t\tpublic manager: GitManager,\n\t\tlogger: ITelemetryLogger,\n\t\tpolicies: IDocumentStorageServicePolicies,\n\t\tdriverPolicies?: IRouterliciousDriverPolicies,\n\t\tblobCache?: ICache<ArrayBufferLike>,\n\t\tsnapshotTreeCache?: ICache<ISnapshotTreeVersion>,\n\t\tpublic noCacheGitManager?: GitManager,\n\t\tgetStorageManager?: (disableCache?: boolean) => Promise<GitManager>,\n\t) {\n\t\tsuper(\n\t\t\tDocumentStorageService.loadInternalDocumentStorageService(\n\t\t\t\tid,\n\t\t\t\tmanager,\n\t\t\t\tlogger,\n\t\t\t\tpolicies,\n\t\t\t\tdriverPolicies,\n\t\t\t\tblobCache,\n\t\t\t\tsnapshotTreeCache,\n\t\t\t\tnoCacheGitManager,\n\t\t\t\tgetStorageManager,\n\t\t\t),\n\t\t);\n\t}\n\n\tpublic async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n\t\tconst tree = await this.internalStorageService.getSnapshotTree(version);\n\t\tif (tree !== null) {\n\t\t\tthis._logTailSha =\n\t\t\t\t\".logTail\" in tree.trees ? tree.trees[\".logTail\"].blobs.logTail : undefined;\n\t\t}\n\t\treturn tree;\n\t}\n}\n"]}
@@ -3,8 +3,16 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { DriverError } from "@fluidframework/driver-definitions";
6
- export declare enum R11sErrorType {
7
- fileNotFoundOrAccessDeniedError = "fileNotFoundOrAccessDeniedError"
6
+ /**
7
+ * Routerlicious Error types
8
+ * Different error types that may be thrown by the routerlicious driver
9
+ */
10
+ export declare enum RouterliciousErrorType {
11
+ /**
12
+ * File not found, or file deleted during session
13
+ */
14
+ fileNotFoundOrAccessDeniedError = "fileNotFoundOrAccessDeniedError",
15
+ sslCertError = "sslCertError"
8
16
  }
9
17
  /**
10
18
  * Interface for error responses for the WebSocket connection
@@ -33,7 +41,7 @@ export interface IR11sSocketError {
33
41
  retryAfterMs?: number;
34
42
  }
35
43
  export interface IR11sError {
36
- readonly errorType: R11sErrorType;
44
+ readonly errorType: RouterliciousErrorType;
37
45
  readonly message: string;
38
46
  canRetry: boolean;
39
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errorUtils.d.ts","sourceRoot":"","sources":["../src/errorUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AASjE,oBAAY,aAAa;IACrB,+BAA+B,oCAAoC;CACtE;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,oBAAY,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AAEjD,wBAAgB,sBAAsB,CAClC,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,GACtB,SAAS,CA4BX;AAED,wBAAgB,qBAAqB,CACjC,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,GACtB,KAAK,CAQP;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAQpG"}
1
+ {"version":3,"file":"errorUtils.d.ts","sourceRoot":"","sources":["../src/errorUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AASjE;;;GAGG;AACH,oBAAY,sBAAsB;IACjC;;OAEG;IACH,+BAA+B,oCAAoC;IAEnE,YAAY,iBAAiB;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,oBAAY,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AAEjD,wBAAgB,sBAAsB,CACrC,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,GACnB,SAAS,CAsCX;AAED,wBAAgB,qBAAqB,CACpC,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,GACnB,KAAK,CAKP;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,gBAAgB,EAC7B,OAAO,EAAE,MAAM,GACb,SAAS,CAIX"}
@@ -4,13 +4,21 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.errorObjectFromSocketError = exports.throwR11sNetworkError = exports.createR11sNetworkError = exports.R11sErrorType = void 0;
7
+ exports.errorObjectFromSocketError = exports.throwR11sNetworkError = exports.createR11sNetworkError = exports.RouterliciousErrorType = void 0;
8
8
  const driver_utils_1 = require("@fluidframework/driver-utils");
9
9
  const packageVersion_1 = require("./packageVersion");
10
- var R11sErrorType;
11
- (function (R11sErrorType) {
12
- R11sErrorType["fileNotFoundOrAccessDeniedError"] = "fileNotFoundOrAccessDeniedError";
13
- })(R11sErrorType = exports.R11sErrorType || (exports.R11sErrorType = {}));
10
+ /**
11
+ * Routerlicious Error types
12
+ * Different error types that may be thrown by the routerlicious driver
13
+ */
14
+ var RouterliciousErrorType;
15
+ (function (RouterliciousErrorType) {
16
+ /**
17
+ * File not found, or file deleted during session
18
+ */
19
+ RouterliciousErrorType["fileNotFoundOrAccessDeniedError"] = "fileNotFoundOrAccessDeniedError";
20
+ RouterliciousErrorType["sslCertError"] = "sslCertError";
21
+ })(RouterliciousErrorType = exports.RouterliciousErrorType || (exports.RouterliciousErrorType = {}));
14
22
  function createR11sNetworkError(errorMessage, statusCode, retryAfterMs) {
15
23
  const props = { statusCode, driverVersion: packageVersion_1.pkgVersion };
16
24
  switch (statusCode) {
@@ -18,6 +26,11 @@ function createR11sNetworkError(errorMessage, statusCode, retryAfterMs) {
18
26
  // If a service is temporarily down or a browser resource limit is reached, RestWrapper will throw
19
27
  // a network error with no status code (e.g. err:ERR_CONN_REFUSED or err:ERR_FAILED) and
20
28
  // the error message will start with NetworkError as defined in restWrapper.ts
29
+ // If there exists a self-signed SSL certificates error, throw a NonRetryableError
30
+ // TODO: instead of relying on string matching, filter error based on the error code like we do for websocket connections
31
+ if (errorMessage.includes("failed, reason: self signed certificate")) {
32
+ return new driver_utils_1.NonRetryableError(errorMessage, RouterliciousErrorType.sslCertError, props);
33
+ }
21
34
  return new driver_utils_1.GenericNetworkError(errorMessage, errorMessage.startsWith("NetworkError"), props);
22
35
  case 401:
23
36
  // The first 401 is manually retried in RouterliciousRestWrapper with a refreshed token,
@@ -25,7 +38,7 @@ function createR11sNetworkError(errorMessage, statusCode, retryAfterMs) {
25
38
  case 403:
26
39
  return new driver_utils_1.AuthorizationError(errorMessage, undefined, undefined, props);
27
40
  case 404:
28
- const errorType = R11sErrorType.fileNotFoundOrAccessDeniedError;
41
+ const errorType = RouterliciousErrorType.fileNotFoundOrAccessDeniedError;
29
42
  return new driver_utils_1.NonRetryableError(errorMessage, errorType, props);
30
43
  case 429:
31
44
  return (0, driver_utils_1.createGenericNetworkError)(errorMessage, { canRetry: true, retryAfterMs }, props);
@@ -1 +1 @@
1
- {"version":3,"file":"errorUtils.js","sourceRoot":"","sources":["../src/errorUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,+DAKsC;AACtC,qDAA+D;AAE/D,IAAY,aAEX;AAFD,WAAY,aAAa;IACrB,oFAAmE,CAAA;AACvE,CAAC,EAFW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAExB;AAwCD,SAAgB,sBAAsB,CAClC,YAAoB,EACpB,UAAmB,EACnB,YAAqB;IAErB,MAAM,KAAK,GAAG,EAAE,UAAU,EAAE,aAAa,EAAb,2BAAa,EAAE,CAAC;IAC5C,QAAQ,UAAU,EAAE;QAChB,KAAK,SAAS;YACV,kGAAkG;YAClG,wFAAwF;YACxF,8EAA8E;YAC9E,OAAO,IAAI,kCAAmB,CAC1B,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;QACtE,KAAK,GAAG,CAAC;QACL,wFAAwF;QACxF,2CAA2C;QAC/C,KAAK,GAAG;YACJ,OAAO,IAAI,iCAAkB,CACzB,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACnD,KAAK,GAAG;YACJ,MAAM,SAAS,GAAG,aAAa,CAAC,+BAA+B,CAAC;YAChE,OAAO,IAAI,gCAAiB,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACjE,KAAK,GAAG;YACJ,OAAO,IAAA,wCAAyB,EAC5B,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/D,KAAK,GAAG,CAAC;QACT,KAAK,GAAG;YACJ,OAAO,IAAI,kCAAmB,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9D;YACI,MAAM,SAAS,GAAG,EAAE,QAAQ,EAAE,YAAY,KAAK,SAAS,EAAE,YAAY,EAAE,CAAC;YACzE,OAAO,IAAA,wCAAyB,EAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;KACxE;AACL,CAAC;AAhCD,wDAgCC;AAED,SAAgB,qBAAqB,CACjC,YAAoB,EACpB,UAAmB,EACnB,YAAqB;IAErB,MAAM,YAAY,GAAG,sBAAsB,CACvC,YAAY,EACZ,UAAU,EACV,YAAY,CAAC,CAAC;IAElB,+DAA+D;IAC/D,MAAM,YAAY,CAAC;AACvB,CAAC;AAZD,sDAYC;AAED;;GAEG;AACH,SAAgB,0BAA0B,CAAC,WAA6B,EAAE,OAAe;IACrF,iDAAiD;IACjD,MAAM,OAAO,GAAG,sBAAsB,OAAO,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;IACzE,OAAO,sBAAsB,CACzB,OAAO,EACP,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,YAAY,CAC3B,CAAC;AACN,CAAC;AARD,gEAQC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { DriverError } from \"@fluidframework/driver-definitions\";\nimport {\n NonRetryableError,\n GenericNetworkError,\n createGenericNetworkError,\n AuthorizationError,\n} from \"@fluidframework/driver-utils\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\n\nexport enum R11sErrorType {\n fileNotFoundOrAccessDeniedError = \"fileNotFoundOrAccessDeniedError\",\n}\n\n/**\n * Interface for error responses for the WebSocket connection\n * Intended to be compatible with output from {@link NetworkError.toJSON}\n */\nexport interface IR11sSocketError {\n /**\n * An error code number for the error that occurred.\n * It will be a valid HTTP status code.\n */\n code: number;\n\n /**\n * A message about the error that occurred for debugging / logging purposes.\n * This should not be displayed to the user directly.\n */\n message: string;\n\n /**\n * Optional Retry-After time in seconds.\n * The client should wait this many seconds before retrying its request.\n */\n retryAfter?: number;\n\n /**\n * Optional Retry-After time in milliseconds.\n * The client should wait this many milliseconds before retrying its request.\n */\n retryAfterMs?: number;\n}\n\nexport interface IR11sError {\n readonly errorType: R11sErrorType;\n readonly message: string;\n canRetry: boolean;\n}\n\nexport type R11sError = DriverError | IR11sError;\n\nexport function createR11sNetworkError(\n errorMessage: string,\n statusCode?: number,\n retryAfterMs?: number,\n): R11sError {\n const props = { statusCode, driverVersion };\n switch (statusCode) {\n case undefined:\n // If a service is temporarily down or a browser resource limit is reached, RestWrapper will throw\n // a network error with no status code (e.g. err:ERR_CONN_REFUSED or err:ERR_FAILED) and\n // the error message will start with NetworkError as defined in restWrapper.ts\n return new GenericNetworkError(\n errorMessage, errorMessage.startsWith(\"NetworkError\"), props);\n case 401:\n // The first 401 is manually retried in RouterliciousRestWrapper with a refreshed token,\n // so we treat repeat 401s the same as 403.\n case 403:\n return new AuthorizationError(\n errorMessage, undefined, undefined, props);\n case 404:\n const errorType = R11sErrorType.fileNotFoundOrAccessDeniedError;\n return new NonRetryableError(errorMessage, errorType, props);\n case 429:\n return createGenericNetworkError(\n errorMessage, { canRetry: true, retryAfterMs }, props);\n case 500:\n case 502:\n return new GenericNetworkError(errorMessage, true, props);\n default:\n const retryInfo = { canRetry: retryAfterMs !== undefined, retryAfterMs };\n return createGenericNetworkError(errorMessage, retryInfo, props);\n }\n}\n\nexport function throwR11sNetworkError(\n errorMessage: string,\n statusCode?: number,\n retryAfterMs?: number,\n): never {\n const networkError = createR11sNetworkError(\n errorMessage,\n statusCode,\n retryAfterMs);\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw networkError;\n}\n\n/**\n * Returns network error based on error object from R11s socket (IR11sSocketError)\n */\nexport function errorObjectFromSocketError(socketError: IR11sSocketError, handler: string): R11sError {\n // pre-0.58 error message prefix: R11sSocketError\n const message = `R11s socket error (${handler}): ${socketError.message}`;\n return createR11sNetworkError(\n message,\n socketError.code,\n socketError.retryAfterMs,\n );\n}\n"]}
1
+ {"version":3,"file":"errorUtils.js","sourceRoot":"","sources":["../src/errorUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,+DAKsC;AACtC,qDAA+D;AAE/D;;;GAGG;AACH,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IACjC;;OAEG;IACH,6FAAmE,CAAA;IAEnE,uDAA6B,CAAA;AAC9B,CAAC,EAPW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAOjC;AAwCD,SAAgB,sBAAsB,CACrC,YAAoB,EACpB,UAAmB,EACnB,YAAqB;IAErB,MAAM,KAAK,GAAG,EAAE,UAAU,EAAE,aAAa,EAAb,2BAAa,EAAE,CAAC;IAC5C,QAAQ,UAAU,EAAE;QACnB,KAAK,SAAS;YACb,kGAAkG;YAClG,wFAAwF;YACxF,8EAA8E;YAC9E,kFAAkF;YAClF,yHAAyH;YACzH,IAAI,YAAY,CAAC,QAAQ,CAAC,yCAAyC,CAAC,EAAE;gBACrE,OAAO,IAAI,gCAAiB,CAC3B,YAAY,EACZ,sBAAsB,CAAC,YAAY,EACnC,KAAK,CACL,CAAC;aACF;YACD,OAAO,IAAI,kCAAmB,CAC7B,YAAY,EACZ,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,EACvC,KAAK,CACL,CAAC;QACH,KAAK,GAAG,CAAC;QACT,wFAAwF;QACxF,2CAA2C;QAC3C,KAAK,GAAG;YACP,OAAO,IAAI,iCAAkB,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1E,KAAK,GAAG;YACP,MAAM,SAAS,GAAG,sBAAsB,CAAC,+BAA+B,CAAC;YACzE,OAAO,IAAI,gCAAiB,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9D,KAAK,GAAG;YACP,OAAO,IAAA,wCAAyB,EAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;QACzF,KAAK,GAAG,CAAC;QACT,KAAK,GAAG;YACP,OAAO,IAAI,kCAAmB,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3D;YACC,MAAM,SAAS,GAAG,EAAE,QAAQ,EAAE,YAAY,KAAK,SAAS,EAAE,YAAY,EAAE,CAAC;YACzE,OAAO,IAAA,wCAAyB,EAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;KAClE;AACF,CAAC;AA1CD,wDA0CC;AAED,SAAgB,qBAAqB,CACpC,YAAoB,EACpB,UAAmB,EACnB,YAAqB;IAErB,MAAM,YAAY,GAAG,sBAAsB,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAEpF,+DAA+D;IAC/D,MAAM,YAAY,CAAC;AACpB,CAAC;AATD,sDASC;AAED;;GAEG;AACH,SAAgB,0BAA0B,CACzC,WAA6B,EAC7B,OAAe;IAEf,iDAAiD;IACjD,MAAM,OAAO,GAAG,sBAAsB,OAAO,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;IACzE,OAAO,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;AACpF,CAAC;AAPD,gEAOC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { DriverError } from \"@fluidframework/driver-definitions\";\nimport {\n\tNonRetryableError,\n\tGenericNetworkError,\n\tcreateGenericNetworkError,\n\tAuthorizationError,\n} from \"@fluidframework/driver-utils\";\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\n\n/**\n * Routerlicious Error types\n * Different error types that may be thrown by the routerlicious driver\n */\nexport enum RouterliciousErrorType {\n\t/**\n\t * File not found, or file deleted during session\n\t */\n\tfileNotFoundOrAccessDeniedError = \"fileNotFoundOrAccessDeniedError\",\n\n\tsslCertError = \"sslCertError\",\n}\n\n/**\n * Interface for error responses for the WebSocket connection\n * Intended to be compatible with output from {@link NetworkError.toJSON}\n */\nexport interface IR11sSocketError {\n\t/**\n\t * An error code number for the error that occurred.\n\t * It will be a valid HTTP status code.\n\t */\n\tcode: number;\n\n\t/**\n\t * A message about the error that occurred for debugging / logging purposes.\n\t * This should not be displayed to the user directly.\n\t */\n\tmessage: string;\n\n\t/**\n\t * Optional Retry-After time in seconds.\n\t * The client should wait this many seconds before retrying its request.\n\t */\n\tretryAfter?: number;\n\n\t/**\n\t * Optional Retry-After time in milliseconds.\n\t * The client should wait this many milliseconds before retrying its request.\n\t */\n\tretryAfterMs?: number;\n}\n\nexport interface IR11sError {\n\treadonly errorType: RouterliciousErrorType;\n\treadonly message: string;\n\tcanRetry: boolean;\n}\n\nexport type R11sError = DriverError | IR11sError;\n\nexport function createR11sNetworkError(\n\terrorMessage: string,\n\tstatusCode?: number,\n\tretryAfterMs?: number,\n): R11sError {\n\tconst props = { statusCode, driverVersion };\n\tswitch (statusCode) {\n\t\tcase undefined:\n\t\t\t// If a service is temporarily down or a browser resource limit is reached, RestWrapper will throw\n\t\t\t// a network error with no status code (e.g. err:ERR_CONN_REFUSED or err:ERR_FAILED) and\n\t\t\t// the error message will start with NetworkError as defined in restWrapper.ts\n\t\t\t// If there exists a self-signed SSL certificates error, throw a NonRetryableError\n\t\t\t// TODO: instead of relying on string matching, filter error based on the error code like we do for websocket connections\n\t\t\tif (errorMessage.includes(\"failed, reason: self signed certificate\")) {\n\t\t\t\treturn new NonRetryableError(\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tRouterliciousErrorType.sslCertError,\n\t\t\t\t\tprops,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn new GenericNetworkError(\n\t\t\t\terrorMessage,\n\t\t\t\terrorMessage.startsWith(\"NetworkError\"),\n\t\t\t\tprops,\n\t\t\t);\n\t\tcase 401:\n\t\t// The first 401 is manually retried in RouterliciousRestWrapper with a refreshed token,\n\t\t// so we treat repeat 401s the same as 403.\n\t\tcase 403:\n\t\t\treturn new AuthorizationError(errorMessage, undefined, undefined, props);\n\t\tcase 404:\n\t\t\tconst errorType = RouterliciousErrorType.fileNotFoundOrAccessDeniedError;\n\t\t\treturn new NonRetryableError(errorMessage, errorType, props);\n\t\tcase 429:\n\t\t\treturn createGenericNetworkError(errorMessage, { canRetry: true, retryAfterMs }, props);\n\t\tcase 500:\n\t\tcase 502:\n\t\t\treturn new GenericNetworkError(errorMessage, true, props);\n\t\tdefault:\n\t\t\tconst retryInfo = { canRetry: retryAfterMs !== undefined, retryAfterMs };\n\t\t\treturn createGenericNetworkError(errorMessage, retryInfo, props);\n\t}\n}\n\nexport function throwR11sNetworkError(\n\terrorMessage: string,\n\tstatusCode?: number,\n\tretryAfterMs?: number,\n): never {\n\tconst networkError = createR11sNetworkError(errorMessage, statusCode, retryAfterMs);\n\n\t// eslint-disable-next-line @typescript-eslint/no-throw-literal\n\tthrow networkError;\n}\n\n/**\n * Returns network error based on error object from R11s socket (IR11sSocketError)\n */\nexport function errorObjectFromSocketError(\n\tsocketError: IR11sSocketError,\n\thandler: string,\n): R11sError {\n\t// pre-0.58 error message prefix: R11sSocketError\n\tconst message = `R11s socket error (${handler}): ${socketError.message}`;\n\treturn createR11sNetworkError(message, socketError.code, socketError.retryAfterMs);\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  */
5
5
  export { DefaultTokenProvider } from "./defaultTokenProvider";
6
6
  export { ITokenProvider, ITokenResponse, ITokenService } from "./tokens";
7
- export { DocumentPostCreateError, RouterliciousDocumentServiceFactory } from "./documentServiceFactory";
7
+ export { RouterliciousErrorType } from "./errorUtils";
8
+ export { DocumentPostCreateError, RouterliciousDocumentServiceFactory, } from "./documentServiceFactory";
8
9
  export { IRouterliciousDriverPolicies } from "./policies";
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzE,OAAO,EAAE,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,0BAA0B,CAAC;AAGxG,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGtD,OAAO,EACN,uBAAuB,EACvB,mCAAmC,GACnC,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -4,10 +4,13 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.RouterliciousDocumentServiceFactory = exports.DocumentPostCreateError = exports.DefaultTokenProvider = void 0;
7
+ exports.RouterliciousDocumentServiceFactory = exports.DocumentPostCreateError = exports.RouterliciousErrorType = exports.DefaultTokenProvider = void 0;
8
8
  // Tokens
9
9
  var defaultTokenProvider_1 = require("./defaultTokenProvider");
10
10
  Object.defineProperty(exports, "DefaultTokenProvider", { enumerable: true, get: function () { return defaultTokenProvider_1.DefaultTokenProvider; } });
11
+ // Errors
12
+ var errorUtils_1 = require("./errorUtils");
13
+ Object.defineProperty(exports, "RouterliciousErrorType", { enumerable: true, get: function () { return errorUtils_1.RouterliciousErrorType; } });
11
14
  // Factory
12
15
  var documentServiceFactory_1 = require("./documentServiceFactory");
13
16
  Object.defineProperty(exports, "DocumentPostCreateError", { enumerable: true, get: function () { return documentServiceFactory_1.DocumentPostCreateError; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,SAAS;AACT,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAG7B,UAAU;AACV,mEAAwG;AAA/F,iIAAA,uBAAuB,OAAA;AAAE,6IAAA,mCAAmC,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// Tokens\nexport { DefaultTokenProvider } from \"./defaultTokenProvider\";\nexport { ITokenProvider, ITokenResponse, ITokenService } from \"./tokens\";\n\n// Factory\nexport { DocumentPostCreateError, RouterliciousDocumentServiceFactory } from \"./documentServiceFactory\";\n\n// Configuration\nexport { IRouterliciousDriverPolicies } from \"./policies\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,SAAS;AACT,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAG7B,SAAS;AACT,2CAAsD;AAA7C,oHAAA,sBAAsB,OAAA;AAE/B,UAAU;AACV,mEAGkC;AAFjC,iIAAA,uBAAuB,OAAA;AACvB,6IAAA,mCAAmC,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// Tokens\nexport { DefaultTokenProvider } from \"./defaultTokenProvider\";\nexport { ITokenProvider, ITokenResponse, ITokenService } from \"./tokens\";\n\n// Errors\nexport { RouterliciousErrorType } from \"./errorUtils\";\n\n// Factory\nexport {\n\tDocumentPostCreateError,\n\tRouterliciousDocumentServiceFactory,\n} from \"./documentServiceFactory\";\n\n// Configuration\nexport { IRouterliciousDriverPolicies } from \"./policies\";\n"]}
@@ -0,0 +1,34 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ /**
6
+ * An extension of Map that expires (deletes) entries after a period of inactivity.
7
+ * The policy is based on the last time a key was written to.
8
+ */
9
+ export declare class MapWithExpiration<TKey = any, TValue = any> extends Map<TKey, TValue> {
10
+ private readonly expiryMs;
11
+ /** Timestamps (as epoch ms numbers) of when each key was last refreshed */
12
+ private readonly lastRefreshedTimes;
13
+ constructor(expiryMs: number);
14
+ private refresh;
15
+ /**
16
+ * Returns true if the key is present and expired, false if it's not expired, and undefined if it's not found
17
+ * If cleanUp is passed as true, then delete any expired entry before returning.
18
+ */
19
+ private checkExpiry;
20
+ private clearExpiredEntries;
21
+ get size(): number;
22
+ has(key: TKey): boolean;
23
+ get(key: TKey): TValue | undefined;
24
+ set(key: TKey, value: TValue): this;
25
+ delete(key: TKey): boolean;
26
+ clear(): void;
27
+ forEach(callbackfn: (value: TValue, key: TKey, map: Map<TKey, TValue>) => void, thisArg?: any): void;
28
+ entries(): IterableIterator<[TKey, TValue]>;
29
+ keys(): IterableIterator<TKey>;
30
+ values(): IterableIterator<TValue>;
31
+ [Symbol.iterator](): IterableIterator<[TKey, TValue]>;
32
+ valueOf(): Object;
33
+ }
34
+ //# sourceMappingURL=mapWithExpiration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapWithExpiration.d.ts","sourceRoot":"","sources":["../src/mapWithExpiration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,IAAI,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;IAIrE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA2B;gBAEjC,QAAQ,EAAE,MAAM;IAI7C,OAAO,CAAC,OAAO;IAIf;;;OAGG;IACH,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,mBAAmB;IAK3B,IAAI,IAAI,IAAI,MAAM,CAGjB;IAED,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAKvB,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS;IAKlC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMnC,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO;IAK1B,KAAK,IAAI,IAAI;IAKb,OAAO,CACN,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,EACtE,OAAO,CAAC,EAAE,GAAG,GACX,IAAI;IAmBP,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAI3C,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC;IAI9B,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIlC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAKrD,OAAO;CAIP"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
+ * Licensed under the MIT License.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MapWithExpiration = void 0;
8
+ const common_utils_1 = require("@fluidframework/common-utils");
9
+ /**
10
+ * An extension of Map that expires (deletes) entries after a period of inactivity.
11
+ * The policy is based on the last time a key was written to.
12
+ */
13
+ class MapWithExpiration extends Map {
14
+ constructor(expiryMs) {
15
+ super();
16
+ this.expiryMs = expiryMs;
17
+ /** Timestamps (as epoch ms numbers) of when each key was last refreshed */
18
+ this.lastRefreshedTimes = new Map();
19
+ }
20
+ refresh(key) {
21
+ this.lastRefreshedTimes.set(key, new Date().valueOf());
22
+ }
23
+ /**
24
+ * Returns true if the key is present and expired, false if it's not expired, and undefined if it's not found
25
+ * If cleanUp is passed as true, then delete any expired entry before returning.
26
+ */
27
+ checkExpiry(key, cleanUp = false) {
28
+ const refreshTime = this.lastRefreshedTimes.get(key);
29
+ (0, common_utils_1.assert)((refreshTime !== undefined) === super.has(key), 0x50c /* freshness map out of sync */);
30
+ if (refreshTime === undefined) {
31
+ return undefined;
32
+ }
33
+ const expired = new Date().valueOf() - refreshTime >= this.expiryMs;
34
+ if (expired && cleanUp) {
35
+ this.delete(key);
36
+ }
37
+ return expired;
38
+ }
39
+ clearExpiredEntries() {
40
+ // forEach clears out any expired entries
41
+ this.forEach(() => { });
42
+ }
43
+ get size() {
44
+ this.clearExpiredEntries();
45
+ return super.size;
46
+ }
47
+ has(key) {
48
+ this.checkExpiry(key, true /* cleanUp */);
49
+ return super.has(key);
50
+ }
51
+ get(key) {
52
+ this.checkExpiry(key, true /* cleanUp */);
53
+ return super.get(key);
54
+ }
55
+ set(key, value) {
56
+ // Sliding window expiration policy (on write)
57
+ this.refresh(key);
58
+ return super.set(key, value);
59
+ }
60
+ delete(key) {
61
+ this.lastRefreshedTimes.delete(key);
62
+ return super.delete(key);
63
+ }
64
+ clear() {
65
+ this.lastRefreshedTimes.clear();
66
+ super.clear();
67
+ }
68
+ forEach(callbackfn, thisArg) {
69
+ const expiredKeys = [];
70
+ super.forEach((v, k, m) => {
71
+ if (this.checkExpiry(k) === true) {
72
+ expiredKeys.push(k);
73
+ }
74
+ else {
75
+ callbackfn.bind(thisArg)(v, k, m);
76
+ }
77
+ });
78
+ // Clean up keys we know are expired now that we're done iterating
79
+ expiredKeys.forEach((key) => {
80
+ this.delete(key);
81
+ });
82
+ }
83
+ entries() {
84
+ this.clearExpiredEntries();
85
+ return super.entries();
86
+ }
87
+ keys() {
88
+ this.clearExpiredEntries();
89
+ return super.keys();
90
+ }
91
+ values() {
92
+ this.clearExpiredEntries();
93
+ return super.values();
94
+ }
95
+ [Symbol.iterator]() {
96
+ this.clearExpiredEntries();
97
+ return super[Symbol.iterator]();
98
+ }
99
+ valueOf() {
100
+ this.clearExpiredEntries();
101
+ return super.valueOf();
102
+ }
103
+ }
104
+ exports.MapWithExpiration = MapWithExpiration;
105
+ //# sourceMappingURL=mapWithExpiration.js.map