Repository navigation
Expand file tree
/
Copy pathindex.js
More file actions
140 lines (120 loc) · 3.96 KB
/
Copy pathindex.js
File metadata and controls
140 lines (120 loc) · 3.96 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
const Restify = require("restify");
const errs = require("restify-errors");
const SwaggerUI = require("swagger-ui-restify");
const debug = require("debug")("function-scenes");
const uuid = require("uuid-random");
const SceneDetect = require("./lib/scene_detect.js");
const wrap = function(fn) {
return function(req, res, next) {
return fn(req, res, next).catch(function(err) {
return next(err);
});
};
};
const sceneDetect = new SceneDetect();
const SERVER_ID = process.env.SERVER_ID || uuid();
const BASE_PATH = process.env.BASE_PATH || '';
let server = Restify.createServer();
server.use(Restify.plugins.queryParser());
server.use(Restify.plugins.bodyParser());
// API Documentation
const apiDocument = require("./api.json");
server.get("/api/docs/*", ...SwaggerUI.serve);
// swagger-ui-restify returns a (req, res) handler that is not async, which restify 12 rejects
const swaggerSetup = SwaggerUI.setup(apiDocument);
server.get("/api/docs/", (req, res, next) => {
swaggerSetup(req, res);
next();
});
// Healthcheck endpoint
server.get("/", (req, res, next) => {
debug(`req.url=${req.url}`);
res.send(200);
next();
});
server.post("/api/v1", wrap(async (req, res, next) => {
debug(`req.url=${req.url}`);
debug("req.body=%o", req.body);
if (req.body) {
try {
const mediaLocator = req.body.medialocator;
const job = await sceneDetect.createJob(mediaLocator, { basePath: BASE_PATH });
res.send(200, {
thumbnails: `${BASE_PATH}/api/v1/${job.getJobId()}/thumbnails`,
status: `${BASE_PATH}/api/v1/${job.getJobId()}/status`
},
{ 'x-server-id': SERVER_ID });
next();
} catch (errObj) {
debug("Error: %o", errObj);
const err = new errs.InternalServerError(errObj.message);
next(err);
}
} else {
next(new errs.InvalidContentError("Missing Request Body"));
}
}));
server.get("/api/v1/:id/thumbnails", wrap(async (req, res, next) => {
debug(`req.url=${req.url}`);
debug(`params.id=${req.params.id}`);
try {
const job = sceneDetect.getJob(req.params.id);
const thumbnails = await job.getDetectedThumbnails()
res.send(200, thumbnails, { 'x-server-id': SERVER_ID });
} catch (errObj) {
debug("Error: %o", errObj);
const err = new errs.InternalServerError(errObj.message);
next(err);
}
}));
server.get("/api/v1/:id/status", (req, res, next) => {
debug(`req.url=${req.url}`);
debug(`params.id=${req.params.id}`);
try {
const job = sceneDetect.getJob(req.params.id);
res.send(200, job.getStatus(), { 'x-server-id': SERVER_ID });
} catch (errObj) {
debug("Error: %o", errObj);
const err = new errs.InternalServerError(errObj.message);
next(err);
}
});
server.put("/api/v1/:id/status", (req, res, next) => {
debug(`req.url=${req.url}`);
debug(`params.id=${req.params.id}`);
debug("req.body=%o", req.body);
if (req.body) {
try {
if (req.body.state === "cancel") {
const job = sceneDetect.getJob(req.params.id);
const newStatus = job.cancel();
res.send(200, newStatus, { 'x-server-id': SERVER_ID });
} else {
throw new Error("Invalid state requested, expecting [cancel]");
}
} catch(errObj) {
debug("Error: %o", errObj);
const err = new errs.InternalServerError(errObj.message);
next(err);
}
} else {
next(new errs.InvalidContentError("Missing Request Body"));
}
});
server.del("/api/v1/:id", wrap (async (req, res, next) => {
debug(`req.url=${req.url}`);
debug(`params.id=${req.params.id}`);
try {
sceneDetect.deleteJob(req.params.id);
res.send(200, { message: 'Job deleted' }, { 'x-server-id': SERVER_ID });
} catch (errObj) {
debug("Error: %o", errObj);
const err = new errs.InternalServerError(errObj.message);
next(err);
}
}));
// Generated files
server.get("/images/*", Restify.plugins.serveStaticFiles('/var/jobs/'));
server.listen(process.env.PORT || 3000, () => {
debug(`${server.name} listening at ${server.url}`);
});