diff --git a/discord_embed/api/serve.mjs b/discord_embed/api/serve.mjs index 08e0345..19af1cc 100644 --- a/discord_embed/api/serve.mjs +++ b/discord_embed/api/serve.mjs @@ -1,4 +1,5 @@ import path from 'path' +import { HttpError } from 'flaska' import Parent from '../base/serve.mjs' import fs from 'fs/promises' import fsSync from 'fs' @@ -22,6 +23,40 @@ export default class ServeHandler extends Parent { ] }) } + register(server) { + super.register(server) + server.flaska.onerror(this.serveError.bind(this)) + } + + serveError(err, ctx) { + ctx.log.error(err) + + if (err instanceof HttpError) { + ctx.status = err.status + ctx.state.error = err.message + } else { + ctx.status = 500 + ctx.state.error = 'Unknown error occured' + } + + let videoLink = ctx.query.get('v') || '' + let imageLink = ctx.query.get('i') || '' + + ctx.body = this.template({ + videoLink: videoLink, + imageLink: imageLink, + error: ctx.state.error || '', + inputVideo: ctx.state.video || videoLink || '', + inputImage: ctx.state.image || imageLink || '', + siteUrl: this.frontend + ctx.url, + siteUrlBase: this.frontend + '/', + version: this.version, + nonce: ctx.state.nonce, + in_debug: config.get('NODE_ENV') === 'development' && false, + }) + ctx.type = 'text/html; charset=utf-8' + } + async serveIndex(ctx) { if (config.get('NODE_ENV') === 'development') { let indexFile = await fs.readFile(path.join(this.root, 'index.html')) @@ -31,29 +66,31 @@ export default class ServeHandler extends Parent { let videoLink = ctx.query.get('v') || '' let imageLink = ctx.query.get('i') || '' - if (ctx.url.match(/^\/[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]+$/) && ctx.url.length < 7) { - try { - let id = AlphabeticID.decode(ctx.url.slice(1)) - if (id) { - let res = await ctx.db.safeCallProc('discord_embed.link_get', [id - 3843]) - if (res.first.length) { - videoLink = ctx.state.video = res.first[0].video_link - if (!ctx.state.video.startsWith('https://cdn.discordapp.com') - && !ctx.state.video.includes('catbox.') - && ctx.state.video.includes('?')) { - videoLink = this.frontend + '/video/' + ctx.url.slice(1) + '.webm' + if (!ctx.state.error) { + if (ctx.url.match(/^\/[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]+$/) && ctx.url.length < 7) { + try { + let id = AlphabeticID.decode(ctx.url.slice(1)) + if (id) { + let res = await ctx.db.safeCallProc('discord_embed.link_get', [id - 3843]) + if (res.first.length) { + videoLink = ctx.state.video = res.first[0].video_link + if (!ctx.state.video.startsWith('https://cdn.discordapp.com') + && !ctx.state.video.includes('catbox.') + && ctx.state.video.includes('?')) { + videoLink = this.frontend + '/video/' + ctx.url.slice(1) + '.webm' + } + imageLink = res.first[0].image_link + } else { + ctx.status = 404 } - imageLink = res.first[0].image_link - } else { - ctx.status = 404 } + } catch (err) { + ctx.log.error(err, 'Unable to fetch resource ' + ctx.url.slice(1)) + ctx.state.error = 'Unknown error while fetching link.' } - } catch (err) { - ctx.log.error(err, 'Unable to fetch resource ' + ctx.url.slice(1)) - ctx.state.error = 'Unknown error while fetching link.' + } else if (ctx.url !== '/') { + ctx.status = 404 } - } else if (ctx.url !== '/') { - ctx.status = 404 } if (videoLink.startsWith('https://cdn.discordapp.com')) { diff --git a/discord_embed/package.json b/discord_embed/package.json index 22c4b5f..ef94843 100644 --- a/discord_embed/package.json +++ b/discord_embed/package.json @@ -1,6 +1,6 @@ { "name": "discord_embed", - "version": "1.0.13", + "version": "1.0.14", "port": 4120, "description": "AV1 discord server embed helper", "main": "index.js", @@ -37,7 +37,7 @@ "dependencies": { "bunyan-lite": "^1.2.1", "dot": "^2.0.0-beta.1", - "flaska": "^1.3.0", + "flaska": "^1.3.2", "formidable": "^1.2.6", "ioredis": "^5.2.3", "msnodesqlv8": "^2.4.7",