fix(web,api): lecteur PDF — options pdf.js, assets cmaps/fonts et recherche sans limite par défaut

This commit is contained in:
Git Agent
2026-08-24 14:15:25 +02:00
parent f8c8ffd45c
commit b3bd678291
14 changed files with 336 additions and 31 deletions

View File

@ -1,8 +1,71 @@
import { createReadStream } from "node:fs";
import { cp, stat } from "node:fs/promises";
import path from "node:path";
import { fileURLToPath } from "node:url";
import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";
import { defineConfig, type Plugin } from "vite";
const appRoot = fileURLToPath(new URL(".", import.meta.url));
const pdfjsRoot = path.join(appRoot, "node_modules/pdfjs-dist");
const pdfjsAssetDirs = ["cmaps", "iccs", "standard_fonts", "wasm"];
function pdfjsAssetsPlugin(): Plugin {
let outDir = path.join(appRoot, "dist");
function contentType(filePath: string) {
if (filePath.endsWith(".wasm")) return "application/wasm";
if (filePath.endsWith(".mjs")) return "text/javascript";
if (filePath.endsWith(".bcmap")) return "application/octet-stream";
if (filePath.endsWith(".icc")) return "application/vnd.iccprofile";
if (filePath.endsWith(".ttf")) return "font/ttf";
if (filePath.endsWith(".pfb")) return "application/octet-stream";
return "application/octet-stream";
}
return {
name: "readabook-pdfjs-assets",
configResolved(config) {
outDir = path.resolve(config.root, config.build.outDir);
},
configureServer(server) {
server.middlewares.use("/pdfjs", async (request, response, next) => {
try {
const requestPath = new URL(request.url ?? "", "http://localhost").pathname;
const relativePath = decodeURIComponent(requestPath)
.replace(/^\/+/, "")
.replace(/^pdfjs\/+/, "");
const assetPath = path.resolve(pdfjsRoot, relativePath);
if (!assetPath.startsWith(pdfjsRoot)) {
next();
return;
}
const asset = await stat(assetPath);
if (!asset.isFile()) {
next();
return;
}
response.setHeader("Content-Type", contentType(assetPath));
createReadStream(assetPath).pipe(response);
} catch {
next();
}
});
},
async writeBundle() {
await Promise.all(
pdfjsAssetDirs.map((directory) =>
cp(path.join(pdfjsRoot, directory), path.join(outDir, "pdfjs", directory), {
recursive: true,
force: true
})
)
);
}
};
}
export default defineConfig({
plugins: [react()],
plugins: [react(), pdfjsAssetsPlugin()],
server: {
port: 5173,
proxy: {