mirror of
https://github.com/hydralauncher/hydra.git
synced 2025-03-09 15:40:26 +00:00
87 lines
2.1 KiB
TypeScript
87 lines
2.1 KiB
TypeScript
import { HydraApi, logger, Ludusavi, WindowManager } from "@main/services";
|
|
import { registerEvent } from "../register-event";
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
import * as tar from "tar";
|
|
import crypto from "node:crypto";
|
|
import { GameShop } from "@types";
|
|
import axios from "axios";
|
|
import os from "node:os";
|
|
import { backupsPath } from "@main/constants";
|
|
import { app } from "electron";
|
|
|
|
const bundleBackup = async (shop: GameShop, objectId: string) => {
|
|
const backupPath = path.join(backupsPath, `${shop}-${objectId}`);
|
|
|
|
await Ludusavi.backupGame(shop, objectId, backupPath);
|
|
|
|
const tarLocation = path.join(backupsPath, `${crypto.randomUUID()}.zip`);
|
|
|
|
await tar.create(
|
|
{
|
|
gzip: false,
|
|
file: tarLocation,
|
|
cwd: backupPath,
|
|
},
|
|
["."]
|
|
);
|
|
|
|
return tarLocation;
|
|
};
|
|
|
|
const uploadSaveGame = async (
|
|
_event: Electron.IpcMainInvokeEvent,
|
|
objectId: string,
|
|
shop: GameShop
|
|
) => {
|
|
const bundleLocation = await bundleBackup(shop, objectId);
|
|
|
|
fs.stat(bundleLocation, async (err, stat) => {
|
|
if (err) {
|
|
logger.error("Failed to get zip file stats", err);
|
|
throw err;
|
|
}
|
|
|
|
const { uploadUrl } = await HydraApi.post<{
|
|
id: string;
|
|
uploadUrl: string;
|
|
}>("/profile/games/artifacts", {
|
|
artifactLengthInBytes: stat.size,
|
|
shop,
|
|
objectId,
|
|
hostname: os.hostname(),
|
|
homeDir: app.getPath("home"),
|
|
platform: os.platform(),
|
|
});
|
|
|
|
fs.readFile(bundleLocation, async (err, fileBuffer) => {
|
|
if (err) {
|
|
logger.error("Failed to read zip file", err);
|
|
throw err;
|
|
}
|
|
|
|
await axios.put(uploadUrl, fileBuffer, {
|
|
headers: {
|
|
"Content-Type": "application/tar",
|
|
},
|
|
onUploadProgress: (progressEvent) => {
|
|
console.log(progressEvent);
|
|
},
|
|
});
|
|
|
|
WindowManager.mainWindow?.webContents.send(
|
|
`on-upload-complete-${objectId}-${shop}`,
|
|
true
|
|
);
|
|
|
|
fs.rm(bundleLocation, (err) => {
|
|
if (err) {
|
|
logger.error("Failed to remove tar file", err);
|
|
throw err;
|
|
}
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
registerEvent("uploadSaveGame", uploadSaveGame);
|