@modusoperandi/licit 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/BlockquoteInsertNewLineCommand.js +7 -8
  2. package/BlockquoteInsertNewLineCommand.js.flow +77 -77
  3. package/BlockquoteNodeSpec.js +1 -1
  4. package/BlockquoteNodeSpec.js.flow +30 -30
  5. package/BlockquoteToggleCommand.js +8 -9
  6. package/BlockquoteToggleCommand.js.flow +56 -56
  7. package/BookmarkNodeSpec.js +1 -1
  8. package/BookmarkNodeSpec.js.flow +39 -39
  9. package/BulletListNodeSpec.js.flow +61 -61
  10. package/CZIProseMirror.js.flow +90 -90
  11. package/CodeBlockCommand.js +8 -9
  12. package/CodeBlockCommand.js.flow +65 -65
  13. package/CodeBlockNodeSpec.js.flow +24 -24
  14. package/CodeMarkSpec.js.flow +14 -14
  15. package/ContentPlaceholderPlugin.js +3 -4
  16. package/ContentPlaceholderPlugin.js.flow +187 -187
  17. package/CursorPlaceholderPlugin.js +4 -4
  18. package/CursorPlaceholderPlugin.js.flow +115 -115
  19. package/DocLayoutCommand.js +9 -10
  20. package/DocLayoutCommand.js.flow +99 -99
  21. package/DocNodeSpec.js.flow +64 -64
  22. package/EMMarkSpec.js.flow +14 -14
  23. package/EditorCommands.js.flow +126 -126
  24. package/EditorKeyMap.js.flow +187 -187
  25. package/EditorMarks.js +1 -1
  26. package/EditorMarks.js.flow +71 -71
  27. package/EditorNodes.js +1 -1
  28. package/EditorNodes.js.flow +59 -59
  29. package/EditorPageLayoutPlugin.js +2 -2
  30. package/EditorPageLayoutPlugin.js.flow +67 -67
  31. package/EditorPlugins.js.flow +8 -8
  32. package/EditorSchema.js.flow +12 -12
  33. package/EditorState.js.flow +7 -7
  34. package/FontSizeMarkSpec.js.flow +49 -49
  35. package/FontTypeMarkSpec.js.flow +80 -80
  36. package/HTMLMutator.js +2 -3
  37. package/HTMLMutator.js.flow +59 -59
  38. package/HardBreakNodeSpec.js.flow +15 -15
  39. package/HeadingNodeSpec.js +1 -1
  40. package/HeadingNodeSpec.js.flow +52 -52
  41. package/HistoryRedoCommand.js +7 -8
  42. package/HistoryRedoCommand.js.flow +41 -41
  43. package/HistoryUndoCommand.js +7 -8
  44. package/HistoryUndoCommand.js.flow +41 -41
  45. package/HorizontalRuleCommand.js +7 -8
  46. package/HorizontalRuleCommand.js.flow +71 -71
  47. package/HorizontalRuleNodeSpec.js.flow +39 -39
  48. package/ImageUploadPlaceholderPlugin.js +2 -2
  49. package/ImageUploadPlaceholderPlugin.js.flow +192 -192
  50. package/LinkMarkSpec.js.flow +32 -32
  51. package/LinkSetURLCommand.js +8 -9
  52. package/LinkSetURLCommand.js.flow +117 -117
  53. package/LinkTooltipPlugin.js +3 -4
  54. package/LinkTooltipPlugin.js.flow +190 -190
  55. package/ListItemInsertNewLineCommand.js +7 -8
  56. package/ListItemInsertNewLineCommand.js.flow +77 -77
  57. package/ListItemMergeCommand.js +9 -10
  58. package/ListItemMergeCommand.js.flow +199 -199
  59. package/ListItemNodeSpec.js.flow +52 -52
  60. package/ListSplitCommand.js +7 -8
  61. package/ListSplitCommand.js.flow +54 -54
  62. package/ListToggleCommand.js +11 -12
  63. package/ListToggleCommand.js.flow +99 -99
  64. package/MarkNames.js.flow +18 -18
  65. package/MarksClearCommand.js +9 -10
  66. package/MarksClearCommand.js.flow +65 -65
  67. package/MathEditCommand.js +8 -9
  68. package/MathEditCommand.js.flow +120 -120
  69. package/MathNodeSpec.js.flow +46 -46
  70. package/NodeNames.js.flow +23 -23
  71. package/OrderedListNodeSpec.js +1 -1
  72. package/OrderedListNodeSpec.js.flow +132 -132
  73. package/ParagraphNodeSpec.js.flow +156 -156
  74. package/ParagraphSpacingCommand.js +9 -10
  75. package/ParagraphSpacingCommand.js.flow +144 -144
  76. package/PrintCommand.js +9 -10
  77. package/PrintCommand.js.flow +53 -53
  78. package/SelectionPlaceholderPlugin.js +4 -4
  79. package/SelectionPlaceholderPlugin.js.flow +131 -131
  80. package/SpacerMarkSpec.js +1 -1
  81. package/SpacerMarkSpec.js.flow +47 -47
  82. package/StrikeMarkSpec.js.flow +21 -21
  83. package/StrongMarkSpec.js.flow +25 -25
  84. package/StyleView.js +2 -3
  85. package/StyleView.js.flow +19 -19
  86. package/TableBackgroundColorCommand.js +25 -12
  87. package/TableBackgroundColorCommand.js.flow +83 -75
  88. package/TableBorderColorCommand.js +25 -12
  89. package/TableBorderColorCommand.js.flow +86 -75
  90. package/TableCellColorCommand.js +11 -11
  91. package/TableCellColorCommand.js.flow +75 -75
  92. package/TableCellMenuPlugin.js +3 -4
  93. package/TableCellMenuPlugin.js.flow +132 -132
  94. package/TableInsertCommand.js +9 -10
  95. package/TableInsertCommand.js.flow +120 -120
  96. package/TableMergeCellsCommand.js +7 -8
  97. package/TableMergeCellsCommand.js.flow +112 -112
  98. package/TableNodesSpecs.js.flow +78 -78
  99. package/TablePlugins.js.flow +14 -14
  100. package/TableResizePlugin.js +3 -4
  101. package/TableResizePlugin.js.flow +631 -631
  102. package/TextColorMarkSpec.js.flow +35 -35
  103. package/TextHighlightMarkSpec.js.flow +38 -38
  104. package/TextInsertTabSpaceCommand.js +7 -8
  105. package/TextInsertTabSpaceCommand.js.flow +106 -106
  106. package/TextNoWrapMarkSpec.js.flow +14 -14
  107. package/TextNodeSpec.js.flow +7 -7
  108. package/TextSelectionMarkSpec.js.flow +24 -24
  109. package/TextSubMarkSpec.js.flow +20 -20
  110. package/TextSuperMarkSpec.js.flow +20 -20
  111. package/TextUnderlineMarkSpec.js.flow +27 -27
  112. package/Types.js +5 -0
  113. package/Types.js.flow +80 -75
  114. package/WebFontLoader.js +2 -3
  115. package/WebFontLoader.js.flow +22 -22
  116. package/blockQuoteInputRule.js.flow +36 -36
  117. package/bom.xml +21569 -23179
  118. package/browser.js.flow +7 -7
  119. package/buildEditorPlugins.js +2 -3
  120. package/buildEditorPlugins.js.flow +49 -49
  121. package/buildInputRules.js.flow +81 -81
  122. package/client/CollabConnector.js +12 -12
  123. package/client/CollabConnector.js.flow +90 -90
  124. package/client/EditorConnection.js +2 -3
  125. package/client/EditorConnection.js.flow +323 -323
  126. package/client/Licit.js +59 -60
  127. package/client/Licit.js.flow +643 -643
  128. package/client/Licit.test.js +2 -2
  129. package/client/Licit.test.js.flow +98 -98
  130. package/client/Reporter.js +2 -3
  131. package/client/Reporter.js.flow +37 -37
  132. package/client/SimpleConnector.js +1 -1
  133. package/client/SimpleConnector.js.flow +61 -61
  134. package/client/http.js.flow +70 -70
  135. package/client/licit.css +12 -12
  136. package/client/throttle.js.flow +27 -27
  137. package/convertFromDOMElement.js.flow +36 -36
  138. package/convertFromHTML.js.flow +17 -17
  139. package/convertFromJSON.js.flow +56 -56
  140. package/convertToCSSPTValue.js.flow +22 -22
  141. package/convertToJSON.js.flow +7 -7
  142. package/createCommand.js +8 -9
  143. package/createCommand.js.flow +62 -62
  144. package/createEditorKeyMap.js +1 -1
  145. package/createEditorKeyMap.js.flow +94 -94
  146. package/createEmptyEditorState.js.flow +31 -31
  147. package/createTableResizingPlugin.js.flow +86 -86
  148. package/findActionableCell.js.flow +74 -74
  149. package/findActiveMark.js.flow +32 -32
  150. package/hyphenize.js.flow +17 -17
  151. package/index.d.ts +165 -165
  152. package/index.js.flow +10 -10
  153. package/insertTable.js.flow +56 -56
  154. package/isEditorStateEmpty.js.flow +32 -32
  155. package/isTableNode.js.flow +15 -15
  156. package/joinDown.js.flow +27 -27
  157. package/joinListNode.js.flow +55 -55
  158. package/joinUp.js.flow +39 -39
  159. package/keymaps.js.flow +185 -185
  160. package/lookUpElement.js.flow +14 -14
  161. package/nodeAt.js.flow +12 -12
  162. package/normalizeHTML.js.flow +78 -78
  163. package/package.json +156 -155
  164. package/patchAnchorElements.js.flow +38 -38
  165. package/patchBreakElements.js.flow +22 -22
  166. package/patchElementInlineStyles.js.flow +92 -92
  167. package/patchListElements.js.flow +276 -276
  168. package/patchMathElements.js.flow +60 -60
  169. package/patchParagraphElements.js.flow +20 -20
  170. package/patchStyleElements.js.flow +196 -196
  171. package/patchTableElements.js.flow +89 -89
  172. package/rebaseDocWithSteps.js.flow +42 -42
  173. package/sanitizeURL.js.flow +13 -13
  174. package/splitListItem.js +1 -1
  175. package/splitListItem.js.flow +191 -191
  176. package/styles.css +19 -19
  177. package/styles0.css +29 -29
  178. package/toClosestFontPtSize.js.flow +22 -22
  179. package/toSafeHTMLDocument.js.flow +9 -9
  180. package/toggleBlockquote.js.flow +108 -108
  181. package/toggleCodeBlock.js.flow +102 -102
  182. package/ui/AlertInfo.js +7 -8
  183. package/ui/AlertInfo.js.flow +64 -64
  184. package/ui/BookmarkNodeView.js +8 -10
  185. package/ui/BookmarkNodeView.js.flow +66 -66
  186. package/ui/CommandButton.js +7 -8
  187. package/ui/CommandButton.js.flow +68 -68
  188. package/ui/CommandMenu.js +8 -9
  189. package/ui/CommandMenu.js.flow +75 -75
  190. package/ui/CommandMenuButton.js +13 -14
  191. package/ui/CommandMenuButton.js.flow +131 -131
  192. package/ui/CustomEditorView.js +8 -9
  193. package/ui/CustomEditorView.js.flow +28 -28
  194. package/ui/CustomMenu.js +3 -4
  195. package/ui/CustomMenu.js.flow +17 -17
  196. package/ui/CustomMenuItem.js +6 -8
  197. package/ui/CustomMenuItem.js.flow +36 -36
  198. package/ui/CustomNodeView.js +2 -3
  199. package/ui/CustomNodeView.js.flow +200 -200
  200. package/ui/CustomRadioButton.js +6 -7
  201. package/ui/CustomRadioButton.js.flow +65 -65
  202. package/ui/DocLayoutEditor.js +9 -10
  203. package/ui/DocLayoutEditor.js.flow +146 -146
  204. package/ui/Editor.js +15 -16
  205. package/ui/Editor.js.flow +288 -288
  206. package/ui/EditorFrameset.js +5 -6
  207. package/ui/EditorFrameset.js.flow +81 -81
  208. package/ui/EditorToolbar.js +13 -14
  209. package/ui/EditorToolbar.js.flow +218 -218
  210. package/ui/EditorToolbarConfig.js.flow +164 -164
  211. package/ui/FontSizeCommandMenuButton.js +5 -6
  212. package/ui/FontSizeCommandMenuButton.js.flow +66 -66
  213. package/ui/FontTypeCommandMenuButton.js +5 -6
  214. package/ui/FontTypeCommandMenuButton.js.flow +61 -61
  215. package/ui/Frag.js +3 -4
  216. package/ui/Frag.js.flow +13 -13
  217. package/ui/Icon.js +9 -12
  218. package/ui/Icon.js.flow +89 -89
  219. package/ui/ImageInlineEditor.js +6 -7
  220. package/ui/ImageInlineEditor.js.flow +67 -67
  221. package/ui/KeyCodes.js.flow +12 -12
  222. package/ui/LinkTooltip.js +9 -10
  223. package/ui/LinkTooltip.js.flow +85 -85
  224. package/ui/LinkURLEditor.js +9 -10
  225. package/ui/LinkURLEditor.js.flow +117 -117
  226. package/ui/ListItemNodeView.js +2 -3
  227. package/ui/ListItemNodeView.js.flow +98 -98
  228. package/ui/ListTypeButton.js +13 -14
  229. package/ui/ListTypeButton.js.flow +131 -131
  230. package/ui/ListTypeCommandButton.js +5 -6
  231. package/ui/ListTypeCommandButton.js.flow +85 -85
  232. package/ui/ListTypeMenu.js +11 -12
  233. package/ui/ListTypeMenu.js.flow +70 -70
  234. package/ui/LoadingIndicator.js +3 -4
  235. package/ui/LoadingIndicator.js.flow +20 -20
  236. package/ui/MathEditor.js +10 -11
  237. package/ui/MathEditor.js.flow +78 -78
  238. package/ui/MathInlineEditor.js +8 -9
  239. package/ui/MathInlineEditor.js.flow +102 -102
  240. package/ui/MathNodeView.js +14 -16
  241. package/ui/MathNodeView.js.flow +186 -186
  242. package/ui/PasteMenu.js +10 -11
  243. package/ui/PasteMenu.js.flow +57 -57
  244. package/ui/ResizeObserver.js.flow +106 -106
  245. package/ui/RichTextEditor.js +9 -10
  246. package/ui/RichTextEditor.js.flow +133 -133
  247. package/ui/SelectionObserver.js +2 -3
  248. package/ui/SelectionObserver.js.flow +134 -134
  249. package/ui/TableCellMenu.js +6 -7
  250. package/ui/TableCellMenu.js.flow +51 -51
  251. package/ui/TableGridSizeEditor.js +19 -21
  252. package/ui/TableGridSizeEditor.js.flow +184 -184
  253. package/ui/TableNodeView.js +3 -4
  254. package/ui/TableNodeView.js.flow +25 -25
  255. package/ui/bindScrollHandler.js.flow +46 -46
  256. package/ui/canUseCSSFont.js.flow +43 -43
  257. package/ui/czi-body-layout-editor.css +16 -16
  258. package/ui/czi-bookmark-view.css +10 -10
  259. package/ui/czi-cursor-placeholder.css +36 -36
  260. package/ui/czi-custom-menu-button.css +18 -18
  261. package/ui/czi-custom-menu-item.css +30 -30
  262. package/ui/czi-custom-menu.css +8 -8
  263. package/ui/czi-custom-radio-button.css +80 -80
  264. package/ui/czi-custom-scrollbar.css +21 -21
  265. package/ui/czi-editor-frameset.css +81 -81
  266. package/ui/czi-editor-toolbar.css +122 -122
  267. package/ui/czi-editor.css +220 -220
  268. package/ui/czi-form.css +107 -107
  269. package/ui/czi-frag.css +3 -3
  270. package/ui/czi-heading.css +40 -40
  271. package/ui/czi-icon.css +72 -72
  272. package/ui/czi-image-resize-box.css +165 -165
  273. package/ui/czi-image-upload-editor.css +57 -57
  274. package/ui/czi-image-upload-placeholder.css +50 -50
  275. package/ui/czi-image-url-editor.css +38 -38
  276. package/ui/czi-image-view.css +125 -125
  277. package/ui/czi-indent.css +137 -137
  278. package/ui/czi-inline-editor.css +20 -20
  279. package/ui/czi-link-tooltip.css +71 -71
  280. package/ui/czi-list.css +410 -410
  281. package/ui/czi-loading-indicator.css +111 -111
  282. package/ui/czi-math-view.css +62 -62
  283. package/ui/czi-selection-placeholder.css +24 -24
  284. package/ui/czi-table-cell-menu.css +14 -14
  285. package/ui/czi-table-grid-size-editor.css +37 -37
  286. package/ui/czi-table.css +87 -87
  287. package/ui/czi-vars.css +2 -2
  288. package/ui/findActiveFontSize.js.flow +58 -58
  289. package/ui/findActiveFontType.js.flow +38 -38
  290. package/ui/fonts.css +460 -460
  291. package/ui/handleEditorDrop.js.flow +28 -28
  292. package/ui/handleEditorKeyDown.js.flow +39 -39
  293. package/ui/handleEditorPaste.js.flow +33 -33
  294. package/ui/htmlElementToRect.js.flow +18 -18
  295. package/ui/icon-font.css +9 -9
  296. package/ui/injectStyleSheet.js.flow +42 -42
  297. package/ui/isElementFullyVisible.js.flow +26 -26
  298. package/ui/isOffline.js.flow +8 -8
  299. package/ui/isReactClass.js.flow +12 -12
  300. package/ui/listType.css +21 -21
  301. package/ui/mathquill-editor/MathQuillEditor.js +15 -17
  302. package/ui/mathquill-editor/MathQuillEditor.js.flow +159 -159
  303. package/ui/mathquill-editor/MathQuillEditorSymbols.js.flow +483 -483
  304. package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js +6 -7
  305. package/ui/mathquill-editor/MathQuillEditorSymbolsPanel.js.flow +50 -50
  306. package/ui/mathquill-editor/czi-mathquill-editor-symbols-panel.css +39 -39
  307. package/ui/mathquill-editor/czi-mathquill-editor.css +50 -50
  308. package/ui/mathquill-editor/mathquill-import-kludge.js.flow +24 -24
  309. package/ui/renderLaTeXAsHTML.js +1 -1
  310. package/ui/renderLaTeXAsHTML.js.flow +46 -46
  311. package/ui/resolveImage.js +1 -1
  312. package/ui/resolveImage.js.flow +123 -123
  313. package/ui/toCSSColor.js.flow +51 -51
  314. package/ui/toCSSLineSpacing.js.flow +55 -55
  315. package/ui/toHexColor.js.flow +26 -26
  316. package/ui/uuid.js.flow +9 -9
  317. package/uuid.js.flow +9 -9
@@ -1,323 +1,323 @@
1
- // @flow
2
-
3
- import {
4
- collab,
5
- getVersion,
6
- receiveTransaction,
7
- sendableSteps,
8
- } from 'prosemirror-collab';
9
- import { Plugin, EditorState } from 'prosemirror-state';
10
- import { Step } from 'prosemirror-transform';
11
- import { EditorView } from 'prosemirror-view';
12
- import uuid from '../uuid.js';
13
- import { GET, POST, PUT } from './http.js';
14
- // [FS] IRAD-1040 2020-09-02
15
- import { Schema } from 'prosemirror-model';
16
- import { stringify } from 'flatted';
17
-
18
- function badVersion(err: Object) {
19
- return err.status == 400 && /invalid version/i.test(String(err));
20
- }
21
-
22
- class State {
23
- edit: EditorState;
24
- comm: ?string;
25
-
26
- constructor(edit: ?EditorState, comm: ?string) {
27
- this.edit = edit;
28
- this.comm = comm;
29
- }
30
- }
31
- class EditorConnection {
32
- backOff: number;
33
- onReady: Function;
34
- ready: boolean;
35
- report: any;
36
- request: any;
37
- state: State;
38
- url: string;
39
- view: ?EditorView;
40
- schema: Schema;
41
- plugins: Array<Plugin>;
42
- defaultSchema: Schema;
43
-
44
- constructor(
45
- onReady: Function,
46
- report: any,
47
- url: string,
48
- plugins: Array<Plugin>,
49
- defaultSchema: Schema
50
- ) {
51
- this.schema = null;
52
- this.report = report;
53
- this.url = url;
54
- this.state = new State(null, 'start');
55
- this.request = null;
56
- this.backOff = 0;
57
- this.view = null;
58
- this.dispatch = this.dispatch.bind(this);
59
- this.ready = false;
60
- this.onReady = onReady;
61
- this.plugins = plugins;
62
- this.defaultSchema = defaultSchema;
63
- }
64
-
65
- // [FS] IRAD-1040 2020-09-08
66
- getEffectiveSchema(): Schema {
67
- return null != this.schema ? this.schema : this.defaultSchema;
68
- }
69
-
70
- // All state changes go through this
71
- dispatch = (action: Object): void => {
72
- let newEditState = null;
73
- if (action.type == 'loaded') {
74
- const editState = EditorState.create({
75
- doc: action.doc,
76
- plugins: this.plugins.concat([
77
- collab({
78
- clientID: uuid(),
79
- version: action.version,
80
- }),
81
- ]),
82
- });
83
- this.state = new State(editState, 'poll');
84
- this.ready = true;
85
- this.onReady(editState);
86
- this.poll();
87
- } else if (action.type == 'restart') {
88
- this.state = new State(null, 'start');
89
- this.start();
90
- } else if (action.type == 'poll') {
91
- this.state = new State(this.state.edit, 'poll');
92
- this.poll();
93
- } else if (action.type == 'recover') {
94
- if (action.error.status && action.error.status < 500) {
95
- this.report.failure(action.error);
96
- this.state = new State(null, null);
97
- } else {
98
- this.state = new State(this.state.edit, 'recover');
99
- this.recover(action.error);
100
- }
101
- } else if (action.type == 'transaction') {
102
- newEditState = this.state.edit
103
- ? this.state.edit.apply(action.transaction)
104
- : null;
105
- }
106
-
107
- if (newEditState) {
108
- let sendable;
109
- if (newEditState.doc.content.size > 4000000000000) {
110
- if (this.state.comm !== 'detached') {
111
- this.report.failure('Document too big. Detached.');
112
- }
113
- this.state = new State(newEditState, 'detached');
114
- } else if (
115
- (this.state.comm == 'poll' || action.requestDone) &&
116
- (sendable = this.sendable(newEditState))
117
- ) {
118
- this.closeRequest();
119
- this.state = new State(newEditState, 'send');
120
- this.send(newEditState, sendable);
121
- } else if (action.requestDone) {
122
- this.state = new State(newEditState, 'poll');
123
- this.poll();
124
- } else {
125
- this.state = new State(newEditState, this.state.comm);
126
- }
127
- }
128
-
129
- // Sync the editor with this.state.edit
130
- if (this.state.edit && this.view) {
131
- this.view.updateState(this.state.edit);
132
- }
133
- };
134
-
135
- dispatchData(data: any) {
136
- this.report.success();
137
- this.backOff = 0;
138
- this.dispatch({
139
- type: 'loaded',
140
- doc: this.getEffectiveSchema().nodeFromJSON(data),
141
- version: data.version,
142
- users: data.users,
143
- });
144
- }
145
-
146
- // Load the document from the server and start up
147
- start(input: any, dataDefined: boolean): void {
148
- const query = '?dataDefined=' + dataDefined;
149
- this.run(
150
- input
151
- ? PUT(this.url + query, JSON.stringify(input), 'application/json')
152
- : GET(this.url, 'application/json')
153
- ).then(
154
- (data) => {
155
- data = JSON.parse(data);
156
- this.report.success();
157
- this.backOff = 0;
158
- this.dispatch({
159
- type: 'loaded',
160
- doc: this.getEffectiveSchema().nodeFromJSON(data.doc_json),
161
- version: data.version,
162
- users: data.users,
163
- });
164
- },
165
- (err) => {
166
- this.report.failure(err);
167
- }
168
- );
169
- }
170
-
171
- // Send a request for events that have happened since the version
172
- // of the document that the client knows about. This request waits
173
- // for a new version of the document to be created if the client
174
- // is already up-to-date.
175
- poll(): void {
176
- const query = 'version=' + getVersion(this.state.edit);
177
- this.run(GET(this.url + '/events?' + query)).then(
178
- (data) => {
179
- this.report.success();
180
- data = JSON.parse(data);
181
- this.backOff = 0;
182
- if (data.steps && data.steps.length) {
183
- const tr = receiveTransaction(
184
- this.state.edit,
185
- data.steps.map((j) => Step.fromJSON(this.getEffectiveSchema(), j)),
186
- data.clientIDs
187
- );
188
- this.dispatch({
189
- type: 'transaction',
190
- transaction: tr,
191
- requestDone: true,
192
- });
193
- } else {
194
- this.poll();
195
- }
196
- },
197
- (err) => {
198
- if (err.status == 410 || badVersion(err)) {
199
- // Too far behind. Revert to server state
200
- this.report.failure(err);
201
- this.dispatch({ type: 'restart' });
202
- } else if (err) {
203
- this.dispatch({ type: 'recover', error: err });
204
- }
205
- }
206
- );
207
- }
208
-
209
- sendable(editState: EditorState): ?{ steps: Array<Step> } {
210
- const steps = sendableSteps(editState);
211
- if (steps) {
212
- return { steps };
213
- }
214
- return null;
215
- }
216
-
217
- // Send the given steps to the server
218
- send(editState: EditorState, sendable: Object) {
219
- const { steps } = sendable;
220
- const json = JSON.stringify({
221
- version: getVersion(editState),
222
- steps: steps ? steps.steps.map((s) => s.toJSON()) : [],
223
- clientID: steps ? steps.clientID : 0,
224
- });
225
- this.run(POST(this.url + '/events', json, 'application/json')).then(
226
- (data) => {
227
- this.report.success();
228
- this.backOff = 0;
229
- const tr = steps
230
- ? receiveTransaction(
231
- this.state.edit,
232
- steps.steps,
233
- repeat(steps.clientID, steps.steps.length)
234
- )
235
- : this.state.edit.tr;
236
-
237
- this.dispatch({
238
- type: 'transaction',
239
- transaction: tr,
240
- requestDone: true,
241
- });
242
- },
243
- (err) => {
244
- if (err.status == 409) {
245
- // The client's document conflicts with the server's version.
246
- // Poll for changes and then try again.
247
- this.backOff = 0;
248
- this.dispatch({ type: 'poll' });
249
- } else if (badVersion(err)) {
250
- this.report.failure(err);
251
- this.dispatch({ type: 'restart' });
252
- } else {
253
- this.dispatch({ type: 'recover', error: err });
254
- }
255
- }
256
- );
257
- }
258
-
259
- // [FS] IRAD-1040 2020-09-02
260
- // Send the modified schema to server
261
- updateSchema(schema: Schema, input: any, dataDefined: boolean) {
262
- // to avoid cyclic reference error, use flatted string.
263
- const schemaFlatted = stringify(schema);
264
- this.run(POST(this.url + '/schema/', schemaFlatted, 'text/plain')).then(
265
- (data) => {
266
- console.log("collab server's schema updated");
267
- // [FS] IRAD-1040 2020-09-08
268
- this.schema = schema;
269
- this.start(input, dataDefined);
270
- },
271
- (err) => {
272
- this.report.failure(err);
273
- }
274
- );
275
- }
276
-
277
- // Try to recover from an error
278
- recover(err: Error): void {
279
- const newBackOff = this.backOff ? Math.min(this.backOff * 2, 6e4) : 200;
280
- if (newBackOff > 1000 && this.backOff < 1000) {
281
- this.report.delay(err);
282
- }
283
- this.backOff = newBackOff;
284
- setTimeout(() => {
285
- if (this.state.comm == 'recover') {
286
- this.dispatch({ type: 'poll' });
287
- }
288
- }, this.backOff);
289
- }
290
-
291
- closeRequest(): void {
292
- if (this.request) {
293
- this.request.abort();
294
- this.request = null;
295
- }
296
- }
297
-
298
- run(request: any): Promise<any> {
299
- return (this.request = request);
300
- }
301
-
302
- close(): void {
303
- this.closeRequest();
304
- this.setView(null);
305
- }
306
-
307
- setView(view: EditorView): void {
308
- if (this.view) {
309
- this.view.destroy();
310
- }
311
- this.view = window.view = view;
312
- }
313
- }
314
-
315
- function repeat(val: any, n: number): Array<any> {
316
- const result = [];
317
- for (let i = 0; i < n; i++) {
318
- result.push(val);
319
- }
320
- return result;
321
- }
322
-
323
- export default EditorConnection;
1
+ // @flow
2
+
3
+ import {
4
+ collab,
5
+ getVersion,
6
+ receiveTransaction,
7
+ sendableSteps,
8
+ } from 'prosemirror-collab';
9
+ import { Plugin, EditorState } from 'prosemirror-state';
10
+ import { Step } from 'prosemirror-transform';
11
+ import { EditorView } from 'prosemirror-view';
12
+ import uuid from '../uuid.js';
13
+ import { GET, POST, PUT } from './http.js';
14
+ // [FS] IRAD-1040 2020-09-02
15
+ import { Schema } from 'prosemirror-model';
16
+ import { stringify } from 'flatted';
17
+
18
+ function badVersion(err: Object) {
19
+ return err.status == 400 && /invalid version/i.test(String(err));
20
+ }
21
+
22
+ class State {
23
+ edit: EditorState;
24
+ comm: ?string;
25
+
26
+ constructor(edit: ?EditorState, comm: ?string) {
27
+ this.edit = edit;
28
+ this.comm = comm;
29
+ }
30
+ }
31
+ class EditorConnection {
32
+ backOff: number;
33
+ onReady: Function;
34
+ ready: boolean;
35
+ report: any;
36
+ request: any;
37
+ state: State;
38
+ url: string;
39
+ view: ?EditorView;
40
+ schema: Schema;
41
+ plugins: Array<Plugin>;
42
+ defaultSchema: Schema;
43
+
44
+ constructor(
45
+ onReady: Function,
46
+ report: any,
47
+ url: string,
48
+ plugins: Array<Plugin>,
49
+ defaultSchema: Schema
50
+ ) {
51
+ this.schema = null;
52
+ this.report = report;
53
+ this.url = url;
54
+ this.state = new State(null, 'start');
55
+ this.request = null;
56
+ this.backOff = 0;
57
+ this.view = null;
58
+ this.dispatch = this.dispatch.bind(this);
59
+ this.ready = false;
60
+ this.onReady = onReady;
61
+ this.plugins = plugins;
62
+ this.defaultSchema = defaultSchema;
63
+ }
64
+
65
+ // [FS] IRAD-1040 2020-09-08
66
+ getEffectiveSchema(): Schema {
67
+ return null != this.schema ? this.schema : this.defaultSchema;
68
+ }
69
+
70
+ // All state changes go through this
71
+ dispatch = (action: Object): void => {
72
+ let newEditState = null;
73
+ if (action.type == 'loaded') {
74
+ const editState = EditorState.create({
75
+ doc: action.doc,
76
+ plugins: this.plugins.concat([
77
+ collab({
78
+ clientID: uuid(),
79
+ version: action.version,
80
+ }),
81
+ ]),
82
+ });
83
+ this.state = new State(editState, 'poll');
84
+ this.ready = true;
85
+ this.onReady(editState);
86
+ this.poll();
87
+ } else if (action.type == 'restart') {
88
+ this.state = new State(null, 'start');
89
+ this.start();
90
+ } else if (action.type == 'poll') {
91
+ this.state = new State(this.state.edit, 'poll');
92
+ this.poll();
93
+ } else if (action.type == 'recover') {
94
+ if (action.error.status && action.error.status < 500) {
95
+ this.report.failure(action.error);
96
+ this.state = new State(null, null);
97
+ } else {
98
+ this.state = new State(this.state.edit, 'recover');
99
+ this.recover(action.error);
100
+ }
101
+ } else if (action.type == 'transaction') {
102
+ newEditState = this.state.edit
103
+ ? this.state.edit.apply(action.transaction)
104
+ : null;
105
+ }
106
+
107
+ if (newEditState) {
108
+ let sendable;
109
+ if (newEditState.doc.content.size > 4000000000000) {
110
+ if (this.state.comm !== 'detached') {
111
+ this.report.failure('Document too big. Detached.');
112
+ }
113
+ this.state = new State(newEditState, 'detached');
114
+ } else if (
115
+ (this.state.comm == 'poll' || action.requestDone) &&
116
+ (sendable = this.sendable(newEditState))
117
+ ) {
118
+ this.closeRequest();
119
+ this.state = new State(newEditState, 'send');
120
+ this.send(newEditState, sendable);
121
+ } else if (action.requestDone) {
122
+ this.state = new State(newEditState, 'poll');
123
+ this.poll();
124
+ } else {
125
+ this.state = new State(newEditState, this.state.comm);
126
+ }
127
+ }
128
+
129
+ // Sync the editor with this.state.edit
130
+ if (this.state.edit && this.view) {
131
+ this.view.updateState(this.state.edit);
132
+ }
133
+ };
134
+
135
+ dispatchData(data: any) {
136
+ this.report.success();
137
+ this.backOff = 0;
138
+ this.dispatch({
139
+ type: 'loaded',
140
+ doc: this.getEffectiveSchema().nodeFromJSON(data),
141
+ version: data.version,
142
+ users: data.users,
143
+ });
144
+ }
145
+
146
+ // Load the document from the server and start up
147
+ start(input: any, dataDefined: boolean): void {
148
+ const query = '?dataDefined=' + dataDefined;
149
+ this.run(
150
+ input
151
+ ? PUT(this.url + query, JSON.stringify(input), 'application/json')
152
+ : GET(this.url, 'application/json')
153
+ ).then(
154
+ (data) => {
155
+ data = JSON.parse(data);
156
+ this.report.success();
157
+ this.backOff = 0;
158
+ this.dispatch({
159
+ type: 'loaded',
160
+ doc: this.getEffectiveSchema().nodeFromJSON(data.doc_json),
161
+ version: data.version,
162
+ users: data.users,
163
+ });
164
+ },
165
+ (err) => {
166
+ this.report.failure(err);
167
+ }
168
+ );
169
+ }
170
+
171
+ // Send a request for events that have happened since the version
172
+ // of the document that the client knows about. This request waits
173
+ // for a new version of the document to be created if the client
174
+ // is already up-to-date.
175
+ poll(): void {
176
+ const query = 'version=' + getVersion(this.state.edit);
177
+ this.run(GET(this.url + '/events?' + query)).then(
178
+ (data) => {
179
+ this.report.success();
180
+ data = JSON.parse(data);
181
+ this.backOff = 0;
182
+ if (data.steps && data.steps.length) {
183
+ const tr = receiveTransaction(
184
+ this.state.edit,
185
+ data.steps.map((j) => Step.fromJSON(this.getEffectiveSchema(), j)),
186
+ data.clientIDs
187
+ );
188
+ this.dispatch({
189
+ type: 'transaction',
190
+ transaction: tr,
191
+ requestDone: true,
192
+ });
193
+ } else {
194
+ this.poll();
195
+ }
196
+ },
197
+ (err) => {
198
+ if (err.status == 410 || badVersion(err)) {
199
+ // Too far behind. Revert to server state
200
+ this.report.failure(err);
201
+ this.dispatch({ type: 'restart' });
202
+ } else if (err) {
203
+ this.dispatch({ type: 'recover', error: err });
204
+ }
205
+ }
206
+ );
207
+ }
208
+
209
+ sendable(editState: EditorState): ?{ steps: Array<Step> } {
210
+ const steps = sendableSteps(editState);
211
+ if (steps) {
212
+ return { steps };
213
+ }
214
+ return null;
215
+ }
216
+
217
+ // Send the given steps to the server
218
+ send(editState: EditorState, sendable: Object) {
219
+ const { steps } = sendable;
220
+ const json = JSON.stringify({
221
+ version: getVersion(editState),
222
+ steps: steps ? steps.steps.map((s) => s.toJSON()) : [],
223
+ clientID: steps ? steps.clientID : 0,
224
+ });
225
+ this.run(POST(this.url + '/events', json, 'application/json')).then(
226
+ (data) => {
227
+ this.report.success();
228
+ this.backOff = 0;
229
+ const tr = steps
230
+ ? receiveTransaction(
231
+ this.state.edit,
232
+ steps.steps,
233
+ repeat(steps.clientID, steps.steps.length)
234
+ )
235
+ : this.state.edit.tr;
236
+
237
+ this.dispatch({
238
+ type: 'transaction',
239
+ transaction: tr,
240
+ requestDone: true,
241
+ });
242
+ },
243
+ (err) => {
244
+ if (err.status == 409) {
245
+ // The client's document conflicts with the server's version.
246
+ // Poll for changes and then try again.
247
+ this.backOff = 0;
248
+ this.dispatch({ type: 'poll' });
249
+ } else if (badVersion(err)) {
250
+ this.report.failure(err);
251
+ this.dispatch({ type: 'restart' });
252
+ } else {
253
+ this.dispatch({ type: 'recover', error: err });
254
+ }
255
+ }
256
+ );
257
+ }
258
+
259
+ // [FS] IRAD-1040 2020-09-02
260
+ // Send the modified schema to server
261
+ updateSchema(schema: Schema, input: any, dataDefined: boolean) {
262
+ // to avoid cyclic reference error, use flatted string.
263
+ const schemaFlatted = stringify(schema);
264
+ this.run(POST(this.url + '/schema/', schemaFlatted, 'text/plain')).then(
265
+ (data) => {
266
+ console.log("collab server's schema updated");
267
+ // [FS] IRAD-1040 2020-09-08
268
+ this.schema = schema;
269
+ this.start(input, dataDefined);
270
+ },
271
+ (err) => {
272
+ this.report.failure(err);
273
+ }
274
+ );
275
+ }
276
+
277
+ // Try to recover from an error
278
+ recover(err: Error): void {
279
+ const newBackOff = this.backOff ? Math.min(this.backOff * 2, 6e4) : 200;
280
+ if (newBackOff > 1000 && this.backOff < 1000) {
281
+ this.report.delay(err);
282
+ }
283
+ this.backOff = newBackOff;
284
+ setTimeout(() => {
285
+ if (this.state.comm == 'recover') {
286
+ this.dispatch({ type: 'poll' });
287
+ }
288
+ }, this.backOff);
289
+ }
290
+
291
+ closeRequest(): void {
292
+ if (this.request) {
293
+ this.request.abort();
294
+ this.request = null;
295
+ }
296
+ }
297
+
298
+ run(request: any): Promise<any> {
299
+ return (this.request = request);
300
+ }
301
+
302
+ close(): void {
303
+ this.closeRequest();
304
+ this.setView(null);
305
+ }
306
+
307
+ setView(view: EditorView): void {
308
+ if (this.view) {
309
+ this.view.destroy();
310
+ }
311
+ this.view = window.view = view;
312
+ }
313
+ }
314
+
315
+ function repeat(val: any, n: number): Array<any> {
316
+ const result = [];
317
+ for (let i = 0; i < n; i++) {
318
+ result.push(val);
319
+ }
320
+ return result;
321
+ }
322
+
323
+ export default EditorConnection;