aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-02-24 04:42:53 +0100
committerLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-02-24 04:42:53 +0100
commit6196ec5f74faa0b783a1b3d75eadcd6cad5f651e (patch)
tree5d38c1fe5a003c2c3f333d08235bb715a9e6b0f1
parent7340682fd77fd89d38bf17cf9b194c5d2f602088 (diff)
downloadhttptool-6196ec5f74faa0b783a1b3d75eadcd6cad5f651e.tar.gz
httptool-6196ec5f74faa0b783a1b3d75eadcd6cad5f651e.tar.bz2
httptool-6196ec5f74faa0b783a1b3d75eadcd6cad5f651e.tar.lz
httptool-6196ec5f74faa0b783a1b3d75eadcd6cad5f651e.zip

fix: split bundles, reproducible builds (hopefully)

-rw-r--r--Makefile6
-rwxr-xr-xcontrib/compress-worker.mjs13
-rwxr-xr-xcontrib/ensure-reproducible-builds.sh29
-rwxr-xr-xcontrib/strip-srcmap.sh6
-rw-r--r--manifest.json2
-rw-r--r--package.json4
-rw-r--r--pnpm-lock.yaml9
-rw-r--r--src/routes/Monaco.svelte39
-rw-r--r--src/routes/ts-worker.ts11
-rw-r--r--svelte.config.js13
-rw-r--r--vite.config.ts1
11 files changed, 112 insertions, 21 deletions
diff --git a/Makefile b/Makefile
index acdb95e..f28fd57 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,8 @@ mozaddons:
$(MAKE) deepclean
$(MAKE) bootstrap
pnpm i
- $(MAKE) build
+ $(MAKE) build-reproducible
+ contrib/strip-srcmap.sh
$(MAKE) pack
clean:
@@ -21,5 +22,8 @@ bootstrap:
build:
pnpm build
+build-reproducible:
+ pnpm build-reproducible
+
pack:
contrib/pack
diff --git a/contrib/compress-worker.mjs b/contrib/compress-worker.mjs
new file mode 100755
index 0000000..5c26694
--- /dev/null
+++ b/contrib/compress-worker.mjs
@@ -0,0 +1,13 @@
+#!/usr/bin/env node
+import { readFileSync, writeFileSync } from 'node:fs';
+import { brotliCompressSync } from 'zlib';
+
+writeFileSync(
+ 'static/generated/ts-worker.js.br',
+ brotliCompressSync(
+ readFileSync(
+ 'node_modules/monaco-editor/esm/vs/language/typescript/ts.worker.js'
+ ),
+ {}
+ )
+);
diff --git a/contrib/ensure-reproducible-builds.sh b/contrib/ensure-reproducible-builds.sh
new file mode 100755
index 0000000..f9b880a
--- /dev/null
+++ b/contrib/ensure-reproducible-builds.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env zsh
+set -e
+echo "First Build"
+make mozaddons
+# Zips are unstable with hashes
+cd artifacts
+ZIPNAME="$(jq -r '.name + "-" + .version + "-unsigned.zip"' ../manifest.json)"
+unzip "$ZIPNAME"
+rm "$ZIPNAME"
+HASH1="$( (find . -type f -print0 | sort -z | xargs -0 sha512sum;
+ find . \( -type f -o -type d \) -print0 | sort -z | \
+ xargs -0 stat -c '%n %a') \
+ | sha512sum)"
+cd ..
+echo "Got Hash $HASH1"
+sleep 1;
+echo "Second Build"
+make mozaddons
+# Zips are unstable with hashes
+cd artifacts
+unzip "$ZIPNAME"
+rm "$ZIPNAME"
+HASH2="$( (find . -type f -print0 | sort -z | xargs -0 sha512sum;
+ find . \( -type f -o -type d \) -print0 | sort -z | \
+ xargs -0 stat -c '%n %a') \
+ | sha512sum)"
+cd ..
+echo "Got Hash $HASH2"
+if [[ "$HASH1" != "$HASH2" ]]; then echo -e "\x1b[0;31mNot reproducible!\x1b[0m"; fi; \ No newline at end of file
diff --git a/contrib/strip-srcmap.sh b/contrib/strip-srcmap.sh
new file mode 100755
index 0000000..a87ab03
--- /dev/null
+++ b/contrib/strip-srcmap.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env zsh
+set -eax
+# some source maps are >20MB, we can't keep that going.
+for f in $(find build/uwu -name '*.js' -or -name '*.mjs'); do
+ grep -v sourceMappingURL= "$f" > /tmp/a && mv /tmp/a "$f"
+done
diff --git a/manifest.json b/manifest.json
index 1c749a6..9a95478 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,5 +1,5 @@
{
- "description": "A minimal extension for manipulation of HTTP Requests and Responses; a fancy wrapper around browser.webRequest",
+ "description": "A minimal extension for manipulation of HTTP Requests and Responses; a fancy wrapper around browser.webRequest. Should be treated as a more restricted single-script userscript manager.",
"manifest_version": 2,
"name": "httptool",
"version": "1.0",
diff --git a/package.json b/package.json
index 9a49872..d05594e 100644
--- a/package.json
+++ b/package.json
@@ -6,11 +6,12 @@
"scripts": {
"dev": "concurrently -k --restart-tries -1 --restart-after 1000 \"vite build --mode development --watch\" \"vite build --mode development --watch --config vite.config.background.ts\" \"./do-webext-dev\"",
"build": "concurrently --kill-others-on-fail \"vite build\" \"vite build --config vite.config.background.ts\"",
+ "build-reproducible": "REPRODUCIBLE=1 pnpm build",
"preview": "web-ext run -p ff-ext --reload -f ./browser-launcher -s ./build",
"prepare": "svelte-kit sync || echo ''",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
- "install": "mkdir -p static/generated && cp node_modules/esbuild-wasm/esbuild.wasm static/generated/esbuild.wasm"
+ "install": "mkdir -p static/generated && cp node_modules/esbuild-wasm/esbuild.wasm static/generated/esbuild.wasm && contrib/compress-worker.mjs"
},
"devDependencies": {
"@sveltejs/adapter-static": "^3.0.8",
@@ -39,6 +40,7 @@
]
},
"dependencies": {
+ "brotli-wasm": "3.0.1",
"esbuild-wasm": "^0.25.0"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5af7044..924d7b2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,6 +8,9 @@ importers:
.:
dependencies:
+ brotli-wasm:
+ specifier: 3.0.1
+ version: 3.0.1
esbuild-wasm:
specifier: ^0.25.0
version: 0.25.0
@@ -851,6 +854,10 @@ packages:
brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ brotli-wasm@3.0.1:
+ resolution: {integrity: sha512-U3K72/JAi3jITpdhZBqzSUq+DUY697tLxOuFXB+FpAE/Ug+5C3VZrv4uA674EUZHxNAuQ9wETXNqQkxZD6oL4A==}
+ engines: {node: '>=v18.0.0'}
+
browserslist@4.24.4:
resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -2981,6 +2988,8 @@ snapshots:
balanced-match: 1.0.2
concat-map: 0.0.1
+ brotli-wasm@3.0.1: {}
+
browserslist@4.24.4:
dependencies:
caniuse-lite: 1.0.30001700
diff --git a/src/routes/Monaco.svelte b/src/routes/Monaco.svelte
index 409ab39..cfe9767 100644
--- a/src/routes/Monaco.svelte
+++ b/src/routes/Monaco.svelte
@@ -1,11 +1,11 @@
<script lang="ts">
import type monaco from 'monaco-editor';
import { onDestroy, onMount } from 'svelte';
- import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
- import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
- import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
- import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
- import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
+ // import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
+ // import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
+ // import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
+ // import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
+ // import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
// @ts-ignore
import wrqTypes from '@types/webextension-polyfill/namespaces/webRequest.d.ts?raw';
// @ts-ignore
@@ -37,20 +37,29 @@ declare global {
onMount(async () => {
// @ts-ignore
globalThis.MonacoEnvironment = {
- getWorker: function (_moduleId: any, label: string) {
+ getWorker: async (_moduleId: any, label: string) => {
if (label === 'json') {
- return new jsonWorker();
- }
- if (label === 'css' || label === 'scss' || label === 'less') {
- return new cssWorker();
- }
- if (label === 'html' || label === 'handlebars' || label === 'razor') {
- return new htmlWorker();
+ return new (
+ await import(
+ 'monaco-editor/esm/vs/language/json/json.worker?worker'
+ )
+ ).default();
}
+ // if (label === 'css' || label === 'scss' || label === 'less') {
+ // return new cssWorker();
+ // }
+ // if (label === 'html' || label === 'handlebars' || label === 'razor') {
+ // return new htmlWorker();
+ // }
if (label === 'typescript' || label === 'javascript') {
- return new tsWorker();
+ return await (
+ await import('./ts-worker')
+ ).default;
}
- return new editorWorker();
+ // return new editorWorker();
+ return new (
+ await import('monaco-editor/esm/vs/editor/editor.worker?worker')
+ ).default();
},
};
diff --git a/src/routes/ts-worker.ts b/src/routes/ts-worker.ts
new file mode 100644
index 0000000..460885c
--- /dev/null
+++ b/src/routes/ts-worker.ts
@@ -0,0 +1,11 @@
+export default (async () => {
+ const contents = new TextDecoder().decode(
+ (await (await import('brotli-wasm')).default).decompress(
+ await fetch('./generated/ts-worker.js.br')
+ .then((v) => v.arrayBuffer())
+ .then((v) => new Uint8Array(v))
+ )
+ );
+ const worker = new Worker(`data:text/javascript;base64,${btoa(contents)}`);
+ return worker;
+})();
diff --git a/svelte.config.js b/svelte.config.js
index bcb9810..77a4461 100644
--- a/svelte.config.js
+++ b/svelte.config.js
@@ -2,6 +2,7 @@ import adapter from './adapter/index.js';
import { sveltePreprocess } from 'svelte-preprocess';
import autoprefixer from 'autoprefixer';
import { transform } from 'esbuild';
+import { readFileSync } from 'node:fs';
/** @type {import('@sveltejs/kit').Config} */
const config = {
@@ -43,10 +44,16 @@ const config = {
handleHttpError: 'ignore',
},
appDir: 'uwu',
- output: {
- bundleStrategy: 'single',
- },
embedded: true,
+ version: {
+ name: process.env.REPRODUCIBLE
+ ? `REPRODUCIBLE-BUILD-${readFileSync(
+ '.git/' +
+ readFileSync('.git/HEAD', 'utf-8').split('\n')[0].split(': ')[1],
+ 'utf-8'
+ ).trim()}`
+ : Date.now().toString(36),
+ },
},
};
diff --git a/vite.config.ts b/vite.config.ts
index 8fbd8ee..511e09d 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -6,6 +6,7 @@ export default defineConfig({
plugins: [sveltekit(), tailwindcss()],
build: {
sourcemap: 'inline',
+ assetsInlineLimit: 8192,
},
dev: {
sourcemap: {