@fluidframework/routerlicious-driver 2.0.0-dev.4.4.0.162253 → 2.0.0-dev.5.2.0.169897

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/deltaStorageService.d.ts +5 -5
  3. package/dist/deltaStorageService.d.ts.map +1 -1
  4. package/dist/deltaStorageService.js +39 -27
  5. package/dist/deltaStorageService.js.map +1 -1
  6. package/dist/documentDeltaConnection.d.ts +2 -2
  7. package/dist/documentDeltaConnection.d.ts.map +1 -1
  8. package/dist/documentDeltaConnection.js +2 -4
  9. package/dist/documentDeltaConnection.js.map +1 -1
  10. package/dist/documentService.d.ts +7 -4
  11. package/dist/documentService.d.ts.map +1 -1
  12. package/dist/documentService.js +12 -7
  13. package/dist/documentService.js.map +1 -1
  14. package/dist/documentServiceFactory.d.ts.map +1 -1
  15. package/dist/documentServiceFactory.js +10 -5
  16. package/dist/documentServiceFactory.js.map +1 -1
  17. package/dist/documentStorageService.d.ts +2 -2
  18. package/dist/documentStorageService.d.ts.map +1 -1
  19. package/dist/documentStorageService.js.map +1 -1
  20. package/dist/packageVersion.d.ts +1 -1
  21. package/dist/packageVersion.js +1 -1
  22. package/dist/packageVersion.js.map +1 -1
  23. package/dist/policies.d.ts +6 -0
  24. package/dist/policies.d.ts.map +1 -1
  25. package/dist/policies.js.map +1 -1
  26. package/dist/restWrapper.d.ts +9 -5
  27. package/dist/restWrapper.d.ts.map +1 -1
  28. package/dist/restWrapper.js +42 -31
  29. package/dist/restWrapper.js.map +1 -1
  30. package/dist/retriableGitManager.d.ts +2 -2
  31. package/dist/retriableGitManager.d.ts.map +1 -1
  32. package/dist/retriableGitManager.js.map +1 -1
  33. package/dist/shreddedSummaryDocumentStorageService.d.ts +3 -3
  34. package/dist/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  35. package/dist/shreddedSummaryDocumentStorageService.js +1 -1
  36. package/dist/shreddedSummaryDocumentStorageService.js.map +1 -1
  37. package/dist/tsdoc-metadata.json +11 -0
  38. package/dist/urlUtils.d.ts +2 -2
  39. package/dist/urlUtils.d.ts.map +1 -1
  40. package/dist/urlUtils.js.map +1 -1
  41. package/dist/wholeSummaryDocumentStorageService.d.ts +3 -3
  42. package/dist/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  43. package/dist/wholeSummaryDocumentStorageService.js +2 -2
  44. package/dist/wholeSummaryDocumentStorageService.js.map +1 -1
  45. package/lib/deltaStorageService.d.ts +5 -5
  46. package/lib/deltaStorageService.d.ts.map +1 -1
  47. package/lib/deltaStorageService.js +42 -30
  48. package/lib/deltaStorageService.js.map +1 -1
  49. package/lib/documentDeltaConnection.d.ts +2 -2
  50. package/lib/documentDeltaConnection.d.ts.map +1 -1
  51. package/lib/documentDeltaConnection.js +2 -4
  52. package/lib/documentDeltaConnection.js.map +1 -1
  53. package/lib/documentService.d.ts +7 -4
  54. package/lib/documentService.d.ts.map +1 -1
  55. package/lib/documentService.js +13 -8
  56. package/lib/documentService.js.map +1 -1
  57. package/lib/documentServiceFactory.d.ts.map +1 -1
  58. package/lib/documentServiceFactory.js +12 -7
  59. package/lib/documentServiceFactory.js.map +1 -1
  60. package/lib/documentStorageService.d.ts +2 -2
  61. package/lib/documentStorageService.d.ts.map +1 -1
  62. package/lib/documentStorageService.js.map +1 -1
  63. package/lib/packageVersion.d.ts +1 -1
  64. package/lib/packageVersion.js +1 -1
  65. package/lib/packageVersion.js.map +1 -1
  66. package/lib/policies.d.ts +6 -0
  67. package/lib/policies.d.ts.map +1 -1
  68. package/lib/policies.js.map +1 -1
  69. package/lib/restWrapper.d.ts +9 -5
  70. package/lib/restWrapper.d.ts.map +1 -1
  71. package/lib/restWrapper.js +39 -30
  72. package/lib/restWrapper.js.map +1 -1
  73. package/lib/retriableGitManager.d.ts +2 -2
  74. package/lib/retriableGitManager.d.ts.map +1 -1
  75. package/lib/retriableGitManager.js.map +1 -1
  76. package/lib/shreddedSummaryDocumentStorageService.d.ts +3 -3
  77. package/lib/shreddedSummaryDocumentStorageService.d.ts.map +1 -1
  78. package/lib/shreddedSummaryDocumentStorageService.js +1 -1
  79. package/lib/shreddedSummaryDocumentStorageService.js.map +1 -1
  80. package/lib/urlUtils.d.ts +2 -2
  81. package/lib/urlUtils.d.ts.map +1 -1
  82. package/lib/urlUtils.js.map +1 -1
  83. package/lib/wholeSummaryDocumentStorageService.d.ts +3 -3
  84. package/lib/wholeSummaryDocumentStorageService.d.ts.map +1 -1
  85. package/lib/wholeSummaryDocumentStorageService.js +2 -2
  86. package/lib/wholeSummaryDocumentStorageService.js.map +1 -1
  87. package/package.json +19 -17
  88. package/src/deltaStorageService.ts +70 -40
  89. package/src/documentDeltaConnection.ts +4 -5
  90. package/src/documentService.ts +29 -22
  91. package/src/documentServiceFactory.ts +46 -12
  92. package/src/documentStorageService.ts +3 -3
  93. package/src/packageVersion.ts +1 -1
  94. package/src/policies.ts +6 -0
  95. package/src/restWrapper.ts +82 -55
  96. package/src/retriableGitManager.ts +2 -2
  97. package/src/shreddedSummaryDocumentStorageService.ts +2 -3
  98. package/src/urlUtils.ts +4 -4
  99. package/src/wholeSummaryDocumentStorageService.ts +3 -3
package/src/policies.ts CHANGED
@@ -48,4 +48,10 @@ export interface IRouterliciousDriverPolicies {
48
48
  * Default: true
49
49
  */
50
50
  enableInternalSummaryCaching: boolean;
51
+ /**
52
+ * Enable downgrading socket connection to long-polling
53
+ * when websocket connection cannot be established.
54
+ * Default: true
55
+ */
56
+ enableLongPollingDowngrade: boolean;
51
57
  }
@@ -3,14 +3,18 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ITelemetryLogger, ITelemetryProperties } from "@fluidframework/common-definitions";
6
+ import { ITelemetryProperties } from "@fluidframework/common-definitions";
7
+ import {
8
+ ITelemetryLoggerExt,
9
+ PerformanceEvent,
10
+ TelemetryLogger,
11
+ } from "@fluidframework/telemetry-utils";
7
12
  import { assert, fromUtf8ToBase64, performance } from "@fluidframework/common-utils";
8
13
  import { RateLimiter } from "@fluidframework/driver-utils";
9
14
  import {
10
15
  getAuthorizationTokenFromCredentials,
11
16
  RestLessClient,
12
17
  } from "@fluidframework/server-services-client";
13
- import { PerformanceEvent, TelemetryLogger } from "@fluidframework/telemetry-utils";
14
18
  import fetch from "cross-fetch";
15
19
  import type { AxiosRequestConfig, AxiosRequestHeaders } from "axios";
16
20
  import safeStringify from "json-stringify-safe";
@@ -21,7 +25,7 @@ import { pkgVersion as driverVersion } from "./packageVersion";
21
25
  import { QueryStringType, RestWrapper } from "./restWrapperBase";
22
26
 
23
27
  type AuthorizationHeaderGetter = (token: ITokenResponse) => string;
24
- type TokenFetcher = (refresh?: boolean) => Promise<ITokenResponse>;
28
+ export type TokenFetcher = (refresh?: boolean) => Promise<ITokenResponse>;
25
29
 
26
30
  const axiosRequestConfigToFetchRequestConfig = (
27
31
  requestConfig: AxiosRequestConfig,
@@ -102,12 +106,13 @@ export class RouterliciousRestWrapper extends RestWrapper {
102
106
  private token: ITokenResponse | undefined;
103
107
 
104
108
  constructor(
105
- logger: ITelemetryLogger,
109
+ logger: ITelemetryLoggerExt,
106
110
  private readonly rateLimiter: RateLimiter,
107
111
  private readonly fetchRefreshedToken: TokenFetcher,
108
112
  private readonly getAuthorizationHeader: AuthorizationHeaderGetter,
109
113
  private readonly useRestLess: boolean,
110
114
  baseurl?: string,
115
+ private tokenP?: Promise<ITokenResponse>,
111
116
  defaultQueryString: QueryStringType = {},
112
117
  ) {
113
118
  super(baseurl, defaultQueryString);
@@ -221,8 +226,9 @@ export class RouterliciousRestWrapper extends RestWrapper {
221
226
  if (this.token !== undefined) {
222
227
  return this.token;
223
228
  }
224
- const token = await this.fetchRefreshedToken();
229
+ const token = await (this.tokenP ?? this.fetchRefreshedToken());
225
230
  this.setToken(token);
231
+ this.tokenP = undefined;
226
232
  return token;
227
233
  }
228
234
 
@@ -233,12 +239,13 @@ export class RouterliciousRestWrapper extends RestWrapper {
233
239
 
234
240
  export class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {
235
241
  private constructor(
236
- logger: ITelemetryLogger,
242
+ logger: ITelemetryLoggerExt,
237
243
  rateLimiter: RateLimiter,
238
244
  fetchToken: TokenFetcher,
239
245
  getAuthorizationHeader: AuthorizationHeaderGetter,
240
246
  useRestLess: boolean,
241
247
  baseurl?: string,
248
+ initialTokenP?: Promise<ITokenResponse>,
242
249
  defaultQueryString: QueryStringType = {},
243
250
  ) {
244
251
  super(
@@ -248,43 +255,24 @@ export class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {
248
255
  getAuthorizationHeader,
249
256
  useRestLess,
250
257
  baseurl,
258
+ initialTokenP,
251
259
  defaultQueryString,
252
260
  );
253
261
  }
254
262
 
255
263
  public static async load(
256
264
  tenantId: string,
257
- documentId: string,
258
- tokenProvider: ITokenProvider,
259
- logger: ITelemetryLogger,
265
+ tokenFetcher: TokenFetcher,
266
+ logger: ITelemetryLoggerExt,
260
267
  rateLimiter: RateLimiter,
261
268
  useRestLess: boolean,
262
269
  baseurl?: string,
270
+ initialTokenP?: Promise<ITokenResponse>,
263
271
  ): Promise<RouterliciousStorageRestWrapper> {
264
272
  const defaultQueryString = {
265
273
  token: `${fromUtf8ToBase64(tenantId)}`,
266
274
  };
267
275
 
268
- const fetchStorageToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {
269
- return PerformanceEvent.timedExecAsync(
270
- logger,
271
- {
272
- eventName: "FetchStorageToken",
273
- docId: documentId,
274
- },
275
- async () => {
276
- // Craft credentials using tenant id and token
277
- const storageToken = await tokenProvider.fetchStorageToken(
278
- tenantId,
279
- documentId,
280
- refreshToken,
281
- );
282
-
283
- return storageToken;
284
- },
285
- );
286
- };
287
-
288
276
  const getAuthorizationHeader: AuthorizationHeaderGetter = (
289
277
  token: ITokenResponse,
290
278
  ): string => {
@@ -298,10 +286,11 @@ export class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {
298
286
  const restWrapper = new RouterliciousStorageRestWrapper(
299
287
  logger,
300
288
  rateLimiter,
301
- fetchStorageToken,
289
+ tokenFetcher,
302
290
  getAuthorizationHeader,
303
291
  useRestLess,
304
292
  baseurl,
293
+ initialTokenP,
305
294
  defaultQueryString,
306
295
  );
307
296
 
@@ -311,12 +300,13 @@ export class RouterliciousStorageRestWrapper extends RouterliciousRestWrapper {
311
300
 
312
301
  export class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {
313
302
  private constructor(
314
- logger: ITelemetryLogger,
303
+ logger: ITelemetryLoggerExt,
315
304
  rateLimiter: RateLimiter,
316
305
  fetchToken: TokenFetcher,
317
306
  getAuthorizationHeader: AuthorizationHeaderGetter,
318
307
  useRestLess: boolean,
319
308
  baseurl?: string,
309
+ initialTokenP?: Promise<ITokenResponse>,
320
310
  defaultQueryString: QueryStringType = {},
321
311
  ) {
322
312
  super(
@@ -326,18 +316,18 @@ export class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {
326
316
  getAuthorizationHeader,
327
317
  useRestLess,
328
318
  baseurl,
319
+ initialTokenP,
329
320
  defaultQueryString,
330
321
  );
331
322
  }
332
323
 
333
324
  public static async load(
334
- tenantId: string,
335
- documentId: string | undefined,
336
- tokenProvider: ITokenProvider,
337
- logger: ITelemetryLogger,
325
+ tokenFetcher: TokenFetcher,
326
+ logger: ITelemetryLoggerExt,
338
327
  rateLimiter: RateLimiter,
339
328
  useRestLess: boolean,
340
329
  baseurl?: string,
330
+ initialTokenP?: Promise<ITokenResponse>,
341
331
  ): Promise<RouterliciousOrdererRestWrapper> {
342
332
  const getAuthorizationHeader: AuthorizationHeaderGetter = (
343
333
  token: ITokenResponse,
@@ -345,34 +335,71 @@ export class RouterliciousOrdererRestWrapper extends RouterliciousRestWrapper {
345
335
  return `Basic ${token.jwt}`;
346
336
  };
347
337
 
348
- const fetchOrdererToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {
349
- return PerformanceEvent.timedExecAsync(
350
- logger,
351
- {
352
- eventName: "FetchOrdererToken",
353
- docId: documentId,
354
- },
355
- async () => {
356
- const ordererToken = await tokenProvider.fetchOrdererToken(
357
- tenantId,
358
- documentId,
359
- refreshToken,
360
- );
361
-
362
- return ordererToken;
363
- },
364
- );
365
- };
366
-
367
338
  const restWrapper = new RouterliciousOrdererRestWrapper(
368
339
  logger,
369
340
  rateLimiter,
370
- fetchOrdererToken,
341
+ tokenFetcher,
371
342
  getAuthorizationHeader,
372
343
  useRestLess,
373
344
  baseurl,
345
+ initialTokenP,
374
346
  );
375
347
 
376
348
  return restWrapper;
377
349
  }
378
350
  }
351
+
352
+ export function toInstrumentedR11sOrdererTokenFetcher(
353
+ tenantId: string,
354
+ documentId: string | undefined,
355
+ tokenProvider: ITokenProvider,
356
+ logger: ITelemetryLoggerExt,
357
+ ): TokenFetcher {
358
+ const fetchOrdererToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {
359
+ return PerformanceEvent.timedExecAsync(
360
+ logger,
361
+ {
362
+ eventName: "FetchOrdererToken",
363
+ docId: documentId,
364
+ },
365
+ async () => {
366
+ const ordererToken = await tokenProvider.fetchOrdererToken(
367
+ tenantId,
368
+ documentId,
369
+ refreshToken,
370
+ );
371
+
372
+ return ordererToken;
373
+ },
374
+ );
375
+ };
376
+ return fetchOrdererToken;
377
+ }
378
+
379
+ export function toInstrumentedR11sStorageTokenFetcher(
380
+ tenantId: string,
381
+ documentId: string,
382
+ tokenProvider: ITokenProvider,
383
+ logger: ITelemetryLoggerExt,
384
+ ): TokenFetcher {
385
+ const fetchStorageToken = async (refreshToken?: boolean): Promise<ITokenResponse> => {
386
+ return PerformanceEvent.timedExecAsync(
387
+ logger,
388
+ {
389
+ eventName: "FetchStorageToken",
390
+ docId: documentId,
391
+ },
392
+ async () => {
393
+ // Craft credentials using tenant id and token
394
+ const storageToken = await tokenProvider.fetchStorageToken(
395
+ tenantId,
396
+ documentId,
397
+ refreshToken,
398
+ );
399
+
400
+ return storageToken;
401
+ },
402
+ );
403
+ };
404
+ return fetchStorageToken;
405
+ }
@@ -10,14 +10,14 @@ import {
10
10
  IWriteSummaryResponse,
11
11
  } from "@fluidframework/server-services-client";
12
12
  import { runWithRetry } from "@fluidframework/driver-utils";
13
- import { ITelemetryLogger } from "@fluidframework/common-definitions";
13
+ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
14
14
  import { IGitManager } from "./storageContracts";
15
15
  import { IR11sResponse } from "./restWrapper";
16
16
 
17
17
  export class RetriableGitManager implements IGitManager {
18
18
  constructor(
19
19
  private readonly internalGitManager: IGitManager,
20
- private readonly logger: ITelemetryLogger,
20
+ private readonly logger: ITelemetryLoggerExt,
21
21
  ) {}
22
22
 
23
23
  public async getCommits(
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import type { ITelemetryLogger } from "@fluidframework/common-definitions";
6
+ import { ITelemetryLoggerExt, PerformanceEvent } from "@fluidframework/telemetry-utils";
7
7
  import { stringToBuffer, Uint8ArrayToString } from "@fluidframework/common-utils";
8
8
  import {
9
9
  IDocumentStorageService,
@@ -18,7 +18,6 @@ import {
18
18
  ISummaryTree,
19
19
  IVersion,
20
20
  } from "@fluidframework/protocol-definitions";
21
- import { PerformanceEvent } from "@fluidframework/telemetry-utils";
22
21
  import { IRouterliciousDriverPolicies } from "./policies";
23
22
  import { ICache, InMemoryCache } from "./cache";
24
23
  import { RetriableGitManager } from "./retriableGitManager";
@@ -57,7 +56,7 @@ export class ShreddedSummaryDocumentStorageService implements IDocumentStorageSe
57
56
  constructor(
58
57
  protected readonly id: string,
59
58
  protected readonly manager: GitManager,
60
- protected readonly logger: ITelemetryLogger,
59
+ protected readonly logger: ITelemetryLoggerExt,
61
60
  public readonly policies: IDocumentStorageServicePolicies,
62
61
  driverPolicies?: IRouterliciousDriverPolicies,
63
62
  blobCache?: ICache<ArrayBufferLike>,
package/src/urlUtils.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { IFluidResolvedUrl } from "@fluidframework/driver-definitions";
6
+ import { IResolvedUrl } from "@fluidframework/driver-definitions";
7
7
  import URLParse from "url-parse";
8
8
  import { ISession } from "@fluidframework/server-services-client";
9
9
 
@@ -21,9 +21,9 @@ export const replaceDocumentIdInPath = (urlPath: string, documentId: string): st
21
21
  urlPath.split("/").slice(0, -1).concat([documentId]).join("/");
22
22
 
23
23
  export const getDiscoveredFluidResolvedUrl = (
24
- resolvedUrl: IFluidResolvedUrl,
24
+ resolvedUrl: IResolvedUrl,
25
25
  session: ISession,
26
- ): IFluidResolvedUrl => {
26
+ ): IResolvedUrl => {
27
27
  const discoveredOrdererUrl = new URLParse(session.ordererUrl);
28
28
  const deltaStorageUrl = new URLParse(resolvedUrl.endpoints.deltaStorageUrl);
29
29
  deltaStorageUrl.set("host", discoveredOrdererUrl.host);
@@ -33,7 +33,7 @@ export const getDiscoveredFluidResolvedUrl = (
33
33
  storageUrl.set("host", discoveredStorageUrl.host);
34
34
 
35
35
  const parsedUrl = parseFluidUrl(resolvedUrl.url);
36
- const discoveredResolvedUrl: IFluidResolvedUrl = {
36
+ const discoveredResolvedUrl: IResolvedUrl = {
37
37
  endpoints: {
38
38
  deltaStorageUrl: deltaStorageUrl.toString(),
39
39
  ordererUrl: session.ordererUrl,
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import type { ITelemetryLogger } from "@fluidframework/common-definitions";
6
+ import { ITelemetryLoggerExt, PerformanceEvent } from "@fluidframework/telemetry-utils";
7
7
  import {
8
8
  assert,
9
9
  performance,
@@ -24,7 +24,6 @@ import {
24
24
  IVersion,
25
25
  } from "@fluidframework/protocol-definitions";
26
26
  import { IWholeFlatSummary } from "@fluidframework/server-services-client";
27
- import { PerformanceEvent } from "@fluidframework/telemetry-utils";
28
27
  import { ICache, InMemoryCache } from "./cache";
29
28
  import { IRouterliciousDriverPolicies } from "./policies";
30
29
  import {
@@ -56,7 +55,7 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
56
55
  constructor(
57
56
  protected readonly id: string,
58
57
  protected readonly manager: GitManager,
59
- protected readonly logger: ITelemetryLogger,
58
+ protected readonly logger: ITelemetryLoggerExt,
60
59
  public readonly policies: IDocumentStorageServicePolicies,
61
60
  private readonly driverPolicies?: IRouterliciousDriverPolicies,
62
61
  private readonly blobCache: ICache<ArrayBufferLike> = new InMemoryCache(),
@@ -317,6 +316,7 @@ export class WholeSummaryDocumentStorageService implements IDocumentStorageServi
317
316
  trees,
318
317
  blobs: numBlobs,
319
318
  encodedBlobsSize,
319
+ sequenceNumber: snapshot.sequenceNumber,
320
320
  ...response.propsToLog,
321
321
  snapshotConversionTime,
322
322
  ...getW3CData(response.requestUrl, "xmlhttprequest"),