@adonis-agora/collaboration 0.12.0 → 0.14.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +164 -0
  2. package/dist/providers/collaboration_provider.d.ts.map +1 -1
  3. package/dist/providers/collaboration_provider.js +4 -0
  4. package/dist/providers/collaboration_provider.js.map +1 -1
  5. package/dist/src/auth/secret.d.ts +48 -0
  6. package/dist/src/auth/secret.d.ts.map +1 -0
  7. package/dist/src/auth/secret.js +95 -0
  8. package/dist/src/auth/secret.js.map +1 -0
  9. package/dist/src/auth/token.d.ts +111 -14
  10. package/dist/src/auth/token.d.ts.map +1 -1
  11. package/dist/src/auth/token.js +95 -14
  12. package/dist/src/auth/token.js.map +1 -1
  13. package/dist/src/collaboration_manager.d.ts +75 -2
  14. package/dist/src/collaboration_manager.d.ts.map +1 -1
  15. package/dist/src/collaboration_manager.js +128 -2
  16. package/dist/src/collaboration_manager.js.map +1 -1
  17. package/dist/src/define_config.d.ts +5 -0
  18. package/dist/src/define_config.d.ts.map +1 -1
  19. package/dist/src/define_config.js.map +1 -1
  20. package/dist/src/documents.d.ts +59 -0
  21. package/dist/src/documents.d.ts.map +1 -1
  22. package/dist/src/documents.js.map +1 -1
  23. package/dist/src/driver.d.ts +56 -3
  24. package/dist/src/driver.d.ts.map +1 -1
  25. package/dist/src/driver.js +4 -1
  26. package/dist/src/driver.js.map +1 -1
  27. package/dist/src/drivers/automerge/automerge_driver.d.ts +27 -2
  28. package/dist/src/drivers/automerge/automerge_driver.d.ts.map +1 -1
  29. package/dist/src/drivers/automerge/automerge_driver.js +107 -18
  30. package/dist/src/drivers/automerge/automerge_driver.js.map +1 -1
  31. package/dist/src/drivers/partykit/partykit_driver.d.ts +7 -2
  32. package/dist/src/drivers/partykit/partykit_driver.d.ts.map +1 -1
  33. package/dist/src/drivers/partykit/partykit_driver.js +15 -9
  34. package/dist/src/drivers/partykit/partykit_driver.js.map +1 -1
  35. package/dist/src/drivers/yjs/yjs_driver.d.ts +18 -6
  36. package/dist/src/drivers/yjs/yjs_driver.d.ts.map +1 -1
  37. package/dist/src/drivers/yjs/yjs_driver.js +170 -19
  38. package/dist/src/drivers/yjs/yjs_driver.js.map +1 -1
  39. package/dist/src/http/types.d.ts +27 -4
  40. package/dist/src/http/types.d.ts.map +1 -1
  41. package/dist/src/http/types.js.map +1 -1
  42. package/dist/src/index.d.ts +7 -4
  43. package/dist/src/index.d.ts.map +1 -1
  44. package/dist/src/index.js +4 -2
  45. package/dist/src/index.js.map +1 -1
  46. package/dist/src/routes.d.ts +74 -2
  47. package/dist/src/routes.d.ts.map +1 -1
  48. package/dist/src/routes.js +166 -14
  49. package/dist/src/routes.js.map +1 -1
  50. package/dist/src/services/comment_service.d.ts +2 -2
  51. package/dist/src/services/comment_service.d.ts.map +1 -1
  52. package/dist/src/services/comment_service.js +2 -2
  53. package/dist/src/services/comment_service.js.map +1 -1
  54. package/dist/src/storage/file_system_storage.d.ts +3 -3
  55. package/dist/src/storage/file_system_storage.d.ts.map +1 -1
  56. package/dist/src/storage/file_system_storage.js +13 -4
  57. package/dist/src/storage/file_system_storage.js.map +1 -1
  58. package/dist/src/storage/in_memory_storage.d.ts +3 -3
  59. package/dist/src/storage/in_memory_storage.d.ts.map +1 -1
  60. package/dist/src/storage/in_memory_storage.js +14 -5
  61. package/dist/src/storage/in_memory_storage.js.map +1 -1
  62. package/dist/src/storage/lucid_storage.d.ts +3 -3
  63. package/dist/src/storage/lucid_storage.d.ts.map +1 -1
  64. package/dist/src/storage/lucid_storage.js +48 -33
  65. package/dist/src/storage/lucid_storage.js.map +1 -1
  66. package/dist/src/storage/shared.d.ts +17 -0
  67. package/dist/src/storage/shared.d.ts.map +1 -1
  68. package/dist/src/storage/shared.js +29 -0
  69. package/dist/src/storage/shared.js.map +1 -1
  70. package/dist/src/types.d.ts +72 -3
  71. package/dist/src/types.d.ts.map +1 -1
  72. package/dist/stubs/config/collaboration.stub +8 -0
  73. package/dist/stubs/partykit/worker/party.ts.stub +35 -4
  74. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { assertPruneKeep, versionsToPrune } from './shared.js';
1
+ import { assertPruneKeep, clampLimit, clampOffset, versionsToPrune } from './shared.js';
2
2
  /** Ids deleted per statement by `pruneVersions` — keeps the IN (...) sane. */
3
3
  const PRUNE_BATCH_SIZE = 500;
4
4
  /**
@@ -99,30 +99,37 @@ export class LucidStorage {
99
99
  async saveDocument(docName, state, meta) {
100
100
  await this.ensure();
101
101
  const knex = await this.knex();
102
- const existing = await knex.from('collab_documents').where('doc_name', docName).first();
103
- const payload = {
102
+ const now = new Date();
103
+ // Single upsert instead of a SELECT to decide insert-vs-update: the old
104
+ // shape ran two round-trips per save, on every debounce flush of every
105
+ // actively-edited document. `doc_name` is the table's primary key (see
106
+ // `ensureSchema`/the published migration), so it is the only possible
107
+ // conflict target. `created_at` is deliberately left out of `.merge()` —
108
+ // an update must not look like the row was created just now.
109
+ await knex
110
+ .table('collab_documents')
111
+ .insert({
112
+ doc_name: docName,
104
113
  state: Buffer.from(state),
105
114
  meta: meta ?? null,
106
- updated_at: new Date(),
107
- };
108
- if (existing) {
109
- await knex.from('collab_documents').where('doc_name', docName).update(payload);
110
- }
111
- else {
112
- await knex.table('collab_documents').insert({
113
- doc_name: docName,
114
- ...payload,
115
- created_at: new Date(),
116
- });
117
- }
115
+ created_at: now,
116
+ updated_at: now,
117
+ })
118
+ .onConflict('doc_name')
119
+ .merge(['state', 'meta', 'updated_at']);
118
120
  }
119
- async listVersions(docName) {
121
+ async listVersions(docName, page) {
120
122
  await this.ensure();
121
123
  const knex = await this.knex();
122
- const rows = await knex
123
- .from('collab_versions')
124
- .where('doc_name', docName)
125
- .orderBy('seq', 'asc');
124
+ let query = knex.from('collab_versions').where('doc_name', docName).orderBy('seq', 'asc');
125
+ // `page` is opt-in: internal callers computing the next `seq` or a
126
+ // restore target need every version, and only pass none. The HTTP route
127
+ // always passes one, which is what keeps a long history from coming back
128
+ // as one ever-growing JSON array.
129
+ if (page) {
130
+ query = query.limit(clampLimit(page.limit)).offset(clampOffset(page.offset));
131
+ }
132
+ const rows = await query;
126
133
  return rows.map((row) => ({
127
134
  id: row.id,
128
135
  createdBy: row.created_by ?? null,
@@ -194,12 +201,19 @@ export class LucidStorage {
194
201
  }
195
202
  return removed;
196
203
  }
197
- async listComments(docName, space) {
204
+ async listComments(docName, space, page) {
198
205
  await this.ensure();
199
206
  const knex = await this.knex();
200
- let query = knex.from('collab_comments').where('doc_name', docName);
207
+ let query = knex
208
+ .from('collab_comments')
209
+ .where('doc_name', docName)
210
+ .orderBy('created_at', 'asc');
201
211
  if (space)
202
212
  query = query.where('space', space);
213
+ // Same opt-in pagination as `listVersions` — see the comment there.
214
+ if (page) {
215
+ query = query.limit(clampLimit(page.limit)).offset(clampOffset(page.offset));
216
+ }
203
217
  const rows = await query;
204
218
  return rows.map((row) => this.toComment(row));
205
219
  }
@@ -241,7 +255,6 @@ export class LucidStorage {
241
255
  async saveComment(docName, comment) {
242
256
  await this.ensure();
243
257
  const knex = await this.knex();
244
- const existing = await knex.from('collab_comments').where('id', comment.id).first();
245
258
  const payload = {
246
259
  doc_name: comment.documentName,
247
260
  space: comment.space,
@@ -252,16 +265,18 @@ export class LucidStorage {
252
265
  resolved_at: comment.resolvedAt ? new Date(comment.resolvedAt) : null,
253
266
  updated_at: new Date(),
254
267
  };
255
- if (existing) {
256
- await knex.from('collab_comments').where('id', comment.id).update(payload);
257
- }
258
- else {
259
- await knex.table('collab_comments').insert({
260
- id: comment.id,
261
- ...payload,
262
- created_at: new Date(comment.createdAt),
263
- });
264
- }
268
+ // Same single-upsert shape as `saveDocument` — `id` is the table's primary
269
+ // key, and `created_at` is excluded from `.merge()` so an edit does not
270
+ // reset when the comment was created.
271
+ await knex
272
+ .table('collab_comments')
273
+ .insert({
274
+ id: comment.id,
275
+ ...payload,
276
+ created_at: new Date(comment.createdAt),
277
+ })
278
+ .onConflict('id')
279
+ .merge(Object.keys(payload));
265
280
  void docName;
266
281
  }
267
282
  async deleteComment(docName, commentId) {
@@ -1 +1 @@
1
- {"version":3,"file":"lucid_storage.js","sourceRoot":"","sources":["../../../src/storage/lucid_storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lucid_storage.js","sourceRoot":"","sources":["../../../src/storage/lucid_storage.ts"],"names":[],"mappings":"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"}
@@ -14,4 +14,21 @@ export declare function assertPruneKeep(keep: number): void;
14
14
  export declare function versionsToPrune<T extends {
15
15
  seq: number;
16
16
  }>(versions: T[], keep: number): T[];
17
+ /**
18
+ * Shared paging bounds for {@link import('../types.js').ListPageOptions}.
19
+ *
20
+ * Every storage implementation clamps through these rather than picking its
21
+ * own numbers — a page size that differs between `LucidStorage` and
22
+ * `InMemoryCollaborationStorage` turns "it works in the tests" into a claim
23
+ * about the wrong store. Mirrors the convention already used for billing
24
+ * lists in `@adonis-agora/payments` (`BILLING_LIST_DEFAULT_LIMIT`/`_MAX_LIMIT`).
25
+ */
26
+ /** Rows returned when a page is requested with no particular size. */
27
+ export declare const COLLAB_LIST_DEFAULT_LIMIT = 50;
28
+ /** Hard ceiling — an unbounded `limit` from a query string must not be able to select the table. */
29
+ export declare const COLLAB_LIST_MAX_LIMIT = 200;
30
+ /** Clamp a requested page size into `1..COLLAB_LIST_MAX_LIMIT`, defaulting when absent/invalid. */
31
+ export declare function clampLimit(limit: number | undefined): number;
32
+ /** Clamp a requested offset to a non-negative integer, defaulting to `0`. */
33
+ export declare function clampOffset(offset: number | undefined): number;
17
34
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +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"}
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;AAED;;;;;;;;GAQG;AAEH,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,oGAAoG;AACpG,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,mGAAmG;AACnG,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK5D;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI9D"}
@@ -18,4 +18,33 @@ export function assertPruneKeep(keep) {
18
18
  export function versionsToPrune(versions, keep) {
19
19
  return [...versions].sort((a, b) => b.seq - a.seq).slice(keep);
20
20
  }
21
+ /**
22
+ * Shared paging bounds for {@link import('../types.js').ListPageOptions}.
23
+ *
24
+ * Every storage implementation clamps through these rather than picking its
25
+ * own numbers — a page size that differs between `LucidStorage` and
26
+ * `InMemoryCollaborationStorage` turns "it works in the tests" into a claim
27
+ * about the wrong store. Mirrors the convention already used for billing
28
+ * lists in `@adonis-agora/payments` (`BILLING_LIST_DEFAULT_LIMIT`/`_MAX_LIMIT`).
29
+ */
30
+ /** Rows returned when a page is requested with no particular size. */
31
+ export const COLLAB_LIST_DEFAULT_LIMIT = 50;
32
+ /** Hard ceiling — an unbounded `limit` from a query string must not be able to select the table. */
33
+ export const COLLAB_LIST_MAX_LIMIT = 200;
34
+ /** Clamp a requested page size into `1..COLLAB_LIST_MAX_LIMIT`, defaulting when absent/invalid. */
35
+ export function clampLimit(limit) {
36
+ if (limit === undefined || !Number.isFinite(limit))
37
+ return COLLAB_LIST_DEFAULT_LIMIT;
38
+ const floored = Math.floor(limit);
39
+ if (floored < 1)
40
+ return COLLAB_LIST_DEFAULT_LIMIT;
41
+ return Math.min(floored, COLLAB_LIST_MAX_LIMIT);
42
+ }
43
+ /** Clamp a requested offset to a non-negative integer, defaulting to `0`. */
44
+ export function clampOffset(offset) {
45
+ if (offset === undefined || !Number.isFinite(offset))
46
+ return 0;
47
+ const floored = Math.floor(offset);
48
+ return floored < 0 ? 0 : floored;
49
+ }
21
50
  //# sourceMappingURL=shared.js.map
@@ -1 +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"}
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;AAED;;;;;;;;GAQG;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C,oGAAoG;AACpG,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,mGAAmG;AACnG,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,yBAAyB,CAAC;IACrF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,yBAAyB,CAAC;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;AAClD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,MAA0B;IACpD,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACnC,CAAC"}
@@ -92,6 +92,37 @@ export interface LoadedCollabDocument {
92
92
  /** State vector for differential sync (Yjs: state vector; Automerge: heads). */
93
93
  vector: Uint8Array;
94
94
  }
95
+ /**
96
+ * Why {@link CollaborationManager.withLiveDocument} had no document to run on.
97
+ *
98
+ * The two are different operational facts and a caller that cannot tell them
99
+ * apart writes the wrong fallback: `not-loaded` is normal and temporary (open
100
+ * the document, or fall back to `getDocumentState`), while
101
+ * `engine-has-no-live-document` never changes for that document and means the
102
+ * whole approach is wrong for it.
103
+ */
104
+ export type LiveDocumentAbsence =
105
+ /** The engine keeps documents in this process, but nobody has this one open here. */
106
+ 'not-loaded'
107
+ /** The engine syncs elsewhere (PartyKit, on the edge): there is no in-process instance. */
108
+ | 'engine-has-no-live-document';
109
+ /**
110
+ * Outcome of {@link CollaborationManager.withLiveDocument} — what the callback
111
+ * returned, or why it never ran.
112
+ *
113
+ * A result, not an exception and not a bare `undefined`: "there is no live
114
+ * document" is an ordinary answer here (nobody has the document open), and a
115
+ * `T | undefined` would collapse it into a callback that legitimately returned
116
+ * `undefined`.
117
+ */
118
+ export type LiveDocumentResult<T> = {
119
+ live: true;
120
+ value: T;
121
+ } | {
122
+ live: false;
123
+ value?: undefined;
124
+ reason: LiveDocumentAbsence;
125
+ };
95
126
  /** A version registered in the document history. */
96
127
  export interface CollabVersion {
97
128
  /** Opaque reference for the driver (Yjs snapshot / Automerge hash). */
@@ -119,6 +150,22 @@ export interface PruneVersionsOptions {
119
150
  /** Count what would be removed without deleting anything. */
120
151
  dryRun?: boolean;
121
152
  }
153
+ /**
154
+ * Limit/offset pagination bounds accepted by the list-shaped storage reads
155
+ * ({@link CollaborationStorage.listVersions}, {@link CollaborationStorage.listComments}).
156
+ *
157
+ * Deliberately optional and separate from the required params: a caller that
158
+ * omits it (every internal driver call computing the next `seq` or resolving
159
+ * a restore target) gets the historical "every row" behaviour, while the HTTP
160
+ * routes — the only place an unbounded result becomes a client-facing
161
+ * problem — always pass one. Implementations should clamp the values
162
+ * themselves (see `clampLimit`/`clampOffset` in `storage/shared.js`) rather
163
+ * than trust the caller's numbers.
164
+ */
165
+ export interface ListPageOptions {
166
+ limit?: number;
167
+ offset?: number;
168
+ }
122
169
  /**
123
170
  * Persistence of documents + versions + comments. The host app implements
124
171
  * this (database, S3...) and the library only knows the interface.
@@ -128,7 +175,12 @@ export interface CollaborationStorage {
128
175
  state: Uint8Array;
129
176
  } | null>;
130
177
  saveDocument(docName: string, state: Uint8Array, meta?: Record<string, unknown>): Promise<void>;
131
- listVersions(docName: string): Promise<CollabVersion[]>;
178
+ /**
179
+ * Versions of a document, oldest first. `page` bounds the result — omit it
180
+ * to get every version (what version-numbering and restore need
181
+ * internally); the HTTP route always supplies one.
182
+ */
183
+ listVersions(docName: string, page?: ListPageOptions): Promise<CollabVersion[]>;
132
184
  saveVersion(docName: string, version: CollabVersion, snapshot: Uint8Array): Promise<void>;
133
185
  loadVersionSnapshot(docName: string, versionId: string): Promise<Uint8Array | null>;
134
186
  /**
@@ -136,8 +188,11 @@ export interface CollaborationStorage {
136
188
  * many versions were removed (or would be, with `dryRun`).
137
189
  */
138
190
  pruneVersions(options: PruneVersionsOptions): Promise<number>;
139
- /** Comments of a document (by space). */
140
- listComments(docName: string, space?: string): Promise<CollabComment[]>;
191
+ /**
192
+ * Comments of a document (by space), oldest first. `page` bounds the
193
+ * result the same way it does for {@link listVersions}.
194
+ */
195
+ listComments(docName: string, space?: string, page?: ListPageOptions): Promise<CollabComment[]>;
141
196
  /**
142
197
  * One comment by id. Optional: a storage that cannot look one up directly is
143
198
  * served by {@link CommentService.get} falling back to a filtered list — the
@@ -178,6 +233,20 @@ export interface CollaborationConfig {
178
233
  * restart the document) — the rule alone will not do it.
179
234
  */
180
235
  authorize?: (ctx: CollabConnectionContext, docName: string) => Promise<CollabPermission>;
236
+ /**
237
+ * Key that signs and verifies the self-hosted collaboration token.
238
+ *
239
+ * Optional because an AdonisJS app already has one: with nothing set here
240
+ * the library derives its key from the app's `appKey`, so the secure path
241
+ * is the path that requires no configuration. Set it to use a dedicated
242
+ * key, or when embedding the manager outside an Adonis app — a manager with
243
+ * neither refuses to issue or accept tokens rather than falling back to an
244
+ * unsigned format.
245
+ *
246
+ * Rotating it invalidates every outstanding token. Clients reconnect and
247
+ * fetch a new one, so the visible cost is one reconnect.
248
+ */
249
+ tokenSecret?: string;
181
250
  /** Redis for cross-instance presence (optional in single-instance dev). */
182
251
  redis?: {
183
252
  url: string;
@@ -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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"}
@@ -22,6 +22,14 @@ export default defineConfig({
22
22
  /** Persist debounce in ms (onStoreDocument). */
23
23
  debounce: 2000,
24
24
 
25
+ /**
26
+ * Signing key for the collaboration token (HS256, 5-minute TTL, bound to a
27
+ * single document). Omitted = derived from the app's appKey, which is what
28
+ * you want in almost every case. Set it only for a dedicated secret; with
29
+ * no key anywhere the library refuses to issue or accept tokens.
30
+ */
31
+ // tokenSecret: env.get('COLLAB_TOKEN_SECRET'),
32
+
25
33
  /**
26
34
  * Authorization per document. Return canRead/canWrite/canComment; the
27
35
  * driver drops the connection when canRead is false.
@@ -23,7 +23,20 @@ interface CollabToken {
23
23
  exp: number;
24
24
  }
25
25
 
26
- function verifyToken(token: string | null, secret: string): Promise<CollabToken | null> {
26
+ /**
27
+ * Signature + expiry + **document binding**.
28
+ *
29
+ * `expectedDocName` is not optional decoration: the room IS the document, and
30
+ * a token is issued for one document only. Without this comparison a token
31
+ * legitimately obtained for a document the caller may read would open every
32
+ * other room on the worker — the client picks the room, the server only
33
+ * checked that the signature was ours.
34
+ */
35
+ async function verifyToken(
36
+ token: string | null,
37
+ secret: string,
38
+ expectedDocName: string,
39
+ ): Promise<CollabToken | null> {
27
40
  if (!token) return null;
28
41
  const parts = token.split('.');
29
42
  if (parts.length !== 3) return null;
@@ -45,12 +58,25 @@ function verifyToken(token: string | null, secret: string): Promise<CollabToken
45
58
  try {
46
59
  const parsed = JSON.parse(Buffer.from(body, 'base64url').toString()) as CollabToken;
47
60
  if (!parsed.userId || !parsed.docName || parsed.exp * 1000 < Date.now()) return null;
61
+ if (parsed.docName !== expectedDocName) return null;
48
62
  return parsed;
49
63
  } catch {
50
64
  return null;
51
65
  }
52
66
  }
53
67
 
68
+ /**
69
+ * The room being addressed, read from the URL: `/parties/<party>/<room>`.
70
+ *
71
+ * Taken from the path rather than from the token, obviously — the whole point
72
+ * is to compare the two. Rejoined because a document name contains slashes
73
+ * (`researches/42/writing`) and travels percent-encoded in that last segment.
74
+ */
75
+ function roomFromUrl(url: string): string {
76
+ const segments = new URL(url).pathname.split('/').slice(3).filter(Boolean);
77
+ return decodeURIComponent(segments.join('/'));
78
+ }
79
+
54
80
  export default class CollabParty implements PartyServer {
55
81
  /** Doc vivo do room — populado pelo primeiro ciclo load/callback. */
56
82
  private liveDoc?: Y.Doc;
@@ -60,7 +86,7 @@ export default class CollabParty implements PartyServer {
60
86
  static async onBeforeConnect(request: PartyRequest, lobby: { context: PartyConnectionContext }) {
61
87
  const secret = lobby.context.party.env.COLLAB_JWT_SECRET as string | undefined;
62
88
  const token = new URL(request.url).searchParams.get('token');
63
- const claims = await verifyToken(token, secret ?? '');
89
+ const claims = await verifyToken(token, secret ?? '', roomFromUrl(request.url));
64
90
  if (!claims) {
65
91
  return new Response('invalid or expired token', { status: 401 });
66
92
  }
@@ -109,9 +135,14 @@ export default class CollabParty implements PartyServer {
109
135
  async onRequest(request: PartyRequest): Promise<Response> {
110
136
  const secret = this.party.env.COLLAB_JWT_SECRET as string | undefined;
111
137
  const url = new URL(request.url);
138
+ const room = this.docName;
112
139
  const claims =
113
- (await verifyToken(url.searchParams.get('token'), secret ?? '')) ??
114
- (await verifyToken(request.headers.get('authorization')?.replace(/^Bearer /, '') ?? '', secret ?? ''));
140
+ (await verifyToken(url.searchParams.get('token'), secret ?? '', room)) ??
141
+ (await verifyToken(
142
+ request.headers.get('authorization')?.replace(/^Bearer /, '') ?? '',
143
+ secret ?? '',
144
+ room,
145
+ ));
115
146
  if (!claims) {
116
147
  return new Response('unauthenticated', { status: 401 });
117
148
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonis-agora/collaboration",
3
- "version": "0.12.0",
3
+ "version": "0.14.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": {