Buckets:
ktongue/docker_container / .cache /opencode /node_modules /hono /dist /middleware /serve-static /index.js
| // src/middleware/serve-static/index.ts | |
| import { COMPRESSIBLE_CONTENT_TYPE_REGEX } from "../../utils/compress.js"; | |
| import { getMimeType } from "../../utils/mime.js"; | |
| import { defaultJoin } from "./path.js"; | |
| var ENCODINGS = { | |
| br: ".br", | |
| zstd: ".zst", | |
| gzip: ".gz" | |
| }; | |
| var ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS); | |
| var DEFAULT_DOCUMENT = "index.html"; | |
| var serveStatic = (options) => { | |
| const root = options.root ?? "./"; | |
| const optionPath = options.path; | |
| const join = options.join ?? defaultJoin; | |
| return async (c, next) => { | |
| if (c.finalized) { | |
| return next(); | |
| } | |
| let filename; | |
| if (options.path) { | |
| filename = options.path; | |
| } else { | |
| try { | |
| filename = decodeURIComponent(c.req.path); | |
| if (/(?:^|[\/\\])\.\.(?:$|[\/\\])/.test(filename)) { | |
| throw new Error(); | |
| } | |
| } catch { | |
| await options.onNotFound?.(c.req.path, c); | |
| return next(); | |
| } | |
| } | |
| let path = join( | |
| root, | |
| !optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename) : filename | |
| ); | |
| if (options.isDir && await options.isDir(path)) { | |
| path = join(path, DEFAULT_DOCUMENT); | |
| } | |
| const getContent = options.getContent; | |
| let content = await getContent(path, c); | |
| if (content instanceof Response) { | |
| return c.newResponse(content.body, content); | |
| } | |
| if (content) { | |
| const mimeType = options.mimes && getMimeType(path, options.mimes) || getMimeType(path); | |
| c.header("Content-Type", mimeType || "application/octet-stream"); | |
| if (options.precompressed && (!mimeType || COMPRESSIBLE_CONTENT_TYPE_REGEX.test(mimeType))) { | |
| const acceptEncodingSet = new Set( | |
| c.req.header("Accept-Encoding")?.split(",").map((encoding) => encoding.trim()) | |
| ); | |
| for (const encoding of ENCODINGS_ORDERED_KEYS) { | |
| if (!acceptEncodingSet.has(encoding)) { | |
| continue; | |
| } | |
| const compressedContent = await getContent(path + ENCODINGS[encoding], c); | |
| if (compressedContent) { | |
| content = compressedContent; | |
| c.header("Content-Encoding", encoding); | |
| c.header("Vary", "Accept-Encoding", { append: true }); | |
| break; | |
| } | |
| } | |
| } | |
| await options.onFound?.(path, c); | |
| return c.body(content); | |
| } | |
| await options.onNotFound?.(path, c); | |
| await next(); | |
| return; | |
| }; | |
| }; | |
| export { | |
| serveStatic | |
| }; | |
Xet Storage Details
- Size:
- 2.45 kB
- Xet hash:
- 1212840f93f415b29aba2991b6a8d1a646e95ff2518553fea47dde37240240b4
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.