@adonis-agora/collaboration 0.7.4 → 0.9.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 +96 -0
- package/README.md +1 -0
- package/dist/commands/collaboration_prune.d.ts +25 -0
- package/dist/commands/collaboration_prune.d.ts.map +1 -0
- package/dist/commands/collaboration_prune.js +59 -0
- package/dist/commands/collaboration_prune.js.map +1 -0
- package/dist/commands/commands.json +1 -1
- package/dist/configure.d.ts +1 -1
- package/dist/configure.js +1 -1
- package/dist/providers/collaboration_provider.d.ts.map +1 -1
- package/dist/providers/collaboration_provider.js +5 -2
- package/dist/providers/collaboration_provider.js.map +1 -1
- package/dist/src/collaboration_manager.d.ts +20 -1
- package/dist/src/collaboration_manager.d.ts.map +1 -1
- package/dist/src/collaboration_manager.js +28 -3
- package/dist/src/collaboration_manager.js.map +1 -1
- package/dist/src/documents.d.ts +3 -3
- package/dist/src/documents.d.ts.map +1 -1
- package/dist/src/documents.js.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.d.ts.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.js +24 -0
- package/dist/src/drivers/automerge/automerge_driver.js.map +1 -1
- package/dist/src/drivers/yjs/yjs_driver.d.ts.map +1 -1
- package/dist/src/drivers/yjs/yjs_driver.js +17 -2
- package/dist/src/drivers/yjs/yjs_driver.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/routes.d.ts.map +1 -1
- package/dist/src/routes.js +104 -36
- package/dist/src/routes.js.map +1 -1
- package/dist/src/storage/file_system_storage.d.ts +4 -1
- package/dist/src/storage/file_system_storage.d.ts.map +1 -1
- package/dist/src/storage/file_system_storage.js +42 -1
- package/dist/src/storage/file_system_storage.js.map +1 -1
- package/dist/src/storage/in_memory_storage.d.ts +2 -1
- package/dist/src/storage/in_memory_storage.d.ts.map +1 -1
- package/dist/src/storage/in_memory_storage.js +17 -0
- package/dist/src/storage/in_memory_storage.js.map +1 -1
- package/dist/src/storage/lucid_storage.d.ts +16 -6
- package/dist/src/storage/lucid_storage.d.ts.map +1 -1
- package/dist/src/storage/lucid_storage.js +102 -35
- package/dist/src/storage/lucid_storage.js.map +1 -1
- package/dist/src/storage/shared.d.ts +17 -0
- package/dist/src/storage/shared.d.ts.map +1 -0
- package/dist/src/storage/shared.js +21 -0
- package/dist/src/storage/shared.js.map +1 -0
- package/dist/src/types.d.ts +17 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/stubs/collaboration/migrations/collab_comments.stub +4 -4
- package/dist/stubs/collaboration/migrations/collab_documents.stub +5 -5
- package/dist/stubs/collaboration/migrations/collab_versions.stub +9 -7
- package/package.json +19 -14
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { assertPruneKeep, versionsToPrune } from './shared.js';
|
|
2
|
+
/** Ids deleted per statement by `pruneVersions` — keeps the IN (...) sane. */
|
|
3
|
+
const PRUNE_BATCH_SIZE = 500;
|
|
1
4
|
/**
|
|
2
5
|
* Official Lucid storage — persists docs (binary state), versions and
|
|
3
6
|
* anchored comments in tables of the app's database.
|
|
@@ -10,12 +13,13 @@
|
|
|
10
13
|
* const manager = new CollaborationManager({ engine: 'yjs', storage, authorize })
|
|
11
14
|
*/
|
|
12
15
|
export class LucidStorage {
|
|
13
|
-
db;
|
|
14
16
|
connection;
|
|
15
17
|
ready = null;
|
|
16
|
-
constructor(db, connection
|
|
17
|
-
this.db = db;
|
|
18
|
+
constructor(db, connection) {
|
|
18
19
|
this.connection = connection;
|
|
20
|
+
// Tests pass a real or mocked db instance; if so, bypass lazy import.
|
|
21
|
+
if (db)
|
|
22
|
+
LucidStorage._db = db;
|
|
19
23
|
}
|
|
20
24
|
/** Ensures the tables lazily on demand — boot doesn't touch the database. */
|
|
21
25
|
ensure() {
|
|
@@ -24,12 +28,20 @@ export class LucidStorage {
|
|
|
24
28
|
}
|
|
25
29
|
return this.ready;
|
|
26
30
|
}
|
|
31
|
+
static _db = null;
|
|
27
32
|
/** The lucid connection is a Knex instance (QueryClientContract extends the builder). */
|
|
28
|
-
knex() {
|
|
29
|
-
|
|
33
|
+
async knex() {
|
|
34
|
+
if (!LucidStorage._db) {
|
|
35
|
+
// Dynamic import em vez de static: o dbFacade do Lucid é *undefined* se
|
|
36
|
+
// importado na eval do módulo (antes do provider do Lucid bootar). O
|
|
37
|
+
// import dinâmico resolve no primeiro uso, quando o app já está bootado.
|
|
38
|
+
const mod = await import('@adonisjs/lucid/services/db');
|
|
39
|
+
LucidStorage._db = mod.default;
|
|
40
|
+
}
|
|
41
|
+
return LucidStorage._db.connection(this.connection);
|
|
30
42
|
}
|
|
31
43
|
async ensureSchema() {
|
|
32
|
-
const knex = this.knex();
|
|
44
|
+
const knex = await this.knex();
|
|
33
45
|
const schema = knex.schema.createTableIfNotExists('collab_documents', (t) => {
|
|
34
46
|
t.string('doc_name').primary();
|
|
35
47
|
t.binary('state');
|
|
@@ -43,6 +55,9 @@ export class LucidStorage {
|
|
|
43
55
|
t.string('created_by').nullable();
|
|
44
56
|
t.string('label').nullable();
|
|
45
57
|
t.integer('seq');
|
|
58
|
+
// The document's bytes at the moment the version was created — without
|
|
59
|
+
// it a restore would replay the CURRENT state, which is a no-op.
|
|
60
|
+
t.binary('snapshot').nullable();
|
|
46
61
|
t.timestamp('created_at', { useTz: true });
|
|
47
62
|
t.primary(['doc_name', 'id']);
|
|
48
63
|
});
|
|
@@ -59,29 +74,40 @@ export class LucidStorage {
|
|
|
59
74
|
t.timestamp('updated_at', { useTz: true }).nullable();
|
|
60
75
|
t.index(['doc_name', 'space']);
|
|
61
76
|
});
|
|
62
|
-
|
|
77
|
+
// `createTableIfNotExists` skips the CREATE TABLE when the table is there
|
|
78
|
+
// but still emits its CREATE INDEX as a separate statement — which fails
|
|
79
|
+
// ("relation already exists") for an app that ran the published
|
|
80
|
+
// migrations. So only the builders for missing tables are executed; knex
|
|
81
|
+
// builders are lazy, nothing runs until they are awaited.
|
|
82
|
+
const present = await Promise.all([
|
|
83
|
+
knex.schema.hasTable('collab_documents'),
|
|
84
|
+
knex.schema.hasTable('collab_versions'),
|
|
85
|
+
knex.schema.hasTable('collab_comments'),
|
|
86
|
+
]);
|
|
87
|
+
await Promise.all([schema, versions, comments].filter((_, index) => !present[index]));
|
|
63
88
|
}
|
|
64
89
|
async loadDocument(docName) {
|
|
65
90
|
await this.ensure();
|
|
66
|
-
const row = await this.knex().from('collab_documents').where('doc_name', docName).first();
|
|
91
|
+
const row = await (await this.knex()).from('collab_documents').where('doc_name', docName).first();
|
|
67
92
|
if (!row?.state)
|
|
68
93
|
return null;
|
|
69
94
|
return { state: new Uint8Array(row.state) };
|
|
70
95
|
}
|
|
71
96
|
async saveDocument(docName, state, meta) {
|
|
72
97
|
await this.ensure();
|
|
73
|
-
const
|
|
98
|
+
const knex = await this.knex();
|
|
99
|
+
const existing = await knex.from('collab_documents').where('doc_name', docName).first();
|
|
74
100
|
const payload = {
|
|
75
101
|
state: Buffer.from(state),
|
|
76
102
|
meta: meta ?? null,
|
|
77
103
|
updated_at: new Date(),
|
|
78
104
|
};
|
|
79
105
|
if (existing) {
|
|
80
|
-
await
|
|
106
|
+
await knex.from('collab_documents').where('doc_name', docName).update(payload);
|
|
81
107
|
}
|
|
82
108
|
else {
|
|
83
|
-
await
|
|
84
|
-
.
|
|
109
|
+
await knex
|
|
110
|
+
.table('collab_documents')
|
|
85
111
|
.insert({
|
|
86
112
|
doc_name: docName,
|
|
87
113
|
...payload,
|
|
@@ -91,7 +117,8 @@ export class LucidStorage {
|
|
|
91
117
|
}
|
|
92
118
|
async listVersions(docName) {
|
|
93
119
|
await this.ensure();
|
|
94
|
-
const
|
|
120
|
+
const knex = await this.knex();
|
|
121
|
+
const rows = await knex
|
|
95
122
|
.from('collab_versions')
|
|
96
123
|
.where('doc_name', docName)
|
|
97
124
|
.orderBy('seq', 'asc');
|
|
@@ -103,28 +130,73 @@ export class LucidStorage {
|
|
|
103
130
|
createdAt: row.created_at?.toISOString?.() ?? String(row.created_at),
|
|
104
131
|
}));
|
|
105
132
|
}
|
|
106
|
-
async saveVersion(docName, version,
|
|
133
|
+
async saveVersion(docName, version, snapshot) {
|
|
107
134
|
await this.ensure();
|
|
108
|
-
await this.knex()
|
|
109
|
-
.
|
|
135
|
+
await (await this.knex())
|
|
136
|
+
.table('collab_versions')
|
|
110
137
|
.insert({
|
|
111
138
|
doc_name: docName,
|
|
112
139
|
id: version.id,
|
|
113
140
|
created_by: version.createdBy,
|
|
114
141
|
label: version.label,
|
|
115
142
|
seq: version.seq,
|
|
143
|
+
snapshot: Buffer.from(snapshot),
|
|
116
144
|
created_at: new Date(version.createdAt),
|
|
117
145
|
})
|
|
118
146
|
.onConflict(['doc_name', 'id'])
|
|
119
147
|
.ignore();
|
|
120
148
|
}
|
|
121
|
-
async loadVersionSnapshot(docName,
|
|
122
|
-
|
|
123
|
-
|
|
149
|
+
async loadVersionSnapshot(docName, versionId) {
|
|
150
|
+
await this.ensure();
|
|
151
|
+
const row = await (await this.knex())
|
|
152
|
+
.from('collab_versions')
|
|
153
|
+
.where('doc_name', docName)
|
|
154
|
+
.andWhere('id', versionId)
|
|
155
|
+
.first();
|
|
156
|
+
if (!row)
|
|
157
|
+
return null;
|
|
158
|
+
if (!row.snapshot)
|
|
159
|
+
return (await this.loadDocument(docName))?.state ?? null;
|
|
160
|
+
return new Uint8Array(row.snapshot);
|
|
161
|
+
}
|
|
162
|
+
async pruneVersions({ keep, docName, dryRun }) {
|
|
163
|
+
assertPruneKeep(keep);
|
|
164
|
+
await this.ensure();
|
|
165
|
+
const knex = await this.knex();
|
|
166
|
+
let query = knex.from('collab_versions').select('doc_name', 'id', 'seq');
|
|
167
|
+
if (docName)
|
|
168
|
+
query = query.where('doc_name', docName);
|
|
169
|
+
const rows = (await query);
|
|
170
|
+
const perDocument = new Map();
|
|
171
|
+
for (const row of rows) {
|
|
172
|
+
const group = perDocument.get(row.doc_name) ?? [];
|
|
173
|
+
group.push({ id: row.id, seq: row.seq });
|
|
174
|
+
perDocument.set(row.doc_name, group);
|
|
175
|
+
}
|
|
176
|
+
let removed = 0;
|
|
177
|
+
for (const [name, versions] of perDocument) {
|
|
178
|
+
const doomed = versionsToPrune(versions, keep);
|
|
179
|
+
if (doomed.length === 0)
|
|
180
|
+
continue;
|
|
181
|
+
if (dryRun) {
|
|
182
|
+
removed += doomed.length;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
for (let index = 0; index < doomed.length; index += PRUNE_BATCH_SIZE) {
|
|
186
|
+
const batch = doomed.slice(index, index + PRUNE_BATCH_SIZE).map((version) => version.id);
|
|
187
|
+
removed += await knex
|
|
188
|
+
.from('collab_versions')
|
|
189
|
+
.where('doc_name', name)
|
|
190
|
+
.whereIn('id', batch)
|
|
191
|
+
.delete();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return removed;
|
|
124
195
|
}
|
|
125
196
|
async listComments(docName, space) {
|
|
126
197
|
await this.ensure();
|
|
127
|
-
|
|
198
|
+
const knex = await this.knex();
|
|
199
|
+
let query = knex.from('collab_comments').where('doc_name', docName);
|
|
128
200
|
if (space)
|
|
129
201
|
query = query.where('space', space);
|
|
130
202
|
const rows = await query;
|
|
@@ -143,7 +215,8 @@ export class LucidStorage {
|
|
|
143
215
|
}
|
|
144
216
|
async saveComment(docName, comment) {
|
|
145
217
|
await this.ensure();
|
|
146
|
-
const
|
|
218
|
+
const knex = await this.knex();
|
|
219
|
+
const existing = await knex.from('collab_comments').where('id', comment.id).first();
|
|
147
220
|
const payload = {
|
|
148
221
|
doc_name: comment.documentName,
|
|
149
222
|
space: comment.space,
|
|
@@ -155,11 +228,11 @@ export class LucidStorage {
|
|
|
155
228
|
updated_at: new Date(),
|
|
156
229
|
};
|
|
157
230
|
if (existing) {
|
|
158
|
-
await
|
|
231
|
+
await knex.from('collab_comments').where('id', comment.id).update(payload);
|
|
159
232
|
}
|
|
160
233
|
else {
|
|
161
|
-
await
|
|
162
|
-
.
|
|
234
|
+
await knex
|
|
235
|
+
.table('collab_comments')
|
|
163
236
|
.insert({
|
|
164
237
|
id: comment.id,
|
|
165
238
|
...payload,
|
|
@@ -170,26 +243,20 @@ export class LucidStorage {
|
|
|
170
243
|
}
|
|
171
244
|
async deleteComment(docName, commentId) {
|
|
172
245
|
await this.ensure();
|
|
173
|
-
await this.knex().from('collab_comments').where('id', commentId).delete();
|
|
246
|
+
await (await this.knex()).from('collab_comments').where('id', commentId).delete();
|
|
174
247
|
void docName;
|
|
175
248
|
}
|
|
176
249
|
}
|
|
177
250
|
/**
|
|
178
|
-
* Factory para config —
|
|
179
|
-
*
|
|
180
|
-
*
|
|
251
|
+
* Factory para config — o `LucidStorage` agora resolve o fachada do Lucid
|
|
252
|
+
* LAZY (import dinâmico no primeiro `ensure()`), então o config pode chamá-lo
|
|
253
|
+
* sem se preocupar com a ordem de boot dos providers.
|
|
181
254
|
*
|
|
182
255
|
* @example
|
|
183
256
|
* // config/collaboration.ts
|
|
184
257
|
* storage: lucidStorage({ connection: 'entretextos' })
|
|
185
258
|
*/
|
|
186
|
-
/**
|
|
187
|
-
* Síncrono de propósito: chamado no topo do config (sem await). Resolve o
|
|
188
|
-
* facade do Lucid via import estático — o app precisa de @adonisjs/lucid
|
|
189
|
-
* instalado, que é o caso quando usa lucidStorage.
|
|
190
|
-
*/
|
|
191
|
-
import dbFacade from '@adonisjs/lucid/services/db';
|
|
192
259
|
export function lucidStorage(options = {}) {
|
|
193
|
-
return new LucidStorage(
|
|
260
|
+
return new LucidStorage(undefined, options.connection);
|
|
194
261
|
}
|
|
195
262
|
//# sourceMappingURL=lucid_storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_storage.js","sourceRoot":"","sources":["../../../src/storage/lucid_storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lucid_storage.js","sourceRoot":"","sources":["../../../src/storage/lucid_storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers shared by every storage implementation. Nothing here touches a
|
|
3
|
+
* backend — it is the validation the three built-ins (and any custom storage)
|
|
4
|
+
* run before deleting anything.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Guards `pruneVersions`. `keep: 0` is a legitimate "delete every version",
|
|
8
|
+
* so the check has to reject the *accidents* instead: a negative number, a
|
|
9
|
+
* fraction, `NaN` from a mis-parsed flag. Silently treating those as zero
|
|
10
|
+
* would wipe the history the caller meant to keep.
|
|
11
|
+
*/
|
|
12
|
+
export declare function assertPruneKeep(keep: number): void;
|
|
13
|
+
/** The versions to delete: everything past the `keep` most recent ones. */
|
|
14
|
+
export declare function versionsToPrune<T extends {
|
|
15
|
+
seq: number;
|
|
16
|
+
}>(versions: T[], keep: number): T[];
|
|
17
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/storage/shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMlD;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,CAE3F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers shared by every storage implementation. Nothing here touches a
|
|
3
|
+
* backend — it is the validation the three built-ins (and any custom storage)
|
|
4
|
+
* run before deleting anything.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Guards `pruneVersions`. `keep: 0` is a legitimate "delete every version",
|
|
8
|
+
* so the check has to reject the *accidents* instead: a negative number, a
|
|
9
|
+
* fraction, `NaN` from a mis-parsed flag. Silently treating those as zero
|
|
10
|
+
* would wipe the history the caller meant to keep.
|
|
11
|
+
*/
|
|
12
|
+
export function assertPruneKeep(keep) {
|
|
13
|
+
if (!Number.isInteger(keep) || keep < 0) {
|
|
14
|
+
throw new Error(`[@adonis-agora/collaboration] pruneVersions requires \`keep\` to be a non-negative integer — received ${String(keep)}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** The versions to delete: everything past the `keep` most recent ones. */
|
|
18
|
+
export function versionsToPrune(versions, keep) {
|
|
19
|
+
return [...versions].sort((a, b) => b.seq - a.seq).slice(keep);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/storage/shared.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,yGAAyG,MAAM,CAAC,IAAI,CAAC,EAAE,CACxH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAA4B,QAAa,EAAE,IAAY;IACpF,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -107,6 +107,18 @@ export interface CollabDiffSummary {
|
|
|
107
107
|
added: number;
|
|
108
108
|
removed: number;
|
|
109
109
|
}
|
|
110
|
+
/** Options of {@link CollaborationStorage.pruneVersions}. */
|
|
111
|
+
export interface PruneVersionsOptions {
|
|
112
|
+
/**
|
|
113
|
+
* How many versions to keep **per document**. A busy document never evicts
|
|
114
|
+
* another document's history. `0` deletes every version.
|
|
115
|
+
*/
|
|
116
|
+
keep: number;
|
|
117
|
+
/** Narrows the prune to a single document. Omitted prunes every document. */
|
|
118
|
+
docName?: string;
|
|
119
|
+
/** Count what would be removed without deleting anything. */
|
|
120
|
+
dryRun?: boolean;
|
|
121
|
+
}
|
|
110
122
|
/**
|
|
111
123
|
* Persistence of documents + versions + comments. The host app implements
|
|
112
124
|
* this (database, S3...) and the library only knows the interface.
|
|
@@ -119,6 +131,11 @@ export interface CollaborationStorage {
|
|
|
119
131
|
listVersions(docName: string): Promise<CollabVersion[]>;
|
|
120
132
|
saveVersion(docName: string, version: CollabVersion, snapshot: Uint8Array): Promise<void>;
|
|
121
133
|
loadVersionSnapshot(docName: string, versionId: string): Promise<Uint8Array | null>;
|
|
134
|
+
/**
|
|
135
|
+
* Delete all but the `keep` most recent versions, per document. Returns how
|
|
136
|
+
* many versions were removed (or would be, with `dryRun`).
|
|
137
|
+
*/
|
|
138
|
+
pruneVersions(options: PruneVersionsOptions): Promise<number>;
|
|
122
139
|
/** Comments of a document (by space). */
|
|
123
140
|
listComments(docName: string, space?: string): Promise<CollabComment[]>;
|
|
124
141
|
saveComment(docName: string, comment: CollabComment): Promise<void>;
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,18 +8,18 @@ export default class extends BaseSchema {
|
|
|
8
8
|
|
|
9
9
|
async up() {
|
|
10
10
|
this.schema.createTable(this.tableName, (table) => {
|
|
11
|
-
table.
|
|
12
|
-
table.string('
|
|
11
|
+
table.string('id').primary()
|
|
12
|
+
table.string('doc_name').notNullable()
|
|
13
13
|
table.string('space').notNullable().defaultTo('text')
|
|
14
14
|
table.jsonb('anchor').notNullable()
|
|
15
15
|
table.text('body').notNullable()
|
|
16
16
|
table.string('user_id').notNullable()
|
|
17
17
|
table.string('author_name').nullable()
|
|
18
18
|
table.timestamp('resolved_at', { useTz: true }).nullable()
|
|
19
|
-
table.timestamp('created_at', { useTz: true })
|
|
19
|
+
table.timestamp('created_at', { useTz: true })
|
|
20
20
|
table.timestamp('updated_at', { useTz: true }).nullable()
|
|
21
21
|
|
|
22
|
-
table.index(['
|
|
22
|
+
table.index(['doc_name', 'space'])
|
|
23
23
|
})
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -8,12 +8,12 @@ export default class extends BaseSchema {
|
|
|
8
8
|
|
|
9
9
|
async up() {
|
|
10
10
|
this.schema.createTable(this.tableName, (table) => {
|
|
11
|
-
|
|
12
|
-
table.string('
|
|
13
|
-
table.
|
|
11
|
+
// The document name is the identity — 'researches/42/writing'.
|
|
12
|
+
table.string('doc_name').primary()
|
|
13
|
+
table.binary('state').nullable()
|
|
14
14
|
table.jsonb('meta').nullable()
|
|
15
|
-
table.timestamp('created_at', { useTz: true })
|
|
16
|
-
table.timestamp('updated_at', { useTz: true })
|
|
15
|
+
table.timestamp('created_at', { useTz: true })
|
|
16
|
+
table.timestamp('updated_at', { useTz: true })
|
|
17
17
|
})
|
|
18
18
|
}
|
|
19
19
|
|
|
@@ -8,15 +8,17 @@ export default class extends BaseSchema {
|
|
|
8
8
|
|
|
9
9
|
async up() {
|
|
10
10
|
this.schema.createTable(this.tableName, (table) => {
|
|
11
|
-
table.
|
|
12
|
-
table.string('
|
|
13
|
-
table.integer('seq').notNullable()
|
|
14
|
-
table.string('label').nullable()
|
|
11
|
+
table.string('doc_name').notNullable()
|
|
12
|
+
table.string('id').notNullable()
|
|
15
13
|
table.string('created_by').nullable()
|
|
16
|
-
table.
|
|
17
|
-
table.
|
|
14
|
+
table.string('label').nullable()
|
|
15
|
+
table.integer('seq').notNullable()
|
|
16
|
+
// The document's bytes at the moment the version was created.
|
|
17
|
+
table.binary('snapshot').nullable()
|
|
18
|
+
table.timestamp('created_at', { useTz: true })
|
|
18
19
|
|
|
19
|
-
table.
|
|
20
|
+
table.primary(['doc_name', 'id'])
|
|
21
|
+
table.index(['doc_name', 'seq'])
|
|
20
22
|
})
|
|
21
23
|
}
|
|
22
24
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adonis-agora/collaboration",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Collaborative editing (CRDT) for AdonisJS 7 — Yjs (Hocuspocus) and Automerge drivers, Redis-backed presence, unified version control. Part of the Agora ecosystem.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -85,17 +85,6 @@
|
|
|
85
85
|
"CHANGELOG.md"
|
|
86
86
|
],
|
|
87
87
|
"sideEffects": false,
|
|
88
|
-
"scripts": {
|
|
89
|
-
"build": "pnpm run clean && tsc -p tsconfig.build.json && pnpm run build:commands && pnpm run copy:stubs",
|
|
90
|
-
"check:dist": "node ../../scripts/assert-build-output.mjs dist src/index.js",
|
|
91
|
-
"clean": "rm -rf dist",
|
|
92
|
-
"build:commands": "node ./scripts/build-commands.mjs",
|
|
93
|
-
"copy:stubs": "mkdir -p dist/stubs/config dist/stubs/partykit/worker dist/stubs/collaboration/migrations && cp stubs/main.ts dist/stubs/main.js && cp stubs/config/collaboration.stub dist/stubs/config/collaboration.stub && cp stubs/partykit/worker/*.stub dist/stubs/partykit/worker/ && cp stubs/collaboration/*.stub dist/stubs/collaboration/ && cp stubs/collaboration/migrations/*.stub dist/stubs/collaboration/migrations/",
|
|
94
|
-
"prepack": "pnpm run check:dist",
|
|
95
|
-
"test": "vitest run --passWithNoTests",
|
|
96
|
-
"test:watch": "vitest",
|
|
97
|
-
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
98
|
-
},
|
|
99
88
|
"dependencies": {
|
|
100
89
|
"@automerge/automerge": "^3.4.1",
|
|
101
90
|
"@hocuspocus/server": "^4.6.0",
|
|
@@ -122,8 +111,13 @@
|
|
|
122
111
|
"@adonisjs/core": "7.5.0",
|
|
123
112
|
"@adonisjs/lucid": "22.4.2",
|
|
124
113
|
"@swc/core": "1.15.47",
|
|
114
|
+
"@testcontainers/postgresql": "^12.1.0",
|
|
115
|
+
"@types/luxon": "^3.7.5",
|
|
125
116
|
"@types/node": "22.20.1",
|
|
117
|
+
"@types/pg": "^8.23.1",
|
|
126
118
|
"@types/ws": "8.18.1",
|
|
119
|
+
"luxon": "^3.7.2",
|
|
120
|
+
"pg": "^8.23.0",
|
|
127
121
|
"typescript": "5.9.3",
|
|
128
122
|
"unplugin-swc": "1.5.11",
|
|
129
123
|
"vitest": "3.2.7"
|
|
@@ -141,5 +135,16 @@
|
|
|
141
135
|
"websocket",
|
|
142
136
|
"realtime",
|
|
143
137
|
"agora"
|
|
144
|
-
]
|
|
145
|
-
|
|
138
|
+
],
|
|
139
|
+
"scripts": {
|
|
140
|
+
"build": "pnpm run clean && tsc -p tsconfig.build.json && pnpm run build:commands && pnpm run copy:stubs",
|
|
141
|
+
"check:dist": "node ../../scripts/assert-build-output.mjs dist src/index.js",
|
|
142
|
+
"clean": "rm -rf dist",
|
|
143
|
+
"build:commands": "node ./scripts/build-commands.mjs",
|
|
144
|
+
"copy:stubs": "mkdir -p dist/stubs/config dist/stubs/partykit/worker dist/stubs/collaboration/migrations && cp stubs/main.ts dist/stubs/main.js && cp stubs/config/collaboration.stub dist/stubs/config/collaboration.stub && cp stubs/partykit/worker/*.stub dist/stubs/partykit/worker/ && cp stubs/collaboration/*.stub dist/stubs/collaboration/ && cp stubs/collaboration/migrations/*.stub dist/stubs/collaboration/migrations/",
|
|
145
|
+
"test": "vitest run --passWithNoTests",
|
|
146
|
+
"test:integration": "vitest run -c vitest.integration.config.ts",
|
|
147
|
+
"test:watch": "vitest",
|
|
148
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
149
|
+
}
|
|
150
|
+
}
|