@adonis-agora/collaboration-client 0.6.0 → 0.7.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 (52) hide show
  1. package/dist/src/components/excalidraw_board.d.ts +2 -3
  2. package/dist/src/components/excalidraw_board.d.ts.map +1 -1
  3. package/dist/src/components/excalidraw_board.js +12 -8
  4. package/dist/src/components/excalidraw_board.js.map +1 -1
  5. package/dist/src/context.d.ts +15 -3
  6. package/dist/src/context.d.ts.map +1 -1
  7. package/dist/src/context.js +22 -8
  8. package/dist/src/context.js.map +1 -1
  9. package/dist/src/hooks/use_automerge_doc.d.ts +32 -0
  10. package/dist/src/hooks/use_automerge_doc.d.ts.map +1 -1
  11. package/dist/src/hooks/use_automerge_doc.js +137 -40
  12. package/dist/src/hooks/use_automerge_doc.js.map +1 -1
  13. package/dist/src/hooks/use_awareness.d.ts +30 -0
  14. package/dist/src/hooks/use_awareness.d.ts.map +1 -1
  15. package/dist/src/hooks/use_awareness.js +55 -14
  16. package/dist/src/hooks/use_awareness.js.map +1 -1
  17. package/dist/src/hooks/use_collab_doc.d.ts +17 -1
  18. package/dist/src/hooks/use_collab_doc.d.ts.map +1 -1
  19. package/dist/src/hooks/use_collab_doc.js +44 -19
  20. package/dist/src/hooks/use_collab_doc.js.map +1 -1
  21. package/dist/src/hooks/use_collab_editor.d.ts +5 -0
  22. package/dist/src/hooks/use_collab_editor.d.ts.map +1 -1
  23. package/dist/src/hooks/use_collab_editor.js +26 -17
  24. package/dist/src/hooks/use_collab_editor.js.map +1 -1
  25. package/dist/src/hooks/use_comments.d.ts +6 -1
  26. package/dist/src/hooks/use_comments.d.ts.map +1 -1
  27. package/dist/src/hooks/use_comments.js +4 -4
  28. package/dist/src/hooks/use_comments.js.map +1 -1
  29. package/dist/src/hooks/use_excalidraw_sync.d.ts +27 -6
  30. package/dist/src/hooks/use_excalidraw_sync.d.ts.map +1 -1
  31. package/dist/src/hooks/use_excalidraw_sync.js +56 -22
  32. package/dist/src/hooks/use_excalidraw_sync.js.map +1 -1
  33. package/dist/src/hooks/use_versions.js +2 -2
  34. package/dist/src/hooks/use_versions.js.map +1 -1
  35. package/dist/src/index.d.ts +4 -3
  36. package/dist/src/index.d.ts.map +1 -1
  37. package/dist/src/index.js.map +1 -1
  38. package/dist/src/rest_client.d.ts +11 -2
  39. package/dist/src/rest_client.d.ts.map +1 -1
  40. package/dist/src/rest_client.js +11 -2
  41. package/dist/src/rest_client.js.map +1 -1
  42. package/dist/src/session.d.ts +112 -4
  43. package/dist/src/session.d.ts.map +1 -1
  44. package/dist/src/session.js +198 -16
  45. package/dist/src/session.js.map +1 -1
  46. package/dist/src/transports/hocuspocus.d.ts +3 -0
  47. package/dist/src/transports/hocuspocus.d.ts.map +1 -1
  48. package/dist/src/transports/hocuspocus.js +23 -2
  49. package/dist/src/transports/hocuspocus.js.map +1 -1
  50. package/dist/src/types.d.ts +13 -2
  51. package/dist/src/types.d.ts.map +1 -1
  52. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"use_versions.js","sourceRoot":"","sources":["../../../src/hooks/use_versions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use_versions.js","sourceRoot":"","sources":["../../../src/hooks/use_versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EACL,aAAa,IAAI,gBAAgB,EACjC,cAAc,IAAI,iBAAiB,EACnC,YAAY,GACb,MAAM,mBAAmB,CAAC;AAgB3B;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACnC,uEAAuE;IAEvE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC7B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACjD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,UAAU,CAAC,OAAO;gBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,OAAO,EAAE,CAAC;IACjB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/D,MAAM,OAAO,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC;IACjB,CAAC,EACD,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAC3B,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CACzB,KAAK,EAAE,SAAS,EAAE,EAAE;QAClB,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC,EACD,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAC3B,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAChE,CAAC"}
@@ -1,15 +1,16 @@
1
1
  export { CollaborationProvider, useCollaborationContext } from './context.js';
2
2
  export type { CollaborationProviderProps } from './context.js';
3
3
  export { DocSession } from './session.js';
4
+ export type { DocSessionSnapshot, DocSessionOptions } from './session.js';
4
5
  export { CollabRestError, collabFetch, createComment, createVersion, deleteComment, fetchToken, listComments, listVersions, resolveComment, restoreVersion, } from './rest_client.js';
5
6
  export { defaultTransportFactory } from './transports/index.js';
6
7
  export { HocuspocusCollabTransport } from './transports/hocuspocus.js';
7
8
  export { PartyKitCollabTransport } from './transports/partykit.js';
8
9
  export { PartyServerCollabTransport } from './transports/partyserver.js';
9
10
  export { useCollabDoc } from './hooks/use_collab_doc.js';
10
- export type { UseCollabDocResult } from './hooks/use_collab_doc.js';
11
+ export type { UseCollabDocOptions, UseCollabDocResult } from './hooks/use_collab_doc.js';
11
12
  export { useAwareness } from './hooks/use_awareness.js';
12
- export type { UseAwarenessResult } from './hooks/use_awareness.js';
13
+ export type { CollabLocalUser, UseAwarenessOptions, UseAwarenessResult, } from './hooks/use_awareness.js';
13
14
  export { useComments } from './hooks/use_comments.js';
14
15
  export type { UseCommentsResult } from './hooks/use_comments.js';
15
16
  export { useVersions } from './hooks/use_versions.js';
@@ -24,7 +25,7 @@ export type { ExcalidrawBoardProps } from './components/excalidraw_board.js';
24
25
  export { createExcalidrawAdapter, createTldrawAdapter, createTextAdapter, } from './editors/index.js';
25
26
  export type { CollabEditorAdapter, CollabEditorView, ExcalidrawScene, TldrawScene, } from './editors/index.js';
26
27
  export { useCollabEditor } from './hooks/use_collab_editor.js';
27
- export type { UseCollabEditorResult } from './hooks/use_collab_editor.js';
28
+ export type { UseCollabEditorOptions, UseCollabEditorResult, } from './hooks/use_collab_editor.js';
28
29
  export { YjsCollabDoc, AutomergeCollabDoc } from './docs/index.js';
29
30
  export type { CollabDoc, RichTextDoc, AutomergeDocHost } from './docs/index.js';
30
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,YAAY,EACV,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,YAAY,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,YAAY,EACV,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,YAAY,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAYtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAYtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAK/D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -18,12 +18,21 @@ export declare function collabFetch<T>(config: CollaborationClientConfig, path:
18
18
  }): Promise<T>;
19
19
  export declare function fetchToken(config: CollaborationClientConfig, docName: string): Promise<import("./types.js").CollabTokenInfo>;
20
20
  export declare function listComments(config: CollaborationClientConfig, docName: string, space?: string): Promise<import("./types.js").CollabComment[]>;
21
- export declare function createComment(config: CollaborationClientConfig, input: Omit<import('./types.js').CollabComment, 'id' | 'createdAt' | 'updatedAt' | 'resolvedAt'>): Promise<import("./types.js").CollabComment>;
21
+ /**
22
+ * `userId` is not part of the input: the route stamps the authenticated caller
23
+ * on the comment and ignores a body-supplied author.
24
+ */
25
+ export declare function createComment(config: CollaborationClientConfig, input: Omit<import('./types.js').CollabComment, 'id' | 'createdAt' | 'updatedAt' | 'resolvedAt' | 'userId'>): Promise<import("./types.js").CollabComment>;
22
26
  export declare function resolveComment(config: CollaborationClientConfig, docName: string, commentId: string, resolved: boolean): Promise<import("./types.js").CollabComment | null>;
23
27
  export declare function deleteComment(config: CollaborationClientConfig, docName: string, commentId: string): Promise<{
24
28
  deleted: boolean;
25
29
  }>;
26
30
  export declare function listVersions(config: CollaborationClientConfig, docName: string): Promise<import("./types.js").CollabVersion[]>;
27
- export declare function createVersion(config: CollaborationClientConfig, docName: string, label: string | null, userId?: string | null): Promise<import("./types.js").CollabVersion>;
31
+ /**
32
+ * The author is the authenticated caller: `handleCreateVersion` reads
33
+ * `allowed.user.id` and never looks at the body, so a `userId` sent here went
34
+ * nowhere while reading like it decided something.
35
+ */
36
+ export declare function createVersion(config: CollaborationClientConfig, docName: string, label: string | null): Promise<import("./types.js").CollabVersion>;
28
37
  export declare function restoreVersion(config: CollaborationClientConfig, docName: string, versionId: string): Promise<void>;
29
38
  //# sourceMappingURL=rest_client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rest_client.d.ts","sourceRoot":"","sources":["../../src/rest_client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;GAIG;AAEH,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM;CAK/B;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,yBAAyB,EAAE,SAAS,CAAC,GAAG,MAAM,CAIzF;AAcD,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,yBAAyB,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IACL,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,CAAC,CAAC,CA2BZ;AAID,wBAAgB,UAAU,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,iDAI5E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,iDAI9F;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,yBAAyB,EACjC,KAAK,EAAE,IAAI,CAAC,OAAO,YAAY,EAAE,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC,+CAMjG;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,sDAOlB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM;aAEa,OAAO;GAKtC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,iDAI9E;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,+CAMvB;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,iBAMlB"}
1
+ {"version":3,"file":"rest_client.d.ts","sourceRoot":"","sources":["../../src/rest_client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;GAIG;AAEH,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM;CAK/B;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,yBAAyB,EAAE,SAAS,CAAC,GAAG,MAAM,CAIzF;AAcD,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,yBAAyB,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;IACL,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,CAAC,CAAC,CA2BZ;AAID,wBAAgB,UAAU,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,iDAI5E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,iDAI9F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,yBAAyB,EACjC,KAAK,EAAE,IAAI,CACT,OAAO,YAAY,EAAE,aAAa,EAClC,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,CAC3D,+CAMF;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,sDAOlB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM;aAEa,OAAO;GAKtC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,iDAI9E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GAAG,IAAI,+CAMrB;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,yBAAyB,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,iBAMlB"}
@@ -63,6 +63,10 @@ export function listComments(config, docName, space) {
63
63
  params: { doc: docName, space },
64
64
  });
65
65
  }
66
+ /**
67
+ * `userId` is not part of the input: the route stamps the authenticated caller
68
+ * on the comment and ignores a body-supplied author.
69
+ */
66
70
  export function createComment(config, input) {
67
71
  return collabFetch(config, '/collaboration/comments', {
68
72
  method: 'POST',
@@ -80,10 +84,15 @@ export function listVersions(config, docName) {
80
84
  params: { doc: docName },
81
85
  });
82
86
  }
83
- export function createVersion(config, docName, label, userId) {
87
+ /**
88
+ * The author is the authenticated caller: `handleCreateVersion` reads
89
+ * `allowed.user.id` and never looks at the body, so a `userId` sent here went
90
+ * nowhere while reading like it decided something.
91
+ */
92
+ export function createVersion(config, docName, label) {
84
93
  return collabFetch(config, '/collaboration/versions', {
85
94
  method: 'POST',
86
- body: { docName, label, userId },
95
+ body: { docName, label },
87
96
  });
88
97
  }
89
98
  export function restoreVersion(config, docName, versionId) {
@@ -1 +1 @@
1
- {"version":3,"file":"rest_client.js","sourceRoot":"","sources":["../../src/rest_client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rest_client.js","sourceRoot":"","sources":["../../src/rest_client.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,80 @@
1
1
  import * as Y from 'yjs';
2
2
  import type { CollabStatus, CollabTransport, CollaborationClientConfig } from './types.js';
3
+ export declare const MAX_RECONNECT_DELAY_MS = 15000;
4
+ /**
5
+ * Circuit breaker: depois de MAX_RECONNECT_ATTEMPTS falhas consecutivas no
6
+ * fetchToken (e.g. banco sem as tabelas esperadas, auth quebrada), paramos
7
+ * de tentar e marcamos o status como 'error'. Sem isso, o client fica
8
+ * num loop infinito de retry e cada tentativa dispara updates no Y.Doc
9
+ * que o Tiptap `Collaboration` extension escuta — em setups que ligam
10
+ * o editor com `forceUpdate` na mudança, isso vira React error #185
11
+ * (Maximum update depth exceeded) e trava a página.
12
+ */
13
+ export declare const MAX_RECONNECT_ATTEMPTS = 5;
14
+ /**
15
+ * Whether a failure can never succeed on a retry.
16
+ *
17
+ * Reconnecting is for a network that dropped. An engine this package has no client for, a
18
+ * document the server refuses, or a config that cannot produce a transport fails the same
19
+ * way five times and then reports "exceeded 5 attempts" — which names nothing and buries
20
+ * what did.
21
+ *
22
+ * Matched on the message rather than an error class because these arrive from four
23
+ * different places (this file, `fetchToken`, the transport factory, `useAutomergeDoc`)
24
+ * and unifying their error types is a wider change than this fix.
25
+ *
26
+ * Shared with the Automerge hook on purpose: both paths reconnect, and two dialects of
27
+ * "this can never work" would drift.
28
+ */
29
+ export declare function isPermanentFailure(error: Error): boolean;
30
+ /**
31
+ * The error a caller is left with when the reconnect budget runs out.
32
+ *
33
+ * Keeps WHY it kept failing: replacing the cause with "exceeded N attempts" leaves the
34
+ * reader the one fact they can do nothing about, having discarded the one they could.
35
+ * Shared with the Automerge hook so an exhausted budget reads the same on both paths.
36
+ */
37
+ export declare function reconnectExhausted(lastFailure: Error | null): Error;
38
+ /** Immutable snapshot consumed by `useSyncExternalStore`. */
39
+ export interface DocSessionSnapshot {
40
+ status: CollabStatus;
41
+ error: Error | null;
42
+ /** True once the server's initial state has been applied to the doc. */
43
+ synced: boolean;
44
+ }
45
+ /** Minimal shape of the provider's session map, for self-eviction on destroy. */
46
+ export interface DocSessionRegistry {
47
+ get(docName: string): DocSession | undefined;
48
+ delete(docName: string): unknown;
49
+ }
50
+ export interface DocSessionOptions {
51
+ registry?: DocSessionRegistry;
52
+ }
3
53
  /**
4
54
  * Session for a single document: fetches the ephemeral token, creates the
5
- * transport and exposes an observable status store (consumed via
6
- * useSyncExternalStore). One session per docName per provider — it
7
- * outlives individual hook unmounts.
55
+ * transport and exposes an observable snapshot store (consumed via
56
+ * useSyncExternalStore). One session per docName per provider.
57
+ *
58
+ * ## Lifecycle
59
+ *
60
+ * The session is **reference counted**. Every hook that mounts calls
61
+ * {@link retain} and releases on unmount; the first retain starts the token
62
+ * fetch, and the last {@link release} calls {@link stop}, which tears the
63
+ * transport down (socket closed, reconnect timer cleared) but **keeps the
64
+ * `Y.Doc` alive**. Remounting retains again and rebuilds the transport with
65
+ * a fresh token against the same document.
66
+ *
67
+ * That split matters: the Hocuspocus provider queues callbacks
68
+ * (requestIdleCallback, setTimeout) that touch the `Y.Doc` after teardown.
69
+ * Destroying the doc on unmount made those callbacks throw
70
+ * `Cannot read properties of undefined (reading 'startTime')`, which drives
71
+ * Tiptap's Collaboration extension into React error #185. `stop()` destroys
72
+ * the provider — which is what actually stops the socket and the timers —
73
+ * and leaves the doc, so nothing can observe a destroyed document.
74
+ *
75
+ * {@link destroy} is the terminal call: it also destroys the `Y.Doc` and
76
+ * evicts the session from the provider's map, so a destroyed session is
77
+ * never handed back to a component.
8
78
  *
9
79
  * Ephemeral tokens expire, so on `disconnected` (after having connected at
10
80
  * least once) the transport is torn down and rebuilt with a fresh token,
@@ -14,15 +84,53 @@ export declare class DocSession {
14
84
  #private;
15
85
  readonly docName: string;
16
86
  readonly doc: Y.Doc;
17
- constructor(docName: string, config: CollaborationClientConfig);
87
+ constructor(docName: string, config: CollaborationClientConfig, options?: DocSessionOptions);
18
88
  get transport(): CollabTransport | undefined;
19
89
  get error(): Error | null;
20
90
  /** Engine informado pelo server no token (yjs | automerge | ...). */
21
91
  get engine(): string | undefined;
92
+ /** True after {@link destroy} — such a session can never reconnect. */
93
+ get isDestroyed(): boolean;
94
+ /** How many mounted consumers are holding this session open. */
95
+ get refCount(): number;
96
+ /**
97
+ * True once the server's initial state has been applied to the doc.
98
+ *
99
+ * `status === 'connected'` only means the socket is open. Transports that
100
+ * cannot tell the two apart (partykit/partyserver, custom test doubles)
101
+ * fall back to reporting `connected` as synced, so this is never *less*
102
+ * informative than the status.
103
+ */
104
+ get synced(): boolean;
22
105
  getStatus(): CollabStatus;
106
+ /**
107
+ * Referentially stable snapshot: a new object is only minted when a field
108
+ * actually changed, so `useSyncExternalStore` does not re-render on every
109
+ * transport event.
110
+ */
111
+ getSnapshot(): DocSessionSnapshot;
23
112
  subscribe(listener: () => void): () => void;
113
+ /**
114
+ * Marks one mounted consumer. Returns the matching release, so a hook can
115
+ * `return session.retain()` straight out of an effect.
116
+ */
117
+ retain(): () => void;
118
+ /** Drops one consumer; the last one out calls {@link stop}. */
119
+ release(): void;
24
120
  /** Idempotent — token + transport created a single time per generation. */
25
121
  start(): Promise<void>;
122
+ /**
123
+ * Detaches the transport without killing the document: socket closed,
124
+ * reconnect timer cleared, next {@link start} rebuilds from a fresh token.
125
+ * The `Y.Doc` and its contents survive, so a remount resumes instead of
126
+ * starting from an empty document.
127
+ */
128
+ stop(): void;
129
+ /**
130
+ * Terminal teardown: destroys the transport **and** the `Y.Doc`, and evicts
131
+ * the session from the provider's map so it is never handed back. Use
132
+ * {@link stop} for "nobody is looking at this right now".
133
+ */
26
134
  destroy(): void;
27
135
  }
28
136
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EACV,YAAY,EAEZ,eAAe,EACf,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAcpB;;;;;;;;;GASG;AACH,qBAAa,UAAU;;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;gBAaR,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB;IAM9D,IAAI,SAAS,IAAI,eAAe,GAAG,SAAS,CAE3C;IAED,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,CAExB;IAED,qEAAqE;IACrE,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,SAAS,IAAI,YAAY;IAIzB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAS3C,2EAA2E;IAC3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuFtB,OAAO,IAAI,IAAI;CAQhB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EACV,YAAY,EAEZ,eAAe,EACf,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAIxD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,GAAG,KAAK,CAOnE;AAED,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,wEAAwE;IACxE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,UAAU;;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;gBAkBR,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAO3F,IAAI,SAAS,IAAI,eAAe,GAAG,SAAS,CAE3C;IAED,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,CAExB;IAED,qEAAqE;IACrE,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,uEAAuE;IACvE,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,gEAAgE;IAChE,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;;;;;OAOG;IACH,IAAI,MAAM,IAAI,OAAO,CAIpB;IAED,SAAS,IAAI,YAAY;IAIzB;;;;OAIG;IACH,WAAW,IAAI,kBAAkB;IAmBjC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAS3C;;;OAGG;IACH,MAAM,IAAI,MAAM,IAAI;IAWpB,+DAA+D;IAC/D,OAAO,IAAI,IAAI;IAMf,2EAA2E;IAC3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB;;;;;OAKG;IACH,IAAI,IAAI,IAAI;IAoHZ;;;;OAIG;IACH,OAAO,IAAI,IAAI;CAehB"}
@@ -1,7 +1,7 @@
1
1
  import * as Y from 'yjs';
2
2
  import { fetchToken } from './rest_client.js';
3
3
  import { defaultTransportFactory } from './transports/index.js';
4
- const MAX_RECONNECT_DELAY_MS = 15_000;
4
+ export const MAX_RECONNECT_DELAY_MS = 15_000;
5
5
  /**
6
6
  * Circuit breaker: depois de MAX_RECONNECT_ATTEMPTS falhas consecutivas no
7
7
  * fetchToken (e.g. banco sem as tabelas esperadas, auth quebrada), paramos
@@ -11,12 +11,60 @@ const MAX_RECONNECT_DELAY_MS = 15_000;
11
11
  * o editor com `forceUpdate` na mudança, isso vira React error #185
12
12
  * (Maximum update depth exceeded) e trava a página.
13
13
  */
14
- const MAX_RECONNECT_ATTEMPTS = 5;
14
+ export const MAX_RECONNECT_ATTEMPTS = 5;
15
+ /**
16
+ * Whether a failure can never succeed on a retry.
17
+ *
18
+ * Reconnecting is for a network that dropped. An engine this package has no client for, a
19
+ * document the server refuses, or a config that cannot produce a transport fails the same
20
+ * way five times and then reports "exceeded 5 attempts" — which names nothing and buries
21
+ * what did.
22
+ *
23
+ * Matched on the message rather than an error class because these arrive from four
24
+ * different places (this file, `fetchToken`, the transport factory, `useAutomergeDoc`)
25
+ * and unifying their error types is a wider change than this fix.
26
+ *
27
+ * Shared with the Automerge hook on purpose: both paths reconnect, and two dialects of
28
+ * "this can never work" would drift.
29
+ */
30
+ export function isPermanentFailure(error) {
31
+ return /has no client-side hooks yet|requires engine=|jwtSecret is required|\bforbidden\b|\b40[13]\b/i.test(error.message);
32
+ }
33
+ /**
34
+ * The error a caller is left with when the reconnect budget runs out.
35
+ *
36
+ * Keeps WHY it kept failing: replacing the cause with "exceeded N attempts" leaves the
37
+ * reader the one fact they can do nothing about, having discarded the one they could.
38
+ * Shared with the Automerge hook so an exhausted budget reads the same on both paths.
39
+ */
40
+ export function reconnectExhausted(lastFailure) {
41
+ return new Error(`reconnect: exceeded ${MAX_RECONNECT_ATTEMPTS} attempts${lastFailure ? ` (last failure: ${lastFailure.message})` : ''}`, lastFailure ? { cause: lastFailure } : undefined);
42
+ }
15
43
  /**
16
44
  * Session for a single document: fetches the ephemeral token, creates the
17
- * transport and exposes an observable status store (consumed via
18
- * useSyncExternalStore). One session per docName per provider — it
19
- * outlives individual hook unmounts.
45
+ * transport and exposes an observable snapshot store (consumed via
46
+ * useSyncExternalStore). One session per docName per provider.
47
+ *
48
+ * ## Lifecycle
49
+ *
50
+ * The session is **reference counted**. Every hook that mounts calls
51
+ * {@link retain} and releases on unmount; the first retain starts the token
52
+ * fetch, and the last {@link release} calls {@link stop}, which tears the
53
+ * transport down (socket closed, reconnect timer cleared) but **keeps the
54
+ * `Y.Doc` alive**. Remounting retains again and rebuilds the transport with
55
+ * a fresh token against the same document.
56
+ *
57
+ * That split matters: the Hocuspocus provider queues callbacks
58
+ * (requestIdleCallback, setTimeout) that touch the `Y.Doc` after teardown.
59
+ * Destroying the doc on unmount made those callbacks throw
60
+ * `Cannot read properties of undefined (reading 'startTime')`, which drives
61
+ * Tiptap's Collaboration extension into React error #185. `stop()` destroys
62
+ * the provider — which is what actually stops the socket and the timers —
63
+ * and leaves the doc, so nothing can observe a destroyed document.
64
+ *
65
+ * {@link destroy} is the terminal call: it also destroys the `Y.Doc` and
66
+ * evicts the session from the provider's map, so a destroyed session is
67
+ * never handed back to a component.
20
68
  *
21
69
  * Ephemeral tokens expire, so on `disconnected` (after having connected at
22
70
  * least once) the transport is torn down and rebuilt with a fresh token,
@@ -32,12 +80,18 @@ export class DocSession {
32
80
  #listeners = new Set();
33
81
  #startPromise;
34
82
  #destroyed = false;
83
+ #detached = false;
84
+ #refs = 0;
35
85
  #reconnectTimer;
36
86
  #attempt = 0;
87
+ #generation = 0;
37
88
  #engine;
38
- constructor(docName, config) {
89
+ #registry;
90
+ #snapshot;
91
+ constructor(docName, config, options) {
39
92
  this.docName = docName;
40
93
  this.#config = config;
94
+ this.#registry = options?.registry;
41
95
  this.doc = new Y.Doc();
42
96
  }
43
97
  get transport() {
@@ -50,9 +104,52 @@ export class DocSession {
50
104
  get engine() {
51
105
  return this.#engine;
52
106
  }
107
+ /** True after {@link destroy} — such a session can never reconnect. */
108
+ get isDestroyed() {
109
+ return this.#destroyed;
110
+ }
111
+ /** How many mounted consumers are holding this session open. */
112
+ get refCount() {
113
+ return this.#refs;
114
+ }
115
+ /**
116
+ * True once the server's initial state has been applied to the doc.
117
+ *
118
+ * `status === 'connected'` only means the socket is open. Transports that
119
+ * cannot tell the two apart (partykit/partyserver, custom test doubles)
120
+ * fall back to reporting `connected` as synced, so this is never *less*
121
+ * informative than the status.
122
+ */
123
+ get synced() {
124
+ const transport = this.#transport;
125
+ if (!transport)
126
+ return false;
127
+ return transport.isSynced?.() ?? transport.getStatus() === 'connected';
128
+ }
53
129
  getStatus() {
54
130
  return this.#status;
55
131
  }
132
+ /**
133
+ * Referentially stable snapshot: a new object is only minted when a field
134
+ * actually changed, so `useSyncExternalStore` does not re-render on every
135
+ * transport event.
136
+ */
137
+ getSnapshot() {
138
+ const previous = this.#snapshot;
139
+ const next = {
140
+ status: this.#status,
141
+ error: this.#error,
142
+ synced: this.synced,
143
+ };
144
+ if (previous &&
145
+ previous.status === next.status &&
146
+ previous.error === next.error &&
147
+ previous.synced === next.synced) {
148
+ return previous;
149
+ }
150
+ this.#snapshot = next;
151
+ return next;
152
+ }
56
153
  subscribe(listener) {
57
154
  this.#listeners.add(listener);
58
155
  // Idempotent: start only fires once (first subscriber).
@@ -61,18 +158,71 @@ export class DocSession {
61
158
  this.#listeners.delete(listener);
62
159
  };
63
160
  }
161
+ /**
162
+ * Marks one mounted consumer. Returns the matching release, so a hook can
163
+ * `return session.retain()` straight out of an effect.
164
+ */
165
+ retain() {
166
+ this.#refs += 1;
167
+ void this.start();
168
+ let released = false;
169
+ return () => {
170
+ if (released)
171
+ return;
172
+ released = true;
173
+ this.release();
174
+ };
175
+ }
176
+ /** Drops one consumer; the last one out calls {@link stop}. */
177
+ release() {
178
+ if (this.#refs === 0)
179
+ return;
180
+ this.#refs -= 1;
181
+ if (this.#refs === 0)
182
+ this.stop();
183
+ }
64
184
  /** Idempotent — token + transport created a single time per generation. */
65
185
  start() {
186
+ if (this.#destroyed)
187
+ return Promise.resolve();
188
+ this.#detached = false;
66
189
  if (this.#startPromise)
67
190
  return this.#startPromise;
68
191
  this.#startPromise = this.#start();
69
192
  return this.#startPromise;
70
193
  }
194
+ /**
195
+ * Detaches the transport without killing the document: socket closed,
196
+ * reconnect timer cleared, next {@link start} rebuilds from a fresh token.
197
+ * The `Y.Doc` and its contents survive, so a remount resumes instead of
198
+ * starting from an empty document.
199
+ */
200
+ stop() {
201
+ if (this.#destroyed || this.#detached)
202
+ return;
203
+ this.#detached = true;
204
+ this.#generation += 1;
205
+ if (this.#reconnectTimer) {
206
+ clearTimeout(this.#reconnectTimer);
207
+ this.#reconnectTimer = undefined;
208
+ }
209
+ this.#transport?.destroy();
210
+ this.#transport = undefined;
211
+ this.#startPromise = undefined;
212
+ this.#attempt = 0;
213
+ this.#setStatus('connecting', null);
214
+ this.#notify();
215
+ }
71
216
  async #start() {
217
+ // A stop()/start() pair (StrictMode remount) can land while this token
218
+ // request is still in flight. Without the generation check the stale
219
+ // request would come back and build a *second* transport on the same doc.
220
+ const generation = this.#generation;
221
+ const stale = () => this.#destroyed || this.#detached || generation !== this.#generation;
72
222
  try {
73
223
  const info = await fetchToken(this.#config, this.docName);
74
224
  this.#engine = info.engine;
75
- if (this.#destroyed)
225
+ if (stale())
76
226
  return;
77
227
  if (info.engine === 'automerge') {
78
228
  throw new Error("engine 'automerge' has no client-side hooks yet — use engine yjs or partykit");
@@ -84,11 +234,28 @@ export class DocSession {
84
234
  if (!this.#transport)
85
235
  return;
86
236
  this.#applyStatus(this.#transport.getStatus());
237
+ // `synced` flips without the status changing, and so does the
238
+ // awareness object — always wake subscribers.
239
+ this.#notify();
87
240
  });
88
241
  this.#applyStatus(transport.getStatus());
242
+ // The transport (and its awareness channel) only exists now. Status may
243
+ // not have changed ('connecting' → 'connecting'), so #setStatus would
244
+ // stay silent and nothing would ever bind to awareness.
245
+ this.#notify();
89
246
  }
90
247
  catch (error) {
91
- this.#setStatus('error', error instanceof Error ? error : new Error(String(error)));
248
+ if (stale())
249
+ return;
250
+ const failure = error instanceof Error ? error : new Error(String(error));
251
+ this.#setStatus('error', failure);
252
+ // A PERMANENT failure is not retried. Retrying an unsupported engine, a rejected
253
+ // document or a malformed config cannot succeed, and the retry is not free: after the
254
+ // last attempt `#scheduleReconnect` replaces `error` with "exceeded N attempts", so
255
+ // the message the reader is finally shown is the one that explains nothing, and the
256
+ // one that named the actual problem is gone.
257
+ if (isPermanentFailure(failure))
258
+ return;
92
259
  this.#scheduleReconnect();
93
260
  }
94
261
  }
@@ -98,7 +265,7 @@ export class DocSession {
98
265
  this.#attempt = 0;
99
266
  }
100
267
  this.#setStatus(status);
101
- if (status === 'disconnected' && !this.#destroyed) {
268
+ if (status === 'disconnected' && !this.#destroyed && !this.#detached) {
102
269
  this.#scheduleReconnect();
103
270
  }
104
271
  }
@@ -106,27 +273,29 @@ export class DocSession {
106
273
  const changed = status !== this.#status || error !== this.#error;
107
274
  this.#status = status;
108
275
  this.#error = error;
109
- if (changed) {
110
- for (const listener of this.#listeners)
111
- listener();
112
- }
276
+ if (changed)
277
+ this.#notify();
278
+ }
279
+ #notify() {
280
+ for (const listener of this.#listeners)
281
+ listener();
113
282
  }
114
283
  /**
115
284
  * Tears the current transport down and rebuilds it with a fresh token.
116
285
  * Backoff doubles per failed attempt and caps at {@link MAX_RECONNECT_DELAY_MS}.
117
286
  */
118
287
  #scheduleReconnect() {
119
- if (this.#reconnectTimer || this.#destroyed)
288
+ if (this.#reconnectTimer || this.#destroyed || this.#detached)
120
289
  return;
121
290
  if (this.#attempt >= MAX_RECONNECT_ATTEMPTS) {
122
- this.#setStatus('error', new Error(`reconnect: exceeded ${MAX_RECONNECT_ATTEMPTS} attempts`));
291
+ this.#setStatus('error', reconnectExhausted(this.#error));
123
292
  return;
124
293
  }
125
294
  const delay = Math.min(1000 * 2 ** this.#attempt, MAX_RECONNECT_DELAY_MS);
126
295
  this.#attempt += 1;
127
296
  this.#reconnectTimer = setTimeout(() => {
128
297
  this.#reconnectTimer = undefined;
129
- if (this.#destroyed)
298
+ if (this.#destroyed || this.#detached)
130
299
  return;
131
300
  this.#transport?.destroy();
132
301
  this.#transport = undefined;
@@ -135,12 +304,25 @@ export class DocSession {
135
304
  void this.start();
136
305
  }, delay);
137
306
  }
307
+ /**
308
+ * Terminal teardown: destroys the transport **and** the `Y.Doc`, and evicts
309
+ * the session from the provider's map so it is never handed back. Use
310
+ * {@link stop} for "nobody is looking at this right now".
311
+ */
138
312
  destroy() {
313
+ if (this.#destroyed)
314
+ return;
139
315
  this.#destroyed = true;
316
+ this.#generation += 1;
317
+ this.#refs = 0;
140
318
  if (this.#reconnectTimer)
141
319
  clearTimeout(this.#reconnectTimer);
142
320
  this.#transport?.destroy();
321
+ this.#transport = undefined;
143
322
  this.doc.destroy();
323
+ if (this.#registry?.get(this.docName) === this) {
324
+ this.#registry.delete(this.docName);
325
+ }
144
326
  for (const listener of this.#listeners)
145
327
  listener();
146
328
  this.#listeners.clear();
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}