Skip to content

Commit d7b1307

Browse files
committed
compress output
1 parent bbd7112 commit d7b1307

File tree

6 files changed

+61
-31
lines changed

6 files changed

+61
-31
lines changed

build.ts

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
/* eslint-disable import/no-dynamic-require */
22
import path from 'path';
3+
import zlib from 'zlib';
4+
import { encode } from 'base16384';
35
import esbuild from 'esbuild';
6+
import { chunk } from 'lodash';
47
import { fs, Logger } from '@hydrooj/utils';
58

69
const logger = new Logger('build');
710
logger.info('Building...');
11+
12+
function encodeBinary(a: Buffer) {
13+
const file = zlib.gzipSync(a);
14+
return chunk([...encode(file)], 1000).map((i) => String.fromCodePoint(...i)).join('');
15+
}
16+
17+
const nopMap = '//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJtYXBwaW5ncyI6IkEifQ==';
18+
819
(async () => {
920
fs.ensureDirSync(path.resolve(process.cwd(), 'dist'));
1021
const res = await esbuild.build({
@@ -14,15 +25,26 @@ logger.info('Building...');
1425
splitting: false,
1526
write: false,
1627
tsconfig: path.resolve(process.cwd(), 'tsconfig.json'),
17-
minify: false,
28+
minify: true,
1829
entryPoints: [path.resolve(process.cwd(), 'packages/server/index.ts')],
1930
charset: 'utf8',
2031
sourcemap: 'inline',
21-
loader: {
22-
'.frontend': 'base64',
23-
'.ttf': 'base64',
24-
'.wasm': 'base64',
25-
},
32+
plugins: [{
33+
name: 'base16384',
34+
setup(b) {
35+
b.onLoad({ filter: /\.(frontend|ttf|wasm)$/, namespace: 'file' }, (t) => {
36+
const file = fs.readFileSync(path.join(t.path));
37+
return {
38+
contents: `module.exports = "${encodeBinary(file)}";\n${nopMap}`,
39+
loader: 'tsx',
40+
};
41+
});
42+
b.onLoad({ filter: /node_modules\/.+\.js$/ }, (t) => ({
43+
contents: `${fs.readFileSync(t.path, 'utf8')}\n${nopMap}`,
44+
loader: 'default',
45+
}));
46+
},
47+
}],
2648
alias: {
2749
ws: `${path.dirname(require.resolve('ws/package.json'))}/index.js`,
2850
saslprep: path.resolve(__dirname, 'saslprep.js'),

packages/server/client/assets.js

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
import NotoColorEmoji from '@expo-google-fonts/noto-color-emoji/NotoColorEmoji_400Regular.ttf';
2-
import NotoSansSC from '@expo-google-fonts/noto-sans-sc/NotoSansSC_400Regular.ttf';
3-
import wasmBinary from '@myriaddreamin/typst-ts-web-compiler/pkg/typst_ts_web_compiler_bg.wasm';
4-
import DejaVuSansMono from 'dejavu-fonts-ttf/ttf/DejaVuSansMono.ttf';
5-
import DejaVuSansMonoBold from 'dejavu-fonts-ttf/ttf/DejaVuSansMono-Bold.ttf';
6-
import DejaVuSansMonoBoldOblique from 'dejavu-fonts-ttf/ttf/DejaVuSansMono-BoldOblique.ttf';
7-
import DejaVuSansMonoOblique from 'dejavu-fonts-ttf/ttf/DejaVuSansMono-Oblique.ttf';
1+
import _NotoColorEmoji from '@expo-google-fonts/noto-color-emoji/NotoColorEmoji_400Regular.ttf';
2+
import _NotoSansSC from '@expo-google-fonts/noto-sans-sc/NotoSansSC_400Regular.ttf';
3+
import _wasmBinary from '@myriaddreamin/typst-ts-web-compiler/pkg/typst_ts_web_compiler_bg.wasm';
4+
import _DejaVuSansMono from 'dejavu-fonts-ttf/ttf/DejaVuSansMono.ttf';
5+
import _DejaVuSansMonoBold from 'dejavu-fonts-ttf/ttf/DejaVuSansMono-Bold.ttf';
6+
import _DejaVuSansMonoBoldOblique from 'dejavu-fonts-ttf/ttf/DejaVuSansMono-BoldOblique.ttf';
7+
import _DejaVuSansMonoOblique from 'dejavu-fonts-ttf/ttf/DejaVuSansMono-Oblique.ttf';
8+
import { decodeBinary } from '../utils';
89

9-
export {
10-
NotoColorEmoji,
11-
NotoSansSC,
12-
wasmBinary,
13-
DejaVuSansMono,
14-
DejaVuSansMonoBold,
15-
DejaVuSansMonoBoldOblique,
16-
DejaVuSansMonoOblique,
17-
};
10+
export const NotoColorEmoji = decodeBinary(_NotoColorEmoji);
11+
export const NotoSansSC = decodeBinary(_NotoSansSC);
12+
export const wasmBinary = decodeBinary(_wasmBinary);
13+
export const DejaVuSansMono = decodeBinary(_DejaVuSansMono);
14+
export const DejaVuSansMonoBold = decodeBinary(_DejaVuSansMonoBold);
15+
export const DejaVuSansMonoBoldOblique = decodeBinary(_DejaVuSansMonoBoldOblique);
16+
export const DejaVuSansMonoOblique = decodeBinary(_DejaVuSansMonoOblique);

packages/server/client/typst.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ class TypstCompilerDriver {
2828

2929
async init(): Promise<void> {
3030
this.compilerJs = await import('@myriaddreamin/typst-ts-web-compiler/pkg/typst_ts_web_compiler.mjs');
31-
await this.compilerJs.initSync(Buffer.from(wasmBinary, 'base64'));
31+
await this.compilerJs.initSync(wasmBinary);
3232
const TypstCompilerBuilder = this.compilerJs.TypstCompilerBuilder;
3333

3434
this.builder = new TypstCompilerBuilder();
35-
await this.builder.add_raw_font(new Uint8Array(Buffer.from(DejaVuSansMono, 'base64')));
36-
await this.builder.add_raw_font(new Uint8Array(Buffer.from(DejaVuSansMonoBold, 'base64')));
37-
await this.builder.add_raw_font(new Uint8Array(Buffer.from(DejaVuSansMonoBoldOblique, 'base64')));
38-
await this.builder.add_raw_font(new Uint8Array(Buffer.from(DejaVuSansMonoOblique, 'base64')));
39-
await this.builder.add_raw_font(new Uint8Array(Buffer.from(NotoSansSC, 'base64')));
40-
await this.builder.add_raw_font(new Uint8Array(Buffer.from(NotoColorEmoji, 'base64')));
35+
await this.builder.add_raw_font(new Uint8Array(DejaVuSansMono));
36+
await this.builder.add_raw_font(new Uint8Array(DejaVuSansMonoBold));
37+
await this.builder.add_raw_font(new Uint8Array(DejaVuSansMonoBoldOblique));
38+
await this.builder.add_raw_font(new Uint8Array(DejaVuSansMonoOblique));
39+
await this.builder.add_raw_font(new Uint8Array(NotoSansSC));
40+
await this.builder.add_raw_font(new Uint8Array(NotoColorEmoji));
4141
this.compiler = await this.builder.build();
4242
}
4343

packages/server/handler/misc.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@ import { Context } from 'cordis';
44
import { Handler } from '@hydrooj/framework';
55
import { config } from '../config';
66
import StaticFrontend from '../data/static.frontend';
7-
import { StaticHTML } from '../utils';
7+
import { decodeBinary, StaticHTML } from '../utils';
88

99
const randomHash = String.random(8).toLowerCase();
10+
const buf = decodeBinary(StaticFrontend);
1011

1112
class StaticHandler extends Handler {
1213
async get() {
1314
this.response.addHeader('Cache-Control', 'public');
1415
this.response.addHeader('Expires', new Date(new Date().getTime() + 86400000).toUTCString());
1516
this.response.type = 'text/javascript';
16-
this.binary(Buffer.from(StaticFrontend, 'base64'), 'main.js');
17+
this.binary(buf, 'main.js');
1718
}
1819
}
1920

packages/server/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"@hydrooj/framework": "0.0.3",
2020
"@myriaddreamin/typst-ts-web-compiler": "^0.4.1",
2121
"@myteril/node-win-printer": "^1.1.5",
22+
"base16384": "^1.0.0",
2223
"cordis": "3.16.0",
2324
"koa-proxies": "^0.12.4",
2425
"lodash": "^4.17.21",

packages/server/utils.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
/* eslint-disable @typescript-eslint/no-loop-func */
22
/* eslint-disable no-await-in-loop */
33
import { spawn } from 'child_process';
4+
import { gunzipSync } from 'zlib';
5+
import { decode } from 'base16384';
46
import Logger from 'reggol';
57

68
Logger.levels.base = process.env.DEV ? 3 : 2;
@@ -129,3 +131,8 @@ export async function remoteRunner(user: string, target: string, targetPort: str
129131
}
130132
return { success: false, log };
131133
}
134+
135+
export function decodeBinary(file: string) {
136+
const buf = decode(file);
137+
return gunzipSync(buf);
138+
}

0 commit comments

Comments
 (0)