message: Proper workflow to allow full offline support in presence of cached snapshot.
  Closes
  Before this change, we fail in offline if network request happens to return with failure sooner than cache comes back with results.
diff: @@ -423,17 +423,29 @@ export class OdspDocumentStorageService implements IDocumentStorageService {
  if (this.hostPolicy.concurrentSnapshotFetch && !this.hostPolicy.summarizerClient) {
  const snapshotP = this.fetchSnapshot(hostSnapshotOptions);
  - const promiseRaceWinner = await promiseRaceWithWinner([cachedSnapshotP, snapshotP]);
  + // Ensure that failures on both paths are ignored initially.
  + // I.e. if cache fails for some reason, we will proceed with network result.
  + // And vice versa - if (for example) client is offline and network request fails first, we
  + // do want to attempt to succeed with cached data!
  + const promiseRaceWinner = await promiseRaceWithWinner([
  + cachedSnapshotP.catch(() => undefined),
  + snapshotP.catch(() => undefined),
  + ]);
  cachedSnapshot = promiseRaceWinner.value;
  + method = promiseRaceWinner.index === 0 ? "cache" : "network";
  + if (cachedSnapshot === undefined) {
  + // if network failed -> wait for cache ( then return network failure)
  + // If cache returned empty or failed -> wait for network (success of failure)
  + if (promiseRaceWinner.index === 1) {
  + cachedSnapshot = await cachedSnapshotP;
  + method = "cache";
  + }
  if (cachedSnapshot === undefined) {
  cachedSnapshot = await snapshotP;
  + method = "network";
  }
  - else {
  - snapshotP.catch(() => {});
  }
  -
  - method = promiseRaceWinner.index === 0 && promiseRaceWinner.value !== undefined ? "cache" : "network";
  } else {
  // Note: There's a race condition here - another caller may come past the undefined check
  // while the first caller is awaiting later async code in this block.
  