Kolaborasi
@nuforge/collaboration menyinkronkan AST antar peer secara real time melalui Loro CRDT. Setiap peer menjalankan runtime Nu-nya sendiri, dan sebuah sync provider menjaga tree setiap peer agar konvergen ke state yang sama tanpa resolusi konflik manual.
Memulai
Sebuah LoroSyncProvider mengikat runtime Nu ke sebuah LoroDoc. Peer pertama menyemai doc baru dari state lokalnya; peer berikutnya mengimpor doc tersebut dan menghidrasi state lokalnya dari doc itu:
import { LoroSyncProvider, createCollabExtension } from '@nuforge/collaboration';
import { LoroDoc } from 'loro-crdt';
// Peer 1 seeds a fresh doc from its local state
const doc1 = new LoroDoc();
const provider1 = new LoroSyncProvider(nu1, doc1);
provider1.init();
// Peer 2 imports peer 1's doc, then loads its (empty) state from it
const doc2 = new LoroDoc();
doc2.import(doc1.export({ mode: 'snapshot' }));
const provider2 = new LoroSyncProvider(nu2, doc2);
provider2.init();
Cara kerjanya
LoroSyncProvider(nu, doc) menjaga sinkronisasi dua arah antara runtime Nu dan sebuah LoroDoc. Memanggil init() melakukan salah satu dari dua hal tergantung pada doc:
- Jika doc kosong, ia menyemai doc dari state lokal runtime saat ini.
- Jika doc sudah berisi konten, ia menghidrasi state lokal runtime dari doc tersebut.
Setiap node AST disimpan sebagai JSON di bawah id-nya dalam sebuah Loro map. Ini adalah CRDT tingkat node dengan last-write-wins per node, yang menghindari kerusakan reorder dan move yang muncul pada pendekatan text-CRDT naif — sebuah node berpindah utuh atau tidak sama sekali, sehingga tree tidak pernah robek.
Merge ditandai dengan sebuah source, sehingga sebuah peer tidak menggemakan perubahannya sendiri kembali ke dalam loop. Ketika update masuk diterapkan, provider mengenali asalnya dan melewati penyiaran ulang.
Sebagai sebuah extension
Anda dapat memasang sinkronisasi yang sama persis sebagai extension nuforge alih-alih membangun provider secara langsung. Berikan createCollabExtension(doc) saat membuat runtime:
Nu.create({ extensions: [createCollabExtension(doc)] });
Transport
Provider tidak memiliki jaringan. Anda sendiri yang menukar update antar peer melalui transport apa pun — WebSocket, WebRTC, atau lainnya — dengan mengirim byte dari doc.export(...) dan menerapkannya di sisi lain dengan doc.import(...). Ini menjaga kolaborasi tetap agnostik terhadap transport: sambungkan melalui channel realtime yang sudah Anda miliki tanpa mengadopsi server baru.
Langkah berikutnya
- Extensions — sistem extension tempat
createCollabExtensionterpasang. - Runtime — runtime Nu yang disinkronkan tiap peer.