.ts
TypeScript
(application/typescript)
// 1st-party
import type { ServiceMethodFactory } from "@ethicdevs/react-monolith";
import { GitServer } from "@ethicdevs/fastify-git-server";
// app
import { Env } from "../../env";
import { GitServerServiceDeps } from "./types";

const makeOnPushEvent: ServiceMethodFactory<
  GitServerServiceDeps,
  [GitServer.Event],
  void
> = (_) => {
  return ({ data, message }) => {
    message.write("\n");
    if (data.packType === GitServer.PackType.RECEIVE) {
      const receiveBuffer = [] as string[];

      message.stream.on("data", (chunk) => receiveBuffer.push(chunk));
      message.stream.on("close", () => {
        console.log(
          "message.stream::data:",
          Buffer.from(receiveBuffer.join("")).toString("utf-8")
        );
      });

      // client has done something like "git push"
      // it is uploading, we are receiving
      console.log("receive-pack");
      message.write("🖖 See the details of your push at:\n");
      message.write(
        `🧲 ${Env.DEPLOYMENT_SCHEME}://${Env.DEPLOYMENT_DOMAIN}/${data.repoSlug}/commits/some_commit_hash\n`
      );
    } else if (data.packType === GitServer.PackType.UPLOAD) {
      // client has done something like "git clone"
      // it is receiving, we are uploading
      console.log("upload-pack");
      message.write(`🖖 Welcome at GitFOSS ${data.username}!\n`);
    }
    message.write("\n");
    message.accept();
  };
};

export default makeOnPushEvent;