Wasm-git: گیت کامل داخل مرورگر و Node.js
خلاصهٔ کاملتر
Wasm-git یه پروژهست که Git رو برای Node.js و مرورگر میاره. کارش اینه که libgit2 (یعنی کتابخونهٔ C که هستهٔ Git رو پیاده کرده) رو با Emscripten به WebAssembly کامپایل میکنه. به گفتهٔ نویسنده، ایدهٔ اصلی اینه که هر اپ وب بتونه دادهٔ کاربر رو با تاریخچهٔ کامل تغییرات توی خود مرورگر نگه داره و فقط هر وقت کاربر خواست با یه سرور push و pull کنه. لازم هم نیست کاربر اسمی از Git بشنوه؛ یه دکمهٔ «همگامسازی» همهش رو پشت صحنه انجام میده.
نصبش با npm install wasm-git انجام میشه. سادهترین نسخه برای شروع، نسخهٔ async هست که هم روی main thread مرورگر و هم توی Node.js با async/await معمولی کار میکنه. دستورهای Git مثل آرگومانهای خط فرمان، به شکل آرایه به callMain داده میشن:
import initGit from 'wasm-git/lg2_async.js';
const lg = await initGit();
const FS = lg.FS;
FS.mkdir('/myrepo');
FS.chdir('/myrepo');
await lg.callMain(['init', '.']);
FS.writeFile('data.json', JSON.stringify({ hello: 'world' }));
await lg.callMain(['add', 'data.json']);
await lg.callMain(['commit', '-m', 'first commit']);قبل از commit باید فایل .gitconfig با اسم و ایمیل نوشته بشه. clone و push روی HTTP هم همین شکلی کار میکنه، فقط سرور Git باید CORS رو اجازه بده یا از همون origin سرو بشه. نویسنده برای این کار سرور آمادهای به اسم githttpserver هم ساخته.
پکیج چند نسخه داره. نسخهٔ sync کوچیکترین باینری رو داره ولی توی مرورگر فقط داخل Web Worker اجرا میشه، چون HTTP همزمان و کارهای طولانی داره. نسخهٔ async (lg2_async.js) با Asyncify ساخته شده، یعنی کد wasm بازنویسی شده تا بتونه وسط کار منتظر بمونه؛ باینریش بزرگتره ولی کد سمت شما سادهتره. برای ماندگار کردن داده توی این دو نسخه باید IDBFS رو mount کنی و FS.syncfs رو صدا بزنی.
گزینهٔ بهتر، OPFS هست (یعنی فایلسیستم خصوصیای که مرورگر به هر سایت میده) که از IDBFS سریعتره. ولی عملیات OPFS فقط async هستن و libgit2 همزمان کار میکنه، برای همین سه build داره: pthreads با حدود ۹۲۰ کیلوبایت سریعترینه ولی هدرهای COOP/COEP میخواد؛ JSPI با حدود ۸۰۵ کیلوبایت این هدرها رو نمیخواد ولی فقط روی Chromium کار میکنه؛ ASYNCIFY با حدود ۱.۵ مگابایت کندتره ولی همهجا اجرا میشه. فایل lg2_opfs_auto.js موقع اجرا بهترینشو انتخاب میکنه.
پروژههایی مثل Ariz-Portfolio، پلتفرم دادهای Y42 و AutoDev ازش استفاده میکنن. یه افزونه به اسم encrypted-git-storage هم هست که مخزن رو قبل از آپلود با AES-256-GCM رمز میکنه، یعنی سرور فقط دادهٔ رمزشده میبینه.
نکات کلیدی:
- Wasm-git بر پایهٔ libgit2 نسخهٔ 1.9.4 و Emscripten نسخهٔ 6.0.3 ساخته شده و Node.js 18 به بالا لازم داره.
- نسخهٔ sync توی مرورگر فقط داخل Web Worker کار میکنه، ولی نسخهٔ async روی main thread هم اجرا میشه.
- برای clone از مرورگر، سرور Git باید CORS رو فعال کرده باشه.
- هر سه build مبتنی بر OPFS باید داخل Web Worker اجرا بشن و فقط نسخهٔ pthreads به cross-origin isolation نیاز داره.
- افزونهٔ encrypted-git-storage مخزن رو با AES-256-GCM و کلیدی که فقط دست کاربره رمز میکنه.




