@fluidframework/odsp-driver 0.56.0 → 0.57.0-51086

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 (114) hide show
  1. package/dist/createFile.d.ts.map +1 -1
  2. package/dist/createFile.js +6 -5
  3. package/dist/createFile.js.map +1 -1
  4. package/dist/createOdspUrl.d.ts.map +1 -1
  5. package/dist/createOdspUrl.js.map +1 -1
  6. package/dist/epochTracker.d.ts.map +1 -1
  7. package/dist/epochTracker.js +5 -4
  8. package/dist/epochTracker.js.map +1 -1
  9. package/dist/fetchSnapshot.d.ts.map +1 -1
  10. package/dist/fetchSnapshot.js +2 -1
  11. package/dist/fetchSnapshot.js.map +1 -1
  12. package/dist/getFileLink.d.ts.map +1 -1
  13. package/dist/getFileLink.js +5 -4
  14. package/dist/getFileLink.js.map +1 -1
  15. package/dist/getQueryString.d.ts.map +1 -1
  16. package/dist/getQueryString.js.map +1 -1
  17. package/dist/odspDeltaStorageService.js +1 -1
  18. package/dist/odspDeltaStorageService.js.map +1 -1
  19. package/dist/odspDocumentDeltaConnection.d.ts +6 -6
  20. package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
  21. package/dist/odspDocumentDeltaConnection.js +1 -0
  22. package/dist/odspDocumentDeltaConnection.js.map +1 -1
  23. package/dist/odspDocumentService.d.ts.map +1 -1
  24. package/dist/odspDocumentService.js +3 -2
  25. package/dist/odspDocumentService.js.map +1 -1
  26. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  27. package/dist/odspDocumentStorageManager.js +10 -9
  28. package/dist/odspDocumentStorageManager.js.map +1 -1
  29. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  30. package/dist/odspDriverUrlResolverForShareLink.js +2 -1
  31. package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
  32. package/dist/odspSummaryUploadManager.d.ts.map +1 -1
  33. package/dist/odspSummaryUploadManager.js +4 -1
  34. package/dist/odspSummaryUploadManager.js.map +1 -1
  35. package/dist/odspUtils.d.ts +1 -1
  36. package/dist/odspUtils.d.ts.map +1 -1
  37. package/dist/odspUtils.js +17 -14
  38. package/dist/odspUtils.js.map +1 -1
  39. package/dist/packageVersion.d.ts +1 -1
  40. package/dist/packageVersion.d.ts.map +1 -1
  41. package/dist/packageVersion.js +1 -1
  42. package/dist/packageVersion.js.map +1 -1
  43. package/dist/retryUtils.js.map +1 -1
  44. package/dist/vroom.js +1 -1
  45. package/dist/vroom.js.map +1 -1
  46. package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
  47. package/dist/zipItDataRepresentationUtils.js +2 -0
  48. package/dist/zipItDataRepresentationUtils.js.map +1 -1
  49. package/lib/createFile.d.ts.map +1 -1
  50. package/lib/createFile.js +6 -5
  51. package/lib/createFile.js.map +1 -1
  52. package/lib/createOdspUrl.d.ts.map +1 -1
  53. package/lib/createOdspUrl.js.map +1 -1
  54. package/lib/epochTracker.d.ts.map +1 -1
  55. package/lib/epochTracker.js +5 -4
  56. package/lib/epochTracker.js.map +1 -1
  57. package/lib/fetchSnapshot.d.ts.map +1 -1
  58. package/lib/fetchSnapshot.js +2 -1
  59. package/lib/fetchSnapshot.js.map +1 -1
  60. package/lib/getFileLink.d.ts.map +1 -1
  61. package/lib/getFileLink.js +5 -4
  62. package/lib/getFileLink.js.map +1 -1
  63. package/lib/getQueryString.d.ts.map +1 -1
  64. package/lib/getQueryString.js.map +1 -1
  65. package/lib/odspDeltaStorageService.js +1 -1
  66. package/lib/odspDeltaStorageService.js.map +1 -1
  67. package/lib/odspDocumentDeltaConnection.d.ts +6 -6
  68. package/lib/odspDocumentDeltaConnection.d.ts.map +1 -1
  69. package/lib/odspDocumentDeltaConnection.js +1 -0
  70. package/lib/odspDocumentDeltaConnection.js.map +1 -1
  71. package/lib/odspDocumentService.d.ts.map +1 -1
  72. package/lib/odspDocumentService.js +3 -2
  73. package/lib/odspDocumentService.js.map +1 -1
  74. package/lib/odspDocumentStorageManager.d.ts.map +1 -1
  75. package/lib/odspDocumentStorageManager.js +10 -9
  76. package/lib/odspDocumentStorageManager.js.map +1 -1
  77. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  78. package/lib/odspDriverUrlResolverForShareLink.js +2 -1
  79. package/lib/odspDriverUrlResolverForShareLink.js.map +1 -1
  80. package/lib/odspSummaryUploadManager.d.ts.map +1 -1
  81. package/lib/odspSummaryUploadManager.js +4 -1
  82. package/lib/odspSummaryUploadManager.js.map +1 -1
  83. package/lib/odspUtils.d.ts +1 -1
  84. package/lib/odspUtils.d.ts.map +1 -1
  85. package/lib/odspUtils.js +20 -17
  86. package/lib/odspUtils.js.map +1 -1
  87. package/lib/packageVersion.d.ts +1 -1
  88. package/lib/packageVersion.d.ts.map +1 -1
  89. package/lib/packageVersion.js +1 -1
  90. package/lib/packageVersion.js.map +1 -1
  91. package/lib/retryUtils.js.map +1 -1
  92. package/lib/vroom.js +1 -1
  93. package/lib/vroom.js.map +1 -1
  94. package/lib/zipItDataRepresentationUtils.d.ts.map +1 -1
  95. package/lib/zipItDataRepresentationUtils.js +2 -0
  96. package/lib/zipItDataRepresentationUtils.js.map +1 -1
  97. package/package.json +8 -8
  98. package/src/createFile.ts +8 -5
  99. package/src/createOdspUrl.ts +1 -1
  100. package/src/epochTracker.ts +6 -10
  101. package/src/fetchSnapshot.ts +8 -7
  102. package/src/getFileLink.ts +7 -4
  103. package/src/getQueryString.ts +1 -1
  104. package/src/odspDeltaStorageService.ts +1 -1
  105. package/src/odspDocumentDeltaConnection.ts +9 -8
  106. package/src/odspDocumentService.ts +4 -2
  107. package/src/odspDocumentStorageManager.ts +15 -11
  108. package/src/odspDriverUrlResolverForShareLink.ts +3 -1
  109. package/src/odspSummaryUploadManager.ts +4 -1
  110. package/src/odspUtils.ts +34 -19
  111. package/src/packageVersion.ts +1 -1
  112. package/src/retryUtils.ts +1 -1
  113. package/src/vroom.ts +1 -1
  114. package/src/zipItDataRepresentationUtils.ts +2 -0
@@ -46,7 +46,9 @@ export class OdspSummaryUploadManager {
46
46
  public async writeSummaryTree(tree: api.ISummaryTree, context: ISummaryContext) {
47
47
  // If the last proposed handle is not the proposed handle of the acked summary(could happen when the last summary get nacked),
48
48
  // then re-initialize the caches with the previous ones else just update the previous caches with the caches from acked summary.
49
- if (context.proposalHandle !== this.lastSummaryProposalHandle) {
49
+ // Don't bother logging if lastSummaryProposalHandle hasn't been set before; only log on a positive mismatch.
50
+ if (this.lastSummaryProposalHandle !== undefined &&
51
+ this.lastSummaryProposalHandle !== context.proposalHandle) {
50
52
  this.mc.logger.sendTelemetryEvent({
51
53
  eventName: "LastSummaryProposedHandleMismatch",
52
54
  ackedSummaryProposedHandle: context.proposalHandle,
@@ -106,6 +108,7 @@ export class OdspSummaryUploadManager {
106
108
  headers: Object.keys(headers).length !== 0 ? true : undefined,
107
109
  blobs,
108
110
  size: postBody.length,
111
+ referenceSequenceNumber,
109
112
  },
110
113
  async () => {
111
114
  const response = await this.epochTracker.fetchAndParseAsJSON<IWriteSummaryResponse>(
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";
@@ -28,7 +34,7 @@ import {
28
34
  InstrumentedStorageTokenFetcher,
29
35
  } from "@fluidframework/odsp-driver-definitions";
30
36
  import { fetch } from "./fetch";
31
- import { pkgVersion } from "./packageVersion";
37
+ import { pkgVersion as driverVersion } from "./packageVersion";
32
38
  import { IOdspSnapshot } from "./contracts";
33
39
 
34
40
  export const getWithRetryForTokenRefreshRepeat = "getWithRetryForTokenRefreshRepeat";
@@ -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
 
@@ -105,7 +111,8 @@ export async function fetchHelper(
105
111
  throw new NonRetryableError(
106
112
  "odspFetchErrorNoResponse",
107
113
  "No response from fetch call",
108
- DriverErrorType.incorrectServerResponse);
114
+ DriverErrorType.incorrectServerResponse,
115
+ { driverVersion });
109
116
  }
110
117
  if (!response.ok || response.status < 200 || response.status >= 300) {
111
118
  throwOdspNetworkError(
@@ -116,7 +123,7 @@ export async function fetchHelper(
116
123
  return {
117
124
  content: response,
118
125
  headers,
119
- commonSpoHeaders: getSPOAndGraphRequestIdsFromResponse(headers),
126
+ propsToLog: getSPOAndGraphRequestIdsFromResponse(headers),
120
127
  duration: performance.now() - start,
121
128
  };
122
129
  }, (error) => {
@@ -130,11 +137,13 @@ export async function fetchHelper(
130
137
  }
131
138
  // This error is thrown by fetch() when AbortSignal is provided and it gets cancelled
132
139
  if (error.name === "AbortError") {
133
- throw new RetryableError("fetchAbort", "Fetch Timeout (AbortError)", OdspErrorType.fetchTimeout);
140
+ throw new RetryableError(
141
+ "fetchAbort", "Fetch Timeout (AbortError)", OdspErrorType.fetchTimeout, { driverVersion });
134
142
  }
135
143
  // TCP/IP timeout
136
144
  if (errorText.indexOf("ETIMEDOUT") !== -1) {
137
- throw new RetryableError("fetchETimedout", "Fetch Timeout (ETIMEDOUT)", OdspErrorType.fetchTimeout);
145
+ throw new RetryableError(
146
+ "fetchETimedout", "Fetch Timeout (ETIMEDOUT)", OdspErrorType.fetchTimeout, { driverVersion });
138
147
  }
139
148
 
140
149
  //
@@ -143,9 +152,11 @@ export async function fetchHelper(
143
152
  // It is also non-serializable object due to circular references.
144
153
  //
145
154
  if (online === OnlineStatus.Offline) {
146
- throw new RetryableError("OdspFetchOffline", `Offline: ${errorText}`, DriverErrorType.offlineError);
155
+ throw new RetryableError(
156
+ "OdspFetchOffline", `Offline: ${errorText}`, DriverErrorType.offlineError, { driverVersion });
147
157
  } else {
148
- throw new RetryableError("OdspFetchError", `Fetch error: ${errorText}`, DriverErrorType.fetchFailure);
158
+ throw new RetryableError(
159
+ "OdspFetchError", `Fetch error: ${errorText}`, DriverErrorType.fetchFailure, { driverVersion });
149
160
  }
150
161
  });
151
162
  }
@@ -159,14 +170,14 @@ export async function fetchArray(
159
170
  requestInfo: RequestInfo,
160
171
  requestInit: RequestInit | undefined,
161
172
  ): Promise<IOdspResponse<ArrayBuffer>> {
162
- const { content, headers, commonSpoHeaders, duration } = await fetchHelper(requestInfo, requestInit);
173
+ const { content, headers, propsToLog, duration } = await fetchHelper(requestInfo, requestInit);
163
174
 
164
175
  const arrayBuffer = await content.arrayBuffer();
165
- commonSpoHeaders.bodySize = arrayBuffer.byteLength;
176
+ propsToLog.bodySize = arrayBuffer.byteLength;
166
177
  return {
167
178
  headers,
168
179
  content: arrayBuffer,
169
- commonSpoHeaders,
180
+ propsToLog,
170
181
  duration,
171
182
  };
172
183
  }
@@ -180,7 +191,7 @@ export async function fetchAndParseAsJSONHelper<T>(
180
191
  requestInfo: RequestInfo,
181
192
  requestInit: RequestInit | undefined,
182
193
  ): Promise<IOdspResponse<T>> {
183
- const { content, headers, commonSpoHeaders, duration } = await fetchHelper(requestInfo, requestInit);
194
+ const { content, headers, propsToLog, duration } = await fetchHelper(requestInfo, requestInit);
184
195
  let text: string | undefined;
185
196
  try {
186
197
  text = await content.text();
@@ -198,11 +209,11 @@ export async function fetchAndParseAsJSONHelper<T>(
198
209
  );
199
210
  }
200
211
 
201
- commonSpoHeaders.bodySize = text.length;
212
+ propsToLog.bodySize = text.length;
202
213
  const res = {
203
214
  headers,
204
215
  content: JSON.parse(text),
205
- commonSpoHeaders,
216
+ propsToLog,
206
217
  duration,
207
218
  };
208
219
  return res;
@@ -232,7 +243,7 @@ export const createOdspLogger = (logger?: ITelemetryBaseLogger) =>
232
243
  "OdspDriver",
233
244
  { all :
234
245
  {
235
- driverVersion: pkgVersion,
246
+ driverVersion,
236
247
  },
237
248
  });
238
249
 
@@ -298,17 +309,21 @@ export function toInstrumentedOdspTokenFetcher(
298
309
  "storageTokenIsNull",
299
310
  `Token is null for ${name} call`,
300
311
  OdspErrorType.fetchTokenError,
301
- { method: name });
312
+ { method: name, driverVersion });
302
313
  }
303
314
  return token;
304
315
  }, (error) => {
316
+ // There is an important but unofficial contract here where token providers can set canRetry: true
317
+ // to hook into the driver's retry logic (e.g. the retry loop when initiating a connection)
318
+ const rawCanRetry = error?.canRetry;
305
319
  const tokenError = wrapError(
306
320
  error,
307
- (errorMessage) => new NonRetryableError(
321
+ (errorMessage) => new NetworkErrorBasic(
308
322
  "tokenFetcherFailed",
309
323
  errorMessage,
310
324
  OdspErrorType.fetchTokenError,
311
- { method: name }));
325
+ typeof rawCanRetry === "boolean" ? rawCanRetry : false /* canRetry */,
326
+ { method: name, driverVersion }));
312
327
  throw tokenError;
313
328
  }),
314
329
  { 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.57.0-51086";
package/src/retryUtils.ts CHANGED
@@ -68,7 +68,7 @@ export async function runWithRetry<T>(
68
68
 
69
69
  assert(canRetry, 0x24d /* "can retry" */);
70
70
  await delay(Math.floor(retryAfter));
71
- retryAfter += retryAfter / 4 * (1 + Math.random());
71
+ retryAfter += retryAfter / 4 * (1 + Math.random());
72
72
  lastError = error;
73
73
  }
74
74
  }
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,
@@ -12,6 +12,7 @@ import { assert, IsoBuffer, Uint8ArrayToArrayBuffer, Uint8ArrayToString } from "
12
12
  import { NonRetryableError } from "@fluidframework/driver-utils";
13
13
  import { DriverErrorType } from "@fluidframework/driver-definitions";
14
14
  import { ReadBuffer } from "./ReadBufferUtils";
15
+ import { pkgVersion as driverVersion } from "./packageVersion";
15
16
 
16
17
  // eslint-disable-next-line max-len
17
18
  // https://onedrive.visualstudio.com/SharePoint%20Online/_git/SPO?path=/cobalt/Base/Property/BinaryEncodedPropertyReader.cs&version=GBmaster&_a=contents
@@ -485,6 +486,7 @@ function throwBufferParseException(
485
486
  {
486
487
  nodeType: getNodeType(node),
487
488
  expectedNodeType,
489
+ driverVersion,
488
490
  });
489
491
  }
490
492