@adonis-agora/collaboration 0.9.2 → 0.10.0
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.
- package/CHANGELOG.md +110 -0
- package/dist/providers/collaboration_provider.d.ts +15 -5
- package/dist/providers/collaboration_provider.d.ts.map +1 -1
- package/dist/providers/collaboration_provider.js +53 -24
- package/dist/providers/collaboration_provider.js.map +1 -1
- package/dist/src/auth/token.d.ts +20 -2
- package/dist/src/auth/token.d.ts.map +1 -1
- package/dist/src/auth/token.js +31 -8
- package/dist/src/auth/token.js.map +1 -1
- package/dist/src/codegen_init.d.ts.map +1 -1
- package/dist/src/codegen_init.js +11 -1
- package/dist/src/codegen_init.js.map +1 -1
- package/dist/src/collaboration_manager.d.ts.map +1 -1
- package/dist/src/collaboration_manager.js +4 -0
- package/dist/src/collaboration_manager.js.map +1 -1
- package/dist/src/define_config.d.ts +32 -1
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +6 -0
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.d.ts +7 -1
- package/dist/src/drivers/automerge/automerge_driver.d.ts.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.js +74 -11
- package/dist/src/drivers/automerge/automerge_driver.js.map +1 -1
- package/dist/src/drivers/yjs/yjs_driver.d.ts +20 -0
- package/dist/src/drivers/yjs/yjs_driver.d.ts.map +1 -1
- package/dist/src/drivers/yjs/yjs_driver.js +84 -19
- package/dist/src/drivers/yjs/yjs_driver.js.map +1 -1
- package/dist/src/http/types.d.ts +24 -1
- package/dist/src/http/types.d.ts.map +1 -1
- package/dist/src/http/types.js.map +1 -1
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/observability.d.ts +52 -0
- package/dist/src/observability.d.ts.map +1 -0
- package/dist/src/observability.js +50 -0
- package/dist/src/observability.js.map +1 -0
- package/dist/src/routes.d.ts +35 -5
- package/dist/src/routes.d.ts.map +1 -1
- package/dist/src/routes.js +117 -26
- package/dist/src/routes.js.map +1 -1
- package/dist/src/services/comment_service.d.ts +9 -0
- package/dist/src/services/comment_service.d.ts.map +1 -1
- package/dist/src/services/comment_service.js +17 -4
- package/dist/src/services/comment_service.js.map +1 -1
- package/dist/src/storage/lucid_storage.d.ts +7 -0
- package/dist/src/storage/lucid_storage.d.ts.map +1 -1
- package/dist/src/storage/lucid_storage.js +34 -11
- package/dist/src/storage/lucid_storage.js.map +1 -1
- package/dist/src/types.d.ts +14 -4
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/versioning.d.ts +6 -0
- package/dist/src/versioning.d.ts.map +1 -1
- package/dist/src/versioning.js +10 -0
- package/dist/src/versioning.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as A from '@automerge/automerge';
|
|
2
2
|
import { next as ANext } from '@automerge/automerge';
|
|
3
3
|
import { WebSocketServer } from 'ws';
|
|
4
|
-
import {
|
|
4
|
+
import { parseLegacyToken } from '../../auth/token.js';
|
|
5
|
+
import { reportCollaborationError } from '../../observability.js';
|
|
6
|
+
import { createVersionMetadata, restoredFromLabel, seqVersions } from '../../versioning.js';
|
|
5
7
|
import { lineDiff, resolveStorage } from '../shared.js';
|
|
6
8
|
/**
|
|
7
9
|
* Automerge driver.
|
|
@@ -19,6 +21,8 @@ import { lineDiff, resolveStorage } from '../shared.js';
|
|
|
19
21
|
*/
|
|
20
22
|
/** Connections whose permission denied canWrite — their updates are dropped. */
|
|
21
23
|
const readOnlyClients = new WeakSet();
|
|
24
|
+
/** userId behind each open socket — feeds the presence roster on close. */
|
|
25
|
+
const socketUsers = new WeakMap();
|
|
22
26
|
export class AutomergeDriver {
|
|
23
27
|
engine = 'automerge';
|
|
24
28
|
rooms = new Map();
|
|
@@ -69,17 +73,41 @@ export class AutomergeDriver {
|
|
|
69
73
|
ws.close(4001, 'not authenticated');
|
|
70
74
|
return;
|
|
71
75
|
}
|
|
76
|
+
const ctx = parseLegacyToken(token);
|
|
77
|
+
if (!ctx) {
|
|
78
|
+
ws.close(4001, 'authentication failed');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// A denial and an outage are different events for the client: 4003
|
|
82
|
+
// is final, 4503 is worth retrying. Reporting one as the other is
|
|
83
|
+
// how an app-side database error becomes a reconnect storm.
|
|
84
|
+
let permission;
|
|
85
|
+
try {
|
|
86
|
+
permission = await this.options.authorize(ctx, docName);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
reportCollaborationError({
|
|
90
|
+
scope: 'authorize',
|
|
91
|
+
operation: 'upgrade',
|
|
92
|
+
docName,
|
|
93
|
+
error,
|
|
94
|
+
});
|
|
95
|
+
ws.close(4503, 'authorization unavailable');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (!permission.canRead) {
|
|
99
|
+
ws.close(4003, 'no access');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
72
102
|
try {
|
|
73
|
-
const ctx = JSON.parse(Buffer.from(token, 'base64').toString());
|
|
74
|
-
const permission = await this.options.authorize(ctx, docName);
|
|
75
|
-
if (!permission.canRead) {
|
|
76
|
-
ws.close(4003, 'no access');
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
103
|
const room = await this.loadRoom(docName);
|
|
80
104
|
room.clients.add(ws);
|
|
81
105
|
if (!permission.canWrite)
|
|
82
106
|
readOnlyClients.add(ws);
|
|
107
|
+
await this.options.presence?.join(docName, {
|
|
108
|
+
userId: ctx.userId,
|
|
109
|
+
...(ctx.user?.name ? { name: ctx.user.name } : {}),
|
|
110
|
+
});
|
|
83
111
|
// Sends the full state to the new client.
|
|
84
112
|
ws.send(A.save(room.text));
|
|
85
113
|
ws.on('message', (data) => {
|
|
@@ -93,10 +121,18 @@ export class AutomergeDriver {
|
|
|
93
121
|
ws.on('close', () => {
|
|
94
122
|
room.clients.delete(ws);
|
|
95
123
|
readOnlyClients.delete(ws);
|
|
124
|
+
// Only the user's LAST socket on this document leaves the roster.
|
|
125
|
+
const stillConnected = [...room.clients].some((client) => socketUsers.get(client) === ctx.userId);
|
|
126
|
+
socketUsers.delete(ws);
|
|
127
|
+
if (!stillConnected) {
|
|
128
|
+
void this.options.presence?.leave(docName, ctx.userId);
|
|
129
|
+
}
|
|
96
130
|
});
|
|
131
|
+
socketUsers.set(ws, ctx.userId);
|
|
97
132
|
}
|
|
98
|
-
catch {
|
|
99
|
-
|
|
133
|
+
catch (error) {
|
|
134
|
+
reportCollaborationError({ scope: 'storage', operation: 'loadDocument', docName, error });
|
|
135
|
+
ws.close(4500, 'could not open the document');
|
|
100
136
|
}
|
|
101
137
|
});
|
|
102
138
|
});
|
|
@@ -123,7 +159,17 @@ export class AutomergeDriver {
|
|
|
123
159
|
if (existing)
|
|
124
160
|
clearTimeout(existing);
|
|
125
161
|
this.persistTimers.set(docName, setTimeout(() => {
|
|
126
|
-
void this.storage
|
|
162
|
+
void this.storage
|
|
163
|
+
.saveDocument(docName, A.save(room.text))
|
|
164
|
+
.catch((error) => {
|
|
165
|
+
reportCollaborationError({
|
|
166
|
+
scope: 'storage',
|
|
167
|
+
operation: 'saveDocument',
|
|
168
|
+
docName,
|
|
169
|
+
error,
|
|
170
|
+
});
|
|
171
|
+
})
|
|
172
|
+
.finally(() => resolve());
|
|
127
173
|
}, this.options.debounce ?? 2000));
|
|
128
174
|
});
|
|
129
175
|
}
|
|
@@ -153,12 +199,24 @@ export class AutomergeDriver {
|
|
|
153
199
|
async listVersions(docName) {
|
|
154
200
|
return this.storage.listVersions(docName);
|
|
155
201
|
}
|
|
156
|
-
|
|
202
|
+
/**
|
|
203
|
+
* Restores `versionId` — recording the state it replaces as a new version
|
|
204
|
+
* attributed to `restoredBy`, per the driver contract. Automerge keeps the
|
|
205
|
+
* change history natively, but the *version list* is ours, and a restore
|
|
206
|
+
* that leaves no entry in it is a restore nobody can undo.
|
|
207
|
+
*/
|
|
208
|
+
async restoreVersion(docName, versionId, restoredBy) {
|
|
157
209
|
const bytes = await this.storage.loadVersionSnapshot(docName, versionId);
|
|
158
210
|
if (!bytes)
|
|
159
211
|
throw new Error(`Version ${versionId} not found`);
|
|
160
212
|
const snapshotDoc = A.load(bytes);
|
|
161
213
|
const room = await this.loadRoom(docName);
|
|
214
|
+
const existing = await this.storage.listVersions(docName);
|
|
215
|
+
const target = existing.find((version) => version.id === versionId);
|
|
216
|
+
await this.storage.saveVersion(docName, {
|
|
217
|
+
...createVersionMetadata(restoredBy, restoredFromLabel(target, versionId), seqVersions(existing)),
|
|
218
|
+
id: ANext.getHeads(room.text).join(','),
|
|
219
|
+
}, A.save(room.text));
|
|
162
220
|
const merged = A.merge(room.text, snapshotDoc);
|
|
163
221
|
// Automerge merge converges to the most recent state; to "restore",
|
|
164
222
|
// we overwrite the content field with the value from the version.
|
|
@@ -187,6 +245,11 @@ export class AutomergeDriver {
|
|
|
187
245
|
async close() {
|
|
188
246
|
for (const timer of this.persistTimers.values())
|
|
189
247
|
clearTimeout(timer);
|
|
248
|
+
// `this.wss?.close(cb)` never runs cb when there is no server, so this
|
|
249
|
+
// promise used to hang forever on a driver that was never attached —
|
|
250
|
+
// which is every driver outside the web process.
|
|
251
|
+
if (!this.wss)
|
|
252
|
+
return;
|
|
190
253
|
return new Promise((resolve) => {
|
|
191
254
|
this.wss?.close(() => resolve());
|
|
192
255
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automerge_driver.js","sourceRoot":"","sources":["../../../../src/drivers/automerge/automerge_driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"automerge_driver.js","sourceRoot":"","sources":["../../../../src/drivers/automerge/automerge_driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAOlE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAExD;;;;;;;;;;;;;GAaG;AAEH,gFAAgF;AAChF,MAAM,eAAe,GAAG,IAAI,OAAO,EAAU,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,WAAW,GAAG,IAAI,OAAO,EAAkB,CAAC;AAQlD,MAAM,OAAO,eAAe;IACjB,MAAM,GAAG,WAAW,CAAC;IAEtB,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAChC,GAAG,CAAmB;IACb,OAAO,CAA0B;IACjC,OAAO,CAAuB;IACvC,aAAa,GAAG,IAAI,GAAG,EAAyC,CAAC;IAEzE,YAAY,OAAgC;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAe;QACpC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAEtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM;YAChB,CAAC,CAAC,CAAC,CAAC,IAAI,CAA0B,MAAM,CAAC,KAAK,CAAC;YAC/C,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAA6B,CAAC,CAAC;QAEvD,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,SAAS,CAAC,IAAU,EAAE,OAAmB,EAAE,MAA+B;QAChF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBACjD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAkC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YAC5D,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI;gBAAE,OAAO;YAElC,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,MAAmC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACjF,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBAED,kEAAkE;gBAClE,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;oBACpC,OAAO;gBACT,CAAC;gBAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACpC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;oBACxC,OAAO;gBACT,CAAC;gBAED,mEAAmE;gBACnE,kEAAkE;gBAClE,4DAA4D;gBAC5D,IAAI,UAA4B,CAAC;gBACjC,IAAI,CAAC;oBACH,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC1D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,wBAAwB,CAAC;wBACvB,KAAK,EAAE,WAAW;wBAClB,SAAS,EAAE,SAAS;wBACpB,OAAO;wBACP,KAAK;qBACN,CAAC,CAAC;oBACH,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACxB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACrB,IAAI,CAAC,UAAU,CAAC,QAAQ;wBAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAElD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE;wBACzC,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACnD,CAAC,CAAC;oBAEH,0CAA0C;oBAC1C,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBAE3B,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;wBACxB,kEAAkE;wBAClE,iEAAiE;wBACjE,iDAAiD;wBACjD,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;4BAAE,OAAO;wBACpC,KAAK,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAkB,EAAE,EAAE,CAAC,CAAC;oBACjE,CAAC,CAAC,CAAC;oBAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;wBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBACxB,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBAC3B,kEAAkE;wBAClE,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAC3C,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,MAAM,CACnD,CAAC;wBACF,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBACvB,IAAI,CAAC,cAAc,EAAE,CAAC;4BACpB,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;wBACzD,CAAC;oBACH,CAAC,CAAC,CAAC;oBACH,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,wBAAwB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1F,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,6BAA6B,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4FAA4F;IACpF,KAAK,CAAC,mBAAmB,CAAC,OAAe,EAAE,IAAgB,EAAE,MAAW;QAC9E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,qEAAqE;YACrE,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAA0B,IAAI,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;YAEnB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAEnC,6CAA6C;YAC7C,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,+EAA+E;QACjF,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,OAAe,EAAE,IAAU;QAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,QAAQ;gBAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;YAErC,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,OAAO,EACP,UAAU,CAAC,GAAG,EAAE;gBACd,KAAK,IAAI,CAAC,OAAO;qBACd,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACxC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBACxB,wBAAwB,CAAC;wBACvB,KAAK,EAAE,SAAS;wBAChB,SAAS,EAAE,cAAc;wBACzB,OAAO;wBACP,KAAK;qBACN,CAAC,CAAC;gBACL,CAAC,CAAC;qBACD,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAClC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAI,IAAI,CAAC,IAAwD,CAAC,OAAO,CAAC;QACvF,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,SAAwB,EACxB,KAAoB;QAEpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAkB;YAC7B,GAAG,qBAAqB,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;YACjE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;SACpB,CAAC;QAEF,4EAA4E;QAC5E,qEAAqE;QACrE,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAClB,OAAe,EACf,SAAiB,EACjB,UAAyB;QAEzB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;QAE9D,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAA0B,KAAK,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAC5B,OAAO,EACP;YACE,GAAG,qBAAqB,CACtB,UAAU,EACV,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,QAAQ,CAAC,CACtB;YACD,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACxC,EACD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAClB,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/C,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,eAAe,GAAI,WAA+D;aACrF,OAAO,CAAC;QACX,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;YACvC,GAA2B,CAAC,OAAO,GAAG,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,GAAW,EAAE,GAAW;QAC1D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAuC,KAAK,CAAC,CAAC;YAChE,OAAO,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACrE,uEAAuE;QACvE,qEAAqE;QACrE,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,OAAO;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import type { CollaborationDriver, SelfHostedDriverOptions } from '../../driver.js';
|
|
2
2
|
import type { CollabDiffSummary, CollabVersion } from '../../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Yjs driver: Hocuspocus as the sync engine (y-protocols protocol over
|
|
5
|
+
* WebSocket), with version control implemented on top of complete binary
|
|
6
|
+
* updates — what Automerge has natively (history) we provide here:
|
|
7
|
+
*
|
|
8
|
+
* - `createVersion`: stores the complete binary update + metadata;
|
|
9
|
+
* - `restoreVersion`: applies the version's content to the live doc via a
|
|
10
|
+
* transaction — connected clients receive it in real time through the sync
|
|
11
|
+
* protocol;
|
|
12
|
+
* - `diffVersions`: materializes both versions and compares them by line.
|
|
13
|
+
* - Anchored comments: delegate to the CommentService (generic anchor).
|
|
14
|
+
*/
|
|
3
15
|
export declare class YjsDriver implements CollaborationDriver {
|
|
4
16
|
readonly engine = "yjs";
|
|
5
17
|
private hocuspocus;
|
|
@@ -15,6 +27,14 @@ export declare class YjsDriver implements CollaborationDriver {
|
|
|
15
27
|
getDocumentText(docName: string): Promise<string>;
|
|
16
28
|
createVersion(docName: string, createdBy: string | null, label: string | null): Promise<CollabVersion>;
|
|
17
29
|
listVersions(docName: string): Promise<CollabVersion[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Restores `versionId` into the live document — and keeps what it replaced.
|
|
32
|
+
*
|
|
33
|
+
* The state being overwritten is written to the history first, as a new
|
|
34
|
+
* version attributed to `restoredBy` and labelled `restored from #<seq>`.
|
|
35
|
+
* Without that step a restore is a destructive edit with no undo, which is
|
|
36
|
+
* the opposite of what a version history is for.
|
|
37
|
+
*/
|
|
18
38
|
restoreVersion(docName: string, versionId: string, restoredBy: string | null): Promise<void>;
|
|
19
39
|
diffVersions(docName: string, aId: string, bId: string): Promise<CollabDiffSummary>;
|
|
20
40
|
private versionState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yjs_driver.d.ts","sourceRoot":"","sources":["../../../../src/drivers/yjs/yjs_driver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"yjs_driver.d.ts","sourceRoot":"","sources":["../../../../src/drivers/yjs/yjs_driver.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAEpF,OAAO,KAAK,EACV,iBAAiB,EAEjB,aAAa,EAEd,MAAM,gBAAgB,CAAC;AAIxB;;;;;;;;;;;GAWG;AAEH,qBAAa,SAAU,YAAW,mBAAmB;IACnD,QAAQ,CAAC,MAAM,SAAS;IAExB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,OAAO,EAAE,uBAAuB;IAiI5C,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,OAAO;YAQD,SAAS;IAQjB,MAAM,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBzD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAStD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAajD,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,aAAa,CAAC;IASnB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAI7D;;;;;;;OAOG;IACG,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,IAAI,CAAC;IA6BV,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAY3E,YAAY;IAMpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
|
|
@@ -2,8 +2,9 @@ import { Hocuspocus, } from '@hocuspocus/server';
|
|
|
2
2
|
import { TiptapTransformer } from '@hocuspocus/transformer';
|
|
3
3
|
import { WebSocketServer } from 'ws';
|
|
4
4
|
import * as Y from 'yjs';
|
|
5
|
-
import { parseLegacyToken } from '../../auth/token.js';
|
|
6
|
-
import {
|
|
5
|
+
import { CollabAuthorizationError, CollabForbiddenError, parseLegacyToken, } from '../../auth/token.js';
|
|
6
|
+
import { reportCollaborationError } from '../../observability.js';
|
|
7
|
+
import { createVersionMetadata, restoredFromLabel, seqVersions } from '../../versioning.js';
|
|
7
8
|
import { lineDiff, resolveStorage, tiptapJsonToText } from '../shared.js';
|
|
8
9
|
/**
|
|
9
10
|
* Yjs driver: Hocuspocus as the sync engine (y-protocols protocol over
|
|
@@ -17,9 +18,6 @@ import { lineDiff, resolveStorage, tiptapJsonToText } from '../shared.js';
|
|
|
17
18
|
* - `diffVersions`: materializes both versions and compares them by line.
|
|
18
19
|
* - Anchored comments: delegate to the CommentService (generic anchor).
|
|
19
20
|
*/
|
|
20
|
-
/** Permissions per connection (userId:docName), filled in at authenticate. */
|
|
21
|
-
/** userId por documento conectado — alimenta presence no disconnect. */
|
|
22
|
-
const presenceByDoc = new Map();
|
|
23
21
|
export class YjsDriver {
|
|
24
22
|
engine = 'yjs';
|
|
25
23
|
hocuspocus;
|
|
@@ -32,37 +30,68 @@ export class YjsDriver {
|
|
|
32
30
|
// Captured outside the callback: `this` inside Hocuspocus hooks is not
|
|
33
31
|
// the driver instance.
|
|
34
32
|
const storage = this.storage;
|
|
33
|
+
/**
|
|
34
|
+
* Presence bookkeeping, keyed by **socket** and scoped to this driver
|
|
35
|
+
* instance.
|
|
36
|
+
*
|
|
37
|
+
* It used to be a module-level `Map<docName, userId>` — one slot per
|
|
38
|
+
* DOCUMENT. A second editor overwrote the first, and then whichever of
|
|
39
|
+
* them disconnected first evicted the other from the roster too. A room
|
|
40
|
+
* is many connections; the map has to be too.
|
|
41
|
+
*/
|
|
42
|
+
const presenceBySocket = new Map();
|
|
35
43
|
this.hocuspocus = new Hocuspocus({
|
|
36
44
|
async onAuthenticate({ documentName, token, connectionConfig }) {
|
|
37
45
|
const ctx = parseLegacyToken(token);
|
|
38
46
|
if (!ctx)
|
|
39
47
|
throw new Error('invalid token');
|
|
40
|
-
|
|
48
|
+
// "You may not" and "we could not tell" are different answers, and a
|
|
49
|
+
// client that cannot distinguish them retries the first one forever.
|
|
50
|
+
let permission;
|
|
51
|
+
try {
|
|
52
|
+
permission = await options.authorize(ctx, documentName);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
reportCollaborationError({
|
|
56
|
+
scope: 'authorize',
|
|
57
|
+
operation: 'onAuthenticate',
|
|
58
|
+
docName: documentName,
|
|
59
|
+
error,
|
|
60
|
+
});
|
|
61
|
+
throw new CollabAuthorizationError(documentName, error);
|
|
62
|
+
}
|
|
41
63
|
if (!permission.canRead) {
|
|
42
|
-
throw new
|
|
64
|
+
throw new CollabForbiddenError(documentName);
|
|
43
65
|
}
|
|
44
66
|
// canWrite has to bind the connection itself: a client that is only
|
|
45
67
|
// told it may not write can simply not ask. Hocuspocus drops inbound
|
|
46
68
|
// updates on a read-only connection while still syncing outbound.
|
|
47
69
|
connectionConfig.readOnly = !permission.canWrite;
|
|
48
70
|
},
|
|
49
|
-
async onConnect({ documentName, requestParameters }) {
|
|
71
|
+
async onConnect({ documentName, requestParameters, socketId }) {
|
|
50
72
|
const token = requestParameters.get('token');
|
|
51
73
|
const ctx = token ? parseLegacyToken(token) : null;
|
|
52
74
|
if (options.presence && ctx?.userId) {
|
|
53
|
-
|
|
75
|
+
presenceBySocket.set(socketId, { documentName, userId: ctx.userId });
|
|
54
76
|
await options.presence.join(documentName, {
|
|
55
77
|
userId: ctx.userId,
|
|
56
78
|
...(ctx.user ? { name: ctx.user.name } : {}),
|
|
57
79
|
});
|
|
58
80
|
}
|
|
59
81
|
},
|
|
60
|
-
async onDisconnect({
|
|
61
|
-
const
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
82
|
+
async onDisconnect({ socketId }) {
|
|
83
|
+
const entry = presenceBySocket.get(socketId);
|
|
84
|
+
if (!entry)
|
|
85
|
+
return;
|
|
86
|
+
presenceBySocket.delete(socketId);
|
|
87
|
+
if (!options.presence)
|
|
88
|
+
return;
|
|
89
|
+
// One user, two tabs: the roster entry only goes away with the last
|
|
90
|
+
// socket that user holds on that document.
|
|
91
|
+
const stillConnected = [...presenceBySocket.values()].some((other) => other.documentName === entry.documentName && other.userId === entry.userId);
|
|
92
|
+
if (stillConnected)
|
|
93
|
+
return;
|
|
94
|
+
await options.presence.leave(entry.documentName, entry.userId);
|
|
66
95
|
},
|
|
67
96
|
// Seed each in-memory doc from the persisted state: without this hook the
|
|
68
97
|
// Hocuspocus doc starts EMPTY on every connection, so a previously saved
|
|
@@ -76,7 +105,20 @@ export class YjsDriver {
|
|
|
76
105
|
}
|
|
77
106
|
},
|
|
78
107
|
async onStoreDocument({ documentName, document }) {
|
|
79
|
-
|
|
108
|
+
// Hocuspocus swallows what this hook throws, so a storage outage was
|
|
109
|
+
// completely silent — indistinguishable from a healthy save.
|
|
110
|
+
try {
|
|
111
|
+
await storage.saveDocument(documentName, Y.encodeStateAsUpdate(document));
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
reportCollaborationError({
|
|
115
|
+
scope: 'storage',
|
|
116
|
+
operation: 'saveDocument',
|
|
117
|
+
docName: documentName,
|
|
118
|
+
error,
|
|
119
|
+
});
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
80
122
|
},
|
|
81
123
|
// CRITICAL: when the last client disconnects (F5 / close tab / nav away),
|
|
82
124
|
// Hocuspocus's default onClose path (server line 1382) only flushes the
|
|
@@ -86,7 +128,18 @@ export class YjsDriver {
|
|
|
86
128
|
// to persist synchronously before the doc is destroyed, regardless of
|
|
87
129
|
// debouncer state. This makes F5 reliable.
|
|
88
130
|
async beforeUnloadDocument({ documentName, document }) {
|
|
89
|
-
|
|
131
|
+
try {
|
|
132
|
+
await storage.saveDocument(documentName, Y.encodeStateAsUpdate(document));
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
reportCollaborationError({
|
|
136
|
+
scope: 'storage',
|
|
137
|
+
operation: 'saveDocument',
|
|
138
|
+
docName: documentName,
|
|
139
|
+
error,
|
|
140
|
+
});
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
90
143
|
},
|
|
91
144
|
debounce: options.debounce ?? 2000,
|
|
92
145
|
});
|
|
@@ -157,13 +210,25 @@ export class YjsDriver {
|
|
|
157
210
|
async listVersions(docName) {
|
|
158
211
|
return this.storage.listVersions(docName);
|
|
159
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Restores `versionId` into the live document — and keeps what it replaced.
|
|
215
|
+
*
|
|
216
|
+
* The state being overwritten is written to the history first, as a new
|
|
217
|
+
* version attributed to `restoredBy` and labelled `restored from #<seq>`.
|
|
218
|
+
* Without that step a restore is a destructive edit with no undo, which is
|
|
219
|
+
* the opposite of what a version history is for.
|
|
220
|
+
*/
|
|
160
221
|
async restoreVersion(docName, versionId, restoredBy) {
|
|
161
|
-
|
|
222
|
+
// Resolve the target first: a missing version must fail before anything
|
|
223
|
+
// is written, so a bad id never lands a spurious version in the history.
|
|
162
224
|
const state = await this.versionState(docName, versionId);
|
|
163
225
|
const restoredDoc = this.hydrate(state);
|
|
226
|
+
const live = await this.ensureDoc(docName);
|
|
227
|
+
const existing = await this.storage.listVersions(docName);
|
|
228
|
+
const target = existing.find((version) => version.id === versionId);
|
|
229
|
+
await this.storage.saveVersion(docName, createVersionMetadata(restoredBy, restoredFromLabel(target, versionId), seqVersions(existing)), Y.encodeStateAsUpdate(live));
|
|
164
230
|
// Applies the restored content to the live doc — connected clients receive
|
|
165
231
|
// the change in real time via the Hocuspocus sync protocol.
|
|
166
|
-
const live = await this.ensureDoc(docName);
|
|
167
232
|
live.transact(() => {
|
|
168
233
|
applyRestoredContent(live, restoredDoc);
|
|
169
234
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yjs_driver.js","sourceRoot":"","sources":["../../../../src/drivers/yjs/yjs_driver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,GAGX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"yjs_driver.js","sourceRoot":"","sources":["../../../../src/drivers/yjs/yjs_driver.ts"],"names":[],"mappings":"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"}
|
package/dist/src/http/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AuthorizeFn } from '../auth/token.js';
|
|
2
|
+
import type { CollabPermission } from '../types.js';
|
|
2
3
|
/**
|
|
3
4
|
* Minimal HttpContext contract consumed by the built-in route handlers.
|
|
4
5
|
* Intentionally structural — keeps the package decoupled from the full
|
|
@@ -21,9 +22,16 @@ export interface CollabHttpContext {
|
|
|
21
22
|
noContent(): unknown;
|
|
22
23
|
header(name: string, value: string): unknown;
|
|
23
24
|
};
|
|
24
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Present when @adonisjs/auth is installed. `user` is only populated once
|
|
27
|
+
* the guard actually ran, so the default resolver calls `check()` (or
|
|
28
|
+
* `authenticate()`) itself before reading it.
|
|
29
|
+
*/
|
|
25
30
|
auth?: {
|
|
26
31
|
user?: unknown;
|
|
32
|
+
isAuthenticated?: boolean;
|
|
33
|
+
check?(): Promise<boolean>;
|
|
34
|
+
authenticate?(): Promise<unknown>;
|
|
27
35
|
};
|
|
28
36
|
}
|
|
29
37
|
/** Authenticated user resolved by the token endpoint. */
|
|
@@ -46,6 +54,20 @@ export interface CollabManagerLike {
|
|
|
46
54
|
engineFor?(options: {
|
|
47
55
|
docName: string;
|
|
48
56
|
}): Promise<string>;
|
|
57
|
+
/**
|
|
58
|
+
* The app's permission rule, resolved exactly as the WebSocket handshake
|
|
59
|
+
* resolves it (declared document first, then the global rule, then deny).
|
|
60
|
+
* The routes fall back to this when no explicit `authorize` option is
|
|
61
|
+
* given — which is what makes manual registration enforce the same rule
|
|
62
|
+
* the provider does.
|
|
63
|
+
*/
|
|
64
|
+
authorize?(ctx: {
|
|
65
|
+
userId: string;
|
|
66
|
+
user?: {
|
|
67
|
+
name?: string;
|
|
68
|
+
avatarUrl?: string | null;
|
|
69
|
+
};
|
|
70
|
+
}, docName: string): Promise<CollabPermission>;
|
|
49
71
|
getDocumentState(options: {
|
|
50
72
|
docName: string;
|
|
51
73
|
}): Promise<Uint8Array>;
|
|
@@ -68,6 +90,7 @@ export interface CollabManagerLike {
|
|
|
68
90
|
}): Promise<void>;
|
|
69
91
|
comments: {
|
|
70
92
|
list(docName: string, space?: string): Promise<unknown[]>;
|
|
93
|
+
get(docName: string, commentId: string): Promise<unknown>;
|
|
71
94
|
create(docName: string, comment: Record<string, unknown>): Promise<unknown>;
|
|
72
95
|
resolve(docName: string, commentId: string, resolved: boolean): Promise<unknown>;
|
|
73
96
|
remove(docName: string, commentId: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/http/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE;QACP,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,GAAG,IAAI,WAAW,GAAG,SAAS,CAAC;QAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KAC1C,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAA;SAAE,CAAC;QAC1D,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;QAChC,SAAS,IAAI,OAAO,CAAC;QACrB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;KAC9C,CAAC;IACF
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/http/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/http/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/http/types.ts"],"names":[],"mappings":"AA+CA,8DAA8D;AAC9D,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAO,GAAG,iBAAiB;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -2,13 +2,14 @@ export { CollaborationManager } from './collaboration_manager.js';
|
|
|
2
2
|
export { YjsDriver } from './drivers/yjs/yjs_driver.js';
|
|
3
3
|
export { AutomergeDriver } from './drivers/automerge/automerge_driver.js';
|
|
4
4
|
export { PartyKitDriver, PartyKitRoomError, } from './drivers/partykit/partykit_driver.js';
|
|
5
|
-
export { buildWsUrl, CollabForbiddenError, issueToken, parseLegacyToken, signPartyKitToken, verifyPartyKitToken, type AuthorizeFn, type IssuedToken, type TokenIssuerConfig, } from './auth/token.js';
|
|
5
|
+
export { buildWsUrl, CollabAuthorizationError, CollabForbiddenError, issueToken, parseLegacyToken, signPartyKitToken, verifyPartyKitToken, type AuthorizeFn, type IssuedToken, type TokenIssuerConfig, } from './auth/token.js';
|
|
6
|
+
export { COLLAB_ERROR_EVENT, collaborationEvents, onCollaborationError, reportCollaborationError, setCollaborationLogger, type CollabErrorEvent, type CollabLogger, } from './observability.js';
|
|
6
7
|
export { LucidStorage, lucidStorage } from './storage/lucid_storage.js';
|
|
7
8
|
export { PresenceService, RedisPresenceStore, type PresenceMember, type PresenceStore, } from './services/presence_service.js';
|
|
8
9
|
export { InMemoryCollaborationStorage } from './storage/in_memory_storage.js';
|
|
9
10
|
export { FileSystemStorage } from './storage/file_system_storage.js';
|
|
10
|
-
export { defineConfig, type CollaborationAppConfig, } from './define_config.js';
|
|
11
|
-
export { collaborationRoutes, defaultResolveUser, secretsMatch } from './routes.js';
|
|
11
|
+
export { defineConfig, type CollabDocumentNameFor, type CollaborationAppConfig, type InferCollabDocumentNames, } from './define_config.js';
|
|
12
|
+
export { canMutateComment, collaborationRoutes, defaultResolveUser, secretsMatch, } from './routes.js';
|
|
12
13
|
export type { CollabHttpContext, CollabManagerLike, CollabRouteUser, CollabRoutesRuntime, ResolveUserFn, } from './http/types.js';
|
|
13
14
|
export { CollabUnauthorizedError } from './http/types.js';
|
|
14
15
|
export type { CollabComment, CommentAnchor, CollaborationEngine, CollaborationConfig, CollaborationStorage, CollabConnectionContext, CollabPermission, CollabVersion, CollabDiffSummary, PartyKitConfig, PruneVersionsOptions, } from './types.js';
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EACL,YAAY,EACZ,KAAK,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EACL,YAAY,EACZ,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EACV,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtE,YAAY,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -2,13 +2,14 @@ export { CollaborationManager } from './collaboration_manager.js';
|
|
|
2
2
|
export { YjsDriver } from './drivers/yjs/yjs_driver.js';
|
|
3
3
|
export { AutomergeDriver } from './drivers/automerge/automerge_driver.js';
|
|
4
4
|
export { PartyKitDriver, PartyKitRoomError, } from './drivers/partykit/partykit_driver.js';
|
|
5
|
-
export { buildWsUrl, CollabForbiddenError, issueToken, parseLegacyToken, signPartyKitToken, verifyPartyKitToken, } from './auth/token.js';
|
|
5
|
+
export { buildWsUrl, CollabAuthorizationError, CollabForbiddenError, issueToken, parseLegacyToken, signPartyKitToken, verifyPartyKitToken, } from './auth/token.js';
|
|
6
|
+
export { COLLAB_ERROR_EVENT, collaborationEvents, onCollaborationError, reportCollaborationError, setCollaborationLogger, } from './observability.js';
|
|
6
7
|
export { LucidStorage, lucidStorage } from './storage/lucid_storage.js';
|
|
7
8
|
export { PresenceService, RedisPresenceStore, } from './services/presence_service.js';
|
|
8
9
|
export { InMemoryCollaborationStorage } from './storage/in_memory_storage.js';
|
|
9
10
|
export { FileSystemStorage } from './storage/file_system_storage.js';
|
|
10
11
|
export { defineConfig, } from './define_config.js';
|
|
11
|
-
export { collaborationRoutes, defaultResolveUser, secretsMatch } from './routes.js';
|
|
12
|
+
export { canMutateComment, collaborationRoutes, defaultResolveUser, secretsMatch, } from './routes.js';
|
|
12
13
|
export { CollabUnauthorizedError } from './http/types.js';
|
|
13
14
|
// Root-level export so `node ace configure @adonis-agora/collaboration`
|
|
14
15
|
// finds the hook without hitting the ./configure subpath.
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GAIpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EACL,eAAe,EACf,kBAAkB,GAGnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GAIpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,GAGvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EACL,eAAe,EACf,kBAAkB,GAGnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EACL,YAAY,GAIb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,GACb,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAe1D,wEAAwE;AACxE,0DAA0D;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
/**
|
|
3
|
+
* Failure reporting for the collaboration package.
|
|
4
|
+
*
|
|
5
|
+
* The library runs inside sockets and Hocuspocus hooks — places where a
|
|
6
|
+
* thrown error either disappears into a generic handshake failure or is
|
|
7
|
+
* swallowed by the engine. Without a seam here, a database outage and a
|
|
8
|
+
* deliberate denial look identical from the outside, which is exactly how
|
|
9
|
+
* apps end up wrapping every storage method in `console.error` just to see
|
|
10
|
+
* what their own install is doing.
|
|
11
|
+
*
|
|
12
|
+
* Two sinks, in this order:
|
|
13
|
+
*
|
|
14
|
+
* 1. the **Adonis logger**, when the provider could resolve one
|
|
15
|
+
* ({@link setCollaborationLogger});
|
|
16
|
+
* 2. an **event**, always emitted on {@link collaborationEvents}, so an app
|
|
17
|
+
* without (or before) a logger can still observe and alert.
|
|
18
|
+
*
|
|
19
|
+
* With neither a logger nor a listener the failure goes to `console.error`:
|
|
20
|
+
* an unobserved outage is the one thing this module must never produce.
|
|
21
|
+
*/
|
|
22
|
+
/** Minimal logger contract — satisfied by the Adonis (pino) logger. */
|
|
23
|
+
export interface CollabLogger {
|
|
24
|
+
error(mergingObject: Record<string, unknown>, message?: string): void;
|
|
25
|
+
}
|
|
26
|
+
/** What failed, and while doing what. */
|
|
27
|
+
export interface CollabErrorEvent {
|
|
28
|
+
/** Subsystem that failed. */
|
|
29
|
+
scope: 'storage' | 'authorize';
|
|
30
|
+
/** Operation being attempted, e.g. `saveDocument`. */
|
|
31
|
+
operation: string;
|
|
32
|
+
/** Document the operation was about, when there is one. */
|
|
33
|
+
docName?: string;
|
|
34
|
+
/** The thrown value, unmodified. */
|
|
35
|
+
error: unknown;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Event name used on {@link collaborationEvents}.
|
|
39
|
+
*
|
|
40
|
+
* Deliberately NOT `'error'`: an EventEmitter with no listener for `'error'`
|
|
41
|
+
* throws, which would turn an observability hook into a second outage.
|
|
42
|
+
*/
|
|
43
|
+
export declare const COLLAB_ERROR_EVENT = "collaboration:error";
|
|
44
|
+
/** Emitter carrying {@link CollabErrorEvent} on {@link COLLAB_ERROR_EVENT}. */
|
|
45
|
+
export declare const collaborationEvents: EventEmitter<[never]>;
|
|
46
|
+
/** Installs the logger every report is written to (the provider calls this). */
|
|
47
|
+
export declare function setCollaborationLogger(next: CollabLogger | undefined): void;
|
|
48
|
+
/** Subscribes to failures; returns an unsubscribe function. */
|
|
49
|
+
export declare function onCollaborationError(listener: (event: CollabErrorEvent) => void): () => void;
|
|
50
|
+
/** Reports a failure to the logger and/or the event stream. Never throws. */
|
|
51
|
+
export declare function reportCollaborationError(event: CollabErrorEvent): void;
|
|
52
|
+
//# sourceMappingURL=observability.d.ts.map
|