@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.
- package/dist/src/components/excalidraw_board.d.ts +2 -3
- package/dist/src/components/excalidraw_board.d.ts.map +1 -1
- package/dist/src/components/excalidraw_board.js +12 -8
- package/dist/src/components/excalidraw_board.js.map +1 -1
- package/dist/src/context.d.ts +15 -3
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.js +22 -8
- package/dist/src/context.js.map +1 -1
- package/dist/src/hooks/use_automerge_doc.d.ts +32 -0
- package/dist/src/hooks/use_automerge_doc.d.ts.map +1 -1
- package/dist/src/hooks/use_automerge_doc.js +137 -40
- package/dist/src/hooks/use_automerge_doc.js.map +1 -1
- package/dist/src/hooks/use_awareness.d.ts +30 -0
- package/dist/src/hooks/use_awareness.d.ts.map +1 -1
- package/dist/src/hooks/use_awareness.js +55 -14
- package/dist/src/hooks/use_awareness.js.map +1 -1
- package/dist/src/hooks/use_collab_doc.d.ts +17 -1
- package/dist/src/hooks/use_collab_doc.d.ts.map +1 -1
- package/dist/src/hooks/use_collab_doc.js +44 -19
- package/dist/src/hooks/use_collab_doc.js.map +1 -1
- package/dist/src/hooks/use_collab_editor.d.ts +5 -0
- package/dist/src/hooks/use_collab_editor.d.ts.map +1 -1
- package/dist/src/hooks/use_collab_editor.js +26 -17
- package/dist/src/hooks/use_collab_editor.js.map +1 -1
- package/dist/src/hooks/use_comments.d.ts +6 -1
- package/dist/src/hooks/use_comments.d.ts.map +1 -1
- package/dist/src/hooks/use_comments.js +4 -4
- package/dist/src/hooks/use_comments.js.map +1 -1
- package/dist/src/hooks/use_excalidraw_sync.d.ts +27 -6
- package/dist/src/hooks/use_excalidraw_sync.d.ts.map +1 -1
- package/dist/src/hooks/use_excalidraw_sync.js +56 -22
- package/dist/src/hooks/use_excalidraw_sync.js.map +1 -1
- package/dist/src/hooks/use_versions.js +2 -2
- package/dist/src/hooks/use_versions.js.map +1 -1
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/rest_client.d.ts +11 -2
- package/dist/src/rest_client.d.ts.map +1 -1
- package/dist/src/rest_client.js +11 -2
- package/dist/src/rest_client.js.map +1 -1
- package/dist/src/session.d.ts +112 -4
- package/dist/src/session.d.ts.map +1 -1
- package/dist/src/session.js +198 -16
- package/dist/src/session.js.map +1 -1
- package/dist/src/transports/hocuspocus.d.ts +3 -0
- package/dist/src/transports/hocuspocus.d.ts.map +1 -1
- package/dist/src/transports/hocuspocus.js +23 -2
- package/dist/src/transports/hocuspocus.js.map +1 -1
- package/dist/src/types.d.ts +13 -2
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
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,
|
|
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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -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
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,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;
|
|
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"}
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,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
|
-
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/dist/src/rest_client.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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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"}
|
package/dist/src/session.d.ts
CHANGED
|
@@ -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
|
|
6
|
-
* useSyncExternalStore). One session per docName per provider
|
|
7
|
-
*
|
|
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;
|
|
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"}
|
package/dist/src/session.js
CHANGED
|
@@ -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
|
|
18
|
-
* useSyncExternalStore). One session per docName per provider
|
|
19
|
-
*
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
111
|
-
|
|
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',
|
|
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();
|
package/dist/src/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAQhE,MAAM,sBAAsB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|