Build the CookieBridge Chrome extension (Manifest V3) with: - Background service worker: cookie monitoring via chrome.cookies.onChanged, WebSocket connection to relay server with auto-reconnect, HTTP polling fallback, device registration and pairing flow - Browser-compatible crypto: libsodium-wrappers-sumo for XChaCha20-Poly1305 encryption, Ed25519 signing, X25519 key exchange (mirrors server's sodium-native API) - Popup UI: device registration, connection status indicator (gray/blue/ green/red), cookie/device/sync stats, one-click current site sync, whitelist quick-add, device pairing with 6-digit code - Options page: server URL config, connection mode (auto/WS/polling), poll interval slider, auto-sync toggle, domain whitelist/blacklist management, paired device list, key export/import, data clearing - Sync engine: LWW conflict resolution with Lamport clocks (same as server), bidirectional cookie sync with all paired peers, echo suppression to prevent sync loops - Badge management: icon color reflects state (gray=not logged in, blue=connected, green=syncing with count, red=error) - Build system: esbuild bundling for Chrome 120+, TypeScript with strict mode, clean type checking Co-Authored-By: Paperclip <noreply@paperclip.ing>
32 lines
770 B
JavaScript
32 lines
770 B
JavaScript
import * as esbuild from "esbuild";
|
|
|
|
const isWatch = process.argv.includes("--watch");
|
|
|
|
const buildOptions = {
|
|
entryPoints: [
|
|
"src/background/service-worker.ts",
|
|
"src/popup/popup.ts",
|
|
"src/options/options.ts",
|
|
],
|
|
bundle: true,
|
|
outdir: "dist",
|
|
format: "esm",
|
|
target: "chrome120",
|
|
sourcemap: true,
|
|
minify: !isWatch,
|
|
// Force CJS resolution for libsodium (ESM entry has broken sibling import)
|
|
alias: {
|
|
"libsodium-wrappers-sumo":
|
|
"./node_modules/libsodium-wrappers-sumo/dist/modules-sumo/libsodium-wrappers.js",
|
|
},
|
|
};
|
|
|
|
if (isWatch) {
|
|
const ctx = await esbuild.context(buildOptions);
|
|
await ctx.watch();
|
|
console.log("Watching for changes...");
|
|
} else {
|
|
await esbuild.build(buildOptions);
|
|
console.log("Build complete.");
|
|
}
|