flutter_cache_manager icon indicating copy to clipboard operation
flutter_cache_manager copied to clipboard

Proposal to support all platforms (including web) while emulating browser caching behavior

Open rodydavis opened this issue 1 year ago • 4 comments

🏗 Enhancement Proposal

I recently was able to support all native platforms and web with an emulation of how the browser works with saving, revalidating and evicting cache.

https://github.com/rodydavis/http_get_cache

The goal is to support the same way the browser does caching:

  • Cache-Control, eTag, Last-Modified headers
  • max-age, stale-while-revalidate, stale-if-error, only-if-cached
  • Support fetching content updates with head requests for non immutable objects and only after stale and 304 response meaning no update
  • Support skipping cache with request headers: no-cache
  • Support preventing storing with: no-store
  • Use platform cache directory for stored files and database in documents

Pitch

  • Update core logic to use Drift instead of sqflite to support all native platforms
  • Web will use the fetch_client package and work with browser caching
  • New http client for wrapping network requests
  • Add tests to test for expected browser behavior

Platforms affected (mark all that apply)

  • [X] :iphone: iOS
  • [X] :robot: Android
  • [+] MacOS
  • [+] Windows
  • [+] Linux
  • [+] Web
  • [+] Dart native

rodydavis avatar Jul 20 '24 21:07 rodydavis

Ah, the fetch API is something I've been looking for for years, but didn't know where to look. The default web caching works fine with HttpRenderer, but not with CanvasKit, which is now the default anyway.

The other platforms are already supported using a json file instead of sqflite, but having everything on 1 system makes sense. Drift looks like a good tool to use instead of json files, I'll take a look at that.

We do need a migration path for existing users, so their sqflite file is moved over to drift, but we can make that work. I'd say that if we go for a bigger rewrite we should also directly look at testing tools to have an easy way to return mock files or at least mock data.

renefloor avatar Jul 23 '24 10:07 renefloor

It should be a seamless migration since it is still SQLite and we can match the SQL Schema!

Most people wouldn't even know it switched (except for the addition of platforms) 😎.

I made it so you could provide a custom store provider which could also include the JSON file option or in memory.

rodydavis avatar Jul 23 '24 14:07 rodydavis

+1. This would be great!

Web support for a flutter package at this point is kinda essential

jimmyff avatar Aug 08 '24 11:08 jimmyff

I am voting for custom storage provider also! I am using Drift and compile my PWA with WASM, so I would not take sqflite either.

Thank you!

alexandrim0 avatar Nov 28 '24 01:11 alexandrim0