Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
2 tasks done
rodydavis opened this issue Jul 20, 2024 · 4 comments
Open
2 tasks done

Comments

@rodydavis
Copy link

rodydavis commented Jul 20, 2024

🏗 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)

  • 📱 iOS
  • 🤖 Android
  • [+] MacOS
  • [+] Windows
  • [+] Linux
  • [+] Web
  • [+] Dart native
@renefloor
Copy link
Contributor

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.

@rodydavis
Copy link
Author

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.

@jimmyff
Copy link

jimmyff commented Aug 8, 2024

+1. This would be great!

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

@alexandrim0
Copy link

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!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants