sqlite-js-stream: نسخه Node از Litestream برای بکاپ SQLite
خلاصهٔ کاملتر
SQLite فقط یه فایله، برای همین نمیشه مثل Postgres یه سرور دوم رو replica کرد. ابزار Litestream این مشکل رو با استریم کردن WAL (یعنی فایلی که SQLite تغییرات تازه رو اول توش مینویسه) به فایلهای تغییرناپذیر LTX روی S3 حل میکنه. ولی Litestream با Go نوشته شده. تیم Platformatic حالا sqlite-js-stream رو ساخته که همون کارو داخل Node انجام میده، با node:sqlite داخلی و type stripping خود Node، یعنی بدون build step.
نویسنده معتقده برگ برنده اصلی، توزیعه. Litestream یه باینریه که باید کنار اپ اجرا بشه، فایل کانفیگ داره و باید با هر دیپلوی آپدیتش کرد. به گفته اون، همین دردسر دلیل اصلیایه که تیمها سراغ Postgres میرن. نسخه JS فقط یه پکیجه که داخل پروسه اصلی، یه worker thread یا یه تابع serverless اجرا میشه. فایلهای LTXش هم کاملاً با Litestream سازگارن و هر کدوم فایلهای اون یکی رو میخونه.
API به درایور SQLite وابسته نیست. یه Replica میسازی، مسیر دیتابیس و یه replica client بهش میدی و خودش DB و WAL رو مستقیم از دیسک میخونه:
const replica = new Replica('/data/app.db', new FileReplicaClient('/backups'))
replica.leaser = new FileLeaser('/backups') // only one host is the active writer
await replica.run({ intervalMs: 1000, signal })مصرف حافظه به اندازه یه بافر صفحه محدوده، نه اندازه دیتابیس. تو بنچمارک، وقتی WAL حدود ۴.۱ برابر بزرگتر شد، peak RSS فقط ۱.۲۲ برابر رفت بالا. compaction چندسطحی هم مثل Litestream پیاده شده و یه سیستم lease (یعنی قفلی که فقط یه هاست رو نویسنده اصلی میکنه) روی S3 با نوشتن شرطی If-None-Match/If-Match کار میکنه. نویسنده تأکید میکنه این بنچمارکها روی localhost و دیتابیس چندمگابایتی بودن و مقایسه مستقیم با Litestream نیستن.
محدودیتها رو هم صادقانه گفته: این یه ابزار disaster recovery هست، نه دیتابیس توزیعشده. اگه چند هاست با دادههای متفاوت به یه prefix وصل بشن، فقط داده primary ذخیره میشه و بقیه گم میشن. موقع failover هم چند ثانیه آخر نوشتن primary از دست میره. بکاندهای GCS، Azure و SFTP هنوز پیاده نشدن و پکیج اصلی هنوز منتشر نشده.
کل این پورت رو ایجنت pi با مدل DeepSeek-V4-Flash-Vision-Exp روی دو دستگاه NVIDIA DGX Spark نوشته، بدون هیچ مدل ابری. یه آدم معماری، بازبینی و تصمیمهای اصلی رو انجام داده. به گفته نویسنده، نوشتن تستها قبل از کد (TDD) ایجنت رو تو مسیر درست نگه داشت. یه بار هم ایجنت یه مسیر restore کاملاً بیمورد برای فرمت قدیمی v0.3.x ساخت و بازبین انسانی کلش رو حذف کرد.
نکات کلیدی:
- sqlite-js-stream نسخه TypeScript از Litestream هست و بدون build step روی Node اجرا میشه.
- فرمت superfly/ltx v0.5.2 رو بایتبهبایت مثل Litestream مینویسه.
- با ۴.۱ برابر شدن WAL، مصرف حافظه فقط ۱.۲۲ برابر شد.
- پروژه ۱۲۱ تست داره (۱۰۳ هسته + ۱۸ S3) که همه روی Node 24 پاس میشن.
- فعلاً فقط بکاند S3 و فایل پشتیبانی میشه و پکیج اصلی هنوز منتشر نشده.




