From 792ec23d7a353939679f2c03c8669a04e879d263 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 15 Apr 2019 22:58:04 +0900
Subject: [PATCH] Use pureimage instead of canvas

---
 package.json           |  2 +-
 src/misc/gen-avatar.ts | 11 ++++++-----
 src/server/index.ts    |  8 +++++---
 3 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/package.json b/package.json
index 7754832512..65067d068c 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 7d22ee98e2..14c01a9bd9 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<void> {
 	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 7d8938d584..b3ca47f232 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 => {