diff options
Move to Server Side Render with expressjs
Backend Rewritten in typescript
Signed-off-by: Marc Pervaz Boocha <mboocha@sudomsg.xyz>
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
new file: .editorconfig
modified: .gitignore
new file: Containerfile
renamed: favicon/icon.svg -> assets/favicon.svg
modified: assets/index.css
deleted: assets/index.js
deleted: assets/mandle.png
deleted: assets/sw.js
new file: assets/syntax.css
modified: deploy
deleted: eleventy.config.js
deleted: favicon/192.png
deleted: favicon/512.png
deleted: favicon/icon.ico
deleted: license
modified: package-lock.json
modified: package.json
deleted: src/_data/env.js
deleted: src/_data/metadata.js
deleted: src/_includes/base.njk
deleted: src/_includes/page.njk
deleted: src/_includes/post.njk
deleted: src/about.njk
deleted: src/blog.njk
new file: src/client/index.ts
deleted: src/gen/atom.njk
deleted: src/gen/error.njk
deleted: src/gen/feedjson.11ty.js
deleted: src/gen/gen.11tydata.js
deleted: src/gen/manifest.11ty.js
deleted: src/gen/metadata.11ty.js
deleted: src/gen/robot.njk
deleted: src/gen/sitemap.njk
deleted: src/index.njk
deleted: src/post/post.11tydata.js
new file: src/server/app.ts
new file: src/server/build.ts
new file: src/server/content/about.ts
new file: src/server/content/blog.ts
new file: src/server/content/feed.ts
new file: src/server/content/index.ts
new file: src/server/content/robots.ts
new file: src/server/content/sitemap.ts
new file: src/server/content/webmanifest.ts
new file: src/server/errHanadler.ts
new file: src/server/img.ts
new file: src/server/metadata.ts
new file: src/server/router.ts
new file: src/server/server.ts
new file: src/server/template/Base.ts
new file: src/server/template/Page.ts
new file: src/server/template/Post.ts
new file: src/server/template/atom.ts
new file: src/server/template/header.ts
new file: src/server/template/html.ts
new file: src/server/template/sitemap.ts
new file: src/server/template/syntax.ts
new file: src/server/template/table.ts
new file: src/server/template/vdom.ts
new file: src/server/template/xml.ts
new file: src/server/utils/createUrl.ts
new file: src/server/utils/curl.ts
new file: src/server/utils/isDefined.ts
new file: src/server/utils/isDevel.ts
new file: src/server/utils/relDir.ts
new file: src/server/utils/relUrl.ts
new file: src/server/utils/schema.ts
new file: src/server/utils/setStingRoute.ts
new file: src/server/utils/strHandler.ts
new file: src/worker/sw.ts
new file: src/worker/tsconfig.json
new file: tsconfig.json
Diffstat (limited to 'src/server/img.ts')
-rw-r--r-- | src/server/img.ts | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/server/img.ts b/src/server/img.ts new file mode 100644 index 0000000..7006c3d --- /dev/null +++ b/src/server/img.ts @@ -0,0 +1,83 @@ +import sharp from "sharp" +import { createReadStream } from "node:fs" +import { extname, join } from "node:path" +import createError from "http-errors" +import type express from "express" + +function transform(format: keyof sharp.FormatEnum, width?: number, height?: number): sharp.Sharp { + var transform = sharp().withMetadata() + + if (format) { + transform = transform.toFormat(format) + } + + if (width || height) { + transform = transform.resize({ width, height }) + } + + return transform +} + +function errorHand(next: express.NextFunction) { + return function (err: NodeJS.ErrnoException) { + switch (err.code) { + case "ENOENT": + next() + break + case "EISDIR": + case "EPERM": + next(createError(401)) + break + default: + next(err) + } + } +} + +export default function (path: string) { + return async function (req: express.Request, res: express.Response, next: express.NextFunction) { + const err_handler = errorHand(next) + + const filepath = join(path, req.path) + const ext = extname(filepath).substring(1) + if (![ + "svg", "heic", "heif", "avif", "jpeg", "jpg", "jpe", "tile", "dz", + "png", "raw", "tiff", "tif", "webp", "gif", "jp2", "jpx", "j2k", + "j2c", "jxl" + ].includes(ext)) { + return next() + } + const width = parseInt(String(req.query['width'])) + const height = parseInt(String(req.query['height'])) + var { format = ext } = req.query as { format?: string } + if (format == "svg") { + if (ext == "svg") { + const stream = createReadStream(filepath) + stream.on("error", err_handler) + res.format({ + [format]: function () { + return stream.pipe(res) + } + }) + } else { + return next(createError(400)) + } + return + } + + const stream = createReadStream(filepath) + stream.on("error", err_handler) + res.format({ + [format]: function () { + return stream.pipe( + transform( + format as keyof sharp.FormatEnum, + !isNaN(width) ? width : undefined, + !isNaN(height) ? height : undefined + ) + ).pipe(res) + } + }) + } +} + |