@adonis-agora/collaboration 0.9.3 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/dist/providers/collaboration_provider.d.ts +15 -5
  3. package/dist/providers/collaboration_provider.d.ts.map +1 -1
  4. package/dist/providers/collaboration_provider.js +53 -24
  5. package/dist/providers/collaboration_provider.js.map +1 -1
  6. package/dist/src/auth/token.d.ts +20 -2
  7. package/dist/src/auth/token.d.ts.map +1 -1
  8. package/dist/src/auth/token.js +31 -8
  9. package/dist/src/auth/token.js.map +1 -1
  10. package/dist/src/codegen_init.d.ts.map +1 -1
  11. package/dist/src/codegen_init.js +11 -1
  12. package/dist/src/codegen_init.js.map +1 -1
  13. package/dist/src/collaboration_manager.d.ts.map +1 -1
  14. package/dist/src/collaboration_manager.js +4 -0
  15. package/dist/src/collaboration_manager.js.map +1 -1
  16. package/dist/src/define_config.d.ts +32 -1
  17. package/dist/src/define_config.d.ts.map +1 -1
  18. package/dist/src/define_config.js +6 -0
  19. package/dist/src/define_config.js.map +1 -1
  20. package/dist/src/drivers/automerge/automerge_driver.d.ts +7 -1
  21. package/dist/src/drivers/automerge/automerge_driver.d.ts.map +1 -1
  22. package/dist/src/drivers/automerge/automerge_driver.js +74 -11
  23. package/dist/src/drivers/automerge/automerge_driver.js.map +1 -1
  24. package/dist/src/drivers/yjs/yjs_driver.d.ts +20 -0
  25. package/dist/src/drivers/yjs/yjs_driver.d.ts.map +1 -1
  26. package/dist/src/drivers/yjs/yjs_driver.js +113 -20
  27. package/dist/src/drivers/yjs/yjs_driver.js.map +1 -1
  28. package/dist/src/http/types.d.ts +24 -1
  29. package/dist/src/http/types.d.ts.map +1 -1
  30. package/dist/src/http/types.js.map +1 -1
  31. package/dist/src/index.d.ts +4 -3
  32. package/dist/src/index.d.ts.map +1 -1
  33. package/dist/src/index.js +3 -2
  34. package/dist/src/index.js.map +1 -1
  35. package/dist/src/observability.d.ts +52 -0
  36. package/dist/src/observability.d.ts.map +1 -0
  37. package/dist/src/observability.js +50 -0
  38. package/dist/src/observability.js.map +1 -0
  39. package/dist/src/routes.d.ts +35 -5
  40. package/dist/src/routes.d.ts.map +1 -1
  41. package/dist/src/routes.js +117 -26
  42. package/dist/src/routes.js.map +1 -1
  43. package/dist/src/services/comment_service.d.ts +9 -0
  44. package/dist/src/services/comment_service.d.ts.map +1 -1
  45. package/dist/src/services/comment_service.js +17 -4
  46. package/dist/src/services/comment_service.js.map +1 -1
  47. package/dist/src/storage/lucid_storage.d.ts +7 -0
  48. package/dist/src/storage/lucid_storage.d.ts.map +1 -1
  49. package/dist/src/storage/lucid_storage.js +34 -11
  50. package/dist/src/storage/lucid_storage.js.map +1 -1
  51. package/dist/src/types.d.ts +14 -4
  52. package/dist/src/types.d.ts.map +1 -1
  53. package/dist/src/versioning.d.ts +6 -0
  54. package/dist/src/versioning.d.ts.map +1 -1
  55. package/dist/src/versioning.js +10 -0
  56. package/dist/src/versioning.js.map +1 -1
  57. package/package.json +3 -1
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.
@@ -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,GAEb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQpF,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"}
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' | 'transport';
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/observability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvE;AAED,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IAC7C,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AAExD,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,uBAAqB,CAAC;AAItD,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAE3E;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI,CAK5F;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CA8BtE"}
@@ -0,0 +1,50 @@
1
+ import { EventEmitter } from 'node:events';
2
+ /**
3
+ * Event name used on {@link collaborationEvents}.
4
+ *
5
+ * Deliberately NOT `'error'`: an EventEmitter with no listener for `'error'`
6
+ * throws, which would turn an observability hook into a second outage.
7
+ */
8
+ export const COLLAB_ERROR_EVENT = 'collaboration:error';
9
+ /** Emitter carrying {@link CollabErrorEvent} on {@link COLLAB_ERROR_EVENT}. */
10
+ export const collaborationEvents = new EventEmitter();
11
+ let logger;
12
+ /** Installs the logger every report is written to (the provider calls this). */
13
+ export function setCollaborationLogger(next) {
14
+ logger = next;
15
+ }
16
+ /** Subscribes to failures; returns an unsubscribe function. */
17
+ export function onCollaborationError(listener) {
18
+ collaborationEvents.on(COLLAB_ERROR_EVENT, listener);
19
+ return () => {
20
+ collaborationEvents.off(COLLAB_ERROR_EVENT, listener);
21
+ };
22
+ }
23
+ /** Reports a failure to the logger and/or the event stream. Never throws. */
24
+ export function reportCollaborationError(event) {
25
+ const where = event.docName ? ` for document "${event.docName}"` : '';
26
+ const message = `[@adonis-agora/collaboration] ${event.scope}.${event.operation} failed${where}`;
27
+ if (logger) {
28
+ try {
29
+ logger.error({
30
+ err: event.error,
31
+ scope: event.scope,
32
+ operation: event.operation,
33
+ ...(event.docName ? { docName: event.docName } : {}),
34
+ }, message);
35
+ }
36
+ catch {
37
+ // A broken logger must not escalate into a second failure.
38
+ }
39
+ }
40
+ const hasListener = collaborationEvents.listenerCount(COLLAB_ERROR_EVENT) > 0;
41
+ if (hasListener) {
42
+ collaborationEvents.emit(COLLAB_ERROR_EVENT, event);
43
+ return;
44
+ }
45
+ if (!logger) {
46
+ // Neither sink configured — still better than silence.
47
+ console.error(message, event.error);
48
+ }
49
+ }
50
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../../src/observability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwC3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAExD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,YAAY,EAAE,CAAC;AAEtD,IAAI,MAAgC,CAAC;AAErC,gFAAgF;AAChF,MAAM,UAAU,sBAAsB,CAAC,IAA8B;IACnE,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,oBAAoB,CAAC,QAA2C;IAC9E,mBAAmB,CAAC,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IACrD,OAAO,GAAG,EAAE;QACV,mBAAmB,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CAAC,KAAuB;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,iCAAiC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,UAAU,KAAK,EAAE,CAAC;IAEjG,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CACV;gBACE,GAAG,EAAE,KAAK,CAAC,KAAK;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD,EACD,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC9E,IAAI,WAAW,EAAE,CAAC;QAChB,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,uDAAuD;QACvD,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
@@ -1,6 +1,24 @@
1
1
  import { type CollabManagerLike, type CollabRoutesRuntime } from './http/types.js';
2
+ import type { CollabPermission } from './types.js';
2
3
  /** Timing-safe comparison for shared secrets. */
3
4
  export declare function secretsMatch(received: string | undefined, expected: string | undefined): boolean;
5
+ /**
6
+ * Who may resolve or delete an existing comment.
7
+ *
8
+ * `canComment` is permission to *add* an annotation — it is not permission to
9
+ * silence someone else's. The rule, stated once so it can be tested once:
10
+ *
11
+ * - the **author** may always resolve or delete their own comment;
12
+ * - anyone else needs the elevated capability on the document (`canWrite`) —
13
+ * an editor moderating a thread, not a fellow commenter.
14
+ */
15
+ export declare function canMutateComment(input: {
16
+ comment: {
17
+ userId?: string | null;
18
+ } | null | undefined;
19
+ userId: string;
20
+ permission: CollabPermission;
21
+ }): boolean;
4
22
  /** Minimal structural contract satisfied by the Adonis Router. */
5
23
  export interface CollabRouteGroupContract {
6
24
  prefix(prefix: string): this;
@@ -16,14 +34,26 @@ export interface CollaborationRouterContract {
16
34
  /**
17
35
  * Registers every collaboration REST endpoint under an optional prefix
18
36
  * (default `/collaboration`).
37
+ *
38
+ * **Synchronous on purpose.** `RouteGroup` closes as soon as its callback
39
+ * returns, so anything registered after an `await` lands outside the group —
40
+ * which made it impossible to wrap these routes in an app's own middleware.
41
+ * Everything that needs the booted app is resolved at request time instead.
19
42
  */
20
- export declare function collaborationRoutes(router: CollaborationRouterContract, options: CollabRoutesRuntime & {
43
+ export declare function collaborationRoutes(router: CollaborationRouterContract, options?: CollabRoutesRuntime & {
21
44
  managerFallback?: () => Promise<CollabManagerLike>;
22
- }): Promise<void>;
45
+ }): void;
23
46
  /**
24
- * Default auth resolution: read `ctx.auth.user` (populated by @adonisjs/auth
25
- * when its middleware ran). Throws otherwise so unprotected deployments fail
26
- * closed with a clear message.
47
+ * Default auth resolution.
48
+ *
49
+ * Reads `ctx.auth.user` — but *authenticates first* when the auth stack has
50
+ * not run yet. With a lazily-resolving guard `ctx.auth.user` is simply
51
+ * `undefined` until something calls `check()`/`authenticate()`, which is why
52
+ * every app ended up bolting a global middleware onto a hardcoded
53
+ * `/collaboration` prefix. Here `check()` is preferred because it reports
54
+ * failure by returning `false` instead of throwing.
55
+ *
56
+ * Still fails closed: no user, no request.
27
57
  */
28
58
  export declare const defaultResolveUser: NonNullable<CollabRoutesRuntime['resolveUser']>;
29
59
  //# sourceMappingURL=routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAEzB,MAAM,iBAAiB,CAAC;AA0FzB,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAKhG;AAkQD,kEAAkE;AAClE,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,wBAAwB,CAAC;IACtD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAClD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CACpD;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,2BAA2B,EACnC,OAAO,EAAE,mBAAmB,GAAG;IAAE,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;CAAE,GACpF,OAAO,CAAC,IAAI,CAAC,CAoCf;AAcD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAQ9E,CAAC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAEzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuInD,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAKhG;AAID;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,gBAAgB,CAAC;CAC9B,GAAG,OAAO,CAIV;AAsSD,kEAAkE;AAClE,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,wBAAwB,CAAC;IACtD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAClD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CACpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,2BAA2B,EACnC,OAAO,GAAE,mBAAmB,GAAG;IAAE,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;CAAO,GACzF,IAAI,CAoCN;AAcD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,CA8B9E,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { createHmac, timingSafeEqual } from 'node:crypto';
2
2
  import { CollabForbiddenError, issueToken } from './auth/token.js';
3
3
  import { CollabUnauthorizedError, } from './http/types.js';
4
+ /** The permission granted when nothing anywhere declares a rule. */
5
+ const DENY_ALL = { canRead: false, canWrite: false, canComment: false };
4
6
  let cachedAppConfig;
5
7
  async function readAppConfig() {
6
8
  if (cachedAppConfig)
@@ -15,8 +17,13 @@ async function readAppConfig() {
15
17
  }
16
18
  return cachedAppConfig;
17
19
  }
18
- async function resolveRuntime(options, managerFallback) {
19
- const appConfig = (await readAppConfig());
20
+ /**
21
+ * Builds the runtime **synchronously** — every value that needs the booted
22
+ * app is read on first request instead of at registration time. That is what
23
+ * lets `collaborationRoutes` stay synchronous and therefore composable inside
24
+ * `router.group()`.
25
+ */
26
+ function resolveRuntime(options, managerFallback) {
20
27
  const managerFn = () => {
21
28
  const provided = options.manager;
22
29
  if (provided) {
@@ -29,14 +36,33 @@ async function resolveRuntime(options, managerFallback) {
29
36
  // Default: booted container singleton via services/main.
30
37
  return import('./services/main.js').then((module) => module.default.current);
31
38
  };
32
- const appPartykit = appConfig.partykit;
33
- return {
34
- engine: options.engine ?? appConfig.engine ?? 'yjs',
35
- path: options.path ?? appConfig.path ?? '/collaboration',
36
- partykit: options.partykit ?? appPartykit ?? {},
37
- manager: managerFn,
38
- ...(options.authorize ? { authorize: options.authorize } : {}),
39
+ const settings = async () => {
40
+ const appConfig = await readAppConfig();
41
+ return {
42
+ engine: options.engine ?? appConfig.engine ?? 'yjs',
43
+ path: options.path ?? appConfig.path ?? '/collaboration',
44
+ partykit: options.partykit ?? appConfig.partykit ?? {},
45
+ };
39
46
  };
47
+ /**
48
+ * The asymmetry this closes: `authorize` used to be read from `options`
49
+ * only, so manual mode had none — and one code path then denied everything
50
+ * while another skipped the check entirely. There is exactly one resolution
51
+ * order now, and its last step is a denial.
52
+ */
53
+ const authorize = options.authorize ??
54
+ (async (ctx, docName) => {
55
+ const manager = await managerFn().catch(() => undefined);
56
+ if (manager && typeof manager.authorize === 'function') {
57
+ return manager.authorize(ctx, docName);
58
+ }
59
+ const appConfig = await readAppConfig();
60
+ if (typeof appConfig.authorize === 'function') {
61
+ return appConfig.authorize(ctx, docName);
62
+ }
63
+ return DENY_ALL;
64
+ });
65
+ return { settings, manager: managerFn, authorize };
40
66
  }
41
67
  /** Timing-safe comparison for shared secrets. */
42
68
  export function secretsMatch(received, expected) {
@@ -46,6 +72,23 @@ export function secretsMatch(received, expected) {
46
72
  return timingSafeEqual(digest(received), digest(expected));
47
73
  }
48
74
  /* ───────────────────────────── permissions ───────────────────────────── */
75
+ /**
76
+ * Who may resolve or delete an existing comment.
77
+ *
78
+ * `canComment` is permission to *add* an annotation — it is not permission to
79
+ * silence someone else's. The rule, stated once so it can be tested once:
80
+ *
81
+ * - the **author** may always resolve or delete their own comment;
82
+ * - anyone else needs the elevated capability on the document (`canWrite`) —
83
+ * an editor moderating a thread, not a fellow commenter.
84
+ */
85
+ export function canMutateComment(input) {
86
+ if (!input.comment)
87
+ return false;
88
+ if (input.comment.userId != null && String(input.comment.userId) === input.userId)
89
+ return true;
90
+ return input.permission.canWrite === true;
91
+ }
49
92
  /**
50
93
  * Resolve the caller and the permission they hold on `docName` — the same
51
94
  * `authorize` the WebSocket handshake runs, so a document's rule cannot be
@@ -72,11 +115,7 @@ async function guard(ctx, runtime, userResolver, docName, capability) {
72
115
  if (!user) {
73
116
  return { denied: ctx.response.status(401).json({ error: 'unauthenticated' }) };
74
117
  }
75
- // No authorize configured at all means the app has not written a rule yet —
76
- // fail closed rather than serving every document to every caller.
77
- const permission = runtime.authorize
78
- ? await runtime.authorize({ userId: user.id, ...(user.name ? { user: { name: user.name } } : {}) }, docName)
79
- : { canRead: false, canWrite: false, canComment: false };
118
+ const permission = await runtime.authorize({ userId: user.id, ...(user.name ? { user: { name: user.name } } : {}) }, docName);
80
119
  if (!permission[capability]) {
81
120
  return {
82
121
  denied: ctx.response
@@ -84,7 +123,7 @@ async function guard(ctx, runtime, userResolver, docName, capability) {
84
123
  .json({ error: `no ${capability} access to document "${docName}"` }),
85
124
  };
86
125
  }
87
- return { user, docName };
126
+ return { user, docName, permission };
88
127
  }
89
128
  function isDenied(result) {
90
129
  return 'denied' in result;
@@ -109,9 +148,10 @@ async function handleToken(ctx, runtime, userResolver) {
109
148
  return ctx.response.status(401).json({ error: 'unauthenticated' });
110
149
  }
111
150
  try {
151
+ const settings = await runtime.settings();
112
152
  const manager = await runtime.manager();
113
- const engine = manager.engineFor ? await manager.engineFor({ docName }) : runtime.engine;
114
- return await issueToken({ engine, path: runtime.path, partykit: runtime.partykit }, user, docName, runtime.authorize);
153
+ const engine = manager.engineFor ? await manager.engineFor({ docName }) : settings.engine;
154
+ return await issueToken({ engine, path: settings.path, partykit: settings.partykit }, user, docName, runtime.authorize);
115
155
  }
116
156
  catch (error) {
117
157
  if (error instanceof CollabForbiddenError) {
@@ -144,6 +184,24 @@ async function handleCreateComment(ctx, runtime, resolveUser) {
144
184
  authorName: body.authorName ?? allowed.user.name ?? null,
145
185
  });
146
186
  }
187
+ /**
188
+ * Loads the comment being mutated and checks {@link canMutateComment}.
189
+ * Returns the response to send when the mutation must not happen.
190
+ */
191
+ async function guardCommentMutation(ctx, manager, allowed, commentId) {
192
+ // One comment, not the document's whole comment list: this runs on every
193
+ // PATCH and DELETE, and scanning every comment to authorize one of them made
194
+ // the check grow with the discussion.
195
+ const comment = (await manager.comments.get(allowed.docName, commentId));
196
+ if (!comment) {
197
+ return { denied: ctx.response.status(404).json({ error: 'comment not found' }) };
198
+ }
199
+ if (!canMutateComment({ comment, userId: allowed.user.id, permission: allowed.permission })) {
200
+ const error = 'only the comment author, or someone who can write the document, may do that';
201
+ return { denied: ctx.response.status(403).json({ error }) };
202
+ }
203
+ return { ok: true };
204
+ }
147
205
  async function handleResolveComment(ctx, runtime, resolveUser) {
148
206
  const doc = ctx.request.qs().doc;
149
207
  const commentId = String(ctx.request.params?.id ?? '');
@@ -152,6 +210,9 @@ async function handleResolveComment(ctx, runtime, resolveUser) {
152
210
  if (isDenied(allowed))
153
211
  return allowed.denied;
154
212
  const manager = await runtime.manager();
213
+ const mutation = await guardCommentMutation(ctx, manager, allowed, commentId);
214
+ if (isDenied(mutation))
215
+ return mutation.denied;
155
216
  return manager.comments.resolve(allowed.docName, commentId, resolved);
156
217
  }
157
218
  async function handleDeleteComment(ctx, runtime, resolveUser) {
@@ -161,6 +222,9 @@ async function handleDeleteComment(ctx, runtime, resolveUser) {
161
222
  if (isDenied(allowed))
162
223
  return allowed.denied;
163
224
  const manager = await runtime.manager();
225
+ const mutation = await guardCommentMutation(ctx, manager, allowed, commentId);
226
+ if (isDenied(mutation))
227
+ return mutation.denied;
164
228
  return { deleted: await manager.comments.remove(allowed.docName, commentId) };
165
229
  }
166
230
  async function handleListVersions(ctx, runtime, resolveUser) {
@@ -211,8 +275,8 @@ async function handleSaveState(ctx, runtime) {
211
275
  if (!doc) {
212
276
  return ctx.response.status(400).json({ error: 'query param "doc" is required' });
213
277
  }
214
- const expectedSecret = runtime.partykit.jwtSecret;
215
- if (!secretsMatch(ctx.request.header('x-collab-worker-secret'), expectedSecret)) {
278
+ const { partykit } = await runtime.settings();
279
+ if (!secretsMatch(ctx.request.header('x-collab-worker-secret'), partykit.jwtSecret)) {
216
280
  return ctx.response.status(403).json({ error: 'invalid worker secret' });
217
281
  }
218
282
  const manager = await runtime.manager();
@@ -228,9 +292,14 @@ async function handleSaveState(ctx, runtime) {
228
292
  /**
229
293
  * Registers every collaboration REST endpoint under an optional prefix
230
294
  * (default `/collaboration`).
295
+ *
296
+ * **Synchronous on purpose.** `RouteGroup` closes as soon as its callback
297
+ * returns, so anything registered after an `await` lands outside the group —
298
+ * which made it impossible to wrap these routes in an app's own middleware.
299
+ * Everything that needs the booted app is resolved at request time instead.
231
300
  */
232
- export async function collaborationRoutes(router, options) {
233
- const runtime = await resolveRuntime(options, options.managerFallback);
301
+ export function collaborationRoutes(router, options = {}) {
302
+ const runtime = resolveRuntime(options, options.managerFallback);
234
303
  const resolveUser = options.resolveUser ?? defaultResolveUser;
235
304
  router
236
305
  .group(() => {
@@ -253,12 +322,34 @@ function registerRoute(router, method, pattern, handler) {
253
322
  router[method](pattern, handler);
254
323
  }
255
324
  /**
256
- * Default auth resolution: read `ctx.auth.user` (populated by @adonisjs/auth
257
- * when its middleware ran). Throws otherwise so unprotected deployments fail
258
- * closed with a clear message.
325
+ * Default auth resolution.
326
+ *
327
+ * Reads `ctx.auth.user` — but *authenticates first* when the auth stack has
328
+ * not run yet. With a lazily-resolving guard `ctx.auth.user` is simply
329
+ * `undefined` until something calls `check()`/`authenticate()`, which is why
330
+ * every app ended up bolting a global middleware onto a hardcoded
331
+ * `/collaboration` prefix. Here `check()` is preferred because it reports
332
+ * failure by returning `false` instead of throwing.
333
+ *
334
+ * Still fails closed: no user, no request.
259
335
  */
260
- export const defaultResolveUser = (ctx) => {
261
- const user = ctx.auth?.user;
336
+ export const defaultResolveUser = async (ctx) => {
337
+ const auth = ctx.auth;
338
+ if (auth && !auth.user) {
339
+ try {
340
+ if (typeof auth.check === 'function') {
341
+ await auth.check();
342
+ }
343
+ else if (typeof auth.authenticate === 'function') {
344
+ await auth.authenticate();
345
+ }
346
+ }
347
+ catch {
348
+ // A failed authentication is an absent user — reported as 401 below,
349
+ // never as a 500.
350
+ }
351
+ }
352
+ const user = auth?.user;
262
353
  if (!user || user.id === undefined || user.id === null) {
263
354
  throw new CollabUnauthorizedError('no authenticated user on context — protect these routes with your auth middleware or provide routes.resolveUser in config/collaboration.ts');
264
355
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/routes.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,15 @@ export declare class CommentService {
11
11
  private storage;
12
12
  constructor(storage: CollaborationStorage);
13
13
  list(docName: string, space?: string): Promise<CollabComment[]>;
14
+ /**
15
+ * One comment by id, without loading the document's whole comment list.
16
+ *
17
+ * The permission check on a PATCH/DELETE needs exactly one comment; doing it
18
+ * through `list()` made every mutation O(n) in the document's comments and
19
+ * grew with the discussion. Storages that can index the lookup implement
20
+ * `getComment`; the rest keep the old scan, but behind this call.
21
+ */
22
+ get(docName: string, commentId: string): Promise<CollabComment | null>;
14
23
  create(docName: string, comment: Omit<CollabComment, 'id' | 'createdAt' | 'updatedAt' | 'resolvedAt'>): Promise<CollabComment>;
15
24
  resolve(docName: string, commentId: string, resolved: boolean): Promise<CollabComment | null>;
16
25
  remove(docName: string, commentId: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"comment_service.d.ts","sourceRoot":"","sources":["../../../src/services/comment_service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEvE;;;;;;;GAOG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,oBAAoB;IAE3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAK/D,MAAM,CACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC,GAC5E,OAAO,CAAC,aAAa,CAAC;IAcnB,OAAO,CACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAc1B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAOnE"}
1
+ {"version":3,"file":"comment_service.d.ts","sourceRoot":"","sources":["../../../src/services/comment_service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEvE;;;;;;;GAOG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,oBAAoB;IAE3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAKrE;;;;;;;OAOG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAQtE,MAAM,CACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC,GAC5E,OAAO,CAAC,aAAa,CAAC;IAcnB,OAAO,CACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAa1B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAMnE"}
@@ -16,6 +16,21 @@ export class CommentService {
16
16
  const comments = await this.storage.listComments(docName, space);
17
17
  return comments.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
18
18
  }
19
+ /**
20
+ * One comment by id, without loading the document's whole comment list.
21
+ *
22
+ * The permission check on a PATCH/DELETE needs exactly one comment; doing it
23
+ * through `list()` made every mutation O(n) in the document's comments and
24
+ * grew with the discussion. Storages that can index the lookup implement
25
+ * `getComment`; the rest keep the old scan, but behind this call.
26
+ */
27
+ async get(docName, commentId) {
28
+ if (this.storage.getComment) {
29
+ return this.storage.getComment(docName, commentId);
30
+ }
31
+ const comments = await this.storage.listComments(docName);
32
+ return comments.find((comment) => comment.id === commentId) ?? null;
33
+ }
19
34
  async create(docName, comment) {
20
35
  const now = new Date().toISOString();
21
36
  const created = {
@@ -30,8 +45,7 @@ export class CommentService {
30
45
  return created;
31
46
  }
32
47
  async resolve(docName, commentId, resolved) {
33
- const comments = await this.storage.listComments(docName);
34
- const target = comments.find((comment) => comment.id === commentId);
48
+ const target = await this.get(docName, commentId);
35
49
  if (!target)
36
50
  return null;
37
51
  const updated = {
@@ -43,8 +57,7 @@ export class CommentService {
43
57
  return updated;
44
58
  }
45
59
  async remove(docName, commentId) {
46
- const comments = await this.storage.listComments(docName);
47
- const exists = comments.some((comment) => comment.id === commentId);
60
+ const exists = (await this.get(docName, commentId)) !== null;
48
61
  if (!exists)
49
62
  return false;
50
63
  await this.storage.deleteComment(docName, commentId);
@@ -1 +1 @@
1
- {"version":3,"file":"comment_service.js","sourceRoot":"","sources":["../../../src/services/comment_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,OAA6B;QAA7B,YAAO,GAAP,OAAO,CAAsB;IAAG,CAAC;IAErD,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,KAAc;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,OAAe,EACf,OAA6E;QAE7E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAkB;YAC7B,GAAG,OAAO;YACV,YAAY,EAAE,OAAO;YACrB,EAAE,EAAE,UAAU,EAAE;YAChB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAe,EACf,SAAiB,EACjB,QAAiB;QAEjB,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,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,OAAO,GAAkB;YAC7B,GAAG,MAAM;YACT,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;YACtD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,SAAiB;QAC7C,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,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
1
+ {"version":3,"file":"comment_service.js","sourceRoot":"","sources":["../../../src/services/comment_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,OAA6B;QAA7B,YAAO,GAAP,OAAO,CAAsB;IAAG,CAAC;IAErD,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,KAAc;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,SAAiB;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,OAAe,EACf,OAA6E;QAE7E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAkB;YAC7B,GAAG,OAAO;YACV,YAAY,EAAE,OAAO;YACrB,EAAE,EAAE,UAAU,EAAE;YAChB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAe,EACf,SAAiB,EACjB,QAAiB;QAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,OAAO,GAAkB;YAC7B,GAAG,MAAM;YACT,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;YACtD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,SAAiB;QAC7C,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,KAAK,IAAI,CAAC;QAC7D,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -37,6 +37,13 @@ export declare class LucidStorage implements CollaborationStorage {
37
37
  loadVersionSnapshot(docName: string, versionId: string): Promise<Uint8Array | null>;
38
38
  pruneVersions({ keep, docName, dryRun }: PruneVersionsOptions): Promise<number>;
39
39
  listComments(docName: string, space?: string): Promise<CollabComment[]>;
40
+ private toComment;
41
+ /**
42
+ * Indexed single-row lookup — the reason {@link CollaborationStorage.getComment}
43
+ * exists. The permission check on a comment mutation used to read every
44
+ * comment on the document to find one.
45
+ */
46
+ getComment(docName: string, commentId: string): Promise<CollabComment | null>;
40
47
  saveComment(docName: string, comment: CollabComment): Promise<void>;
41
48
  deleteComment(docName: string, commentId: string): Promise<void>;
42
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lucid_storage.d.ts","sourceRoot":"","sources":["../../../src/storage/lucid_storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAGrB;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC;AAKD;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,YAAW,oBAAoB;IAKrD,OAAO,CAAC,UAAU,CAAC;IAJrB,OAAO,CAAC,KAAK,CAA8B;gBAGzC,EAAE,CAAC,EAAE,mBAAmB,EAChB,UAAU,CAAC,EAAE,MAAM,YAAA;IAM7B,6EAA6E;IAC7E,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,MAAM,CAAC,GAAG,CAAoC;IAEtD,yFAAyF;YAC3E,IAAI;YAWJ,YAAY;IAmDpB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAOpE,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IAsBV,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAgBvD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzF,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAYnF,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoC/E,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAoBvE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BnE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CAEhF"}
1
+ {"version":3,"file":"lucid_storage.d.ts","sourceRoot":"","sources":["../../../src/storage/lucid_storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAGrB;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC;AAKD;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,YAAW,oBAAoB;IAKrD,OAAO,CAAC,UAAU,CAAC;IAJrB,OAAO,CAAC,KAAK,CAA8B;gBAGzC,EAAE,CAAC,EAAE,mBAAmB,EAChB,UAAU,CAAC,EAAE,MAAM,YAAA;IAM7B,6EAA6E;IAC7E,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,MAAM,CAAC,GAAG,CAAoC;IAEtD,yFAAyF;YAC3E,IAAI;YAWJ,YAAY;IAmDpB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAUpE,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IAoBV,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAgBvD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzF,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAYnF,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoC/E,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAS7E,OAAO,CAAC,SAAS;IAqBjB;;;;OAIG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAY7E,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CAEhF"}