-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathiiif.js
67 lines (57 loc) · 2.04 KB
/
iiif.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { App } from '@tinyhttp/app';
import iiif from 'iiif-processor';
const { Processor } = iiif;
import fs from 'fs';
import path from 'path';
import { iiifImagePath, iiifpathPrefix, fileTemplate } from './config.js';
function createRouter(version) {
const streamImageFromFile = ({ id }) => {
const filename = fileTemplate.replace(/\{\{id\}\}/, id);
const file = path.join(iiifImagePath, filename);
if (!fs.existsSync(file)) {
throw new IIIF.Error("Not Found", { statusCode: 404 });
}
return fs.createReadStream(file);
}
const render = async (req, res) => {
if (!req.params?.filename == null) {
req.params.filename = "info.json";
}
try {
const iiifUrl = `${req.protocol}://${req.get("host")}${req.path}`;
const iiifProcessor = new Processor(iiifUrl, streamImageFromFile, { pathPrefix: iiifpathPrefix, debugBorder: !!process.env.DEBUG_IIIF_BORDER });
const result = await iiifProcessor.execute();
return res
.set("Content-Type", result.contentType)
.set("Link", [`<${result.canonicalLink}>;rel="canonical"`, `<${result.profileLink}>;rel="profile"`])
.status(200)
.send(result.body);
} catch (err) {
const statusCode = err.statusCode || 502;
return res.status(statusCode).send(err.message);
}
}
const router = new App();
// Add permissive CORS headers to response
router.use((req, res, next) => {
res.set("Access-Control-Allow-Headers", "*");
res.set(
"Access-Control-Allow-Methods",
"OPTIONS, HEAD, GET, POST, PUT, DELETE"
);
res.set("Access-Control-Allow-Origin", "*");
next();
});
// Respond with 204 NO CONTENT to all OPTIONS requests
router.options(/^.*$/, (_req, res) => {
res.status(204).send("");
});
router.get("/", function (_req, res) {
return res.status(200).send(`IIIF v${version}.x endpoint OK`);
});
router.get("/:id", render);
router.get("/:id/info.json", render);
router.get("/:id/:region/:size/:rotation/:filename", render);
return router;
}
export default createRouter;