@fileverse-dev/ddoc 4.1.11-patch-3 → 4.1.12-durability-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.
- package/dist/{index-k1yI08g6.mjs → index-CTR-epIo.mjs} +18748 -18739
- package/dist/{index-CAQPA7Hs.mjs → index-DOdUt7ap.mjs} +1 -1
- package/dist/index.es.js +1 -1
- package/dist/{markdown-source-pane-BoxLMIir.mjs → markdown-source-pane-CHsU7nVH.mjs} +2 -2
- package/dist/package/hooks/use-tab-editor.d.ts +3 -2
- package/dist/package/hooks/use-yjs-setup.d.ts +1 -0
- package/dist/package/sync-local/SyncManager.d.ts +11 -7
- package/dist/package/sync-local/floor.d.ts +6 -0
- package/dist/package/sync-local/socketClient.d.ts +17 -7
- package/dist/package/sync-local/types/index.d.ts +35 -9
- package/dist/package/use-ddoc-editor.d.ts +1 -0
- package/dist/{split-view-toolbar-ndChIJxD.mjs → split-view-toolbar-By84Hr3e.mjs} +2 -2
- package/package.json +1 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { k as Ql, b as Zl, s as eh } from "./index-
|
|
1
|
+
import { k as Ql, b as Zl, s as eh } from "./index-CTR-epIo.mjs";
|
|
2
2
|
let An = [], Xr = [];
|
|
3
3
|
(() => {
|
|
4
4
|
let s = "lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map((e) => e ? parseInt(e, 36) : 1);
|
package/dist/index.es.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as e, a as o, E as t, P as d, e as r, h as i, m as n, d as E, c as l, u, v as C } from "./index-
|
|
1
|
+
import { D as e, a as o, E as t, P as d, e as r, h as i, m as n, d as E, c as l, u, v as C } from "./index-CTR-epIo.mjs";
|
|
2
2
|
export {
|
|
3
3
|
e as DdocEditor,
|
|
4
4
|
o as DdocExportModal,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
var Vr = Object.defineProperty;
|
|
2
2
|
var Wr = (t, e, O) => e in t ? Vr(t, e, { enumerable: !0, configurable: !0, writable: !0, value: O }) : t[e] = O;
|
|
3
3
|
var gt = (t, e, O) => Wr(t, typeof e != "symbol" ? e + "" : e, O);
|
|
4
|
-
import { j as Cr } from "./index-
|
|
4
|
+
import { j as Cr } from "./index-CTR-epIo.mjs";
|
|
5
5
|
import { useRef as pe, useEffect as St } from "react";
|
|
6
|
-
import { s as y, A as pO, T as dO, a as Gr, S as et, b as Lr, P as fO, E as j, i as QO, c as _, D as le, k as tt, F as Ar, M as Pt, W as Er, R as Ur, d as mO, N as oe, e as V, f as Mr, g as Ot, h as ce, p as $O, j as Y, t as h, l as Ir, I as rt, L as at, m as ye, n as ue, o as Qe, q as gO, r as te, u as SO, v as Br, w as Nr, x as PO, y as kO, z as Dr, B as Fr, C as Kr, G as Oe, H as ZO, J as Jr, K as kt, O as Hr, Q as ea, U as ta, V as Oa, X as ra, Y as aa, Z as ia, _ as sa, $ as na, a0 as la, a1 as oa, a2 as ca } from "./index-
|
|
6
|
+
import { s as y, A as pO, T as dO, a as Gr, S as et, b as Lr, P as fO, E as j, i as QO, c as _, D as le, k as tt, F as Ar, M as Pt, W as Er, R as Ur, d as mO, N as oe, e as V, f as Mr, g as Ot, h as ce, p as $O, j as Y, t as h, l as Ir, I as rt, L as at, m as ye, n as ue, o as Qe, q as gO, r as te, u as SO, v as Br, w as Nr, x as PO, y as kO, z as Dr, B as Fr, C as Kr, G as Oe, H as ZO, J as Jr, K as kt, O as Hr, Q as ea, U as ta, V as Oa, X as ra, Y as aa, Z as ia, _ as sa, $ as na, a0 as la, a1 as oa, a2 as ca } from "./index-DOdUt7ap.mjs";
|
|
7
7
|
class ua {
|
|
8
8
|
/**
|
|
9
9
|
Create a new completion context. (Mostly useful for testing
|
|
@@ -17,7 +17,6 @@ interface UseTabEditorArgs {
|
|
|
17
17
|
initialContent: DdocProps['initialContent'];
|
|
18
18
|
collaboration?: CollaborationProps;
|
|
19
19
|
isReady?: boolean;
|
|
20
|
-
isSyncing?: boolean;
|
|
21
20
|
awareness?: any;
|
|
22
21
|
disableInlineComment?: boolean;
|
|
23
22
|
isFocusMode?: boolean;
|
|
@@ -45,6 +44,8 @@ interface UseTabEditorArgs {
|
|
|
45
44
|
ignoreCorruptedData?: boolean;
|
|
46
45
|
onCollaboratorChange?: DdocProps['onCollaboratorChange'];
|
|
47
46
|
onConnect: (connectConfig: CollabConnectionConfig) => void;
|
|
47
|
+
onDisconnect: () => void;
|
|
48
|
+
isIndexeddbSynced: boolean;
|
|
48
49
|
hasCollabContentInitialised?: boolean;
|
|
49
50
|
initialiseYjsIndexedDbProvider: () => Promise<void>;
|
|
50
51
|
externalExtensions?: Record<string, AnyExtension>;
|
|
@@ -56,7 +57,7 @@ interface UseTabEditorArgs {
|
|
|
56
57
|
initialCommentAnchors?: SerializedCommentAnchor[];
|
|
57
58
|
dBlockRuntimeStateRef?: DBlockRuntimeStateRef;
|
|
58
59
|
}
|
|
59
|
-
export declare const useTabEditor: ({ ydoc, isVersionMode, hasTabState, versionId, isPreviewMode, viewerMode, initialContent, collaboration, isReady,
|
|
60
|
+
export declare const useTabEditor: ({ ydoc, isVersionMode, hasTabState, versionId, isPreviewMode, viewerMode, initialContent, collaboration, isReady, awareness, disableInlineComment, isFocusMode, onCommentInteraction, onError, ipfsImageUploadFn, metadataProxyUrl, onCopyHeadingLink, ipfsImageFetchFn, fetchV1ImageFn, isConnected, activeModel, maxTokens, isAIAgentEnabled, setCharacterCount, setWordCount, setSelectedWordCount, setPageCount, setIsContentLoading, setIsCollabContentLoading, unFocused, zoomLevel, isPresentationMode, onInvalidContentError, ignoreCorruptedData, onCollaboratorChange, onConnect, onDisconnect, isIndexeddbSynced, hasCollabContentInitialised, initialiseYjsIndexedDbProvider, externalExtensions, isContentLoading, activeTabId, tabIds, theme, editorRef, initialCommentAnchors, dBlockRuntimeStateRef, }: UseTabEditorArgs) => {
|
|
60
61
|
editor: Editor | null;
|
|
61
62
|
cachedEditorEntries: import('./use-tab-editor-cache').CachedTabEditorRenderEntry[];
|
|
62
63
|
ref: import('react').RefObject<HTMLDivElement>;
|
|
@@ -11,6 +11,7 @@ interface UseYjsSetupArgs {
|
|
|
11
11
|
export declare const useYjsSetup: ({ onChange, enableIndexeddbSync, ddocId, collaboration, onIndexedDbError, }: UseYjsSetupArgs) => {
|
|
12
12
|
ydoc: Y.Doc;
|
|
13
13
|
onConnect: (connectConfig: import('../types').CollabConnectionConfig) => void;
|
|
14
|
+
onDisconnect: () => void;
|
|
14
15
|
isReady: boolean;
|
|
15
16
|
isSyncing: boolean;
|
|
16
17
|
terminateSession: () => void;
|
|
@@ -11,21 +11,23 @@ export declare class SyncManager {
|
|
|
11
11
|
private roomKeyBytes;
|
|
12
12
|
private isOwner;
|
|
13
13
|
private updateQueue;
|
|
14
|
-
private uncommittedUpdatesIdList;
|
|
15
14
|
private contentTobeAppliedQueue;
|
|
16
15
|
private isProcessing;
|
|
17
16
|
private syncId;
|
|
17
|
+
private floor;
|
|
18
|
+
private updatesSinceSnapshot;
|
|
19
|
+
private isAuthoringSnapshot;
|
|
20
|
+
private readonly SNAPSHOT_THRESHOLD;
|
|
18
21
|
private flushTimer;
|
|
19
22
|
private readonly FLUSH_INTERVAL_MS;
|
|
20
23
|
private readonly MAX_QUEUE_SIZE;
|
|
21
24
|
private _awarenessUpdateHandler;
|
|
22
25
|
private ydoc;
|
|
23
|
-
private servicesRef;
|
|
24
26
|
private callbacksRef;
|
|
25
27
|
private onLocalUpdate?;
|
|
26
28
|
constructor(config: SyncManagerConfig, onCollabStateChange: (state: CollabState) => void);
|
|
27
29
|
/** Called by useSyncManager on every render to keep refs fresh */
|
|
28
|
-
updateRefs(
|
|
30
|
+
updateRefs(_services: CollabServices | undefined, callbacks: CollabCallbacks | undefined, onLocalUpdate?: (updatedDocContent: string, updateChunk: string) => void): void;
|
|
29
31
|
get isConnected(): boolean;
|
|
30
32
|
get isReady(): boolean;
|
|
31
33
|
get awareness(): Awareness | null;
|
|
@@ -46,21 +48,23 @@ export declare class SyncManager {
|
|
|
46
48
|
* Fire-and-forget: merge all queued updates, encrypt, and emit via Socket.IO
|
|
47
49
|
* without awaiting the server ACK. The server broadcasts to peers immediately
|
|
48
50
|
* (before MongoDB write), so content reaches observers in near-real-time.
|
|
49
|
-
* ACK callback handles updateId tracking and auto-commit asynchronously.
|
|
50
51
|
*/
|
|
51
52
|
private sendUpdateBatch;
|
|
53
|
+
buildPendingBeaconPayload(): string | null;
|
|
54
|
+
fireBeacon(): void;
|
|
52
55
|
forceCleanup(): void;
|
|
53
56
|
private handleConnectionError;
|
|
54
57
|
private handleReconnection;
|
|
55
58
|
private connectSocket;
|
|
56
|
-
private
|
|
59
|
+
private decodeInto;
|
|
60
|
+
private catchUpFloor;
|
|
61
|
+
private authorSnapshot;
|
|
62
|
+
private hydrate;
|
|
57
63
|
private initializeAwareness;
|
|
58
64
|
private cleanupAwareness;
|
|
59
|
-
private commitLocalContents;
|
|
60
65
|
private broadcastLocalContents;
|
|
61
66
|
private processUpdateQueue;
|
|
62
67
|
private processNextUpdate;
|
|
63
|
-
private processCommit;
|
|
64
68
|
private handleRemoteContentUpdate;
|
|
65
69
|
private applyRemoteYjsUpdate;
|
|
66
70
|
private applyQueuedRemoteContents;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ISocketInitConfig, RoomMember, SocketStatusEnum, SendUpdateResponse,
|
|
1
|
+
import { ISocketInitConfig, RoomMember, SocketStatusEnum, SendUpdateResponse, HydrationResponse, SnapshotResponse, AckResponse } from './types';
|
|
2
2
|
import { Awareness } from 'y-protocols/awareness.js';
|
|
3
3
|
|
|
4
4
|
interface ISocketClientConfig {
|
|
@@ -8,6 +8,9 @@ interface ISocketClientConfig {
|
|
|
8
8
|
ownerEdSecret?: string;
|
|
9
9
|
contractAddress?: string;
|
|
10
10
|
ownerAddress?: string;
|
|
11
|
+
ownerIdentityDid?: string;
|
|
12
|
+
editLock?: string;
|
|
13
|
+
encryptedTitle?: string;
|
|
11
14
|
onHandshakeData?: (response: {
|
|
12
15
|
data: AckResponse;
|
|
13
16
|
roomKey: string;
|
|
@@ -20,6 +23,8 @@ interface ISocketClientConfig {
|
|
|
20
23
|
}
|
|
21
24
|
export declare class SocketClient {
|
|
22
25
|
private _socketUrl;
|
|
26
|
+
private _restBase;
|
|
27
|
+
private _lastSessionToken;
|
|
23
28
|
private _socket;
|
|
24
29
|
private _webSocketStatus;
|
|
25
30
|
private _isIntentionalDisconnect;
|
|
@@ -34,6 +39,9 @@ export declare class SocketClient {
|
|
|
34
39
|
private ownerUcan?;
|
|
35
40
|
private collaborationUcan?;
|
|
36
41
|
private ownerAddress?;
|
|
42
|
+
private ownerIdentityDid?;
|
|
43
|
+
private editLock?;
|
|
44
|
+
private encryptedTitle?;
|
|
37
45
|
private roomKey;
|
|
38
46
|
private roomInfo?;
|
|
39
47
|
private awareness;
|
|
@@ -46,15 +54,17 @@ export declare class SocketClient {
|
|
|
46
54
|
sendUpdate({ update }: {
|
|
47
55
|
update: string;
|
|
48
56
|
}): Promise<SendUpdateResponse>;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
fetchHydrationRange(sinceSeq?: number): Promise<HydrationResponse>;
|
|
58
|
+
sendSnapshot({ data, floorSeq, publishedMarker, }: {
|
|
59
|
+
data: string;
|
|
60
|
+
floorSeq: number;
|
|
61
|
+
publishedMarker?: string | null;
|
|
62
|
+
}): Promise<SnapshotResponse>;
|
|
63
|
+
setDocumentMeta(): Promise<void>;
|
|
55
64
|
broadcastAwareness(awarenessUpdate: string): Promise<void>;
|
|
56
65
|
disconnect: () => void;
|
|
57
66
|
terminateSession: () => Promise<void>;
|
|
67
|
+
flushBeacon(mergedUpdate: string): void;
|
|
58
68
|
private getCollaborationKeyPair;
|
|
59
69
|
private isUcanValid;
|
|
60
70
|
private getOwnerToken;
|
|
@@ -7,6 +7,16 @@ export interface CollabConnectionConfig {
|
|
|
7
7
|
roomId: string;
|
|
8
8
|
wsUrl: string;
|
|
9
9
|
isOwner: boolean;
|
|
10
|
+
/** Host signal: doc is in an active live-collaboration context (shared / peers present). Keeps the socket connected. */
|
|
11
|
+
livePresence?: boolean;
|
|
12
|
+
/** Host signal: connect once on open to initialise durability even without an edit. */
|
|
13
|
+
connectOnOpen?: boolean;
|
|
14
|
+
/** Host signal (owner-only): the owner identity signingKey DID. Recorded by the durable server on the first owner /auth as the R3 owner binding. */
|
|
15
|
+
ownerIdentityDid?: string;
|
|
16
|
+
/** Host signal (owner-only): wrapped roomKey bytes (owner-lock construction), uploaded as the server editLock recovery artifact. Opaque to the package. */
|
|
17
|
+
editLock?: string;
|
|
18
|
+
/** Host signal (owner-only): the document title encrypted with the roomKey, uploaded as the server title recovery artifact. Opaque to the package. */
|
|
19
|
+
encryptedTitle?: string;
|
|
10
20
|
ownerEdSecret?: string;
|
|
11
21
|
contractAddress?: string;
|
|
12
22
|
ownerAddress?: string;
|
|
@@ -21,11 +31,7 @@ export interface CollabSessionMeta {
|
|
|
21
31
|
username: string;
|
|
22
32
|
isEns?: boolean;
|
|
23
33
|
}
|
|
24
|
-
|
|
25
|
-
export interface CollabServices {
|
|
26
|
-
commitToStorage?: (file: File) => Promise<string>;
|
|
27
|
-
fetchFromStorage?: (cid: string) => Promise<any>;
|
|
28
|
-
}
|
|
34
|
+
export type CollabServices = Record<string, never>;
|
|
29
35
|
export type CollabErrorCode = 'CONNECTION_FAILED' | 'AUTH_FAILED' | 'SYNC_FAILED' | 'TIMEOUT' | 'UNKNOWN';
|
|
30
36
|
export type CollabError = {
|
|
31
37
|
code: CollabErrorCode;
|
|
@@ -145,11 +151,30 @@ export interface SendUpdateResponse extends AckResponse<{
|
|
|
145
151
|
createdAt: number;
|
|
146
152
|
}> {
|
|
147
153
|
}
|
|
148
|
-
export interface
|
|
149
|
-
|
|
150
|
-
createdAt: number;
|
|
154
|
+
export interface HydrationRow {
|
|
155
|
+
id: string;
|
|
151
156
|
documentId: string;
|
|
152
|
-
|
|
157
|
+
seq: number;
|
|
158
|
+
data: string;
|
|
159
|
+
updateType: string;
|
|
160
|
+
committed?: boolean;
|
|
161
|
+
commitCid?: string | null;
|
|
162
|
+
createdAt?: number;
|
|
163
|
+
sessionDid?: string;
|
|
164
|
+
publishedMarker?: string | null;
|
|
165
|
+
floorSeq?: number | null;
|
|
166
|
+
}
|
|
167
|
+
export interface HydrationResponse extends AckResponse<{
|
|
168
|
+
history: HydrationRow[];
|
|
169
|
+
total: number;
|
|
170
|
+
snapshot: HydrationRow | null;
|
|
171
|
+
nextSeq: number | null;
|
|
172
|
+
hasMore: boolean;
|
|
173
|
+
}> {
|
|
174
|
+
}
|
|
175
|
+
export interface SnapshotResponse extends AckResponse<{
|
|
176
|
+
id: string;
|
|
177
|
+
seq: number;
|
|
153
178
|
}> {
|
|
154
179
|
}
|
|
155
180
|
export interface ISocketInitConfig {
|
|
@@ -196,4 +221,5 @@ export interface IAuthArgs {
|
|
|
196
221
|
contractAddress?: string;
|
|
197
222
|
sessionDid?: string;
|
|
198
223
|
roomInfo?: string;
|
|
224
|
+
ownerIdentityDid?: string;
|
|
199
225
|
}
|
|
@@ -28,6 +28,7 @@ export declare const useDdocEditor: ({ isPreviewMode, viewerMode, initialContent
|
|
|
28
28
|
duplicateTab: (tabId: string) => string | undefined;
|
|
29
29
|
orderTab: (destinationTabId: string, movedTabId: string) => void;
|
|
30
30
|
onConnect: (connectConfig: import('./types').CollabConnectionConfig) => void;
|
|
31
|
+
onDisconnect: () => void;
|
|
31
32
|
isReady: boolean;
|
|
32
33
|
isSyncing: boolean;
|
|
33
34
|
hasCollabContentInitialised: boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { j as d } from "./index-
|
|
1
|
+
import { j as d } from "./index-CTR-epIo.mjs";
|
|
2
2
|
import { useRef as I, useState as N, useEffect as D } from "react";
|
|
3
3
|
import { DynamicDropdown as E, Tooltip as R, IconButton as O } from "@fileverse/ui";
|
|
4
|
-
import { a3 as A, a4 as P, c as y } from "./index-
|
|
4
|
+
import { a3 as A, a4 as P, c as y } from "./index-DOdUt7ap.mjs";
|
|
5
5
|
const p = (e, t, o = t) => {
|
|
6
6
|
const { state: s } = e, l = s.changeByRange((n) => {
|
|
7
7
|
const u = s.sliceDoc(n.from, n.to), r = s.sliceDoc(
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@fileverse-dev/ddoc",
|
|
3
3
|
"private": false,
|
|
4
4
|
"description": "DDoc",
|
|
5
|
-
"version": "4.1.
|
|
5
|
+
"version": "4.1.12-durability-1",
|
|
6
6
|
"main": "dist/index.es.js",
|
|
7
7
|
"module": "dist/index.es.js",
|
|
8
8
|
"exports": {
|
|
@@ -120,7 +120,6 @@
|
|
|
120
120
|
"y-indexeddb": "^9.0.12",
|
|
121
121
|
"y-prosemirror": "^1.2.5",
|
|
122
122
|
"y-protocols": "^1.0.6",
|
|
123
|
-
"y-webrtc": "^10.3.0",
|
|
124
123
|
"yjs": "^13.6.15",
|
|
125
124
|
"zustand": "^5.0.12"
|
|
126
125
|
},
|