feat(files): cache served files and add HTML text viewer
Build and Push Docker Container / build-and-push (push) Successful in 2m37s
Build and Push Docker Container / build-and-push (push) Successful in 2m37s
File cache: - Add my_modules/filecache with metadata, blob, validator and store layers - Cache convex.get_file via AsyncCache, TTL clamped to the file expiry - Skip caching for missing, incomplete or already expired records - Add a process-local, size-bounded LRU for immutable storage blobs - Build the cache stack from FILE_CACHE_* env vars in build_file_cache - Attach the cache to the app in my_modules/app/setup.py - Expose app-bound helpers in filecache/access.py for routes Serving: - Send strong ETag, Last-Modified and Cache-Control on served files - Answer If-None-Match and If-Modified-Since with 304 from metadata only - Avoid pulling the blob from Convex on a revalidation hit - Add a short Cloudflare-CDN-Cache-Control edge window for deleted files - Record cache_status in the wide event on a 304 - Invalidate cached metadata after file update and delete in both routes Text viewer: - Add my_modules/textview to render text/plain and text/markdown as HTML - Linkify http(s) URLs and trim trailing sentence punctuation - Resolve links pointing at this instance to the referenced file - Inline image previews, mark missing and expired targets - Cap resolution at MAX_LOOKUPS backend lookups per document - Serve the viewer only for real browser navigations, never for curl or CLI - Keep raw bytes for ?raw=1, downloads and Accept headers without text/html - Add templates/side/views/webpage/files/text_view.htm with a raw link Other: - Add tests for cache layers, serving, text rendering and the route - Bump multidict to 7.2.1 in uv.lock - Update the my_helpers submodule pointer
This commit is contained in:
@@ -19,6 +19,7 @@ from quart import current_app
|
||||
from my_modules.app.setup import LIMITER
|
||||
from my_modules.expiry import ensure_utc, parse_expires
|
||||
from my_modules.file_meta import format_size, iso_stamp_filename
|
||||
from my_modules.filecache.access import drop_file_cache
|
||||
from servicelink import Forbidden, InvalidParams, NotFound, Router, Unauthorized, any_verifier, bearer_verifier, create_link_blueprint, shared_secret_verifier
|
||||
|
||||
MAX_RPC_BODY = 16 * 1024 * 1024
|
||||
@@ -109,6 +110,7 @@ async def files_update(params, ctx):
|
||||
user_id=_user_id(ctx),
|
||||
preserve_missing=True,
|
||||
)
|
||||
await drop_file_cache(file_id)
|
||||
return {'updated': True}
|
||||
|
||||
@router.method('files.delete')
|
||||
@@ -117,6 +119,7 @@ async def files_delete(params, ctx):
|
||||
if not file_id:
|
||||
raise InvalidParams('file_id is required')
|
||||
await current_app.convex.delete_file(file_id, _user_id(ctx))
|
||||
await drop_file_cache(file_id)
|
||||
return {'deleted': True}
|
||||
|
||||
async def _decode_access_token(token):
|
||||
|
||||
Reference in New Issue
Block a user