@rgby/collab-core 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,583 @@
1
+ // @ts-nocheck
2
+ import { inject, provide, ref, reactive, computed, onMounted, onBeforeUnmount, shallowRef, watch, markRaw, nextTick } from 'vue';
3
+ import * as Y from 'yjs';
4
+ import { CollabClient, CollabProvider } from "./collab-provider.js";
5
+ // ----------------------------------------------------------------------
6
+ // 1. Setup & Context
7
+ // ----------------------------------------------------------------------
8
+ export const CollabClientKey = Symbol.for('CollabClient');
9
+ export function provideCollabClient(optionsOrInstance) {
10
+ const client = optionsOrInstance instanceof CollabClient
11
+ ? optionsOrInstance
12
+ : new CollabClient(optionsOrInstance);
13
+ provide(CollabClientKey, client);
14
+ return client;
15
+ }
16
+ export function useCollabClient() {
17
+ const client = inject(CollabClientKey);
18
+ if (!client)
19
+ throw new Error('CollabClient not provided. Call provideCollabClient() at the root.');
20
+ return client;
21
+ }
22
+ export function useDocument(spaceId, documentId) {
23
+ const client = useCollabClient();
24
+ // Y.Doc should not be deeply reactive in Vue, so we use shallowRef + markRaw
25
+ const doc = shallowRef(markRaw(new Y.Doc()));
26
+ const provider = shallowRef(null);
27
+ const undoManager = shallowRef(null);
28
+ const status = ref('disconnected');
29
+ const synced = ref(false);
30
+ const persistenceReady = ref(false);
31
+ // Track scope for UndoManager to allow filtering (e.g., only undo text, not layout)
32
+ const trackedTypes = new Set();
33
+ const connect = async () => {
34
+ if (provider.value)
35
+ return;
36
+ const p = await client.getProvider(spaceId, documentId, {
37
+ document: doc.value
38
+ });
39
+ // Wait for persistence to load before syncing
40
+ await p.waitForPersistence();
41
+ persistenceReady.value = p.isPersistenceReady();
42
+ // Event Listeners
43
+ const updateStatus = () => { status.value = p.status; };
44
+ const updateSynced = () => { synced.value = p.synced; };
45
+ p.on('status', updateStatus);
46
+ p.on('synced', updateSynced);
47
+ p.on('disconnect', updateStatus);
48
+ provider.value = markRaw(p);
49
+ // Initialize UndoManager
50
+ // We defer this slightly to allow composables to register their types if needed
51
+ nextTick(() => {
52
+ undoManager.value = new Y.UndoManager(trackedTypes.size > 0 ? Array.from(trackedTypes) : doc.value.share.values(), {
53
+ doc: doc.value,
54
+ captureTransaction: (tr) => tr.origin !== undoManager.value
55
+ });
56
+ });
57
+ };
58
+ const disconnect = () => {
59
+ provider.value?.destroy();
60
+ provider.value = null;
61
+ undoManager.value?.destroy();
62
+ undoManager.value = null;
63
+ status.value = 'disconnected';
64
+ synced.value = false;
65
+ };
66
+ onMounted(connect);
67
+ onBeforeUnmount(() => {
68
+ disconnect();
69
+ doc.value.destroy();
70
+ });
71
+ const transact = (callback) => {
72
+ doc.value.transact(callback, client);
73
+ };
74
+ const undo = () => undoManager.value?.undo();
75
+ const redo = () => undoManager.value?.redo();
76
+ const clearLocalData = async () => {
77
+ if (provider.value) {
78
+ await provider.value.clearLocalData();
79
+ }
80
+ };
81
+ return {
82
+ doc,
83
+ provider,
84
+ status,
85
+ synced,
86
+ persistenceReady,
87
+ undoManager,
88
+ connect,
89
+ disconnect,
90
+ transact,
91
+ undo,
92
+ redo,
93
+ clearLocalData
94
+ };
95
+ }
96
+ // ----------------------------------------------------------------------
97
+ // 3. Factory: useSyncedMap
98
+ // Reactive wrapper for Y.Map
99
+ // ----------------------------------------------------------------------
100
+ export function useSyncedMap(doc, mapName) {
101
+ // We use reactive so properties are directly accessible in templates
102
+ const state = reactive({});
103
+ let _ymap = null;
104
+ const init = (newDoc) => {
105
+ if (_ymap)
106
+ _ymap.unobserve(observer);
107
+ _ymap = newDoc.getMap(mapName);
108
+ // Initial Hydration: clear old keys, set new ones
109
+ for (const key in state)
110
+ delete state[key];
111
+ _ymap.forEach((value, key) => {
112
+ state[key] = value;
113
+ });
114
+ _ymap.observe(observer);
115
+ };
116
+ const observer = (event) => {
117
+ event.keysChanged.forEach(key => {
118
+ if (_ymap.has(key)) {
119
+ state[key] = _ymap.get(key);
120
+ }
121
+ else {
122
+ delete state[key];
123
+ }
124
+ });
125
+ };
126
+ watch(doc, (newDoc) => { if (newDoc)
127
+ init(newDoc); }, { immediate: true });
128
+ onBeforeUnmount(() => {
129
+ if (_ymap)
130
+ _ymap.unobserve(observer);
131
+ });
132
+ // Mutators
133
+ const set = (key, value) => _ymap?.set(key, value);
134
+ const remove = (key) => _ymap?.delete(key);
135
+ const clear = () => _ymap?.clear();
136
+ const get = (key) => _ymap?.get(key);
137
+ return {
138
+ data: state,
139
+ set,
140
+ remove,
141
+ clear,
142
+ get,
143
+ yMap: computed(() => _ymap)
144
+ };
145
+ }
146
+ // ----------------------------------------------------------------------
147
+ // 4. Factory: useSyncedArray
148
+ // Reactive wrapper for Y.Array using Deltas for fine-grained DOM updates
149
+ // ----------------------------------------------------------------------
150
+ export function useSyncedArray(doc, arrayName) {
151
+ const list = ref([]);
152
+ let _yarray = null;
153
+ const init = (newDoc) => {
154
+ if (_yarray)
155
+ _yarray.unobserve(observer);
156
+ _yarray = newDoc.getArray(arrayName);
157
+ // Initial full copy
158
+ list.value = _yarray.toArray();
159
+ _yarray.observe(observer);
160
+ };
161
+ const observer = (event) => {
162
+ let index = 0;
163
+ event.delta.forEach((op) => {
164
+ if (op.retain) {
165
+ index += op.retain;
166
+ }
167
+ else if (op.insert) {
168
+ const items = op.insert;
169
+ list.value.splice(index, 0, ...items);
170
+ index += items.length;
171
+ }
172
+ else if (op.delete) {
173
+ list.value.splice(index, op.delete);
174
+ }
175
+ });
176
+ };
177
+ watch(doc, (newDoc) => { if (newDoc)
178
+ init(newDoc); }, { immediate: true });
179
+ onBeforeUnmount(() => {
180
+ if (_yarray)
181
+ _yarray.unobserve(observer);
182
+ });
183
+ // Mutators
184
+ const push = (item) => _yarray?.push([item]);
185
+ const unshift = (item) => _yarray?.insert(0, [item]);
186
+ const insert = (index, items) => _yarray?.insert(index, items);
187
+ const deleteAt = (index, length = 1) => _yarray?.delete(index, length);
188
+ /**
189
+ * Replaces an item at index. Useful for updating object properties in an array
190
+ * since Y.Array doesn't track deep object property changes automatically.
191
+ */
192
+ const replace = (index, item) => {
193
+ if (!_yarray)
194
+ return;
195
+ doc.value.transact(() => {
196
+ _yarray.delete(index, 1);
197
+ _yarray.insert(index, [item]);
198
+ });
199
+ };
200
+ return {
201
+ list,
202
+ push,
203
+ unshift,
204
+ insert,
205
+ deleteAt,
206
+ replace,
207
+ yArray: computed(() => _yarray)
208
+ };
209
+ }
210
+ // ----------------------------------------------------------------------
211
+ // 5. Factory: useSyncedText
212
+ // Reactive wrapper for Y.Text
213
+ // ----------------------------------------------------------------------
214
+ export function useSyncedText(doc, textName) {
215
+ const text = ref('');
216
+ let _ytext = null;
217
+ const init = (newDoc) => {
218
+ if (_ytext)
219
+ _ytext.unobserve(observer);
220
+ _ytext = newDoc.getText(textName);
221
+ text.value = _ytext.toString();
222
+ _ytext.observe(observer);
223
+ };
224
+ const observer = (event) => {
225
+ // For strings, we usually just want the current value.
226
+ // Applying strict deltas to a Javascript string is O(N) anyway.
227
+ text.value = _ytext.toString();
228
+ };
229
+ watch(doc, (newDoc) => { if (newDoc)
230
+ init(newDoc); }, { immediate: true });
231
+ onBeforeUnmount(() => {
232
+ if (_ytext)
233
+ _ytext.unobserve(observer);
234
+ });
235
+ const insert = (index, content, attributes) => _ytext?.insert(index, content, attributes);
236
+ const deleteText = (index, length) => _ytext?.delete(index, length);
237
+ const format = (index, length, attributes) => _ytext?.format(index, length, attributes);
238
+ return {
239
+ text, // Read-only reactive string
240
+ insert,
241
+ delete: deleteText,
242
+ format,
243
+ yText: computed(() => _ytext)
244
+ };
245
+ }
246
+ // ----------------------------------------------------------------------
247
+ // 6. Factory: useSyncedXml
248
+ // Exposes Y.XmlFragment (for Tiptap/ProseMirror/Quill)
249
+ // ----------------------------------------------------------------------
250
+ export function useSyncedXml(doc, xmlName) {
251
+ const _yxml = shallowRef(null);
252
+ watch(doc, (newDoc) => {
253
+ if (newDoc) {
254
+ _yxml.value = newDoc.getXmlFragment(xmlName);
255
+ }
256
+ }, { immediate: true });
257
+ return {
258
+ yXml: _yxml // Pass this to Tiptap's Collaboration extension
259
+ };
260
+ }
261
+ export function useAwareness(provider) {
262
+ const states = ref([]);
263
+ const currentUser = ref(null);
264
+ const update = () => {
265
+ if (!provider.value)
266
+ return;
267
+ const awareness = provider.value.awareness;
268
+ states.value = Array.from(awareness.getStates().entries()).map(([id, state]) => ({
269
+ clientId: id,
270
+ ...state
271
+ }));
272
+ const local = awareness.getLocalState();
273
+ if (local) {
274
+ currentUser.value = { clientId: awareness.clientID, ...local };
275
+ }
276
+ };
277
+ watch(provider, (p, oldP) => {
278
+ if (oldP)
279
+ oldP.awareness.off('change', update);
280
+ if (p) {
281
+ p.awareness.on('change', update);
282
+ update(); // Initial fetch
283
+ }
284
+ }, { immediate: true });
285
+ const setLocalState = (state) => {
286
+ if (!provider.value)
287
+ return;
288
+ const current = provider.value.awareness.getLocalState() || {};
289
+ provider.value.awareness.setLocalState({ ...current, ...state });
290
+ };
291
+ return {
292
+ states,
293
+ currentUser,
294
+ setLocalState
295
+ };
296
+ }
297
+ // ----------------------------------------------------------------------
298
+ // 8. Utility: useLiveComments
299
+ // Hybrid REST + Websocket comments
300
+ // ----------------------------------------------------------------------
301
+ export function useLiveComments(provider, spaceId, documentId) {
302
+ const client = useCollabClient();
303
+ const threads = ref([]); // Replace `any` with your CommentThread interface
304
+ const loading = ref(false);
305
+ const fetchComments = async () => {
306
+ loading.value = true;
307
+ try {
308
+ const res = await client.comments.list(spaceId, documentId);
309
+ threads.value = res.threads;
310
+ }
311
+ catch (e) {
312
+ console.error(e);
313
+ }
314
+ finally {
315
+ loading.value = false;
316
+ }
317
+ };
318
+ watch(provider, (p) => {
319
+ if (!p)
320
+ return;
321
+ // Watch for broadcasted events
322
+ const cleanup = p.onComment((event) => {
323
+ // Simple strategy: refetch on any change from others
324
+ // (You can implement optimistic updates here for 'create' events)
325
+ if (['create', 'update', 'delete', 'resolve'].includes(event.action)) {
326
+ fetchComments();
327
+ }
328
+ });
329
+ fetchComments();
330
+ return () => cleanup();
331
+ }, { immediate: true });
332
+ const createComment = async (content, anchor, parentId) => {
333
+ const comment = await client.comments.create(spaceId, documentId, { content, anchor, parentId });
334
+ provider.value?.sendComment('create', comment);
335
+ // Optimistic local update
336
+ if (parentId) {
337
+ const thread = threads.value.find(t => t.id === parentId);
338
+ if (thread)
339
+ thread.replies.push(comment);
340
+ }
341
+ else {
342
+ threads.value.push({ ...comment, replies: [] });
343
+ }
344
+ };
345
+ return { threads, loading, createComment, refresh: fetchComments };
346
+ }
347
+ export function useAuth(providedClient) {
348
+ const client = providedClient || useCollabClient();
349
+ const session = ref(null);
350
+ // Access private authManager
351
+ const authManager = client.authManager;
352
+ if (!authManager) {
353
+ throw new Error('useAuth() requires CollabClient to be initialized with managed auth mode');
354
+ }
355
+ // Get initial session immediately
356
+ session.value = authManager.getSession();
357
+ // Subscribe to auth changes
358
+ const unsubscribe = authManager.subscribe((newSession) => {
359
+ session.value = newSession;
360
+ });
361
+ onBeforeUnmount(() => {
362
+ unsubscribe();
363
+ });
364
+ return {
365
+ session: computed(() => session.value),
366
+ user: computed(() => session.value?.user ?? null),
367
+ isAuthenticated: computed(() => session.value !== null),
368
+ login: (email, password) => client.login(email, password),
369
+ signup: (email, password, name) => client.signup(email, password, name),
370
+ logout: () => client.logout()
371
+ };
372
+ }
373
+ export function useTiptapEditor(options) {
374
+ const client = useCollabClient();
375
+ // Normalize refs
376
+ const spaceId = computed(() => {
377
+ const val = options.spaceId;
378
+ return typeof val === 'string' ? val : val.value;
379
+ });
380
+ const documentId = computed(() => {
381
+ const val = options.documentId;
382
+ return typeof val === 'string' ? val : val.value;
383
+ });
384
+ const editor = shallowRef(null);
385
+ const doc = shallowRef(markRaw(new Y.Doc()));
386
+ const provider = shallowRef(null);
387
+ const status = ref('disconnected');
388
+ const synced = ref(false);
389
+ const persistenceReady = ref(false);
390
+ const loading = ref(false);
391
+ const error = ref('');
392
+ // Generate unique tab ID for multi-tab awareness
393
+ const generateTabId = () => {
394
+ return `tab-${Math.random().toString(36).substring(2, 9)}-${Date.now()}`;
395
+ };
396
+ // Random color for cursor
397
+ const generateColor = () => {
398
+ const colors = [
399
+ '#958DF1', '#F98181', '#FBBC88', '#FAF594', '#70CFF8',
400
+ '#94FADB', '#B9F18D', '#C3E2C2', '#EAECCC', '#AFC8AD'
401
+ ];
402
+ return colors[Math.floor(Math.random() * colors.length)];
403
+ };
404
+ const connect = async () => {
405
+ if (provider.value)
406
+ return;
407
+ loading.value = true;
408
+ error.value = '';
409
+ try {
410
+ // Dynamically import TipTap extensions first (needed for server extensions)
411
+ const [tiptapCore, { Collaboration }, { CollaborationCursor }] = await Promise.all([
412
+ import('@tiptap/core'),
413
+ import('@tiptap/extension-collaboration'),
414
+ import('./extensions/collaboration-cursor.js')
415
+ ]);
416
+ const { Editor: TiptapEditor } = tiptapCore;
417
+ // Fetch server extensions, providing @tiptap/core for scripts that import it
418
+ const serverExtensions = await client.getExtensions({
419
+ '@tiptap/core': tiptapCore
420
+ });
421
+ // Get provider
422
+ const p = await client.getProvider(spaceId.value, documentId.value, {
423
+ document: doc.value
424
+ });
425
+ // Wait for persistence to load
426
+ await p.waitForPersistence();
427
+ persistenceReady.value = p.isPersistenceReady();
428
+ // Event listeners
429
+ const updateStatus = () => { status.value = p.status; };
430
+ const updateSynced = () => { synced.value = p.synced; };
431
+ p.on('status', updateStatus);
432
+ p.on('synced', updateSynced);
433
+ p.on('disconnect', updateStatus);
434
+ provider.value = markRaw(p);
435
+ // StarterKit is optional - consumer can provide their own extensions
436
+ let StarterKit = null;
437
+ try {
438
+ StarterKit = (await import('@tiptap/starter-kit')).default;
439
+ }
440
+ catch {
441
+ // StarterKit not installed - user should provide extensions via options
442
+ }
443
+ const fragment = doc.value.getXmlFragment('default');
444
+ const tabId = generateTabId();
445
+ const userName = options.user?.name ?? 'Anonymous';
446
+ const userColor = options.user?.color ?? generateColor();
447
+ // Create editor
448
+ const baseExtensions = StarterKit
449
+ ? [StarterKit.configure({ undoRedo: false })]
450
+ : [];
451
+ const editorInstance = new TiptapEditor({
452
+ extensions: [
453
+ ...baseExtensions,
454
+ Collaboration.configure({
455
+ document: doc.value,
456
+ field: 'default'
457
+ }),
458
+ CollaborationCursor.configure({
459
+ provider: provider.value,
460
+ user: {
461
+ name: userName,
462
+ color: userColor,
463
+ clientId: tabId
464
+ }
465
+ }),
466
+ ...serverExtensions,
467
+ ...(options.extensions ?? [])
468
+ ],
469
+ ...options.editorOptions
470
+ });
471
+ editor.value = markRaw(editorInstance);
472
+ loading.value = false;
473
+ if (options.onReady) {
474
+ options.onReady(editorInstance);
475
+ }
476
+ }
477
+ catch (e) {
478
+ error.value = e.message || 'Failed to initialize editor';
479
+ loading.value = false;
480
+ console.error('[useTiptapEditor] Error:', e);
481
+ }
482
+ };
483
+ const disconnect = () => {
484
+ provider.value?.destroy();
485
+ provider.value = null;
486
+ status.value = 'disconnected';
487
+ synced.value = false;
488
+ };
489
+ const destroy = () => {
490
+ editor.value?.destroy();
491
+ editor.value = null;
492
+ disconnect();
493
+ doc.value.destroy();
494
+ doc.value = markRaw(new Y.Doc());
495
+ };
496
+ const clearLocalData = async () => {
497
+ if (provider.value) {
498
+ await provider.value.clearLocalData();
499
+ }
500
+ };
501
+ // Watch for changes to spaceId/documentId and reconnect
502
+ watch([spaceId, documentId], async ([newSpaceId, newDocId], [oldSpaceId, oldDocId]) => {
503
+ if (!newSpaceId || !newDocId) {
504
+ destroy();
505
+ return;
506
+ }
507
+ // If changed, reconnect
508
+ if (newSpaceId !== oldSpaceId || newDocId !== oldDocId) {
509
+ destroy();
510
+ await connect();
511
+ }
512
+ });
513
+ // Auto-connect if enabled
514
+ if (options.autoConnect !== false) {
515
+ onMounted(async () => {
516
+ if (spaceId.value && documentId.value) {
517
+ await connect();
518
+ }
519
+ });
520
+ }
521
+ onBeforeUnmount(() => {
522
+ destroy();
523
+ });
524
+ return {
525
+ editor,
526
+ doc,
527
+ provider,
528
+ status,
529
+ synced,
530
+ persistenceReady,
531
+ loading,
532
+ error,
533
+ connect,
534
+ disconnect,
535
+ destroy,
536
+ clearLocalData
537
+ };
538
+ }
539
+ // ----------------------------------------------------------------------
540
+ // 11. Master Composable: useCollaborativeDocument
541
+ // ----------------------------------------------------------------------
542
+ export function useCollaborativeDocument(spaceId, documentId) {
543
+ // 1. Initialize Connection
544
+ const { doc, provider, status, synced, undoManager, connect, disconnect, transact, undo, redo } = useDocument(spaceId, documentId);
545
+ // 2. Initialize Utils
546
+ const awareness = useAwareness(provider);
547
+ const comments = useLiveComments(provider, spaceId, documentId);
548
+ // 3. Create Factories (closured around 'doc')
549
+ // We return functions that generate the composables so the user can name them
550
+ const useMap = (name) => useSyncedMap(doc, name);
551
+ const useArray = (name) => useSyncedArray(doc, name);
552
+ const useText = (name) => useSyncedText(doc, name);
553
+ const useXml = (name) => useSyncedXml(doc, name);
554
+ return {
555
+ // Connection & Core
556
+ doc,
557
+ provider,
558
+ status,
559
+ synced,
560
+ connect,
561
+ disconnect,
562
+ // History
563
+ undo,
564
+ redo,
565
+ transact,
566
+ canUndo: computed(() => undoManager.value?.undoStack.length ?? 0 > 0),
567
+ canRedo: computed(() => undoManager.value?.redoStack.length ?? 0 > 0),
568
+ // Presence
569
+ users: awareness.states,
570
+ me: awareness.currentUser,
571
+ updatePresence: awareness.setLocalState,
572
+ // Comments
573
+ comments: comments.threads,
574
+ loadingComments: comments.loading,
575
+ createComment: comments.createComment,
576
+ // Factories
577
+ useMap,
578
+ useArray,
579
+ useText,
580
+ useXml
581
+ };
582
+ }
583
+ //# sourceMappingURL=useCollab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCollab.js","sourceRoot":"","sources":["../src/useCollab.ts"],"names":[],"mappings":"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"}