@liveblocks/prosemirror 3.21.0-exp9 → 3.23.0-exp2

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.d.cts CHANGED
@@ -16,6 +16,8 @@ type LiveblocksProsemirrorRoom = {
16
16
  canUndo(): boolean;
17
17
  canRedo(): boolean;
18
18
  disable<T>(callback: () => T): T;
19
+ pause(): void;
20
+ resume(): void;
19
21
  undo(): void;
20
22
  redo(): void;
21
23
  };
package/dist/index.d.ts CHANGED
@@ -16,6 +16,8 @@ type LiveblocksProsemirrorRoom = {
16
16
  canUndo(): boolean;
17
17
  canRedo(): boolean;
18
18
  disable<T>(callback: () => T): T;
19
+ pause(): void;
20
+ resume(): void;
19
21
  undo(): void;
20
22
  redo(): void;
21
23
  };
package/dist/plugin.cjs CHANGED
@@ -10,6 +10,7 @@ var steps = require('./steps.cjs');
10
10
 
11
11
  const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new prosemirrorState.PluginKey("liveblocks-collaboration");
12
12
  const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = "_tiptap_docs";
13
+ const HISTORY_CAPTURE_TIMEOUT_MS = 500;
13
14
  function isProseMirrorJsonNode(value) {
14
15
  return typeof value === "object" && value !== null && typeof value.type === "string";
15
16
  }
@@ -91,6 +92,31 @@ function createLiveblocksCollaborationPlugin(options) {
91
92
  let isApplyingRemoteUpdate = false;
92
93
  let isApplyingLocalUpdate = false;
93
94
  let lastDocument = "";
95
+ let historyCaptureTimer;
96
+ const commitHistoryCapture = () => {
97
+ if (historyCaptureTimer === void 0) {
98
+ return;
99
+ }
100
+ clearTimeout(historyCaptureTimer);
101
+ historyCaptureTimer = void 0;
102
+ room.history.resume();
103
+ };
104
+ const scheduleHistoryCaptureCommit = () => {
105
+ if (historyCaptureTimer !== void 0) {
106
+ clearTimeout(historyCaptureTimer);
107
+ }
108
+ historyCaptureTimer = setTimeout(() => {
109
+ historyCaptureTimer = void 0;
110
+ room.history.resume();
111
+ }, HISTORY_CAPTURE_TIMEOUT_MS);
112
+ };
113
+ const abortHistoryCapture = () => {
114
+ if (historyCaptureTimer !== void 0) {
115
+ clearTimeout(historyCaptureTimer);
116
+ historyCaptureTimer = void 0;
117
+ }
118
+ room.history.resume();
119
+ };
94
120
  const applyStorageToEditor = (updates) => {
95
121
  if (view === void 0 || root === void 0) {
96
122
  return;
@@ -143,40 +169,53 @@ function createLiveblocksCollaborationPlugin(options) {
143
169
  }
144
170
  },
145
171
  appendTransaction(transactions, oldState, newState) {
146
- if (root === void 0 || isApplyingRemoteUpdate || !transactions.some((transaction) => transaction.docChanged) || transactions.some(
172
+ if (root === void 0 || isApplyingRemoteUpdate || transactions.some(
147
173
  (transaction) => Boolean(transaction.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY))
148
174
  )) {
149
175
  return null;
150
176
  }
177
+ if (!transactions.some((transaction) => transaction.docChanged)) {
178
+ if (transactions.some((transaction) => transaction.selectionSet)) {
179
+ commitHistoryCapture();
180
+ }
181
+ return null;
182
+ }
151
183
  const currentRoot = root;
152
184
  const documentRoot = getDocumentRoot(currentRoot, options.field);
185
+ const incomingDocument = newState.doc.toJSON();
186
+ if (!isProseMirrorJsonNode(incomingDocument)) {
187
+ return null;
188
+ }
189
+ const serializedIncoming = schema.stringifyDocument(incomingDocument);
190
+ if (serializedIncoming === lastDocument) {
191
+ return null;
192
+ }
153
193
  const classified = documentRoot !== void 0 ? steps.classifyTransaction(
154
194
  transactions,
155
195
  oldState.doc,
156
196
  newState.doc,
157
197
  documentRoot
158
198
  ) : { type: "unsupported" };
159
- room.batch(() => {
160
- if (classified.type === "incremental") {
161
- isApplyingLocalUpdate = true;
162
- try {
163
- steps.applyIncrementalOperations(classified.operations);
164
- } finally {
165
- isApplyingLocalUpdate = false;
166
- }
167
- } else {
168
- const document = newState.doc.toJSON();
169
- if (!isProseMirrorJsonNode(document)) {
170
- return;
171
- }
172
- const serializedDocument = schema.stringifyDocument(document);
173
- if (serializedDocument === lastDocument) {
174
- return;
175
- }
176
- lastDocument = serializedDocument;
177
- setDocumentRoot(currentRoot, options.field, document);
199
+ isApplyingLocalUpdate = true;
200
+ try {
201
+ room.history.pause();
202
+ try {
203
+ room.batch(() => {
204
+ if (classified.type === "incremental") {
205
+ steps.applyIncrementalOperations(classified.operations);
206
+ } else {
207
+ setDocumentRoot(currentRoot, options.field, incomingDocument);
208
+ }
209
+ });
210
+ } catch (error) {
211
+ abortHistoryCapture();
212
+ throw error;
178
213
  }
179
- });
214
+ scheduleHistoryCaptureCommit();
215
+ lastDocument = serializedIncoming;
216
+ } finally {
217
+ isApplyingLocalUpdate = false;
218
+ }
180
219
  return null;
181
220
  },
182
221
  view(editorView) {
@@ -224,6 +263,7 @@ function createLiveblocksCollaborationPlugin(options) {
224
263
  },
225
264
  destroy() {
226
265
  destroyed = true;
266
+ commitHistoryCapture();
227
267
  unsubscribe?.();
228
268
  unsubscribe = void 0;
229
269
  view = void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs","sources":["../src/plugin.ts"],"sourcesContent":["import type { LsonObject, StorageUpdate } from \"@liveblocks/client\";\nimport { LiveMap, LiveObject } from \"@liveblocks/client\";\nimport { kStorageUpdateSource } from \"@liveblocks/core\";\nimport { Slice } from \"prosemirror-model\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport { applyRemoteStorageUpdates } from \"./remote\";\nimport {\n createLiveblocksProsemirrorNode,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJson,\n type ProseMirrorJsonNode,\n stringifyDocument,\n} from \"./schema\";\nimport { applyIncrementalOperations, classifyTransaction } from \"./steps\";\nimport type { LiveblocksProsemirrorRoom } from \"./types\";\n\nexport const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey<{\n isReady: boolean;\n}>(\"liveblocks-collaboration\");\nexport const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = \"_tiptap_docs\";\n\nexport type LiveblocksCollaborationOptions = {\n room?: LiveblocksProsemirrorRoom;\n field: string;\n initialContent?: ProseMirrorJsonNode;\n fallbackDocument?: () => ProseMirrorJsonNode;\n};\n\nfunction isProseMirrorJsonNode(value: unknown): value is ProseMirrorJsonNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\nfunction getInitialDocument(\n initialContent: ProseMirrorJsonNode | undefined,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined,\n view: EditorView\n): ProseMirrorJsonNode {\n if (isProseMirrorJsonNode(initialContent)) {\n return initialContent;\n }\n\n const currentDocument: unknown = view.state.doc.toJSON();\n if (isProseMirrorJsonNode(currentDocument)) {\n return currentDocument;\n }\n\n const fallback = fallbackDocument?.();\n if (isProseMirrorJsonNode(fallback)) {\n return fallback;\n }\n\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin could not resolve an initial document.\"\n );\n}\n\nfunction replaceEditorDocument(\n view: EditorView,\n document: ProseMirrorJsonNode,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined\n): void {\n let nextDocument;\n try {\n nextDocument = view.state.schema.nodeFromJSON(document);\n } catch {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n if (nextDocument.childCount === 0) {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n const tr = view.state.tr.replace(\n 0,\n view.state.doc.content.size,\n new Slice(nextDocument.content, 0, 0)\n );\n\n tr.setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true }).setMeta(\n \"addToHistory\",\n false\n );\n\n view.dispatch(tr);\n}\n\nfunction getDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string\n): LiveblocksProsemirrorNode | undefined {\n const documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n return undefined;\n }\n\n const documentRoot = documents.get(field);\n if (!(documentRoot instanceof LiveObject)) {\n return undefined;\n }\n\n return documentRoot as LiveblocksProsemirrorNode;\n}\n\nfunction setDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string,\n document: ProseMirrorJsonNode\n): void {\n let documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n documents = new LiveMap<string, LiveblocksProsemirrorNode>();\n root.set(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY, documents);\n }\n\n documents.set(field, createLiveblocksProsemirrorNode(document));\n}\n\nexport function createLiveblocksCollaborationPlugin(\n options: LiveblocksCollaborationOptions\n): Plugin {\n const room = options.room;\n if (room === undefined) {\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin requires a room.\"\n );\n }\n\n let view: EditorView | undefined;\n let root: LiveObject<LsonObject> | undefined;\n let unsubscribe: (() => void) | undefined;\n let destroyed = false;\n let isApplyingRemoteUpdate = false;\n let isApplyingLocalUpdate = false;\n let lastDocument = \"\";\n\n const applyStorageToEditor = (updates?: StorageUpdate[]) => {\n if (view === undefined || root === undefined) {\n return;\n }\n\n const documentRoot = getDocumentRoot(root, options.field);\n if (documentRoot === undefined) {\n return;\n }\n\n if (isApplyingLocalUpdate) {\n return;\n }\n\n const document = liveblocksProsemirrorNodeToJson(\n documentRoot,\n options.fallbackDocument\n );\n const serializedDocument = stringifyDocument(document);\n\n if (serializedDocument === lastDocument) {\n return;\n }\n\n if (updates !== undefined) {\n const result = applyRemoteStorageUpdates(view, documentRoot, updates);\n if (result.type === \"applied\") {\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n view.dispatch(\n result.tr\n .setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true })\n .setMeta(\"addToHistory\", false)\n );\n } finally {\n isApplyingRemoteUpdate = false;\n }\n return;\n }\n }\n\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n replaceEditorDocument(view, document, options.fallbackDocument);\n } finally {\n isApplyingRemoteUpdate = false;\n }\n };\n\n return new Plugin({\n key: LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n state: {\n init: () => ({ isReady: false }),\n apply(tr, state) {\n const meta = tr.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY) as\n | { isReady?: boolean }\n | undefined;\n\n return meta?.isReady !== undefined\n ? { ...state, isReady: meta.isReady }\n : state;\n },\n },\n appendTransaction(transactions, oldState, newState) {\n if (\n root === undefined ||\n isApplyingRemoteUpdate ||\n !transactions.some((transaction) => transaction.docChanged) ||\n transactions.some((transaction) =>\n Boolean(transaction.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY))\n )\n ) {\n return null;\n }\n\n const currentRoot = root;\n\n const documentRoot = getDocumentRoot(currentRoot, options.field);\n const classified =\n documentRoot !== undefined\n ? classifyTransaction(\n transactions,\n oldState.doc,\n newState.doc,\n documentRoot\n )\n : { type: \"unsupported\" as const };\n\n room.batch(() => {\n if (classified.type === \"incremental\") {\n isApplyingLocalUpdate = true;\n try {\n applyIncrementalOperations(classified.operations);\n } finally {\n isApplyingLocalUpdate = false;\n }\n } else {\n const document: unknown = newState.doc.toJSON();\n if (!isProseMirrorJsonNode(document)) {\n return;\n }\n\n const serializedDocument = stringifyDocument(document);\n if (serializedDocument === lastDocument) {\n return;\n }\n\n lastDocument = serializedDocument;\n setDocumentRoot(currentRoot, options.field, document);\n }\n });\n\n return null;\n },\n view(editorView) {\n view = editorView;\n\n room.getStorage().then(({ root: storageRoot }) => {\n if (destroyed) {\n return;\n }\n\n root = storageRoot;\n\n if (getDocumentRoot(storageRoot, options.field) === undefined) {\n const initialDocument = getInitialDocument(\n options.initialContent,\n options.fallbackDocument,\n editorView\n );\n room.history.disable(() => {\n setDocumentRoot(storageRoot, options.field, initialDocument);\n });\n }\n\n applyStorageToEditor();\n\n const tr = editorView.state.tr.setMeta(\n LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n { isReady: true }\n );\n editorView.dispatch(tr);\n\n unsubscribe = room.subscribe(\n storageRoot,\n (updates) => {\n if (\n updates.every((update) => {\n const source = update[kStorageUpdateSource];\n return source?.origin === \"local\" && source.via === \"mutation\";\n })\n ) {\n return;\n }\n\n applyStorageToEditor(updates);\n },\n {\n isDeep: true,\n }\n );\n });\n\n return {\n update(nextView) {\n view = nextView;\n },\n destroy() {\n destroyed = true;\n unsubscribe?.();\n unsubscribe = undefined;\n view = undefined;\n root = undefined;\n },\n };\n },\n });\n}\n"],"names":["PluginKey","Slice","LiveMap","LiveObject","createLiveblocksProsemirrorNode","liveblocksProsemirrorNodeToJson","stringifyDocument","applyRemoteStorageUpdates","Plugin","classifyTransaction","applyIncrementalOperations","kStorageUpdateSource"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.cjs","sources":["../src/plugin.ts"],"sourcesContent":["import type { LsonObject, StorageUpdate } from \"@liveblocks/client\";\nimport { LiveMap, LiveObject } from \"@liveblocks/client\";\nimport { kStorageUpdateSource } from \"@liveblocks/core\";\nimport { Slice } from \"prosemirror-model\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport { applyRemoteStorageUpdates } from \"./remote\";\nimport {\n createLiveblocksProsemirrorNode,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJson,\n type ProseMirrorJsonNode,\n stringifyDocument,\n} from \"./schema\";\nimport { applyIncrementalOperations, classifyTransaction } from \"./steps\";\nimport type { LiveblocksProsemirrorRoom } from \"./types\";\n\nexport const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey<{\n isReady: boolean;\n}>(\"liveblocks-collaboration\");\nexport const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = \"_tiptap_docs\";\n\n/** Matches ProseMirror's default delay for grouping local edits. */\nconst HISTORY_CAPTURE_TIMEOUT_MS = 500;\n\nexport type LiveblocksCollaborationOptions = {\n room?: LiveblocksProsemirrorRoom;\n field: string;\n initialContent?: ProseMirrorJsonNode;\n fallbackDocument?: () => ProseMirrorJsonNode;\n};\n\nfunction isProseMirrorJsonNode(value: unknown): value is ProseMirrorJsonNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\nfunction getInitialDocument(\n initialContent: ProseMirrorJsonNode | undefined,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined,\n view: EditorView\n): ProseMirrorJsonNode {\n if (isProseMirrorJsonNode(initialContent)) {\n return initialContent;\n }\n\n const currentDocument: unknown = view.state.doc.toJSON();\n if (isProseMirrorJsonNode(currentDocument)) {\n return currentDocument;\n }\n\n const fallback = fallbackDocument?.();\n if (isProseMirrorJsonNode(fallback)) {\n return fallback;\n }\n\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin could not resolve an initial document.\"\n );\n}\n\nfunction replaceEditorDocument(\n view: EditorView,\n document: ProseMirrorJsonNode,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined\n): void {\n let nextDocument;\n try {\n nextDocument = view.state.schema.nodeFromJSON(document);\n } catch {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n if (nextDocument.childCount === 0) {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n const tr = view.state.tr.replace(\n 0,\n view.state.doc.content.size,\n new Slice(nextDocument.content, 0, 0)\n );\n\n tr.setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true }).setMeta(\n \"addToHistory\",\n false\n );\n\n view.dispatch(tr);\n}\n\nfunction getDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string\n): LiveblocksProsemirrorNode | undefined {\n const documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n return undefined;\n }\n\n const documentRoot = documents.get(field);\n if (!(documentRoot instanceof LiveObject)) {\n return undefined;\n }\n\n return documentRoot as LiveblocksProsemirrorNode;\n}\n\nfunction setDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string,\n document: ProseMirrorJsonNode\n): void {\n let documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n documents = new LiveMap<string, LiveblocksProsemirrorNode>();\n root.set(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY, documents);\n }\n\n documents.set(field, createLiveblocksProsemirrorNode(document));\n}\n\nexport function createLiveblocksCollaborationPlugin(\n options: LiveblocksCollaborationOptions\n): Plugin {\n const room = options.room;\n if (room === undefined) {\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin requires a room.\"\n );\n }\n\n let view: EditorView | undefined;\n let root: LiveObject<LsonObject> | undefined;\n let unsubscribe: (() => void) | undefined;\n let destroyed = false;\n let isApplyingRemoteUpdate = false;\n let isApplyingLocalUpdate = false;\n let lastDocument = \"\";\n let historyCaptureTimer: ReturnType<typeof setTimeout> | undefined;\n\n const commitHistoryCapture = () => {\n if (historyCaptureTimer === undefined) {\n return;\n }\n\n clearTimeout(historyCaptureTimer);\n historyCaptureTimer = undefined;\n room.history.resume();\n };\n\n const scheduleHistoryCaptureCommit = () => {\n if (historyCaptureTimer !== undefined) {\n clearTimeout(historyCaptureTimer);\n }\n\n historyCaptureTimer = setTimeout(() => {\n historyCaptureTimer = undefined;\n room.history.resume();\n }, HISTORY_CAPTURE_TIMEOUT_MS);\n };\n\n const abortHistoryCapture = () => {\n if (historyCaptureTimer !== undefined) {\n clearTimeout(historyCaptureTimer);\n historyCaptureTimer = undefined;\n }\n room.history.resume();\n };\n\n const applyStorageToEditor = (updates?: StorageUpdate[]) => {\n if (view === undefined || root === undefined) {\n return;\n }\n\n const documentRoot = getDocumentRoot(root, options.field);\n if (documentRoot === undefined) {\n return;\n }\n\n if (isApplyingLocalUpdate) {\n return;\n }\n\n const document = liveblocksProsemirrorNodeToJson(\n documentRoot,\n options.fallbackDocument\n );\n const serializedDocument = stringifyDocument(document);\n\n if (serializedDocument === lastDocument) {\n return;\n }\n\n if (updates !== undefined) {\n const result = applyRemoteStorageUpdates(view, documentRoot, updates);\n if (result.type === \"applied\") {\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n view.dispatch(\n result.tr\n .setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true })\n .setMeta(\"addToHistory\", false)\n );\n } finally {\n isApplyingRemoteUpdate = false;\n }\n return;\n }\n }\n\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n replaceEditorDocument(view, document, options.fallbackDocument);\n } finally {\n isApplyingRemoteUpdate = false;\n }\n };\n\n return new Plugin({\n key: LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n state: {\n init: () => ({ isReady: false }),\n apply(tr, state) {\n const meta = tr.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY) as\n | { isReady?: boolean }\n | undefined;\n\n return meta?.isReady !== undefined\n ? { ...state, isReady: meta.isReady }\n : state;\n },\n },\n appendTransaction(transactions, oldState, newState) {\n if (\n root === undefined ||\n isApplyingRemoteUpdate ||\n transactions.some((transaction) =>\n Boolean(transaction.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY))\n )\n ) {\n return null;\n }\n\n if (!transactions.some((transaction) => transaction.docChanged)) {\n if (transactions.some((transaction) => transaction.selectionSet)) {\n commitHistoryCapture();\n }\n return null;\n }\n\n const currentRoot = root;\n\n const documentRoot = getDocumentRoot(currentRoot, options.field);\n\n // Idempotency guard: if the incoming document already matches what we\n // last synced to storage, there is nothing to do. This naturally handles\n // editors (e.g. BlockNote) that invoke appendTransaction more than once\n // per user edit with the same transaction set\n const incomingDocument: unknown = newState.doc.toJSON();\n if (!isProseMirrorJsonNode(incomingDocument)) {\n return null;\n }\n const serializedIncoming = stringifyDocument(incomingDocument);\n if (serializedIncoming === lastDocument) {\n return null;\n }\n\n const classified =\n documentRoot !== undefined\n ? classifyTransaction(\n transactions,\n oldState.doc,\n newState.doc,\n documentRoot\n )\n : { type: \"unsupported\" as const };\n\n isApplyingLocalUpdate = true;\n try {\n room.history.pause();\n try {\n room.batch(() => {\n if (classified.type === \"incremental\") {\n applyIncrementalOperations(classified.operations);\n } else {\n setDocumentRoot(currentRoot, options.field, incomingDocument);\n }\n });\n } catch (error) {\n abortHistoryCapture();\n throw error;\n }\n scheduleHistoryCaptureCommit();\n lastDocument = serializedIncoming;\n } finally {\n isApplyingLocalUpdate = false;\n }\n\n return null;\n },\n view(editorView) {\n view = editorView;\n\n room.getStorage().then(({ root: storageRoot }) => {\n if (destroyed) {\n return;\n }\n\n root = storageRoot;\n\n if (getDocumentRoot(storageRoot, options.field) === undefined) {\n const initialDocument = getInitialDocument(\n options.initialContent,\n options.fallbackDocument,\n editorView\n );\n room.history.disable(() => {\n setDocumentRoot(storageRoot, options.field, initialDocument);\n });\n }\n\n applyStorageToEditor();\n\n const tr = editorView.state.tr.setMeta(\n LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n { isReady: true }\n );\n editorView.dispatch(tr);\n\n unsubscribe = room.subscribe(\n storageRoot,\n (updates) => {\n if (\n updates.every((update) => {\n const source = update[kStorageUpdateSource];\n return source?.origin === \"local\" && source.via === \"mutation\";\n })\n ) {\n return;\n }\n\n applyStorageToEditor(updates);\n },\n {\n isDeep: true,\n }\n );\n });\n\n return {\n update(nextView) {\n view = nextView;\n },\n destroy() {\n destroyed = true;\n commitHistoryCapture();\n unsubscribe?.();\n unsubscribe = undefined;\n view = undefined;\n root = undefined;\n },\n };\n },\n });\n}\n"],"names":["PluginKey","Slice","LiveMap","LiveObject","createLiveblocksProsemirrorNode","liveblocksProsemirrorNodeToJson","stringifyDocument","applyRemoteStorageUpdates","Plugin","classifyTransaction","applyIncrementalOperations","kStorageUpdateSource"],"mappings":"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"}
package/dist/plugin.js CHANGED
@@ -8,6 +8,7 @@ import { classifyTransaction, applyIncrementalOperations } from './steps.js';
8
8
 
9
9
  const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey("liveblocks-collaboration");
10
10
  const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = "_tiptap_docs";
11
+ const HISTORY_CAPTURE_TIMEOUT_MS = 500;
11
12
  function isProseMirrorJsonNode(value) {
12
13
  return typeof value === "object" && value !== null && typeof value.type === "string";
13
14
  }
@@ -89,6 +90,31 @@ function createLiveblocksCollaborationPlugin(options) {
89
90
  let isApplyingRemoteUpdate = false;
90
91
  let isApplyingLocalUpdate = false;
91
92
  let lastDocument = "";
93
+ let historyCaptureTimer;
94
+ const commitHistoryCapture = () => {
95
+ if (historyCaptureTimer === void 0) {
96
+ return;
97
+ }
98
+ clearTimeout(historyCaptureTimer);
99
+ historyCaptureTimer = void 0;
100
+ room.history.resume();
101
+ };
102
+ const scheduleHistoryCaptureCommit = () => {
103
+ if (historyCaptureTimer !== void 0) {
104
+ clearTimeout(historyCaptureTimer);
105
+ }
106
+ historyCaptureTimer = setTimeout(() => {
107
+ historyCaptureTimer = void 0;
108
+ room.history.resume();
109
+ }, HISTORY_CAPTURE_TIMEOUT_MS);
110
+ };
111
+ const abortHistoryCapture = () => {
112
+ if (historyCaptureTimer !== void 0) {
113
+ clearTimeout(historyCaptureTimer);
114
+ historyCaptureTimer = void 0;
115
+ }
116
+ room.history.resume();
117
+ };
92
118
  const applyStorageToEditor = (updates) => {
93
119
  if (view === void 0 || root === void 0) {
94
120
  return;
@@ -141,40 +167,53 @@ function createLiveblocksCollaborationPlugin(options) {
141
167
  }
142
168
  },
143
169
  appendTransaction(transactions, oldState, newState) {
144
- if (root === void 0 || isApplyingRemoteUpdate || !transactions.some((transaction) => transaction.docChanged) || transactions.some(
170
+ if (root === void 0 || isApplyingRemoteUpdate || transactions.some(
145
171
  (transaction) => Boolean(transaction.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY))
146
172
  )) {
147
173
  return null;
148
174
  }
175
+ if (!transactions.some((transaction) => transaction.docChanged)) {
176
+ if (transactions.some((transaction) => transaction.selectionSet)) {
177
+ commitHistoryCapture();
178
+ }
179
+ return null;
180
+ }
149
181
  const currentRoot = root;
150
182
  const documentRoot = getDocumentRoot(currentRoot, options.field);
183
+ const incomingDocument = newState.doc.toJSON();
184
+ if (!isProseMirrorJsonNode(incomingDocument)) {
185
+ return null;
186
+ }
187
+ const serializedIncoming = stringifyDocument(incomingDocument);
188
+ if (serializedIncoming === lastDocument) {
189
+ return null;
190
+ }
151
191
  const classified = documentRoot !== void 0 ? classifyTransaction(
152
192
  transactions,
153
193
  oldState.doc,
154
194
  newState.doc,
155
195
  documentRoot
156
196
  ) : { type: "unsupported" };
157
- room.batch(() => {
158
- if (classified.type === "incremental") {
159
- isApplyingLocalUpdate = true;
160
- try {
161
- applyIncrementalOperations(classified.operations);
162
- } finally {
163
- isApplyingLocalUpdate = false;
164
- }
165
- } else {
166
- const document = newState.doc.toJSON();
167
- if (!isProseMirrorJsonNode(document)) {
168
- return;
169
- }
170
- const serializedDocument = stringifyDocument(document);
171
- if (serializedDocument === lastDocument) {
172
- return;
173
- }
174
- lastDocument = serializedDocument;
175
- setDocumentRoot(currentRoot, options.field, document);
197
+ isApplyingLocalUpdate = true;
198
+ try {
199
+ room.history.pause();
200
+ try {
201
+ room.batch(() => {
202
+ if (classified.type === "incremental") {
203
+ applyIncrementalOperations(classified.operations);
204
+ } else {
205
+ setDocumentRoot(currentRoot, options.field, incomingDocument);
206
+ }
207
+ });
208
+ } catch (error) {
209
+ abortHistoryCapture();
210
+ throw error;
176
211
  }
177
- });
212
+ scheduleHistoryCaptureCommit();
213
+ lastDocument = serializedIncoming;
214
+ } finally {
215
+ isApplyingLocalUpdate = false;
216
+ }
178
217
  return null;
179
218
  },
180
219
  view(editorView) {
@@ -222,6 +261,7 @@ function createLiveblocksCollaborationPlugin(options) {
222
261
  },
223
262
  destroy() {
224
263
  destroyed = true;
264
+ commitHistoryCapture();
225
265
  unsubscribe?.();
226
266
  unsubscribe = void 0;
227
267
  view = void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../src/plugin.ts"],"sourcesContent":["import type { LsonObject, StorageUpdate } from \"@liveblocks/client\";\nimport { LiveMap, LiveObject } from \"@liveblocks/client\";\nimport { kStorageUpdateSource } from \"@liveblocks/core\";\nimport { Slice } from \"prosemirror-model\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport { applyRemoteStorageUpdates } from \"./remote\";\nimport {\n createLiveblocksProsemirrorNode,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJson,\n type ProseMirrorJsonNode,\n stringifyDocument,\n} from \"./schema\";\nimport { applyIncrementalOperations, classifyTransaction } from \"./steps\";\nimport type { LiveblocksProsemirrorRoom } from \"./types\";\n\nexport const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey<{\n isReady: boolean;\n}>(\"liveblocks-collaboration\");\nexport const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = \"_tiptap_docs\";\n\nexport type LiveblocksCollaborationOptions = {\n room?: LiveblocksProsemirrorRoom;\n field: string;\n initialContent?: ProseMirrorJsonNode;\n fallbackDocument?: () => ProseMirrorJsonNode;\n};\n\nfunction isProseMirrorJsonNode(value: unknown): value is ProseMirrorJsonNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\nfunction getInitialDocument(\n initialContent: ProseMirrorJsonNode | undefined,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined,\n view: EditorView\n): ProseMirrorJsonNode {\n if (isProseMirrorJsonNode(initialContent)) {\n return initialContent;\n }\n\n const currentDocument: unknown = view.state.doc.toJSON();\n if (isProseMirrorJsonNode(currentDocument)) {\n return currentDocument;\n }\n\n const fallback = fallbackDocument?.();\n if (isProseMirrorJsonNode(fallback)) {\n return fallback;\n }\n\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin could not resolve an initial document.\"\n );\n}\n\nfunction replaceEditorDocument(\n view: EditorView,\n document: ProseMirrorJsonNode,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined\n): void {\n let nextDocument;\n try {\n nextDocument = view.state.schema.nodeFromJSON(document);\n } catch {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n if (nextDocument.childCount === 0) {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n const tr = view.state.tr.replace(\n 0,\n view.state.doc.content.size,\n new Slice(nextDocument.content, 0, 0)\n );\n\n tr.setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true }).setMeta(\n \"addToHistory\",\n false\n );\n\n view.dispatch(tr);\n}\n\nfunction getDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string\n): LiveblocksProsemirrorNode | undefined {\n const documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n return undefined;\n }\n\n const documentRoot = documents.get(field);\n if (!(documentRoot instanceof LiveObject)) {\n return undefined;\n }\n\n return documentRoot as LiveblocksProsemirrorNode;\n}\n\nfunction setDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string,\n document: ProseMirrorJsonNode\n): void {\n let documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n documents = new LiveMap<string, LiveblocksProsemirrorNode>();\n root.set(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY, documents);\n }\n\n documents.set(field, createLiveblocksProsemirrorNode(document));\n}\n\nexport function createLiveblocksCollaborationPlugin(\n options: LiveblocksCollaborationOptions\n): Plugin {\n const room = options.room;\n if (room === undefined) {\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin requires a room.\"\n );\n }\n\n let view: EditorView | undefined;\n let root: LiveObject<LsonObject> | undefined;\n let unsubscribe: (() => void) | undefined;\n let destroyed = false;\n let isApplyingRemoteUpdate = false;\n let isApplyingLocalUpdate = false;\n let lastDocument = \"\";\n\n const applyStorageToEditor = (updates?: StorageUpdate[]) => {\n if (view === undefined || root === undefined) {\n return;\n }\n\n const documentRoot = getDocumentRoot(root, options.field);\n if (documentRoot === undefined) {\n return;\n }\n\n if (isApplyingLocalUpdate) {\n return;\n }\n\n const document = liveblocksProsemirrorNodeToJson(\n documentRoot,\n options.fallbackDocument\n );\n const serializedDocument = stringifyDocument(document);\n\n if (serializedDocument === lastDocument) {\n return;\n }\n\n if (updates !== undefined) {\n const result = applyRemoteStorageUpdates(view, documentRoot, updates);\n if (result.type === \"applied\") {\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n view.dispatch(\n result.tr\n .setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true })\n .setMeta(\"addToHistory\", false)\n );\n } finally {\n isApplyingRemoteUpdate = false;\n }\n return;\n }\n }\n\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n replaceEditorDocument(view, document, options.fallbackDocument);\n } finally {\n isApplyingRemoteUpdate = false;\n }\n };\n\n return new Plugin({\n key: LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n state: {\n init: () => ({ isReady: false }),\n apply(tr, state) {\n const meta = tr.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY) as\n | { isReady?: boolean }\n | undefined;\n\n return meta?.isReady !== undefined\n ? { ...state, isReady: meta.isReady }\n : state;\n },\n },\n appendTransaction(transactions, oldState, newState) {\n if (\n root === undefined ||\n isApplyingRemoteUpdate ||\n !transactions.some((transaction) => transaction.docChanged) ||\n transactions.some((transaction) =>\n Boolean(transaction.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY))\n )\n ) {\n return null;\n }\n\n const currentRoot = root;\n\n const documentRoot = getDocumentRoot(currentRoot, options.field);\n const classified =\n documentRoot !== undefined\n ? classifyTransaction(\n transactions,\n oldState.doc,\n newState.doc,\n documentRoot\n )\n : { type: \"unsupported\" as const };\n\n room.batch(() => {\n if (classified.type === \"incremental\") {\n isApplyingLocalUpdate = true;\n try {\n applyIncrementalOperations(classified.operations);\n } finally {\n isApplyingLocalUpdate = false;\n }\n } else {\n const document: unknown = newState.doc.toJSON();\n if (!isProseMirrorJsonNode(document)) {\n return;\n }\n\n const serializedDocument = stringifyDocument(document);\n if (serializedDocument === lastDocument) {\n return;\n }\n\n lastDocument = serializedDocument;\n setDocumentRoot(currentRoot, options.field, document);\n }\n });\n\n return null;\n },\n view(editorView) {\n view = editorView;\n\n room.getStorage().then(({ root: storageRoot }) => {\n if (destroyed) {\n return;\n }\n\n root = storageRoot;\n\n if (getDocumentRoot(storageRoot, options.field) === undefined) {\n const initialDocument = getInitialDocument(\n options.initialContent,\n options.fallbackDocument,\n editorView\n );\n room.history.disable(() => {\n setDocumentRoot(storageRoot, options.field, initialDocument);\n });\n }\n\n applyStorageToEditor();\n\n const tr = editorView.state.tr.setMeta(\n LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n { isReady: true }\n );\n editorView.dispatch(tr);\n\n unsubscribe = room.subscribe(\n storageRoot,\n (updates) => {\n if (\n updates.every((update) => {\n const source = update[kStorageUpdateSource];\n return source?.origin === \"local\" && source.via === \"mutation\";\n })\n ) {\n return;\n }\n\n applyStorageToEditor(updates);\n },\n {\n isDeep: true,\n }\n );\n });\n\n return {\n update(nextView) {\n view = nextView;\n },\n destroy() {\n destroyed = true;\n unsubscribe?.();\n unsubscribe = undefined;\n view = undefined;\n root = undefined;\n },\n };\n },\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sources":["../src/plugin.ts"],"sourcesContent":["import type { LsonObject, StorageUpdate } from \"@liveblocks/client\";\nimport { LiveMap, LiveObject } from \"@liveblocks/client\";\nimport { kStorageUpdateSource } from \"@liveblocks/core\";\nimport { Slice } from \"prosemirror-model\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport type { EditorView } from \"prosemirror-view\";\n\nimport { applyRemoteStorageUpdates } from \"./remote\";\nimport {\n createLiveblocksProsemirrorNode,\n type LiveblocksProsemirrorNode,\n liveblocksProsemirrorNodeToJson,\n type ProseMirrorJsonNode,\n stringifyDocument,\n} from \"./schema\";\nimport { applyIncrementalOperations, classifyTransaction } from \"./steps\";\nimport type { LiveblocksProsemirrorRoom } from \"./types\";\n\nexport const LIVEBLOCKS_COLLABORATION_PLUGIN_KEY = new PluginKey<{\n isReady: boolean;\n}>(\"liveblocks-collaboration\");\nexport const LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY = \"_tiptap_docs\";\n\n/** Matches ProseMirror's default delay for grouping local edits. */\nconst HISTORY_CAPTURE_TIMEOUT_MS = 500;\n\nexport type LiveblocksCollaborationOptions = {\n room?: LiveblocksProsemirrorRoom;\n field: string;\n initialContent?: ProseMirrorJsonNode;\n fallbackDocument?: () => ProseMirrorJsonNode;\n};\n\nfunction isProseMirrorJsonNode(value: unknown): value is ProseMirrorJsonNode {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n\nfunction getInitialDocument(\n initialContent: ProseMirrorJsonNode | undefined,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined,\n view: EditorView\n): ProseMirrorJsonNode {\n if (isProseMirrorJsonNode(initialContent)) {\n return initialContent;\n }\n\n const currentDocument: unknown = view.state.doc.toJSON();\n if (isProseMirrorJsonNode(currentDocument)) {\n return currentDocument;\n }\n\n const fallback = fallbackDocument?.();\n if (isProseMirrorJsonNode(fallback)) {\n return fallback;\n }\n\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin could not resolve an initial document.\"\n );\n}\n\nfunction replaceEditorDocument(\n view: EditorView,\n document: ProseMirrorJsonNode,\n fallbackDocument: (() => ProseMirrorJsonNode) | undefined\n): void {\n let nextDocument;\n try {\n nextDocument = view.state.schema.nodeFromJSON(document);\n } catch {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n if (nextDocument.childCount === 0) {\n const fallback = fallbackDocument?.();\n if (!isProseMirrorJsonNode(fallback)) {\n return;\n }\n\n nextDocument = view.state.schema.nodeFromJSON(fallback);\n }\n\n const tr = view.state.tr.replace(\n 0,\n view.state.doc.content.size,\n new Slice(nextDocument.content, 0, 0)\n );\n\n tr.setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true }).setMeta(\n \"addToHistory\",\n false\n );\n\n view.dispatch(tr);\n}\n\nfunction getDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string\n): LiveblocksProsemirrorNode | undefined {\n const documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n return undefined;\n }\n\n const documentRoot = documents.get(field);\n if (!(documentRoot instanceof LiveObject)) {\n return undefined;\n }\n\n return documentRoot as LiveblocksProsemirrorNode;\n}\n\nfunction setDocumentRoot(\n root: LiveObject<LsonObject>,\n field: string,\n document: ProseMirrorJsonNode\n): void {\n let documents = root.get(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY);\n if (!(documents instanceof LiveMap)) {\n documents = new LiveMap<string, LiveblocksProsemirrorNode>();\n root.set(LIVEBLOCKS_TIPTAP_DOCUMENTS_KEY, documents);\n }\n\n documents.set(field, createLiveblocksProsemirrorNode(document));\n}\n\nexport function createLiveblocksCollaborationPlugin(\n options: LiveblocksCollaborationOptions\n): Plugin {\n const room = options.room;\n if (room === undefined) {\n throw new Error(\n \"[Liveblocks] The Liveblocks collaboration plugin requires a room.\"\n );\n }\n\n let view: EditorView | undefined;\n let root: LiveObject<LsonObject> | undefined;\n let unsubscribe: (() => void) | undefined;\n let destroyed = false;\n let isApplyingRemoteUpdate = false;\n let isApplyingLocalUpdate = false;\n let lastDocument = \"\";\n let historyCaptureTimer: ReturnType<typeof setTimeout> | undefined;\n\n const commitHistoryCapture = () => {\n if (historyCaptureTimer === undefined) {\n return;\n }\n\n clearTimeout(historyCaptureTimer);\n historyCaptureTimer = undefined;\n room.history.resume();\n };\n\n const scheduleHistoryCaptureCommit = () => {\n if (historyCaptureTimer !== undefined) {\n clearTimeout(historyCaptureTimer);\n }\n\n historyCaptureTimer = setTimeout(() => {\n historyCaptureTimer = undefined;\n room.history.resume();\n }, HISTORY_CAPTURE_TIMEOUT_MS);\n };\n\n const abortHistoryCapture = () => {\n if (historyCaptureTimer !== undefined) {\n clearTimeout(historyCaptureTimer);\n historyCaptureTimer = undefined;\n }\n room.history.resume();\n };\n\n const applyStorageToEditor = (updates?: StorageUpdate[]) => {\n if (view === undefined || root === undefined) {\n return;\n }\n\n const documentRoot = getDocumentRoot(root, options.field);\n if (documentRoot === undefined) {\n return;\n }\n\n if (isApplyingLocalUpdate) {\n return;\n }\n\n const document = liveblocksProsemirrorNodeToJson(\n documentRoot,\n options.fallbackDocument\n );\n const serializedDocument = stringifyDocument(document);\n\n if (serializedDocument === lastDocument) {\n return;\n }\n\n if (updates !== undefined) {\n const result = applyRemoteStorageUpdates(view, documentRoot, updates);\n if (result.type === \"applied\") {\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n view.dispatch(\n result.tr\n .setMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY, { isRemote: true })\n .setMeta(\"addToHistory\", false)\n );\n } finally {\n isApplyingRemoteUpdate = false;\n }\n return;\n }\n }\n\n lastDocument = serializedDocument;\n isApplyingRemoteUpdate = true;\n try {\n replaceEditorDocument(view, document, options.fallbackDocument);\n } finally {\n isApplyingRemoteUpdate = false;\n }\n };\n\n return new Plugin({\n key: LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n state: {\n init: () => ({ isReady: false }),\n apply(tr, state) {\n const meta = tr.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY) as\n | { isReady?: boolean }\n | undefined;\n\n return meta?.isReady !== undefined\n ? { ...state, isReady: meta.isReady }\n : state;\n },\n },\n appendTransaction(transactions, oldState, newState) {\n if (\n root === undefined ||\n isApplyingRemoteUpdate ||\n transactions.some((transaction) =>\n Boolean(transaction.getMeta(LIVEBLOCKS_COLLABORATION_PLUGIN_KEY))\n )\n ) {\n return null;\n }\n\n if (!transactions.some((transaction) => transaction.docChanged)) {\n if (transactions.some((transaction) => transaction.selectionSet)) {\n commitHistoryCapture();\n }\n return null;\n }\n\n const currentRoot = root;\n\n const documentRoot = getDocumentRoot(currentRoot, options.field);\n\n // Idempotency guard: if the incoming document already matches what we\n // last synced to storage, there is nothing to do. This naturally handles\n // editors (e.g. BlockNote) that invoke appendTransaction more than once\n // per user edit with the same transaction set\n const incomingDocument: unknown = newState.doc.toJSON();\n if (!isProseMirrorJsonNode(incomingDocument)) {\n return null;\n }\n const serializedIncoming = stringifyDocument(incomingDocument);\n if (serializedIncoming === lastDocument) {\n return null;\n }\n\n const classified =\n documentRoot !== undefined\n ? classifyTransaction(\n transactions,\n oldState.doc,\n newState.doc,\n documentRoot\n )\n : { type: \"unsupported\" as const };\n\n isApplyingLocalUpdate = true;\n try {\n room.history.pause();\n try {\n room.batch(() => {\n if (classified.type === \"incremental\") {\n applyIncrementalOperations(classified.operations);\n } else {\n setDocumentRoot(currentRoot, options.field, incomingDocument);\n }\n });\n } catch (error) {\n abortHistoryCapture();\n throw error;\n }\n scheduleHistoryCaptureCommit();\n lastDocument = serializedIncoming;\n } finally {\n isApplyingLocalUpdate = false;\n }\n\n return null;\n },\n view(editorView) {\n view = editorView;\n\n room.getStorage().then(({ root: storageRoot }) => {\n if (destroyed) {\n return;\n }\n\n root = storageRoot;\n\n if (getDocumentRoot(storageRoot, options.field) === undefined) {\n const initialDocument = getInitialDocument(\n options.initialContent,\n options.fallbackDocument,\n editorView\n );\n room.history.disable(() => {\n setDocumentRoot(storageRoot, options.field, initialDocument);\n });\n }\n\n applyStorageToEditor();\n\n const tr = editorView.state.tr.setMeta(\n LIVEBLOCKS_COLLABORATION_PLUGIN_KEY,\n { isReady: true }\n );\n editorView.dispatch(tr);\n\n unsubscribe = room.subscribe(\n storageRoot,\n (updates) => {\n if (\n updates.every((update) => {\n const source = update[kStorageUpdateSource];\n return source?.origin === \"local\" && source.via === \"mutation\";\n })\n ) {\n return;\n }\n\n applyStorageToEditor(updates);\n },\n {\n isDeep: true,\n }\n );\n });\n\n return {\n update(nextView) {\n view = nextView;\n },\n destroy() {\n destroyed = true;\n commitHistoryCapture();\n unsubscribe?.();\n unsubscribe = undefined;\n view = undefined;\n root = undefined;\n },\n };\n },\n });\n}\n"],"names":[],"mappings":"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"}
package/dist/version.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const PKG_NAME = "@liveblocks/prosemirror";
4
- const PKG_VERSION = typeof "3.21.0-exp9" === "string" && "3.21.0-exp9";
4
+ const PKG_VERSION = typeof "3.23.0-exp2" === "string" && "3.23.0-exp2";
5
5
  const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const PKG_NAME = "@liveblocks/prosemirror";
2
- const PKG_VERSION = typeof "3.21.0-exp9" === "string" && "3.21.0-exp9";
2
+ const PKG_VERSION = typeof "3.23.0-exp2" === "string" && "3.23.0-exp2";
3
3
  const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
4
 
5
5
  export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveblocks/prosemirror",
3
- "version": "3.21.0-exp9",
3
+ "version": "3.23.0-exp2",
4
4
  "description": "ProseMirror collaboration plugins backed by Liveblocks.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Liveblocks Inc.",
@@ -25,8 +25,8 @@
25
25
  "README.md"
26
26
  ],
27
27
  "dependencies": {
28
- "@liveblocks/client": "3.21.0-exp9",
29
- "@liveblocks/core": "3.21.0-exp9"
28
+ "@liveblocks/client": "3.23.0-exp2",
29
+ "@liveblocks/core": "3.23.0-exp2"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "prosemirror-model": "^1",