@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,82 @@
1
+ /**
2
+ * Upload Queue Manager
3
+ * Handles offline file uploads with IndexedDB queue
4
+ */
5
+ export interface PendingUpload {
6
+ id: string;
7
+ spaceId: string;
8
+ documentId: string | null;
9
+ file: Blob;
10
+ filename: string;
11
+ mimeType: string;
12
+ timestamp: number;
13
+ retryCount: number;
14
+ tempUrl: string;
15
+ }
16
+ export interface UploadQueueOptions {
17
+ dbName?: string;
18
+ storeName?: string;
19
+ maxRetries?: number;
20
+ retryDelay?: number;
21
+ }
22
+ export type UploadQueueEventType = 'queue-changed' | 'upload-complete' | 'upload-failed';
23
+ export interface UploadQueueEvent {
24
+ type: UploadQueueEventType;
25
+ upload?: PendingUpload;
26
+ error?: Error;
27
+ }
28
+ export declare class UploadQueueManager {
29
+ private db;
30
+ private dbName;
31
+ private storeName;
32
+ private maxRetries;
33
+ private retryDelay;
34
+ private listeners;
35
+ private isProcessing;
36
+ constructor(options?: UploadQueueOptions);
37
+ /**
38
+ * Initialize the IndexedDB database
39
+ */
40
+ init(): Promise<void>;
41
+ /**
42
+ * Add an upload to the queue
43
+ */
44
+ add(upload: Omit<PendingUpload, 'id' | 'timestamp' | 'retryCount' | 'tempUrl'>): Promise<PendingUpload>;
45
+ /**
46
+ * Get all pending uploads
47
+ */
48
+ getAll(): Promise<PendingUpload[]>;
49
+ /**
50
+ * Remove an upload from the queue
51
+ */
52
+ remove(id: string): Promise<void>;
53
+ /**
54
+ * Update an upload in the queue
55
+ */
56
+ update(upload: PendingUpload): Promise<void>;
57
+ /**
58
+ * Clear all uploads from the queue
59
+ */
60
+ clear(): Promise<void>;
61
+ /**
62
+ * Process the queue - upload pending files
63
+ */
64
+ processQueue(uploadFn?: (upload: PendingUpload) => Promise<any>): Promise<void>;
65
+ /**
66
+ * Get the number of pending uploads
67
+ */
68
+ count(): Promise<number>;
69
+ /**
70
+ * Add event listener
71
+ */
72
+ on(event: UploadQueueEventType, callback: (event: UploadQueueEvent) => void): () => void;
73
+ /**
74
+ * Emit event
75
+ */
76
+ private emit;
77
+ /**
78
+ * Close the database connection
79
+ */
80
+ close(): Promise<void>;
81
+ }
82
+ //# sourceMappingURL=upload-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-queue.d.ts","sourceRoot":"","sources":["../src/upload-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,EAAE,CAA4B;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAgF;IACjG,OAAO,CAAC,YAAY,CAAkB;gBAE1B,OAAO,GAAE,kBAAuB;IAiB5C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B3B;;OAEG;IACG,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAoC7G;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAmBxC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBvC;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBlD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B5B;;OAEG;IACG,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8DrF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9B;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAYxF;;OAEG;IACH,OAAO,CAAC,IAAI;IAOZ;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO/B"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Upload Queue Manager
3
+ * Handles offline file uploads with IndexedDB queue
4
+ */
5
+ export class UploadQueueManager {
6
+ db = null;
7
+ dbName;
8
+ storeName;
9
+ maxRetries;
10
+ retryDelay;
11
+ listeners = new Map();
12
+ isProcessing = false;
13
+ constructor(options = {}) {
14
+ this.dbName = options.dbName || 'collab-upload-queue';
15
+ this.storeName = options.storeName || 'pending_uploads';
16
+ this.maxRetries = options.maxRetries || 3;
17
+ this.retryDelay = options.retryDelay || 1000;
18
+ // Listen for online/offline events
19
+ window.addEventListener('online', () => {
20
+ console.log('[UploadQueue] Network online, processing queue');
21
+ this.processQueue();
22
+ });
23
+ window.addEventListener('offline', () => {
24
+ console.log('[UploadQueue] Network offline');
25
+ });
26
+ }
27
+ /**
28
+ * Initialize the IndexedDB database
29
+ */
30
+ async init() {
31
+ if (this.db)
32
+ return;
33
+ return new Promise((resolve, reject) => {
34
+ const request = indexedDB.open(this.dbName, 1);
35
+ request.onerror = () => {
36
+ reject(new Error('Failed to open IndexedDB'));
37
+ };
38
+ request.onsuccess = () => {
39
+ this.db = request.result;
40
+ console.log('[UploadQueue] IndexedDB initialized');
41
+ resolve();
42
+ };
43
+ request.onupgradeneeded = (event) => {
44
+ const db = event.target.result;
45
+ if (!db.objectStoreNames.contains(this.storeName)) {
46
+ const store = db.createObjectStore(this.storeName, { keyPath: 'id' });
47
+ store.createIndex('timestamp', 'timestamp', { unique: false });
48
+ store.createIndex('spaceId', 'spaceId', { unique: false });
49
+ console.log('[UploadQueue] Object store created');
50
+ }
51
+ };
52
+ });
53
+ }
54
+ /**
55
+ * Add an upload to the queue
56
+ */
57
+ async add(upload) {
58
+ await this.init();
59
+ if (!this.db)
60
+ throw new Error('Database not initialized');
61
+ const id = `upload-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
62
+ const tempUrl = URL.createObjectURL(upload.file);
63
+ const pendingUpload = {
64
+ id,
65
+ spaceId: upload.spaceId,
66
+ documentId: upload.documentId,
67
+ file: upload.file,
68
+ filename: upload.filename,
69
+ mimeType: upload.mimeType,
70
+ timestamp: Date.now(),
71
+ retryCount: 0,
72
+ tempUrl
73
+ };
74
+ return new Promise((resolve, reject) => {
75
+ const transaction = this.db.transaction([this.storeName], 'readwrite');
76
+ const store = transaction.objectStore(this.storeName);
77
+ const request = store.add(pendingUpload);
78
+ request.onsuccess = () => {
79
+ console.log('[UploadQueue] Upload added to queue:', id);
80
+ this.emit('queue-changed', { type: 'queue-changed', upload: pendingUpload });
81
+ resolve(pendingUpload);
82
+ };
83
+ request.onerror = () => {
84
+ reject(new Error('Failed to add upload to queue'));
85
+ };
86
+ });
87
+ }
88
+ /**
89
+ * Get all pending uploads
90
+ */
91
+ async getAll() {
92
+ await this.init();
93
+ if (!this.db)
94
+ return [];
95
+ return new Promise((resolve, reject) => {
96
+ const transaction = this.db.transaction([this.storeName], 'readonly');
97
+ const store = transaction.objectStore(this.storeName);
98
+ const request = store.getAll();
99
+ request.onsuccess = () => {
100
+ resolve(request.result || []);
101
+ };
102
+ request.onerror = () => {
103
+ reject(new Error('Failed to get uploads from queue'));
104
+ };
105
+ });
106
+ }
107
+ /**
108
+ * Remove an upload from the queue
109
+ */
110
+ async remove(id) {
111
+ await this.init();
112
+ if (!this.db)
113
+ return;
114
+ return new Promise((resolve, reject) => {
115
+ const transaction = this.db.transaction([this.storeName], 'readwrite');
116
+ const store = transaction.objectStore(this.storeName);
117
+ const request = store.delete(id);
118
+ request.onsuccess = () => {
119
+ console.log('[UploadQueue] Upload removed from queue:', id);
120
+ this.emit('queue-changed', { type: 'queue-changed' });
121
+ resolve();
122
+ };
123
+ request.onerror = () => {
124
+ reject(new Error('Failed to remove upload from queue'));
125
+ };
126
+ });
127
+ }
128
+ /**
129
+ * Update an upload in the queue
130
+ */
131
+ async update(upload) {
132
+ await this.init();
133
+ if (!this.db)
134
+ return;
135
+ return new Promise((resolve, reject) => {
136
+ const transaction = this.db.transaction([this.storeName], 'readwrite');
137
+ const store = transaction.objectStore(this.storeName);
138
+ const request = store.put(upload);
139
+ request.onsuccess = () => {
140
+ resolve();
141
+ };
142
+ request.onerror = () => {
143
+ reject(new Error('Failed to update upload in queue'));
144
+ };
145
+ });
146
+ }
147
+ /**
148
+ * Clear all uploads from the queue
149
+ */
150
+ async clear() {
151
+ await this.init();
152
+ if (!this.db)
153
+ return;
154
+ // Revoke all blob URLs first
155
+ const uploads = await this.getAll();
156
+ uploads.forEach(upload => {
157
+ if (upload.tempUrl.startsWith('blob:')) {
158
+ URL.revokeObjectURL(upload.tempUrl);
159
+ }
160
+ });
161
+ return new Promise((resolve, reject) => {
162
+ const transaction = this.db.transaction([this.storeName], 'readwrite');
163
+ const store = transaction.objectStore(this.storeName);
164
+ const request = store.clear();
165
+ request.onsuccess = () => {
166
+ console.log('[UploadQueue] Queue cleared');
167
+ this.emit('queue-changed', { type: 'queue-changed' });
168
+ resolve();
169
+ };
170
+ request.onerror = () => {
171
+ reject(new Error('Failed to clear queue'));
172
+ };
173
+ });
174
+ }
175
+ /**
176
+ * Process the queue - upload pending files
177
+ */
178
+ async processQueue(uploadFn) {
179
+ if (this.isProcessing || !navigator.onLine) {
180
+ console.log('[UploadQueue] Skipping queue processing (processing:', this.isProcessing, 'online:', navigator.onLine, ')');
181
+ return;
182
+ }
183
+ this.isProcessing = true;
184
+ console.log('[UploadQueue] Processing queue...');
185
+ try {
186
+ const uploads = await this.getAll();
187
+ console.log('[UploadQueue] Found', uploads.length, 'pending uploads');
188
+ for (const upload of uploads) {
189
+ try {
190
+ if (!uploadFn) {
191
+ console.warn('[UploadQueue] No upload function provided, skipping upload:', upload.id);
192
+ continue;
193
+ }
194
+ console.log('[UploadQueue] Processing upload:', upload.id);
195
+ const result = await uploadFn(upload);
196
+ // Success - remove from queue and revoke blob URL
197
+ await this.remove(upload.id);
198
+ if (upload.tempUrl.startsWith('blob:')) {
199
+ URL.revokeObjectURL(upload.tempUrl);
200
+ }
201
+ this.emit('upload-complete', { type: 'upload-complete', upload });
202
+ console.log('[UploadQueue] Upload complete:', upload.id);
203
+ }
204
+ catch (error) {
205
+ console.error('[UploadQueue] Upload failed:', upload.id, error);
206
+ // Increment retry count
207
+ upload.retryCount += 1;
208
+ if (upload.retryCount >= this.maxRetries) {
209
+ // Max retries reached - remove from queue
210
+ console.error('[UploadQueue] Max retries reached, removing:', upload.id);
211
+ await this.remove(upload.id);
212
+ if (upload.tempUrl.startsWith('blob:')) {
213
+ URL.revokeObjectURL(upload.tempUrl);
214
+ }
215
+ this.emit('upload-failed', { type: 'upload-failed', upload, error: error });
216
+ }
217
+ else {
218
+ // Update retry count and schedule retry
219
+ await this.update(upload);
220
+ console.log('[UploadQueue] Retry scheduled for:', upload.id, 'attempt:', upload.retryCount);
221
+ // Exponential backoff
222
+ const delay = this.retryDelay * Math.pow(2, upload.retryCount - 1);
223
+ await new Promise(resolve => setTimeout(resolve, delay));
224
+ }
225
+ }
226
+ }
227
+ }
228
+ finally {
229
+ this.isProcessing = false;
230
+ console.log('[UploadQueue] Queue processing complete');
231
+ }
232
+ }
233
+ /**
234
+ * Get the number of pending uploads
235
+ */
236
+ async count() {
237
+ const uploads = await this.getAll();
238
+ return uploads.length;
239
+ }
240
+ /**
241
+ * Add event listener
242
+ */
243
+ on(event, callback) {
244
+ if (!this.listeners.has(event)) {
245
+ this.listeners.set(event, new Set());
246
+ }
247
+ this.listeners.get(event).add(callback);
248
+ // Return unsubscribe function
249
+ return () => {
250
+ this.listeners.get(event)?.delete(callback);
251
+ };
252
+ }
253
+ /**
254
+ * Emit event
255
+ */
256
+ emit(event, data) {
257
+ const callbacks = this.listeners.get(event);
258
+ if (callbacks) {
259
+ callbacks.forEach(callback => callback(data));
260
+ }
261
+ }
262
+ /**
263
+ * Close the database connection
264
+ */
265
+ async close() {
266
+ if (this.db) {
267
+ this.db.close();
268
+ this.db = null;
269
+ console.log('[UploadQueue] Database closed');
270
+ }
271
+ }
272
+ }
273
+ //# sourceMappingURL=upload-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-queue.js","sourceRoot":"","sources":["../src/upload-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH,MAAM,OAAO,kBAAkB;IACnB,EAAE,GAAuB,IAAI,CAAC;IAC9B,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,UAAU,CAAS;IACnB,SAAS,GAAsE,IAAI,GAAG,EAAE,CAAC;IACzF,YAAY,GAAY,KAAK,CAAC;IAEtC,YAAY,UAA8B,EAAE;QACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,qBAAqB,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,iBAAiB,CAAC;QACxD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;QAE7C,mCAAmC;QACnC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACN,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO;QAEpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAE/C,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC;YAEF,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACrB,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO,EAAE,CAAC;YACd,CAAC,CAAC;YAEF,OAAO,CAAC,eAAe,GAAG,CAAC,KAAK,EAAE,EAAE;gBAChC,MAAM,EAAE,GAAI,KAAK,CAAC,MAA2B,CAAC,MAAM,CAAC;gBACrD,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBAChD,MAAM,KAAK,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBACtE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC/D,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC3D,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;gBACtD,CAAC;YACL,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,MAA0E;QAChF,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,MAAM,EAAE,GAAG,UAAU,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjD,MAAM,aAAa,GAAkB;YACjC,EAAE;YACF,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,UAAU,EAAE,CAAC;YACb,OAAO;SACV,CAAC;QAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAEzC,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACrB,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC7E,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3B,CAAC,CAAC;YAEF,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACvD,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACR,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAExB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAE/B,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACrB,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC,CAAC;YAEF,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC1D,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACnB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QAErB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAEjC,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACrB,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,EAAE,CAAC,CAAC;gBAC5D,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;gBACtD,OAAO,EAAE,CAAC;YACd,CAAC,CAAC;YAEF,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC5D,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAqB;QAC9B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QAErB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAElC,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACrB,OAAO,EAAE,CAAC;YACd,CAAC,CAAC;YAEF,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC1D,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACP,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QAErB,6BAA6B;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACrB,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAE9B,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACrB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;gBACtD,OAAO,EAAE,CAAC;YACd,CAAC,CAAC;YAEF,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAAkD;QACjE,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,sDAAsD,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzH,OAAO;QACX,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAEjD,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAEtE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACD,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACZ,OAAO,CAAC,IAAI,CAAC,6DAA6D,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;wBACvF,SAAS;oBACb,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC3D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAEtC,kDAAkD;oBAClD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC7B,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;wBACrC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACxC,CAAC;oBAED,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC;oBAClE,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC7D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBAEhE,wBAAwB;oBACxB,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;oBAEvB,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACvC,0CAA0C;wBAC1C,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;wBACzE,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBAC7B,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;4BACrC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBACxC,CAAC;wBACD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC,CAAC;oBACzF,CAAC;yBAAM,CAAC;wBACJ,wCAAwC;wBACxC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBAC1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;wBAE5F,sBAAsB;wBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;wBACnE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;oBAC7D,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACP,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,EAAE,CAAC,KAA2B,EAAE,QAA2C;QACvE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzC,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACK,IAAI,CAAC,KAA2B,EAAE,IAAsB;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACZ,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACP,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACV,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,216 @@
1
+ import { type InjectionKey, type Ref, type ShallowRef, type ComputedRef } from 'vue';
2
+ import * as Y from 'yjs';
3
+ import { CollabClient, CollabProvider, type CollabClientOptions, type SessionData } from './collab-provider.ts';
4
+ import type { Editor, EditorOptions } from '@tiptap/core';
5
+ export declare const CollabClientKey: InjectionKey<CollabClient>;
6
+ export declare function provideCollabClient(optionsOrInstance: CollabClientOptions | CollabClient): CollabClient;
7
+ export declare function useCollabClient(): CollabClient;
8
+ export interface UseDocumentReturn {
9
+ doc: ShallowRef<Y.Doc>;
10
+ provider: ShallowRef<CollabProvider | null>;
11
+ status: Ref<'disconnected' | 'connecting' | 'connected'>;
12
+ synced: Ref<boolean>;
13
+ persistenceReady: Ref<boolean>;
14
+ undoManager: ShallowRef<Y.UndoManager | null>;
15
+ connect: () => void;
16
+ disconnect: () => void;
17
+ transact: (callback: (txn: Y.Transaction) => void) => void;
18
+ undo: () => void;
19
+ redo: () => void;
20
+ clearLocalData: () => Promise<void>;
21
+ }
22
+ export declare function useDocument(spaceId: string, documentId: string): UseDocumentReturn;
23
+ export declare function useSyncedMap<T = any>(doc: ShallowRef<Y.Doc>, mapName: string): {
24
+ data: Record<string, T>;
25
+ set: (key: string, value: T) => T | undefined;
26
+ remove: (key: string) => void | undefined;
27
+ clear: () => void | undefined;
28
+ get: (key: string) => T | undefined;
29
+ yMap: ComputedRef<Y.Map<T> | null>;
30
+ };
31
+ export declare function useSyncedArray<T = any>(doc: ShallowRef<Y.Doc>, arrayName: string): {
32
+ list: Ref<T[], T[]>;
33
+ push: (item: T) => void | undefined;
34
+ unshift: (item: T) => void | undefined;
35
+ insert: (index: number, items: T[]) => void | undefined;
36
+ deleteAt: (index: number, length?: number) => void | undefined;
37
+ replace: (index: number, item: T) => void;
38
+ yArray: ComputedRef<Y.Array<T> | null>;
39
+ };
40
+ export declare function useSyncedText(doc: ShallowRef<Y.Doc>, textName: string): {
41
+ text: Ref<string, string>;
42
+ insert: (index: number, content: string, attributes?: Record<string, any>) => void | undefined;
43
+ delete: (index: number, length: number) => void | undefined;
44
+ format: (index: number, length: number, attributes: Record<string, any>) => void | undefined;
45
+ yText: ComputedRef<Y.Text | null>;
46
+ };
47
+ export declare function useSyncedXml(doc: ShallowRef<Y.Doc>, xmlName: string): {
48
+ yXml: ShallowRef<Y.XmlFragment | null, Y.XmlFragment | null>;
49
+ };
50
+ export interface AwarenessUser {
51
+ clientId: number;
52
+ user: {
53
+ name: string;
54
+ color: string;
55
+ avatar?: string;
56
+ };
57
+ [key: string]: any;
58
+ }
59
+ export declare function useAwareness(provider: ShallowRef<CollabProvider | null>): {
60
+ states: Ref<{
61
+ [x: string]: any;
62
+ clientId: number;
63
+ user: {
64
+ name: string;
65
+ color: string;
66
+ avatar?: string | undefined;
67
+ };
68
+ }[], AwarenessUser[] | {
69
+ [x: string]: any;
70
+ clientId: number;
71
+ user: {
72
+ name: string;
73
+ color: string;
74
+ avatar?: string | undefined;
75
+ };
76
+ }[]>;
77
+ currentUser: Ref<{
78
+ [x: string]: any;
79
+ clientId: number;
80
+ user: {
81
+ name: string;
82
+ color: string;
83
+ avatar?: string | undefined;
84
+ };
85
+ } | null, AwarenessUser | {
86
+ [x: string]: any;
87
+ clientId: number;
88
+ user: {
89
+ name: string;
90
+ color: string;
91
+ avatar?: string | undefined;
92
+ };
93
+ } | null>;
94
+ setLocalState: (state: Partial<AwarenessUser["user"] | any>) => void;
95
+ };
96
+ export declare function useLiveComments(provider: ShallowRef<CollabProvider | null>, spaceId: string, documentId: string): {
97
+ threads: Ref<any[], any[]>;
98
+ loading: Ref<boolean, boolean>;
99
+ createComment: (content: string, anchor?: any, parentId?: string) => Promise<void>;
100
+ refresh: () => Promise<void>;
101
+ };
102
+ export interface UseAuthReturn {
103
+ session: ComputedRef<SessionData | null>;
104
+ user: ComputedRef<SessionData['user'] | null>;
105
+ isAuthenticated: ComputedRef<boolean>;
106
+ login: (email: string, password: string) => Promise<SessionData>;
107
+ signup: (email: string, password: string, name: string) => Promise<SessionData>;
108
+ logout: () => Promise<void>;
109
+ }
110
+ export declare function useAuth(providedClient?: CollabClient): UseAuthReturn;
111
+ export interface UseTiptapEditorOptions {
112
+ spaceId: ComputedRef<string> | Ref<string> | string;
113
+ documentId: ComputedRef<string> | Ref<string> | string;
114
+ extensions?: any[];
115
+ editorOptions?: Partial<EditorOptions>;
116
+ user?: {
117
+ name?: string;
118
+ color?: string;
119
+ };
120
+ onReady?: (editor: Editor) => void;
121
+ autoConnect?: boolean;
122
+ }
123
+ export interface UseTiptapEditorReturn {
124
+ editor: ShallowRef<Editor | null>;
125
+ doc: ShallowRef<Y.Doc>;
126
+ provider: ShallowRef<CollabProvider | null>;
127
+ status: Ref<'disconnected' | 'connecting' | 'connected'>;
128
+ synced: Ref<boolean>;
129
+ persistenceReady: Ref<boolean>;
130
+ loading: Ref<boolean>;
131
+ error: Ref<string>;
132
+ connect: () => Promise<void>;
133
+ disconnect: () => void;
134
+ destroy: () => void;
135
+ clearLocalData: () => Promise<void>;
136
+ }
137
+ export declare function useTiptapEditor(options: UseTiptapEditorOptions): UseTiptapEditorReturn;
138
+ export declare function useCollaborativeDocument(spaceId: string, documentId: string): {
139
+ doc: ShallowRef<Y.Doc>;
140
+ provider: ShallowRef<CollabProvider | null>;
141
+ status: Ref<"connected" | "disconnected" | "connecting", "connected" | "disconnected" | "connecting">;
142
+ synced: Ref<boolean, boolean>;
143
+ connect: () => void;
144
+ disconnect: () => void;
145
+ undo: () => void;
146
+ redo: () => void;
147
+ transact: (callback: (txn: Y.Transaction) => void) => void;
148
+ canUndo: ComputedRef<number | boolean>;
149
+ canRedo: ComputedRef<number | boolean>;
150
+ users: Ref<{
151
+ [x: string]: any;
152
+ clientId: number;
153
+ user: {
154
+ name: string;
155
+ color: string;
156
+ avatar?: string | undefined;
157
+ };
158
+ }[], AwarenessUser[] | {
159
+ [x: string]: any;
160
+ clientId: number;
161
+ user: {
162
+ name: string;
163
+ color: string;
164
+ avatar?: string | undefined;
165
+ };
166
+ }[]>;
167
+ me: Ref<{
168
+ [x: string]: any;
169
+ clientId: number;
170
+ user: {
171
+ name: string;
172
+ color: string;
173
+ avatar?: string | undefined;
174
+ };
175
+ } | null, AwarenessUser | {
176
+ [x: string]: any;
177
+ clientId: number;
178
+ user: {
179
+ name: string;
180
+ color: string;
181
+ avatar?: string | undefined;
182
+ };
183
+ } | null>;
184
+ updatePresence: (state: Partial<AwarenessUser["user"] | any>) => void;
185
+ comments: Ref<any[], any[]>;
186
+ loadingComments: Ref<boolean, boolean>;
187
+ createComment: (content: string, anchor?: any, parentId?: string) => Promise<void>;
188
+ useMap: <T>(name: string) => {
189
+ data: Record<string, T>;
190
+ set: (key: string, value: T) => T | undefined;
191
+ remove: (key: string) => void | undefined;
192
+ clear: () => void | undefined;
193
+ get: (key: string) => T | undefined;
194
+ yMap: ComputedRef<Y.Map<T> | null>;
195
+ };
196
+ useArray: <T>(name: string) => {
197
+ list: Ref<T[], T[]>;
198
+ push: (item: T) => void | undefined;
199
+ unshift: (item: T) => void | undefined;
200
+ insert: (index: number, items: T[]) => void | undefined;
201
+ deleteAt: (index: number, length?: number) => void | undefined;
202
+ replace: (index: number, item: T) => void;
203
+ yArray: ComputedRef<Y.Array<T> | null>;
204
+ };
205
+ useText: (name: string) => {
206
+ text: Ref<string, string>;
207
+ insert: (index: number, content: string, attributes?: Record<string, any>) => void | undefined;
208
+ delete: (index: number, length: number) => void | undefined;
209
+ format: (index: number, length: number, attributes: Record<string, any>) => void | undefined;
210
+ yText: ComputedRef<Y.Text | null>;
211
+ };
212
+ useXml: (name: string) => {
213
+ yXml: ShallowRef<Y.XmlFragment | null, Y.XmlFragment | null>;
214
+ };
215
+ };
216
+ //# sourceMappingURL=useCollab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCollab.d.ts","sourceRoot":"","sources":["../src/useCollab.ts"],"names":[],"mappings":"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"}