Page MenuHomeSealhub

jdd-context.ts
No OneTemporary

jdd-context.ts

import fs from "fs/promises";
import type { KoaResponsiveImageRouter } from "koa-responsive-image-router";
import { marked } from "marked";
import mime from "mime-types";
import os from "os";
import path from "path";
import { FlatTemplatable } from "tempstream";
import { v4 as uuidv4 } from "uuid";
import { insert_nbsp } from "./utils/insert_nbsp";
export type FSFilePointer = { type: "path"; path: string; mimetype?: string };
export type FilePointer =
| FSFilePointer
| { type: "buffer"; mimetype: string; buffer: Buffer };
export interface JDDContext {
render_image: (
file_id: string | null,
args: Parameters<KoaResponsiveImageRouter["image"]>[1]
) => FlatTemplatable;
render_markdown: (markdown: string) => FlatTemplatable;
encode_file: (photo: FilePointer, persistent: boolean) => Promise<string>;
decode_file: (id: string) => Promise<FSFilePointer | null>;
}
export function makeSimplePhotoStorage(persistent_dir_path: string) {
const tmpdir = os.tmpdir();
async function encode_file(file_pointer: FilePointer, persistent: boolean) {
const needs_to_be_saved =
file_pointer.type == "buffer" ||
(!file_pointer.path.startsWith(persistent_dir_path) &&
!file_pointer.path.startsWith(tmpdir));
if (needs_to_be_saved) {
const buffer =
file_pointer.type === "buffer"
? file_pointer.buffer
: await fs.readFile(file_pointer.path);
const file_id =
uuidv4() +
"." +
(file_pointer.type === "buffer"
? mime.extension(file_pointer.mimetype)
: "data");
const file_path = path.resolve(
persistent ? persistent_dir_path : tmpdir,
file_id
);
await fs.writeFile(file_path, buffer);
return JSON.stringify({ persistent, file_id });
} else {
return JSON.stringify({
persistent: file_pointer.path.startsWith(persistent_dir_path),
file_id: path.basename(file_pointer.path),
});
}
}
async function decode_file(id: string): Promise<FSFilePointer | null> {
try {
const { persistent, file_id } = JSON.parse(id);
return {
type: "path",
path: path.resolve(
persistent ? persistent_dir_path : tmpdir,
file_id
),
};
} catch (e) {
console.error(e);
return null;
}
}
return {
decode_file,
encode_file,
};
}
export const simpleJDDContext: JDDContext = {
render_image: (file_id) =>
file_id ? /* HTML */ `<img src="file://${file_id}}" />` : "",
render_markdown: (string) =>
string ? marked.parse(insert_nbsp(string)) : "",
...makeSimplePhotoStorage(path.resolve(process.cwd(), "./uploaded-images")),
};

File Metadata

Mime Type
text/x-java
Expires
Fri, Nov 28, 15:16 (7 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1053685
Default Alt Text
jdd-context.ts (2 KB)

Event Timeline