Abhishek Pandey dae9a95c54
Add download URL cache for onedrive items (#3459)
This PR introduces an URL cache for onedrive items. Integration with code and additional unit/integration tests will be added in follow up PRs to keep this PR short.

Why do we need an URL cache?
* This is a perf improvement for long running backups. 
* If the time difference between download URL fetch and content download is > 1 hour, the download will fail with a `401: Unauthorized` error. This is because JWT tokens attached with the download URLs are short lived (1 hour). 
* Currently we refresh download URLs after `401` with a per item `GET` . This should be optimized because it's an extra round trip for every item (to get the 401 and then renew).

How does URL cache help?
* URL cache will do a full delta re-enumeration when we hit a 401. It will be cheaper (in terms of Graph requests/tokens) vs calling GetItem for everything left. 
* It relies on lazy refresh. The URLs will only be refreshed once we hit a 401 and the client expliclty requests the cache for the download URL. Any following 401s will be served from the cache.
* 

**Cache flow**

```mermaid
flowchart TD
    A[Download content] -->|401 error| B(Fetch from URL cache)
    B --> |cache.getItemProperties| C{Cache needs refresh?}
    C -->|Yes| D{Refresh in progress?}
    D -->|Yes, Block| D
    C -->|No| E[Read from cache]
    D -->|No| M{Cache needs refresh? 2nd check}
    M -->|Yes|F[Delta Query]
    M -->|No| E
    F --> |success|H[Update cache]
    E --> |not found| I[Return error]
    E --> |item deleted| J[Return Deleted]
    F --> |failure|I
    I --> |fallback|L[GET item]
    H --> E 

```
---

#### Does this PR need a docs update or release note?

- [ ]  Yes, it's included
- [x] 🕐 Yes, but in a later PR
- [ ]  No

#### Type of change

<!--- Please check the type of change your PR introduces: --->
- [x] 🌻 Feature
- [ ] 🐛 Bugfix
- [ ] 🗺️ Documentation
- [ ] 🤖 Supportability/Tests
- [ ] 💻 CI/Deployment
- [ ] 🧹 Tech Debt/Cleanup

#### Issue(s)

<!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. -->
* https://github.com/alcionai/corso/issues/3069

#### Test Plan

<!-- How will this be tested prior to merging.-->
- [ ] 💪 Manual
- [ ]  Unit test
- [x] 💚 E2E
2023-05-26 00:35:30 +00:00
..