@apollohg/react-native-rich-text-editor 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (494) hide show
  1. package/LICENSE +160 -0
  2. package/README.md +259 -0
  3. package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
  4. package/ReactNativeProseEditor.podspec +59 -0
  5. package/THIRD_PARTY_NOTICES.md +31155 -0
  6. package/android/build.gradle +188 -0
  7. package/android/consumer-rules.pro +18 -0
  8. package/android/expo/build.gradle +17 -0
  9. package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
  10. package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
  11. package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
  12. package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
  13. package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
  14. package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
  15. package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
  16. package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
  17. package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
  18. package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
  19. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
  20. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
  21. package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
  22. package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
  23. package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
  24. package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
  25. package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
  26. package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
  27. package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
  28. package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
  29. package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
  30. package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
  31. package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
  32. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
  33. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
  34. package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
  35. package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
  36. package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
  37. package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
  38. package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
  39. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
  40. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
  41. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
  42. package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
  43. package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
  44. package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
  45. package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
  46. package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
  47. package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
  48. package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
  49. package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
  50. package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
  51. package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
  52. package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
  53. package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
  54. package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
  55. package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
  56. package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
  57. package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
  58. package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
  59. package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
  60. package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
  61. package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
  62. package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
  63. package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
  64. package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
  65. package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
  66. package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
  67. package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
  68. package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
  69. package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
  70. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
  71. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
  72. package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
  73. package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
  74. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
  75. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
  76. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
  77. package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
  78. package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
  79. package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
  80. package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
  81. package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
  82. package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
  83. package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
  84. package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
  85. package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
  86. package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
  87. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
  88. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
  89. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
  90. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
  91. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
  92. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
  93. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
  94. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
  95. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
  96. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
  97. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
  98. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
  99. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
  100. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
  101. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
  102. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
  103. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
  104. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
  105. package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
  106. package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
  107. package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
  108. package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
  109. package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
  110. package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
  111. package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
  112. package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
  113. package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
  114. package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
  115. package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
  116. package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
  117. package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
  118. package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
  119. package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
  120. package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
  121. package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
  122. package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
  123. package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
  124. package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
  125. package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
  126. package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
  127. package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
  128. package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
  129. package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
  130. package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
  131. package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
  132. package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
  133. package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
  134. package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
  135. package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
  136. package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
  137. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
  138. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
  139. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
  140. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
  141. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
  142. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
  143. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
  144. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
  145. package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
  146. package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
  147. package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
  148. package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
  149. package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
  150. package/android/src/main/jni/CMakeLists.txt +85 -0
  151. package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
  152. package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
  153. package/android/src/main/jni/reactnativeproseeditor.h +6 -0
  154. package/android/src/main/res/values/attrs.xml +6 -0
  155. package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
  156. package/app.plugin.js +62 -0
  157. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
  158. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
  159. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
  160. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
  161. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
  162. package/dist/AtomHost.d.ts +17 -0
  163. package/dist/AtomHost.js +135 -0
  164. package/dist/DefaultAtomChip.d.ts +2 -0
  165. package/dist/DefaultAtomChip.js +22 -0
  166. package/dist/EditorAddon.d.ts +32 -0
  167. package/dist/EditorAddon.js +29 -0
  168. package/dist/EditorAddonNormalization.d.ts +6 -0
  169. package/dist/EditorAddonNormalization.js +48 -0
  170. package/dist/EditorMentionThemeNormalization.d.ts +8 -0
  171. package/dist/EditorMentionThemeNormalization.js +22 -0
  172. package/dist/EditorMentionThemeValidation.d.ts +12 -0
  173. package/dist/EditorMentionThemeValidation.js +95 -0
  174. package/dist/EditorStyleSheet.d.ts +4 -0
  175. package/dist/EditorStyleSheet.js +10 -0
  176. package/dist/EditorStyleSheetNormalization.d.ts +3 -0
  177. package/dist/EditorStyleSheetNormalization.js +226 -0
  178. package/dist/EditorStyleSheetTypes.d.ts +151 -0
  179. package/dist/EditorStyleSheetTypes.js +2 -0
  180. package/dist/EditorTheme.d.ts +117 -0
  181. package/dist/EditorTheme.js +41 -0
  182. package/dist/EditorToolbar.d.ts +4 -0
  183. package/dist/EditorToolbar.js +17 -0
  184. package/dist/EditorToolbarComponent.d.ts +13 -0
  185. package/dist/EditorToolbarComponent.js +24 -0
  186. package/dist/EditorToolbarItems.d.ts +9 -0
  187. package/dist/EditorToolbarItems.js +58 -0
  188. package/dist/EditorToolbarRegistry.d.ts +59 -0
  189. package/dist/EditorToolbarRegistry.js +175 -0
  190. package/dist/EditorToolbarTypes.d.ts +273 -0
  191. package/dist/EditorToolbarTypes.js +2 -0
  192. package/dist/EditorToolbarVisuals.d.ts +154 -0
  193. package/dist/EditorToolbarVisuals.js +228 -0
  194. package/dist/EditorUpdateRevision.d.ts +8 -0
  195. package/dist/EditorUpdateRevision.js +22 -0
  196. package/dist/ExternalTextComposition.d.ts +45 -0
  197. package/dist/ExternalTextComposition.js +537 -0
  198. package/dist/ImageLoadingPolicy.d.ts +54 -0
  199. package/dist/ImageLoadingPolicy.js +60 -0
  200. package/dist/NativeEditorBoundaryError.d.ts +111 -0
  201. package/dist/NativeEditorBoundaryError.js +268 -0
  202. package/dist/NativeEditorBridge.d.ts +9 -0
  203. package/dist/NativeEditorBridge.js +37 -0
  204. package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
  205. package/dist/NativeEditorCollaborationTransport.js +275 -0
  206. package/dist/NativeEditorCreateConfig.d.ts +16 -0
  207. package/dist/NativeEditorCreateConfig.js +249 -0
  208. package/dist/NativeEditorCreateJson.d.ts +76 -0
  209. package/dist/NativeEditorCreateJson.js +474 -0
  210. package/dist/NativeEditorCreateValidation.d.ts +32 -0
  211. package/dist/NativeEditorCreateValidation.js +150 -0
  212. package/dist/NativeEditorDocumentBridge.d.ts +72 -0
  213. package/dist/NativeEditorDocumentBridge.js +305 -0
  214. package/dist/NativeEditorDocumentHandle.d.ts +70 -0
  215. package/dist/NativeEditorDocumentHandle.js +89 -0
  216. package/dist/NativeEditorLocalAwareness.d.ts +34 -0
  217. package/dist/NativeEditorLocalAwareness.js +153 -0
  218. package/dist/NativeEditorNativeModule.d.ts +48 -0
  219. package/dist/NativeEditorNativeModule.js +34 -0
  220. package/dist/NativeEditorRenderNormalization.d.ts +22 -0
  221. package/dist/NativeEditorRenderNormalization.js +274 -0
  222. package/dist/NativeEditorResultNormalization.d.ts +108 -0
  223. package/dist/NativeEditorResultNormalization.js +400 -0
  224. package/dist/NativeEditorTypes.d.ts +318 -0
  225. package/dist/NativeEditorTypes.js +15 -0
  226. package/dist/NativeEditorV2Decimal.d.ts +5 -0
  227. package/dist/NativeEditorV2Decimal.js +18 -0
  228. package/dist/NativeProseViewer.d.ts +122 -0
  229. package/dist/NativeProseViewer.js +130 -0
  230. package/dist/NativeRichTextEditor.d.ts +3 -0
  231. package/dist/NativeRichTextEditor.js +6 -0
  232. package/dist/ResourceLimits.d.ts +100 -0
  233. package/dist/ResourceLimits.js +80 -0
  234. package/dist/RichTextEditor.d.ts +4 -0
  235. package/dist/RichTextEditor.js +25 -0
  236. package/dist/RichTextEditorNativeTypes.d.ts +122 -0
  237. package/dist/RichTextEditorNativeTypes.js +2 -0
  238. package/dist/RichTextEditorNativeView.d.ts +12 -0
  239. package/dist/RichTextEditorNativeView.js +15 -0
  240. package/dist/RichTextEditorSerialization.d.ts +53 -0
  241. package/dist/RichTextEditorSerialization.js +283 -0
  242. package/dist/RichTextEditorTypes.d.ts +281 -0
  243. package/dist/RichTextEditorTypes.js +2 -0
  244. package/dist/ViewerConfiguration.d.ts +22 -0
  245. package/dist/ViewerConfiguration.js +6 -0
  246. package/dist/YjsCollaboration.d.ts +146 -0
  247. package/dist/YjsCollaboration.js +496 -0
  248. package/dist/addons.d.ts +193 -0
  249. package/dist/addons.js +122 -0
  250. package/dist/atomConstants.d.ts +3 -0
  251. package/dist/atomConstants.js +6 -0
  252. package/dist/atomInstances.d.ts +35 -0
  253. package/dist/atomInstances.js +79 -0
  254. package/dist/atomPolicy.d.ts +4 -0
  255. package/dist/atomPolicy.js +47 -0
  256. package/dist/atomUpdates.d.ts +2 -0
  257. package/dist/atomUpdates.js +38 -0
  258. package/dist/atoms.d.ts +92 -0
  259. package/dist/atoms.js +222 -0
  260. package/dist/attributeValidation.d.ts +4 -0
  261. package/dist/attributeValidation.js +97 -0
  262. package/dist/contentExpression.d.ts +6 -0
  263. package/dist/contentExpression.js +335 -0
  264. package/dist/index.d.ts +21 -0
  265. package/dist/index.js +78 -0
  266. package/dist/listMarkers.d.ts +15 -0
  267. package/dist/listMarkers.js +21 -0
  268. package/dist/schemaDefinition.d.ts +143 -0
  269. package/dist/schemaDefinition.js +206 -0
  270. package/dist/schemaDocument.d.ts +17 -0
  271. package/dist/schemaDocument.js +69 -0
  272. package/dist/schemaDocumentConstruction.d.ts +5 -0
  273. package/dist/schemaDocumentConstruction.js +125 -0
  274. package/dist/schemaNormalization.d.ts +29 -0
  275. package/dist/schemaNormalization.js +313 -0
  276. package/dist/schemaPresets.d.ts +68 -0
  277. package/dist/schemaPresets.js +198 -0
  278. package/dist/schemaResolution.d.ts +9 -0
  279. package/dist/schemaResolution.js +211 -0
  280. package/dist/schemas.d.ts +5 -0
  281. package/dist/schemas.js +28 -0
  282. package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
  283. package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
  284. package/dist/useEditorToolbarInteractions.d.ts +12 -0
  285. package/dist/useEditorToolbarInteractions.js +218 -0
  286. package/dist/useEditorToolbarItems.d.ts +8 -0
  287. package/dist/useEditorToolbarItems.js +280 -0
  288. package/dist/useEditorToolbarPresentation.d.ts +4 -0
  289. package/dist/useEditorToolbarPresentation.js +203 -0
  290. package/dist/useEditorToolbarState.d.ts +63 -0
  291. package/dist/useEditorToolbarState.js +108 -0
  292. package/dist/useFocusPreservingFrames.d.ts +17 -0
  293. package/dist/useFocusPreservingFrames.js +108 -0
  294. package/dist/useNativeEditor.d.ts +66 -0
  295. package/dist/useNativeEditor.js +370 -0
  296. package/dist/useRichTextEditorCommands.d.ts +21 -0
  297. package/dist/useRichTextEditorCommands.js +299 -0
  298. package/dist/useRichTextEditorEvents.d.ts +18 -0
  299. package/dist/useRichTextEditorEvents.js +216 -0
  300. package/dist/useRichTextEditorMentions.d.ts +11 -0
  301. package/dist/useRichTextEditorMentions.js +316 -0
  302. package/dist/useRichTextEditorPresentation.d.ts +5 -0
  303. package/dist/useRichTextEditorPresentation.js +178 -0
  304. package/dist/useRichTextEditorState.d.ts +180 -0
  305. package/dist/useRichTextEditorState.js +405 -0
  306. package/dist/useRichTextEditorUpdates.d.ts +10 -0
  307. package/dist/useRichTextEditorUpdates.js +308 -0
  308. package/dist/useViewerAtoms.d.ts +38 -0
  309. package/dist/useViewerAtoms.js +288 -0
  310. package/expo-module.config.json +13 -0
  311. package/ios/EditorAddons.swift +354 -0
  312. package/ios/EditorCodeHighlighting.swift +184 -0
  313. package/ios/EditorCore.xcframework/Info.plist +44 -0
  314. package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
  315. package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
  316. package/ios/EditorInteractionOverlays.swift +697 -0
  317. package/ios/EditorLayoutManager.swift +971 -0
  318. package/ios/EditorNodeTypes.swift +37 -0
  319. package/ios/EditorStyleSheet.swift +461 -0
  320. package/ios/EditorTextView+AttributedPatch.swift +305 -0
  321. package/ios/EditorTextView+Binding.swift +61 -0
  322. package/ios/EditorTextView+Caret.swift +333 -0
  323. package/ios/EditorTextView+Commands.swift +203 -0
  324. package/ios/EditorTextView+Delegate.swift +65 -0
  325. package/ios/EditorTextView+Diagnostics.swift +225 -0
  326. package/ios/EditorTextView+DragDrop.swift +290 -0
  327. package/ios/EditorTextView+ExternalComposition.swift +364 -0
  328. package/ios/EditorTextView+Images.swift +354 -0
  329. package/ios/EditorTextView+InputTraits.swift +200 -0
  330. package/ios/EditorTextView+KeyboardInput.swift +318 -0
  331. package/ios/EditorTextView+Layout.swift +245 -0
  332. package/ios/EditorTextView+MarkedText.swift +267 -0
  333. package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
  334. package/ios/EditorTextView+NativeMutation.swift +471 -0
  335. package/ios/EditorTextView+Reconciliation.swift +97 -0
  336. package/ios/EditorTextView+RenderPatch.swift +573 -0
  337. package/ios/EditorTextView+Rendering.swift +539 -0
  338. package/ios/EditorTextView+Selection.swift +542 -0
  339. package/ios/EditorTextView.swift +953 -0
  340. package/ios/EditorTheme.swift +626 -0
  341. package/ios/EditorV2Adapter+Commands.swift +204 -0
  342. package/ios/EditorV2Adapter+Envelope.swift +238 -0
  343. package/ios/EditorV2Adapter+Mutation.swift +392 -0
  344. package/ios/EditorV2Adapter+Registry.swift +185 -0
  345. package/ios/EditorV2Adapter+RenderState.swift +360 -0
  346. package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
  347. package/ios/EditorV2Adapter+Selection.swift +329 -0
  348. package/ios/EditorV2Adapter+TextCommands.swift +430 -0
  349. package/ios/EditorV2Adapter.swift +376 -0
  350. package/ios/EditorV2Shadow.swift +353 -0
  351. package/ios/Generated_editor_core.swift +2378 -0
  352. package/ios/NativeCodeHighlighting.swift +159 -0
  353. package/ios/NativeCollaborationSocket.swift +144 -0
  354. package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
  355. package/ios/NativeCollaborationTransport+Socket.swift +379 -0
  356. package/ios/NativeCollaborationTransport+Validation.swift +103 -0
  357. package/ios/NativeCollaborationTransport.swift +322 -0
  358. package/ios/NativeCollaborationTransportRegistry.swift +521 -0
  359. package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
  360. package/ios/NativeEditorExpoView+Binding.swift +268 -0
  361. package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
  362. package/ios/NativeEditorExpoView+Events.swift +131 -0
  363. package/ios/NativeEditorExpoView+Focus.swift +169 -0
  364. package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
  365. package/ios/NativeEditorExpoView+Mentions.swift +288 -0
  366. package/ios/NativeEditorExpoView+Properties.swift +300 -0
  367. package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
  368. package/ios/NativeEditorExpoView+Updates.swift +312 -0
  369. package/ios/NativeEditorExpoView.swift +349 -0
  370. package/ios/NativeEditorModule.swift +856 -0
  371. package/ios/NativeEditorViewRegistry.swift +226 -0
  372. package/ios/NativeToolbar+ButtonStyle.swift +214 -0
  373. package/ios/NativeToolbar+Buttons.swift +228 -0
  374. package/ios/NativeToolbar+Diagnostics.swift +114 -0
  375. package/ios/NativeToolbar+Menu.swift +101 -0
  376. package/ios/NativeToolbar+Models.swift +519 -0
  377. package/ios/NativeToolbar+Placeholder.swift +39 -0
  378. package/ios/NativeToolbar.swift +612 -0
  379. package/ios/OrderedListMarkerFormatter.swift +103 -0
  380. package/ios/PositionBridge.swift +596 -0
  381. package/ios/ProseViewerView.swift +462 -0
  382. package/ios/RenderBridge+Atoms.swift +288 -0
  383. package/ios/RenderBridge+Attachments.swift +246 -0
  384. package/ios/RenderBridge+BlockBoundaries.swift +313 -0
  385. package/ios/RenderBridge+Style.swift +343 -0
  386. package/ios/RenderBridge.swift +704 -0
  387. package/ios/RichTextEditorView.swift +930 -0
  388. package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
  389. package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
  390. package/ios/SharedNativeImagePipeline.swift +533 -0
  391. package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
  392. package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
  393. package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
  394. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
  395. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
  396. package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
  397. package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
  398. package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
  399. package/ios/Viewer/NativeSVGPreflight.h +11 -0
  400. package/ios/Viewer/NativeSVGPreflight.mm +219 -0
  401. package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
  402. package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
  403. package/ios/Viewer/PreparedProseLayout.swift +326 -0
  404. package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
  405. package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
  406. package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
  407. package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
  408. package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
  409. package/ios/Viewer/ViewerDocument.swift +575 -0
  410. package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
  411. package/ios/Viewer/ViewerImagePipeline.swift +478 -0
  412. package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
  413. package/ios/editor_coreFFI/module.modulemap +7 -0
  414. package/package.json +151 -0
  415. package/react-native.config.js +17 -0
  416. package/rust/android/arm64-v8a/libeditor_core.so +0 -0
  417. package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
  418. package/rust/android/x86/libeditor_core.so +0 -0
  419. package/rust/android/x86_64/libeditor_core.so +0 -0
  420. package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
  421. package/src/AtomHost.tsx +180 -0
  422. package/src/DefaultAtomChip.tsx +27 -0
  423. package/src/EditorAddon.ts +65 -0
  424. package/src/EditorAddonNormalization.ts +49 -0
  425. package/src/EditorMentionThemeNormalization.ts +25 -0
  426. package/src/EditorMentionThemeValidation.ts +133 -0
  427. package/src/EditorStyleSheet.ts +9 -0
  428. package/src/EditorStyleSheetNormalization.ts +219 -0
  429. package/src/EditorStyleSheetTypes.ts +189 -0
  430. package/src/EditorTheme.ts +196 -0
  431. package/src/EditorToolbar.tsx +31 -0
  432. package/src/EditorToolbarComponent.tsx +23 -0
  433. package/src/EditorToolbarItems.tsx +64 -0
  434. package/src/EditorToolbarRegistry.tsx +254 -0
  435. package/src/EditorToolbarTypes.tsx +322 -0
  436. package/src/EditorToolbarVisuals.tsx +270 -0
  437. package/src/EditorUpdateRevision.ts +26 -0
  438. package/src/ExternalTextComposition.ts +658 -0
  439. package/src/ImageLoadingPolicy.ts +125 -0
  440. package/src/NativeEditorBoundaryError.ts +345 -0
  441. package/src/NativeEditorBridge.ts +93 -0
  442. package/src/NativeEditorCollaborationTransport.ts +493 -0
  443. package/src/NativeEditorCreateConfig.ts +326 -0
  444. package/src/NativeEditorCreateJson.ts +579 -0
  445. package/src/NativeEditorCreateValidation.ts +178 -0
  446. package/src/NativeEditorDocumentBridge.ts +485 -0
  447. package/src/NativeEditorDocumentHandle.ts +168 -0
  448. package/src/NativeEditorLocalAwareness.ts +168 -0
  449. package/src/NativeEditorNativeModule.ts +97 -0
  450. package/src/NativeEditorRenderNormalization.ts +320 -0
  451. package/src/NativeEditorResultNormalization.ts +469 -0
  452. package/src/NativeEditorTypes.ts +366 -0
  453. package/src/NativeEditorV2Decimal.ts +13 -0
  454. package/src/NativeProseViewer.tsx +356 -0
  455. package/src/NativeRichTextEditor.tsx +33 -0
  456. package/src/ResourceLimits.ts +187 -0
  457. package/src/RichTextEditor.tsx +27 -0
  458. package/src/RichTextEditorNativeTypes.tsx +144 -0
  459. package/src/RichTextEditorNativeView.tsx +21 -0
  460. package/src/RichTextEditorSerialization.tsx +381 -0
  461. package/src/RichTextEditorTypes.tsx +327 -0
  462. package/src/ViewerConfiguration.ts +23 -0
  463. package/src/YjsCollaboration.ts +692 -0
  464. package/src/addons.ts +311 -0
  465. package/src/atomConstants.ts +3 -0
  466. package/src/atomInstances.ts +123 -0
  467. package/src/atomPolicy.ts +47 -0
  468. package/src/atomUpdates.ts +52 -0
  469. package/src/atoms.ts +379 -0
  470. package/src/attributeValidation.ts +116 -0
  471. package/src/contentExpression.ts +338 -0
  472. package/src/index.ts +295 -0
  473. package/src/listMarkers.ts +18 -0
  474. package/src/schemaDefinition.ts +395 -0
  475. package/src/schemaDocument.ts +92 -0
  476. package/src/schemaDocumentConstruction.ts +148 -0
  477. package/src/schemaNormalization.ts +367 -0
  478. package/src/schemaPresets.ts +250 -0
  479. package/src/schemaResolution.ts +242 -0
  480. package/src/schemas.ts +43 -0
  481. package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
  482. package/src/useEditorToolbarInteractions.tsx +329 -0
  483. package/src/useEditorToolbarItems.tsx +390 -0
  484. package/src/useEditorToolbarPresentation.tsx +483 -0
  485. package/src/useEditorToolbarState.tsx +172 -0
  486. package/src/useFocusPreservingFrames.ts +171 -0
  487. package/src/useNativeEditor.ts +534 -0
  488. package/src/useRichTextEditorCommands.tsx +478 -0
  489. package/src/useRichTextEditorEvents.tsx +342 -0
  490. package/src/useRichTextEditorMentions.tsx +441 -0
  491. package/src/useRichTextEditorPresentation.tsx +563 -0
  492. package/src/useRichTextEditorState.tsx +620 -0
  493. package/src/useRichTextEditorUpdates.tsx +403 -0
  494. package/src/useViewerAtoms.tsx +427 -0
@@ -0,0 +1,159 @@
1
+ import Foundation
2
+
3
+ public struct NativeCodeHighlightRange {
4
+ public let start: Int
5
+ public let length: Int
6
+ public let color: UInt32
7
+ public let fontStyle: UInt8
8
+
9
+ public init(start: Int, length: Int, color: UInt32, fontStyle: UInt8) {
10
+ self.start = start
11
+ self.length = length
12
+ self.color = color
13
+ self.fontStyle = fontStyle
14
+ }
15
+ }
16
+
17
+ public protocol NativeCodeHighlightingProvider: AnyObject {
18
+ var id: String { get }
19
+ var version: Int { get }
20
+ func highlight(text: String, language: String?, theme: String) throws -> [NativeCodeHighlightRange]
21
+ }
22
+
23
+ public enum NativeCodeHighlightingRegistry {
24
+ private static let lock = NSLock()
25
+ private static var providers: [String: NativeCodeHighlightingProvider] = [:]
26
+
27
+ public static func register(provider: NativeCodeHighlightingProvider) throws {
28
+ guard !provider.id.isEmpty, provider.version == 1 else {
29
+ throw failure("Code highlighting provider must have an ID and support version 1")
30
+ }
31
+ lock.lock()
32
+ defer { lock.unlock() }
33
+ providers[provider.id] = provider
34
+ }
35
+
36
+ public static func provider(id: String) throws -> NativeCodeHighlightingProvider {
37
+ lock.lock()
38
+ defer { lock.unlock() }
39
+ guard let provider = providers[id] else {
40
+ throw failure("Code highlighting provider '\(id)' is unavailable. Install and import its native package, then rebuild the app.")
41
+ }
42
+ return provider
43
+ }
44
+
45
+ static func validRanges(text: String, ranges: [NativeCodeHighlightRange]) -> Bool {
46
+ let units = Array(text.utf16)
47
+ func isBoundary(_ offset: Int) -> Bool {
48
+ offset == 0 || offset == units.count || !(0xD800...0xDBFF).contains(units[offset - 1]) || !(0xDC00...0xDFFF).contains(units[offset])
49
+ }
50
+ var end = 0
51
+ for range in ranges {
52
+ guard range.start >= end, range.length > 0, range.start <= units.count,
53
+ range.length <= units.count - range.start, range.fontStyle <= 7,
54
+ isBoundary(range.start), isBoundary(range.start + range.length) else { return false }
55
+ end = range.start + range.length
56
+ }
57
+ return true
58
+ }
59
+
60
+ private static func failure(_ message: String) -> NSError {
61
+ NSError(domain: "NativeCodeHighlighting", code: 1, userInfo: [NSLocalizedDescriptionKey: message])
62
+ }
63
+ }
64
+
65
+ struct NativeCodeHighlightBlock {
66
+ let start: Int
67
+ let text: String
68
+ let language: String?
69
+ }
70
+
71
+ struct NativeHighlightedCodeBlock {
72
+ let block: NativeCodeHighlightBlock
73
+ let ranges: [NativeCodeHighlightRange]
74
+ }
75
+
76
+ final class NativeCodeHighlightingSession {
77
+ private struct Request {
78
+ let generation: UInt64
79
+ let provider: NativeCodeHighlightingProvider
80
+ let theme: String
81
+ let blocks: [NativeCodeHighlightBlock]
82
+ let completion: (Result<[NativeHighlightedCodeBlock], Error>) -> Void
83
+ }
84
+
85
+ private static let queue = DispatchQueue(label: "editor.code-highlighting", qos: .userInitiated)
86
+ private let lock = NSLock()
87
+ private var generation: UInt64 = 0
88
+ private var pending: Request?
89
+ private var running = false
90
+
91
+ func cancel() {
92
+ precondition(Thread.isMainThread, "Highlighting sessions must be updated on the main thread")
93
+ lock.lock()
94
+ generation &+= 1
95
+ pending = nil
96
+ lock.unlock()
97
+ }
98
+
99
+ func update(
100
+ provider id: String,
101
+ theme: String,
102
+ blocks: [NativeCodeHighlightBlock],
103
+ completion: @escaping (Result<[NativeHighlightedCodeBlock], Error>) -> Void
104
+ ) throws {
105
+ cancel()
106
+ let provider = try NativeCodeHighlightingRegistry.provider(id: id)
107
+ lock.lock()
108
+ pending = Request(generation: generation, provider: provider, theme: theme, blocks: blocks, completion: completion)
109
+ let schedule = !running
110
+ running = true
111
+ lock.unlock()
112
+ if schedule { Self.queue.async { [weak self] in self?.drain() } }
113
+ }
114
+
115
+ private func current(_ value: UInt64) -> Bool {
116
+ lock.lock()
117
+ defer { lock.unlock() }
118
+ return generation == value
119
+ }
120
+
121
+ private func takeRequest() -> Request? {
122
+ lock.lock()
123
+ defer { lock.unlock() }
124
+ let request = pending
125
+ pending = nil
126
+ if request == nil { running = false }
127
+ return request
128
+ }
129
+
130
+ private func scheduleNext() {
131
+ lock.lock()
132
+ let schedule = pending != nil
133
+ running = schedule
134
+ lock.unlock()
135
+ if schedule { Self.queue.async { [weak self] in self?.drain() } }
136
+ }
137
+
138
+ private func drain() {
139
+ guard let request = takeRequest() else { return }
140
+ defer { scheduleNext() }
141
+ let result = Result<[NativeHighlightedCodeBlock], Error> {
142
+ var output: [NativeHighlightedCodeBlock] = []
143
+ for block in request.blocks {
144
+ guard current(request.generation) else { return [] }
145
+ let ranges = try request.provider.highlight(text: block.text, language: block.language, theme: request.theme)
146
+ guard NativeCodeHighlightingRegistry.validRanges(text: block.text, ranges: ranges) else {
147
+ throw NSError(domain: "NativeCodeHighlighting", code: 2, userInfo: [NSLocalizedDescriptionKey: "Code highlighting provider returned invalid UTF-16 ranges"])
148
+ }
149
+ output.append(NativeHighlightedCodeBlock(block: block, ranges: ranges))
150
+ }
151
+ return output
152
+ }
153
+ guard current(request.generation) else { return }
154
+ DispatchQueue.main.async { [weak self] in
155
+ guard self?.current(request.generation) == true else { return }
156
+ request.completion(result)
157
+ }
158
+ }
159
+ }
@@ -0,0 +1,144 @@
1
+ import Foundation
2
+
3
+ struct CollaborationSocketCallbacks {
4
+ let didOpen: (_ negotiatedProtocol: String?) -> Void
5
+ let didClose: (_ code: URLSessionWebSocketTask.CloseCode, _ reason: Data?) -> Void
6
+ let didFail: () -> Void
7
+ }
8
+
9
+ enum CollaborationSocketMessage {
10
+ case binary(Data)
11
+ case text(String)
12
+ }
13
+
14
+ protocol CollaborationSocket: AnyObject {
15
+ func resume()
16
+ func sendBinary(_ data: Data, completion: @escaping (Result<Void, Error>) -> Void)
17
+ func sendText(_ text: String, completion: @escaping (Result<Void, Error>) -> Void)
18
+ func receive(_ completion: @escaping (Result<CollaborationSocketMessage, Error>) -> Void)
19
+ func cancel(code: URLSessionWebSocketTask.CloseCode, reason: Data?)
20
+ }
21
+
22
+ protocol CollaborationSocketFactory {
23
+ func makeSocket(
24
+ url: URL,
25
+ protocols: [String],
26
+ callbacks: CollaborationSocketCallbacks
27
+ ) -> CollaborationSocket
28
+ }
29
+
30
+ struct URLSessionCollaborationSocketFactory: CollaborationSocketFactory {
31
+ func makeSocket(
32
+ url: URL,
33
+ protocols: [String],
34
+ callbacks: CollaborationSocketCallbacks
35
+ ) -> CollaborationSocket {
36
+ NativeCollaborationSocket(url: url, protocols: protocols, callbacks: callbacks)
37
+ }
38
+ }
39
+
40
+ /// URLSession owns only WebSocket I/O. Generation admission, retry policy,
41
+ /// ordering, and retained outbound bytes remain in Rust/the transport driver.
42
+ final class NativeCollaborationSocket: NSObject, CollaborationSocket, URLSessionWebSocketDelegate {
43
+ static let maximumMessageBytes = 64 * 1_024 * 1_024
44
+
45
+ private let callbacks: CollaborationSocketCallbacks
46
+ private let finishSession: (URLSession) -> Void
47
+ private var session: URLSession!
48
+ private var task: URLSessionWebSocketTask!
49
+
50
+ var maximumMessageSizeForTesting: Int {
51
+ task.maximumMessageSize
52
+ }
53
+
54
+ init(
55
+ url: URL,
56
+ protocols: [String],
57
+ callbacks: CollaborationSocketCallbacks,
58
+ finishSession: @escaping (URLSession) -> Void = { $0.finishTasksAndInvalidate() }
59
+ ) {
60
+ self.callbacks = callbacks
61
+ self.finishSession = finishSession
62
+ super.init()
63
+ let configuration = URLSessionConfiguration.ephemeral
64
+ configuration.httpShouldSetCookies = false
65
+ configuration.httpCookieStorage = nil
66
+ configuration.urlCredentialStorage = nil
67
+ configuration.urlCache = nil
68
+ configuration.requestCachePolicy = .reloadIgnoringLocalCacheData
69
+ session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
70
+ task = session.webSocketTask(with: url, protocols: protocols)
71
+ task.maximumMessageSize = Self.maximumMessageBytes
72
+ }
73
+
74
+ func resume() {
75
+ task.resume()
76
+ }
77
+
78
+ func sendBinary(_ data: Data, completion: @escaping (Result<Void, Error>) -> Void) {
79
+ task.send(.data(data)) { error in
80
+ if let error {
81
+ completion(.failure(error))
82
+ } else {
83
+ completion(.success(()))
84
+ }
85
+ }
86
+ }
87
+
88
+ func sendText(_ text: String, completion: @escaping (Result<Void, Error>) -> Void) {
89
+ task.send(.string(text)) { error in
90
+ if let error {
91
+ completion(.failure(error))
92
+ } else {
93
+ completion(.success(()))
94
+ }
95
+ }
96
+ }
97
+
98
+ func receive(_ completion: @escaping (Result<CollaborationSocketMessage, Error>) -> Void) {
99
+ task.receive { result in
100
+ switch result {
101
+ case .failure(let error):
102
+ completion(.failure(error))
103
+ case .success(.data(let data)):
104
+ completion(.success(.binary(data)))
105
+ case .success(.string(let text)):
106
+ completion(.success(.text(text)))
107
+ @unknown default:
108
+ completion(.failure(URLError(.cannotDecodeContentData)))
109
+ }
110
+ }
111
+ }
112
+
113
+ func cancel(code: URLSessionWebSocketTask.CloseCode, reason: Data?) {
114
+ task.cancel(with: code, reason: reason)
115
+ session.invalidateAndCancel()
116
+ }
117
+
118
+ func urlSession(
119
+ _ session: URLSession,
120
+ webSocketTask: URLSessionWebSocketTask,
121
+ didOpenWithProtocol protocol: String?
122
+ ) {
123
+ callbacks.didOpen(`protocol`)
124
+ }
125
+
126
+ func urlSession(
127
+ _ session: URLSession,
128
+ webSocketTask: URLSessionWebSocketTask,
129
+ didCloseWith closeCode: URLSessionWebSocketTask.CloseCode,
130
+ reason: Data?
131
+ ) {
132
+ finishSession(session)
133
+ callbacks.didClose(closeCode, reason)
134
+ }
135
+
136
+ func urlSession(
137
+ _ session: URLSession,
138
+ task: URLSessionTask,
139
+ didCompleteWithError error: Error?
140
+ ) {
141
+ guard error != nil else { return }
142
+ callbacks.didFail()
143
+ }
144
+ }
@@ -0,0 +1,258 @@
1
+ import Foundation
2
+
3
+ extension FfiError: Error {}
4
+
5
+ struct NativeCollaborationTransportConfig: Equatable {
6
+ static let maximumURLBytes = 4_096
7
+
8
+ let url: URL
9
+ let connect: Bool
10
+ let protocolAdapter: NativeCollaborationProtocolAdapterConfig?
11
+ let diagnosticEndpoint: String
12
+
13
+ init(
14
+ url: URL,
15
+ connect: Bool,
16
+ protocolAdapter: NativeCollaborationProtocolAdapterConfig?
17
+ ) throws {
18
+ guard let absolute = url.absoluteString.data(using: .utf8),
19
+ !absolute.isEmpty,
20
+ absolute.count <= Self.maximumURLBytes,
21
+ let scheme = url.scheme?.lowercased(),
22
+ scheme == "ws" || scheme == "wss",
23
+ url.host?.isEmpty == false,
24
+ url.user == nil,
25
+ url.password == nil,
26
+ url.fragment == nil
27
+ else {
28
+ throw NativeCollaborationTransportConfigurationError.invalidURL
29
+ }
30
+
31
+ guard let liveComponents = URLComponents(
32
+ url: url,
33
+ resolvingAgainstBaseURL: false
34
+ ) else {
35
+ throw NativeCollaborationTransportConfigurationError.invalidURL
36
+ }
37
+ var diagnostic = URLComponents()
38
+ diagnostic.scheme = scheme
39
+ diagnostic.host = url.host
40
+ diagnostic.port = url.port
41
+ diagnostic.percentEncodedPath = liveComponents.percentEncodedPath
42
+ guard let endpoint = diagnostic.string else {
43
+ throw NativeCollaborationTransportConfigurationError.invalidURL
44
+ }
45
+ self.url = url
46
+ self.connect = connect
47
+ self.protocolAdapter = protocolAdapter
48
+ diagnosticEndpoint = endpoint
49
+ }
50
+
51
+ static func == (
52
+ lhs: NativeCollaborationTransportConfig,
53
+ rhs: NativeCollaborationTransportConfig
54
+ ) -> Bool {
55
+ lhs.url.absoluteString == rhs.url.absoluteString
56
+ && lhs.connect == rhs.connect
57
+ && lhs.protocolAdapter == rhs.protocolAdapter
58
+ }
59
+ }
60
+
61
+ enum NativeCollaborationTransportConfigurationError: Error {
62
+ case invalidURL
63
+ }
64
+
65
+ struct NativeCollaborationProtocolAdapterConfig: Equatable {
66
+ static let defaultTimeoutMillis: UInt64 = 10_000
67
+ static let maximumFrameBytes = 64 * 1_024
68
+
69
+ let protocols: [String]
70
+ let timeoutMillis: UInt64
71
+ let terminalCloseCodes: Set<UInt32>
72
+ }
73
+
74
+ enum NativeCollaborationProtocolFrame {
75
+ case text(String)
76
+ case binary(Data)
77
+ }
78
+
79
+ enum NativeCollaborationProtocolAdapterAction {
80
+ case `continue`
81
+ case ready
82
+ case reject
83
+ }
84
+
85
+ struct NativeCollaborationProtocolAdapterResponse {
86
+ let action: NativeCollaborationProtocolAdapterAction
87
+ let frames: [NativeCollaborationProtocolFrame]
88
+ }
89
+
90
+ enum NativeCollaborationProtocolAdapterPhase {
91
+ case open
92
+ case message(NativeCollaborationProtocolFrame)
93
+ }
94
+
95
+ struct NativeCollaborationProtocolAdapterEvent {
96
+ let attemptId: String
97
+ let eventId: String
98
+ let generation: String
99
+ let negotiatedProtocol: String?
100
+ let phase: NativeCollaborationProtocolAdapterPhase
101
+ }
102
+
103
+ enum CollaborationWakeReason: String {
104
+ case localMutation
105
+ case moduleMutation
106
+ case receive
107
+ case timer
108
+ case open
109
+ case reattach
110
+ case awareness
111
+ }
112
+
113
+ struct NativeCollaborationTransportDirective: Equatable {
114
+ let transportState: String
115
+ let generationToOpen: String?
116
+ let nextDeadlineMillis: String?
117
+ let remoteCommitApplied: Bool
118
+ let peersChanged: Bool
119
+ let renewedLocal: Bool
120
+ let expiredPeers: [String]
121
+ }
122
+
123
+ enum NativeCollaborationTransportEvent {
124
+ case directive(
125
+ directive: NativeCollaborationTransportDirective,
126
+ generation: String?,
127
+ wakeReason: CollaborationWakeReason
128
+ )
129
+ case error(FfiError, generation: String?)
130
+ case protocolAdapter(NativeCollaborationProtocolAdapterEvent)
131
+ }
132
+
133
+ protocol NativeCollaborationTransportBackend {
134
+ func drive(editorId: String, nowMillis: String) -> FfiJsonResult
135
+ func socketOpen(editorId: String, generation: String, nowMillis: String) -> FfiJsonResult
136
+ func receive(
137
+ editorId: String,
138
+ generation: String,
139
+ message: Data,
140
+ nowMillis: String
141
+ ) -> FfiJsonResult
142
+ func socketClose(
143
+ editorId: String,
144
+ generation: String,
145
+ code: UInt32?,
146
+ reason: String?,
147
+ nowMillis: String
148
+ ) -> FfiJsonResult
149
+ func leaseOutbound(editorId: String, generation: String) -> FfiOutboundLeaseResult
150
+ func ackOutbound(editorId: String, generation: String, leaseId: String) -> FfiJsonResult
151
+ func nackOutbound(editorId: String, generation: String, leaseId: String) -> FfiJsonResult
152
+ func detach(editorId: String) -> FfiUnitResult
153
+ func reattach(editorId: String) -> FfiUnitResult
154
+ }
155
+
156
+ struct RustNativeCollaborationTransportBackend: NativeCollaborationTransportBackend {
157
+ func drive(editorId: String, nowMillis: String) -> FfiJsonResult {
158
+ performEditorV2JsonOperation(editorId: editorId) {
159
+ editorV2CollaborationDrive(editorId: editorId, nowMillis: nowMillis)
160
+ }
161
+ }
162
+
163
+ func socketOpen(editorId: String, generation: String, nowMillis: String) -> FfiJsonResult {
164
+ performEditorV2JsonOperation(editorId: editorId) {
165
+ editorV2CollaborationSocketOpen(
166
+ editorId: editorId,
167
+ generation: generation,
168
+ nowMillis: nowMillis
169
+ )
170
+ }
171
+ }
172
+
173
+ func receive(
174
+ editorId: String,
175
+ generation: String,
176
+ message: Data,
177
+ nowMillis: String
178
+ ) -> FfiJsonResult {
179
+ performEditorV2JsonOperation(editorId: editorId) {
180
+ editorV2CollaborationReceive(
181
+ editorId: editorId,
182
+ generation: generation,
183
+ message: message,
184
+ nowMillis: nowMillis
185
+ )
186
+ }
187
+ }
188
+
189
+ func socketClose(
190
+ editorId: String,
191
+ generation: String,
192
+ code: UInt32?,
193
+ reason: String?,
194
+ nowMillis: String
195
+ ) -> FfiJsonResult {
196
+ performEditorV2JsonOperation(editorId: editorId) {
197
+ editorV2CollaborationSocketClose(
198
+ editorId: editorId,
199
+ generation: generation,
200
+ code: code,
201
+ reason: reason,
202
+ nowMillis: nowMillis
203
+ )
204
+ }
205
+ }
206
+
207
+ func leaseOutbound(editorId: String, generation: String) -> FfiOutboundLeaseResult {
208
+ performEditorV2OutboundLeaseOperation(editorId: editorId) {
209
+ editorV2CollaborationLeaseOutbound(editorId: editorId, generation: generation)
210
+ }
211
+ }
212
+
213
+ func ackOutbound(editorId: String, generation: String, leaseId: String) -> FfiJsonResult {
214
+ performEditorV2JsonOperation(editorId: editorId) {
215
+ editorV2CollaborationAckOutbound(
216
+ editorId: editorId,
217
+ generation: generation,
218
+ leaseId: leaseId
219
+ )
220
+ }
221
+ }
222
+
223
+ func nackOutbound(editorId: String, generation: String, leaseId: String) -> FfiJsonResult {
224
+ performEditorV2JsonOperation(editorId: editorId) {
225
+ editorV2CollaborationNackOutbound(
226
+ editorId: editorId,
227
+ generation: generation,
228
+ leaseId: leaseId
229
+ )
230
+ }
231
+ }
232
+
233
+ func detach(editorId: String) -> FfiUnitResult {
234
+ performEditorV2LifecycleUnitOperation(editorId: editorId) {
235
+ editorV2CollaborationDetach(editorId: editorId)
236
+ }
237
+ }
238
+
239
+ func reattach(editorId: String) -> FfiUnitResult {
240
+ performEditorV2UnitOperation(editorId: editorId) {
241
+ editorV2CollaborationReattach(editorId: editorId)
242
+ }
243
+ }
244
+ }
245
+
246
+ protocol CollaborationMonotonicClock {
247
+ func nowMillis() -> UInt64
248
+ }
249
+
250
+ struct SystemCollaborationMonotonicClock: CollaborationMonotonicClock {
251
+ func nowMillis() -> UInt64 {
252
+ let milliseconds = ProcessInfo.processInfo.systemUptime * 1_000
253
+ if milliseconds >= Double(UInt64.max) {
254
+ return UInt64.max
255
+ }
256
+ return UInt64(milliseconds.rounded(.down))
257
+ }
258
+ }