Commit 98397326 authored by Grant's avatar Grant
Browse files

move to @napi-rs/canvas

parent 4e89a0c2
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -7,6 +7,10 @@ services:
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
      - pgdata:/var/lib/postgresql/data
      - ./database.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      - 'POSTGRES_HOST_AUTH_METHOD=trust'

volumes:
  pgdata:
 No newline at end of file
+250 −438

File changed.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@
    "typescript": "^5.5.3"
  },
  "dependencies": {
    "canvas": "github:Automattic/node-canvas",
    "@napi-rs/canvas": "^1.0.2",
    "eventemitter3": "^5.0.1",
    "pg": "^8.12.0",
    "pureimage": "^0.4.13",
+6 −9
Original line number Diff line number Diff line
import fs from "node:fs";
import { createCanvas } from "canvas";
import {
  WORKER_COUNT,
  WorkerEvents,
  getWorker,
  getWorkerProgress,
  spawnWorker,
  spawnWorkers,
} from "./worker";
import { client } from "./lib/postgres";
@@ -19,12 +16,12 @@ client.connect().then(async () => {

  const startDate = (
    await client.query(
      `SELECT "createdAt" FROM "Pixel" ORDER BY "createdAt" ASC LIMIT 1`
      `SELECT "createdAt" FROM "Pixel" ORDER BY "createdAt" ASC LIMIT 1`,
    )
  ).rows[0]?.createdAt;
  const endDate = (
    await client.query(
      `SELECT "createdAt" FROM "Pixel" ORDER BY "createdAt" DESC LIMIT 1`
      `SELECT "createdAt" FROM "Pixel" ORDER BY "createdAt" DESC LIMIT 1`,
    )
  ).rows[0]?.createdAt;

@@ -54,10 +51,10 @@ client.connect().then(async () => {

      console.log(
        `Assigning worker ${workerNumber} frames (${new Date(
          time
          time,
        ).toISOString()} to ${new Date(
          time + framesPerWorker
        ).toISOString()}) (frameStart: ${frameStart})`
          time + framesPerWorker,
        ).toISOString()}) (frameStart: ${frameStart})`,
      );

      getWorker().postMessage({
@@ -80,7 +77,7 @@ client.connect().then(async () => {
    console.log(
      "Worker threads finished in " +
        ((Date.now() - SCRIPT_START) / 1000).toFixed(2) +
        "s"
        "s",
    );
    process.exit(0);
  });
+13 −12
Original line number Diff line number Diff line
import fs from "fs";
import { parentPort } from "worker_threads";
import * as PImage from "pureimage";
import Canvas from "@napi-rs/canvas";
import { DBPixel, client, query } from "./lib/postgres";

const canvas_size_parts = process.env.CANVAS_SIZE!.split(",");
@@ -81,7 +81,7 @@ parentPort?.on("message", (msg: Message) => {
const generateFrame = async (frameId: number, pixels: Pixel[]) => {
  const start = Date.now();

  const canvas = PImage.make(OUTPUT_SIZE[0], OUTPUT_SIZE[1]);
  const canvas = Canvas.createCanvas(OUTPUT_SIZE[0], OUTPUT_SIZE[1]);
  const ctx = canvas.getContext("2d");

  ctx.fillStyle = "#fff";
@@ -91,10 +91,10 @@ const generateFrame = async (frameId: number, pixels: Pixel[]) => {
    fs.existsSync("./frames/" + getFilenameForFrameID(frameId - 1) + ".png")
  ) {
    // if a previous frame exists, use the content to prevent large queries
    const prevFrame = await PImage.decodePNGFromStream(
    const prevFrame = await Canvas.loadImage(
      fs.createReadStream(
        "./frames/" + getFilenameForFrameID(frameId - 1) + ".png"
      )
        "./frames/" + getFilenameForFrameID(frameId - 1) + ".png",
      ),
    );
    ctx.drawImage(
      prevFrame,
@@ -105,7 +105,7 @@ const generateFrame = async (frameId: number, pixels: Pixel[]) => {
      0,
      0,
      prevFrame.width,
      prevFrame.height
      prevFrame.height,
    );
  } else {
    let startTime: Date;
@@ -133,23 +133,24 @@ const generateFrame = async (frameId: number, pixels: Pixel[]) => {
      pixel.x * pixelScale[0],
      pixel.y * pixelScale[1],
      pixelScale[0],
      pixelScale[1]
      pixelScale[1],
    );
    i++;
  }

  let filename = getFilenameForFrameID(frameId);

  await PImage.encodePNGToStream(
    canvas,
    fs.createWriteStream("./frames/" + filename + ".png")
  await canvas
    .encode("png")
    .then((data) =>
      fs.promises.writeFile(`./frames/${filename}.png`, data as Uint8Array),
    );
  log(
    "wrote frame " +
      frameId +
      " in " +
      ((Date.now() - start) / 1000).toFixed(2) +
      "s"
      "s",
  );
};