Skip to content

Commit

Permalink
Compress database with ZSTD
Browse files Browse the repository at this point in the history
450% bandwidth savings!! oops!
  • Loading branch information
cabalex committed Apr 6, 2024
1 parent d6ec66a commit 91a6942
Show file tree
Hide file tree
Showing 16 changed files with 135 additions and 76 deletions.
27 changes: 21 additions & 6 deletions .server/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import getCurrentTerm from "./search/currentTerm";
import search from "./search/search";
import searchRMP from "./ratemyprofessor/search";
import { readFileSync, existsSync, writeFileSync, unlinkSync } from "fs";
import DB, { type Class, ClassStatus } from "./db/DB";
import axios from "axios";
import https from "https";
import { ZstdInit } from '@oneidentity/zstd-js';



Expand All @@ -30,6 +30,16 @@ async function backoffRetryer<T>(fn: () => Promise<T>, index?: number): Promise<

}

async function decompressZSTD(buffer: ArrayBufferLike): Promise<ArrayBuffer> {
const zstdInit = await ZstdInit();
return zstdInit.ZstdSimple.decompress(new Uint8Array(buffer)).buffer;
}

async function compressZSTD(buffer: ArrayBufferLike): Promise<ArrayBuffer> {
const zstdInit = await ZstdInit();
return zstdInit.ZstdSimple.compress(new Uint8Array(buffer)).buffer;
}

async function main() {
// Fix axios instances
axios.defaults.timeout = 15000;
Expand All @@ -40,11 +50,16 @@ async function main() {
console.log(`Reaching out to full catalog for term ${term}...`)
let classes = (await search({term, results: 2000}));

if (existsSync(`../public/db/${term}.yaucsccs`)) {
if (existsSync(`../public/db/${term}.yaucsccs`) || existsSync(`../public/db/${term}.yaucsccs.zstd`)) {
// update database
console.log("updating the database...");
let tempDB = new DB(term);
let db = DB.import(readFileSync(__dirname + `/../public/db/${term}.yaucsccs`).buffer);
let filename = existsSync(`../public/db/${term}.yaucsccs.zstd`) ?
__dirname + `/../public/db/${term}.yaucsccs.zstd` :
__dirname + `/../public/db/${term}.yaucsccs`;

let file = readFileSync(filename).buffer;

let db = DB.import(filename.endsWith("zstd") ? await decompressZSTD(file) : file);
let changed = false;

for (let i = 0; i < classes.length; i++) {
Expand Down Expand Up @@ -109,7 +124,7 @@ async function main() {

if (changed) {
console.log("writing changes to database...");
writeFileSync(__dirname + `/../public/db/${term}.yaucsccs`, Buffer.from(db.export()));
writeFileSync(__dirname + `/../public/db/${term}.yaucsccs.zstd`, Buffer.from(await compressZSTD(db.export())));
} else {
console.log("no changes detected");
}
Expand All @@ -136,7 +151,7 @@ async function main() {
let db = new DB(term);
db.classes = detailedClasses;

writeFileSync(__dirname + `/../public/db/${term}.yaucsccs`, Buffer.from(db.export()));
writeFileSync(__dirname + `/../public/db/${term}.yaucsccs.zstd`, Buffer.from(await compressZSTD(db.export())));
}
}

Expand Down
27 changes: 27 additions & 0 deletions .server/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"@oneidentity/zstd-js": "^1.0.3",
"axios": "^1.4.0",
"cheerio": "^1.0.0-rc.12",
"ts-node-dev": "^2.0.0"
Expand Down
Loading

0 comments on commit 91a6942

Please sign in to comment.