@fluidframework/odsp-driver 0.56.0 → 0.56.4

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 (54) hide show
  1. package/dist/createFile.js +2 -2
  2. package/dist/createFile.js.map +1 -1
  3. package/dist/epochTracker.d.ts.map +1 -1
  4. package/dist/epochTracker.js +2 -2
  5. package/dist/epochTracker.js.map +1 -1
  6. package/dist/fetchSnapshot.js +1 -1
  7. package/dist/fetchSnapshot.js.map +1 -1
  8. package/dist/getFileLink.js +2 -2
  9. package/dist/getFileLink.js.map +1 -1
  10. package/dist/odspDeltaStorageService.js +1 -1
  11. package/dist/odspDeltaStorageService.js.map +1 -1
  12. package/dist/odspDocumentStorageManager.js +3 -3
  13. package/dist/odspDocumentStorageManager.js.map +1 -1
  14. package/dist/odspUtils.d.ts +1 -1
  15. package/dist/odspUtils.d.ts.map +1 -1
  16. package/dist/odspUtils.js +11 -8
  17. package/dist/odspUtils.js.map +1 -1
  18. package/dist/packageVersion.d.ts +1 -1
  19. package/dist/packageVersion.js +1 -1
  20. package/dist/packageVersion.js.map +1 -1
  21. package/dist/vroom.js +1 -1
  22. package/dist/vroom.js.map +1 -1
  23. package/lib/createFile.js +2 -2
  24. package/lib/createFile.js.map +1 -1
  25. package/lib/epochTracker.d.ts.map +1 -1
  26. package/lib/epochTracker.js +2 -2
  27. package/lib/epochTracker.js.map +1 -1
  28. package/lib/fetchSnapshot.js +1 -1
  29. package/lib/fetchSnapshot.js.map +1 -1
  30. package/lib/getFileLink.js +2 -2
  31. package/lib/getFileLink.js.map +1 -1
  32. package/lib/odspDeltaStorageService.js +1 -1
  33. package/lib/odspDeltaStorageService.js.map +1 -1
  34. package/lib/odspDocumentStorageManager.js +3 -3
  35. package/lib/odspDocumentStorageManager.js.map +1 -1
  36. package/lib/odspUtils.d.ts +1 -1
  37. package/lib/odspUtils.d.ts.map +1 -1
  38. package/lib/odspUtils.js +12 -9
  39. package/lib/odspUtils.js.map +1 -1
  40. package/lib/packageVersion.d.ts +1 -1
  41. package/lib/packageVersion.js +1 -1
  42. package/lib/packageVersion.js.map +1 -1
  43. package/lib/vroom.js +1 -1
  44. package/lib/vroom.js.map +1 -1
  45. package/package.json +7 -7
  46. package/src/createFile.ts +2 -2
  47. package/src/epochTracker.ts +2 -8
  48. package/src/fetchSnapshot.ts +1 -1
  49. package/src/getFileLink.ts +2 -2
  50. package/src/odspDeltaStorageService.ts +1 -1
  51. package/src/odspDocumentStorageManager.ts +3 -3
  52. package/src/odspUtils.ts +21 -11
  53. package/src/packageVersion.ts +1 -1
  54. package/src/vroom.ts +1 -1
package/src/createFile.ts CHANGED
@@ -159,7 +159,7 @@ export async function createNewEmptyFluidFile(
159
159
  }
160
160
  event.end({
161
161
  headers: Object.keys(headers).length !== 0 ? true : undefined,
162
- ...fetchResponse.commonSpoHeaders,
162
+ ...fetchResponse.propsToLog,
163
163
  });
164
164
  return content.id;
165
165
  },
@@ -220,7 +220,7 @@ export async function createNewFluidFileFromSummary(
220
220
  event.end({
221
221
  headers: Object.keys(headers).length !== 0 ? true : undefined,
222
222
  attempts: options.refresh ? 2 : 1,
223
- ...fetchResponse.commonSpoHeaders,
223
+ ...fetchResponse.propsToLog,
224
224
  });
225
225
  return content;
226
226
  },
@@ -182,10 +182,7 @@ export class EpochTracker implements IPersistedFileCache {
182
182
  ).then((response) => {
183
183
  epochFromResponse = response.headers.get("x-fluid-epoch");
184
184
  this.validateEpochFromResponse(epochFromResponse, fetchType);
185
- response.commonSpoHeaders = {
186
- ...response.commonSpoHeaders,
187
- "X-RequestStats": clientCorrelationId,
188
- };
185
+ response.propsToLog.XRequestStatsHeader = clientCorrelationId;
189
186
  return response;
190
187
  }).catch(async (error) => {
191
188
  // Get the server epoch from error in case we don't have it as if undefined we won't be able
@@ -224,10 +221,7 @@ export class EpochTracker implements IPersistedFileCache {
224
221
  ).then((response) => {
225
222
  epochFromResponse = response.headers.get("x-fluid-epoch");
226
223
  this.validateEpochFromResponse(epochFromResponse, fetchType);
227
- response.commonSpoHeaders = {
228
- ...response.commonSpoHeaders,
229
- "X-RequestStats": clientCorrelationId,
230
- };
224
+ response.propsToLog.XRequestStatsHeader = clientCorrelationId;
231
225
  return response;
232
226
  }).catch(async (error) => {
233
227
  // Get the server epoch from error in case we don't have it as if undefined we won't be able
@@ -317,7 +317,7 @@ async function fetchLatestSnapshotCore(
317
317
  // Azure Fluid Relay service is the redeem status (S means success), and FRP is a flag to indicate
318
318
  // if the permission has changed.
319
319
  sltelemetry: response.odspSnapshotResponse.headers.get("x-fluid-sltelemetry"),
320
- ...response.odspSnapshotResponse.commonSpoHeaders,
320
+ ...response.odspSnapshotResponse.propsToLog,
321
321
  });
322
322
  return snapshot;
323
323
  },
@@ -117,7 +117,7 @@ async function getFileLinkCore(
117
117
  },
118
118
  };
119
119
  const response = await fetchHelper(url, requestInit);
120
- additionalProps = response.commonSpoHeaders;
120
+ additionalProps = response.propsToLog;
121
121
 
122
122
  const sharingInfo = await response.content.json();
123
123
  const directUrl = sharingInfo?.d?.directUrl;
@@ -174,7 +174,7 @@ async function getFileItemLite(
174
174
  );
175
175
  const requestInit = { method: "GET", headers };
176
176
  const response = await fetchHelper(url, requestInit);
177
- additionalProps = response.commonSpoHeaders;
177
+ additionalProps = response.propsToLog;
178
178
 
179
179
  const responseJson = await response.content.json();
180
180
  if (!isFileItemLite(responseJson)) {
@@ -94,7 +94,7 @@ export class OdspDeltaStorageService {
94
94
  headers: Object.keys(headers).length !== 0 ? true : undefined,
95
95
  length: messages.length,
96
96
  duration: response.duration, // this duration for single attempt!
97
- ...response.commonSpoHeaders,
97
+ ...response.propsToLog,
98
98
  attempts: options.refresh ? 2 : 1,
99
99
  from,
100
100
  to,
@@ -270,7 +270,7 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
270
270
  ));
271
271
  event.end({
272
272
  blobId: res.content.id,
273
- ...res.commonSpoHeaders,
273
+ ...res.propsToLog,
274
274
  });
275
275
  return res;
276
276
  },
@@ -309,7 +309,7 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
309
309
  const res = await this.epochTracker.fetchArray(url, { headers }, "blob");
310
310
  event.end({
311
311
  waitQueueLength: this.epochTracker.rateLimiter.waitQueueLength,
312
- ...res.commonSpoHeaders,
312
+ ...res.propsToLog,
313
313
  attempts: options.refresh ? 2 : 1,
314
314
  });
315
315
  const cacheControl = res.headers.get("cache-control");
@@ -318,7 +318,7 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
318
318
  eventName: "NonCacheableBlob",
319
319
  cacheControl,
320
320
  blobId,
321
- ...res.commonSpoHeaders,
321
+ ...res.propsToLog,
322
322
  });
323
323
  }
324
324
  return res.content;
package/src/odspUtils.ts CHANGED
@@ -5,7 +5,13 @@
5
5
 
6
6
  import { ITelemetryProperties, ITelemetryBaseLogger, ITelemetryLogger } from "@fluidframework/common-definitions";
7
7
  import { IResolvedUrl, DriverErrorType } from "@fluidframework/driver-definitions";
8
- import { isOnline, OnlineStatus, RetryableError, NonRetryableError } from "@fluidframework/driver-utils";
8
+ import {
9
+ isOnline,
10
+ OnlineStatus,
11
+ RetryableError,
12
+ NonRetryableError,
13
+ NetworkErrorBasic,
14
+ } from "@fluidframework/driver-utils";
9
15
  import { assert, performance } from "@fluidframework/common-utils";
10
16
  import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
11
17
  import { ChildLogger, PerformanceEvent, wrapError } from "@fluidframework/telemetry-utils";
@@ -46,7 +52,7 @@ export interface ISnapshotContents {
46
52
  export interface IOdspResponse<T> {
47
53
  content: T;
48
54
  headers: Map<string, string>;
49
- commonSpoHeaders: ITelemetryProperties;
55
+ propsToLog: ITelemetryProperties;
50
56
  duration: number,
51
57
  }
52
58
 
@@ -116,7 +122,7 @@ export async function fetchHelper(
116
122
  return {
117
123
  content: response,
118
124
  headers,
119
- commonSpoHeaders: getSPOAndGraphRequestIdsFromResponse(headers),
125
+ propsToLog: getSPOAndGraphRequestIdsFromResponse(headers),
120
126
  duration: performance.now() - start,
121
127
  };
122
128
  }, (error) => {
@@ -159,14 +165,14 @@ export async function fetchArray(
159
165
  requestInfo: RequestInfo,
160
166
  requestInit: RequestInit | undefined,
161
167
  ): Promise<IOdspResponse<ArrayBuffer>> {
162
- const { content, headers, commonSpoHeaders, duration } = await fetchHelper(requestInfo, requestInit);
168
+ const { content, headers, propsToLog, duration } = await fetchHelper(requestInfo, requestInit);
163
169
 
164
170
  const arrayBuffer = await content.arrayBuffer();
165
- commonSpoHeaders.bodySize = arrayBuffer.byteLength;
171
+ propsToLog.bodySize = arrayBuffer.byteLength;
166
172
  return {
167
173
  headers,
168
174
  content: arrayBuffer,
169
- commonSpoHeaders,
175
+ propsToLog,
170
176
  duration,
171
177
  };
172
178
  }
@@ -180,7 +186,7 @@ export async function fetchAndParseAsJSONHelper<T>(
180
186
  requestInfo: RequestInfo,
181
187
  requestInit: RequestInit | undefined,
182
188
  ): Promise<IOdspResponse<T>> {
183
- const { content, headers, commonSpoHeaders, duration } = await fetchHelper(requestInfo, requestInit);
189
+ const { content, headers, propsToLog, duration } = await fetchHelper(requestInfo, requestInit);
184
190
  let text: string | undefined;
185
191
  try {
186
192
  text = await content.text();
@@ -198,11 +204,11 @@ export async function fetchAndParseAsJSONHelper<T>(
198
204
  );
199
205
  }
200
206
 
201
- commonSpoHeaders.bodySize = text.length;
207
+ propsToLog.bodySize = text.length;
202
208
  const res = {
203
209
  headers,
204
210
  content: JSON.parse(text),
205
- commonSpoHeaders,
211
+ propsToLog,
206
212
  duration,
207
213
  };
208
214
  return res;
@@ -302,13 +308,17 @@ export function toInstrumentedOdspTokenFetcher(
302
308
  }
303
309
  return token;
304
310
  }, (error) => {
311
+ // There is an important but unofficial contract here where token providers can set canRetry: true
312
+ // to hook into the driver's retry logic (e.g. the retry loop when initiating a connection)
313
+ const rawCanRetry = error?.canRetry;
305
314
  const tokenError = wrapError(
306
315
  error,
307
- (errorMessage) => new NonRetryableError(
316
+ (errorMessage) => new NetworkErrorBasic(
308
317
  "tokenFetcherFailed",
309
318
  errorMessage,
310
319
  OdspErrorType.fetchTokenError,
311
- { method: name }));
320
+ typeof rawCanRetry === "boolean" ? rawCanRetry : false /* canRetry */,
321
+ { method: name, driverVersion: pkgVersion }));
312
322
  throw tokenError;
313
323
  }),
314
324
  { cancel: "generic" });
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/odsp-driver";
9
- export const pkgVersion = "0.56.0";
9
+ export const pkgVersion = "0.56.4";
package/src/vroom.ts CHANGED
@@ -94,7 +94,7 @@ export async function fetchJoinSession(
94
94
 
95
95
  // TODO SPO-specific telemetry
96
96
  event.end({
97
- ...response.commonSpoHeaders,
97
+ ...response.propsToLog,
98
98
  // pushV2 websocket urls will contain pushf
99
99
  pushv2: socketUrl.includes("pushf"),
100
100
  webSocketHostName,