mirror of
https://github.com/bookorbit/bookorbit.git
synced 2026-11-03 08:21:39 -06:00
fix(reader): serve PDF and comic files correctly to every client
Fix the server and web gaps found while porting the PDF and comic readers and offline downloads to Android, checked against the iOS app: - KOReader: answer a pull for a PDF or comic with the page number when a BookOrbit client wrote last, instead of a percentage with no page - comics: key the zip offset, RAR and CB7 caches by file id and modification time, so pages are not served from stale offsets after a metadata write-back rewrites the archive - comics: answer an unreadable archive with 422 rather than a page count of 0, and extract CB7 with its folders so same-named pages in different folders no longer overwrite each other - book files: send an ETag and Last-Modified on serve and download and honour If-None-Match and If-Range, clamp a range that runs past the end, answer suffix ranges with 206, and honour Range on download, which advertised it but sent the whole file - book files: leave raw file routes uncompressed, so FB2 and unknown formats keep their Content-Length - progress: reject a fractional or negative page number with 400 rather than failing with 500 at the database - types: declare the comic page-count response shared by the web and the apps - web: open a percentage-only PDF position at its estimated page, and flush pending PDF and comic progress before the reading session ends
This commit is contained in:
@@ -172,3 +172,17 @@ export function applyDeclaredBodyLimit(route: { config?: unknown; bodyLimit?: nu
|
||||
export function registerDeclaredBodyLimits(fastify: FastifyInstance): void {
|
||||
fastify.addHook('onRoute', applyDeclaredBodyLimit);
|
||||
}
|
||||
|
||||
/**
|
||||
* `@fastify/compress` reads its per-route opt-out from the route options, which Nest's
|
||||
* `@RouteConfig({ compress: false })` cannot reach. Raw file routes need it: the plugin's default
|
||||
* type check gzips `+xml` and `octet-stream` bodies (FB2, unknown formats) and drops Content-Length.
|
||||
* Register before the compress plugin so this hook runs first.
|
||||
*/
|
||||
export function applyDeclaredCompressionOptOut(route: { config?: unknown; compress?: unknown }): void {
|
||||
if ((route.config as { compress?: unknown } | undefined)?.compress === false) route.compress = false;
|
||||
}
|
||||
|
||||
export function registerDeclaredCompressionOptOuts(fastify: FastifyInstance): void {
|
||||
fastify.addHook('onRoute', applyDeclaredCompressionOptOut);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user