diff --git a/package.json b/package.json index 775483251..65067d068 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,6 @@ "bootstrap-vue": "2.0.0-rc.13", "bull": "3.7.0", "cafy": "15.1.1", - "canvas": "2.4.1", "chai": "4.2.0", "chalk": "2.4.2", "cli-highlight": "2.1.0", @@ -189,6 +188,7 @@ "promise-sequential": "1.1.1", "pug": "2.0.3", "punycode": "2.1.1", + "pureimage": "0.1.6", "qrcode": "1.3.3", "random-seed": "0.3.0", "randomcolor": "0.5.4", diff --git a/src/misc/gen-avatar.ts b/src/misc/gen-avatar.ts index 7d22ee98e..14c01a9bd 100644 --- a/src/misc/gen-avatar.ts +++ b/src/misc/gen-avatar.ts @@ -2,10 +2,11 @@ * Random avatar generator */ -import { createCanvas } from 'canvas'; +const p = require('pureimage'); import * as gen from 'random-seed'; +import { WriteStream } from 'fs'; -const size = 512; // px +const size = 256; // px const n = 5; // resolution const margin = (size / n) / 1.5; const colors = [ @@ -35,9 +36,9 @@ const sideN = Math.floor(n / 2); /** * Generate buffer of random avatar by seed */ -export function genAvatar(seed: string) { +export function genAvatar(seed: string, stream: WriteStream): Promise { const rand = gen.create(seed); - const canvas = createCanvas(size, size); + const canvas = p.make(size, size); const ctx = canvas.getContext('2d'); ctx.fillStyle = bg; @@ -85,5 +86,5 @@ export function genAvatar(seed: string) { } } - return canvas.toBuffer(); + return p.encodePNGToStream(canvas, stream); } diff --git a/src/server/index.ts b/src/server/index.ts index 7d8938d58..b3ca47f23 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -26,6 +26,7 @@ import { program } from '../argv'; import { UserProfiles } from '../models'; import { networkChart } from '../services/chart'; import { genAvatar } from '../misc/gen-avatar'; +import { createTemp } from '../misc/create-temp'; export const serverLogger = new Logger('server', 'gray', false); @@ -73,10 +74,11 @@ router.use(activityPub.routes()); router.use(nodeinfo.routes()); router.use(wellKnown.routes()); -router.get('/avatar/:x', ctx => { - const avatar = genAvatar(ctx.params.x); +router.get('/avatar/:x', async ctx => { + const [temp] = await createTemp(); + await genAvatar(ctx.params.x, fs.createWriteStream(temp)); ctx.set('Content-Type', 'image/png'); - ctx.body = avatar; + ctx.body = fs.createReadStream(temp); }); router.get('/verify-email/:code', async ctx => {